Template website kelas siap-pakai bergaya iOS + Pinterest: galeri masonry, blog, profil anggota, pesan anonim, dan dashboard admin lengkap yang bisa mengatur seluruh situs tanpa mengubah kode. Dibuat agar bisa langsung di-publish dan dipakai ulang (cukup ganti isi lewat dashboard).
- Stack: Next.js 16 (App Router) Β· TypeScript Β· Tailwind CSS Β· Supabase (Postgres + Storage)
- Auth owner/admin: username + password, sesi cookie ber-tanda-tangan (JWT/jose),
HttpOnly+Secure - Deploy: Vercel (rekomendasi) β SSR untuk SEO Google
# 1. Install dependency
npm install
# 2. Siapkan Supabase (buat project, jalankan schema, isi .env.local)
# Ikuti panduan lengkap: supabase/README.md
cp .env.local.example .env.local # lalu isi nilainya
# 3. Jalankan
npm run devBuka http://localhost:3000. Untuk masuk dashboard: http://localhost:3000/dashboard β karena belum ada owner, kamu otomatis diarahkan ke Setup Owner untuk membuat akun pertama (Nama, username, password). Setelah itu langsung masuk dashboard.
Setup database Supabase dijelaskan langkah demi langkah di supabase/README.md (buat project β ambil kunci β jalankan
supabase/schema.sqlβ isi.env.local).
Satu inti kuat yang dipakai ulang banyak fitur β sesuai aturan di CLAUDE.md.
src/
ββ app/
β ββ layout.tsx # root layout (SEO nanti dari site_settings)
β ββ page.tsx # homepage publik (Pinterest masonry) β WIP
β ββ dashboard/
β ββ setup/ # setup owner pertama kali
β ββ login/ # login owner/admin
β ββ page.tsx # dashboard (shell lengkap menyusul)
ββ components/
β ββ ui/ # primitives reusable: Button, Input, Field, Card, β¦
β ββ dashboard/ # komponen khusus dashboard (form auth, dll)
ββ lib/
β ββ supabase/ # client (browser) Β· server (SSR) Β· admin (service role)
β ββ auth/ # session (jose) Β· password (scrypt) Β· permissions Β· actions
β ββ types/database.ts # KONTRAK tipe DB β sumber kebenaran tunggal
β ββ utils/ # cn() Β· parsing IP & device
β ββ constants.ts # fitur dashboard, bucket, cookie, limit upload
ββ proxy.ts # guard /dashboard (Next 16: dulu "middleware")
supabase/
ββ schema.sql # skema DB + RLS + storage (idempotent)
ββ README.md # panduan setup Supabase
- anon key (ada di browser) hanya bisa MEMBACA data publik (media approved, anggota, blog published, notifikasi, pengaturan) β dikunci oleh RLS.
- Semua penulisan (upload, pesan, tracking, aksi admin) lewat server memakai service role yang divalidasi lebih dulu. Jadi meski anon key terekspos (memang publik), data tak bisa diubah sembarangan.
- Sesi owner/admin: JWT HS256 (rahasia
AUTH_SECRET) disimpan di cookieHttpOnly,Secure,SameSite=Lax. Password di-hash dengan scrypt.
| Sudah jadi | Sedang menunggu desain Figma |
|---|---|
| Scaffold + build config | Homepage Pinterest masonry |
| Supabase client + tipe DB + util | Profil anggota (perbaikan terpotong) |
| Skema DB + RLS + storage + panduan | Upload publik + pesan anonim (UI) |
| Setup owner + login + sesi cookie aman | Dashboard: Stats, Media, Pesan, Anggota, Blog, Pengunjung, Admin, Setting |
| Primitives UI dasar (Button/Input/Card) |
Bagian visual sengaja menunggu Figma terhubung (via
/mcpdi terminal interaktif) agar desainnya presisi. Fondasi non-visual di atas tidak bergantung pada Figma dan sudah lulusnpm run build.
npm run dev # mode pengembangan
npm run build # build produksi
npm run start # jalankan hasil build
npm run typecheck # cek tipe TypeScript
npm run lint # ESLint