Open source, MIT licensed · rohansx/lobby

Your waitlist.On your server.

Lobby gives every product you launch a signup form, double opt-in, a place in line, referral links that move people up and invite waves. One binary and one SQLite file, with no monthly bill.

$ docker run -p 8080:8080 -v lobby:/data ghcr.io/rohansx/lobby
One real signup, start to finish · 19s
14 MBsingle binary
~20 MBmemory at idle
<2 KBembed widget, gzipped
1 fileSQLite holds everything
$0per month, per list
Features

Everything a launch needs. Nothing you pay for monthly.

The parts hosted waitlist tools charge extra for are built in: referrals, invite waves, webhooks, broadcasts, and one dashboard for all your products.

One dashboard for every product

Signups per day, confirm rate, top sources and top referrers. Run the waitlists for all your side projects from one install.

Lobby dashboard overview

Referrals that move people up

Every friend who confirms moves the referrer up the line, or keep a strict first-come order.

Credit lands only after the friend confirms, capped per IP address and per hour, so a script can't farm it.

+10places per referral, configurable

Spam handled, no CAPTCHA

A honeypot field, timing checks, rate limits, a disposable-domain list and MX lookups keep bots out without annoying people.

Invite in waves

Click Invite next 50. The front of the line gets a magic link and a code bound to their address. Your app redeems it with one API call.

Know the moment it happens

An email to you for every new signup, with where they came from and who referred them. Signed webhooks and a Slack preset for the rest.

Emails that land, and look right

Confirmation, status, invite and launch emails through Resend or any SMTP server, with one-click unsubscribe and bounce suppression.

Confirmation email

Private by default

IP addresses are kept only as keyed hashes and cleared after 30 days. Public pages set no cookies. Export to CSV or NDJSON any time.

Signups list
How it works

From first visit to first invite.

Sign up

From your widget, a plain HTML form or the hosted page. Gmail dots and +tags fold together, so nobody signs up twice.

Confirm

The confirmation link opens their status page: their place in line, how many are behind them, and a link to share.

Refer

Friends who join and confirm through that link move the referrer up. Your dashboard shows who's driving growth.

Invite

Send invites in waves from the front of the line, then a launch broadcast to everyone when you go live.

For your signups

A status page worth sharing

Every confirmed signup gets a page showing where they stand and a referral link to copy. It's server-rendered, needs no JavaScript and sets no cookies.

  • Place in line and how many people are behind
  • One-click copy, plus share to X, LinkedIn or email
  • No account or login needed to view it
Status page with place in line and referral link
For you

Every number that matters, in light or dark

See where signups come from, who refers the most and how many confirmed. Invite, export, broadcast and manage webhooks from the same place.

Lobby dashboard
Embed

Drop it into any site. One line.

Every project gives you three ways in, and the dashboard shows each snippet with your keys already filled in.

The widget embedded on a product landing page
index.html
<div id="waitlist"></div>
<script defer
  src="https://wait.example.com/v1/wl.js"
  data-project="pk_…"
  data-target="#waitlist"
  data-counter></script>

<!-- Theme it with CSS variables -->
<style>
  #waitlist {
    --wl-accent: #2f6fd6;
    --wl-radius: 999px;
  }
</style>
Why self-host

Your launch list is your most valuable list.

It's the people who asked to hear from you before you existed. Keep it on your own server, under your own domain.

LobbyTypical hosted waitlist
PriceFree and MIT licensed. Runs on a $5 VPS next to your other appsA monthly plan, often priced per list or per signup
Where your list livesOne SQLite file on your server, with continuous S3 backup via LitestreamTheir database
Multiple productsUnlimited projects in one installOften one list per plan
Referrals and invitesIncluded, with fraud checksOften on higher tiers
Email senderYour domain, through Resend or any SMTP serverVaries, often their domain
LeavingCSV or NDJSON export, or copy the fileExport, if your plan includes it
Self-host

Running in under a minute.

Start the container, open it in a browser, create your admin account and your first project. Then paste a snippet onto your site.

Docker

Multi-arch (amd64 and arm64), with Litestream built in for backups.

docker run -d -p 8080:8080 \
  -v lobby-data:/data \
  -e LOBBY_BASE_URL=$URL \
  -e RESEND_API_KEY=re_… \
  ghcr.io/rohansx/lobby

Dokploy, Coolify, any VPS

Point your PaaS at the image or the repo, mount a volume at /data and set the public URL.

git clone \
  https://github.com/rohansx/lobby
cd lobby
LOBBY_BASE_URL=$URL \
  docker compose up -d

Drive it from the CLI

The binary is also a CLI, and every instance serves its API at /llms.txt for agents.

export LOBBY_URL=$URL
export LOBBY_KEY=sk_…
lobby stats
lobby invite --next 50
lobby export --format csv
FAQ

Questions, answered.

Something else? Open an issue.

Is it really free?

Yes. Lobby is MIT licensed with no paid tier, no signup limits and no phone-home. You pay for the server it runs on and for your email provider, and Resend's free tier is enough for a small launch.

What do I need to run it?

Anything that runs a Docker container: a small VPS, Dokploy, Coolify, Fly.io or Railway. It idles at about 20 MB of memory. Mount a volume at /data so your list survives restarts.

Can I run waitlists for several products?

Yes. Each project has its own form, keys, allowed origins, emails, referral rules and settings, and they all share one dashboard.

How do I stop people gaming referrals?

A referral only counts after the friend confirms their email, credits are capped per IP address and per hour, and addresses are normalized so Gmail dots and +tags can't create duplicates. Disposable domains are rejected.

What about backups?

Set LITESTREAM_REPLICA_URL to any S3-compatible bucket and the database is replicated continuously. On an empty volume Lobby restores from the replica automatically.

How do I let people in when I launch?

Click Invite next N in the dashboard or run lobby invite --next 50. Each person gets a magic link and a code. Your product calls POST /v1/invites/redeem, or you send a launch broadcast to everyone at once.

Open the doors on your terms.

One command, your own server, and a list that stays yours.