Skip to content

Repository files navigation

Meridian — a terminal that reasons about the position you actually hold

license stack data


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.

About the market data

The quotes in this repo are simulated, not live. lib/market/engine.ts seeds 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 with npm run dev and 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 in lib/market/store.ts with a websocket handler that writes into quotes[symbol] — charts, watchlist, portfolio and the AI layer all read from that one store and update for free.

What's actually in it

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

The reasoning engine

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.

Tax lots are modelled properly

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.

Architecture

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.

Running it

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.

Why I built it

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.

License

MIT — see LICENSE.

About

An AI-native financial terminal — fifteen views, options priced with Black-Scholes, and tax lots tracked individually rather than by average basis. Next.js 16 + React 19, Obsidian Terminal design system. Market data is simulated; the live feed swaps at a single function.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages