All projects
Saas
Built — not yet launched

AskForth — AI Form Builder SaaS

AskForth is CountryDevs' own form SaaS. People build a form by describing it to an AI, by drag-and-drop, by mixing both or from a template, and all four produce the same JSON. Forms run as hosted links or CSP-safe embeds, with 24 industry packs on top. Built, not yet launched.

For AskForthJul–Sep 2026
  • Web dashboard
  • Form builder library (JavaScript)
  • Embed widget (TypeScript)
  • Hosted form pages
  • Marketing site
  • Superadmin console
Form editor with the Forth AI drawer open on the right showing suggested prompts and a message box.

Overview

AskForth is a form-building SaaS that CountryDevs designed and built as its own product between July and September 2026. It rests on one idea: a form is a JSON document, and everything else (the editor, the AI, the templates, the hosted page and the embed) reads or writes that document.

A user can build a form four ways. They can describe it to Forth, the built-in AI form builder; drag fields in from a palette of 68 field types; start by hand and ask the AI to improve it; or pick one of 33 system templates. Published forms go out as a hosted link, an embed snippet for any website, or a plain HTTP endpoint for developers. Responses land in one inbox with spam triage, consent records and optional identity checks. On top of forms sit 24 industry packs, for schools, clinics, coaching centres, event planners and more, each of which turns a workspace's forms into an operating view.

We built the whole stack: a form-engine library built on a hard fork of the open-source formeo library, a Node.js and Express API on MongoDB, a Next.js dashboard and marketing site, and a TypeScript embed widget. AskForth is built but not launched. The public site is waiting on a few legal and policy details, and payments are tested but switched off, so there are no users to report yet.

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.

Why does the AI plan the form instead of writing it?

Our first AI builder had the model write form operations itself. It handled simple forms and fell apart on structured ones: on a priced-menu test, 18 to 25 operations per run failed because totals pointed at price fields that did not exist. We redrew the pipeline, internally called Blueprint, around one principle: the model designs, code constructs.

The stages

  1. Route. A short call classifies the message as build, edit or chat. Edits and chat apply operations directly, with up to two self-correction rounds.
  2. Architect. The model turns the request into a typed FormPlan of sections, questions, kinds and prices. It never writes ids, references or formulas. Output that does not parse gets one stricter retry, and unknown field kinds are normalised against the registry.
  3. Design. Deterministic rules add a theme, title, headings and layout and drop junk fields. If design gaps remain, the architect gets one corrective retry.
  4. Assemble. Code builds the fields and writes every reference and total from the plan's own data, so a total cannot point at a missing field.
  5. Cross-check and repair. A second model call compares the built form with the request and lists up to eight gaps, and a repair call fills them. The loop is capped at two rounds and never fails the build.
  6. Finalise. Totals and the submit button go in last, so items added during repair are still counted.

The whole exchange has one 60-second deadline, runs at temperature 0 with JSON output, and caps user messages at 2,000 characters.

What the records show

On the priced-menu test, the same model went from 18–25 failed operations to zero. Across a 15-form benchmark (menus, bookings, quizzes, job applications, RSVPs and more), the pipeline built 15 of 15 forms cleanly on one model, and 14 of 15 on a cheaper one that used about 30% fewer tokens. Which provider runs it is a configuration setting, not a rebuild.

How do AskForth embeds survive strict Content Security Policies?

A form embedded on a customer's website runs under that website's security policy, and many sites forbid eval and new Function. Conditional logic and calculated fields are exactly where form engines reach for them, so we wrote our own evaluator.

A small expression parser

eval-expr.js is a hand-written recursive-descent parser of about 170 lines. It understands numbers, + - * /, brackets, comparisons and a fixed list of functions such as SUM, IF, ROUND and PCT. Field references like {Quantity} are replaced with numbers before the parser sees the string, so it only ever handles arithmetic. Division by zero, or anything it does not understand, returns null instead of throwing. A validator twin, expr-check.js, lets the editor and the AI reject a bad formula before it is saved.

The same parser on the server

The API imports the same renderer module. When a submission arrives, the server re-evaluates every show-if condition before enforcing required fields, so a hidden question cannot block a respondent and a visible required one cannot be skipped by editing the request. If an expression cannot be evaluated, the server treats the field as visible.

Hosted pages and the widget

