Side Projects
Case 10 / 10
A daily market brief for my dad
An automated digest that runs itself, plus a scoring tool that replaced my own ad-hoc stock picking with something repeatable.
Personal · 2025–2026 · Designer, builder, and operator
- The positions are mine. My dad likes to follow how they're doing without logging into a brokerage app.
- So a digest emails both of us holdings, charts, and a written brief every weekday morning.
- It has run unattended on a free-tier cloud VM since I set it up, alerts included if a run fails.
- A second tool scores names on fixed criteria, so I stop picking on impulse.
- Python
- matplotlib
- LLM API
- Oracle Cloud ARM VM
- cron
See the holdings, then the brief
Interactive — synthetic dataClick a column to sort the holdings — then switch to Brief to see the emailed output.
Real tickers, illustrative positions and prices. Not investment advice.
| Ticker | Sector | Shares | Avg cost | Price | Day | Value ▼ | P/L | P/E | Earnings |
|---|---|---|---|---|---|---|---|---|---|
| MSFTMicrosoft | Technology | 15 | $310.00 | $412.80 | +0.6% | $6,192 | +33.2% | 35.7 | Oct 22 |
| AAPLApple | Technology | 25 | $165.20 | $228.40 | +1.2% | $5,710 | +38.3% | 34.1 | Oct 30 |
| JNJJohnson & Johnson | Healthcare | 30 | $152.10 | $158.90 | −0.3% | $4,767 | +4.5% | 15.2 | Oct 15 |
| UNHUnitedHealth Group | Healthcare | 8 | $480.00 | $561.20 | −2.4% | $4,490 | +16.9% | 19.7 | Oct 16 |
| JPMJPMorgan Chase | Financials | 18 | $138.50 | $205.60 | +1.8% | $3,701 | +48.4% | 12.1 | Oct 11 |
| HDHome Depot | Consumer Discretionary | 10 | $310.00 | $358.70 | +0.4% | $3,587 | +15.7% | 24.3 | Nov 19 |
| VVisa | Financials | 12 | $220.00 | $289.50 | +0.9% | $3,474 | +31.6% | 30.6 | Oct 24 |
| PGProcter & Gamble | Consumer Staples | 20 | $145.00 | $168.30 | +0.2% | $3,366 | +16.1% | 26.4 | Oct 18 |
| KOCoca-Cola | Consumer Staples | 40 | $58.30 | $63.90 | +0.1% | $2,556 | +9.6% | 24.9 | Oct 23 |
| XOMExxon Mobil | Energy | 22 | $98.20 | $112.40 | −1.1% | $2,473 | +14.5% | 13.8 | Nov 1 |
Sector performance today
- Technology+0.9%
- Healthcare−1.3%
- Financials+1.4%
- Consumer Staples+0.2%
- Consumer Discretionary+0.4%
- Energy−1.1%
Real, well-known tickers so this doesn't read as a toy — but the shares, prices, and P&L below are illustrative, not my actual positions. This shows the holdings-and-brief side of the system; the separate scoring tool that shortlists new candidate names isn't modelled here.
How it fits together
- 1Scheduled trigger
- 2Market data pull
- 3Portfolio and P&L calculation
- 4Chart generation
- 5LLM-written brief
- 6Email delivery
- 7Failure alerting
Read the full case study Hide the case study
The problem
The positions are mine, but my dad likes to keep an eye on how they’re doing. He isn’t going to log into a brokerage app to do it, so in practice that meant texting me and waiting for whenever I got around to answering.
Separately, I had my own problem: I was picking stocks on whatever I had read that week. No consistent criteria, no way to compare two names against the same yardstick, and no record of why I had bought anything.
Why it mattered
The first is not really a technical problem. It is that someone I care about was dependent on me being available, for something that should not require a person at all.
The second is a discipline problem. Ad-hoc selection feels like research and is mostly recency bias. I wanted a process I could apply the same way every time, even if the criteria turned out to be imperfect — at least they would be consistent and written down.
What I built
The digest runs every weekday on a free-tier ARM cloud instance. It pulls market data, values the portfolio, generates charts, has an LLM write a short plain-language brief, and emails the lot to both of us before the market opens. It has run unattended since I set it up, with alerting if a run fails, so a missed morning email gets caught immediately instead of discovered by its absence.
The scoring tool ranks names against fixed criteria to produce a daily shortlist. It is explicitly not a buy signal — it narrows the field so my own research starts somewhere defensible instead of starting with whatever I saw last night.
What I learned
Building something another person depends on changes how you build it. A script that fails silently is fine when it is only for me; it is not fine when someone is waiting for an email at seven in the morning. That pushed me toward unattended operation and failure alerting much earlier than I would have bothered with otherwise.
What I would do next
Moving the scoring tool off my laptop onto the same scheduled infrastructure as the digest. And back-testing the scoring criteria, which I have not done and should not claim to have done.