Hugo has no runtime, on purpose
There is nowhere in a Hugo deployment to put form-handling code — and with an external endpoint, no reason to want one. The partial is the whole integration.
Frameworks & SSGs · works with Furrow Forms
A partial and an action attribute — the fastest SSG keeps shipping static.
paste this into your agent
Fetch furrowforms.com/ai and set up a contact form backend for my Hugo site.agent-readable recipe: /forms-for/hugo.md
prefer clicking? start in the dashboard
<form action="{{ .Site.Params.furrowEndpoint }}" method="POST">
<input type="text" name="_gotcha" style="display:none" tabindex="-1" />
<input type="hidden" name="_ft" value="" />
<script>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>
{{/* hugo.toml: [params] furrowEndpoint = "https://api.furrowforms.com/s/fp_k7m2" */}}The gap
Hugo builds thousand-page sites in the time other tools spend installing dependencies — and it ships exactly nothing that can process a form. That is by design: Hugo is a build tool, not a server. Furrow Forms is the standing server your Hugo site borrows: put an ordinary form in a partial, point the action at your endpoint, and submissions are stored, spam-filtered, and emailed while the visitor lands on your thank-you page. Your deploy remains rsync-able static files.
There is nowhere in a Hugo deployment to put form-handling code — and with an external endpoint, no reason to want one. The partial is the whole integration.
Keep the endpoint in your site params and reference it from the partial — one place to change, standard Hugo practice, no secrets involved since public keys are safe in HTML.
Honeypot, Cloudflare Turnstile, domain allowlisting, and per-IP rate limits — configured on the Furrow project, inherited by every form you add later.
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 Hugo site.free tier: 100 subs/mo · unlimited forms · full API + MCP · pricing →
FAQ
Add a plain HTML form in a partial with its action pointed at a Furrow Forms endpoint. Hugo keeps building pure static files; Furrow receives submissions, filters spam, emails you, and redirects visitors to your thank-you page.
Yes — the public key is not a secret and is designed to ship in client-side HTML. Abuse is controlled by the spam stack: honeypot, optional Turnstile, your domain allowlist, and per-IP rate limits.
A classic HTML POST gets a 303 redirect to the thank-you URL you configure on the project. If you add a little JavaScript and submit via fetch, you get JSON back for an inline success message instead.
paste this into your agent
Fetch furrowforms.com/ai and set up forms for this site.