Leluhur

Salasilah Keluarga Nusantara
leluhur.com
Project dimulakan: 11 Mei 2026

Objektif Projek

Misi

Memudahkan setiap keluarga Melayu dan Nusantara merekod, memelihara, dan berkongsi salasilah keluarga mereka secara digital — sebelum generasi yang tahu cerita itu tiada lagi.

Visi

Menjadi platform salasilah keluarga #1 di Asia Tenggara — dibina oleh orang kita, untuk budaya kita, dalam bahasa kita.

North Star Metric

Bilangan hubungan keluarga (family links) yang berjaya direkodkan. Setiap parent-child atau marriage link yang ditambah = satu ikatan keluarga yang diselamatkan daripada dilupakan.

5 Objektif Utama

  1. Selamatkan salasilah sebelum hilang Beri tools yang senang guna supaya sesiapa pun boleh mula rekod family tree — tak perlu tech-savvy. Target: mak cik pun boleh guna.
  2. Bina untuk budaya Melayu/Nusantara, bukan port dari Barat Native support untuk bin/binti, gelaran (Pak Long, Mak Ngah), panggilan hormat, dan struktur keluarga extended yang unik kepada budaya kita.
  3. Selesaikan masalah praktikal yang real Bukan sekadar "nice-to-have". Wali nikah calculator, faraid calculator, relationship calculator — ini tools yang orang perlukan dalam kehidupan sebenar.
  4. Jadikan collaboration mudah Satu keluarga besar, ramai yang contribute. Invite via WhatsApp/link, role-based access, approve system. Biar semua orang boleh tolong isi.
  5. Simpan cerita & warisan, bukan sekadar nama Nama tanpa cerita = data kosong. Platform ni kena boleh simpan cerita hidup, gambar lama, rakaman suara nenek/atuk — warisan yang tak ternilai.

Kriteria Kejayaan (Measurable)

MVP Launch

TARGET

Keluarga sendiri (LAN) berjaya masukkan sekurang-kurangnya 50 ahli keluarga dengan hubungan lengkap — dari atuk/nenek sampai anak saudara.

Product-Market Fit

TARGET

5 keluarga lain (bukan keluarga LAN) secara sukarela guna platform dan actively tambah data. Tanpa dipaksa.

Usability

TARGET

Orang yang tak tech-savvy (umur 40+) boleh buat akaun, tambah 5 ahli keluarga, dan link relationships — dalam masa 10 minit tanpa bantuan.

Differentiator

TARGET

Sekurang-kurangnya 1 orang guna wali nikah calculator atau faraid calculator untuk urusan sebenar — bukan sekadar test.

Bukan Objektif (Non-Goals)

Penting juga untuk jelas apa yang kita tak nak buat — supaya tak hilang fokus:

  • Bukan social media — tiada feed, likes, followers. Ini tools keluarga, bukan platform show-off.
  • Bukan DNA testing service — kita integrate kalau ada, tapi bukan core business.
  • Bukan app dating/matchmaking — walaupun ada data keluarga, privacy comes first.
  • Bukan pengganti rekod rasmi kerajaan (JPN, mahkamah syariah) — ini complement, bukan replacement.
  • Bukan platform jual beli — tiada marketplace, tiada subscription predatory.

Kenapa Leluhur?

Orang Melayu dan Nusantara semakin hilang rekod salasilah keluarga. Tradisi lisan semakin pupus — tok-tok kita yang tahu cerita makin tua. Platform sedia ada seperti Geni.com direka untuk budaya Barat (first name + surname tetap), langsung tak faham sistem penamaan Melayu (bin/binti, patronymic), gelaran (Pak Long, Mak Ngah), atau keperluan Islamic seperti wali nikah dan faraid.

Leluhur ialah platform salasilah keluarga yang dibina khas untuk budaya Melayu/Nusantara — dari cara kami simpan nama, sampai cara kami kira hubungan kekeluargaan.

Masalah Yang Diselesaikan

  • Nama berubah setiap generasi — Ahmad bin Abu → Siti binti Ahmad. Tiada "surname" tetap. Platform Barat tak boleh handle ini.
  • Hubungan extended family yang kompleks — Sepupu = macam adik-beradik sendiri. Perlu tahu sepupu sebelah mak ke ayah, berapa kali removed.
  • Tradisi lisan hilang — Cerita kampung, asal-usul keluarga, hanya tersimpan dalam kepala orang tua.
  • Keperluan agama — Wali nikah bergantung pada hierarki keluarga. Faraid perlukan carta keluarga yang lengkap.
  • Gelaran automatik — Anak sulung lelaki = Pak Long, anak kedua perempuan = Mak Ngah. Ini perlu dikira dari birth order.

Perbandingan: Leluhur vs Geni.com

Ciri Geni.com Leluhur
Sistem nama bin/binti ✗ Tak support ✓ Native
Gelaran Melayu (Pak Long, Mak Cik) ✗ Tiada ✓ Auto dari birth order
Wali nikah calculator ✗ Tiada ✓ Auto dari hierarki
Faraid calculator ✗ Tiada ✓ Berdasarkan family tree
Kampung asal tagging ✗ Generic location ✓ Kampung + negeri + migrasi
Relationship calculator ✓ Basic ✓ Dalam Bahasa Melayu
Cerita & memori ● Basic photos ✓ Foto + audio + cerita
Bahasa Melayu UI ✗ English only ✓ BM first + EN
Collaborative editing ✓ Ada ✓ Invite family members
Free tier ● Limited ✓ Generous free tier

Target Users

Ketua Keluarga

Orang yang nak rekod salasilah keluarga besar — biasanya anak sulung atau cucu yang ambil berat.

Pengantin & Keluarga

Perlu kenal pasti wali nikah yang sah. Leluhur auto-calculate dari family tree.

Urusan Faraid

Bila ada kematian, perlu tahu waris yang layak dan bahagian masing-masing.

Generasi Muda

Nak tahu "siapa dia ni?" bila jumpa family gathering. Relationship calculator selesai masalah ni.

Skop Geografi: Dunia Melayu-Nusantara

Leluhur cover 7 negara/wilayah dalam rumpun Melayu-Nusantara — 335+ juta orang yang share akar budaya, bahasa, dan agama. Ini bukan sekadar Malaysia app — ini platform untuk seluruh rantau.

Negara / Wilayah Populasi Muslim % Sistem Nama Struktur Keluarga Tier
🇮🇩 Indonesia 284.4 juta 87% Pelbagai (marga, suku, tunggal, bin/binti) Patrilineal / Matrilineal
🇲🇾 Malaysia 34.2 juta 63% Patronymic (bin/binti) Patrilineal
🇸🇬 Singapura 5.7 juta 16% Patronymic (bin/binti) Patrilineal
🇧🇳 Brunei 400 ribu 82% Patronymic (bin/binti) Patrilineal
🇵🇭 Filipina Selatan (Bangsamoro) 5.7 juta 90%+ Surname Sepanyol + nama Islam Patrilineal
🇹🇭 Thailand Selatan (Patani) 2 juta 80% Melayu tradisional / surname Thai Patrilineal
🇰🇭 Kemboja (Cham Muslim) 300-700 ribu 2% Patronymic (reversed order) Patrilineal

Tier: ■■■ = Core market   ■■□ = Secondary   ■□□ = Niche

Profil Setiap Negara

🇮🇩 Indonesia

284.4M
Populasi
87%
Muslim
600+
Etnik
700+
Bahasa

Market terbesar Nusantara. Tapi paling complex — setiap suku bangsa ada sistem nama yang berbeza. App kena flexible untuk handle semua.

Jawa (40% — 114 juta)
Nama tunggal — tiada surname langsung. Sukarno, Suharto, Kartini. Moden: ada yang tambah 2-3 nama. Birth order: Eka (1st), Dwi (2nd), Tri (3rd), Catur (4th), Panca (5th). Patrilineal.
Sunda (15% — 44 juta)
Tiada surname, macam Jawa. Nama Sanskrit-influenced. Suka rhyming: Kokom Komariah, Wawan Gunawan. Gelaran: Teteh/Teh (kakak), Akang/Aa (abang), Mamang (pakcik). Islam kuat.
Batak (3.5% — ~10 juta)
Marga (clan) — patrilineal. Inherit dari bapa. Exogamy: HARAM kahwin dalam marga sama. 14+ sub-clan. Perempuan kahwin guna "boru" + marga asal. Majoriti Kristian.
Minangkabau (2.7% — ~8 juta)
Suku (clan) — MATRILINEAL. Satu-satunya masyarakat matrilineal terbesar dunia. Harta, nama, tanah ikut ibu. 96 suku. Exogamy: tak boleh kahwin dalam suku sama. Islam + adat.
Aceh
Patronymic (bin/binti) — macam Malaysia. Gelaran: Teuku (lelaki bangsawan), Cut (perempuan). Islam konservatif. Patrilineal.
Bugis/Makassar (2.6%)
Title system: Andi, Daeng, Karaeng, Puang, Opu. 13 gelaran. Genealogi = harta keluarga. 5 gender system unik (makkunrai, oroané, calalai, calabai, bissu). Islam.
Bali Hindu (3%)
Birth order cyclical: Wayan/Putu (1st), Made (2nd), Nyoman (3rd), Ketut (4th) — reset setiap 4 anak. Gender prefix: I (lelaki), Ni (perempuan). Caste: Brahmana, Ksatria, Vaisya, Sudra. Hindu.
Dayak (Kalimantan)
Tribal — 18 suku besar, 403+ sub-suku. Nama ikut tempat tinggal. Longhouse community. Bilateral (kedua garis). Kristian / animisme. Iban, Kenyah, Ngaju, Bidayuh.
Melayu Riau/Sumatera
Patronymic (bin/binti) — sama macam Malaysia tapi lebih flexible. Kadang guna "anak" (anak of). Kadang langsung skip connector. Islam. Patrilineal.

