Lawrence Plante
← ./all-work

StratTrax

Built

my code, end to end

A third-party member app running inside a live options-trading platform's portal

The platform tells a member how one strategy backtests. StratTrax lets them blend strategies into a portfolio, journal what they actually traded, and see the two side by side. It runs as a sandboxed app inside the platform's member portal, and every byte of platform data arrives through the owner's SDK.

Role

Solo project · designed, built, and shipped by me

Timeline

September 2026 – present · in production

Stack

  • React 19
  • TypeScript 6 (strict)
  • Vite 8
  • Tailwind CSS 4
  • TanStack Query 5
  • React Router 7
  • Recharts
  • Node storage service + SQLite
  • Railway
  • Vitest + Testing Library
  • GitHub Actions CI

The problem

Members of the platform run several alert strategies at once, but the platform's backtester evaluates one strategy at a time. Nobody could answer the question that matters to someone running a mix: what does my actual portfolio of strategies look like, and how does what I really traded compare with what the simulation said I should have made?

The platform owner opened a member-app program with an SDK and a strict integration contract. I designed StratTrax to live inside it.

What I built

A tracker is a portfolio of saved strategy profiles, each with its own allocation. Run it and you get the combined result: equity and drawdown curves, per-strategy contribution, P&L by day, week, and month, capital in use, exit reasons, and a full trade log that stays fast past 500 rows through virtualization.

The journal pulls the member's executed trades, lets them assign each one to a strategy and add notes and tags, then lines up realized results against the platform's simulation for the same window. Compare overlays up to four trackers or profiles on one chart, and the research and optimizer views run configurable studies side by side.

Member-authored settings save to a small Node storage service on Railway, keyed to the platform member ID, so a member can pick up where they left off on another device.

Inside the member portal

StratTrax home page
Home. Published strategy studies sit beside the member's own workspace, and each published result carries its tested dates, account settings, fill model, and a note when the results are incomplete.
Trackers page with results period presets and tracker cards
Trackers. One results period applies to every tracker, and Run all ready states its cost before anything runs: how many trackers are ready, how many backtest calls the run will use, and how many are left this hour. Here every leg is cached, so the run costs nothing.
Saved strategies list
Saved strategies. Each profile shows its exit rules and which trackers use it, and can be edited, duplicated, or sent straight to the optimizer.

Building inside someone else's platform

The integration contract is not negotiable, so the code enforces it mechanically. The app renders in a sandboxed iframe and reads platform data only through the SDK. What may be stored on a member's device is tightly limited, so a lint-time persistence guard scans the source and fails the build if any code outside the approved storage modules touches localStorage, IndexedDB, cookies, or the Cache API.

Every member gets hourly quotas, including 120 backtests. StratTrax mirrors those quotas itself: nothing runs on load or on a keystroke, the Run button shows what a run will cost and what is left this hour, cached legs cost nothing, and a cooldown is shown as a cooldown instead of a failed request.

Living in an iframe has its own problems. I replaced the SDK's default auto-sizing with a measured height report and wrote scroll restoration that works across the cross-origin boundary, then covered both with regression tests.

Research and the optimizer

Optimizer research wizard
The research wizard. Screen exit families with platform backtests, shortlist the promising setups, then refine them in later rounds. The backtest calls still available and the session's test count stay in view the whole way through.
Optimizer research workspace
The research workspace. Load one source, pin an account baseline, then replay a small rule change against it.

No number without its evidence

Every result sits under an honesty strip: alerts loaded, filtered, skipped, quality-excluded, and capped, per strategy and in total, with a red banner if the simulated account blew up. When the platform caps a trade list, the tiles fall back to the platform's own aggregates and are marked partial. A null is treated as unknown, never as zero.

Caveats on the page

Published strategy result with equity curve
A published strategy result. The headline figures sit with the starting balance, position cap, fill model, and fees that produced them, a warning that the replay is incomplete, and a note that the results are not independently verified.
Alert exploration view in Research
Alert exploration. Try a different exit against a single alert's price path, with the model's assumptions written out underneath and a warning to recheck any shortlisted setting in a platform backtest before comparing profits.

By the numbers

300+

commits

in under four weeks, all mine

1,800+

automated tests

across 176 test files

54K+

lines of TypeScript

about half of it tests

9

CI checks on every push

types, lint, tests, SDK contract, bundle size

How I worked

Spec first. An approved design spec, four milestone plans, and dated release notes live in the repository next to the code. I build with AI coding agents, and the process is what keeps that honest: nothing ships unless typecheck, lint, the full test suite, the SDK contract tests, and the bundle-size check all pass.

StratTrax is in production inside the platform's member portal today.

Want to talk through how this was built?

I am happy to walk through the decisions, the parts that did not work, and what I would do differently. Email is the fastest way to reach me.