Open source

The trading and risk platform you can own, audit, and extend.

OpenTRMS runs the full trade lifecycle for FX, money markets, derivatives and fixed income — with an immutable audit trail and an AI control room that works inside your existing controls. Self-hosted, with every number reproducible from its inputs.

Open sourceSelf-hostedAudit-ready by designAI-native ops

20 short videos of the real system — start with Getting started.

Live · Rates desk
EOD T−1 · 17:00 NY
USD swap curve
Projection · today
4.12%
+3.2 bp
4.80%4.35%3.90% 1M2Y10Y30Y
P&L · 30D
+1.42%
▲
Open trades
1,284
+47 today
CurrencyPVDV01
USD +12.4M −18,420
EUR +8.1M −9,205
GBP −2.7M +3,140
JPY +1.9M −2,015
Multi-asset coverage

One ledger for everything your treasury actually trades.

Partial coverage is what pushes the remainder of the book into spreadsheets. OpenTRMS books FX, money markets, fixed income and derivatives against the same event store, so positions, P&L and exposure stay consistent without nightly stitching.

One position model. One P&L. One audit trail — reconciled by construction rather than at end of day.

The complete deal lifecycle

Follow one trade from capture to closeout.

What a trading platform is worth shows in the path a deal walks every day. Here is that path on OpenTRMS, told from the seat of the person who does the work.

  1. 01

    Captured

    Front office

    A trader books a 5Y USD interest-rate swap with ABC Bank. One screen, one click — or one sentence to the AI desk assistant.

  2. 02

    Validated

    STP engine

    Limits, counterparty, product schema and credit checks run in milliseconds. Eligible trades flow through; exceptions stop and explain themselves.

  3. 03

    Approved

    Middle office

    A scoped approval chain routes the trade to the right desk head. Self-approval is structurally impossible, and every signature is recorded as an event.

  4. 04

    Confirmed

    Operations

    Confirmation flows out, the deal is locked, and the position updates on the trader's blotter and the risk desk's exposure view at the same time.

  5. 05

    Settled

    Treasury / settlements

    Netting collapses cashflows by counterparty and currency. Payment messages (MT103/MT202) are generated and dispatched on schedule.

  6. 06

    Accrued & valued

    Finance / risk

    End-of-day rebuilds curves, accrues interest, marks the book to market and posts journals — every step is an event you can replay.

  7. 07

    Closed out

    Back office

    At maturity or termination, rule-driven matching offsets positions and the deal walks cleanly off the book — with the full history intact.

Behind every state change: a typed event, an immutable hash, an authorised user, a correlation id. Reconstructing what happened on any day, for any deal, is a query — not an investigation.

Audit trail as system of record

Your audit trail isn't a report. It's the platform.

Most TRMS vendors bolt audit tables onto a CRUD database and hope. OpenTRMS is event-sourced from the first commit — the history of every deal is the deal. Audit, control and risk teams get the answer they actually want: a single, attributed, replayable timeline.

  • Nothing is overwritten — ever.

    Every state change appends a new event. The history of a deal is the deal — there is no separate change log to request, because the record is nothing else.

  • Tampering breaks the chain, visibly.

    Every event is hashed and linked to the previous one. Insert, delete or modify any record and the chain refuses to reconcile, so a silent edit is detectable rather than deniable.

  • Immutability enforced by the database, not by trust.

    UPDATE and DELETE on the event table are revoked at the database level. Application bugs cannot rewrite history. Neither can a misbehaving DBA.

  • Every action is attributed.

    User, scope, correlation id and timestamp are part of the event. "Who approved this?" is a one-line query.

  • Replay any day, on demand.

    Rebuild the book as it stood at any point in time. Reconcile to a regulator, run a what-if, or unblock a dispute — without freezing production.

A live hash chain

Event #1 DealCaptured
hash a7f3c91d…e2b10f84
prev 00000000…00000000
SHA-256
Event #2 STPPassed
hash 3d82b47e…f4a96c51
prev a7f3c91d…e2b10f84
SHA-256
Event #3 DealConfirmed
hash 9bc14a2f…d3e70862
prev 3d82b47e…f4a96c51
SHA-256
Event #4 DealValuated
hash e5f0d839…a8c21b73
prev 9bc14a2f…d3e70862
AI-native operations

An operations control room that works the night shift — inside your controls, on the record.

Agent autonomy is a model-risk question before it is a productivity one. In OpenTRMS every agent action is scoped, logged and reversible: agents call the same domain services a person does, under the same permissions and approval chains, and stop the moment they reach a limit. What they earn you is the boring half of trade ops — chasing breaks, pulling confirmations, summarising P&L moves.

  • Agents that go through your controls, not around them.

    Every agent calls the same domain services as the REST API. Same scopes. Same approval chains. An agent cannot do anything a user with its scope couldn't do — and every call it makes is attributable after the fact.

  • Human-in-the-loop where it matters.

    The agent proposes; the human approves. Material actions never auto-execute, and every proposal is recorded as an event — including the ones you rejected, which is the evidence your model-governance review will ask for.

  • Plug into your AI stack, not ours.

    Built-in MCP server: any MCP-compatible client (Claude, internal agents, Copilot-style IDEs) talks to OpenTRMS out of the box. No bespoke connectors, no proprietary protocol.

  • Your data stays where it is.

    Self-hosted. Bring your own model. The agent runtime sits next to your event store — not in a vendor cloud you don't control.

opentrms · ops control room

$ opentrms ops review --book G10-RATES

› Anything I should look at before EOD?

Agent:

3 trades exceed the +/-2σ price band on the desk:

#45215Y USD IRS · ABC Bank · +3.1σ

