Build a public form, collect submissions, spawn jobs from them.
Your First Form
By the end of this page you'll have a public URL that anyone can submit, and every submission will create a job in your FSM and end up as a first-class entity record. Six steps.
1. Create the entity kind
Jobs need an entity record to carry their payload. From the admin shell, open Entities:
- Type
intakein the "Entity kind" box. - Click Load. The list is empty — that's fine.
- Use the Create record form to add one seed record:
{ "name": "sample", "notes": "from Installation walkthrough" }. - Save.
You now have one record of kind intake. The Fleet-of-Files architecture
stores it in your tenant's own SQLite file, not a shared table.
2. Design the FSM
Open Workflows → New workflow. The FSM Designer opens as a React Flow canvas.
- Add two states:
received(initial) andprocessed. Click Set initial on thereceivednode. - Drag a transition from
receivedtoprocessed. In the side panel, setevent_type = mark_processed. No guard needed for the first run. - Still on the transition's side panel, click Add action and
pick
PROMOTE_FORM_TO_ENTITY. Fill the payload template with{ "entity_name": "intake" }— when the operator fires this transition, the submission attached to the job will be copied into anintakeentity record. - Name the workflow
Intake Flowand bind it to theintakeentity (sidebar "Entity name" field) so entity annotations can light up the guard composer later. - Save.
You can publish additional versions later; the saved schema is
automatically marked is_active.
3. Build the form
Open Forms → New form:
- Name it
Intake, slugintake. - Drag in two text fields:
nameandnotes. Marknameas required. - Save. Click Publish once you're happy.
4. Wire the form to the FSM
Open the form's detail view, find the Submit actions panel, and
pick your Intake Flow schema from the Spawn job in schema
dropdown. Save.
Every accepted submission will now spawn a fresh Intake Flow job
in its initial_state with the submission linked to the new job
(processing_state = 'attached'). Submissions made before the
binding was set stay pending for manual triage.
5. Mint an invite token
From the form's detail page:
- Click Create invite.
- Pick an expiry (default 7 days) and an optional submission cap.
- Copy the URL — it looks like
/f/<token>.
Open the link in an incognito window. Fill the form. Submit. Head
back to /admin/jobs and you'll see a new Intake Flow job in
received.
6. Fire the transition and land an entity record
Click the new job on /admin/jobs, then click Mark processed.
Three things happen in one atomic step:
- The job advances from
receivedtoprocessed. - The
PROMOTE_FORM_TO_ENTITYaction copies the submission's payload into a newintakerecord onentity_records. - The submission's
processing_stateflips fromattachedtopromotedand itsentity_record_idpoints at the new record.
Open Entities, type intake, and click Load — the
submitter's values (name, notes) show up as a fresh row.
Discarded submissions don't land here; every entity record you see
came from a transition an operator explicitly fired, and the
append-only event_log carries the full audit trail.
What's next
- Forms Builder — multi-page forms, routing, attachments, custom themes.
- FSM Designer — guards, actions, action payload templates.
- Entities — annotations, the Page Designer, and entity-scoped pages.
Next
For the full guided arc — multi-page forms, PDF templates, signatures, branching, custom CSS — see the Forms tutorials.