A form builder that works like a document — you type, and typing a question makes a field. It handles logic, calculations, payments and file uploads, and almost all of it is on the free tier.
Build me a document-style form builder that replaces Tally: I type a page, and typing a question makes a field. Read this first: Tally's free tier is unusually generous — unlimited forms and responses — so the money case for building this is weak. The reasons that hold up are: the responses never leave your machine, the form lives on your own domain with no third-party script, and you can put it wherever your product needs it. STACK - Node 20+ with Fastify, server-rendered HTML with a little vanilla JS - SQLite through better-sqlite3, WAL mode - One payment provider, hosted checkout - Caddy in front THE IDEA - The form is a document. You write a page and a marker turns part of it into a field, in the middle of a sentence if that is where it belongs - So the editor is a writing surface, not a stack of blocks to configure, and the rendered form keeps the prose around the fields - Everything below serves that. Any feature that turns the page back into a list of labelled boxes should be left out THE DATA MODEL - forms: id, slug, name, version, content_json, theme_json, status, published_at, close_at, response_limit - form_versions: id, form_id, version, content_json, published_at — a submission records the version it was filled against, because a form edited today must not change what somebody answered yesterday - submissions: id, form_id, form_version, token, status, started_at, submitted_at, ip_hash, referrer_host, country, payment_id - answers: id, submission_id, field_key, value_text, value_num, value_json - files: id, submission_id, field_key, original_name, path, sha256, mime_detected, bytes, scan_status - notifications: id, form_id, kind, target, template_md, condition_json - events: id, submission_id, kind, field_key, at — append-only, and where drop-off analysis comes from - The content is one document tree of text nodes and field nodes. That representation is the design; everything else derives from it WRITING THE FORM - A rich text editor. Headings, paragraphs, lists, images, dividers, page breaks — it is a page - Typing a marker inserts a field inline, configured in a panel beside it - A live preview at phone and desktop width showing the real thing - Themes: font, colours, spacing, cover image. It should look like part of the site it belongs to FIELD KINDS - Text, long text, number, email, phone, url, date, time, dropdown, multiple choice, checkboxes, ranking, rating, scale, matrix, file upload, signature, payment, hidden - Hidden fields filled from query parameters, which is how a form knows who sent somebody to it - Each kind has a parser, a validator, an inline rendering that fits inside a sentence, and a CSV form LOGIC - Conditional show and hide, and jumps to another page - An explicit expression tree over earlier answers, never evaluated code, with one evaluator shared by the server and the browser so what is shown and what is accepted cannot disagree - Calculations with a dependency graph, so a cycle is rejected at save time rather than found by somebody filling the form - Validated on publish: an unknown reference, an unreachable page or a condition that can never be true is an error before anybody sees it FILLING IT IN - Each page is a real POST. Back and forward work, a refresh loses nothing - Progress saved per page, resumable by a token - Errors on the field with the value kept - Works with JavaScript disabled apart from live calculations, which are enhancement - Fully accessible: labels tied to inputs, errors announced, a logical tab order, a visible focus ring. A form is often how somebody asks for something they need UPLOADS - Streamed to disk with a hard limit enforced as bytes arrive, type from content rather than filename, an allow-list per field - Stored by hash outside the web root, EXIF stripped from images, scanned if a scanner is available - Served only through signed expiring links, never attached to a notification email PAYMENTS - Hosted checkout; no card data reaches this application - The amount computed on the server from the answers, never taken from the browser. This is the classic way a payment form is abused - Marked paid only from a verified webhook, with idempotency by event id AFTER - Notifications to the owner, conditionally, and an autoresponder with a copy of the answers, both with a per-recipient daily cap so a loop cannot mail somebody four hundred times - A thank-you page that can be written like any other page, with the answers available in it, or a redirect - Export CSV and JSON, complete, including partials RESULTS - A table of submissions, searchable and filterable, plus a summary per question - Drop-off per page and per field, which is how a long form gets shorter - Everything computed at query time OPERATIONS - .env: DATABASE_PATH, STORAGE_PATH, BASE_URL, SESSION_SECRET, HASH_SALT, SMTP_URL, PROVIDER_KEY, PROVIDER_WEBHOOK_SECRET - Migrations on boot, each once - Nightly backup off the machine, restore script - Health endpoint WHAT MATTERS MOST The inline field and one evaluator. Build the document tree with fields inside sentences, then fill a twenty-field form on a phone, close it, and finish it a day later. Everything else here is field types. Give me the repository, migrations, .env.example, a seed form with logic and a payment, and a README with deploy steps behind Caddy.
What you lose
- A generous free tier with unlimited forms and responses, which makes the build hard to justify on money alone
- A document-style editor that non-technical colleagues genuinely enjoy using
- Payment collection, signatures and file uploads handled inside the form
- Conditional logic configured by clicking rather than by writing rules
- Notification email deliverability and the spam filtering that keeps submissions clean
If you would rather not build
- Typeform — the incumbent, covered separately on this site
The escape hatch
open source · no votes, no paid placement
Formbricks
$0Survey and form platform with logic, targeting and self-hosting.
formbricks/formbricksfree · open source
HeyForm
$0Conversational forms with logic jumps and a built-in results view.
heyform/heyformfree · open source
Why this verdict
our own opinion · changed only by a person
85/100
Verdict yes at 85: forms are the clearest category on this site, and the slash-command editor is the only part with real work in it. The honest counter-argument is Tally's free tier rather than the price of the paid one. Price needs verification before publishing.
History
tracked since 6 Aug 2026 · nothing is ever overwritten
Questions about Tally
answered from the record above
Is Tally free?
No price recorded yet. The pricing page shows us euro amounts only from where we are (Pro €20, Business €65), and a converted figure is not a headline price. See the pricing page for the number in your own currency.
Can you replace Tally by building your own?
YES. Replaceable in one session with an AI coding agent. Replacement score 85 out of 100, build time one session. Read what you lose before you decide.
How much does Tally cost?
Tally has no public headline price. The tier we track is Pro.
What do you lose by replacing Tally?
A generous free tier with unlimited forms and responses, which makes the build hard to justify on money alone; A document-style editor that non-technical colleagues genuinely enjoy using; Payment collection, signatures and file uploads handled inside the form; Conditional logic configured by clicking rather than by writing rules; Notification email deliverability and the spam filtering that keeps submissions clean. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Tally?
Yes: Formbricks, HeyForm. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

