CKBadger: a local-first CKB-native explorer, and a vibe-coding experiment

I’d like to introduce CKBadger, a local-first CKB-native explorer. It’s a small homebrew project that I’ve been working on for months.

Github and Docs | Demo

CKBadger is highly opinionated and not meant to be for everyone. It’s built around a few questions that I wanted to explore.

Why I built it

CKBadger started from several personal interests.

  • I wanted to know how far “100% vibe coding” can go today. By that I mean: only talking to AI agents, not hand-writing code myself, and not doing code review. What kind of project can this approach actually produce?
  • I wanted to understand what role a human should, and can, play in such a project. If AI agents can write most of the code, what is still left for the human? What should the human own?
  • I have some ideas about how CKB on-chain data could be presented differently. CKB has a very distinctive UTXO/Cell model, and I think many existing blockchain explorer patterns are still too account-oriented. A CKB-native explorer should not merely copy the UX assumptions of Ethereum-like explorers.
  • I also wanted to see whether a very ordinary application becomes meaningfully different when built with a local-first and Web5-like mindset.

Why a blockchain explorer?

I chose the explorer scenario because it fits all of the above goals.

An explorer is useful enough to be real, but also safe enough to be a good playground. CKBadger only needs to read data from a CKB node. It does not need to manage private keys, sign transactions, or run on-chain scripts. That means I could focus on product structure, data presentation, performance, local-first architecture, and the human-AI development workflow, instead of worrying about high-risk security requirements.

What I learned

Now I’m pretty sure that 100% vibe coding can already produce a medium-sized project with good usability, maintainability, optimization, and production-level usefulness.

That does not mean the human becomes irrelevant. Quite the opposite.

The human may not need to code, but the human still needs to make design decisions. The human needs to choose trade-offs. The human needs to decide what matters, what can be ignored, what should be simplified, and who the project is for.

The human may not need to code, but the human still needs to know how to write documentation, how to design tests, and how to manage a codebase where they cannot personally review every line. A developer working with agents becomes a product+project manager.

AI can help with execution. It can generate the flesh and bones. But only the human can give a project its soul.

A note about the demo

I deployed a public demo so people can try CKBadger before deciding whether it is worth running locally. This is not very “local-first” but a preview should help the project’s cold start and overall understanding - a reasonable compromise :slight_smile:

It also shows a well-designed local-first app may run as a web2 app, while a centralized web service usually cannot easily become a local-first app.

Please do not treat the demo as a long-term official service. It is only a preview and demonstration. It will be taken down after a month or so. 0% service gurantee.

The best way to use CKBadger is to run it yourself, locally.

Enjoy and have fun!

21 Likes

About two months ago I told @wyltek about this very idea and he told me that there was already someone playing around with it: I would have never guessed it was you!! Congratulations on the delivery! :tada:

Phroi

PS: The following matches my experience

6 Likes

well….CKBadger is simply amazing. :open_mouth:

6 Likes

I’m only sad I haven’t got it running stably on a pi yet. I love the interface.

2 Likes

This should be hosted and maintained by the official team, alongside the official browser, whose appearance has hardly changed since its early days. Thank you.

I do not know the query created for the composition column, but I do really like it. I have two collections of Cosmic Repository, the “decentralized collection” was minted on the imagiNation platform. The “pure ckb” was minted on wyltek platform. Could you explain the difference?

2 Likes

Good question!

TLDR; “Pure CKB” means the object is fully on the CKB blockchain, zero off-chain dependencies. “Decentralized Mixture” means the object is partially on-chain, with some off-chain but decentralized dependencies like IPFS.

In contrast, “Centralized Mixture” refers to objects that rely on centralized external services (e.g., a Web2 server) to function. If those services shut down, the objects become dead and unusable—just like a 404 web page.

“BTC+CKB” is the other fully on-chain category, where the object is entirely stored on the Bitcoin and CKB blockchains. It mainly refers to some RGB++ assets - controlled by Bitcoin UTXOs, with content fully on CKB.

Fully on-chain objects (“Pure CKB” and “BTC+CKB”) are true permanent digital entities that can exist and operate indefinitely, relying solely on the CKB and Bitcoin blockchains.

For example, if you visit the object details pages of the two “Cosmic Repository” collection and check their “Media Compositions”, you’ll see the difference: the decentralized mixture version has an embedded ipfs:// link, the pure ckb version has none. Although they use the same Spore standard, the different ways of minting create different objects.

I hope “Object Composition” can help end users distinguish “good” digital objects from others. Digital object and NFT standards (e.g., Spore, mnft) typically don’t mandate how objects are stored—some store only metadata on-chain, while others keep everything on-chain. These differences lead to varying minting costs and levels of permanence, which can significantly impact value. Object composition reveals the “materials” that make up digital objects, making them more transparent to users, and helping reduce the market for lemons effect.

ps. All fully on-chain objects are honored with a dynamic icon for easier identification, displayed before the object’s title. The icon is a small Game of Life run generated from the object’s hash.

1 Like