CloddsBot — a prediction-market trading agent carrying 121 skills, brought up with zero API keys
A 2,813-star prediction-market trading agent, started without issuing a single API key, indexing 694 markets across three venues and scanning for cross-platform
Part 7. CloddsBot — my series outline called it a "Claude integration". What I opened was a prediction-market botThis part starts with a record of my own mistake. When I put this tool on the series outline, I wrote that it was "the easiest thing to connect: Claude as the primary model, 121 skills exposed over MCP". I pulled the real thing down, opened it, and half of that was right and half of it was wrong.
What counts as finishing this article: you bring the bot up without issuing a single API key, index 694 prediction markets, run the cross-venue arbitrage scan, and finally measure for yourself when this bot's safety rails trip and when they don't.
| What it does | Talk to it from Telegram, Discord, Slack or web chat and the Claude inside it finds prediction markets, computes cross-venue arbitrage, places orders and minds positions. It reaches into crypto and Solana DeFi as well |
| Who it fits | Anyone who wants to see several prediction-market venues on one screen · anyone who wants to work Solana DeFi conversationally |
| Who it does not fit | Anyone trading equities (neither Korean nor US) · anyone who wants to practise in simulation first (that box does not exist) · anyone starting with a small account (the safety defaults assume $10,000) |
| What you end up with | 694 prediction markets indexed with 0 keys, two arbitrage scans that came back empty-handed, and a table from measuring the safety rails across six cases |
| Cost to get started | Code free (MIT) · model ANTHROPIC_API_KEY required (an OpenRouter key works instead) · market data free, 0 exchange keys · weltiq nothing to connect in this part |
| Time & difficulty | 23 s to install, 1.8 s to start, 7 s to index. Difficulty medium — you need to be comfortable with Node 22 and environment variables |
| Relationship to weltiq | It does not connect. Different markets (prediction markets and on-chain vs equities and crypto). Section 5 says why, plus the one thing you can take with you |
| Test environment & date | macOS 26.6.2 · arm64 · Node.js 26.8.1 · npm 11.19.0 · 2026-09-22, 03:58–04:33 KST |
| Disclosure | The author is paid by weltiq for this series. Tool assessments use only results the author ran personally |
I created no wallet, opened no exchange or prediction-market account, and made no on-chain transaction. The only requests this bot sent outside were public market-data lookups, and orders were 0. The market names appearing here are examples used to confirm functionality and are not trading opinions of any kind. The second line of this repository's README carries a Solana token contract address — this article expresses no opinion on that token and did not even look it up. Raw logs, scripts and the list of what I could not measure are in the verification record.
1. What this is
alsk1992/CloddsBot is a self-hosted AI trading terminal built around prediction markets, reaching out into crypto and futures as well. The README spells out the name itself: Claude + Odds = Clodds. It started in January 2026 and passed 2,800 stars in 8 months.
| Item | Value | How it was checked |
|---|---|---|
| URL · license | github.com/alsk1992/CloddsBot · MIT |
GitHub API |
| Stars | ★2,815 · 346 forks (observed 2026-09-22) | GitHub API |
| Last push | 2026-09-18 · created 2026-01-26 · 32 open issues | GitHub API |
| Package · size | clodds 1.9.1 · Node ≥22 · src/**/*.ts 581 files · 80 dependencies |
package.json |
| Bundled skills · default model | 121 · claude-opus-4-6 |
startup log Loaded 121 skills |
| Live trading | Yes. Put a key in and real money goes out | docs/TRADING.md |
The CloddsBot WebChat on first open
↑ This is the screen you get once the install finishes (http://localhost:18789/webchat). Under the greeting in the middle: "What odds are you exploring today?" — the word odds sitting on the very first screen is this tool's identity. Of the four tiles below, Markets · Portfolio · DeFi are the whole of what this bot does, and the four icons down the left bar are chat, files, history and code
Correcting what I wrote in the outline
I had filed this tool as "something that only judges, with the order-execution seat empty". My evidence was two lines read off the GitHub front page — "Claude as the primary model" and "121 skills exposed over MCP". Opening the real thing flipped the classification in three places.
First, the 19 items in src/tools/ contain no trading tools — browser, Docker, email, git, shell, SQL, SMS: all general-purpose agent tools. Second, the first line of docs/TRADING.md is "Complete trading infrastructure for prediction markets". Not a research tool that offers an opinion, but a complete bot with its own execution layer. Third, the dependency list is @drift-labs/sdk·@jup-ag/api·@kamino-finance/klend-sdk·@meteora-ag/dlmm·@orca-so/whirlpool-sdk·@raydium-io/raydium-sdk-v2·@solana/web3.js — a pile of Solana DeFi SDKs, and a project that pulls in that list swaps on-chain directly. The first line of a file in docs/ and the dependency list in package.json are more honest than the README.
The 121 skills are real — though the catalog says 119
The basis for the 121 I could not find was two levels down (src/skills/bundled/*/), and the directory count, the SKILL.md count and the startup log all say 121. But the docs/SKILLS_CATALOG.md shipped alongside it opens with # Skills Catalog (119 Skills), and the catalog table does have exactly 119 rows. The two that are on disk but not in the catalog are dex and rust-hft-arbitrage. It is a signal that the docs and the code have already drifted, and that gap shows up a few more times below.
By area: prediction markets 11 · Solana DeFi 12 · DeFi/DEX 12 · futures 8, with the rest in infrastructure, strategy and utilities. There are no equities — not Korean, not US. This list tells you exactly where this tool sits.
2. Installing
What you need is Node.js 22 or above, 1.8GB of disk, and one ANTHROPIC_API_KEY (without it the bot will not start at all). Exchange keys are not needed — everything in this article was done with 0 keys.
Warning — this is not a tool that defaults to paper mode. Part 4's freqtrade pins "start in dry-run" to the first section of its docs, and Part 13's hummingbot turns simulated simply by appending
_paper_tradeto the exchange name. CloddsBot is different. The configuration example indocs/TRADING.mdopens with"dryRun": false, and the moment you put a prediction-market key in, real money goes out. Please read section 6 before you put a key in.
git clone https://github.com/alsk1992/CloddsBot.git
cd CloddsBot
npm install # 13 s · 1,737 packages · node_modules 1.7GB
npm run build # 10 s · dist/ 22MB · 101 files
That 13-second npm install is a number my laptop produced because its npm cache was already 5.2GB full. If you are pulling it for the first time it takes far longer — the Solana and EVM SDKs hanging off it make for a lot of downloading. The time from a cold cache is not measured. Several warnings appear during the install, but they are all deprecated notices and the exit code is 0.
Where you might get stuck
| Symptom | Cause | Fix |
|---|---|---|
npm install looks stalled at postinstall |
It is downloading and caching the embedding model (all-MiniLM-L6-v2) |
Wait. Even if it fails it is swallowed |
You ran rm -rf dist && npm run build and dist/ comes back nearly empty |
.tsbuildinfo lives at the repository root. Delete only dist and tsc decides "nothing changed" and emits nothing |
Delete .tsbuildinfo as well: rm -f .tsbuildinfo |
It dies at startup with ANTHROPIC_API_KEY is not set |
No key means process.exit(1) |
See section 3 |
Port 18789 is in use |
Another instance is already up | clodds config set gateway.port 18790 |
The second one held me up the longest — exit code 0, 3 seconds, and dist/ contains nothing but skills/ (800K). Not one line of error. Delete .tsbuildinfo, run it again, and 22MB across 101 files comes out properly in 10 seconds.
3. First result
Connecting without an Anthropic key — but do not put /v1 on the end of the URL
You can connect it without an Anthropic console account at all. The official SDK reads ANTHROPIC_BASE_URL, and OpenRouter serves /v1/messages in exactly the Anthropic shape.
export ANTHROPIC_API_KEY="<OpenRouter key>"
export ANTHROPIC_BASE_URL="https://openrouter.ai/api" # ← do not put /v1 on the end
There are three traps here. I stepped in all three myself.
| Trap | What happens | What to do |
|---|---|---|
The /v1 on the end |
The SDK appends /v1/messages itself, so you land on …/api/v1/v1/messages and get {"error":{"message":"Not Found","code":404}} |
Set the base URL to https://openrouter.ai/api and no further |
.env does not take |
dotenv does not overwrite environment variables already present in the shell. The symptom is AuthenticationError … "API key is invalid." — not a key problem, a URL problem |
Print client.baseURL; if it says https://api.anthropic.com, the shell is winning. Use export in the shell instead of .env |
| The model-name prefix | Not required. OpenRouter accepts unprefixed Anthropic model IDs as they are ("model":"anthropic/claude-sonnet-4.6" … "cost":0.000264, HTTP 200) |
You do not need to change a single line of the source |
The default model is Opus. This is a thing that runs with 121 skills loaded into the system prompt, so the tokens that go into a single exchange are not trivial. I dropped it to haiku by writing
{"agents":{"defaults":{"model":{"primary":"claude-haiku-4-5-20251001","fallbacks":[]}}}}intoclodds.jsonin the state directory. The config file hot-reloads — save it, the log printsConfig hot-reloaded, and it applies from the next conversation.
Bringing it up — one command, port 18789, no login
| Start command | node dist/index.js (or npm start) |
| Address | http://localhost:18789/webchat |
| Changing the port | clodds config set gateway.port 18790 |
| Login | Not required. If you do not set CLODDS_TOKEN, authentication is off |
| On first open | An empty chat window plus four shortcut tiles (Markets · Portfolio · DeFi · Quick Start). No sample data |
This is what success looks like.
[04:09:43.504] INFO: Loaded 121 skills
[04:09:43.725] INFO: Gateway started port: 18789
[04:09:43.726] INFO: Clodds is running!
[04:09:44.053] INFO: Polymarket WebSocket connected
[04:09:48.631] INFO: Market index sync completed
result: { "indexed": 692,
"byPlatform": { "polymarket": 300, "kalshi": 300,
"manifold": 92, "metaculus": 0 } }
From the first line to Clodds is running! is 1.8 seconds, and within the next 7 seconds it scrapes 692 prediction markets and indexes them into a local DB. Getting this far requires not one exchange key — the public feeds of Polymarket, Kalshi and Manifold all open without authentication. You can ignore the warning about missing Telegram and Discord tokens.
There are two dashboards, and one of them is empty
The CloddsBot Performance Dashboard
↑ http://localhost:18789/dashboard. The title bar has only Performance Dashboard and a Refresh button, and the pink text in the middle is the entire content — "Failed to load performance data. Make sure trading is enabled." With trading switched off there is nothing on this screen at all. Posted as it is, undressed
Where you might get stuck
| Symptom | What to check |
|---|---|
Sorry, I encountered an error. in web chat |
Look at the gateway log. A 401 means the three traps above |
clodds doctor reports Anthropic ✗ HTTP 401 |
That is normal. https://api.anthropic.com/v1/messages is hardcoded in the diagnostic, so it never looks at ANTHROPIC_BASE_URL. The agent runs perfectly |
clodds doctor never finishes |
The output all comes out, then the process does not exit (I waited 4 minutes and cut it off). Set a timeout if you script it. The first run's rows is not iterable is just the DB not existing yet; the 15 migrations apply normally afterwards |
PredictIt fetch error: · metaculus: 0 |
Happens on every startup. No effect on anything else |
4. Getting the most out of it — sweep without keys, then put a ruler on the safety rails
What I ran, at a glance. Three things — 694 prediction markets indexed across three venues (7 seconds after startup), two cross-venue arbitrage scans (thresholds 0.5% and 0.1%, 3.8 s and 3.5 s, both empty-handed), and six safety-rail cases measured. All with 0 keys and 0 orders.
I could not place an order. There is no paper path and placing an order means real money goes out. That "here is what happened when I placed an order" is not in this article is the biggest hole in it, and I am writing it down as such.
Crossing three prediction-market venues without a single key
This is what this tool does best. Polymarket, Kalshi and Manifold each price the same event separately, so there is value in the act of gathering the scattered pieces into one place.
Search the market index for bitcoin markets. Show the top 5 with platform, price and 24h volume. Keep it short.
CloddsBot searching the market index
↑ The search result. Look at the Platform column — Manifold and Polymarket come back mixed into one table. And the first line of the answer is honest: it volunteers up front that "the search returned policy and tax markets rather than price forecasts". Proposing another skill (/polymarketcryptomarkets) at the bottom is part of the same single turn
If three venues price the same event differently, there is arbitrage.
Run the cross-platform arbitrage scan on the prediction markets you have indexed. Tell me how many matched pairs you found, the best spread, and what would block me from taking it. No trades.
The CloddsBot cross-venue arbitrage scan
↑ This is the representative image of this article. Look at the two grey boxes at the top — Running tool: find_arbitrage... and Finished tool: find_arbitrage (3801ms). This bot puts which tool it ran, when, and for how long right on the screen. The answer below is "no arbitrage above 0.5%", and it follows with six lines on what would have blocked it even if there had been — liquidity, fees, fill speed, rate limits, collateral on both sides, key setup
Once more, with the threshold lowered to 0.1%.
The 0.1%-threshold rescan and the index statistics
↑ The index statistics come first — Polymarket 300 · Kalshi 300 · Manifold 94 · Metaculus 0 · 694 in total. Metaculus being 0 is the same event as Market index sync failed platform: "metaculus" in the startup log. The arbitrage scan below comes back empty-handed at 0.1% too, and under it are three lines on why there might be none**
Be careful reading that result. "There is no arbitrage" means there was none within the 694 markets this bot indexed, by this bot's matching method, at this moment. It does not mean prediction markets as a whole are efficient; the bot itself wrote that "the markets in my index may be weakly cross-matched". And even if arbitrage had appeared, executing it requires accounts, collateral and keys on both platforms, so there is a large gap between a scan result and the ability to act on it.
Putting a ruler on the safety rails
One of the four pillars in docs/TRADING.md is Safety — circuit breaker, drawdown, kill switch. In Part 13, hummingbot's kill switch was a percentage of total net worth and failed to trip twice, so I held the same ruler up here. I cannot place orders, so I measured by loading the safety module (src/trading/safety.ts) directly.
The defaults are dailyLossLimit: 500 (absolute dollars) · dailyLossLimitPct: 5 · maxDrawdownPct: 20 · maxConcentrationPct: 25 · cooldownMs: 4 hours · autoCloseOnBreaker: false, and the initial state is peakValue: 10000 · currentValue: 10000. It starts by assuming your capital is $10,000.
| # | Case | Measured result |
|---|---|---|
| ① | Someone with $200 of capital placing an $80 order | validateTrade(size=80, price=1.0) → {"allowed":true}. The concentration limit is 25%, but the denominator is the default $10,000, so it computes as 0.8%. An order staking 40% of capital on one position passes as "safe" |
| ② | Registering the real capital with updatePortfolioValue(200) |
drawdown 98.0% · tradingEnabled false · "Drawdown 98.0% exceeds 20% limit". Not a cent lost and it reads as 98% drawdown — the peak is pinned at $10,000. To use this with a small account you have to set peakValue first, and that is not in the docs either |
| ③ | Opening the drawdown limit, turning the percentage limit off, then piling on losses | −$100 (50% of capital) → true · −$200 (all of capital) → true · −$520 (260% of capital) → false. You can lose your entire capital and the breaker does not trip |
| ④ | After an automatic trip, the cooldown (shortened to 1.5 s to measure) | Nobody did anything and canTrade() comes back true with disabledReason cleared to undefined. The default cooldown is 4 hours — a bot that halted on drawdown at midnight starts trading again on its own at 4 a.m. |
| ⑤ | The manual kill switch | resumeAt = undefined, so it does not release itself. A kill a human pressed stays locked until a human releases it — this part is well made |
| ⑥ | What happens to positions when the breaker trips? | autoCloseOnBreaker: false is the default. Only new orders are blocked; the positions you were holding stay in the market. I am not saying that is bad — but you should use it knowing that "halted" is not "flattened" |
③ is the same failure in the opposite direction as hummingbot's kill switch in Part 13 — hummingbot's denominator was too big to trip; here the default limit is too big to trip. Fortunately the percentage limit (5%) is on by default, but the denominator of that 5% also stays at $10,000 unless somebody calls updatePortfolioValue.
And this module has no tests. tests/trading-safety.test.ts passes 21 of 21 (759 ms), but what it tests is the Kelly formula and src/execution/circuit-breaker.ts, and grep -rln "trading/safety" tests returns empty output. That the thing the docs call the Safety Manager has no tests largely explains why ①–⑥ look the way they do.
This is not a measurement taken through the order path, though. How often anyone calls updatePortfolioValue once real fills are attached is not verified, and that call frequency governs how ①②③ actually feel in practice.
The 121 exposed over MCP are 118, and the descriptions are all identical
This is where the outline's error ends. clodds mcp does not start an MCP server — it prints help and stops, and this command is the side where CloddsBot consumes other MCP servers. The clodds mcp install subcommand the README mentions does not exist, and the server code (src/mcp/server.ts) is properly implemented but nowhere in the repository does anything call that function (grep -rn "mcp/server" src → empty output).
Loading the module directly and doing a handshake over stdio, it works fine and tools/list returns 118 items (opportunity, markets and pairing drop out). More importantly, every description is Clodds skill: <name> — the proper description in each SKILL.md never goes out over MCP. MCP is a protocol where tools are chosen by their descriptions, and if the description is a repeat of the name, then 118 items is effectively an unselectable list.
5. Moving it to weltiq — there is no seat for it
I will be straightforward. This tool has no direct connection point with weltiq. What weltiq fills is equities and crypto; what CloddsBot handles is prediction markets and Solana DEXes. Drawing a loop that does not exist would be advertising, not guidance.
Which of the four stages is it in. Tools can be seen as occupying four seats: ① analysis → ② systematization and fitting → ③ paper → ④ trade analysis. CloddsBot is a complete package that does ① through ④ entirely inside itself. Except that those four stages stand on a different market. It is not on the same floor; it is the building next door.
If prediction markets are what brought you here, I recommend reading Part 8, CoinRithm alongside it — an aggregation across 12 prediction-market venues, and what "a place to run it with fake money" looks like, are both there. For running equities and crypto unattended 24 hours a day, Part 4 freqtrade and Part 13 hummingbot are closer to you than this part.
The five questions measured in section 4 are yours to take, though. They are worth asking whatever the market.
| Ask this of whatever bot you use | CloddsBot | weltiq |
|---|---|---|
| Is the denominator of the limit my actual capital, or a hardcoded number? | Hardcoded $10,000 by default | Each strategy container is launched with its capital written in |
| Is the loss limit a percentage or an absolute amount? | Both exist, but the absolute $500 is the default | A maximum loss in currency terms; leave it out and the container does not come up |
| After it halts, who turns it back on? | An automatic trip turns itself back on after 4 hours | Only a human (a logged-in session). There is no auto-resume |
| Is a halt a liquidation or a block on new orders? | A block on new orders (default) | A stop runs until the held position is confirmed flattened |
| Does that safety rail have tests? | No | Yes (private repository) |
This is not a claim that one is right — it is a different choice. CloddsBot put unattended continuity first; weltiq put human confirmation first. But you should use either one knowing what that choice is.
6. After using it
What was good
- You get this far with no keys. One command and 694 markets were in a local DB in 7 seconds, with no account, no wallet and no payment method.
- It puts tool calls right on the screen.
Finished tool: find_arbitrage (3801ms)appears in the user's own view. With that you can verify an answer; without it you cannot. - The skills system is honest. Drop in a
SKILL.mdand it loads automatically, with a hot-reload watcher attached. It really does carry 121 of them, and that number is not a lie. - The manual kill switch does not release itself. Fewer projects make that distinction than you would think.
What fell short
- There is no paper mode. This is the big one. Before you put a key in you can only read; put one in and you are immediately live. In between there is no box for "running it as if it were real". A
dryRunflag does appear indocs/TRADING.md, but the configuration example starts atfalse, and I did not get that path working — not verified. - The docs and the code disagree in five places. Catalog 119 vs 121 on disk ·
clodds mcpdoes not start a server · noclodds mcp install· "121 skills over MCP" is actually 118 with identical descriptions ·clodds doctordoes not look atANTHROPIC_BASE_URL. - The safety defaults do not assume a small account. Starting small is the normal path for a first-time user, and that normal path is not in the defaults.
- The chat
/doctoris not a real diagnostic. When you check status, look at the CLI and the log, not the chat.
The chat /doctor output
↑ The chat /doctor output. It says API Connectivity ✓ Pass — All prediction market APIs responsive. And yet at that same moment the gateway log carried Market index sync failed platform: "metaculus" and PredictIt fetch error:
That output is not a diagnostic that ran; it is the model reading the doctor skill's SKILL.md and writing prose. The CLI's clodds doctor, by contrast, actually poked the network and reported two failures — two diagnostics with the same name say different things.
Cost
| Item | Value |
|---|---|
| Code · market data | Free (MIT · 0 exchange keys) |
| Model | ANTHROPIC_API_KEY required. The default is Opus, so dropping to haiku is cheaper |
| Time · disk | 23 s to install · node_modules 1.7GB + dist/ 22MB |
I am not ranking anything. An 8-month-old project stacked up 581 TypeScript files in that time, and most of what I pointed out is a one-line fix, so it could look different next month. But what I got when I pulled it down today and ran it today is the above.
7. What to do next
Next is Part 8, CoinRithm — the first tool in this series with nothing to install, a web service you reach at a URL, sign up for, get a key from, and use with a single Authorization: Bearer header. This part asked "when does this bot's safety rail trip"; the next one puts a company selling very nearly the same sentence as weltiq side by side with it. The sentence they sell is "a paper sandbox for AI trading agents," and there is one question the two answer in opposite directions — should agent P&L be ranked in public?
Getting weltiq ready — 3 lines 1. Sign up: {{CTA_URL}} 2. My page → Connections, issue an API key 3.
claude mcp add weltiq --header "Authorization: Bearer <key>" https://weltiq.ai/mcpThis is where to look when you want a loss limit enforced on the equities and crypto CloddsBot does not reach.
Every command, output and number here was actually run on 2026-09-22. Orders: 0, and none of this is a trading opinion. The trial and error, raw logs and defect list not written here are in the verification record.
Tony Brown · 2026-09-24