Furrow Forms

Git-based CMS · works with Furrow Forms

Contact forms for TinaCMS sites

Visual editing on Markdown — with a real backend behind the contact form.

paste this into your agent

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

agent-readable recipe: /forms-for/tina-cms.md

prefer clicking? start in the dashboard

components/ContactForm.tsx
export function ContactForm() {
  const loadedAt = Date.now();
  return (
    <form action="https://api.furrowforms.com/s/fp_k7m2" method="POST">
      <input type="text" name="_gotcha" style={{ display: 'none' }} tabIndex={-1} />
      <input type="hidden" name="_ft" value={loadedAt} />
      <input name="name" type="text" required />
      <input name="email" type="email" required />
      <textarea name="message" required />
      <button>Send</button>
    </form>
  );
}

The gap

Why TinaCMS sites need a form backend

TinaCMS gives you visual, in-context editing on top of Markdown in your own repo — content stays in git, and the site typically ships static or statically-generated from Next.js or Astro. Contact form submissions are the one kind of data that model can’t hold: they arrive continuously, from strangers, and mostly from bots. Furrow Forms handles that stream the way git handles your content — reliably and out of your way: one endpoint per form, spam filtered before it counts, notifications and signed webhooks delivered.

01

Submissions aren’t content

Content is deliberate and versioned; submissions are a firehose of strangers and spam. They need storage, filtering, and routing — a backend concern Tina rightly doesn’t touch. Furrow is that backend.

02

Static output, live forms

Tina sites usually build to static pages. A plain form action pointed at Furrow keeps the deploy static while the form works everywhere — classic POSTs redirect, fetch() gets JSON.

03

Two config surfaces, both in code

Tina’s schema lives in your repo; Furrow’s form config lives behind an API your tooling — or your AI agent — can drive. Both fit the same code-first workflow, no dashboards required.

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 TinaCMS 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 form component to your layout or page — Tina’s editing experience is unaffected.
  3. 03Configure domain, recipients, and thank-you redirect once at the project level.
  4. 04Optionally wire the signed webhook into your own pipeline; deliveries retry with backoff.

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

FAQ

TinaCMS + Furrow Forms, answered

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

Add a form component to your Next.js or Astro frontend that POSTs to a Furrow Forms endpoint. Content editing stays in Tina and git; submissions are stored, filtered, and delivered by Furrow.

Can form submissions be committed to my repo like content?

You wouldn’t want them to be — most raw form traffic is spam, and a commit per submission would bury your history. Furrow stores submissions with configurable retention and can deliver verified ones to any endpoint you run via signed, retried webhooks.

Does the form work in Tina’s visual preview?

The form renders like any component in your site, so it appears in previews normally. Submissions only count when they pass the spam stack from an allowed domain, so preview environments can be excluded via the project’s domain allowlist.

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 →