NOMO: an AI trading chat with a hard confirmation gate
NOMO is a self-hosted AI trading chat for Robinhood agentic accounts. You
talk to Claude in a local chat interface. Claude can pull market data,
render candlestick charts inline, and read your portfolio through
Robinhood's official Trading MCP. It can also propose trades.
It cannot place them. Every trade proposal stops at a confirmation card.
Nothing reaches the broker until you click Confirm.
Demo
Watch the demo video on the GitHub repository.
The one hard rule
The design has one rule: the LLM interprets and decides, deterministic
code computes and executes.
- Claude never generates price data. Charts and indicators come from
Polygon and are computed in TypeScript. Claude only chooses what to
request.
- Financial figures come from SEC EDGAR filings. Growth rates, margins,
and leverage ratios are computed in code from the source XBRL. The
model never derives them from a document.
- Claude has no direct path to order execution. There is no bypass flag
in the codebase.
Every tool Claude can use is registered in a tier. The tier decides how
the tool runs.
| Tier | Examples | Behavior |
|---|
market_data | quotes, charts, research | Runs automatically |
portfolio_read | positions, balances, P/L | Runs automatically |
account_write | edit watchlists | Automatic, reversible, moves no money |
execution | place order, cancel order | Never runs directly. Gate required |
An execution tool call only creates a pending order with a 5-minute
expiry. The UI renders a confirmation card. Confirm forwards the
exact stored parameters to Robinhood. Reject discards them. The only
code path to the broker requires a stored order in confirmed status.
When you disable a tool tier in settings, those tools are removed from
the schema sent to Claude. They are not just blocked at run time. Every
tool call is written to a local audit log.
Multi-agent research
For a "should I buy this?" question, Claude calls one tool:
deep_research. An orchestrator plans which specialists the request
needs and runs them in parallel. Each specialist sees only its own
cluster of read tools and must return typed findings, not prose.
The specialists cover screening, technicals, fundamentals, SEC filings,
and portfolio risk. A synthesis step merges their findings into one
thesis and at most one proposal. A risk-skeptic step then argues the
bear case against it.
The confirmation card for a researched proposal shows three things side
by side: the thesis, the bear case, and the broker's pre-trade warnings.
You confirm with the full picture. No specialist ever holds an order
tool. Research shapes proposals. It cannot execute them.
The learning loop
The agent learns from your history, but learning never touches
execution. No stored fact can auto-confirm a trade or skip the gate.
- Claude records durable facts about you with a
remember tool. Risk
tolerance, position sizing, watched tickers.
- When you reject a proposal, you can give a one-line reason. A
distill_lessons tool reviews your history and proposes patterns.
- Confirmed trades keep their rationale. When a position closes, the
realized P/L is logged. Claude can compute its own track record by
strategy, so later proposals reflect what worked.
Every memory is visible in Settings. You can edit, deactivate, or
delete any of it. Nothing about you is stored invisibly.
Testing the gate
The tests run against a mock Robinhood MCP server. They never touch the
real broker. The mock records exactly what would have reached the
broker. Integration tests cover the full gate lifecycle: propose,
confirm, reject, expire. A pre-commit hook and a CI job both fail if a
.env file or a database file is ever committed.
Stack
TypeScript end to end. React chat UI, Express backend, SQLite for
orders, audit logs, memories, and conversation search (FTS5). Anthropic
API for the model, Polygon for market data, SEC EDGAR for filings.
← All posts