commits
enables partial extraction from JSON with extra fields, which is common
when parsing external API responses (e.g., TAP firehose messages have
live, rev, cid fields we don't need).
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
publication.url + document.path must equal the actual served URL.
changed devlog url from https://zat.dev/devlog to https://zat.dev
and path from /001 to /devlog/001.
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
enables diagnostic output when json parsing fails, particularly useful
for debugging enum mismatches from external APIs. users can enable via:
pub const std_options = .{
.log_scope_levels = &.{.{ .scope = .zat, .level = .debug }},
};
logs include: field name, path, expected type, actual json type, and error.
zero overhead when disabled - compiles away entirely.
closes #1
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This reverts commit f640677ae49e30dbcc3df8bd21a9b2b08b722b54.
- add minimal markdown鈫抣eaflet blocks converter (headers, code, paragraphs)
- dual-publish to both site.standard.document and pub.leaflet.document
- trigger publish workflow on doc changes (README, CHANGELOG, docs/*, devlog/*)
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
SPA doesn't resolve relative paths - need devlog/001-... not just 001-...
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- rename build-wisp-docs.mjs -> build-site.mjs
- generate devlog/index.md listing all entries (newest first)
- header link now goes to devlog index instead of specific entry
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
encodeURIComponent turns devlog/001-self-publishing-docs.md into
devlog%2F001-self-publishing-docs.md, breaking nested paths
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- copy devlog/ files to site-out/docs/devlog/
- change header link to use hash routing (#devlog/...) so SPA handles it
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- consistent gutter variable for all horizontal spacing
- proper CSS cascade (base styles before media query)
- flexbox layout instead of grid (simpler)
- cleaner hamburger icon using pseudo-elements
- one breakpoint at 768px
- removed hacky negative margins
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- hamburger menu toggle (hidden on desktop)
- sidebar slides in from left on mobile
- overlay backdrop when menu open
- touch-friendly nav sizing (44px+ tap targets)
- responsive padding at breakpoints
- code blocks edge-to-edge on small screens
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
first entry: how zat publishes its own docs to ATProto
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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>
- scripts/publish-docs.zig: uses zat to publish README, roadmap, and
changelog as site.standard.document records
- .tangled/workflows/publish-docs.yml: triggers on v* tags
- build.zig: adds publish-docs executable target
requires ATPROTO_HANDLE and ATPROTO_PASSWORD secrets in repo settings.
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The README links to docs/roadmap.md which works on GitHub/Tangled,
but when copied to site-out/docs/ context, the path became double-prefixed.
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
could probably use threaded workers for trying both methods at the same time in the future.
documents new sync types, migration guide, and library overview.
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
new enums from com.atproto.sync.subscribeRepos lexicon:
- CommitAction: create, update, delete
- EventKind: commit, sync, identity, account, info
- AccountStatus: takendown, suspended, deleted, etc.
these work with std.json automatic enum parsing, enabling
exhaustive switches instead of mem.eql string comparisons.
bumps version to 0.1.0 (new feature, backwards compatible).
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
https://github.com/ziglang/zig/issues/25021
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
the stdlib deflate decompressor panics with "reached unreachable code"
on certain gzip responses when running on x86_64-linux. setting
Accept-Encoding: identity avoids triggering the decompressor.
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
bsky.app -> did:plc:z72i7hdynmk6r22z27h6tvur
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
using tangled CI now
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
uses official test vectors from bluesky-social/indigo:
- ES256K (secp256k1) signature verification
- ES256 (P-256) signature verification
- reject wrong key test
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
adds:
- handle resolution via HTTP well-known
- fixes memory leak in DID resolver test
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
std.http.Client internals leak memory that std.testing.allocator catches.
wrap test in arena allocator to handle cleanup, matching pattern in
handle_resolver tests.
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
resolves handles to DIDs using https://{handle}/.well-known/atproto-did
note: DNS TXT resolution (_atproto.{handle}) not implemented as zig std
doesn't provide TXT record lookup. HTTP method is the primary fallback
per atproto spec.
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- fix use-after-free in jwt payload parsing (dupe strings)
- fix crypto.sign.ecdsa path for zig 0.15
- fix test token to have correct 64-byte signature
- use arena allocator in extractAt tests to avoid leaks
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- jwt.zig: parse and verify ES256/ES256K tokens
- multibase.zig: base58btc decoding for DID document keys
- multicodec.zig: parse secp256k1/p256 key types from prefix
follows atproto.com/specs/xrpc service auth spec
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
enables diagnostic output when json parsing fails, particularly useful
for debugging enum mismatches from external APIs. users can enable via:
pub const std_options = .{
.log_scope_levels = &.{.{ .scope = .zat, .level = .debug }},
};
logs include: field name, path, expected type, actual json type, and error.
zero overhead when disabled - compiles away entirely.
closes #1
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- add minimal markdown鈫抣eaflet blocks converter (headers, code, paragraphs)
- dual-publish to both site.standard.document and pub.leaflet.document
- trigger publish workflow on doc changes (README, CHANGELOG, docs/*, devlog/*)
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- consistent gutter variable for all horizontal spacing
- proper CSS cascade (base styles before media query)
- flexbox layout instead of grid (simpler)
- cleaner hamburger icon using pseudo-elements
- one breakpoint at 768px
- removed hacky negative margins
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- hamburger menu toggle (hidden on desktop)
- sidebar slides in from left on mobile
- overlay backdrop when menu open
- touch-friendly nav sizing (44px+ tap targets)
- responsive padding at breakpoints
- code blocks edge-to-edge on small screens
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
first entry: how zat publishes its own docs to ATProto
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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>
- scripts/publish-docs.zig: uses zat to publish README, roadmap, and
changelog as site.standard.document records
- .tangled/workflows/publish-docs.yml: triggers on v* tags
- build.zig: adds publish-docs executable target
requires ATPROTO_HANDLE and ATPROTO_PASSWORD secrets in repo settings.
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
new enums from com.atproto.sync.subscribeRepos lexicon:
- CommitAction: create, update, delete
- EventKind: commit, sync, identity, account, info
- AccountStatus: takendown, suspended, deleted, etc.
these work with std.json automatic enum parsing, enabling
exhaustive switches instead of mem.eql string comparisons.
bumps version to 0.1.0 (new feature, backwards compatible).
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
the stdlib deflate decompressor panics with "reached unreachable code"
on certain gzip responses when running on x86_64-linux. setting
Accept-Encoding: identity avoids triggering the decompressor.
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
resolves handles to DIDs using https://{handle}/.well-known/atproto-did
note: DNS TXT resolution (_atproto.{handle}) not implemented as zig std
doesn't provide TXT record lookup. HTTP method is the primary fallback
per atproto spec.
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- fix use-after-free in jwt payload parsing (dupe strings)
- fix crypto.sign.ecdsa path for zig 0.15
- fix test token to have correct 64-byte signature
- use arena allocator in extractAt tests to avoid leaks
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- jwt.zig: parse and verify ES256/ES256K tokens
- multibase.zig: base58btc decoding for DID document keys
- multicodec.zig: parse secp256k1/p256 key types from prefix
follows atproto.com/specs/xrpc service auth spec
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>