TradeTrack2: The Financial-Correctness Core
Financial software has no rounding room. I own the part of a portfolio analyzer where being exactly right is the whole job.
The Problem
Brokerage statements are messy and inconsistent. Your true positions, realized gains, and performance only exist if something parses them correctly, every time. Get the accounting wrong and every number downstream is wrong too.
What I Built
TradeTrack2 is an investment-portfolio analyzer I build with one other engineer. I own the financial-correctness core: the parsing and accounting that everything else trusts. Not the whole product - the half where a mistake is unacceptable.
Tech Stack
- C#
- Razor
- JavaScript
- Bicep
- PowerShell
- .NET 10
- ASP.NET Core
- Razor Pages
- Blazor Server interactive components
- SignalR
- EF Core
- SQLite portfolio.db
- PostgreSQL
- Npgsql
- ASP.NET Data Protection file-backed secrets
- Docker/Compose
- GitHub Actions
- GHCR package images
- Azure Container Apps + Bicep/ACR/Key Vault
- Cloudflare Worker update feed
- OpenRouter
- Google GenAI (Gemma/Gemini)
- AI Router service
- Microsoft Agents AI Workflows
- xUnit v3
- FluentAssertions
- WebApplicationFactory integration tests
- Testcontainers PostgreSQL
- coverlet
- Node/Bicep deployment contract tests
- SnapTrade.Net
- PdfPig
- Chart.js
- Bootstrap
- ExcelFinancialFunctions
How It Works
I own the broker-statement parsers (Fidelity and Schwab, PDF and CSV), a canonical symbol-normalization engine with OCC option formatting, and lot matching with realized gain/loss and holding-period tracking. Market data lives behind a standalone QuoteService the web app can only reach over HTTP, through an interface, with pre-shared-key auth and live health probes - so market data can never bleed into the accounting by accident. I also ran the SQLite-to-Postgres cutover.
What Made It Hard
Correctness with no tolerance: lot matching and realized gains have to be exact, not close. Keeping market data decoupled so the web app never reaches into it directly. Working inside one codebase with another engineer and keeping the seams clean enough that neither of us breaks the other.
The Throughline
This is the collaboration piece. I do not need to own the whole product to do my part well. I took the half where correctness matters most, made it dependable, and drew a hard interface around it so the rest of the system can trust it without knowing how it works.
Status
Active, ongoing collaboration. My contributions concentrate in the parsing, accounting, and market-data boundary.