A Bloomberg terminal costs about $31,000 a year. Almost none of that is the data — it's the fifty years of workflow built on top of it. Meridian is an attempt at that workflow, rebuilt around a reasoning engine instead of a command line.
The quotes in this repo are simulated, not live.
lib/market/engine.tsseeds a deterministic snapshot per symbol, then ticks it with a lightweight geometric Brownian motion model. That is a deliberate choice — it makes the whole terminal runnable withnpm run devand no API key, and it keeps the server render and the first client render identical so there's no hydration flicker.Nothing here is investment advice, and no number on screen is a real market price. To wire a real feed, replace the
tick()action inlib/market/store.tswith a websocket handler that writes intoquotes[symbol]— charts, watchlist, portfolio and the AI layer all read from that one store and update for free.
Fifteen terminal views, routed through components/terminal/features/FeatureRouter.tsx:
| Markets · Charting · Options | Watchlist, candles via lightweight-charts, and an options chain priced with Black‑Scholes (lib/quant/blackscholes.ts) |
| Risk · CFO | Portfolio exposure, concentration, and a cash‑flow view over lib/market/portfolio.ts |
| Research · Screener · Explain | Grounded reasoning over the positions you hold, not generic ticker lookup |
| Time Machine · Track Record | Replay a decision against what followed, and score the calls that were made |
| Sentinels · Memory | Standing watches, and recall of what you asked before |
| Command · Voice · News | A command palette, speech input, and a headline feed |
lib/ai/respond.ts is deterministic and grounded — it reads live quotes and your real
positions, classifies intent (position advice, scenario modelling, tax‑loss
harvesting, risk, movers, portfolio status), and returns structured responses with data
cards, actions, and a conviction level.
It is deliberately not a chat wrapper. The response shape is fixed, so swapping the engine for a streaming LLM never touches the UI.
lib/market/taxlots.ts tracks individual lots rather than an average cost basis, which
is the difference between a harvesting suggestion that is correct and one that is
merely plausible.
app/
page.tsx landing
terminal/ the terminal shell + live MarketProvider
components/
landing/ market/ terminal/ ui/
lib/
market/ engine, universe, portfolio, taxlots, orderbook, macro, store
quant/ Black-Scholes
ai/ respond, agents, research, screener, timeMachine, trackRecord, memory
terminal/ UI state (zustand)
Obsidian Terminal — the design system lives in app/globals.css as Tailwind v4
@theme tokens: near‑black surfaces, emerald gains (#00e08a), crimson losses
(#ff4d5e), an electric‑blue AI accent (#6ea8ff), and tabular‑mono
numerics so columns of digits actually line up.
npm install
npm run dev # http://localhost:3000/— the landing page/terminal— the terminal
No API keys, no database, no external services. It runs.
One gotcha: don't put this in a OneDrive folder or any path with non‑ASCII characters — Turbopack cannot build from those paths.
A Bloomberg seat is priced for institutions, and most of what you are paying for is not the data — it is fifty years of workflow layered on top of it. I wanted to know how much of that workflow survives if you rebuild it around a reasoning engine instead of a command line, and what breaks when you try.
Three decisions carried the rest of the project:
Tax lots are tracked individually, not by average cost basis. Average basis is far
simpler and it makes harvesting suggestions quietly wrong — plausible numbers, bad
advice. lib/market/taxlots.ts is longer than it needs to be for exactly this reason.
The reasoning engine returns a fixed response shape. The UI reads that shape and never the model, so replacing the engine with a streaming LLM touches one file and no components.
The market snapshot is deterministic on the server. The first client render matches it exactly, which is the difference between a screen full of numbers and a screen full of numbers that flicker on load.
MIT — see LICENSE.