PortfolioPulse: Real-Time Multi-Asset Portfolio and Alert Engine
A cross-platform mobile app (Flutter, live on Android and iOS-ready) for Indian-market traders that pulls every asset class into one live P&L view and sends staged alerts as a position reaches its entry, target, or stop. It runs on a production-grade .NET 10 API with PostgreSQL 16 and a separate 24/7 executor daemon that handles end-of-day ingestion, alert evaluation, and intraday price polling on its own schedule.

2,300+
Automated Tests
4
Asset Classes
Live 2026
In Production
The Challenge
Holdings are scattered across brokers (Groww, Zerodha, Upstox) with no single view of net worth or true profit and loss
In many Indian households one person tracks the whole family's investments, so a spouse's or parents' holdings end up mixed into the same spreadsheet with no clean way to keep them apart
Stock-only trackers ignore half the portfolio. Indian investors also hold ETFs, mutual funds, and physical gold and silver, invisible in most tools
Broker alerts are a single ping, not a journey. There is no staged notification as a position moves from entry toward its target, or drifts toward its stop
Watching dozens of positions by hand is error-prone. The one moment that matters, the touch of a target or a stop, is the one you miss
Alert noise trains you to ignore alerts. Pings fire for watchlist names you do not even own
Indian mobile networks drop. A cloud-only app becomes unusable on a flaky connection
Our Approach
We built PortfolioPulse as a focused, production-grade full-stack product: a Flutter mobile app backed by a .NET 10 API on PostgreSQL 16, with a separate 24/7 executor daemon that does the market work (end-of-day ingestion, alert evaluation, and intraday price polling) on its own schedule. The centerpiece is the alert engine. Each position gets staged push notifications, not a single ping, as it moves through its journey (buy-range, halfway-to-target, break-even, approaching-stop, target, and stop). The terminal target and stop pushes fire exactly once even with the intraday and end-of-day evaluators running concurrently, guarded by an atomic compare-and-set on the alert row, and the progress milestones are de-duplicated through a trigger-history ledger so each lands a single time. A configurable two-stage trailing stop ratchets protection up as a trade works, and alerts are holdings-aware, so the ones for assets you actually hold surface with a live position line and one-tap Exit or Sell actions. Prices are live where it counts: realtime quotes come from Zerodha Kite Connect (Yahoo Finance as fallback) and stream to the app over SignalR, so the consolidated portfolio recomputes live P&L with no user action. A local Drift and SQLite cache keeps the app fast and readable on a poor connection, reconciling with the server through a debounced sync engine.
Key Features
Consolidated multi-asset portfolio across stocks, ETFs, mutual funds, and physical gold and silver, with invested value, current value, and P&L (including today's P&L) in one dashboard
Multiple named portfolios for the common case where one person tracks the family's investments (self, spouse, parents), each viewable on its own or rolled up into the consolidated total
Live P&L with no refresh: the consolidated view overlays realtime prices streamed over SignalR and recomputes totals on-device
Multi-level alert engine (buy-range, half-target, break-even, near-stop, target, and stop) with each stage pushed once, plus a configurable two-stage trailing stop
Holdings-aware alerts with Active, In-Holdings, and Completed tabs, a live position line on alerts for assets you hold, and one-tap Exit or Sell and add-transaction actions
Signal, not noise: an 'only notify for assets I hold' filter (default on), while buy-range and the daily summary always come through
Broker statement import with one-tap parsers for Groww and Zerodha (Upstox, Paytm Money, and generic CSV also built in)
Interactive charts: a stock-overview preview that opens a fullscreen landscape candlestick chart with an optional buy-price marker
Persistent notification inbox: every push is captured server-side and synced into an in-app feed, so nothing is lost when the app was closed at delivery
Offline-capable via a local SQLite cache with resilient cloud sync (periodic, on-reconnect, and debounced after edits)
Secure accounts: JWT auth with a security stamp that invalidates every existing session the instant a password or email changes, plus rate-limited OTP password reset
Built for a real launch: in-app feedback, Terms and Privacy screens, and Beta indicators that auto-clear at v1.0.0



Scope & Scale
1,306
Flutter Tests
1,063
.NET Tests
NSE + BSE
Exchanges Covered
23yr
Trailing-Stop Backtest
Tech Stack
Technical Challenges We Solved
Fire-exactly-once staged alerts under concurrent evaluators
Each position moves through buy-range, halfway-to-target, break-even, approaching-stop, target, and stop. The terminal target and stop pushes fire exactly once, even when the intraday poller and the end-of-day evaluator both decide the level has been reached at the same instant, guarded by an atomic compare-and-set on the alert row. The progress milestones in between are de-duplicated through a trigger-history ledger, so each stage lands a single time.
Race-safe holding recompute on the money path
Every holding recompute runs inside the write transaction under a PostgreSQL advisory lock, so concurrent edits to the same portfolio serialize instead of interleaving. Sells are checked against units held by a race-safe oversell guard, and transaction sync is idempotent through a client-supplied id backed by a unique-indexed upsert, so a retried request cannot double-apply.
Configurable two-stage trailing stop
Protection ratchets up in two stages as a trade works in the holder's favour and never loosens. The default was stress-tested across roughly 23 years of NSE price history (about 98,000 simulated trades) and outperformed the flat and volatility-scaled alternatives tested. This was an engineering-rigor exercise to validate a design default, not a promise of returns.
Offline-first sync over flaky networks
A local Drift and SQLite cache keeps the app fast and readable on a poor connection. It reconciles with the server through a debounced sync engine that runs periodically, on reconnect, and after edits, and the intraday evaluator rejects stale or outlier ticks before they can trigger a level.
Realtime pricing with a hard fallback
Realtime quotes come from Zerodha Kite Connect and stream to the app over SignalR, so the consolidated portfolio recomputes live P&L with no user action. Yahoo Finance is the fallback source, and end-of-day ingestion retries and fails loudly instead of silently writing stale data.
The Result
PortfolioPulse runs live in production for Indian-market traders as a full-stack investment companion. Holdings and alerts update in real time, and the app pushes the moments that matter (entry, halfway, break-even, near-stop, target, and stop) with held-asset-only filtering to keep the noise down. One consolidated view across brokers, asset classes, and every portfolio in the household replaces the old spreadsheet-and-screenshot workflow.
Reliability was a first-class requirement, not an afterthought. Realtime pricing runs on Zerodha Kite Connect with a Yahoo fallback, end-of-day ingestion retries and fails loudly instead of silently writing stale data, and the 24/7 executor logs every job cycle to a structured Postgres store with 90-day retention. Releases are health-checked (a timestamped release, a symlink swap, and health checks on both services) with automatic rollback to the previous release on any failure.
PortfolioPulse is MindGears' own R&D product and a proof point for what we ship: a realtime, cross-platform financial application taken end to end, from live broker data to a polished, accessible mobile app, with the money-path correctness, security, and operational discipline a finance app demands. The default two-stage trailing stop was stress-tested across roughly 23 years of NSE price history (about 98,000 simulated trades) to validate a design default, not as a promise of returns. Fully automated trade execution via Zerodha is next on the roadmap.
What Keeps It Running
2,300+ automated tests, green on every release (1,306 Flutter, 1,063 .NET)
24/7 executor daemon logs every job cycle to a structured Postgres store with 90-day retention
Health-checked releases: timestamped release, symlink swap, health checks on both services, automatic rollback on failure
End-of-day ingestion retries and fails loudly instead of silently writing stale data
Health checks guard both the API and the executor daemon
Building a realtime finance or trading app?
Money-path correctness, staged alert engines, realtime price layers, offline-first mobile. We've taken these end to end in production. Tell us what you're working on.
Get a Free Quote