Tau is a bitemporal time-series database built for financial workloads. Every fact keeps when it was true and when you learned it. Corrections are appends — nothing is ever overwritten. AT … AS OF replays exactly what you believed at any past moment, so backtests can't see restated prices. Lua triggers compute Sharpe ratios, rolling stats, and risk signals on write or on a schedule.

One question, two honest answers. The restated value never deletes the original — it stacks on top, the newest layer wins, and both clocks stay queryable forever. No look-ahead bias. No lost corrections. No mutable state.

Why Tau for finance

Most time-series stores have one axis of time and mutate in place. A restated price overwrites the original. A backtest sees the corrected data and silently cheats. Tau keeps both axes and mutates nothing.

Valid time

When a fact was true in the world — the half-open interval [start, end) you query with AT, RANGE and REDUCE.

Transaction time

When Tau learned it — stamped on every append, wound back with AT … AS OF, and audited with HISTORY.

What that buys you

  • Corrections are appends. Exchange restatements, corporate actions, recalibrated feeds — the newest layer wins at any overlap; the belief it replaced stays queryable forever.
  • Point-in-time backtesting. AT LENS px t AS OF <trade-day> gives you exactly the price your strategy saw that day. No look-ahead bias, ever.
  • Stack transformations on the same data. DERIVE for lazy re-evaluation against the latest corrections. XDERIVE for materialised auto-refreshing signals. Compose a spread, a rolling stat, a risk metric — all over the same base lens, all time-travel-aware.
  • Lua triggers. Write Sharpe ratios, rolling stddev, VaR, or position-keeping logic in Lua. Fire on write, on a schedule, or on demand. Sandbox-gated host API: tau.exec, tau.range, tau.clock.
  • N-dimensional lenses. CREATE LENS quote float AXES (time, instrument, venue) — box-shaped facts, one coordinate per axis. Query a single instrument at a venue, or sweep time across the whole grid.
  • Proven correct. Compaction preserves every AT, RANGE, REDUCE, AS OF, and HISTORY result — enforced by property-based tests and deterministic simulation on every build.

Quickstart

Install the server and client — release binary, cargo, or Docker:

# Release binary (Linux x86_64)
curl -fsSL https://github.com/bxrne/tau/releases/latest/download/tau-x86_64-linux -o tau
chmod +x tau && sudo mv tau /usr/local/bin/

# …or cargo
cargo install --git https://github.com/bxrne/tau tau tauctl

# …or Docker
docker run -p 7070:7070 ghcr.io/bxrne/tau:latest

Start an in-memory server on 127.0.0.1:7070 with tau, then drive it from tauctl:

τ: connect demo 127.0.0.1:7070
τ: CREATE DATABASE market
τ: CREATE LENS px float
τ: APPEND LENS px 0 3600 100.0, 3600 7200 101.2
τ: AT LENS px 1800
VAL f100

Where next

  • Lua Scripting — triggers, cron, host API, finance examples (Sharpe, rolling stddev)
  • Examples — copy-pasteable: backtesting, spreads, IoT, observability
  • Tutorial — a full correction-and-audit story, end to end
  • TauQL reference — every statement, the grammar, and the wire protocol
  • How it works — the kernel, layers, compaction, storage and the WAL
  • Simulation testing — the oracle, fault injection, and why seeds reproduce bugs
  • Configuration — backends, TLS, auth, metrics, and limits

Open source under the Apache 2.0 license. Correctness is enforced by property-based tests, deterministic simulation, and fuzzing — see Testing.