Next.js och Supabase, där datalagret är produkten.
En monorepo där appen och bakgrundsjobben bara är användare av ett datalager. Där bor varje fråga och varje behörighetskontroll, med Postgres och deny-by-default-RLS som skydd under.
Använd den när
Du startar en SaaS på Postgres som behöver bakgrundsjobb, och vill ha behörigheten i serverkoden där den går att granska — inte utspridd i SQL-policys.
Kör du MongoDB i stället för Postgres? template-next-mongo i stället →Det här ingår
Färdigt från start.
Datalagret
@ketryon/db har båda Supabase-klienterna, alla DTO:er och varje fråga. Varje funktion tar en session, aldrig ett användar-id.
RLS som andra lås
Deny-by-default på varje tabell, med pgTAP-tester. Läsningar går under RLS, skrivningar genom datalagret.
Bakgrundsjobb
Trigger.dev-uppgifter i egna köer med gräns för samtidighet, och varje körning sparas i en job_run-tabell.
Exempel att bygga från
En order-funktion med sida, server actions, API-route och middleware som förnyar token.
Lint som vakt
ESLint stoppar appen från att importera Supabase-klienten eller jobbens privilegierade ingång.
Typer från databasen
pnpm db:types genererar typerna från schemat efter varje migrering.
Principerna
Reglerna den håller.
- 1
Index-filen exporterar ingen klient. En ny fråga läggs i datalagret, där den granskas.
- 2
Varje funktion i datalagret tar en session, aldrig ett användar-id.
- 3
getUser(), aldrig getSession(), för allt som rör säkerhet.
- 4
Middleware är för omdirigering, inte behörighet — anta att den kan förbigås.
- 5
Sidindelning med nyckel och ett tak. Ingen OFFSET.
- 6
Varje jobb sparar sitt utfall, eftersom leverantörens panel bara minns i några veckor.
Kom igång
pnpm install
cp .env.example apps/web/.env.local
cp .env.example packages/jobs/.env
pnpm db:start # local Supabase (needs Docker)
pnpm db:reset # migrations + seed
pnpm db:types
pnpm dev
pnpm jobs:dev # separate terminalStruktur
supabase/ migrations, seed, pgTAP RLS tests
packages/db/ @ketryon/db — Supabase clients, DTOs, every query
packages/jobs/ @ketryon/jobs — Trigger.dev tasks
apps/web/ Next.js 16 — calls the DAL, owns no database codeMiljövariabler
- NEXT_PUBLIC_SUPABASE_URL
- NEXT_PUBLIC_SUPABASE_ANON_KEY
- SUPABASE_SERVICE_ROLE_KEY
- TRIGGER_PROJECT_REF
- TRIGGER_SECRET_KEY
Kopiera .env.example till appen och till jobb-paketet. Servicenyckeln är bara för servern.
Bra att veta
- SQL-delen — migreringar, seed och pgTAP-testerna — har inte körts mot en riktig databas här. Kör pnpm db:start, db:reset, db:test och db:lint innan du litar på dem.
- Typkontroll och lint passerar med Next 16.4, React 19.3 och Zod 4.6.
Byggd med
- Next.js 16
- React 19
- Supabase
- Postgres
- Trigger.dev
- Zod 4
- Tailwind CSS 4
- pnpm workspaces
Fler mallar
template-next-mongo
MITNext.js och MongoDB, där ett delat datalager äger klienten, scheman, frågor och behörighet.
Next.js 16 · React 19 · MongoDB driver 7
Läs mer →template-monorepo
MITEn webbapp i Next.js, ett API i Express och bakgrundsjobb i Inngest som delar ett databasschema.
Next.js 15 · React 19 · Clerk
Läs mer →template-backend
MITEtt REST-API i Express och TypeScript med inloggning, Postgres, Redis och validering på plats.
Express 5 · TypeScript · Clerk
Läs mer →template-gateway
MITEtt lager i Next.js mellan dina appar och ett befintligt API, där API-nyckeln stannar på servern.
Next.js 15 · React 19 · TypeScript
Läs mer →template-react-native
MITEn app för iOS och Android i Expo med navigering, ljust och mörkt tema och en typad API-klient.
Expo SDK 54 · React Native 0.81 · React 19
Läs mer →
Låt oss bygga
nästa sak.
Du pratar med mig, inte med en säljare. Första samtalet är gratis.
— Kenny
psst, det tar 15 min
Skriver du svarar jag samma vardag.