Web App · version 1.0
Waiting Lists
A self-hosted waiting-list web app with an included command-line client. Run it from your terminal or let a coding agent create lists, connect forms, inspect subscribers, and export data through the private API.
The full source, tests, and documentation live in the public repository. MIT licensed. Issues and pull requests are off: fork it and make it yours.
Why I built this
A waiting list should be one of the smallest pieces of a product launch, but it often turns into a pile of forms, email tools, spreadsheets, consent questions, and glue code. I wanted one focused service that could collect an email safely, prove consent, and stay easy to operate.
Waiting Lists is the real, working result: a public collection endpoint, deliberate double opt-in, a private dashboard, export formats, delivery status, cleanup rules, and a private interface that AI agents can use without putting keys in a project repository.
From form to confirmed subscriber
The whole waiting-list lifecycle is already connected.
- Create a list in the dashboard or included CLI.
- Drop the generated form into any site.
- Confirm ownership through double opt-in.
- Review or export subscribers in the dashboard or terminal.
Features
Double opt-in
Keep new requests pending until the address owner reviews and confirms through a single-use 24-hour link.
Private dashboard
Create lists, inspect confirmed and pending subscribers, review delivery problems, and manage settings.
Drop-in forms
Post email and explicit consent from any approved website using generated HTML or JavaScript.
Included CLI and private API
Create, inspect, update, integrate, and export lists from a terminal or coding agent. The CLI source and its complete guide are in the repository.
Useful exports
Download consent archives, universal email files, and Sendy, Kit, or Mailchimp-ready CSVs.
Privacy-minded lifecycle
Minimize collected data, avoid storing IP addresses, support signed removal links, and clean up expired records.
Use cases
Product launches
Give each upcoming product its own endpoint, consent wording, origin rules, and export.
Client projects
Run one private service for several sites while keeping every list separately manageable.
Agent-built sites
Let a coding agent create the list and connect the form through a documented command-line contract.
Self-hosted lead capture
Own the source, deployment, subscriber database, retention policy, and email delivery path.
Email-provider staging
Collect and confirm interest before moving approved addresses into the newsletter system you prefer.
SaaS starting point
Add accounts, organizations, billing, or hosted onboarding to turn the single-owner tool into a service.
Tech stack
Application
Astro
Renders the public site, private dashboard, confirmation flow, and server endpoints.
Runtime
Cloudflare Workers
Runs HTTP requests, the Queue consumer, scheduled cleanup, and static asset delivery.
Persistence
D1
Stores lists, consent records, subscriber state, sessions, API keys, settings, and delivery events.
Transactional email
Email Service
Sends confirmation and removal links from a restricted sender binding.
Interaction
HTMX and Alpine.js
Add focused form and dashboard behavior without a separate client application.
Verification
Vitest
Covers authentication, tokens, API behavior, validation, exports, Turnstile, and email events.
Command line
Node.js CLI
Uses the private API to create, inspect, update, integrate, and export lists without putting credentials in a project repository.
CLI
The repository contains the CLI source, package scripts, the authenticated API it calls, and a dedicated CLI guide in the README. It runs directly from a clone. Nothing depends on a separately published CLI package.
npm run waitinglists -- initCreate a list and link it to the current project.
npm run waitinglists -- listsList waiting lists and confirmed subscriber counts.
npm run waitinglists -- integrationPrint the exact endpoint and form markup for a linked list.
npm run waitinglists -- exportSave a private CSV export with restricted file permissions.
Screenshots and demos




What’s included
- Waiting Lists version 1.0 with the complete CLI in code/cli/, its private JSON API, and a dedicated CLI guide
- Sanitized source snapshot with production resources, subscriber data, credentials, and analytics removed
- D1 migration history and Cloudflare Worker configuration with portable placeholders
- Public collection endpoint, confirmation and removal flows, private dashboard, API, and CLI
- Cloudflare Email Service, Queue delivery events, Turnstile, rate limits, and scheduled cleanup
- Automated unit tests and production build configuration
- A plain-language human quick start, versioned changelog, and dedicated AI-agent instructions
- Architecture, decisions, customization, configuration, security, deployment, and build guides
Documentation
The documentation lives in the repository, in one README: setup and usage, why I built it, how it was built, architecture, configuration, deployment, customization, security, the technical decisions, and the changelog. AGENTS.md gives coding agents the project context and operating rules.
Why use this
- Skip the consent, token, session, export, delivery, and cleanup groundwork
- Start with a complete working product instead of a signup-form demo
- Give an AI agent enough context to set it up or rewrite it safely
- Own the subscriber database and deployment decisions
- Keep the public integration tiny while the difficult lifecycle rules stay server-side
- Replace the framework or platform without starting from a blank repository
Customize it
Use the working source as a foundation. Keep it small, change it for your own workflow, or turn it into a different product.
- Grow it into the waitlist product you run for every launch—or white-label for agencies that need double opt-in done right.
- Rebrand pages, emails, and consent copy until it feels like part of the product you are announcing.
- Add teams, billing, webhooks, and newsletter sync when a single list turns into a small SaaS.
- Swap email and database providers behind the existing boundaries without rewriting the core flow.
- Port Astro to the stack your team already ships, keeping the product contract intact.
- Deploy on Workers today, or move to a VPS/container later when your traffic story changes.
MIT license
The repository includes an MIT LICENSE file. You can use, copy, change, publish, distribute, sublicense, or sell the code, including as part of a commercial product.
Keep the copyright and license notice with copies or substantial portions of the code. Third-party dependencies and assets keep their own licenses.
Keep learning
Solo Lab
Connect a self-hosted waiting list to the work of finding customers and launching your own products.