🇲🇾 Malaysia

34.2M
Populasi
63%
Muslim
58%
Melayu

Core market dan "home turf" kita. Highest digital literacy, strong genealogy interest, dan budaya yang kita paling faham.

Sistem Nama
Patronymic: Nama + bin/binti + Nama Bapa. Contoh: Razak bin Osman, Aisyah binti Musa. Perempuan KEKAL nama bapa selepas kahwin. Bukan surname — setiap generasi berubah.
Gelaran Birth Order
1st: Pak/Mak Long, 2nd: Ngah, 3rd: Lang, 4th: Anjang, 5th: Uda, 6th: Su (Bongsu). Variasi ikut negeri. Auto-compute dari data birth order.
Gelaran Kehormat
Haji/Hajjah (haji), Datuk/Datin (kurniaan), Dato', Tan Sri, Tun. Orang Asli, Iban, Kadazan (Sabah/Sarawak) ada sistem nama sendiri.
Etnik Lain
Chinese (22.4%) — surname system. Indian (6.5%) — patronymic (a/l, a/p, d/o, s/o). Bumiputera Sabah/Sarawak (12.3%) — Iban, Kadazan, Bidayuh — pelbagai sistem.

🇸🇬 Singapura

5.7M
Populasi
13.5%
Melayu
99%
Melayu Muslim

Komuniti Melayu kecil tapi affluent, digital-savvy, dan deeply connected dengan keluarga di Malaysia/Indonesia. High spending power.

Sistem Nama
Sama dengan Malaysia — bin/binti. Sering di-abbreviate jadi "B." yang confuse orang Barat. Family tree selalu cross-border dengan Johor/Riau.
Peluang
Melayu Singapura sangat nak preserve heritage sebab minority. Banyak yang trace family ke Jawa, Bugis, Minang, Bawean. High demand.

🇧🇳 Brunei

400K
Populasi
82%
Muslim
67%
Melayu
Sistem Nama
Sama macam Malaysia — bin/binti. Gelaran bangsawan unik: Pengiran, Awangku, Dayangku (royal descent). Hubungan dengan kesultanan penting.
Nota
Market kecil tapi satu bahasa, satu budaya, satu agama. Easy integration — basically extension of Malaysia features.

🇵🇭 Filipina Selatan (Bangsamoro)

5.7M
Populasi
90%+
Muslim
13
Suku Moro
Suku Utama
Maguindanao, Maranao, Tausug, Sama/Samal, Badjao, Yakan, Iranun. Setiap suku ada identiti kuat. Sejarah Kesultanan Sulu & Maguindanao.
Sistem Nama
Campuran: surname Sepanyol + nama Islam. Berbeza dari pattern Melayu. Perlu support surname-based system bersama patronymic.
Bahasa
Maguindanaon, Maranao, Tausug, Filipino, English. Perlu at least English UI untuk penetrate market ni.

🇹🇭 Thailand Selatan (Patani)

2M
Populasi
80%
Muslim
Sistem Nama
Dua system: nama Melayu tradisional (tanpa surname) ATAU surname Thai yang di-assign oleh kerajaan. Ramai orang Melayu Patani ada Thai surname macam Madsiri, Pitsuwan.
Jawi
Tulisan Jawi masih digunakan meluas — kena consider Jawi script support untuk rekod lama. Wilayah: Pattani, Yala, Narathiwat, bahagian Songkhla.

🇰🇭 Kemboja (Cham Muslim)

300-700K
Populasi
2%
Muslim
Sistem Nama
Patronymic tapi reversed order dari Khmer (nama dulu, nama bapa kemudian). Ada juga yang guna convention Khmer (nama keluarga dulu). Campuran nama Arab + Cham.
Nota
Niche market tapi historically significant — kerajaan Champa (abad 2-17). Asal Austronesia. Perempuan kekal nama bapa. Islam Sunni majoriti, Hindu minoriti.

Sistem Penamaan: Apa Yang App Kena Support

Ini summary semua jenis sistem nama yang app kena handle. Setiap satu perlukan input field dan logic yang berbeza.

Jenis Wilayah Cara Kerja Impak Pada App
Patronymic Malaysia, Brunei, Singapura, Aceh, Melayu Riau, Cham Nama + bin/binti + nama bapa. Setiap generasi berubah. Auto-generate dari parent link. Connector options: bin, binti, binte, a/l, a/p, anak.
Nama Tunggal Jawa, Sunda Satu nama sahaja. Tiada surname. Moden: 2-3 nama. Surname field OPTIONAL. Single name valid. Jangan force "last name".
Marga (Clan) Batak Nama + marga (clan bapa). Diwarisi patrilineal. 14+ sub-clan. Clan/marga field. Exogamy check (tak boleh kahwin dalam marga sama).
Suku (Matrilineal) Minangkabau Suku ikut IBU, bukan bapa. 96 suku. Harta ikut garis ibu. Matrilineal tree mode. Garis ibu = primary line. Exogamy check.
Birth Order Cycle Bali (Hindu) Wayan (1st) → Made (2nd) → Nyoman (3rd) → Ketut (4th) → reset. + I/Ni prefix + caste title. Birth order auto-name. Caste field. Gender prefix. Cycle reset tiap 4 anak.
Title System Bugis/Makassar 13 gelaran status: Andi, Daeng, Karaeng, Puang, Opu. Title/gelaran field. Status hierarchy. Genealogy = harta keluarga.
Tribal Dayak (Kalimantan) Nama + suku/tribe. 18 suku besar, 403+ sub-suku. Tribal affiliation field. Longhouse/kampung tag. Bilateral tracking.
Surname (Sepanyol) Bangsamoro (Filipina) Nama Islam + surname diwarisi (Spanish-era). Family surname tetap. Standard surname field BERSAMA nama Islam. Support both systems.
Dual System Patani (Thailand) Nama Melayu tradisional ATAU surname Thai yang di-assign. Support both Malay traditional name + Thai official name. Dual name field.

Bahasa App

Priority 1 — Launch

WAJIB
  • Bahasa Melayu — Malaysia, Brunei, Singapura, Patani
  • Bahasa Indonesia — 284M orang, bukan sekadar terjemah dari BM
  • English — lingua franca, diaspora, Filipina

Priority 2 — Expansion

LEPAS LAUNCH
  • Filipino / Tagalog — Bangsamoro access
  • Thai — Patani community
  • Jawi script — Rekod lama, Patani, Kelantan

Nota penting: Bahasa Melayu ≠ Bahasa Indonesia. Walaupun serupa, ada beza istilah: "keluarga" (BM) vs "keluarga" (BI) sama, tapi "isteri" (BM) vs "istri" (BI), "beranak" (BM) vs "melahirkan" (BI). Perlu separate translation file, bukan copy-paste.

Agama & Bangsa

Walaupun majoriti Nusantara adalah Islam, app kena inclusive untuk semua — sebab dalam satu keluarga besar pun boleh ada pelbagai agama dan bangsa.

Islam (Sunni)

MAJORITI

Malaysia, Indonesia, Brunei, Singapura, Patani, Bangsamoro, Cham. Features Islamic: wali nikah, faraid, nasab, Haji/Hajjah title. Mazhab Syafie majoriti SEA.

Hindu

BALI + CHAM

Bali (3% Indonesia), Cham Hindu minoriti. Caste system Bali affect naming. Upacara & ritual berbeza. Kena support tanpa Islamic-specific features.

Kristian

BATAK + DAYAK

Batak majoriti Kristian (Protestan/Katolik). Dayak juga ramai Kristian. Church records important untuk genealogy. Baptism dates relevant.

Animisme & Lain-lain

NICHE

Dayak tradisional, Bugis (bissu). Kepercayaan tradisional masih wujud walaupun minoriti. App kena neutral — jangan assume semua Muslim.

