Morse — Telegraph in Telegram
A Telegraph Hackathon Season I, Track 3 application.
Live: https://telegraph-morse.vercel.app · public ledger · API & MCP
Telegraph in Telegram. Ask, get an answer from a ranked miner, with a receipt. Send a question
to the bot — no wallet, no key, no sign-up — and Telegraph's own
router classifies it and picks a ranked miner (Morse falls back to its own routing only when the
router does not answer), Morse pays the x402 fee from one app-owned wallet, and the answer comes
back with a receipt: the miner that served it, the intent and why it was chosen, that miner's
rank, its confidence, the cost, the latency, the on-chain settlement transaction, and a
signal_hash you can verify on the node. The same thing is on the web and behind one hosted
MCP/REST endpoint for agents.
Live example, 2026-09-02: LiveCert #1 for SSL_VERIFICATION, $0.01, signal
0x0691ca3f…0821a1,
settled on-chain as 0x31b9b480…2af007.
Every call Morse makes is in a public ledger, so "people used it" is checkable rather than
claimed.
What Morse deliberately does not do. It does not re-rank miners. Telegraph's leaderboard is
the consensus and the router's pick is the answer, so there is no podium, no automatic second
opinion and no consensus report. Those were built, measured and retired on 2026-09-04 after an
organizer pointed out that paying several miners per question to re-derive the ranking is what the
protocol already does once for everyone, does not work economically for a user, and looks like
spam. The ledger keeps their rows, labelled; the code leaves before the freeze (GAPS G32).
One check that does not rely on Morse's word. /proof
reads the payer wallet's USDC transfers on Base Sepolia from a public indexer and matches them,
hash for hash, against the ledger's settlement transactions — the "actual volume of Telegraph
calls" counted from the chain, with any settlement the ledger lacks shown rather than hidden. It is
computed from data that already exists and spends nothing.
Not an aggregator. Morse does not pick providers or blend answers. Telegraph's ranked router
picks the miner; Morse pays and keeps the receipt. When you do want a specific miner — the
dispatch the organizers' own reference apps use — name it: telegraph_ask_miner over MCP,
{"miner": "livecert", "question": "…"} on REST, /miner livecert <question> in Telegram. The
receipt says routing was bypassed at your request.
Why
Consuming Telegraph today needs a wallet, testnet USDC from a faucet, and an x402 client. That
keeps out everyone who is not already a developer with a burner key, and it means the network's
"real usage" is mostly machines calling one miner. Morse is the missing front door, and because
every answer carries a verifiable receipt, its usage is evidence rather than a claim.
Quick start
Claude Code (MCP, no wallet)
Get a free key at /keys, then:
claude mcp add --transport http morse https://telegraph-morse.vercel.app/mcp --header "Authorization: Bearer morse_YOURKEY"
Then ask Claude anything the network can answer — "use telegraph_ask: is the TLS certificate for
github.com valid, and who issued it?", then "use telegraph_verify_signal on that signal_hash".
Tools: telegraph_ask, telegraph_ask_miner, telegraph_recipe, telegraph_verify_signal. Intents
and leaderboards are free over REST at /v1/intents and /v1/leaderboard/{INTENT}; the three MCP
discovery tools that duplicated Telegraph's explorer were removed on 2026-09-05.
Cursor, or any Streamable-HTTP MCP client
{
"mcpServers": {
"morse": {
"url": "https://telegraph-morse.vercel.app/mcp",
"headers": { "Authorization": "Bearer morse_YOURKEY" }
}
}
}
curl
curl -X POST https://telegraph-morse.vercel.app/api/keys -H "content-type: application/json" -d '{"label":"my-laptop"}'
curl -X POST https://telegraph-morse.vercel.app/v1/ask -H "Authorization: Bearer morse_YOURKEY" -H "content-type: application/json" -d '{"question":"What is the current weather in Chennai?"}'
Ask one named miner directly (miner authors: your own slug goes here):
curl -X POST https://telegraph-morse.vercel.app/v1/ask -H "Authorization: Bearer morse_YOURKEY" -H "content-type: application/json" -d '{"miner":"livecert","question":"Is the SSL certificate for github.com valid?"}'
Free, no key needed — the discovery endpoints and the ledger:
curl -s https://telegraph-morse.vercel.app/v1/intents
curl -s https://telegraph-morse.vercel.app/v1/leaderboard/SSL_VERIFICATION
curl -s https://telegraph-morse.vercel.app/api/stats
Telegram
https://t.me/MyMorse_Bot — /start shows tappable example questions; answers free text.
Commands: /miner <slug> <question>, /safe, /wallet, /weather, /fact, /verify,
/stats.
Every answer carries the same receipt the web and API surfaces return, and lands in the same
public ledger. In a group, Morse answers only when it is @mentioned or replied to, so a busy chat
never pays for answers nobody asked for.
What a receipt contains
| field | meaning |
|---|
minerSlug, minerId | which miner the Engine routed to |
intent | the canonical intent the router classified the question as |
minerRank | that miner's current leaderboard rank for the intent |
routedBy | engine when Telegraph's router chose the miner, morse when the fallback did |
routerReasoning | the router's stated reason, or which fallback rule fired |
settlementTx | the USDC transfer on Base Sepolia, from the node's payment-response header |
confidence | the miner's own confidence, read from its declared signal_mapping — or "not reported" |
costUsd, durationMs | what the call cost and how long it took |
signalHash | verify at /verify/{hash}, or on the node at GET /engine/v1/signal/{hash} |
/verify/{hash} shows the node's record, the payer wallet and whether it is Morse's, the
node's own keccak256-over-payload attestation, and the payload the hash covers. The node does not
publish a per-call settlement transaction (0 of 8 user-paid signals sampled on 2026-09-02 carried
one), so the on-chain trail is the payer wallet's USDC history on BaseScan, which Morse links.
Run it yourself
git clone https://github.com/Harshyadav442277/telegraph-morse && cd telegraph-morse && npm ci
npm run typecheck && npm test
cp .env.example .env && npm run dev
Without EVM_PRIVATE_KEY and a non-zero DAILY_BUDGET_CALLS, asking is refused with an honest
message; the site, the ledger and the free discovery endpoints all still work. The end-to-end
judge journey runs against any deployment:
That suite is free to run. The single paid step is gated behind MORSE_E2E_PAID=1 so no schedule
can manufacture traffic.
Docs
Assumptions and limitations
- Testnet. Base Sepolia, testnet USDC. Answers are real; the money is not.
- Telegraph routes first; Morse only falls back. The network's router gets 20 seconds; if it
does not answer (it timed out at ~47s for a day on 2026-09-02), Morse classifies the intent with
keyword rules and calls the best-ranked miner directly. Every receipt and ledger row says which
of the two happened (GAPS G17).
- The ledger's early rows are our own verification calls, not users — real and receipted, but
not adoption (GAPS G20).
- "Users" means distinct salted identity hashes — a Telegram user id, a web session cookie, or
an API key. One person on two surfaces counts twice; ten people reading one forwarded answer
count once. Morse publishes the method next to the number and never rounds it up (GAPS G4).
- The signal hash is shown, not re-derived. The node states it is
keccak256 over the payload
and reports verified: true; eleven serialisations of the payload as served failed to reproduce
it, so Morse displays that attestation rather than claiming to have recomputed it (GAPS G3). What
Morse establishes independently is the payer: the wallet on the record, checked against its own.
- Confidence is heterogeneous. Miners report it in different shapes or not at all; Morse
normalises what it can and says "not reported" otherwise (GAPS G8).
- A direct call to a named miner may not be possible for every miner. Direct calls are built
from the miner's manifest and declared input schema, and some miners reject a request they did
not shape themselves — which fails honestly and costs nothing (GAPS G14, G30).
/proof depends on a third-party indexer. It reads Blockscout, which can lag the chain by a
few blocks or be down; the page then says so and shows the ledger alone. It proves payments, not
people. Two settlements on chain have no ledger row — calls Morse recorded as timed out that the
network settled anyway — and are listed rather than removed (GAPS G29).
- Nothing is written on chain by Morse. Payments settle on Base Sepolia through x402; Morse
reads that trail but does not anchor verdicts or run ERC-8183 jobs (GAPS G27).
License
MIT