How do four ways of building produce one form JSON?
Every AskForth form is a single JSON document, {id, config, stages, rows, columns, fields}: a normalised graph in which pages, rows, columns and fields are keyed by id. That shape came from formeo, an MIT-licensed form builder, and it is the part we kept.
Why a hard fork
In July 2026 we looked for a builder to stand on. The free options either kept the builder behind a paywall, added a watermark or came with a copyleft server. formeo was MIT-licensed and active again, but run by one maintainer. Our research suggested vendoring it; we chose a hard fork instead, because the builder experience is part of what we sell and we wanted full control of it. Twelve days later we deleted formeo's own editor and renderer, a commit that removed about 21,500 lines, and replaced them with our own, which also removed a runtime fetch of assets from the upstream CDN. The MIT licence notice stays in the repository.
Four paths, one law
- AI-built: Forth turns a description into the JSON.
- Hand-built: drag-and-drop in our editor, which ships as a library mounted with
mountEditor(). - Hybrid: build by hand, then ask Forth for changes; each batch is one undo step.
- Templates: the 33 system templates are stored JSON, built with the same kit.
What makes them interchangeable is a round-trip law: anything the builder can express re-opens in the builder and renders from the JSON alone. Machine edits go through one small set of operations in a shared ai-kit. The AI, the template seeder and a six-tool MCP server all call it, so there is a single code path for changing a form.
Drafts are saved as they are; publishing takes an immutable version snapshot, so a live form never changes under a respondent. The 68 field types, 10 themes and 7 font stacks live in one registry, which is why the public templates page can re-skin every form with a single theme dial.


















