A portfolio management platform for a family office
This is the actual application I built and run for an investment desk that manages a multi-account public-equities book: the positions, the nightly custodian feed and live pricing, a daily review that scores every holding against the desk's own limits, a research pipeline where analysts vote and only the portfolio manager's call becomes a trade, and the briefings that go out every morning and after every close. It is captured page by page as a static site over an invented book, so you can click through exactly what the desk uses without seeing anything that belongs to it.
What it is, and who uses it
A desk that runs a few hundred positions across many brokerage accounts, on margin, with a pipeline of names it is researching and a weekly rhythm of decisions, needs more than a brokerage portal. It needs one book that reconciles to the custodian every morning, a way to look at every position against the same yardstick, a record of why each name is held and who argued for it, and a feed of what moved and why that is already written by the time anyone sits down. For years that lived in a workbook that was rebuilt every week. This platform replaced it, and it has grown with the desk for the better part of a year of daily use.
The day has a shape. Overnight, the custodian's encrypted feed lands and is reconciled into tax lots; prices, fundamentals, statements and news are refreshed; the monitors run and the attention memory decides what is new. By the time the desk opens the Daily Review, the Compare heat map has scored every position, the fundamentals monitor has fired on what crossed a limit, and the morning email has already said which fifteen names deserve a look and why. During the day the Review Board carries the arguments: analysts vote on the pipeline and the portfolio, the portfolio manager converts a call into a trade with one leg per account, and the trade queue is the only door to the custodian. After the close, the movers email reads the whole market and the snapshot reads the book.
What makes it different is that it argues with itself. A red cell is red only when the number is strictly past the limit the monitor fires at, so the table and the alerts can never disagree. Every measure carries its definition and its last four quarters, so a reader can check a number before acting on it. A thesis has exactly one writer and a version history. A topic report tiers every listed name in a space and says, for each one, what it rests on and what would break it. And nothing automated can trade: the AI reads, scores, drafts and flags, and a person decides.
The capabilities
The book, reconciled nightly
The custodian's encrypted daily feed is decrypted, parsed and reconciled into tax lots per account every morning, with the accounts, activity and true tax-lot files alongside it; external custodians and placeholders live in the same book under rules that keep them from being overwritten. Market value follows a stated policy: live price for liquid equities, the custodian's mark for everything a live quote cannot be trusted on.
A daily review that knows what is new
Every position is scored on ~117 measures against the same limits the fundamentals monitor fires at, with the strip leading each row: problems, how far past the line, strengths. An attention memory remembers every red cell, so the email and the table lead with what is new or worse and park what the desk has already seen or snoozed.
Monitors the desk configures
The fundamentals monitor cuts the book five ways and watches each stock on the union of its groups' checks; the groups, the checks and the limits are edited on the Groupings page, every metric is defined in plain words, and a stock with no group is proposed one with the reason attached.
A review board with a PM model
Pipeline and portfolio on one table with a registry of 145 columns, custom note columns, source and reason for every name, and votes from the desk. A vote is advisory; a trade is filed only when the portfolio manager converts a call, sized per account, and nothing an agent writes can ever reach the trade queue.
Research with provenance
Notes, imported emails and clippings tagged to tickers; a versioned human thesis per stock with a single writer; an enricher that drafts segments, competitors and tags for every new name; evidence chips captured from the report by clicking the figure that made the case.
Topic reports that do the discovery
A theme is framed into its value chain, each segment is populated by search until it runs dry, every symbol is verified against a live quote and the company name, cross-listings collapse to one row, and a two-pass judge ranks the whole list and then writes the case for every name: tier, odds and their basis, differentiation, success and failure cases, which side of a shift it is on.
Markets, read every day
Universe movers re-derived from real bars with a swing-pattern read and an AI screen of the headlines; a 13F tracker over a hundred-odd managers diffed quarter on quarter and matched to the book; COT positioning; a hundred-year chart of the market's important moments.
Exposure under one denominator
Sector, industry and country concentration as GICS at the read boundary, with funds itemised as what they are rather than filed under an issuer's sector; the drivers system that maps every position to the scenarios that move it, country signals and a strategy map.
P&L the custodian would sign
Time-weighted return chained from the custodian's own daily net liquidation values with real external cash flows only, levered and unlevered; fees, interest, commissions and withholding by year, account and entity, counting each confirm once whatever its status history.
Briefings written for fifteen seconds
Twenty-odd scheduled emails: the morning Compare digest with both sides of every featured name and two workbooks attached, the post-close snapshot with bull and bear cases on the big movers, company news filtered for materiality, investment ideas mined from the day's articles with every source verified in code, earnings, 13F, universe movers, each opening with an instructions box.
Fourteen screens, one book

