Tenant isolation by default
Every table carries tenant_id with row-level security. Tenant A can never read tenant B — and there's a test that proves it.
Tickets, a customer portal, a help centre, sprint planning, and the insights to show for it — built on the parts that are painful to retrofit later: row-level tenant isolation, stateless services, and domain events from the first commit.
Tickets and a customer portal, the sprint board your engineers already wanted, and the numbers to show for it — on an architecture that scales to many tenants without a rewrite.
Every table carries tenant_id with row-level security. Tenant A can never read tenant B — and there's a test that proves it.
Search, faceted filters, sorting, and pagination all run server-side — correct across pages and fast on large inboxes. Save your own views as filters over the queue, each a card with a live count.
A Tiptap composer with formatting, drag-and-drop images, and internal notes. A ⌘K command palette moves you anywhere in a keystroke.
Client companies get their own accounts — or consumers sign themselves up. They file tickets, follow the thread, and read the help centre, seeing nothing but their own.
Categories and articles with draft/published and internal/public states. Write once: staff see everything, the portal only ever sees what you made public.
A board, a backlog, a triage lane, and sprints with a real burndown graph. Every issue has its own page and comment thread. Link an issue to the tickets that asked for it, and close the loop when it ships.
Volume against resolution over any window, backlog and response times as trends, reopen and first-contact rates, and where the load sits — by agent, tag, priority, department, channel and status. Filter the whole page, and arrange the panels you care about.
Push a ticket to the tracker your engineers live in and keep one canonical status mapping. API credentials stay in the environment, never in a tenant record.
A chat assistant for your agents — and optionally for the portal — on Scaleway's serverless models. Off by default, pay-per-token, nothing to babysit.
The detail view puts the conversation on one side and everything you act on — status, priority, assignment, tags — on the other. An activity timeline threads customer messages, replies, and internal notes with the domain events behind them.
The invoice for March shows the wrong amount — it's double.
Agnes changed status to Open
Thanks Carl — confirmed the duplicate charge, refunding now.
These are the things you can't bolt on later. Slate treats them as non-negotiable, so growth is a scaling problem — not a rewrite.
tenant_id
Questions about the project, running it yourself, or anything else? Send a note and we'll come back to you.
Spin up the stack with Docker, seed a tenant, and open your first ticket. The guides walk you through the rest.