Veydrin Financial Data Standard
The portable, privacy-preserving data format for household financial sovereignty and trust lifecycle data. Offline-first, encrypted, local-only by design.
VFDS defines the portable data format for household financial sovereignty and trust lifecycle data. It is a domain specialization of VODS (Veydrin Open Data Standard) and inherits its privacy contract, versioning conventions, and export envelope.
VFDS covers the full financial picture of an individual, household, or trust — including cash flow, net worth, debt, wealth holdings, insurance, goals, and the complete trust ownership hierarchy. All data is structured for offline-first, encrypted, local-only storage. No fields assume network connectivity or cloud persistence.
org.ninthstar.nemorith (Nemorith) by the Ninth Star Foundation is the reference implementation of VFDS v1.0.0.
A VFDS export is a valid VODS document. The VODS envelope wraps all VFDS content:
{
"vods_version": "1.0.0",
"standard": "vfds",
"standard_version": "1.0.0",
"exported_at": "2026-03-11T00:00:00Z",
"app_id": "org.ninthstar.nemorith",
"app_version": "0.1.0",
"payload": { /* VFDS root structure */ }
}
2026-03-11T14:23:00Z)double in the smallest expressible unit of the stated currency? suffix denotes optional/nullable fields{
"vfds_version": "1.0.0",
"exported_at": "<ISO 8601>",
"app_version": "<string>",
"vault": { },
"flow": { },
"position": { },
"debt": { },
"wealth": { },
"protection": { },
"goals": { },
"milestones": [ ],
"notifications": [ ],
"settings": { }
}
| Field | Type | Description |
|---|---|---|
vfds_version | string | Spec version (semver) |
exported_at | ISO 8601 | Export timestamp |
app_version | string | Nemorith build version |
vault | object | Top-level vault container |
flow | object | Cash flow layer |
position | object | Net worth layer |
debt | object | Debt management layer |
wealth | object | Portfolio/holdings layer |
protection | object | Insurance layer |
goals | object | Financial goals layer |
milestones | array | Cross-layer milestone records |
notifications | array | Activity and audit log |
settings | object | App preferences |
The vault is the root container. All financial data, members, documents, and the ownership tree belong to a vault.
{
"id": "<uuid>",
"name": "<string>",
"tier": "<VaultTier>",
"base_currency_code": "<ISO 4217>",
"trust_type": "<TrustType?>",
"lifecycle_stage": "<LifecycleStage?>",
"created_at": "<ISO 8601>",
"updated_at": "<ISO 8601>",
"members": [ ],
"role_permissions": [ ],
"documents": [ ],
"ownership_entities": [ ]
}
| Field | Type | Req? | Description |
|---|---|---|---|
id | string | req | UUID |
name | string | req | Display name |
tier | VaultTier | req | Vault tier (see enum) |
base_currency_code | string | req | ISO 4217 base currency |
trust_type | TrustType? | trust tier | Trust subtype |
lifecycle_stage | LifecycleStage? | trust tier | Current trust stage |
created_at | ISO 8601 | req | Creation timestamp |
updated_at | ISO 8601 | req | Last modified timestamp |
is_trust — tier == "trust"; is_irrevocable — lifecycle_stage == "active_irrevocable"
| Value | Description |
|---|---|
solo | Single user, no household features |
household | Multiple members, shared vault |
trust | Full trust lifecycle enabled |
| Value |
|---|
living_trust |
family_trust |
business_trust |
nonprofit_trust |
| Value | Description |
|---|---|
creation | Vault established, roles defined, documents loading |
active_revocable | Full edit rights, all layers live |
conversion | In-progress conversion ceremony |
active_irrevocable | Terms frozen, documents immutable (add only) |
succession | Pre-staged handoff, quorum or date-based trigger |
legacy | Successor Trustees active, Founder profile permanent |
continuance | Beneficiary continuation trust with lineage link |
{
"id": "<uuid>",
"name": "<string>",
"role": "<MemberRole>",
"joined_at": "<ISO 8601>",
"avatar_initials": "<string?>",
"is_owner": false
}
| Value | Layer Access | Notes |
|---|---|---|
trustor | All layers | View-only after irrevocable conversion |
trustee | All layers | Full admin within locked terms |
co_trustee | All layers | Succession-capable, confirms conversion quorum |
partner | All layers | Add transactions, manage own accounts |
steward | Flow + Position summary | Own transactions only |
beneficiary | Own allocation only | View-only |
observer | Summary dashboard | Read-only |
successor_trustee | All layers (dormant) | Full admin post-succession |
attorney | Entity structure only | Observer-tier professional |
accountant | Flow + Position | Observer-tier professional |
Role permissions define what each role can access per layer. Stored per vault to allow customization.
{
"role": "<MemberRole>",
"layer_permissions": {
"flow": "<PermissionLevel>",
"position": "<PermissionLevel>",
"debt": "<PermissionLevel>",
"wealth": "<PermissionLevel>",
"protection": "<PermissionLevel>",
"documents": "<PermissionLevel>",
"milestones": "<PermissionLevel>",
"members": "<PermissionLevel>",
"settings": "<PermissionLevel>",
"trust_lifecycle": "<PermissionLevel>"
},
"can_invite_members": false,
"can_export_data": false,
"can_initiate_conversion": false,
"can_trigger_succession": false,
"can_modify_roles": false
}
PermissionLevel: none | read_only | read_write | admin
Encrypted document references. File content is never included in a VFDS export — only metadata. Actual files remain in the encrypted local vault.
{
"id": "<uuid>",
"name": "<string>",
"category": "<DocumentCategory>",
"size_bytes": 0,
"notes": "<string?>",
"added_at": "<ISO 8601>",
"is_locked": false
}
DocumentCategory: trust_instrument | will_testament | insurance | property_deed | operating_agreement | power_of_attorney | tax_record | other
The ownership map is a self-referential tree. Each entity may have a parent_id pointing to another entity in the same array. Entities with parent_id: null are root nodes. The tree is infinitely nestable.
{
"id": "<uuid>",
"name": "<string>",
"type": "<EntityType>",
"parent_id": "<uuid?>",
"value": 0.0,
"currency_code": "<ISO 4217?>",
"notes": "<string?>",
"created_at": "<ISO 8601>"
}
EntityType: trust | llc | brokerage | bank_account | real_estate | vehicle | insurance | retirement_account | crypto | business_interest | personal_property | beneficiary | other
VFDS organizes financial data into seven primary layers beneath the vault container. Each layer is independently versioned within the root structure.
Cash flow tracking — transactions, budget categories, recurring items, and bill reminders.
{
"id": "<uuid>",
"description": "<string>",
"amount": 0.0,
"currency_code": "<ISO 4217>",
"type": "<TransactionType>",
"category_id": "<uuid?>",
"date": "<ISO 8601>",
"created_at": "<ISO 8601>"
}
TransactionType: income | expense
{
"id": "<uuid>",
"name": "<string>",
"budgeted": 0.0,
"spent": 0.0,
"icon": 0,
"color": 0
}
remaining — budgeted - spent; percent_used — 0.0 – 1.0; is_over_budget — spent > budgeted
{
"id": "<uuid>",
"name": "<string>",
"amount": 0.0,
"is_income": false,
"frequency": "<RecurringFrequency>",
"category": "<string>",
"next_due_date": "<ISO 8601>",
"is_active": true
}
RecurringFrequency: weekly | biweekly | monthly | quarterly | yearly
{
"id": "<uuid>",
"name": "<string>",
"amount": 0.0,
"currency_code": "<ISO 4217>",
"frequency": "<BillFrequency>",
"due_day": 1,
"autopay": false,
"category": "<string?>",
"is_active": true,
"created_at": "<ISO 8601>"
}
BillFrequency: weekly | biweekly | monthly | quarterly | semiannual | annual
Net worth snapshot — assets, liabilities, and historical snapshots.
{
"id": "<uuid>",
"name": "<string>",
"type": "<AssetType>",
"value": 0.0,
"currency_code": "<ISO 4217>",
"last_updated": "<ISO 8601>"
}
AssetType: cash | savings | investment | retirement | real_estate | vehicle | personal_property | other
{
"id": "<uuid>",
"name": "<string>",
"type": "<LiabilityType>",
"balance": 0.0,
"interest_rate": 0.0,
"minimum_payment": 0.0,
"currency_code": "<ISO 4217>",
"last_updated": "<ISO 8601>"
}
LiabilityType: mortgage | auto_loan | student_loan | credit_card | personal_loan | medical_debt | other
{
"id": "<uuid>",
"net_worth": 0.0,
"total_assets": 0.0,
"total_liabilities": 0.0,
"recorded_at": "<ISO 8601>"
}
Debt payoff engine — accounts and active strategy selection.
{
"accounts": [
{
"id": "<uuid>",
"name": "<string>",
"balance": 0.0,
"interest_rate": 0.0,
"minimum_payment": 0.0,
"currency_code": "<ISO 4217>"
}
],
"payoff_strategy": "<DebtPayoffStrategy>"
}
DebtPayoffStrategy: avalanche | snowball | custom
debt.accounts records are the same underlying debts as position.liabilities. The position layer tracks them as liability snapshot records; the debt layer tracks them as active payoff accounts. Implementations should treat them as parallel views of the same data, not duplicate records.
Portfolio holdings — all asset classes with current valuation.
{
"id": "<uuid>",
"name": "<string>",
"ticker": "<string?>",
"asset_class": "<AssetClass>",
"shares": 0.0,
"price_per_share": 0.0,
"cost_basis": 0.0,
"currency_code": "<ISO 4217>"
}
AssetClass: stock | etf | mutual_fund | crypto | bond | real_estate | private_equity | annuity | retirement_account | other
market_value — shares × price_per_share; gain_loss — market_value - cost_basis; gain_loss_percent — (gain_loss / cost_basis) × 100
Insurance policy inventory and coverage gap tracking.
{
"id": "<uuid>",
"provider": "<string>",
"type": "<InsuranceType>",
"premium": 0.0,
"premium_frequency": "monthly",
"coverage_amount": 0.0,
"deductible": 0.0,
"renewal_date": "<ISO 8601?>"
}
InsuranceType: health | life | auto | homeowners | renters | umbrella | disability | long_term_care | dental | vision | other
Financial goals with progress tracking.
{
"id": "<uuid>",
"name": "<string>",
"target_amount": 0.0,
"current_amount": 0.0,
"category": "<GoalCategory>",
"deadline": "<ISO 8601?>",
"created_at": "<ISO 8601>",
"is_completed": false
}
GoalCategory: emergency | house | retirement | education | vehicle | travel | custom
Cross-layer milestone records. May reference net worth targets, savings goals, or lifecycle events.
{
"id": "<uuid>",
"title": "<string>",
"description": "<string>",
"target_amount": 0.0,
"current_amount": 0.0,
"target_date": "<ISO 8601?>",
"status": "<MilestoneStatus>",
"currency_code": "<ISO 4217>"
}
MilestoneStatus: upcoming | in_progress | achieved
Activity log and in-app notification records.
{
"id": "<uuid>",
"title": "<string>",
"body": "<string>",
"type": "<NotificationType>",
"created_at": "<ISO 8601>",
"is_read": false,
"route": "<string?>"
}
NotificationType: info | warning | milestone | security | sync
App-level preferences. Exported for cross-device restore. Not vault-specific.
| Field | Type | Default | Description |
|---|---|---|---|
base_currency_code | string | "USD" | ISO 4217 default display currency |
show_currency_symbols | bool | true | Show/hide currency symbols in UI |
compact_large_numbers | bool | false | Format large numbers as $1.2M |
biometrics_enabled | bool | false | Biometric authentication |
prevent_screenshots | bool | true | FLAG_SECURE screen protection |
auto_lock_seconds | int | 60 | Auto-lock timer in seconds. 0 = immediate. -1 = never |
| # | From | To | Mechanism |
|---|---|---|---|
| 1 | vault.ownership_entities | self | parent_id → id (recursive tree) |
| 2 | vault.ownership_entities (brokerage) | wealth.holdings | entity id referenced by holding records |
| 3 | vault.ownership_entities (real_estate, bank_account) | position.assets | entity id referenced by asset records |
| 4 | vault.members | vault.role_permissions | role field links permission set |
| 5 | flow.transactions.category_id | flow.budget_categories.id | direct UUID reference |
| 6 | debt.accounts | position.liabilities | parallel records representing the same underlying debts |
| 7 | protection.policies | vault.ownership_entities (insurance) | entity id referenced by policy records |
| 8 | vault.documents | vault lifecycle | is_locked becomes true on active_irrevocable transition |
| 9 | milestones | position.net_worth_snapshots | milestone amounts track net worth targets |
| 10 | goals.financial_goals | position.assets | savings goals feed asset value records |
Static reference data. Not user data — not exported in VFDS payloads. Embedded in app.
| Code | Name | Symbol |
|---|---|---|
USD | US Dollar | $ |
EUR | Euro | € |
GBP | British Pound | £ |
JPY | Japanese Yen | ¥ |
CAD | Canadian Dollar | CA$ |
AUD | Australian Dollar | A$ |
CHF | Swiss Franc | CHF |
CNY | Chinese Yuan | ¥ |
INR | Indian Rupee | ₹ |
MXN | Mexican Peso | MX$ |
BRL | Brazilian Real | R$ |
KRW | South Korean Won | ₩ |
NGN | Nigerian Naira | ₦ |
ZAR | South African Rand | R |
GHS | Ghanaian Cedi | ₵ |
BTC | Bitcoin | ₿ |
decimal_places: 8).
A standard VFDS export (vfds.json) contains document metadata only — file contents are never embedded in the JSON payload. For full backup, restore, and migration including actual document files, implementations must produce a VFDS Bundle.
{
"bundle_version": "1.0.0",
"vfds_version": "1.0.0",
"created_at": "<ISO 8601>",
"vault_id": "<uuid>",
"vault_name": "<string>",
"document_count": 0,
"total_encrypted_bytes": 0,
"encryption": {
"algorithm": "AES-256-GCM",
"kdf": "PBKDF2-SHA512",
"iterations": 310000,
"salt": "<base64>",
"iv_per_file": true
}
}
Each document is encrypted independently:
The encryption key is derived from a user-supplied passphrase via PBKDF2-SHA512 using the salt stored in bundle_manifest.json. The same key covers all files in the bundle. The passphrase is never stored.
.vfds-bundle.enc. Per-file encryption of the documents/ folder is sufficient for most use cases. Bundle-level encryption is recommended only for high-threat exports such as attorney handoff or succession transfer.
bundle_manifest.document_count must match the number of .enc files present — abort if mismatch.vfds.json against the declared vfds_version before importing any data..enc file using the passphrase-derived key — if any file fails GCM tag verification, abort the entire import and surface the error.vault.documents record by UUID.vault.documents references UUIDs with no corresponding .enc file.| Action | Label |
|---|---|
| Export data only | "Export Financial Data" → saves vfds.json |
| Export data + documents | "Full Backup" → saves .vfds-bundle |
| Import data only | "Restore from Export" |
| Import full backup | "Restore Full Backup" |
| Transfer to new device | "Transfer Vault" → full bundle, prompts for passphrase |
VFDS follows semantic versioning:
x.y.Zx.Y.0X.0.0Implementations must store the vfds_version on export and validate it on import. Unknown fields should be preserved, not discarded, to support forward compatibility.
| Metric | Count |
|---|---|
| Model classes | 22 |
| Enums | 24 |
| Settings state class | 1 |
| Cross-references | 10 |
| Individual fields | ~120 |
| Nested layers under root | 7 |