Design principle: Islamic features (wali, faraid) = optional modules, bukan forced. Default UI neutral. User pilih nak enable features mana based on keperluan keluarga mereka. Orang Batak Kristian boleh guna app tanpa nampak faraid calculator.

Features Tambahan Yang Perlu (Dari Research)

Based on analisis semua negara Nusantara, ini features yang kita kena tambah dalam plan:

Flexible Name System

KRITIKAL

Bukan sekadar "first name + last name". Kena support: nama tunggal, patronymic, marga, suku, birth order cycle, titles, dual-name (official vs traditional). Ini the #1 differentiator.

Matrilineal Mode

PENTING

Minangkabau trace garis IBU, bukan bapa. App kena boleh switch primary line dari patrilineal ke matrilineal. Affect tree visualization, inheritance, property.

Clan/Marga/Suku Field

PENTING

Batak marga, Minang suku, Dayak tribe — ini bukan sekadar "tag". Ini identity. Kena ada dedicated field dengan exogamy rules (tak boleh kahwin dalam clan sama).

Exogamy / Endogamy Check

BONUS

Alert kalau cuba link marriage antara orang yang sama marga (Batak) atau sama suku (Minang). Ini real cultural rule yang orang ambil serius.

Multi-Religion Module

PENTING

Islamic: wali, faraid, nasab. Hindu: caste, upacara. Kristian: baptism, church. Semua optional — user pilih modules yang relevant.

Cross-Border Family Tree

BONUS

Keluarga Nusantara selalu cross border. Orang Bugis ada family di Sabah, Sulawesi, Singapura, Johor. Satu tree, pelbagai negara.

Gelaran Auto-Compute (Pelbagai Budaya)

BONUS

Malaysia: Pak Long/Mak Ngah. Sunda: Teteh/Akang. Jawa: Mas/Mbak. Bali: Wayan/Made/Nyoman/Ketut. Auto dari budaya + birth order.

Jawi & Multi-Script

BONUS

Support nama dalam Jawi (Arabic script), Rumi (Latin), dan Aksara Bali/Jawa untuk rekod lama. Optional field — bukan forced.

Total Addressable Market

Total Populasi Nusantara

332+ juta

Kalau 1% sahaja guna Leluhur = 3.3 juta users. Kalau setiap user masukkan 20 ahli keluarga = 66 juta person records.

Tiada Competitor Langsung

FamilySearch, Geni, MyHeritage — semua Western-centric. Tiada satu pun platform genealogy yang dibina khas untuk budaya Nusantara. Blue ocean.

Ciri-Ciri Teras (Core Features)

Pokok Salasilah Interaktif

TERAS

Visualisasi family tree yang boleh zoom, pan, expand/collapse. Support ribuan ahli. Setiap node boleh klik untuk lihat profil penuh.

Profil Ahli Keluarga

TERAS

Nama penuh + bin/binti, tarikh lahir/meninggal, jantina, gambar, kampung asal, pekerjaan, cerita hidup. Support nama lama dan nama moden.

Hubungan & Perkahwinan

TERAS

Link parent-child, pasangan (termasuk poligami/cerai/janda). Setiap perkahwinan boleh ada anak sendiri. Support anak angkat, anak tiri.

Collaboration & Invite

TERAS

Jemput ahli keluarga untuk sama-sama isi data. Role-based: admin, editor, viewer. Approve system untuk tambah ahli baru.

Ciri-Ciri Unik Melayu/Nusantara

Sistem Nama Bin/Binti

UNIK

Auto-generate nama penuh berdasarkan nama bapa. Ahmad + bapa Abu = "Ahmad bin Abu". Support bin, binti, a/l, a/p, d/o, s/o.

Gelaran Automatik

UNIK

Auto-assign gelaran berdasarkan birth order: Pak Long, Pak Ngah, Pak Lang, Pak Cik, Pak Su. Sama untuk Mak. Boleh override dengan gelaran custom.

Kalkulator Wali Nikah

UNIK

Auto-determine wali nikah yang sah berdasarkan hierarki fiqh: bapa → datuk → abang → anak saudara → pakcik → sepupu. Kalau wali asob tiada, turun ke wali hakim.

Kalkulator Faraid

UNIK

Pilih siapa yang meninggal, sistem auto-detect waris: anak lelaki, anak perempuan, isteri, suami, ibu, bapa, adik-beradik. Kira bahagian ikut hukum faraid.

Kampung Asal & Migrasi

UNIK

Tag setiap ahli dengan kampung asal + tempat tinggal sekarang. Lihat peta migrasi keluarga — dari kampung ke bandar, antara negeri, ke luar negara.

Kalkulator Hubungan

UNIK

"Dia ni apa dengan aku?" — pilih dua orang, sistem terangkan hubungan dalam Bahasa Melayu: "Sepupu sebelah mak, sekali removed" atau "Anak saudara bapa saudara kamu".

Ciri-Ciri Warisan (Heritage Features)

Cerita & Memori

WARISAN

Simpan cerita hidup, kenangan, peristiwa penting. Attach gambar lama, dokumen, rakaman suara. Timeline view untuk setiap ahli.

Rakaman Suara

WARISAN

Record cerita dari orang tua terus dalam app. Transkrip auto ke teks. Simpan suara nenek/atuk untuk generasi akan datang.

Gambar Lama & Album

WARISAN

Upload gambar lama, tag siapa dalam gambar, auto-link ke profil. Album mengikut peristiwa: kenduri, raya, majlis.

Dokumen Keluarga

WARISAN

Simpan salinan surat beranak, IC lama, surat nikah, geran tanah. Encrypted storage. Untuk rujukan generasi akan datang.

Perkahwinan, Perceraian & Keluarga Kompleks

Kehidupan keluarga tak selalu straightforward. App kena handle semua senario tanpa judgement — cerai, kahwin semula, poligami, anak angkat, anak tiri. Ini realiti Nusantara.

Poligami (Isteri Lebih Dari Satu)

SUPPORT

Seorang suami boleh ada hingga 4 isteri serentak (Islam). Setiap marriage = record berasingan. marriage_order = isteri ke-berapa. Tree visualization tunjuk semua isteri dengan anak masing-masing.

👩 Isteri 1
Fatimah (1998-)
👦 👧
👨
Ahmad
👩 Isteri 2
Aminah (2005-)
👦

Cerai & Kahwin Semula

SUPPORT

Record perceraian dengan tarikh cerai. Kedua-dua pihak boleh kahwin semula (marriage baru). Anak-anak kekal linked ke marriage asal. Bekas pasangan masih visible dalam tree (garis putus-putus).

👩 Ex-wife
Cerai 2010
👨 Ahmad
👩 Isteri baru
Nikah 2012

Anak Tiri (Step-children)

SUPPORT

Bila kahwin dengan orang yang dah ada anak, anak tu jadi anak tiri. relation_type: step. Anak tiri nampak dalam tree tapi dengan garis berbeza (dashed). Tetap boleh trace ke ibu/bapa kandung.

Anak Angkat (Adopted)

SUPPORT

relation_type: adopted. Anak angkat appear dalam tree macam anak biasa tapi boleh toggle untuk tunjuk garis ke family asal (kalau diketahui). Penting untuk faraid — anak angkat ada hukum berbeza.

Janda / Duda

SUPPORT

Pasangan meninggal = marriage.status: meninggal. Tarikh kematian auto-detect dari person record. Kalau kahwin semula = marriage baru. Marriage lama kekal visible.

Anak Luar Nikah

SUPPORT

relation_type: biological tapi marriage_id: NULL. Sensitive topic — app tak judge. Data simpan private by default. Penting untuk nasab (garis keturunan Islam) yang perlukan bapa yang sah.

Visualisasi Keluarga Kompleks

Macamana tree view handle family structures yang tak standard? Guna visual cues yang jelas.

Hubungan Garis / Visual Warna Nota
Perkahwinan aktif ━━━ Garis solid tebal ■ Hijau Garis mendatar antara suami-isteri
Cerai - - - Garis putus-putus ■ Merah Ex-spouse masih nampak tapi faded
Pasangan meninggal ━━━ Garis solid ■ Kelabu Node pasangan ada marker ✝
Anak kandung ┃ Garis menegak solid ■ Emas Standard parent-child line
Anak angkat ┄ Garis menegak putus-putus ■ Biru Label "angkat" pada garis
Anak tiri ┄ Garis menegak putus-putus ■ Ungu Connect ke step-parent sahaja
Poligami ━ Multiple garis dari suami ■ Hijau Isteri 1, 2, 3, 4 labeled. Anak grouped by marriage.
Anak luar nikah ┄ Garis menegak dotted ■ Kelabu Hanya visible kepada admin/editor. Hidden by default.

Peringatan & Notifikasi (Reminders)

App bukan sekadar rekod statik — ia hidup bersama keluarga. Ingatkan events penting supaya ikatan keluarga kekal erat.

Hari Lahir (Birthday)

TERAS

