A full-stack ETF portfolio decomposer that breaks any portfolio down into its true underlying holdings, with live prices, sector and geographic exposure, and saved user accounts.
Built first as a Python CLI, then rebuilt entirely as a production web application deployed at portfoliovision.online.
Part 1 · Python CLI
Full-featured terminal decomposer with recursive ETF unwrapping, mixed USD/CAD currency detection, tabular holdings output with sector and geographic breakdowns, and a captured/untracked coverage summary. Handles circular references and depth capping.
PythonCLIJSON
The CLI output, trimmed: currency detection, the input portfolio, and the top of the unwrapped holdings table.
Part 2 · Web App
Production web application with live stock prices via a Yahoo Finance proxy, Google OAuth and OTP email authentication via Supabase, saved portfolios with per-user row-level security, a USD/CAD display toggle with real-time Frankfurter API conversion, and Logo.dev company logo resolution. Deployed on Vercel with analytics.
ReactViteTailwind CSSSupabaseGoogle CloudVercel
The deployed app at portfoliovision.online, with live prices and saved per-user portfolios.
Highlights
→Recursive ETF decomposition across 500+ tickers with configurable depth cap and circular reference protection
→Live price fetching across US and Canadian exchanges (TSX, NEO, CSE) through a Vercel serverless proxy to Yahoo Finance, removing API key requirements and exchange restrictions
→Google OAuth and OTP email auth via Supabase with row-level security policies per user
→Real-time USD/CAD conversion via Frankfurter API with per-position and display-level currency toggling
→400+ page views in the first week of launch, tracked via Vercel Analytics
→Deployed end-to-end on Vercel with a custom domain and environment-based secrets management