Branching Time-SeriesWith Minimal Footprint
at Lightning Speeds.

Typed events. Compressed hourly storage. Precomputed columnar summaries.

Data Lifecycle

Plant Your Seeds…

Ingest events once. Replay object changes, investigate collected data locally, and query compact summaries without loading every event.

ServerBrowser
Select a StageData Shapes Are Schematic
Server / Ingress

Observability Ingress

SEED · Sequentially Encoded Event Data

Data seeds are Trie-Trunk’s implementation of PIL. Each seed arrives under a negotiated Definition. The seed journal supports durability until the hourly seal completes; recent seeds stay in native memory for live tail (and collections support revision id based replay subscriptions via SSE or WebSocket).

Rejected data seeds go to Lost Events with their original content.

Data Seed ViewExample Data
payment / transactionsData Seed
event_idUUIDv7
idTransaction UUID
revision_id17
stateauthorized
Append to .seedAvailable in Memory

Platform Taxonomy

Caches in the trunk.
Services branch out.

The Trie-Trunk Taxonomy Caches are hollows within the trunk. The prod cache branches into payment and identity services. Payment branches into transactions and refunds resources. Identity branches into permissions. Transactions branches into info and error levels. The info level branches into read and write access. The test cache has its own identity service. The expanded path is Trunk, prod, payment, transactions, info, write. Trunk prod test payment identity identity transactions refunds permissions info error read write
Example paths · One cache expanded

Select a Tier to Highlight

Separate working spaces, such as prod, test, and sand. Each has its own hollow in the trunk.

An Event’s PlaceTrunk › prod › payment › transactions › info › write

Direct Time Traversal

Jump to a UTC hour by year, day, and hour without walking earlier periods. A known record position then resolves directly within that hour. Searching its contents still depends on the query and event volume.

5-Byte Event AddressingOver 16 Million Events/Hour · Over 7 Years · Per Branch

Two bytes select the hour; three select the record. That covers 65,536 hours—about 7.48 years—from the address origin. References widen when either range is exceeded; retention currently preserves that origin.

Common State References

Repeated attribute paths share two-byte references within a seed definition. Seeds reuse those common values, reducing repetition and providing compact groups for analytics.

Analytics

Pre-Computed
Columnar Aggregates

Query the aggregate, not every event. Counts, errors, and numeric statistics are computed ahead of the view and collected independently of event detail.

Monthly ViewIllustrative Aggregate Views
JanDec
5-Minute Base Granularity

Combine stored aggregates for broader time views. Collect individual events when the investigation needs their detail.

Retention

Give Each Branch
Its Own Budget

Hollow out your trunk to store more data. Explore different storage allocations for services, resources, and log levels.

Hollow = QuotaLarger Quota → Larger Hollow
Selected Scope

prod / payment / transactions

192 GB
32 GB256 GB
Estimated History at Capacity48 Days

Illustration: 4 GB/day. Snoot estimates from your data and saves the size.

Configure Quotas in Snoot ↗

Query Paths

Time, object identity, and text each have
a useful way into the journal.

Time & Text

Bound a search by time, then refine by fields or text. Collect matching seed packs for local investigation.

Time Trie + Tantivy

Collection Object Subscriptions

Follow one object’s revisions via collection subscriptions. The optional collection index supports history and replay without rebuilding the full object.

collection.idx → Writes

Analytics

Render counts, errors, and duration distributions from summaries. Daily totals also feed weekly, monthly, and yearly rollups.

.sum → Analytic Columns

Retention is configured per resource and branch. Completeness and lost events remain visible. Scheduled reports and external alert delivery are still planned.

Data Seeds / Shared Schema

Data Definitions

Define field positions, types, and dictionaries once. Data seeds share that definition and can carry complete state or a single changed field.

Trie-Trunk data definitions are an implementation of PIL Definitions. CDDL describes the definition structure; Trie-Trunk adds resource bindings and application rules.

A Data DefinitionJSON View of PIL Definition
{
  "definition": "payment/transactions",
  "pil": 0,
  "version": 0,
  "fields": [
    { "name": "id",           "type": "UUID" },
    { "name": "revision_id",  "type": "U16"  },
    { "name": "state", "type": "STRING",
      "values": ["pending", "authorized", "captured"] }
  ]
}
A Changestate: authorizedOmitted fields remain omitted.

One Million Searchable Events

Default compression, search indexes, and precomputed aggregates.
1,000,000 synthetic events. 30 days. Five resources.

70.9% Smaller

Entire Datastore vs Expanded JSONL

124.65 MB vs 427.75 MB

Including Indexes, Summaries & Journals

Read the Benchmark
Pods
14.50 MB
Tries
3.57 MB
Indexes
16.29 MB
Summaries
4.25 MB
Journals & Other
6.48 MB

133.4 KB median daily summary transfer for analytics across the fixture’s resources.

124.7 bytes/event for the full indexed datastore, including journals and metadata.

14.50 MB of seed packs in Pods, retrievable by hour for event detail. See How Seeds Are Packed ↗

These are development measurements, not production guarantees. The linked report includes allocation, coverage, and format tradeoffs.

Front-Facing Snoot Anteater
Snoot

Search & Investigation

Search the journal, inspect a change, and look at the pattern. Snoot brings the detail and the summaries into the same research session.