~2s → ms
reaction after a partial fill
Measured before → after on the one event that actually costs money: reassembling a position after a partial fill.
HQ Paphos, Cyprus · worldwide
99 Francs designed and built an automated trading and market-making system for an independent quantitative trading desk on Polymarket. We kept the quant logic in Python and moved only the latency-critical execution path into a Rust sidecar — cutting the reaction time on the most expensive event from roughly two seconds to the low tens of milliseconds, without rewriting a line of strategy code.

A Python quant engine, a low-latency Rust execution core, a React control dashboard, a full backtesting and replay system, and a safe virtual-to-real rollout. We build the infrastructure and the safeguards — strategy and returns stay with the client.
The headline win is the reaction time on a partial fill — a measured before / after, with a sub-20 ms in-process decision budget verified against recorded market data.
~2s → ms
Measured before → after on the one event that actually costs money: reassembling a position after a partial fill.
~100×
Round-number framing of roughly two seconds down to the low tens of milliseconds.
2,700+
Across Python (1,731) and the Rust execution crate (~1,000) — unit, replay and certification runs.
~2 months
A bounded sub-project, flag-gated per market and validated live before being armed under a formal certification.
The desk needed an execution path fast enough to avoid getting picked off, a way to test many strategies without risking capital, and a gated, reversible route to putting real money on-chain.
Four surfaces, each with one job — with the millisecond-sensitive work isolated in Rust so the rest could stay in the language it belonged in.
Live price feeds and the venue order book continuously update in-memory state. The Python engine runs each enabled strategy in its own loop; when conditions are met it sizes the position against real book depth, signs the order, and either sends it directly or — for the market-making path — hands the quote context to the Rust sidecar over a local Unix socket. The sidecar owns the millisecond place / cancel loop; fills stream back over a user-WebSocket, reconcile into inventory and write to SQLite, which instantly powers the dashboard and Telegram alerts. The sidecar is best-effort: if it drops, Python falls back to native handling — it can never take the system down.
The obvious answer — “rewrite it all in Rust” — was the wrong one. The quant models, signing, accounting and risk were correct and valuable. We moved only order-book ingestion, the decision loop and place / cancel into a Rust sidecar; the core migration landed in about two weeks, and the full execution plane followed over the next weeks.
| What we measured | Before (Python) | After (Rust plane) |
|---|---|---|
| Reaction after a partial fill | 0–2+ seconds | low tens of ms (sub-20 ms in-process decision, verified on recorded market data) |
| Decision tick | multi-second poll | ~5 ms |
| Cancel path | Python HTTP round-trip | removed from the hot path |
| Strategy code rewritten | — | none |
Strategy thresholds and formulas stay the client's — what we built is the system around them.


On the platform's A/B framework the client backtested around 65 strategies. One automated arbitrage strategy reached +955% ROI at a 77.1% win rate across 481 fully automated trades over ~4 months. That is the client's own result on our infrastructure — we make no performance promises and never sell returns; we build the system that lets a quant team find and validate strategies safely.

Spec-driven and test-heavy: a detailed design doc — reviewed independently before a line was written — preceded every milestone, each shipped in small, feature-flagged, reversible steps.
We stood up the three-tier stack, migrated to the venue's V2 API, and shipped the first arbitrage family — establishing functional correctness before any optimisation.
The center of gravity: proliferating and hardening strategies, diagnosing where the market-maker was getting picked off, and building the first fast-cancel Rust sidecar.
We refactored the engine into a registry-driven layout, made inventory accounting exact, and moved the book and decision loop into Rust — the core migration landed in about two weeks.
We extended the sidecar to serve several markets at once, then ran an explicit measurement phase — verifying latency and parity against recorded data before scaling by diversification, not size.
Every major milestone passed multiple rounds of independent AI code review before merge, and the live controller stays flag-gated per market — a control surface for safe rollout, not a sign the path is unfinished.
How a market-making bot survives on a fast prediction market: the anti-pickoff logic behind a live Polymarket system — pre-signed cancels, event-reactive requoting, order-book imbalance guards and enforced post-only quoting, and how they fire together the instant the underlying moves.
A live market-making bot on the Polymarket prediction market was leaking money to a slow control loop. We kept the quant logic in Python and moved only the latency-critical execution path into a Rust sidecar — cutting the reaction time on the most expensive event from roughly two seconds to the low tens of milliseconds.
Before a prediction-market trading strategy touches real money, we put it through backtests against real order-book depth and a staged ladder of simulation modes — inert, virtual, mirror, then a small real bring-up. Here is how the de-risking pipeline works, and why every promotion is gated by evidence rather than optimism.
A trader asked us to rewrite his weather market maker in Rust. We measured the opportunity first — 256,000 order-book snapshots across 1,702 temperature buckets — and told him not to build it. What the reward economics actually look like, why the richest markets are the worst, and why we threw away our own positive result.
Have a system that's fast enough to be dangerous but slow enough to leak money?
Only for the latency-critical path. Here the problem was a slow control loop, not a slow language: a multi-second poll left the follow-up quote seconds late. We kept the quant logic in Python and moved only order-book ingestion, the decision loop and place/cancel into a Rust sidecar. More on the approach in our Python-to-Rust migration write-up, and the Python development service.