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.
Git-based CMS · works with Furrow Forms
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
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
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.
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.
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.
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
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.free tier: 100 subs/mo · unlimited forms · full API + MCP · pricing →
FAQ
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.
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.
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.
paste this into your agent
Fetch furrowforms.com/ai and set up forms for this site.