Dashboard
Net assets, returns against the index over every window, the trade queue, today's movers and the market overview on one screen, with the custodian's own portal view reconciled beside it.
Open →
Holdings
Every position as tax lots, aggregated by ticker, with P&L, weights, drawdown from the high and the accounts, margin and tax-lot tabs; a column picker and a comparison tab over a hundred-plus measures.
Open →
Daily Review
The desk's morning brief: what is new, what got worse and what to decide, with each measure's last four quarters as context and the definition of every term one click away.
Open →
Compare heat map
Every position scored on ~117 fundamental, valuation and expectation measures against the limits the monitor fires at. Red means strictly past the limit; an attention memory says whether each red cell is new, worse, chronic or already seen.
Open →
Groupings monitor
The fundamentals monitor cuts the book five ways and watches each stock on the union of its groups' checks; the same book read by stock, with every check and what the last scan read.
Open →
Categories
The desk's own reporting tree, editable in the app, with the book's returns rolled up it and compared at any level; a stock can report in two groups when the desk says so.
Open →
Review Board
Pipeline and portfolio side by side on one table with a registry of 145 columns. Analysts vote; only the portfolio manager's converted call files a trade, one leg per account.
Open →
Research themes
Top-down research: a theme, its candidates, attached notes, and a generated topic report that discovers, verifies and tiers every listed name in the space, winners and losers alike.
Open →
Market movers
The whole market's big moves each session, re-derived from real bars rather than trusted from a screener, with a swing-pattern read and one click to a decision.
Open →
Exposure
Sector, industry and country concentration under one denominator, with funds itemised rather than mislabelled; the drivers system, country signals and the strategy map behind it.
Open →
P&L
Time-weighted return chained from the custodian's daily figures, levered and unlevered; fees, interest and commissions by year, account and entity, with every underlying posting.
Open →
Research notes
Memos, clippings and imported emails tagged to tickers, with provenance for every idea on the board and the related notes for any stock one panel away.
Open →
Comparison
A column picker over a hundred-plus measures, saved views, AI earnings analysis per name, and send-to-pipeline or chart-together from any selection.
Open →
Settings & operations
Schedules, the twenty-odd emails, margin inputs, the agent roster and the scheduler that keeps the data fresh overnight, with a run log for every job.
Open →What you are looking at
The platform replaced a spreadsheet-based workflow for a multi-account book with a nightly broker feed, live pricing, a research pipeline, a daily review system and a set of automated briefings. Every screen in this demo is the real template rendered over an invented book: the tickers are real public companies so the charts and fundamentals are genuine, but the accounts, lots, notes, votes, theses and people are synthetic. The AI-written passages (earnings previews and reads, desk briefs, KPI cards, mover notes) are composed for the demo from those public figures and a short profile of each company; nothing is generated live, and none of it is a recommendation.
Some of the parts worth a look:
- The Compare heat map scores every position against the same limits the fundamentals monitor fires at, and an attention memory tracks whether each red cell is new, worse, chronic or already seen, so the morning email leads with what changed rather than with what is merely red. Right-click a cell to mark it seen; click a reading to see its last four quarters.
- The Review Board keeps the pipeline and the portfolio on one table. Analysts vote; a trade is filed only when the portfolio manager converts a call, never by an AI and never by agreement alone. The report pane prints a one-pager per stock with evidence chips captured from the figures that made the case.
- The research layer gives every idea a provenance, every stock a versioned thesis with a single writer, and every theme a generated report that discovers, verifies and tiers the listed names in a space, with odds, differentiation and both cases written for every one.
- The operations half runs on a separate worker process: the broker feed, overnight enrichment, cache warming, twenty-odd scheduled emails, and backups with an immutable off-site copy that has been proven by rebuilding the whole platform from it.
How it is built
Python and Flask with SQLAlchemy on PostgreSQL; Jinja templates with Tailwind, Alpine.js for the reactive parts and Chart.js and Lightweight Charts for the charts. One web service and one worker process, so a long import or a model sweep can never take a page down; a scheduler with a dozen nightly jobs, each wall-clock bounded and watched by a heartbeat.
- Data in. The custodian's PGP-encrypted SFTP feed every morning, with a self-healing backfill for a late day; yfinance for prices, fundamentals, statements and corporate actions, with the corporate-action cliffs re-synced automatically; SEC EDGAR for 13F filings; Finnhub and RSS for news; a free-text-proof ticker universe.
- Models where reading is the job. Haiku for classification and screens, Sonnet for judgement, Perplexity for search, each metered and cached where a cache can actually hit; a reviewer that reads a stock's own dossier before it is shown the desk's thesis; prompts that forbid recommendations where a recommendation would be a second opinion.
- Rules that keep the numbers honest. Red means strictly past the limit; a missing value sorts last in both directions; a failed fetch is never recorded as data; a percent and a fraction never meet in one variable; every rollup is a prefix test over one tree.
- Five thousand five hundred tests, checked by mutation: each defect a test guards against is re-introduced on purpose to prove the test can fail, and the ones that could not are rewritten. Templates are rendered under strict undefined and their inline scripts parsed by Node in the suite.
- Operations. A deploy on every push through a serialised safe-deploy that waits out a running import; nightly backups of every database to two object stores, one of them immutable for thirty days; an in-app assistant that reads the book through the app's own calculations, never by recomputing them in SQL.
The code itself is private. If you would like to walk through it, get in touch.