SvelteKit on Bun
The only internet-facing process. Renders HTML, owns the session cookie, proxies to the API. It never opens a Postgres connection.
Platyn is a multi-tenant SaaS for custom apparel decorators — screen printers, embroiderers, and the shops that do both. It covers the path a job actually takes through one of these businesses:
a company calls → someone quotes them against a live blank catalog → art gets drawn, proofed and approved → the job goes to press.
Each shop is a tenant. Tenants share nothing except the blank goods catalog, which is
deliberately global: PC61 is the same Port & Company tee whether you are quoting it in Tulsa
or Tampa. What differs per shop is the negotiated cost on it, and that is the only part of the
catalog that is tenant-scoped.
Platyn is a modular monolith. Each domain below is a Rust crate with its own tables, its own invariants, and a narrow surface that the others call through.
The dashboard is not its own domain — it is a read-only projection across the others. Open jobs by stage, art waiting on approval, deals with no activity in a week, catalog syncs that failed overnight. It queries the same tenant-scoped tables everything else does, under the same row-level security.
SvelteKit on Bun
The only internet-facing process. Renders HTML, owns the session cookie, proxies to the API. It never opens a Postgres connection.
Rust API on Axum
All business logic, all data access, all authorization. Not internet-facing. Returns JSON and
nothing else — never HTML, never a Set-Cookie.
Postgres 17
Two schemas. app.* is tenant data under forced RLS, self-checked by app.rls_audit().
catalog.* is global and has no tenant_id column anywhere in it. Also the job queue.
Valkey
Cache only. Configured with no persistence on purpose, so nothing can grow to depend on it surviving a restart.