PlebNames are piggybacked names on Bitcoin. Just the Bitcoin chain and normal block explorers are required, no other server infrastructure or sidechain.
A PlebName is unique and is owned by one clear pleb at a time (or with multisig a group of plebs).
The owner of a Plebname (the one who claimed the name first) can attach data to it, like a Lightning Address or Nostr npub.
Try it out at http://plebnames.org.
npm install plebnames
import { bitcoinExplorer } from 'plebnames'
//import { bitcoinExplorer } from 'jsr:@plebnames/[email protected]' // or 'npm:[email protected]' for Deno
const nameHistory: PlebNameHistory|'unclaimed' = await bitcoinExplorer.followNameHistory('test')
if (nameHistory === 'unclaimed') {
console.log('Name is not claimed yet.')
} else {
console.log(nameHistory.getData())
// {
// owner: "bc1q88758c9etpsvntxncg68ydvhrzh728802aaq7w",
// nostr: "npub1pcqz0y5zt6cfafazcu6h2vf9trghshxhdwypm0g8jf2nmuhmd6rqdcd82u",
// website: "https://bitcoin.org"
// }
}
PlebNames give every pleb a clear unique name that can be spoken and easily remembered.
For example when doing a transaction: Instead of typing in a long address you just type in the PlebName of a pleb. The wallet then looks in the Bitcoin mainchain to whom the PlebName belongs and resolves the PlebName to the actual address.
For example "Ego" is a great name, but there is one problem: How to let everbody know that we claimed "Ego" first because it is not indexed.
Fortunately Bitcoin addresses are indexed by every Bitcoin explorer, then let's convert our name to a Bitcoin address:
Convert your name to Bech32. As Bech32 is missing some letters let's agree b converts to 8, i to 7 and o to 0.
So in our example, "Ego" converts to "eg0".
Problem: "eg0" is not a valid Bitcoin address. Luckily there is one very obvious and deterministic way:
Prefix it with "bc1q" and as you are proud of your name repeat it as long as possible (reach 32 letters), then suffix it with the 6 letter checksum.
We get "bc1qeg0eg0eg0eg0eg0eg0eg0eg0eg0eg0egt7y40w" (exactly 42=2*21 letters, awesome!) and call it PlebAddress, the PlebAddress of a name is unambiguous, there is exactly one PlebAddress for a name.
In a Bitcoin explorer of your choice search for your PlebAddress to ensure it is not claimed yet.
Send or burn the smallest satoshi count to your PlebAddress that is distributed in the mempool and accepted by miners (atm 546 SATs).
We agree the first one who sent to a PlebAddress claimed the related PlebName.
You can own it, really own it.
You can publish the most precious information about your name that should be able to be fastly looked-up by everyone. E.g. your current lightningAddress.
You can update these most precious information and transfer a PlebName to somebody else.
Bitcoin addresses are indexed by every bitcoin explorer. This makes it very easy to find out when a PlebAddress first occured.
It enables a very simple code snipped to look-up when a PlebName was first claimed.
This makes PlebNames a simple, ubiquitous, uncensorable and fast Protocol.
Yes, claiming a PlebName creates an unspendable UTXO, but taking into account that everybody who uses the Bitcoin mainchain has about 10 to 20 UTXOs on average
one or two additional UTXOs for having one or two names on average do not fall into account and are imho worth it to have convenient names on just Bitcoin.
Install the JavaScript runtime Deno: https://docs.deno.com/runtime/manual
When working with VS Code the Deno extension by denoland is recommended: https://marketplace.visualstudio.com/items?itemName=denoland.vscode-deno
To get an overview of the code base try out Mammutmap: https://marketplace.visualstudio.com/items?itemName=mammutmap.mammutmap
cd ./landingpage
npm run dev
The folder ./dist/website/
is delivered via GitHub Pages, see ./.github/workflows/static.yml.
To deploy a new version run within ./landingpage
npm run build
then replace the content of ./dist/website/
with the content of ./landingpage/dist
deno run -A build.run.ts
or more precise
deno run --allow-env --allow-read --allow-run build.run.ts
In Chrome go to chrome://extensions/
and ensure that on the top right 'Developer mode' is toggled on. After that click Load unpacked
and select the ./dist/chromeExtension
folder of this repository.
Ensure that conflicting extensions are not running in the background (i.e. other extensions that redirect the same Top Level Domain).
For further information about Chrome Extensions see https://developer.chrome.com/docs/extensions.
In Firefox go to about:debugging#/runtime/this-firefox
. Then click on Load Temporary Add-on...
and select a file in ./dist/firefoxExtension
.
Ensure that conflicting extensions are not running in the background (i.e. other extensions that redirect the same Top Level Domain).
For further information about Firefox Extensions see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Your_first_WebExtension.
deno test --allow-net