How do you embed a general-purpose computer into a function? You load programs and data into the state, which the transition function can update on each event.
To boot a new ship, the first several events are run by the VM (named Vere, written in C) before your ship enters the network. These initial events load in a Hoon compiler, compile and install the Arvo kernel, initialize userland apps and files, and assign your Azimuth point and private keys as your ship's identity. Now your ship is ready to talk to the the world.
The Arvo stack can push any update to any part of itself, except Nock and Vere.
Let's walk through some of the components of the Arvo kernel. This is where it gets interesting.
Ames, our network protocol is overlayed over UDP. Every message between ships is signed and end-to-end encrypted. Ames is message-oriented, CQRS, connectionless, data-centric, and transactional.
Clay, our filesystem, is a reactive, typed, distributed revision-control store that defines an authenticated global immutable namespace.
Ford, our functional build system, can auto-update a page in your browser when someone checks in a change to a math function in a back-end rendering library.
With compiler, libraries, Arvo and modules, the whole OS is ~30,000 lines of code.
Urbit is also a nontrivial list of other features and components. You can read more in our long, peculiar, mildly outdated whitepaper. Caveat lector, it's a tad academic.
Today, Urbit is a stable testnet. Urbit hosts its own site, forum, and federated chat. Its last unplanned breach (global hard fork) was in 2016.
Urbit now has a practical clean-room Vere alternative, Jaque, built on Graal/Truffle. Jaque can boot a ship and join the network. It still has some stack issues.
Urbit is not done. It needs optimization, documentation, a lot of polish and even a bit of architecture. But it certainly does work!