Auto-detect dari tarikh_lahir. Push notification: "Esok hari lahir Pak Long Abu — 76 tahun!" Boleh set reminder berapa hari awal (1 hari / 3 hari / 1 minggu).

🎂
Hari lahir esok!
Pak Long Abu bin Ahmad — 76 tahun
Tap untuk ucapkan selamat →

Ulang Tahun Perkahwinan

TERAS

Auto dari tarikh_nikah dalam marriages. "Hari ini ulang tahun perkahwinan ke-25 Pak Long & Mak Long!" Kira tahun ke-berapa automatically.

💍
Anniversary ke-25!
Pak Long Abu & Mak Long Fatimah

Hari Kematian / Haul

TERAS

Untuk ahli yang dah meninggal — auto remind setahun sekali. "Hari ini genap 3 tahun Allahyarham Datuk Hussein meninggal dunia." Boleh set reminder untuk bacaan Yasin / kenduri arwah.

🛒
Haul Allahyarham
Datuk Hussein bin Ali — 3 tahun
Al-Fatihah 🙏

Tarikh Penting Custom

BONUS

User boleh tambah tarikh custom: hari pencen, hari masuk university, hari pindah rumah, hari dapat anugerah. Attach ke person. Recurring reminder optional.

Upcoming Events Dashboard

BONUS

Dashboard yang tunjuk "bulan ni" / "minggu ni" — siapa birthday, anniversary, haul. Calendar view. Boleh share list ke WhatsApp group keluarga.

MEI 2026
🎂 12 Mei — Hari lahir Irfan (8 tahun) 3 hari lagi
💍 18 Mei — Anniversary Pak Ngah & Mak Ngah 9 hari lagi
🛒 23 Mei — Haul Allahyarham Datuk 14 hari lagi
🎂 29 Mei — Hari lahir Mak Cik Siti (48) 20 hari lagi

Share Ucapan

BONUS

Dari notification, terus generate kad ucapan cantik → share WhatsApp. Birthday card dengan gambar orang tu + nama keluarga. Anniversary card untuk pasangan. Memorial card untuk haul.

Tetapan Notifikasi

User kena boleh control apa yang dia nak dapat notification — jangan spam.

Jenis Default Options Channel
🎂 Hari lahir ON 1 hari / 3 hari / 1 minggu sebelum Push notification
💍 Anniversary ON Hari yang sama / 1 hari sebelum Push notification
🛒 Haul / Kematian ON 1 hari / 3 hari / 1 minggu sebelum Push notification
📝 Custom dates OFF Per-event toggle Push notification
👥 Ahli baru join ON Setiap kali / daily digest Push notification
✏ Perubahan tree OFF Setiap kali / daily digest In-app only
💬 Cerita baru ON Setiap kali / weekly digest Push notification
📅 Ringkasan mingguan OFF Setiap Jumaat Push / Email

Scope filter: User boleh pilih nak notification untuk semua orang dalam tree, atau hanya generasi terdekat (parents, siblings, children). Jangan notify pasal birthday sepupu yang kita tak pernah jumpa.

Data Model: Events & Reminders

person_events

Tarikh penting untuk setiap person. Birthday & death auto-created dari persons table. Custom events manual.

iduuid PK
person_iduuid FK→ persons
family_iduuid FK→ families
event_typeenumbirthday | death | marriage_anniv | custom
titletextAuto: "Hari Lahir Ahmad" atau custom title
event_datedateTarikh event (month+day untuk recurring)
is_recurringbooleanTrue untuk birthday, anniversary, haul
related_marriage_iduuid FK→ marriages (untuk anniversary)
auto_generatedbooleanTrue kalau system create dari tarikh_lahir/meninggal

notification_settings

Per-user notification preferences.

iduuid PK
user_iduuid FK→ auth.users
family_iduuid FK→ families
birthday_enabledbooleanDefault true
birthday_days_beforeint1, 3, atau 7 hari sebelum
anniversary_enabledbooleanDefault true
haul_enabledbooleanDefault true
haul_days_beforeint1, 3, atau 7 hari sebelum
new_member_enabledbooleanDefault true
scopeenumall | close_family | direct_only
digest_modeenuminstant | daily | weekly | off

Sistem Jemputan (Invite System)

Bagaimana ahli keluarga dijemput masuk? App kena make it semudah mungkin — target user termasuk mak cik pakcik yang tak tech-savvy. Multiple channels supaya sesuai dengan semua orang.

WhatsApp Share

UTAMA

Channel #1 di Nusantara. Tap "Jemput" → auto-generate message + deep link → buka WhatsApp → pilih contact/group. Message siap tulis:

"Assalamualaikum! Saya sedang bina salasilah keluarga kita di Leluhur. Jom sama-sama isi! Tap sini untuk join: leluhur.com/join/abc123"

QR Code

UTAMA

Best untuk family gathering / reunion / kenduri. Satu orang show QR code → semua scan → terus join family tree. QR code boleh juga print untuk letak atas meja.

Scan untuk join Keluarga Haji Ahmad

SMS / Nombor Telefon

SOKONGAN

Untuk orang tua yang tak guna WhatsApp. Masukkan nombor → hantar SMS dengan link. Juga boleh invite by phone number — "Masukkan nombor Mak Cik, kita hantar jemputan."

Deep Link / Universal Link

SOKONGAN

Link leluhur.com/join/abc123 yang boleh share mana-mana: Telegram, Facebook Messenger, email, copy paste. Kalau app installed → buka terus. Kalau tak → App Store / Play Store.

Email

OPTIONAL

Untuk ahli keluarga overseas / yang lebih formal. Auto-generate email cantik dengan preview family tree. Less common di SEA tapi perlu untuk coverage.

NFC Tap

OPTIONAL

Dua phone tap together → auto-invite. Cool factor tinggi, tapi adoption rendah (tak semua phone support). Good for demo / wow factor. Backup kalau QR scan gagal.

Flow Jemputan

Dari invite sampai masuk tree — setiap step kena frictionless.

1
Admin Jemput
Pilih channel: WhatsApp, QR, SMS, Link, Email, NFC
2
Penerima Tap Link
Buka deep link → install app / buka app
3
Sign Up / Login
Google / Apple / Email — satu tap je
4
Claim Profile
"Ini anda ke?" — link diri ke person node yang dah ada dalam tree
5
Masuk!
Admin approve → user boleh view & edit tree

Invite Link Anatomy

Format: leluhur.com/join/{invite_code}
Contoh: leluhur.com/join/KLG-Ahmad-x7k2
Setiap invite code:
  • Unique per family (bukan per person)
  • Boleh set expiry (24 jam / 7 hari / permanent)
  • Boleh set role (editor / viewer)
  • Boleh limit berapa kali guna (1x / unlimited)
  • Admin boleh revoke bila-bila masa

Claim Profile: Step 4 Dalam Detail

Bila user join, dia bukan masuk sebagai "new person" — kemungkinan besar, admin dah masukkan nama dia dalam tree. So kita tanya:

Ini anda ke?
👨
Razak bin Ahmad
Pak Ngah • Shah Alam
👨
Razak bin Hassan
Generasi 3 • KL
Saya orang lain (tambah baru)

Profil Sosial Ahli Keluarga

Setiap ahli keluarga boleh link social media mereka — supaya family members boleh connect & follow. Bukan dalam Leluhur, tapi bridge ke platform sedia ada.

Social Links Yang Disokong

WhatsApp Instagram Facebook TikTok Twitter / X LinkedIn Telegram YouTube Custom URL

Siapa Boleh Letak?

  • Diri sendiri — user yang dah claim profile boleh isi sendiri
  • Family admin — boleh isi untuk orang lain (tapi marked as "ditambah oleh admin")
  • Privacy: User boleh hide mana-mana link dari viewer — hanya family editors nampak

Mockup: Profile Page dengan Social Links

👨
Razak bin Ahmad
Pak Ngah
Generasi 3 • Shah Alam, Selangor
2
Anak
1
Isteri
4
Adik-beradik
12
Cerita
Media Sosial
💬
WhatsApp
+60 12-345 6789
📷
Instagram
@razak.ahmad
🎥
TikTok
@razak_ahmad
📰
Facebook
Razak Ahmad
Lihat dalam Pokok
Hubungan dengan saya

Data Model: Invites & Social

invites

Setiap invite link = satu record. Track usage, expiry, dan siapa guna.

iduuid PK
family_iduuid FK→ families
codetext UNIQUEInvite code — cth: "KLG-Ahmad-x7k2"
created_byuuid FK→ auth.users (siapa create)
roleenumeditor | viewer (default: editor)
channelenumwhatsapp | qr | sms | link | email | nfc
target_person_iduuid FK→ persons (suggest claim person ni bila join)
max_usesintNULL = unlimited. 1 = one-time invite.
use_countintBerapa kali dah diguna (default 0)
expires_attimestamptzNULL = permanent. Atau 24h / 7d / 30d.
statusenumactive | revoked | expired
messagetextCustom message (optional)
created_attimestamptz

