Skip to content

Shop management for decorators

The shop system for custom apparel decorators. Quote, art, and production for screen print and embroidery shops — one tenant per shop, one catalog for everyone.

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.