FAQ
Common questions about Creator.
Can I use a different database?
Creator uses PostgreSQL with Drizzle ORM. The database client in lib/db/index.ts uses postgres.js with prepare: false for compatibility with transaction pool mode (common with hosted databases like Supabase and Neon). Switching to another PostgreSQL host is just a DATABASE_URL change. Switching to a different database engine (MySQL, SQLite) would require updating the Drizzle dialect and schema.
Do I need both Stripe and Lemon Squeezy?
No. Set NEXT_PUBLIC_PAYMENT_GATEWAY to either "stripe" or "lemonsqueezy" and only configure the environment variables for the one you choose. The checkout and webhook routes are separate for each provider.
Do I need both Resend and Mailgun?
No. Set NEXT_PUBLIC_EMAIL_SERVICE to either "resend" or "mailgun". The email service uses a factory pattern — you only need to configure the provider you pick.
Can I use both R2 and Supabase Storage?
No. Set NEXT_PUBLIC_STORAGE_SERVICE to either "r2" or "supabase". Like the email service, storage uses a factory pattern that selects one provider at runtime.
How do I add a new shadcn/ui component?
Use the shadcn CLI:
npx shadcn@latest add buttonComponents are installed to components/ui/. The project uses the New York style with a neutral base color.
How does route protection work?
Creator uses proxy.ts (Next.js middleware renamed) to protect routes. Every route is protected by default — only routes listed in the publicRoutes array in config/public-routes.config.ts are accessible without authentication. Auth routes (login, signup, etc.) redirect authenticated users to the dashboard. Admin routes check for role === "admin". API routes use requireApiAuth() and requireApiAdmin() guards for additional server-side checks.
How do I change the default theme?
Edit config/app.config.ts and set siteSettings.theme to "light", "dark", or "system". The theme is applied via next-themes in the root layout.
Where are the colors defined?
All colors use the OKLCH color space and are defined as CSS custom properties in app/globals.css. Both light and dark mode values are defined there. The project uses Tailwind CSS v4's CSS-first configuration — there is no tailwind.config.ts file.
How do I add rate limiting to a new endpoint?
Import rateLimit from lib/rate-limit.ts and call it at the top of your route handler:
import { rateLimit } from "@/lib/rate-limit";
export async function POST(request: NextRequest) {
const limited = await rateLimit(request, "api");
if (limited) return limited;
// ... your handler logic
}Available tiers: "auth" (10/60s), "sensitive" (5/60s), "api" (60/60s).