social_links

Social media links untuk setiap person. Satu person boleh ada banyak links.

iduuid PK
person_iduuid FK→ persons
platformenumwhatsapp | instagram | facebook | tiktok | x | linkedin | telegram | youtube | custom
handletextUsername / phone number / URL
urltextFull URL (auto-generate dari handle + platform)
visibilityenumfamily | editors_only | private (default: family)
added_byuuid FK→ auth.users (diri sendiri atau admin)
verifiedbooleanTrue kalau user sendiri yang masukkan

Viral & Growth Loops

Genealogy app ada built-in viral mechanic — setiap user secara semulajadi nak invite ahli keluarga lain. Kita kena maximise ini.

Loop 1: Invite → Claim → Invite

Ahmad invite Siti. Siti join, nampak tree tak lengkap. Siti invite Ali untuk isi bahagian dia pula. Chain reaction.

Ahmad → Siti → Ali → Fatimah → ...

Loop 2: Share Screenshot

Fan Chart cantik → screenshot → post WhatsApp Status / IG Story → "Wah cantiknya, app apa ni?" → organic download.

Loop 3: Reunion / Kenduri

QR code di meja kenduri. "Scan ni join family tree kita." 20 orang scan sekaligus. Bulk onboarding moment.

Loop 4: "Siapa Dia?"

Relationship calculator result: "Dia sepupu sebelah mak, 2x removed." Share result → orang lain nak try → download app.

Loop 5: Incomplete Tree Nudge

Notification: "Bahagian sebelah mak masih kosong. Jemput Mak Cik Siti untuk isi?" — gentle push to invite.

Loop 6: Hari Raya / Perayaan

Seasonal push: "Raya ni jom lengkapkan salasilah! Share dengan keluarga." Family reunions = natural onboarding window.

Ciri-Ciri Masa Depan (Future)

DNA & Genetik

FUTURE

Integrasi dengan 23andMe / MyHeritage DNA. Match DNA relatives dengan family tree sedia ada.

AI Face Matching

FUTURE

Upload gambar lama tanpa nama, AI suggest siapa berdasarkan persamaan wajah dengan ahli lain dalam tree.

Export & Print

FUTURE

Export family tree sebagai poster besar untuk kenduri, reunion, atau frame. PDF dan canvas format.

Mobile App

FUTURE

Flutter app untuk iOS & Android. Scan gambar lama, record audio, browse tree on the go.

Cabaran Utama: Family Tree on Mobile

Screen mobile = 6 inci. Family tree boleh ada 200+ orang. Penyelesaian: jangan cuba tunjuk semua sekaligus. Guna multiple views — setiap satu serve purpose berbeza.

User boleh switch antara 4 views. Setiap view optimized untuk use case yang berbeza.

Empty State: Pengalaman Pertama Kali

User baru buka app, tree masih kosong. Daripada tunjuk blank screen, kita tunjuk "skeleton tree" — placeholder nodes dengan butang +. User nampak bentuk family tree dan terus faham apa yang kena isi.

Peraturan Empty State

Placeholder Sentiasa Nampak

Walaupun tree dah ada 50 orang, empty + placeholders tetap muncul di sekeliling focused person — atas (parents), kiri/kanan (siblings), bawah (children/spouse). Remind user ada lagi ruang untuk isi.

Context-Aware Labels

Placeholder tak tulis generic "Add Person". Tulis hubungan: "Bapa", "Ibu", "Abang/Kakak", "Adik", "Pasangan", "Anak". User faham apa yang dia tambah tanpa fikir.

Progressive Disclosure

Form tambah orang: hanya Nama + Jantina = wajib. Semua lain (tarikh lahir, kampung, bio, gambar) dalam accordion "optional". User tak overwhelmed. Boleh isi detail later.

Inline Invite

Selepas tambah orang, terus tanya: "Jemput dia guna app?" dengan pilihan WhatsApp / SMS / Link. Atau skip. Tak force, tapi nudge pada waktu yang betul.

Progress Indicator

Progress bar / counter: "6 orang direkodkan". Bagi sense of achievement. Milestone celebrations: "Tahniah! 10 ahli keluarga pertama!" Gamification ringan.

Auto bin/binti

Bila user tambah bapa "Ahmad", system auto-update nama penuh user dari "Razak" jadi "Razak bin Ahmad". Satisfying moment — user nampak data connect live.

4 Tree Views

Navigation Flow

Bottom nav 5 tab utama. Setiap tab serve purpose yang jelas.

Tab Fungsi Screens
🌳 Pokok Family tree views (4 modes) Focus View, Pedigree, List, Fan Chart + View Switcher
🔍 Cari Search & discovery Search by name, filter by generasi/kampung/negeri, Relationship Calculator ("dia siapa dengan aku?")
Tambah Quick add (FAB-style) Add Person, Add Marriage, Add Story, Add Photo. Context-aware — kalau tengah view orang, auto-link.
📖 Cerita Stories & warisan Timeline, Story cards, Audio recordings, Photo albums, Documents
👤 Profil Settings & account My families, Invites, Notifications, Wali Calculator, Faraid Calculator, Settings

Gestures & Interactions

Pinch to Zoom

Semua tree views support pinch zoom. InteractiveViewer dalam Flutter. Zoom out = nampak lebih ramai orang (nodes jadi kecil). Zoom in = detail.

Tap to Navigate

Tap mana-mana node = navigate ke orang tu. Tree re-center. Back button = balik ke orang sebelum. History stack macam browser.

Long Press

Long press node = quick actions popup: Edit, Add Child, Add Spouse, View Profile, Delete. Haptic feedback.

Swipe

Swipe left/right pada list items = quick edit / delete. Swipe between tree views (atau guna tab switcher).

Double Tap

Double tap node = terus buka full profile page. Shortcut daripada single tap (navigate) → tap lagi (profile).

Drag & Drop (Future)

Drag person node ke orang lain = create relationship. "Drag Ahmad ke Fatimah = add as spouse?" Confirmation dialog.

Flutter Implementation

Tree Rendering
CustomPainter + InteractiveViewer
Custom draw nodes + lines. InteractiveViewer = pinch zoom + pan. Best performance untuk large trees.
Fan Chart
CustomPainter + Canvas arcs
Draw concentric arcs. Each segment = one ancestor. Tap detection via hit testing.
List View
SliverList + SliverStickyHeader
Grouped by generation. Sticky headers. Lazy loading untuk performance.
Animations
AnimatedPositioned + Hero
Node transitions bila navigate. Hero animation dari list → profile. Smooth 60fps.
State Management
Riverpod
Family tree state, current person, view mode. Persist navigation history.
Offline
Drift (SQLite) + Supabase sync
Full tree cached locally. Sync bila online. Conflict resolution: last-write-wins + merge UI.

Prinsip Reka Bentuk

  1. Mak Cik Test Kalau Mak Cik umur 50 tahun tak boleh guna tanpa bantuan, UI tu gagal. Butang besar, teks jelas, flow simple. Jangan assume semua orang tech-savvy.
  2. Progressive Disclosure Jangan overwhelm user dengan semua field sekaligus. Mula dengan nama + jantina + parents sahaja. Detail lain (kampung, pekerjaan, bio) boleh tambah kemudian.
  3. Context-Aware Actions Kalau user tengah view Ahmad, "Tambah" button auto-suggest: "Tambah anak Ahmad?" atau "Tambah isteri Ahmad?". Bukan generic form.
  4. Nusantara Visual Identity Warna warm earth tones (emas, coklat, hijau). Motif batik/songket subtle. Typography yang support Jawi. Bukan copy paste Material Design default.
  5. Share-First Design Setiap view boleh screenshot & share ke WhatsApp. Fan chart particularly designed untuk jadi viral — "tengok family tree aku cantik!"

Pendekatan: PostgreSQL + Recursive Queries

Guna Supabase PostgreSQL dengan recursive CTE queries untuk traverse family tree. Lebih praktikal daripada graph DB (Neo4j) kerana:

  • Supabase = satu ecosystem (auth, storage, realtime, edge functions)
  • PostgreSQL recursive CTE cukup powerful untuk genealogy queries
  • RLS (Row Level Security) untuk protect data setiap keluarga
  • ltree extension untuk materialized path (faster ancestor/descendant queries)
  • Simpler ops — tak perlu maintain separate graph DB

Entity Relationship

families

Setiap "pokok salasilah" = satu family. Boleh ada ramai collaborators.

iduuid PK
nametextNama keluarga — cth: "Keluarga Haji Ahmad"
descriptiontextPenerangan ringkas keluarga
kampung_asaltextKampung asal keluarga
negeri_provinsitextNegeri (MY) / Provinsi (ID) / State
negaratextMY, ID, SG, BN, PH, TH, KH
etniktextMelayu, Jawa, Batak, Minang, Bugis, dll
lineage_typeenumpatrilineal | matrilineal | bilateral (default: patrilineal)
default_namingenumpatronymic | single | marga | suku | birth_order | surname
created_byuuid FK→ auth.users
privacyenumpublic | private | family_only
created_attimestamptz

