Trunk for Fintech

Ship like a startup.
Prove control like a bank.

Keep main green as volume climbs, even when tests flake. Prove every change.

Trusted by top engineering teams that move money
RampBrexValon
and more regulated fintechs under NDA, from card issuers and crypto custodians to mortgage servicers
250+PRs / hour, sustained
15M+CI jobs / month

Ship as fast as safely possible.

Every team wants speed and a green main. When you move money, a red main or a bug that slips through costs more. You can't buy speed by skipping checks.

Without Trunk
With Trunk
A PR sits in the queue for an hour and nobody can say why, or which PR broke the queue when it backs up.
Every PR shows its state and what it's waiting on. When the queue breaks, you see the culprit PR.
Your single-lane queue backs up every few weeks and time-to-merge climbs.
Proven past 250 PRs/hour without backing up, and it stays up through GitHub hiccups.
A flaky test on a money path blocks dozens of PRs. You can't skip it, so everyone waits and re-runs until green.
Flaky tests are quarantined automatically. They keep running and reporting, but no longer block. Real breaks are still caught.
You merge and hope. No clean signal of what's actually in main or whether it was tested against the latest.
Always know the latest good state of main. Every PR is tested against the true future state before it lands, and recorded.
Agents fork off a red main and burn tokens on failures that were never theirs.
Agents start from green. Tokens go to the feature, not someone else's flake.

One controlled path to green main

1Every change enters through the queue
main
Gate
required checks
non-author approval
tested vs future main
4832 payoutstesting
4823 kyc-batchqueued

PRs are tested against the true future state of main before they land. Required checks, non-author approvals, no direct pushes. The queue is the only path to production code.

2Flakes can't poison the pipeline
4831 · ledger-svc
tests passed
quarantined 5 flakes
4832 · payouts-api
tests failedpending failure
4833 · kyc-batch
testing

Trunk detects flaky tests and quarantines them with a logged reason. Quarantined tests still run and still report. Anti-flake protection within the merge queue keeps good PRs moving.

3See what's stuck, keep every record
Merged8d ago
#4819 fx-rates
Testing8d ago
#4832 payouts-api
Submitted8d ago
#4823 kyc-batch
Cancelled9d ago
#4820 ledger-svc

See what's stuck and why. Live queue state, what each PR is waiting on, and which PR broke the queue when it backs up. Every merge also leaves a timestamped record, streamed to your systems.

For the way fintechs ship

See the queue and what broke it

Every PR shows its state and what it's waiting on. When the queue backs up Trunk names the culprit. Queue depth, time-in-queue at P50/P95/P99, throughput, and restart counts scrape to Prometheus or Datadog. Plus a health endpoint and a public status page.

trunk-io/monorepo merging into main
#4806 feat(ticketing): auto-ticket trigger Testing
#4832 fix(payouts): settlement retry Bisecting
failed integration/settlement
#4833 feat(kyc): batch verification Waiting
waiting on #4832
#4819 refactor(grafana-alerts) Merged
Lane 1
4806
4812
4819
4841
Lane 2
4823
4828
4832
4847
non-overlapping batches

Throughput that holds at scale

Parallel, Bazel/Nx-aware queues test non-overlapping PRs at once, so one bad PR can't stall the rest. Batching up to 100 cuts CI cost 60–80%. Hotfixes take a priority lane.

Flaky FailureSuccess
Run conclusions in 30 days
Jun 24Jul 3Jul 12Jul 22
3 failures · 1 fingerprint
→ root cause: shared clock stub

Detect, quarantine, and root-cause flakiness

Flakes are quarantined without a code change, so they stop blocking merges but keep running, and a broken test is never auto-quarantined. Fingerprinting and full history point at the few root causes behind most flakes.

mmatheson admin
/trunk merge --force
feat(triage): default triage agent
#4832 Forced Merged
tested before landing · attributable

Governed exceptions, gated by role

Force-merge is admin-only, tested before it lands, and badged. Deliberate and attributable, never a silent push to main. You decide who can force-merge and who can quarantine.

