Documentation
Browse and explore docs
Database Clients
The project exposes three pre-configured clients inside the lib/ folder. Import the right one depending on context.
| File | Export | Use In | Purpose |
|---|---|---|---|
| lib/supabase.ts | supabase | Client components | Auth operations, respects RLS |
| lib/supabase-server.ts | supabaseAdmin | API routes, server only | Privileged ops, bypasses RLS |
| lib/prisma.ts | prisma | API routes, server only | All database queries via ORM |
lib/supabase.ts — Client-side Supabase
Used in React components and client-side code for authentication operations (sign in, sign up, OAuth). Respects Row Level Security (RLS).
import { createClient } from '@supabase/supabase-js'
const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL
const supabaseKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY
export const supabase = createClient(supabaseUrl, supabaseKey)lib/supabase-server.ts — Server-side Admin Client
Used only in API routes and server components. Uses the service role key so it bypasses RLS. Never import this in client components.
import { createClient } from "@supabase/supabase-js";
export const supabaseAdmin = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.SUPABASE_SERVICE_ROLE_KEY!
);lib/prisma.ts — Prisma Client
Singleton Prisma client using the @prisma/adapter-pg adapter for connection pooling via DATABASE_URL (pgbouncer / Transaction mode). Use this for all database queries.
import { PrismaPg } from "@prisma/adapter-pg";
import { PrismaClient } from "./generated/prisma/client";
const globalForPrisma = globalThis as unknown as {
prisma: PrismaClient | undefined;
};
function createClient() {
const connectionString = process.env.DATABASE_URL!;
const adapter = new PrismaPg({ connectionString });
return new PrismaClient({ adapter, log: ["error"] });
}
export const prisma = globalForPrisma.prisma ?? createClient();
if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;