Kunuleco User Manual
Everything you can do, and how to do it — from your first login to founding a Hall and building trusted circles.
This manual covers the full command surface of the current alpha build. You can read it top to bottom, or jump to the Command reference when you just need syntax. Commands are shown as you type them; angle brackets like <name> mark values you fill in, and [brackets] mark optional parts.
Two front doors, one set of commands
You reach a Kunuleco node either through the Urchin graphical client or over plain SSH. The world commands (called verbs) are identical in both. The only difference: in the Urchin client's chat mode you prefix a command with / (e.g. /look); over SSH you type the verb directly (look). This manual writes verbs bare — add the / when you're in the client's chat mode.
What is Kunuleco
Kunuleco is a platform for creating private digital spaces you actually own. The name comes from Esperanto: kunuleco means "fellowship" — the experience of being together with people who matter to you. It isn't a social network; it's infrastructure for genuine connection — small groups, trusted circles, real conversations.
Your space doesn't live on someone else's server. It runs on your machine, as a node, under your control. Four ideas hold the whole system together:
- You own your space. Your identity is a cryptographic key on your own machine. No platform issued it; no platform can revoke it.
- Invite-only by design. There are no public directories and no discovery feeds. People reach you because you handed them an invite.
- Multiple paths to connect. Local network, Veilid, Tor, or IPFS — if one route is blocked, others remain.
- Capability-based security. Access comes from holding an unforgeable token, not from being on a list. Being present somewhere and being able to do things there are separate decisions.
Two ways to connect
| The Urchin client | SSH / terminal |
|---|---|
The graphical app. Guided onboarding, a network view, accessibility settings, media popups, and client commands prefixed with /. Connects over TLS (default port 8123). |
Any SSH client connects to a node (default port 8122, e.g. ssh alice@host -p 8122). You type verbs directly — no / prefix. Everything in the Command reference works here. |
Client-only commands (network view, updates, accessibility, wizards) are listed under Urchin client commands and exist only in the graphical app.
Command mode & chat mode
The Urchin client has two input modes:
- Command mode — everything you type is a verb (
look,say hello,create ~room garden). - Chat mode — bare text goes to the channel you're in; prefix a command with
/to run it (/look).
Switch with /cmd and /chat, and set your default with /defaultmode. Over SSH there are no modes — you're always typing commands directly.
Create your identity
Your identity is the first thing you make, and it belongs to you. It's a cryptographic keypair stored on your machine, protected by a password only you know.
There is no "forgot password"
A password reset would require someone else to have control over your identity — and no one does. Keep your password safe, and export an encrypted backup of your identity once it's created.
In the Urchin client
On the welcome screen, enter a username and choose Create Identity. You'll set a username, password, and theme. If the node already has members, you'll be sent to the Sponsor step instead (see below). When you're done you land on a success screen offering to create a room, join with an invite code, or go to your HOME.
Over SSH / first node
The very first account on a brand-new node is created freely. After that, account creation is sponsored. The raw protocol commands are:
USER <username> begin login
PASS <password> authenticate
ADDUSER <username> <password> create an account
Sponsorship — how new accounts join
Once a node has members, a new person can't just create an account: an existing user must authorize the registration. In the client this is the "Sponsor required" panel — the newcomer supplies their desired credentials plus a sponsor's username and password, and the sponsor's authorization creates the account. This keeps a node's membership intentional rather than open to the world.
The guided tour
The first time you log in through the Urchin client, the node introduces itself and walks you through the essentials. It opens in the node's own voice:
I've been here for 3 minutes.
Long enough to know what I am: a Kunuleco node.
You've arrived. This is yours now.
Let me show you around.
From there it has you run whoami (to meet your identity) and transport (to see how you're connected), shows your starting commands, explains how to make a room and invite someone, points out accessibility and input modes, and then closes:
That's enough to get started. Type help to see your commands. Type help all when you're ready for more. This node is yours.
The tour ends with a small ritual — you type /chat to step out of learning and into inhabiting the space. You can type skip at any point to jump to the closing. The tour runs once per identity.
Your first commands
These are the verbs the node teaches first — enough to look around, move, talk, and build.
| Command | What it does |
|---|---|
whoami | Show your identity, location, and inventory. |
look (or l) | Examine your surroundings; look <thing> inspects one thing. |
go <exit> | Move through an exit. Shortcuts: n s e w ne nw se sw up down. |
who | See who is here and who is online on this node. |
say <message> | Talk to everyone in the room. Shortcut: "<message>. |
create ~room <name> | Make a new room. |
invite <name> | Create an invite (you get a short code like tiger-castle-7). |
home | Return to your HOME. |
help · help all | Getting-started help, then the full verb listing. |
quit | Disconnect. |
Concept · Your identity
Your identity in Kunuleco is self-sovereign and built in three layers:
| Layer | Example | Purpose |
|---|---|---|
| Cryptographic root | k51qzi5uqu5dg… | Permanent, unforgeable anchor — an Ed25519 key. |
| Name#Discriminator | Mira#7291 | Human-friendly. The number is derived from your key, so no one can squat Mira#7291. |
| Short / intro code | tiger-castle-7 | A speakable code for first contact and invites. |
Under the hood your identity has three documents you'll occasionally see named:
- AIRO — your private credential blob, encrypted on disk (this is "your identity").
- PIRO — your public, shareable identity document: how peers learn to reach you across transports.
- NIRO — the node's own identity.
Across the social layer your canonical key is written as a DID (e.g. did:key:z6Mk…), and it is treated as the single source of truth about who someone is — names can change, the key cannot. Kunuleco uses KERI-style key rotation: each key event commits in advance to your next key and is recorded in an append-only chain, so a compromised key can be rotated out without losing your identity. See Back up your identity for the practical side.
Concept · Spaces & Halls
Kunuleco spaces nest from broad to specific:
- HOME — your personal root space, created at first login. You are always its Steward.
- Halls — community hubs you found for a group. Each Hall (and your HOME) is divided into three zones.
- Zones — access tiers within a hub: Public (open to visitors), Common (members), and Private (stewards). Crossing into a zone is gated by your Standing.
- Rooms — the actual places you gather and talk, living inside a zone. Connected by exits (one-way or two-way).
You move with go <exit>, look with look, and return HOME with home. Found a community space with found hall <name> — it builds the hub, its three zones, and starter rooms (welcome / general / governance), and makes you the Steward.
How a Hall decides who gets in
Each Hall has a threshold: open (anyone joins as a Newcomer), knock (the Steward approves each arrival — the default), invite_only (short-code holders), or members_only (existing members must vouch). Set it with set hall threshold <mode>.
Concept · Standing & trust
Standing is your trust level within a particular space. It rises from visitor to steward, and each tier unlocks deeper zones and more authority:
| Tier | Can… |
|---|---|
| Visitor | Read the Public zone. Implicit; not a member. |
| Newcomer | Read and write in the Public zone — the first member tier. |
| Familiar | Enter and participate in the Common zone. |
| Trusted | Moderate Common (remove content, remove people). |
| Steward | Enter the Private zone, govern the space, and grant Standing to others. |
Check yours with standing. A Steward grants a tier with standing <user> <tier>. Entry to a gated Hall flows through a knock queue: newcomers knock (handled automatically), the Steward reviews with knocks and uses accept / reject, and existing members can vouch for someone to speed them through.
Concept · Presence
Presence is being somewhere, with other people, right now. It has three properties: a location (which space you're in), visibility (others can see you're here), and it's ephemeral (it's gone when you disconnect).
Crucially, presence is not the same as capability. If someone can reach your node and join your room, they're present — but what they can actually do (open a capsule, post to a board) is a separate, capability-gated decision. You talk to a presence with say (the room), chat <channel> (a named presence), or tell <person> (privately — a 1-on-1 message saved to a persistent history).
Concept · Capsules & capabilities
A capsule is a capability-gated container. It holds objects and can expose services — methods other people can call. Capsules are the unit of sharing: you can give someone access to one capsule without exposing anything else.
Access works by capability, not by membership list. You grant an identity specific capabilities (read, write, …) on a capsule, and revoke them later. A capsule can also carry services built from templates (echo, ping, inventory) which remote peers invoke over the network. Capsules are exported as capsule:<name>:<service_type> when shared.
Concept · Friends & petnames new
The social layer remembers the people you meet, so your contacts survive restarts instead of vanishing each session.
- Peer registry — a private, persistent record of everyone you've encountered, keyed by their DID. Each contact starts as discovered and can become a contact or be blocked.
- Petnames — your own private aliases for people. A petname is bound to a specific identity (by DID), so an impostor reusing someone's display name can't inherit the alias. Set with
petname <identity> <name>. Once set,tellandchatrecognize it. - Friends — promote someone you've met to a contact with
friend. List them withcontacts, inspect one withfinger, and check who's reachable right now withfriends online. - Persistent chat & outbox —
tell <friend> <message>(also spelledwhisperor@chat) sends a one-to-one message and saves it to a history that survives restarts. With no message,tell <friend>shows your recent history together. If the friend is offline, the message waits in youroutboxand you canoutbox flushto retry once they're back.
You can only befriend someone you've met
Petnames and friends are anchored to a real identity you've actually seen on the network — by canonical name (alex#429754), an existing petname, or a live peer. This is what keeps the trust signal meaningful.
Concept · Connections & transports
Kunuleco speaks over several transports and tries them in order, so a blocked path doesn't cut you off. The messaging layer on top (called CapTP) is the same regardless of which transport carries it.
| Transport | Scope | When it's used |
|---|---|---|
| mDNS | Local network | Same Wi-Fi / LAN. Automatic discovery, no setup. |
| Tor | Internet | Privacy and reliable fallback via a persistent .onion address. |
| Veilid | Internet | Encrypted private routes that traverse NAT without port-forwarding. |
| IPFS | Internet | Content-addressed last resort via DHT routing. |
A short code (like tiger-castle-7) is a memorable lookup key — behind it sits your real connection info (identity plus mDNS / Veilid / Tor endpoints) and a one-time token. You hand someone a code; they join it. See how you're connected with transport and which daemons are running with @node_processes.
How do I… make a room and invite someone?
1Create the room.
create ~room garden --desc A quiet place to talk
2Share it so others can reach it (this also opens a presence/chat channel):
share room garden
3Create an invite. You'll get a short code to pass along:
invite garden -short
→ tiger-castle-7
4Your guest joins with the code (or your canonical name):
join tiger-castle-7
To wire rooms together, use exits <room> add <name> <target> (add --oneway for a one-way passage).
How do I… found a Hall and manage entry?
found hall riverside
In the Urchin client, /found-wiz runs this as a guided ritual (name → description → atmosphere → threshold → optional first room). Either way, it creates the Hall hub, its Public/Common/Private zones, and welcome / general / governance rooms. You're the Steward. Then shape it:
describe hall What brings us together is shared music.
set hall atmosphere Playful
set hall threshold knock
With knock, arrivals queue for your approval:
| Command | What it does |
|---|---|
knocks | List people waiting to join, with any vouches. |
accept <user> | Admit them (grants Newcomer standing). |
reject <user> | Decline the request. |
vouch <user> | Vouch for a pending knocker (Familiar+); auto-admits at the threshold. |
standing <user> familiar | Promote a member to a higher tier (Steward only). |
How do I… add friends and keep a chat history? new
Once you've met someone (you've seen them connect or discovered them), add them and give them a petname in one step:
@friend add alex#429754 my-bandmate
That befriends alex#429754 and sets the petname my-bandmate. From then on:
contacts list your friends
friends online see who's reachable right now
finger my-bandmate full detail on one contact
tell my-bandmate Hey, you around? one-to-one, saved to history
tell my-bandmate show recent history with them
(tell, whisper, and @chat are the same command — use whichever you prefer.)
If they were offline when you sent, the message waits in your outbox:
outbox see what's queued
outbox flush retry delivery now
Manage aliases directly with petname <identity> <name>, list them with petnames, and remove one with petname <name> --clear. To stop following someone, unfriend <identity>; to cut them off entirely, block <identity>.
How do I… share a capsule or board?
Capsule. Create one, then share it and grant capabilities:
create ~capsule notes
share capsule notes
grant notes alex#429754 read,write
Revoke with revoke notes alex#429754. See who has what with list grants notes.
Board. Bulletin boards are threaded and persistent:
@board_create music Music Chat
post Practice moved to Friday --board music
posts --board music
reply 3 Works for me
share board music --post share read+post (omit --post for read-only)
How do I… share media?
media upload ~/pictures/poster.png --caption Friday's show
media list
media share <id> lobby
Uploads (PNG / JPEG / GIF / WebP) go to IPFS and are shared into a presence as a clickable tag; in the Urchin client they open in a media popup. Remove your own with media delete <id>.
How do I… back up or move my identity?
Because there's no password reset, an encrypted export is your safety net and the way to move to a new machine.
export-identity ~/kunuleco-backup.id <base64_passphrase>
import-identity ~/kunuleco-backup.id <base64_passphrase> --overwrite
The passphrase is base64
The export passphrase must be base64-encoded — the client wraps this for you. Don't type a raw secret on the command line, where it could land in your shell history or logs. Store the backup file somewhere safe; anyone with the file and the passphrase holds your identity.
How do I… check my connection & troubleshoot?
| Command | Use it to… |
|---|---|
transport | See which transports are active (mDNS / Tor / Veilid / IPFS). |
@node_processes | Check which daemons are running. |
ping <user> | Confirm a peer is reachable and over which protocols. |
@peers · @discover | List connected peers / everyone discovered. |
@netcheck | Run a P2P compatibility check. |
@version | Show the server build and commit. |
In the Urchin client, /network shows a live network view and /check-updates / /update handle upgrades. Updates are cryptographically verified: the app checks each release against a signed manifest before it applies anything, and a fresh install works even offline because the app carries that signed manifest with it. The app you downloaded is the trust anchor, and nothing installs or updates without a valid signature.
Command reference
Case-insensitive. help <verb> prints detailed help for any command. Verbs beginning with @ are lower-level or diagnostic; their plain-word equivalents (above them here) are the everyday way in.
Account & session
| Command | Description |
|---|---|
USER <username> pre-login | Begin login; follow with PASS. |
PASS <password> pre-login | Authenticate. Repeated failures are rate-limited. |
ADDUSER <username> <password> | Create an account. Free for the first account on a node; afterward requires a sponsor. |
passwd <old> <new> | Change your password. (Client: /passwd.) |
whoami | Your name, location, and inventory. |
who | Who is present here, and who is logged in on this node. |
quit · LOGOUT | Disconnect. |
Navigation & looking
| Command | Description |
|---|---|
look [target] · l | Examine surroundings, or a specific object / capsule. |
go <exit> | Move. Shortcuts: n s e w ne nw se sw up down. |
home | Return to your HOME. |
exits <room> add <name> <target> [--oneway]exits <room> remove <name> | Add or remove exits between rooms. |
inspect <object> · peer <object> | Examine something in close detail (state, capabilities, metadata). |
manifest realm <peer>#<disc> | Open a portal to a peer's realm, loading their published Halls as exits. |
Talking
| Command | Description |
|---|---|
say <message> · "<message> | Talk to everyone in the current room. |
chat <channel> <message> | Message a named presence / channel. |
tell <person> [message] · whisper · @chat new | One-to-one direct message, saved to a persistent history that survives restarts. Resolves petnames. No message = show recent history. If the person is offline the message queues in your outbox. |
outbox [status] · outbox flush new | Messages queued for offline friends; flush retries delivery. |
Friends & petnames new
| Command | Description |
|---|---|
friend <identity> | Add a peer you've met to your contacts. |
unfriend <identity> | Remove from contacts (keeps the discovered record). |
block <identity> · unblock <identity> | Block a peer (and drop any open session) / lift the block. |
contacts | List your friends. |
finger <identity> | Detailed info: registry, petname, directory, and live status. |
petname <identity> <name>petname <name> --clear | Set / clear a private alias bound to a specific identity. |
petnames | List your petnames. |
@friend add <id> [petname]@friend remove|rename|list … | One-step convenience: befriend and name in one go; remove, rename, or list. |
friends [online] | Friends roster; online actively polls who's reachable now. |
Building · rooms, Halls, objects
| Command | Description |
|---|---|
create ~room <name> [--desc …] | Create a room. Other prototypes: ~capsule, ~board, ~object, ~presence, ~place. |
describe room <name> <text> | Set a room's description. |
found hall <name> | Found a Hall (hub + Public/Common/Private zones + starter rooms). You become Steward. |
set hall atmosphere|threshold|verb … | Configure a Hall you steward. |
describe hall <text> | Set the Hall's intention. |
halls · zones | List Halls you have standing in / zones in the current place. |
standing [<user> <tier>] | View your Standing; a Steward grants newcomer|familiar|trusted|steward. |
knocks · accept <u> · reject <u> · vouch <u> | Review and resolve requests to enter a gated Hall. |
get <obj> · drop <obj> · put <item> in <container> | Handle objects. (take = get.) |
inventory · i | Show what you're carrying. |
destroy <name> | Permanently remove an object (or destroy room|capsule <name>). |
Capsules, capabilities & services
| Command | Description |
|---|---|
create ~capsule <name> | Create a capability-gated container. |
share capsule <name> [--no-presence] [revoke] | Share a capsule (auto-opens a presence unless --no-presence). |
list capsules · list grants <capsule> | List your capsules / who holds capabilities on one. |
grant <capsule> <identity> <caps> [--service <type>] | Grant capabilities (e.g. read,write), optionally on a specific service. |
revoke <capsule> <identity> [caps] [--service <type>] | Revoke capabilities; no caps = revoke all. |
service list|add|remove <capsule> [echo|ping|inventory] | Manage services mounted on a capsule. |
service invoke <peer> <method> <capsule> | Call a method on a remote capsule's service. |
Boards
| Command | Description |
|---|---|
post <message> [--board <name>] | Post to a board (default general). |
posts [--board <name>] [--thread <id>] · read | Read board posts. |
reply <post_id> <message> | Threaded reply. |
@board_create <id> <name…> · @board_list | Create / list boards. |
share board <id> [--post] | Share read-only, or read+post with --post. |
@board_delete_post <id> owner | Delete a post (author or board owner). |
Media
| Command | Description |
|---|---|
media upload <filepath> [--caption "…"] | Upload an image (PNG/JPEG/GIF/WebP) to IPFS. |
media list · media info <id> | List your media / details for one item. |
media share <id> [presence] | Share into a presence as a clickable tag (default lobby). |
media delete <id> | Delete your own media. |
Identity
| Command | Description |
|---|---|
@whoami | Your peer-to-peer identity: DID, peer ID, routes. |
export-identity <path> <base64_passphrase> | Export your identity to an encrypted file. |
import-identity <path> <base64_passphrase> [--overwrite] | Import an identity; won't overwrite without --overwrite. |
Invites & joining
| Command | Description |
|---|---|
invite [presence] [-short|-noshort] | Create an invite to a space (defaults to the current presence / lobby). |
meet new | Show your peer seed (a kunul1… code) and a QR so someone with you in person can connect to your node directly over the LAN — no internet, no directory. They run join <seed>. |
meet guest new | Show this node's address and a QR so a phone running the Urchin app can join it as a thin client. |
join <identity|shortcode|name|seed> [presence] | Join remotely by code or canonical name, or in person by a kunul1… peer seed (from someone's meet — the connection is verified against the key in the seed). --local joins a presence on this node; --here materializes a remote room as a walkable place. |
ping <username> | Check whether a peer is connected, and over which protocols. |
@whoknows [identity] | Show the cached public-identity directory. |
Advanced & diagnostics advanced
Shown by help debug. Not needed for everyday use — handy when verifying connectivity or reporting a bug.
| Command | Description |
|---|---|
transport <status|enable|disable|force> <t> | Control which transports are active (mdns/ipfs/veilid/tor). |
@discover · @peers · @netcheck | Discovered peers / connected peers / compatibility check. |
@presences · @pstats · @pwhere | Active presences / presence stats / where you are now. |
@piroshow · @pconnect <identity> | Your public identity document / connect via automatic transport racing. |
@ipfsid · @ipfspeers · @ipfscleanup | IPFS peer ID, swarm peers, stream cleanup. |
@p2pstatus · @p2pconnect <id> · @p2pdisconnect <id> | IPFS peer-to-peer bridge. |
@veilidstatus · @veilidroute · @veilidconnect · @veilidsend · @vpeers · @vcaptp | Veilid status, your route blob, connect / test send, peers, session state. |
@torstatus · @toraddress · @torconnect <peer> <onion> | Tor status, your .onion address, connect to a peer. |
@version · @node_processes · @captp_debug | Build version, running daemons, CapTP session state. |
debug <topic> | Internal state: location, places, capsules, registry, actor, capabilities, all. |
Urchin client commands client only
These exist only in the graphical client (prefix with / in chat mode). Over SSH they don't apply.
| Command | Description |
|---|---|
/chat · /cmd · /defaultmode | Switch to chat / command mode; set your default mode at login. |
/network · /netdetail · /refresh | Show the P2P network view; toggle IPFS peers; poll now. |
/services | Show the node services view. |
/a11y | Accessibility settings (scanlines, glow, motion). Font size: Ctrl + / Ctrl -. |
/check-updates · /update [name] · /reinstall | Check for and install updates (all, client, server); full reinstall. |
/restart · /reconnect | Restart Urchin (after a client update) / reconnect without restarting. |
/found-wiz · /join-wiz | Guided Hall-creation ritual / guided join with an invite code. |
/bug | File a bug report from inside the session, right when something looks wrong. |
/passwd · /clear · /logdebug on|off | Change password / clear the terminal / toggle debug logging. |
/quit · /exit · /help | Disconnect / close Urchin / open help. |
Glossary
| Term | Meaning |
|---|---|
| AIRO | Your private, encrypted identity credential on disk — "your identity." |
| PIRO | Your public, shareable identity document: how peers reach you across transports. |
| NIRO | The node's own identity. |
| DID | Your canonical key as a decentralized identifier (did:key:z6Mk…) — the truth about who you are. |
| KERI | The pre-committed, hash-chained key-rotation scheme that lets you rotate a key without losing your identity. |
| CapTP | The capability messaging protocol that rides on top of any transport. |
| Capsule | A capability-gated container for objects and services; the unit of sharing. |
| HOME | Your personal root space, created at first login. You always steward it. |
| Hall | A community hub you found, divided into Public / Common / Private zones. |
| Zone | An access tier within a hub, gated by Standing. |
| Standing | Your trust level within a space: Visitor → Newcomer → Familiar → Trusted → Steward. |
| Steward | The governing role of a space — grants Standing and manages entry. |
| Presence | Being somewhere with others, right now. Separate from capability. |
| Petname | Your private alias for a peer, bound to their identity so it can't be hijacked. |
| Short code | A speakable lookup key (e.g. tiger-castle-7) standing in for your connection info. |