Open-source waitlist & launch platform — self-hosted, your own SMTP, zero lock-in.
Waitless lets you launch beautiful waitlist pages, collect signups, and manage subscribers — all from a single self-hosted binary. No third-party email lock-in, no monthly fees, no limits.
|
|
|
|
Dashboard Analytics · Subscriber Management · Public Waitlist Page
git clone https://github.com/waitlss/waitless
cd waitless
docker compose -f docker/docker-compose.yml up -dVisit http://localhost:8080 — the first account becomes the admin.
# Clone
git clone https://github.com/waitlss/waitless && cd waitless
# Configure
cp .env.example .env # Edit with your database settings
# Build & run (single binary!)
make build
./waitlessRequirements: Go 1.25+, Bun 1.2+, PostgreSQL 16+
make dev-backend # Terminal 1: Go server with hot reload
make dev-frontend # Terminal 2: Vite dev server → proxies to :8080| Variable | Description | Default |
|---|---|---|
DATABASE_URL |
PostgreSQL connection string | — |
PORT |
Server port | 8080 |
BASE_URL |
Public URL (for OAuth callbacks) | http://localhost:8080 |
ENCRYPTION_KEY |
32-byte key for encrypting tokens at rest | auto-generated |
Each project configures its own email from the dashboard.
| Provider | Type | Setup |
|---|---|---|
| Gmail | OAuth2 | One-click connect with Google account |
| Zoho Mail | OAuth2 | One-click connect (supports .in/.com/.eu) |
| Mailgun | SMTP | smtp.mailgun.org:587 |
| SendGrid | SMTP | smtp.sendgrid.net:587 |
| Amazon SES | SMTP | email-smtp.{region}.amazonaws.com:587 |
| Postmark | SMTP | smtp.postmarkapp.com:587 |
| Any SMTP | SMTP | Your own host & port |
# Gmail OAuth
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret
# Zoho OAuth
ZOHO_CLIENT_ID=your-zoho-client-id
ZOHO_CLIENT_SECRET=your-zoho-client-secret
ZOHO_DOMAIN=zoho.in # or zoho.com, zoho.euAll API endpoints use Bearer token or X-API-Key authentication.
# List subscribers
curl -H "X-API-Key: wl_your_key" \
https://your-domain.com/api/v1/projects/:id/subscribers
# Add subscriber
curl -X POST -H "X-API-Key: wl_your_key" \
-H "Content-Type: application/json" \
-d '{"email":"user@example.com","name":"User"}' \
https://your-domain.com/api/v1/projects/:id/subscribers📖 Full API docs: docs/rest-api-v1.md · docs/public-api.md
Drop this into any website to show a waitlist signup form:
<div id="waitless-widget"></div>
<script src="https://your-domain.com/widget.js"
data-project="your-project-slug">
</script>./waitless (single binary, ~17MB)
├── Go HTTP server (Chi)
│ ├── /api/auth/* → Auth (register, login, sessions)
│ ├── /api/dashboard/* → Dashboard API (authenticated)
│ ├── /api/admin/* → Admin API (role-gated)
│ ├── /api/v1/* → REST API (API key auth)
│ ├── /api/public/* → Public waitlist API
│ └── /api/oauth/* → OAuth2 callbacks (Gmail, Zoho)
└── Embedded React frontend (TanStack Router)
├── / → Landing page
├── /dashboard → Management UI
├── /docs → API documentation
└── /w/:slug → Public waitlist pages
Tech stack: Go · React 19 · TanStack Router · PostgreSQL · GORM · Recharts
make build
scp waitless .env user@server:/opt/waitless/
# On server
cd /opt/waitless && ./waitlessdocker compose -f docker/docker-compose.yml up -d[Unit]
Description=Waitless
After=postgresql.service
[Service]
WorkingDirectory=/opt/waitless
ExecStart=/opt/waitless/waitless
Restart=always
[Install]
WantedBy=multi-user.targetContributions welcome! See CONTRIBUTING.md.
- Fork the repo
- Create a branch (
git checkout -b feature/amazing) - Commit & push
- Open a Pull Request
MIT — see LICENSE
Built with ❤️ for the open-source community


