SaaS platform untuk undangan pernikahan digital berbasis Next.js (App Router), Supabase, dan Tailwind CSS.
- Install dependencies
npm install- (Local) Jalankan Supabase Local (Docker + Supabase CLI)
Pastikan supabase CLI sudah terinstall dan Docker berjalan.
supabase startLalu cek status dan copy credentials:
supabase statusIsi .env.local dengan output URL + anon key.
- (Local) Generate
.env.localotomatis dari Supabase Local
npm run supabase:env- (Local) Apply schema + seed otomatis
npm run supabase:reset- (Opsional) One-command setup lokal
npm run setup:local- Buat project Supabase dan isi
.env.local(Jika pakai cloud)
cp .env.example .env.localIsi:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEY(opsional untuk admin tasks)NEXT_PUBLIC_APP_URL
- Jalankan schema dan seed
Di Supabase SQL editor, jalankan:
supabase/schema.sqlsupabase/seed.sql
- Buat Storage buckets di Supabase
coverscouple-photosgallerywhite-label
- (Optional) Storage policies untuk gallery
-- allow authenticated users to upload gallery files
create policy "gallery_upload" on storage.objects for insert
with check (
bucket_id = 'gallery' and auth.role() = 'authenticated'
);
-- allow public read for gallery
create policy "gallery_public_read" on storage.objects for select
using (bucket_id = 'gallery');
-- allow authenticated users to upload cover images
create policy "covers_upload" on storage.objects for insert
with check (
bucket_id = 'covers' and auth.role() = 'authenticated'
);
-- allow public read for covers
create policy "covers_public_read" on storage.objects for select
using (bucket_id = 'covers');
-- allow authenticated users to upload white-label assets
create policy "white_label_upload" on storage.objects for insert
with check (
bucket_id = 'white-label' and auth.role() = 'authenticated'
);
-- allow public read for white-label assets
create policy "white_label_public_read" on storage.objects for select
using (bucket_id = 'white-label');- Run dev server
npm run devUntuk Supabase Local + supabase db reset, akun demo berikut otomatis tersedia:
- Admin:
admin@admin.com/admin123
Catatan: pastikan Supabase Local berjalan dan .env.local sudah terisi.
Setelah supabase db reset, demo undangan berikut tersedia:
http://localhost:3000/invite/demo-classichttp://localhost:3000/invite/demo-minimalhttp://localhost:3000/invite/demo-romantichttp://localhost:3000/invite/demo-luxuryhttp://localhost:3000/invite/demo-bohohttp://localhost:3000/invite/demo-gardenhttp://localhost:3000/invite/demo-modernhttp://localhost:3000/invite/demo-celestial
Workflow CI sudah disiapkan untuk menjalankan:
npm cinpm run lintnpm run build
File workflow: .github/workflows/ci.yml
Catatan:
- Set GitHub Secrets:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEY
npm run build
npm run startIsi .env.local pada server:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEY(opsional jika ada server task admin)NEXT_PUBLIC_APP_URL(atauNEXT_PUBLIC_SITE_URLuntuk link demo/guest token)
Rekomendasi hosting:
- Vercel (paling cepat untuk Next.js App Router)
- VPS + Docker (jika ingin kontrol penuh)
(marketing)landing page(auth)login / register / forgot password(dashboard)/dashboardarea user/invite/[slug]halaman undangan publik/adminadmin panel
- Middleware melindungi
/dashboard/*dan/admin/*. - Admin role disimpan di
profiles.role(set keadminuntuk akses/admin). - Builder tersambung ke CRUD Supabase, termasuk upload gallery.
- Analytics menggunakan table
invitation_views(auto-insert saat halaman undangan dibuka).