Promise / 02 — You can always leave

The Export Schema

SCHEMA v1.0 · VERSIONED WITH THE PRODUCT

Every Docketstone firm can generate a complete export from inside the product: every record, every document file, every ledger entry, and the full audit chain, in the open format documented on this page. A platform you can leave is a platform you can trust arriving at. This page is the contract.

Archive layout

docketstone-export-YYYYMMDD-HHMMSS.zip
├── manifest.json          # schema version, conventions, per-file row counts + SHA-256
├── data/*.json            # one JSON array per record type
└── files/
    ├── documents/         # every stored file, named {id}_{original_filename}
    └── bundles/           # every built court bundle PDF

Conventions

What's inside

data/firm.json · data/users.json

Firm identity and staff (roles, bar numbers, rates). Password hashes and session tokens are never exported.

data/clients.json · data/client_aliases.json

Clients with contact detail and status, plus the AKA/FKA/DBA and corporate-family aliases that feed conflict checking.

data/matters.json · data/matter_parties.json

Matters with per-firm numbers, practice areas, responsible attorneys, and lifecycle dates; adverse parties, co-parties, opposing counsel, and witnesses per matter.

data/tasks.json · data/deadlines.json

Task assignments with priorities and completion attribution; deadlines typed (court date, filing, statute of limitations, discovery) with criticality and completion history.

data/time_entries.json · data/invoices.json · data/payments.json

Time with the rate captured at entry and the computed amount; invoices with status lifecycle; payments with source — including trust-funded payments linked to their ledger disbursement.

data/trust_accounts.json · data/trust_ledger_entries.json · data/reconciliations.json

The append-only trust ledger with signed cent amounts, reversal links, and per-statement cleared markers, plus every three-way reconciliation with the full bank-to-book bridge. Balances are recomputable from the entries alone.

data/conflict_checks.json · data/intake_submissions.json

Every conflict check ever run, with the names searched and a snapshot of every hit (source, method, similarity) as they appeared at check time; the complete intake pipeline with dispositions.

data/documents.json · data/signature_requests.json

Document metadata — versions, privilege classification, upload hashes — pointing at the actual files in files/documents/; e-signature requests with their complete per-event audit trails (IP and user agent per event).

data/bundles.json · data/bundle_items.json

Court bundle definitions, section ordering, build histories with page counts and output hashes; the built PDFs ship in files/bundles/.

data/ethical_walls.json · data/wall_events.json

Screening walls with reasons and lifecycle, and every blocked access attempt with path and IP.

The audit chain — verifiable without us

data/audit_logs.json contains the complete tamper-evident audit trail including each row's prev_hash and row_hash, so its integrity can be verified offline, by anyone, with no Docketstone software:

row_hash = sha256(join("|", [prev_hash, firm_id, user_id, event,
                             auditable_type, auditable_id, summary,
                             changes, ip, created_at]))

# nulls join as empty strings
# created_at is "YYYY-MM-DD HH:MM:SS.ffffff"
# the first row's prev_hash is "docketstone-audit-genesis"
# walk rows in id order: any altered, inserted, or removed row
# breaks every link after it

Versioning

schema_version in the manifest follows this page. Additive changes bump the minor version; anything that changes the meaning of an existing field bumps the major version and is announced before it ships.