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
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.
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.
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 ↗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 ↗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 ↗Configuration and workflow sources
Reviewed commit f2e9546f2d94. Files were read as data; upstream applications and CI jobs were not executed.
Deployment configuration · 1 files
Cloudflare Workers · compatibility 2024-09-01
formhive · default
Entrypoint: src/worker.js
DB→ D1KV→ 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.
- 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.
deploy: wrangler deploy
Repository README
View original on GitHub ↗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.
✨ 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 →