LensaDiri adalah platform eksplorasi kepribadian modular, privacy-first, dan mobile-first untuk pengguna Indonesia.
Kenali pola dirimu lewat banyak lensa.
Phase 1 application foundation tersedia di repository:
- Migration PostgreSQL untuk akun, session, consent, rate limit, dan audit log.
- RLS forced default-deny serta pencabutan hak direct untuk role
anondanauthenticated. - Boundary PostgreSQL server-only, repository typed, transaction helper, dan environment validation dengan Zod.
- API internal auth: register, login, logout, dan session/CSRF bootstrap.
- Hash password Argon2id, token session opaque yang disimpan sebagai HMAC hash, CSRF, rate limit database, audit event, dan consent service.
- Unit, integration, dan pgTAP database test telah disiapkan.
Database runtime migration, integration test, dan pgTAP RLS test belum terverifikasi pada environment kerja saat ini karena Docker/local Supabase belum tersedia. Ini evidence environment saat ini, bukan batas permanen proyek. Jangan menganggap UI awal atau Phase 1 sebagai instrumen psikometri tervalidasi.
- Scoring primer deterministik dan dijalankan di server.
- Hasil private secara default.
- Token sensitif disimpan dalam bentuk hash atau keyed hash.
- AI tidak menghitung atau mengubah skor primer.
- Tidak ada klaim diagnosis, akurasi mutlak, testimonial palsu, atau angka pengguna palsu.
- Data jawaban dan hasil diperlakukan sebagai data sensitif.
- Browser tidak mendapat akses direct ke tabel Phase 1 atau credential database server.
- Node.js 22.x
- npm 10 atau lebih baru
- Docker Engine dengan Docker Compose untuk Supabase lokal, migration reset, integration test, dan pgTAP test
- Supabase CLI melalui
npx supabaseatau instalasi CLI lokal
Salin contoh environment. Nilai secret dalam contoh hanya placeholder; ganti lokal dan jangan commit .env.local.
cp .env.example .env.localBuat tiap secret unik dengan minimal 32 karakter. Contoh generator lokal:
openssl rand -hex 32Masukkan output berbeda untuk AUTH_SESSION_SECRET, CSRF_SECRET, TOKEN_HASH_PEPPER, dan RATE_LIMIT_SECRET. Jangan mencetak atau membagikan nilai yang dibuat.
Setelah Docker berjalan, mulai Supabase lokal dan reset database kosong dengan migration Phase 1:
npm run db:start
npm run db:resetURL database lokal dalam .env.example memakai placeholder Supabase lokal:
postgresql://postgres:<LOCAL_SUPABASE_DB_PASSWORD>@127.0.0.1:54322/postgres
Ganti placeholder dengan password database local yang Supabase CLI tampilkan saat start. Gunakan URL yang dihasilkan untuk DATABASE_URL dan TEST_DATABASE_URL hanya pada database lokal. Untuk menjalankan integration suite dalam shell yang sama:
export TEST_DATABASE_URL="$DATABASE_URL"
npm run test:integration
npm run test:dbTEST_DATABASE_URL hanya test database lokal tepercaya. Jangan arahkan test, migration reset, atau MCP development ke database production.
Jalankan aplikasi setelah environment dan database tersedia:
npm run devBuka http://localhost:3000.
Tidak ada auth UI Phase 1. Client internal dapat memakai API berikut:
| Endpoint | Kontrak |
|---|---|
GET /api/auth/session |
Membatasi request, mengembalikan status autentikasi dan csrfToken, serta memasang cookie nonce CSRF HttpOnly. Selalu panggil dulu sebelum mutation berbasis cookie. |
POST /api/auth/register |
Body JSON ketat: email, password, dan redirectTo internal opsional. Memerlukan exact Origin dan header x-csrf-token. Respons sukses selalu 202 untuk email baru atau duplikat. |
POST /api/auth/login |
Body JSON ketat sama seperti register. Memerlukan CSRF. Kredensial salah mendapat respons generik 401; sukses memasang cookie session HttpOnly. |
POST /api/auth/logout |
Memerlukan CSRF. Mencabut session bila ada lalu membersihkan cookie; token yang hilang atau sudah dicabut tetap aman untuk logout ulang. |
Semua respons auth memakai Cache-Control: no-store. Cookie memakai HttpOnly, SameSite=Lax, path /, dan Secure di production. Nama cookie menggunakan prefix __Host- di production. Mutation dari browser harus mengirim exact header Origin sama dengan NEXT_PUBLIC_APP_URL dan header x-csrf-token dari respons bootstrap. Tidak ada CORS bypass untuk flow ini.
API tidak menerima atau mengembalikan password maupun raw session token dalam JSON. redirectTo sudah divalidasi sebagai path internal, tetapi belum dipakai untuk redirect server pada Phase 1.
Non-database checks:
npm run format:check
npm run lint
npm run typecheck
npm test
npm run build
npm run test:e2e
npm audit --audit-level=highChecks yang memerlukan Docker dan Supabase lokal aktif:
npm run db:reset
export TEST_DATABASE_URL="$DATABASE_URL"
npm run test:integration
npm run test:dbAtau jalankan pemeriksaan aplikasi utama sekaligus:
npm run checkLihat Phase 1 verification untuk status evidence saat ini. Jangan menandai gate database lulus sebelum command lokal benar-benar selesai.
src/app/api/auth Route handler internal auth
src/lib/auth Email, password Argon2id, dan session cookie
src/lib/db Environment dan PostgreSQL client server-only
src/lib/security Token HMAC, CSRF, HTTP, dan rate-limit primitive
src/server Repository dan service trusted boundary
supabase/ Config, migration, seed, dan pgTAP test database
tests/unit Unit test domain dan security primitive
tests/integration Integration test PostgreSQL nyata
tests/e2e Browser smoke test
docs/ PRD, ADR, security, QA, dan AI tooling
LensaDiri adalah alat refleksi diri, bukan diagnosis klinis, pengganti tenaga profesional, atau dasar tunggal untuk keputusan pendidikan, pekerjaan, maupun relasi.