satoshi 1dcf087842 Revert block-broadcast fallback path
Removes the entire fallback submitter mechanism: ckpool patch 0004,
the blocksubmit package, the wiring in main.go, the config fields,
the aggregator's fallback counters and snapshot fields, the healthz
fallback fields, and the TS type fields plus the HealthBanners
fallback alert.

Reasoning: ckpool's primary bitcoind submission must remain the
single source of truth, and getting the parallel "race a fallback
during the submit" semantics right is more architectural complexity
than the marginal reliability gain justifies. The original upstream
behavior — submit to bitcoind, retry indefinitely if unavailable —
is what we want.

Kept intact:
  * Submit-attempt vs confirmed counters (block_submit_attempts /
    block_submits_confirmed). Useful on their own as a "did bitcoind
    confirm the submission?" signal.
  * HealthBanners shows submit_gap and zmq_stale only.
  * /healthz exposes submit_gap, zmq_stale, etc.
  * All P0 reliability work (tailer cursor, reconcile loop, reorg
    detection, multi-solve guard) and other P1 (RPC retry, WS
    back-pressure, ZMQ tracking, startup readiness gate).
2026-04-28 02:07:17 +03:00
2026-04-28 02:07:17 +03:00
2026-04-28 02:07:17 +03:00
2026-04-12 19:41:13 +03:00

Kamado Pool

A modern, feature-complete solo Bitcoin mining pool built on a patched fork of CKPool, with a real-time web dashboard and a Go-based API middleware that surfaces everything CKPool knows.

Why Kamado?

Existing CKPool-based solutions (like Bassin for Umbrel) read only a handful of periodic stats files and miss most of CKPool's rich data. Kamado talks directly to CKPool's Unix socket API to expose:

  • Real-time per-client data: hashrate, difficulty, user agent, hardware detection
  • Full block-found history with height, hash, reward, and solving worker
  • Per-worker and per-client best share tracking (current + all-time)
  • Network difficulty, pool efficiency, expected time to block
  • Live dashboard updates via WebSocket (no 60-second file polls)

Architecture

┌────────────────────────────────────────────────────┐
│  ckpool-solo (C)  ──Unix socket──►  kamado-api (Go) │
│   ports: 3333                             ports: 80 │
│                                                    │
│   ▲ stratum                         ▲ HTTP/WS     │
│   │                                 │              │
│  Miners                           Browser          │
│                                                    │
│  bitcoind ◄──── RPC + ZMQ ────── ckpool + kamado-api│
└────────────────────────────────────────────────────┘

Three main components:

Component Language Purpose
ckpool/ C Stratum server, share validation, block submission
api/ Go Socket client, REST/WebSocket API, persistence
ui/ Svelte Real-time dashboard

Phases

  • Phase 1 — Fork & fix CKPool, build infrastructure
  • [~] Phase 2 — Go API middleware
    • Phase 2a: CKPool socket client, bitcoind RPC, state aggregator, REST API
    • Phase 2b: CKPool log tailer, block history, stdlib WebSocket push
    • Phase 2b.5: ZMQ block notifier, SQLite persistence (deferred until s9pk repo exists — need real Go build env for new deps)
  • ckpool patch 0001: expose bestever in runtime socket JSON so the UI can show "this round" and "all-time" best share side by side
  • [~] Phase 3 — Svelte UI dashboard (skeleton: header, pool overview, miners table, blocks, best shares leaderboard; live WS updates)
  • Phase 4 — Monorepo Docker build: kamado-api embeds ui/dist via //go:embed and serves it at /. The api Dockerfile has a node stage that builds the UI before the Go stage embeds and builds the binary; docker-compose uses the repo root as build context so both api/ and ui/ are visible.
  • Phase 5 — Testing (regtest, testnet4), polish

Quick start (dev)

cp .env.example .env          # set POOL_BTCADDRESS and bitcoind creds
make up                       # build + start ckpool + api
curl localhost:8080/api/health
curl localhost:8080/api/pool

REST endpoints:

Route Returns
GET /api/health CKPool + bitcoind health
GET /api/pool Pool stats + derived hashrate windows + chain info
GET /api/users All users from users socket command
GET /api/workers All workers from workers socket command
GET /api/clients All connected stratum sessions (useragent, IP, diff)
GET /api/blocks Recent solved blocks (in-memory ring, SQLite in Phase 2b.5)
GET /api/snapshot Full merged snapshot (everything)
GET /api/ws WebSocket push: full snapshot on every refresh + on solve

StartOS packaging lives in a separate repository.

Upstream

CKPool by Con Kolivas: https://bitbucket.org/ckolivas/ckpool

Pinned commit: see ckpool/CKPOOL_COMMIT

License

GPL-3.0. CKPool itself is distributed under GPL-3.

S
Description
No description provided
Readme
640 KiB
Languages
Go 46.7%
Svelte 36.4%
Shell 9.2%
TypeScript 4.7%
Dockerfile 1.4%
Other 1.5%