Landing page dan CMS untuk RantAI — dibangun dengan Next.js 16, Neon PostgreSQL, dan shadcn/ui.
- Framework: Next.js 16 (App Router)
- Database: Neon PostgreSQL + Drizzle ORM
- Auth: Custom JWT (jose) + bcrypt
- UI: shadcn/ui + Tailwind CSS v4
- Editor: Tiptap WYSIWYG
- Storage: Vercel Blob (thumbnail upload)
- Testing: Vitest
| Route | Keterangan |
|---|---|
/ |
Landing page |
/blog |
Daftar artikel |
/blog/[slug] |
Detail artikel |
/academy |
Library buku |
/team |
Halaman tim |
/admin |
CMS dashboard (protected) |
/admin/blog |
Kelola artikel |
/admin/books |
Kelola buku |
/admin/team |
Kelola anggota tim |
npm installBuat file .env.local:
DATABASE_URL= # Neon connection string
ADMIN_EMAIL= # Email login CMS
ADMIN_PASSWORD_HASH= # bcrypt hash dari password (lihat db:generate-hash)
JWT_SECRET= # Random string panjang untuk sign JWT
BLOB_READ_WRITE_TOKEN= # Vercel Blob tokenPenting: Escape semua
$dalamADMIN_PASSWORD_HASHdengan\$agar tidak di-expand oleh shell. Contoh:ADMIN_PASSWORD_HASH=\$2b\$12\$...
Generate password hash:
npm run db:generate-hash <password>npm run db:push # Push schema ke Neonnpm run devBuka http://localhost:3000.
| Script | Keterangan |
|---|---|
npm run dev |
Dev server |
npm run build |
Production build |
npm run lint |
ESLint |
npm test |
Run unit tests (vitest) |
npm run test:watch |
Watch mode |
npm run test:coverage |
Coverage report |
npm run db:push |
Sinkronisasi schema ke database |
npm run db:studio |
Drizzle Studio (GUI database) |
npm run db:generate-hash |
Generate bcrypt hash untuk password |
Unit test ada di __tests__/:
__tests__/
lib/
auth.test.ts # hashPassword, verifyPassword, createToken, verifyToken
utils.test.ts # cn() class merger
slug.test.ts # generateSlug()
npm testDeploy ke Vercel. Pastikan environment variables sudah di-set di Vercel project settings, termasuk DATABASE_URL dari Neon dan BLOB_READ_WRITE_TOKEN dari Vercel Blob.