Furrow Forms

Git-based CMS · works with Furrow Forms

Contact forms for Keystatic sites

Repo-native content, endpoint-backed forms — the whole stack stays in code.

paste this into your agent

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

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

prefer clicking? start in the dashboard

src/components/ContactForm.astro
---
const endpoint = 'https://api.furrowforms.com/s/fp_k7m2';
---
<form action={endpoint} method="POST">
  <input type="text" name="_gotcha" style="display:none" tabindex="-1" />
  <input type="hidden" name="_ft" value="" />
  <script is:inline>document.currentScript.previousElementSibling.value = Date.now();</script>
  <input name="name" type="text" required />
  <input name="email" type="email" required />
  <textarea name="message" required></textarea>
  <button>Send</button>
</form>

The gap

Why Keystatic sites need a form backend

Keystatic is the git-based CMS for people who want everything in the codebase: schema in TypeScript, content in Markdown and JSON, editing in a local or hosted admin UI, all committed to the same repo as your Astro or Next.js site. Furrow Forms is the matching answer for the one thing the repo can’t hold — form submissions. The form is markup in your components; the backend is one endpoint with spam filtering, storage, notifications, and signed webhooks; and the whole thing is provisionable from the command line or by an agent, in keeping with the workflow.

01

The repo can’t receive a POST

Keystatic sites deploy static or near-static. Furrow supplies the live endpoint so your architecture doesn’t grow a server just for the contact page.

02

Config-as-code deserves forms-as-code

You define collections in keystatic.config.ts; you can define forms just as declaratively through Furrow’s API or MCP — created idempotently by slug, so re-running setup never duplicates.

03

Spam handled above the framework

Honeypot, Turnstile, allowed domains, and rate limits live on the Furrow project — not as middleware you write. Astro and Next.js deployments get the same protection from the same config.

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 Keystatic 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. 02Drop the Astro (or Next.js) snippet into your components.
  3. 03Set domain, recipients, and thank-you URL once on the project.
  4. 04Commit — content and form markup version together; submissions flow through Furrow.

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

FAQ

Keystatic + Furrow Forms, answered

How do I add a contact form to a Keystatic site?

Add a form component to your Astro or Next.js code with its action pointed at a Furrow Forms endpoint. Keystatic keeps managing content in the repo; Furrow receives submissions, filters spam, and notifies you.

Can I set the form up without leaving my editor?

Yes. Furrow’s whole control plane is an API and MCP server: an agent (or a script) can register the account, create the project and form, and emit the snippet — the only human step is reading a 6-digit email verification code.

Does a static Keystatic deployment limit the form?

No — the classic HTML POST works with zero JavaScript and redirects to your thank-you page. If you prefer inline success states, submit via fetch() and read the JSON response instead.

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 →