Hosted form pages send their own policy: default-src 'none', scripts only with a per-request nonce, no unsafe-eval, and frame-ancestors built from the workspace's registered domains. Inline styles stay allowed on purpose, because the engine paints themes with them; CSS injection is contained by the engine's own value guards instead. The Google sign-in origin is added only on forms that require sign-in. The TypeScript embed widget renders each form inside a Shadow DOM and receives the form JSON only after the server matches the page's origin against the workspace's active domains.

A regression test throws nine XSS payloads at every control in the registry. The no-eval rule is enforced by how the code is built; we confirmed it by searching the built bundles, not with a committed test.

How does AskForth keep its GST invoice series gapless?

AskForth's billing reuses the engine we built for Storafleet, our storage SaaS, together with the lessons from auditing it.

Subscriptions only

AskForth never creates one-off Razorpay orders. Of its four tiers (Ask, Forth, Forte and Force), the paid self-serve plans are Razorpay Subscriptions, and an order record is written already paid when the subscription.charged event arrives. The webhook receiver:

  • checks an HMAC-SHA256 signature over the raw request body with a constant-time comparison;
  • drops events that belong to other apps on the shared Razorpay account;
  • stores each event under a unique id, so a duplicate delivery does nothing;
  • answers 200 before doing the work.

A replay job sweeps failed events every ten minutes, up to six attempts with doubling back-off.

The invoice series

GST invoice numbers have to run in an unbroken sequence. Each financial year (April to March, computed in UTC) has one counter document, and numbers such as INV/AF/FY26-27/00042 are reserved with a single atomic $inc. The order of operations matters: build the invoice, validate it, then reserve the number, then save. A validation failure cannot burn a number, and a unique index stops two invoices being issued for one Razorpay order. The guarantee rests on that write order and on unique indexes, not on a multi-document transaction. Storafleet taught us both rules: its first invoice of each financial year had been numbered 00000, and a failed enterprise invoice used to consume a number.

Tax and reconciliation

The tax branch follows the seller's registration and the buyer's location: no GST when the seller is not registered, a zero-rated export for foreign buyers, CGST plus SGST within the state and IGST across states. Before issuing, a guard refuses any invoice whose total differs from what Razorpay actually collected.

Industry packs keep a separate series for invoices a workspace raises to its own customers, such as a coaching centre's term fees, numbered in the workspace's time zone. Until launch, checkout answers 503 PAYMENTS_COMING_SOON unless real keys are configured and payments are switched on.

Why does each industry pack get its own backend stack?

Forms are the input; the industry packs are what an organisation does with the answers. AskForth has 24 packs, from schools, clinics and coaching centres to housing societies, event planners, salons and insurance advisers. Inside each pack, roles called desks see the tools for their job: a clinic has a doctor, a nurse and a front desk; a school has management, teachers, office and accounts. The registry defines 70 desks in all.

Shared screens or full copies?

At first every industry reused the education screens in a different costume, with a "student" relabelled as a patient or a traveller. It was quick, and it leaked: in our own demo data, school students showed up on a travel agency's Travelers page, because both read the same collection.

In late July 2026 we chose full separation. Every industry with directory tools gets its own models, MongoDB collections, services, controllers and routes on the backend, and its own API layer, interfaces and pages on the front end, under its own URL subtree such as /clinic/patients or /travel/travelers. Today 22 of the 24 packs have their own stack; food and marketing do not need directory tools yet and get a folder the day they do.

We named the trade-off when we made the call. A fix that applies to every industry now costs one edit per industry, and adding an industry means scaffolding folders rather than adding a registry row. In return, each industry evolves on its own: a patient record can grow a medical history and a traveller can grow passport fields without touching each other, and a leak between industries is impossible by construction because they no longer share a collection.

What a pack adds

The clinic pack turns appointment requests into a patient-journey board (enquiry, visited, treated, follow-up) with one-click conversion to a patient record. The coaching pack raises term invoices per student and batch and records desk payments with numbered receipts. The events pack rolls RSVPs into live headcounts and per-question tallies.

The challenge

Small organisations in India run on forms: a clinic's intake sheet, a school's fee reminder, a coaching centre's admission form, an event's RSVP. The tools they reach for either stop at collecting answers or are built for larger teams. What happens after the answer (the follow-up, the invoice, the consent record, the headcount) ends up in a spreadsheet.

Building a better form tool means solving three hard problems. AI form generators produce forms that look right but break, such as a price list whose total refers to fields that do not exist. Embedding a form on someone else's website means running code under their security policy, and many sites block scripts that use eval. And charging Indian businesses means GST invoices whose numbers never skip.

The solution

