Releases: BlockRunAI/franklin
v3.1.1 — /model picker fixes
Two bugs reported by user Cheetah, both fixed. Pure bugfix release — no functional changes to the agent, plugin SDK, tools, or payment flow.
Fixed
1. /model picker only showed 16 of 55+ models
src/ui/app.tsx had its own hardcoded 16-entry PICKER_MODELS array, completely disconnected from the canonical list in src/pricing.ts. Users couldn't reach GLM, Grok, Kimi, Minimax, Gemini 3.1 Pro, O1, O3, GPT-5.3 Codex, or most of the NVIDIA free tier from the in-session picker at all.
Fix: single source of truth. PICKER_CATEGORIES, PICKER_MODELS_FLAT, and the ModelEntry type are now exported from src/ui/model-picker.ts and consumed by both the Ink UI picker and the readline pickModel() fallback. The new list has 32 models across 6 categories:
- 🔥 Promo (2) — GLM-5.1, GLM-5.1 Turbo (flat $0.001/call)
- 🧠 Smart routing (3) —
blockrun/auto,blockrun/eco,blockrun/premium - ✨ Premium frontier (8) — Claude Sonnet/Opus 4.6, GPT-5.4, GPT-5.4 Pro, Gemini 2.5 Pro, Gemini 3.1 Pro, Grok 3, Grok 4
- 🔬 Reasoning (6) — O3, O4 Mini, O1, GPT-5.3 Codex, DeepSeek R1, Grok 4.1 Fast Reasoning
- 💰 Budget (7) — Haiku 4.5, GPT-5 Mini/Nano, Gemini 2.5 Flash, DeepSeek V3, Kimi K2.5, Minimax M2.7
- 🆓 Free (6) — Nemotron Ultra, Qwen3 Coder, Devstral, Llama 4 Maverick, DeepSeek V3.2, GPT OSS 120B
Every ID is verified against pricing.ts; every shortcut is in MODEL_SHORTCUTS.
2. Switching models wiped the scrollback
When a user typed /model mid-session, the Ink UI had if (mode === 'model-picker') return <Box>...picker only...</Box>. That early-return unmounted the two <Static> components holding the conversation scrollback (completedTools and committedResponses). When the picker closed and mode flipped back, they re-mounted fresh — and Ink's <Static> doesn't re-commit already-written items. So the screen came back visually empty.
The agent's message history array was actually intact on the backend, so the next prompt still had full context. But from the user's seat, the scrollback was gone right when it was most needed — mid-debug on a large codebase, when referencing prior prompts is the whole point of switching models.
Fix: the picker now renders inline below the scrollback as an overlay. The render function always returns the same tree shape regardless of mode; only the picker vs. InputBox toggles at the bottom. The two <Static> components stay mounted across mode transitions — scrollback survives.
Also added a one-line reassurance inside the picker UI:
Your conversation stays above — picking a model keeps all history intact.
Internal
- Removed duplicated
PICKER_MODELSarrays. One inmodel-picker.ts, one inapp.tsx— both 16 entries, both drifted from reality. Now a singlePICKER_CATEGORIESexport. src/ui/app.tsxrender function is safer for future UI modes (settings, wallet details, onboarding) — they can all reuse the same always-mounted Static tree instead of unmounting scrollback.
Verification
- ✅ 7/7 local tests pass
- ✅ 13/13 E2E tests pass (GLM-5.1)
- ✅
franklin --version→3.1.1 - ✅
PICKER_CATEGORIES.length === 6,PICKER_MODELS_FLAT.length === 32 - ✅
TypeScript strictclean
Not changed
- Agent loop, plugin SDK, tools, wallet, session storage, payment flow — all identical to v3.1.0.
- The
runcodealias still works through the 60-day window from v3.0.0.
npm: @blockrun/franklin@3.1.1 · Full changelog: v3.1.0...v3.1.1
Thanks to Cheetah for the detailed bug report.
v3.1.0 — Brand cleanup + README rewrite
Pure documentation and brand cleanup on top of v3.0.0. Zero functional changes — plugin SDK, agent loop, tools, tests, wallet, and sessions are all identical to v3.0.0.
Why
Two loose ends from the rebrand needed a clean close:
- Premature domain references. We own `franklin.run` and `franklin.bet` but haven't deployed them yet. The README, CLI help, and banner were all linking to URLs that 404 — which is worse than not linking at all. Trust breaks on the first click.
- Banner color experiments. v3.0.1 shipped a smooth 6-row gold→emerald gradient. v3.0.2 flattened it to pure `#FFD700`. v3.0.3 tried metallic `#D4AF37`. After A/B-ing in the terminal, the gradient won — it tells the Franklin story in one glance.
Changed
- Banner — Restored the smooth 6-row gold→emerald gradient (`#FFD700` → `#10B981`) via a reintroduced `interpolateHex()` helper. Dropped the "Marketing: franklin.run · Trading: franklin.bet" tagline line.
- CLI description — Removed "Marketing workflows: franklin.run" and "Trading workflows: franklin.bet" from `franklin --help`.
- package.json — `homepage` now points to the GitHub repo (a real URL). Description shortened, no domain references.
- README — Complete rewrite to 100k-star quality. 10 badges (npm, downloads, stars, CI, TypeScript, Node, x402, Telegram), anchor-linked ToC, real terminal transcript instead of the aspirational marketing-campaign demo, feature grid in two columns, real Plugin SDK example without `{ ... }` placeholders, honest roadmap split (✅ shipped / 🚧 in progress / 💭 under consideration), star-history chart, free-tier call-out. Grounded every claim in an audit of the repo.
- CLAUDE.md — Same domain cleanup.
- CHANGELOG.md — v3.1.0 entry added. v3.0.0 history preserved verbatim.
Verification
- ✅ 6/6 local tests pass
- ✅ 13/13 E2E tests pass (GLM-5.1)
- ✅ `franklin --version` → `3.1.0`
- ✅ `franklin --help` is free of franklin.run/bet
- ✅ `grep -r "franklin\.(run|bet)" src/ README.md CLAUDE.md package.json` → empty (only CHANGELOG history matches)
When do the domains come back?
When the sites are actually live. Brand narrative can lead product, but URLs shouldn't. v3.2.0 or later, once `franklin.run` and `franklin.bet` resolve to something worth clicking.
Not changed
- Everything else from v3.0.0. Plugin SDK, agent loop, tools, tests, wallet, sessions — all identical.
- The `runcode` alias still works through the 60-day compatibility window (until ~June 2026).
npm: @blockrun/franklin@3.1.0 · Full changelog: v3.0.0...v3.1.0
v3.0.0 — From RunCode to Franklin
Major rebrand. RunCode is now Franklin — The AI agent with a wallet.
Why the rename
RunCode was positioned as "a better Claude Code with multi-model support." That's defensive — it defines us by what we're not (not rate-limited, not subscription-locked, not Anthropic-only) rather than what we are. The moment Claude Code changes pricing, that entire differentiation evaporates.
The real opportunity isn't being a better coding tool. It's being the first AI agent that can actually spend money to get work done, not just write text about it.
- Claude Code writes code.
- Aider edits code.
- Cursor completes code.
- Franklin takes your USDC and autonomously runs workflows that cost money.
Benjamin Franklin was the founding father who said "time is money," printed his own currency, and deployed capital across the Atlantic to fund a revolution. Our Franklin does the same for AI agents: it turns your wallet into an autonomous economic engine.
Category
Autonomous Economic Agent — AI that spends money autonomously within wallet-enforced budget caps to deliver outcomes, not just text.
Built on three layers:
- x402 micropayment protocol — HTTP 402 native payments, wallet-as-identity
- BlockRun Gateway — aggregates 55+ LLMs + paid APIs behind one wallet
- Franklin Agent — reference client with Plugin SDK (this repo)
What changed
- Package: `@blockrun/runcode` → `@blockrun/franklin` (new name on npm)
- CLI command: `franklin` is the primary binary; `runcode` remains as a 60-day alias so existing scripts don't break
- Banner: new FRANKLIN ASCII art with gold→green "money" gradient
- README: complete rewrite with new positioning and Autonomous Economic Agent category framing
- CLI help text: all mentions of "coding agent" updated to "the AI agent with a wallet"
- Version: 2.8.0 → 3.0.0 (major bump because this is a category-level change, not a feature addition)
What did NOT change
- All plugins work identically — `social` and any future verticals
- Plugin SDK v2.7 contract is unchanged — no migration needed for third-party plugins
- Hermes patterns from v2.8 (prompt caching, structured compaction, session search, insights) all remain
- Config at `~/.blockrun/` is unchanged — no migration needed
- Wallet, sessions, stats all preserved
- Payment flow, API compatibility, E2E behavior — identical
Migration
Zero work required for existing users. The `runcode` binary continues to work as an alias for `franklin` through the 60-day compatibility window (until ~June 2026).
When you're ready, switch package names:
```bash
npm uninstall -g @blockrun/runcode
npm install -g @blockrun/franklin
```
The tagline
Franklin runs your money.
Short. Active. Ownership. Economic.
Long form: The AI agent with a wallet. While others chat, Franklin spends — turning your USDC into real work.
v2.5.29 — AskUser Fix
What's new
Fix: AskUser tool no longer crashes runcode
When the agent used the AskUser tool in Ink UI mode, runcode crashed. Root cause: readline.createInterface on stdin conflicted with Ink's raw-mode stdin ownership.
Fix: Added onAskUser callback to ExecutionScope and AgentConfig. When running in Ink UI mode, AskUser questions are now routed through a proper Ink dialog (cyan question box with TextInput) instead of readline.
What it looks like now:
╭─ Question ─────────────────────────────
│ What language should I use?
│ 1. TypeScript
│ 2. Python
│ 3. Go
╰─────────────────────────────────────
answer>
The main input box is blocked while the dialog is active (same pattern as the permission dialog).
Also in this release
- AskUser added to auto-allow list — no permission prompt before asking a question
- Non-interactive fallback preserved for piped/scripted mode
v2.4.0 — Context Compression (15-40% Token Savings)
7-Layer Context Compression
Integrated BlockRun's compression library directly into the agent loop. Saves 15-40% tokens automatically:
| Layer | Method | Savings |
|---|---|---|
| 1 | Deduplication | 2-5% |
| 2 | Whitespace normalization | 3-8% |
| 3 | Dictionary encoding (41 codes) | 4-8% |
| 4 | Path shortening | 1-3% |
| 5 | JSON compaction | 2-4% |
| 6 | Observation compression | 15-97% |
| 7 | Dynamic codebook | 5-15% |
How it works:
- Runs automatically when conversation has >10 messages
- Adds a header explaining codes to the model
- Layer 6 (observation) is the biggest win — summarizes large tool results to ~300 chars
- All layers are LLM-safe (model can still understand compressed text)
This is the same compression used by BlockRun's backend, now running client-side for immediate token reduction.
v2.3.2
v2.3.1
v2.3.0 — Token Management Overhaul
Token Reduction Improvements
Based on deep comparison with Claude Code's token management:
Smarter Pipeline
- Microcompact only runs when history >15 messages (was every loop)
- Circuit breaker: 3 failures → stop retrying compaction
- Token estimation padded 33% for conservatism (was under-counting)
Selective Thinking
- Keeps last 2 turns' thinking blocks (was only latest)
- Preserves recent reasoning while reducing old bloat
Per-Model Budgets
- Default max_tokens: 8K → 16K
- Model-specific caps: Opus 32K, Sonnet 64K, Haiku 16K, etc.
Cheaper Compaction
- Tiers down further: haiku → Gemini Flash
- Free models as compaction target
New: /tokens command
Estimated: ~45,200 tokens (API-anchored)
Context: 200k window (22.6% used)
Messages: 47
Tool results: 12 (340KB)
Thinking: 3 blocks
✓ Healthy
v2.2.7
v2.2.6
- Proxy: parse SSE JSON properly for token extraction (was regex)
- LLM: wallet cache refreshes after 30min TTL
- Grep: native fallback handles nested glob patterns better
- Optimize: clock skew protection on time-based cleanup
- WebFetch: strip SVG and form elements from HTML
- Config: version fallback updated to 2.0.0
- Index: cleaner default command detection