Ship SaaS in 1 day, not 3 weeks. FastAPI + SQLite auth, teams, and Stripe billing — one clone, one file.
Every SaaS re-builds auth + teams + billing for weeks. saas-starter gives it in 1 command.
pip install saas-starter# 1. Clone and run (single SQLite file, no Docker needed)
git clone https://github.com/thehypewipe/saas-starter.git
cd saas-starter
pip install -e .
uvicorn saas_starter.main:app --reload
# open http://127.0.0.1:8000/docs# 2. Try auth + teams
curl -X POST http://127.0.0.1:8000/auth/register -H "Content-Type: application/json" -d '{"email":"a@test.com","password":"secret123"}'
# -> {"access_token":"..."}
curl http://127.0.0.1:8000/me -H "Authorization: Bearer <token>"
curl -X POST http://127.0.0.1:8000/teams -H "Authorization: Bearer <token>" -H "Content-Type: application/json" -d '{"name":"My Team"}'- ✅ Auth — email/password, bcrypt hash, JWT (7-day),
/auth/register,/auth/login,/me - ✅ Teams / multi-tenancy — create team, owner membership, list my teams
- ✅ Billing stub —
/billing/webhookready for Stripe (swap secret, add real handler) - ✅ SQLite local-first — one
saas.dbfile, SQLAlchemy, no Postgres, no cloud - ✅ CORS + docs — auto Swagger at
/docs - ✅ Tests + CI-ready —
pytest -qwith mocked DB
| Method | Path | Description |
|---|---|---|
| GET | /health |
ok |
| POST | /auth/register |
register + token |
| POST | /auth/login |
login + token |
| GET | /me |
current user |
| POST | /teams |
create team |
| GET | /teams |
list my teams |
| POST | /billing/webhook |
Stripe webhook stub |
cp .env.example .env
# SECRET_KEY=change-me...
# DATABASE_URL=sqlite:///./saas.db
uvicorn saas_starter.main:app --reloadSee CONTRIBUTING.md. Add route in saas_starter/main.py + test in tests/.
MIT — see LICENSE
If saas-starter saved you a week, star it ⭐