Fund Helper Puts Portfolio Tracking into Your Browser, Editor, and Desktop
Multi-platform delivery is a hard engineering problem that forces teams to choose between a shared backend and independent clients. Fund Helper demonstrates a pragmatic middle path: a unified business model with per-platform runtimes, where normalization rules are duplicated across Python, TypeScript, Rust, and Kotlin to keep portfolio numbers identical everywhere without a mandatory server dependency.
Fund Helper aggregates fund holdings from the Chinese platform Yangjibao into a unified snapshot, then distributes that snapshot across five distinct clients. A FastAPI backend with MongoDB powers the full web dashboard, while the browser extension, editor plugins, and Tauri desktop client operate independently by connecting directly to the upstream API. Each client normalizes raw fund NAV fields using a shared priority rule so that estimated change percentages and daily returns stay consistent whether viewed in a Chrome popup, a VS Code sidebar, or a macOS menu bar. The project also bundles market rankings from AKShare/East Money, sector heatmaps, and configurable push notifications to DingTalk, Feishu, and WeCom. Docker Compose, GitHub Actions release scripts, and an Rspress documentation site turn the codebase into distributable software rather than a personal script.
Duplicating business logic across four languages is normally an anti-pattern, but here it is a deliberate trade-off that keeps the browser extension and desktop client zero-dependency, which lowers adoption friction more than a shared library would.
The decision to use a hand-rolled SVG chart instead of ECharts is driven by bundle-size constraints in Chrome extension popups and VS Code Webviews, where every kilobyte affects perceived startup speed.
QR-code login across Webview, JCEF, and Tauri surfaces a subtle state-machine problem: timer cleanup and session deduplication become the hardest parts, not the OAuth flow itself.
Multi-entry snapshot broadcasting in editor plugins solves a user-trust issue, not a performance one. When the status bar, bottom panel, and sidebar show different numbers, users assume the tool is broken.