Furrow Forms

Hosts & site builders · works with Furrow Forms

Contact forms for GitHub Pages

The purest static host finally gets a working contact form.

paste this into your agent

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

agent-readable recipe: /forms-for/github-pages.md

prefer clicking? start in the dashboard

index.html (or _includes/contact-form.html)
<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="" />
  <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>

The gap

Why GitHub Pages sites need a form backend

GitHub Pages is the purest static host there is: files in a repo, served as-is, no server-side anything — which is exactly why “github pages contact form” has been a stack-overflow evergreen for a decade. The answer hasn’t changed shape: you need an external endpoint. Furrow Forms is that endpoint with the modern conveniences attached — spam stack on by default, notification email with template tokens, a thank-you redirect, and a free tier that fits a personal or project site. Paste the form into your HTML or Jekyll template, push, done.

01

No server, no exceptions

Pages will never execute your form handler — not via plugins, not via Actions at request time. An external backend is the only architecture that works, so pick one built for it.

02

Public repo, public endpoint — safely

Furrow’s public keys are designed to be committed: protection comes from honeypot, optional Turnstile, your domain allowlist, and rate limits — not from hiding the URL.

03

Project sites deserve real notifications

Get an email when someone actually writes, not a mailbox of bot noise — rejected posts are dropped before storage and never count toward the free tier’s quota.

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 GitHub Pages 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. 02Paste the form into your HTML (or a Jekyll include) and commit.
  3. 03Set your username.github.io or custom domain on the allowlist, plus your notify email and thank-you URL.
  4. 04Push — Pages redeploys and the form is live.

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

FAQ

GitHub Pages + Furrow Forms, answered

How do I add a contact form to a GitHub Pages site?

GitHub Pages cannot run server code, so point a plain HTML form at a Furrow Forms endpoint. Furrow receives the POST, filters spam, stores the submission, emails you, and redirects the visitor to your thank-you page — the site itself stays static files in a repo.

Is it safe to put the form endpoint in a public repository?

Yes — the public key is meant to ship in client-side HTML. Abuse is handled by the spam stack and the per-project domain allowlist, which stops other sites from using your endpoint even though they can read it.

Does this cost anything for a personal site?

Furrow’s free tier — 100 submissions a month with unlimited forms and the full API — comfortably covers a personal or project site, and spam never counts toward it.

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 →