3 min readNodedr Team

Submify: A Self-Hosted Form Backend You Actually Own

SubmifySelf-HostedFormsOpen Source

Introduction

Most "form backend" services follow the same pattern: you point your HTML form at their endpoint, and your submissions live on their servers. Submify is the same idea run in reverse — a self-hosted Form-Backend-as-a-Service you deploy on your own infrastructure, so every submission stays in a Postgres database you control. It's built by Nodedr Infotech Private Limited, open source under the MIT license, and the code is at github.com/Raktim94/Submify.

What it's made of

Submify is a Go (Gin) API, a Next.js dashboard, PostgreSQL for storage, and Nginx as the single entrypoint — all running as one Docker Compose stack. There's no third-party SaaS anywhere in the request path between a visitor submitting your form and you reading it.

One key, every site

Registering creates an account-level api_key and a default project with its own pk_live_... public key. That key is what goes in your form — no SDK, just a POST of JSON to /api/submit with the key in an x-api-key header:

curl -X POST https://your-host:2512/api/submit \
  -H "x-api-key: pk_live_..." \
  -H "Content-Type: application/json" \
  -d '{"name":"Jane","email":"jane@example.com","message":"Hi"}'

Any HTML form or fetch() call can hit that endpoint directly. If you run more than one project — multiple client sites, multiple forms — each gets its own public key, isolated from every other project in the same database.

Reading what comes in

The dashboard authenticates over /api/v1/... with a JWT (access + refresh token) session and gives you projects CRUD, a submission inbox, and bulk delete. Submissions export as XLSX or PDF directly from the dashboard — useful for handing a client a spreadsheet without giving them a login.

Two optional add-ons fire on submit: a Telegram notification if you've configured a bot, and presigned S3 uploads if a form includes a file — the browser uploads the file directly to your own S3-compatible bucket (AWS S3, Cloudflare R2, MinIO, Wasabi, anything compatible), and Submify only ever stores the resulting object key, never the file bytes.

Running it

curl -fsSL https://raw.githubusercontent.com/Raktim94/Submify/main/install.sh | bash

That one command clones the repo into ./Submify, generates strong random secrets on first boot, and brings up Postgres, the API, the dashboard, and Nginx. Open http://localhost:2512 and create the account at /register — each Submify instance supports exactly one account, and once it exists, /register redirects to /login and the API rejects any further registration attempts with a 403. Updating is git pull followed by docker compose up -d --build.

Full setup, environment variables, and the API reference are on the marketing site and in the GitHub README and API docs.

FAQ

Do I need a developer to integrate Submify with my site?

No SDK is required — any HTML form or a plain fetch() call can POST JSON straight to the /api/submit endpoint with your public key in a header.

Where do file uploads actually go?

Directly from the visitor's browser to your own S3-compatible bucket via a short-lived presigned URL. Submify's own database only stores the resulting object key, never the file itself.

Can multiple people log into one Submify instance?

Each instance supports exactly one dashboard account. To let a client see their own submissions without sharing that account, use the per-project client portal instead.

Is Submify free to self-host commercially?

Yes — it's MIT licensed, so you can deploy, modify, and use it commercially at no cost beyond your own hosting.

Share:

Planning a new website?

Let's talk about how a fast, SEO-ready Next.js site can help your business grow.

Start Your Project