diff --git a/devlog/index.md b/devlog/index.md new file mode 100644 index 0000000..f1ebd7a --- /dev/null +++ b/devlog/index.md @@ -0,0 +1,14 @@ +# devlog + +- [copying the boring parts](/devlog/012) +- [building a pds](/devlog/011) +- [the network is input](/devlog/010) +- [back to threads](/devlog/009) +- [the io migration](/devlog/008) +- [up and to the right](/devlog/007) +- [building a relay in zig](/devlog/006) +- [three-way trust chain verification](/devlog/005) +- [the sig-verify saga](/devlog/004) +- [verifying the trust chain](/devlog/003) +- [consuming the firehose, then benchmarking it](/devlog/002) +- [zat publishes its own docs to ATProto](/devlog/001) diff --git a/scripts/build-site.mjs b/scripts/build-site.mjs index 530a360..c3a8166 100644 --- a/scripts/build-site.mjs +++ b/scripts/build-site.mjs @@ -170,6 +170,8 @@ async function main() { } for (const rel of devlogFiles) { + if (rel === "index.md") continue; + const src = path.join(devlogDir, rel); const dst = path.join(outDocsDir, "devlog", rel); await mkdir(path.dirname(dst), { recursive: true }); diff --git a/scripts/publish-docs.zig b/scripts/publish-docs.zig index 484fcaf..93f1a6e 100644 --- a/scripts/publish-docs.zig +++ b/scripts/publish-docs.zig @@ -28,6 +28,8 @@ const devlog = [_]DocEntry{ .{ .path = "/devlog/012", .file = "devlog/012-mst-bench-notes.md" }, }; +const devlog_index = DocEntry{ .path = "/devlog/index", .file = "devlog/index.md" }; + pub fn main() !void { // use page_allocator for CLI tool - OS reclaims on exit const allocator = std.heap.page_allocator; @@ -78,7 +80,7 @@ pub fn main() !void { // devlog publication (clock_id 100 to separate from docs) const devlog_tid = zat.Tid.fromTimestamp(1704067200000000, 100); const devlog_pub = Publication{ - .url = "https://zat.dev", + .url = "https://zat.dev/#devlog/index", .name = "zat devlog", .description = "building zat in public", }; @@ -91,6 +93,7 @@ pub fn main() !void { try devlog_uri_buf.print(allocator, "at://{s}/site.standard.publication/{s}", .{ session.did, devlog_tid.str() }); const devlog_uri = devlog_uri_buf.items; + try publishEntry(&client, allocator, session.did, devlog_index, devlog_uri, 100, &now); try publishEntries(&client, allocator, session.did, &devlog, devlog_uri, 101, &now); std.debug.print("done\n", .{}); @@ -206,28 +209,40 @@ fn publishEntries( now: *const [20]u8, ) !void { for (entries, 0..) |entry, i| { - const content = std.Io.Dir.readFileAlloc(.cwd(), std.Options.debug_io, entry.file, allocator, .limited(1024 * 1024)) catch |err| { - std.debug.print("warning: could not read {s}: {}\n", .{ entry.file, err }); - continue; - }; - defer allocator.free(content); - - const title = extractTitle(content) orelse entry.file; - const tid = zat.Tid.fromTimestamp(1704067200000000, @intCast(clock_id_base + i)); - - const record = Document{ - .site = site_uri, - .title = title, - .path = entry.path, - .textContent = content, - .publishedAt = now, - }; - - try putRecord(client, allocator, did, "site.standard.document", tid.str(), record); - std.debug.print("published: {s} -> at://{s}/site.standard.document/{s}\n", .{ entry.file, did, tid.str() }); + try publishEntry(client, allocator, did, entry, site_uri, @intCast(clock_id_base + i), now); } } +fn publishEntry( + client: *zat.XrpcClient, + allocator: Allocator, + did: []const u8, + entry: DocEntry, + site_uri: []const u8, + clock_id: usize, + now: *const [20]u8, +) !void { + const content = std.Io.Dir.readFileAlloc(.cwd(), std.Options.debug_io, entry.file, allocator, .limited(1024 * 1024)) catch |err| { + std.debug.print("warning: could not read {s}: {}\n", .{ entry.file, err }); + return; + }; + defer allocator.free(content); + + const title = extractTitle(content) orelse entry.file; + const tid = zat.Tid.fromTimestamp(1704067200000000, @intCast(clock_id)); + + const record = Document{ + .site = site_uri, + .title = title, + .path = entry.path, + .textContent = content, + .publishedAt = now, + }; + + try putRecord(client, allocator, did, "site.standard.document", tid.str(), record); + std.debug.print("published: {s} -> at://{s}/site.standard.document/{s}\n", .{ entry.file, did, tid.str() }); +} + fn timestamp() [20]u8 { const ns = std.Io.Timestamp.now(std.Options.debug_io, .real).nanoseconds; const secs: u64 = @intCast(@divFloor(ns, std.time.ns_per_s));