#45442Y EUR IRS · DEF Sarl · −2.4σ

#456110Y GBP IRS · GHI plc · +2.8σ

Flag for review? [Y/n] Y

✓ 3 deals routed to Head of Rates

✓ Events appended · correlation b3f9e1

$

End-of-day you can trust

Closing the day shouldn't be a leap of faith.

EOD is where most TRMS deployments quietly fall apart — partial runs, mystery breaks, finance and risk arguing over whose number is right. OpenTRMS runs EOD as a sequence of attributable events, each one reproducible from the same audit trail your auditors will read.

Curve projection
USD 3M · today vs T−1
+3.2 bp
▲ steepened
1M1Y5Y10Y30Y
today T−1
01

Cut-off

Cut-off lands and the desks stop booking. The system snapshots the book at a single, attributable point in time, so every downstream number shares one agreed "as of".

02

Curves & rates

Fixings come in. Discount and projection curves rebuild from that snapshot. Every input is recorded; every output is reproducible.

03

Accruals

Interest accrues on every open position. Finance gets numbers that tie back to specific trades on specific days, down to the cashflow.

04

Mark-to-market

The whole portfolio is valued: IRS, FX, bonds, options. Greeks, DV01, PV01 fall out of the same model your trading desk used yesterday.

05

Journals & margin

Posting rules turn valuations into journal entries; margin is calculated against the same numbers. Finance and risk see the same truth.

06

Settlements

Cashflows are netted by counterparty and currency. Payment messages are produced and queued, ready for SWIFT or your bank rails.

07

Sign-off

Every step is an event, including the ones that were retried or ran late. The next morning's regulatory report is pulled from that same trail.

One trail from cut-off to sign-off. If something needs to be re-run, it's a replay — not a rebuild.

Extend it, don't fork it

Your models and your rules run inside the platform.

Every bank prices something its own way. In most systems that means a fork, a consulting engagement, or a spreadsheet nobody can audit. OpenTRMS exposes a versioned extension contract instead: write the piece that is yours in Python or Java, hand it to the platform, and upgrade the platform underneath it without touching your code.

Seven places your code plugs in

Valuator Price an instrument your own way — exotics, jurisdiction-specific models, your desk conventions.
Cashflow Generate structured payoffs: capped/floored floaters, amortizing schedules, path-dependent coupons.
Posting Your accounting treatment — hedge accounting, fair value option, IFRS 9 staging.
Accrual Daily accrual logic per product family, run inside the end-of-day batch.
Settlement router Leg-level settlement instructions for collateral, physical delivery or CLS.
Curve Custom curve construction — bootstrapping, interpolation and day count to your standard.
Product Register a product type that exists only in your book, bound to your own plugin set.
ProductValuator The contract

The whole surface is this small on purpose. Interfaces are tiered — frozen, stable or evolving — and a compatibility kit checks yours against the tier before it ships.

@SpiStability(StabilityTier.STABLE)
public interface ProductValuator {

    boolean supports(Deal deal);

    Valuation valuate(ValuationRequest request);
}
capped_floored_floater.py Your code

A structured payoff as a plain function. Python runs embedded — no service to deploy, no network hop — so quants ship models without waiting on a platform release.

def _cash_amount(notional, index_rate, spread,
                 floor_rate, cap_rate, dcf):
    effective_rate = _decimal(index_rate) + _decimal(spread)
    effective_rate = max(effective_rate, _decimal(floor_rate))   # floor
    effective_rate = min(effective_rate, _decimal(cap_rate))     # cap
    return (notional * effective_rate * _decimal(dcf)).quantize(CENTS)


def generate_cashflows(deal_json: str) -> str:
    deal = json.loads(deal_json)
    details = deal["details"]
    # ... one dict per coupon, returned as JSON
    return json.dumps({"cashflows": cashflows}, sort_keys=True)

Custom code, under the same control as everything else.

A plugin is an artifact with a lifecycle, not a file someone dropped on a server. It is uploaded, reviewed, approved and activated — and every one of those steps is attributed in the same audit trail as a trade.

Draft Under review Approved Active then deactivated or retired — retired versions are immutable
Four eyes, enforced The author of an artifact cannot approve it. Separation of duties is in the service, not in a policy document.
Determinism, proven Every plugin runs twice over a test corpus at approval time. Outputs must match byte for byte or it is rejected.
A performance budget Each artifact declares its own latency budget and is measured against it before it can go live.
Nothing reaches the network Python plugins run in-process with os, socket, subprocess and http imports blocked, under a wall-clock limit.
One active version Each artifact is content-hashed and pinned to an SPI version. Exactly one version is live at a time; retired ones are immutable.
The same door we use Built-in valuators and generators implement the very same SPI. If the contract were not enough for you, it would not be enough for us.
From repo to first trade

A pilot you can stand up in an afternoon.

No multi-month implementation project, no rooms full of consultants. Clone the repository, bring up the stack with Docker, and book your first trade against a real ledger.

bash
$ git clone https://github.com/opentrms/opentrms
$ cd opentrms && docker compose up -d
✓ Started TrmsApplication in 4.2s
✓ API explorer → http://localhost:8080/docs
✓ First trade booked · audit trail live
API explorer Swagger UI at /docs
Versioned schema Forward-only migrations
Executable specs Cucumber BDD suite
Self-hosted Open source · your VPC
20-part video series

See the system before you commit a line of code.

Twenty short videos recorded against the running system — deal capture, lifecycle events, the audit trail, EOD batch and the AI control room. Screen recordings throughout, so you are judging the software rather than a deck.

Open source · No license metering · Self-hosted from day one