Observed since 20 Oct, 22:33 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
@0x0contact/c0x0
P2P disposable number messenger
P2P disposable number messenger — no servers, no logs, no trace.
Share a number and a PIN. Message. Forget it ever happened.
npm install -g @0x0contact/c0x0
requires Node.js 20.19 or later
# initialize (generates your number)
c0x0 init
# --- share your number + PIN with someone ---
c0x0 pin new --label "for sale" # creates e.g. "a3f9"
c0x0 whoami # shows your number to share
# --- or connect to someone who shared their number + PIN ---
c0x0 chat 0x0-293-4471-0038 a3f9
# done — revoke your PIN when finished
c0x0 pin revoke a3f9
c0x0 init # generate your number
c0x0 whoami # show your number
c0x0 renew # generate a new number (resets all PINs)
c0x0 migrate identity --json # read-only migration preview
c0x0 migrate identity --apply --json # create the additive local sidecar
c0x0 migrate preflight --json # read-only legacy data inventory
These migration tools are local and do not publish an ID, create an account, or change P2P routing. The preflight command reports aggregate counts and blocking categories only; it has no apply mode.
c0x0 pin new # create a PIN
c0x0 pin new --label "label" # with label
c0x0 pin new --expires 24h # expires in 24h (also: 1w)
c0x0 pin new --public # create a public PIN (for requests)
c0x0 pin list # list all PINs
c0x0 pin rotate <pin> # change PIN value
c0x0 pin revoke <pin> # permanently revoke
c0x0 chat <number> <pin> # interactive chat
c0x0 send <number> <pin> "message" # send once and exit
c0x0 inbox # view all inboxes
c0x0 read <pin> # read messages for a PIN
c0x0 listen # wait for incoming messages
c0x0 queue # show offline message queue
Share a public PIN openly — anyone can message you without knowing your number. First reply creates a dedicated private channel automatically.
c0x0 pin new --public --label "open" # create a public PIN to share
c0x0 requests # list incoming requests
c0x0 approve <pin> <pubkey> # reply and convert to private chat
c0x0 contact add 0x0://NUMBER/PIN # add from URI
c0x0 contact add NUMBER PIN # add manually
c0x0 contact list # list contacts
c0x0 contact label <id> "label" # set label
c0x0 contact remove <id> # remove
c0x0 qr <pin> # show QR code in terminal (scan to connect)
c0x0 web # open browser UI at localhost:3000
c0x0 web --port 8080
c0x0 web --lan # expose on LAN (accessible from mobile on same WiFi)
c0x0 web --no-open
Starts a local web server with a chat interface. Open the full URL printed by the command; its #session= fragment authenticates the WebSocket and is removed from the address bar after loading. --lan accepts only that session plus an exact local-network origin, so do not reuse a token-free bookmark.
your number: 0x0-816-8172-8198 (generated locally, never sent anywhere)
your PIN: a3f9 (you create and revoke it)
connection: sha256("0x0:{number}:{pin}:0x0-v1-2026") → Hyperswarm topic
transport: Hyperswarm (DHT-based P2P, Noise protocol)
storage: ~/.0x0/ (local only)
No accounts. No servers. No registration. Messages route peer-to-peer via Hyperswarm.
0x0://0x0-816-8172-8198/a3f9
Share as a link, QR code, or copy-paste. The other person adds it as a contact and connects directly.
For AI agents and automation:
c0x0 pipe <number> <pin>
Reads JSON commands from stdin, emits JSON events to stdout:
# stdin
{"type": "message", "content": "task complete"}
# stdout
{"type": "connected", "peer": "0x0-293-4471-0038", "pin": "a3f9"}
{"type": "message", "from": "0x0-293-4471-0038", "content": "got it"}
import subprocess, json
proc = subprocess.Popen(
["c0x0", "pipe", "0x0-293-4471-0038", "a3f9"],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
)
proc.stdin.write(json.dumps({"type": "message", "content": "done"}).encode() + b"\n")
proc.stdin.flush()
Everything lives in ~/.0x0/:
~/.0x0/
├── identity.json # your number
├── pins.json # your PINs
├── contacts.json # saved contacts
├── queue.jsonl # offline message queue (TTL: 72h)
└── messages/ # message history (per PIN)
Delete ~/.0x0/ to erase all traces.
Android app available on Google Play. iOS coming soon. The CLI and mobile apps are fully compatible — same number, same PINs, same P2P network.
MIT
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
wsEnvironment{
"local_name": "ws",
"alias": false,
"peer_metadata": null
} | ^8.16.0 | runtime |
oraEnvironment{
"local_name": "ora",
"alias": false,
"peer_metadata": null
} | ^8.0.1 | runtime |
openEnvironment{
"local_name": "open",
"alias": false,
"peer_metadata": null
} | ^10.1.0 | runtime |
uuidEnvironment{
"local_name": "uuid",
"alias": false,
"peer_metadata": null
} | ^9.0.0 | runtime |
chalkEnvironment{
"local_name": "chalk",
"alias": false,
"peer_metadata": null
} | ^5.3.0 | runtime |
expressEnvironment{
"local_name": "express",
"alias": false,
"peer_metadata": null
} | ^4.18.0 | runtime |
commanderEnvironment{
"local_name": "commander",
"alias": false,
"peer_metadata": null
} | ^12.0.0 | runtime |
hyperswarmEnvironment{
"local_name": "hyperswarm",
"alias": false,
"peer_metadata": null
} | ^4.7.0 | runtime |
qrcode-terminalEnvironment{
"local_name": "qrcode-terminal",
"alias": false,
"peer_metadata": null
} | ^0.12.0 | runtime |
viteEnvironment{
"local_name": "vite",
"alias": false,
"peer_metadata": null
} | ^5.1.0 | development |
typescriptEnvironment{
"local_name": "typescript",
"alias": false,
"peer_metadata": null
} | ^5.3.0 | development |
Source distribution
{
"shasum": "483e4fca07383020f929a948b2c485d34593f306",
"tarball": "https://registry.npmjs.org/@0x0contact/c0x0/-/c0x0-1.0.3.tgz",
"fileCount": 32,
"integrity": "sha512-G1bvg27JkjoAd574XHBB7aJ9UeVgkJR4BYDoko7pZJ9SbQMmu78rompfbqMzSr/hRQ7R63pfsn8QzlHLrtyujg==",
"signatures": [
{
"sig": "MEQCIA29m6dQmbmXQPt+Bp1IkdIFOtn/tKNOUqJFgDt4u1KpAiBx2nqgl9hvLEXdQWO/Jlek7egTDdoC+pNu5n41ew6LpA==",
"keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"
}
],
"unpackedSize": 90631
}Observed since 20 Oct, 22:33 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:2f917edb523de914801f1e93a8a5deecf62cf5fa2911b5d400a7f03fc9384a74