·HOOX·2 min read

[Four Speeds of Memory: HOOX Multi-Tier Storage]

D1, KV, R2, Durable Objects, Vectorize—assign each job by consistency, latency, and cost.

hooxd1kvr2durable-objectsvectorizedata-architecturecloudflare

Sources: docs/devops/architecture/storage.mdx, DESIGN.md data models, paper data-layer sections, README primitives.


Thesis

HOOX does not pretend one database can be a mutex, a config plane, a ledger, and a PDF archive. It assigns each job to the Cloudflare primitive whose consistency, latency, and cost match the job. That assignment is the data architecture.


1. Tier map

Primitive Consistency Feel Ideal use
Durable Objects Strong (single-threaded) <2 / <5 ms class Idempotency locks, WS session managers
Workers KV Eventual Sub-ms reads; slow global write Kill switch, queue mode, routing, rate windows, watermarks
D1 (SQLite) Relational edge SQL ~5–12 ms class Trades, positions, balances, system_logs
R2 Strong per object Tens of ms Verbose exchange JSON, PDFs, heavy logs
Vectorize ANN index Query-bound RAG over trade history
Analytics Engine Append time-series Non-blocking write Latency & API metrics

Adjacent: Queues, Browser Rendering, Secrets (never KV/D1 for API keys).


2. D1 through one door

All business SQL → d1-worker. Centralization enables:

  • Query guards (dangerous statements, injection shapes, table allowlists)
  • Schema evolution in one place
  • Binding auth in front of the ledger

Core tables: trade_signals, trades, positions, balances, system_logs—with trace/request ids for reconstruction.


3. KV as control plane

CONFIG_KV is where operators and agents meet: kill switch, queue mode, routing overrides, rate windows, trailing watermarks. Reads are cheap; writes are eventually consistent. Policy belongs here; double-spend locks do not.


4. R2 as cold / bulky path

Exchange dumps and PDF reports would punish D1 quotas. R2 takes bulk; Telegram gets links; the ledger stays lean. Enterprise thickens this into jurisdiction-aware immutable audit (essay 13).


5. Analytics Engine as free black box

trackAnalytics after response via waitUntil. Metrics must not lengthen the 22 ms path. Dashboard SQL against hoox-analytics reconstructs latency without a third-party APM bill at retail scale.


6. Decision procedure

For every new field:

  1. Must concurrent requests serialize? → DO
  2. Runtime operator flag? → KV
  3. Money / relational agent state? → D1 via d1-worker
  4. Huge or archival? → R2

If the answer is “all of the above,” you are designing a workflow, not a column.

Previous: agent-worker · Next: Five-layer security