We made the form JSON the product. The editor, the AI, the template library, the hosted page and the embed widget all read and write the same document, so a form can switch between building methods mid-flight and still render the same everywhere.

The AI never writes the form directly. A language model plans the form as typed data; deterministic code assembles the fields, references and totals; a second model pass checks the result against the request and triggers a bounded repair. The renderer evaluates conditions and calculations with its own small expression parser, never eval, so embeds work under strict Content Security Policies, and the server runs the same parser to decide which fields are really required. Billing runs on Razorpay Subscriptions with an invoice series for each financial year, and each industry pack has its own backend stack so it can grow without touching the others.

The impact

AskForth is built and not yet launched. The dashboard, API, form engine, embed widget, superadmin console and a 48-page marketing site are complete. The marketing site's deployment is waiting on a few legal and contact details. Payments are built and tested in Razorpay's test mode, but checkout stays switched off until live keys are in place. There are no users or customers to report.

What the records show is the engineering. At the last billing push in September 2026, the backend's Jest suite passed 479 of 479 tests. On a 15-form benchmark covering menus, bookings, quizzes, job applications and more, the AI pipeline built all 15 cleanly. On the priced-menu test that triggered its redesign, the same model went from 18 to 25 failed operations per run to none.

Features

What we built into AskForth

Four ways to build, one JSON

Describe a form to the AI, drag fields from a palette of 68 field types, mix both, or start from one of 33 system templates. Every path writes the same form JSON.

Forth, the AI builder

A drawer inside the editor builds or edits forms from plain language. Each change lands on the canvas as an undoable step and never touches existing responses.

CSP-safe embeds

A TypeScript widget renders each form inside a Shadow DOM on the sites a workspace has registered, and conditions and calculations run without eval.

Hosted links and a developer endpoint

Every published form is also a hosted page and a plain POST endpoint, with ready-made HTML, curl and fetch snippets and a list of every response code.

Spam checks and consent records

Honeypot and time-trap checks, rate limits, a duplicate-response guard, optional Google sign-in for respondents, and an immutable DPDP consent stamp on every submission.

Domain registry

Workspace owners register the domains their forms appear on and verify them with a DNS TXT record or a meta tag. Embeds and frame-ancestors only allow those domains.

One submissions inbox

Responses from every form in a workspace land in one inbox with new, seen and spam triage, plus the channel and source domain of each one.

24 industry packs

Schools, clinics, coaching centres, event planners, gyms, housing societies and more get working screens built on their forms, such as patient-journey boards, fee invoicing and RSVP headcounts.

Browser-side bulk imports

CSV, TSV and Excel rosters are parsed in the browser by our own readers, previewed, and then committed, with rows added, updated, skipped and failed logged for each run.

Razorpay billing with GST invoices

Four plan tiers with paid plans on Razorpay Subscriptions, webhook replay, and GST-aware invoices numbered per financial year. Built and tested, switched off until launch.

By the numbers
68
Field types in the form engine
24
Industry packs on one workspace model
15/15
Benchmark forms built cleanly by the AI pipeline
479
Backend tests passing at the September 2026 billing push
Screens

What AskForth looks like

