FormFlux

A FormSubmit-style backend, running on localhost.

This is the Phase 3 Worker UI: a live demo form plus the real pages people see after submit, verify, and errors. The API still returns JSON when you send Accept: application/json.

Email delivery hCaptcha + rate limits R2 uploads Webhooks Autoreply

Try a submission

This demo posts to a preview endpoint so you can see the thank-you page without Supabase credentials. Wire a real form to /f/:formId or /email/you@domain.com once .dev.vars is set.

Drop-in HTML

Every FormSubmit special field works here. The UUID endpoint (/f/:id) keeps your real address out of page source.

<form action="http://127.0.0.1:8787/f/YOUR_FORM_UUID"
      method="POST"
      enctype="multipart/form-data">
  <input name="name" required />
  <input name="email" type="email" required />
  <textarea name="message"></textarea>
  <input name="attachment" type="file" />

  <!-- spam trap: bots fill it, humans never see it -->
  <input type="text" name="_honey" style="display:none" />

  <!-- email shaping -->
  <input type="hidden" name="_subject" value="New lead" />
  <input type="hidden" name="_cc" value="team@example.com" />
  <input type="hidden" name="_replyto" value="ada@example.com" />
  <input type="hidden" name="_template" value="table" />

  <!-- per-submission overrides -->
  <input type="hidden" name="_next" value="https://example.com/thanks" />
  <input type="hidden" name="_blacklist" value="viagra, casino, free money" />
  <input type="hidden" name="_captcha" value="false" />
  <input type="hidden" name="_webhook" value="https://example.com/hook" />
  <input type="hidden" name="_autoresponse" value="Thanks {{name}}!" />

  <button>Send</button>
</form>

Special fields

Full reference, all live in this Worker.

_subjectEmail subject line
_ccComma-separated CC recipients
_replytoReply-To header
_templatetable or plain
_nextRedirect for this submission only
_blacklistPhrases that silently mark it spam (20 max)
_captchafalse skips hCaptcha once
_webhookExtra one-off webhook URL
_autoresponseCustom autoreply body
_honey / _honeypotBot trap; filled = dropped
_format=jsonAJAX mode; returns JSON