Platform link-in-bio modern (seperti Linktree) — setiap orang dapat mendaftar, memiliki halaman publik kustom di simpul.app/username, serta mengelola profil dan link lewat dashboard intuitif.
Dibangun menggunakan Next.js (App Router) + Supabase (Auth + Database Postgres + Storage).
- Login Fleksibel: Masuk menggunakan Email atau Username dalam 1 field input.
- Autentikasi Aman: Signup dengan verifikasi kode OTP & proteksi bot Cloudflare Turnstile CAPTCHA.
- Manajemen Profil: Edit nama tampilan, bio, warna avatar default, ganti username, dan unggah foto profil asli (Supabase Storage).
- Kustomisasi Tema: Pilihan tema halaman publik (Default, Ocean, Rose, Forest) dengan CSS Custom Properties dinamis.
- Manajemen Link: Tambah, hapus, sembunyikan, dan urutkan posisi link publik.
- Statistik Klik: Pelacakan otomatis jumlah klik per link via route handler penelusuran (
/api/click/[linkId]).
- Buat akun & project baru di supabase.com.
- Di dashboard project, buka SQL Editor → paste seluruh isi file
supabase/schema.sql→ klik Run. Script ini secara otomatis membuat tabelprofiles,links, danlink_clicks, fungsi RPCget_email_by_username, aturan Row Level Security (RLS), bucket storageavatars, serta trigger pembuatan profil otomatis. - Buka Project Settings → API. Catat dua nilai ini:
Project URLanon publickey
- Ubah Email Template:
- Buka Authentication > Email Templates > Confirm signup.
- Copy & paste seluruh kode HTML dari file
supabase/email-template.html(menggunakan token{{ .Token }}untuk kode OTP 6-8 digit).
- Aktifkan Konfirmasi Email:
- Buka Authentication > Sign In / Providers > Email.
- Pastikan opsi "Confirm email" dalam keadaan ON.
- Setup Custom SMTP (Sangat Disarankan):
- Buka Authentication > Settings > SMTP Settings.
- Konfigurasikan Custom SMTP (seperti Resend, SendGrid, dll.) supaya pengiriman kode OTP tidak terkena rate limit bawaan Supabase (2-4 email/jam).
- Atur Redirect URL:
- Buka Supabase Dashboard: Authentication > URL Configuration > Redirect URLs.
- Tambahkan URL:
http://localhost:3000/reset-password(untuk dev) danhttps://domain-kamu.com/reset-password(untuk prod).
- Ubah Template Email Reset Password:
- Buka Authentication > Email Templates > Reset Password.
- Copy & paste seluruh kode HTML dari file
supabase/reset-password-email-template.html.
- Aktifkan Captcha Protection di Supabase:
- Buka Supabase Dashboard: Authentication > Attack Protection > Enable Captcha protection.
- Pilih provider Turnstile.
- Paste Secret Key Turnstile (ambil dari dashboard Cloudflare Turnstile — BUKAN
NEXT_PUBLIC_TURNSTILE_SITE_KEYyang ada di.env).
- Buat Storage Bucket:
- Buka Supabase Dashboard > Storage > New bucket.
- Nama bucket:
avatars. - Aktifkan opsi Public bucket (
public: true).
- Setup RLS Policy untuk Bucket
avatars:- Sudah otomatis dikonfigurasikan saat menjalankan
supabase/schema.sql.
- Sudah otomatis dikonfigurasikan saat menjalankan
npm install
cp .env.example .env.localIsi file .env.local atau .env dengan variabel berikut:
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
NEXT_PUBLIC_TURNSTILE_SITE_KEY=your-turnstile-site-key
TURNSTILE_SECRET_KEY=your-turnstile-secret-keyJalankan server pengembangan:
npm run devBuka http://localhost:3000 di browser.
- Push repository ini ke GitHub.
- Buka vercel.com → Add New Project → import repo.
- Di bagian Environment Variables, tambahkan:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYNEXT_PUBLIC_TURNSTILE_SITE_KEYTURNSTILE_SECRET_KEY
- Klik Deploy.
/— Landing page/signup— Pendaftaran akun dengan verifikasi OTP 6-8 digit & Turnstile CAPTCHA/login— Masuk akun (Email atau Username + Password) & Turnstile CAPTCHA/dashboard— Panel kontrol profil, ganti username, foto profil, pilihan tema, dan kelola link/statistik/demo— Halaman simulasi live demo profil publik/[username]— Halaman profil publik dinamis sesuai tema terpilih/api/click/[linkId]— Route Handler pelacak statistik klik link
- Enkripsi Password: Password dikelola sepenuhnya oleh Supabase Auth.
- Row Level Security (RLS): Memastikan pengguna hanya dapat mengedit dan melihat data milik mereka sendiri di tingkat database.
- Anti Bot: Proteksi Cloudflare Turnstile aktif pada Signup dan Login.
- Anti Username Enumeration: Logika login memberikan respon error generik yang sama baik saat username tidak ditemukan maupun password salah.
