saas-maker CLI
uvx saas-maker new <name> scaffolds a configured multi-tenant SaaS from the
saas-maker template (FastAPI + SQLModel
- PostgreSQL backend, React 19 + Vite + shadcn/ui frontend, admin panel, Kamal
deploys).
saas-maker generate module <name>adds a tenant-scoped CRUD — table, API, page, sidebar entry and tests — to a generated project.
uvx saas-maker new my-saas # wizard → branding → .envs → uv/npm/createdb/migrate → git
uvx saas-maker new my-saas --defaults # non-interactive, placeholder deploy config
uvx saas-maker new my-saas --skip-provision
cd my-saas
uvx saas-maker generate module invoice \
--label Factura --label-plural Facturas --feminine \
--fields "number:str:Número,amount:money:Monto,kind:choice(sale=Venta|refund=Devolución):Tipo,notes:text?:Notas,due:date?:Vence" \
--status "draft=Borrador,sent=Enviada,paid=Pagada"
generate module
--fields "name:kind[?][:Label],…"— kindsstr text int float money bool date datetime choice(value=Label|…);?= optional. The first field must be a requiredstr: it is the title, the searchable column and the delete confirmation.money→Numeric(14, 2)+Decimal(ge=0, two decimals) on the backend, a JSON number in the API (app/schemas/money.py, created once per project), a decimal input and anIntl.NumberFormatcell on the frontend.choice(a=Label A|b=Label B)→Literalin the schemas (422 on anything else), a<Select>in the form, the label in the table (features/<plural>/choices.ts). Optional choices add a "Sin especificar" option.
--status "value=Label,…"— adds a status column, list filter and badge.--label / --label-plural / --feminine— Spanish UI copy ("Nueva factura").- Without
--fieldsthe command asks;--defaultsskips the questions.
What it writes (for invoice):
| Backend | Frontend |
|---|---|
app/models/invoice.py |
src/types/api.ts (Invoice types, at // generator:types) |
app/schemas/invoice.py |
src/hooks/useInvoices.ts |
app/services/invoice_service.py |
src/components/features/invoices/ (list, form, delete, badge) |
app/controllers/invoices.py |
src/pages/InvoicesPage.tsx + test |
alembic/versions/<rev>_add_invoices_table.py |
src/router/index.tsx, Sidebar.tsx (at the anchors) |
tests/test_invoices.py |
Every service function filters by organization_id; a row of another
organization answers 404. Read: any member. Write: admin or owner.
Generator anchors
generate module inserts code before these comment lines; projects generated
before they existed can add them by hand:
backend/app/main.py:# generator:tenant-routers(after the lastinclude_router)backend/app/models/__init__.py:# generator:models(inside__all__)frontend/src/router/index.tsx:// generator:route-imports,// generator:routesfrontend/src/components/layout/Sidebar.tsx:// generator:nav(insidenavItems)frontend/src/types/api.ts:// generator:types(end of file)
Development
uv sync && uv run pytest
uv run saas-maker new demo --defaults --skip-provision --source ~/path/to/saas-maker
Apache-2.0.
Release files for saas-maker 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| saas_maker-0.2.0.tar.gz | 69.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| saas_maker-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 127.5 kB
Release files / saas_maker-0.2.0.tar.gz
| Download URL | saas_maker-0.2.0.tar.gz |
|---|---|
| Size | 69.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e3450b8b796392fadf7b59b166f8bf8d19c99417ef61ddba82659eacad15eebd
|
|
BLAKE2b-256 checksum How to use checksums |
262ad25b055abeaa0bf1928880792087fc9cdbf5c156d550c17a932aa151134e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.
Transparency logRelease files / saas_maker-0.2.0-py3-none-any.whl
| Download URL | saas_maker-0.2.0-py3-none-any.whl |
|---|---|
| Size | 58.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cf308e19f1d93f284cd5b6588e02eef2cf0f25382420cd05670e13d8df869b30
|
|
BLAKE2b-256 checksum How to use checksums |
64a1240eeec86ea92294dac3c4c194394720bdd89227a81c8fccabab27a50f94
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.
Transparency log