Which parts of a trading platform are worth writing in Rust, who belongs in an outsourced dedicated team for a matching engine, and how to check that a firm has run Rust in production.
Look for a firm whose own engineers have built a matching engine or another part of the order path in Rust and kept it running in production. Before you sign, meet the people who would join your team. Rust earns its place where a delay costs money: the matching engine, pre-trade risk checks, exchange gateways and the market data handler. Screens, reports and back-office tools can stay in the languages your company already uses.
The short answer: shortlist firms that can describe one Rust system they run in production from end to end, including what broke after launch. Give the finalists a paid trial on your own recorded order flow. Write into the contract that the code, the tests and the replay data stay in your company's accounts. If you already run a platform in another language, move one component to Rust at a time and compare its results with the old one before you switch.
This article does not rank firms. A specialist is a firm whose own engineers have already shipped a trading system in Rust and run it for a client. A firm that would recruit its Rust engineers after you sign is offering a hiring plan instead.
Trading code is often private: clients usually own it and keep it that way, so a strong firm may have little trading code on GitHub. Ask instead for one production system described from end to end: what it does, which parts are written in Rust, how its speed is measured, who runs it today and what broke after launch. If a confidentiality agreement hides the client's name, ask the firm to arrange a call with that client.
Then check the people. Get the names and Rust experience of the engineers who would work on your system, and talk to them before you sign. The article on dedicated teams, linked above, covers the general checks: public code, a paid trial and a review by an independent engineer.
The parts on the path of an order, where a pause of a few milliseconds can change the price a client gets:
Rust fits these parts because it frees memory without a garbage collector. Some languages use one for this job, and it can pause the program at moments of its own choosing. The Rust book (the language's official guide, read on 27 October 2026) says that ownership, the set of rules behind this, “enables Rust to make memory safety guarantees without needing a garbage collector”.
The language does not make a system fast by itself. A Rust program can still stop to request memory, wait for a lock held by another thread or wait on the network. The article on matching engine design explains how a team keeps these out of the order path.
The rest of the platform has no deadline measured in milliseconds: web and mobile screens, client accounts, reports, back office and admin tools. These can stay in the languages your developers or vendors already use. A firm that proposes rewriting them in Rust should explain what that gains you.
Usually not all at once. A safer path is to move one component with a clear boundary, such as the risk checks or the market data handler, and leave the rest as it is.
The new component can run as a separate service that exchanges messages with the rest of the system. It can also be built as a library that C or C++ code calls directly. The Rustonomicon, the Rust project's guide to unsafe and low-level code, describes how in a section called “Calling Rust code from C”.
Before the switch, run the new component next to the old one on the same recorded order flow and compare every result. A deterministic matching engine always gives the same result for the same orders in the same sequence. That makes the comparison simple: if both engines apply the same rules, any difference points to a bug in one of them.
Then move one market or one group of instruments at a time, and keep the old component ready to take the traffic back.
A dedicated team works only on your system for months or years, and its members change only when you agree. For a matching engine or another part of the order path, it usually includes:
Your company has a part in it too. Someone on your side decides the trading rules, such as tick sizes, trading hours, fees and what happens when trading halts, and answers the team's questions about them without long delays.
Freelancers can be excellent engineers, but continuity is harder with them. A single contractor has nobody to review changes to the order path, and when that person leaves, what they knew about your system leaves too. A firm can replace someone and keep the knowledge in the team, and the contract can require it to.
A firm can only size the team after it has seen your trading rules, markets and volumes, so ask how it arrived at the number it quotes.
The article on low-latency firms covers how to check speed figures. These questions are about Rust and the order path:
Rust checks how memory is used when the code is compiled. Inside a block marked unsafe, code can do five things the compiler otherwise refuses, such as following a raw pointer to memory. The Rust book adds that unsafe “doesn’t turn off the borrow checker or disable any of Rust’s other safety checks”. A good answer names where unsafe code sits, why it is needed there and who checked it.
On testing, a team should name the tools it uses. cargo-fuzz, which the Rust Fuzz Book calls “the recommended tool for fuzz testing Rust code”, feeds a program large amounts of generated input to find the cases that crash it. Loom, a library for testing code that runs on several threads, “runs tests many times, permuting the possible concurrent executions of each test”. That finds bugs that appear only when threads happen to run in an unlucky order.
Crates are Rust's packages of shared code. The RustSec Advisory Database records security advisories for crates published on crates.io. Its tool cargo-audit checks a project's Cargo.lock, the file that lists the exact version of every dependency, “for crates with security vulnerabilities”. A team working on an order path should be able to tell you whether such a check runs on every build.
Rust releases a new stable version every six weeks, and the Rust book says “you should never have to fear upgrading to a new version of stable Rust”. A team can still keep every build on one chosen version. The documentation of rustup, Rust's installer, describes a toolchain file for projects that find themselves “'pinned' to a specific release of Rust” and want this recorded in their repository. For an order path, the version should change only on purpose, after the tests pass.
Write these points into it:
amBrain, which publishes this blog, describes itself in one line: “amBrain is a Yerevan, Armenia software engineering company building low latency trading platforms, matching engines, and real-time bidding systems in Rust.” Another line reads: “amBrain builds algorithmic trading infrastructure: order execution, market data and pre-trade risk controls.”
It has been building software since 2019. Its team, in its own words: “A team of up to 40 people, about 75% of them senior.” It works in three formats: full delivery, a dedicated team, or engineers embedded in your team. Its line on ownership is “The client keeps full ownership of the product and the code, except our reusable components.”
This article is not a case study and describes no client work. It does not say which systems amBrain has built in Rust or for whom, and it gives no amBrain prices, timelines or team sizes. If amBrain is on your shortlist, give it the same questions as any other firm.
Bring your current architecture and the failure mode that worries you, and we will go through it together in half an hour.
Book a Call