Track your dividend portfolio's yield, payout history, and breakdown β without juggling five brokerage tabs.
π Live demo: dividend-tracker-pi-navy.vercel.app
Built to track a real dividend portfolio targeting $5,000/month passive income for early retirement.
- Why this exists
- Features
- Stack
- Architecture
- Screenshots
- Local development
- Roadmap
- Contributing
- Disclaimer
- License
- Acknowledgements
Most portfolio dashboards bury dividend data three clicks deep, or assume you only care about share price. As a long-term dividend investor I wanted answers to three questions at a glance:
- What's my forward yield across the whole portfolio?
- When am I getting paid, and how much?
- Which positions are actually carrying the income?
Dividend Tracker exists to answer those three questions on one screen.
- π Portfolio overview β total value, cost basis, forward yield
- π Payout history β past distributions visualized over time
- π€ AI portfolio chat β ask questions about your holdings in natural language (OpenRouter)
- π Forward yield projections β estimate future income based on current positions
- π Stock search β add any ticker with live data from yfinance
- π Dark mode β easy on the eyes for late-night portfolio reviews
- π Upcoming payouts β ex-div and pay dates so you stop missing them
- π₯§ Position breakdown β yield, weight, and income contribution per holding
- π‘ Live price + dividend data pulled from Yahoo Finance via
yfinance
| Layer | Tech |
|---|---|
| Frontend | React 19, Vite, TypeScript, Recharts, Tailwind CSS v4 |
| Backend | FastAPI (Python 3.11+), Pydantic Settings |
| Data | yfinance (Yahoo Finance) Β· Supabase Β· OpenRouter |
| CI/CD | GitHub Actions Β· pre-commit Β· pytest |
| Hosting | Vercel (frontend) Β· Render (backend) |
βββββββββββββββββ ββββββββββββββββ ββββββββββββββββ
β React + Vite β ββββΆ β FastAPI β ββββΆ β yfinance β
β (Vercel) β β (Render) β β + Supabase β
βββββββββββββββββ ββββββββββββββββ ββββββββββββββββ
FastAPI handles ticker lookups via yfinance for live price and dividend history, persists user holdings in Supabase, and powers portfolio chat with OpenRouter. Recharts renders payout history and portfolio breakdown on the client.
docker compose up --buildDocker starts the API at http://localhost:8000. Create backend/.env from backend/.env.example before first run.
- Python 3.11+
- Node.js 20+
- A Supabase project (free tier is fine)
- An OpenRouter API key (free models are fine)
cd backend
python -m venv .venv && source .venv/bin/activate
pip install -r requirements-dev.txt
pre-commit install
cp .env.example .env # fill in SUPABASE_URL, SUPABASE_KEY, OPENROUTER_API_KEY
uvicorn app.main:app --reloadAPI runs at http://localhost:8000. Interactive docs at /docs.
For Render deploys, set SUPABASE_URL, SUPABASE_KEY, and OPENROUTER_API_KEY on the backend web service. Use /health/dependencies to verify connectivity after deploy.
cd frontend
npm install
npm run devApp runs at http://localhost:5173.
- DRIP simulation (reinvested vs cash payout)
- Dividend growth rate (1y / 3y / 5y CAGR)
- Sector + geography breakdown
- CSV import from broker statements
- Dividend safety / payout ratio flags
- Publish backend as a PyPI package
Issues and PRs welcome β particularly around new data sources, additional chart types, or broker-import formats. Open an issue before sending large PRs.
This project is for personal portfolio tracking and educational purposes only. It is not financial, investment, tax, or legal advice. Dividend and price data are provided by Yahoo Finance via yfinance and may be delayed, incomplete, or incorrect. Do your own research and consult a licensed advisor before making investment decisions.
MIT Β© Sonny May
- yfinance for live price and dividend data
- FastAPI and Recharts for the backend and charts
- Supabase and OpenRouter for storage and the portfolio chat