What are Urbit IDs and how do they work?

Prerequisites: For a better understanding of this article, we recommend that you have read the contents on what is Urbit and what are stars.

An Urbit ID is like an account on the Urbit network. Planets, stars, comets, and any other entity in Urbit have an ID. You can’t use Urbit without an Urbit ID.

A very common way to identify an Urbit ID is with the @p.

What is an @p in Urbit?

@p (pronounced pat-pee) is a permanent identifier, for example: ~zod, or ~datsyr-radser. Your @p is your name on Urbit, and it’s designed to be pronounceable. This often functions like a username or email address.

A @p is the unique identifier for a ship, and it’s used all throughout Urbit, in the code and in user-facing apps. A @p can’t be changed. It will always refer to the same Urbit ID, and that Urbit ID will always have the same @p. A given ID may change owners, however, and you can always buy a new ID with a new @p.

Also, each ID has a unique avatar.

Every @p is equivalent to a number ≥ 0 and > 256¹⁶, with longer @ps giving larger numbers. The length of a @p indicates what class of ID it is.

Galaxies, being larger entities, have short @p (for example: ~zod and ~bus), while comets, which are smaller entities, have long @p (for example: ~racmus-mollen-fallyt-linpex–watres- sibbur-modlux-rinmex).

How to tell a ship’s class

It’s easy to tell the class of a ship by looking at its @p.

  • If it’s just 1 phoneme, a suffix, like ~zod or ~bus, it’s a galaxy.
  • If it has 2 phonemes, a prefix and a suffix, like ~marzod or ~batbus, it’s a star.
  • If it has 4 phonemes separated by a hyphen, like ~datsyr-radser, it’s a planet.
  • If it has 8 phonemes, like ~poster-hoster-midlev-mindyr, it’s a moon.
  • If it has 4 phonemes separated by a caret, like ~midlev^mindyr, that’s an abbreviated moon @p. The last 4 phonemes of a moon @p give its parent, and are used in the abbreviation.
  • If it has 16 phonemes, like ~dirbec-morfeb-ritlys-timsef–padnum-mapnep-nolfel-binzod, or more likely 4 phonemes separated by an underscore, like ~dirbec_binzod, it’s a comet.

The suffix of a star @p is its parent galaxy, so the parent of ~marzod is ~zod, and the parent of ~batbus is ~bus.

Unlike stars, planet @ps don’t contain the @p of their parent—the names are scrambled to give each star a good variety of planet @ps to spawn.

You may notice a double hyphen in the center of the full comet @p. This is part of the required syntax of a @p, and makes it easier to read. The abbreviation combines the first and last “words” of the @p with an underscore.

How do prefixes and suffix combinations work?

A @p starts with a tilde (~), and is made up of 3-letter phonemes/syllables, a combination of prefixes and suffixes. There are 256 prefixes, and 256 suffixes.

~zod and ~bus are galaxies, so their whole @ps are just one suffix.

Most @ps are made up of 6-letter “words” (a prefix + a suffix), joined by hyphens. E.g. ~midlev-mindyr has the prefixes mid and min and the suffixes lev and dyr. You can see a list of prefixes and suffixes here.

Remember that a @p is actually just a way of writing a number. Technically, a @p is a base-256 number, as it’s composed of prefixes and suffixes, and there are 256 of each. Sure, you could write a number with just prefixes, or just suffixes, but it wouldn’t be as interesting to read, and it wouldn’t be a valid @p.

So each phoneme is equivalent to a number, 0-255. “doz” is the prefix version of 0, and “zod” is the suffix version of 0. Just as we usually don’t write leading zeroes in our numbers, we omit the equivalent of leading zeroes in @p notation. This is why you will never see ~dozler, or ~dozzod-palnet. It would be sort of like writing 000218 or 0000032591 (it’s just ~ler and ~palnet, respectively). You might, however, run into ~dozler-palnet, as planet @ps are never shortened to 3 phonemes.

One place you’re likely to see these show up is in moon @ps. A moon @p is one or two “words” of the parent’s choosing, plus the parent’s @p. E.g. ~sampel-palnet could create ~dister-sampel-palnet or ~mister-master-sampel-palnet, among others.

If a galaxy or a star creates a moon, its @p must be “padded out” to make up the last 4 phonemes of the moon @p. ~ler could thus create ~faster-dozzod-dozler or ~poster-hoster-dozzod-dozler. See how doz and zod were used to pad out ler to 4 phonemes? Similarly, ~palnet could create ~walrus-dozzod-palnet or ~doznec-tortul-dozzod-palnet.

Properties of an Urbit ID

Besides the @p we have already commented on, an urbit ID is also directly associated with:

Public and Private Keys: These allow you to cryptographically prove your ownership of an ID. This is a bit like having a password for an account, or signing a document. All messages on Urbit are automatically signed and verified, so you know they’re authentic.

Ship: A ship is an Urbit computer, which is always tied to the Urbit ID it was booted with. When you boot Urbit for the first time, you provide your keys and we call this booting a “ship”. When you use this computer on the network, you are “piloting” your “ship”. Your ship stores all your data and apps.

Azimuth Points

An Azimuth point is an Urbit ID which is secured on the Ethereum blockchain. Azimuth points are NFTs, governed by the Azimuth smart contracts. Owning an Azimuth point lets you reset your keys, spawn new IDs, and transfer ownership to someone else, among other things.

When Ethereum got popular and transactions became very expensive a Layer 2 solution was developed (commonly called “L2”), which allows Azimuth points to be spawned, transferred, etc. basically for free.

Read this article to better understand this concept: Urbit Azimuth.

Spawning and Sponsoring

By thinking about possible combinations of syllables, we can predict every Urbit ID that might exist. But galaxies, stars, and planets, being Azimuth points, don’t come into existence until a transaction is posted to Azimuth which explicitly “spawns” that point.

All 256 galaxies have already been spawned. Those galaxies can spawn stars. Those stars can spawn planets. Planets can’t spawn anything, but all Azimuth points can create moons, which is sometimes called “spawning” even though it’s not done through Azimuth.

By default, a galaxy will sponsor any stars it spawns, and a star will sponsor any planets it spawns. This means helping route network traffic between the sponsee and other ships, providing OTA (over the air) software updates, and potentially providing other services.

A sponsee (star or planet) may choose to leave their sponsor and find another one. Conversely, a sponsor (galaxy or star) may choose to de-sponsor their sponsee or sponsor additional points which they didn’t spawn. This lets the network hierarchy adjust itself in case someone misbehaves.

Tip: To get an overview of which stars and planets have already been spawned, you can install the Astrolabe app.

Why is @p called a “patpee”?

In Hoon, Urbit’s typed programming language, numbers can have different “auras”, depending on what they represent. Some auras include @u for an unsigned integer, @t for arbitrary text stored as a number, @if for an IPv4 address, and of course @p for writing a number in phonemes.

So why the “pat”? Hoon involves a lot more symbols than most programming languages (e.g. .!=?|+:%^$;~- and so on). To help programmers talk out loud about Hoon, each symbol is associated with a 3-letter phoneme. In this system, =/ is pronounced “tisfas”, %- is “cenhep”, and, you guessed it, @ is “pat”.

In short, @p is originally a programming term, the programmers pronounce it “pat-pee”, so that’s how it’s pronounced.


Special thanks to developer ~midlev-mindyr (Astrolabe) for providing content and reviewing this material.

Next steps

To continue learning about Urbit, we recommend that you check the organization of this free course and follow the proposed order.

You might also be interested in: