You describe a goal; the agent works toward it one action per turn — writing files, editing them via content-anchored search/replace (applied through a four-tier match cascade that reports which tier fired, never by line number), running a file, or running pytest for real inside a Pyodide WebAssembly sandbox. Every turn's output is forced through a JSON schema by in-browser grammar-constrained decoding, because small models can't be trusted to freestyle a tool call — the most replicated finding in the small-model tool-use literature. How the work gets proven is the harness's call, not the model's: a workspace with tests is verified by pytest, everything else by running it — a small model writing its own tests and then grading itself against them is circular, and its real failure mode is worse, quietly “fixing” correct code to satisfy a broken test. You can keep typing while it works: a new message goes into the next turn and hands the agent a fresh budget. The context window is yours to set too — the models are pinned to 4k by default, but they handle more, and a bigger window keeps more of the workspace and history in front of the model at the cost of VRAM and a slower first token. Your edits count too — the workspace is yours to change, and the agent picks up whatever you did.
No server, no upload, no API key. The only network calls this page makes on your behalf are the ones you authorize: a one-time model-weight download, served through this site's own origin and cached in your browser afterward, and the Python sandbox itself.