01 — The Two CLIs
The shell prompt looks the same in both contexts: a blinking cursor over a black background, the muscle memory of ↑ for the last command, | to chain one tool into another. But the physics underneath are different. A developer running git push can wait two seconds and lose nothing. A trader running cancel on a stale quote can wait two hundred milliseconds and lose everything. The interface is identical. The deadline is not.
That difference shapes the whole tooling stack. The dev CLI optimizes for ergonomics — readable output, helpful errors, sensible defaults, retries that recover gracefully. The trader CLI optimizes for the inverse — silent on the happy path, terse on errors, deterministic latency, retries that fail loud because a retry on a filled order is a double-position. Both are CLIs. They are not the same artifact.
02 — Normal-Case CLI: The Universal Joint
The normal-case CLI is the one most developers have a relationship with. git, npm, kubectl, aws, gh, ssh, jq, curl. Each does one thing, exposes it through flags and stdin, and emits text on stdout that another tool can read. The shell is the universal joint between them. The script is the unit of repeatability.
What the dev CLI is actually doing, when you trace it, is file manipulation: read a config, transform a tree, write a file, call an API, log the result. The latency budget is generous. git status on a large repo can take half a second and nobody notices. kubectl apply can take five seconds and the deploy still ships on time. The CLI's job here is to be the surface area for automation — not to be fast in absolute terms, but to be scriptable, composable, and observable. The terminal is the substrate on which knowledge work compiles.
The dev CLI in one line
# Normal-case: pipe stages are forgiving
gh pr list --json title,number | jq '.[] | select(.title | test("WIP"))' | head -503 — Trading-Case CLI: Why Traders Refuse to Leave the Terminal
Walk into any prop shop or any one-person Solana-bot operation and you will find a terminal multiplexer — tmux, zellij, kitty — with eight panes split across two monitors. One pane runs a price stream. One runs the strategy log. One has an open shell on the exchange's API, ready to flatten the book if something goes wrong. There is usually no chart. The chart is a downstream artifact. The CLI is the floor.
The reason isn't romance. It's five concrete properties the terminal has and a GUI almost never matches.
Latency. A GUI adds a render frame — 16ms at 60Hz, often 30–80ms in practice once event loops, state diffs, and animations are involved. A direct HTTP call from the shell is whatever the network costs you, no more. For a market-making cancel race, that difference is the spread.
Composability. A trader doesn't want one app that does everything. They want a price feed (Pyth Hermes), a strategy script (anything from awk to a Rust binary), an exchange client (OKX, Drift, Hyperliquid), and a logger (stdout to a file). Pipes wire them together in one line.
Headlessness. The actual workload runs on a colocated VPS or a bare-metal box near the exchange. No display, no mouse, often no display server installed at all. A CLI is the only interface that survives the move from laptop to remote.
Audit. Every command leaves a line in shell history. Every script run leaves a log file. When the P&L moves and you have to explain why, a CLI session is the cleanest forensic trace you can ask for. A GUI session is a memory.
Automation. The trader's actual edge — outside the few firms with genuine alpha — is automation. The strategy that wakes up at 03:14 and hedges a position the human shouldn't be awake to think about. Cron, systemd timers, agent runtimes. None of that lives in a GUI.
04 — The Trader's Toolbox in 2026
The set of CLIs a working crypto trader actually has installed has narrowed and deepened over the last two years. The category list reads short. The implementation list is long.
| Category | What it does | Representative CLIs |
|---|---|---|
| Price feed | Pull or stream live prices off a chain-agnostic oracle | Pyth Hermes (HTTP/SSE), Switchboard, Chainlink Data Streams |
| Exchange client (CEX) | Place, cancel, query orders against a centralised venue | OKX V5 API, Binance, Bybit, Hyperliquid CLI |
| On-chain client | Sign and submit transactions against a chain | solana CLI, foundry/cast, viem, anchor |
| Aggregator | Route a swap or order across multiple venues | Jupiter, 1inch, Kamino router, DFlow, Titan (meta-aggregator) |
| Bot framework | Strategy harness, paper trading, exchange adapters | Hummingbot, Freqtrade, Jesse, Drift Vaults SDK |
| Agent runtime | Long-running, scheduled, multi-channel automation glue | OpenClaw, Claude Agent SDK, OKX AI Agent, Hummingbot AI |
| Observability | Read positions, P&L, fills, drawdown from the shell | jq + curl, custom dashboards, DefiLlama API |
Three of these — Pyth Hermes for the price feed, OpenClaw as the agent runtime, OKX for execution — are the substrate of a workable single-trader stack. Wired through a thin CLI, they go from a list of services into a single command line.
05 — Hermes: The Pull Oracle as a Curl Target
Hermes is the Pyth Network price service. It speaks HTTP, SSE, and WebSocket. It serves both an off-chain JSON view of the latest aggregated price and a binary VAA blob that can be posted on-chain to push the price into a Pyth oracle contract. Two interfaces, one binary. For a CLI-first trader, the relevant one is the JSON.
Hermes from the shell
# Latest SOL/USD — Pyth feed ID e62df...d6
curl -s 'https://hermes.pyth.network/v2/updates/price/latest?ids%5B%5D=ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d' \
| jq '.parsed[0].price | {price: (.price | tonumber * pow(10; .expo)), conf, ts: .publish_time}'
# Streaming the same feed (SSE) — pipe straight into a strategy
curl -sN 'https://hermes.pyth.network/v2/updates/price/stream?ids%5B%5D=ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d' \
| grep --line-buffered '^data:' \
| sed 's/^data: //' \
| jq -c '.parsed[0].price'The streaming endpoint is the one that changes how the strategy is shaped. Instead of polling every 100ms and burning RPS, the strategy script reads stdin one line at a time and reacts on each new tick. The price feed becomes a generator. The strategy becomes a transformer. The exchange call becomes a sink. Three Unix processes, one pipe.
The trade-off Hermes makes is honesty about freshness. Each price object carries a publish_time and a conf (confidence band). A strategy that ignores either is making an assumption the API explicitly refuses to make. For a market-making loop, the conf band is part of the decision: widen the quote when conf widens, pull the quote when publish_time drifts beyond a threshold.
06 — OpenClaw: An Agent Runtime That Lives in the Terminal
OpenClaw is an agent runtime that runs locally, holds long-lived workspaces and identities, schedules tasks on cron, and routes messages across channels (Telegram, web, shell). For trading, the relevant primitives are four: workspaces (a per-strategy directory with its own state), skills (small scripts the agent can invoke), cron (timed triggers), and subagents (parallel reasoning workers under a coordinator).
What makes it a fit for trading specifically is that the runtime is not a chat product first. It is a long-running process with a CLI entrypoint. You can openclaw run a skill, register a heartbeat, and walk away. The agent reasons about what to do; the skill it ends up calling is just a script. That separation — reasoning over a fixed surface of tools — is the actual agent pattern, and it maps to the trader's stack cleanly: the LLM picks the order shape, the skill executes the order through OKX or Solana.
An OpenClaw skill is a script the agent can call
~/.openclaw/skills/
├── pyth-quote/
│ ├── skill.json # name, args schema, when to use
│ └── run.sh # the actual executable
├── okx-place-order/
│ ├── skill.json
│ └── run.ts
└── solana-cancel-all/
├── skill.json
└── run.rsThe skill manifest tells the agent when to reach for the tool. The agent supplies arguments. The executable runs in a sandboxed subprocess and returns JSON on stdout. From the agent's perspective it is the same shape as any other tool call. From the trader's perspective it is a script they can run manually with the same arguments — which is exactly the property an audit trail needs.
07 — OKX as the Execution Sink
OKX exposes a V5 REST API and a parallel WebSocket. For agent-driven trading the REST path is the simpler surface: every order is one HTTP call with an HMAC signature derived from the timestamp, method, path, and body. The same shape works for spot, perpetuals, options, and margin — only the instId and tdMode change. The exchange is also one of the first majors to publish an explicit AI Agent SDK that wraps order placement, balance queries, and position management in a typed interface designed to be reached by an LLM.
OKX V5 — sign-and-send in 15 lines
import crypto from 'node:crypto';
const ts = new Date().toISOString();
const body = JSON.stringify({
instId: 'SOL-USDT-SWAP',
tdMode: 'cross',
side: 'buy',
ordType: 'limit',
px: '142.50',
sz: '10',
});
const prehash = ts + 'POST' + '/api/v5/trade/order' + body;
const sign = crypto.createHmac('sha256', process.env.OKX_SECRET!)
.update(prehash).digest('base64');
await fetch('https://www.okx.com/api/v5/trade/order', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'OK-ACCESS-KEY': process.env.OKX_KEY!,
'OK-ACCESS-SIGN': sign,
'OK-ACCESS-TIMESTAMP': ts,
'OK-ACCESS-PASSPHRASE': process.env.OKX_PASSPHRASE!,
},
body,
});The reason this is fifteen lines and not five hundred is that the protocol is small. Signing is HMAC-SHA256. There is no order-state machine in the SDK that the API itself does not also expose. Once you have this snippet wrapped as an OpenClaw skill, an agent can place orders by emitting a JSON argument object — no exchange adapter framework required.
08 — The Thin Wrapper: Wiring It Together
The whole architecture lands in one diagram: a price feed (Hermes) on the left, an execution sink (OKX or a Solana RPC) on the right, an agent runtime (OpenClaw) in the middle as the coordinator, and a thin TypeScript CLI as the glue. The CLI does almost nothing — it parses one command, hands the work to a skill, prints the result. The agent does the reasoning. The exchange and the oracle do the work.
tradectl — the thin CLI
#!/usr/bin/env node
// tradectl: a 60-line broker between price, agent, and exchange.
import { spawnSync } from 'node:child_process';
const [, , cmd, ...rest] = process.argv;
const skills = {
// 1. Read a Pyth feed via Hermes.
quote: async (feedId: string) => {
const r = await fetch(
`https://hermes.pyth.network/v2/updates/price/latest?ids%5B%5D=${feedId}`
);
const j = await r.json();
const p = j.parsed[0].price;
return { px: Number(p.price) * 10 ** p.expo, conf: Number(p.conf), ts: p.publish_time };
},
// 2. Ask OpenClaw for a decision.
decide: (ctx: object) => {
const r = spawnSync('openclaw', ['ask', '--skill', 'sol-momentum'], {
input: JSON.stringify(ctx), encoding: 'utf8',
});
return JSON.parse(r.stdout);
},
// 3. Hand the decision to OKX (or Solana — same shape).
fill: async (order: { side: string; px: string; sz: string }) => {
const okx = await import('./okx-skill.js');
return okx.placeOrder({ instId: 'SOL-USDT-SWAP', tdMode: 'cross', ...order });
},
};
(async () => {
if (cmd === 'tick') {
const q = await skills.quote(rest[0]);
const d = skills.decide({ symbol: 'SOL', ...q });
if (d.action === 'noop') return console.log('noop', q);
const f = await skills.fill(d.order);
console.log(JSON.stringify({ q, d, f }));
}
})();The script is intentionally boring. Every line is a function call into a service that already exists; there is no strategy logic, no exchange adapter, no order-state machine. Three external systems do the work. The CLI is the interview between them.
Composing it as a pipe
# Stream live SOL ticks → run a decision per tick → log JSON
curl -sN 'https://hermes.pyth.network/v2/updates/price/stream?ids%5B%5D=ef0d...56d' \
| grep --line-buffered '^data:' \
| sed 's/^data: //' \
| xargs -I{} tradectl tick {}The agent doesn't replace the CLI. It becomes another stage in the pipe — one that happens to reason.
09 — Why Thin Wins Over Monolithic
The temptation in trading-bot design is to write the universe inside one process: strategy, risk, exchange adapter, paper-trading sandbox, dashboard. Hummingbot does this. Freqtrade does this. They are good products and they have a real audience. They are also enormous and opinionated, and the cost of swapping out their orderbook reader, their exchange client, or their notification layer is non-trivial.
The thin-CLI argument is the inverse: write almost nothing yourself, and let the seams be visible. The price feed is a separate process you can replace. The agent runtime is a separate process you can replace. The exchange client is a separate file. When the OKX V5 API changes — and it does — you edit one skill and nothing else. When Pyth ships a new endpoint, you point at it. When OpenClaw releases v2, the rest of the pipe is unaffected. The cost of this looseness is that there is no graphical dashboard out of the box. The benefit is that the entire system fits in your head.
| Axis | Monolithic framework | Thin CLI + agent |
|---|---|---|
| Setup time | Minutes (a Docker image) | Hours (gluing services) |
| Swap a price source | Fork the adapter | Edit one line of curl |
| Swap an exchange | Adapter rewrite + test harness | Swap one skill file |
| Add an LLM in the loop | Plugin system, often retrofitted | Already there — it is the agent |
| Audit a failed trade | Logs, dashboards, traces | Replay the pipe with the same input |
| Strategy library size | Large (curated) | Small (your own) |
| Best for | Retail / paper-trading exploration | Production single-trader or small team |
10 — The Other Two Patterns: MCP Servers and Codegen Skills
The thin-CLI / monolithic-framework split isn't the only axis. A third tradition has taken shape in 2026 around structured agent-tool protocols — and it solves real problems the thin CLI ignores. Two flavours are worth naming individually: MCP servers, and codegen skills. They are not competing with the CLI pattern. They sit at different points in the stack.
MCP — Model Context Protocol. An Anthropic-authored open protocol for exposing tools to LLMs in a standardized way. The shape is client/server over stdio (or HTTP): an MCP server declares a list of tools, each with a name, a JSON schema for arguments, and a callback. The LLM client — Claude Desktop, Cursor, Zed — discovers the tools, picks one, asks the user for permission, and invokes it. The server returns a structured result. The QuickNode Solana MCP server is the canonical demo: register getBalance, getTokenAccounts, simulateTransaction as MCP tools backed by Solana Kit, and Claude can call them in chat without any shell glue.
The Solana ecosystem has settled on a small set of MCP-shaped toolkits. Solana Agent Kit (SendAI) ships 60+ pre-built actions covering tokens, NFTs, and DeFi. GOAT (Crossmint) ships 200+ plugins across Solana and EVM. ElizaOS bundles MCP into a persistent-agent runtime with Twitter, Discord, and Telegram channels baked in. Rig (a Rust framework) targets the inverse use case — the lowest-latency path from LLM decision to on-chain execution, for trading loops that can't afford the Node round-trip.
Codegen skills — the Titan pattern. @titanexchange/titan-api-skill is a different shape entirely. It is not a runtime. It is a Claude Code skill — a documented bundle that ships with the protocol's quirks pre-encoded so an LLM can generate correct integration code on the first try. The quirks are specific and ugly: WebSocket + MessagePack instead of JSON-REST, BigInt for amounts, Uint8Array for token mints via bs58.decode(), deeply nested parameter objects where slippageBps lives in swap and intervalMs lives in update. Skip a nesting level and the LLM writes plausible-looking code that fails at runtime.
What the Titan skill protects against
// The LLM, unaided, writes this — and it fails silently:
client.newSwapQuoteStream({
inputMint: "So111...", // ✗ string, should be Uint8Array
outputMint: "EPjF...",
amount: 100_000_000, // ✗ number, should be BigInt
slippageBps: 50, // ✗ at root, should be nested in .swap
});
// With the skill loaded, it writes this — and it works:
client.newSwapQuoteStream({
swap: {
inputMint: bs58.decode("So111..."),
outputMint: bs58.decode("EPjF..."),
amount: BigInt(100_000_000),
slippageBps: 50,
},
transaction: { userPublicKey: bs58.decode(pubkey) },
});The reason Titan needed a codegen skill is a clue to the broader pattern. Titan is a meta-aggregator — its Argos router sits on top of Jupiter, OKX's router, and DFlow, evaluating all of them on the same simulated block and routing through whichever wins. Public benchmarks have Argos beating competing engines on 87% of swap comparisons since launch in September 2025. That sophistication earned them a wire format that is not REST — and the moment a protocol leaves the well-trodden REST path, LLMs start writing broken integration code. The skill exists so the model doesn't have to guess.
Titan also ships llms.txt and llms-full.txt at their docs root — a 2025 convention for serving LLM-optimized documentation that GitBook now auto-generates. The fact that this is now a default tells you something specific: the primary consumer of API docs in 2026 is increasingly an agent rather than a human reading a sidebar.
11 — Three Patterns, Three Deadlines
The clean way to read the field is that each pattern wins on a different deadline.
The thin CLI wins on runtime. When the price feed ticks and a decision has to land in milliseconds, a Unix pipe beats a permission dialog. There is no model call in the hot path; the LLM, if present at all, sits in a slower outer loop adjusting parameters.
MCP wins on operator ergonomics. Natural-language tool use from a chat client, with a permission gate on every action and an audit trail of every approval. The fit is the off-hours operator — "close half the SOL perp" typed into Claude Desktop, with the model picking the OKX-place-order tool and waiting for a yes before it fires.
Codegen skills win on integration time. Getting a tricky protocol — Titan's MessagePack, a non-REST exchange, a Solana program with byte-packed account layouts — wired up correctly without a week of debugging the wire format. The skill is paid for in saved engineering hours, not runtime latency.
A serious stack uses all three. The thin CLI runs production. MCP runs the operator console. The codegen skill helps you write the thin CLI in the first place. The mistake is forcing one pattern to do all three jobs.
| Axis | Thin CLI + agent | MCP server | Codegen skill (Titan) |
|---|---|---|---|
| What it is | Pipe of processes | Stdio/HTTP tool registry | Doc bundle + examples |
| Where it runs | VPS, headless, 24/7 | Local, beside Claude/Cursor | Inside the IDE, design-time |
| Latency floor | Network + subprocess (~10ms) | LLM call + permission (~1s+) | N/A — not in the hot path |
| LLM role | Slow outer brain | Interactive operator | Code author |
| Permissioning | Filesystem perms, env vars | Per-tool approval prompt | Not applicable |
| Best for | Production trading loop | Operator console, ad-hoc | Non-REST or quirky wire format |
| Representative | tradectl + OpenClaw | Solana Agent Kit, GOAT, ElizaOS | @titanexchange/titan-api-skill |
| Failure mode | Pipe dies silently | User clicks-through dialog | Skill goes stale on API change |
The Titan column is the most architecturally interesting because it tells you what the API design itself has been doing. Argos required MessagePack for the byte savings on streaming quotes. MessagePack required BigInt and Uint8Array in the client. Those two requirements made the integration unreachable for an LLM writing TypeScript from memory. The skill is the protocol-author admitting that the wire format is now an LLM-ergonomics problem — and shipping the fix in the same repo. That admission is the actually new thing in 2026, more than MCP or any specific agent kit. The protocol layer and the agent layer have noticed each other.
12 — The Three Operating Postures
Watching how this style of stack gets used in the wild, three postures recur. They are not exclusive — a trader will switch between them inside the same week — but they shape which tools get reached for.
Interactive. Manual order-entry from the shell. tradectl quote ef0d... | tradectl fill --sz 10. No agent involved. The trader is the strategy. The CLI is just faster than a UI.
Scheduled. Cron triggers a skill. Every five minutes, check the funding rate; every day at 16:00 UTC, rebalance to neutral. OpenClaw's heartbeat is a clean fit here. The agent does light reasoning — "is the funding rate above 0.03%, and if so, what size?" — and the CLI executes.
Streaming. The Hermes SSE stream feeds tradectl directly. The strategy is a real-time reaction to ticks. The agent here is usually not in the hot path — an LLM call costs hundreds of milliseconds — but it sits in a slower outer loop, deciding regime: trend, range, dislocation, halt. The inner loop is plain code.
A common configuration is two loops at different speeds. The inner loop, deterministic and millisecond-scoped, fires on every tick. The outer loop, LLM-driven and second-scoped, evaluates state once a minute and writes parameters into a file the inner loop reads. The agent is the slow brain; the script is the fast hand. The CLI is the table they share.
13 — What the Agent Layer Actually Buys You
A reasonable objection: if the inner loop is plain code, what does the agent layer earn? Three answers, ordered by how often they actually pay off.
Operator interface. The most underrated win. Instead of editing config files at 03:00 when a position is bleeding, you message the agent — "close half the SOL perp" — and it calls the skill. Telegram, terminal, web; OpenClaw routes them all into the same workspace. This is the thing that survives once the novelty wears off.
Regime classification. An LLM reading a thirty-minute window of ticks plus the latest funding rate, open interest, and news headlines is, empirically, better than most heuristics at calling whether the market is in a trendable state or a stop-hunt range. It is not better than a human at this. It is much better than a human who is asleep.
Failure narration. When a skill errors, the agent can read the stack trace, the last hundred lines of state, and produce a human-readable post-mortem in the same channel where you were chatting with it. The diff between "ERR 50061" and "OKX rejected the order because tdMode was cross but the account is set to isolated" is the difference between a trader who recovers in three minutes and a trader who is offline for an hour.
14 — What This Doesn't Solve
The thin-CLI pattern is not magic. It does not give you alpha. It does not give you a colocated server in NY4 or AWS Tokyo. It does not protect you from a flash crash, a custodial outage, or your own conviction. Three specific things it explicitly punts on:
Latency at the absolute edge. Wrapping every step in a subprocess call costs microseconds you don't notice and milliseconds you might. For a sniper bot reaching for a Jito bundle, the inner loop should be a single Rust binary holding open gRPC sockets, not a Node script. The CLI pattern wins for systematic / market-making style work, not for race-to-block sniping.
Risk management. A position-size check, a max-drawdown circuit breaker, a kill switch — those have to live in a process that cannot be interrupted by an LLM hallucination. The pattern: risk is a separate watcher script that the agent has no permission to override. It can ask. The watcher answers.
Cross-venue settlement. Moving collateral between OKX and a Solana DEX is a multi-step, multi-chain dance that no current agent runtime handles well end-to-end. The honest answer is to script it explicitly and have the agent call the script when the strategy needs it — not to expect the agent to plan the bridge route on its own.
15 — Where This Goes
The terminal didn't lose to the GUI in trading; it absorbed it. Every chart on a Bloomberg or a TradingView panel is a side car to a CLI session somewhere. The new layer — agent runtimes that hold context, MCP servers that gate tool use behind permissions, codegen skills that translate quirky wire formats — is doing the same thing the shell did: becoming the substrate on which automation compiles. OpenClaw, Hermes, OKX's AI Agent SDK, Solana Agent Kit, GOAT, Titan's skill, and the dozen similar runtimes shipping in 2026 are not competing with the CLI. They are extending it at different points in the stack — runtime, console, design-time.
The honest version of the "will AI replace traders" question is sharper than the question itself: it has already replaced the manual-clicks layer for anyone who was willing to write a script, and that was already most serious traders. What it adds, when it's wired right, is a slow brain that doesn't sleep, an operator interface that doesn't require a dashboard, and the ability to narrate its own failures. That isn't a new product category. It's another stage in the pipe.
Hermes is the generator. OKX is the sink. OpenClaw is the slow brain.
The CLI is the table they all sit at.
— AILEENA MACHINA / 2026
References
- Pyth Network — Hermes API documentation
- Pyth Network — Price Feed IDs (cross-chain catalog)
- Pyth Hermes — REST + SSE reference (hermes.pyth.network)
- OKX V5 API — Trading endpoints (place order)
- OKX V5 API — Authentication (HMAC-SHA256 signing)
- OKX AI Agent SDK — overview
- Anthropic — Claude Agent SDK (general agent runtime patterns)
- Solana CLI — getting started (docs.solana.com)
- Foundry — cast (the CLI for Ethereum RPC and signing)
- Jupiter API — Swap endpoint (the aggregator behind most Solana CLIs)
- Hyperliquid CLI — official client
- Hummingbot — open-source market-making framework
- Freqtrade — open-source crypto trading bot
- Drift Protocol — Vaults SDK (Solana perp DEX)
- Jito — Low-latency transaction send and bundles
- Pyth — Sponsored feeds and the pull-oracle model (whitepaper)
- Titan Developer Docs — AI / LLM Integration overview
- @titanexchange/titan-api-skill — Claude Code skill for Titan’s WebSocket + MessagePack protocol (npm)
- What Is Titan? The Meta DEX Aggregator (Backpack Learn)
- Titan Exchange — DefiLlama protocol stats
- llms.txt — the LLM-optimized documentation convention (spec)
- Model Context Protocol — official specification (modelcontextprotocol.io)
- How to Build a Solana MCP Server for LLM Integration (QuickNode)
- How to Build Solana AI Agents in 2026 — layered architecture guide (Alchemy)
- Solana Agent Kit (SendAI) — 60+ pre-built actions (GitHub)
- GOAT SDK (Crossmint) — 200+ plugins across Solana and EVM (GitHub)
- ElizaOS — persistent agent runtime with multi-channel routing (GitHub)
- Rig — Rust framework for low-latency LLM-to-on-chain execution
- awesome-solana-ai — Solana Foundation curated AI tooling list