atproto utils for zig zat.dev
atproto sdk zig

docs: explain ATProto doc publishing in readme

the readme now explains that zat publishes its own docs as
site.standard.document records - dogfooding the protocol.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Changed files
+23 -7
.tangled
workflows
scripts
+2 -4
.tangled/workflows/deploy-docs.yml
··· 6 6 7 7 dependencies: 8 8 nixpkgs: 9 - - nodejs 10 - - coreutils 9 + - bun 11 10 - curl 12 11 13 12 environment: 14 - # Use DID directly to avoid handle-resolution issues in CI. 15 13 WISP_DID: "did:plc:mkqt76xvfgxuemlwlx6ruc3w" 16 14 WISP_SITE_NAME: "docs" 17 15 18 16 steps: 19 17 - name: build docs site 20 18 command: | 21 - node ./scripts/build-wisp-docs.mjs 19 + bun ./scripts/build-wisp-docs.mjs 22 20 23 21 - name: deploy docs to wisp 24 22 command: |
+5
CHANGELOG.md
··· 1 1 # changelog 2 2 3 + ## 0.1.1 4 + 5 + - xrpc client sets `Content-Type: application/json` for POST requests 6 + - docs published as `site.standard.document` records on tag releases 7 + 3 8 ## 0.1.0 4 9 5 10 sync types for firehose consumption:
+14 -1
README.md
··· 1 1 # [zat](https://zat.dev) 2 2 3 - AT Protocol building blocks for zig. [roadmap](docs/roadmap.md) · [atproto records](https://at-me.zzstoatzz.io/view?handle=zat.dev) 3 + AT Protocol building blocks for zig. 4 + 5 + <details> 6 + <summary><strong>this readme is an ATProto record</strong></summary> 7 + 8 + → [view in zat.dev's repository](https://at-me.zzstoatzz.io/view?handle=zat.dev) 9 + 10 + zat publishes these docs as [`site.standard.document`](https://standard.site) records, signed by its DID. 11 + 12 + </details> 4 13 5 14 ## install 6 15 ··· 185 194 ## license 186 195 187 196 MIT 197 + 198 + --- 199 + 200 + [roadmap](docs/roadmap.md) · [changelog](CHANGELOG.md)
+2 -2
scripts/publish-docs.zig
··· 183 183 return null; 184 184 } 185 185 186 - fn timestamp() [24]u8 { 186 + fn timestamp() [20]u8 { 187 187 const epoch_seconds = std.time.timestamp(); 188 188 const days: i32 = @intCast(@divFloor(epoch_seconds, std.time.s_per_day)); 189 189 const day_secs: u32 = @intCast(@mod(epoch_seconds, std.time.s_per_day)); ··· 209 209 const mins = (day_secs % 3600) / 60; 210 210 const secs = day_secs % 60; 211 211 212 - var buf: [24]u8 = undefined; 212 + var buf: [20]u8 = undefined; 213 213 _ = std.fmt.bufPrint(&buf, "{d:0>4}-{d:0>2}-{d:0>2}T{d:0>2}:{d:0>2}:{d:0>2}Z", .{ 214 214 @as(u32, @intCast(y)), @as(u32, @intCast(m + 1)), @as(u32, @intCast(remaining + 1)), hours, mins, secs, 215 215 }) catch unreachable;