← Projects

Multi-tenant SaaS for websites

A FastAPI platform where each client has an isolated site, catalogue and admin panel, with regression tests making sure one tenant never sees another.

PythonFastAPIJinja2SQLiteDockerJWT
Status
In progress
Year
2026
Context
Own product
SSR
HTML ready, no JS required
Isolation
Covered by a regression test
Multi-tenant SaaS for websites

What it is

A platform where local businesses get their own website with what their line of work needs (catalogue, detail page, contact) and the owner edits it alone, without depending on a developer for every text change.

Architecture

  • Multi-tenant with per-client isolation, a database per tenant and JWT authentication.
  • Server-side rendering with Jinja2, packaged in Docker.
  • Themes by line of business, with features that can be switched on individually per client and a palette configurable through CSS custom properties, so the theme does not have to be duplicated per colour.

Technical decisions

SSR instead of a client-side application, on purpose. The customer of these sites is a local business, and what they want is to show up in search. A server returning complete HTML means the search engine does not depend on executing JavaScript to read the page. It is a product decision disguised as a technical one, and in this case it is worth more than any front-end sophistication.

Isolation between tenants is a test, not an intention. Multi-tenant fails silently: a data leak between clients breaks nothing, it just shows the wrong thing to the wrong person. That is why the isolation has its own regression test, which tries to reach one tenant’s data while authenticated as another and requires the response to be denied. It is the test I run first after any change to a query.

Themes through CSS custom properties. The alternative was one theme per client, which would multiply maintenance by N. With variables, the palette is data, not code.

Status

The item detail page is finished: a gallery with a lightbox in plain JavaScript, keyboard and touch navigation, structured data and a contact call to action. Under active development.