Setting the type…
Setting the type…
Project 05 · Portfolio Dashboard · local
Fund statements arrive as password-locked PDFs, the broker lives behind an API, and prices live somewhere else again. This pipeline stitches it together once a month, entirely on my laptop.
Focus: The architecture
Step 1 of 6
Fund managers email monthly & quarterly statements as PDFs. A script searches Gmail (read-only access) for exactly those senders & subjects.
Step 2 of 6
Each statement is password-locked. The script unlocks it, then pdfplumber pulls the numbers out of the tables: value, invested, withdrawn, holdings.
Step 3 of 6
A local SQLite file. One table per source, one row per month, so history builds up on its own.
Step 4 of 6
Direct holdings come from the broker's API, and daily price history from a market-data library. Same database.
Step 5 of 6
Streamlit & Plotly turn it into charts: total value over time, returns by source, allocation. One command refreshes the lot each month.
Step 6 of 6
No cloud database, no hosted app, no third party holding my numbers. That's a design choice, which is why this page runs on made-up data.
Built with Python · Gmail API · pdfplumber · SQLite · Streamlit
Next project
LBS Yearbook →
Post moments as they happen, sign each other's pages, and get a 60-second Wrapped of your year.