ghost — a haunted research terminal for VCs
Every investor has an anti-portfolio: the startups they passed on that went on to haunt them. ghost is a terminal-native research agent that makes sure the next one doesn't slip by — it scans the market with parallel web-research agents, briefs you on what's hot, and keeps a watchlist of the companies you can't afford to forget.
Inspiration
The idea started with the concept of the anti-portfolio — Bessemer famously publishes theirs: Airbnb, Google, Zoom, all passed on. Those misses are ghosts. They follow you around.
At the same time, I'd been living inside terminal coding agents like Claude Code and loving the workflow: a fast, keyboard-first loop where an agent plans, fans out work to subagents, and reports back. It struck me that VC sourcing research — "what's hot right now, across which sectors, who raised, who's raising" — has exactly the same shape as a codebase exploration task. Plan, parallelize, synthesize, cite.
So the question became: what if a VC had a Claude Code of their own? Not a dashboard, not another SaaS tab — a spooky little terminal ghost that does an analyst's morning sweep in under a minute, grounded in live web search instead of vibes.
What it does
/scan— the agent plans 3 hot domains (AI infra, defense, fintech… whatever is actually moving right now), launches one scout subagent per domain in parallel, and each scout works the live web through the you.com Search API: recent rounds, momentum signals, who led, why now. The main agent then synthesizes a single briefing — grouped by domain, every claim cited with a source URL — and ends with a cross-domain shortlist.- Watchlist — after a scan, ghost asks (multi-select, right in the terminal) which companies to track.
/watchlistopens a bright table view of everything you're watching: company, domain, round, when you added it. - A real research agent underneath — streaming responses with markdown and tables rendered in the terminal, extended thinking, read-only subagents, MCP servers with full OAuth sign-in, per-session budgets and token/cost accounting, resumable sessions.
- It's haunted — while it works, a ghost (
ᗣ) flickers next to shimmering, rotating status words: Summoning… Conjuring… Rattling chains…
How I built it
The stack is deliberately small: Bun + TypeScript + Ink (React for terminals), the Anthropic API through the AI SDK for the agent loop, and the you.com Search API as the eyes on the live web.
The build went roughly in layers:
- Agent core — a streaming turn loop with tool calls, session persistence, cost tracking per model, and a prompt-cache-friendly message layout. The system prompt positions ghost as a search-and-synthesis agent for venture work: ground every claim in something actually retrieved, cite provenance, never fabricate a round or an investor.
- Web search as a first-class tool — a
web_searchtool that POSTs to the you.com Search API withextraction_mode: "highlights". The highlights turned out to be the killer feature: instead of raw snippets, each result carries dense extracted passages (funding tables, valuations, dates), which means a scout can confirm a round from one or two calls instead of ten. - Parallel scouts — a read-only subagent type whose only tool is web search.
/scanfans out one scout per domain in a single response; each runs on a cheap fast model, burns ~$0.03, and reports back a sourced list. The main model never sees the raw search noise — just three clean reports to synthesize. - The human loop — the question tool renders multi-select prompts in the terminal, which is how scan results flow into the persistent watchlist with one keystroke, and the watchlist gets its own full-screen table view.
- The vibe — ANSI markdown rendering (bold, bullets, and real aligned tables with box-drawing rules) applied live during streaming, a blinking dot on running subagents, and the shimmer-animated spooky status bar, tuned frame by frame (100ms ticks; the shimmer sweeps at 200ms/char — 300 felt sluggish, 100 felt frantic).
Challenges I ran into
- Rendering markdown in a terminal that's also streaming. Ink's
<Static>transcript is append-only, and tables arrive one token at a time. I wrote a minimal markdown→ANSI renderer (padding computed on ANSI-stripped widths so styled cells still align) and accepted progressive rendering: a table looks like plain|lines until its separator row streams in, then snaps into an aligned table. Getting column math right with escape codes embedded in the cells took a few tries. - Keeping scouts honest. Early scout reports were confident and occasionally wrong. The fix was structural, not just prompt-level: scouts are hard-restricted to a read-only tool set, told that unverified claims must be labeled as such, and required to carry source URLs for everything — the synthesis step then flags anything that arrived uncited.
- Context economics. Letting the main model do all the searching flooded its window with search results and wrecked the prompt cache. Pushing retrieval down into disposable subagents keeps the main window small and the cache warm; the parent only pays for three final reports.
- Terminal UI details are unforgiving. A double-width emoji ghost broke line stability (swapped for the single-width
ᗣ), blinking indicators need width-stable off-frames, resize events corrupt Ink's line accounting unless you clear and reprint, and every animation timer has to be cheap because they all run at once. - Secrets and plumbing. The you.com key lives alongside the provider keys in a chmod-600 auth file — and the config writer had to learn to preserve fields it didn't own, or the key silently vanished on the next usage write. The kind of bug you only find by watching a file get clobbered.
What I learned
- Agent architecture is leverage. The single biggest quality jump didn't come from prompt tweaks — it came from the plan → parallel scouts → synthesize structure. Small, cheap, single-purpose agents with one tool each beat one big agent with everything.
- Search quality is retrieval quality. Rich extraction (you.com's highlights mode) changes what an agent can verify per call. The difference between "a snippet mentions a Series A" and "here is the funding table" is the difference between a guess and a citation.
- Grounding rules must be enforced, not requested. Read-only tool sets, forbidden-tool lists, and cite-or-flag reporting rules did more for trustworthiness than any "please don't hallucinate" sentence.
- Terminals are a great agent UI. Streaming text, live tool status, and interactive prompts cover almost everything a research workflow needs — with zero frontend infrastructure. But polish lives in the details: ANSI widths, cache-aware reprints, and animation timing are real engineering, not decoration.
What's next
A /watch mode that periodically re-scans the watchlist and alerts when a ghost raises a new round, richer scout types (people/founder tracking, competitive landscapes), and deeper use of past research sessions so ghost remembers what it already told you — your anti-portfolio should only ever need to haunt you once.
Built With
- ai
- opencrawl
- sdk
- typescript
- vercel
- you.com