+4
docs/plan-expanded.md
docs/archive/plan-expanded.md
+4
docs/plan-expanded.md
docs/archive/plan-expanded.md
···
1
+
# archived: expanded plan (partially implemented)
2
+
3
+
This file is preserved for context/history. Current direction lives in `docs/roadmap.md`.
4
+
1
5
# zat - expanded scope
2
6
3
7
the initial release delivered string primitives (Tid, Did, Handle, Nsid, Rkey, AtUri). this plan expands toward a usable AT Protocol sdk.
+4
docs/plan-initial.md
docs/archive/plan-initial.md
+4
docs/plan-initial.md
docs/archive/plan-initial.md
···
1
+
# archived: initial plan (out of date)
2
+
3
+
This file is preserved for context/history. Current direction lives in `docs/roadmap.md`.
4
+
1
5
# zat - zig atproto primitives
2
6
3
7
low-level building blocks for atproto applications in zig. not a full sdk - just the pieces that everyone reimplements.
+40
docs/roadmap.md
+40
docs/roadmap.md
···
1
+
# roadmap
2
+
3
+
`zat` is a grab bag of **AT Protocol building blocks** in Zig: parsers, validators, resolvers, and small protocol helpers.
4
+
5
+
This roadmap is intentionally short. If it doesn’t fit into one file, it probably belongs in issues.
6
+
7
+
## now
8
+
9
+
- keep current APIs stable (0.x semver)
10
+
- tighten docs/examples as real apps discover sharp edges
11
+
- keep the “primitives, not framework” ethos
12
+
13
+
## next
14
+
15
+
### polish
16
+
17
+
- improve docs around common workflows:
18
+
- resolving handle → DID → PDS
19
+
- making XRPC calls + parsing JSON
20
+
- verifying JWTs from DID documents
21
+
- add more integration tests that hit real-world edge cases (without becoming flaky)
22
+
23
+
### primitives
24
+
25
+
- fill gaps that show up repeatedly in other atproto projects:
26
+
- CIDs and common multiformats plumbing
27
+
- richer `AtUri` helpers (safe joins, parsing variants)
28
+
- more ergonomic JSON navigation patterns (still optional, no forced codegen)
29
+
30
+
## later (maybe)
31
+
32
+
- lexicon codegen is still “probably a separate project”
33
+
- higher-level clients/frameworks stay out of scope
34
+
35
+
## non-goals
36
+
37
+
- token refresh/session frameworks
38
+
- opinionated app scaffolding
39
+
- “one true SDK” that tries to do everything
40
+
+19
-1
scripts/build-wisp-docs.mjs
+19
-1
scripts/build-wisp-docs.mjs
···
139
139
140
140
const mdFiles = (await exists(docsDir)) ? await listMarkdownFiles(docsDir) : [];
141
141
142
+
// Copy all markdown under docs/ (including archives), but only include non-archive
143
+
// paths in the sidebar manifest.
142
144
for (const rel of mdFiles) {
143
145
const src = path.join(docsDir, rel);
144
146
const dst = path.join(outDocsDir, rel);
···
146
148
await cp(src, dst);
147
149
148
150
const md = await readFile(src, "utf8");
149
-
pages.push({ path: rel, title: normalizeTitle(titleFromMarkdown(md, rel)) });
151
+
if (!rel.startsWith("archive/")) {
152
+
pages.push({ path: rel, title: normalizeTitle(titleFromMarkdown(md, rel)) });
153
+
}
150
154
}
155
+
156
+
// Stable nav order: README homepage, then roadmap, then changelog, then the rest.
157
+
pages.sort((a, b) => {
158
+
const order = (p) => {
159
+
if (p === "index.md") return 0;
160
+
if (p === "roadmap.md") return 1;
161
+
if (p === "changelog.md") return 2;
162
+
return 3;
163
+
};
164
+
const ao = order(a.path);
165
+
const bo = order(b.path);
166
+
if (ao !== bo) return ao - bo;
167
+
return a.title.localeCompare(b.title);
168
+
});
151
169
152
170
await writeFile(
153
171
path.join(outDir, "manifest.json"),