AskForth landing hero with headline 'Ask for anything' and a live pottery-workshop booking form card.
The public landing page pairs the AskForth pitch with a live, working booking form rendered by the same engine the product uses.
AskForth templates page with a theme dial of ten themes beside a live class-test form.
Every template on the public gallery is a live form rendered by the real engine, with a theme dial that re-skins them all from the same JSON.
AskForth dashboard home with the workspace switcher open, listing a clinic, a coaching centre and an events workspace.
One account runs several industry workspaces; the switcher lists each with its role, over a home view of forms, monthly submissions and recent responses.
Template gallery with filter dropdowns and cards for menu order, appointment request, salon booking and patient intake templates.
33 system template packs can be filtered by category, industry and purpose, previewed, and turned into a form in one click.
AskForth form editor showing a field palette on the left, a patient intake form on the canvas and the inspector panel on the right.
The editor pairs a field palette, an engine-rendered canvas and an inspector; here a patient intake form is being edited with its theme and font pickers.
Share dialog for the Patient intake form on the Embed tab with an embed code snippet.
Every published form ships as a hosted link and an embed snippet for any website, from the same share dialog.
Form settings page on the Verification tab with spam protection and duplicate-response options enabled.
Per-form verification settings switch on invisible spam protection and one-response-per-person, with SMS phone verification available on the top tier.
Form settings on the Consent / DPDP tab showing an enabled consent statement for a clinic intake form.
The consent tab records a DPDP-style consent statement and privacy-policy link; the exact wording a respondent agreed to is stamped on every submission.
Submissions table with a side panel open showing one dental appointment response and its embed source.
All responses across a workspace's forms land in one inbox with new/seen/spam triage; opening one shows every answer plus its source channel and domain.
Domains page listing three example domains, two verified and one unverified, against a 5-domain plan limit.
Workspace owners register the domains their forms are embedded on, see per-domain form and 30-day submission counts, and verify ownership by DNS.
Clinic overview with patient count, patient-journey funnel bars, outstanding fees and a response sparkline.
The clinic industry desk turns forms into an operating view: patients, live forms, the patient-journey funnel, money outstanding and a 14-day response trend.
Coaching billing page with outstanding and collected totals and a table of term invoices marked paid, part-paid or issued.
The coaching desk raises term invoices per student and batch, records desk payments with numbered receipts and tracks what is outstanding.
Developer page with the form endpoint URL, an HTML form example and a table of response codes.
Any form doubles as a plain HTTP endpoint: the developer page shows the submit URL, ready-made HTML/curl/fetch snippets and every response code.
AskForth Editor playground with field palette, an event registration form on the canvas and the inspector.
The drag-and-drop editor ships as a standalone library mounted into any page with mountEditor(); the playground loads a template's JSON onto the engine-rendered canvas.
Project details
Tech stack
JavaScript (ES modules)TypeScriptViteSortableJSNode.jsExpressMongoDBMongooseNext.js 15ReactRedux ToolkitRazorpayAWS S3MSG91JestPlaywrightModel Context Protocol
Timeline & team
Jul–Sep 2026
FAQ

Questions about this project

How does AskForth stop AI-generated forms from breaking?

The model only plans the form as typed data; deterministic code writes the fields, references and totals, so a total can never point at a field that does not exist. A second model pass checks the built form against the request and triggers at most two repair rounds.

Can an AskForth form run on a website with a strict Content Security Policy?

Yes. The renderer evaluates conditions and calculations with its own expression parser and never uses eval or new Function, and the embed widget renders each form inside a Shadow DOM. Hosted form pages send their own nonce-based policy.

Is the AskForth form builder written from scratch?

It is built on a hard fork of the MIT-licensed formeo library. We kept formeo's normalised JSON data model and its licence notice, deleted the upstream editor and renderer, and wrote our own in their place.

Is AskForth available to use today?

Not yet. The product is built and its payments have been tested in Razorpay's test mode, but the public launch is waiting on final legal and policy details, so it has no customers yet.

More work

Other things we shipped

All projects
Storafleet fleet overview with storage totals, trend line, transfers list and per-provider footprint barsFeatured
Saasfor Storafleet

Storafleet — Multi-Cloud Storage Control Plane

Storafleet is CountryDevs' own SaaS control plane for object storage. Teams connect buckets they already own on 50+ providers, including AWS S3, Cloudflare R2, Backblaze B2, Wasabi and MinIO, then browse, migrate, search, secure and cost-check them from one console.

Next.js 15ReactRedux ToolkitNode.js+11
50+Storage providers in the connection roster
Case study
Pakka Logistics home page hero on desktopFeatured
Mobile Appfor Pakka Logistics

Pakka Logistics — Porter-Style Delivery Platform

Pakka Logistics is a Porter-style delivery platform for India. We built all of it: Android apps for customers and drivers, a business portal, an operations console and the website. The web platform is live; the Android apps are being prepared for Google Play.

React NativeTypeScriptRedux ToolkitNode.js+12
96.3%API routes exercised by a probe before launch (260 of 270)
Case study
Superadmin stories grid with photo storiesFeatured
Mobile Appfor Slic Solutions Private Limited

LetSlic — Social Media App with Group Chat, Stories and Premium

LetSlic, listed on Google Play as Slic, is a social app for photo posts, 24-hour stories and real-time chat with group moderation. We built it for Slic Solutions Private Limited: the React Native app, two Node.js APIs, the superadmin console and the website, plus Premium and ads.

React NativeTypeScriptReduxNode.js+13
13Months from first commit to handover (Jun 2025 – Jul 2026)
Case study
Got a project?

Let's build the
next one together

Tell us what you're trying to ship. We'll come back with a scope, a timeline, and a fixed price — usually within 48 hours.

Not ready for a full build? Start with a fixed-price Discovery Sprint, or get a code audit of an app someone else built.