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. Configure (edit .env)
GOOGLE_OAUTH_CLIENT_ID=your_id
GOOGLE_OAUTH_CLIENT_SECRET=your_secret
# Billing: choose stripe (default) or chargebee
BILLING_PROVIDER=stripe
STRIPE_SECRET_KEY=sk_test_...
STRIPE_PRO_PRICE_ID=price_...
# 3. Run
uv run flask create-db
uv run flask install
uv run flask runVisit http://localhost:5000 and sign in with the admin credentials from flask install.
Google login is available after configuring OAuth.
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.