A beautiful, dead-simple waitlist page that deploys in seconds. One Docker command, zero configuration required.
- One command deploy - Works out of the box with sensible defaults
- Fully customizable - Configure everything via environment variables
- Multiple storage backends - JSON file, webhooks, SMTP notifications
- Modern UI - Clean, responsive design with dark/light themes
- Countdown timer - Optional launch countdown
- Tiny footprint - ~15MB Docker image
- Production ready - Rate limiting, input validation, health checks
docker run -p 3000:3000 ghcr.io/synapsr/waitlist-pageThat's it. Open http://localhost:3000
docker run -p 3000:3000 \
-e TITLE="My Awesome App" \
-e SUBTITLE="Join the revolution" \
-e PRIMARY_COLOR="#10b981" \
-e THEME="dark" \
-e COUNTDOWN_DATE="2024-12-31T00:00:00Z" \
-v ./data:/data \
ghcr.io/synapsr/waitlist-page| Variable | Default | Description |
|---|---|---|
TITLE |
Something awesome is coming |
Main heading |
SUBTITLE |
Be the first to know when we launch... |
Subheading |
LOGO_URL |
- | URL to your logo image |
PRIMARY_COLOR |
#6366f1 |
Brand color (hex) |
THEME |
light |
light or dark |
COUNTDOWN_DATE |
- | ISO 8601 date for countdown |
BUTTON_TEXT |
Join Waitlist |
Submit button text |
PLACEHOLDER |
Enter your email |
Input placeholder |
SUCCESS_MESSAGE |
You're on the list! |
Success message |
| Variable | Default | Description |
|---|---|---|
STORAGE_TYPE |
json |
json, webhook, smtp, or multi |
Emails are saved to a JSON file. Mount a volume to persist data:
docker run -p 3000:3000 -v ./data:/data ghcr.io/synapsr/waitlist-pageEmails are stored in /data/emails.json:
[
{
"email": "user@example.com",
"timestamp": "2024-01-15T10:30:00Z",
"ip": "192.168.1.1"
}
]Send emails to any HTTP endpoint (Zapier, Make, n8n, your API):
docker run -p 3000:3000 \
-e STORAGE_TYPE=webhook \
-e WEBHOOK_URL="https://hooks.zapier.com/hooks/catch/xxx/xxx/" \
-e WEBHOOK_SECRET="optional-secret" \
ghcr.io/synapsr/waitlist-pagePayload sent to your webhook:
{
"email": "user@example.com",
"timestamp": "2024-01-15T10:30:00Z",
"ip": "192.168.1.1",
"user_agent": "Mozilla/5.0..."
}If WEBHOOK_SECRET is set, requests include an X-Webhook-Signature header with HMAC-SHA256 signature.
Get an email notification for each signup (also saves to JSON):
docker run -p 3000:3000 \
-e STORAGE_TYPE=smtp \
-e SMTP_HOST=smtp.gmail.com \
-e SMTP_PORT=587 \
-e SMTP_USER=you@gmail.com \
-e SMTP_PASS=your-app-password \
-e SMTP_FROM=you@gmail.com \
-e SMTP_TO=you@gmail.com \
-v ./data:/data \
ghcr.io/synapsr/waitlist-pageCombine multiple backends:
docker run -p 3000:3000 \
-e STORAGE_TYPE=multi \
-e STORAGE_BACKENDS="json,webhook" \
-e WEBHOOK_URL="https://your-webhook.com" \
-v ./data:/data \
ghcr.io/synapsr/waitlist-pageAccess collected emails via API:
docker run -p 3000:3000 \
-e ADMIN_TOKEN="your-secret-token" \
-v ./data:/data \
ghcr.io/synapsr/waitlist-pagecurl -H "Authorization: Bearer your-secret-token" http://localhost:3000/api/emailsservices:
waitlist:
image: ghcr.io/synapsr/waitlist-page:latest
ports:
- "3000:3000"
volumes:
- ./data:/data
environment:
- TITLE=My Product
- PRIMARY_COLOR=#10b981
- THEME=dark
restart: unless-stopped| Method | Path | Description |
|---|---|---|
GET |
/ |
Waitlist page |
POST |
/api/subscribe |
Submit email |
GET |
/api/health |
Health check |
GET |
/api/emails |
List emails (requires ADMIN_TOKEN) |
# Clone
git clone https://github.com/Synapsr/WaitList-Page.git
cd WaitList-Page
# Run with Docker
docker compose up --build
# Or with Go
go run .fly launch
fly secrets set TITLE="My App" PRIMARY_COLOR="#10b981"
fly deployCreate a new Web Service, connect your repo, and set environment variables in the dashboard.
- Email validation (format + length)
- Rate limiting (5 requests/minute per IP)
- XSS prevention (escaped outputs)
- Webhook signature verification (HMAC-SHA256)
- Non-root container user
MIT