Next.js 15 starter template β production-ready dari hari pertama
Fitur Β· Quick Start Β· Struktur Β· Env Variables Β· Database Β· Deployment Β· Saran & Review
Boilerplate ini menyediakan fondasi generik yang solid, sehingga Anda bisa langsung fokus membangun fitur bisnis tanpa setup berulang.
- Login berbasis username (bukan email) via Supabase Auth β pola shadow email
{username}@lumina.internal - Login juga bisa menggunakan nomor HP format
08xxxx - 3 level role:
SUPER_ADMINβADMINβCLIENT - Edge Middleware β verifikasi JWT kriptografis di setiap request (tanpa DB query untuk route biasa)
- Route protection otomatis:
/admin/*β wajib login (min.ADMIN)/admin/settings,/admin/teamβ khususSUPER_ADMIN/auth/*β redirect ke dashboard jika sudah login
- Nama situs, logo, warna merek, favicon, OG image β dikontrol dari Admin Panel
- Tanpa rebuild atau redeploy β perubahan langsung tampil
- CSS variable
--branddisuntikkan ke:roottiap request dari nilai database <title>,<meta description>, Open Graph, dan Web App Manifest β semuanya dinamis dari DB
- Upload file ke Cloudflare R2 (S3-compatible, murah, cepat)
- Image proxy
/api/r2β mencegah pemblokiran ISP terhadap domainr2.dev - Kompresi otomatis gambar di browser sebelum upload (via
browser-image-compression)
- Installable di Android & iOS β tanpa Play Store / App Store
- Offline fallback page saat koneksi terputus
- Caching strategy per-route (CacheFirst untuk aset, NetworkOnly untuk admin)
- Manifest dinamis dari database (nama, warna, ikon)
/admin/dashboardβ Overview & statistik/admin/settingsβ Branding, SEO, PWA, tema (SUPER_ADMIN only)/admin/teamβ Manajemen akun tim (SUPER_ADMIN only)/admin/profileβ Edit profil user yang sedang login- Sidebar navigasi role-aware (menu disesuaikan dengan role)
- Playwright β sudah dikonfigurasi untuk desktop + mobile (iPhone 13 Pro, Pixel 7)
- Test dasar: auth flow, dashboard akses
- Mudah ditambah test case sesuai fitur baru
- Node.js v20+
- pnpm v9+
- Akun Supabase (gratis)
- Akun Cloudflare dengan R2 bucket (gratis 10GB/bulan)
- Supabase CLI (
npm i -g supabase)
# Klik "Use this template" di GitHub, atau clone langsung:
git clone https://github.com/USERNAME/boilerplate-nextjs-lumina.git nama-proyek-baru
cd nama-proyek-barupnpm installcp .env.example .env.localBuka .env.local dan isi semua variabel (lihat bagian Environment Variables di bawah).
# Link ke Supabase project Anda (hanya sekali)
supabase link --project-ref <project-id>
# Push schema ke Supabase project Anda
pnpm db:push
# Isi data awal (seed 1 akun SUPER_ADMIN + 1 ADMIN untuk testing)
pnpm db:seed
β οΈ Ganti password default (123456) disupabase/seed.tssebelum digunakan di production!
pnpm devBuka http://localhost:3000 β halaman landing boilerplate.
Login ke admin panel: http://localhost:3000/auth/login
Akun default (dari seed):
| Username | Password | Role |
|---|---|---|
ahink |
123456 |
SUPER_ADMIN |
admin |
123456 |
ADMIN |
boilerplate-nextjs-lumina/
βββ src/
β βββ app/
β β βββ admin/ # Semua halaman admin panel
β β β βββ dashboard/ # Halaman utama admin
β β β βββ settings/ # Branding & SEO (SUPER_ADMIN)
β β β βββ team/ # Manajemen tim (SUPER_ADMIN)
β β β βββ profile/ # Profil user
β β βββ api/
β β β βββ auth/ # Login & logout endpoint
β β β βββ admin/ # Settings & upload API
β β β βββ r2/ # Image proxy endpoint
β β βββ auth/ # Halaman login
β β βββ offline/ # Halaman fallback offline (PWA)
β β βββ layout.tsx # Root layout β dynamic SEO + brand injection
β β βββ manifest.ts # PWA manifest dinamis dari DB
β β βββ page.tsx # Landing page (ganti sesuai kebutuhan)
β β βββ sw.ts # Service Worker (Serwist v9)
β βββ components/
β β βββ admin/ # AdminSidebar, AdminHeader, dll
β β βββ auth/ # LoginForm
β β βββ ThemeProvider.tsx # Injeksi CSS variable brand dari DB
β βββ context/
β β βββ AuthContext.tsx # Client-side auth state (useAuth hook)
β βββ lib/
β β βββ supabase/ # Server & browser Supabase clients
β β βββ auth-helpers.ts # Helper cek session & role sisi server
β β βββ r2-proxy.ts # Helper konversi URL β proxy URL
β βββ styles/ # Global CSS & design tokens
β βββ middleware.ts # RBAC route guard (Edge Runtime)
βββ supabase/
β βββ migrations/ # SQL schema migrations
β βββ seed.ts # Seeder akun awal (SUPER_ADMIN & ADMIN)
βββ tests/ # E2E tests (Playwright)
βββ types/ # TypeScript global types
βββ .env.example # Template variabel lingkungan
βββ next.config.ts
βββ playwright.config.ts
βββ tailwind.config.ts
Salin .env.example ke .env.local dan isi semua nilai berikut:
# βββ Supabase βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
NEXT_PUBLIC_SUPABASE_URL=https://xxxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGc...
SUPABASE_SERVICE_ROLE_KEY=eyJhbGc... # β οΈ Jangan expose ke client!
# βββ Cloudflare R2 ββββββββββββββββββββββββββββββββββββββββββββββββββββ
R2_ACCOUNT_ID=xxxxxxxxxxxx
R2_ACCESS_KEY_ID=xxxxxxxxxxxx
R2_SECRET_ACCESS_KEY=xxxxxxxxxxxx
R2_BUCKET_NAME=nama-bucket-anda
NEXT_PUBLIC_R2_PUBLIC_URL=https://pub-xxxx.r2.dev
NEXT_PUBLIC_R2_HOSTNAME=pub-xxxx.r2.dev # Hostname saja, tanpa https://
# βββ App ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
NEXT_PUBLIC_SITE_URL=http://localhost:3000
β οΈ Jangan pernah commit.env.localβ file ini sudah ada di.gitignore.
# Cloudflare Images (untuk optimasi & watermark otomatis β opsional)
CLOUDFLARE_API_TOKEN=your_cloudflare_images_api_token
NEXT_PUBLIC_CLOUDFLARE_IMAGE_DELIVERY_URL=https://imagedelivery.net/your-hash
# Google AI / Gemini (untuk fitur AI description β opsional)
GEMINI_API_KEY=your_google_gemini_api_keySchema database menggunakan Supabase (PostgreSQL). Tabel yang tersedia di boilerplate ini:
| Tabel | Deskripsi |
|---|---|
profiles |
Data user (username, full_name, phone, role, avatar_url) |
web_settings |
Konfigurasi situs (nama, warna, logo, SEO, tema) |
pnpm db:push # Push schema ke Supabase (production/staging)
pnpm db:seed # Jalankan seed.ts saja (buat/perbarui akun awal)
pnpm db:reset:local # Reset + seed database lokal
pnpm db:reset:remote # Reset + seed database remote
pnpm db:types # Generate ulang TypeScript types dari schema SupabaseSemua tabel menggunakan RLS β data terlindungi di level database, bukan hanya di level API.
- Push repo ke GitHub
- Import di vercel.com/new
- Tambahkan semua environment variables dari
.env.example - Deploy β
Catatan: Vercel otomatis mendeteksi Next.js β tidak perlu konfigurasi tambahan.
pnpm test:e2e # Semua test E2E
pnpm test:e2e:mobile # Hanya mobile (iPhone 13 Pro + Pixel 7)
pnpm test:e2e:ui # Mode UI interaktif Playwright
pnpm test:e2e:debug # Mode debug step-by-stepSebelum menjalankan test, pastikan dev server sedang berjalan (pnpm dev).
Boilerplate ini dirancang mudah dikembangkan. Untuk menambah fitur:
- Buat tabel baru di Supabase (
supabase/migrations/) - Generate types ulang:
pnpm db:types - Buat API route di
src/app/api/nama-fitur/route.ts - Buat halaman admin di
src/app/admin/nama-fitur/page.tsx - Tambah menu di
src/components/admin/AdminSidebar.tsx
Auth, storage, PWA, dan branding tidak perlu disentuh. β
| Item | File | Aksi |
|---|---|---|
Nama package masih gallery-interactive |
package.json |
Ubah ke nama proyek baru |
Password seed masih default 123456 |
supabase/seed.ts |
Ganti sebelum deploy |
Username seed masih ahink & admin |
supabase/seed.ts |
Sesuaikan dengan tim Anda |
| Komentar sisa proyek asal | supabase/seed.ts (baris akhir) |
Hapus komentar UI yang tidak relevan |
.env.example masih menyebut "Lumina Gallery" |
.env.example (baris 2) |
Update deskripsi sesuai proyek |
Beberapa library sudah ada dan siap pakai β tidak perlu install ulang:
| Library | Kegunaan |
|---|---|
gsap |
Animasi halaman / transisi (dari proyek gallery) |
framer-motion |
Animasi deklaratif React |
lucide-react |
Icon set |
react-image-crop |
Crop avatar/gambar |
browser-image-compression |
Kompresi gambar sebelum upload |
sharp |
Optimasi gambar sisi server |
Jika tidak membutuhkan library tertentu, hapus dari
package.jsonuntuk mengurangi ukuran bundle.
User input: username "budi"
β
API /api/auth/resolve-login
β
Lookup: profiles WHERE username = 'budi' β email = 'budi@lumina.internal'
β
Supabase Auth login dengan email + password
β
Middleware cek JWT β ambil role dari DB β set x-user-id header
β
Redirect ke /admin/dashboard
SUPABASE_SERVICE_ROLE_KEYhanya boleh digunakan di server-side (API routes, seed). Jangan expose ke browser.- Middleware menggunakan
supabase.auth.getUser()(verifikasi JWT kriptografis), bukangetSession()(tidak aman untuk keputusan akses). - RLS aktif di semua tabel β bahkan jika ada bug di API, data tetap aman di level database.
MIT β bebas digunakan untuk proyek personal maupun komersial.
Dibuat dengan β€οΈ di atas Next.js 15 + Supabase + Cloudflare R2
Diekstrak dari proyek gallery-interactive sebagai boilerplate generik