0.0.1-preview is out · self-hosted

Build payment, settlement and liquidity systems without building the ledger underneath.

TulaDB ships the ledger engine, the operations tooling and the Iceberg analytics pipeline as one self-hosted product. Your team builds the product; money stays exact under retries, failures and peaks. First use case: real-time posting in front of a batch core, for institutions joining FedNow and Canada's Real-Time Rail.

Developer preview: 0.0.1-preview is a signed download; evaluating it is covered by the licence's evaluation grant. The engine, console, exporter and operations tooling run today; rail and core connectors are built with design partners. Not yet certified for production.

member account — one balance, every rail
debit = credit
rail · eventamountavailableoutcome
deposit+1,000.001,000.00POSTED
Real-Time Rail · send−800.00200.00HELD
Second rail · send−300.00200.00REFUSED
Real-Time Rail · acceptedhold → posted200.00POSTED

What you no longer build

The stack teams assemble around a ledger, shipped as one product.

Every payment, wallet or settlement system ends up building the same plumbing: a ledger in a general-purpose database, services to make it safe, a dashboard to run it and a pipeline to report from it. Each piece is re-implemented, re-tested and re-learned in production. TulaDB ships it as one product — each item links to its proof.

What teams usually assemble
With TulaDB
The ledger and its safety servicesLedger tables in a general database, a deduplication service, workers that expire holds, limit checks copied into every service. Each is a place for money to go wrong.
Ledger engineBalances, holds with expiry, limits checked in the same step as each write, retries that never post twice, refusals kept as records. The proof →
Running itAn admin dashboard, alert rules and runbooks written after incidents, backup scripts nobody has restored, an upgrade playbook that needs downtime.
Operations console & toolingA console with roles and an audit log, six Grafana dashboards, an alert rule set with runbooks for design partners, backups with point-in-time restore and restore drills, rolling upgrades with a rollback check. The proof →
Reporting from itA change-data-capture pipeline, warehouse loads, nightly reconciliation jobs that find the gaps after finance does.
Iceberg analyticsCommitted history and every recorded decline exported to Apache Iceberg without duplicates or gaps, reconciled against the ledger, queryable with SQL. The proof →
Still yours, either wayRail and network adapters, payment orchestration, fraud and compliance checks, and the screens your customers see.
TulaDB stays below them, so the part that has to be perfect isn't improvised in each one. What stays above the ledger →

See it run · 48 seconds

One payment, two rails, one balance.

A real-time payment is held, a second rail is refused, a resent message is answered once, and the hold posts — shown in the TulaDB operations console on a local stack built from source. Nothing is simulated.

No audio. Steps: fund a member account · Real-Time Rail send held · second rail refused · resend answered once · rail accepts, hold posts.

Lead use case · instant-payment rails

Join an instant rail without replacing your core.

Instant rails settle in seconds, around the clock, while most cores post in batches. FedNow is live today; Canada's Real-Time Rail launches in phases from late 2026. TulaDB sits in front of the core and keeps one real-time balance per account across every rail. These are the failures it removes. How it fits beside your core →

Payments arrive during the batch window

The rail runs at 3 a.m. on a holiday; the core is mid-batch. TulaDB posts every payment the moment it arrives. Your core is updated from the ledger's history on its own schedule, through a feed built with each design partner.

Resent messages post twice

A timeout and a resend are one payment. Give each rail its own source and pass its message ID as the reference: a resend returns the original outcome instead of moving money again. That holds through crashes and failovers.

Two rails spend the same money

Funds held for a payment on one rail are unavailable to every other rail at the same instant. A second payment against them is refused when it arrives, not discovered at the next batch.

Liquidity is learned from a report

Your settlement position gets a floor no payment can cross, known obligations are set aside until they are paid, and each sponsored client gets its own cap. All three are configured from the ledger's limits and holds and enforced on every payment.

Who it's for

Teams that build money movement, and the institutions they serve.

Every institution type, and its problems →

Institutions joining instant rails

Credit unions, community banks, and the sponsor banks and aggregators that give them access: real-time posting in front of a batch core, one balance across rails, and a liquidity cap per client enforced on every payment.

Teams building payment systems

Payment providers, payment-hub vendors, switch builders and bank platform teams: ship the product on a ledger that is already correct, operable and reportable, instead of building and owning that layer yourselves.

Design partners

Prove it on your own payments before anything depends on it.

Run TulaDB in your environment on replayed or anonymised traffic, compare it with your existing books, and shape the rail adapters and liquidity layer that come next. We reply within one business day.