Big round covering two different asks: Khairat/emergency infrastructure
(tightly coupled to what's already built) and a Muslim-lifestyle
companion surface (a genuinely different product, added at the user's
explicit request after being offered a smaller scope).
Khairat & emergency contacts:
- nf_khairat_memberships (per-member scheme membership) + nf_emergency_fund
(per-family shared reserve tracker) — records intent/contacts only,
never holds or moves real money.
- nf_trusted_contacts gains category (mosque/police/ambulance/hospital/
khairat/family/other) and email columns.
- New notify-emergency-contacts Edge Function, auto-invoked the moment a
mutawalli fires a member's death trigger (the one place in this app
where auto-send-on-trigger is actually correct), alongside — not
instead of — the existing heir notification. Verified with a live fire
end-to-end (e2e-emergency-notify.cjs, 5/5).
Lifestyle-companion tabs — all computed/searched live, nothing fabricated:
- Qibla: pure great-circle bearing math to the Kaaba from geolocation,
no API/key. Verified against Kuala Lumpur (293°, matches expected ~292°).
- Prayer Times: client-side astronomical calculation (single-pass solar
position, MWL angles), sanity-checked against known KL/London times
before shipping.
- Locate: mosque/halal/cemetery search via the free, keyless OpenStreetMap
Overpass API — real community-sourced results only, honest empty state
when nothing's mapped nearby.
- Quran: Surah list + Arabic/translation via the free alquran.cloud API,
fetched fresh each time, nothing stored in this app's own database.
- Neighbourhood: a join-by-code community announcement board — a
genuinely separate multi-tenant concept from the estate-planning family
structure, scoped to the user account. Found and fixed a real UX gap
during testing: the create/join form was only reachable with zero
existing neighbourhoods, with no way to join a second one.
Also found and fixed a real bug: the heir-notify and emergency-notify
status messages shared the same CSS class, breaking any script (including
the pre-existing e2e-per-member.cjs) that targeted '.notify-status'
without further filtering — gave each its own distinguishing class.
Covered by e2e-khairat-lifestyle.cjs (13/13) and e2e-emergency-notify.cjs
(5/5). Full regression: 316/316 across all suites (several transient
flakes under heavy mail-relay load during the sweep, all confirmed clean
on rerun — one led to the real class-collision fix above).
Closes the 4th and final gap from the competitive benchmark: the
human-in-the-loop professional tier every commercial competitor pairs
with their software. Deliberately NOT a marketplace or payment
integration — a structured review-request status on each member's
Wassiyah (not_requested -> requested -> reviewed, with reviewer name
recorded), surfaced on the Mutawalli dashboard so nothing quietly ships
as final without the legally-required review being flagged.
Paired with a new whole-app jurisdiction setting since 'necessary in
certain countries' only makes sense per-jurisdiction:
- nf_families.jurisdiction (MY/SG/UK), owner-only to change — first
UPDATE policy ever added to nf_families, which previously had none.
- New Settings-tab jurisdiction selector (JurisdictionSetting.svelte).
- Wassiyah tab and the draft will document now carry jurisdiction-
specific legal notes: Wills Act 1959 + state Syariah (Malaysia),
Wills Act 1838 + AMLA (Singapore), Wills Act 1837 (UK). Singapore
added as a full third jurisdiction option, not just a stub.
- Zakat calculator's currency label and Nisab default now follow the
family's jurisdiction (RM/SGD/GBP) instead of a hardcoded RM guess.
Covered by e2e-jurisdiction-review.cjs (13/13). Full regression:
253/253 across all suites (2 reruns confirmed as pre-existing
parallel-load flakes, not regressions).
Closes 3 of the remaining 4 gaps from the competitive benchmark:
- Coverage Dashboard now has a rule-based recommendations engine
(recommendations.js) surfacing plain-language next steps from data
already in the app — exposed assets, missing Wassiyah, unverified
assets, unlinked liabilities, missing insurance/Zakat setup,
insufficient attestors, no agent assigned, no Waqf configured.
- Faraid Calculator gains a madhab selector (Shafi'i/Hanafi/Maliki/
Hanbali) encoding the one well-documented divergence this engine's
existing rules touch: whether radd extends to a sole-heir spouse
(Hanafi: yes; Shafi'i/Maliki/Hanbali: no, residue unallocated).
Ja'fari (Shia) is honestly gated as unsupported rather than silently
computed with Sunni rules, since it's a structurally different
classification system, not a parameter tweak. faraid.test.js grows
from 14 to 17 cases covering the divergence and the gating.
- Wassiyah tab gains a 'Generate draft will document' button producing
a formatted, statutory-style DRAFT will (declaration/revocation,
executor appointment, bequest schedule, witness attestation blocks)
via browser print-to-PDF — no new PDF dependency. Clearly watermarked
'DRAFT — NOT EXECUTED, requires physical signing and witnessing.'
Not a claim of legal validity, a lawyer-reviewable starting point.
The 4th gap (human-in-the-loop professional tier) remains open — out
of scope for a self-serve prevention tool. COMPETITIVE_BENCHMARK.md
updated to reflect closed/partially-closed status on each item.
Covered by e2e-gaps-round2.cjs (14/14) plus 3 new faraid.test.js cases.
Full regression: 226/226 across all suites.
Closes the Zakat gap identified in the competitive benchmark against
Rafiq. Per-member module (nf_zakat_records, same author-owns/family-reads
RLS pattern as Insurance/Wassiyah/Waqf) computing 2.5% due on zakatable
wealth (cash, gold, silver, business assets, investments) once above a
user-entered Nisab threshold, minus deductible short-term liabilities.
Manual entry only, matching the app's existing philosophy — no live gold
price feed. Covered by e2e-zakat.cjs (7/7).
Svelte 5 + Vite PWA, styled to match moslem03.falahos.my's design system.
Horizon 1: Faraid Calculator (shared calc core, 14 classical cases passing),
Asset Registry, Wassiyah Generator (1/3 meter + heir-exclusion block),
Hibah Tracker and Family Waqf Designator (shared marad al-mawt guardrail).
Horizon 2: Digital Beneficial Claims — local non-custodial demo of the claim
model and transfer restriction only.
Two governance gates in this project's own PRDs were overridden per explicit
product direction, and are flagged in-app and in README.md / deploy/DEPLOY.md
rather than silently shipped as production-ready:
- Family Waqf Designator ships ahead of scholarly sign-off (OPEN-01 in
scholarly-review-log.md remains unresolved).
- Horizon 2 ships ahead of the PRD's stated Phase 0 gate (legal opinion +
signed institutional partner) with no confirmation that gate is cleared.