Cloudsteading
Product image still needed. This listing has source documentation, but no reviewed screenshot yet.

FormHive

Collect HTML form submissions with a self-hosted API and dashboard

FormHive is a self-hosted Formspree/Getform alternative built on Cloudflare (D1, KV, Workers). Free tier eligible within limits. Inspect the source and license in the linked repository.

Source & license

Upstream license: MIT

License TL;DR

You can use it, change it, self-host it and sell it. Keep the original copyright and license notice with copies of the code. You don’t have to publish your changes. The authors don’t promise it will work.

Explain MIT in plain English →

Summary of the main license. Separate packages and assets can have different terms.

Inspect repository ↗Read this project’s actual license ↗

Repository owner

@kszongic

See the upstream repository for the original creator and contributors.

Maintain this project? Maintainer verification →

Cloudflare hosting

Free tier eligible within limits

Low-volume forms can fit Workers Free at 100,000 requests/day and 10ms CPU, D1 daily read/write/storage limits and KV allowances. Webhook recipients are optional external services; their own fees are outside this hosting estimate.

Hosting requirements
  • Replace resource IDs with your own D1/KV resources and apply the documented schema before deployment.
  • Keep D1 below 5M rows read/day, 100k rows written/day and 5GB total; KV reads/writes/storage and per-request CPU also limit free operation.
  • Source and configuration review establishes a deployment path and conditional costs; this candidate was not executed or load-tested.
Check current pricing ↗
Sources checked 01/10/2026

Repository snapshot: f2e9546. Hosting eligibility reflects the deployment documentation and listed assumptions.

  • formspree ↗

    **Open-source form backend as a service.** Collect form submissions from any website, view them in a beautiful dashboard, get webhook notifications, and block spam

  • getform ↗

    **Open-source form backend as a service.** Collect form submissions from any website, view them in a beautiful dashboard, get webhook notifications, and block spam

  • workers ↗

    name = "formhive" main = "src/worker.js" compatibility_date = "2024-09-01" [vars] CORS_ORIGIN = "*" RATE_LIMIT_PER_MINUTE = "30" [[d1_databases]] binding = "DB" database_name = "formhive-db" database_id = "placeholder-will-be-set-on-deploy" [[kv_namespaces]] binding = "KV" id = "placeholder-will-be-set-on-deploy" [site] bucket = "./dashboard/dist"

  • d1 ↗

    ormhive" main = "src/worker.js" compatibility_date = "2024-09-01" [vars] CORS_ORIGIN = "*" RATE_LIMIT_PER_MINUTE = "30" [[d1_databases]] binding = "DB" database_name = "formhive-db" database_id = "placeholder-will-be-set-on-deploy" [[kv_namespaces]] binding = "KV" id = "placeholder-will-be-set-on-deploy" [site] bucket = "./dashboard/dist"

  • kv ↗

    = "30" [[d1_databases]] binding = "DB" database_name = "formhive-db" database_id = "placeholder-will-be-set-on-deploy" [[kv_namespaces]] binding = "KV" id = "placeholder-will-be-set-on-deploy" [site] bucket = "./dashboard/dist"

  • free-tier-eligible ↗

    name = "formhive" main = "src/worker.js" compatibility_date = "2024-09-01" [vars] CORS_ORIGIN = "*" RATE_LIMIT_PER_MINUTE = "30" [[d1_databases]] binding = "DB" database_name = "formhive-db" database_id = "placeholder-will-be-set-on-deploy" [[kv_namespaces]] binding = "KV" id = "placeholder-will-be-set-on-deploy" [site] bucket = "./dashboard/dist"

  • free-tier-eligible ↗

    | **Free** | 100,000 per day | No charge for duration | 10 milliseconds of CPU time per invocation |

  • free-tier-eligible ↗

    | Rows read | 5 million / day | First 25 billion / month included + $0.001 / million rows |

  • free-tier-eligible ↗

    | Keys read | 100,000 / day | 10 million/month, + $0.50/million |

  • free-tier-eligible ↗

    | Rows written | 100,000 / day | First 50 million / month included + $1.00 / million rows |

  • free-tier-eligible ↗

    | Keys written | 1,000 / day | 1 million/month, + $5.00/million |

  • MIT ↗

    MIT License Copyright (c) 2026 kszongic Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION

  • architecture ↗

    name = "formhive" main = "src/worker.js" compatibility_date = "2024-09-01" [vars] CORS_ORIGIN = "*" RATE_LIMIT_PER_MINUTE = "30" [[d1_databases]] binding = "DB" database_name = "formhive-db" database_id = "placeholder-will-be-set-on-deploy" [[kv_namespaces]] binding = "KV" id = "placeholder-will-be-set-on-deploy" [site] bucket = "./dashboard/dist"

  • architecture ↗

    name = "formhive" main = "src/worker.js" compatibility_date = "2024-09-01" [vars] CORS_ORIGIN = "*" RATE_LIMIT_PER_MINUTE = "30" [[d1_databases]] binding = "DB" database_name = "formhive-db" database_id = "placeholder-will-be-set-on-deploy" [[kv_namespaces]] binding = "KV" id = "placeholder-will-be-set-on-deploy" [site] bucket = "./dashboard/dist"

  • architecture ↗

    ormhive" main = "src/worker.js" compatibility_date = "2024-09-01" [vars] CORS_ORIGIN = "*" RATE_LIMIT_PER_MINUTE = "30" [[d1_databases]] binding = "DB" database_name = "formhive-db" database_id = "placeholder-will-be-set-on-deploy" [[kv_namespaces]] binding = "KV" id = "placeholder-will-be-set-on-deploy" [site] bucket = "./dashboard/dist"

  • architecture ↗

    = "30" [[d1_databases]] binding = "DB" database_name = "formhive-db" database_id = "placeholder-will-be-set-on-deploy" [[kv_namespaces]] binding = "KV" id = "placeholder-will-be-set-on-deploy" [site] bucket = "./dashboard/dist"

