Furrow Forms

Frameworks & SSGs · works with Furrow Forms

Contact forms for Hugo sites

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

layouts/partials/contact-form.html
<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

Why Hugo sites need a form backend

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.

01

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.

02

Theme-friendly, config-light

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.

03

Serious spam handling for a static site

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

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 Hugo 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 partial and set furrowEndpoint in your site config.
  3. 03Configure domain, recipients, and thank-you URL once on the project.
  4. 04hugo && deploy — done.

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

FAQ

Hugo + Furrow Forms, answered

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

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.

Is the endpoint safe to commit to a public repo?

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.

What do visitors see after submitting?

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.

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 →