Veydrin Financial Data Standard

VFDS v1.0

The portable, privacy-preserving data format for household financial sovereignty and trust lifecycle data. Offline-first, encrypted, local-only by design.

VFDS v1.0.0 CC-BY-SA-4.0 DRAFT Builds on VODS
§ 1

Overview

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.

Reference implementation. org.ninthstar.nemorith (Nemorith) by the Ninth Star Foundation is the reference implementation of VFDS v1.0.0.

VODS Compliance

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 */ }
}

Conventions

§ 2

Root Structure

{
  "vfds_version": "1.0.0",
  "exported_at": "<ISO 8601>",
  "app_version": "<string>",
  "vault": { },
  "flow": { },
  "position": { },
  "debt": { },
  "wealth": { },
  "protection": { },
  "goals": { },
  "milestones": [ ],
  "notifications": [ ],
  "settings": { }
}
FieldTypeDescription
vfds_versionstringSpec version (semver)
exported_atISO 8601Export timestamp
app_versionstringNemorith build version
vaultobjectTop-level vault container
flowobjectCash flow layer
positionobjectNet worth layer
debtobjectDebt management layer
wealthobjectPortfolio/holdings layer
protectionobjectInsurance layer
goalsobjectFinancial goals layer
milestonesarrayCross-layer milestone records
notificationsarrayActivity and audit log
settingsobjectApp preferences
§ 3

Vault

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": [ ]
}
FieldTypeReq?Description
idstringreqUUID
namestringreqDisplay name
tierVaultTierreqVault tier (see enum)
base_currency_codestringreqISO 4217 base currency
trust_typeTrustType?trust tierTrust subtype
lifecycle_stageLifecycleStage?trust tierCurrent trust stage
created_atISO 8601reqCreation timestamp
updated_atISO 8601reqLast modified timestamp
Computed (do not export): is_trusttier == "trust"; is_irrevocablelifecycle_stage == "active_irrevocable"

VaultTier

ValueDescription
soloSingle user, no household features
householdMultiple members, shared vault
trustFull trust lifecycle enabled

TrustType (trust tier only)

Value
living_trust
family_trust
business_trust
nonprofit_trust

LifecycleStage (trust tier only)

ValueDescription
creationVault established, roles defined, documents loading
active_revocableFull edit rights, all layers live
conversionIn-progress conversion ceremony
active_irrevocableTerms frozen, documents immutable (add only)
successionPre-staged handoff, quorum or date-based trigger
legacySuccessor Trustees active, Founder profile permanent
continuanceBeneficiary continuation trust with lineage link

Vault > Members

{
  "id": "<uuid>",
  "name": "<string>",
  "role": "<MemberRole>",
  "joined_at": "<ISO 8601>",
  "avatar_initials": "<string?>",
  "is_owner": false
}
ValueLayer AccessNotes
trustorAll layersView-only after irrevocable conversion
trusteeAll layersFull admin within locked terms
co_trusteeAll layersSuccession-capable, confirms conversion quorum
partnerAll layersAdd transactions, manage own accounts
stewardFlow + Position summaryOwn transactions only
beneficiaryOwn allocation onlyView-only
observerSummary dashboardRead-only
successor_trusteeAll layers (dormant)Full admin post-succession
attorneyEntity structure onlyObserver-tier professional
accountantFlow + PositionObserver-tier professional

Vault > Role Permissions

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

Vault > Documents

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

Vault > Ownership Entities

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

Trust (root, parent_id: null) ├── LLC (parent_id: trust.id) │ ├── Brokerage (parent_id: llc.id) → wealth.holdings │ └── Real Estate (parent_id: llc.id) → position.assets ├── Bank Account (parent_id: trust.id) └── Beneficiary (parent_id: trust.id)
§ 4

Data Layers

VFDS organizes financial data into seven primary layers beneath the vault container. Each layer is independently versioned within the root structure.

§ 4.1

Flow Layer

Cash flow tracking — transactions, budget categories, recurring items, and bill reminders.

Transactions

