Normalize first, analyze second
Manual entries, imports, and MT5 workflows feed the same trade model before they reach reporting. That keeps analytics rules independent from where a trade originated and makes the review system easier to extend.
Independent Build
A public iOS and Android trade journal and analytics app that turns raw trade logs into structured review loops, behavioral insights, and decision-grade reporting.
Product engineer owning architecture, analytics systems, integrations, and release delivery across iOS and Android.


01 · Context
BetterTrade started as a way to keep trade records useful after a position was closed. The product grew from a journal into a review and analytics system that connects capture, reflection, behavior, and the next decision.
That evolution meant the engineering problem was no longer simply storing trades. Manual entry, CSV and statement imports, MT5 Auto Sync, reviews, analytics, notifications, and cross-device services all needed to feed one consistent domain model.
02 · Constraints
Trade history can arrive through several formats and workflows, so imported and synced data has to land in a consistent model before analytics can be trusted.
The analytics surface needed enough depth to be useful without turning every new calculation into a tightly coupled screen-specific implementation.
A Flutter client, Firebase services, Cloudflare Worker/R2 infrastructure, and two mobile stores all have different failure modes and release concerns.
03 · Ownership
Designed the app architecture and Riverpod state boundaries around domain, data, and presentation layers rather than growing features directly inside screens.
Built the analytics and review system across performance, risk, behavior, insights, daily journaling, weekly reports, and structured post-trade review flows.
Implemented import/export and MT5-related workflows, Firebase integrations, Cloudflare Worker/R2 services, release hardening, and public delivery on both mobile stores.
04 · Engineering decisions
Manual entries, imports, and MT5 workflows feed the same trade model before they reach reporting. That keeps analytics rules independent from where a trade originated and makes the review system easier to extend.
Performance, risk, behavior, and insights are treated as related analytical areas rather than calculations embedded inside widgets. The UI consumes structured results while the analytical logic stays testable and reusable.
Daily journaling, post-trade review, weekly reports, notifications, and analytics are connected around a repeatable review loop. The product architecture follows that workflow instead of presenting isolated charts with no next action.
Firebase handles identity, application data, analytics, crash reporting, and app protection while Cloudflare Worker and R2 services cover supporting server and media workloads. The mobile client keeps those boundaries explicit.
05 · Hard parts
Imports and automated capture are valuable only if duplicate handling, field normalization, and downstream analytics remain consistent. The ingestion layer had to protect the rest of the product from source-specific quirks.
New review and insight surfaces depend on the same underlying trade history. Keeping calculations centralized reduces the risk that two screens explain the same trading data differently.
The product has been iterated through many releases, so release work includes crash monitoring, store hardening, backward-compatible data handling, and keeping cross-platform behavior aligned while features continue to move.
06 · Outcome
BetterTrade is publicly available on both the App Store and Google Play.
Manual entry, import/export, and MT5 Auto Sync all feed the same journaling and review model.
The architecture supports four main analytics areas alongside review workflows without relying on a hard-coded public version number as a proof point.
07 · Product walkthrough
7 published screenshots from the product. Open any frame to inspect it at full size.
Stack