@@ -58,7 +66,7 @@
{r.asset.description}{r.ownedValue.toLocaleString()} · {CHANNEL_LABELS[r.channel]}
{#if suggestion}
- Next step: {suggestion.label} — go to {suggestion.channel === 'trust' ? 'a legal advisor for trust setup' : 'Nomination Registry'} or {r.asset.type?.toLowerCase().includes('property') ? 'Hibah/Waqf' : 'Hibah'}.
+ Next step: {suggestion.label} — go to {NEXT_STEP_TAB[suggestion.channel] || 'Nomination Registry'}.
{/if}
diff --git a/src/lib/DeathTrigger.svelte b/src/lib/DeathTrigger.svelte
index 5dce845..6f15fa5 100644
--- a/src/lib/DeathTrigger.svelte
+++ b/src/lib/DeathTrigger.svelte
@@ -79,6 +79,8 @@
? 'ACTION: Notify the bank with the death certificate and the death-mandate /\njoint-account documentation on file. Funds release per the mandate terms — this\nis a bank process, not a court process.'
: row.channel === 'business-continuity'
? 'ACTION: Execute the pre-agreed buy-sell provision or partnership continuation\nclause on file. If Takaful-funded, file the Takaful death claim to release the\nbuyout funds. This is a private agreement between co-owners/shareholders, not a\nprobate filing.'
+ : row.channel === 'digital-custody'
+ ? 'ACTION: File the death claim with the custodial platform\'s own beneficiary\nfeature, or have the named multi-sig co-signer/key-escrow holder execute access\nper the plan on file. This is a platform or private-key process, not a probate\nfiling — and never requires disclosing a seed phrase to this app.'
: 'ACTION: Contact the trustee/nominee holder to execute the pre-arranged transfer\nunder the trust deed. This is an internal trustee record update, not a probate\nfiling.',
'',
'This packet was generated by Nur Falah on a local device. It is a drafting aid;',
diff --git a/src/lib/NominationRegistry.svelte b/src/lib/NominationRegistry.svelte
index fbc9bb3..eb2ad80 100644
--- a/src/lib/NominationRegistry.svelte
+++ b/src/lib/NominationRegistry.svelte
@@ -20,7 +20,14 @@
{ value: 'takaful', label: 'Takaful / insurance nomination', note: 'Nomination as trust under Insurance Act 1996 s.166 (or Takaful equivalent) — pays the named beneficiary directly.' },
{ value: 'bank-mandate', label: 'Bank death mandate / joint account', note: 'Ask the bank for a death-benefit nomination, or hold as joint account with survivorship.' },
{ value: 'trust', label: 'Pre-funded trust / nominee holding', note: 'For land or illiquid assets with no nomination bypass — requires setting up a real trust or nominee entity now, while alive.' },
- { value: 'business-continuity', label: 'Business continuity instrument', note: 'A business dies with its structure by default: a sole proprietorship dies with the owner, a partnership dissolves on any partner\'s death unless the agreement says otherwise, and company shares fall into probate like any other asset unless a buy-sell or shareholder agreement already routes them.' }
+ { value: 'business-continuity', label: 'Business continuity instrument', note: 'A business dies with its structure by default: a sole proprietorship dies with the owner, a partnership dissolves on any partner\'s death unless the agreement says otherwise, and company shares fall into probate like any other asset unless a buy-sell or shareholder agreement already routes them.' },
+ { value: 'digital-custody', label: 'Digital custody plan', note: 'A single seed phrase known only to you is not a fast path — it is a total-loss risk if you die without sharing it. Use the exchange\'s own beneficiary feature where one exists, or a multi-sig / key-escrow arrangement with your executor for self-custody wallets.' }
+ ];
+
+ const CUSTODY_TYPES = [
+ { value: 'exchange-beneficiary', label: 'Custodial exchange beneficiary feature', warning: null },
+ { value: 'multisig', label: 'Self-custody multi-sig wallet', warning: 'Multi-sig only works if the co-signers are set up and able to act now — an executor who is a co-signer can release funds without waiting for probate, but only if the wallet was actually configured this way while you were alive.' },
+ { value: 'key-escrow', label: 'Key-escrow with executor', warning: 'Never store the actual seed phrase or private key in this app or any single record your executor can\'t independently verify. This field should reference WHERE the key is escrowed (e.g. a sealed instruction with a lawyer, a hardware device with split-knowledge access) — not the key itself.' }
];
const BUSINESS_STRUCTURES = [
@@ -34,7 +41,7 @@
{ value: 'waqf-enterprise', label: 'Dedicate as waqf-owned enterprise', note: 'Use the Family Waqf Designator for this instead — a waqf-owned enterprise survives you and serves your purpose in perpetuity, same as any other waqf corpus.' }
];
- const emptyForm = () => ({ linkedAssetId: '', type: 'epf', institution: '', nomineeeName: '', referenceNumber: '', trusteeName: '', successorTrustee: '', trustBeneficiaries: '', businessStructure: 'company', businessInstrument: 'shareholder-buy-sell', successorOwner: '', buySellTerms: '' });
+ const emptyForm = () => ({ linkedAssetId: '', type: 'epf', institution: '', nomineeeName: '', referenceNumber: '', trusteeName: '', successorTrustee: '', trustBeneficiaries: '', businessStructure: 'company', businessInstrument: 'shareholder-buy-sell', successorOwner: '', buySellTerms: '', custodyType: 'exchange-beneficiary', platform: '', keyHolderName: '', accessInstructionsRef: '' });
let nominations = $state(load('nominations', []));
let form = $state(emptyForm());
@@ -46,6 +53,8 @@
} else if (form.type === 'business-continuity') {
if (form.businessInstrument === 'waqf-enterprise') return; // redirect only, nothing to save here
if (!form.successorOwner) return;
+ } else if (form.type === 'digital-custody') {
+ if (!form.keyHolderName) return;
} else if (!form.nomineeeName) {
return;
}
@@ -85,6 +94,37 @@
URL.revokeObjectURL(url);
}
+ function exportDigitalCustody(n) {
+ const asset = assets.find(a => a.id === n.linkedAssetId);
+ const custodyLabel = CUSTODY_TYPES.find(c => c.value === n.custodyType)?.label;
+ const lines = [
+ 'DIGITAL CUSTODY PLAN — DRAFTING AID',
+ `Generated: ${new Date().toISOString().slice(0, 10)}`,
+ `Asset: ${asset ? asset.description : '(asset removed)'}`,
+ `Platform / wallet: ${n.platform || '________________________'}`,
+ `Custody type: ${custodyLabel}`,
+ `Key holder / executor: ${n.keyHolderName}`,
+ `Access instructions reference: ${n.accessInstructionsRef || '________________________'}`,
+ '',
+ n.custodyType === 'exchange-beneficiary'
+ ? 'ACTION: File the death claim directly with the exchange/custodial platform using\nits own beneficiary/inheritance feature. This is a platform process, not a\nprobate filing — confirm the feature is actually activated on the account now,\nwhile you\'re alive, not assumed to exist.'
+ : n.custodyType === 'multisig'
+ ? 'ACTION: The named co-signer(s) release funds per the wallet\'s multi-sig\nconfiguration once death is confirmed. This only works if the multi-sig was\nactually set up with a living co-signer — a single-key wallet has no fast path\nat all.'
+ : 'ACTION: Retrieve the escrowed access instructions from wherever they are held\n(named above) and follow them to access the wallet. This app does not, and must\nnot, store the seed phrase or private key itself.',
+ '',
+ 'WARNING: never enter an actual seed phrase, private key, or password into this',
+ 'app or any single document. This drafting aid should only ever reference WHERE',
+ 'access is arranged, never the credential itself.',
+ '',
+ 'DISCLAIMER: Not a fatwa. Not legal advice. Drafting aid only.'
+ ];
+ const blob = new Blob([lines.join('\n')], { type: 'text/plain' });
+ const url = URL.createObjectURL(blob);
+ const a = document.createElement('a');
+ a.href = url; a.download = 'digital-custody-plan-draft.txt'; a.click();
+ URL.revokeObjectURL(url);
+ }
+
function exportTrustDeed(n) {
const asset = assets.find(a => a.id === n.linkedAssetId);
const lines = [
@@ -178,12 +218,26 @@
{/if}
+ {:else if form.type === 'digital-custody'}
+
diff --git a/src/lib/nonprobate.js b/src/lib/nonprobate.js
index 9f85259..758124f 100644
--- a/src/lib/nonprobate.js
+++ b/src/lib/nonprobate.js
@@ -64,7 +64,8 @@ export function suggestedChannel(assetType) {
const t = (assetType || '').toLowerCase();
if (t.includes('cash') || t.includes('bank')) return { channel: 'bank-mandate', label: 'Bank death mandate / joint account', note: 'Ask your bank about a death-benefit nomination or convert to a joint account with survivorship — pays out directly, no probate.' };
if (t.includes('business')) return { channel: 'business-continuity', label: 'Business continuity instrument', note: 'A sole proprietorship dies with you; a partnership dissolves on death unless it has a continuation clause; company shares fall into probate unless a shareholder buy-sell agreement already routes them. Set up in the Nomination Registry, or dedicate as a waqf-owned enterprise via Family Waqf Designator.' };
- if (t.includes('digital')) return { channel: 'bank-mandate', label: 'Multi-sig / pre-authorized release', note: 'Crypto and digital accounts: use a multi-sig wallet or exchange beneficiary feature where available.' };
- if (t.includes('property') || t.includes('vehicle') || t.includes('jewelry') || t.includes('valuables')) return { channel: 'trust', label: 'Pre-funded trust / nominee holding, or Hibah/Waqf now', note: 'Land and physical assets have no nomination-based bypass in most jurisdictions. Either complete a Hibah/Waqf now (ownership transfers immediately), or set up a trust/nominee holding structure — both require real-world legal steps this app can prepare paperwork for but cannot execute alone.' };
+ if (t.includes('digital')) return { channel: 'digital-custody', label: 'Digital custody plan (multi-sig / exchange beneficiary / key escrow)', note: 'Custodial exchange accounts often have a built-in beneficiary/inheritance feature — use it directly. Self-custody wallets need a multi-sig setup or a key-escrow arrangement with your executor; a single seed phrase known only to you is not a fast path, it is a total-loss risk.' };
+ if (t.includes('vehicle') || t.includes('jewelry') || t.includes('valuables')) return { channel: 'hibah', label: 'Hibah — lifetime gift now', note: 'Movable property like this transfers cleanly by Hibah — offer, acceptance, and possession, done today. No trust or nomination structure is needed for something this easy to hand over while you\'re alive.' };
+ if (t.includes('property')) return { channel: 'trust', label: 'Pre-funded trust / nominee holding, or Hibah/Waqf now', note: 'Land has no nomination-based bypass in most jurisdictions. Either complete a Hibah/Waqf now (ownership transfers immediately), or set up a trust/nominee holding structure — both require real-world legal steps this app can prepare paperwork for but cannot execute alone.' };
return { channel: 'nomination', label: 'EPF / Takaful nomination', note: 'For retirement funds and insurance/takaful, use the scheme\'s own nomination form — these pay the nominee directly by law, bypassing probate.' };
}