Behind the scenes
How this was built
Curious Pandas was built in about a day and a half, on 29 and 30 October 2026, by one person directing an AI coding agent. Most of the code and lesson text on this site was written by the AI. This page says how that worked, what kept it honest, what went wrong, and what it cost - because how software gets made is changing, and that is worth learning about too.
The site in numbers
Counted from the source each time the site is built, so these never go stale.
Who did what
The maintainer, at TemplateMechanics, decided what the site is and is not: free forever, no accounts, nothing running on a server, every lesson playable in a browser. They chose the subjects, the names, the domain, which features to build next, and when something was good enough to ship. They also set the working rules below, which caught most of the bugs on this page.
Claude, Anthropic's AI model (Opus 5, and Opus 5.5 for the last changes), worked as a coding agent inside Claude Code. It wrote the lessons, simulators, tests and deployment, ran them, read the results, and fixed what failed. The commits in the repository credit both.
For the big pushes, the main agent split the work. Each new trail went to a separate "writer" agent working in its own copy of the repository (a git worktree), with its own lessons, widgets, tests and browser checks. The main agent then merged each one and ran every check again before anything went live. Up to seven writers worked at once.
- The maintainer picks what to build next and the rules it has to meet.
- The main agent hands whole trails to writer agents, each in its own git worktree so they cannot trip over each other.
- Merged work runs the unit tests, many of which compare a simulator against the real tool: real git, real SQLite, real bash.
- Every page is rendered in Chromium, WebKit and Firefox, every widget is driven, and axe checks accessibility. Red goes back for a fix.
- Green runs everything again in CI, and only that exact build is deployed.
The rules that kept it honest
An AI agent says "done" with the same confidence whether or not it is. So the rules were about evidence, not effort:
- Verify in the running system. A green build proves the code compiles, not that the page works. Every page is opened in a real browser, its visible text read, its widgets clicked, its screenshots looked at - by phone width too.
- Check simulators against the real thing. The git playground's hashes are compared with the real git binary. The shell is replayed through real bash. The SQL runs real SQLite, and the lost-update lesson was checked against real PostgreSQL. A simulator that teaches the wrong failure is worse than none.
- Hunt the silent failure. After every change, ask: how would I know if this quietly did nothing? Most of the bugs below passed every check that existed at the time.
- Prefer loud failures. A misspelled icon, a lesson linked before it is written, an expedition that uses an idea before teaching it, a renamed quiz that would strand someone's progress - each now stops the build instead of shipping.
- Report honestly. Lead with what is broken or unverified. The commit messages name each failure and its symptom, and say what was not done.
What went wrong
A selection, in roughly the order they happened. Every one of these looked fine until something specific was checked.
- Pods that ignored clicks in Safari. The cluster simulator rebuilt its pods on every tick. In WebKit, a click landing between rebuilds hit an element that no longer existed. Chromium never showed it. Found only once the browser checks ran in all three engines.
- 73 accessibility failures. Gold text at 2.6:1 contrast, links nested inside links, faded cards meaning "locked". None of it showed in a screenshot. Adding the axe accessibility checker in light and dark mode found all of it.
- Nine failures that only happened in CI. Buttons fade their colour over 150 ms, and on CI's slower machine axe measured them mid-fade. Fixed by measuring settled colours, not by loosening the check.
- The CI machine changed underneath it. GitHub's newest Ubuntu image replaced the GNU tools with a Rust rewrite whose error messages are worded differently, and the shell lessons compare against those exact words. The runner is now pinned, with a test that fails if the reference tools are ever not GNU.
- Phones that scrolled sideways, on Linux only. Linux fonts are slightly wider, so a dropdown and a list that fitted on Windows overflowed by 3 to 19 pixels in CI. Reproduced locally by stretching letter spacing, then fixed properly.
- The merge tool damaged its own output. Windows decoded the writers' work in the wrong character set, garbling ✓ and ≥, and Git Bash silently rewrote a "//" argument to "/". Both were caught before anything was pushed, and every merged block was then compared byte for byte.
- A typo that drew the wrong picture. An unknown icon name quietly fell back to a default icon. Now an unknown name stops the build.
- A test that passed while half of it never ran. In the practice repository's tests, deleting the only file in a folder also deleted the folder, so the step after it failed - and the test still passed on the part that did run.
- Progress that could vanish without an error. Your progress lives only in your browser, keyed by lesson and quiz names. Renaming one would have quietly un-ticked it for everyone. Every name ever shipped is now recorded, and removing one without saying where it went fails the tests.
- A lesson that pointed at a later lesson. Mapping what every lesson builds on, for the expeditions, turned up a lesson that opened by referring to one learners would not reach until later - and two lessons that covered the same ground. They were merged, with progress carried over.
What it cost
- Hosting: $0. The site is static files on GitHub Pages, and every simulator runs in your browser, so there is no server bill to grow with learners.
- AI: about 10 million tokens of writer-agent work, which at Anthropic's published API prices would be roughly $200-400. That does not include the main conversation, which was not measured. It ran on a Claude subscription, so there was no per-token bill.
- Human time: one person, steering and reviewing, across two days.
Without AI, the same site would be roughly 330-590 person-days of work: writing and fact-checking at 500-1,000 words a day, two to three weeks per complex simulator, two to four days per simpler widget, plus tests and design. Realistically that is a small team for six to nine months, or about $250,000-$700,000 at typical contractor rates. That is an estimate from the size of the code and text, not a quote, and a team with that budget would probably have built less and reviewed it more.
What is not verified yet
Speed has a cost, and it is fair to say where:
- No human subject expert has reviewed most lessons. Claims are sourced (you can follow every one) and simulators are tested against real tools, but nobody with ten years in each field has read every page.
- Many "Do it for real" commands have not been run on a real cluster from start to finish.
- The agent lessons use a simulated model, clearly labelled, so they work offline and cost nothing. A real model behaves less predictably.
If you find a mistake, that is the most useful thing you can send. Open an issue on the repository; corrections are credited.
The stack
Astro builds static pages from MDX lessons. Simulators are plain TypeScript in your browser; SQL runs in sql.js (SQLite compiled to WebAssembly) in a sandboxed worker. Playwright drives every page in Chromium, WebKit and Firefox, with axe-core for accessibility. GitHub Actions runs it all on every push and deploys to GitHub Pages behind Cloudflare DNS. The README explains how the site is sandboxed, with each claim pinned by a test.
Story, costs and estimates as of 30 October 2026.