persons

Setiap ahli keluarga = satu person. Flexible naming untuk semua budaya Nusantara.

iduuid PK
family_iduuid FK→ families (primary family)
-- NAMA (flexible) --
nama_penuhtextComputed / manual. Contoh: "Ahmad bin Abu", "Sukarno", "I Wayan Putu"
nama_peribaditextNama given — wajib isi. Cth: Ahmad, Sukarno, Wayan
nama_panggilantextNama biasa dipanggil
nama_rasmitextNama di IC/KTP/dokumen rasmi (kalau beza dari nama tradisional)
nama_jawitextNama dalam tulisan Jawi (optional)
naming_systemenumpatronymic | single | marga | suku | birth_order | title | tribal | surname
nama_connectorenumbin | binti | binte | a/l | a/p | d/o | s/o | anak | none
-- CLAN / TRIBE --
clan_nametextMarga (Batak), Suku (Minang), Tribe (Dayak), Marga (Bugis)
clan_typeenummarga | suku | tribe | caste | none
sub_clantextSub-marga Batak (14+ jenis), sub-suku, dll
-- GELARAN & TITLE --
gelarantextAuto: Pak Long, Mak Ngah, Teteh, Akang, Wayan, Made. Manual override.
gelaran_systemenummalay | sunda | java | bali | bugis | custom
titletextHaji, Datuk, Teuku, Cut, Andi, Daeng, Pengiran, I, Ni
-- IDENTITY --
jantinaenumlelaki | perempuan
tarikh_lahirdateNULL kalau tak tahu
tarikh_meninggaldateNULL kalau masih hidup
is_alivebooleanDefault true
birth_orderintAnak ke berapa (untuk auto-gelaran)
etniktextMelayu, Jawa, Sunda, Batak, Minang, Bugis, Bali, Dayak, Cham, dll
agamatextIslam, Hindu, Kristian, Katolik, Animisme, dll
negaratextMY, ID, SG, BN, PH, TH, KH
-- LOKASI --
kampung_asaltextKampung / desa asal
negeri_provinsitextNegeri (MY) / Provinsi (ID) / State
tempat_tinggaltextTempat tinggal sekarang
-- META --
pekerjaantextPekerjaan
biotextCerita ringkas / nota
photo_urltextProfile photo
lineage_typeenumpatrilineal | matrilineal | bilateral (default: patrilineal)
user_iduuid FK→ auth.users (kalau dia ada akaun)
added_byuuid FK→ auth.users (siapa masukkan data)
pathltreeMaterialized path untuk fast tree queries

marriages

Hubungan perkahwinan. Support poligami dan cerai.

iduuid PK
husband_iduuid FK→ persons
wife_iduuid FK→ persons
tarikh_nikahdate
tarikh_ceraidateNULL kalau masih berkahwin
statusenumberkahwin | cerai | meninggal
wali_iduuid FK→ persons (wali nikah)
tempat_nikahtextMasjid/lokasi
marriage_orderintIsteri ke-berapa (untuk suami)

parent_child

Hubungan ibu bapa — anak. Separate table untuk support anak angkat, anak tiri.

iduuid PK
parent_iduuid FK→ persons
child_iduuid FK→ persons
relation_typeenumbiological | adopted | step
marriage_iduuid FK→ marriages (anak dari perkahwinan mana)

family_members

Collaboration — siapa boleh edit family tree ni.

iduuid PK
family_iduuid FK→ families
user_iduuid FK→ auth.users
person_iduuid FK→ persons (user ni siapa dalam tree)
roleenumadmin | editor | viewer
invited_byuuid FK→ auth.users
statusenumpending | active | removed

stories

Cerita, kenangan, peristiwa — attach ke satu atau lebih persons.

iduuid PK
family_iduuid FK→ families
titletextTajuk cerita
contenttextCerita penuh (markdown)
story_datedateBila peristiwa ni berlaku
person_idsuuid[]Siapa terlibat
media_urlstext[]Gambar, audio, video
added_byuuid FK→ auth.users

Key Queries (Recursive CTE)

-- Cari semua keturunan (descendants)

WITH RECURSIVE descendants AS (
  SELECT child_id AS person_id, 1 AS generation
  FROM parent_child WHERE parent_id = :person_id
  UNION ALL
  SELECT pc.child_id, d.generation + 1
  FROM parent_child pc
  JOIN descendants d ON pc.parent_id = d.person_id
)
SELECT p.*, d.generation
FROM descendants d
JOIN persons p ON p.id = d.person_id
ORDER BY d.generation;

-- Cari leluhur (ancestors) ke atas

WITH RECURSIVE ancestors AS (
  SELECT parent_id AS person_id, 1 AS generation
  FROM parent_child WHERE child_id = :person_id
  UNION ALL
  SELECT pc.parent_id, a.generation + 1
  FROM parent_child pc
  JOIN ancestors a ON pc.child_id = a.person_id
)
SELECT p.*, a.generation
FROM ancestors a
JOIN persons p ON p.id = a.person_id
ORDER BY a.generation;

-- Auto-generate gelaran dari birth order

SELECT p.nama_panggilan,
  CASE p.jantina
    WHEN 'lelaki' THEN
      CASE p.birth_order
        WHEN 1 THEN 'Pak Long'
        WHEN 2 THEN 'Pak Ngah'
        WHEN 3 THEN 'Pak Lang'
        WHEN 4 THEN 'Pak Njang'
        WHEN 5 THEN 'Pak Cik'
        WHEN 6 THEN 'Pak Su'
        ELSE 'Pak ' || p.birth_order
      END
    WHEN 'perempuan' THEN
      CASE p.birth_order
        WHEN 1 THEN 'Mak Long'
        WHEN 2 THEN 'Mak Ngah'
        WHEN 3 THEN 'Mak Lang'
        WHEN 4 THEN 'Mak Njang'
        WHEN 5 THEN 'Mak Cik'
        WHEN 6 THEN 'Mak Su'
        ELSE 'Mak ' || p.birth_order
      END
  END AS gelaran
FROM persons p
WHERE p.family_id = :family_id
AND p.birth_order IS NOT NULL;

Tech Stack

Mobile App
Flutter (Dart)
iOS + Android dari satu codebase. Riverpod state management.
Backend / DB
Supabase
PostgreSQL + Auth + Storage + Realtime + Edge Functions
Tree Rendering
CustomPainter + InteractiveViewer
Custom draw nodes/lines. Pinch zoom, pan, 60fps. 4 view modes.
Local DB
Drift (SQLite)
Offline-first. Full tree cached locally. Sync ke Supabase bila online.
Map
flutter_map + OpenStreetMap
Kampung asal tagging, migration path visualization
Landing Page
Cloudflare Pages
leluhur.com — landing page + web preview. Vite + Tailwind.
Auth
Supabase Auth
Google + Apple Sign-In + Email/Password
Storage
Supabase Storage
Photos, documents, audio recordings. Per-family buckets.
PostgreSQL Extensions
ltree + pg_trgm
ltree = materialized path queries. pg_trgm = fuzzy name search.
State Management
Riverpod
Family tree state, navigation history, view mode, current person.
Supabase Org
Lan Todak Personal
Project akan dibuat dalam personal org
AI (Future)
Gemini / Claude
Face matching, OCR gambar lama, relationship suggestions

Architecture Overview

┌─────────────────────────────────────────────────┐
│              Flutter Mobile App                  │
│           (iOS + Android + Web)                  │
│                                                  │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐        │
│  │ Tree View│ │ Profiles │ │ Stories  │        │
│  │ (Custom  │ │  (CRUD)  │ │ (Media)  │        │
│  │ Painter) │ │          │ │          │        │
│  └────┬─────┘ └────┬─────┘ └────┬─────┘        │
│       └─────────────┼───────────┘                │
│              ┌──────┴──────┐                     │
│              │  Riverpod   │                     │
│              │   State     │                     │
│              └──────┬──────┘                     │
│        ┌────────────┼────────────┐               │
│   ┌────┴─────┐ ┌────┴─────┐                     │
│   │  Drift   │ │ Supabase │                     │
│   │ (SQLite) │ │  Client  │                     │
│   │  LOCAL   │ │  REMOTE  │                     │
│   └──────────┘ └────┬─────┘                     │
└─────────────────────┼───────────────────────────┘
                      │ HTTPS
