NiravProof of work
← All projects

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.
Every weekday unattended, since 2025
  • Python
  • matplotlib
  • LLM API
  • Oracle Cloud ARM VM
  • cron

See the holdings, then the brief

Interactive — synthetic data

Click a column to sort the holdings — then switch to Brief to see the emailed output.

Real tickers, illustrative positions and prices. Not investment advice.

Total value$40,315
Today+$72 (+0.18%)
Total P/L+$7,507 (+22.9%)
TickerSectorSharesAvg costPriceDayValueP/LP/EEarnings
MSFTMicrosoftTechnology15$310.00$412.80+0.6%$6,192+33.2%35.7Oct 22
AAPLAppleTechnology25$165.20$228.40+1.2%$5,710+38.3%34.1Oct 30
JNJJohnson & JohnsonHealthcare30$152.10$158.900.3%$4,767+4.5%15.2Oct 15
UNHUnitedHealth GroupHealthcare8$480.00$561.202.4%$4,490+16.9%19.7Oct 16
JPMJPMorgan ChaseFinancials18$138.50$205.60+1.8%$3,701+48.4%12.1Oct 11
HDHome DepotConsumer Discretionary10$310.00$358.70+0.4%$3,587+15.7%24.3Nov 19
VVisaFinancials12$220.00$289.50+0.9%$3,474+31.6%30.6Oct 24
PGProcter & GambleConsumer Staples20$145.00$168.30+0.2%$3,366+16.1%26.4Oct 18
KOCoca-ColaConsumer Staples40$58.30$63.90+0.1%$2,556+9.6%24.9Oct 23
XOMExxon MobilEnergy22$98.20$112.401.1%$2,473+14.5%13.8Nov 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

  1. 1Scheduled trigger
  2. 2Market data pull
  3. 3Portfolio and P&L calculation
  4. 4Chart generation
  5. 5LLM-written brief
  6. 6Email delivery
  7. 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.