Cloudsteading
FormZero Dashboard

FormZero

Accept HTML or JSON form submissions and review them in a Cloudflare dashboard.

FormZero is a self-hosted Formspree/Getform alternative built on Cloudflare (D1, 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

@BohdanPetryshyn

See the upstream repository for the original creator and contributors.

Maintain this project? Maintainer verification →

Cloudflare hosting

Free tier eligible within limits

The documented FormZero deployment can use Cloudflare Free allowances for a small workload under the request, CPU and service-specific quotas below. This is conditional eligibility, not a measured zero-cost deployment; optional features, domains and external providers can add costs.

Hosting requirements
  • Workers Free allows 100,000 requests per day shared across the account and 10 ms CPU per invocation; measure CPU-heavy authentication, parsing and rendering before assuming it fits.
  • Keep aggregate D1 use below 5 million rows read/day, 100,000 rows written/day and 5 GB total storage; a request can touch many rows.
  • Use a small personal or team workload; domain registration and optional third-party providers are separate costs. Provision your own IDs, secrets and migrations.
Check current pricing ↗
Sources checked 01/10/2026

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

  • formspree ↗

    - **Save time** - Form backends are simple software; don't waste time building one for your static site - **No artificial limits** - Commercial services often restrict you to ~50 submissions/month with no data export - **Deploy in minutes** - As easy as signing up for a commercial service. Not a single line of code, not even YAML

  • getform ↗

    - **Save time** - Form backends are simple software; don't waste time building one for your static site - **No artificial limits** - Commercial services often restrict you to ~50 submissions/month with no data export - **Deploy in minutes** - As easy as signing up for a commercial service. Not a single line of code, not even YAML

  • workers ↗

    es/wrangler/config-schema.json", "name": "formzero", "compatibility_date": "2025-04-04", "compatibility_flags": [ "nodejs_compat" ], "main": "./workers/app.ts", "observability": { "enabled": true }, "d1_databases": [ { "binding": "DB", "database_name": "formzero", "database_id": "4a765081-eab0-424f-984b-e9b638a16de4", } ] }

  • d1 ↗

    flags": [ "nodejs_compat" ], "main": "./workers/app.ts", "observability": { "enabled": true }, "d1_databases": [ { "binding": "DB", "database_name": "formzero", "database_id": "4a765081-eab0-424f-984b-e9b638a16de4", } ] }

  • free-tier-eligible ↗

    es/wrangler/config-schema.json", "name": "formzero", "compatibility_date": "2025-04-04", "compatibility_flags": [ "nodejs_compat" ], "main": "./workers/app.ts", "observability": { "enabled": true }, "d1_databases": [ { "binding": "DB", "database_name": "formzero", "database_id": "4a765081-eab0-424f-984b-e9b638a16de4", } ] }

  • free-tier-eligible ↗

    flags": [ "nodejs_compat" ], "main": "./workers/app.ts", "observability": { "enabled": true }, "d1_databases": [ { "binding": "DB", "database_name": "formzero", "database_id": "4a765081-eab0-424f-984b-e9b638a16de4", } ] }

  • free-tier-eligible ↗

    up>1, 2, 3, 4</sup> | Duration | CPU time | | --- | --- | --- | --- | | **Free** | 100,000 per day | No charge for duration | 10 milliseconds of CPU time per invocation | | **Standard** | 10 million included per month <br> +$0.30 per additional million | No charge or limit for duration | 30 million CPU milliseconds included per month<br> +$0.02 per additional million CPU milliseconds<br><br> Max of [5 minutes of CPU time](https://developers.cloudflare.com/workers/platform/limits/#account-plan-limits) per invocation (default: 30 seconds)<br> Max of 15 minutes of CPU time per [Cron Trigger](https://developers.cloudflare.com/workers/configuration/cron-triggers/) or [Queue Consumer](https://developers.cloudflare.co

  • free-tier-eligible ↗

    oudflare.com/workers/platform/pricing/#workers) | | --- | --- | --- | | Rows read | 5 million / day | First 25 billion / month included + $0.001 / million rows | | Rows written | 100,000 / day | First 50 million / month included + $1.00 / million rows | | Storage (per GB stored) | 5 GB (total) | First 5 GB included + $0.75 / GB-mo | Track your D1 usage To accurately track your usage, use the [meta object](https://developers.cloudflare.com/d1/worker-api/return-object/), [GraphQL Analytics API](https://developers.cloudflare.com/d1/observability/metrics-analytics/#query-via-the-graphql-api), or the [Cloudflare dashboard ↗︎](https://dash.cloudflare.com/?to=/:account/workers/d1/). Select your D1 database, then vie

  • MIT ↗

    MIT License Copyright (c) 2022 Bohdan Petryshyn 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 NON

  • architecture ↗

    es/wrangler/config-schema.json", "name": "formzero", "compatibility_date": "2025-04-04", "compatibility_flags": [ "nodejs_compat" ], "main": "./workers/app.ts", "observability": { "enabled": true }, "d1_databases": [ { "binding": "DB", "database_name": "formzero", "database_id": "4a765081-eab0-424f-984b-e9b638a16de4", } ] }

  • architecture ↗

    flags": [ "nodejs_compat" ], "main": "./workers/app.ts", "observability": { "enabled": true }, "d1_databases": [ { "binding": "DB", "database_name": "formzero", "database_id": "4a765081-eab0-424f-984b-e9b638a16de4", } ] }

Upstream screenshot · BohdanPetryshyn/formzero repository contributors ↗. Depicts the upstream project. We have not deployed and tested a fresh installation here.

What it can replace

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

Getform logoGetform ↗

Receiving HTML/JSON form submissions, dashboard review and CSV export; hosted form-building and planned email/spam-defense features are excluded.

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

How it works

The shape of FormZero 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
formzero
wrangler.jsonc
↓
App
formzero
entry
Cloudflare Workers
Entrypoint: ./workers/app.ts
↓

Configuration and workflow sources

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

Deployment configuration · 1 files
wrangler.jsonc ↗

Cloudflare Workers · compatibility 2025-04-04

formzero · default

Entrypoint: ./workers/app.ts

  • DB → D1

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.

workers/app.ts ↗
  • L18 · fetch handler exported · calls requestHandler

Environment references: env.MODE

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 ↗
  • build: react-router build
  • migrate: yes Y | wrangler d1 migrations apply DB
  • deploy: npm run build && npm run migrate -- --remote && wrangler deploy

Full upstream document by @BohdanPetryshyn · README.md · snapshot a4ddde2

FormZero

A forever free, open-source form backend for static sites you can self-host on Cloudflare in one click

🔓 No paid features. 📀 Own your data. ⚡️ Start in 3 minutes

FormZero Dashboard

Perfect for contact forms, waitlists, surveys, newsletter signups, and more.

Why FormZero?

  • Save time - Form backends are simple software; don't waste time building one for your static site
  • No artificial limits - Commercial services often restrict you to ~50 submissions/month with no data export
  • Deploy in minutes - As easy as signing up for a commercial service. Not a single line of code, not even YAML

Use FormZero for your next big thing! ⭐ Give it a star to not forget.


Features

  • Submit HTML Forms - Add FormZero's endpoint to your form's action attribute
  • Submit JSON Data - Send payloads via fetch or XMLHttpRequest
  • Unlimited Forms - Create as many as you need
  • Unlimited Submissions - Receive thousands per hour
  • Analytics Dashboard - View submission trends and stats
  • Export CSV - Download all submissions in one click
  • Spam Protection - Proof of Work CAPTCHA and honeypot fields (coming soon)
  • Email Notifications - Add your Resend API key to receive notifications (coming soon)

Deploy in Seconds ⚡

Deploy to Cloudflare

Deploy your own serverless form backend in seconds - as easy as signing up for a commercial service:

  1. Click the Deploy to Cloudflare button above
  2. Log in to your free Cloudflare account or create one (no credit card required)
  3. Follow the prompts - your instance will be running in 3 minutes

Everything fits within Cloudflare's free tier - receive up to 100,000 submissions/day and store up to 4,000,000 submissions for free. Upgrade later for just $5 if needed.


How Deploy to Cloudflare Works

Here's what happens when you click the button:

  1. Cloudflare creates a copy of this repository in your GitHub or GitLab account
  2. You provide configuration options:
    • Project name (e.g. "formzero")
    • Database name (e.g. "formzero")
    • Auth secret (use jwtsecrets.com or openssl rand -hex 16 to generate one)
  3. Cloudflare builds and deploys FormZero to your account
  4. You get a unique URL (e.g. https://formzero.your-domain.workers.dev) to access your dashboard

Read the Cloudflare documentation for more details.


Update Your Deployment

New features are added regularly. To pull them in, redeploy with the Deploy to Cloudflare button and connect the new Worker to your existing database — your forms, submissions, and endpoint URLs are all preserved:

  1. In your Cloudflare dashboard, rename your existing Worker to <your-project-name>-backup — this frees the original name
  2. Delete the GitHub repository created by your previous deployment (it has the same name as the Worker)
  3. Click the Deploy to Cloudflare button above and use:
    • The same project name and database name as before
    • Your existing database when Cloudflare offers to connect to one
    • A new auth secret (generate one via jwtsecrets.com or openssl rand -hex 16)
  4. Once the new Worker is live and you have confirmed everything works, delete the backup

Websites submitting to your form endpoints keep working unchanged. You'll be signed out of the dashboard because of the new auth secret - sign back in with your existing credentials.


Tech Stack 🛠️


Contributing 🤝

Contributions are welcome - add features you need or fix bugs by opening an issue or submitting a pull request.


License

MIT

Frequently asked about FormZero

What is FormZero?+

FormZero is a self-hosted Formspree/Getform alternative built on the Cloudflare developer platform. Accept HTML or JSON form submissions and review them in a Cloudflare dashboard.

What does FormZero replace?+

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

What Cloudflare primitives does FormZero use?+

FormZero is built on D1, Workers.

How much does FormZero cost to run?+

The documented FormZero deployment can use Cloudflare Free allowances for a small workload under the request, CPU and service-specific quotas below. This is conditional eligibility, not a measured zero-cost deployment; optional features, domains and external providers can add costs. Workers Free allows 100,000 requests per day shared across the account and 10 ms CPU per invocation; measure CPU-heavy authentication, parsing and rendering before assuming it fits. Keep aggregate D1 use below 5 million rows read/day, 100,000 rows written/day and 5 GB total storage; a request can touch many rows. Use a small personal or team workload; domain registration and optional third-party providers are separate costs. Provision your own IDs, secrets and migrations. Check current Cloudflare pricing before deploying.

Is FormZero open source?+

The upstream repository declares the MIT license. Read its terms at https://raw.githubusercontent.com/BohdanPetryshyn/formzero/a4ddde255457d1e6ddf55b5f24b51809d18501f3/LICENSE. Source code and contributor credit are available at https://github.com/BohdanPetryshyn/formzero.

Discussion · 0

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