What it can replace

Compare the workflow you need. These mappings describe overlap; full feature parity requires a separate comparison.

Formspree logoFormspree ↗

HTML form submission endpoints, stored submissions, API keys and optional webhook notifications; no enterprise spam-prevention or complete form-builder parity claim.

See supporting source ↗
Getform logoGetform ↗

HTML form submission endpoints, stored submissions, API keys and optional webhook notifications; no enterprise spam-prevention or complete form-builder parity claim.

See supporting source ↗
external SaaS target
varies
→ D1 + KV + Workers
external SaaS target
varies
→ D1 + KV + Workers

How it works

The shape of FormHive on Cloudflare, and how it stacks up against the rented tools it replaces.

Architecture

Diagram of deployment declarations at the reviewed commit. Each app has its own entrypoint; declared resources do not prove runtime calls. Follow file and line sources below.

View upstream source ↗
Public interface
Configured entry points1
formhive
wrangler.toml
↓
App
formhive
entry
Cloudflare Workers
Entrypoint: src/worker.js
↓

Configuration and workflow sources

Reviewed commit f2e9546f2d94. Files were read as data; upstream applications and CI jobs were not executed.

Deployment configuration · 1 files
wrangler.toml ↗

Cloudflare Workers · compatibility 2024-09-01

formhive · default

Entrypoint: src/worker.js

  • DB → D1
  • KV → KV

Named environments are separate deployments. Bindings are shown only where declared. Configured routes are URL patterns, not verified application endpoints.

Runtime source · handlers, binding usage and workflow steps

Observed TypeScript/JavaScript declarations from Worker entrypoints and resolved relative imports. Calls and workflow steps may run conditionally; their listed order is not a proven end-to-end request flow. Router declarations may be mounted under a prefix or may not be registered. This shows code wiring, not a successful deployment or runtime test. Dynamic wiring, aliases and generated code may not resolve.

src/worker.js ↗
  • L256 · fetch handler exported · calls handleRequest, json
  • L12 · isSpam calls (conditional paths may differ): toLowerCase, JSON.stringify, spamPatterns.some, p.test
  • L26 · checkRateLimit calls (conditional paths may differ): env.KV.get, parseInt, env.KV.put, String
  • L35 · sendWebhook calls (conditional paths may differ): fetch, JSON.stringify
  • L46 · handleRequest calls (conditional paths may differ): request.headers.get, CORS_HEADERS, path.match, first, bind, env.DB.prepare, json, parseInt, checkRateLimit, ct.includes, request.json, request.formData, Object.fromEntries, fd.entries, isSpam, crypto.randomUUID, toISOString, run, JSON.stringify, sendWebhook
  • L248 · json calls (conditional paths may differ): JSON.stringify

Environment references: env.KV · env.CORS_ORIGIN · env.DB · env.RATE_LIMIT_PER_MINUTE · env.ASSETS

Build and deployment pipeline · 0 GitHub Actions workflows

Repository CI declarations, separate from runtime request processing. Job dependencies and conditions are shown as written; long commands are shortened with an ellipsis; a workflow file does not prove a recent successful run.

No GitHub Actions workflow was found in the collected tree. Deployment may be manual or configured elsewhere.

package.json ↗
  • deploy: wrangler deploy

Full upstream document by @kszongic · readme.md · snapshot f2e9546

🐝 FormHive

Open-source form backend as a service. Collect form submissions from any website, view them in a beautiful dashboard, get webhook notifications, and block spam — all running on Cloudflare's edge network.

A self-hostable alternative to Formspree, Getform, and Basin.

License Cloudflare Workers D1 Database