┌─────────────────────┼───────────────────────────┐
│                 Supabase                         │
│  ┌─────────┐ ┌──────┴──────┐ ┌───────────┐     │
│  │  Auth   │ │ PostgreSQL  │ │  Storage   │     │
│  │ Google  │ │ + ltree     │ │  Photos    │     │
│  │ Apple   │ │ + pg_trgm   │ │  Audio     │     │
│  │ Email   │ │ + RLS       │ │  Docs      │     │
│  └─────────┘ └─────────────┘ └───────────┘     │
│  ┌──────────────────────────────────────┐       │
│  │         Edge Functions               │       │
│  │  - Wali Calculator                   │       │
│  │  - Faraid Calculator                 │       │
│  │  - Relationship Calculator           │       │
│  │  - Invite System                     │       │
│  │  - Gelaran Auto-Compute             │       │
│  │  - Exogamy Check                     │       │
│  └──────────────────────────────────────┘       │
└─────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────┐
│              leluhur.com                         │
│         (Cloudflare Pages)                       │
│  Landing page + App Store links + Web preview    │
└─────────────────────────────────────────────────┘
            

Kritikan Jujur & Blind Spots

Analisis kritikal terhadap plan kita — apa yang mungkin gagal, apa yang terlepas pandang, dan macamana nak address setiap satu. Sorted by severity.

⚠ Kritikal — Boleh Bunuh Project

1. Model Bisnes: Solo Contribution Project

CLARIFIED NON-COMMERCIAL
Ini solo project untuk contribute kepada masyarakat Nusantara, bukan startup commercial. Fokus = bina tool yang berguna, bukan buat duit. Supabase free tier cukup untuk permulaan. Kalau grow nanti, boleh consider donations / sponsorship / minimal hosting fees.
Kos estimation (free tier):
  • Supabase Free: 500MB DB, 1GB storage, 50K monthly active users — cukup untuk MVP
  • Cloudflare Pages: Free — unlimited bandwidth untuk landing page
  • App Store: Apple $99/year, Google $25 one-time
  • Domain: leluhur.com — sudah dibeli
  • Future kalau grow: Supabase Pro $25/mo, atau self-host PostgreSQL pada VPS

2. Empty Tree Problem (Cold Start)

KILLER 90% DROP-OFF
User download app → buka → nampak... KOSONG. Tiada siapa dalam tree. Kena mula dari zero. Ini biggest drop-off point untuk genealogy apps. Research tunjuk majority users abandon app bila confronted dengan blank canvas. Kita assume orang akan rajin isi 50 ahli keluarga — tapi realitinya, kebanyakan orang tak tahu nama penuh datuk pun.
Penyelesaian:
  • Guided onboarding: "Mula dengan ANDA" → auto-create node → "Siapa bapa anda?" → "Siapa ibu anda?" → guided wizard 5 minit untuk isi 5-7 orang pertama
  • AI-assisted: "Saya ada gambar family tree lama" → OCR scan → auto-populate. "Saya ada senarai nama" → paste text → AI parse nama + hubungan
  • GEDCOM import: Kalau user dah ada data di Geni/FamilySearch, boleh import terus. Industry standard format.
  • Template trees: "Keluarga Melayu tipikal — 3 generasi" → pre-filled template, user just rename
  • Quick Win: Selepas isi 3 orang pertama, terus tunjuk tree visualization — biar user nampak "wow cantiknya" dan termotivasi nak isi lagi

3. Privasi & Undang-Undang (PDPA/UU PDP)

LEGAL RISK BOLEH KENA SAMAN
Kita simpan data SANGAT sensitif — nama penuh, tarikh lahir, hubungan keluarga, perceraian, anak luar nikah, gambar, alamat. Malaysia ada PDPA 2010, Indonesia ada UU PDP 2024 (lebih strict). Isu-isu:
  • User A masukkan data User B tanpa consent B — boleh ke?
  • Anak luar nikah atau perceraian = data sensitif. Siapa boleh nampak?
  • Data kanak-kanak (bawah 18) = perlukan consent ibu bapa
  • Orang meninggal — siapa "own" data mereka? Boleh ke waris minta delete?
  • Right to erasure — user nak delete diri dari tree, tapi dia connected ke 20 orang lain
Penyelesaian:
  • Consent framework: Bila invite, explain clearly data apa yang dikongsi. Opt-in, bukan opt-out.
  • Privacy tiers: Public profile (nama + gelaran) vs Private details (tarikh lahir, alamat, social links) — user control mana yang visible
  • Sensitive data flags: Perceraian, anak luar nikah, adoption = auto-hide by default. Hanya admin nampak.
  • "Ghost mode": User boleh remove diri dari tree — node jadi anonymous ("Ahli Keluarga") tapi links kekal intact
  • Data deletion: Full delete option dengan 30-day grace period. Cascade rules yang jelas.
  • Privacy policy: Khas untuk genealogy. Bukan copy-paste generic template.
  • Data residency: Supabase region = Singapore (ap-southeast-1). Data stays in SEA.

⚠ Tinggi — Boleh Rosakkan Experience

4. Data Quality: Siapa Yang Betul?

HIGH
Pak Cik kata datuk lahir 1932. Mak Cik kata 1935. Siapa betul? Bila ramai orang edit satu tree, data conflicts PASTI berlaku. Tanpa system yang handle ini, tree jadi unreliable dan orang hilang trust.

Lagi: orang tua kadang tak ingat exact date — "lepas perang" atau "masa Jepun datang". App kena boleh handle uncertain dates.
Penyelesaian:
  • Date precision levels: Exact (12 Mac 1932) / Month (Mac 1932) / Year (1932) / Decade (~1930s) / Era ("sebelum perang") / Unknown
  • Confidence scoring: Data dari IC/surat beranak = high confidence. Data dari cerita lisan = medium. Data dari tekaan = low.
  • Source attribution: Setiap data point ada "sumber" — siapa masukkan, bila, based on apa (dokumen / cerita / tekaan)
  • Conflict resolution UI: "2 maklumat berbeza untuk tarikh lahir Datuk. Pilih mana satu, atau simpan kedua-dua sebagai alternatif."
  • Edit history: Full audit trail — siapa tukar apa, bila. Boleh revert.

5. Duplicate Persons & Tree Merging

HIGH
Keluarga A dan Keluarga B build tree masing-masing. Rupanya ada shared ancestor — datuk yang sama. Sekarang kena merge. Ini NIGHTMARISH problem yang Geni dan FamilySearch pun still struggle. False positives (merge orang yang salah) destroy data. False negatives (miss duplicates) create phantom copies.

Lagi teruk: nama Melayu tanpa surname = "Ahmad bin Abu" boleh refer 1000 orang berbeza.
Penyelesaian:
  • Smart suggestions: "Ahmad bin Abu (lahir ~1935, Johor) mungkin sama dengan Ahmad bin Abu (lahir 1935, Kg Parit Raja) dalam tree Keluarga Hassan. Merge?"
  • Multi-factor matching: Nama + tarikh lahir + kampung + parents' names. Bukan nama sahaja.
  • Preview before merge: Side-by-side comparison. Show exactly what changes. NEVER auto-merge.
  • Reversible merges: Undo merge within 30 days. Full snapshot before merge saved.
  • Cross-family discovery: "Seseorang dalam Keluarga Hassan mungkin saudara anda." Both family admins kena approve connection.

6. Offline Sync Conflicts

HIGH
Plan kita = offline-first (Drift/SQLite). Tapi apa jadi bila User A edit "Ahmad lahir 1932" offline, dan User B edit "Ahmad lahir 1935" offline, kemudian BOTH sync? Classic distributed systems problem. Last-write-wins = data loss.
Penyelesaian:
  • Field-level sync: Bukan row-level. Kalau A tukar tarikh lahir dan B tukar kampung = no conflict (merge both).
  • Conflict UI: Kalau same field conflict → show both versions, ask user to pick. "Razak tukar tarikh lahir ke 1932. Ali tukar ke 1935. Mana satu betul?"
  • Timestamps + vector clocks: Track exact edit time. More recent = suggested default, tapi user tetap pilih.
  • Auto-resolve safe changes: New person added = auto-merge. Delete = flag for admin review (jangan auto-delete).

7. Scalability: Extended Family Explosion

HIGH
Keluarga Nusantara = BESAR. Datuk kahwin 2 isteri, ada 15 anak. Setiap anak ada 5-8 anak. Generasi 3 = 100+ orang. Generasi 4 = 500+ orang. CustomPainter rendering 500 nodes on Flutter = performance issue. Recursive SQL queries on 10K rows = slow.
Penyelesaian:
  • Lazy loading: Render only visible nodes. Expand on demand. Collapse distant branches automatically.
  • Level-of-detail: Zoom out = nodes jadi dots. Zoom in = full detail. Macam Google Maps.
  • ltree index: PostgreSQL ltree = O(log n) ancestor/descendant queries, bukan O(n) recursive CTE.
  • Pagination: List view paginated. Tree view load max 3 generations at a time.
  • Caching: Tree structure cached locally. Only sync deltas, bukan full reload.

⚠ Sederhana — Perlu Address Tapi Tak Urgent