{
  "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

Budget Categories

{
  "id": "<uuid>",
  "name": "<string>",
  "budgeted": 0.0,
  "spent": 0.0,
  "icon": 0,
  "color": 0
}
Computed (do not export): remainingbudgeted - spent; percent_used0.0 – 1.0; is_over_budgetspent > budgeted

Recurring Transactions

{
  "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

Bill Reminders

{
  "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

§ 4.2

Position Layer

Net worth snapshot — assets, liabilities, and historical snapshots.

Assets

{
  "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

Liabilities

{
  "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

Net Worth Snapshots

{
  "id": "<uuid>",
  "net_worth": 0.0,
  "total_assets": 0.0,
  "total_liabilities": 0.0,
  "recorded_at": "<ISO 8601>"
}
§ 4.3

Debt Layer

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

Cross-reference. 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.
§ 4.4

Wealth Layer

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

Computed (do not export): market_valueshares × price_per_share; gain_lossmarket_value - cost_basis; gain_loss_percent(gain_loss / cost_basis) × 100
§ 4.5

Protection Layer

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

§ 4.6

Goals Layer

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

§ 4.7

Milestones

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

§ 4.8

Notifications / Audit Log

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

§ 4.9

Settings

App-level preferences. Exported for cross-device restore. Not vault-specific.

FieldTypeDefaultDescription
base_currency_codestring"USD"ISO 4217 default display currency
show_currency_symbolsbooltrueShow/hide currency symbols in UI
compact_large_numbersboolfalseFormat large numbers as $1.2M
biometrics_enabledboolfalseBiometric authentication
prevent_screenshotsbooltrueFLAG_SECURE screen protection
auto_lock_secondsint60Auto-lock timer in seconds. 0 = immediate. -1 = never
§ 5

Cross-References

#FromToMechanism
1vault.ownership_entitiesselfparent_id → id (recursive tree)
2vault.ownership_entities (brokerage)wealth.holdingsentity id referenced by holding records
3vault.ownership_entities (real_estate, bank_account)position.assetsentity id referenced by asset records
4vault.membersvault.role_permissionsrole field links permission set
5flow.transactions.category_idflow.budget_categories.iddirect UUID reference
6debt.accountsposition.liabilitiesparallel records representing the same underlying debts
7protection.policiesvault.ownership_entities (insurance)entity id referenced by policy records
8vault.documentsvault lifecycleis_locked becomes true on active_irrevocable transition
9milestonesposition.net_worth_snapshotsmilestone amounts track net worth targets
10goals.financial_goalsposition.assetssavings goals feed asset value records
§ 6

Currency Reference

Static reference data. Not user data — not exported in VFDS payloads. Embedded in app.

CodeNameSymbol
USDUS Dollar$
EUREuro
GBPBritish Pound£
JPYJapanese Yen¥
CADCanadian DollarCA$
AUDAustralian DollarA$
CHFSwiss FrancCHF
CNYChinese Yuan¥
INRIndian Rupee
MXNMexican PesoMX$
BRLBrazilian RealR$
KRWSouth Korean Won
NGNNigerian Naira
ZARSouth African RandR
GHSGhanaian Cedi
BTCBitcoin
Note: BTC is not ISO 4217. It is included for practical use. Implementations must handle BTC's 8 decimal places (decimal_places: 8).
§ 7

Document Bundle Format (.vfds-bundle)

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.

Structure

myexport.vfds-bundle ├── vfds.json — standard VFDS export ├── documents/ │ ├── <document-uuid>.enc — AES-256-GCM encrypted file │ └── ... └── bundle_manifest.json — bundle metadata

bundle_manifest.json

{
  "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
  }
}

File Encryption

Each document is encrypted independently:

<document-uuid>.enc ├── [12 bytes] — random IV (GCM nonce) ├── [N bytes] — AES-256-GCM ciphertext └── [16 bytes] — GCM authentication tag

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.

Bundle-level encryption (optional). Implementations may additionally encrypt the entire ZIP archive with a second passphrase. When applied, the file extension should be .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.

Import / Restore Rules

Suggested UX Labels

ActionLabel
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
§ 8

Privacy Notes

§ 9

Versioning

VFDS follows semantic versioning:

Change type
Version bump
Description
Patch
x.y.Z
Clarifications, corrected descriptions, no schema changes
Minor
x.Y.0
Additive field or enum additions, backward compatible
Major
X.0.0
Breaking changes to field names, types, or structure

Implementations must store the vfds_version on export and validate it on import. Unknown fields should be preserved, not discarded, to support forward compatibility.

§ 10

Totals (v1.0.0)

MetricCount
Model classes22
Enums24
Settings state class1
Cross-references10
Individual fields~120
Nested layers under root7