Skip to content

ahinx/RADAR

Repository files navigation

πŸ—οΈ Lumina Boilerplate

Next.js 15 starter template β€” production-ready dari hari pertama

Next.js 15 React 19 TypeScript Supabase Cloudflare R2 PWA Tailwind CSS v4

Fitur Β· Quick Start Β· Struktur Β· Env Variables Β· Database Β· Deployment Β· Saran & Review


✨ Fitur

Boilerplate ini menyediakan fondasi generik yang solid, sehingga Anda bisa langsung fokus membangun fitur bisnis tanpa setup berulang.

πŸ” Autentikasi & Otorisasi (RBAC)

  • 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 β€” khusus SUPER_ADMIN
    • /auth/* β€” redirect ke dashboard jika sudah login

🎨 Dynamic Branding & SEO

  • Nama situs, logo, warna merek, favicon, OG image β€” dikontrol dari Admin Panel
  • Tanpa rebuild atau redeploy β€” perubahan langsung tampil
  • CSS variable --brand disuntikkan ke :root tiap request dari nilai database
  • <title>, <meta description>, Open Graph, dan Web App Manifest β€” semuanya dinamis dari DB

☁️ File Storage β€” Cloudflare R2

  • Upload file ke Cloudflare R2 (S3-compatible, murah, cepat)
  • Image proxy /api/r2 β€” mencegah pemblokiran ISP terhadap domain r2.dev
  • Kompresi otomatis gambar di browser sebelum upload (via browser-image-compression)

πŸ“± Progressive Web App (PWA)

  • 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 Panel

  • /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)

πŸ§ͺ E2E Testing

  • Playwright β€” sudah dikonfigurasi untuk desktop + mobile (iPhone 13 Pro, Pixel 7)
  • Test dasar: auth flow, dashboard akses
  • Mudah ditambah test case sesuai fitur baru

⚑ Quick Start

Prasyarat

1. Gunakan template ini

# 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-baru

2. Install dependencies

pnpm install

3. Setup environment

cp .env.example .env.local

Buka .env.local dan isi semua variabel (lihat bagian Environment Variables di bawah).

4. Setup database

# 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) di supabase/seed.ts sebelum digunakan di production!

5. Jalankan development server

pnpm dev

Buka 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

πŸ—‚οΈ Struktur Folder

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

πŸ”‘ Environment Variables

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.

Variabel Opsional (dari proyek asal, bisa dihapus jika tidak pakai)

# 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_key

πŸ—„οΈ Database

Schema 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)

Perintah Database

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 Supabase

Row Level Security (RLS)

Semua tabel menggunakan RLS β€” data terlindungi di level database, bukan hanya di level API.


πŸš€ Deployment

Vercel (Direkomendasikan)

  1. Push repo ke GitHub
  2. Import di vercel.com/new
  3. Tambahkan semua environment variables dari .env.example
  4. Deploy βœ…

Catatan: Vercel otomatis mendeteksi Next.js β€” tidak perlu konfigurasi tambahan.


πŸ§ͺ Testing

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-step

Sebelum menjalankan test, pastikan dev server sedang berjalan (pnpm dev).


🧩 Menambah Fitur Baru

Boilerplate ini dirancang mudah dikembangkan. Untuk menambah fitur:

  1. Buat tabel baru di Supabase (supabase/migrations/)
  2. Generate types ulang: pnpm db:types
  3. Buat API route di src/app/api/nama-fitur/route.ts
  4. Buat halaman admin di src/app/admin/nama-fitur/page.tsx
  5. Tambah menu di src/components/admin/AdminSidebar.tsx

Auth, storage, PWA, dan branding tidak perlu disentuh. βœ…


πŸ’‘ Saran & Catatan untuk Pengguna Baru

⚠️ Yang Perlu Dibersihkan Sebelum Pakai

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

πŸ“¦ Dependencies yang Sudah Terinstall

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.json untuk mengurangi ukuran bundle.

πŸ—ΊοΈ Alur Autentikasi (Shadow Email Pattern)

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

πŸ”’ Catatan Keamanan

  • SUPABASE_SERVICE_ROLE_KEY hanya boleh digunakan di server-side (API routes, seed). Jangan expose ke browser.
  • Middleware menggunakan supabase.auth.getUser() (verifikasi JWT kriptografis), bukan getSession() (tidak aman untuk keputusan akses).
  • RLS aktif di semua tabel β€” bahkan jika ada bug di API, data tetap aman di level database.

πŸ“„ Lisensi

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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors