Furrow Forms

Frameworks & SSGs · works with Furrow Forms

Contact forms for SvelteKit sites

Forms that work under adapter-static — no +page.server.ts action required.

paste this into your agent

Fetch furrowforms.com/ai and set up a contact form backend for my SvelteKit site.

agent-readable recipe: /forms-for/sveltekit.md

prefer clicking? start in the dashboard

src/lib/ContactForm.svelte
<script>
  const loadedAt = Date.now();
  let sent = false;

  async function submit(e) {
    e.preventDefault();
    const res = await fetch('https://api.furrowforms.com/s/fp_k7m2', {
      method: 'POST',
      body: new FormData(e.target),
    });
    sent = (await res.json()).ok;
  }
</script>

{#if sent}
  <p>Thanks — we’ll be in touch.</p>
{:else}
  <form method="POST" action="https://api.furrowforms.com/s/fp_k7m2" on:submit={submit}>
    <input type="text" name="_gotcha" style="display:none" tabindex="-1" />
    <input type="hidden" name="_ft" value={loadedAt} />
    <input name="email" type="email" required />
    <textarea name="message" required></textarea>
    <button>Send</button>
  </form>
{/if}

The gap

Why SvelteKit sites need a form backend

SvelteKit’s form actions are elegant — and server-only. The moment you build with adapter-static (a marketing site, docs, a portfolio), there is no server to run them, and the usual answer becomes a third-party endpoint anyway. Furrow Forms is that endpoint done properly: POST from a plain form or a tiny submit handler, get JSON back, and let managed infrastructure handle spam, storage, notifications, and signed webhooks. On server-rendered deployments it still earns its keep — it is the mail delivery, spam stack, and retry logic you were about to write.

01

adapter-static can’t run form actions

Prerendered SvelteKit output is plain files. A Furrow-backed form keeps the site static and the form functional — no adapter change, no server bill.

02

Progressive enhancement, preserved

Start with a classic POST that redirects to your thank-you page; layer a fetch handler for inline success when JS is available. Both hit the same endpoint.

03

The backend chores are pre-done

Honeypot, Turnstile, domain allowlist, rate limits, email templates, webhook signing and retries — project-level settings, not code in your repo.

Two ways in

Set it up yourself, or don’t

Hand it to your agent

[ recommended ]

Furrow’s whole control plane is an API and MCP server. Paste this prompt into Claude Code, Cursor, or any agent — it does the rest:

paste this into your agent

Fetch furrowforms.com/ai and set up a contact form backend for my SvelteKit site.
  1. 1.Registers the account over POST /api/register — you read one 6-digit email code
  2. 2.Provisions the site: client, project, and forms in one idempotent bootstrap_site call
  3. 3.Pastes the generated snippet into your codebase
  4. 4.Fires test_webhook and verifies the signed delivery

Or do it by hand

  1. 01Create a free account and a project for the site.
  2. 02Add the component — no +page.server.ts, no adapter requirements.
  3. 03Configure domain, recipients, and thank-you URL once on the project.
  4. 04Prerender everything; the form still works.

free tier: 100 subs/mo · unlimited forms · full API + MCP · pricing →

FAQ

SvelteKit + Furrow Forms, answered

How do I add a contact form to a static SvelteKit site?

Point a plain form (or a fetch call) at a Furrow Forms endpoint. adapter-static output stays fully prerendered, and Furrow handles spam filtering, storage, notifications, and the thank-you redirect.

Can I still use SvelteKit form actions with Furrow?

You don’t need to — the browser can POST directly to Furrow. If you prefer routing through your own action on a server-rendered deployment, your action can forward the submission server-side; but for most sites the direct POST is simpler and works everywhere.

How does spam protection work without my own server?

It lives on Furrow’s side: honeypot field, optional Cloudflare Turnstile with project-level keys, a per-project domain allowlist, and per-IP rate limiting. Rejected submissions never reach your inbox or count toward quota.

The form backend your agent can run.

paste this into your agent

Fetch furrowforms.com/ai and set up forms for this site.

Setup for agents →