Feathery

feathery.iocontributed by Samuele Ongaro

YES

Replaceable in one session with an AI coding agent.

A form builder for complex flows: multi-step applications with conditional logic, document upload, verification steps and integrations into back-office systems.

Promptfree, for everyone, and the only version there is
Build me a form engine that replaces Feathery: long conditional applications with document upload and verification, writing into the systems behind them.

STACK
- Node 20+ with Fastify, server-rendered HTML with a little vanilla JS
- SQLite through better-sqlite3, WAL mode
- No client-side framework — a multi-step form is server-rendered pages, and that is a feature
- Caddy in front

THE DATA MODEL
- forms: id, slug, name, version, definition_json, status, published_at
- form_versions: id, form_id, version, definition_json, published_at — a submission records the version it was filled against, because a form edited on Tuesday must not change what somebody answered on Monday
- steps: part of the definition — id, title, fields, condition
- fields: id, key, kind, label, help, placeholder, required_when, validation_json, options_json, mask
- submissions: id, form_id, form_version, token, status, started_at, last_seen_at, submitted_at, ip_hash, referrer_host
- answers: id, submission_id, field_key, value_text, value_num, value_json, answered_at — one row per answer, so a partial submission is just fewer rows
- documents: id, submission_id, field_key, path, sha256, mime, bytes, pages, status, verified_at, rejected_reason
- reviews: id, submission_id, reviewer, decision, note, at
- deliveries: id, submission_id, target_id, status, attempts, response_excerpt, at
- events: id, submission_id, kind, field_key, meta_json, at — append-only, and this is where the drop-off analysis comes from

THE FORM DEFINITION
- One JSON document describing steps, fields, conditions and validation. It is data, versioned, and diffable
- Conditions as a small explicit expression tree over earlier answers — never arbitrary code, never a string evaluated at runtime
- The same evaluator runs on the server and in the browser, from one module, so what is shown and what is accepted can never disagree
- Validated on save: a reference to an unknown field, an unreachable step, or a condition that can never be true is an error before publishing rather than a dead end for an applicant

FILLING A LONG FORM
- Every step is a real page with a real POST. Back and forward work. A refresh loses nothing
- Progress saved on every step, resumable by a long random token sent to the applicant's email — a forty-field application filled on a phone will be finished on a laptop three days later, and losing it is losing the applicant
- A progress indicator that is honest about the remaining steps, given the conditions already met
- Errors shown on the field, in text, with the entered value kept
- Works with JavaScript disabled, end to end. Enhancement adds masking, live validation and conditional show-and-hide within a step

DOCUMENT UPLOAD AND VERIFICATION
- Upload streamed to disk, type from content rather than filename, size capped, and a per-submission quota
- Images and PDFs accepted; a photo from a phone is resized and rotated by its EXIF orientation before storage, and the orientation tag stripped
- A preview shown back to the applicant so a photo of a thumb is caught by the person who took it
- Optional text extraction to check the document is what it claims — a date, a name, a number — with a confidence, presented to a reviewer rather than deciding on its own
- Documents are personal data of the most sensitive kind. Encrypted at rest, served only through a permission check, with an explicit retention period and a sweeper that actually deletes

REVIEW AND DELIVERY
- A queue for submissions needing a human: approve, reject with a reason, or return to the applicant asking for one field again
- Returning a submission reopens exactly the steps needed, not the whole form
- Delivery targets: an HTTP endpoint with a signature, an email, a row written into a database, a file dropped somewhere. Each retried with backoff, each recorded, each idempotent so a retry does not create a duplicate record downstream
- A dead-letter list with a one-button replay

MEASURING, WHICH IS HOW A LONG FORM GETS SHORTER
- Drop-off per step and per field, computed from the events table
- Time spent per step, and the fields that get corrected most
- Completion rate by device — a long form on a phone is a different form
- Every number computed at query time from events

ACCESSIBILITY, WHICH IS NOT OPTIONAL HERE
- Labels tied to inputs, errors announced, fieldsets for groups, a visible focus ring, and a logical tab order
- These forms are often how somebody applies for something they need. An inaccessible one excludes exactly the people least able to work around it

OPERATIONS
- .env: DATABASE_PATH, STORAGE_PATH, BASE_URL, SESSION_SECRET, HASH_SALT, ENCRYPTION_KEY, SMTP_URL
- Migrations on boot, each once
- Nightly backup off the machine, restore script, and a documented retention policy per form
- Health endpoint

WHAT MATTERS MOST
Resumability and one condition evaluator. Build the token-resume path and the shared evaluator first, then fill a twenty-field form on a phone, close the browser, and finish it a day later on a laptop. Everything else here is field types.

Give me the repository, migrations, .env.example, a seed form of six conditional steps with an upload, and a README with deploy steps behind Caddy and the retention policy stated.

What you lose

  • A builder capable of long conditional applications that a non-developer can maintain
  • Document upload with verification steps built in
  • Integrations that write into the systems behind the form

If you would rather not build

  • A multi-step form with server-side validation

What it costs

as published on their pricing page

PlanBilled monthlyBilled yearlyLast read
—$39/mo——

Their pricing page is where these came from. Seeing a different price? Tell us.

The escape hatch

open source · no votes, no paid placement

Formio

$0

A JSON-schema form engine with a renderer and an API server.

formio/formiofree · open source

Formbricks

$0

Self-hosted forms with logic and a submissions dashboard.

formbricks/formbricksfree · open source

Why this verdict

our own opinion · changed only by a person

78/100

Verdict yes at 78. Saving each answer and resuming by link is what makes a long form completable, and it is the part most home-made versions skip.

History

tracked since 10 Aug 2026 · nothing is ever overwritten

Interest · last 30 dayspeak 2/day
views01230 Aug4 Sept9 Sept14 Sept19 Sept24 Sept28 Sept
— views— prompt copies none yet— votes none yet

Questions about Feathery

answered from the record above

Is Feathery free?

No — the plan we track is $39 a month. Pro from around $39/month billed monthly, cheaper annually.

Can you replace Feathery by building your own?

YES. Replaceable in one session with an AI coding agent. Replacement score 78 out of 100, build time one session. Read what you lose before you decide.

How much does Feathery cost?

$39 a month on Pro — $468 a year. Recorded 10 Aug 2026.

What do you lose by replacing Feathery?

A builder capable of long conditional applications that a non-developer can maintain; Document upload with verification steps built in; Integrations that write into the systems behind the form. If any of those carry weight for you, keep paying.

Is there an open-source alternative to Feathery?

Yes: Formio, Formbricks. The prompt on this page is for when you want it your way instead.

Related entries

same category first, most replaced first

All 19 in Forms

Not sending yet

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

Esc