Production-ready Flask SaaS template
Multi-tenant workspaces, subscription billing (Stripe or Chargebee), OAuth, and team collaboration out of the box. Build your product, not infrastructure.
readykit-demo.mp4
- Multi-tenant workspaces - Data isolation, scales from solo to teams
- Subscription billing - Stripe or Chargebee, hosted checkout, webhooks, customer portal
- OAuth authentication - Google & GitHub login
- Team collaboration - Roles (admin/member), member management
- Modern stack - Flask 3.1, Vue 3, Vuetify 3, PostgreSQL, Redis
- Production ready - Docker Compose, Celery background jobs
New OAuth accounts receive a workspace. Non-superadmins with one workspace skip the selection screen. Team, API key, and settings pages remain available according to the user's role. Superadmins manage workspaces from the dashboard.
# 1. Clone and setup
git clone git@github.com:level09/readykit.git
cd readykit
./setup.sh
# 2. Run
uv run python checks.py --config
uv run flask create-db
uv run flask install
uv run flask run
# 3. Optional: Stripe test billing (set STRIPE_SECRET_KEY=sk_test_... in .env first)
uv run flask stripe-setup # Creates the Pro price and local webhook secret
uv run flask stripe-listen # Forward test webhooks (separate terminal)Visit http://localhost:5050 and sign in with the admin credentials from flask install.
Google or GitHub login appears once its client ID and secret are set in .env.
Local setup uses SQLite for data and sessions; Redis is not required. Use
./setup.sh --full for Redis sessions and Celery, or select Docker during setup
for the full production stack. See the setup guide.
Cloud Platforms:
| Platform | Guide |
|---|---|
| Fly.io | Setup Guide |
| Railway | Setup Guide |
The platform guides cover PostgreSQL, Redis, and deployment workflows. Deployment workflows run manually unless you enable their push triggers. Check provider pricing for your chosen resources.
Docker Compose - Self-hosted:
./setup.sh # Select Docker; review .env before starting
docker compose up --buildIncludes PostgreSQL, Redis, Nginx, Celery.
VPS Deploy - One command for Ubuntu (Hetzner, DigitalOcean, etc.):
curl -sSL https://raw.githubusercontent.com/level09/ignite/main/ignite.sh | sudo DOMAIN=your-domain.com REPO=level09/readykit bashHandles Caddy (auto SSL), Python 3.13, Redis, systemd. See Ignite.
ReadyKit handles auth, billing, workspaces, and teams. You add your product features.
Example - workspace-scoped model:
from enferno.extensions import db
from flask import render_template
from enferno.services.workspace import WorkspaceScoped, require_workspace_access
class Invoice(db.Model, WorkspaceScoped):
id = db.Column(db.Integer, primary_key=True)
workspace_id = db.Column(db.Integer, db.ForeignKey("workspace.id"), nullable=False)
# your fields here
@app.get("/workspace/<int:workspace_id>/invoices/")
@require_workspace_access("member")
def invoices(workspace_id):
invoices = Invoice.for_current_workspace()
return render_template("invoices.html", invoices=invoices)The decorator checks membership; for_current_workspace() and get_by_id()
filter records to the selected workspace. Ordinary SQLAlchemy queries are not
automatically filtered. Use these helpers or an explicit workspace_id filter
for every query on workspace data. See the workspace guide.
Schema changes are managed with Alembic. Autogenerate drafts the migration; review and edit it before applying:
uv run flask db migrate -m "add invoice table" # Draft from model changes
# Review migrations/versions/<revision>.py
uv run flask db upgrade # Applycreate-db stamps fresh databases automatically. Databases created before
migrations existed need uv run flask db stamp head once.
Using Cursor, Claude Code, or GitHub Copilot? See docs/agents.md for patterns and conventions.
Questions and showcases belong in GitHub Discussions. Reproducible bugs and scoped work belong in GitHub Issues. See CONTRIBUTING.md and the roadmap before opening a pull request.
MIT - Build and sell products freely.