An investment platform that runs a stock portfolioon autopilot.
A team of AI agents researches the market, re-scores every holding each week, and flags risks early. All pointed at one goal: building a steady monthly income.
Total wealth
€248,300
€248,300 of ~€324,000 (about 6.8 years to target)
€149,200
60%
€24,800
10%
€74,300
30%
A research desk that never sleeps
Six modules, each automating a job a human analyst would otherwise do by hand.
Six agents, one daily run
A market watcher, analyst, risk officer, trade engine, researcher, and press officer run in sequence every morning. Each writes its findings to a shared memory the next agent reads.
Market Intel
3 macro flags
Analyst
2 earnings ahead
Risk Officer
caps clear
Trade Engine
1 SELL signal
Researcher
Sun, 4 ideas
Press Officer
letter drafted
Every holding re-scored, with trend
A scheduled job scores each position across six weighted factors and stores the result, so the dashboard shows whether conviction is rising or falling week over week.
One pool, fully accounted
Deposits, buys, partial trims, sell proceeds, dividends, and withdrawals all move a single central-cash balance, derived from the event log rather than a stored number that can drift.
Pointed at €1,000/month
Every contribution and holding is measured against a single target: enough dividend income to cover €1,000 net per month. The system projects the years remaining as the pot grows.
Projected net income
€480/mo
Caps that actually trip
Concentration limits are enforced per book (per theme, per position, and across an economic-driver cluster) alongside a drawdown protocol that escalates as a position falls.
Drawdown protocol: review at −15%, trim at −25%, exit at −40%
Three books, one net worth
A Growth book, a dormant Small-Cap research engine, and a passive Dividends book each keep their own mandate while rolling up into a single wealth figure.
Growth
US large-cap growth
Small-Cap
research engine
Dividends
income, passive
The interesting part isn’t the stack
It’s the failure modes that only show up once real money and real models are in the loop.
A language model will confidently report a summary score that does not match the factors it just derived.
So the composite is computed deterministically in code from the six weighted factors, and the model's claimed number is thrown away. The check caught three separate model arithmetic errors in a single day.
Serverless functions are killed at 60s, and waitUntil() does not escape that ceiling: the function returns 202, the caller sees success, and the instance is terminated mid-scoring.
So the heavy weekly scoring was moved to a GitHub Actions runner with no wall-clock cap, and the serverless route only triggers the run. Slow work finishes instead of dying behind a false 200.
A Postgres view runs with its owner's privileges, so revoking table grants is not enough: one un-revoked view silently leaks its base tables to the public anon key.
So access is revoked across all 40 relations (32 tables and 8 views), and a permanent probe re-verifies 40/40 denied on every check, failing loudly if a new relation ships open.
A stored balance drifts: every code path that forgets to update it adds silent error, and clamping a negative to zero hides the exact bug you need to see.
So central cash is derived from the event log on every read, never stored, and a negative balance renders in red instead of being clamped. A data error stays visible.
This is a personal system, not a product
Primoris runs one person’s portfolio and stays private. There is no sign-up, and the login below is real; it just isn’t open.