75,310,075,437
@cybearl/celk :: 1.10.0
Celk is a personal experiment in brute-forcing crypto addresses at scale, it started as a CLI in 2023 and grew into a distributed engine with C++ workers, a Next.js dashboard, and far too many rewrites, here's how it got here, and what it's made of.
Pure TypeScript, I wrote the engine, every algorithm it needed, and CyBuffer, an extension of Node.js's Uint8Array built specifically for shuffling bytes through SHA256, RIPEMD160 and secp256k1 without allocating on every step, CyBuffer eventually moved to CyPack, where it still lives.
Celk got absorbed into the main Cybearl app as one of its modules, that site is now being rebuilt as a plain vitrine, with no worker plumbing, so Celk had to move out and stand on its own again.
I split the engine into a separate native binary and ran it through Next.js instrumentation at first, that didn't scale well, so I separated it into runners and workers: workers do the cryptographic grinding, runners orchestrate them, they first talked over RabbitMQ, then I switched to an HTTP sync endpoint, simpler infra, fewer moving parts.
An optional CUDA backend, reusing the same worker protocol so a GPU worker looks identical to a CPU one from the outside, the idea is to reach four to five orders of magnitude over the current CPU baseline, i'm planning on building an home server that'll be powered by some solar panels and will eventually be the subject of a YouTube video.
Native binaries running the actual brute-force loop: PCG64 / sequential / random-bytes key generators, secp256k1 derivation, SHA256 + RIPEMD160 for Bitcoin, Keccak for Ethereum, and a closest-match comparator that records the longest consecutive byte run per target, so even when no key matches, you can see how close it got.
Node daemons that spawn workers per address list, forward their events, and sync with the app on a heartbeat, they handle process lifecycle and local match storage so the orchestrator only sees a clean stream of progress.
A Next.js app with a tRPC API, a Drizzle-backed Postgres, and an instrumentation-time orchestrator that merges hash rates, attempt counters, and closest matches across runners. The dashboard you're using right now is the same surface I use to babysit it.
I wrote them all myself the first time around, I don't anymore, because I won't spend years trying to achieve 10% of the performance of the algorithms written by some guys that spent their entire careers on this stuff, my current C++ engine leans on libsecp256k1.