Form submissions
for static sites.

Self-hosted · One binary · No SaaS


// how it works
01
Deploy DSForms
on your server with Docker Compose
02
Create a form
in the admin UI and get your endpoint URL
03
Paste the snippet
into your HTML and you're done
// drop this in your html
contact.html
<form action="https://your-server.com/f/YOUR_FORM_ID" method="POST">
  <input type="hidden" name="_redirect" value="https://yoursite.com/thanks">
  <input type="text"   name="name"    placeholder="Your name"    required>
  <input type="email"  name="email"   placeholder="Your email"   required>
  <textarea            name="message" placeholder="Your message" required></textarea>
  <button type="submit">Send</button>
</form>
FieldPurpose
_redirectWhere to send the user after submission
_subjectCustom email subject line
_honeypotHidden spam trap — bots fill it, humans don't
// what you get
Email notifications on every submission
Webhook notifications (Slack, Discord, JSON)
Submissions stored in SQLite
Simple admin UI to view & manage
CSV export
Honeypot + rate limiting built in
Single Docker Compose deploy
Open source — MIT license
No per-submission fees, ever

// webhook notifications

Get notified on every submission — in your Slack workspace, Discord server, or any HTTP endpoint. Configure per-form in the admin UI. Email remains optional.

Slack
Block Kit layout. Short fields appear side-by-side; long fields get their own row. Drop in your Incoming Webhook URL and done.
Discord
Rich embed with inline fields. Short values are inline (up to 3 per row); long values span the full width. Username set to "DSForms".
Generic JSON
Flat JSON payload for Zapier, n8n, Make, or any custom endpoint. Includes form name, form ID, timestamp, and all submitted fields.
generic payload
{
  "form_name":    "Contact",
  "form_id":      "abc123",
  "submitted_at": "2026-03-26T14:30:00Z",
  "fields": {
    "name":    "Jane",
    "email":   "jane@example.com",
    "message": "Hello!"
  }
}

Webhooks fire in a background goroutine — never blocking the form response. A built-in "Test Webhook" button in the admin UI lets you verify your endpoint before going live.


// self-host in 5 min
# Clone and configure $ git clone https://github.com/barancezayirli/dsforms $ cd dsforms $ cp .env.example .env # Edit .env — set SECRET_KEY and SMTP credentials
# Start (with Mailpit for email testing) $ make dev-up # Or production (bring your own SMTP) $ make docker-up
# Open the admin UI $ open http://localhost:8080 # Default login: admin / admin

Requires Docker + Docker Compose. A $5 VPS is enough.