“We would have never known how many flaky tests we had exactly, or to what level each of them was flaky. Now we say it meets this level, and that's it. It's quarantined.”

Brex
Joshua Inoa
Engineering Manager,
Release Infrastructure
60K
Tests in a Bazel monorepo
50%
Fewer merge-queue failures
30%
Drop in P90 time-to-merge

See it run against your own monorepo

Your merge gate is your audit evidence.

SOX ITGC, SOC 2 CC8.1, PCI DSS, DORA. They all ask the same thing of every production change, and the merge queue is where you prove it. Every change is tested, reviewed by a second person, and recorded. That's the evidence auditors sample, produced as a byproduct of shipping. Flaky-test detection keeps those checks trustworthy.

SOX ITGC · PCI DSS 6 · DORA Art. 9

Change management

DORA wants every change “recorded, tested, assessed, approved, implemented and verified in a controlled manner.” That is the queue: required checks, non-author approval, no direct pushes to main, each step recorded.

SOC 2 CC8.1

Segregation of duties

The author can't approve or merge their own change, and overrides are RBAC-gated. The control your auditor tests, enforced on every merge instead of written in a policy doc.

SOC 1 · SEC 17a-4 · NYDFS 500

Evidence you own and keep

Each merge emits a timestamped record to your SIEM or evidence store (Splunk, Datadog, an S3 bucket). Trunk holds 45 days. You can set up webhooks to hold the multi-year archive your auditors sample from.

The security review, pre-answered

What Trunk can access

Merge Queue needs write access to operate: the GitHub App requests Contents, Checks, Actions, Issues, Pull Requests, and Workflows (read/write), plus Administration read-only for branch-protection rules, which it cannot change. Force-merge is a separate opt-in app, and repo-subset installs limit which repos Trunk touches. Flaky Tests needs only your test results in JUnit XML format.

What data leaves, and for how long

Test results and CI metadata. Not source code, and no repository content retained.

Data is encrypted in transit and at rest, in US-based AWS. The full subprocessor list includes the AI providers we use for failure analysis. Trunk keeps it 45 days. For longer retention, stream it to your own store, or run everything in your own account with Bring your own cloud.

Certifications and paperwork

SOC 2 Type II
Annual penetration tests
DPA on request
Security overview

Frequently asked questions

Does quarantining skip flaky tests?

No. A quarantined test keeps running and reporting — it just stops blocking merges. Every quarantine is logged with a reason and an owner, protected suites can be excluded, and consistently failing tests are never auto-quarantined.

We're on GitHub's merge queue today. What's the migration story?

It's our most common path in. Where GitHub runs a single serial queue, Trunk runs parallel, batched, flake-aware queues that use your build graph, so unrelated PRs stop blocking each other (full comparison). Migrating is easy: turn off GitHub's merge queue in your branch settings, enable Trunk Merge Queue on the repo, and cut over. You can run both at once first, with Trunk's PR comments muted, to evaluate quietly before the switch.

Will Trunk have access to our source code?

Flaky Tests: no — it consumes only test results in JUnit XML format. Merge Queue: yes, it needs Contents read/write to build and merge queued branches, which is inherent to operating a queue. But we do not retain repository content on our servers, every scope is documented, and repo-subset installs limit which repos the app touches.

What happens to merges if Trunk is down?

The queue fails safe and visibly: pause/unpause, polling mode for GitHub degradation, and role-restricted break-glass merge so an incident fix never waits on us. Uptime history is public.

We're rolling out coding agents. How does Trunk help?

In two ways. Agents fork from main, so keeping main green means their tokens go to the task instead of debugging someone else's flake, which matters as more and more code becomes AI generated. Secondly, Trunk's MCP server hands an agent the full history of a flaky test, its past failures, stack traces, and git context, so it works from the pattern instead of guessing off the last CI run.

Ship like a startup. Prove control like a bank.

For teams that move money: keep main green and prove every change.