✨ Features

  • 🔗 Simple API — Point any HTML form or fetch() call at your endpoint
  • 📊 Dashboard — Beautiful dark-mode UI to view and manage submissions
  • 🛡️ Spam Filtering — Honeypot fields + pattern-based detection built in
  • 🔔 Webhooks — Get notified on every submission (Slack, Discord, Zapier, etc.)
  • ⚡ Edge-powered — Runs on Cloudflare Workers (fast globally, free tier friendly)
  • 🗄️ D1 Database — Submissions stored in Cloudflare's serverless SQL
  • 🔑 API Key Auth — Secure dashboard access with bearer tokens
  • 📱 Responsive — Dashboard works on mobile
  • 🚀 One-click deploy — Set up in under 5 minutes
  • 💸 Free tier — Cloudflare's free tier covers most use cases

🚀 Quick Start

1. Clone & Setup

git clone https://github.com/kszongic/formhive.git
cd formhive
npm install -g wrangler
wrangler login

2. Create D1 Database & KV Namespace

wrangler d1 create formhive-db
wrangler kv:namespace create FORMHIVE_KV

Update the IDs in wrangler.toml with the output values.

3. Initialize Database

wrangler d1 execute formhive-db --file=schema.sql

4. Deploy

wrangler deploy

5. Setup Admin Account

curl -X POST https://your-worker.workers.dev/api/setup \
  -H "Content-Type: application/json" \
  -d '{"name": "Admin"}'

Save the returned API key! You'll need it for the dashboard.

6. Open Dashboard

Visit https://your-worker.workers.dev and enter your API key.


📝 Usage

HTML Form

<form action="https://your-worker.workers.dev/f/YOUR_FORM_ID" method="POST">
  <input type="text" name="name" placeholder="Name" required>
  <input type="email" name="email" placeholder="Email" required>
  <textarea name="message" placeholder="Message"></textarea>
  
  <!-- Honeypot spam trap (hidden from users) -->
  <input type="text" name="_honeypot" style="display:none">
  
  <button type="submit">Send</button>
</form>

JavaScript (fetch)

const response = await fetch('https://your-worker.workers.dev/f/YOUR_FORM_ID', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    name: 'John Doe',
    email: 'john@example.com',
    message: 'Hello from my website!'
  })
});

const result = await response.json();
// { ok: true, id: "submission-uuid" }

Special Fields

Field Purpose
_honeypot, _gotcha, _hp Spam honeypot (bots fill these, humans don't)
_redirect Override redirect URL for this submission

🔌 API Reference

All dashboard API calls require Authorization: Bearer YOUR_API_KEY header.

Method Endpoint Description
POST /api/setup First-time admin setup (no auth)
POST /f/:formId Submit a form (public, no auth)
GET /api/stats Dashboard statistics
GET /api/forms List all forms
POST /api/forms Create a new form
GET /api/forms/:id Get form details
DELETE /api/forms/:id Delete form + submissions
GET /api/forms/:id/submissions List submissions (paginated)
DELETE /api/submissions/:id Delete a submission

Create Form

curl -X POST https://your-worker.workers.dev/api/forms \
  -H "Authorization: Bearer fh_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Contact Form",
    "webhook_url": "https://hooks.slack.com/xxx",
    "redirect_url": "https://mysite.com/thanks"
  }'

🏗️ Architecture

┌──────────────┐     ┌──────────────────────┐     ┌──────────┐
│  HTML Form   │────▶│  Cloudflare Worker    │────▶│  D1 (SQL)│
│  or fetch()  │     │  - Spam filtering     │     └──────────┘
└──────────────┘     │  - Rate limiting (KV) │     ┌──────────┐
                     │  - Webhook dispatch   │────▶│  Webhook  │
┌──────────────┐     │  - Dashboard API      │     └──────────┘
│  Dashboard   │◀───▶│  - Static site serve  │
│  (SPA)       │     └──────────────────────┘
└──────────────┘

📄 License

MIT — use it however you want.


Built with ☕ and Cloudflare Workers.

Frequently asked about FormHive

What is FormHive?+

FormHive is a self-hosted Formspree/Getform alternative built on the Cloudflare developer platform. Collect HTML form submissions with a self-hosted API and dashboard

What does FormHive replace?+

FormHive is listed as an alternative to Formspree, Getform. Compare the features and tradeoffs before migrating.

What Cloudflare primitives does FormHive use?+

FormHive is built on D1, KV, Workers.

How much does FormHive cost to run?+

Low-volume forms can fit Workers Free at 100,000 requests/day and 10ms CPU, D1 daily read/write/storage limits and KV allowances. Webhook recipients are optional external services; their own fees are outside this hosting estimate. Replace resource IDs with your own D1/KV resources and apply the documented schema before deployment. Keep D1 below 5M rows read/day, 100k rows written/day and 5GB total; KV reads/writes/storage and per-request CPU also limit free operation. Source and configuration review establishes a deployment path and conditional costs; this candidate was not executed or load-tested. Check current Cloudflare pricing before deploying.

Is FormHive open source?+

The upstream repository declares the MIT license. Read its terms at https://raw.githubusercontent.com/kszongic/formhive/f2e9546f2d94caee572803f46bf00dc0bc00746d/license. Source code and contributor credit are available at https://github.com/kszongic/formhive.

Discussion · 0

sign in to comment →
No comments yet — be the first.