Personal investing platform

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.

Sample data

Total wealth

€248,300

+2.4%
€1,000/mo income goal48%

€248,300 of ~€324,000 (about 6.8 years to target)

Growth

€149,200

60%

Small-Cap

€24,800

10%

Dividends

€74,300

30%

What it does

A research desk that never sleeps

Six modules, each automating a job a human analyst would otherwise do by hand.

AI finance team

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.

Sample data

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

Weekly scoring

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.

Sample data
NVLX
84 +3.5
HELX
78 +1.0
VANT
71 2.5
KORE
63 4.0
Cash lifecycle

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.

Sample data
Deposit+€1,000
Buy NVLX−€600
Trim HELX+€180
Dividend+€42
Withdrawal−€250
Central cash€372
Income goal

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.

Sample data

Projected net income

€480/mo

48% of goal
€1,000/mo targetabout 6.8 yrs at the current pace
Risk management

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.

Sample data
Robotics theme28% / 35%
Single position6% / 7%
AI-capex cluster74% / 80%

Drawdown protocol: review at −15%, trim at −25%, exit at −40%

Multi-book

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.

Sample data

Growth

US large-cap growth

Small-Cap

research engine

Dividends

income, passive

Under the hood

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.

Next.js 16React 19TypeScriptTailwind v4Supabase / PostgresAnthropic APIGitHub Actions
Integrity belt

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.

Scheduled jobs

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.

Database lockdown

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.

Cash accounting

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.

Private system, access by invitation

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.