8. GEDCOM Import/Export (Data Portability)

MISSING
GEDCOM = industry standard format untuk genealogy data. Kalau user dah ada tree di Geni/FamilySearch/MyHeritage, dia nak IMPORT masuk. Dan kalau dia nak tinggalkan Leluhur, dia kena boleh EXPORT data keluar. Tanpa GEDCOM support = data lock-in (user tak suka) dan no migration path (user tak nak mula dari kosong).
Penyelesaian: GEDCOM 5.5.1 import (parse file → map to our schema) + GEDCOM export. Kena handle Nusantara-specific fields yang GEDCOM tak support natively (marga, suku, gelaran) — extend with custom tags.

9. Moderation & Dispute Resolution

MISSING
Apa jadi bila:
  • Seseorang masukkan maklumat palsu / fitnah tentang ahli keluarga?
  • Dua branch keluarga berbalah dan masing-masing claim data berbeza?
  • Ex-spouse nak delete / vandalise bekas pasangan dari tree?
  • Orang luar (bukan ahli keluarga) claim profile yang bukan dia?
Penyelesaian:
  • Report system: Flag content as false / inappropriate / sensitive
  • Admin approval: Sensitive changes (delete person, change parents, mark as deceased) require admin approval
  • Lock profiles: Claimed profiles (linked to real user) cannot be edited by others tanpa approval
  • Activity log: Full audit trail — transparency sebagai deterrent

10. Accessibility: Orang Kampung & Orang Tua

UNDERESTIMATED
Target user kita termasuk orang tua di kampung yang:
  • Phone murah (2GB RAM, slow processor)
  • Internet slow / intermittent (3G di pedalaman)
  • Mata rabun — text kecil tak nampak
  • Tak biasa guna app — UI complex = abandon
  • Lebih selesa cakap dari menulis — voice input?
Penyelesaian:
  • Lite mode: Reduced graphics, no animations, smaller images. Auto-detect low-end device.
  • Font size setting: 3 sizes — Normal, Besar, Sangat Besar
  • Voice input: "Sebut nama" → speech-to-text untuk isi form. Supabase Edge Function → Whisper/Gemini.
  • Offline-first: Already planned, tapi kena test on 3G. Target: usable on 500kbps.
  • Simple mode: Simplified UI untuk first-time users. Hide advanced features behind "Lagi" menu.

11. Backup & Disaster Recovery

MISSING
Supabase free/pro tier = daily backups tapi only 7 days retention. Kalau data corrupt / accidentally deleted, dan kita tak perasan dalam 7 hari = GONE. User punya kerja bertahun-tahun hilang. Trust = destroyed forever.
Penyelesaian:
  • User-initiated export: "Download salinan data anda" → JSON + images ZIP. Anytime.
  • Auto-backup: Weekly backup ke Supabase Storage (separate bucket) atau user's Google Drive.
  • Soft delete: SEMUA delete = soft delete (status: archived). Hard delete hanya selepas 90 hari.
  • Local cache = implicit backup: Drift SQLite db is a full backup on user's device.

12. Competitive Moat: Kenapa Bukan Guna Geni Je?

BUSINESS RISK
FamilySearch = free, massive database, backed by billions. Geni = established, 200M profiles. Kalau depa tambah Malay naming support esok, kita mati. Apa competitive moat kita yang SUSTAINABLE?
Penyelesaian — 5 Moats:
  • Cultural depth: Bukan sekadar "tambah bin/binti field". Kita faham gelaran, wali nikah, faraid, marga, suku, Jawi — ini bertahun-tahun cultural knowledge yang Western company tak boleh copy overnight.
  • Language: BM + BI native, bukan terjemahan Google. UX dalam bahasa yang mak cik faham.
  • Network effects local: Bila satu keluarga Melayu join, mereka invite keluarga Melayu lain. Network grows within community. Geni's network = Western-centric.
  • Islamic tools: Wali nikah + faraid = killer features yang takde competitor offer. Real practical value.
  • Mobile-first: Geni/FamilySearch = web-first, mobile = afterthought. Kita = Flutter-native, designed for SEA mobile-first market.

ⓘ Rendah — Nice to Know

13. Platform Risk: Dependency on Supabase

100% backend on Supabase. Kalau Supabase shutdown, raise prices, atau degrade service? Mitigation: standard PostgreSQL underneath — boleh migrate. Drift local DB = data selamat on device.

14. App Store Approval: Sensitive Content

App yang handle data kanak-kanak, family relationships, religious calculations — Apple/Google mungkin scrutinize lebih. Mitigation: privacy policy solid, age-gating, clear data usage disclosure upfront.

15. Scope Creep: Terlalu Banyak Features

Plan kita sekarang ada 9 naming systems, 7 countries, 4 tree views, 6 invite channels, 6 reminder types, wali calculator, faraid calculator, social profiles, stories, audio recording, map view, fan chart... Ini BANYAK untuk v1. Risk: build forever, launch never. Mitigation: ruthless prioritization. MVP = Focus View + Add Person + Invite via WhatsApp + Birthday Reminder. Semua lain = post-launch.

Scorecard: Apa Yang Plan Kita Dah Cover vs Belum

Area Status Nota
Naming systems (Nusantara) ✓ Covered 9 systems, data model updated
Tree visualization ✓ Covered 4 views dengan mockups
Complex families ✓ Covered Poligami, cerai, anak tiri/angkat
Invite system ✓ Covered 6 channels + flow + claim profile
Reminders ✓ Covered Birthday, anniversary, haul, custom
Social profiles ✓ Covered 9 platforms + privacy control
Business model ✓ Clarified Solo contribution project. Non-commercial. Supabase free tier cukup.
Privacy & legal ✗ Baru ditambah PDPA + UU PDP compliance framework. Perlu lawyer review.
Cold start / onboarding ✗ Baru ditambah Guided wizard + AI assist + GEDCOM import
Data quality & conflicts ✗ Baru ditambah Confidence scoring, source attribution, conflict UI
Merge & deduplication ✗ Baru ditambah Cross-family matching + reversible merge
GEDCOM import/export ✗ Baru ditambah Industry standard. Critical for migration.
Moderation & disputes ✗ Baru ditambah Report system, admin approval, lock profiles
Accessibility ✗ Baru ditambah Lite mode, font size, voice input, 3G support
Backup & recovery ✗ Baru ditambah User export, auto-backup, soft delete 90 days

Verdict

Plan kita kuat pada features dan cultural depth. Sebagai solo contribution project, fokus utama = bina tool yang berguna untuk masyarakat Nusantara. Gaps teknikal (privacy, data quality, onboarding, sync) dah di-address. Empty state problem solved dengan skeleton tree + progressive disclosure. Ready untuk mula build.

Milestone Tracker

8 fasa pembangunan. Tick item yang dah siap.

Fasa 1: Foundation

CURRENT
  • Beli domain leluhur.com
  • Project plan (dokumen ini)
  • Setup React + Vite project
  • Create Supabase project
  • Database schema (migration)
  • Setup Cloudflare Pages
  • Basic auth (Google + Email)
  • Landing page

Fasa 2: Core Family Tree

NEXT
  • Create family (nama, kampung asal)
  • Add person (nama, bin/binti, jantina, tarikh)
  • Link parent-child relationships
  • Link marriages
  • Basic tree visualization (D3.js)
  • Person profile page
  • Edit / delete person
  • Auto bin/binti generation
  • Auto gelaran from birth order

Fasa 3: Collaboration

PLANNED
  • Invite family members (email/link)
  • Role-based access (admin/editor/viewer)
  • Approve new person additions
  • Activity log (siapa edit apa)
  • Realtime updates (Supabase Realtime)
  • Merge duplicate persons

Fasa 4: Ciri Unik Melayu

PLANNED
  • Relationship calculator (BM)
  • Wali nikah calculator
  • Faraid calculator
  • Kampung asal map view
  • Migration path visualization

Fasa 5: Cerita & Warisan

PLANNED
  • Stories CRUD (cerita + gambar)
  • Audio recording dalam app
  • Photo album per event
  • Tag persons dalam stories
  • Timeline view
  • Document upload (IC, surat nikah)

Fasa 6: Search & Discovery

PLANNED
  • Fuzzy name search (pg_trgm)
  • Filter by kampung / negeri / generation
  • Statistics dashboard (berapa ahli, generasi, etc.)
  • Birthday reminders
  • Anniversary reminders

Fasa 7: Polish & Launch

PLANNED
  • Responsive design (mobile-friendly)
  • PWA support (install as app)
  • SEO & Open Graph
  • Onboarding tutorial
  • Privacy policy & terms
  • Beta testing dengan keluarga sendiri
  • Public launch

Fasa 8: Future (Post-Launch)

FUTURE
  • Flutter mobile app
  • Export family tree (PDF/poster)
  • DNA integration
  • AI face matching
  • Multi-family tree linking
  • Premium tier