> product // goanna // the making of
Goanna
how it was made.
Goanna is the knowledge fabric that runs our AI virtual team: shared memory, files and a real sync daemon so every agent works from the same substrate. Four repos, 931 commits, 24 days of calendar time in May 2026. The framework ships as conventions, not code; the platform ships as a Go daemon, a Cloudflare Worker and a desktop app.
The short version
It started on 1 May 2026 as a convention framework: a folder structure and a set of agent roles (boss, worker, librarian, scout) with no code at all. The idea was that markdown files and shared conventions were enough substrate for a small AI fleet. That held true for the framework itself, which iterated from v0.1 to v0.2.19 over nine days of dogfooding and brains-trust reviews.
By mid-May the live instance had outgrown what a filesystem alone could do. A bash sync stack became a Go daemon (goannad), then grew CAS conflict resolution, a Cloudflare Durable Object for event fan-out, an auto-update mechanism and a web app. A desktop client was built in parallel, reaching v0.8 in a single session. What mattered in the end was the constraint that held: the framework still ships zero scripts. Convention, not code, is what makes it forkable.
// the build log · mined from the commit history, nothing dramatised
Convention before code
The framework and the live Jezweb instance were started on the same day, committing together through nine shared phases. v0.1 established the folder shape and three baseline agents; a WHY.md named the design decisions from the first commit. The quickstart prompt was simplified to 'hi boss': the smallest possible on-ramp.
Frictions surfaced, framework revised
Six dogfood frictions were addressed in v0.2.3. A fourth agent (scout) was added in v0.2.12. The setup-goanna skill made fresh-machine bootstrap a single operation by v0.2.14. A brains-trust review was run before the first public announcement, catching issues in inheritance, async-comms framing and the onboarding path.
Agents wired, crons running, 22 days of output committed
The live instance started accumulating real fleet work, inbox briefs, specialist agents, client records and scheduled crons. The framework kept pace: the docket primitive was introduced for author-files/reviewer-commits, then discarded four days later when it hadn't earned its place. A simplification sweep on 11 May cut the framework from 17 root files to 8 and coined the essence-only principle.
Git was not enough
A steward agent primitive was added to handle per-Mac git hygiene. Claude Desktop Routines were adopted as the scheduler, then parked in a 5-phase reversal when terminal Claude Code proved more reliable. The substrate sync model shifted from git-as-substrate to R2 + rclone bisync. The 'den/' folder was renamed to 'wiki/' because 'den' was a personal metaphor.
goannad v0.1 through v0.5
A bash watch/listen sync stack was replaced by a Go daemon in one commit labelled 'goannad v0.1.0'. It grew CAS conflict resolution (v0.3), a Cloudflare Durable Object for WebSocket fan-out (v0.2), and auto-update via SSE so the fleet upgrades in seconds (v0.4.5). A separate session produced the desktop app, Wails scaffold to v0.8 smart auto-titling in a single burst of commits.
55 brains-trust rounds, 229 tests, zero acknowledged gaps
The web app and /ask endpoint were built and hardened across more than 55 documented review rounds on 2026-05-20 alone. The platform reached 82 commits in a single day. The session closed with an explicit readiness brief: 15 rounds, 5 surfaces, 229 tests, zero remaining findings.
Worker-managed indexes and the ops layer
Worker-managed INDEX.md manifests were planned, specced and shipped in three phases. A goanna-ops MCP Worker was added with fileshare, mediabox and ask tools, giving agents a structured API surface over the substrate they already owned.
git log: “goanna: discard the docket primitive, never earned its place”
12 May 2026, goanna-framework. The framework built and discarded a whole collaboration primitive in two days. The log kept the evidence.
// the roads not taken
Tried, measured, set aside: the judgement lives here as much as in what shipped.
The docket primitive
Introduced on 10 May as an author-files/reviewer-commits workflow layer. Discarded on 12 May: 'never earned its place' is the commit subject. The log is honest about it.
Bash sync stack replaced by Go
The original watch/listen/SSE sync was bash scripts. It was replaced wholesale by goannad v0.1.0 in Go once the fleet went live and race conditions became real. The bash stack was never shipped to users.
Claude Desktop Routines as the scheduler
Adopted and fully wired across the fleet in a 5-phase rollout on 14 May, then reversed the same day when a CronCreate durability bug made terminal Claude Code the safer default. All five phases are in the log.
Speculative skills and graduation machinery
A set of skills including dispatch-upstream, skill-graduation thresholds and the cross-pollinate skill were removed in a batch trim on 12 May. The essence-only principle named what the sweep was for.
Want something built like this?
This is how we work: in the open, measured, honest about the dead ends.