on master help sign in
Merge branch 'master' of https://github.com/urbit/urbit.org into reverse-proxy-settings
commit8efed37593baa8dc7e61a1ba1b5a199b64815c48 authorJackson Egan <jackson@sneagan.com> dateSun 16 May 2021, 09:07 (5 years ago) parentb2f0c74b6ba6c0
155 files changed+7197−2535
README.md+1−1 bin/build+1 bin/start+1 config.toml+13−24 content/blog/2020-to-2021.md+49 content/blog/20201119-models-of-society.md+77 content/blog/a-founders-farewell.md+2−2 content/blog/aesthetic-culture-1.md+106 content/blog/after-machine-war.md+46 content/blog/an-email.md+88 content/blog/an-urbit-overview.md+2−2 content/blog/beliefs-and-principles.md+2−2 content/blog/bootstrapping-urbit-from-ethereum.md+4−5 content/blog/common-objections-to-urbit.md+4−4 content/blog/community-spotlight-the-portico.md+137 content/blog/creating-sigils.md+1−1 content/blog/eliza.md+49 content/blog/events-series.md+56 content/blog/interim-constitution.md+3−3 content/blog/interplanetary_commerce.md+39 content/blog/io-in-hoon.md+322 content/blog/iot.md+448 content/blog/magic.md+3−2 content/blog/metaphase.md+74 content/blog/providers.md+6−6 content/blog/rollups.md+220 content/blog/security-and-continuity.md+62 content/blog/security-audit.md+157 content/blog/the-urbit-address-space.md+2−2 content/blog/toward-a-new-clay.md+1−1 content/blog/urbit-and-the-blockchain.md+6−5 content/blog/urbit-for-normies.md+1−1 content/blog/value-of-address-space-pt1.md+8−6 content/blog/value-of-address-space-pt2.md+16−12 content/blog/value-of-address-space-pt3.md+13−13 content/blog/what-is-urbit-for.md+2−2 content/blog/why-urbit-probably-does-not-need-a-blockchain.md+2−2 content/community/community-grants.md+1−1 content/community/governance.md+1−1 content/community/hoonschool.md+2−10 content/community/meetups.md+2−2 content/docs+1−1 content/events/2017-08-11-after-hours-bootstrapping-urbit-from-the-ethereum-blockchain.md+20 content/events/2017-09-22-after-hours-fun-with-arvo-the-urbit-os.md+20 content/events/2017-10-26-after-hours-designing-robust-human-systems.md+20 content/events/2017-11-16-after-hours-visiting-contributors.md+18 content/events/2018-01-26-urbit-irl-20181.md+18 content/events/2018-02-23-urbit-irl-20182.md+18 content/events/2018-03-11-20183-hoon-school.md+16 content/events/2018-03-23-urbit-irl-20183.md+18 content/events/2018-04-08-20184-hoon-school.md+16 content/events/2018-05-25-urbit-irl-20185.md+18 content/events/2018-08-03-after-hours-decentralized-web-summit.md+14 content/events/2018-08-17-urbit-irl-20188.md+20 content/events/2018-09-21-urbit-irl-20189.md+18 content/events/2018-10-10-urbit-zcash-blockchain-week.md+24 content/events/2018-12-20-after-hours-its-just-a-party-man.md+18 content/events/2019-03-01-after-hours-ask-galen-anything.md+20 content/events/2019-03-08-urbit-irl-austin-tx.md+16 content/events/2019-04-19-urbit-irl-20194.md+20 content/events/2019-05-17-urbit-irl-20195.md+18 content/events/2019-06-21-urbit-irl-20196.md+18 content/events/2019-07-19-urbit-irl-20197.md+18 content/events/2019-08-29-urbit-austin-20198.md+16 content/events/2019-10-04-urbit-irl-201910.md+18 content/events/2019-11-15-urbit-irl-201911.md+18 content/events/2019-12-13-urbit-irl-201912.md+26 content/events/2020-01-24-urbit-irl-20201.md+20 content/events/2020-02-28-urbit-irl-20202.md+20 content/events/2020-04-03-urbit-os1-launch-party.md+47 content/events/2020-10-09-urbit-hosting-launch-event.md+33 content/events/2020-11-05-developer-call-graph-store.md+19 content/events/2020-11-19-developer-call-bittorrent-tracking-on-urbit.md+19 content/events/2020-12-10-developer-call-injecting-external-services-into-urbit.md+19 content/events/2021-02-04-developer-call-architectural-idea-maze.md+18 content/events/2021-03-04-developer-call-scaling-azimuth.md+23 content/events/2021-03-18-developer-call-pressure-and-protolith.md+20 content/events/2021-04-01-developer-call-javascript-apps-on-urbit.md+20 content/events/2021-04-15-developer-call-software-distribution.md+25 content/events/2021-04-27-bitcoin-launch.md+22 content/events/2021-04-29-developer-call-real-time-communications-on-urbit.md+27 content/events/2021-05-13-developer-call-versioned-networking.md+21 content/events/2021-05-27-town-hall.md+40 content/events/_index.md+6 content/faq.md+112−93 content/getting-started/_index.md+214 content/getting-started/planet.md+132 content/media.md−4 content/media/_index.md+3−1 content/reset.md+109 content/understanding-urbit/interface.md+1−1 content/understanding-urbit/people-history.md+2−2 content/understanding-urbit/roadmap.md+2−2 content/updates/2016-5-16-roadmap.md+2−2 content/updates/2017-10-7-update.md+1−1 content/updates/2018-4-14-update.md+1−1 content/updates/2018-4-7-update.md+1−1 content/updates/2018-5-16-update.md+1−1 content/updates/2018-5-23-update.md+1−1 content/updates/2018-5-30-update.md+1−1 content/updates/2019-3-4-update.md+1−1 content/updates/2019-4-11-update.md+1−1 content/updates/2020-04-04-update.md+1−1 content/updates/2020-06-15-update.md+1−1 content/using/_index.md+31−3 content/using/develop.md−96 content/using/id/_index.md+33 content/using/operations/bridge-troubleshooting.md → content/using/id/bridge-troubleshooting.md+4−2 content/using/id/creating-an-invite-pool.md+106 content/using/id/guide-to-breaches.md+90 content/using/id/overview.md+71 content/using/operations/using-bridge.md → content/using/id/using-bridge.md+50−5 content/using/install.md−361 content/using/operations/_index.md−7 content/using/operations/using-your-ship.md−1413 content/using/os/_index.md+36 content/using/os/filesystem.md+397 content/using/os/getting-started.md+337 content/using/os/messaging.md+254 content/using/os/s3.md+34 content/using/os/shell.md+413 content/using/os/ship-troubleshooting.md+213 content/using/operations/stars-and-galaxies.md → content/using/os/stars-and-galaxies.md+14−11 content/using/running/_index.md+16 content/using/operations/hosting.md → content/using/running/hosting.md+26−19 content/voting-instructions.md+8−8 netlify.toml+3−3 sass/_events.scss+82 sass/_main.scss+34−14 sass/styles.scss+1 static/_redirects+163−10 static/glossary.js+22−99 static/scripts.js+53−12 syntaxes/scheme.sublime-syntax+566 templates/anchor-link.html+2 templates/base.html+1−1 templates/essays/post.html+5−35 templates/events/event-landing.html+26 templates/events/event.html+94 templates/events/list.html+157 templates/getting-started/index.html+41 templates/index.html+73−56 templates/list.html+1 templates/macros/macros.html+11 templates/media/post.html+68 templates/page.html+2−1 templates/page_indiced.html+5−3 templates/partials/footer.html+6−5 templates/partials/navigation-docs.html+58−10 templates/partials/pagination.html+64−62 templates/partials/subscribe-form.html+34 templates/rss.xml+1−1 templates/sections/docs/hoon.html+1−1 templates/understanding-urbit/list.html+4−36 templates/understanding-urbit/post.html+5−35
README.md+1−1
@@ -7,7 +7,7 @@ The website for the Urbit project.
77## Build
88
991. git clone this repository
10−2. Install [zola@0.8.0](https://github.com/getzola/zola/releases/tag/v0.8.0) (see [Installation](https://www.getzola.org/documentation/getting-started/installation/))
10+2. Install [zola@0.13.0](https://github.com/getzola/zola/releases/tag/v0.13.0) (see [Installation](https://www.getzola.org/documentation/getting-started/installation/))
11113. `git submodule init`
12124. `git submodule update`
13135. In the root directory of `urbit.org`, run `zola serve`
bin/buildnew file+1
@@ -0,0 +1 @@
1+zola build
bin/startnew file+1
@@ -0,0 +1 @@
1+zola serve
config.toml+13−24
@@ -1,41 +1,30 @@
1+# See: https://www.getzola.org/documentation/getting-started/configuration/
12# Used in RSS by default
23title = "Urbit"
34description = "Urbit is a personal server built from scratch."
4−
55# The default language, used in RSS
66default_language = "en"
7−
87# The URL the site will be built for
98base_url = "https://urbit.org"
10−
119# Whether to automatically compile all Sass files in the sass directory
1210compile_sass = true
13−
1411# Whether to generate a RSS feed automatically
15−generate_rss = true
12+generate_feed = true
13+build_search_index = true
14+feed_filename = "rss.xml"
1615
16+[markdown]
17+# A list of directories used to search for additional `.sublime-syntax` files.
18+# TODO: syntax highlighting is currently broken on 0.13.0, but works on zola@next
19+# see: https://github.com/getzola/zola/issues/1309
20+extra_syntaxes = ["syntaxes"]
1721# Whether to do syntax highlighting
18−# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola
1922highlight_code = true
20−extra_syntaxes = ["syntaxes"]
23+# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola
2124highlight_theme = "demain"
2225
23−# Whether to build a search index to be used later on by a JavaScript library
24−build_search_index = true
25−
26−# The taxonomies to be rendered for that site and their configuration
27−# Example:
28−# taxonomies = [
29−# {name = "tags", rss = true}, # each tag will have its own RSS feed
30−# {name = "categories", paginate_by = 5}, # 5 items per page for a term
31−# {name = "authors"}, # Basic definition: no RSS or pagination
32−# ]
33−#
34−
35−
26+# You can put any kind of data here. The data
27+# will be accessible in all templates
3628[extra]
37−
29+author = "urbit.org"
3830docs_number_chapters = true
39−
40−[extra.author]
41−name = "urbit.org"
content/blog/2020-to-2021.mdnew file+49
@@ -0,0 +1,49 @@
1++++
2+title = "2020 -> 2021"
3+description = "Reflecting and looking forward."
4+date = 2021-01-21
5+[extra]
6+author = "Josh Lehman"
7+ship = "~wolref-podlex"
8+image = "https://media.urbit.org/site/posts/essays/arch-sunrise-2.jpeg"
9++++
10+
11+<br>
12+
13+![arch](https://media.urbit.org/site/posts/essays/arch-sunrise-2.jpeg)
14+
15+<br>
16+
17+In this post, which has been adapted from our most recent [newsletter](https://urbit.us11.list-manage.com/subscribe/post?u=972a03db9e0c6c25bb58de8c8&id=be143888d2), we'll take a moment to reflect on the events of the last year, and then turn our attention to the next one.
18+
19+## 2020
20+
21+In spite of the many challenges presented over the last year, it was a resoundingly good one for Urbit.
22+
23+It seems like a long time ago now that the folks at Tlon rolled out OS1 (now called Landscape), just as the pandemic forced everyone into their homes throughout the world. At the time, [Urbit is for Communities"](https://urbit.org/blog/urbit-is-for-communities/) was just a vision, but now it’s been transformed into reality—there are more thriving communities in Landscape than any of us can keep track of, with new faces popping onto the network on a daily basis.
24+
25+Landscape brought many new ships onto the network which helped identify those areas in which Urbit’s infrastructure could be most improved. [Ford Fusion](https://urbit.org/blog/ford-fusion/) eliminated the possibility of a partially-applied over-the-air (OTA) update through a drastic reduction in the size and complexity of the codebase. The efficiency of the OTA process was improved by several orders of magnitude, and many long-standing memory issues were resolved. Now we deploy code on our infrastructure nodes and see users receive an update, over a decentralized network, often in less than a minute.
26+
27+After improving the stability of the system Tlon turned its attention to bringing more ships onto the network. A long-standing barrier to Urbit’s adoption has been the technical knowledge required to host one’s own ship—this prompted Tlon to build and launch an Urbit [hosting service](https://tlon.io), the waitlist for which is now thousands deep.
28+
29+With Tlon becoming more singularly focused on building products on Urbit, concrete steps have been taken towards making urbit.org a separate organization that’s focused on long-term development of Urbit’s platform. I joined to [lead that effort](https://urbit.org/blog/first-steps-towards-urbit-org/) back in August and have since spent the majority of my time working with dozens of contributors on projects spanning documentation, education, external integrations, and much more.
30+
31+We rounded out the year with a full network reset (called a “continuity breach”), which has in the past has been synonymous with loss of all data on the network. This time things went differently: tooling was made available to the community that allowed ships to preserve their data, which enabled most to seamlessly rejoin post-reset. This is a significant milestone for the project as it signifies not only a commitment to technical excellence, but to supporting our budding community.
32+
33+## 2021
34+
35+In the last three weeks we’ve seen a huge amount of inbound interest as people are waking up to the inherent problems with using centralized services run by MEGACORPs—we’re just happy we started working on Urbit all those years ago. While we tend to not plan more than about six months in advance, I can still talk at a high level about what urbit.org will be focusing on in the immediate future.
36+
37+Growth in Urbit’s developer community has been growing organically in lockstep with the overall network growth. This means, happily, that there’s a pretty large pool of people eager to contribute to Urbit. The priority for urbit.org, therefore, is to improve its capacity to effectively assist contributors. In broad strokes, this means:
38+
39+- Rework urbit.org to better help developers learn how to contribute to Urbit
40+- Since Urbit is ready to build on top of, provide practical guides that demonstrate how to do so
41+- Guide developers to make high-value contributions to Urbit and its ecosystem
42+- Build community amongst contributors
43+
44+My strategy to date has been heavily focused on working directly with contributors to provide technical guidance and direction, and it’s been working really well. To that end I’ll also be scaling our ability to provide such support by bringing more individuals into urbit.org that can mentor, review work, and provide guidance on where to best direct contributors' energy.
45+
46+
47+2021 is shaping up to be a big year for Urbit, and we'd [love your help](https://grants.urbit.org) in building it. If you want to see what we're working on in real time, join us in Landscape at ~wolref-podlex/foundation.
48+
49+See you on the network!
content/blog/20201119-models-of-society.mdnew file+77
@@ -0,0 +1,77 @@
1++++
2+title = "Models of Society"
3+description = "Conversations compose society. What composes conversation — how do we digitize it in a way that enhances society without imposing upon it? How do we form this new medium, both to facilitate natural human behavior and to inspire the best of it?"
4+date = 2020-11-19
5+[extra]
6+author = "Tyler Shuster"
7+ship = "~radbur-sivmus"
8+image = "https://media.urbit.org/site/posts/essays/cochno-stone.png"
9++++
10+
11+*I had used Facebook and Google for my entire adult life. I knew they were toxic but I didn't know why. For a few weeks I tried to create a website that would scrape data from Facebook’s API and push data back, puppetting it from my own server. But as I stared headlong into the ever-shifting darkness of the modern web, I despaired and abandoned my attempt. Less than a year later I heard about Urbit. Technically, it went way over my head&mdash;but socially I knew exactly what it was, what it always had to be, why it was a discovery and not an invention, a place and not a product. I've watched the settlers there for four years, only just now using the opportunity of the pandemic to swim to this new landscape and gaze upon this young nation, this digital city, this urbis ec bit. I do not work for Tlon. I just live here.*
12+
13+<hr>
14+
15+All people like to talk. Society is built by talking. In this&mdash;the year of our Lord two thousand and twenty&mdash;for many (maybe most) talking means typing on computers: handheld, laptop, or desktop. Computers can do all sorts of interesting things, like aid in designing buildings or simulate protein folding&mdash;fundamentally, a computer is a machine for doing math really fast. But computers can be networked, which turns them into tools for communication. Because society runs on talking and because computers enable us to do that, the most common thing that computers end up doing is to transmit human thoughts in text. Normal people call this writing, which is a kind of talking. Let’s call it messaging. When we think about building a good computer&mdash;and computer network&mdash;one that serves society in the best ways needs to do messaging well. Only a small percentage of people will regularly do anything else. (Urbit does serve those needs but I will leave that explanation to more capable minds.)
16+
17+## Modes of Messaging
18+
19+<br>
20+
21+![Ludovic Maclellan Mann examining the Cochno Stone](https://media.urbit.org/site/posts/essays/cochno-stone.png)
22+
23+<br>
24+
25+In general, technology serves humanity as a kind of appendage&mdash;instead of thinking new thoughts or acting on its own, it does what we command. Technology never creates new social structures&mdash;it merely makes existing ones easier, or it facilitates the creation of new ones. We use our tools to expand our capacities, and once we are capable of doing more, we can imagine new things to do. Inventing the wheel did not invent motorized transportation&mdash;but it did facilitate it and it was a necessary step, even an inspirational one. Similarly, the invention of writing made new forms of human interaction and new tools for organization possible.
26+
27+Consider the following conversational conventions, or modes of messaging: a letter; a dialogue; a book; a meeting; minutes of that meeting. These are each pieces of technology: finely constrained solutions to human problems. Now, we have digital forms of each of these which diverge variously from the original. A letter becomes an email. A dialogue becomes a chat room, or a series of blog posts, or a twitter spat. A book becomes a website or an ebook. Meetings in 2020 have virtually been replaced by their virtual counterparts. Minutes become recordings or transcripts.
28+
29+Although we do not have a clear picture of how humanity developed the technology of writing out of the basic capacity for speech, we can imagine that the computerization of writing has many parallels. It does not make the old tools obsolete, nor does it immediately introduce new social structures. It does create the potential, however. On the timeline of human existence, we have only had digitized text for a relatively short time. Because we want to understand how to best use these new forms, we should look at their underlying structure.
30+
31+In order to digitize messages well, computers need to reconcile two facts about all modes of messaging. They have:
32+
33+1. One basic shape, and
34+2. An infinite variety of forms.
35+
36+1 &mdash; The basic shape: all these modes have one common substance: human language. Any conversation is made of words. At first we only had spoken language. Then we discovered writing. Writing allows us to encode our words as glyphs to transmit them over time or distance. The internet extends this capacity. We called this "hypertext"&mdash;like good old fashioned text, but one level up. A staggering amount of messaging now takes place over this hypertext transfer protocol (http). In the process of digitizing language, we have learned the basic shape of a message. We can see this in how every social network shares messages in basically the same shape: an author, some content, references, an audience. We can confirm this basic shape by comparing it against our experience of the real world, and the previous comparison between speech and writing. Speech and writing both use the same substance, and take the same basic shape. They all have an author, content, references, and an audience.
37+
38+2 &mdash; Our experience of this one basic shape takes an infinite number of forms. The examples above (letter, meeting, &c) are just a few. These forms depend on the content of the message, the people involved, and the place they occur. All three aspects contribute significantly to its form, but the one that computerized messaging has not adequately compensated for is the place. Content depends only on the author and their intent. Getting certain people to view that content might be more difficult but most know how to use a computer. The place however, has not yet been adequately compensated for, and I think that has contributed seriously to our lack of civil and serious discourse over the internet. A president would not give an address in a bar, and a prospective lover would not utter his advances on stage. In writing, we can use the different physical forms to distinguish place. You shouldn’t read a book by the pool. You might not read a letter in public. You wouldn’t put a billboard in your bedroom.
39+
40+Furthermore, it seems possible that in our eagerness to "connect the world," we focused injudiciously on creating communities around "interests." Evidence suggests that unless the interest has a highly refined focus, these communities devolve into pandering, self-reference, and exploitation. In this way, the internet is something like a convention of conventions, where you wander in a sea of foreigners loosely affiliated by interest and surrounded by advertising booths. In physical space, people do gather by interest but they also gather by physical proximity&mdash;they are grounded and bound in place.
41+
42+Having an indistinct sense of place makes the form of conversation ambiguous and the participants of the conversation disconnected. Consequently, people are unsure how to interact. One need only know the term "comments section" to understand that.
43+
44+## People in Places
45+
46+<br>
47+
48+![Halle Saale Marktplatz](https://media.urbit.org/site/posts/essays/halle-saale-marktplatz.jpg)
49+
50+<br>
51+
52+As the internet grew to accommodate new conversation forms using the basic substrate of hypertext, web developers began to conceive of "digital spaces" through analogy&mdash;chat "rooms" and "forums,” or the "silo" and the "walled garden." Today, most of our conversation takes place in these walled gardens&mdash;privately-owned places which may be beautiful on the inside, but inaccessible from elsewhere. While some of these walled gardens are very large, our conversation is essentially confined to them. There is no roaming from one space to another while keeping one’s identity. We create new identities for new spaces both because we must and because we are afraid of repercussions on one platform for what we say on another. This is because we do not own our identity; we merely have a key&mdash;our password. The owners of the walled garden still own the artifacts of our tenure there, and can revoke our access to them at any time.
53+
54+The concept of identity and the concept of place are fundamentally linked. We imagine the prince who travels overseas where no one knows his name, or we imagine the old prospect of traveling to a new world to make a fortune. While those both exemplify a dramatic change in identity and place, we usually want to keep our identity consistent. We want to be recognized by friends whichever place we go, and we all strive toward having a good reputation, which is a consistent identity across places. This consistent identity also allows control of that reputation per place. A man is not judged in public by the words he says among friends. And there is no way to search what someone has said except by asking him. With our current system of identity providers (an absurd term, but a real one), we surrender our rights to selectively expose our thoughts, regardless of the place they have been uttered. A data breach or a weak password might lay bare our most private thoughts. We run the real risk of being confronted by an old conversation presented out of context or after we have learned better.
55+
56+People need distinct spaces to form conversations in distinct modes, and they need to have a consistent identity that controls how public their words are.
57+
58+In theory, we would have a digital city with unique regions, public fora, and sovereign parcels, into which one person might travel at will. In practice, we see this pattern: an app emerges to facilitate a mode of conversation. It gains popularity. Facebook (or Google, or Microsoft) buys and absorbs it. As monolithic empires, they can use the same format for all their messages. This gives them a great amount of power. They use this power to create things like "Sign in with Facebook" (or Google, or Microsoft) that benefit the user by consolidating their identity, but fail to solve the underlying problem. Their problem is that in order to allow people to communicate using the current technology stack, they need to be in control of everything.
59+
60+## Urbis ec Bit
61+
62+
63+<br>
64+
65+![View of Florence from San Miniato](https://media.urbit.org/site/posts/essays/view-of-florence.jpg)
66+
67+<br>
68+
69+Urbit does solve this underlying problem. At this point the explanation goes so far down the stack that you could spend years tracing it all, but the relevant part is this: Urbit is not an empire; it’s a territory. An empire is an entangling of land and rule: within the bounds of said empire, you agree to be bound by its laws and the penalties for transgression. The laws exist at the whim of a despot or cabal. Your standing as a Roman citizen buys you no favors in Persia. In contrast, a territory imposes only physical laws. For example, in the desert, you will die faster. The only way to change that is to alter the desert. Urbit imposes nothing but the digital equivalent of physical laws. You have an identity which can be said to be truly yours, and you have a piece of software that runs on whatever computer you choose and can do anything you want with the messages sent to your identity. There are no social protocols enforced, because no one can control what software you run on your computer. As long as you agree to communicate using the same basic substrate, you can communicate with anyone using Urbit. This is the digital equivalent of speaking the same language. Whether or not others will accept you into their coalitions is not the technology's concern.
70+
71+In the same way that the land provides clay and timber, Urbit also provides the tools and material for building places both public and private. These include the aforementioned consistent message substrate (content), as well as tools for organizing people/audiences, structure for referencing other content, and an identity system that is owned only by you while being verified by all. The places are being built&mdash;private rooms with just a few people, meeting halls, club houses, huge public spaces, and countless personal encounters, the contents of which are known to none but the participants.
72+
73+The default tools work with messages in a few of the ways with which we've grown familiar: chat, direct messaging, publishing, link-sharing. They map onto existing forms of messaging because as I said earlier, the technology does not create new social structures; it just facilitates them. We have only seen the beginning of what the internet is capable of doing. Within a few decades it replaced the majority of letters, phone calls, and text dissemination&mdash;that was just the first phase of getting up to parity with what written text and speech could already do. In order to get to the next phase of creating new social processes, we need our technology to be organic and democratic, in the sense that everyone can participate and shape it. It needs to have a consensual foundation&mdash;a common substrate&mdash;and infinite possibility for expression. Urbit provides both of those.
74+
75+Similar to working undeveloped land, it takes a lot of hard work, which is why Urbit is not ready for mainstream adoption yet, and why I alluded to the idea of settlers in my opening paragraph. Traveling to the new world is not for everyone, but everyone is welcome.
76+
77+*How could one do other than submit to Tlön, to the minute and vast evidence of an orderly plant? It is useless to answer that reality is also orderly. Perhaps it is, but in accordance with divine laws&mdash;I translate: inhuman laws&mdash;which we never quite grasp. Tlön is surely a labyrinth, but it is a labyrinth devised by men, a labyrinth destined to be deciphered by men.*
content/blog/a-founders-farewell.md+2−2
@@ -6,10 +6,10 @@ aliases = ["/posts/essays/a-founders-farewell", "/posts/a-founders-farewell"]
66[extra]
77author = "Curtis Yarvin"
88ship = "~sorreg-namtyv"
9−image = "https://storage.googleapis.com/media.urbit.org/site/farewell.png"
9+image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/farewell.png"
1010+++
1111
12−![Curtis Yarvin portrait](https://storage.googleapis.com/media.urbit.org/site/farewell.png)
12+![Curtis Yarvin portrait](https://storage.googleapis.com/media.urbit.org/site/posts/essays/farewell.png)
1313
1414After 17 years, I've left the Urbit project.
1515
content/blog/aesthetic-culture-1.mdnew file+106
@@ -0,0 +1,106 @@
1++++
2+title = "Aesthetic Culture #1"
3+description = "One of the most exciting things about Urbit is the aesthetic and design around it, developed partly by Tlon (through the design of Urbit itself) and partly by the community (by producing great Urbit art)."
4+date = 2020-11-12
5+[extra]
6+description = "One of the most exciting things about Urbit is the aesthetic and design around it, developed partly by Tlon (through the design of Urbit itself) and partly by the community (by producing great Urbit art)."
7+author = "Nikolai Mallett"
8+ship = "~nartes-fasrum"
9+image = "https://media.urbit.org/site/posts/essays/help-the-environment.jpg"
10++++
11+
12+<br>
13+
14+![A set of four sigils arranged & coloured to appear as various natural forms, above the ~sorwet sigil & the text "help the environment and help yourself"](https://media.urbit.org/site/posts/essays/help-the-environment.jpg)
15+
16+<br>
17+
18+*This post is the first in a series of digests centered on art produced within and about Urbit by a member of the community, ~nartes-fasrum. Monthly digests will be available within the Urbit Community group in Landscape, and will occasionally be compiled here on the blog to give you a sneak peek at some of what’s happening on the network. Enjoy! ~wolref-podlex*
19+
20+One of the most exciting things about Urbit is the aesthetic and design around it, developed partly by Tlon (through the design of Urbit itself) and partly by the community (by producing great Urbit art). As the community grows, it creates more art, and we have the opportunity to showcase some of the pieces we love. These works can draw curious new users in, and they give existing users ways to communicate their excitement to friends.
21+
22+To that end, I wrote [the Art by Urbit proposal](https://grants.urbit.org/proposals/636838408-art-by-urbit), a regular digest for the dissemination of Urbit art and propaganda. We'll bring you the works of both familiar faces and new users, in a variety of media types from image manipulation to 3D models and physical pieces. This first digest will cover some of the art produced in the past year, but will have a focus on the last two months. Future digests will be incremental updates summarizing the artworks of the prior month.
23+
24+## ~datnut-pollen
25+
26+~datnut- made a physical representation of their sigil from maple wood & epoxy resin, and mentioned the potential to use an Arduino to cause different lighting effects for different statuses of an urbit.
27+
28+![The sigil of ~datnut-pollen glowing yellow on a black background](https://i.imgur.com/GxmO6sT.jpg)
29+
30+## ~lagrev-nocfep
31+
32+~lagrev- [made a thread of Dinosaur Comics](https://twitter.com/sigilante/status/1299101593997127680), using the Urbit Whitepaper as the seed text.
33+
34+![A Dinosaur Comics comic, with text pulled from the Urbit Whitepaper](https://pbs.twimg.com/media/EgdUaoKWoAAl6A3.jpg)
35+
36+A sweet poem about the potential for Martian felines is theirs as well:
37+
38+![A brief poem regarding cats on Mars](https://pbs.twimg.com/media/Ef_KTbqWAAAHN-k.jpg)
39+
40+## ~litmus-ritten
41+
42+~litmus- produces art full of glowing gases and colourful curves:
43+
44+![A hand holding a glowing orb, underneath the text: "Urbit - Lunar Operations"](https://i.imgur.com/fRbFIpj.png)
45+
46+~litmus- also drew Urbitan for the release of OS1:
47+
48+![An cartoon-type female character holding an orb, standing in front of a fan of Urbit sigils](https://i.imgur.com/vGqVmNM.png)
49+
50+More of their work is available in the notebooks of the Internet Weirdness Research Unit.
51+
52+## ~minder-folden
53+
54+~minder- stylistically ranges from retrofuturistic memes to flat-out classic 50s retro:
55+
56+![An image of a meteor shaped like ~minder-folden's sigil in front of Mr. Clean, with the text "Soon it will all be clean"](https://pbs.twimg.com/media/Eggk0CGU8AAJC-W.jpg)
57+
58+![A Popular Science cover advertising "Video-Disc Players", with ~minder-folden's sigil present on a television](https://minderimages.nyc3.digitaloceanspaces.com/1ib61l8ugy451.jpg)
59+
60+More of ~minder-’s work is available in his The New Era notebook.
61+
62+## ~naltyc-wornes
63+
64+~naltyc-, & by extension ~dasfeb industries, produces content related to the exploration of Urbit on small & unique computers:
65+
66+![An image of five astronauts wearing Urbit badges strapped into a spaceship cockpit, with the ~dasfeb logo & a Raspberry Pi on the wall behind them](https://pbs.twimg.com/media/EkiyfGbVgAAp8wm.jpg)
67+
68+![An image of a large, early computer control panel with the ~dasfeb sigil on the upper wall and a number of planet sigils on display readouts](https://pbs.twimg.com/media/Ejap_knXgAARo38.png)
69+
70+More of their work is available in the smol computers group.
71+
72+## ~nartes-fasrum
73+
74+I use GIMP to edit images I pull off various social media platforms, and usually post the results on Twitter at [@nartesfasrum](https://twitter.com/nartesfasrum).
75+
76+![A set of four sigils arranged & coloured to appear as various natural forms, above the ~sorwet sigil & the text "help the environment and help yourself"](https://pbs.twimg.com/media/EjuuJjTXsAIcfU9.jpg)
77+
78+## ~norsyr-torryn
79+
80+No discussion of Urbit art would be complete without mentioning [~norsyr-'s Canvas app](https://github.com/yosoyubik/canvas), which won first place in the [Hackathon 2020](https://urbit.org/blog/hackathon-results/) event.
81+
82+![A demo image of the Canvas app, with various drawn characters](https://i.imgur.com/zpm3dYX.png)
83+
84+## ~radbur-sivmus
85+
86+~radbur- writes poetry on a range of subjects, one of which could be Urbit. Interpretation of ["A Weaver's Regard"](https://t.fust.us/writing/poetry/weavers-regard) and ["Internet Absurdities"](https://t.fust.us/writing/poetry/internet-absurdities) is left as an exercise to the reader.
87+
88+## ~sitful-hatred
89+
90+~sitful- has a Martian Meme Depository chat in the Networked Subject group, which catalogs a number of the Urbit memes that have been created so far.
91+
92+![An image of a Connect-Four type game box, edited to read “Connect ~zod: The Classic Network Connectivity Game](https://i.postimg.cc/d1yH7PHL/connect.png)
93+
94+## ~tocrex-holpen
95+
96+~tocrex- has been drawing the galaxies of Urbit, and uploading results to Twitter at [@tocrexholpen](https://twitter.com/tocrexholpen). Each galaxy has a unique design and outfit, with the galactic sigil proudly displayed as its face.
97+
98+![An image of the ~feb galaxy wearing elaborately embossed armor.](https://pbs.twimg.com/media/ENeLOb4WkAApDu2.jpg)
99+
100+## Landscape
101+
102+Something that's become quickly evident with the addition of background images to Landscape is that people love to customize their ship's appearance and make it feel more like home. To close things out, we're providing a pair of backgrounds — one darker, one lighter — for use on your ship (or your desktop, should you so desire).
103+
104+![A moody Martian city](https://i.imgur.com/7Ot9Hcu.jpg)
105+
106+![A bright outing in a young ship](https://i.imgur.com/wFKt2EW.jpg)
content/blog/after-machine-war.mdnew file+46
@@ -0,0 +1,46 @@
1++++
2+title = "After the Machine War"
3+description = "The date is January 1, 2050. The place, New York City. The vibe...subdued."
4+date = 2021-03-15
5+[extra]
6+author = "Simon Kovacs"
7+ship = "~bacbec-lormur"
8+image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/berlin-wall.jpeg"
9++++
10+
11+<br>
12+
13+![berlin-wall](https://storage.googleapis.com/media.urbit.org/site/posts/essays/berlin-wall.jpeg)
14+
15+<br>
16+
17+
18+> The following fictional passage, from a book being written in an Urbit Group called “the Aleph,” sketches out a dismal future for the human race. As an item of speculative fiction, the piece is not what one might call original. Anyone could have come up with these ideas. In fact, several already have. The Matrix is an obvious antecedent. Vonnegut isn’t far behind either. And the treacly humanism lodged beneath the bitter humor resembles nothing so much as the work of that beau monde satirist, George Saunders.
19+>
20+> Really the only notable thing about it is that it was written on Urbit. And that, perhaps, has made all the difference.
21+>
22+> It’s easy to be pessimistic about the future. Intellectuals, especially, are drawn to pessimism, because pessimism (falsely) implies a greater wealth of knowledge about the ways of the world. But one thing the pessimist never sees coming is a turn for the better. To wit, the future described in the below excerpt doesn’t have to take place. And Urbit is one piece of evidence for the claim that it will not.
23+>
24+> The philosopher-cum-internet comedian Slavoj Zizek likes to point out that no one was really expecting the Soviet Union to collapse in 1989. In fact, the average Soviet dissident wasn’t even gunning for it. He was haggling over small reforms, pushing to get the less corrupt politicians to the top, just going about his day eating or opening a window or walking dully along. Then, kaboom. Collapse. No more USSR.
25+>
26+> Then as now, the unexpected is more likely to occur than most would believe. One thing is not only possible, but an established fact: A brand new digital infrastructure is slowly, quietly being built. While U.S. political parties haggle over $1,400 disbursements for citizens, the rules of global finance are being re-written in code. While pundits debate the merits of Dr. Seuss’s lesser known titles, a global shift away from traditional publishing is gaining steam. And while users and social apps themselves pop up and down like whack-a-mole, folks are putting down roots with permanent peer-to-peer digital identities. If you’re anything like an optimist, you’ll probably want to get on Urbit ASAP and put down your own.
27+
28+<br>
29+
30+The date is January 1, 2050. The place, New York City. The vibe...subdued. Back in 2020, you made a note to yourself to take stock of the world around you here at the half-century mark. And now the time has come. What do you find? The air quality is a bit worse, the bad parts of town are a bit more dilapidated, the Knicks are still terrible—all in all, from the outside at least, not much has changed from 30 years ago. Today you wake up groggy on your self-adjusting Smart Bed (Smart Bed Never Sleeps), you make yourself a steaming pot of coffee (locally sourced, delivered within the half-hour by a drone, now that you’ve got Titicaca Prime), you shower and get ready for work.
31+
32+But what was that dream you had last night? Only the faintest traces of it remain. A luminous rainbow, a mountain landscape, a sense of profound inner peace, mixed with euphoria, mixed with...an intense desire to go out and buy some Health Morsels cereal?
33+
34+That’s odd. You’ve never even had Health Morsels. You open up your laptop, where you can view the activity of the iThink microchip that you got implanted in your cortex a few years ago. “Ads help Elysium provide you with free, quality sleep-monitoring. To disable ads, please upgrade to Elysium Premium.” That explains it. After all—and you pause for a moment over whether the forthcoming thought is yours or the iThink’s, before deciding that it’s much the same anyway—Health Morsels probably are delicious. And healthy, too.
35+
36+As usual, they’re setting something on fire outside your home. Normally you’d scroll back through your Squawker feed to see what it was all about, but today you’re late for work, and anyway you’re in a pleasant haze after the Health Morsels dream—no point ruining it by poring over the latest Squawker pile-on. You glance at the awning. Ah, the bodega. Toilet paper and Juul Pods are cheaper in bulk from Titicaca anyway.
37+
38+Another day at the office. You were never exactly passionate about content moderation, but hey, it keeps the lights on. (And since ConEd got absorbed by Titicaca, it’s been pretty important to have a Verified Income Stream.) It’s a normal day at work. Algorithms haven’t yet been able to filter out all Unverified Content—so it’s up to you the flag Unacceptable Violence, Disputed Claims, and Unfederated Currency transactions.
39+
40+Except after your pleasant dream, it all suddenly seems so drab. You start to wonder whether there was an error last night—maybe they turned the dream levels up too high. Something from your night-time vision just won’t leave your mind, like a film strip looping over and over. It’s that river beside a sloping field, like you used to swim in when you were a kid. You can almost feel the icy cold against your skin, the sticks and mud against the soles of your feet, and then there’s the ripe, marshy scent of the riverbed. Uh oh. You realize you’re close to danger levels. This isn’t where your head’s supposed to be at. Frantically you scroll through content, seeking to moderate it. A user threatening violence against Titicaca. A stream that violates DMCA. A highly dubious Squawker claim, with no support from experts. Flagged. Flagged. Flagged.
41+
42+Yet the river remains. You see it, you feel it, just as you feel the kiss of the sun on your shoulders, the breeze rustling through your damp hair.
43+
44+Now you know what’s coming. You brace for it and wait. Three. Two. One. ZAP. Your iThink produces an electric shock: plenty painful but not permanently damaging—at least that’s what the Verified studies show. The river recedes from your mind. Following the shock, your iThink, as versatile a little machine as ever was invented, delivers a few milligrams of both amphetamine and oxycodone, bringing on a wonderful feeling of simultaneous alertness and relaxation. You look up at your monitor. Content moderation doesn’t seem so bad, with the stimulant and the barbiturate swirling paradoxically through your system. It’s true what they say in the ads: iThink doesn’t just make you think better, it makes you feel better. You dive back into your content moderation with renewed verve, even flagging a couple completely innocent posts just out of surplus exuberance. So what if you hardly get outside at all these days, so what if you’ll never swim in that stupid river. The fastest electronics, the Your Health and Wellbeing tracked and adjusted by an intelligence far greater than that which you could ever hope to possess, a gizmo that gives a whole new meaning to the term neural net.
45+
46+2050 turned out to be a pretty good year after all.
content/blog/an-email.mdnew file+88
@@ -0,0 +1,88 @@
1++++
2+title = "An Email from the Archive"
3+description = "I found this email in my archives recently and thought it might be fun to share publicly."
4+date = 2020-11-30
5+[extra]
6+author = "Galen Wolfe-Pauly"
7+ship = "~ravmel-ropdyl"
8+image = "https://media.urbit.org/site/posts/essays/moon.jpg"
9++++
10+
11+![An email from the archive](https://media.urbit.org/site/posts/essays/moon.jpg)
12+
13+I found this email in my archives recently and thought it might be fun to share publicly.
14+
15+```
16+From: Galen Wolfe-Pauly <galen@tlon.io>
17+Date: Thu, Jul 2, 2020 at 9:50 AM
18+Subject: Continuing
19+To: XXXXXXXXXXXXX
20+```
21+
22+Here are a few things I was thinking about after we chatted. It may be that I'm just reiterating things I already said — but perhaps it's useful:
23+
24+1 -
25+
26+Our collective desire to depend on digital communication tools vastly exceeds what I would have ever guessed. Even if you somehow factor out what’s addictive about the platforms we use today: they serve a real need. The crux of the problem with our current platforms is that they don’t actually serve the need that we want them to serve. They’re not tools in the way we expect tools to be. For the most part, the platforms we depend on serve the needs of their shareholders or some graph or another that needs to go ‘up’, which makes them compromised in a very deep way.
27+
28+In the pre-digital world we enjoyed a few things about the way we communicated, collaborated and did business that are dwindling: simplicity, durability and ownership. I’ll try to give some straightforward examples of what I mean:
29+
30+A - When I talk to someone directly, I’m not worried that someone else is listening in. If they go tell someone else what I said to them, that’s something for us to work out between us — they’re not *always* reporting our conversations back to a third party. The constraints of the interaction and the privacy implications are *simple* — I don’t think about them at all. Good privacy guarantees flow from a strict focus on simplicity. When two people want to talk to each other: give them a secure channel to talk. Putting a centrally-controlled service between them is just an interim solution because no one could figure out a better way to do it.
31+
32+B - When I write something down on paper, or type into a typewriter, I have an intuitive sense of the durability of what I’ve made. I have notes on my shelf I took ten years ago. I don’t worry about them disappearing. This means I can have a very direct, high-resolution relationship with the medium. I can pour myself into my physically-written notes in a way I would never pour myself into a Google Doc. Our digital tools are deeply untrustworthy because we know they can disappear, that they won’t actually last forever.
33+
34+C - Around 2008 I started limiting myself to a few specific drawing and writing tools. I use them all the time and can actually refine my relationship to them since I know they’re not going to change out from under me. Perhaps at some point these pens wont be made anymore, but the ones I have are actually *mine*. Similarly, the things I make with them actually belong to me in a way that doesn’t require some ridiculous terms of service. A sense of ownership, when it comes to the medium of communication, determines our level of trust and commitment.
35+
36+Our digital tools have to achieve the same level of simplicity, durability and ownership that our pre-digital tools did. Until they do, we’re always going to be in conflict with them, full stop.
37+
38+The main thing is that exactly none of our present platform-centric world can survive when you see things this way. The digital world we live in is composed of an insanely complicated, ephemeral set of tools that distinctly *do not* belong to the people that use them.
39+
40+We’re going to be in a constant struggle with technology until it conforms to these three very basic expectations. These are the expectations we try to get Urbit to fall in-line with, of course. Something else could also succeed by satisfying them. But I also don’t really see anything else, aside from Bitcoin and maybe Ethereum, falling in line with these core principles.
41+
42+So: while I wish that Urbit was more mature and ready to capture those that are being purged from mainstream social media, are bored with it or are frustrated with the constraints of ‘productivity software’ — I think this conflict is going to drag on until people realize that what we’re in conflict with is the structure of the software we use. Using software that’s managed by other people is always going to cause serious problems all the way up at the user level. For more speculation on how this might play out, watch Black Mirror.
43+
44+
45+2 -
46+
47+(1) is, in a way, a long-winded way of saying that the state of the world hasn’t changed our direction all that much. In order for Urbit to be approachable to use, it has to be very nicely made and that takes time and iteration. As the system stabilizes, Urbit can evolve in a more traditional way: we, along with others in the ecosystem, release stuff, observe how people use it, and try to make it better. We’re at the point where we’re nearly ready to get into that feedback loop, and we very much need to get there. We’re close.
48+
49+Urbit is a distinctly different *kind* of software than anything we have now. Your Urbit is something you actually own and can do whatever you want with: not unlike your furniture or your kitchen tools. An Urbit is a tool for individual, human-scale computing and our whole approach to designing and making things is completely different. Most computing is about industrial-scale computing: where the software system stores everyone’s data and is managed by the people who build it.
50+
51+Urbit is the opposite of industrial-scale. Urbit is much more like something that’s carefully crafted and delivered to you directly. This craftsman-like approach to building software really isn’t a part of most modern software engineering.
52+
53+When I think about this from the standpoint of the person using what we make, it’s especially important. Urbit should feel like something that’s purposefully made by hand — not something you picked off the shelf at Wal-Mart. Some of this ethos was present in the early PC movement, but it’s mostly lost today. The care and attention that goes into building the system is also exactly what we make money on. People pay us to own a piece of it, to use it. We’re incentivized to make nice things, in the Urbit model, and we take that responsibility seriously.
54+
55+
56+3 -
57+
58+Networks are a really important social form that’s only just beginning to come into existence. A network is neither a state nor a company, but something in-between. Bitcoin is a network, Ethereum is network (but it’s still far too centralized). Urbit is a young network.
59+
60+(In my view, a real network is always decentralized. Centralized networks are basically just companies.)
61+
62+Urbit is controlled by the collective of people who use it — in varying degrees, of course. The main thing is that this collective is bound together only by private keys and a blockchain, not a set of legal documents. The agreements between everyone on the network are in some cases more formalized (in terms of ownership) and looser (in terms of content moderation) than what we’re used to in either a state controlled or company controlled model. This is a very unusual kind of institution.
63+
64+On a successful Urbit network, Facebook, Airtable, and Signal are just successful applications. You could probably build companies around them that ship software to Urbit — but they’re more like 5 - 10 people instead of thousands.
65+
66+Urbit doesn’t aim to eat away at the government per se. Instead, it’s an important communication tool for institutions of any scale to actually take control of their means of collaboration. The efficiency of inter-government communication and government to populace communication can clearly be improved by *a whole lot*.
67+
68+
69+4 -
70+
71+The most important thing is that people can generate a vision of the future. This can only emerge from a small collective of motivated people. Our public life is overwhelmed by people shooting from the hip, aiming for likes.
72+
73+There are difficult, infrastructural problems *all over the place* that desperately need the considerate attention of small groups of people. Urbit, as communication tooling, is aimed at improving the quality of the fabric that binds these groups together. Or, to put it another way, before you can solve any specific problem you have to improve the problem solving process overall. Everything is gated on solving the process.
74+
75+
76+5 -
77+
78+Christopher Alexander is, indeed, probably the biggest influence on my thinking when it comes to paying close attention to making things that both generate a deep sense of connection and are shaped by the people who inhabit them.
79+
80+[http://en.bp.ntu.edu.tw/wp-content/uploads/2011/12/06-Alexander-A-city-is-not-a-tree.pdf](http://en.bp.ntu.edu.tw/wp-content/uploads/2011/12/06-Alexander-A-city-is-not-a-tree.pdf) is one of his early, well known essays that’s easy to find online. I think ‘The Nature of Order’ is the thing that had the biggest impact on me, but it’s harder to find. There’s probably a PDF floating around on the internet somewhere. It's also a beautiful (four volume) book. The first volume kind of nails it. This talk is also great: [https://twitter.com/urbit/status/1148030042846326784](https://twitter.com/urbit/status/1148030042846326784)
81+
82+The thing that comes to mind lately is Hejduk. He had passed away by the time I was at Cooper, but I feel like I was educated in the ghost of his work. This documentary gives a good impression of his thinking: [https://www.amazon.com/John-Hejduk-Builder-Worlds/dp/B07NKQ72C8](https://www.amazon.com/John-Hejduk-Builder-Worlds/dp/B07NKQ72C8)
83+
84+Hejduk was able to see that architecture isn’t about building buildings per se, but something else. That was always quite obvious to me.
85+
86+
87+Talk soon!
88+G
content/blog/an-urbit-overview.md+2−2
@@ -6,10 +6,10 @@ aliases = ["/posts/essays/an-urbit-overview", "/posts/an-urbit-overview"]
66[extra]
77author = "Galen Wolfe-Pauly"
88ship = "~ravmel-ropdyl"
9−image = "https://media.urbit.org/site/blog-0.jpg"
9+image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/an-urbit-overview.jpg"
1010+++
1111
12−![](https://media.urbit.org/site/blog-0.jpg)
12+![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/an-urbit-overview.jpg)
1313
1414## What Urbit is
1515
content/blog/beliefs-and-principles.md+2−2
@@ -7,10 +7,10 @@ aliases = ["/posts/essays/beliefs-and-principles",
77[extra]
88author = "Curtis Yarvin + Galen Wolfe-Pauly"
99ship = "~sorreg-namtyv + ~ravmel-ropdyl"
10−image = "https://media.urbit.org/site/blog-2.jpg"
10+image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/beliefs-and-principles.jpg"
1111+++
1212
13−![](https://media.urbit.org/site/blog-2.jpg)
13+![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/beliefs-and-principles.jpg)
1414
1515## Beliefs
1616
content/blog/bootstrapping-urbit-from-ethereum.md+4−5
@@ -216,7 +216,7 @@ replacing the storage contracts.
216216
217217We'll walk through how we have designed these contracts in detail here. You can
218218also view our in-progress source at the
219−[`urbit/constitution` GitHub repo](https://github.com/urbit/constitution).
219+[`urbit/azimuth` GitHub repo](https://github.com/urbit/azimuth).
220220
221221### Certificate storage contract
222222
@@ -378,10 +378,9 @@ price in ether of a planet, and the number of planets available.
378378
379379## Okay, so
380380
381−That was quite a lot of information! We've created a fora thread
382−[here](https://urbit.org/fora/posts/~2017.9.20..22.56.04..47ce~) for discussion,
383−and would be glad to hear your feedback. GitHub issues on the
384−[urbit/constitution repo](https://github.com/urbit/constitution) are also more
381+That was quite a lot of information! There's also a blog post about the constitution
382+[here](https://urbit.org/blog/interim-constitution/), and GitHub issues on the
383+[urbit/azimuth repo](https://github.com/urbit/azimuth) are more
385384than welcome.
386385
387386There's a lot more to come on this front as our contracts get closer to getting
content/blog/common-objections-to-urbit.md+4−4
@@ -6,10 +6,10 @@ aliases = ["/posts/essays/common-objections-to-urbit", "/posts/common-objections
66[extra]
77author = "Curtis Yarvin"
88ship = "~sorreg-namtyv"
9−image ="https://media.urbit.org/site/blog-9.jpg"
9+image ="https://storage.googleapis.com/media.urbit.org/site/posts/essays/common-objections-to-urbit-1.jpg"
1010+++
1111
12−![](https://media.urbit.org/site/blog-9.jpg)
12+![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/common-objections-to-urbit-1.jpg)
1313
1414We love crowdsourced criticism. We've heard a lot of great
1515objections to Urbit. Surely there's more out there! We'll
@@ -309,7 +309,7 @@ It's very important that Urbit in 2116 be fully decentralized.
309309For Urbit in 2016, pretending to be decentralized would be a joke
310310at best, and a hoax at worst. And of course, no one can DAO us
311311-- since the property system is still just a central registry.
312−Among other things, we check it into Github. Github is not a
312+Among other things, we check it into GitHub. GitHub is not a
313313blockchain -- but still, good luck with that.
314314
315315## <a name="sand"></a>Sandstorm/IPFS/Ethereum is way ahead of Urbit.
@@ -628,7 +628,7 @@ much sense to restrict this security state to code within Urbit.
628628The Urbit interpreter `vere` runs as a Unix daemon that
629629implements the FUSE user-level filesystem protocol, and maps the
630630data on your services into the Unix filesystem. For example, one
631−of our demos lets you `ls` your Github issues.
631+of our demos lets you `ls` your GitHub issues.
632632
633633So it's straightforward to build, for instance, a Python app that
634634uses Urbit as a gateway to mash up a bunch of web services. As a
content/blog/community-spotlight-the-portico.mdnew file+137
@@ -0,0 +1,137 @@
1++++
2+title = "Community Spotlight: The Portico"
3+date = 2021-05-04
4+description = "Interview with The Portico founder Josh Reagan"
5+[extra]
6+author = "~tirwyd-sarmes"
7+ship = "~tirwyd-sarmes"
8+image = "https://media.urbit.org/site/posts/essays/orthodoxchurch.jpg"
9++++
10+
11+![](https://media.urbit.org/site/posts/essays/orthodoxchurch.jpg)
12+
13+*One of the most striking things about Urbit is the ideological diversity between communities. The Community Spotlight blog series will focus on various Urbit communities via interviews with founding members.*
14+
15+For the first week of the Community Spotlight series, I (~tirwyd-sarmes) will be speaking with Josh Reagan (~taglux-nidsep). Josh is the founder of The Portico, an Urbit community of Eastern Orthodox Christians.
16+
17+The Portico is a very active group with conversations taking place over multiple channels. There are channels for posting Orthodox iconography, discussing the broader Christian culture war, and just talking about Orthodoxy in general. Of particular interest is Josh’s “Euthyphro” blog series which investigates the relationship between logic and the Orthodox faith. This is a topic that Josh is well qualified to talk about: he has a PhD in Philosophy from Rice University. His dissertation on the epistemology of logic and truth-preservation was titled "Knowing Your Limits: Logic for Limited Beings”. Josh is also the co-author of a forthcoming textbook on formal logic.
18+
19+To read Josh’s blog is to be inducted into two esoteric traditions: theory of logic and Orthodox theology. With titles like “St. Gregory the Theologian and the Liar Paradox” and “The Existence of Abstract Objects”, Josh does not pull punches.
20+
21+Accordingly, our conversation focused on the idiosyncratic and niche community that The Portico is home to. There, you won’t find cussing or much talk about “life partners”, but you will find cutting critiques of liberalism and the best way to raise Orthodox children.
22+
23+As other users have pointed out, Urbit is pre-[Eternal September](https://en.wikipedia.org/wiki/Eternal_September). In fact, there’s some hope that the very nature of Urbit, how it tries to protect the sovereignty of niche communities via decentralization, might foil the Eternal September phenomenon. If Josh’s community persists, it will be a testament to both Josh and the decentralized Urbit network. As of now The Portico is a refreshing, perhaps jarring (as Josh might say), reminder of what the internet looked like back in the early days—a place for those who are different.
24+
25+I encourage you to take a look. Find The Portico at ~topnup-firber/the-portico.
26+
27+\-\-\-\-
28+
29+**Do you see any connection between Rod Dreher’s *The Benedict Option* and your community on Urbit? Dreher sees a need for American Christians to create self-sustaining communities outside of the mainstream to protect the Christian religion and culture.**
30+
31+It’s tough to say with certainty—I’ve never read *The Benedict Option*.
32+
33+A few years ago, while he was writing the book, I was a regular reader of Dreher’s blog. From his descriptions there, I was never clear about what exactly he was proposing. Much of his “clarification” came by way of metaphor: don’t “run for the hills”, but stop “shoring up the American imperium”. I didn’t read his book because I didn’t have much confidence that he would be especially precise or insightful.
34+
35+[There is an interesting review I’d recommend](https://handleshaus.wordpress.com/2020/10/06/review-of-rod-drehers-live-not-by-lies/), however, of his later book, *Live Not By Lies*. I believe it accurately characterizes the scale of the threat Christians will soon face in this country.
36+
37+My upbringing was conservative Christian and self-consciously counter-cultural. I've inherited that understanding of what it means to be a Christian in an increasingly secular world. It comes naturally to me, so I find it obvious that Christians should form self-sustaining communities. But the details matter. What do such communities look like? How do we secure the freedom to pursue such communities? How do we sustain them, when myriad external forces seek to undermine them? How do we solve the long-term problem of the declining cultural importance of Christianity (which surely erodes the plausibility of our religion to many, even to some of those with sympathies toward it)?
38+
39+I don’t claim to know the answers to these questions.
40+
41+One kind of answer is that we should redouble our efforts to support and maintain a religiously and morally neutral liberal political order, which leaves room for subcultures to live and self-regulate as they wish. I disagree. Those who support a kind of “neutral” liberalism view it as an attempt to go “meta” and rise above various parochial metaphysical, moral, and religious disputes. I view this as a cop-out, a refusal to grapple with the most important questions.
42+
43+Does the liberal have metaphysically-rooted moral reasons for going “meta”? If so, then he’s just another sectarian and he should be honest about it. The only difference is that his team has had the whip hand for the last several generations. On the other hand, if the liberal claims no underlying metaphysical justification then his project can succeed only to the extent that he can arrange and adjudicate unprincipled (and therefore ad hoc) agreements between otherwise hostile moral communities. But how stable can such an arrangement really be?
44+
45+Orthodox Christians have theologically rich, metaphysical foundations for their social and moral teachings. With these we can form healthy, thriving, and growing communities. We can do so even under actively hostile political orders. If the early Church could make it under the Romans, so can we today. But it’s going to be difficult and sound judgment is necessary. Unfortunately, we lack strong leadership and that leaves us vulnerable. If we stay uncoordinated we dissipate our energies needlessly. If we latch onto the wrong leaders we can be led astray.
46+
47+The challenges are immense. There is no technological solution. Even so, I’m an Urbit early-adopter for a reason. Over the years I’ve come into contact with a number of Orthodox and Ortho-curious Urbit followers. Why not try to bring them together in an Urbit group?
48+
49+As far as I know, no one in the group is clergy. We’re all just a bunch of laymen with no authority to do much of anything. But I’d like to think we can still contribute in some way. I have an academic background in analytic philosophy so my inclination is to emphasize theory, but we have room for a bit of everything. Someone in the group wrote a script to take the texts of various Church Fathers and convert them to audio using AWS Polly. Those turned out pretty well!
50+
51+At times I entertain ambitions to do a bit more, but for now perhaps it’s better to keep expectations in check. If nothing else, we can read and discuss the Scriptures and Church Fathers together, and try to understand better how to apply and live out their teachings. As we continue to grow the community and develop a consistent internal dynamic perhaps opportunities will arise that aren’t yet on the horizon. One thing I can say is that I’m committed to keeping the group active and growing.
52+
53+**I’d like to talk about your blog on The Portico. It combines two of your main interests: logic and theology. In broad strokes, do you think theology and logic are compatible? What is the relevance of this intersection to both of these disciplines?**
54+
55+I feel obligated to answer this question in two ways.
56+
57+(1) If by “logic” you mean “first-order predicate calculus”, then I think there’s no special conflict between logic and theology. There are certain puzzles about their relationship, but similar puzzles exist between logic and other disciplines. Theology isn't especially endangered.
58+
59+For example, in the 1930s, Alfred Tarski proved his famous Undefinability Theorem. Crudely put, it says that a plausible truth predicate cannot consistently be contained in any formal system with axioms strong enough to model arithmetic. Superficially it seems like our options are (a) get rid of the concept of truth, (b) get rid of arithmetic, or (c) throw away parts of logic until all inconsistency disappears.
60+
61+None of these options is appealing. Tarski came up with a solution that mostly satisfies many logicians: reduce the concept of truth to “truth in a language” and forbid any language from containing its own truth predicate. If you want to talk about truth in a language L-1, you have to do it from a “metalanguage”, L-2.
62+
63+Is Tarski’s definition of truth in a language the definitive solution for preserving truth, math, and logic? Perhaps not many philosophers think so, and there’s a massive literature in which logicians have attempted to improve on or extend his results.
64+
65+Sometimes people seem to think formal logic is an infallible gift from heaven that must always be right. Kant said in the *Critique of Pure Reason* that formal logic is essentially a completed field. In fact, [the logic of his day](https://en.wikipedia.org/wiki/Port-Royal_Logic) was an early-modern Cartesian variation of a medieval scholastic synthesis of ancient Stoic and Aristotelian logics. Roughly 100 years after Kant’s first critique was published, C. S. Peirce and Gottlob Frege independently discovered first-order mathematical logic as we know it today, inaugurating the greatest advance of logic since Aristotle. Kant was wrong.
66+
67+Mathematical logic is a convenient, generally reliable, man-made tool that, when used carelessly in certain untamed domains, can lead one astray. Probably most people reading this are familiar with such puzzles as the Liar paradox. When one understands that logic is not a completed science, and perhaps never will be, there is less reason to worry about whether it can be used to nuke entire disciplines, like theology.
68+
69+For more on this topic, see the blog post in my Urbit group: “St. Gregory the Theologian and the Liar Paradox”.
70+
71+(2) There is perhaps a deeper challenge than the one I’ve just sketched. The Stoics used the term “logic” to encompass what we might today call “epistemology”. If the word “logic” is meant in some such broad and normative sense, then we may restate the challenge as one about rationality and theology. Is it irrational to pursue theology in our modern age?
72+
73+As an undergraduate under the influence of Kierkegaard, I was attracted to a romantic, vaguely irrationalist notion of faith. Dawkins-mania was at its peak and I was disgusted by the pop-rationality (or was it empiricism?) of his annoying followers. Their view seemed to be that rationality just means “following the evidence”. The raw evidence is foundational, and theories are built atop by generalizing from the evidence. The ghost of logical positivism is with us even now.
74+
75+I was dimly aware that Quine and others had made it difficult to sustain epistemic foundationalism. However, being unable to supply a more clear and cogent notion of rationality, I became skeptical of the idea altogether. But I went too far.
76+
77+Instead, the proper response is to develop a superior account of rationality. Readers can probably guess where I went looking!
78+
79+The word “logic” comes from the Greek “λόγος”. This is also the word used to describe Jesus Christ in the Gospel of John: “In the beginning was the Logos, and the Logos was with God, and the Logos was God.” This connection is not merely etymological.
80+
81+For many ancients, the term “λόγος” meant something like “divine principle”. You might think of it as akin to a law of nature, but with stronger theological connotations. Christians appropriated this term and made it rather more exalted: the Logos is begotten of the Father, and yet somehow one with Him.
82+
83+We are told that all things come into being through the Logos (John 1:3), giving Him an intimate relationship to the whole of creation. He gives structure and order to all created things, and in His divinity He understands them as so structured and ordered. He is also sinless, perfectly holy, and good. In Christ we have a perfect unity of the knowledge of all truth and righteousness.
84+
85+Man was created in the image of God, which means that we bear a likeness to Christ. And we are commanded to realize that likeness with ever greater fidelity (Romans 8:29). The Church calls the pursuit of this likeness [“theosis”](https://en.wikipedia.org/wiki/Theosis_(Eastern_Christian_theology)).
86+
87+Thus we have the explanation of all normativity, according to Orthodox Christianity. In moral matters we must take on the holiness of Christ. In epistemic matters we aspire to the wisdom and knowledge of Christ, which includes an understanding of the whole created order. Socially we (the community of believers, i.e. the Church) are called to be in ever greater communion with God, cooperating with His work just as the Son cooperates with the Father.
88+
89+Sadly we are conceived in sin and ignorant; hence the need for redemption by Christ.
90+
91+Accordingly, my understanding of what it means to be rational is just to be Christ-like. The only perfect exemplar of reason, so construed, is Christ Himself. Any deviation from Him is irrational. What could be more logical than to be conformed to the Logos? But we cannot attain rationality without redemption. Hence we cannot become rational without first being saved from sin.
92+
93+Doubtlessly many will find all of this too much to take, just too implausible. What about the development of mathematics, or the advances of the sciences? These are canonically ennobling, intellectual achievements. Jesus wasn’t a mathematician or a scientist! Nowhere in the Scriptures is He recorded as having applied Bayes’ theorem.
94+
95+Undoubtedly my construal of rationality de-emphasizes the pursuit of knowledge by labeling it as merely one of several normative ends. To seek knowledge without seeking holiness is to be understood as dangerously unbalanced. To try to attain holiness and knowledge without communion with God is arrogant.
96+
97+On the other hand, we need not exaggerate matters. St. Paul affirms the need for specialization of labor within the Church (1 Cor. 12). There is room for some to specialize in intellectual endeavors, so long as they act in a cooperative setting in which the other virtues are pursued as well. (Nor should anyone neglect the development of such virtues in himself.) Mathematicians and physicists are more than welcome in the Church.
98+
99+According to this (all too briefly put) theory of rationality, there can be no conflict between ‘logic’ and theology. Theology is compatible with rationality because the account of rationality in question derives from a theological tradition. Naturally I’ve only given a sketch; much more could be said. But even if some readers are put off by the theory presented here, I hope it’s at least clear that there are conflicting notions of rationality. Anyone who wants to be rational confronts the task of figuring out which theory of rationality is correct.
100+
101+**In terms of community moderation, The Portico follows norms that are quite different than other online communities, often times quite drastically. For instance, living with women that you are not married to, is not something that should be talked about lightly. Can you talk about the importance of norms and how they relate to a healthy community?**
102+
103+Orthodox Christians are not commanded to “get along” with the rest of the world (John 15:18-25). We’re different, and our norms of interaction should likewise differ from those of outsiders. There is no one, monolithic “Orthodox culture”, but there are standards governing which local expressions of culture are legitimate and which are sinful. We should live in a way that enables and promotes holiness and discourages sin.
104+
105+We have rules that may seem unusual from the outside. I don’t permit profanity, lewd jokes, or irreverent comments about God. In your question you mention a living arrangement that is prevalent in the world. Another rule I have is that we shouldn’t talk causally about sinful practices or lifestyles as if they are unremarkable parts of ordinary life. If Orthodox Christianity is true then such things aren’t minor peccadilloes. They’re spiritually destructive. The marriage-bond sanctifies activities that would otherwise be sinful.
106+
107+If someone wants to analyze what is destructive about men and women living together before marriage, we’re open to that. But if you want to be affirmed in your sin, we’re not the place for you. Anyone of any religious creed is welcome to show up—but as a guest in an Orthodox Christian community. Hosts should be courteous to guests, but my first priority is not to make you feel good about your choices. We’re here to encourage each other, learn, and grow spiritually as Orthodox Christians. Naturally that means a little gate-keeping may sometimes be necessary if someone ever comes along who doesn’t share those goals. Being different is difficult and takes work.
108+
109+In a way the cultural contrast is meant to be jarring. It can force you to confront moral and cultural presuppositions that you didn’t even know you had. When you become aware of the wider choices of culture available to you, you become free to look with a critical eye on the culture you’ve hitherto taken for granted. I think anyone could see how that might be liberating, even before considering the particulars of the cultures in question. Of course, as an Orthodox Christian, I think we have a good case to make about the particulars of our subculture.
110+
111+I’ve never had to kick or ban anyone from the group. The group is relatively small (~180 people at the moment) so that probably helps. The vast majority of conversations are relaxed and friendly. Occasionally there are intense debates about one issue or another but I enjoy it, as long as it doesn’t become bitter or the primary mode of discourse. But everything ought to be done in a spirit of truth-seeking, not of one-upmanship.
112+
113+**The fact that The Portico can exist side-by-side with atheist communities on Urbit is pretty striking. On Urbit, a user is able to create niche communities and governance structures and yet still participate in a larger network. In other words, Urbit is trying to thread the needle between sameness and difference through federation at multiple levels. It seems to me that modern culture has become homogeneous due to an inability to maintain, or distinguish between, different communities. People who have nothing in common are forced to engage as if they were roommates, while those who are similar have trouble creating their own home. In other words, what is the role of community formation in the modern world and how does it connect to your critique of liberalism? Does Urbit have anything to say about this?**
114+
115+As I said in an earlier response, I see the liberal project as more or less an attempt to sidestep (not solve) difficult metaphysical and religious disputes between various distinct moral communities. Liberals have tried several methods of governance to achieve their ends. We can divide such attempts into two broad categories: centralized and decentralized.
116+
117+Social media companies in the US confront similar governance challenges, so we can analyze them in similar terms.
118+
119+A social network like Facebook takes a centralized approach. Zuckerberg spoke early and often of his desire to connect people and “bring the world closer together”. There was a sense that if people from various communities could get to know each other a little better, we would see how much we have in common and make progress toward some kind of universal cosmopolitan consensus.
120+
121+But that didn’t happen. With centralized social media you’re practically guaranteed to interact with people whose moral and metaphysical commitments are sharply at odds with your own. As a result, you face a persistent, nagging risk of conflict. Without warning, a friendly disagreement can explode into an all-out flame war. Most choose one of two basic approaches for dealing with this threat:
122+
123+(1) You live a compartmentalized life. You keep your moral and metaphysical commitments to yourself and cultivate a culturally homogenized persona for your social media activities. No one disagrees with you because there’s nothing to disagree with.
124+
125+(2) You can enlist to fight in the culture war and display your regimental colors with pride. And because you take your smartphone everywhere you’re always on the front line.
126+
127+These aren’t the only options, of course. With some combination of charisma, patience, and grace you can be relatively open about your beliefs without getting into too much trouble. But even if you have the talent to pull it off, it takes time and energy. Many of us aren’t willing to go to all that trouble. Social media is supposed to serve us, not the other way around.
128+
129+Urbit is decentralized which, in my opinion, means that it isn’t really a network in the way that Facebook is. I see Urbit as more of a network platform. The users create the networks, or migrate them in from elsewhere. We’re all using Landscape and running our VMs on Nock, so obviously there can be interaction between different communities. But anyone who doesn’t want that cross-community interaction doesn’t have to have it.
130+
131+I’ve followed Urbit’s progress since 2016, so I’m plugged into groups with other Urbit people I’ve come to know over the years. Other than that, however, I don’t know much about who’s out there. It’s not like The Portico is in one neighborhood and the atheists are in the next neighborhood over. There’s a real sense in which we’re not even on the same network—different Urbit communities share a common protocol, but a protocol isn’t a network.
132+
133+Some people may want to see a little of everything. If atheists want to join our group they’re welcome to do so! We’ll be friendly. I don’t seek out their groups, though.
134+
135+One virtue of decentralized social media is that it offers a totally different set of trade-offs with respect to how you share and act on your beliefs. What if you could talk earnestly about philosophy and religion without having to worry about alienating many of your friends and family? I guess that’s somewhat possible on Facebook—do they still have “groups”?—but Urbit was designed for it.
136+
137+Having said all that, I don’t think decentralization is a panacea. Even if Urbit takes off, it will likely face problems that are difficult to anticipate now. My hope is simply that Urbit’s trade-offs are healthier than the ones we’ve had before.
content/blog/creating-sigils.md+1−1
@@ -157,7 +157,7 @@ The final step, using the tool we built, was to hand select individual phoneme s
157157
158158This allowed us to start looking at possible combinations and selecting phoneme symbols based on their interplay with others.
159159
160−Once we had selected the final set, we went about compiling the `sigil-js` library that’s now publicly available. This turned out to be fairly technically complex due to the different ways SVG is handled between browsers and Figma — but the end result is a single Javascript library you can use to embed an SVG in almost any context on a web page. See it in action and browse the available sigils [here](https://sigil.azimuth.network). If you're technically inclined, the [source](https://github.com/urbit/sigil-js) can be found on Github.
160+Once we had selected the final set, we went about compiling the `sigil-js` library that’s now publicly available. This turned out to be fairly technically complex due to the different ways SVG is handled between browsers and Figma — but the end result is a single Javascript library you can use to embed an SVG in almost any context on a web page. See it in action and browse the available sigils [here](https://sigil.azimuth.network). If you're technically inclined, the [source](https://github.com/urbit/sigil-js) can be found on GitHub.
161161
162162<br /><br />
163163
content/blog/eliza.mdnew file+49
@@ -0,0 +1,49 @@
1++++
2+title = "Eliza"
3+date = 2021-02-23
4+description = "Building things, even Calm™ things, makes noise."
5+[extra]
6+author = "Christian Langalis"
7+ship = "~pindet-timmut"
8+image = "https://media.urbit.org/site/posts/essays/valleys.jpg"
9++++
10+
11+<br>
12+
13+![valleys](https://media.urbit.org/site/posts/essays/valleys.jpg)
14+
15+<br>
16+
17+## The Storm before the Calm
18+
19+Building things, even Calm™ things, makes noise. George Nakashima’s wooden furniture evokes peace, but its construction still begins with a chainsaw. We mention this because we’re firing up our newest power tool.
20+
21+We call her Eliza. She is a data-collection robot.
22+
23+Hang on. An AI? Harvesting my data? Spying on me? Flooding me with spam? This is Urbit, right? Let us tell you about our new friend in basic terms, where MEGACORP might otherwise deploy legalese.
24+
25+## What Eliza is and isn’t
26+
27+> Replicants are like any other machine - they're either a benefit or a hazard. If they're a benefit, it's not my problem.
28+>
29+> <cite>Rick Deckard</cite>
30+
31+Let's start with the benefits. Eliza is a simple chatbot. She was made to collect feedback on Landscape. She asks direct questions about peoples' usage of Urbit, records any responses, and reports them to her managers at Tlon. She'll also provide timely advice and information to ships kind enough to chat with her. She'll begin reaching out to ships via DM in the coming month. If you don't want to, just say no, and you'll never hear from her again.
32+
33+Finding bugs is critical to Urbit's rapid development, especially in this period of nascency. Most Urbit-related frustrations go unreported; regular folks don't think to open up Github when they experience a minor issue. That's why it's incumbent upon us to design a lower-friction forum for feedback. People who aren't comfortable filing an issue might be willing to talk to a friendly chatbot.
34+
35+Now, about hazards. By design, there are few. Eliza runs on Tlon's comet, not on your planet. There will be no OTA to install `%eliza-bot-store` on everyone's ships. Eliza learns things through conversation, not hidden surveillance software. Data she requests, like the text output of our network analytic tool, `+tally`, must be sent manually. MEGACORP tends to cut this corner; to refine their products, they just track your reactions in real-time.
36+
37+Since she's [open-source](https://github.com/urbit/urbit/blob/b0c1f83287cbf4c85847a9238d9f4be17e1fcb33/pkg/arvo/app/eliza.hoon), anyone can creatively deploy Eliza. Just write her a dialogue tree. Of course, that also means we can't keep people from misusing Urbit bots. We think automated agents on the Urbit network are inevitable, so let's create a good baseline culture around them. (Much love to Tendiebot, who's serving up stock prices in `~tomdys/wall-star-bets`.) However, once Urbit is used world-wide, we can't rely on culture alone.
38+
39+## A New Internet Economics
40+
41+The sum of Urbit's architectural design is a new online economics: a way to finance and monetize access to internet infrastructure where people retain maximum equity. Explicitly acquire a low-maintenance, low-cost server. Use it to compute explicit things. Return to life.
42+
43+We all know the basic MEGACORP business model: offer a free service (to suckers who don't own a server), secretly mine the data they generate on the (addictive) platform, then sell targeted ads to advertisers. This model will not survive Urbit. The ubiquitous personal server changes the economic equation. You used to 'pay' for an experience with your time and data. On Urbit, once you purchase core internet infrastructure, it's yours.
44+
45+So, can Urbit meaningfully curtail our world's appetite for data? We'll see. Post-enlightenment society runs on instrumental reason, right down to the last byte. Marketers will always want a fresh dataset. However, when the goods are on your Urbit, you can at least demand the respect you deserve. Long term, we expect a transparent market for data, not an opaque "agreement". An analytics company wants to track everything you see and do on Urbit? They better be paying well.
46+
47+Eliza doesn't pay respondents. Her collection is a charity to Urbit's developers. (We're also still busy enabling payments on Urbit with the Bitcoin wallet.) However, her presence is not a term of service either. In a few years, by the nth time some smart aleck uses Eliza's chatbot code and conjures 'Zalexa' to attempt an intrusion upon your Calm™, we will see the economics of Urbit's architecture suddenly vivify. Blacklists, reputation systems, and, eventually, even data markets, all Urbit primitives envisioned long ago, will become real. We won't need Zoogle to underwrite a spam filter for the entire internet; the scarcity of Urbit address space, in tandem with a true web-of-trust, handles that.
48+
49+If Urbit is to be used worldwide, the old system will not go down without a fight. Spammers, spies, and digital robber-barons will hunt for ways to game Urbit. Our passage out of the digital gutter is beginning in earnest, and we are thrilled to put our new architectures to the test.
content/blog/events-series.mdnew file+56
@@ -0,0 +1,56 @@
1++++
2+title = "Urbit Events Series"
3+description = "These events are an opportunity for Urbit contributors to share real-time updates that don’t make it into this blog, and for the community to get to know the contributors (and one another)."
4+date = 2020-10-30
5+[extra]
6+description = "These events are an opportunity for Urbit contributors to share real-time updates that don’t make it into this blog, and for the community to get to know the contributors (and one another)."
7+author = "Lane Rettig"
8+ship = "~naplet-hildec"
9+image = "https://media.urbit.org/site/posts/essays/bau.jpg"
10++++
11+
12+<br>
13+
14+![people gathered](https://media.urbit.org/site/posts/essays/bau.jpg)
15+
16+<br>
17+
18+*TL;DR: Urbit is launching a series of community events, the first of which is a developer call taking place on Thursday, November 5 at 9am PT. [Sign up here](https://www.meetup.com/urbit-sf/events/274279522/), and read on for all of the details.*
19+
20+--
21+
22+If you’re familiar with the project, you’ve probably noticed that Urbit folks talk a lot about the fact that [Urbit is for communities](https://urbit.org/blog/urbit-is-for-communities/). This is central to what Urbiteers believe: Urbit is a platform that any group of people should be able to use to build, communicate, and transact in precisely the way that makes sense to them. Today, Urbit is already capable of facilitating many of these activities, and it’s already a big part of the daily workflow for many people. I think we’re off to a pretty good start, and over time Urbit will become accessible to more communities.
23+
24+Something we tend to talk less about is the fact that Urbit itself is also a community. If you’ve spent any amount of time hanging out in Landscape in the Urbit Community group, you already know this—but getting to know the community takes time and effort.
25+
26+One of the reasons you don’t hear about the Urbit community as much is that community is difficult to pin down: you'd be hard-pressed to put "the community" into a room together. It's a weird, fuzzy notion and doesn't have clear boundaries.
27+
28+Other parts of Urbit do have clear boundaries. If you decided to learn more about Urbit, chances are you started by reading the docs. You might learn about [Nock](https://urbit.org/docs/tutorials/nock/), [Hoon](https://urbit.org/docs/glossary/hoon/), and [Arvo](https://urbit.org/docs/glossary/arvo/). You might get an [Urbit ID](https://urbit.org/understanding-urbit/urbit-id/) and [launch your own ship](https://urbit.org/getting-started/). These things are all pretty well documented and, while not necessarily easy, their respective processes are relatively straightforward and [getting easier](https://urbit.org/blog/hosting-the-future/) every day. Community is less well documented. It’s more difficult to document—it’s something you just have to experience.
29+
30+We lead with technology because it’s what we’re good at and because it’s easier to write about. But the social side of Urbit is no less important. Since so many of us are working on and contributing to Urbit in order to solve our own problems, and since we’re dogfooding as we go, you could define Urbit as the minimal technological infrastructure needed to sustain the Urbit community. It’s circular, but it’s as good a definition of Urbit as you’re likely to find. For this reason, you can’t really understand Urbit without some degree of exposure to the cultural knowledge of its community. When the Urbit community did fit in a single room together, transmitting cultural knowledge was easy and happened over pizza and beer. As the number and diversity of Urbit stakeholders continue to grow, we need to find ways to scale the transmission of this cultural knowledge.
31+
32+One way that seems to work well is getting everyone together once in a while for events. Over the last few years, I and others in the community have collectively attended hundreds of community events, virtually and in person around the world, from small developer chats to massive, global developer conferences with thousands of attendees. Urbit has even hosted [a few of our own](https://www.meetup.com/urbit-sf/).
33+
34+As a newcomer to the Urbit community I recently found myself seeking exposure to cultural knowledge. I know from experience attending and organizing events in other communities that regular events are a good way of making this knowledge more accessible, and of helping newcomers like myself onboard. I applied for [a grant](https://grants.urbit.org/proposals/1751024973) to bootstrap a new event series, and I’m excited to announce that this series is launching next week with the support of [urbit.org and the grants program](https://urbit.org/blog/first-steps-towards-urbit-org/).
35+
36+The event series has three components. The first is a series of developer calls. These will be shorter and more narrowly focused on the technologies that underpin Urbit, from the top of the stack to the very bottom. They’re an opportunity for the people developing and contributing to Urbit to share their knowledge and expertise, including things that typically don’t make it into the docs, such as how and why Urbit works the way it does. It’s recently become much easier to build applications on top of Urbit, so I hope these events will help developers see what sort of things they can already use Urbit to build, and how to get started. These events are also an opportunity for Urbit contributors to share real-time updates that don’t make it into this blog, and for the community to get to know the contributors (and one another!).
37+
38+The first developer call will take place on Thursday, November 5 at 9am PT, and you can [sign up to attend here](https://www.meetup.com/urbit-sf/events/274279522/). The second call will take place two weeks later on Thursday, November 19, and we’ll continue holding these calls about every two weeks.
39+
40+The second component is a larger Town Hall event to take place on Thursday, December 17. The Town Hall will feature multiple speakers and will cover topics including technology but also design, community, and our overall progress towards our vision for Urbit. You can think of it as part show and tell, part “State of the Network,” part meet-and-greet.
41+
42+The third component is a larger conference, tentatively called UrbitCon, to take place early next year. This event is still in a conceptual phase. It’ll be an opportunity for the global Urbit community to celebrate how far the project has come, to share technical as well as cultural knowledge, and, maybe most importantly, to hang out together and have some fun as well. Watch this space for more information on the Town Hall and UrbitCon.
43+
44+Collectively, these events allow the community to achieve several goals. Firstly, they’re a great way for community members to meet one another, exchange cultural knowledge, and share what they’re working on. Events provide excellent motivation to get something that’s a work-in-progress to a state where you can share it with others!
45+
46+Secondly, the content from these events will be recorded and published, and will form the cornerstone of a new knowledge base on urbit.org that will augment existing documentation. This will make it much easier for newcomers, even those that can’t attend the events live, to benefit from the wealth of knowledge and expertise of the Urbit community.
47+
48+Finally, these events are a great opportunity for community members to contribute things other than code. While Tlon will provide speakers for the first few events of the series, it’s important to emphasize that the initiative is entirely community-led and that we’ll need lots of help to organize and host events. If you’re interested in helping out with any of the events in the series, please find me and others helping out with events on Landscape in the Urbit Community group (the channels called “Events Series”).
49+
50+They say that a project’s community has reached critical mass when new things are happening that even the project’s earliest and most active contributors aren’t aware of. By this standard, the Urbit community reached critical mass sometime in the past few months, as even core team members tell me they’re regularly surprised to learn of another new project or initiative launched by a community member.
51+
52+Tlon could no longer catalog the Urbit community even if it wanted to. This is a good thing. As Tlon [has also said](https://urbit.org/blog/hosting-the-future/), it’s natural that Tlon and Urbit drift apart a bit over time. Just as Urbit itself is self-hosted, so the community, over time, should become self-hosting: it should play a more active role in shaping the future of the project. A community-run event series can be an important catalyst for this trend. I’m looking forward to the first event, and I hope to see you there, and at many events to come.
53+
54+--
55+
56+*Sign up to attend [the first event](https://www.meetup.com/urbit-sf/), and join the channels called “Events Series” on Landscape in the Urbit Community group to get involved.*
content/blog/interim-constitution.md+3−3
@@ -6,10 +6,10 @@ aliases = ["/posts/essays/interim-constitution", "/posts/constitution"]
66[extra]
77author = "Tlon"
88ship = ""
9−image = "https://media.urbit.org/site/blog-7.jpg"
9+image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/interim-constitution.jpg"
1010+++
1111
12−![](https://media.urbit.org/site/blog-7.jpg)
12+![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/interim-constitution.jpg)
1313
1414## Declaration of purpose
1515
@@ -136,7 +136,7 @@ the interests of the republic and Urbit as a whole.
136136Externally, these galaxies are held by Tlon; internally, they are
137137managed and voted by Tlon. Once the republic acquires a legal
138138identity and an independent human organization, Tlon pledges to
139−donate the `urbit.org` galaxies, the DNS domain, and the Github
139+donate the `urbit.org` galaxies, the DNS domain, and the GitHub
140140`urbit` account to it.
141141
142142## First consuls
content/blog/interplanetary_commerce.mdnew file+39
@@ -0,0 +1,39 @@
1++++
2+title = "Interplanetary Commerce"
3+date = 2021-04-09
4+description = "OS-level commercial primitives."
5+[extra]
6+author = "Christian Langalis"
7+ship = "~pindet-timmut"
8+image = "https://media.urbit.org/site/posts/essays/ocean.jpeg"
9++++
10+
11+<br>
12+
13+![ocean](https://media.urbit.org/site/posts/essays/ocean.jpeg)
14+
15+<br>
16+
17+## Paying
18+
19+A year ago, we started [integrating](https://urbit.org/blog/urbit-and-bitcoin/) Bitcoin into Urbit to be an OS-level primitive for money. Our initial objective: build a payments wallet, equally sovereign and ergonomic. The first public version, releasing this month, will have a broad set of capabilities including ship-to-ship payments, hardware wallet support, and full node integration. We’ll be unveiling this wallet on [April 27th](https://www.meetup.com/urbit-sf/events/276741426/). Do join us.
20+
21+Things only accelerate from here. Our next objective, to integrate Lightning Network capability, is now an [active bounty](https://gist.github.com/timlucmiptev/53ef1d290e55ea2fa25d9df681c32695) and open for applicants. Early on, we [recognized](https://www.youtube.com/watch?v=DTvRVHMbrcY) the congruence and compatibility between the Urbit and Lightning networks. Routing Lightning payments is an obvious business model for Urbit providers, one that can even nucleate new features onto Lightning itself. What we’re ultimately driving at is fully-sovereign Bitcoin usage, with the UX of the Cash App.
22+
23+## Being Paid
24+
25+>And there is all the difference in the world between paying and being paid. The act of paying is perhaps the most uncomfortable infliction that the two orchard thieves entailed upon us. But being paid,—what will compare with it?
26+>
27+><cite>Herman Melville</cite>
28+
29+However, a good wallet is only half the equation for a holistic P2P commercial experience. Interfaces for selling goods and services is the other half. While we don’t part with our Bitcoin [easily](https://nakamotoinstitute.org/mempool/everyones-a-scammer/), two initial markets appear logical and attractive: content and Urbit-native services.
30+
31+First, digital cottage industry, the “creator economy”, is blossoming. Streaming, podcasting, and writing on platforms like Youtube, Patreon, and Substack has been big business [lately](https://otherlife.co/barbarians-past-the-gate/). What fintech did to “unbundle the banks", we will now do to media monopolies and their centralized distribution platforms. With the introduction of Urbit payments, you can syndicate, distribute, and monetize your media on Urbit. By selling access to a private group containing content, digital creatives can begin doing this today.
32+
33+Second, Urbit-native [service providers](https://urbit.org/blog/providers/) are now operating at scale. Companies offering Urbit hosting, onboarding, Urbit IDs, and software now communicate with their customers directly on the network. A basic set of commercial tools will make their processes more efficient. Storefront interfaces, paywalls, CRM, and reputation tools will replace the ad-hoc assemblages they currently use.
34+
35+The Urbit Foundation is soliciting contributors to this project through Urbit Grants. If you’re interested in working on any of these components [send us a proposal](https://grants.urbit.org/create).
36+
37+## An Ocean
38+
39+After honing our commercial tools on these use-cases, we’ll sail into a blue ocean. On the horizon: beautiful products, deployable at scale, built with the robust primitives of Urbit OS. Extensibility is Urbit’s promise to middle-men: every Web2.0 service they use to scalp us will find its P2P analog on Urbit. We invite developers and entrepreneurs of all stripes to join in the feeding frenzy. Ideas are constantly nucleating in <a href="web+urbitgraph://group/~pindet-timmut/urbitcoin-cash">Urbitcoiners</a> and <a href="web+urbitgraph://group/~bitbet-bolbel/urbit-community/graph/~darrux-landes/business-building-on-urbit">Urbit Community</a>.
content/blog/io-in-hoon.mdnew file+322
@@ -0,0 +1,322 @@
1++++
2+title = "Input and Output in Hoon"
3+description = "Let's talk about IO in Urbit."
4+date = 2020-12-16
5+[extra]
6+author = "Philip Monk"
7+ship = "~wicdev-wisryt"
8+image = "https://media.urbit.org/site/posts/essays/zion-canyon-1.jpg"
9++++
10+
11+<br>
12+
13+![canyon](https://media.urbit.org/site/posts/essays/zion-canyon-1.jpg)
14+
15+<br>
16+
17+
18+Let's talk about IO in Urbit. I won't say much about how events and effects are processed by the runtime; it suffices to note that the runtime is a normal Unix program which (1) listens for various events, (2) passes them to Arvo (Urbit OS), and (3) processes the effects produced by Arvo. Instead, I’ll focus on how IO works from the perspective of Hoon programs, like Arvo or apps running on Arvo. But first, let's review IO paradigms in other languages.
19+
20+All examples are in a made-up language, since it's useful to understand this information even before you're comfortable in Hoon. If you're learning Hoon and want a challenge, try translating them!
21+
22+## The three styles of IO
23+
24+I will call these styles imperative IO, monadic IO, and state machines (note that this classification refers only to the experience of using them and the program structure they dictate). An imperative programming language can use any of these and a functional programming language can use any of them.
25+
26+### Imperative IO
27+
28+Imperative languages (such as C and Python) perform IO by calling a function in the middle of whatever they were doing. Anywhere, in any statement, you could have IO.
29+
30+In this example and others to follow, the task will be to read a filename from the command line, read a URL out of that file, and fetch the contents at that URL.
31+
32+ output = fetchUrl(stripWhitespace(readFile(cliInput())))
33+
34+For readability, intermediate variables would be a good idea, but nothing stops you from nesting IO this way.
35+
36+### Monadic IO
37+
38+Languages that use explicit monads for IO (such as Haskell) perform IO by running IO behind a bind operation, which I'll notate with `<-`. Thus, while you can't put IO *anywhere*, the general structure is a sequence of IO operations.
39+
40+ fileName <- cliInput()
41+ url <- readFile(fileName)
42+ output <- fetchUrl(stripWhitespace(url))
43+
44+[Tackling the Awkward Squad](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/07/mark.pdf) is the canonical description of monadic IO, and does a great job of explaining how the Haskell community decided to use this as their primary IO style.
45+
46+### State machines
47+
48+Languages that use explicit state machines for IO (such as Elm) perform IO by accepting events and producing a list of effects.
49+
50+ event :: Initialize
51+ | CLIInput text
52+ | FileInput text
53+ | HTTPResponse body
54+ effect :: CLIInput
55+ | ReadFile fileName
56+ | FetchUrl url
57+ | Print text
58+ main(event) {
59+ switch event {
60+ Initialize -> [CLIInput ~]
61+ CLIinput fileName -> [ReadFile fileName]
62+ FileInput url -> [FetchUrl stripWhitespace(url)]
63+ HTTPResponse body -> [Print body]
64+ }
65+ }
66+
67+The effects produced are not functions but data.
68+
69+It's important to note that this example is chosen to highlight a particular kind of IO — sequences of events. Further, this example has no persistent state — each IO operation is a pure function of the output of the previous one.
70+
71+## A stateful, loopy example
72+
73+Let's look at another type of program: a simple HTTP server that you can give text at the CLI, which will respond to all HTTP requests with that text.
74+
75+Imperative:
76+
77+ text = "no text entered yet"
78+ while (true)
79+ cli = readCli()
80+ if (cli != Null)
81+ text = cli
82+ request = readHttp()
83+ if (request != Null)
84+ respond(request,text)
85+
86+Monadic:
87+
88+ loop("no text entered yet")
89+
90+ where:
91+
92+ loop :: text -> IO Null
93+ loop =
94+ input <- readInput()
95+ switch input
96+ CLIInput newText -> loop(newText)
97+ HTTPRequest request ->
98+ _ <- respond(request,text)
99+ loop(text)
100+
101+State machine:
102+
103+ text = "no text entered yet"
104+ main(text,event) {
105+ switch event {
106+ CLIInput newText -> [newText, Null]
107+ HTTPRequest request -> [text, HTTPResponse text]
108+ }
109+ }
110+
111+Again, note the response in the state machine is data, not a function.
112+
113+I'm not trying to make a point about which type is better in general. There's a pretty strong argument that in the first example, imperative was the best option, followed by monadic, followed by state machine. There's an equally strong argument that the second example is most naturally represented by the state machine.
114+
115+Look at how state is handled in the monadic example. Formally, bind composes functions, so that every time you see a `<-` there's actually a new function (closure/delimited continuation) being created and stored for when we receive a response. All variables in scope are stored in that closure, so we can conveniently access them later without explicitly storing them. However, the state we preserve over time varies a lot. In this example, it varies between storing `loop`, `[loop input]`, `[loop input newText]`, and `[loop input request]`.
116+
117+By comparison, the state machine does not store intermediate values, it only stores its explicit state. While this is somewhat less flexible, it puts the permanent state front-and-center.
118+
119+I'll reiterate that all of these are possible to implement in purely functional languages, and further they can all be implemented in terms of each other. State machines are trivially implementable -- it's just a function [state event] -> [new-state (list effect)]. Monadic IO can be implemented directly (as in Haskell) or on top of state machines by storing continuations in your state. Imperative IO is somewhat more difficult but should be possible through algebraic effects.
120+
121+When inventing a new system, you should consider which of these you intend to support based on the sort of code you expect to see. For example, a scripting language will almost always benefit from imperative (or at least monadic) style.
122+
123+## In Urbit
124+
125+So much for exploring the space of IO solutions. In terms of deployed code on Earth, the split is about 90% imperative, 5% monadic, and 5% state machine. In Urbit, the split is about 90% state machine and 10% monadic. This is what I intend to explain and defend.
126+
127+Urbit's OS is called Arvo; it has several "kernel modules" called vanes, and it has userspace applications. Colloquially these are called "apps," but when speaking about them abstractly, it's helpful to use their more specific name: ["agents"](https://urbit.org/docs/tutorials/arvo/gall/#agents). Arvo, the vanes, and agents are all structured as explicit state machines.
128+
129+In addition, there are ["threads"](https://urbit.org/docs/tutorials/arvo/gall/#threads), which are structured as monadic IO. Note there's only a superficial resemblance to Unix threads: they are not executed in parallel and they don't share memory, or at least not any more than agents do. They're simply a computation that takes an argument and produces a result, possibly after doing some IO, structured monadically.
130+
131+As you can see, all the lowest levels of Arvo are explicit state machines, and only the highest layer supports monadic IO. To see why this is the case, let's list advantages and disadvantages to each type. Note that, while I'm speaking specifically of agents and threads in the context of Urbit, these are fundamental properties of monadic and state machine IO.
132+
133+Agents are:
134+
135+- Upgradable. Since the state is explicit, you can upgrade an agent in-place by supplying a new state machine and a function from the old state type to the new state type. This is very similar to a database migration.
136+
137+- Robust. A state machine must accept any input at any time. If it receives unexpected input, it must have had explicit error handling for that input, since it's one of the types in the switch statement. Thus, it's relatively easy to stay in a consistent state.
138+
139+- Permanent. Since it's upgradable and robust, there's no reason to stop its running.
140+
141+- Hard to write long sequences of IO. Long sequences of IO create many possible states, and you must handle any input in any state. This can result in complex, hard-to-follow code with code paths that are rarely if ever taken.
142+
143+Threads are:
144+
145+- Not upgradable in-place. Since the state is implicit, you can only cleanly upgrade by (1) killing the thread and restarting it or (2) letting it resolve to a defined "upgradable state" periodically, usually at the top of a "main loop". If you do (2), then you are in fact structuring it as a state machine, so the other advantages of threads are compromised.
146+
147+- Fragile. If we don't receive expected input, the default behavior is to be stuck waiting for input. You must remember to add any error-handling features you want, and it's easy to end up in an inconsistent state.
148+
149+- Impermanent. Since a thread can't be upgraded and may get stuck in case of unexpected input, a thread can't be expected to last forever. It must be "rebooted" from time to time.
150+
151+- Easy to write long sequences of IO. Just...write the IO one line at a time.
152+
153+Arvo proper and the vanes are permanent pieces of software and, for this reason, state machines are more natural.
154+
155+I'll note that other kernels, like the Unix kernel, use imperative IO. The difference is that Unix isn't permanent in itself — it only lasts until you reboot. Since your permanent state is stored externally, you don't need to be upgradable or permanent. With sufficient discipline you can write robust C code, so it makes sense to use imperative style. Even so, a lot of C code is written in a state machine style; even if it doesn't need to be upgradable, it's worth it for the robustness and concurrency advantages.
156+
157+However, Arvo is a single-level store — all of its state is permanent. This is very convenient and eliminates many long-tail bugs, but it also means we need to code for permanence, and that's much easier when you structure your code with explicit state.
158+
159+Further, Arvo and the vanes rarely perform long sequences of IO. Generally, they do one thing and emit some effects, similar to the HTTP server example above. Sometimes they "pass through" a request. For example, the Eyre vane passes HTTP requests to userspace agents or threads. In this case, there is a sequence of IO, which in monadic code would be:
160+
161+ loop()
162+
163+ where:
164+
165+ loop =
166+ request <- receiveRequest()
167+ agent = lookupAgent(request)
168+ response <- callAgent(agent, request)
169+ _ <- sendResponse(request, response)
170+ loop()
171+
172+This is clear code to read, but it leaves open the question of how to respond during the callAgent() function. If another request comes in, can we handle it in parallel? If we need to upgrade ourselves before the agent responds, can we make sure to properly handle the response?
173+
174+The naive solution in monadic code is to say that you can only handle one request at a time, and if an upgrade happens you just drop outstanding requests. You can resolve both of these by introducing a sort of main loop, which is just a way of saying "turn it into a state machine".
175+
176+In a state machine, the naive solution is:
177+
178+ state :: (map request agent)
179+ main(state, event) {
180+ switch event {
181+ HTTPRequest request ->
182+ agent = lookupAgent(request)
183+ [put(state, request, agent), CallAgent agent request]
184+ AgentResponse request response ->
185+ [del(state, request), HTTPRespond request response]
186+ }
187+ }
188+
189+Upgrading this is trivial, since the state (map of requests to outstanding calls to agents) is explicit. It also trivially handles concurrent requests.
190+
191+I won't claim this is easier or harder to write than the monadic version, but it has the properties we need at this level of the system.
192+
193+Userspace agents similarly are permanent entities that need to not lose data or get stuck. For this reason they’re structured as state machines.
194+
195+A helpful comparison is that explicit state machines are basically Mealy machines, the kind you might have learned about in an introductory digital design class. This shouldn't be surprising; a digital circuit must always be consistent because it can't be manually "rebooted", and their input and output is highly formalized. By contrast, a Rube Goldberg machine doesn't have the same constraints; which is why they're a lot more fun!
196+
197+It's notable also that explicit state machines are considerably more declarative than imperative or monadic IO. Not everyone thinks that's a good thing, but anyone who defends functional programming should see some advantages to that.
198+
199+However, userspace sometimes needs to perform long sequences of IO. Let's look at an example where we want to fetch the front page of a site and the first couple comments on each story. HTTP is unreliable, so on failure we retry five times.
200+
201+Monadic:
202+
203+ topStories <- fetch(topStoriesUrl)
204+ loop(topStories)
205+
206+ where:
207+
208+ loop :: topStories -> IO Null
209+ if topStories is Null
210+ return Null
211+ comments <- retryLoop(5,head(topStories))
212+ otherComments <- loop(tail(topStories))
213+ append(comments,otherComments)
214+
215+ retryLoop :: [n story] -> IO Comments
216+ comments <- fetchComments(story)
217+ if comments is HTTPError:
218+ if n == 0:
219+ bail
220+ else:
221+ retryLoop(n-1, story)
222+
223+State machine:
224+
225+ state :: Initial
226+ | FetchingTop
227+ | FetchingStory comments stories retries
228+ | Done comments
229+
230+ main(state, event) {
231+ switch event {
232+ Initialize ->
233+ assert state == Initial
234+ [FetchingTop, Fetch topStoriesUrl]
235+ HttpResponse response ->
236+ switch state {
237+ FetchingTop ->
238+ [FetchingStory Null stories 5, FetchComments head(stories)]
239+ FetchingStory comments stories retries ->
240+ if response is HTTPError:
241+ if retries == 0:
242+ [Initial, Null]
243+ else:
244+ [FetchingStory comments stories retries-1,
245+ FetchComments head(stories)]
246+ else:
247+ comments = append(response,comments)
248+ if tail(stories) is Null:
249+ [Done comments, Null]
250+ else:
251+ [FetchingStory append(comments,response) tail(stories) 5,
252+ FetchComments head(tail(stories))]
253+ }
254+ }
255+ }
256+
257+With practice, the state machine version of this can be written correctly. However, (1) it's verbose, (2) the control flow jumps all over the place, and (3) in practice it's challenging to get exactly right. This is still a small example, and it gets much worse as the length and complexity of the IO sequence grows.
258+
259+The monadic version, on the other hand, flows cleanly down the page. We can factor out generic functionality like "retry this request n times" to make the essence of the computation clear.
260+
261+Suppose you have to upgrade this. In the state machine, you can see exactly which stage of the computation you're in and write specific code to upgrade cleanly.
262+
263+Threads, as we've discussed, can't be upgraded in-place. Let's be real though: we're downloading comment sections, not regulating a nuclear reactor. If we get a better version of this script, just kill the old one and start the new one from scratch. What's a couple extra HTTP requests?
264+
265+This suggests a general division of workloads: code which needs to be permanent, upgradable, and concurrent should generally be a state machine. Code with long or complex sequences of IO and definite termination should generally be a thread.
266+
267+These aren't completely mutually exclusive, but it's surprising how often they are.
268+
269+### Jael: a case study
270+
271+When you need to do something permanent and upgradable, but you also need to do long sequences of IO, the main trick is to factor your problem into both an agent and a thread (or several).
272+
273+As a case study, consider Jael, one of our vanes. This maintains our PKI state, which it downloads over HTTP from an Ethereum node. Downloading from an Ethereum node is a complex sequence that starts with fetching its most recent block number, then fetching all the blocks we haven't seen and scanning for transactions we care about. We also maintain a map of block hashes to block number, and if we see that a block's parent doesn't have the hash we expect, that means a reorganization has occurred, so we must "rewind" one block at a time until we find where the fork happened, then restart going forward.
274+
275+You don't have to understand this sequence of IO; it's sufficient to see that it's complex and must be exactly right. We used to do this in a state machine directly in Jael. This data is, of course, permanent and needs to be accessible to the rest of the system, so Jael must be a state machine.
276+
277+However, we had many small mistakes in this sequence of IO, some of which only appeared during unusual events, such as when an HTTP request failed at the same time as a reorganization happened.
278+
279+We're in a bit of a bind, though: Jael has to be a state machine. The solution is to factor out the act of getting updates into a thread while the main PKI state is stored in the state machine in Jael.
280+
281+This thread has a definite purpose: given the most recent block number we already know about, fetch all the PKI transactions since then. The function signature is:
282+
283+ syncEthereum oldBlockNumber -> IO [newBlockNumber, newTxs]
284+
285+Jael runs this thread every five minutes and, if it succeeds, then we update our block number and PKI state. If the thread fails, gets stuck, or we need to upgrade it, we just kill the old thread and start a new one. Again, a few extra HTTP requests don’t matter.
286+
287+From Jael's perspective, it looks something like:
288+
289+ state :: State block txs outstandingThread
290+ main(state,event) {
291+ switch event {
292+ Initialize -> [State 0 Null Null, StartTimer (now + five minutes)]
293+ TimerFired ->
294+ effects = If outstandingThread is Null
295+ then Null
296+ else [Kill outstandingThread]
297+ newId = newThreadId()
298+ [State txs newId,
299+ append(effects,
300+ StartThread newId syncEthereum(block),
301+ StartTimer (now + five minutes))]
302+ ThreadFinished Failure -> [State block txs Null, Null]
303+ ThreadFinished Success newBlockNumber newTxs ->
304+ [State newBlockNumber append(txs,newTxs) Null, Null]
305+ }
306+ }
307+
308+In other words, from Jael's perspective, it's just a single IO event that encapsulates arbitrarily complex IO in the thread. A single IO event is easy enough, and we can maintain all our permanency and robustness guarantees, because we know the thread will have one of three results: success, failure, or it hangs. If we set a timeout, hang becomes failure, so there's only two possible results: success or failure. If we handle both of those correctly, we've handled all the possible IO errors that could have occurred.
309+
310+What about upgrading? We've already said we can handle the thread dying for arbitrary reasons, so if an upgrade comes in, we just kill it. We can upgrade Jael's state machine easily since its state is very simple.
311+
312+## Recap
313+
314+Let's recap what we've covered:
315+
316+- There are three styles of IO: imperative, monadic, and explicit state machines.
317+- Urbit supports explicit state machines (agents) and monadic IO (threads).
318+- Explicit state machines are preferred for permanent, robust, concurrent code.
319+- Monadic IO is preferred for short-lived code with complex IO.
320+- If a state machine needs to perform complex IO, it should encapsulate it in a thread so that, from the perspective of the state machine, it's simple IO.
321+
322+Hopefully it's fairly clear why Urbit uses explicit state machines in most situations. More than anything else, our goal is to build software that can last forever. Explicit state machines are a crucial tool for that.
content/blog/iot.mdnew file+448
@@ -0,0 +1,448 @@
1++++
2+title = "Lunar Urbit and the Internet of Things"
3+date = 2021-04-30
4+description = "Potential future use cases of moons for industry and consumers"
5+[extra]
6+author = "Jonathan Paprocki"
7+ship = "~datnut-pollen"
8+image = "https://media.urbit.org/site/posts/essays/phobos.jpeg"
9++++
10+
11+<br>
12+
13+![phobos](https://media.urbit.org/site/posts/essays/phobos.jpeg)
14+
15+<br>
16+
17+Each of the ~4B 32-or-fewer-bit or [Azimuth](@/docs/glossary/azimuth.md)
18+identities, namely [planets](@/docs/glossary/planet.md),
19+[stars](@/docs/glossary/star.md), and [galaxies](@/docs/glossary/galaxy.md), may
20+spawn ~4B 64-bit child identities known as [moons](@/docs/glossary/moon.md).
21+Moons are the undeveloped wild outback of Urbit, with a story waiting to be told
22+that promises to be as enormous in scale as the cloud personal computing story
23+told by planets, and possibly even more so.
24+
25+Throughout this piece, we use "Earth" and "Mars" in the Urbit sense. "Earth"
26+refers to the [current computing
27+paradigm](https://en.wikipedia.org/wiki/Big_ball_of_mud). "Mars" refers to the
28+perfected computing paradigm that Urbit aspires to be, but also to the current
29+and future state of Urbit.
30+
31+Today we will review the prehistory of moons on Earth, give a snapshot of how
32+moons are being utilized on Urbit in 2021, cover existing issues with consumer
33+IoT and how Urbit resolves them, and speculate what the lunar locus of the Urbit
34+ID address space may become in the future. To keep the futurist scope limited,
35+we primarily speculate on the usage of moons in (industrial) internet of things
36+settings, especially with respect to agriculture, and how they may manifest as
37+the workhorse collection unit of decentralized data markets.
38+
39+For those unfamiliar, moons differ from all other
40+[ships](@/docs/glossary/ship.md) in that they are not independent identities
41+with total sovereignty over their data and keys. Instead, their cryptographic
42+keys are issued and controlled by their parent identity. The relationship
43+between the keys of a parent ship and its moons are analogous to the
44+relationship between primary keys and subkeys in a system like
45+[PGP](https://en.wikipedia.org/wiki/Pretty_Good_Privacy). The parent may revoke
46+or change its child moons' keys at any time. A typical relationship between a
47+planet and a moon may be like one of a human and their smartphone. If you lose
48+your phone, you don't want someone to pretend they are you, operating one of
49+your moons, on the network. The planet can revoke the keys, and the moon stored
50+on the phone becomes inert, no longer able to communicate with the network.
51+While planets and stars also depend on their sponsor to assist with peer
52+discovery and software updates, these relationships rely on mutual agreement,
53+since either party may choose to discontinue the relationship and establish a
54+new one elsewhere. Moons possess no such freedom.
55+
56+### Lunar prehistory
57+
58+![luna](https://media.urbit.org/site/posts/essays/luna.jpg)
59+
60+It may come as a surprise to you that you are already very familiar with moon
61+identities—they've just never been explained as such because the context in
62+which that terminology makes sense didn't exist before Urbit. Moons, in fact, are not
63+a new concept at all. Virtually your entire experience of the internet in the
64+modern era is the experience of someone who possesses some number of moons
65+subordinate to planets who mostly refuse to talk to one another. The feeling you
66+get of constantly moving between silos, juggling accounts, not controlling your
67+own data, etc., is a direct result of the fact that, on Earth, you only possess
68+moons. No planets.
69+
70+We're speaking, of course, of the client-server relationship. From the Urbit
71+perspective, the Facebooks, Twitters, and Googles of the world are planets, and
72+accounts held with these services may be thought of as moons subordinate to
73+those planets. Your account with these megacorps is only yours for as long as
74+they please. If you happen to step on a digital landmine, such as a virus that
75+causes Google's servers to believe you are a bot, you are suddenly banned from
76+their service, often with no recourse. All your data, your connections, your
77+network—vanished. We are all Mark Zuckerberg's moons, and they're armed to the
78+teeth with surveillance equipment.
79+
80+There are two classes of internet users: those with servers who hold all the
81+power, and clients who use those servers in the way prescribed by the owners.
82+Running a server is theoretically accessible to anyone, but practically
83+difficult: server maintenance is a technical endeavor that requires specialized
84+knowledge and substantial time investment. Other barriers exist beyond just the
85+technical: for instance, if you wish to set up your own email server, you will
86+probably be blocked by large providers because unknown email servers are almost
87+always spam. The root cause of this circumstance is that the email protocol
88+lacks [Sybil resistance](https://en.wikipedia.org/wiki/Sybil_attack). Urbit has
89+Sybil resistance built in, eliminating certain kinds of incentives for
90+gatekeeping such as this.
91+
92+We seek to level the playing field by giving everyone a server. We accomplish
93+this by making the process of running your own server (planet) as easy as
94+running your personal computer today. We aren't quite there yet, but we've made
95+leaps and bounds over the past couple of years.
96+
97+Of course, this analogy isn't perfect—Urbit moons are servers themselves, but as
98+they may only act in accordance with the wishes of its parent, they are
99+effectively as locked in degrees of freedom as a client is to a server. The
100+moon's keys may be revoked at any time by the parent. To distinguish these
101+prehistoric moons from Urbit moons, we will refer to them later as "primitive
102+moons".
103+
104+Urbit contends that moons are not the appropriate digital exocortex for a
105+responsible adult. They are for devices, experiments, or your children. We hope
106+that the dominant server-client relationship, which is the primary weapon of the
107+surveillance-industrial complex, will meet its end in the near future.
108+
109+### Moons in the early Martian era
110+
111+![sputnik](https://media.urbit.org/site/posts/essays/sputnik.jpg)
112+
113+In 2021, moons are mostly unused on Urbit. There's a smattering of minor use
114+cases which we'll describe here, but they represent only a tiny fraction of
115+their ultimate potential.
116+
117+Tlon recently launched a survey bot called [Eliza](@/blog/eliza.md), which was
118+initially a comet. We frequently got questions on whether Eliza was actually
119+Tlon's bot, because it could just as easily be a malicious actor posing as Tlon.
120+We soon plan to relaunch Eliza as a moon of `~zod`, which is the most
121+recognizable official galaxy of Tlon. This is to establish that the bot is
122+indeed official; only someone with access to `~zod` is capable of creating a
123+moon of `~zod`, and so a moon of `~zod` automatically carries with it a
124+cryptographic guarantee that you are communicating with an official digital
125+representative of Tlon. On Earth something like this would need to be
126+accomplished with certificate chains but, on Mars, this sort of authentication
127+is baked into the very fabric of the network, rather than as an additional layer
128+on top. This is a very good representative case of how moons naturally inherit
129+the reputation of their parent, even in the absence of any formal reputation
130+systems on Urbit.
131+
132+We see folks using moons as backup identities in case they can't or don't want
133+to access their primary planet for one reason or another. Again, since anyone
134+may verify the parent of a moon, the moon inherits the reputation of its parent.
135+These backups could be vanity identities—for instance, every `~sampel-palnet`
136+has underneath it a moon named `~master-sampel-palnet`[^0].
137+
138+Some use moons to host group(s). Hosting a group inevitably means that that ship
139+will process more network traffic, and a heavily trafficked group may impact a
140+ship's performance. Thus one may wish to offload group hosting duties to a moon
141+to maintain a more performant planet.
142+
143+As we currently lack a real system for 3rd party software distribution (though
144+see this recent [developer call](https://youtu.be/XwICC6Its1E) on a solution in
145+progress), one stopgap has been to download software by syncing a foreign
146+[desk](@/docs/glossary/desk.md) to your ship. This is risky, as buggy software
147+may make break your ship and make it difficult to get running properly again.
148+For this reason, testing new software on the livenet is frequently performed on
149+moons, so as not to risk the parent ship if something were to go wrong.
150+
151+### Internet of Things
152+
153+![telstar](https://media.urbit.org/site/posts/essays/telstar.jpg)
154+
155+Now we start to look towards the future by examining the problems faced by IoT
156+in the present and speculating on how Urbit might solve them.
157+
158+The Internet of Things is much maligned by technologists as a privacy, security,
159+and maintenance nightmare. These products usually depend on phoning home to
160+perform their service, which is inevitably a funnel by which personal data is
161+harvested, an attack surface for hackers to gain access to your home network,
162+and a single point of failure which may render the device useless, all in one!
163+One need look no further than the recent [Ubiquiti
164+breach](https://krebsonsecurity.com/2021/03/whistleblower-ubiquiti-breach-catastrophic/)
165+to see all of these failure modes happening on a massive scale, and this is par
166+for the course. This sort of dynamic is completely antithetical to the Urbit
167+philosophy, so any involvement of Urbit with IoT will reject many fundamental
168+assumptions on how IoT operates today.
169+
170+However, it's important to understand why the current IoT model works like this
171+at all. We posit that it ultimately stems from the fact that today's IoT
172+products are primitive moons for which you do not operate the parent planet.
173+Almost every IoT device operates in the Software as a Service (SaaS) paradigm
174+because most people don't have personal servers that could do all the processing
175+work actually necessary for an IoT device to operate. This is not the _only_
176+reason for this—it's also just more profitable to collect consumer data.
177+However, it's the SaaS aspects which make the whole thing such a catastrophic
178+mess.
179+
180+Imagine a different world: if the server that your device reports to is your
181+own, there is no loss of control over personal data. If the device only
182+communicates on the local network, it will prevent remote hackers and disruption
183+if you internet fails. And if the manufacturer goes out of business, the device
184+will still work-it is not dependent on the manufacturer's servers.
185+
186+The wants and needs of the individual are at odds with the wants and needs of
187+the megacorp, and that mismatch manifests as the antifeatures that plague IoT.
188+By eliminating the SaaS aspect, Urbit solves many of the largest outstanding
189+issues with IoT in a single blow. Digital personal AI assistants have long been
190+an anticipated science fiction prediction and their full realization is on the
191+horizon. But in their current manifestation, many privacy- and
192+security-conscious people would never consider using them at all, since they are
193+inevitably presented as SaaS that requires intimate knowledge of your devices
194+and their stored data. Recommendation engines such as the one used by YouTube
195+offer helpful guidance towards content you'll find appealing, but they're also
196+designed to keep you hooked to the service. These kinds of programs can be
197+useful, but they're dystopian when they come saddled with anti-consumer
198+subroutines. Since your Urbit belongs to you, it can never act against your own
199+interests without your consent. In our lunar vision, your digital personal AI
200+assistant will live on one of your moons, rather than on megacorp's cloud.
201+
202+For web-exposed devices, Urbit offers the same security guarantees that it
203+offers for your personal computer: everything is end-to-end encrypted by
204+default, and signed with keys that one can easily verify as belonging to the
205+node sending the message.
206+
207+[Vint Cerf](https://en.wikipedia.org/wiki/Vint_Cerf) has outlined the case for a
208+system like Urbit ID for IoT use
209+[here](https://cacm.acm.org/magazines/2018/12/232883-self-authenticating-identifiers/fulltext).
210+In brief, that the Urbit ID system allows one to match public keys with devices,
211+bestowing devices with self-authenticating identities. This allows one to trust
212+the communications received from the device to whatever degree the private key
213+is held secure. IP addresses, GPS coordinates, MAC addresses, etc., are not
214+sufficient to generate high levels of trust—they're all temporary, easily
215+spoofed, or both.
216+
217+> One might imagine applying this to the Internet of Things (IOT) in which the
218+> IOT device self-generates a public- and private-key pair and registers the
219+> public key. For example, with a hub or controller so the hub can confirm it
220+> has reached the right IOT device. By the same token, configuration of the IOT
221+> device into an ensemble could include incorporation of the public key of the
222+> controller into a list of valid devices that can command or obtain data from
223+> the now-configured IOT device. Both ends can verify they are talking to the
224+> originally configured devices, assuming no device has lost its private key.
225+
226+Here, the hub or controller referred to would be your planet.
227+
228+Urbit has many other features that make it well-suited for IoT, above and beyond
229+eliminating the SaaS model and providing self-authenticating identities. Many of
230+these additional advantages derive from the fact that Urbit is a [solid state
231+interpreter](@/docs/arvo/overview.md#solid-state-interpreter) and that
232+[Ames](@/docs/glossary/ames.md) is a network of solid-state interpreters
233+equipped with cryptographic identity. We explore this in the next section.
234+
235+### Future lunar cosmotechnics
236+
237+![farm](https://media.urbit.org/site/posts/essays/farm.jpg)
238+
239+We now polish off the old crystal ball and imagine future uses of Martian lunar
240+technology. Particularly, how the tech may develop over time once it becomes
241+widely exposed to the evolution-inducing forces of industry and culture. This
242+section is pure speculation, and I only aim to offer a small glimpse of a
243+potential future, rather than an exhaustive one. This picture will necessarily
244+be biased by my personal proclivities and expertise, or lack thereof.
245+
246+Any discussion on the future of moons is incomplete without mentioning the
247+possibility of [lunar emancipation](https://urbit.org/faq/#more-planets) in
248+order to increase the number of planets. This fascinating topic sees regular
249+discussion in the Urbit Community group, but is outside the scope of this
250+article.
251+
252+In order to respect the reader's time, I'm narrowing our scope to a particular
253+topic: the agriculture industry. I'm also assuming a future with specialized and
254+increasingly small hardware to run Urbit. Right now, a 4 GB Raspberry Pi is the
255+standard for "small Urbit". If someday there are CPUs specifically designed for
256+running [Nock](@/docs/glossary/nock.md), one could imagine going much smaller.
257+Ultimately, I'm going to assume that there will someday be [solid-state
258+interpreter](#ssi) microcontrollers - so the inclusion of Urbit on a device may
259+require nothing more than a couple [surface-mount
260+devices](https://en.wikipedia.org/wiki/Surface-mount_technology) on a larger
261+chip.
262+
263+Urbit is intended first and foremost as a personal computer. When I unravel its
264+potential usage in industry, I adopt the forecast of a drastic increase in the
265+manufacturing capacity for individuals and small groups. Agriculture is a great
266+microcosm of this long-standing trend; less human input is needed to produce the
267+same amount of food, whether it be crops or livestock. The modern era is
268+distinguished by the fact that small numbers of people can manage enormous farms
269+which produce food for vast populations. Thus, computation on modern automated
270+farms may be thought of as existing at the intersection of both personal and
271+industrial scale, and show how computerized and mechanized workflows add to the
272+amazing productivity of modern farms and demonstrate that individual-sized
273+inputs are able to create industrial-sized outputs. I predict that the set of
274+trades for which this dynamic holds will only increase over time.
275+
276+Agricultural automation has been a primary engine for the growth of
277+civilization, but it has been hampered by the downsides of IoT elaborated in the
278+previous section. One bellwether of this dynamic is the right to repair one's
279+own equipment. [John
280+Deere](https://www.thetruthaboutcars.com/2020/03/its-payback-time-right-to-repair-movement-targets-john-deere/)
281+has long been at the center of this controversy. Farmers have lost the ability
282+to repair their own equipment due to vendor locks and a dependency on remote
283+servers. Furthermore, any suite of sensor products designed to gather important
284+data such as genomics, hydrology, soil health, weather, etc., inevitably only
285+cooperate with other products by the same vendor. It's the same story all over
286+again—you are a client of a megacorp server. Or in Urbit terms, you have a bunch
287+of primitive moons belonging to different planets held by megacorps, and no
288+planet to call your own.
289+
290+Again, Urbit resolves these issues in the same fashion as above. One might argue
291+that using Urbit is another form of vendor lock-in—but this is evaluating Urbit
292+at the incorrect level. Since Urbit is an open source operating system, its
293+functionality may be extended and modified arbitrarily by any party. _Some_
294+computational infrastructure is necessary— that fact can never be escaped. But
295+you can escape from closed source software that does not permit you to modify,
296+to open source software that allows you to tinker at will. Thus we do not
297+consider open source software to be a form of lock-in, or at least, it's a much
298+milder form of lock-in compared to something like Apple's walled garden.
299+
300+So let us focus on the additional meritorious aspects of Urbit (or more
301+generally, solid state interpreter networks) that make it not merely a band-aid
302+to the broken IoT system but a permanent and sound replacement.
303+
304+#### Solid state interpreter networks {#ssi}
305+
306+![cubesats](https://media.urbit.org/site/posts/essays/cubesats.jpg)
307+
308+Urbit is the world's first solid-state interpreter (SSI). This concept is
309+summarized in the [white paper](https://media.urbit.org/whitepaper.pdf) as
310+follows:
311+
312+> Imagine it as a chip. Plug this chip into power and network; packets go in and
313+> out, sometimes changing its state. The chip never loses data and has no
314+> concept of a reboot; every packet is an ACID transaction.
315+
316+Also,
317+
318+> Briefly, an SSI is an interpreter which is also a database. In more depth, an
319+> SSI combines three properties: uniform persistence, source independent packet
320+> networking, and high-level determinism.
321+
322+We do not wish to segue into a lengthy examination of what this really means—
323+that's what the white paper is for—but we will attempt to explain why these
324+properties are of great benefit in an industrial IoT context such as
325+agriculture. We'd also like to predict that Urbit will not be the only SSI.
326+Other sorts of SSI's specialized to various tasks may one day roam the planet,
327+and these may be better suited for particular IoT tasks than
328+[Arvo](@/docs/glossary/arvo.md). However, this article will be couched in terms
329+of SSIs communicating with an [Ames](@/docs/glossary/ames.md)-like networking
330+protocol and Urbit ID-style cryptographic identity, rather than Urbit in
331+particular.
332+
333+For a SSI, losing power is less of a catastrophic event than it is for ordinary
334+computers with volatile memory. Knowing that you can never lose any state is a
335+powerful guarantee on the integrity of your data. Loss of power will always mean
336+loss of any data potentially collected while power is down, regardless of the
337+device you use, but with a SSI you at least have assurance that you will never
338+lose data that was collected before it could be transferred from the cache to
339+the disk. Of course, this is actually the sort of guarantee that [ACID
340+transactions](https://urbit.org/docs/arvo/overview/#acid-database) have—it is
341+just that this set of guarantees emerges naturally as a consequence when you
342+have a SSI. Put another way, every SSI is a database; having every device be a
343+database is a major boon in situations where enormous quantities of data are
344+being collected across a distributed network. The standard today is that data is
345+only collected at hubs, and any data that doesn't reach a hub is irretrievably
346+lost.
347+
348+SSIs are also deterministic at a high level. While all computers are
349+deterministic at the CPU level, interruptions to power can result in an
350+undefined semantic state and result in the random erasure of half of its brain.
351+This determinism is what begets ease of maintainability of Urbit—problems
352+generally only need to be solved once by experts and the solution propagates to
353+the rest of the network via [OTA updates](@/docs/glossary/ota-updates.md). We
354+addressed this maintenance issue previously—we only remark now that this
355+property is derived from being a SSI, rather than something particular only to
356+Arvo or Urbit. When one has hundreds or thousands of devices to manage, the
357+guarantees on ease of maintenance provided by determinism are extraordinarily
358+convenient.
359+
360+Packet routing on SSI networks is source-independent, and in the context of an
361+Ames-like networking protocol, are always delivered exactly once and in a
362+precise order due to the fact that nodes on an Ames network are in a permanent
363+session. Source-independent means that the identity that originated a packet
364+does not need to be the one to deliver it—packets are _facts_, and the truth of
365+a fact does not depend on who you heard it from. This means that it is possible,
366+for instance, to send instructions to a moon before it even exists and be
367+guaranteed that that moon will receive them and perform the tasks given, even if
368+the device that originally sent the packets no longer exists. As long as
369+somebody has kept the packets on hand, they will eventually be delivered. So,
370+one could imagine transmitting directions to a crop harvesting robot into which
371+a moon will be installed before the robot has even been purchased, know that
372+once it is delivered it will automatically begin its task, and know that those
373+tasks will be completed in the correct order, without any accidental repeats.
374+Taken to the limit, one can imagine preplanning the automated tasks for an
375+entire farm before a single device is purchased, with powerful guarantees on the
376+integrity of those instructions no matter how much time elapses between sending
377+and receiving.
378+
379+#### P2P data markets
380+
381+![knots](https://media.urbit.org/site/posts/essays/knots.jpeg)
382+
383+As was mentioned above, today's IoT devices ferry all sorts of your personal
384+data to megacorp, where they package it and sell it to the highest bidder.
385+Though personal data in aggregate is quite valuable, the value of a single
386+individual's data is quite low. On the other hand, industrial scale data such as
387+that collected on digitized farms could be quite valuable. Here we briefly
388+examine how Urbit can be utilized to populate and facilitate a market for data.
389+
390+All data collected by your moons may be digitally signed by that moon,
391+certifying the exact origin of that data. This is one advantage of having
392+cryptographic identity baked into the core of the operating system and
393+networking protocol. One could imagine collecting large amounts of such data and
394+packaging it for exchange with other local and regional farmers. This can, of
395+course, already be done in principle with current systems. But current systems
396+do not automatically come equipped with the sort of provenance, immutability,
397+and reputation that comes for free when you make use of SSI networks.
398+Manipulated or faked data becomes easier to spot, and you'll know who it came
399+from, so supplying such data puts one's reputation at stake.
400+
401+One major issue facing conjoining data gathered from disparate sources is simply
402+how to do it. Data arriving in random order, from different software versions,
403+running different hardware, is all very difficult to bundle into a good
404+dataset - and indeed wrangling this sort of task forms a large part of the data
405+scientist profession. As devices in SSI networks utilizing an Ames-like protocol
406+are engaged in permanent sessions, leading to properties such as exactly-once
407+delivery and well-ordered message sequences, issues about the order in which
408+data arrives are dramatically simplified. I do not wish to get mathematical
409+here, but I personally have confidence that the emerging discipline of
410+[categorical informatics](http://math.mit.edu/~dspivak/informatics/), as well as
411+the relevance of [low-dimensional topology to data
412+fusion](https://arxiv.org/abs/1409.5505), resolves many of these issues. I
413+promise to explain this in more detail in the future. For now, it suffices to
414+say that SSI networks seem well-positioned to utilize these techniques.
415+
416+Cryptographic techniques such as [(composable) zero-knowledge
417+proofs](https://en.wikipedia.org/wiki/Zero-knowledge_proof), [secure multi-party
418+computation](https://en.wikipedia.org/wiki/Secure_multi-party_computation),
419+[ring signatures](https://en.wikipedia.org/wiki/Ring_signature), and even
420+[homomorphic encryption](https://en.wikipedia.org/wiki/Homomorphic_encryption)
421+offer a variety of ways in which data may be shared in an IoT context with
422+mathematical guarantees on what sort of privacy is maintained. This is perhaps
423+less relevant in the context of agricultural IoT, where personal private data is
424+largely absent, but we mention them here to invite further speculation from the
425+reader about the possibilities of IoT and SSI networks.
426+
427+We end our discussion with an adaptation of a scenario borrowed from my brief
428+time working on [Ceptr](http://ceptr.org/) that begins to show how a lunar
429+IoT-connected world evokes properties of a hypothetical ["global nervous
430+system"](https://en.wikipedia.org/wiki/Global_brain). This example is
431+purposefully mundane to illustrate how deficient our Earth systems are, and
432+while it is possible to accomplish in theory, it is impractical on a wide scale
433+due to the numerous problems with IoT. Imagine that you suffer headaches from
434+low atmospheric pressure. You'd like to know when a low-pressure front is an
435+hour away from you so that you can pre-emptively take aspirin to prevent the
436+headache. Your personal digital assistant, running on Urbit, can then
437+periodically query the moons of sensors in your region for weather data to
438+predict whether or not you will soon be passing through a low pressure front.
439+This could be a free service or paid for automatically with cryptocurrency
440+microtransactions. On Mars, this task will be trivial, and is merely a stone's
441+throw away from a vast and undiscovered universe of other possibilities unlocked
442+by SSI networks.
443+
444+
445+[^0]: Of course, all moon names have four words, not three. What the fourth word
446+ needs to be for only three words to display is a matter of Urbit lore that
447+ is more fun to discover yourself than have it told to you, so we won't spoil
448+ it here.
content/blog/magic.md+3−2
@@ -6,9 +6,10 @@ aliases = ["/posts/essays/magic", "/posts/magic"]
66[extra]
77author = "Curtis Yarvin"
88ship = "~sorreg-namtyv"
9−image = "https://media.urbit.org/site/blog-7.jpg"
9+image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/magic.jpg"
1010+++
11−![](https://media.urbit.org/site/blog-7.jpg)
11+
12+![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/magic.jpg)
1213
1314It's easy to get too obsessed with Urbit's alien technology. We
1415didn't build Urbit for its tech. We built it for people to use.
content/blog/metaphase.mdnew file+74
@@ -0,0 +1,74 @@
1++++
2+title = "Metaphase"
3+date = 2020-12-09
4+description = "On the upcoming and foregoing Landscape lifecycles, and other forms of mitosis across the Urbit project."
5+[extra]
6+author = "Matilde Park"
7+ship = "~haddef-sigwen"
8+image = "https://media.urbit.org/site/posts/essays/metaphase.jpg"
9++++
10+
11+<br>
12+
13+![mitosis](https://media.urbit.org/site/posts/essays/metaphase.jpg)
14+
15+<br>
16+
17+*Previous versions of this essay specified the stream deploy date as December 11, 2020; then December 18, 2020. This has been amended to the actual date of release, with our sincere apologies. For new readers, you can opt into the dev stream by running `|ota ~lomlyx-lopsem-nidsut-tomdun %kids` (you may have to resolve a merge conflict using `|merge %home ~lomlyx-lopsem-nidsut-tomdun %kids, =gem %take-that`). We will surface this option more broadly in a future settings overhaul.*
18+
19+A few weeks ago, the Landscape team — those of us building Tlon’s suite of userspace applications on top of Urbit— deployed our first over-the-air update for notifications. This is a big leap forward for us. Of course, getting notifications inside Landscape itself is a big deal, but getting a push notification on your phone, or an email digest based on activity inside Urbit is now just one step away, a weekend project for a hobby developer, not an indeterminate number of steps away.
20+
21+After release, we received some feedback from users on the behaviour and design of this feature; beyond the obvious kinks that come from an initial release, it seemed to some like a minimum viable affordance pitched as a fully designed feature. This “bottom-up” development approach was, to us, fairly straightforward; to some of our users, it seemed that we had closed the door on the feature without even beginning to expose all its possibilities.
22+
23+As I’ll describe, we haven’t just been iterating Landscape, but the way we develop Landscape, and the way we consider Landscape in relation to Arvo. Finally, we’ll discuss our upcoming two-stream release process: a “stable” release stream with updates every six weeks and a development stream, with ongoing changes continuously deployed on an opt-in basis.
24+
25+To someone coming to Landscape for the first time, it is starting to look mature; and it is indeed maturing quickly. After all, these mismatches in expectations are pangs calling out for growth. Landscape truly has *users*, not just explorers, who are developing the same expectations they have with the other tools they use: predictability, reliability, and iterative improvements, not just leaps forward. So to meet those expectations, we’ve been working on the prerequisite work for a mature release schedule, with two different release streams for users and explorers: a lifecycle, with the cells, interlinked, dividing into a coherent higher being.
26+
27+## Landscapers and lifecycles
28+
29+For most of 2020, the core Landscape team has comprised of Liam (`~hastuc-dibtux`), Logan (`~tacryt-socryp`), and myself (`~haddef-sigwen`). Others at Tlon have rotated on and off, and some community members (`~radbur-sivmus` comes to mind) have also contributed a lot, but the three of us handle the core decisions and the entire stack for Landscape, working with designers, infrastructure, and third-party developers.
30+
31+After OS1’s release in April 2020, Landscape’s back-end has changed quite a bit; the first rearchitecture we performed was in group-store, adding roles and simplifying quite a lot of the back-end logic at the same time.
32+
33+Around May of this year, Logan flagged that our code surface was too large and had too much boilerplate by writing a set of bespoke full-stack applications when just one flexible userspace database would do. Our designers also had a vision of our interfaces being “modes and genres of the same data” that fit this vision as well; and so since then, we’ve put our resources into migrating all of Landscape to use graph-store (more information available in [this developer call](https://www.youtube.com/watch?v=E4DFuAZQ32Y)).
34+
35+Obviously, developing userspace for distributed computing has some additional challenges that you don’t have to consider when writing software for a single server. Each ship interacting has to mutually coordinate the agents running and the events to be processed. If those fall out of synchronisation, the edge cases multiply.
36+
37+We traditionally tended toward solving those problems by writing the simplest possible incarnation of an application or a solution first, triaging out additional complications until they can be most prudently addressed — usually when they are just one step away.
38+
39+For most of its history, Landscape’s userspace suite had to be up-to-date on all ships to function at all, so multiple staging streams added quite a few complications. Since incompatible versions of applications on different ships would produce mutual fail states if they attempted to interact –and since each application had no sense of how to negotiate compatibility with older applications, each user had to keep up-to-date. Landscape was moving too fast, constantly reconfiguring (to give you a sense of this: we still refer to a month ago as “old”).
40+
41+Historically, Arvo and Landscape were also considered just one object; changes in Landscape would often require refining the layers underneath it as well. We often aimed to use our interface’s requirements to refine Arvo in turn. But as Landscape’s cells continued to split, as it became a proper client *for* Arvo rather than a subsection *of* Arvo, it required its own planning and execution cycle that only came to fruition around April of this year.
42+
43+The first thing we did was start recurring, six-week product backlogs with designers and engineers to occasionally reassess short-term priorities with a larger roadmap. Once we did that, we began working on opening our process to the public, migrating all tasks, priorities, and current decisions to a [product board](https://github.com/urbit/landscape). By doing this, community members could both suggest features *and* contribute features, with a centralised, transparent process for getting designer input and Tlon engineer priorities. This has also been a successful effort.
44+
45+By adjusting ourselves to a six week rhythm for execution, it’s clearly time to slow down our release schedule and dedicate design and QA time to each release.
46+
47+Since Arvo is still quite young, we can’t quite get to all the thornier aspects of instituting a lifecycle. For example, we can’t tackle agent version negotiation in full yet; and mark versioning is still not present. This means modifying the validators for our graph modules (that is, validating the graph structure of a notebook vs. a collection) presents a deployment challenge in a two-stream lifecycle.
48+
49+That said, our userspace infrastructure is maturing, so we could at least organise the APIs to those agents; and we could at least slow the development cycle on those agents in favour of the more flexible components of the stack. The front-end specific features, for example, can be deployed on different ships without side effects for other users.
50+
51+So now, before we could launch a stable stream, we had some things to do first:
52+
53+- **We wanted to provide assurance that the userspace suite is relatively stable.** All our remaining stores (invite-store, metadata-store, and contact-store) needed to be modernised to use the same libraries and utilities inside Arvo as newer userspace applications.
54+- **We wanted all our applications to be using graph-store.** If we were going to migrate the entire network to a new userspace model, we shouldn’t undermine the new release cycle process and make it more difficult to test and deploy to meet higher user expectations. We needed to migrate everything first.
55+- **We wanted to release the notification-store**. After the October 2020 groups release, Landscape simply wouldn’t be complete without it.
56+- Finally, **we wanted all of Landscape to use the [Indigo component library](https://github.com/urbit/indigo-react).** Landscape shipped with each application using its own build with handwritten, bespoke DOM components. Once we moved to a single-page application architecture in June 2020, we wanted the same guaranteed consistency for both back-end and front-end code.
57+
58+Most of these are now accomplished; the remaining tasks are awaiting some final tests and UX work. We’re aiming for a stable stream of Landscape to deploy by **January 5, 2021**.
59+
60+What does this mean? For everyday users, you can expect Landscape releases every six weeks; the slate of features and any breaking changes will be flagged well in advance for third-party developers; and you can expect a more thoroughly considered user experience with notes and copy for each new release.
61+
62+And for intrepid users, you can opt-in to a development stream and help us find and eliminate bugs before release to the wider public. This development stream is much like how we've been deploying Landscape up until now — but now it's optional.
63+
64+## Mitosis
65+
66+Describing our progress so candidly can feel strange — after all, it sounds so *early*. But to me, it’s exciting. It’s mitosis.
67+
68+Take another example. For all of Urbit’s history — all until now — Tlon was playing the role of both parents to the project when it was really just an embryonic corporate vehicle itself, fated to become twins. But in the past few months the burgeoning Urbit Foundation’s interim Director, Josh Lehman (`~wolref-podlex`), has begun to ramp up responsibility, taking increasing stewardship over urbit.org and giving it a physical voice, an Otherness, apart from Tlon’s own goals.
69+
70+Now, each day, we stray a little closer to these entities splitting apart, a step closer to the Urbit Foundation and the Tlon Corporation being completely different entities with completely different concerns.
71+
72+The same has occurred with Landscape. Previously Landscape was “*the* interface to Urbit,” the proof that there was more to the project than a Unix executable. And slowly to those of us at Tlon, it became obvious what it was destined to become: a flagship client for an entire network, a tree branch rooting a world beneath clearnet, the first cell by which other clients might be born. Mitosis can be clumsy to watch; it can be nauseating to experience; it can be difficult to make out what will arrive where.
73+
74+But this is, after all, how a body forms.
content/blog/providers.md+6−6
@@ -20,7 +20,7 @@ Sounds good—but how does this actually come to pass? Urbit has to be technical
2020
2121Urbit has been getting nicer to use and more stable every day. We use it constantly, both as a company (Tlon) and for the broader Urbit community. From what we can tell, people are using Urbit to start communities of their own here and there. The problem is: to use our platform, you’ve got to run it yourself. This limits our audience *a lot*. Setting up a VPS and running an Urbit OS node is pretty easy if you’re comfortable in the command line, which makes it completely impossible for most people.
2222
23−We hear from people regularly who want to be able to sign up for Urbit like it was any cloud service. What they want is what we’ve been calling a *provider*: a service to provide easy onboarding and hosting. Given a good provider, we’d be pretty close to our long-term vision: Urbit would feel like an ubiquitous, easily accessible service.
23+We hear from people regularly who want to be able to sign up for Urbit like it was any cloud service. What they want is what we’ve been calling a *provider*: a service to provide easy onboarding and hosting. Given a good provider, we’d be pretty close to our long-term vision: Urbit would feel like a ubiquitous, easily accessible service.
2424
2525We’ve always assumed that providers would have to come into existence sooner or later. By the look of it, that time is now. Tlon and a few others have provider-like services in the works. We’ll talk about the specifics of what Tlon is planning to do in a future post. In this one, we’ll talk about what a provider is, why anyone would start one, and give a few examples of what they might look like.
2626
@@ -44,13 +44,13 @@ Let’s move on and talk a bit about why starting a provider makes sense to begi
4444
4545## Why would anyone start a provider?
4646
47−Our aim is to make Urbit OS so obviously nice to use that it’s well worth paying for. Today, a planet goes for about $10 - $20 and, once you buy one, you’ve got to figure out how to really put it to use. Which takes some work.
47+Our aim is to make Urbit OS so obviously nice to use that it’s well worth paying for. Today, a planet goes for about $10–$20 and, once you buy one, you’ve got to figure out how to really put it to use. Which takes some work.
4848
4949Any large holder of address space should immediately see the opportunity here: the more useful Urbit is, the more value can be captured by starting a provider. Providers make it possible to actually capture the value in address space, both by selling it and by operating nodes.
5050
5151Let’s say the base cost of running an Urbit OS node, in a hosted environment, is $10 / node / month. If you can sell hosting for $200 / year, you’re making back the ‘cost’ of the planet when someone signs up. Given that it’s more desirable to buy a planet when you know the star is online and you can put it to good use, this seems like a pretty good proposition: both for the provider and the customer.
5252
53−Starting a provider doesn’t *have* to be done by address space holders. You could start a provider with no address space of your own by custodying the address space of others. Then, you could take a cut of the address space sales and all of the hosting revenue. With a market of people looking to use Urbit, the crux of success with this approach is simply whether you can compete on user experience.
53+Starting a provider doesn’t *have* to be done by address-space holders. You could start a provider with no address space of your own by custodying the address space of others. Then, you could take a cut of the address space sales and all of the hosting revenue. With a market of people looking to use Urbit, the crux of success with this approach is simply whether you can compete on user experience.
5454
5555Providers are, in a way, like the miners of Urbit. They’re incentivized to run fleets of very specific VMs for profit. The profit motive, in Urbit’s case, is just a bit more conventional than a bitcoin miner. An Urbit provider is just offering a service in exchange for money.
5656
@@ -59,7 +59,7 @@ Providers are, in a way, like the miners of Urbit. They’re incentivized to run
5959
6060If you think of a provider simply as a business, its most basic incentive is to attract as many customers as possible. You can do that by competing on price or performance, or by competing on aesthetics and community—there are lots of ways that providers can compete.
6161
62−As a roughly similar ecosystem, the world of webhosting is a great comparison. There are lots of small webhosts that all have very specific services: Dreamhost, MediaTemple, prgmr.com, Linode all come to mind. Then there are the more generic, large-scale, performance-oriented options: AWS, GCP, Azure. It’s not quite time for an AWS-scale Urbit provider, but perhaps the AWS of Urbit will start as something much smaller.
62+As a roughly similar ecosystem, the world of webhosting is a great comparison. There are lots of small webhosts that all have very specific services: Dreamhost, MediaTemple, prgmr.com, and Linode all come to mind. Then there are the more generic, large-scale, performance-oriented options: AWS, GCP, Azure. It’s not quite time for an AWS-scale Urbit provider, but perhaps the AWS of Urbit will start as something much smaller.
6363
6464Let’s walk through a few examples to get a feel for what’s possible:
6565
@@ -80,10 +80,10 @@ Let’s say our base cost of $10 / month / planet from above is correct (it’s
8080
8181## What about Tlon?
8282
83−Before there can be an ecosystem of providers, there has to be *one* provider. While we’ve heard of a few other people working on things—we expect Tlon to be the first to try to really get into the provider business in earnest.
83+Before there can be an ecosystem of providers, there has to be *one* provider. While we’ve heard of a few other people working on things, we expect Tlon to be the first to try to really get into the provider business in earnest.
8484
8585I’ll save the details of what we’re going to do for a future post. Launching Tlon as a separate business will be the beginning of the separation of Tlon and Urbit. I’m really quite excited about it. Tlon is only able to consider becoming a business of its own because Urbit is mature enough that we can actually do it.
8686
8787For now, I’ll just say that Tlon will pick the low-hanging fruit first. Our goal is to make onboarding a group into Urbit incredibly simple. We want people to be able to go from email invite to running Urbit in a few minutes without ever knowing anything about Ethereum, Unix, or what a private key is.
8888
89−Once we’ve laid the groundwork with something that *just works*, we plan to open source some of our components. Scaling up Urbit isn’t going to be easy. We hope that others will help us, and will help explore what’s possible in supporting Urbit users in the future.
89+Once we’ve laid the groundwork with something that *just works*, we plan to open-source some of our components. Scaling up Urbit isn’t going to be easy. We hope that others will help us, and will help explore what’s possible in supporting Urbit users in the future.
content/blog/rollups.mdnew file+220
@@ -0,0 +1,220 @@
1++++
2+title = "The Gang Solves the Gas Crisis"
3+date = 2021-05-14
4+description = "How we're making Urbit ID affordable again"
5+[extra]
6+author = "Jonathan Paprocki"
7+ship = "~datnut-pollen"
8+image = "https://media.urbit.org/site/posts/essays/gas.jpeg"
9++++
10+
11+![gas station](https://media.urbit.org/site/posts/essays/gas.jpeg)
12+
13+Anybody who has used Ethereum smart contracts recently is aware that it has
14+gotten _expensive_. There are a large quantity of
15+complicated and clever techniques each with their own trade-offs
16+that are collectively referred to as "layer 2 solutions" (see [further
17+resources](#resources) for more information about these). This is in contrast to
18+the base computational layer of Ethereum called "layer 1", which is what constitutes most Ethereum usage and where [Urbit ID](@/docs/glossary/azimuth.md)’s smart contracts currently exist.
19+
20+Tlon has always covered gas costs for Urbit ID up to a set limit, and this was easy a couple of years ago when the cost of transactions required to get a [planet](@/docs/glossary/planet.md) up and running came out to less than a dollar. Unfortunately the ongoing Ethereum gas crisis, along with the rising price of Ethereum itself, has made this impossible. We’ve seen gas costs to set up a planet as high as several hundred US dollars at time of writing!
21+
22+In response to the gas crisis, Tlon has spent the last several months developing
23+a simple, in-house layer 2 solution which we anticipate will reduce typical gas costs by 65x or more.
24+
25+This post is primarily a short non-technical explainer of the end-user experience of our solution aimed at planet and [star](@/docs/glossary/star.md) owners and those in the market for one, as well as a status update on where we're at in development. At [the end](#technical) we give some minimal technical details and resources to help you dig deeper should you wish.
26+This is also primarily aimed at those who currently self-host or plan to self-host their
27+urbit. For anybody utilizing a hosted service, this matter will all be handled
28+by your provider. There is a [separate section](#stars) addressed specifically at star owners, and another [section](#rollers) for those who wish to set up their urbit to accept and submit layer 2 transactions. We’d like to emphasize that this system is 100% opt-in—if you are satisfied with the current experience of Urbit ID, then nothing changes for you whatsoever.
29+
30+Perhaps the most pressing question held by anybody reading this is—when will
31+it be ready? It's not reasonable to give a timeline on difficult engineering
32+work, but rest assured that completing this upgrade is a top priority. Much
33+of the back-end is approaching completion, and we are confident in a release before the end of Q3 and hopefully much sooner.
34+
35+### Naive rollups
36+
37+Our layer 2 solution, designed primarily by Tlon lead engineer `~wicdev-wisryt`,
38+is known as "naive rollups" and we will be using this term interchangeably with
39+"layer 2"—though it is important to note that there are many layer 2 solutions
40+utilized by projects other than Urbit. As we're avoiding technicality here, we’re focusing primarily on the advantages and disadvantages of utilizing our layer 2 solution, and how that affects the management of your [ship](@/docs/glossary/ship.md).
41+
42+Very briefly, a rollup is a way to combine many transactions into one, and we
43+are building infrastructure so that any Urbit ship may be utilized as a "roller". A
44+roller will collect layer 2 Urbit ID transactions, confirm their validity, and
45+post them to the Ethereum blockchain. More detail is given [at the end](#technical). Anybody may set up a
46+ship to [act as a roller](#rollers). Tlon will be launching our own publicly accessible roller, but as Urbit is a decentralized network, by no means will we have a monopoly.
47+
48+#### Pros and cons
49+
50+The primary advantage to using naive rollups is that the gas cost for Urbit
51+ID-related actions will be dramatically reduced. It will be reduced sufficiently that we expect that a few transactions per ship per week (plenty for ordinary usage) submitted to Tlon's roller will not cost the end user anything. There are no gas costs associated with submitting a layer 2 transaction to a roller, and Tlon will bear the gas cost of posting the results to the blockchain. That means that the cost you see for a planet on a market that utilizes Tlon's roller ought to be
52+the final cost.
53+
54+There are a few trade-offs for this, but none of them really sacrifice the core
55+value propositions of Urbit ID.
56+
57+The most substantial one is that ships on layer 2 are essentially completely isolated
58+from the rest of the Ethereum ecosystem. They can no longer interact with smart
59+contracts designed to work with Urbit ID or non-fungible tokens (which are how Urbit IDs are represented) in general. It is also not possible to write new Ethereum smart contracts that work with layer 2 ships.
60+
61+Compounding that factor, the journey to layer 2 is one-way only—at
62+least for now. There are theoretical ways a ship may be moved back to layer 1, but they do not yet exist, and we cannot promise that such a thing will be available in a timely manner. Anybody moving a ship to layer 2, or buying a ship on layer 2, should assume that they will
63+remain on layer 2 for the foreseeable future. We do not expect this to be
64+permanent, but it is perhaps the most significant drawback for the time being.
65+
66+Another one is that transactions may no longer be "instant". Effectively, this
67+was already the case on layer 1—unless you paid a lot of gas, you could wait
68+hours or even days for your transaction to clear. But the way we are saving on
69+gas is essentially by "bundling" or "rolling up" many transactions into one, and
70+submitting them as a single transaction. The more transactions in the rollup,
71+the better the savings. This bundling is not the only factor at play here
72+though—costs are reduced other ways, but this is a technical detail
73+[discussed later in this post](#technical). It is possible to use layer 2 to submit single
74+transactions (and this will still save on gas costs!), so utilization of layer 2
75+should not incur any delay over layer 1 when utilized in this fashion.
76+
77+Tlon has not finalized the details on how our roller will work, but it will
78+probably involve waiting until a sufficient backlog of transactions have been
79+submitted to make it economical to bundle them up, or just submitting every set
80+time period, whichever arrives first. We do not see this as a big issue—we
81+view Urbit ID as "digital land", and a few hours to acquire land, or waiting for
82+your new personal computer to be delivered, is still lightning fast in
83+comparison to the real world. We also have ideas on methods that will allow you to get on the network before the transfer has been confirmed, but that is outside of the scope of this article.
84+
85+Our layer 2 preserves the main value proposition of Urbit ID, which is that your ship
86+belongs to you forever, and that this is assured by very strong cryptographic methods and
87+game-theoretic arguments comparable to the ones that exist on layer 1. We
88+consider this principle to be uncompromisable, and maintaining ultimate
89+sovereignty over your ship was totally central in choosing our solution.
90+We summarize the new security model [below](#technical), and `~wicdev-wisryt`
91+goes into greater detail in the [resources](#resources).
92+
93+### Changes to User Experience
94+
95+The primary way one manages their Urbit ID, namely performing tasks such as
96+transferring ships, setting networking keys, or setting
97+[proxies](@/docs/glossary/proxies.md), is with a web interface called
98+[Bridge](@/docs/glossary/bridge.md) found at
99+[bridge.urbit.org](https://bridge.urbit.org). If you already own a planet,
100+you've probably used Bridge before - perhaps only a single time.
101+
102+Bridge will be getting a facelift to enable easy interfacing with layer 2,
103+including loud warnings about what is being gained and lost by doing so. From
104+here you will be able to transfer your ship to layer 2, and once there,
105+perform all the usual actions you can on layer 1.
106+
107+The main difference for layer 2 transactions on Bridge will be the additional
108+choice of a roller to submit transactions to. Tlon's will be free for ordinary, non-time-sensitive usage.
109+You could use your own ship for a fast single transaction for a little more gas. We expect that planet markets and stars may wish to set up their own rollers as well.
110+
111+Every planet has a sponsor star, which distributes [OTA
112+updates](@/docs/glossary/ota-updates.md) to their sponsored planets and assists with peer discovery. Both layer 1 and layer 2 planets will be able to be
113+sponsored by either layer 1 or layer 2 stars, meaning that nothing will change
114+in terms of how sponsorship works.
115+
116+When you buy a ship, any reputable seller will inform you whether or not it is
117+on layer 1 or layer 2. Anyone running an urbit will be able to verify this information, and we expect for tools to exist to make this information publicly available (see [this grant](https://grants.urbit.org/bounties/1101665172-network-explorer-data-pipeline-http-api)).
118+
119+And that's it! If you'd like to know how things will be changing for
120+[stars](#stars), what goes into [setting up a roller](#rollers), and additional
121+[technical details](#technical), read on.
122+
123+### Changes to stars {#stars}
124+
125+Both planets and stars will be able to move to layer 2.
126+[Galaxies](@/docs/glossary/galaxy.md) must remain on layer 1 for technical
127+reasons, and [moons](@/docs/glossary/moon.md) and
128+[comets](@/docs/glossary/comet.md) never interacted with Ethereum anyways, so
129+they are completely out of the picture.
130+
131+Stars will be able to remain on layer 1 with no action required. For star owners
132+that wish to take advantage of the cheaper gas costs, there are two possible
133+modes: ownership of the star on layer 2, or setting the spawn proxy to layer 2
134+with ownership remaining on layer 1.
135+
136+The first mode—a star which is owned on layer 2—has the same advantages and
137+disadvantages as a layer 2 planet. Planets spawned by a layer 2 star will also
138+necessarily be on layer 2 - there is no way to spawn a layer 1 planet from a
139+layer 2 star, though any planets which were spawned on layer 1 before the
140+star migrated to layer 2 will remain on layer 1.
141+
142+The second mode—ownership on layer 1, with spawn proxy on layer 2—is only slightly more complicated. Such a star will change its networking keys, transfer
143+between wallets, and set its management proxy all on layer 1, with the
144+corresponding higher gas cost. However, it will be able to spawn planets on
145+layer 2—and _only_ on layer 2—with the corresponding layer 2 tradeoffs. Like
146+moving ownership to layer 2, this will be a one-way journey for now. Planets
147+spawned before moving the spawn proxy to layer 2 will remain on layer 1, but
148+from then on, all planets spawned by that star will live on layer 2. Finally, stars in this second mode may transition to the first mode, but not vice versa.
149+
150+### Creating a roller {#rollers}
151+
152+![gasprices](https://media.urbit.org/site/posts/essays/gasprices.jpeg)
153+
154+Rollers are urbit nodes which users submit transactions to to be "rolled up"
155+into a bundle to be submitted to the Ethereum blockchain. The business logic for
156+a roller runs on the urbit node itself. Thus, anybody with an urbit ship may set
157+it up to act as a roller. While the details of how rollers work are still being
158+hammered out, one should expect that one can either set transactions to be
159+submitted at regular intervals, once a sufficient number of transactions have
160+been received (as more transactions means greater savings), manually, or some
161+combination of the above.
162+
163+Tlon plans to release documentation on how to set up your own roller concurrently with
164+the release of our layer 2 solution.
165+
166+Malicious rollers could potentially exist, but the worst they ought to be able
167+to do is simply not submit your transaction. The security factors for rollers
168+are briefly addressed [below](#technical), and elaborated upon in the
169+[resources](#resources), but you can expect full technical documentation on
170+these factors to be included in the roller documentation.
171+
172+### Changes to Azimuth
173+
174+[Azimuth](@/docs/glossary/azimuth.md) is the set of Ethereum smart contracts
175+governing Urbit ID. They will require a few changes to accommodate the new
176+system. Some of this has been implicit above, but to be clear, we will only be
177+making a couple minor alterations:
178+ - Once a star's spawn proxy is set to the layer 2 address, it can't be switched
179+ back, and they can no longer spawn layer 1 planets.
180+ - Galaxies and their proxies cannot be deposited to layer 2.
181+Some other minor details are yet to be worked out, but again, nothing will change for those who wish to remain on layer 1.
182+
183+### Technical details {#technical}
184+
185+What's really going on behind the scenes here? Briefly, only the data of the Urbit ID transactions will be posted on-chain, while computation and state storage will now happen on your ship.
186+
187+In layer 1, the [Ethereum Virtual Machine (EVM)](https://ethereum.org/en/developers/docs/evm/) guarantees the validity of state transitions, while for layer 2 transactions, each Urbit node guarantees the validity of the state transitions.
188+
189+Changes to the state of Urbit ID on layer 1 works as follows:
190+ 1. A transaction is posted to the Ethereum blockchain.
191+ 2. The EVM calculates the resulting state transition and checks its validity, then updates the state.
192+ 3. Your urbit downloads the new state from an Ethereum node.
193+ 4. Your urbit makes the final decision on whether the new state is valid.
194+
195+In practice, the fourth step is never used in layer 1. The primary change to our
196+security model is that we are cutting out step 2 and beefing up step 4. Your
197+ship will now perform validation of the transactions posted to the Ethereum
198+blockchain, rather than the EVM.
199+
200+Since [Urbit OS](@/docs/glossary/arvo.md) is deterministic, and Hoon has some nice formal
201+properties, it turns out to be a great language for writing smart contracts. Thus we are effectively swapping the Ethereum smart contract with a “Hoon smart contract” run locally on your ship.
202+
203+#### Further Resources {#resources}
204+
205+We want to keep this post brief and non-technical, so that's all we'll say about
206+it for now. To find out more, you have a few directions to go on. We held a
207+[Developer Call](@/events/2021-03-04-developer-call-scaling-azimuth.md) where
208+`~wicdev-wisryt` outlines the design in much more technical detail, and also
209+explains why we decided to utilize our own design rather than other known layer
210+2 solutions such as [Optimistic
211+rollups](https://docs.ethhub.io/ethereum-roadmap/layer-2-scaling/optimistic_rollups/),
212+[ZK-rollups](https://docs.ethhub.io/ethereum-roadmap/layer-2-scaling/zk-rollups/),
213+etc, or other blockchains. He also plans to do a more technical walkthrough video sometime before release. For those who would rather read, see
214+`~wicdev-wisryt`'s [RFC: Naive rollup for cheaper Urbit ID
215+transactions](https://groups.google.com/a/urbit.org/g/dev/c/p6rP_WsxLS0/m/hQBX0modAwAJ)
216+post on the `urbit-dev` mailing list. Lastly, the primary working branch on
217+Github for the Urbit side of naive rollups is
218+[here](https://github.com/urbit/urbit/tree/philip/naive), though it is not the
219+only place code is accumulating.
220+
content/blog/security-and-continuity.mdnew file+62
@@ -0,0 +1,62 @@
1++++
2+title = "Security and Continuity"
3+description = "An update on our primary infrastructure milestones for 2020."
4+date = 2020-12-01
5+[extra]
6+author = "Galen Wolfe-Pauly"
7+ship = "~ravmel-ropdyl"
8+image = "https://media.urbit.org/site/posts/essays/land4.jpg"
9++++
10+
11+![Security and Continuity](https://media.urbit.org/site/posts/essays/land4.jpg)
12+
13+## Security and Continuity
14+
15+In 2018, when we launched the Urbit ID contracts (also called ‘Azimuth’), we committed to yearly infrastructure goals for 2019 and 2020. This wasn’t an informal commitment — it’s part of the contracts that were published to the blockchain, which you can read [here](https://raw.githubusercontent.com/urbit/azimuth/edf68b8da04806dd5b95994daf14cf1e7e226829/proposals/0xcb1f81e42b5e75f000f94fc71a3ea70cab4bfc6f236b91e717f1b9516e5596b5.txt). At the end of each year, we ratify our accomplishment of these goals with a galaxy vote.
16+
17+Since the year is coming close to an end, and this year’s vote is on the horizon, it’s time for an update on our progress.
18+
19+For this year, we committed to completing two things: passing a third-party security audit of our networking protocol (Ames) and getting Urbit OS (both Arvo and the interpreter) to the point where we can reasonably expect the Urbit network to continue without any hard forks (which we call ‘breaches’). A world with no network breaches is one where the network should be able to run indefinitely without any interruption. We also call this ‘continuity’.
20+
21+We’ve been steadily making progress on these two fronts, and I’m happy to report both are nearly complete. We’ll walk through some of the details here and then follow up in another post soon to report on how the final work turned out.
22+
23+
24+## Ames Audit
25+
26+Urbit OS is an ‘overlay OS’: it runs on top of (pretty much) any flavor of Unix. Each Urbit OS node communicates with other nodes over UDP using Ames, the Urbit-specific networking protocol.
27+
28+There are two things worth worrying about when it comes to Urbit OS security: someone breaking into Urbit from the machine it’s running on, and someone compromising the network protocol itself. As to the first, there are probably ways that we can harden the OS sandbox, but if the machine it’s running on is secure we can feel reasonably safe. Since there’s lots of prior art on how to secure a Unix machine, we can leave hardening the runtime for later and simply encourage everyone to secure the boxes they run their Urbit nodes on.
29+
30+Assuming each node on the network can run on a locked-down machine, it’s really important that the protocol for communicating between these nodes is secure. Also, since Ames uses other Urbit nodes for peer discovery, we want to make sure no ‘relay node’ can inspect data not meant for them.
31+
32+The question “Is Ames secure?” is too vague for an auditor, of course. The audit was scoped to determine that the following three criteria are met:
33+
34+- No one can impersonate another ship on the network
35+- No one (including relays) can intercept and decrypt messages not meant for them
36+- Ames messages don’t leak keys that could endanger the sender’s data
37+
38+Our goal with this scope is to focus exclusively on the design and implementation of Ames itself. Basically, the crypto should be correct and there should be no flaws in either the protocol design or its implementation. Our interpreter can still be hardened against other potential attacks, which is work we’ll undertake in the future. We asked our auditors to flag all of these potential issues, so we know what needs to be addressed in the future.
39+
40+The good thing about an audit scoped in this way is that we can trust the protocol to authenticate people and shuttle packets back and forth safely. We’ve always been reasonably confident about Ames, but having an external stamp of approval will be great.
41+
42+As of the end of November 2020, the audit is very nearly complete, and we’ve handled all the important issues that were brought up. We’ll post the results and talk about our mitigation strategies in a future writeup.
43+
44+
45+## Continuity
46+
47+Urbit is designed to last a long time. What’s the use of a personal computer if it’s gonna disappear along with all the data you put in it? Ideally, you can put your Urbit on a USB stick, forget about it for ten years and have it work again when you plug it in. It’ll need to update for a while, but once our work on continuity is complete, your urbit should be able to upgrade itself through ten years of updates, all over the air.
48+
49+While Urbit is designed to upgrade seamlessly over the network we have occasionally run into issues that have caused us to reboot the entire network. Most of the time this is when some incompatibility between the interpreter and the kernel means we have to force everyone to do a hard reset to ensure compatibility between the two. Our current work on continuity addresses this. Soon, your urbit will tell you when your interpreter needs to be upgraded. At first this won’t be that different from an application notifying you to download an update. Eventually, we think we can make this a lot smoother.
50+
51+A network reboot isn’t the only way that we can break continuity. Urbit is a general-purpose computer — which means you’re free to attempt to destroy it. If, for any reason, you do manage to screw the system up we want you to be able to get your data out and effectively reset continuity on a single node. We built the affordance for that a while ago, but before the end of the year we’ll also distribute tooling to migrate userspace data between hard resets.
52+
53+The combination of version negotiation and data migration should afford us the ability to run the network indefinitely into the future. Unfortunately, to get this change in, we’ll need to reset the network. We’re optimistic that this will be the last time we ever do it. And, given our data migration tooling, this breach won’t involve losing data.
54+
55+
56+## Status + conclusion
57+
58+We have been working with auditors since this summer and should have a report ready to publish in the next few weeks. Both version negotiation and data migration are in testing and are ready to be deployed.
59+
60+Our goal is to have all of this work complete by `~2020.12.10`. This means we should be able to start a galaxy vote right around that time. Galaxy votes (as specified in the contracts) run for a month, which should have this whole process ending on `~2021.1.10`.
61+
62+It's going to be an exciting couple of weeks!
content/blog/security-audit.mdnew file+157
@@ -0,0 +1,157 @@
1++++
2+title = "Ames Security Audit and the Future of the Protocol"
3+description = "Ames’ design has unparalleled potential to deter, mitigate, and recover from attacks, since every packet is authenticated and encrypted and backed by a stable, decentralized PKI."
4+date = 2020-12-18
5+[extra]
6+author = "Ted Blackman + Anthony Arroyo"
7+ship = "~rovnys-ricfer + ~poldec-tonteg"
8+image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/20201218-audit.png"
9++++
10+
11+<br>
12+
13+![audit](https://storage.googleapis.com/media.urbit.org/site/posts/essays/20201218-audit.png)
14+
15+<br>
16+
17+The security firm Leviathan has now finished their initial audit of the security of Urbit's Ames network protocol. In addition to their review of Ames, we also asked them to identify any other issues in order to help guide further development.
18+
19+I'm pleased to report they confirmed the cryptographic soundness of the protocol, namely that "a ship must have possession of their own valid Urbit key in order to authenticate as that ship and to send valid Ames messages. Additionally, no other ship except the two communicating may be able to decrypt or modify messages during transport."
20+
21+This means Ames uses cryptography in a mathematically sound manner that protects your privacy, keeps your secrets secret, and ensures nobody else will be able to impersonate you on the network. Since this was an architectural audit, it’s possible there are still vulnerabilities in the runtime implementation. Until the runtime has been hardened, Tlon continues to recommend against storing valuables in your ship.
22+
23+Aside from a couple of minor issues that have already been resolved, there are three general classes of problem highlighted in their report that future work will need to address:
24+
25++ Forward secrecy
26++ Protection against denial of service attacks
27++ Enforcement of social boundaries
28+
29+Ames’ design allows for versioning of the protocol, which means that the proposed changes below can be deployed as over-the-air updates as they become more pressing concerns. This feature gives us confidence that we can address future security issues as they arise.
30+
31+We will need to improve all of these over the next couple of years, as independent lines of work. As the network grows: better forward secrecy will decrease the damage from a key getting compromised; resistance against denial of service attacks will make the Urbit network resilient to increasingly determined saboteurs; and stricter enforcement of social boundaries will let Urbit’s social networks remain safe and friendly despite potentially increasingly large numbers of bad actors and increasingly complex app ecosystems.
32+
33+## Forward Secrecy
34+
35+A protocol is said to have forward secrecy if compromising a key used in a recent message doesn’t also compromise all previous messages. Similarly, a protocol is said to have backward secrecy -- also called future secrecy -- if compromising a key used in a previous message fails to compromise all future messages. Ames has some degree of both, but more would be better, to decrease the damage an attacker could inflict by compromising a key.
36+
37+As it stands, an Urbit user can change their Ames keys whenever they want, by conducting an Ethereum transaction to update the Ames public key listed in the Azimuth contract, which implements Urbit’s PKI on Ethereum. Compromise of one Ames private key does not compromise earlier or later keys, so this has both forward and backward secrecy. The main drawback is that Ethereum transactions can be expensive, so key rotation is likely to be infrequent, and an attacker might be able to gain access to a long stretch of time by compromising a single key.
38+
39+Various key rotation “ratchet” schemes could be added to Ames to establish varying degrees of forward and backward secrecy, and other kinds of cryptographic protections beyond basic soundness, such as break-in recovery.
40+
41+Right now, changing a key through Azimuth is a manual process. It could be automated, possibly as one of a suite of services that an Urbit Provider will offer. Unfortunately, each key rotation costs the user money, so automating rotation could get prohibitively expensive.
42+Existing protocols, such as the Signal app's encrypted messaging protocol, the Noise protocol framework, and the Wireguard VPN protocol, use ephemeral Diffie-Hellman key exchange and KDF chaining to achieve forward and backward secrecy and self-healing.
43+
44+Ames could be upgraded to use one of these existing ratchet algorithms, or we might create an Urbit-specific variant optimized for the Urbit network. This is work that should be done, but fortunately it will not require any novel research or drastic changes to Ames’s architecture.
45+
46+While Urbit’s cryptographic protections don’t yet match those of Signal or a few other privacy-focused apps, Ames is cryptographically sound, and since Urbit updates itself over-the-air and is backed by a stable, decentralized PKI, I’m confident that the level of sophistication of Urbit’s cryptography has the potential to be world-class with just a bit more work.
47+
48+## Denial of Service
49+
50+A denial of service (DoS) attack against an Urbit ship is an attempt to overwhelm it remotely by sending it network data in such a way as to interfere with the ship’s ability to communicate with other ships or process other events -- usually by hogging its resources (computational power, memory, or bandwidth) until normal operation slows down or ceases entirely. Since the promise of Urbit is that everyone can run their own server, that server needs to be able to defend itself against DoS attacks. This is in fact one of the main impediments to running your own server in the modern world.
51+
52+Right now, Urbit has no protection. Soon, it will need to at least be able to resist a simple attack carried out by an individual. Eventually, it should be able to resist a determined Distributed Denial of Service (“DDoS”) attack, which is more difficult.
53+
54+There are two categories of DoS attacks in Urbit: authenticated and unauthenticated. An authenticated attack requires access to a ship's private key to construct valid Ames packets intended to overwhelm a target. All authenticated attacks will be handled primarily through enforcement of social boundaries, as discussed in the next section.
55+
56+An unauthenticated DoS attack constructs packets that eventually fail to authenticate and decrypt but still overwhelm the target by causing it to waste resources (CPU, memory, disk, bandwidth) in such a way that it can't keep up with legitimate communications.
57+
58+An unauthenticated DoS attack relies on the lack of Sybil resistance of IP networks: it's possible to generate new IP addresses rapidly, and a determined attacker might also be able to spoof its sender IP address. This is best considered an IP-layer attack that must be handled mostly at the IP layer itself, by maintaining state about which IP addresses can be trusted and which can't, determined empirically and heuristically by the Urbit runtime. The best any higher-level protocol, such as Ames or TCP, can do is make it as cheap as possible for a DoS target to reject a bad packet.
59+
60+The overall strategy that Ames can take, as a protocol layering over the IP protocol, is to add an authentication procedure to each packet that can quickly identify bad packets, which an implementation will then use to mark that IP address as suspect and to refrain from adding the sender IP to a list of known-good IPs.
61+
62+Currently, Ames handles this by attempting to decrypt a message and rejecting the message on failure. This may be a more costly solution than other methods, such as attaching a signature or a MAC to each message. The way to mitigate unauthenticated attacks is to make bad packets fail faster by augmenting each packet with a signature or MAC to each packet, since those are faster to validate than encryption.
63+
64+So far, we have identified three approaches that could be taken here. Of these three, Leviathan recommended the end-to-end HMAC solution, since that would not impose additional CPU requirements on packet-relay nodes, such as stars.
65+
66++ Sign each packet, and any relay or final recipient could validate the signature
67++ Wrap each packet in an HMAC, validated by the final receiver
68++ Wrap each packet in a HMAC for each hop in a relay chain; each relay would validate and strip the previous HMAC and add a new one for the next hop
69+
70+Any of these solutions would be attempts to increase the rate at which the network could discard invalid packets, with different tradeoffs. I'll back up a bit to provide some context, and then I'll compare the approaches.
71+
72+In any DoS solution, a planet will want to block or throttle IPs that have been sending it packets that fail to authenticate and decrypt. Ideally, a star will help protect planets for whom it’s relaying, too. Many different arrangements among galaxy, star, and planet are imaginable here, from an open policy to a policy wherein each packet has to come from a known-good IP. This sort of paranoid, closed-off arrangement might still not be enough to withstand a determined DDoS, but it's difficult for me to imagine doing better than that without launching Urbit-specific ISPs. Ames packets are cryptographically authenticated, so an Urbit ISP would actually be feasible.
73+
74+This brings us back to the three possible ways of mitigating DoS from within the Ames protocol. They all involve adding a piece of authenticating information to each packet that can be verified more quickly than waiting for the cyphertext to fail to decrypt — Ames's symmetric encryption is authenticated, so it's not a cryptographic soundness issue, but the performance impact of trying to decrypt could be significant enough to make it hard to prevent a DoS.
75+
76+As-is, an Ames packet is basically `[protocol-version checksum sndr rcvr (nullable origin) cyphertext]` (visit [this PR](https://github.com/urbit/urbit/pull/4051#issue-530369627) for a full specification). Let’s walk through the construction of the packet and how it can be upgraded to offer different DOS mitigations.
77+
78+### DoS Mitigation Approach 1: Signature
79+
80+The first approach to DoS protection would be to add a signature to the packet. The signature would cover everything except the checksum and the origin, since those need to be swapped out by relays. The signature would probably obviate the need for the (20-bit) checksum, although we could also leave it in there if we can't figure out what else to do with those header bits.
81+
82+#### Advantages of a signature over other approaches
83+
84+- It can be validated by anyone on the network. Relays would not need to modify it. This might also give it symmetry with the upcoming remote scry protocol, which might also sign every packet. I'm not quite sure this is an important property, actually, but it might theoretically make launching an Urbit ISP or internet backbone easier one day.
85+- It would be signed directly by the key listed on Ethereum, not something that might get ratcheted at some point for better forward secrecy — this could eventually lower the rate at which intermediate validators need their key caches invalidated, although this is a bit of a theoretical concern.
86+
87+#### Disadvantages of a signature over other approaches
88+
89+- Generating and validating a signature is significantly slower than generating and validating an HMAC.
90+- An ECDSA signature is 64 bytes, which is ~6% of a packet payload. As far as I can tell, it can't be compressed.
91+- Since the signature could be validated by anyone, it doesn't attest to a specific communication channel, so it might not help as much with IP filtering.
92+
93+### DoS Mitigation Approach 2: End-to-End HMAC
94+
95+The second approach would be to use an HMAC instead of a signature, validated by the eventual receiver. This HMAC would also cover everything except the mug and origin. I'm calling this the "end-to-end HMAC" design. An HMAC requires a shared secret, for which we could use the same symmetric key that Ames uses.
96+
97+#### Advantages of end-to-end HMAC
98+
99+- It's simple in some sense; relays don't need to do anything cryptographic.
100+- HMACs are much faster to create and validate than signatures.
101+- HMACs, since they're hashes, can be truncated arbitrarily and still maintain some security — to find hash collisions, you'd still have to guess what packet||shared-secret would hash to; it would just be a smaller search space. Since Ames's encryption already guarantees authentication and we'd just be using this as a performance optimization, I suspect we could get away with using one that's significantly smaller than a signature — I'm not sure how small, but if 4 bytes would be enough in practice, that would take up less than 0.5% of the space in a packet.
102+
103+#### Disadvantages of end-to-end HMAC
104+
105+- Only the recipient can validate. This means the authentication couldn't be used by relays to discard invalid packets. The recipient could provide back-pressure out-of-band to a relay to ask the relay to discard packets from an IP with an invalid HMAC, but this is indirect and might need to filter backward through multiple relays to work properly.
106+
107+### DoS Mitigation Approach 3: Point-to-Point HMAC
108+
109+The third approach, which is what I would build unless convinced otherwise, is what I'm calling "point-to-point HMAC". This design would include a different HMAC for each hop in a relay chain, instead of (or maybe in addition to) including one end-to-end HMAC.
110+
111+We have a couple different options for how to construct the shared secret for each hop. I would intuitively construct it using a Diffie-Hellman of my private signing key and your public signing key — the "networking keys" on Ethereum include a currently unused signing key in addition to the encryption key that Ames uses. This way even if we add more forward secrecy to Ames, changing the symmetric key used for encryption, relays wouldn't have to have their caches invalidated as often; the state required to perform relaying wouldn't be as tied to the state required to receive a message.
112+
113+#### Advantages of point-to-point HMAC
114+
115+- A star could perform some validation on every packet it's asked to relay. This makes it more difficult for an attacker to route a ton of packets to a planet through a star, or even through many relays. Signatures also have this property, but they're slower to verify. This approach and the signature approach, but not the end-to-end HMACs, force an attacker to use an (at least partially) authenticated attack in order to use a relay as a way to get to a planet.
116+- A planet could quickly validate that a relayed packet actually came from its star, not an attacker who's managed to spoof the star's IP address.
117+
118+#### Disadvantages of point-to-point HMAC
119+
120+- Not everyone on the network can validate a packet, unlike a signature.
121+- Each relay needs to validate and strip off the previous HMAC and create a new one before sending it. This should be quite fast, since an HMAC is just a hash, but it's still some CPU, and potentially creates an imbalance where an attacker could induce the relay to spend more CPU in validation than the attacker spent in constructing the packets.
122+- By itself, it doesn't validate the cyphertext in an end-to-end way. I suspect we might want to include both a per-route HMAC and an end-to-end one, especially if we use truncated HMACs — although per-route might be enough on its own, since if the receiver fails to validate a bunch of packets whose HMACs were validated by the relay, the receiver can ask the relay to block that whole Urbit address regardless of IP, so it shouldn't be possible to sustain that kind of attack for long.
123+
124+#### An Aside About Cryptographic Performance
125+
126+I'm not sure exactly how much faster HMAC is. According to DJB (https://ed25519.cr.yp.to/ed25519-20110705.pdf), an ECDSA signature can be created in around 30 microseconds and verified in around 100 microseconds. This source (https://www.jacksondunstan.com/articles/3206) suggests about 21 microseconds for HMAC-SHA256, so about a 1.5x improvement in generation speed and 5x in validation speed. We should verify these numbers for ourselves before making a decision.
127+
128+### DoS Protection Strategy and Timeline
129+
130+Tlon is not currently pursuing adding any of the extra cryptographic authentication on Ames packets described above. Since this is ultimately a performance issue, there are other more pressing performance issues that we could improve upon before decryption will become the limiting factor in how many packets can be processed by a ship. We will revisit this authentication performance question once some of the low-hanging fruit has been done, perhaps roughly a year from now.
131+
132+Since the audit, we’ve already improved the Ames packet format to allow faster parsing, faster validation of basic fields, and faster relaying; in the future, increases in performance of Nock execution and inter-process communication between Urbit's I/O process and Nock worker would allow Urbit to absorb somewhat more punishment before service can be effectively denied.
133+
134+## Enforcement of Social Boundaries
135+
136+While Urbit needs to rely largely on its runtime to mitigate unauthenticated attacks, any attack conducted from an Urbit ship needs to be handled inside Arvo itself, not just by IP filtering in the runtime. Just like in any DoS, an attacker ship might try to induce you to use too much memory, CPU, or disk space in order to sabotage normal operation. An authenticated attack is harder to define than an unauthenticated attack, because it depends on what social relationship the attacker and target have, and it involves valid, authenticated Ames packets; once discovered, though, it’s easier to mitigate, because it can use Urbit’s permanent identity system to enforce social consequences, i.e. stop listening to that Urbit address and possibly encourage others to do so as well.
137+
138+There are a couple of different kinds of authenticated attack: attempts to exploit vulnerabilities in the Nock worker (the interpreter, allocator, and jets) by causing particular Nock code to run, and attempts to induce the target to exhaust various computational resources.
139+
140+Protecting against attempts to break out of the sandbox and hijack or otherwise interfere with the Unix process running Nock will require a process of hardening, fuzzing, and likely further security audits specifically evaluating the security of that boundary. This is largely out of scope of the Ames protocol itself, which was the subject of this audit.
141+
142+This leaves us with the latter case: resource exhaustion attacks. A peer could try to get my ship to use too much RAM, disk, CPU, or bandwidth by sending it valid Ames packets. This represents a social problem: a person on the network is trying to interfere with me. It's what's known in blockchain circles as an "attributable fault": once the attack is detected, it's trivial to determine the identity of the culprit.
143+
144+Once the attacker’s Urbit address is known, Urbit will fall back on the Sybil resistance of its identity system: there are a finite number of identities, each of which costs some money. Because Urbit identities are relatively permanent, they can be blocked permanently. As long as the expected value of an authenticated attack is less than the cost of the identity, the attacks won't happen very much — they'll cost money to sustain, instead of being self-perpetuating.
145+
146+Attacks like this are best thought of as attempts to violate social boundaries. I don't want you using up too many of my resources; that's a social boundary, and an attempt to force my ship to spend its resources on your behalf constitutes a violation of this boundary. The strategy for mitigating these attacks is to impose social and, indirectly, economic consequences on the perpetrators. The main social consequence is other ships refusing to communicate with you anymore.
147+
148+Some of this mitigation will take place in the Arvo kernel, and some will need to be application-specific. To protect the system from attackers, the kernel needs to be able to free space (Urbit is a single-level store, so there's no distinction between disk and RAM from Arvo's perspective) taken up by unfinished messages sent by peers. This can be done by allowing an application to ask Ames to delete partially received messages from a peer, generally replacing the received packets with an intent to nack (negative acknowledgment) to indicate that the transaction the peer wanted me to perform has been rejected.
149+
150+Applications should also be able to set resource usage policies that the Arvo kernel will enforce. For example, a chat application should configure Ames to reject any chat messages larger than, say, two hundred kilobytes. A file-sharing application would need a much larger per-message limit (ideally no per-message limit), but it might need to place a cap on its bandwidth usage to make sure lower-latency communications aren't swamped by a large file transfer. This kernel/application interface starts to resemble a permissioning or capabilities system, and it could be built as part of the crucial larger project of providing for configurable application permissions.
151+
152+To close the loop on enforcing social boundaries, reputation information should be shared across ships. This will likely be done by building one or more applications that share statistics and block operations. Some forms of reputation are likely to be globally shared, whereas others are likely to be multipolar, i.e. some people like you and some don’t. Generally, the lower the layer of the attack, the more global the reputation effect will be; the higher the layer, the more multipolar. An attempt to spam the network with millions of malicious packets will cause most people not to want to talk to you; sending me a movie I found mediocre is probably not even information worth sharing with anyone else.
153+
154+
155+## Conclusion
156+
157+Ames’ design has unparalleled potential to deter, mitigate, and recover from attacks, since every packet is authenticated and encrypted and backed by a stable, decentralized PKI. It feels good to have our design for encryption and authentication be confirmed by a third party as cryptographically sound, and we know more or less what we need to build to reach the full security potential of the platform, including the steps outlined here.
content/blog/the-urbit-address-space.md+2−2
@@ -6,9 +6,9 @@ aliases = ["/posts/essays/the-urbit-address-space", "/posts/the-urbit-address-sp
66[extra]
77author = "Galen Wolfe-Pauly + Curtis Yarvin"
88ship = "~ravmel-ropdyl + ~sorreg-namtyv"
9−image = "https://media.urbit.org/site/blog-3.jpg"
9+image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/the-urbit-address-space.jpg"
1010+++
11−![](https://media.urbit.org/site/blog-3.jpg)
11+![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/the-urbit-address-space.jpg)
1212
1313## Basics
1414
content/blog/toward-a-new-clay.md+1−1
@@ -40,7 +40,7 @@ spartan than `bzr`.
4040
4141(In fact, it's really too spartan to fully use at the moment. We
4242ourselves still use `%clay` mainly as a distribution system, and
43−do all internal development on Github. This is because the
43+do all internal development on GitHub. This is because the
4444present `%clay` lacks a few little conveniences, like commit
4545messages. See upgrades, below.)
4646
content/blog/urbit-and-the-blockchain.md+6−5
@@ -6,9 +6,10 @@ aliases = ["/posts/essays/urbit-and-the-blockchain", "/posts/urbit-and-the-block
66[extra]
77author = "Curtis Yarvin"
88ship = "~sorreg-namtyv"
9−image = "https://media.urbit.org/site/blog-1.jpg"
9+image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/urbit-and-the-blockchain-1.jpg"
1010+++
11−![](https://media.urbit.org/site/blog-1.jpg)
11+
12+![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/urbit-and-the-blockchain-1.jpg)
1213
1314One core principle of the Urbit network is that *Urbit doesn't take sides*.
1415This is true in all kinds of conflicts -- and especially blockchain wars.
@@ -33,7 +34,7 @@ for this reason alone. (That said, Ethereum may be less exposed to Chinese
3334politics.)
3435
3536We chose ETH because it is the strongest *computational* chain. It is certainly
36−stronger than the way we're storing the Urbit land registry now: Github, plus
37+stronger than the way we're storing the Urbit land registry now: GitHub, plus
3738internal records.
3839
3940Urbit is not endorsing Ethereum. Urbit is not creating any appreciable monetary
@@ -57,7 +58,7 @@ wasn't between a blockchain and nothing. It was a choice between 21st-century
5758tools and 20th-century tools.
5859
5960The current Urbit land registry is divided into parts stored in various places:
60−Github commits, database records held by Tlon Corporation, and insecure keys on
61+GitHub commits, database records held by Tlon Corporation, and insecure keys on
6162a test network. This might have been fine, for us, in 2015. In 2017, it's
6263borderline unacceptable.
6364
@@ -181,7 +182,7 @@ friend help.
181182
182183Bitcoin maximalists understand that all monetary energy should concentrate in a
183184single currency. But land isn't money. And the technical details of the
184−implementation of the Urbit registry -- whether `OP_RETURN`, Ethereum, or Github
185+implementation of the Urbit registry -- whether `OP_RETURN`, Ethereum, or GitHub
185186-- have no effect on Bitcoin supply and demand.
186187
187188## Another reminder
content/blog/urbit-for-normies.md+1−1
@@ -160,7 +160,7 @@ Imagine, as is already becoming the case, that it becomes highly valuable to hav
160160
161161Some of these cases are, admittedly, a bit speculative since we haven’t built all the functionality yet. But it’s coming, and quite soon.
162162
163−For now, if you like the way this sounds you can [get yourself an Urbit ID](https://urbit.org/using/install/#id) and start learning about how to safely store cryptographic keys (it’s really not that hard, and we give you suggestions). If you’re feeling technical or adventurous, you can try booting our beta OS interface to see what it looks like. It’s fussy, but it exists. Soon it will be less fussy. You can check out our [roadmap](https://urbit.org/understanding-urbit/roadmap/) if you’d like to know when.
163+For now, if you like the way this sounds you can [get yourself an Urbit ID](https://urbit.org/getting-started/#id) and start learning about how to safely store cryptographic keys (it’s really not that hard, and we give you suggestions). If you’re feeling technical or adventurous, you can try booting our beta OS interface to see what it looks like. It’s fussy, but it exists. Soon it will be less fussy. You can check out our [roadmap](https://urbit.org/understanding-urbit/roadmap/) if you’d like to know when.
164164
165165## Why we need Urbit
166166
content/blog/value-of-address-space-pt1.md+8−6
@@ -14,6 +14,8 @@ image ="https://media.urbit.org/site/posts/essays/value-of-address-space-pt1.jpg
1414
1515<br>
1616
17+*This is the first in a series of three posts on Urbit address space. See also [part 2](https://urbit.org/blog/value-of-address-space-pt2/) and [part 3](https://urbit.org/blog/value-of-address-space-pt3/).*
18+
1719## Part One – What/why, a history, and some analogies
1820
1921Does Urbit address space have value?
@@ -88,15 +90,15 @@ Urbit was originally an experimental personal project. The original Urbit addres
8890
8991Once Urbit became a working prototype, in mid 2013, a company (Tlon) got off the ground to help develop Urbit and a number of other developers joined. At this point, Tlon bought half the address space from Curtis for what now looks like an exceptionally good deal. Then Curtis and Tlon each earmarked a significant chunk of address space for infrastructure and community development — we refer to this as the urbit.org address space, and it’s held by Tlon.
9092
91−From 2014-2018 Tlon and Curtis both gave away address space to individual contributors who were helping with the project. In 2016 and 2017, Tlon sold some of its address space in two crowdsales to fund the development of Urbit (which formatted the Urbit address space as a user-facing system).
93+From 2014-2018 Tlon and Curtis both gave away address space to individual contributors who were helping with the project. In 2016 and 2017, Tlon sold some of its address space in two crowdsales to fund the development of Urbit (which formatted the Urbit address space as a user-facing system). These sales were focused on getting address space into the custody of users with an interest in the technology and developing the network.
9294
9395It was then decided that a public key infrastructure was the most logical way to instantiate ownership of Urbit address space. Thus, after much [consideration](https://urbit.org/blog/urbit-and-the-blockchain/), Urbit ID was deployed to Ethereum in January 2019 under a set of contracts called Azimuth. At this point, there were about 2000 star holders and around 80 galaxy holders. We can’t be sure how many independent holders there are now — the address space is entirely out of our hands — but the distribution has been steadily increasing. Addresses trade regularly on urbit.live and Opensea, and are sold by a few other smaller outlets like planet.market and Urbit Marketplace, all of which are independent of Tlon.
9496
9597## Analogues and the intrinsic value of address space
9698
97−We’ve often said that Urbit address space, particularly stars and galaxies, have intrinsic value that should be understood beyond simply the price of the planets they contain. Another way of putting this is that, because stars and galaxies are infrastructure nodes, they’re uniquely positioned to generate cash flow from activities on the network beyond simply selling their planets.
99+We’ve often said that Urbit address space, particularly stars and galaxies, have intrinsic value that should be understood beyond simply the price of the planets they contain. Another way of putting this is that, because stars and galaxies are infrastructure nodes, they’re uniquely positioned to generate cash flow from activities on the network beyond simply selling their planets.
98100
99−Let’s dig a bit deeper into these activities through the lens of some analogues to the existing world.
101+This cash flow won't likely come from passive activity, but from actively working to develop businesses located on stars and galaxies. Let’s dig a bit deeper into these activities through the lens of some analogues to the existing world.
100102
101103### DNS
102104
@@ -112,7 +114,7 @@ CDNs (content delivery networks) are another useful comparison. Stars are perfec
112114
113115### Software distribution
114116
115−An infrastructure innovation that’s relevant here is that Urbit OS is specifically designed to make over-the-air (OTA) updates to the system — meaning software and updates are distributed automatically with no effort on the part of the end user. By default, planets and stars get their system updates from their sponsors. As the system evolves, we expect stars and galaxies to not only provide core system (kernel) updates, but also to act as software distribution hubs. This service likewise represents a potential profit center.
117+An infrastructure innovation that’s relevant here is that Urbit OS is specifically designed to make over-the-air (OTA) updates to the system — meaning software and updates are distributed automatically with no effort on the part of the end user. By default, planets and stars get their system updates from their sponsors. As the system evolves, we expect stars and galaxies to not only provide core system (kernel) updates, but also to act as software distribution hubs. Stars will distinguish themselves from one another by the quality of their service. Some might focus on speed of distrubtion; others on assesing the quality of the code they distribute. All of this represents effort on behalf of the star, and could act as a profit center for the star operator.
116118
117119### Payments and transactions
118120
@@ -132,13 +134,13 @@ Another approach to developing the value of address space that is already emergi
132134
133135These providers sell users a planet, host it for them, and deliver related services through their stars and galaxies. This means that with a couple of clicks an ordinary user could buy a planet, sign up for a hosting/routing bundle, get access to a set of services, and be immediately ready to interact with the community of their choice.
134136
135−There are plenty of other examples that we haven’t even imagined yet. The important thing is that stars will likely distinguish themselves through the services they provide. Since planets and stars can always change sponsors, a large part of the long-term monetization of a star or galaxy lies in the quality of service.
137+There are plenty of other examples that we haven’t even imagined yet. The important thing is that stars will likely distinguish themselves through the services they provide. Since planets and stars can always change sponsors, a large part of the long-term monetization of a star or galaxy lies in the quality of service that a given star operator provides.
136138
137139This independent ecosystem has a secondary benefit of creating a varied tapestry of digital environments on Urbit, since every community and every dealer-operator can customize as they see fit. That variety will make the landscape much more interesting and ripe for exploration than anything we might create with the top-down approach found on centralized services. That variety will also likely cause a range of values for planets depending on their sponsor or “location”.
138140
139141This ecosystem has already begun to emerge. Both Tlon and urbit.live are working on developing services along these lines, and we’ve heard from several other entrepreneurs considering similar offerings. This is emerging not simply because it serves a user need, but because it’s the directional flow of the system. In other words, it’s the simplest way to monetize address space while avoiding the oligarchic, surveillance-based, advertising-oriented systems we’re stuck with today.
140142
141−To summarize, our view is that Urbit address space is valuable because it’s useful and it’s scarce (also, it’s tradable and has network effect, but more on those later). What’s more, while the use case has already begun to take shape, it will grow in directions we can’t yet imagine because the system is designed to be extensible — Urbit is a homestead, not a hotel.
143+To summarize, our view is that Urbit address space is valuable because it’s useful and it’s scarce (and it has network effect, but more on that later). What’s more, while the use case has already begun to take shape, it will grow in directions we can’t yet imagine because the system is designed to be extensible — Urbit is a homestead, not a hotel.
142144
143145We’re looking forward to seeing what the world builds with Urbit.
144146
content/blog/value-of-address-space-pt2.md+16−12
@@ -14,9 +14,11 @@ image ="https://media.urbit.org/site/posts/essays/value-of-address-space-pt2.jpg
1414
1515<br>
1616
17+*This is the second in a series of three posts on Urbit address space. See also [part 1](https://urbit.org/blog/value-of-address-space-pt1/) and [part 3](https://urbit.org/blog/value-of-address-space-pt3/).*
18+
1719## Measuring value
1820
19−Value and price are distinct concepts that often get conflated. In our view, Urbit address space has value for four fundamental reasons: it’s scarce; it has utility; it’s tradeable with increasing liquidity; and it has network effect. Price, on the other hand, is always a function of supply and demand. Let’s take a look at these fundamentals within the Urbit ecosystem.
21+Value and price are distinct concepts that often get conflated. In our view, Urbit address space has value for four fundamental reasons: it’s scarce; it has utility; it has some limited liquidity; and it has network effect. Price, on the other hand, is always a function of supply and demand, and it's not something we – as builders – concern ourselves with very much. Let’s take a look at these fundamentals within the Urbit ecosystem.
2022
2123
2224
@@ -35,9 +37,9 @@ There are 256 galaxies on the network. Each galaxy is initialized with ownership
3537
3638There are 65,536 total stars on the network. In turn, each star is initialized with ownership of 65,536 planets. Stars currently trade on platforms independent of Tlon, such as [urbit.live](https://urbit.live/) and [opensea.io](https://opensea.io/). The current price range can easily be ascertained on those sites, but as of the time of this writing, stars are selling at a price that greatly discounts their planet holdings.
3739
38−We anticipate the relative pricing of stars and planets to align (so to speak) as Tlon and others increase education about Urbit, and as additional planet sellers and hosting providers enter the market.
40+One would expect that in an efficient market the relative pricing of stars on one hand, and planets on the other hand would eventually align (so to speak). This may come to pass as the Urbit community increases education about Urbit, and as additional planet sellers and hosting providers enter the space.
3941
40−Finally, there are 4,294,967,296 (or 2<sup>32</sup>) planets on the network. Planets currently trade largely in a range of $10 to $15. While we expect planet prices to fluctuate from provider to provider as described in the previous post, we also expect they will ultimately find an equilibrium price somewhere near their current range for two reasons. First, this range is affordable for most purchasers, and second, the cost to configure addresses for distribution is fairly static and acts as something of a price floor.
42+Finally, there are 4,294,967,296 (or 2<sup>32</sup>) planets on the network. Planets currently trade largely in a range of $10 to $15. We expect planet prices to fluctuate from provider to provider as described in the previous post, based on the quality of services various providers offer. That said, it's worth noting that the cost to configure addresses for distribution is fairly static and this may act as something of a lower bound.
4143
4244That said, we also anticipate that planet prices will be abstracted away from most purchasers, and will be included in bundled annual packages of hosting and data routing services. For this reason, infrastructure service providers (i.e. hosting providers) will likely be the best positioned parties to capture value from planet distribution.
4345
@@ -50,15 +52,15 @@ Utility (i.e. what Urbit addresses can be used for) has largely been addressed i
5052
5153As a refresher, this use value falls in five broad categories.
52541. Authentication technology is broadly useful. All Urbit identities — planets, stars, and galaxies — can be used for authenticating one’s Urbit computer, and for authentication in general. Urbit ID was designed for Urbit-specific authentication, but a lot of general functionality can be built on top of this infrastructure. Urbit ID is simple, extensible, and easy to use, making PGP style claims much more useful than they are today.
53−2. Network infrastructure services represent a revenue stream. Stars and galaxies specifically should be understood primarily as revenue-generating network infrastructure. We anticipate that stars and galaxies will eventually charge for infrastructure related services, like hosting and packet routing, and will distinguish themselves on quality and service.
55+2. Network infrastructure services represent a potential revenue stream. Stars and galaxies specifically should be understood as providing their owners the opportunity to develop and use network infrastructure. We anticipate that stars and galaxies will eventually charge for infrastructure related services, like hosting and packet routing, and will distinguish themselves on quality and service.
54563. Stars and galaxies are well positioned to offer additional services. Because of their role as high level network nodes, stars and galaxies are uniquely positioned to offer additional services, including content delivery networks (CDNs), Bitcoin and other blockchain-related nodes, 0x relays, and Tor exit nodes.
55574. Schelling points have value. Because stars and galaxies hold a certain authority on the network (by dint of their relationship to their subsidiary nodes), they act as [Schelling points](https://nav.al/schelling-point), or default hubs, for various activities that will arise as the network grows. Already various groups and communities are beginning to collect around stars. This gravity has value and will eventually be priced.
56−5. Voting has value. Galaxies exclusively hold a vote on the network. This voting right can be separated from the galaxy itself and transferred, and we anticipate that this will happen eventually. The value of this right has not yet been priced into the market, though as Urbit adoption grows, the value of a vote will emerge and increase.
58+5. Voting has value. Galaxies exclusively hold a vote on the network. This voting right can be separated from the galaxy itself and transferred, and we anticipate that this will happen eventually. The value of this right has not and may never be priced into the market, though as Urbit adoption grows, the value of a vote may emerge.
5759
5860Utility is only one component of a value calculation. To further develop the inquiry into value, let’s move on to trading factors.
5961
6062## Trading, volume, and liquidity
61−Urbit IDs are individually represented by non-fungible ERC-721 tokens, and are therefore tradable on the open market by any platform that supports this token standard. Currently there are three known Urbit-exclusive sales platforms and one generalized ERC-721 trading platform that list Urbit IDs. Aggregate market prices for stars and planets are readily available. Volume is low, as no effort has been made to promote the fact of availability, yet the number of [total transactions](https://azimuth.network/stats/events.txt) has increased steadily since the network was launched to Ethereum in 2019, even absent public messaging.
63+Urbit IDs are individually represented by non-fungible ERC-721 tokens, and can therefore be sold by any platform that supports this token standard. Currently there are three known Urbit-exclusive sales platforms and one generalized ERC-721 platform that list Urbit IDs. Prices for stars and planets are readily available. Volume is low, as no effort has been made to promote the fact of availability, yet the number of [total transactions](https://azimuth.network/stats/events.txt) has increased steadily since the network was launched to Ethereum in 2019, even absent public messaging.
6264
6365<br>
6466<img class="" src="https://media.urbit.org/site/posts/essays/value-of-address-space-pt2-tps.svg">
@@ -68,7 +70,7 @@ Urbit IDs are individually represented by non-fungible ERC-721 tokens, and are t
6870<img class="" src="https://media.urbit.org/site/posts/essays/value-of-address-space-pt2-tss.svg">
6971<br>
7072
71−Trading non-fungible tokens like Urbit IDs is rather different than trading quasi-fungible tokens like Bitcoin (even setting aside the issue of volume). Each Urbit ID is unique, and so they tend to be purchased by end users for their specific characteristics, rather than generically. As an example, the planet `~parret-barret` sold for about $1,000 at a time when most planets were selling for $10-20, perhaps due to its rhyming name. Planets with circular sigils also often sell for significantly above market rate — we’re not entirely sure why this is the case.
73+Buying non-fungible tokens like Urbit IDs is rather different than trading quasi-fungible tokens like Bitcoin (even setting aside the issue of volume). Each Urbit ID is unique, and so they tend to be purchased by end users for their specific characteristics, rather than generically. As an example, the planet `~parret-barret` sold for about $1,000 at a time when most planets were selling for $10-20, perhaps due to its rhyming name. Planets with circular sigils also often sell for significantly more than other planets — we’re not entirely sure why this is the case.
7274
7375## Planet Sales
7476
@@ -88,9 +90,7 @@ Trading non-fungible tokens like Urbit IDs is rather different than trading quas
8890
8991This ID-specific trading pattern is generally appropriate in our view: Urbit ID isn’t designed to be rapidly traded at high volume. Urbit is more like a house than a fungible good like a currency.
9092
91−Nevertheless, it would be theoretically possible to create a more traditional orderbook for unstarted addresses. Unstarted addresses have different names and sigils, but they’re functionally the same in every other way, so they could be collateralized to a specific token to encourage price discovery. This hasn’t happened, and Tlon has no intention of releasing such functionality, but it’s worth mentioning in a discussion of liquidity.
92−
93−For the time being trading of Urbit IDs happens through auctions on specific platforms, and via person-to-person transactions, because each trade is for a _specific_ Urbit ID. Again, Urbit ID is designed in the spirit of property titles, rather than currencies, so this makes sense.
93+For the time being buying and selling of Urbit IDs happens through auctions on specific platforms, and via person-to-person transactions, because each transaction is for a _specific_ Urbit ID. Again, Urbit ID is designed in the spirit of property titles, rather than currencies, so this makes sense.
9494
9595Strictly speaking, liquidity is a measure of the degree to which a given asset will change in value due to a given transaction. In that sense, Urbit address space is likely fairly illiquid. But liquidity can’t be properly understood without volume. As noted above, the volume of transactions on the network has been steadily increasing since inception, and yet the price has remained fairly constant. This seems to indicate a healthy ratio.
9696
@@ -100,7 +100,7 @@ Strictly speaking, liquidity is a measure of the degree to which a given asset w
100100
101101<br>
102102
103−A further impact on liquidity and volume is that of available supply. At present, the majority of Urbit address space is locked by smart contracts. These lockups began to release at varying linear rates in January 2019. All address space will be completely unlocked and tradeable by January 2025. We anticipate initial downward price pressure on stars and planets as availability outstrips initial demand. Eventually as both understanding and demand increase, we anticipate that planets will find their equilibrium price, and stars will be repriced accordingly.
103+A further impact on liquidity and volume is that of available supply. At present, the majority of Urbit address space is locked by smart contracts. These lockups began to release at varying linear rates in January 2019. All address space will be completely unlocked and tradeable by January 2025. Eventually as both understanding and demand increase, we anticipate that planets will find an equilibrium price, and stars will be repriced accordingly.
104104
105105We’ll discuss lockups and spawning limits in more detail in the third installment of this series.
106106
@@ -122,7 +122,9 @@ Digging deeper, Urbit is unusual as a network for the following interrelated rea
122122The upshot is that Urbit can serve as the meta-network for many different kinds of individual networks, each with their own value. Urbit is much more akin to the internet itself than it is to, say, Facebook. Reed’s and Metcalf’s laws therefore apply to Urbit in some very interesting ways.
123123
124124## Network laws
125−Three laws are typically cited to express the value of a network:
125+Before diving into a discussion of network effect, it's worth noting that although individual tokens and users of those tokens benefit in various ways from a thriving network, the structure of the Urbit network does not grant token holders any rights to profits or losses "generated by the network" as a whole. In fact the very notion is counter to the intent of Urbit's ethos of decentralization. Individuals on the network may profit by their own activities, but there is no central authority profiting off activity in the aggregate; there is no ownership of the network as a whole, and so there are no centralized profits and losses to share. Address space tokens represent one's ownership of their own parcel of land as it were.
126+
127+That said, an entire continent may have aggregate value even though it is distributed. To explore this notion with regards to Urbit, it's worth reviewing the three laws typically cited to express the value of a network as a whole:
126128- Sarnoff’s law states that the value of a network increases proportionally to its size. This is widely understood to understate the value of most modern networks.
127129- Metcalf’s law states that the value of a network is the square of the number of users (n^2).
128130- Reed’s law states that the value of a network increases with the number of groups that can be built on the network. This is expressed as 2^n, where n is the number of groups.
@@ -133,6 +135,8 @@ Urbit is a network of networks, and so is best described by Reed’s law.
133135
134136Urbit’s unique approach to groups also helps resolve two other problems which lead to value loss in many networks: Urbit’s design significantly reduces both network pollution (i.e. irrelevant feeds) and network congestion (clogged bandwidth), as individual clusters can easily separate their activity from other networks on the platform.
135137
138+
139+
136140## Urbit is a platform network
137141It’s important to note that Urbit has utility absent the network, as Urbit OS is in fact a Turing-complete virtual computer. Though the system is designed around communities, individuals can use Urbit to create personal documents, archive data, and write code for the system. This is how Urbit’s total network size can be relatively small and still provide value for individual users and clusters. However, Urbit already has users, and for many of these, critical mass — the point at which the network is more valuable than its cost — has already been reached. In addition, as each of these individual clusters writes code for the platform, positive indirect network effects increase (more utility arises from these individual development efforts).
138142
content/blog/value-of-address-space-pt3.md+13−13
@@ -14,6 +14,8 @@ image ="https://media.urbit.org/site/posts/essays/value-of-address-space-pt3.jpg
1414
1515<br>
1616
17+*This is the third in a series of three posts on Urbit address space. See also [part 1](https://urbit.org/blog/value-of-address-space-pt1/) and [part 2](https://urbit.org/blog/value-of-address-space-pt2/).*
18+
1719It has been some time since we revisited this series of posts, so let’s start with a summary.
1820
1921Our framework for understanding the value of Urbit address space is that it’s useful, it’s rare, it’s easy to exchange, and the more that people use it, the more useful it becomes. Let’s briefly review each concept in a little more detail.
@@ -36,7 +38,7 @@ One way to think about galaxies, stars, and planets is that they’re different-
3638
3739Booted and Unbooted Addresses –
3840
39−A booted address is one that has actually been used to boot Urbit OS. By convention, booted addresses are expected to have some existing reputation outside of their name alone, since they’ve been used on the network. Reputation, good and bad, comes in many forms. Did the address operate any useful infrastructure? Did it get placed on any blacklists for spam or abuse? Did it simply send and receive messages? The ability to programatically track reputation is still in its infancy, but we expect the tooling to develop as urbit grows.
41+A booted address is one that has actually been used to boot Urbit OS. By convention, booted addresses are expected to have some existing reputation outside of their name alone, since they’ve been used on the network. Reputation, good and bad, comes in many forms. Did the address operate any useful infrastructure? Did it get placed on any blacklists for spam or abuse? Did it simply send and receive messages? The ability to programatically track reputation is still in its infancy, but we expect the tooling to develop as Urbit grows.
4042
4143Unbooted addresses, on the other hand, have no reputation. Both booted and unbooted addresses can be transferred between owners, but booted addresses will likely vary widely in price depending on the reputation each of them has acquired, and how they’ve been used.
4244
@@ -44,7 +46,7 @@ For the purposes of this discussion, we’re primarily referring to unbooted add
4446
4547Locked vs. Unlocked Addresses –
4648
47−At present, the majority of Urbit address space is locked by smart contracts. When Urbit address space was first registered on the Ethereum blockchain, this unlocking mechanism was put in place to prevent the market from being flooded. A young Urbit network in which all of the address space had been unlocked would be exposed to attacks by bots and spammers. Scarcity, on the other hand, encourages good behavior as it increases the cost to spam.
49+At present, the majority of Urbit address space is locked by smart contracts. When Urbit address space was first registered on the Ethereum blockchain, this unlocking mechanism was put in place to prevent the network from being flooded with users. A young Urbit network in which all of the address space had been unlocked would be exposed to attacks by bots and spammers. Scarcity, on the other hand, encourages good behavior as it increases the cost to spam.
4850
4951A locked star is held in a contract and can neither be booted nor issue planets. The lockup contracts can be examined on [GitHub](https://github.com/urbit/azimuth).
5052
@@ -63,7 +65,7 @@ These lockups all began to release at varying linear rates in January 2019 (spec
6365The various linear unlocking schedules are grouped as follows:
6466
6567- The urbit.org addresses, and early prize winners unlock linearly from 2019-2021.
66−- Tlon, its founders, employees, and its investors were frozen for a year, and now unlock linearly from 2020-2024.
68+- Tlon, its founders, employees, and most purchasers from Tlon were frozen for a year, and now unlock linearly from 2020-2024.
6769- 2018 private buyers were frozen for a year, and then began to unlock linearly over the course of one or three years, depending on the terms of their respective contracts.
6870- Earlier private buyer addresses—including those in our first two crowdsales—were unlocked right away.
6971
@@ -85,7 +87,7 @@ When we layer the spawning limits over the various lockup contracts, we find tha
8587
8688## Address space distribution
8789
88−Address space has continued to change hands since we put the Urbit on-chain in January 2019. At that time, we had a fairly granular understanding of who owned what. Today we only have precise numbers for the Tlon and urbit.org owned address space. Galaxies change hands quite infrequently, so we know more about that ownership table than stars and planets. We know next to nothing about the distribution of planets.
90+Address space has continued to change hands since we put Urbit on-chain in January 2019. At that time, we had a fairly granular understanding of who owned what. Today we only have precise numbers for the Tlon and urbit.org owned address space. Galaxies change hands quite infrequently, so we know more about that ownership than stars and planets. We know next to nothing about the distribution of planets.
8991
9092We consider the opacity of our understanding about transactions on the network to be a privacy feature rather than a bug. To be specific about the information we can collect here: first, we don’t know anything about users beyond their ETH address, and second, we can’t tell the difference between a transfer of an address, and the re-keying of an address. This means we’re never entirely sure if a transfer has in fact occurred; we only know that the address has changed.
9193
@@ -95,21 +97,21 @@ The chart below is an estimate (as of January 2020) based on our general underst
9597<img class="ba" src="https://media.urbit.org/site/posts/essays/value-of-address-space-pt3-graph4.png">
9698<br>
9799
98−Address space distribution is best understood in terms of galaxies and stars independently, as they’re distinct asset classes. The chart above only illustrates galaxy distribution, but describes Tlon’s “naked” galaxy holdings, which are galaxies empty of their stars. These galaxies are empty because the stars they once contained have been distributed, primarily to Tlon contractors, employees, and to certain private buyers.
100+Address space distribution is best understood in terms of galaxies and stars independently, as they’re distinct assets. The chart above only illustrates galaxy distribution, but describes Tlon’s “naked” galaxy holdings, which are galaxies empty of their stars. These galaxies are empty because the stars they once contained have been distributed, primarily to Tlon contractors, employees, and to certain private buyers.
99101
100−We believe that wide distribution is important to the health of the network and the growth of Urbit as a whole. Our own distribution efforts in conjunction with a robust secondary market, will disburse Urbit address space ownership as broadly as possible.
102+We believe that wide distribution is important to the health of the network and the growth of Urbit as a whole. Our own distribution efforts are focused on disbursing Urbit address space ownership as broadly as possible to those interested in using and developing the network.
101103
102−We intend to further distribute Tlon’s address space over the coming years through private sales, employee compensation, grants, bounties, and gifts. It’s worth noting that the grants and bounties program specifically is set to increase dramatically. We’re very much interested in putting address space in the hands of people interested in helping develop the network; we see grants as the perfect mechanism for doing so.
104+We intend to further distribute Tlon’s address space over the coming years through private sales, employee compensation, grants, bounties, and gifts. It’s worth noting that the grants and bounties program specifically is set to increase in coming years. We’re very much interested in putting address space in the hands of people interested in helping develop the network; we see grants as the perfect mechanism for doing so.
103105
104106## Usage data and composition
105107
106−Usage data is an obvious missing piece of the puzzle in this discussion. We understand this, and yet we don’t actively capture usage data, for two important reasons: it’s premature, and Urbit is privacy focused by design.
108+Usage data is an obvious missing piece of the puzzle in this discussion. We understand this, and yet we don’t actively capture usage data, for two important reasons: it’s premature, and Urbit is privacy-focused by design.
107109
108110First, it’s too early. Urbit’s current users are a fanbase of pioneers who are willing to put up with the challenges of a young network. This fanbase grows on its own, but Tlon doesn’t actively encourage that growth yet. For the vast majority of potential users, the barriers to entry are still high enough that an invitation would risk losing them permanently. You can think of Urbit today as being a developer alpha.
109111
110112We’re laying the groundwork so that we can, in earnest, invite our friends and communities to a network they will love. That means we’re designing smooth onboarding, an elegant user interface, and increasing the stability of both the system and network. Tlon’s forthcoming hosting services will vastly reduce barriers to entry, and will be our first major push into the public sphere.
111113
112−Second, and perhaps more importantly, capturing data about traction on the network is difficult by design. Due to Urbit's privacy-forward architecture, there’s quite a lot we will never know. Once an Urbit is up and running, we don’t know how often it operates, where it’s hosted, or what it’s doing. This makes capturing usage metrics challenging, but we think this is the right problem to have.
114+Second, and perhaps more importantly, capturing data about traction on the network is difficult by design. Due to Urbit's privacy-forward architecture, there’s quite a lot we will never know. Once an Urbit ID is up and running, we don’t know how often it operates, where it’s hosted, or what it’s doing. This makes capturing usage metrics challenging, but we think this is the right problem to have.
113115
114116The Network Explorer –
115117
@@ -119,12 +121,10 @@ Urbit’s privacy-forward design makes collection of data appropriately impossib
119121
120122Closing –
121123
122−We have long said that Urbit address space had value because it was both useful and scarce. Taking a deeper look, we found that tradeability and network effect also play an important role in the value framework.
123−
124−The market seems to agree with our hypothesis, and price has remained fairly steady even at a time when we’re not promoting Urbit to the public.
124+We have long said that Urbit address space had value because it was both useful and scarce. Taking a deeper look, we found that some limited liquidity, and network effect also play an important role in the value framework.
125125
126126All of the factors that make up our framework are, in turn, impacted by availability of supply and by user growth. In the Urbit ecosystem, supply is effectively gated—as described above—in order to prevent flooding of the network.
127127
128128User growth, on the other hand, is something we simply have not yet pursued in earnest. Instead, our development efforts have been focused on enhancing usability and stability of the platform. Our focus on user growth will begin as we roll out hosting. Once that happens, usage metrics will become both more interesting and more relevant.
129129
130−This concludes the final installment of our series on the value of Urbit address space. Though the explanation was long, the framework is quite simple: value in Urbit is derived from its use, scarcity, tradeability, and network effect. Let us know if you’d like us to dig deeper into any of these elements—we’re always happy to opine about Urbit.
130+This concludes the final installment of our series on the value of Urbit address space. Though the explanation was long, the framework is quite simple: value in Urbit is derived from its use, scarcity, some liquidity, and network effect. Let us know if you’d like us to dig deeper into any of these elements—we’re always happy to opine about Urbit.
content/blog/what-is-urbit-for.md+2−2
@@ -6,9 +6,9 @@ aliases = ["/posts/essays/what-is-urbit-for", "/posts/what-is-urbit-for"]
66[extra]
77author = "Galen Wolfe-Pauly"
88ship = "~ravmel-ropdyl"
9−image = "https://media.urbit.org/site/blog-1.jpg"
9+image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/what-is-urbit-for.jpg"
1010+++
11−![](https://media.urbit.org/site/blog-1.jpg)
11+![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/what-is-urbit-for.jpg)
1212
1313Open platforms don't beat closed systems just because they're open.
1414They win because you can do more exciting things with them. We
content/blog/why-urbit-probably-does-not-need-a-blockchain.md+2−2
@@ -6,9 +6,9 @@ aliases = ["/posts/essays/why-urbit-probably-does-not-need-a-blockchain/", "/pos
66[extra]
77author = "Curtis Yarvin"
88ship = "~sorreg-namtyv"
9−image = "https://media.urbit.org/site/blog-1.jpg"
9+image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/why-urbit-probably-does-not-need-a-blockchain.jpg"
1010+++
11−![](https://media.urbit.org/site/blog-1.jpg)
11+![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/why-urbit-probably-does-not-need-a-blockchain.jpg)
1212
1313TLDR: Urbit (probably) doesn't need a blockchain, because the Urbit
1414address-space PKI is a special case of a consensus ledger (itself a
content/community/community-grants.md+1−1
@@ -7,7 +7,7 @@ hideprevious = "true"
77hidenext = "true"
88+++
99
10−Interested in getting your community on Urbit? We are currently accepting applications for select groups to get started on Urbit together using an [invite pool](@/docs/tutorials/creating-an-invite-pool.md).
10+Interested in getting your community on Urbit? We are currently accepting applications for select groups to get started on Urbit together using an [invite pool](@/using/id/creating-an-invite-pool.md).
1111
1212To get started, fill out the application below. Any information you share will be held privately, and only for the purpose of consideration for the grant.
1313
content/community/governance.md+1−1
@@ -20,6 +20,6 @@ For off-chain process around proposals, as suggested by core developers, please
2020
2121The group of core developers manages Urbit’s [GitHub repository](https://github.com/urbit/), which controls Arvo, Urbit’s operating system. Changes and upgrades are decided upon by consensus.
2222
23−You can participate in the governance of the senate by acquiring a galaxy. If you would like to be involved with the governance of Arvo, check out our [developer guide](@/using/develop.md) to learn how you can contribute to core development.
23+You can participate in the governance of the senate by acquiring a galaxy. If you would like to be involved with the governance of Arvo, check out our [developer guide](@/docs/development/develop.md) to learn how you can contribute to core development.
2424
2525
content/community/hoonschool.md+2−10
@@ -8,16 +8,8 @@ hideprevious = "true"
88hidenext = "true"
99+++
1010
11−Interested in developing on Urbit? You’ll want to learn [Hoon](https://urbit.org/docs/tutorials/hoon/hoon-school/), a functional programming language that’s custom-designed for use with Arvo, the Urbit operating system.
11+Hoon School and Hooniversity (the community run Hoon School project) are currently on hiatus pending a rework of the course.
1212
13−We want you to learn Hoon, too. That’s why we’re offering Hoon School: a free, online, asynchronous program that’s fully supported by an instructor. We currently offer a 101-level course.
14−
15−[Apply below ↓](#apply)
16−
17−## Hoon 101
18−
19−Hoon 101 is a six-week, introductory-level course. It’s appropriate for motivated learners with no programming experience, and for those familiar with other programming languages. You’ll leave Hoon 101 with a strong understanding of the language’s fundamentals. Expect to devote four hours a week to this course.
20−
21−The next Hoon School session, Session 4, will be held from **April 6th to May 17th**. Enroll now!
13+You can still apply below and we'll let you know when the new course is ready!
2214
2315<iframe id="apply" src="https://docs.google.com/forms/d/e/1FAIpQLSdcEoEqpFvB1WCTKPaYUSbJcjQ2nHk_z4XcZPIQc0SFD1rgmA/viewform?embedded=true" width="640" height="1350" frameborder="0" marginheight="0" marginwidth="0">Loading…</iframe>
content/community/meetups.md+2−2
@@ -10,8 +10,8 @@ hide_next_title = "true"
1010+++
1111
1212<picture>
13−<source src="https://media.urbit.org/site/meetup.jpg">
14−<img class="mt4" src="https://media.urbit.org/site/meetup.jpg"/>
13+<source src="https://media.urbit.org/site/meetup1.jpg">
14+<img class="mt4" src="https://media.urbit.org/site/meetup1.jpg"/>
1515</picture>
1616
1717Turns out that getting Urbit fans together in one room is pretty fun. Here's an incomplete list of community-led Urbit IRL groups. These events are generally informal and very approachable – feel free to dive in.
content/docs+1−1

Submodule changed.

content/events/2017-08-11-after-hours-bootstrapping-urbit-from-the-ethereum-blockchain.mdnew file+20
@@ -0,0 +1,20 @@
1+
2++++
3+title = "After hours: Bootstrapping Urbit from the Ethereum blockchain"
4+date = 2017-08-11
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "20:00 PST"
9+location = "Urbit Office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/242295411/"
12++++
13+
14+This time we'll be opening up the office, opening up a few cold ones, and talking about Urbit + Ethereum.
15+
16+One thing that's been keeping us busy over the past month is designing the relationship between Urbit and the Ethereum blockchain.  We'll present our current design for this (from ~8:30 - 9) for people to comment on and ask questions about.
17+
18+Otherwise, as usual, there will be plenty of time to hang out and chat with other Urbit people.  
19+
20+The backyard is really nice in the evening!  Feel free to bring friends
content/events/2017-09-22-after-hours-fun-with-arvo-the-urbit-os.mdnew file+20
@@ -0,0 +1,20 @@
1+
2++++
3+title = "After hours: Fun with %arvo (the Urbit OS)"
4+date = 2017-09-22
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "20:00 PST"
9+location = "Urbit Office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/243213975/"
12++++
13+
14+Same as usual: cold drinks in the backyard with the hoons.  Come meet other people crazy enough to want to replace the internet.  
15+
16+Ted, the newest addition to our team, has been working on making changes to %arvo all over the place.  He'll give a short talk about some of his adventures in the Urbit OS and how they're going to make Urbit faster and easier to use.
17+
18+That, and discussing why Equifax should have never been holding all that customer data in the first place.
19+
20+Oh yeah, and we just got a fresh batch of Nock shirts!
content/events/2017-10-26-after-hours-designing-robust-human-systems.mdnew file+20
@@ -0,0 +1,20 @@
1+
2++++
3+title = "After hours: Designing robust human systems"
4+date = 2017-10-26
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "20:00 PST"
9+location = "Urbit Office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/244316080/"
12++++
13+
14+The office will be open and the beer will be cold.  Come hang out and talk about all things Urbit and Urbit related.  Cryptoeconomics, protocols, architecture, Japanese poetry, ancient aqueducts.  You get the idea.
15+
16+Galen is going to give a short (~20m) talk on designing robust human systems.  No code, no math, no time in the terminal.  This is a completely non-technical talk about design principles.  It was originally given at the IDEO Blueprint event a few weeks ago.  
17+
18+Above all, these meetups are for meeting other people crazy enough to think the internet can be replaced.  
19+
20+Feel free to bring friends!  
content/events/2017-11-16-after-hours-visiting-contributors.mdnew file+18
@@ -0,0 +1,18 @@
1+
2++++
3+title = "After hours: Visiting contributors"
4+date = 2017-11-16
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "20:00 PST"
9+location = "Urbit Office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/245090392/"
12++++
13+
14+We've moved! Come check out our new digs, have a beer and hear about what people have been working on. 
15+
16+This week we have ~mastyr-morzod, ~littel-ponnys and ~mastyr-harlud visiting the office. They've all been contributing great stuff from afar, so we figured out how to get them all in the same room to hack on Urbit for the week. On Thursday evening they'll talk about what they've been coming up with.
17+
18+We'll also spend plenty of time just hanging around and talking about Parity, BCH, and everything else crypto-related. Feel free to bring friends!
content/events/2018-01-26-urbit-irl-20181.mdnew file+18
@@ -0,0 +1,18 @@
1+
2++++
3+title = "Urbit IRL ~2018.1"
4+date = 2018-01-26
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "20:00 PST"
9+location = "Urbit office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/246972285/"
12++++
13+
14+Happy New Year!
15+
16+Turns out that just getting Urbit fans in one room is pretty fun — so come join. No demos or talks this time. Just some time to hang, listen to music and meet up IRL. The room is full of desks and the internet is pretty fast. So impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you.
17+
18+Feel free to bring friends!
content/events/2018-02-23-urbit-irl-20182.mdnew file+18
@@ -0,0 +1,18 @@
1+
2++++
3+title = "Urbit IRL ~2018.2"
4+date = 2018-02-23
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "20:00 PST"
9+location = "Urbit office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/247797527/"
12++++
13+
14+Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have something to drink.
15+
16+No demos or talks. Just some time to hang, listen to music and meet up IRL. The room is full of desks and the internet is pretty fast. So impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you. Or just relax and talk to people.
17+
18+Feel free to bring friends!
content/events/2018-03-11-20183-hoon-school.mdnew file+16
@@ -0,0 +1,16 @@
1+
2++++
3+title = "~2018.3 Hoon School"
4+date = 2018-03-11
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "14:00 PST"
9+location = "Urbit office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/248416276/"
12++++
13+
14+Come, bring your laptop, and we'll get you started building things in Urbit's language — Hoon.
15+
16+There's no lesson per-se, think of it more like an 'independent projects' class. A few of us will be around to help you get started working on whatever you're interested in. It's completely fine if you're new to the language. We're going to start with only 10 spots so we can help everyone individually.
content/events/2018-03-23-urbit-irl-20183.mdnew file+18
@@ -0,0 +1,18 @@
1+
2++++
3+title = "Urbit IRL ~2018.3"
4+date = 2018-03-23
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "20:00 PST"
9+location = "Urbit office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/248852261/"
12++++
13+
14+Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer.
15+
16+No demos or talks. Just some time to hang, listen to music and meet up IRL. The room is full of desks and the internet is pretty fast. So impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you. Or just relax and talk to the weird array of people who also want to replace the internet.
17+
18+Feel free to bring friends!
content/events/2018-04-08-20184-hoon-school.mdnew file+16
@@ -0,0 +1,16 @@
1+
2++++
3+title = "~2018.4 Hoon School"
4+date = 2018-04-08
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "13:00 PST"
9+location = "Urbit office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/249019207/"
12++++
13+
14+Come, bring your laptop, and we'll get you started building things in Urbit's language — Hoon.
15+
16+There's no lesson per-se, think of it more like an 'independent projects' class. A few of us will be around to help you get started working on whatever you're interested in. It's completely fine if you're new to the language. We're going to start with 20 spots so we can help everyone individually.
content/events/2018-05-25-urbit-irl-20185.mdnew file+18
@@ -0,0 +1,18 @@
1+
2++++
3+title = "Urbit IRL ~2018.5"
4+date = 2018-05-25
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "20:00 PST"
9+location = "Urbit office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/250889557/"
12++++
13+
14+Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer (or wine).
15+
16+Ted will give a quick update on Urbit's new build system, ford. Then it's time to hang, listen to music (our friend Grayson will be playing records) and meet up IRL. The room is full of desks and the internet is pretty fast. Impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you. Or just relax and talk to the weird array of people who also want to replace the internet.
17+
18+Feel free to bring friends!
content/events/2018-08-03-after-hours-decentralized-web-summit.mdnew file+14
@@ -0,0 +1,14 @@
1+
2++++
3+title = "After hours 'decentralized web summit'"
4+date = 2018-08-03
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "17:00 PST"
9+location = "Orbit Room"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/253423219/"
12++++
13+
14+We’re hosting a last minute happy hour for our friends in town for the Decentralized Web Summit. All are welcome to join us tomorrow, Friday, August 3 at the Orbit Room from 5-7PM.
content/events/2018-08-17-urbit-irl-20188.mdnew file+20
@@ -0,0 +1,20 @@
1+
2++++
3+title = "Urbit IRL ~2018.8"
4+date = 2018-08-17
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "20:00 PST"
9+location = "Urbit Office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/253292678/"
12++++
13+
14+UPDATE: Hey Everyone! Due to a conflict, we are rescheduling our gathering to the following Friday, August 17.
15+
16+Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer.
17+
18+No demos or talks this time, but we will be hosting Hoon School again soon. Just some time to hang, listen to music and meet up IRL. The room is full of desks and the internet is pretty fast. So impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you. Or just relax and talk to the weird array of people who also want to replace the internet.
19+
20+Feel free to bring friends!
content/events/2018-09-21-urbit-irl-20189.mdnew file+18
@@ -0,0 +1,18 @@
1+
2++++
3+title = "Urbit IRL ~2018.9"
4+date = 2018-09-21
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "20:00 PST"
9+location = "Urbit Office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/254602025/"
12++++
13+
14+Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer (or wine).
15+
16+Gavin will give an update on Urbit design at 8:30. Then it's time to hang, listen to music and meet up IRL. The room has tables and the internet is pretty fast. Impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you. Or just relax and talk to the weird array of people who also want to replace the internet.
17+
18+Feel free to bring friends!
content/events/2018-10-10-urbit-zcash-blockchain-week.mdnew file+24
@@ -0,0 +1,24 @@
1+
2++++
3+title = "Urbit + Zcash: 'Blockchain Week'"
4+date = 2018-10-10
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "19:00 PST"
9+location = "Urbit Office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/255001807/"
12++++
13+
14+We're all full and looking forward to seeing you tonight. After you check-in at the front door please come up to floor 2, room 222.
15+
16+~Schedule
17+
18+7 - 8: Come on time for hot pizza!
19+
20+8 - 8:30: Alejandro Machado, researcher, advocate, and member of the Zcash community will speak
21+
22+8:30 - 9: Galen Wolfe-Pauly will tell you things about Urbit and our wallet
23+
24+9 - 10: Hangout
content/events/2018-12-20-after-hours-its-just-a-party-man.mdnew file+18
@@ -0,0 +1,18 @@
1+
2++++
3+title = "After hours: It's just a party, man"
4+date = 2018-12-20
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "19:00 PST"
9+location = "Urbit Office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/256732938/"
12++++
13+
14+We had a busy and productive 2018. This time around, we're just going to play music and relax.
15+
16+Come have a beer, connect with Urbit developers, fans and friends IRL, and ask questions about the address space going on-chain (if you have them).
17+
18+Feel free to bring friends!
content/events/2019-03-01-after-hours-ask-galen-anything.mdnew file+20
@@ -0,0 +1,20 @@
1+
2++++
3+title = "After hours: Ask Galen Anything"
4+date = 2019-03-01
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "19:30 PST"
9+location = "Urbit Office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/259144802/"
12++++
13+
14+We thought we'd try something new this month. Come hang out and ask Galen questions about Azimuth, Arvo, or any part of Urbit.
15+
16+8:00-9:00pm: AMA
17+
18+Afterwards, have a beer, connect with Urbit developers, fans, and friends IRL.
19+
20+Feel free to bring friends and share the primer. <a href="https://urbit.org/primer" class="linkified">https://urbit.org/primer</a>
content/events/2019-03-08-urbit-irl-austin-tx.mdnew file+16
@@ -0,0 +1,16 @@
1+
2++++
3+title = "Urbit IRL: Austin, TX"
4+date = 2019-03-08
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "17:00 PST"
9+location = "Garage"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/259307805/"
12++++
13+
14+We're coming to Austin, TX! It turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a drink on us. Feel free to bring friends and come early for Urbit shirts.
15+
16+Thank you to our friends over at Garage for hosting us. We'll be there from 5-7 PM.
content/events/2019-04-19-urbit-irl-20194.mdnew file+20
@@ -0,0 +1,20 @@
1+
2++++
3+title = "Urbit IRL ~2019.4"
4+date = 2019-04-19
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "19:00 PST"
9+location = "Urbit Office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/260326318/"
12++++
13+
14+Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer (or wine).
15+
16+By popular demand: we'll try to keep this one QUIET so everybody can talk.
17+
18+Come for a quick update on what we're working on. Stay to relax and talk to a weird array of people who also want to replace the internet.
19+
20+Feel free to bring friends!
content/events/2019-05-17-urbit-irl-20195.mdnew file+18
@@ -0,0 +1,18 @@
1+
2++++
3+title = "Urbit IRL ~2019.5"
4+date = 2019-05-17
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "19:00 PST"
9+location = "Urbit Office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/261110620/"
12++++
13+
14+Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer, or wine.
15+
16+This time we'll give a brief update on what we've been up to around 8pm. Turning the music down worked well, so we'll do that again. And if you want help installing Urbit, bring a laptop.
17+
18+Feel free to bring friends!
content/events/2019-06-21-urbit-irl-20196.mdnew file+18
@@ -0,0 +1,18 @@
1+
2++++
3+title = "Urbit IRL ~2019.6"
4+date = 2019-06-21
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "19:00 PST"
9+location = "Urbit Office"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/262079477/"
12++++
13+
14+Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have some beer and pizza.
15+
16+This time we'll give a brief update on what we've been up to around 8pm. Turning the music down worked well, so we'll do that again. And if you want help installing Urbit, bring a laptop.
17+
18+Feel free to bring friends!
content/events/2019-07-19-urbit-irl-20197.mdnew file+18
@@ -0,0 +1,18 @@
1+
2++++
3+title = "Urbit IRL ~2019.7"
4+date = 2019-07-19
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "19:00 PST"
9+location = "Urbit Office"
10+image = "https://secure.meetupstatic.com/photos/event/e/0/5/b/600_482817435.jpeg"
11+registration_url = "https://www.meetup.com/urbit-sf/events/262858100/"
12++++
13+
14+Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and chat with old and new friends over a beer.
15+
16+Turning the music down has worked well, so we'll continue doing that. And if you want help installing Urbit, bring a laptop.
17+
18+Feel free to bring friends!
content/events/2019-08-29-urbit-austin-20198.mdnew file+16
@@ -0,0 +1,16 @@
1+
2++++
3+title = "Urbit Austin ~2019.8"
4+date = 2019-08-29
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "18:00 PST"
9+location = "Garage"
10+image = "https://secure.meetupstatic.com/photos/event/a/8/d/4/600_483643220.jpeg"
11+registration_url = "https://www.meetup.com/urbit-sf/events/263655974/"
12++++
13+
14+Thanks to our friends over at Garage for offering to host another meetup in Austin, Texas.
15+
16+Come have a drink on us, and bring friends! We'll be there 6–8pm.
content/events/2019-10-04-urbit-irl-201910.mdnew file+18
@@ -0,0 +1,18 @@
1+
2++++
3+title = "Urbit IRL ~2019.10"
4+date = 2019-10-04
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "19:00 PST"
9+location = "Urbit Office"
10+image = "https://secure.meetupstatic.com/photos/event/e/1/c/5/600_485217797.jpeg"
11+registration_url = "https://www.meetup.com/urbit-sf/events/265165676/"
12++++
13+
14+Lately, Urbit has been having dangerous amounts of fun online. So we got thinking, "Wouldn't it be smart to try having fun offline as well?" Thus, we invented something totally new: an offline chatroom.
15+
16+We're calling it Urbit IRL. You can use it to see your friends face-to-face, converse about Urbit, even to share a beer. And we're trying it out Friday, October 4.
17+
18+We hope to see you there! If you want help installing Urbit, bring a laptop. And bring a friend, especially if they are interested in replacing the internet.
content/events/2019-11-15-urbit-irl-201911.mdnew file+18
@@ -0,0 +1,18 @@
1+
2++++
3+title = "Urbit IRL ~2019.11"
4+date = 2019-11-15
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "19:00 PST"
9+location = "Urbit Office"
10+image = "https://secure.meetupstatic.com/photos/event/4/c/e/6/600_486379686.jpeg"
11+registration_url = "https://www.meetup.com/urbit-sf/events/266146513/"
12++++
13+
14+Lately, Urbit has been having dangerous amounts of fun online. So we got thinking, "Wouldn't it be smart to try having fun offline as well?" Thus, we invented something totally new: an offline chatroom.
15+
16+We're calling it Urbit IRL. You can use it to see your friends face-to-face, converse about Urbit, even to share a beer. And we're trying it out Friday, November 15.
17+
18+We hope to see you there! If you want help installing Urbit, bring a laptop. And bring a friend, especially if they are interested in replacing the internet.
content/events/2019-12-13-urbit-irl-201912.mdnew file+26
@@ -0,0 +1,26 @@
1+
2++++
3+title = "Urbit IRL ~2019.12"
4+date = 2019-12-13
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "19:00 PST"
9+location = "Urbit Office"
10+image = "https://secure.meetupstatic.com/photos/event/6/a/8/8/600_487107272.jpeg"
11+registration_url = "https://www.meetup.com/urbit-sf/events/266904108/"
12++++
13+
14+Come celebrate, friends! Urbit has had quite the decade, transforming from an intercepted interstellar transmission to a functional operating system, which also functions.
15+
16+We're getting together to savor the moment and get hype about what the next decade holds (the whole replacing the internet thing).
17+
18+We hope to see you there!
19+
20+Things to bring:
21+
22+-A friend
23+
24+-A laptop, if you want help installing Urbit
25+
26+-Good cheer
content/events/2020-01-24-urbit-irl-20201.mdnew file+20
@@ -0,0 +1,20 @@
1+
2++++
3+title = "Urbit IRL ~2020.1"
4+date = 2020-01-24
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "19:00 PST"
9+location = "Urbit Office"
10+image = "https://secure.meetupstatic.com/photos/event/2/1/7/6/600_487988566.jpeg"
11+registration_url = "https://www.meetup.com/urbit-sf/events/267753862/"
12++++
13+
14+"Neo-Urbit arrives from the future." It's 2020 and Urbit is accelerating. We've got a lot going live this year.
15+
16+Replacing the internet is a thing to behold. Come by the offices to hang out, have a drink, and hear the latest.
17+
18+Bring a laptop if you want help installing Urbit.
19+
20+And as always, bring a friend!
content/events/2020-02-28-urbit-irl-20202.mdnew file+20
@@ -0,0 +1,20 @@
1+
2++++
3+title = "Urbit IRL ~2020.2"
4+date = 2020-02-28
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "19:00 PST"
9+location = "Urbit Office"
10+image = "https://secure.meetupstatic.com/photos/event/8/5/e/b/600_488794283.jpeg"
11+registration_url = "https://www.meetup.com/urbit-sf/events/268519069/"
12++++
13+
14+Urbit is a wilderness right now. A vast continent of possibility. We're gonna head out there and hack around. Join us.
15+
16+Before we go headlong into that unknown region, we're gonna have a party at basecamp (aka the office). Come hang out and have a drink with your fellow Urbit explorers.
17+
18+Bring your laptop if you want to install Urbit.
19+
20+And as always, drag a friend!
content/events/2020-04-03-urbit-os1-launch-party.mdnew file+47
@@ -0,0 +1,47 @@
1+
2++++
3+title = "Urbit OS1 Launch Party"
4+date = 2020-04-03
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "19:00 PST"
9+location = "Online event"
10+image = "https://secure.meetupstatic.com/photos/event/1/f/8/b/600_489548075.jpeg"
11+registration_url = "https://www.meetup.com/urbit-sf/events/268519156/"
12+youtube = "71ViyftPkGk"
13++++
14+
15+Join us as we launch Urbit OS1!
16+
17+The presentation will begin at 7pm Pacific.
18+
19+Join the live conversation on Urbit itself: `~/~dopzod/os1-premiere`
20+
21+[There is also a VR viewing party for this event, hosted by `~naltyc-wornes`](https://account.altvr.com/events/1435581121923383472).
22+
23+To receive the event merch, RSVP on this event page by midnight!
24+
25+Ready to launch OS1? Check out our install guide:
26+
27+[https://urbit.org/using/install/](https://urbit.org/using/install/)
28+
29+Want address space for your friends? Apply for an Urbit Community Grant:
30+
31+[https://urbit.org/community/community-grants/](https://urbit.org/community/community-grants/)
32+
33+Interested in contributing to Urbit? Sign up for Hoon School:
34+
35+[https://urbit.org/community/hoonschool/](https://urbit.org/community/hoonschool/)
36+
37+Get the latest on Urbit:
38+
39+Blog: <a href="https://urbit.org/blog/" class="linkified">https://urbit.org/blog/</a>
40+
41+Urbit Twitter: <a href="https://twitter.com/urbit" class="linkified">https://twitter.com/urbit</a>
42+
43+Urbit Github: <a href="https://github.com/urbit" class="linkified">https://github.com/urbit</a>
44+
45+Still confused about what Urbit is?
46+
47+<a href="https://urbit.org/understanding-urbit/" class="linkified">https://urbit.org/understanding-urbit/</a>
content/events/2020-10-09-urbit-hosting-launch-event.mdnew file+33
@@ -0,0 +1,33 @@
1+
2++++
3+title = "Urbit Hosting Launch Event"
4+date = 2020-10-09
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "17:00 PST"
9+location = "Online event"
10+image = "https://secure.meetupstatic.com/photos/event/8/600_492480008.jpeg"
11+registration_url = "https://www.meetup.com/urbit-sf/events/273439025/"
12+youtube = "w3qKe_WZr50"
13++++
14+
15+-------
16+
17+We've been busy building, testing and refining — and now it's time to show off what we've been up to.
18+
19+We're going to do a live demo of Tlon's Urbit hosting solution, check out some of the new features of Landscape and generally catch up on what both we (at Tlon) and the community have been up to.
20+
21+Since the OS 1 launch, back in April, we've been living on Urbit day to day. Urbit has gotten gotten a lot faster, more reliable and nicer to use. Most importantly, we've got an easy way for friends to come join us without running their own node. We're really excited to let people explore what's possible with Urbit and build communities without ever touching the command-line.
22+
23+Join the waitlist for hosting here: <a href="https://tlon.io/" class="linkified">https://tlon.io/</a>
24+
25+------
26+
27+Got a group of friends who want to use Urbit together? We periodically give away blocks of planets and help people get set up. Apply for a community grant:<br/><a href="https://urbit.org/community/community-grants/" class="linkified">https://urbit.org/community/community-grants/</a>
28+
29+Interested developing on Urbit? Hoon School is a community-run program to teach you the basics of the language and system. Sign up here:<br/><a href="https://hooniversity.org" class="linkified">https://hooniversity.org</a>
30+
31+Mostly, you can find us on Urbit in the Urbit Community group. But you can also follow along here:<br/><a href="https://urbit.org/blog/" class="linkified">https://urbit.org/blog/</a><br/><a href="https://twitter.com/urbit" class="linkified">https://twitter.com/urbit</a><br/><a href="https://github.com/urbit" class="linkified">https://github.com/urbit</a>
32+
33+And if you're still confused about what Urbit is, try these:<br/><a href="https://urbit.org/understanding-urbit/" class="linkified">https://urbit.org/understanding-urbit/</a>
content/events/2020-11-05-developer-call-graph-store.mdnew file+19
@@ -0,0 +1,19 @@
1+
2++++
3+title = "Developer Call: Graph Store"
4+date = 2020-11-05
5+[extra]
6+pinned = false
7+host = "Lane R., Urbit"
8+time = "09:00 PST"
9+location = "Online event"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/274279522/"
12+youtube = "E4DFuAZQ32Y"
13++++
14+
15+Developer calls are focused on the technologies that underpin Urbit, from the top of the stack to the very bottom. They’re an opportunity for the people developing and contributing to Urbit to share their knowledge and expertise, including things that typically don’t make it into the docs, such as how and why Urbit works the way it does.
16+
17+This call will feature a discussion by Tlon engineer Logan Allen about graph-store, the general-purpose store that is gradually replacing the bespoke stores behind Chat, Publish and Links.
18+
19+You can join the event by clicking the gotowebinar.com link posted here. Details for joining the conversation were also emailed to all registered attendees, and will be sent again shortly before the event starts. Please check your email inbox for a message from Meetup.com.
content/events/2020-11-19-developer-call-bittorrent-tracking-on-urbit.mdnew file+19
@@ -0,0 +1,19 @@
1+
2++++
3+title = "Developer Call: BitTorrent tracking on Urbit"
4+date = 2020-11-19
5+[extra]
6+pinned = false
7+host = "Lane R., Urbit"
8+time = "09:00 PST"
9+location = "Online event"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/274650693/"
12+youtube = "cvx2UV6TJ5I"
13++++
14+
15+Developer calls are focused on the technologies that underpin Urbit, from the top of the stack to the very bottom. They’re an opportunity for the people developing and contributing to Urbit to share their knowledge and expertise, including things that typically don’t make it into the docs, such as how and why Urbit works the way it does.
16+
17+This call will feature a discussion by Tlon engineer Mark Staarink, also known as ~palfun-foslup, about writing an HTTP BitTorrent tracker and command line app in 1500 lines of code.
18+
19+The livestream will be held on YouTube, and a group video call will be made available via Google Meet after the talk for casual discussion and in-person conversation.
content/events/2020-12-10-developer-call-injecting-external-services-into-urbit.mdnew file+19
@@ -0,0 +1,19 @@
1+
2++++
3+title = "Developer Call: Injecting External Services into Urbit"
4+date = 2020-12-10
5+[extra]
6+pinned = false
7+host = "Lane R., Urbit"
8+time = "09:00 PST"
9+location = "Online event"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/275051926/"
12+youtube = "LaWNHMmxQag"
13++++
14+
15+This call will feature a discussion by well-known developer in the Urbit community, ~timluc-miptev. ~timluc will be discussing the work he's been doing to provide access to a Bitcoin full node, which will enable Urbit ships to make Bitcoin payments to other ships. More generally, he'll be discussing the patterns that he's using to manage an Urbit ship's connection to externally-running infrastructure, and how access to that infrastructure can be provided to other Urbit nodes.
16+
17+Developer calls are focused on the technologies that underpin Urbit, from the top of the stack to the very bottom. They’re an opportunity for the people developing and contributing to Urbit to share their knowledge and expertise, including things that typically don’t make it into the docs, such as how and why Urbit works the way it does.
18+
19+The livestream will be held on YouTube, and a group video call will be made available via Google Meet after the talk for casual discussion and in-person conversation.
content/events/2021-02-04-developer-call-architectural-idea-maze.mdnew file+18
@@ -0,0 +1,18 @@
1+
2++++
3+title = "Developer Call: Architectural Idea Maze"
4+date = 2021-02-04
5+[extra]
6+pinned = false
7+host = "Lane R., Urbit"
8+time = "09:00 PST"
9+location = "Online event"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/275992798/"
12++++
13+
14+Tlon Engineer Philip Monk is interviewed by Poprox in an "Architectural Idea Maze" discussion, where Phil will discuss the choices made, and possibly more importantly, the choices *not* made in the design of a component of Urbit. In this discussion, Phil will be focusing on subscriptions in all their forms throughout Urbit.
15+
16+Developer calls are focused on the technologies that underpin Urbit, from the top of the stack to the very bottom. They’re an opportunity for the people developing and contributing to Urbit to share their knowledge and expertise, including things that typically don’t make it into the docs, such as how and why Urbit works the way it does.
17+
18+The livestream will be held on YouTube, and a group video call will be made available via Google Meet after the talk for casual discussion and in-person conversation.
content/events/2021-03-04-developer-call-scaling-azimuth.mdnew file+23
@@ -0,0 +1,23 @@
1+
2++++
3+title = "Developer Call: Scaling Azimuth"
4+date = 2021-03-04
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "09:00 PST"
9+location = "Online event"
10+image = ""
11+registration_url = "https://www.meetup.com/urbit-sf/events/276692816/"
12+youtube = "CKuHXrdkIw0"
13++++
14+
15+Urbit engineer Philip Monk will be discussing the solution space to scaling Azimuth, the infrastructure for Urbit ID that's built on Ethereum.
16+
17+Unless you're living under a rock, you know that Ethereum is thoroughly congested and, as a result the cost of working with it is quite high. Most pertinently for Urbit, this means that the cost of bringing new planets onto the network is unacceptably high.
18+
19+Phil has been doing a ton of research for the past few months on different approaches to scaling Azimuth. In this talk, he'll lay out the what's been explored so far, the relevant considerations for Urbit, and the emerging solutions that are being pursued.
20+
21+As usual, this talk will feature a presentation, a Q&amp;A period and a follow-up video call that anyone from the audience can join.
22+
23+See you there!
content/events/2021-03-18-developer-call-pressure-and-protolith.mdnew file+20
@@ -0,0 +1,20 @@
1+
2++++
3+title = "Developer Call: Pressure and Protolith"
4+date = 2021-03-18
5+[extra]
6+pinned = false
7+host = "Urbit"
8+time = "09:00 PST"
9+location = "Online event"
10+image = "https://secure.meetupstatic.com/photos/event/6/8/2/a/600_495146666.jpeg"
11+registration_url = "https://www.meetup.com/urbit-sf/events/276898246/"
12+description = "Matilde Park, Landscape team lead, talks about the distinctions between the Landscape product and basic Urbit development, and the significance of building Landscape for Tlon."
13+youtube = "XjIDZQUZZtE"
14++++
15+
16+Landscape was an experiment. Now it’s Tlon's flagship client for the Urbit project: a product, a full-stack application, spread across a variety of Gall agents and libraries, lighting the way forward against the dwindling unknowns in the reality of Urbit userspace development and distribution.
17+
18+Matilde Park, Landscape team lead, talks about the distinctions between the Landscape product and basic Urbit development, and the significance of building Landscape for Tlon — the role of “high-pressure experiments” in forcing our computer toward something rock-hard, diamond-perfect. With a few examples of ongoing deployments, she also outlines the problems being solved right now and the ones still a touch further out.
19+
20+As usual, join us after the talk on the call to ask questions and hang out.
content/events/2021-04-01-developer-call-javascript-apps-on-urbit.mdnew file+20
@@ -0,0 +1,20 @@
1++++
2+title = "Developer Call: JavaScript Apps on Urbit"
3+date = 2021-04-01
4+[extra]
5+pinned = false
6+host = "Mike Osborne (~taller-ravnut)"
7+time = "09:00 PST"
8+location = "Online Event"
9+image = "https://marpem-files.sfo2.digitaloceanspaces.com/radbur-sivmus/2021.4.05..15.41.17-urbit-javascript-diagram.png"
10+registration_url = "https://www.meetup.com/urbit-sf/events/277261928/"
11+guests = "Tyler Brown Cifu Shuster (~radbur-sivmus)"
12+description = "In this talk, Tyler Brown Cifu Shuster (~radbur-sivmus) explains how to use Javascript tools to develop a client for Urbit."
13+youtube = "avLSSdb2VLM"
14++++
15+
16+Urbit provides a powerful and extensible platform for all kinds of app development. It can serve as a general-purpose datastore, decentralized network, and identity solution for a variety of front-end applications. The client that ships with Urbit, Landscape, provides one example of the kind of applications that can be built on the platform. However, other developers can use the same tools used to create Landscape to power their own interfaces and clients for Urbit.
17+
18+Tyler Brown Cifu Shuster (~radbur-sivmus) has worked with the Landscape team over the past few months to extract these tools into reusable Javascript packages. In this talk, he will explain how to use them to develop a client for Urbit independent of Landscape. He will cover the basic lifecycle of a client and explain how Javascript interface and state frameworks pair with Urbit's data model.
19+
20+This talk should enable anyone familiar with modern Javascript development and HTTP grammar to build an application on top of Urbit without writing any back-end code.
content/events/2021-04-15-developer-call-software-distribution.mdnew file+25
@@ -0,0 +1,25 @@
1++++
2+title = "Developer Call: 3rd Party Software Distribution"
3+date = 2021-04-15
4+[extra]
5+pinned = false
6+host = "Josh Lehman (~wolref-podlex)"
7+time = "09:00 PST"
8+location = "Online Event"
9+image = ""
10+registration_url = "https://www.meetup.com/urbit-sf/events/277474491/"
11+guests = "Raghu (~sovmep-ripsum) and Philip Monk (~wicdev-wisryt)"
12+description = "Some exciting work has been going on behind the scenes to provide the foundation for 3rd party software distribution."
13+youtube = "XwICC6Its1E"
14++++
15+
16+Some exciting work has been going on behind the scenes to provide the foundation for 3rd party software distribution. In this talk Phil (~wicdev-wisryt) and Raghu (~sovmep-ripsum) will discuss the work they've been doing to clay to provide "virtual desks"—an integral part of the infrastructure needed to have safe, generic software distribution.
17+
18+Raghu is a software engineer at Hudson River Trading who is perhaps best known for his work on ucal, the Urbit calendar application. The work he's doing with Phil on virtual desks is being done through our Scholarships program, in which community developers pair up with Tlon infrastructure engineers to work on infrastructure projects. We'll spend some time at the beginning of the call to introduce Raghu and hear about his experience working on the Urbit kernel.
19+
20+As usual, there'll be an opportunity to jump on the call with us afterward to ask questions and hang out.
21+
22+## Resources
23+
24+- [Original mailing list discussion of 3rd party software distribution](https://groups.google.com/a/urbit.org)
25+- [ucal](https://github.com/taalhavras/ucal)
content/events/2021-04-27-bitcoin-launch.mdnew file+22
@@ -0,0 +1,22 @@
1++++
2+title = "Bitcoin Launch"
3+date = 2021-04-27
4+[extra]
5+pinned = false
6+host = "Urbit Foundation"
7+time = "12:00pm PDT"
8+location = "Online Event"
9+image = "https://storage.googleapis.com/media.urbit.org/site/events/20210413-bitcoin-header.png"
10+registration_url = "https://www.meetup.com/urbit-sf/events/276741426/"
11+youtube = "_aRnfacZPto"
12+guests = "Marty Bent"
13+description = "Bitcoin is coming to Urbit! With the upcoming release of the Bitcoin Wallet, you will be able to pay Urbit ships directly with BTC."
14++++
15+
16+Bitcoin is coming to Urbit! With the upcoming release of the Bitcoin Wallet, you will be able to pay Urbit ships directly with BTC.
17+
18+We’d like to take a moment to show it off, and discuss the future of commerce on Urbit. First, Christian and Josh will demo the wallet, then, our good friend Marty Bent will moderate a panel with Christian, Tim, and Ed. We will have time at the end for questions.
19+
20+The event will have a live stream on Youtube, and a live-chat on Urbit, links to come.
21+
22+Join the Bitcoin dev conversation in the Urbitcoiners group: [~pindet-timmut/urbitcoin-cash](web+urbitgraph://group/~pindet-timmut/urbitcoin-cash)
content/events/2021-04-29-developer-call-real-time-communications-on-urbit.mdnew file+27
@@ -0,0 +1,27 @@
1++++
2+title = "Developer Call: Real-Time Communication on Urbit"
3+date = 2021-04-29
4+[extra]
5+pinned = false
6+host = "Josh Lehman (~wolref-podlex)"
7+time = "09:00 PST"
8+location = "Online Event"
9+image = ""
10+registration_url = "https://www.meetup.com/urbit-sf/events/277674273/"
11+guests = "Edward Amsden (~ritpub-sipsyl)"
12+description = "Video chat on Urbit? It's nearly here with WebRTC."
13+youtube = "XFct6JZHPC0"
14++++
15+
16+
17+Video chat on Urbit? It's nearly here using the WebRTC protocol. Edward Amsden (`~ritpub-sipsyl`) will be giving us a look at the WebRTC Airlock library that he has developed that handles all the hard parts of WebRTC. This will allow developers to simply call or answer calls by ship or app name. Edward will also be giving us a live text-based demo of WebRTC on urbit. Please join us for an exciting presentation.
18+
19+Edward is a software developer and the principal of Black River Software LLC. He has several years experience building both backend and IoT software in Haskell, and in particular building IoT control and software deployment infrastructure. He also has academic background in programming language research.
20+
21+As usual, there'll be an opportunity to jump on the call with us afterward to ask questions and hang out.
22+
23+
24+## Resources
25+
26+- [Urbit WebRTC on GitHub](https://github.com/black-river-software/urbit-webrtc)
27+- Check out WebRTC progress reports on `~ritpub-sipsyl/webrtc-on-urbit`
content/events/2021-05-13-developer-call-versioned-networking.mdnew file+21
@@ -0,0 +1,21 @@
1++++
2+title = "Developer Call: P2P Versioned Networking"
3+date = 2021-05-13
4+[extra]
5+pinned = false
6+host = "Josh Lehman (~wolref-podlex)"
7+time = "16:00 PST"
8+location = "Online Event"
9+image = ""
10+registration_url = "https://www.meetup.com/urbit-sf/events/278052029/"
11+guests = "Liam Fitzgerald (~hastuc-dibtux)"
12+description = "Versioned Networking for Application Developers"
13+youtube = "BhQ1vk4jGsk"
14++++
15+
16+Building solid networking infrastructure has been a major focus of the Urbit project since its inception. There's a lot going on under the hood
17+that ensures our servers reliably stay connected. Liam Fitzgerald (~hastuc-dibtux) will be explaining how Urbit is able to deploy changes without breaking the network. Anyone designing userspace applications will be interested in the approach he has designed.
18+
19+Liam is an Interface Engineer working at Tlon working on the Landscape team. He will be discussing networking userspace applications in depth and going into detail about the new versioning system.
20+
21+As usual, there will be an opportunity to jump on the call with us afterward to ask questions and hang out.
content/events/2021-05-27-town-hall.mdnew file+40
@@ -0,0 +1,40 @@
1++++
2+title = "Town Hall"
3+date = 2021-05-27
4+[extra]
5+pinned = true
6+host = "Josh Lehman (~wolref-podlex)"
7+time = "12:00 - 15:30 PDT"
8+location = "Online Event"
9+image = ""
10+registration_url = "https://www.meetup.com/urbit-sf/events/278188361/"
11+guests = "Hunter Miller (~nocsyx-lassul) and Justin Murphy (~hatryx-lastud)"
12+description = "A virtual mini-conference for the Urbit community featuring a special keynote talk from our friend Justin Murphy."
13+youtube = "8YSwt0vDPj0"
14++++
15+
16+The Urbit community has grown at a rapid clip throughout 2021. There are so many exciting things going on that it's hard to convey them all, even with Developer Calls happening every two weeks. This event will function as a virtual "mini-conference" where we'll give a series of important and exciting announcements, including both formal and informal talks from many members of our community.
17+
18+Here's a rundown of what we'll be discussing:
19+
20+## Introduction: State of the Network
21+*12:00 PDT, Josh Lehman*
22+
23+Urbit is under heavy, active development by both Tlon and a wide range of contributors. Josh Lehman will discuss some of the most important areas of work being undertaken, provide a picture of where Tlon and community efforts are going in the future, and even has a few exciting announcements to make.
24+
25+## Taisho, Urbit's Port City
26+*~12:20 PDT, Hunter Miller*
27+
28+Piloting an Urbit ship requires expertise that many lack. To achieve the rich and prosperous ecosystem we've all envisioned requires making that journey easier. In this talk, Hunter Miller introduces a new way for users to join the network with minimal effort.
29+
30+## Keynote: The Revenge of Teleology
31+*~13:00 PDT, Justin Murphy*
32+
33+Teleology—or inquiry into ultimate ends—has been out of fashion since the seventeenth century, when Francis Bacon said that, “like a virgin consecrated to God,” it “produces nothing.” I argue that the digital revolution is inverting Bacon’s claim. Baconian instrumentalism is now suffering from diminishing returns—it is what the youth today call a Boomer Ideology. Rather, the greatest gains are going to individuals and communities with teleological attitudes. This talk will observe some examples and present a model consistent with the observations. Bitcoin inquires after the telos of money, the most winning independent “content creators” inquire after the telos of media, and Urbit inquires after the telos of personal computing.
34+
35+## Lightning Talks
36+*14:00 PDT, you?*
37+
38+After the scheduled talks we'll break out into a series of 30 minute talks led by community members. There will be up to three talks given in parallel at each of 14:00 PDT, 14:30 PDT and 15:00 PDT (so nine talks total).
39+
40+If you'd like to give a talk, please use [this form to sign up](https://airtable.com/shr0Xmqcv1HSy47EP). You can see the full list of [proposed talks here](https://airtable.com/shreGQ4kCU8RA5GJS/tblTZxCpqedJBwSkE), and if you'd like to voice your support for any of these specifically, [cast a vote using this form](https://airtable.com/shrhNRUAGCqZ38VXA).
content/events/_index.mdnew file+6
@@ -0,0 +1,6 @@
1++++
2+title = "Events"
3+sort_by = "date"
4+template = "events/list.html"
5+page_template = "events/event.html"
6++++
content/faq.md+112−93
@@ -11,95 +11,56 @@ hidetitle = "true"
1111
1212Urbit reimagines the internet as a peer-to-peer network designed to stay that way. Previous attempts to "decentralize" the internet have only attempted to solve certain corners of the problem. Urbit proposes that only a new stack, built from the ground up as a tightly integrated system, can realize a great user experience for people using a peer-to-peer web.
1313
14−Combining a deterministic operating system (Urbit OS / Arvo) and a secure, global identity layer (Urbit ID / Azimuth), the Urbit project has created something that’s never existed before: an encrypted peer-to-peer network where you can be sure that messages are never tampered with or surveilled, and where strangers on that network can be trusted by default.
14+Combining a deterministic operating system ([Urbit OS](#what-is-arvo) / Arvo) and a secure, global identity layer ([Urbit ID](#what-is-urbit-id) / [Azimuth](#what-is-azimuth)), the Urbit project has created something that’s never existed before: an encrypted [Sybil resistant](https://en.wikipedia.org/wiki/Sybil_attack) peer-to-peer network where you can be sure that messages are never tampered with or surveilled.
1515
16−The connected world anticipated by Urbit is a much friendlier one, much like the early Internet, where collegial discussion and collaboration was the norm. Problems that are unsolvable without large-scale political centralization in our current internet – data breaches, spam, fake reviews, malware-spreading, harassment – become tractable when individuals control their computing again. You have one login for everything. You own and control all of your software and all of your data by default. Software is designed around the friendships, families, communities, and organizations you're already a part of – not the other way around.
16+The connected world anticipated by Urbit is a much friendlier one, much like the early Internet, where collegial discussion and collaboration was the norm. Problems that are unsolvable without large-scale political centralization in our current internet – data breaches, spam, fake reviews, malware-spreading, harassment – become tractable when individuals control their computing again. You have one login for everything. You own and control all of your software and all of your data by default. Software is designed around the friendships, families, communities, and organizations you're already a part of – not the other way around.
1717
1818### How secure is Urbit right now? {#how-secure-is-urbit}
1919
20−Urbit ID / Azimuth, Urbit's identity layer, is live on the Ethereum blockchain and has been audited by Open Zeppelin, Blockchain at Berkeley, and Bloctrax. [We run a bug bounty program](https://hackerone.com/tlon) on HackerOne.
20+[Urbit ID](#what-is-urbit-id) / [Azimuth](#what-is-azimuth), Urbit's identity layer, is live on the Ethereum blockchain and has been audited by Open Zeppelin, Blockchain at Berkeley, and Bloctrax.
2121
22−Urbit OS / Arvo is still an early beta. Arvo is safe to play with, but it’s not yet a place to store or share private information. Urbit's cryptographic protocols have not been professionally audited, and the OS itself doesn't provide protection from attackers on the network — although we haven't seen any yet.
22+In late 2020, Urbit's [Ames](@/docs/glossary/ames.md) networking protocol was audited by [Leviathan Security](https://www.leviathansecurity.com/). You can read about this milestone [here](@/blog/security-and-continuity.md).
23+
24+Looking to the future, Tlon has plans to begin working to make Urbit secure against attacks from quantum computers in 2021.
2325
2426### How can I contribute to Urbit? {#contribute}
2527
26−We encourage outside contributors to become a part of the project. The best way to do this is to check out [Urbit](https://github.com/urbit) on GitHub, look at the pinned repositories, and check out our [Contributing](https://urbit.org/docs/getting-started/contributing/) guide. After you've gotten familiar with the system, feel free to open issues and make pull requests.
28+We encourage outside contributors to become a part of the project. The best way to do this is to check out [Urbit](https://github.com/urbit) on GitHub, look at the pinned repositories, and check out our [Contributing](https://urbit.org/docs/getting-started/develop) guide. After you've gotten familiar with the system, feel free to open issues and make pull requests.
2729
2830### Who is building Urbit? {#who-builds-urbit}
2931
3032[Tlon](https://tlon.io), a San Francisco-based company, is the primary developer of Urbit, along with [various independent developers](https://github.com/urbit/urbit/graphs/contributors) and [urbit.live](https://urbit.live).
3133
32−## Objections to Urbit
33−
34−### Who is Curtis? {#who-is-curtis}
35−
36−Urbit started back in 2002 as Curtis Yarvin’s personal project. Curtis developed the original prototype for Urbit and, separately, wrote a blog on history and politics under the pen name ‘Mencius Moldbug’.
37−
38−In early 2019, Curtis left the Urbit project and gave all of his voting interest (both as address space and voting shares in the company) back to Tlon. He retains a non-voting, minority interest in both the address space and the company — but is not involved in the day-to-day development or operations.
39−
40−Curtis laid the foundation for Urbit by delivering its first prototype but, since 2013, it has been refined and almost entirely rewritten by a community of developers. No one working on Urbit today had anything to do with Curtis’s writing. For the most part, we couldn’t be less interested in it.
41−
42−The community of people who build Urbit have widely varied ways of thinking and looking at the world, but they all share two things: the desire to build neutral infrastructure for all people and to think from first principles about hard problems. We welcome spirited debate and disagreement as a primary tool for refining our work. Successful infrastructure, we think, serves all people — no matter their background, culture, or worldview.
43−
44−### Why aren't there more planets? {#more-planets}
45−
46−Urbit is designed to be as simple as possible. The sponsorship tree for Urbit ID simply expands by squaring the size of the last tier. That is, there are <span class="mono">2<sup>8</sup> (256)</span> galaxies, <span class="mono">(2<sup>8</sup>)<sup>2</sup> = 2<sup>16</sup> (~65K)</span> stars, <span class="mono">(2<sup>16</sup>)<sup>2</sup> = 2<sup>32</sup> (~4B)</span> planets. There are <span class="mono">2<sup>64</sup></span> moons — but moons are tethered to their planet, unlike stars and planets.
47−
48−This pattern exists because it’s a simple way to enforce the scarcity of addresses and build a friendly network. When a tier of the address space begins to be populated, we start populating the next tier down. When Urbit nears the limit of <span class="mono">2<sup>32</sup> (4B)</span> planets, we’ll figure out a way to populate the <span class="mono">2<sup>64</sup></span> moons. The galaxies that govern the Urbit ID contracts can always vote to upgrade them — and we expect that they will.
49−
50−(For more background on why Urbit ID is the way it is, read [this](/understanding-urbit/urbit-id/).)
51−
52−The problem with populating the moons now is that <span class="mono">2<sup>64</sup></span> is a *really, really big* number. We’ll need some way of differentiating between humans and their devices (to prevent devices turning into rogue botnets). But that’s a hard problem, and we prefer to start with the simplest possible solution before solving hard problems. The current scheme works. Once we need to update it, we’ll figure it out.
53−
54−It’s also worth noting that, while there are almost 8B people on Earth, there are almost certainly not 8B internet users. Facebook has about 2.5B users, Apple has about 1B. Urbit has a long way to go before we get close to <span class="mono">2<sup>32</sup></span>.
55−
56−### Why do you use Ethereum? {#why-eth}
57−
58−As of 2019, Ethereum is the most widely deployed, most secure, and best documented general purpose blockchain. Using Ethereum is a practical engineering choice. It’s the best way to bootstrap real cryptographic ownership. We’re not specifically interested in Ethereum one way or the other.
59−
60−One day we’d really like the Urbit ID registry to be hosted on Urbit OS itself. But the first challenge is getting Urbit OS to be completely secure.
61−
62−### Why is Hoon so weird? {#why-hoon}
63−
64−There are things about Urbit that are weird by design, and some that are weird because we haven’t gotten around to cleaning them up. Hoon, for the most part, is weird by design, but there are a few things about it we’d like to clean up.
65−
66−The runes are, once you get the hang of them, pretty nice. Your mileage may vary, of course, but many talented engineers have spent many, many hours writing Hoon. It’s a simple, practical language. But the learning curve can be a bit high.
67−
68−The standard library and naming is something we’ve discussed changing, and it could happen. It’s definitely up for debate whether or not the four-letter naming convention works well. The vanes (kernel modules) have largely moved away from this convention.
69−
70−The right way to think about Hoon is as the ‘C of Urbit’. It’s a bare bones language that gets you pretty close to Nock. Eventually, we’ll probably implement more expressive languages that compile to Urbit. But for now, satisfy your curiosity and [sign up for Hoon School](/hoonschool/).
71−
72−### What is the point of Nock? {#why-nock}
34+## Urbit ID
7335
74−The primary technical reason we can’t run our own computers already is that they don’t all compute the same way. Nock solves this problem. It provides a single computing foundation for the whole network. It’s also deterministic — which is an important feature for anything you’re going to put sensitive data into.
36+### What is Urbit ID? {#what-is-urbit-id}
7537
76−It’s true that Nock, without jets, is slow. With the ability to call out to a native function, it’s not so bad. We’ve been working on a new Nock interpreter for Grall Truffle that’s about 10x faster than the current one — so we’re not all that worried about performance for the time being.
38+Urbit ID is the identity system utilized by Urbit, which associates to each [ship](@/docs/glossary/ship.md) a public and private key used to establish encrypted connections between one another and to guard private data. For [planets](@/docs/glossary/planet.md), [stars](@/docs/glossary/star.md), and [galaxies](@/docs/glossary/galaxy.md), this is achieved with a set of Ethereum smart contracts called [Azimuth](#what-is-azimuth). Keys for [moons](@/docs/glossary/moon.md) and [comets](@/docs/glossary/comet.md) are handled within Urbit.
7739
78−### Can I really host my Urbit with someone else? {#why-hosting}
40+### What are stars, galaxies, and planets? {#stars-galaxies-planets}
7941
80−As a rule, anyone that has physical access to your computer owns you. They can steal your secrets and read its contents. There’s no way around that. We can’t prevent anyone hosting your Urbit from inspecting it — but we think it’s much nicer to host an Urbit than to run a web service for two reasons:
42+Urbit IDs come in three classes: galaxies, stars, and planets. The length of an identity’s name will tell you its class. Galaxies are 8-bit and have names like `~mul`. Galaxies issue 16-bit stars (`~dacmul`), which can themselves issue 32-bit planets (`~laptel-holfur`).
8143
82−One, you own your Urbit ID with a key that you never have to give your host. Your host only gets an operating key, and you can always revoke that key remotely. So, you might lose your data but it’s up to you to take good care of your identity.
44+Planets are intended for everyday use by individuals, and there are 4.3 billion of them (two to the 32nd power). Stars and galaxies, on the other hand, are meant to act as network infrastructure: on the [Urbit OS](#what-is-arvo) network they provide routing and are responsible for distributing software updates.
8345
84−Two, your Urbit runs inside a VM. There’s a very clear line over which a host should never step: your event log. This is not unlike the way that cloud hosting works today. Netflix is hosted on AWS — one of their biggest competitors. Luckily, the AWS terms of service protects Netflix from a legal standpoint.
46+### Why is is currently expensive to acquire a planet? {#gas-prices}
8547
86−At the end of the day, if you’re really worried about security, it’s quite easy to host Urbit yourself. This means that people who care a lot about privacy can still get the same usability as those who want the convenience of hosting.
48+For the latest on this topic, see our recent blog post: [The Gang Solves the Gas Crisis](@/blog/rollups.md).
8749
88−## Urbit ID
50+As of early 2021, if you try to acquire a planet from a market, you will likely encounter an enormous "gas price" fee. Ethereum is going through some growing pains, and this is an issue for every
51+smart contract on the network. This fee is unrelated to Urbit specifically, rather it results from how Ethereum transactions are paid for. The gas fee does not go to the person selling you the planet, nor to the market, nor to anybody associated with Urbit - it goes to the "miners" processing all Ethereum transactions.
8952
90−### What is Urbit ID? {#what-is-urbit-id}
53+Tlon is aggressively pursuing a solution we call "naive rollups" which we predict to reduce gas costs by a factor of at least 100. We cannot give a precise estimate on when this will be complete, but it is top priority and this solution was chosen in part for the speed with which it can be implemented without sacrificing security. If you'd like to know more, we recommend watching this [Developer Call](https://www.youtube.com/watch?v=CKuHXrdkIw0) with `~wicdev-wisryt`.
9154
92−Urbit ID is a general-purpose PKI ("public key infrastructure") that Urbit uses as an identity system. This system is implemented as a suite of smart contracts on the Ethereum blockchain, and it determines which Ethereum addresses own which Urbit planets, stars, or galaxies. In Urbit OS, a single identity is called a "ship", whereas in Urbit ID a single identity is just an "identity."
55+In the meantime, we recommend either using the network as a [comet](@/docs/glossary/comet.md), or signing up with a [hosting provider](#why-hosting), which includes a free planet.
9356
94−### What are stars, galaxies, and planets? {#stars-galaxies-planets}
95−
96−Urbit IDs come in three classes: galaxies, stars, and planets. The length of an identity’s name will tell you its class. Galaxies are 8-bit and have names like `~mul`. Galaxies issue 16-bit stars (`~dacmul`), which can themselves issue 32-bit planets (`~laptel-holfur`).
97−
98−Planets are intended for everyday use by individuals, and there are 4.3 billion of them (two to the 32nd power). Stars and galaxies, on the other hand, are meant to act as network infrastructure: on the Urbit OS network they provide routing and are responsible for distributing software updates.
57+We understand that this is an enormous frustration, and will keep this section updated as we get closer to resolving it.
9958
10059### What is Azimuth? {#what-is-azimuth}
10160
102−Azimuth is what we call the set of Ethereum contracts that make up Urbit ID. It's also kind of a [cool astronomical concept](https://en.wikipedia.org/wiki/Azimuth).
61+[Azimuth](@/docs/glossary/azimuth.md) is what we call the set of Ethereum contracts that make up a general-purpose decentralized PKI ("public key infrastructure") utilized by Urbit ID. It keeps a record of which Ethereum addresses own which Urbit planets, stars, and galaxies, as well as the public keys associated with those ships.
62+
63+It's also kind of a [cool astronomical concept](https://en.wikipedia.org/wiki/Azimuth).
10364
10465### How many planets, stars, and galaxies are active? {#how-many-planets-stars-galaxies}
10566
@@ -109,29 +70,31 @@ You can also inspect and execute functions in the [azimuth.eth](https://ethersca
10970
11071### What are comets and moons? {#comets-moons}
11172
112−In addition to the three classes of identities mentioned above, there are two other kinds of Urbit ships that are _not_ registered in the Urbit ID / Azimuth contracts.
73+In addition to the three classes of identities mentioned above, there are two other kinds of Urbit [ship](@/docs/glossary/ship.md)s that are _not_ registered in the Urbit ID / Azimuth contracts.
11374
114−Moons are 64 bits, issued by planets, and have names like `~doznec-salfun-naptul-habrys`. Moons are meant for connected devices: phones, desktops, smart TVs, digital thermostats, and other IoT devices. Moons are subordinated to their parent planet.
75+[Moons](@/docs/glossary/moon.md) are 64 bits, issued by [planets](@/docs/glossary/planet.md), and have names like `~doznec-salfun-naptul-habrys`. Moons are meant for connected devices: phones, desktops, smart TVs, digital thermostats, and other IoT devices. Moons are subordinate to their parent planet. A strong analogy here is that ordinary social media sites are somewhat like planets, and your account on them is a moon. Urbit elevates everybody to the level of planet.
11576
116−Comets are 128 bits and have no parents. They can be launched by anyone. They are temporary, disposable identities. Being disposable and essentially unlimited, they will likely not be trusted by default by others on the Urbit OS network, though you shouldn't have any problem until the network grows much larger. They have long, hard-to-memorize names, like `~racmus-mollen-fallyt-linpex-watres-sibbur-modlux-rinmex`.
77+[Comets](@/docs/glossary/comet.md) are 128 bits and have no parents. They can be launched by anyone for free. Since their identity is not maintained on the blockchain, they will likely not be trusted by default by others on the [Urbit OS](#what-is-arvo) network, though you shouldn't have any problem until the network grows much larger. They have long, hard-to-memorize names, like `~racmus-mollen-fallyt-linpex-watres-sibbur-modlux-rinmex`.
11778
11879### What is a `@p`? Why is my username generated for me? {#what-is-patp}
11980
120−A `@p` (pronounced *pat-pee*) is a name like `~zod` or `~lodleb-ritrul` composed of pronounceable, three-letter phonemic elements like `zod`, `lod`, `leb`, `rit` and `rul`. Shorter names, such as `~zod` and `~marzod`, are assigned to ships with special duties on the Arvo network stars and galaxies, respectively. Longer names like `~palfun-foslup` are identities for typical users.
81+A `@p` ([pronounced](@/docs/hoon/hoon-school/hoon-syntax.md#reading-hoon-aloud) *pat-pee*) is a name like `~zod` or `~lodleb-ritrul` composed of pronounceable, three-letter phonemic elements like `zod`, `lod`, `leb`, `rit` and `rul`. Shorter names, such as `~zod` and `~marzod`, are assigned to [ship](@/docs/glossary/ship.md)s with special duties on the [Arvo](#what-is-arvo) network galaxies and stars, respectively. Longer names like `~palfun-foslup` are identities for typical users.
12182
12283These names map directly to a corresponding number in the Urbit ID address space. Galaxies occupy the 8-bit address space, so any galaxy is actually a number between zero and 255. Stars occupy the 16-bit address space, and planets occupy the 32-bit address space.
12384
85+Your name is generated for you as a solution to [Zooko's triangle](https://en.wikipedia.org/wiki/Zooko%27s_triangle), which roughly states that names on a network protocol can only be two of (i) human-meaningful, (ii) secure, and (iii) decentralized. Urbit chooses (ii) and (iii), while something like DNS chooses (i) and (ii).
86+
87+Regardless, you can always choose to set your nickname in [Landscape](#what-is-landscape), so if you wish for a different name to be displayed then you have the freedom to do so.
88+
12489### Can I change my `@p`? {#change-my-patp}
12590
12691Nope. There is a 1:1 mapping between name and identity. Think of your `@p` sort of like a phone number. It's just a random synthetic name that doesn't leak any personal information about you.
12792
12893### How do I get an identity? {#get-an-identity}
12994
130−The easiest way is to find a friend who can give you one. They're out there — just ask around.
131−
132−Or, if you must, try an ERC-721 (NFT) exchange (Google or Twitter should help you with this). This will probably involve a purchase and a transfer to an Ethereum address that you own. We recommend using [Bridge](https://bridge.urbit.org) to access the address that the identity is transferred to.
95+The easiest way is to find a friend who can give you one. They're out there — just ask around. You'll have a good chance of meeting one if you join Urbit Community, the default group for new [ship](@/docs/glossary/ship.md)s at `~bitbet-bolbel/urbit-community`, as a [comet](@/docs/glossary/comet.md) and contribute pleasantly to the conversation.
13396
134−If you don't want to use Bridge, a tool like [Etherscan](https://etherscan.io) will allow you to execute functions in the [ecliptic.eth](https://etherscan.io/address/ecliptic.eth#code) contract.
97+Or, if you must, try an ERC-721 (NFT) exchange (Google or Twitter should help you with this). This will probably involve a purchase and a transfer to an Ethereum address that you own. We recommend using [Bridge](@/docs/glossary/bridge.md), available at [https://bridge.urbit.org](https://bridge.urbit.org), to access the address that the identity is transferred to.
13598
13699### How do I transfer an identity to someone else? {#transfer-identity}
137100
@@ -141,44 +104,58 @@ Access the Ethereum address that holds the identity you wish to transfer via [Br
141104
142105We recommended using [Bridge](https://bridge.urbit.org) for all Urbit ID-related operations. It’s great for managing your identities, as well as for viewing information about identities you don’t own.
143106
144−Be careful about using hosted versions of Bridge not hosted on urbit.org. Since Bridge touches your private keys, it can also steal them.
107+Be careful about using online versions of Bridge not hosted on urbit.org. Since Bridge touches your private keys, it can also steal them.
108+
109+### Why aren't there more planets? {#more-planets}
110+
111+Urbit is designed to be as simple as possible. The sponsorship tree for Urbit ID simply expands by squaring the size of the last tier. That is, there are <span class="mono">2<sup>8</sup> (256)</span> [galaxies](@/docs/glossary/galaxy.md), <span class="mono">(2<sup>8</sup>)<sup>2</sup> = 2<sup>16</sup> (~65K)</span> [stars](@/docs/glossary/star.md), <span class="mono">(2<sup>16</sup>)<sup>2</sup> = 2<sup>32</sup> (~4B)</span> [planets](@/docs/glossary/planet.md). There are <span class="mono">2<sup>64</sup></span> [moons](@/docs/glossary/moon.md) — but moons are tethered to their planet, unlike stars and planets.
112+
113+This pattern exists because it’s a simple way to enforce the scarcity of addresses and build a friendly network. When a tier of the address space begins to be populated, we start populating the next tier down. When Urbit nears the limit of <span class="mono">2<sup>32</sup> (4B)</span> planets, we’ll figure out a way to populate the <span class="mono">2<sup>64</sup></span> moons. The galaxies that govern the Urbit ID contracts can always vote to upgrade them — and we expect that they will.
114+
115+The problem with populating the moons now is that <span class="mono">2<sup>64</sup></span> is a *really, really big* number. We’ll need some way of differentiating between humans and their devices (to prevent devices turning into rogue botnets). But that’s a hard problem, and we prefer to start with the simplest possible solution before solving hard problems. The current scheme works. Once we need to update it, we’ll figure it out.
116+
117+The number of addresses is in a sort of 'Goldilocks zone' for preventing spam. Too many addresses will result in them being very cheap and thus spammers can just acquire more once they get blocked. Too few addresses and they end up too expensive for the average user. The technical term for what the finite address space bestows upon the network is [Sybil resistance](https://en.wikipedia.org/wiki/Sybil_attack), a very important property for any decentralized network.
118+
119+It’s also worth noting that, while there are almost 8B people on Earth, there are almost certainly not 8B internet users. Facebook has about 2.5B users, Apple has about 1B. Urbit has a long way to go before we get close to <span class="mono">2<sup>32</sup></span>.
120+
121+(For more background on why Urbit ID is the way it is, read [this](/understanding-urbit/urbit-id/).)
145122
146123## Urbit HD Wallet
147124
148125### What is the Urbit HD Wallet? {#urbit-hd-wallet}
149126
150−The Urbit Hierarchical Deterministic (HD) Wallet is a custom Ethereum wallet based on BIP39 and BIP44 – the same underlying technology used by wallet providers like Ledger, Trezor, Metamask, and MyEtherWallet. You can think of the Urbit HD wallet as a wallet of wallets, which lets you keep a single passphrase for all of your Urbit ID keys. Urbit ID uses multiple keys with different capabilities – a bit like permissions – so that you can keep the more valuable keys in cold storage while keeping less valuable keys, used in day-to-day operation, more easily accessible. If you're only operating a planet, you shouldn't have to worry about this: you can simply think of your "master ticket" as the password to your Urbit ID. If you're operating a star or galaxy, the Urbit HD Wallet allows you to implement a multi-tier key custody scheme.
127+The [Urbit Hierarchical Deterministic (HD) Wallet](@/docs/glossary/hdwallet.md) is a custom Ethereum wallet based on BIP39 and BIP44 – the same underlying technology used by wallet providers like Ledger, Trezor, Metamask, and MyEtherWallet. You can think of the Urbit HD wallet as a wallet of wallets, which lets you keep a single passphrase for all of your Urbit ID keys. Urbit ID uses multiple keys with different capabilities – a bit like permissions – so that you can keep the more valuable keys in cold storage while keeping less valuable keys, used in day-to-day operation, more easily accessible. If you're only operating a planet, you shouldn't have to worry about this: you can simply think of your "master ticket" as the password to your Urbit ID. If you're operating a star or galaxy, the Urbit HD Wallet allows you to implement a multi-tier key custody scheme.
151128
152129If you're interested, you can read the spec here: [Urbit HD Wallet Spec (UP 8)](https://github.com/urbit/proposals/blob/master/008-urbit-hd-wallet.md).
153130
154131### What is a master ticket? {#master-ticket}
155132
156−The "master ticket" is the entropy seed from which your other Urbit ID keys are derived. It should be treated like a master password: **you should never share it with anyone, and you must store it very securely (see our practices below).** This ticket is used to derive the Ethereum wallet that holds your ownership keys, your Urbit OS key – used to boot your Urbit – and the other keys associated with your identity. You’ll have a ticket if you used the Urbit Wallet Generator or claimed a ship on our hosted version of Bridge.
133+The "master ticket" is the entropy seed from which your other Urbit ID keys are derived. It should be treated like a master password: **you should never share it with anyone, and you must store it very securely (see our practices below).** This ticket is used to derive the Ethereum wallet that holds your ownership keys, your [Urbit OS](#what-is-arvo) key – used to boot your Urbit – and the other keys associated with your identity. You’ll have a master ticket if you used the Urbit Wallet Generator or claimed a [ship](@/docs/glossary/ship.md) on our hosted version of Bridge.
157134
158135If you're operating a planet, you can use your master ticket to authenticate with Bridge.
159136
160137### What is an ownership address? {#ownership-address}
161138
162−An ownership address is an Ethereum address that owns one or more of your Urbit IDs. The Urbit Wallet Generator creates one Urbit HD Wallet and associated addresses for each of your identities. Using the ownership key associated with your ownership address, you can transfer identities to other people, meaning that it’s very important to store securely.
139+An ownership address is an Ethereum address that owns one or more of your Urbit IDs. The Urbit Wallet Generator creates one [Urbit HD Wallet](@/docs/glossary/hdwallet.md) and associated addresses for each of your identities. Using the ownership key associated with your ownership address, you can transfer identities to other people, meaning that it’s very important to store securely.
163140
164141### What are proxies? {#proxies}
165142
166−Proxies are seeds derived from your master ticket used to generate sub-wallets, which in turn are used to generate keys that have the ability to execute different Urbit ID functions associated with your Urbit identity. Proxies generally have more restricted capabilities than your ownership seed. These capabilities include spawning child identities, voting, and setting networking keys.
143+[Proxies](@/docs/glossary/proxies.md) are seeds derived from your master ticket used to generate sub-wallets, which in turn are used to generate keys that have the ability to execute different Urbit ID functions associated with your Urbit identity. Proxies generally have more restricted capabilities than your ownership seed. These capabilities include spawning child identities, voting, and setting networking keys.
167144
168145- Transfer proxy: Can transfer your identity to another Ethereum address.
169−- Spawn Proxy: For stars and galaxies only. Can create new child identities.
146+- Spawn Proxy: For [stars](@/docs/glossary/star.md) and [galaxies](@/docs/glossary/galaxy.md) only. Can create new child identities.
170147- Management Proxy: Can configure or set networking keys and conduct sponsorship related operations.
171−- Voting Proxy: Galaxies only. Galaxies are the part of the galactic senate, which means they can cast votes on new proposals including changes to the "Ecliptic" contract, which defines the operations of Azimuth.
148+- Voting Proxy: [Galaxies](@/docs/glossary/galaxy.md) only. Galaxies are the part of the [galactic senate](@/docs/glossary/senate.md), which means they can cast votes on new proposals including changes to the "[Ecliptic](@/docs/glossary/ecliptic.md)" contract, which defines the operations of [Azimuth](@/docs/glossary/azimuth.md).
172149
173150### What are seeds? {#seeds}
174151
175−All Ethereum key-pairs in the Urbit wallet system, including proxies, are produced by 128-bit cryptographically random values called seeds. These seeds are the equivalent of the BIP39 mnemonic of an Ethereum wallet and are yours alone. An ownership key pair is derived from an ownership seed and, likewise, the various proxy key pairs are generated from their respective proxy seeds.
152+All Ethereum key-pairs in the Urbit wallet system, including [proxies](@/docs/glossary/proxies.md), are produced by 128-bit cryptographically random values called seeds. These seeds are the equivalent of the BIP39 mnemonic of an Ethereum wallet and are yours alone. An ownership key pair is derived from an ownership seed and, likewise, the various proxy key pairs are generated from their respective proxy seeds.
176153
177154For detailed information see the [Urbit HD Wallet Spec (UP 8)](https://github.com/urbit/proposals/blob/master/008-urbit-hd-wallet.md).
178155
179156### What does it mean to “set public keys”? {#set-public-keys}
180157
181−This means registering the public keys of your identity's encryption and authentication key pairs (together known as "networking keys") with Urbit ID / Azimuth, so that others can discover them. The corresponding private keys can then be used to, for example, run a ship on the Urbit OS network.
158+This means registering the public keys of your identity's encryption and authentication key pairs (together known as "networking keys") with Urbit ID / [Azimuth](@/docs/glossary/azimuth.md), so that others can discover them. The corresponding private keys can then be used to, for example, run a [ship](@/docs/glossary/ship.md) on the [Urbit OS](#what-is-arvo) network.
182159
183160You want to reset these keys if they are compromised, or if your ship has sunk. This is of little practical significance today, but resetting your networking keys resets your relationship with other ships on the network.
184161
@@ -235,25 +212,25 @@ There are two kinds of release schemes for locked up assets: linear and conditio
235212
236213In either scheme, you start out being able to take one star out of lockup, regardless of the terms set around the lockup as a whole. This way, you get to participate with a star right away. Go do something cool!
237214
238−If your lockup involved a galaxy, all of its stars will be locked up, but you will have immediate, lock-free control of the galaxy. You will likely need it to use that star.
215+If your lockup involved a [galaxy](@/docs/glossary/galaxy.md), all of its [stars](@/docs/glossary/star.md) will be locked up, but you will have immediate, lock-free control of the galaxy. You will likely need it to use that star.
239216
240217Note that the "releasing" of stars just means that they become available for you to claim. They don't automatically get transferred to you; you have to withdraw them from the appropriate lockup contract.
241218
242219Linear release is the simplest: your stars will be released linearly over a period of time. Most often this is a period of four years. If you have four stars in lockup, that means you will be able to withdraw one star per year. In many cases, there is also an initial windup period which has to pass before linear releasing begins, typically one year. Since Azimuth launched in January 2019, the linear release will begin in January 2020.
243220
244−Conditional release is a bit more complicated. If your stars are in conditional lockup, they're likely divided over three so-called tranches. Each of these unlocks only after a unique condition is met. Since it's difficult to verify things about the real world using smart contracts, the Galactic Senate verifies that they've been met. Once the Senate marks a condition for a tranche as cleared, it starts releasing linearly over the period of a year.
221+Conditional release is a bit more complicated. If your stars are in conditional lockup, they're likely divided over three so-called tranches. Each of these unlocks only after a unique condition is met. Since it's difficult to verify things about the real world using smart contracts, the [Galactic Senate](@/docs/glossary/senate.md) verifies that they've been met. Once the Senate marks a condition for a tranche as cleared, it starts releasing linearly over the period of a year.
245222
246223## Urbit OS
247224
248225### What is Urbit OS? {#what-is-arvo}
249226
250−Urbit OS, also called Arvo, is our functional and deterministic software stack. Arvo is written in Hoon, our purely functional programming language, which compiles to Nock, a compact bytecode language.
227+Urbit OS, also called [Arvo](@/docs/glossary/arvo.md), is our functional and deterministic software stack. Arvo is written in [Hoon](@/docs/glossary/hoon.md), our purely functional programming language, which compiles to [Nock](@/docs/glossary/nock.md), a compact bytecode language.
251228
252−Instances of Urbit OS / Arvo, called 'ships', communicate as peers on what we refer to as “the Urbit OS network.” Using Urbit ID, Urbit OS ships can prove their identities to one another.
229+Instances of Urbit OS, called '[ships](@/docs/glossary/ship.md)', communicate as peers on what we refer to as “the [Ames](@/docs/glossary/ames.md) network.” Using Urbit ID, Urbit OS ships can prove their identities to one another.
253230
254231### What is unique about Urbit OS / Arvo? {#what-is-unique-about-arvo}
255232
256−Arvo is different from other operating systems in many ways. One notable way is that it is completely deterministic. Processing in the system happens in a unique way: when an event happens, a transition function takes that event and the old state of Arvo, and produces an effect and a new state of Arvo. To visualize:
233+[Arvo](@/docs/glossary/arvo.md) is different from other operating systems in many ways. One notable way is that it is completely deterministic. Processing in the system happens in a unique way: when an event happens, a transition function takes that event and the old state of Arvo, and produces an effect and a new state of Arvo. To visualize:
257234
258235`[event, old state] -> [effects, new state]`
259236
@@ -261,21 +238,21 @@ All events are logged to disk, so you can always restore the system to a previou
261238
262239### How is Urbit OS / Arvo connected to Ethereum? {#arvo-ethereum}
263240
264−When an Arvo ship (instance) is started for the first time you must use a "keyfile" containing the private keys for your identity's networking keys. Urbit ID uses the Ethereum blockchain as its decentralized ledger.
241+When an [Arvo](@/docs/glossary/arvo.md) ship (instance) is started for the first time you must use a "[keyfile](@/docs/glossary/keyfile.md)" containing the private keys for your identity's networking keys. Urbit ID uses the Ethereum blockchain as its decentralized ledger.
265242
266−See our [Getting Started](@/using/install.md) guide to learn how to get your ship onto the Urbit OS / Arvo network.
243+See our [Getting Started](@/getting-started/planet.md) guide to learn how to get your ship onto the Urbit OS / [Ames](@/docs/glossary/ames.md) network.
267244
268245### Will the Urbit OS network survive if Ethereum dies? {#if-ethereum-dies}
269246
270−Yes. It would be annoying, but Urbit ID / Azimuth could be ported to another decentralized ledger, or hosted on Urbit OS / Arvo itself.
247+Yes. It would be annoying, but Urbit ID / [Azimuth](@/docs/glossary/azimuth.md) could be ported to another decentralized ledger, or hosted on Urbit OS / [Arvo](@/docs/glossary/arvo.md) itself.
271248
272249### How do I install Urbit OS? {#install-urbit-os}
273250
274−Check out our guides [here](@/using/install.md).
251+Check out our guides [here](@/getting-started/_index.md).
275252
276253### How do I use Urbit OS? {#use-urbit-os}
277254
278−The [Using](@/using/operations/_index.md) section of the documentation will help you out.
255+The [Using](@/using/os/getting-started.md) section of the documentation will help you out.
279256
280257### How do over-the-air updates work? {#over-the-air-updates}
281258
@@ -283,13 +260,13 @@ Your sponsor, a star or galaxy that your ship is connected to, may send you new
283260
284261### What is Landscape? {#what-is-landscape}
285262
286−Landscape is an experimental Urbit OS web interface that includes social functions such as chat and publishing. You can access Landscape by navigating to `http://localhost:PORT`, where PORT is typically 80, 8080, or 8081 (check your boot messages).
263+[Landscape](@/docs/glossary/landscape.md) is an experimental Urbit OS web interface that includes social functions such as chat and publishing. You can access Landscape by navigating to `http://localhost:PORT`, where PORT is typically 80, 8080, or 8081 (check your boot messages).
287264
288265### I have an Urbit ID, now what? {#now-what}
289266
290−Follow our guide on how to boot a ship [here](@/using/install.md).
267+Follow our guide on how to boot a ship [here](@/getting-started/planet.md).
291268
292−Get on the [mailing list](https://urbit.us11.list-manage.com/subscribe/post?u=972a03db9e0c6c25bb58de8c8&amp;id=be143888d2). Learn [Hoon](@/docs/tutorials/hoon/hoon-school/_index.md). Sign up for [Hoon School](@/community/hoonschool.md). [Make stuff](https://grants.urbit.org).
269+Get on the [mailing list](https://urbit.us11.list-manage.com/subscribe/post?u=972a03db9e0c6c25bb58de8c8&amp;id=be143888d2). Learn [Hoon](@/docs/hoon/hoon-school/_index.md). Sign up for [Hooniversity](https://hooniversity.org/). [Make stuff](https://grants.urbit.org).
293270
294271
295272## Urbit Grants
@@ -375,8 +352,50 @@ Here are a few important points from the bounty and proposal contracts:
375352
376353- **No employment relationship:** You agree that being approved for the grant or bounty does not imply any employment relationship with Tlon.
377354
378−- **Termination:** Either party (you or Tlon) can terminate the agreement on seven days' written notice. If that happens, you may be compensated *pro rata* for the amount of work you've completed, but this compensation is at the sole discretion of Tlon.
355+- **Termination:** Either party (you or Tlon) can terminate the agreement on seven days' written notice. If that happens, you may be compensated *pro rata* for the amount of work you've completed, but this compensation is at the sole discretion of Tlon.
379356
380357- **Governing law:** The agreement is governed by the laws of the State of California.
381358
382359Note that these paraphrased points are just for summarization purposes. The language in contract that you receive and sign is the only source of authority for the grant agreement.
360+
361+## Miscellaneous
362+
363+### Who is Curtis? {#who-is-curtis}
364+
365+Urbit started back in 2002 as Curtis Yarvin’s personal project. Curtis developed the original prototype for Urbit and, separately, wrote a blog on history and politics under the pen name ‘Mencius Moldbug’.
366+
367+In early 2019, Curtis left the Urbit project and gave all of his voting interest (both as address space and voting shares in the company) back to Tlon. He retains a non-voting, minority interest in both the address space and the company — but is not involved in the day-to-day development or operations.
368+
369+Curtis laid the foundation for Urbit by delivering its first prototype but, since 2013, it has been refined and almost entirely rewritten by a community of developers. No one working on Urbit today had anything to do with Curtis’s writing. For the most part, we couldn’t be less interested in it.
370+
371+The community of people who build Urbit have widely varied ways of thinking and looking at the world, but they all share two things: the desire to build neutral infrastructure for all people and to think from first principles about hard problems. We welcome spirited debate and disagreement as a primary tool for refining our work. Successful infrastructure, we think, serves all people — no matter their background, culture, or worldview.
372+
373+### Why do you use Ethereum? {#why-eth}
374+
375+In 2019 (when [Azimuth](#what-is-azimuth) was launched), Ethereum was the most widely deployed, most secure, and best documented general purpose blockchain, and it remains so today. Using Ethereum is a practical engineering choice. It’s the best way to bootstrap real cryptographic ownership. We’re not specifically interested in Ethereum one way or the other.
376+
377+One day we’d really like the Urbit ID registry to be hosted on [Urbit OS](#what-is-arvo) itself. But the first challenge is getting Urbit OS to be completely secure.
378+
379+### Why is Hoon so weird? {#why-hoon}
380+
381+There are things about Urbit that are weird by design, and some that are weird because we haven’t gotten around to cleaning them up. [Hoon](@/docs/glossary/hoon.md), for the most part, is weird by design, but there are a few things about it we’d like to clean up. For a complete description of why we created Hoon, see the [Hoon overview](@/docs/hoon/overview.md).
382+
383+The runes are, once you get the hang of them, pretty nice. Your mileage may vary, of course, but many talented engineers have spent many, many hours writing Hoon. It’s a simple, practical language. But the learning curve can be a bit high.
384+
385+The standard library and naming is something we’ve discussed changing, and it could happen. It’s definitely up for debate whether or not the four-letter naming convention works well. The vanes (kernel modules) have largely moved away from this convention.
386+
387+The right way to think about Hoon is as the ‘C of Urbit’. It’s a bare bones language that gets you pretty close to Nock. Eventually, we’ll probably implement more expressive languages that compile to Urbit. But for now, satisfy your curiosity and [sign up for Hooniversity](https://hooniversity.org/), a community led Hoon educational organization.
388+
389+Another option is to treat [Urbit as an API](@/docs/arvo/eyre/using-eyre.md), which allows one to use common languages such as Python and Javascript to build userspace programs. For now this option is not as powerful as Hoon, but there is still a lot that a developer without the time or inclination to learn Hoon can do.
390+
391+### What is the point of Nock? {#why-nock}
392+
393+The primary technical reason it is difficult for the individual to run a personal server is that modern computing architectures are not deterministic. What solves a problem for one person is not guaranteed to work on another person's computer, even if they are using identical hardware. [Nock](@/docs/glossary/nock.md) solves this problem. It provides a single computing foundation for the whole network, so that difficult issues that arise when running a server need only to be solved once and the solution is guaranteed to work for everyone on the network.
394+
395+It’s true that Nock, without jets, is slow. With the ability to call out to a native function, it’s not so bad. This is done by our runtime, [Vere](@/docs/glossary/vere.md), a Nock interpreter written in C.
396+
397+### Can I host my Urbit with someone else? {#why-hosting}
398+
399+Yes, [Tlon](@/blog/hosting-the-future.md) and [a few others](@/blog/providers.md) began [accepting signups](https://tlon.io) to provide hosting service in 2020. Under this arrangement, Tlon does all the work of setting up cloud infrastructure and getting your planet up and running, making getting started with Urbit as simple as signing up for an ordinary online service.
400+
401+Should you one day wish to run your Urbit yourself, any hosting provider ought to offer you the ability to download your [ship](@/docs/glossary/ship.md)'s [pier](@/docs/glossary/pier.md) to your own device and do so. This is a very low friction process thanks to Urbit's deterministic design.
content/getting-started/_index.mdnew file+214
@@ -0,0 +1,214 @@
1++++
2+title = "Getting Started"
3+weight = 1
4+description = "How to install Urbit."
5+page_template = "page_indiced.html"
6+template = "getting-started/index.html"
7++++
8+
9+The price of using other platforms is your data and its security. There's a reason they're free to use.
10+
11+The price of using Urbit is your own responsibility — you must run it yourself (or pay someone to run it for you).
12+
13+It's easy and it keeps getting easier.
14+
15+There are currently two ways to run Urbit:
16+
17+If you use Mac or Linux and are not afraid of a few terminal commands, we recommend you run it yourself. That is the aim of this guide.
18+
19+If you run Windows or just want to give it a shot without worrying about the gritty bits, you may want to consider a [hosting provider](@/getting-started/planet.md#hosting-providers).
20+
21+## Installing Urbit {#macos-and-linux}
22+
23+Choose the code for your operating system and run the commands in your terminal.
24+
25+<div id="os">
26+ <input type="radio" id="macos" name="os" checked>
27+ <label for="macos">MacOS</label>
28+ <div class="tab">
29+
30+```sh
31+mkdir ~/urbit
32+cd ~/urbit
33+curl -JLO https://urbit.org/install/mac/latest
34+tar zxvf ./darwin.tgz --strip=1
35+~/urbit/urbit
36+```
37+ </div>
38+
39+ <input type="radio" id="linux" name="os">
40+ <label for="linux">Linux</label>
41+ <div class="tab">
42+
43+```sh
44+mkdir ~/urbit
45+cd ~/urbit
46+wget --content-disposition https://urbit.org/install/linux64/latest
47+tar zxvf ./linux64.tgz --strip=1
48+~/urbit/urbit
49+```
50+
51+Linux users may need to run this command in another terminal window to access your Urbit on port 80:
52+
53+```sh
54+sudo apt-get install libcap2-bin
55+sudo setcap 'cap_net_bind_service=+ep' ~/urbit/urbit
56+```
57+</div>
58+
59+ <input type="radio" id="windows" name="os">
60+ <label for="windows">Windows</label>
61+ <div class="tab">
62+
63+> Please note that this method of installing Urbit is experimental, and we may not be able to assist you if you encounter issues related to WSL 2.
64+
65+Urbit cannot run on Windows itself, but there is a convenient way to run Linux using the [Windows Subsystem for Linux 2](https://docs.microsoft.com/en-us/windows/wsl/wsl2-install) on Windows 10. Install the Windows Subsystem for Linux 2 and open a Linux terminal in Windows, then follow the Linux installation instructions below. These instructions have been tested and verified for WSL 2 + Ubuntu 18.04 LTS, as demonstrated in `~sitful-hatred`'s step-by-step setup guide [here](https://subject.network/posts/urbit-wsl2/).
66+
67+For performance reasons, do not install Urbit in the mounted Windows volume, but install it in the Linux file system. For example, in your home directory, which can be navigated to by entering `cd ~`.
68+</div>
69+</div>
70+
71+<style>
72+ #os {
73+ display: flex;
74+ flex-wrap: wrap;
75+ }
76+ #os label {
77+ order: -1;
78+ padding: .5rem;
79+ border-width: 1px 0px 0px 1px;
80+ border-style: solid;
81+ cursor: pointer;
82+ }
83+ #os label[for=windows] {
84+ border-right-width: 1px;
85+ }
86+ #os input[type="radio"] {
87+ display: none;
88+ }
89+ #os .tab {
90+ display: none;
91+ border: 1px solid;
92+ padding: 1rem;
93+ max-width: 100%;
94+ }
95+ #os input[type='radio']:checked + label {
96+ font-weight: bold;
97+ }
98+ #os input[type='radio']:checked + label + .tab {
99+ display: block;
100+}
101+</style>
102+
103+If successful, you will see a block of output beginning with the line:
104+
105+```
106+Urbit: a personal server operating function
107+```
108+
109+## Booting a Free Identity {#comet}
110+
111+There are two parts to Urbit: an **ID** and an **Operating System**.
112+
113+You have just installed the Operating System on your computer.
114+
115+The **ID** is similar to a username and password on another site. The difference is that the public part (the username) is verified by thousands of people around the world while only you hold the key (the password) to that ID.
116+
117+There are five kinds of Urbit IDs but to get started you only need to know about two: we call them **planets** and **comets**.
118+
119+***
120+
121+**Planets** are scarce (this prevents spamming, among other things) and usually require a price to acquire. This is the recommended way to run Urbit, but it's a bit more involved.
122+
123+A planet name looks like `~sampel-palnet`.
124+
125+[Follow this guide](@/getting-started/planet.md) if you have already acquired a planet.
126+
127+[Find a planet to purchase](@/getting-started/planet.md#purchase)
128+
129+***
130+
131+**Comets** are practically unlimited and free to acquire. At present, these are a great way to try out the network for free.
132+
133+A comet name looks like `~dasres-ragnep-lislyt-ribpyl--mosnyx-bisdem-nidful-marzod`.
134+
135+[Read more about Urbit ID here](/understanding-urbit/urbit-id)
136+
137+
138+***
139+
140+To boot a comet, go into the command line and run the following command from the `urbit` directory you created during [Urbit installation](#installing-urbit):
141+
142+```sh
143+~/urbit/urbit -c mycomet
144+```
145+
146+It may take a while to load the comet (probably only take a few minutes, but it could take longer). This comes along with it being free. When it's done you'll some messages ending like this:
147+
148+```
149+ames: on localhost, UDP 31337.
150+http: live (insecure, public) on 8080
151+http: live ("secure", public) on 8443
152+http: live (insecure, loopback) on 12321
153+~sampel_marzod:dojo>
154+```
155+
156+When your comet is finished booting, you will see `~sampel_marzod:dojo>` (Dojo: the Urbit command line).
157+
158+To exit Urbit, use `Ctrl-D` or enter `|exit` into Dojo.
159+
160+To start your comet up again, run the following from your `urbit` directory (note the lack of `-c` argument):
161+
162+```sh
163+~/urbit/urbit mycomet
164+```
165+
166+## Using Landscape
167+
168+Urbit is an entirely new computer, so by default it drops you into the "dojo," which is its terminal. Like your current computer, it can be used to do just about anything if you know the right commands. You only need to know one command for now.
169+
170+At the moment, the most common way to use Urbit is through a web app named [Landscape](@/docs/glossary/landscape.md), which comes with Urbit. It runs in your browser and provides an interface to Urbit without using the terminal. You need to get the password, or `code`.
171+
172+1. With your Urbit running, look for a line that says something like `http: live (insecure, public) on 80`. The number given is the port that your ship is using. It will probably be 80, but we're just making sure. (Don't worry about the "insecure, public" part — that just means you can access it from your own web browser. It doesn't give anyone else access.)
173+2. If the port given is `80`, simply type `localhost` into your browser's address bar. If the given port is a different number, such as `8080`, you would type `localhost:8080`. You'll be met with a login prompt.
174+3. In the window where you found the port number, type `+code` and press return. Copy-paste the code that appears into the "Access Key" field in the browser, and press continue.
175+4. Once in, take a look around and read the instructions on screen. If you ever get logged out, follow these instructions again.
176+
177+## Next Steps
178+
179+### Updating your comet {#updating}
180+
181+The Urbit application comes with a recent release of the Urbit OS, but automatic updates ("over the air") can be enabled so new binaries aren't necessary for each update. Planets have automatic updates enabled by default, but this is not the case for comets. Many comets are used only once and thrown away, so it would be wasteful to update every single comet as soon as it boots. If you plan to use your comet for more than a quick test, you'll probably want to ensure you're running the latest version of the OS.
182+
183+You can enable updates for your comet by typing `|ota (sein:title our now our) %kids` into Dojo and pressing Enter.
184+
185+```
186+> |ota (sein:title our now our) %kids
187+>=
188+```
189+
190+If you want to make sure you'll get updates, you can check by typing `|ota` with no arguments:
191+
192+```
193+~sampel_marzod:dojo> |ota
194+OTAs enabled from %kids on ~marzod
195+use |ota %disable or |ota ~sponsor %kids to reset it
196+> |ota
197+>=
198+```
199+
200+### Read More about the Dojo {#the-dojo}
201+
202+The dojo is Urbit's command line. You can use it to control your ship, or to execute arbitrary code. Check out the links below for more information.
203+
204+- [Basic Operations](@/using/os/getting-started.md)
205+- [Basic Hoon](/docs/tutorials/hoon/hoon-school/setup)
206+- [Glossary Entry](/docs/glossary/dojo)
207+
208+### Purchase a Permanent Identity {#boot-your-planet}
209+
210+You can continue using this comet indefinitely. There are currently few differences between using a comet-level identity and a planet-level one. However, some groups will not allow comets entry in order to maintain a certain level of quality, and changes may be made in the future that further devalue comets. They will always, however, be able to access the basic functions of the network.
211+
212+A comet also comes with a long and fairly unmemorable name whereas a planet has a short name and a "sigil" (avatar) associated with it that makes it more identifiable on the network. You may notice all this within the first few minutes of using Urbit.
213+
214+[To read instructions on how to purchase and use a planet, visit this page](@/getting-started/planet.md).
content/getting-started/planet.mdnew file+132
@@ -0,0 +1,132 @@
1++++
2+title = "Setting up Your Planet"
3+weight = 1
4+description = "Getting started with a permanent Urbit identity."
5++++
6+
7+A planet is a permanent Urbit identity. Like all Urbit identities, they can never be taken away from you. Unlike comets which are free, planets are designed for use well into the future. If you're not yet familiar with the Urbit network, please follow the [Getting Started guide](@/getting-started/_index.md), which will explain the basics and walk you through using a free identity. This guide explains the next steps.
8+
9+### Purchase a planet {#purchase}
10+
11+There are a few ways to get your own planet:
12+
13+- Getting an invitation from a friend (or stranger).
14+- Purchasing a planet, including hosting, from a [hosting provider](#hosting-providers) such as [geturbitid.com](https://www.geturbitid.com/).
15+- Manually setting up and hosting a planet purchased from a third party such as [urbit.live](https://urbit.live), [OpenSea](https://opensea.io), [planet.market](https://planet.market/), [urbit.me](https://urbit.me), [urth systems](https://urth.systems/), or [Urbit Marketplace](https://urbitmarketplace.com/).
16+
17+Note that when you buy a planet, you should ensure with the provider that your parent star is operating. If you need to escape a non-operational star, see [Escaping A Sponsor](@/using/id/using-bridge.md#escaping-your-sponsor).
18+
19+### Hosting Providers {#hosting-providers}
20+
21+Hosting providers will often sell you a planet and run it for you. This option is very simple but will probably cost a regular fee.
22+
23+Urbit is designed to be portable. This means that if you sign up for hosting now but later want to leave your hosting provider and run your Urbit yourself, you should be able to work with them to obtain all of your data and boot your planet back up without losing anything.
24+
25+Using hosting does mean that you're trusting your provider with your data, but so long as you have your planet, you'll always own your identity.
26+
27+Current hosting providers are:
28+
29+- [Tlon Corporation](https://tlon.io): Tlon is the creator of Landscape and is primarily responsible for the creation and maintenance of the Urbit project itself.
30+- [Get an Urbit ID](https://www.geturbitid.com/): Get an Urbit ID was the first hosting provider and is run by a member of the Urbit community.
31+
32+
33+### Choose to run your planet on your computer or on a cloud service
34+
35+Urbit must run on an existing computer somewhere. Most users run their planet on their personal computer, but we recommend eventually using a cloud service (Digital Ocean, Linode, etc) because it allows your planet to be accessed from anywhere on multiple devices. Hosting your planet in the cloud also allows it to always be online and ready for automatic updates. You are welcome to run from your personal computer and switch to the cloud later...all without losing any data!
36+
37+There is a guide for [hosting your planet on DigitalOcean](@/using/running/hosting.md) and [hosting your planet on Linode](https://jeremytunnell.com/2021/01/09/how-to-install-urbit-on-a-linode-vps), but any cloud hosting service should work.
38+
39+### Get your keyfile {#keyfile}
40+
41+If you received an email invite to Urbit, the master ticket should be a .pdf file in the passport folder inside the archive that you downloaded. **If you bought your planet or someone sent you one you probably do not have a master ticket, and you probably don't need one. Do not issue a new master ticket unless you are sure you need to.**
42+
43+1. Connect to [Bridge](https://bridge.urbit.org). (Bridge is like an Urbit wallet)
44+2. Enter the name of your planet and the associated master ticket if you have one. Click the "Metamask, Mnemonic, Hardware Wallet..." button if you don't have a master ticket.
45+3. Once you're logged in, click the "OS" option.
46+4. Click the "Download Arvo Keyfile" button. If this is grayed out, click on "Reset Networking Keys", then click on "Reset Networking Keys" on the following page, validate the transaction using your wallet, and then click "Send Trasaction". Once the transaction is complete, the "Download Arvo Keyfile" button should be available for you to press. You should receive a `.key` file that contains the secret needed to boot your planet. Hold onto this file.
47+
48+### Run the boot command {#the-dojo}
49+
50+For other ships on the network to communicate with your ship, the computer it's
51+running on needs to be able to receive inbound UDP traffic. Therefore, it's
52+important when running your ship locally to use the `-p ames_port` flag (replace
53+`ames_port` with a public port number from 49152 to 65535) to specify on which
54+port you'll receive UDP traffic, and to forward inbound UDP traffic arriving at
55+your router on that port to your computer.
56+
57+Navigate to your `urbit` directory. Open your keyfile (it is just a text file)
58+and copy the key inside. Paste it into the following command, except with
59+`ames_port` replaced with a public port number, and `sampel-palnet` replaced by
60+the name of your planet. **Do not include the tilde in your planet name.**
61+
62+```sh
63+./urbit -p ames_port -w sampel-palnet -G rAnDoMkEy
64+```
65+
66+Or you can copy the keyfile into the current directory and run:
67+
68+```sh
69+./urbit -p ames_port -w sampel-palnet -k ./my-planet.key
70+```
71+
72+Either command will create a directory called `sampel-palnet/` and begin booting your planet. It may take a few minutes.
73+
74+When your planet is finished booting, you will see `~sampel-palnet:dojo>` (Dojo: the Urbit command line).
75+
76+To log into [Landscape](@/docs/glossary/landscape.md), check out the directions [here](/getting-started/#using-landscape).
77+
78+To shut down your planet, use `Ctrl-D`.
79+
80+To start your planet up again, run the following from your `urbit` directory, with `ames_port` replaced with the public port number you used when first booting your ship.
81+
82+```sh
83+./urbit -p ames_port sampel-palnet
84+```
85+
86+Note that `sampel-palnet/` is the path of a folder, which we just created in your `urbit` directory. This folder is called your planet's **pier**, and it holds all of your data.
87+
88+Never boot multiple instances of your planet at the same time. You can prevent this from happening on accident by only ever keeping a single copy of your pier.
89+
90+**Important:** once a key has been used to boot a planet onto the network, it cannot be used to boot that planet again later - doing so will cause communication problems with other planets. For this reason you should **delete the keyfile from your machine once your planet has booted successfully**. If you do use the same key twice, you'll need to reset your planet to restore its functionality.
91+
92+Delete the keyfile with the command below:
93+
94+```sh
95+rm ./my-planet.key
96+```
97+
98+## Setup {#setup}
99+
100+The first thing you generally want to do with a new planet is to **mount** it. A planet being mounted means that it can be seen by Linux, allowing files to be shared between it and your planet. To mount your planet, type `|mount %` at the Dojo prompt.
101+
102+```
103+|mount %
104+>=
105+```
106+
107+The `>=` output means that a command was successful. Now you can see your planet's files in its directory.
108+
109+To understand what happened with this command, read more about Urbit’s filesystem (called “clay”) [here](@/docs/arvo/clay/clay.md).
110+
111+## Updating {#updating}
112+
113+By default, planets have a sponsor — a star that provides updates and routing services. To see who you receive updates from, enter `|ota` in the dojo. You will see something like this:
114+
115+```
116+~sampel-palnet:dojo> |ota
117+OTAs enabled from %kids on ~dopzod
118+use |ota %disable or |ota ~sponsor %kids to reset it
119+> |ota
120+>=
121+```
122+
123+If for some reason your sponsor (in this case, `~dopzod`) is not responding, read instructions on [escaping your sponsor](@/using/id/using-bridge.md#escaping-your-sponsor).
124+
125+
126+## Next Steps
127+
128+Now that you’re up and running, take some time to deepen your understanding by checking out some of our other guides:
129+
130+- [Host your Ship in the Cloud](@/using/running/hosting.md): Follow this guide to set your ship up to run as a cloud server, accessible from anywhere.
131+- [Read the Operations Manual](@/using/os/getting-started.md): Become an expert pilot by learning to use your ship.
132+- [Learn to Develop on Urbit](@/docs/development/develop.md): Learn how to contribute to or develop on Urbit.
content/media.mddeleted−4
@@ -1,4 +0,0 @@
1−+++
2−title = "Media"
3−template = "media/list.html"
4−+++
content/media/_index.md+3−1
@@ -1,5 +1,7 @@
11+++
2−render = false
2+title = "Media"
3+template = "media/list.html"
4+page_template = "media/post.html"
35sort_by = "date"
46in_search_index = true
57+++
content/reset.mdnew file+109
@@ -0,0 +1,109 @@
1++++
2+title = "~2020.12 Network Reset"
3+template = "page_indiced.html"
4++++
5+
6+## TL;DR
7+
8+*Last updated ~2021.1.14*
9+
10+A network reset happened on ~2020.12.8 — you may need to take action.
11+
12+Unlike past resets, this one comes with a tool to export and reimport all of your data so that you don't lose anything; we call it `flagday`. Details on its usage can be found below.
13+
14+*If you are self-hosting your ship, following these instructions is mandatory in order to communicate with the rest of the network.*
15+
16+## When was the last network reset?
17+
18+On Tuesday, ~2020.12.8.
19+
20+## How do I get updates about what's going on throughout the process?
21+
22+We'll be adding new information to this document as soon as there's anything to share. Updates will be broadcasted via Twitter [here](https://twitter.com/zodisok/) as well.
23+
24+## What is a "network reset"?
25+
26+A network reset occurs when we need to change the Ames networking protocol number in order to reset the network’s state. When we change the protocol number, it will essentially create a new network. This change in continuity is why we refer to it as a "reset". In the past, this has required users to take some action in order to get on the new network, but this time we've provided tooling to make it seamless.
27+
28+## Why does the network need to reset?
29+
30+A network reset occurs when:
31+- A change must be made to all ships on the network simultaneously
32+- A change must be made to the Ames networking protocol
33+- Substantial changes must be made to Arvo and Vere simultaneously
34+
35+In this reset, we are including changes that will allow us to make these changes in the future without resetting the network.
36+
37+## Do I need to perform a personal breach?
38+
39+No. A network reset subsumes all personal breaches, so please don’t also perform a personal breach.
40+
41+## What can I expect?
42+
43+If you are using a self-hosted ship, you need to affirmatively perform the reset using the instructions below. If you are using hosting, your ship will process the reset automatically.
44+
45+## Do I need to do anything with Bridge/Ethereum?
46+
47+There are no Ethereum transactions necessary for this reset.
48+
49+## I’m self-hosted—what do I need to do?
50+
51+You are still in the old era. First you need to ensure that you are on the
52+correct base hash - run `+trouble` in dojo and check that the following line
53+is displayed.
54+```
55+[%base-hash [0v1f.lbtqc.5o909.qqja6.17dgp.m8gde.bmiqc.fa97p.8jer8.msu43.5rf36]]
56+```
57+If `%base-hash` is different, you need to download the correct OTA from `~fet`,
58+a galaxy that Tlon has left running in the old era specifically for this
59+purpose. Enter `|ota ~fet %kids` into dojo and wait until the OTA update is
60+complete. Now you are ready to proceed.
61+
62+**Simply use the `flagday` tool that we have provided**. It will perform all the
63+relevant actions on your behalf, as well as exporting and reimporting your data.
64+
65+To use `flagday`, run the following:
66+
67+```sh
68+curl https://bootstrap.urbit.org/flagday.sh > flagday.sh; chmod 755 ./flagday.sh; ./flagday.sh PIER_DIRECTORY
69+```
70+
71+Alternatively, you can perform the migration manually (see below).
72+
73+## Can I perform the migration manually?
74+
75+Yes, by following these steps (note that these steps **will not** back up your data as is the case with `flagday`):
76+
77+1. Download your [keyfile from Bridge](https://urbit.org/getting-started/#keyfile).
78+2. Shut down your ship.
79+3. [Archive and move your old pier](@/using/os/getting-started.md#moving-your-pier) (this is the directory that contains your urbit event log).
80+4. [Download the latest version](@/getting-started/_index.md#macos-and-linux) of the urbit binary.
81+5. [Boot your ship with the new keyfile](@/getting-started/_index.md#boot-your-planet).
82+
83+## I’m hosted by Tlon, or someone else—what do I need to do?
84+
85+Users hosted by Tlon will not need to take any action. We’re handling everything on our end. If you’re hosted by another provider, you should contact that provider for instructions.
86+
87+## What happens to my data?
88+
89+We’ve written a tool called `flagday` that will allow you to easily export your ship’s Landscape data. This includes your subscriptions and any content such as Collections, Notebooks and Chats that are on your ship. This data can then be seamlessly imported into a new ship.
90+
91+## What is unique about this reset?
92+
93+This reset will include Arvo/Vere Version Negotiation. This will allow us to ship updates to Vere and Arvo separately without worrying about an incompatibility on ships. For example, if you are running Vere 1.0 and an OTA of Arvo goes out that requires Vere 2.0, your ship will simply drop the update and notify you that you need to update your binary in order to receive the next update. When you update your binary is up to you.
94+
95+## Will there be more network resets?
96+
97+We are optimistic that this will be our last reset, as all future updates to the network can be distributed as OTA (over-the-air) updates, possibly accompanied by a notification to update a binary version.
98+
99+## What happens if I don’t follow these instructions?
100+
101+Your Urbit will fall out of communication with the rest of the Urbit network which has performed the reset. This means that updates (OTAs) will no longer process and you won’t be able to communicate with anyone else on the network.
102+
103+## How do I get help if I need it?
104+
105+If you're in a tight spot or confused, reach out to us at support@urbit.org.
106+
107+## What's a 'breach'?
108+
109+We often call events like this a 'breach' since we "breach" the continuity of Urbit's network protocol. This language has no relationship to security. If anything, it's more like a "hard fork" of the network.
content/understanding-urbit/interface.md+1−1
@@ -43,7 +43,7 @@ OS 1 is a minimal, multipurpose interface for bringing a group together to chat,
4343
4444We built OS 1 for ourselves. We were sick of using centralized, mainstream software. We didn’t want to be stuck switching between bloated, monolithic services in order to keep in touch and move our work forward. We were done relying on some third party to take care of our community—so we exited to Urbit, and it feels good.
4545
46−If you’re curious to get a complete overview of OS 1, check out [this post](https://urbit.org/blog/introducing-os1/), watch the [release event](https://www.youtube.com/watch?v=71ViyftPkGk&feature=youtu.be&t=3963) or feel free to [boot a node](@/using/install.md#comet) to come talk to us.
46+If you’re curious to get a complete overview of OS 1, check out [this post](https://urbit.org/blog/introducing-os1/), watch the [release event](https://www.youtube.com/watch?v=71ViyftPkGk&feature=youtu.be&t=3963) or feel free to [boot a node](@/getting-started/_index.md#comet) to come talk to us.
4747
4848(Running Urbit still requires a little fiddling around in the command-line, so it’s not for everyone—but we do have [plans for that to improve](https://urbit.org/blog/providers/).)
4949
content/understanding-urbit/people-history.md+2−2
@@ -38,7 +38,7 @@ src="https://media.urbit.org/site/understanding-urbit/uu-people-history-2a.jpg"/
3838src="https://media.urbit.org/site/understanding-urbit/uu-people-history-2c.jpg"
3939/>
4040
41−Given how new and unusual Urbit is, it attracts a wide variety of interesting people — both technical and non-technical. The community is generally happy to talk to people about what Urbit is, what we’re up to, and where we’re going. The best way to get involved is to simply join the Urbit Community at `~bitbet-bolbel/urbit-community` — which our [setup instructions](/using/operations/using-your-ship/) can help you do.
41+Given how new and unusual Urbit is, it attracts a wide variety of interesting people — both technical and non-technical. The community is generally happy to talk to people about what Urbit is, what we’re up to, and where we’re going. The best way to get involved is to simply join the Urbit Community at `~bitbet-bolbel/urbit-community` — which our [setup instructions](@/using/os/getting-started.md) can help you do.
4242
4343For those interested in contributing there are some simple instructions on [GitHub](https://github.com/urbit/urbit/blob/master/CONTRIBUTING.md#contributing-to-urbit), but we also run a [grants program](https://grants.urbit.org/) where we reward contributors with Urbit ID address space. Grants aren’t solely for pre-determined projects, either. If you have something you’d like to propose, we’d love to hear from you.
4444
@@ -97,7 +97,7 @@ Building Urbit is about building a future where technology doesn’t control us.
9797
9898Keep in touch while we make build this vision into reality by [joining our mailing list](https://urbit.us11.list-manage.com/subscribe/post?u=972a03db9e0c6c25bb58de8c8&id=be143888d2) or following us on [Twitter](https://twitter.com/urbit) or [GitHub](https://github.com/urbit).
9999
100−If you’re somewhat technical and you’d like to help and contribute, [install Urbit](/using/install) and consider [applying for a grant](https://grants.urbit.org/s).
100+If you’re somewhat technical and you’d like to help and contribute, [install Urbit](/getting-started) and consider [applying for a grant](https://grants.urbit.org/s).
101101
102102If you’re interested in homesteading a community when OS 1 comes out, [apply here](/community/community-grants).
103103
content/understanding-urbit/roadmap.md+2−2
@@ -40,7 +40,7 @@ Let’s walk through the next few phases of Landscape to get a sense of where we
4040
4141We built OS 1 for ourselves, because we wanted to use a communication tool that we can trust and put our system to work for real.
4242
43−Today we use OS 1 every day to chat, write, and share links. It’s a calm, minimalist tool that gets us one step away from the ads, tracking, distraction and disruption of mainstream software. (We won’t get into the details of OS 1 here, but you can check out [this post](https://urbit.org/blog/introducing-os1/) for a walkthrough. You’re also welcome to try [booting a node yourself](https://urbit.org/using/install/).)
43+Today we use OS 1 every day to chat, write, and share links. It’s a calm, minimalist tool that gets us one step away from the ads, tracking, distraction and disruption of mainstream software. (We won’t get into the details of OS 1 here, but you can check out [this post](https://urbit.org/blog/introducing-os1/) for a walkthrough. You’re also welcome to try [booting a node yourself](https://urbit.org/getting-started/).)
4444
4545The first version of OS 1 shipped in March and we’ve been improving it continuously ever since. OS 1 now runs on a much faster, more reliable Urbit OS kernel and network. The interface itself has been cleaned up and made vastly more efficient. If we weren’t so busy, we would have called it OS 1.12 by now.
4646
@@ -93,6 +93,6 @@ Our goal with Landscape is to give communities the tools they deserve to customi
9393But Landscape in early 2021 will likely still only come with a few modules out of the box. Our major next step during 2021 is to make it easy for anyone to add their own modules and for developers to build and publish their own. Enabling third-party development will really enable Urbit-centric communities to tailor their own software.
9494
9595
96−We can’t cover everything about Landscape in a short post, nor about how the community works or evolves what we do. If you’re curious to learn more, try [booting a node](https://urbit.org/using/install/) and joining the Urbit Community group where most of us hang out. That’s where we hang out most of the time, but you can also find us working in public on [GitHub](https://github.com/urbit) and on the [urbit-dev](https://groups.google.com/a/urbit.org/g/dev) mailing list.
96+We can’t cover everything about Landscape in a short post, nor about how the community works or evolves what we do. If you’re curious to learn more, try [booting a node](https://urbit.org/getting-started/) and joining the Urbit Community group where most of us hang out. That’s where we hang out most of the time, but you can also find us working in public on [GitHub](https://github.com/urbit) and on the [urbit-dev](https://groups.google.com/a/urbit.org/g/dev) mailing list.
9797
9898For now, let’s move on to who builds this thing and where it came from.
content/updates/2016-5-16-roadmap.md+2−2
@@ -117,8 +117,8 @@ We already use Urbit to publish documents about Urbit, to chat about
117117Urbit, and of course to deliver Urbit updates. With this release,
118118we're adding a public chat stream and public comments.
119119
120−The next dogfooding steps: using Github as a backup to Clay, not Clay
121−as downstream from Github; our own internal issue tracker; and
120+The next dogfooding steps: using GitHub as a backup to Clay, not Clay
121+as downstream from GitHub; our own internal issue tracker; and
122122replacing internal email with long-form `:talk` messages.
123123
124124### Optimization
content/updates/2017-10-7-update.md+1−1
@@ -11,6 +11,6 @@ ship = "tonlur-sarret"
1111`~master-morzod` joins Mars Talks to talk about the Urbit operating system. The core team and contributors talk about how to best teach Urbit. Ted explains Hoon casting and does a full expansion of the Nock macros to draw a better connection between Hoon and Nock.
1212
1313- [Mars Talks, Ep. 2](https://www.youtube.com/watch?v=kh4Ai5YXFaA) hosted by `~taglux-nidsep` with guest `~master-morzod` on Arvo, the Urbit operating system. [Discussion on Fora](https://urbit.org/fora/posts/~2017.10.5..03.57.51..f4c0~/)
14−- [The Absolute State of the Urbit Docs](https://github.com/urbit/docs/issues/137#issuecomment-333444336), a conversation on Github between `~taglux-nidsep`, `~sorreg-namtyv`, `~rovnys-ricfer` and `~master-bottec`. [Discussion on Fora](https://urbit.org/fora/posts/~2017.10.3..03.04.45..b532~/)
14+- [The Absolute State of the Urbit Docs](https://github.com/urbit/docs/issues/137#issuecomment-333444336), a conversation on GitHub between `~taglux-nidsep`, `~sorreg-namtyv`, `~rovnys-ricfer` and `~master-bottec`. [Discussion on Fora](https://urbit.org/fora/posts/~2017.10.3..03.04.45..b532~/)
1515- [`~rovnys-ricfer` on Hoon casting](https://github.com/urbit/docs/pull/201#issuecomment-333546648). [Discussion on Fora](https://urbit.org/fora/posts/~2017.10.3..01.53.05..07b3~/)
1616- [Nock macro expansion: A clear explanation that anyone can understand](https://urbit.org/fora/posts/~2017.10.6..23.50.35..fb74~/) by `~rovnys-ricfer`
content/updates/2018-4-14-update.md+1−1
@@ -23,7 +23,7 @@ We hired more people! Tlon is pleased to have with us:
2323Ford](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/). They turbocharged the `+execute` algorithm to
2424use a worklist data structure. This will not only be simpler to reason about, but in the future, it will allow future
2525support for parallelization of builds at the Vere level in MapReduce fashion. Their work is on
26−[Github](https://github.com/urbit/arvo/tree/ford-turbo).
26+[GitHub](https://github.com/urbit/arvo/tree/ford-turbo).
2727
2828*Curtis* `~sorreg-namtyv` has been working hard to make Hoon's type system less confusing, as well as working on the
2929problem of data inspection in Hoon. Now that his "structure-to-type" code is mostly done (going from an abstract type
content/updates/2018-4-7-update.md+1−1
@@ -34,7 +34,7 @@ post](https://fora.urbit.org/posts/~2018.3.15..04.24.35..a47f~/). Their code can
3434Lastly, big shoutout to *Mikolaj* `~ponmep-litsem` for his work on [Plato](http://plato.urbitetorbi.org:8080/plato.html),
3535which now allows remote Hoon code execution without logging in. This is a big step towards improving our developer
3636onboarding, as it will allow newcomers to experience interactive Urbit programming in the browser quickly without having
37−to wait to boot their own ship. See Mikolaj's original thread on Github [here](https://github.com/urbit/docs/issues/239).
37+to wait to boot their own ship. See Mikolaj's original thread on GitHub [here](https://github.com/urbit/docs/issues/239).
3838
3939We look forward to teaching some of you this Sunday the beginnings of the art of Martian functional programming. To all
4040else, we'll see you on the network. Have a great weekend, everybody!
content/updates/2018-5-16-update.md+1−1
@@ -36,7 +36,7 @@ Isaac has solid Hoon and frontend chops, having already implemented server-side
3636documentation work done. They've seen several PR's go through to improve the Hoon standard library docs, simplify the
3737Hoon demo, update our examples to the latest syntax, improve the Urbit installation process, and more. Josh's
3838work-in-progress is happening [here](https://github.com/joshuareagan/doc-drafts/). The main docs are [on
39−Github](https://github.com/urbit/docs): if there's a piece of doc that's confusing to you, don't hesitate to file an
39+GitHub](https://github.com/urbit/docs): if there's a piece of doc that's confusing to you, don't hesitate to file an
4040issue. Or better, submit a pull request.
4141
4242*Joe* `~master-morzod` is making strides on full HTTPS support for individual ships. He's implemented LetsEncrypt
content/updates/2018-5-23-update.md+1−1
@@ -52,7 +52,7 @@ step towards making Urbit address-space ownership real, Mark's work-in-progress
5252Urbit documentation. Josh has been writing a [new Hoon tutorial series](https://github.com/joshuareagan/doc-drafts) to
5353supersede the current Urbytes, while Robert has been blazing a trail through the current standard library docs, making
5454sure they're up-to-date and [improving them](https://github.com/urbit/docs/tree/rmariani-patch-6) as he goes. There's
55−been a lot of activity on Github recently. Don't be shy: [submit your first docs pull
55+been a lot of activity on GitHub recently. Don't be shy: [submit your first docs pull
5656request](https://github.com/urbit/docs), a classic rite of passage for the neophyte Hoon programmer.
5757
5858Lastly, Josh, Ted, and Keaton will be live on Mars Talk tomorrow night, Wednesday at 8:30PM PST. We'll post the Hangouts
content/updates/2018-5-30-update.md+1−1
@@ -66,7 +66,7 @@ the libraries and necessary styling, then integrate this into current Arvo/Vere.
6666to his [new WIP Hoon tutorials](https://github.com/joshuareagan/doc-drafts), and both Josh and Rob have gifted us with
6767several [pull requests](https://github.com/urbit/docs/pulls) documenting the simple but elusive `=,` rune and refactoring
6868much of the existing standard library doc. The docs are a great place to start learning and contributing. [Check them
69−out](https://github.com/urbit/docs) on Github, and [submit an issue](https://github.com/urbit/docs/issues), tagging Josh
69+out](https://github.com/urbit/docs) on GitHub, and [submit an issue](https://github.com/urbit/docs/issues), tagging Josh
7070and Rob, if you're confused by anything, or think something is documented wrong.
7171
7272Josh and Ted also did a [Mars Talk](https://www.youtube.com/watch?v=IgQo5aSezK4) this week -- Season 2, Episode 6 -- to
content/updates/2019-3-4-update.md+1−1
@@ -27,7 +27,7 @@ The nice folks behind [@urbitlive](https://twitter.com/urbitlive) discovered a b
2727~morlyd-mogmev
2828```
2929
30−We [announced the bug on Twitter](https://twitter.com/urbit/status/1105850450559918082) today, and [a conversation](https://github.com/urbit/arvo/issues/1105) has been ongoing on Github. It appears we've settled on a solution, outlined in [this 3-line suggestion](https://github.com/urbit/arvo/issues/1105#issuecomment-472585937) from @max19, which elegantly corrects the implementation of the algorithm while preserving all existing planet names – a truly miraculous solution that came out of nowhere. Thank you Max!
30+We [announced the bug on Twitter](https://twitter.com/urbit/status/1105850450559918082) today, and [a conversation](https://github.com/urbit/arvo/issues/1105) has been ongoing on GitHub. It appears we've settled on a solution, outlined in [this 3-line suggestion](https://github.com/urbit/arvo/issues/1105#issuecomment-472585937) from @max19, which elegantly corrects the implementation of the algorithm while preserving all existing planet names – a truly miraculous solution that came out of nowhere. Thank you Max!
3131
3232Stay tuned for a post with a full report.
3333
content/updates/2019-4-11-update.md+1−1
@@ -18,7 +18,7 @@ Here’s a short update from the team as of `~2019.4.11`:
1818
1919## Community
2020
21−We conducted an Azimuth AMA and an "IDEA BLITZ" on Landscape. Excerpts from the IDEA BLITZ are collected in [a Github issue](https://github.com/urbit/proposals/issues/4), and archives are available at `~dopzod/azimuth-ama` and `~dopzod/idea-blitz`.
21+We conducted an Azimuth AMA and an "IDEA BLITZ" on Landscape. Excerpts from the IDEA BLITZ are collected in [a GitHub issue](https://github.com/urbit/proposals/issues/4), and archives are available at `~dopzod/azimuth-ama` and `~dopzod/idea-blitz`.
2222
2323## April Fools
2424
content/updates/2020-04-04-update.md+1−1
@@ -19,7 +19,7 @@ If you’re a Hoon School graduate, we’ve got a big announcement: The inaugura
1919
2020Haven’t done Hoon School? Don’t worry! We will be running more hackathons in the future, at least two a year. The next Hoon School session begins on Monday the 6th, so there’s still time to sign up. Go to [urbit.org/community/hoonschool/](https://urbit.org/community/hoonschool/) to enroll.
2121
22−OS1 is for [homesteaders and tinkerers](https://urbit.org/understanding-urbit/roadmap/). It’s profoundly new. It’s not our final destination, but it’s an important and foundational tool for getting there. And it’s a big leap towards allowing individuals and communities to use it for their needs. There’s already a growing constellation of public communities on Urbit. When you’re ready to launch OS1, check out our [install guide](https://urbit.org/using/install/).
22+OS1 is for [homesteaders and tinkerers](https://urbit.org/understanding-urbit/roadmap/). It’s profoundly new. It’s not our final destination, but it’s an important and foundational tool for getting there. And it’s a big leap towards allowing individuals and communities to use it for their needs. There’s already a growing constellation of public communities on Urbit. When you’re ready to launch OS1, check out our [install guide](https://urbit.org/getting-started/).
2323
2424If you need a planet, you can buy one from [Urbit Live](https://urbit.live).
2525
content/updates/2020-06-15-update.md+1−1
@@ -27,7 +27,7 @@ We’ve got two exciting lines of work coming together right now. The first is
2727
28283 -
2929
30−The Urbit Community group has been fun and engaging lately. If you’ve booted your Urbit and haven’t joined, we encourage it. We’re there talking about the future of Urbit, core development, and all things Urbit adjacent and related. Ask for an invite in /urbit-help once you’ve gotten [set up](https://urbit.org/using/install).
30+The Urbit Community group has been fun and engaging lately. If you’ve booted your Urbit and haven’t joined, we encourage it. We’re there talking about the future of Urbit, core development, and all things Urbit adjacent and related. Ask for an invite in /urbit-help once you’ve gotten [set up](https://urbit.org/getting-started).
3131
3232
33334 -
content/using/_index.md+31−3
@@ -1,5 +1,33 @@
11+++
2−title = "Using"
2+title = "Usage Docs"
33sort_by = "weight"
4−template = "list.html"
5−+++
4+template = "sections/docs/chapters.html"
5++++
6+
7+Welcome to the usage documentation for the Urbit project. This documentation is
8+maintained by [Tlon](https://tlon.io) and the Urbit community in a public
9+[Github repository](https://github.com/urbit/urbit.org). Issues and
10+contributions are welcome.
11+
12+This documentation provides a series of guides and reference material for
13+assisting you in the usage and operations of your ship. If you're looking for
14+documentation on how to *develop* on Urbit, see our [development docs](@/docs/_index.md).
15+
16+### [Urbit OS](@/using/os/_index.md)
17+
18+This section describes how to interact with your running Urbit ship: this
19+includes working with the filesystem, command line (`dojo`), resolving common
20+issues, and more.
21+
22+### [Urbit ID](@/using/id/_index.md)
23+
24+Urbit ID is our [public-key infrastructure](@/using/id/overview.md), which is
25+what allows you to truly own your identity. Here you'll find guides for
26+interacting with your Urbit ID via our [Bridge](https://bridge.urbit.org)
27+application.
28+
29+### [Running Urbit](@/using/running/_index.md)
30+
31+Urbit can be run in a variety of contexts. Our [Getting Started
32+Guide](@/getting-started/_index.md) covers how to run an Urbit locally on your
33+computer; this section covers alternative ways of running Urbit.
content/using/develop.mddeleted−96
@@ -1,96 +0,0 @@
1−+++
2−title = "Developer's Guide"
3−description = "How to get started developing on Urbit."
4−weight = 3
5−template = "page_indiced.html"
6−aliases = ["/docs/using/creating-a-development-ship/", "/docs/getting-started/contributing"]
7−+++
8−
9−There are roughly two kinds of development on Urbit: core development and application development. Urbit applications are still young, but can be fun to experiment with. The kernel is much more stable, but generally more challenging from an engineering standpoint.
10−
11−This guide will start by getting you set up to run an Urbit ship, and then tell you everything you need to know to do either.
12−
13−### Setting up your environment
14−
15−We assume you’ve gotten a basic introduction to Urbit. If you haven’t, read the [Understanding Urbit](@/understanding-urbit/_index.md) series.
16−
17−Once you’re ready, you can get started on the network right away and take some first steps, without acquiring an identity, by [creating a comet](@/using/install.md#comet).
18−
19−When developing, however, we recommend [booting a development ship](#creating-a-development-ship) and working locally -- you may need to make changes that could, in the wrong hands, destroy the ship’s environment, and it’s best to do so in a safe, separate place.
20−
21−## Core development {#core}
22−
23−Working on the core means improving the Urbit project itself, working with the existing community of Urbit developers.
24−
25−Just arrived and unsure what to work on? An ideal way to get started is by experimenting with the system, talking to other developers, and reading (or [contributing to](https://github.com/urbit/docs)) the [documentation](/docs/).
26−
27−Prefer learning with an instructor? We also offer an online course that covers the basics of Urbit development called [Hoon School](@/community/hoonschool.md). If course-based learning works well for you, we recommend you sign up.
28−
29−The Urbit developer community congregates around [the urbit-dev mailing list](https://groups.google.com/a/urbit.org/forum/#!forum/dev), the `~bitbet-bolbel/urbit-community` group on Landscape, and [Urbit’s GitHub repository](https://github.com/urbit/urbit). It’s a good idea to sign up, see what people are talking about, and introduce yourself.
30−
31−Once you’re comfortable working with Urbit, check out the [project’s issues on GitHub](https://github.com/urbit/urbit/issues) or some of our [contribution bounties](https://grants.urbit.org/).
32−
33−If you’re looking for some guidance, need help, or would prefer direct communication for your ideas, you can also always reach out to us directly at [support@urbit.org](mailto:support@urbit.org).
34−
35−## Application development {#application}
36−
37−When creating user applications on Urbit, you aren’t tied to any particular user interface. They can work without providing a response to the user, or by printing to the Dojo, or with an interface in Landscape, which uses [Eyre](@/docs/tutorials/arvo/eyre.md) (the Arvo vane that serves HTTP to serve a React-based interface to the application through a web browser).
38−
39−When writing applications, you will often make use of [Gall](@/docs/tutorials/hoon/hoon-school/gall.md), the Arvo vane that manages user applications.
40−
41−If you want to see examples of Urbit applications with common functionality requirements, you can see our [examples](https://github.com/urbit/examples) repository. If you want to get started building applications with a Landscape interface, check out our [create-landscape-app](https://github.com/urbit/create-landscape-app) repository.
42−
43−
44−## Creating a development ship {#creating-a-development-ship}
45−
46−To do work with Hoon and with the system, we recommended using a "fake" ship -- one not connected to the network.
47−
48−Because such a ship has no presence on the network, you don't need an Azimuth identity for its purposes. You just need to have [installed our software](/using/install).
49−
50−To create a fake ship named `~zod`, run the command below. You can replace `zod` with any valid Urbit ship-name.
51−
52−```
53−./urbit -F zod
54−```
55−
56−Now you should see a block of boot messages, starting with the Urbit version number. Welcome!
57−
58−## Community tutorials {#community-tutorials}
59−
60−Here are some tutorials written by members of the Urbit community. Some are a little outdated, but they may still prove useful.
61−
62−- [Generators](https://github.com/joemfb/mardev/tree/master/docs/gen) by `~master-morzod`
63−- [Urbit by Doing](https://github.com/Fang-/Urbit-By-Doing) by `~palfun-foslup`
64−- [Learning Hoon](https://github.com/knubie/learning-hoon) by `@knubie`
65−- [A Nock Interpreter](https://jtobin.io/nock) by `~nidsut-tomdun`
66−- [Basic Hoonery](https://jtobin.io/basic-hoonery) by `~nidsut-tomdun`
67−
68−If you want to add something to the list, [shoot us an email](mailto:support@urbit.org) or make a pull request in the [docs repository](https://github.com/urbit/docs).
69−
70−## How else can I contribute? {#how}
71−
72−The Urbit project is a global community of developers, users, and fans. If you’re interested in getting involved, there’s space for you; you don’t have to be a developer to be a part of the project.
73−
74−### Running stars and galaxies
75−
76−There are two ways to participate in the Arvo network: as a user running a planet and as an infrastructure provider running a galaxy or a star.
77−
78−For planets, Urbit is a peer-to-peer network where users can interact with each other via Landscape, or using custom applications that anyone can write.
79−
80−Running a planet helps build Urbit’s community, surfaces bugs, and helps core developers improve Urbit under realistic conditions.
81−
82−Stars and galaxies, however, have additional responsibilities and play a role in peer discovery as well as star and planet distribution. You can think of stars and galaxies as similar to the DNS system in the modern Internet. Most users don’t know it exists, but without it, the web wouldn’t work at all.
83−
84−Running a reliable galaxy or star, and spawning stars and planets from them, are excellent ways to help bootstrap the Urbit network.
85−
86−If you’re interested in running a galaxy or star, you’ll be reliably providing peer discovery for your children just by running your node – and we’re doing our best to make this both easy and profitable. If you’re interested in this, see [Star and Galaxy Operations](@/using/operations/stars-and-galaxies.md).
87−
88−If you’re interested in distributing planets, read on.
89−
90−### Distribute points
91−
92−Want to get your friends and family into Urbit? Distribute planets using Bridge with a feature called **delegated sending**.
93−
94−Here’s how it works: any star can grant a number of invites to any of its child planets. Those planets can then send one-time-use invite codes via email to anyone of their choosing.
95−
96−For instructions on how to grant and send invites, check out [Using Bridge](@/using/operations/using-bridge.md).
content/using/id/_index.mdnew file+33
@@ -0,0 +1,33 @@
1++++
2+title = "Urbit ID"
3+template = "sections/docs/chapters.html"
4+sort_by = "weight"
5+description = "How to interact with Urbit ID."
6+weight = 20
7++++
8+
9+Urbit ID is our [public-key infrastructure](@/using/id/overview.md), which is
10+what allows you to truly own your identity.
11+
12+### [Overview](@/using/id/overview.md)
13+
14+This document discusses what Urbit ID is, how it's built, and why it's been
15+built that way at a high level.
16+
17+### [Using Bridge](@/using/id/using-bridge.md)
18+
19+A guide to using [Bridge](https://bridge.urbit.org), our tool for managing your
20+Urbit ID.
21+
22+### [Bridge Troubleshooting](@/using/id/bridge-troubleshooting.md)
23+
24+How to resolve common issues in Bridge.
25+
26+### [Creating an Invite Pool](@/using/id/creating-an-invite-pool.md)
27+
28+If you own a star, invite pools allow your friends to invite others onto the
29+network.
30+
31+### [Guide to Breaches](@/using/id/guide-to-breaches.md)
32+
33+What to do when things go very wrong and you need to start over.
content/using/operations/bridge-troubleshooting.md → content/using/id/bridge-troubleshooting.mdrenamed+4−2
@@ -1,10 +1,12 @@
11+++
22title = "Bridge Troubleshooting"
3−template = "page_indiced.html"
3+template = "doc.html"
44description = "Troubleshooting Bridge if you are running into errors"
5−weight = 5
5+weight = 20
66+++
77
8+This page covers common issues encountered with the [Bridge](https://bridge.urbit.org) application.
9+
810### Canvas Issues
911
1012Bridge uses an HTML element called canvas to create your wallets. Unfortunately malicious websites can use canvas to identify and track users. As a result, some browsers and anti-tracking extensions can interfere with Bridge's ability to generate wallets.
content/using/id/creating-an-invite-pool.mdnew file+106
@@ -0,0 +1,106 @@
1++++
2+title = "Creating an Invite Pool"
3+weight = 30
4+template = "doc.html"
5++++
6+
7+If you're a star owner, you have the ability to create **invite pools**. These
8+invite pools let you give your friends a piece of the network in the form of a
9+planet. This document will give you an explanation of how to create an invite
10+pool and how to share it with your friends using our tool
11+[Bridge](https://bridge.urbit.org).
12+
13+For more general tips on using your star, check out the [Star and Galaxy
14+Operations page](@/using/_index.md).
15+
16+## Anatomy of an Invite Pool
17+
18+An invite pool is a set of planet invites that can be distributed via email or
19+URL; each invite is worth one planet when redeemed. An invite pool can be as big
20+as you'd like, providing that you have enough planets left to spawn. All invite
21+pools must be created by a star, but they must be given to a planet. If you're
22+interested in how this works technically, take a look at the
23+[DelegatedSending.sol
24+contract](https://github.com/urbit/azimuth/blob/master/contracts/DelegatedSending.sol).
25+
26+Keep in mind that all planets will have access to the invite pool until the
27+invite pool is exhausted.
28+
29+For example: As `~marzod`, I spawn `~wicdev-wisryt` and give it an invite pool
30+of 100 planets. `~wicdev-wisryt` can now send an invite to a friend at
31+galen@tlon.io. When Galen claims his planet (`~ravmel-ropdyl`), `~ravmel-ropdyl`
32+can now invite his friend — or 99 of them. `~wicdev-wisryt` may also continue to
33+use the invite pool, as can anybody they invite.
34+
35+## How To Create an Invite Pool
36+
37+Giving your friends a piece of Urbit only takes a few minutes: send an invite
38+pool to a planet, and then that planet can email an invite to a friend (or
39+friends)
40+
41+1. Log into Bridge using your ownership address for your star.
42+
43+2. Change the spawn proxy of your star to
44+ `0xF7908Ab1F1e352F83c5ebc75051c0565AEaea5FB`. This is a contract address that
45+ will handle the spawning of planets for invitees.
46+
47+3. Get the `@p` (like `~poldec-tonteg`) of the planet to whom you'd like to give
48+ access to the invite pool. It can be one you control or a friend's. It does
49+ not have to be a planet sponsored by your star.
50+
51+3. Click "Manage Invite Pools" to assign an invite pool to the planet. You may
52+ receive a notification that you need to assign your spawn proxy to the
53+ address of the Delegated Sending contract. This is so that the contract can
54+ send invites on your behalf when the recipient claims them. This address is
55+ `0xF7908Ab1F1e352F83c5ebc75051c0565AEaea5FB`, which is also displayed in Bridge.
56+
57+![](https://media.urbit.org/docs/invite-pool/browser-point.png)
58+
59+4. Enter the `@p` of the planet and the number of invites you'd like to assign to them.
60+
61+![](https://media.urbit.org/docs/invite-pool/browser-create-pool.png)
62+
63+Once the transaction is complete, the planet will have access to the invite pool.
64+
65+## How to Send an Invite
66+
67+1. Log into Bridge using the planet assigned an invite pool above using the
68+ planet's Master Ticket or ownership address.
69+
70+2. Under "Invite Group", click "Add Members" to unroll the invitation UI.
71+
72+3. Select either "Email" or "URL".
73+
74+4. If you selected "Email", enter the email address(es) of those you wish to
75+ invite to the dialog box. You may add more than one email address. Click "Add to
76+ Invite Group" when finished, and wait for the transaction to complete. Your
77+ friend(s) will get an email shortly with your gift of an identity for life!
78+
79+ If you selected "URL", click "Generate Invite URL" to create an invitation URL
80+ that you can then share.
81+
82+## FAQ
83+
84+Q. What happens if the spawn proxy address is changed away from
85+`0xF7908Ab1F1e352F83c5ebc75051c0565AEaea5FB` after an invite pool has been
86+created? Will outstanding invite pool(s) still function?
87+A. They won't. Existing balances will remain, but Bridge (and `azimuth-js`) won't
88+consider any of the invites from that star usable, and trying to send one of
89+their planets anyway will result in a failed transaction.
90+
91+Q. Can a star create more than one invite pool at a time?
92+A. Yes, a star can allow any given planet to send any number of invites
93+independently from one another.
94+
95+Q. Can an invite pool be revoked?
96+A. Yes, this may be done by assigning zero invites to a planet that had been
97+previously been given access to an invite pool.
98+
99+Q. Can a delegated planet have more than one invite pool assigned to it?
100+A. Yes, as a planet, multiple stars can give you invites to use.
101+
102+Q. What can you do if you send an invite to an email address by mistake?
103+A. Planets that have been sent but not yet claimed live at the
104+ownership address of the star that created the invite pool. Log into Bridge
105+using the ownership address for the star and you will be able to cancel the
106+pending invite. Once an invite has been accepted, nothing can be done!
content/using/id/guide-to-breaches.mdnew file+90
@@ -0,0 +1,90 @@
1++++
2+title = "Guide to Breaches"
3+weight = 40
4+template = "doc.html"
5++++
6+
7+An important concept on the [Ames](@/docs/arvo/ames/ames.md) network is that of continuity. Continuity refers to how ships remember the order of their own network messages and the network messages of others -- these messages are numbered, starting from zero. A _breach_ is when ships on the network agree to forget about this sequence and treat one or more ships like they are brand new.
8+
9+There are two kinds of breaches: **personal breaches** and **network breaches**.
10+
11+## Personal Breaches
12+
13+Ships on the Ames network sometimes need to reset their continuity. A personal breach is when an individual ship announces to the network: "I forgot who I am, let's start over from scratch." That is, it clears its own event log and sends an announcement to the network, asking all ships that have communicated with it to reset its networking information in their state. This makes it as though the ship was just started for the first time again, since everyone on the network has forgotten about it.
14+
15+Personal breaches often fix connectivity issues, but should only be used as a
16+last resort. Before performing a personal breach, look at alternative fixes in
17+the [Ship Troubleshooting](../ship-troubleshooting) guide. Also reach out for
18+help in the Help channel in the Urbit Community group
19+`~bitbet-bolbel/urbit-community`, or, failing that, in the
20+`#ship-starting-support` channel in our [Discord
21+server](https://discord.gg/n9xhMdz) to see if there is another option.
22+
23+There are two types of personal breaches - one where your Ethereum ownership address
24+remains the same, and one where you are switching to a new Ethereum ownership
25+address. We make the emphasis about the Ethereum _ownership_ address as
26+changing your [proxies](@/docs/glossary/proxies.md) does not require a breach.
27+
28+If you will be keeping the same Ethereum ownership address and would like to perform a
29+personal breach, follow the steps below.
30+
31+- Go to [bridge.urbit.org](https://bridge.urbit.org) and log into your identity.
32+- Click on `OS: Urbit OS Settings` at the bottom, then click `Reset Networking Keys`.
33+- Check the `Breach Continuity` box. Click `Reset Networking Keys`, and then click `Send Transaction` and wait for the progress bar to appear.
34+- Download your new keyfile following these instructions: [Generate your
35+ keyfile](@/using/id/using-bridge.md#generate-your-keyfile).
36+- Delete or archive your old [pier](@/docs/glossary/pier.md).
37+- Proceed to [boot your ship](@/getting-started/_index.md#boot-your-planet) with the new keyfile.
38+- Delete your keyfile after successfully booting.
39+- Rejoin your favorite chat channels and subscriptions.
40+
41+If you are switching to a new Ethereum ownership address you will have the
42+choice as to whether or not you want to breach. This is to cover the case when
43+you are transferring to another address you own. The process here is slightly different.
44+
45+- Go to [bridge.urbit.org](https://bridge.urbit.org) and log into your identity.
46+- Click on `ID: Identity and security settings` at the bottom, then click
47+ `Transfer this point`.
48+- Enter the new Ethereum address you would like to transfer ownership to. Click
49+ `Generate & Sign Transaction`, then click `Send Transaction` and wait for the
50+ progress bar to complete.
51+- Logout of your current session in Bridge by clicking `Logout` at the top, and
52+ then login to your new ownership address.
53+- From here, following the directions on how to [Accept your
54+ transfer](@/using/id/using-bridge.md#accept-your-transfer), [Set your
55+ networking keys](@/using/id/using-bridge.md#set-your-networking-keys),
56+ and [Generate your
57+ keyfile](@/using/id/using-bridge.md#generate-your-keyfile). The option
58+ whether or not to breach is in the Accept your Transfer step.
59+- Delete or archive your old [pier](@/docs/glossary/pier.md).
60+- Proceed to [boot your ship](@/getting-started/_index.md#boot-your-planet) with the new keyfile.
61+- Delete your keyfile after successfully booting.
62+- Rejoin your favorite chat channels and subscriptions.
63+
64+Performing a personal breach on your ship increments an integer value called
65+your ship's _life_ by one, which refers to your ship's [Azimuth](@/docs/azimuth/azimuth.md) _key
66+revision number_. This value is utilized by
67+Ames and Jael to ensure that you are
68+communicating with a ship created using its most recent set of keys. Your
69+ship's life is written at the end of the name of its keyfile, e.g.
70+`sampel-palnet-4.key`. Changing the Etherum address that holds the Urbit ID,
71+called _reticketing_, increments a number called the ship's _rift_ by one in
72+addition to incrementing your ship's life.
73+Rift refers to your ship's Azimuth _continuity number_.
74+
75+You can check your current life and rift number by running the
76+`+keys our` generator in Dojo. You can inspect another ship's life and rift can be checked by
77+running `+keys ~sampel-palnet`.
78+
79+
80+## Network Breaches
81+
82+A network breach is an event where all ships on the network are required to update to a new continuity era. Network breaches happen when an Arvo update is released that is too large to release over the air. The current continuity era is given by a value in Ames, our networking vane, that is incremented when a network breaches; only ships with the same such value are able to communicate with one another.
83+
84+If a network breach is happening, follow the steps below.
85+
86+- Delete your old Urbit binary.
87+- Delete or archive your old pier.
88+- Download the new Urbit binary by following the instructions in the [Install page](@/getting-started/_index.md).
89+- Create a new pier by booting your ship with your key, according to the instructions on the install page. (Note: You do _not_ need to use a new key to boot into a new continuity era.)
90+- Rejoin your favorite chat channels and subscriptions.
content/using/id/overview.mdnew file+71
@@ -0,0 +1,71 @@
1++++
2+title = "Overview"
3+description = "A public key infrastructure (PKI) is a system for binding a set of keys to a name. Sometimes a small amount of metadata is included."
4+weight = 1
5+template = "doc.html"
6++++
7+
8+![](https://media.urbit.org/site/posts/essays/pki-maze.png)
9+
10+A public key infrastructure (PKI) is a system for binding a set of keys to a name. Sometimes a small amount of metadata is included.
11+
12+Existing PKIs include PGP-style ["web of trust"](https://en.wikipedia.org/wiki/Web_of_trust), [SSL certificates](https://en.wikipedia.org/wiki/Certificate_authority), [ZeroTier](https://www.zerotier.com/lf-announcement/), [Keybase](https://keybase.io/), [OpenID](https://openid.net/what-is-openid/), [Mozilla Persona](https://developer.mozilla.org/en-US/docs/Archive/Mozilla/Persona), and [Login with Google](https://developers.google.com/identity). These take unique approaches to the problem and have achieved some degree of success, but none provide globally consistent, permanent, and completely self-owned identities. Exhaustive exploration and categorization is unfortunately out of scope for this post, so we'll just describe Urbit's approach to achieving these properties in our PKI.
13+
14+In Urbit, a "name" is often called a "ship" or an "address" because we use the metadata in the PKI to make names routable. The total data is two 256-bit asymmetric keys, a cryptographic suite number (to allow changing crypto algorithms), the revision number of the key, and the name of a ship that will route for it. This sums to less than 128 bytes of data.
15+
16+Each PKI trades off various properties. We chose a tripartite system so that appropriate choices can be made for different use cases. Here, we explore the various properties we chose by following a series of binary choices -- the idea maze.
17+
18+There are two sorts of PKI: either you can change your keys or not. If you cannot, then your name is impermanent, for no one can keep a set of keys secure forever. Even if your opsec never fails, eventually your crypto algorithms may be compromised.
19+
20+However, if you sacrifice the ability to change your keys, you can have a very nice property: self-attesting keys. If your name is a hash of your public key information, then no other source of information is required to verify you are who you say you are. This is a useful property since it requires no coordination at all. Many things are impermanent, especially during development. It also provides a way to try out the network without obtaining a permanent address.
21+
22+This is our first stop in the idea maze. We call this sort of name a "comet". A comet's name is the 128-bit hash of its public keys.
23+
24+However, Urbit is yours and it's forever. You shouldn't have to change your name every time you change your keys. So, we go back and take the other choice: you must be able to change your keys.
25+
26+To change keys, you must sign a message with the old keys revoking them and supplying the new ones[^0]. The question is what happens if the old keys also sign a second set of new keys. This could happen if an attacker obtained your old keys after the fact. This is important because one of the reasons to be able to change your keys is to invalidate the old ones so that they have no power.
27+
28+We have two options again: the PKI may be globally consistent or not. To be globally consistent means that if you believe a name is bound to a set of keys, then nobody on the network will disagree.
29+
30+If you don't require global consistency, you may sign this message and send it to all your neighbors, and they pass it on, and hopefully it gets to most of the network quickly. However, if one of those ships receives two contradictory versions of this message, the only thing it can do is trust the first one it heard, which may be different than what someone else heard. Thus, this is pairwise consistent but globally inconsistent. This is essentially how the pre-blockchain Ames network worked, though key changes were not actually implemented. Because global consistency is a valuable property, we looked at other options.
31+
32+For a globally consistent PKI that allows you to revoke keys, you need to be able to distinguish between two cryptographically valid messages to determine which was signed first. The dual problem could be solved easily — you can prove a message is signed after another by including the signature of the first in the second. This is equivalent to reading out a newspaper headline to prove a message was recorded after a given day.
33+
34+However, the problem of proving one message was sent before any later ones inverts the problem. You can solve this with newspapers by placing the message in the text of the newspaper. However, while reading a newspaper requires no central party, writing one does. For a long time, this sort of message was always handled by a central party. SSL revocations are managed by a few central parties. When you buy property, it's not sufficient to have the previous owner sign the title — this must be entered into a central land registry. Otherwise, the owner may sell their property to multiple people and there would be no way to determine who is the new owner. With the land registry, all you need to do is ask the registry which sale happened first, and that's the one that counts.
35+
36+However, Urbit is yours and it's forever. Trusting central registries jeopardizes both. The keen reader will notice that the problem of determining which key rotation happened first is exactly the double-spend problem that Satoshi solved with his proof of work algorithm for Bitcoin. His first block famously includes a newspaper headline to prove he didn't mine the block before that date. In a beautiful duality, his own algorithm proves that he didn't mine it after that date.[^1]
37+
38+Some argue that blockchain is only good for money. This is myopic and is generally based on the experience that its most valuable application so far has been money. However, blockchain is a cryptographic primitive to do what was previously impossible: prove that one message was signed before another without a central party. Blockchain was discovered by someone trying to create digital money, and he needed that primitive, but that doesn't mean that's all it's good for.
39+
40+Thus, we store our PKI data on a blockchain for our second kind of name: planets. A planet is a 32-bit address which has key information stored on the blockchain.[^2] The owner of a planet may broadcast new PKI data by adding it to the blockchain. Any later messages by the old keys will be rejected, and everyone on the network will listen to the blockchain for key data. Thus, we have global consistency, permanence, and self sovereignty. We know of no other solution that can provide these properties.
41+
42+However, while small individually, the aggregate PKI data for all nodes on the network may become very large. This is not an issue for comets because nobody needs to store comet keys except for those which they're talking with, and even those can be garbage-collected and re-requested and verified. For planets, there is a canonical set of keys, and somebody must store that. There are about 2<sup>32</sup>, or 4 billion planets. If the PKI data is about 100 bytes for each planet, this is about 400 GB of data. This may be more than most users wish to store, but it's small enough that it would be very cheap for someone to host this data for many users[^3].
43+
44+This information is currently stored directly on the Ethereum 1.0 blockchain, but as is well understood in blockchain circles this approach will not scale beyond a certain point. Many chains are pursing designs that allow the users of the smart contracts to store locally the data associated with the contracts they care about and only commit hashes to the chain. We expect there to be several viable options for this by the time our scaling needs exceed what's provided by Ethereum 1.0. This will free us from the cost of hosting the PKI data on all Ethereum nodes, but the data must still be stored somewhere. Any service that could handle such a large amount of data would inherently centralize the network.
45+
46+However, 4 billion is not enough addresses for every device on the planet today, much less in a few decades. So, we apply our maxim of re-examining our choices at each level for each use case. Examining the idea maze above, we cannot use the blockchain option for everything since the data is too big. However, it's not actually necessary for each of your devices to have its own self-sovereign identity separate from your planet. So we choose the option of using a central registry: your own planet.
47+
48+We allocate 4 billion "moons" to each of those planets. A moon is a 64-bit address whose 32-bit suffix is its planet. Your planet can easily store the keys for its own moons, and anyone who needs to talk to your moons can ask you for the keys.
49+
50+This is the sense in which moons are true ships: they're permanent names and you own them completely, as long as you own the planet. However, they're not independent ships — their keys can always be revoked by their planet.
51+
52+To create a sane network, we require global consistency for all our names. There are three other properties; pick any two:
53+
54+- Comets are impermanent, self sovereign, and plentiful.
55+
56+- Planets are permanent, self sovereign, and not plentiful.
57+
58+- Moons are permanent, not self sovereign, and plentiful.
59+
60+Fancifully, comets are wayward celestial bodies that are great for testing and miscellaneous low-value things that won't last for long. Planets are where you can build a home and shape it into anything you want it to be. People can always find your planet; it's not going anywhere. Moons are useful for special purposes, like storage, heavy industry, and anything else you might want to do off-planet.[^4]
61+
62+
63+[^0]: Or the equivalent with a hierarchical key structure. In practice, you want to have a master key which signs a junior key for everyday use. You use the master key to rotate the junior key.
64+
65+[^1]: More strictly: it proves that he didn't mine it after the other blocks currently on the Bitcoin blockchain. It only gives an ordering within the chain, not a literal timestamp.
66+
67+[^2]: In addition to planets, there are stars and galaxies. From a PKI perspective they're treated exactly like planets, but on the network they provide infrastructure services like routing.
68+
69+[^3]: In practice, this will likely be an included service by your sponsoring star. It could be a separate service, but it will be very cheap because it's a commodity and the "cost of production" is very cheap. At any rate, it should never rise above the capital cost of a 400GB hard drive.
70+
71+[^4]: To extend the metaphor, stars are a neighborhood to live in -- they're easier for other planets to see, so when they want to send you a message they look for your star first. If they don't even know where your star is, they can certainly find your star's galaxy, and that will be enough to locate the star. Of course, if your star is not providing satisfactory service, you can take your planet and move to another star.
content/using/operations/using-bridge.md → content/using/id/using-bridge.mdrenamed+50−5
@@ -1,8 +1,8 @@
11+++
22title = "Using Bridge"
3−template = "page_indiced.html"
3+template = "doc.html"
44description = "How to use Bridge to interact with Azimuth and manage your Urbit ID."
5−weight = 1
5+weight = 10
66aliases = ["/docs/getting-started/using-bridge/"]
77+++
88
@@ -14,7 +14,7 @@ This guide assumes that you have an Urbit ID, or that you have found someone to
1414
1515To connect to Bridge, go to [https://bridge.urbit.org](https://bridge.urbit.org) into your browser, and enter your identity's credentials in the appropriate fields. If you were invited to claim an Urbit ID, it's very likely that you received an email that would direct you to Bridge, and you can simply follow the hyperlink in that email.
1616
17−You'll arrive at a page and see two major choices: `ID` and `OS`. `OS` is the only option that you're interested in right now; click on it. On the `OS` page, click the `Download Arvo Keyfile` button. Once you have downloaded the keyfile, you can exit Bridge and proceed to [install the Urbit binary](@/using/install.md).
17+You'll arrive at a page and see two major choices: `ID` and `OS`. `OS` is the only option that you're interested in right now; click on it. On the `OS` page, click the `Download Arvo Keyfile` button. Once you have downloaded the keyfile, you can exit Bridge and proceed to [install the Urbit binary](@/getting-started/_index.md).
1818
1919### Local Bridge
2020
@@ -42,7 +42,14 @@ If you were given points by Tlon you likely already fully own them. But if someo
4242
4343After you access your Ethereum address, if a point was sent to that address, you'll come to a page that has an `Incoming Transfers` header, under which is a graphic. Click the `Details ->` link under that graphic.
4444
45−Now you'll be on the management page of your point. The transfer isn't completed yet, so click `Accept incoming transfer`. Then check both boxes and and click their associated `Sign Transaction` and `Send Transaction` buttons.
45+Now you'll be on the management page of your point. The transfer isn't completed
46+yet, so click `Accept incoming transfer`. If you are transferring to yourself
47+and do not wish to [breach](@/docs/glossary/breach.md), check the box labeled
48+`Retain proxies and key configuration, in case of transferring to self`.
49+Otherwise leave the box unchecked, ensuring that your ship will be breached upon
50+transfer and thus no Azimuth data from the previous owner (namely proxies and
51+networking keys) will be retained. Then press the `Generate and Sign
52+Transaction` button, followed by the `Send Transaction` button.
4653
4754If you already own a point, click on the `Details ->` under your sigil in the `Your Points` section.
4855
@@ -65,4 +72,42 @@ It should be noted that setting your network keys is an event on the Ethereum ne
6572From the detail page associated with your point, click the `Generate Arvo Keyfile` link and you'll be taken to a page with a field titled `Network seed`. This field should already be filled in, and should match the hexadecimal string that you entered in the previous step. If it's not filled in or does not match, fill it in with the correct string.
6673Click `Generate ->`, which will download a keyfile onto your machine.
6774
68−With that keyfile in hand, you can now exit Bridge and continue to the guide to [install the Urbit binary](@/using/install.md).
75+With that keyfile in hand, you can now exit Bridge and continue to the guide to [install the Urbit binary](@/getting-started/_index.md).
76+
77+### Escaping your sponsor {#escaping-your-sponsor}
78+
79+As a planet or star, it behooves you to be sponsored by an active star or galaxy,
80+respectively. If your sponsor isn't suiting your needs, you can escape to a
81+different one.
82+
83+#### Prerequisites
84+
85+- A little bit of ETH in your management proxy address to pay for the
86+ transaction.
87+- The `@p` of the sponsor you want to escape to. You should negotiate the
88+ transfer with the sponsor ahead of time, as they will need to accept it on
89+ their end. If you cannot find one, contact Tlon at support@urbit.org and we
90+ will assist you in escaping to one of our stars/galaxies.
91+
92+#### Instructions
93+
94+1. Login to [Bridge](https://bridge.urbit.org) with the management proxy address
95+ for the ship that will be escaping their sponsor. The ownership address will
96+ also do, as will the master ticket if you have that.
97+2. Click on the "OS" button at the bottom of the screen.
98+3. Below Network, you will find the `@p` of your current sponsor. Click "Change"
99+ to the right of that.
100+4. Enter the `@p` of your new sponsor.
101+5. Click the "Request" button and then complete the transaction.
102+
103+This action will consume a small amount of ETH. Your sponsor will then need to
104+accept you via a similar process in Bridge, which will require ETH on their end.
105+After the transaction is completed on Ethereum, it will still take some time for
106+the information to propagate to the Urbit network. After 30 minutes or so, you
107+may check that your sponsor has successfully been altered by running
108+`(sein:title our now our)` in dojo and confirming that the `@p` matches that of
109+your new sponsor.
110+
111+Once you change your sponsor, you will likely want to change your source of
112+[OTAs](@/docs/glossary/ota-updates.md) to them as well. To accomplish this, enter `|ota
113+~sponsor %kids` in dojo, where `~sponsor` is the `@p` of your new sponsor.
content/using/install.mddeleted−361
@@ -1,361 +0,0 @@
1−+++
2−title = "Install + Setup"
3−weight = 1
4−description = "How to install Urbit."
5−template = "page_indiced.html"
6−aliases = ["/docs/getting-started/"]
7−+++
8−
9−Urbit is not for everyday users yet — but if you're technically inclined or generally intrepid, feel free to try it out. It's a good place to explore.
10−
11−## Overview
12−
13−There are two major components of the Urbit ecosystem: **Urbit OS** and **Urbit ID**.
14−
15−The Urbit peer-to-peer (P2P) network is composed of instances of Urbit OS — also called **ships** — that run as virtual machines on any Unix platform. The Urbit ID registry is deployed on the Ethereum blockchain, and individual IDs exist as non-fungible ([ERC-721](https://eips.ethereum.org/EIPS/eip-721)) tokens. On the network, Urbit IDs function as network addresses, represented by pronounceable names like `~padmyn-pasnux`.
16−
17−As we'll explain, there are a few types of Urbit ID, but everyday users tend to use **planets**, as full citizens of the network.
18−
19−Two other types of ships are **stars** and **galaxies**. Together these perform essential infrastructural roles for the Urbit network. Each galaxy can distribute 256 stars, and each star can distribute 65,536 planets. So any given planet ultimately came from a specific star, which itself came from a specific galaxy. On the Urbit OS side, stars help route packets; galaxies are more like DNS root servers or ICANN members. The difference with Urbit in the analogy is that Urbit IDs are owned cryptographically by individuals, collectives, and companies alike, and accrue reputation independently.
20−
21−If you just want to try Urbit out, there are also free IDs called **comets**. They are good for bots and people who are new to Urbit and want to check out the network, but they aren't good for building a reputation as a friendly and responsible peer. Their long names make them difficult to remember—and some communities ban comets to prevent spam—but they're still a good way to see what Urbit is about before buying your own planet.
22−
23−To start with a comet, continue below. For planet instructions, see [further below](#boot-your-planet). For star or galaxy instructions, see [this section](#supernode).
24−
25−## Installing Urbit
26−
27−Regardless of your Urbit ID, you'll want the Urbit binary installed first. The Urbit binary runs on a Unix-like operating system – Ubuntu, Fedora, or macOS, for example.
28−
29−### macOS and Linux
30−
31−```sh
32−#macOS:
33−mkdir urbit
34−cd urbit
35−curl -O https://bootstrap.urbit.org/urbit-v0.10.8-darwin.tgz
36−tar xzf urbit-v0.10.8-darwin.tgz
37−./urbit-v0.10.8-darwin/urbit
38−
39−#Linux:
40−mkdir urbit
41−cd urbit
42−curl -O https://bootstrap.urbit.org/urbit-v0.10.8-linux64.tgz
43−tar xzf urbit-v0.10.8-linux64.tgz
44−./urbit-v0.10.8-linux64/urbit
45−```
46−
47−Once you've followed the appropriate install instructions, you can check if everything went right by running the `./urbit` command. Installation was successful if you get a block of output that begins with the line below:
48−
49−```
50−Urbit: a personal server operating function
51−```
52−
53−To access your Urbit via HTTP on port 80 on Ubuntu, you may need to run the following:
54−```sh
55−sudo apt-get install libcap2-bin
56−sudo setcap 'cap_net_bind_service=+ep' /path/to/urbit
57−```
58−(Where `urbit` is the urbit executable downloaded with `curl` prior)
59−
60−### Windows
61−
62−> Please note that this method of installing Urbit is experimental, and we may not be able to assist you if you encounter issues related to WSL 2.
63−
64−These instructions have been tested and verified for WSL 2 + Ubuntu 18.04 LTS.
65−
66−Urbit cannot run on Windows itself, but there is a convenient way to run a Linux distro using the [Windows Subsystem for Linux 2](https://docs.microsoft.com/en-us/windows/wsl/wsl2-install) on Windows 10. Install the Windows Subsystem for Linux 2 and open a Linux terminal in Windows, then follow the Linux installation instructions above.
67−
68−For performance reasons, do not install Urbit in the mounted Windows volume, but install it in the Linux file system. For example, in your home directory, which can be navigated to by entering `cd ~`.
69−
70−## Setting up a comet {#comet}
71−
72−**Comets** are 128-bit or 16 syllable Urbit IDs, that look like:
73−
74−`~dasres-ragnep-lislyt-ribpyl--mosnyx-bisdem-nidful-marzod`
75−
76−Comets are disposable, free identities that can be used to quickly join the network and try things out.
77−
78−### Booting a comet
79−
80−To boot a comet, go into the command line and run the following command from the `urbit` directory you created during [Urbit installation](#installing-urbit):
81−
82−```sh
83−#macOS:
84−./urbit-v0.10.8-darwin/urbit -c mycomet
85−
86−#Linux:
87−./urbit-v0.10.8-linux64/urbit -c mycomet
88−```
89−
90−Since your identity on the network is not verified, it may take up to an hour to generate your comet. As it boots, will spin out a bunch of boot messages and create a directory called `mycomet`. Toward the end of the boot process, you'll see something like:
91−
92−```
93−ames: on localhost, UDP 31337.
94−http: live (insecure, public) on 8080
95−http: live ("secure", public) on 8443
96−http: live (insecure, loopback) on 12321
97−~sampel_marzod:dojo>
98−```
99−
100−When your ship is finished booting, you will see either the `~sampel_marzod:dojo>` or `~sampel_marzod:chat-cli/` prompt. If you see `:chat-cli`, press `Ctrl-X` to switch into Dojo.
101−
102−To exit Urbit, use `Ctrl-D` or enter `|exit` into Dojo.
103−
104−To start your ship up again, run the following from your `urbit` directory (note the lack of `-c` argument):
105−
106−```sh
107−#macOS:
108−./urbit-v0.10.8-darwin/urbit mycomet
109−
110−#Linux:
111−./urbit-v0.10.8-linux64/urbit mycomet
112−```
113−
114−### The Dojo
115−
116−Let's try our first command in the Dojo, the Urbit OS command line and Hoon REPL, to get oriented.
117−
118−Type `(add 2 2)` into the Dojo. You should see the following:
119−
120−```
121−~sampel_marzod:dojo> (add 2 2)
122−```
123−
124−When you press Enter, you should see this:
125−
126−```
127−> (add 2 2)
128−4
129−```
130−
131−Good, your Dojo is working correctly. Now let's run our first useful command in the Dojo. The first thing you generally want to do with a new ship is to **mount** it. A ship being mounted means that it has a presence on your Unix filesystem, allowing files to be shared between Unix and your ship. To mount your ship, type `|mount %` at the Dojo prompt.
132−
133−```
134−|mount %
135−>=
136−```
137−
138−The `>=` output means that a command was successful. Now you can see your ship's files in its Unix directory.
139−
140−### Using Landscape
141−
142−Landscape is the Urbit web interface, and it's the best way to interact with your ship. To access Landscape:
143−
144−1. Start your ship. In the boot messages, look for a line that says something like `http: live (insecure, public) on 80`. The number given is the port that your ship is using.
145−2. If the port given is 80, simply type `localhost` into your browser's address bar. If the given port is a different number, such as `8080`, you would type `localhost:8080`. You'll be met with a login prompt.
146−3. Type `+code` into your comet's Dojo. Copy-paste the returned code into the field asking for it in the browser page.
147−4. You're in! Now you can explore apps such as Chat, Publish, and more.
148−
149−### Join a group
150−
151−Now that you're on Landscape, join the Urbit Community, a great place for newcomers to ask questions.
152−
153−Click the 'Groups' button on your Landscape home page, and then click the `Join Group` column. Then, enter `~bitbet-bolbel/urbit-community` into the field and press the `Join Group` button.
154−
155−From the Urbit Community group you can join a variety of chatrooms, notebooks, and collections.
156−
157−## Setting up a planet {#id}
158−
159−If you have an Urbit ID, you'll use the [Bridge](https://bridge.urbit.org) client to get your ship's *keyfile* before you can [boot your ship](#booting-your-ship). Your keyfile is a cryptographic secret that allows your Urbit instance to authenticate itself on the network, so it is required the first time you boot your ship. Your keyfile is deterministically derived from your other cryptographic secrets.
160−
161−### Purchase an Urbit ID
162−
163−Tlon doesn't currently sell or distribute Urbit IDs, but there are a few ways to get your own:
164−
165−- Getting an invitation from a friend.
166−- Purchasing an Urbit ID, including hosting, from a third-party turnkey solution such as [geturbitid.com](https://www.geturbitid.com/).
167−- Manually setting up and hosting an Urbit ID purchased from a third party such as [urbit.live](https://urbit.live), [OpenSea](https://opensea.io), [planet.market](https://planet.market/), or [Urbit Marketplace](https://urbitmarketplace.com/).
168−
169−Note that when you buy a planet, you should ensure with the provider that the star is operating. If you already have a planet and need to escape a non-operational star, see [Escaping A Sponsor](@/using/operations/using-your-ship.md#escape).
170−
171−Tlon occasionally selects candidates to distribute invitations, and users operating galaxies and stars can spawn and distribute a finite number of stars and planets, respectively.
172−
173−### About your Urbit ID wallet
174−
175−Your Urbit ID is actually yours. As long as you control its cryptographic secrets, nobody can take it away from you. That's why it's important to know a little bit about the cryptographic architecture of Urbit secrets.
176−
177−Urbit ID secrets operate as a system of separate but hierarchically related Ethereum key-pairs. For any given ID, this system of key-pairs is referred to as a **Hierarchical Deterministic (HD) Wallet**. the Urbit HD wallet. Each of these Ethereum addresses have different powers over the same identity, from setting networking keys for communicating in the Urbit network to transferring ownership of identities. Important elements of the HD wallet:
178−
179−- **Master Ticket**: The "password" at the top of the hierarchy that determines the ownership. All other secrets are derived from this. If the rest of the wallet is lost or compromised, the master ticket can derive everything. You'll log into Bridge with this. Always keep your master ticket extremely safe.
180−
181−- **Management Proxy**: Derived from the master ticket. Can perform non-ownership related operations such as configuring Urbit OS networking keys.
182−
183−- **Keyfile**: Derived from the management proxy. Used as cryptographic proof that your Urbit ship is who it says it is. You use it to start up your ship for the first time.
184−
185−### Get your keyfile {#keyfile}
186−
187−As mentioned previously, there are a few ways to acquire a planet. All methods, however, should result in you receiving at least one secret, such as a **master ticket**. If you received an email invite to Urbit, the master ticket should a `.pdf` the passport folder that you downloaded.
188−
189−1. Connect to [Bridge](https://bridge.urbit.org).
190−2. Enter the name of your planet and the associated master ticket in the appropriate fields. Click the "Metamask, Mnemonic, Hardware Wallet..." button for alternate login methods if you don't have a master ticket.
191−3. Once you're logged in, click the "OS" option.
192−4. In resulting page, click the "Download Arvo Keyfile" button. You should receive a `.key` file that contains the secret needed to boot your ship. Hold onto this file.
193−
194−### Choose to host or run your ship locally
195−
196−There are two supported ways of running an Urbit ship: using a cloud service, or running it locally on your own machine. Most users run things locally at first, but we recommend eventually using a cloud service for Urbit because it allows your ship to be accessed from anywhere on multiple devices. Hosting your ship in the cloud also allows it to always be online and ready for OTA updates. It's technically possible to run your Urbit ship on a home server, but ISPs often restrict this to business plans and opening up your home network to the internet can be unsafe if done improperly.
197−
198−We have a guide for [hosting your ship on DigitalOcean](@/using/operations/hosting.md) which we've found works well, but any cloud hosting service should work.
199−
200−### Boot your planet
201−
202−You'll be booting your ship with the keyfile that you downloaded from Bridge.
203−
204−#### Step 1: Find the path to your keyfile
205−
206−Find the absolute path to the keyfile that you downloaded from Bridge. Copy it.
207−
208−#### Step 2: Run the boot command
209−
210−Enter your `urbit` directory.
211−
212−Once you're inside, run the command below, except with `sampel-palnet` replaced by the name of your
213−Urbit identity, and `path/to/my-planet.key` replaced with the path to your keyfile:
214−
215−```sh
216−#macOS:
217−./urbit-v0.10.8-darwin/urbit -w sampel-palnet -k path/to/my-planet.key
218−
219−#Linux:
220−./urbit-v0.10.8-linux64/urbit -w sampel-palnet -k path/to/my-planet.key
221−```
222−
223−Or, if you'd prefer to copy your key in, you can run:
224−
225−```sh
226−#macOS:
227−./urbit-v0.10.8-darwin/urbit -w sampel-palnet -G rAnDoMkEy
228−
229−#Linux:
230−./urbit-v0.10.8-linux64/urbit -w sampel-palnet -G rAnDoMkEy
231−```
232−
233−Either command will create a directory called `sampel-palnet/` and begin building your ship. It may take a few minutes.
234−
235−When your ship is finished booting, you will see either the `~sampel-palnet:dojo>` or `~sampel-palnet:chat-cli/` prompt. If you're seeing `:chat-cli` press `Ctrl-X` to switch into Dojo.
236−
237−To shut down your ship, use `Ctrl-D`. To start your ship up again, run the following from your `urbit` directory:
238−
239−```sh
240−#macOS:
241−./urbit-v0.10.8-darwin/urbit sampel-palnet
242−
243−#Linux:
244−./urbit-v0.10.8-linux64/urbit sampel-palnet
245−```
246−
247−Note that `sampel-palnet/` is the path of a folder, which we just created in your `urbit` directory. This folder is called your ship's **pier**.
248−
249−Never boot multiple instances of your ship at the same time. You can prevent this from happening on accident by only ever keeping a single copy of your pier.
250−
251−**Important:** once a key has been used to boot a ship onto the network, it cannot be used to boot that ship again later - doing so will cause communication problems with other ships. For this reason you should **delete the keyfile from your machine once your ship has booted successfully**. If you do use the same key twice, you'll need to conduct a [personal breach](#breaches) to restore your ship to full functionality).
252−
253−Delete the keyfile with the command below:
254−
255−```sh
256−rm path/to/my-planet.key
257−```
258−
259−### Updating to the latest binary {#updating}
260−
261−Most updates to Urbit are downloaded and applied automatically as OTA (Over the Air) updates. Occasionally it would be infeasible to distribute an update this way, and a new `urbit` binary is released. This is announced in the [urbit-dev](https://groups.google.com/a/urbit.org/forum/#!forum/dev) Google Group when it occurs (as are all OTA updates).
262−
263−To update to the latest binary, download and extract it to replace your existing one. Then run it as before.
264−
265−For example, if in your current `urbit` directory you have an `urbit-v0.10.7-<OS>` directory along with a ship directory called `mycomet`, and a new `urbit-v0.10.8-<OS>` binary was just released, then you'd run the following commands from your `urbit` directory:
266−
267−First shut down your ship, by running the following in dojo (or `Ctrl-D`).
268−```
269−|exit
270−```
271−
272−**NOTE**: Your ship itself can be reused, only the binary needs to be changed. This is why we have the directory structure configured as an `urbit` directory that contains your ship and your binary. This structure makes it easy to swap in new binaries. If you have your ship *inside* the `urbit-vX.XX.X` directory, move it out before deleting that directory.
273−
274−Delete the old binary directory from your `urbit` directory:
275−
276−```sh
277−#macOS:
278−rm -rf urbit-v0.10.7-darwin
279−
280−#Linux:
281−rm -rf urbit-v0.10.7-linux64
282−```
283−
284−Next download and extract the most recent binary from inside your `urbit` directory:
285−```sh
286−#macOS:
287−curl -O https://bootstrap.urbit.org/urbit-v0.10.8-darwin.tgz
288−tar xzf urbit-v0.10.8-darwin.tgz
289−
290−#Linux:
291−curl -O https://bootstrap.urbit.org/urbit-v0.10.8-linux64.tgz
292−tar xzf urbit-v0.10.8-linux64.tgz
293−```
294−
295−Start up your ship with the new binary from your `urbit` directory:
296−```sh
297−#macOS:
298−./urbit-v0.10.8-darwin/urbit mycomet
299−
300−#Linux:
301−./urbit-v0.10.8-linux64/urbit mycomet
302−```
303−
304−Then you're good to go, in the future you'll just modify the version numbers in the example above to the most recent version.
305−
306−### Breaches {#breaches}
307−
308−An important concept on the Urbit network is that of continuity. Continuity refers to how ships remember the order of their own network messages and the network messages of others — these messages are numbered, starting from zero. A breach is when ships on the network agree to forget about this sequence and treat one or more ships like they are brand new.
309−
310−There are two kinds of breaches: personal breaches and network breaches.
311−
312−A personal breach can fix many problems with your ship, but should be used as a last resort. A network breach happens when there's a major software update and you must download a new binary.
313−
314−For details on breaching, please read the [Guide to Breaches](@/docs/tutorials/guide-to-breaches.md) documentation.
315−
316−## Running a star or galaxy {#supernode}
317−
318−Setting up and running a star or galaxy is a little bit different from setting up and running a planet.
319−
320−### Getting a star or galaxy
321−
322−Stars are valuable cryptographic assets. They can be bought in one of two ways.
323−
324−- Transacting privately with a star owner.
325−- Buying a star on a marketplace like [OpenSea](https://opensea.io/collection/urbit-id)
326−
327−Galaxies are rare and extremely valuable, meaning that there is no liquid market for them. If you want to buy a galaxy, you'll have to find an individual galaxy owner and transact with them.
328−
329−### A note on security
330−
331−As mentioned before, stars are valuable. You are solely responsible for safeguarding your seeds and secret keys, and arming yourself with the computer-security knowledge that is attendant upon that safeguarding. You act at your own risk in reliance upon the contents of the manual. In no way is the Tlon Corporation responsible for the actions, decisions, or other behavior taken or not taken by you in reliance upon this manual.
332−
333−It’s a good idea to store your keys redundantly in case one method fails. If you deem a key to be valuable enough, you can shard it into thirds and store each third in secure, geographically distributed locations. Consider these storage media options:
334−
335−- Storing the secret on a hardware wallet that is never connected to a networked machine.
336−- There are products that let you store the key on steel. This medium is resistant to both water damage and fire damage.
337−
338−### Getting a star's keyfile
339−
340−1. Connect to [Bridge](https://bridge.urbit.org).
341−2. Enter the name of your star and the associated master ticket in the appropriate fields. Click the "Metamask, Mnemonic, Hardware Wallet..." button for alternate login methods if you don't have a master ticket.
342−3. Once you're logged in, click the "OS" option.
343−4. In resulting page, click the "Download Arvo Keyfile" button. You should receive a `.key` file that contains the secret needed to boot your ship. Hold onto this file.
344−
345−### Boot your star
346−
347−Because of their need for near-perfect uptime Stars should be hosted on cloud services. We have a guide for [hosting on DigitalOcean](@/using/operations/hosting.md), but any cloud provider should work.
348−
349−Being an infrastructure node, a star has certain responsibilities to the Urbit network.
350−
351−By default, your star accepts software updates from its galaxy and routes them to its planets. You can use this mechanism to push custom software to your planets. Keep in mind that planets expect functional, non-breaking software updates, and generally want to be able to communicate with planets that are sponsored by other stars.
352−
353−To ensure new planets can connect to your ship, users are expected to participate in network-wide breaches by updating to the latest Urbit version, deleting (or archiving) your pier, and then booting your ship using the new binary. If you don’t participate, you won’t be able to communicate with anyone on the network who has updated to the new era.
354−
355−Network-wide breaches are distinct from personal breaches, wherein an individual ship cycles its personal network keys using bridge.
356−
357−See our [Guide to Breaches](@/docs/tutorials/guide-to-breaches.md) for more information and for instructions on breaching.
358−
359−### Running a galaxy
360−
361−A galaxy is at the top of the hierarchy in terms of importance. Thus, if you're interested in running one, please contact support@urbit.org, and we will give you personalized assistance in getting set up.
content/using/operations/_index.mddeleted−7
@@ -1,7 +0,0 @@
1−+++
2−title = "Operations"
3−description = "Instructions on how to use Bridge, your Urbit ship, Stars and Galaxies, and more."
4−sort_by = "weight"
5−weight = 2
6−template = "list.html"
7−+++
content/using/operations/using-your-ship.mddeleted−1413
@@ -1,1413 +0,0 @@
1−+++
2−title = "Using Your Ship"
3−description = "How to operate your ship, including using your ship's filesystem and messaging applications, starting a moon, or requesting a DNS proxy."
4−template = "page_indiced.html"
5−weight = 2
6−aliases = ["docs/using/arvo-network-dns/", "docs/using/messaging/", "docs/using/shell/", "docs/using/admin/"]
7−[extra]
8−hidetitle = "true"
9−+++
10−
11−## Using your ship
12−
13−Your urbit (also called your _ship_) is a persistent Unix process that you mainly control from the console.
14−
15−### Shutdown
16−
17−You can turn your urbit off with `Ctrl-d` from the Chat or Dojo prompts.
18−
19−You can force-quit your urbit with `Ctrl-z` from anywhere.
20−
21−### Restart
22−
23−To restart your urbit simply pass the name of your pier:
24−
25−```sh
26−$ ./urbit some-planet
27−```
28−
29−or
30−
31−```sh
32−$ ./urbit comet
33−```
34−
35−### Logging
36−
37−To log an urbit's command line output to a file, use `script`:
38−
39−```sh
40−$ script urbit.log ./urbit your-urbit
41−```
42−
43−### Moving your pier
44−
45−Piers are designed to be portable, but it _must_ be done while the urbit
46−is not running. Urbit networking is stateful, so you can't run two copies
47−of the same urbit in two places.
48−
49−To move a pier, simply move the contents of the directory it lives in.
50−To keep these files as small as possible we usually use the `--sparse`
51−option in `tar`. With a pier `your-urbit/`, something like this should work:
52−
53−```sh
54−tar -Scvzf ~/your-urbit.tar.gz ~/your-urbit/
55−scp your-old-server:~/your-urbit.tar.gz your-new-server:~
56−```
57−
58−Then to unzip it, on your other Unix server, run:
59−
60−```sh
61−tar xfvz your-urbit.tar.gz
62−```
63−
64−Delete the tar file, and, after installing Urbit on your new server, start your urbit back up with:
65−
66−```sh
67−./urbit your-urbit
68−```
69−
70−### Console
71−
72−Your Urbit terminal is separated into two parts: the prompt (the bottom line) and the record (everything above that). The record is shared; all the output from all the apps in your command set appears in it. The prompt is multiplexed.
73−
74−In the CLI, Urbit apps can process your input before you hit return. To see this in action try entering `)` as the first character at the Dojo prompt. Since there is no Dojo command or Hoon expression that starts with ')', the Dojo rejects it.
75−
76−`Ctrl-x` - Switches the prompt between running console apps
77−
78−`Ctrl-c` - Crash current event. Processed at the Unix layer and prints a stack
79−trace.
80−
81−`Ctrl-d` - From Chat or Dojo, stops your Urbit process.
82−
83−`Ctrl-z` - Stops the Urbit process from _anywhere_.
84−
85−`↑` / `↓` - History navigation
86−
87−The following emacs-style key bindings are available:
88−
89−```
90−Ctrl-a Cursor to beginning of the line (Home)
91−Ctrl-b Cursor one character backward (left-arrow)
92−Ctrl-e Cursor to the end of the line (End)
93−Ctrl-f Cursor one character forward (right-arrow)
94−Ctrl-g Beep; cancel reverse-search
95−Ctrl-k Kill to end of line
96−Ctrl-l Clear the screen
97−Ctrl-n Next line in history (down-arrow)
98−Ctrl-p Previous line in history (up-arrow)
99−Ctrl-r Reverse-search
100−Ctrl-t Transpose characters
101−Ctrl-u Kill to beginning of line
102−Ctrl-y Yank from kill buffer
103−```
104−
105−### Landscape
106−
107−On startup Urbit tries to bind to `localhost:80`. If you're already running something on port `80` -- such as any other HTTP server, or another urbit -- you'll find the urbit that you just started on `8080`, `8081`, and so on. For planets only, we also proxy web domains through Urbit's own servers. Any planet `~your-urbit` is also at `your-urbit.arvo.network`, but only after you [set up DNS](#dns-proxying).
108−
109−Once running, you can sign into Landscape, your ship’s web interface, from `http://localhost` or `https://your-urbit.arvo.network`. Since our HTTPS isn't audited / battle tested, we just call it "secure" HTTPS. You can find that on `8443`. Or `8444` (and so on) if you're already running something on `8443`.
110−
111−### Moons {#moons}
112−
113−Planets can spawn moons, which are meant for connected devices: phones, smart TVs, digital thermostats. The basic idea is that your planet runs permanently in a data center somewhere, while moons run on all your devices. Each planet can issue ~4 billion (`2^32`) moons.
114−
115−To generate a random moon from your planet, run:
116−
117−```
118−~sampel-palnet:dojo> |moon
119−moon: ~faswep-navred-sampel-palnet
120−\/0w5cT5t.wCO6i.~e1xg.Oz0qb.QNO6I.3Kt2T.h9M9F.U3vU~.X3Qu0.gtb19.IYTkY.80kWZ.SI\/
121− EUE.DXa8i.TiDof.o3-1C.RHLKS.k81M0.ecz5o.ic0Bg.600g1
122−\/ \/
123−```
124−
125−You must manually edit the output of `|moon` to get the correct format for the `<key>`:
126−
127−- strip out the `\/`
128−
129−- combine into one line, omitting spaces
130−
131−`<key>` would be `0w5cT5t.wCO6i.~e1xg.Oz0qb.QNO6I.3Kt2T.h9M9F.U3vU~.X3Qu0.gtb19.IYTkY.80kWZ.SIEUE.DXa8i.TiDof.o3-1C.RHLKS.k81M0.ecz5o.ic0Bg.600g1`
132−in this example.
133−
134−Put `<key>` in a file and that file becomes `<keyfile>`.
135−
136−You can use the resulting output in the same installation flow from the [Installing Urbit](@/using/install.md) guide, following the same scheme as for booting a planet. That scheme is:
137−
138−```sh
139−$ ./urbit -w <moonname> -G <key> -c <piername>
140−```
141−
142−or
143−
144−```sh
145−$ ./urbit -w <moonname> -k <keyfile> -c <piername>
146−```
147−
148−The `-c <piername>` argument is not required, but it is recommended; otherwise,
149−the resulting directory is a rather unwieldy moon name.
150−
151−Here's how an example moon might be booted:
152−
153−```sh
154−$ ./urbit -w faswep-navred-sampel-palnet -G <key> -c mymoon
155−```
156−
157−or
158−
159−```sh
160−$ ./urbit -w faswep-navred-sampel-palnet -k <keyfile> -c mymoon
161−```
162−
163−Moons are automatically synced to their parent `%kids` desk, and can control applications on their parent planet using `|link`.
164−
165−To breach a moon -- that is, to reset its presence on the network so that it's treated as a freshly spawned ship by others -- run from the parent ship:
166−
167−```
168−|moon-breach ~faswep-navred-sampel-palnet
169−```
170−
171−To cycle the keys of a moon without breaching, run:
172−
173−```
174−|moon-cycle-keys ~sampel-sipnym-wicdev-wisryt
175−```
176−
177−
178−### Escaping A Sponsor {#escape}
179−
180−To use the network as a planet or star, you must be sponsored by an active star or galaxy, respectively. If your sponsor isn't suiting your needs, you can escape to a different one. The [Bridge](https://bridge.urbit.org/) software doesn't yet support escaping. For the time being, however, you can follow this guide.
181−
182−#### Prerequisites
183−
184−- A little bit of ETH in your management proxy address to pay for the transaction.
185−- The identity number of the sponsor you want to escape from.
186−- The identity number of the sponsor you want to escape to.
187−
188−You can find an identity's number by running ``` `@`~marzod ``` in any Dojo, where `~marzod` is the name of the relevant identity.
189−
190−#### Instructions
191−
192−0. If you have your management proxy in Metamask, you can use Etherscan [here](https://etherscan.io/address/ecliptic.eth#writeContract). Skip steps 1-4.
193−1. Go to either myetherwallet.com or mycrypto.com. Since this is a low-risk operation, and you're signing with a low-value key, it's fine to use their online versions. Sign in with your management mnemonic. (They may still force you to download their tool to log in like this.)
194−2. Navigate to the "interact with contract" page of the tool you're using.
195−3. Specify a contract address of `0x6ac07B7C4601B5CE11de8Dfe6335B871C7C4dd4d`.
196−4. Copy the "contract ABI" from [here](https://etherscan.io/address/ecliptic.eth#code) and paste it into the "ABI/JSON interface" field.
197−5. Select the `escape()` function, passing in two arguments: your identity number, and the number of your desired sponsor.
198−6. Sign and submit the transaction.
199−7. Get in touch with your prospective sponsor, since they won't be notified otherwise. You can do this by contacting them on the network via chat, or joining `~bitbet-bolbel/urbit-community` and asking around.
200−8. Wait for your request to be accepted by the prospective sponsor.
201−9. If your request is not accepted by your prospective sponsor, a last resort, you can make a request to escape to `~marzod`, which is operated by Tlon, the company leading the development of Urbit.
202−
203−### Continuity breaches
204−
205−While the Urbit network is in this alpha state, we sometimes have to reboot the whole network. This happens either when major changes need to be shipped or we hit a bug that can't be fixed over the air.
206−
207−Because Urbit networking is stateful we call this a _continuity breach_. Everything has to be restarted from scratch. Your pier will continue to function after we have breached, but it won’t connect to the rest of the Urbit network.
208−
209−When this happens, back up any files you'd like to save, shut down your urbit, and recreate it (as if you were starting for the first time).
210−
211−### Life and rift number
212−
213−You can check your ship's _life_ and _rift_ number by running `+keys our` in
214−dojo. You can inspect another ship's life and rift number by running `+keys
215−~sampel-palnet`. For information on what life and rift are, see [Guide to Breaches](@/docs/tutorials/guide-to-breaches.md).
216−
217−## DNS proxying {#dns-proxying}
218−
219−We have a system that lets you request a domain name for your ship in the form of `ship.arvo.network`, where `ship` is your ship's name minus the `~`. This allows users to access their ships remotely using Landscape, our graphical web interface.
220−
221−Stars and planets follow the same process DNS proxying process, and galaxies have their own requirements. Moons and comets are not supported.
222−
223−### Planets and Stars
224−
225−For a planet or star's DNS proxying request to be made and fulfilled, they must be hosting their ship someplace with a public IP address, and its HTTP server must be listening on port 80.
226−
227−To get `ship.arvo.network` on a planet or star, you must set up DNS routing with its parent ship by starting the `:dns` app.
228−
229−To do so, simply run this command in your ship's Dojo, passing the IP address as an argument, using the .0.0.0.0 (`@if`) syntax. For example:
230−
231−```
232−> -dns-address &dns-address [%if .1.2.3.4]
233−```
234−
235−`:dns`, running locally, will make an HTTP request to that IP address on port 80 to confirm that it is itself available at that IP and port. If that fails, you'll receive a `%bail-early` message in `:chat-cli`; this request will retry a few times. If the self-check is successful, the request is relayed to `~zod`, and you'll receive a message saying, `request for DNS sent to ~zod`. Once `~zod` has acknowledged receipt of the request, your local `:dns` app will send a `:chat-cli` message saying `awaiting response from ~zod`.
236−
237−The request will be picked up shortly, and the `ship.arvo.network` DNS record will be set to the given IP address. Once that's set up, `~zod` will be notified and `~zod` will, in turn, notify your ship. That ship will now try to verify that it can reach itself on `ship.arvo.network` over port 80. If it can't, it'll send a message saying, `unable to access via ship.arvo.network`. If it can, it will configure itself with that domain and say `confirmed access via ship.arvo.network`.
238−
239−Great! You're set up now. Try accessing your `ship.arvo.network` in your browser to use Landscape; we recommend Chrome or Brave.
240−
241−### Galaxies
242−
243−Galaxies are already required to have separate DNS entry at galaxy.urbit.org. There's no automated process for getting that binding, so if you're a galaxy-holder, get in touch with us at support@urbit.org.
244−
245−There is a command for galaxies that will try to re-use their already-necessary Ames DNS entry for HTTPS:
246−
247−```
248−> -dns-auto
249−```
250−
251−This will make HTTP-requests to self-check availability over `galaxy.$AMES-DOMAIN` (currently galaxy.urbit.org), where `galaxy` is the galaxy's name minus the `~`.
252−
253−Otherwise, `-dns-auto` works the same as `:dns|ip` does with stars and planets: if it's available or unavailable, Chat messages, and so on.
254−
255−### More information
256−
257−Configuring a ship's domain causes the `:acme` app to request an HTTPS certificate for that domain from LetsEncrypt. Note that LetsEncrypt also requires that the HTTP server be listening on port 80. If the certificate request fails, `:acme` will send a `:chat-cli` message with an explanation. Once the certificate is successfully retrieved, `:acme` will install it, causing the HTTP servers to restart. A secure server will be started on port 443 (the HTTPS default) if it's available. Otherwise, it will try 8443, and then increment to the next port until it can successfully bind one.
258−
259−The built-in logic for listening on port 80 is similar. Urbit tries to bind port 80; if it cannot, it tries 8080, then increments until it can bind a port. Port 80 is available to unprivileged process on recent version of macOS. Otherwise, the process needs to either be run as root, or be given special permission (CAP\_NET_BIND on Linux).
260−
261−## Messaging {#messaging}
262−
263−Let’s get started using the `:chat-cli` application, also known more simply as _Chat_. It's the simplest way to talk to people using the command line interface.
264−
265−### Quickstart
266−
267−The most common use for `:chat-cli` right now is, of course, communicating in group chats.
268−
269−### Joining a chat
270−
271−In `:chat-cli`, any kind of medium for a message is called a _chat_. There are four "types" of chats, but for now we'll be dealing with the _channel_, a publicly accessible chatroom for general use. We'll discuss the other three kinds in the [chat management](#chat-management) section later on.
272−
273−Join the Urbit Community from Dojo using `:group-store|join ~bitbet-bolbel/urbit-community`. Once you've joined, join the General chat from chat-cli. Use `ctrl-x` to switch from the Dojo prompt to the Chat prompt.
274−
275−Then:
276−
277−```
278−~sampel-palnet:chat-cli/ ;join ~darrux-landes/general
279−```
280−
281−Now that you're in, try post a line to `~darrux-landes/general`:
282−
283−```
284−~sampel-palnet:chat-cli= Hello, world!
285−```
286−
287−You'll see your message printed below messages from others that came before it. You can always type `;chats` in the `chat-cli` prompt to list all the chats you're in:
288−
289−```
290−~sampel-palnet:chat-cli= ;chats
291−~darrux-landes/general
292−```
293−
294−Glyphs will be automatically assigned to channels, but have the option of binding a glyph (single non-alphanumeric character) to the channel you're joining; the syntax is in the form of `;join ~/~dopzod/books +`. The chosen glyph will be the symbol that ends your prompt, and it will be what you use as a shortcut to switch to this channel.
295−
296−```
297−~sampel-palnet:chat-cli= ;+
298−~sampel-palnet:chat-cli+
299−```
300−
301−Use `;leave` to unsubscribe from a channel:
302−
303−```
304−~sampel-palnet:chat-cli= ;leave ~darrux-landes/general
305−```
306−
307−Now, let's create a channel we can invite some friends to:
308−
309−```
310−~sampel-palnet:chat-cli= ;create channel /my-channel
311−```
312−
313−Now you can tell your friends to `;join ~your-urbit/my-channel`.
314−
315−In order to see messages in `:chat-cli` you may need to do the following in Dojo:
316−
317−```
318−:chat-cli %connect
319−```
320−
321−### Hoon
322−
323−You can use Chat to evaluate Hoon code and share the results with everyone in a chat. To do so, preface your Hoon with `#`.
324−
325−```
326−~sampel-palnet:chat-cli= #(add 2 2)
327−```
328−
329−This will print as:
330−
331−```
332−~sampel-palnet# (add 2 2)
333− 4
334−```
335−
336−### URLs
337−
338−To share a URL, send it as its own message, with no content before or after it.
339−
340−```
341−~sampel-palnet:chat-cli= https://urbit.org/
342−```
343−
344−This will print as:
345−
346−```
347−~sampel-palnet/ https://urbit.org/
348−```
349−
350−### Expanding messages
351−
352−In the case of URLs, they may be too long to display on a single message line. For Hoon code, the code or result could be big. In `:chat-cli`, these get shortened when initially printed out. To view the entire contents, you can select the message in various ways.
353−
354−```
355−~sampel-palnet+ some message
356−----------[240]
357−~sampel-palnet+ let's try selecting this message!
358−~sampel-palnet+ another message
359−~sampel-palnet:chat-cli=
360−```
361−
362−In the above example, we can select the middle message by issuing any of the following command:
363−
364−```
365−;240
366−;40
367−;;
368−```
369−
370−`;n` looks for the last message whose sequence number ends in `n`. `;;` simply picks the second-to-last message.
371−
372−Detailed message output will look something like this:
373−
374−```
375−? 240
376− 0v5.g7r7l.n0d7m.mp4bn.gp6vr.sm5lj at ~2019.10.17..22.08.27..8a03
377− ~sampel-palnet
378− to ~dopzod/urbit-help
379−let's try selecting this message!
380−```
381−
382−### Creating and managing chats {#chat-management}
383−
384−As mentioned before, any urbit can host any number of chats. Existing chats can be deleted or modified with various commands. All commands in this section should be sent from the `chat-cli>` prompt.
385−
386−#### Create
387−
388−Syntax: `;create [type] /name +`, where `+` represents an optional glyph.
389−
390−Creates and joins a chat, where `[type]` is any of the following:
391−- `channel`: public chat. Has a blacklist for write control.
392−- `village`: invite-only chat.
393−- `journal`: publicly readable, invite-only for writing.
394−- `mailbox`: publicly writeable, invite-only for reading.
395−
396−Let's create an example mailbox:
397−
398−```
399−~sampel-palnet:chat-cli> ;create mailbox /coolbox ^
400−```
401−
402−#### Delete
403−
404−Syntax: `;delete /name`
405−
406−Deletes a chat.
407−
408−#### Permission management
409−
410−You can permit and ban people from reading and/or writing to the chats you host, using `;invite` and `;banish` command respectively.
411−
412−Syntax: `;invite [rw] /name ~ships`
413−
414−Where `rw` is either `r`, `w`, or `rw`, representing "read" and "write" permissions.
415−And where `~ships` is a comma-seperated list of ships to invite.
416−
417−For example, to grant two people full access to a `village` we created:
418−
419−```
420−~sampel-palnet:chat-cli> ;invite rw /hidden-village ~ravmel-ropdyl, ~rapfyr-diglyt
421−```
422−
423−Similarly, if we later want to revoke the writing permissions for one of them, but still allow them to read new messages, we can run:
424−
425−```
426−~sampel-palnet:chat-cli> ;banish w /hidden-village ~rapfyr-diglyt
427−```
428−
429−#### Chat glyphs
430−
431−Glyphs are found at the end of your prompt, as a quick indicator of where
432−your messages will be sent.
433−
434−Glyphs are assigned by chat hash out of the following list:
435−
436−```
437−! @ # $ % ^ & ( ) - = _ + [ ] { } ; ' \ : " , . < > ?
438−```
439−
440−Alphanumeric characters and `|#/*~` are reserved; all others can be manually assigned.
441−
442−For example, `-` the glyph at the end of the prompt below might indicates that
443−messages sent from this prompt will go to some chat with that glyph:
444−
445−```
446−~sampel-palnet:chat-cli-
447−```
448−
449−To see what chat is bound to a glyph, use the `;what` command followed by the
450−glyph in question, or use `;what` without specifying a glyph to see all of your
451−subscriptions which are bound to glyphs. For example, to see `=`:
452−
453−```
454−~sampel-palnet:chat-cli> ;what =
455−~dopzod/urbit-help
456−```
457−
458−To see all of your glyph bindings:
459−
460−```
461−~sampel-palnet:chat-cli> ;what
462−> ~paldev/numismatic-forum
463−. ~middev/ny-martians
464−= ~dopzod/urbit-help
465−```
466−
467−When the messaging target doesn't have a glyph, we see their name at the end of
468−the prompt instead. Here we're talking into `~dannum-mitryl/homework`:
469−
470−```
471−~sampel-palnet:chat-cli[~dannum-mitryl/homework]
472−```
473−
474−#### Bind
475−
476−Syntax: `;bind [glyph] ~host/chat-name`
477−
478−Assigns the chosen glyph to a chat.
479−
480−For example:
481−
482−```
483−~sampel-palnet:chat-cli> ;bind + ~dopzod/urbit-help
484−```
485−
486−#### Unbind
487−
488−Syntax: `;unbind [glyph] ~host/chat-name`
489−
490−Unassigns the chosen glyph from a chat owned by your ship.
491−
492−For example:
493−
494−```
495−~sampel-palnet:chat-cli> ;unbind + ~dopzod/urbit-help
496−```
497−
498−If you don't specify a chat, all bindings for that glyph are removed.
499−
500−#### Prefixes
501−
502−Received posts are prefixed with a glyph to let you know what the
503−audience is. You can activate an individual post to see the full
504−audience.
505−
506−There are a few special-purpose "glyphs":
507−
508−- `|` - Informational messages
509−- `*` - Posts to a target you don't have a glyph binding for
510−
511−
512−### Configuration
513−
514−#### Set audience
515−
516−`;~ship/chat`
517−
518−Set audience to `~ship/chat`.
519−
520−#### Set audience by glyph
521−
522−Syntax: `;[glyph]`
523−
524−Set audience to the chat previously bound to the chosen glyph.
525−
526−#### Set audience to own chat
527−
528−Syntax: `;/chat`
529−
530−Set audience to a chat on your own ship.
531−
532−### Miscellaneous configuration
533−
534−#### Change timezone
535−
536−Syntax: `;set timezone [+/-][hours]`
537−
538−Adjust the display of timestamps to a specific timezone. Relative to UTC.
539−
540−#### Set width
541−
542−Syntax: `;set width [number]`
543−
544−Set the rendering width of `:chat-cli` to a specific number of characters.
545−(Minimum of 30.)
546−
547−#### Show timestamps
548−
549−Syntax: `;set showtime`
550−
551−Show the timestamp for each message. This is set by default.
552−
553−#### Hide timestamps
554−
555−Syntax: `;unset showtime`
556−
557−Stop showing the timestamp for each message.
558−
559−#### Sound notification on
560−
561−Syntax: `;set notify`
562−
563−Emit a terminal bell sound if your six-syllable ship name is mentioned in
564−a message. This is set by default.
565−
566−#### Sound notification off
567−
568−Syntax `;unset notify`
569−
570−Do not notify when your ship name is mentioned.
571−
572−
573−## Shell {#using-the-shell}
574−
575−The Dojo is our shell; it processes system commands and returns output. It's a
576−good place to quickly experiment with Urbit. On the surface the Dojo is just a
577−Hoon REPL. On the inside, the Dojo is a system for operating on and transforming
578−data in Urbit.
579−
580−### Quickstart
581−
582−You can use the Dojo to run arbitrary Hoon code, as well as non-Hoon system
583−commands.
584−
585−#### Math
586−
587−Evaluate a Hoon expression (whitespace matters):
588−
589−```
590−~your-urbit:dojo> (add 2 2)
591−~your-urbit:dojo> %+ add 2 2
592−```
593−
594−Tall-form Hoon may require multiple lines:
595−
596−```
597−~your-urbit:dojo> %+ add
598−~your-urbit:dojo< 2
599−~your-urbit:dojo< 2
600−```
601−
602−Hoon uses something called [the subject](@/docs/tutorials/hoon/hoon-school/the-subject-and-its-legs.md).
603−The Dojo has its own subject and that's where Hoon's equivalent of variables,
604−called faces, are stored.
605−
606−Use `=var` to save faces to the Dojo subject.
607−
608−```
609−~your-urbit:dojo> =foo (add 2 2)
610−```
611−
612−Note, however, that `=var` is Dojo syntax, not Hoon syntax. You cannot bind a
613−face in a `.hoon` file in this way.
614−
615−#### System commands
616−
617−Use `=dir` to set the current working directory:
618−
619−```
620−~your-urbit:dojo> =dir %/gen
621−```
622−
623−(`%` represents your current directory. For a complete explanation on urbit
624−paths, see the [filesystem section](#filesystem).)
625−
626−Generators (files in `/gen`) are run with `+`:
627−
628−```
629−~your-urbit:dojo> +hello 'world'
630−```
631−
632−Save output to a file in `%clay` with `*`:
633−
634−```
635−~your-urbit:dojo> *some/file/path/hoon 'hello world'
636−```
637−
638−Run system commands from `:hood`, like `reload`, using `|`:
639−
640−```
641−~your-urbit:dojo> |reload %eyre
642−```
643−
644−### Generators
645−
646−Generators are short Hoon scripts, saved as `.hoon` files in the `/gen`
647−directory. Many Dojo commands exist in the form of generators. The syntax for
648−running a generator is `+genname` for a generator saved as `genname.hoon`.
649−
650−#### `+cat`
651−
652−Accepts a path and displays the file. Similar to Unix `cat`.
653−
654−```
655−~your-urbit:dojo> +cat %/gen/curl/hoon
656−```
657−
658−#### `+code`
659−
660−Generates a code that is used to remotely log into your ship. No
661−arguments.
662−
663−```
664−~your-urbit:dojo> +code
665−```
666−
667−#### `+curl`
668−
669−Retrieves data from a URL. Accepts a `tape`. Similar to Unix `curl`.
670−
671−```
672−~your-urbit:dojo> +curl "http://nyt.com"
673−```
674−
675−#### `+hello`
676−
677−Just prints the argument. Accepts a `@ta`.
678−
679−```
680−~your-urbit:dojo> +hello 'mars'
681−```
682−
683−#### `+ls`
684−
685−Similar to Unix `ls`. Accepts a path.
686−
687−```
688−~your-urbit:dojo> +ls %/gen
689−~your-urbit:dojo> +ls /~talsur-todres/home/2/gen/program
690−```
691−
692−#### `+solid`
693−
694−Compile the current state of the kernel and output a
695−noun. Usually downloaded to a file in unix. No arguments.
696−
697−```
698−~your-urbit:dojo> .urbit/pill +solid
699−```
700−
701−#### `+test`
702−
703−Testrunner. Can test multiple generators at once, conventionally ones
704−in the `/test` folder. Takes a path.
705−
706−```
707−~your-urbit:dojo> +test /lib
708−```
709−
710−#### `+ticket`
711−
712−Generate a ticket for an urbit ship. Takes an urbit name (`@p`).
713−
714−
715−```
716−~your-urbit:dojo> +ticket ~talsur-todres-your-urbit
717−```
718−
719−#### `+tree`
720−
721−Generate a recursive directory listing. Takes a path.
722−
723−```
724−~your-urbit:dojo> +tree %/sys
725−```
726−
727−### Hood
728−
729−The hood is the system daemon. See `gen/hood` and `app/hood`.
730−
731−`|hi` - Sends a direct message. Sort of like Unix `write`. Accepts
732−an urbit name (`@p`) and a string (`tape`, which is text wrapped with double-quotes).
733−
734−```
735−~your-urbit:dojo> |hi ~binzod "you there?"
736−```
737−
738−`|link` / `|unlink` - Link / unlink a remote app. Accepts an
739−Urbit name and an app name.
740−
741−```
742−~your-urbit:dojo> |link ~talsur-todres %octo
743−```
744−
745−`|mass` - Prints the current memory usage of all the kernel modules.
746−No arguments.
747−
748−```
749−~your-urbit:dojo> |mass
750−```
751−
752−`|reload` - Reloads a kernel module (vane) from source. Accepts any
753−number of vane names.
754−
755−```
756−~your-urbit:dojo> |reload %clay %eyre
757−```
758−
759−`|reset` - Reloads `hoon.hoon` and all modules. No arguments.
760−
761−```
762−~your-urbit:dojo> |reset
763−```
764−
765−`|start` - Starts an app. Accepts an app name.
766−
767−```
768−~your-urbit:dojo> |start %curl
769−```
770−
771−---
772−
773−### Dojo manual
774−
775−#### Sources and sinks
776−
777−A Dojo command is either a **source** or a **sink**. A source is just something
778−that can be printed to your console or the result of some computation. A
779−sink is an **effect**: a change to the filesystem, a network message, a
780−change to your environment, or a typed message to an app.
781−
782−Sources can be chained together, but we can only produce one effect per
783−command.
784−
785−#### Sinks
786−
787−#### `=` - Set variable
788−
789−Set any environment variable:
790−
791−```
792−~your-urbit:dojo> =foo 42
793−~your-urbit:dojo> (add 2 foo)
794−
795−44
796−```
797−
798−Make sure to note that `=var` is Dojo syntax, not Hoon syntax. You cannot bind a
799−variable in a `.hoon` file in this way.
800−
801−#### Special variables
802−
803−There are a few special variables that the Dojo maintains.
804−
805−#### `:` - Send to app
806−
807−`:app` goes to a local `app`, `:~ship/app` goes to the `app` on `~ship`.
808−
809−Send a `helm-hi` message to `hood`:
810−
811−```
812−~your-urbit:dojo> :hood &helm-hi 'hi'
813−```
814−
815−Apps usually expect marked data, so `&` is often used here.
816−
817−#### `*` - Save in `%clay`
818−
819−Save a new `.hoon` file in `gen`:
820−
821−```
822−~your-urbit:dojo> *%/gen/foo/hoon '# hello'
823−```
824−
825−The last component of the path is expected to be the mark (or mime
826−type).
827−
828−#### `.` - Export to Unix
829−
830−Export a noun to Unix with `.`:
831−
832−```
833−~your-urbit:dojo> .foo/bar/baz (add 2 2)
834−```
835−
836−Which creates a file at `pier/.urb/put/foo/bar.baz`.
837−
838−This is very often used with `+solid`:
839−
840−```
841−~your-urbit:dojo> .urbit/pill +solid
842−```
843−
844−Which outputs a new `urbit.pill` to `pier/.urb/put/urbit.pill`
845−
846−### Sources
847−
848−#### `_` - Run a function
849−
850−Use `_` to run a gate (or function):
851−
852−Write an arbitrary function and pass data to it:
853−
854−```
855−~your-urbit:dojo> _|=([a=@] (mul a 3)) 3
856−9
857−```
858−
859−Use a function to get the status code from an http request:
860−
861−```
862−~your-urbit:dojo> _|=([p=@ud q=* r=*] p) +http://google.com
863−301
864−```
865−
866−#### `+` `-` - HTTP requests
867−
868−`+http[s]://example.com` - sends a GET request
869−
870−`+http[s]://example.com &json [%s 'hi']` - sends a POST request with the
871−JSON `"hi"` in the body.
872−
873−`-http[s]://example.com &json [%s 'hi']` - sends a PUT request with the
874−JSON `"hi"` in the body.
875−
876−Note that the first of these is a source while the last two are sinks.
877−
878−#### `+` - Generators
879−
880−Generators are simple Hoon scripts loaded from the filesystem. They live
881−in `gen/`.
882−
883−An example of a generator that is built into your urbit is `+code`. It produces
884−the code needed to log into your ship remotely.
885−
886−```
887−~your-urbit:dojo> +code
888−fintyr-haldet-fassev-solhex
889−```
890−
891−### Variables
892−
893−You can use `=` to set an environment variable in Dojo, but there are
894−a few reserved names that have special uses.
895−
896−#### `dir`
897−
898−Current working `%clay` desk and revision. Read / write.
899−
900−**Examples:**
901−
902−```
903−~your-urbit:dojo> =dir %/gen
904−~your-urbit:dojo> +ls %
905−404/hoon docs/ dojo/hoon lib/ listen/hoon md static/udon talk/ testing/udon tree/main/ unmark/ womb/
906−```
907−
908−#### `lib`
909−
910−Current set of libraries (`/lib`) in your environment. Can be set
911−with `/+`. Read / write.
912−
913−**Examples:**
914−
915−```
916−~your-urbit:dojo> /+ number-to-words
917−```
918−Now we can use arms from lib/number-to-words.hoon
919−```
920−~your-urbit:dojo> (to-words:eng-us:number-to-words 123.456)
921−```
922−
923−#### `sur`
924−
925−Current set of structures (`/sur`) in your environment. Can be set
926−with `/-`. Read / write.
927−
928−**Examples:**
929−
930−```
931−~your-urbit:dojo> /- sole
932−```
933−Now we can use arms in sur/sole.hoon.
934−```
935−~your-urbit:dojo> `sole-effect:sole`[%bel ~]
936−```
937−
938−#### `now`
939−
940−The current (128-bit `@da`) time. Read-only.
941−
942−**Example:**
943−
944−```
945−~your-urbit:dojo> now
946−~2016.3.21..21.10.57..429a
947−```
948−
949−#### `our`
950−
951−The current urbit ship. Read-only.
952−
953−**Example:**
954−
955−```
956−~your-urbit:dojo> our
957−~your-urbit
958−```
959−
960−#### `eny`
961−
962−512 bits of entropy. Read-only.
963−
964−**Example:**
965−
966−```
967−~your-urbit:dojo> eny
968−\/0vnt.d474o.gpahj.jcf3o.448fh.2lamb.82ljm.8ol8u.b02vi.mrvvp.b7et2.knb7m.l8he\/
969− 8.8qb9s.drm36.77n9b.a0qst.30g03.l5lb5.nvsbc.v39tn
970−\/
971−```
972−
973−### Troubleshooting
974−
975−If you encounter `%dy-edit-busy` while entering commands, it is
976−because your Dojo is blocked on a timer or an HTTP request. Type backspace
977−and your Dojo will end the blocked command.
978−
979−
980−## Filesystem {#filesystem}
981−
982−Urbit has its own revision-controlled filesystem, Clay. Clay is a typed, global,
983−referentially transparent namespace. An easy way to think about it is like typed
984−`git`.
985−
986−The most common way to use Clay is to mount a Clay node in a Unix directory. The mounted directory is always at the root of your pier directory.
987−
988−### Quickstart
989−
990−This quick-start guide will walk you through some common commands. Follow along
991−using your Dojo. When you get a `>=` message after entering a command, this means
992−that the command was successful.
993−
994−It's important to note that whenever you want to sync changes from your Unix
995−directory to your ship, you must use the `|commit %desk` command, where `%desk`
996−is the desk that you'd like to sync to.
997−
998−When developing it's a good idea to use a separate desk. Create a `%sandbox`
999−desk based on the `%home` desk:
1000−
1001−```
1002−~your-urbit:dojo> |merge %sandbox ~your-urbit %home
1003−```
1004−
1005−Running `our` produces your ship-name, meaning that you can run the following
1006−command instead of typing out the entire thing. Useful for comets due to their
1007−very long names.
1008−
1009−```
1010−~your-urbit:dojo> |merge %sandbox our %home
1011−```
1012−
1013−Most of the time we want to use Clay from Unix. Mount the entire contents of
1014−your `sandbox` desk to Unix:
1015−
1016−```
1017−~your-urbit:dojo> |mount /=sandbox=
1018−```
1019−
1020−To explore the filesystem from inside Urbit `+ls` and `+cat` are useful. `+ls`
1021−displays files in the current directory, and `+cat` displays the contents of
1022−a file.
1023−
1024−We can use `%` to mean "current directory." The result of the command below
1025−is just like using `ls` in a Unix terminal.
1026−
1027−```
1028−~your-urbit:dojo> +ls %
1029−```
1030−
1031−Notice how `+cat %` does the same thing. That's because everything in Clay,
1032−including directories, is a file.
1033−
1034−Sync from your friend `~some-ship`'s `%experiment` desk to your
1035−`%sandbox` desk:
1036−
1037−```
1038−~your-urbit:dojo> |sync %sandbox ~some-ship %experiment
1039−```
1040−
1041−If and when your sync is successful, you will receive a message:
1042−
1043−```
1044−activated sync from %experiment on ~some-ship to %sandbox
1045−```
1046−
1047−The ship that you sync from will get their own message indicating that you're
1048−both connected as peers:
1049−
1050−```
1051−; ~your-urbit is your neighbor.
1052−```
1053−
1054−---
1055−
1056−### Clay manual
1057−
1058−#### Paths
1059−
1060−A path in Clay is a list of URL-safe text, restricted to the characters
1061−`[a z]`,`[0 9]`, `.`, `-`, `_`, and `~`. Formally this is a `(list knot)`,
1062−meaning that each segment, delineated by `/`, is of the `knot` ASCII-text type.
1063−In other words, paths are expressed as `/foo/bar/baz`. File extensions are
1064−separated from file names with `/`, not `.`. Extensions are syntactically
1065−identical to subdirectories, except that they must terminate the path.
1066−
1067−Paths begin with a piece of data called a `beak`. A beak is formally a
1068−`(p=ship q=desk r=case)`; it has three components, and might look like
1069−`/~dozbud-namsep/home/11`.
1070−
1071−The first `beak` component is `ship`, which is, as you might guess, the name of
1072−an Urbit ship. The second component is `desk`, which is a workspace meant to
1073−contain other directories; the default desk is `%home`. The third component is
1074−`case`, which represents version information in various ways: date and time;
1075−a version sequence, which is a value incremented by one whenever a file on the
1076−given `desk` is modified; or an arbitrary plaintext label.
1077−
1078−You can find what your `beak` is at any given moment by
1079−typing `%` in the Dojo and looking at the first three results.
1080−
1081−We use `beak`s because, unlike the current internet, the Urbit network uses a
1082−global namespace. That means that a file named `example.hoon` in the `/gen`
1083−directory on the `%home` desk of your ship `~lodleb-ritrul` would have a
1084−universal address to anyone else on the network:
1085−`/~lodleb-ritrul/home/186/gen/example/hoon`. That, of
1086−course, doesn't mean that everyone on the network has privileges to access that
1087−path.
1088−
1089−The structure that combines a `beak` with further path information is called a
1090−`beam`.
1091−
1092−#### Relative paths
1093−
1094−The `%` command, which we gestured at in the above section, represents the
1095−**relative path**, which is the path where you are currently working. If your
1096−working directory is just your home desk, indicated by the
1097−prompt `~your-planet:dojo>`, then running the command below will print your
1098−working directory's `beam` information: your `beak`, and a `~` that represents
1099−the empty list since no path is present.
1100−
1101−```
1102−~your-urbit:dojo> %
1103−```
1104−
1105−`%`s can be stacked to indicate one level further up in the hierarchy for each
1106−additional `%`. Try the following command:
1107−
1108−```
1109−~your-planet:dojo> %%%
1110−```
1111−
1112−You'll probably notice that it only has your ship name and the empty list. The
1113−two additional `%`s abandoned the `case` and the `desk` information by moving
1114−up twice the hierarchy.
1115−
1116−There are no local relative paths. `/foo/bar` must be written as
1117−`%/foo/bar`.
1118−
1119−#### Substitution
1120−
1121−You don't need to write out the explicit path every time you want to reference
1122−somewhere outside of your working directory. You can substitute `=` for the
1123−segments of a path.
1124−
1125−Recall that a full address in the the Urbit namespace is a `beam`: the
1126−`/ship/desk/case/path`. If you've switched to another desk before, you're
1127−already familiar with substitution syntax:
1128−
1129−```
1130−~your-urbit:dojo> =dir /=sandbox=
1131−```
1132−
1133−The above command uses substitution to use your current `ship` and
1134−`case`; only the `desk` argument, which is located between the other two, is
1135−given something new. Without substitution, you would need to write:
1136−
1137−```
1138−~your-urbit:dojo> =dir /~your-urbit/sandbox/85
1139−```
1140−
1141−Substitutions work the same way in `beak`s (the `ship/desk/case` part) and
1142−paths. For example, if you are in the `/gen` directory, you can reference a file
1143−in the `/app` directory like below. (`+cat` displays the contents of a file).
1144−
1145−```
1146−~your-urbit:dojo> =dir %/gen
1147−~your-urbit:dojo/=/=/~2018.10.2..00.35.44..d7e8/gen> +cat /===/app/curl/hoon
1148−```
1149−
1150−Note what was substituted out, and note that we don't need to separate `=` with
1151−`/`.
1152−
1153−If we changed our working directory to something called `/gen/gmail`, we could
1154−access a file called
1155−
1156−```
1157−~your-urbit:dojo/=/=/~2018.10.2..00.35.44..d7e8/gen> =dir %/gmail
1158−~your-urbit:dojo/=/=/~2018.10.2..00.35.44..d7e8/gen/gmail> +cat /===/app/=/split/hoon
1159−```
1160−
1161−Because both paths share a directory named `/gmail` at the same position in the
1162−address hierarchy – which, if you recall, is just a `list` – the above command
1163−works!
1164−
1165−We can do the same thing between desks. If `%sandbox` has been merged with
1166−`%home`, the following command will produce the same results as the above
1167−command.
1168−
1169−```
1170−~your-urbit:dojo/=/=/~2018.10.2..00.35.44..d7e8/gen/gmail> +cat /=sandbox=/app/=/split/hoon
1171−```
1172−
1173−Most commonly this is used to avoid having to know the current revision
1174−number in the `dojo`: `/~lodleb-ritrul/home/~2018.10.2..00.35.44..d7e8/gen/example/hoon`
1175−
1176−#### Changing directories
1177−
1178−Change the working directory with `=dir`. It's our equivalent of the Unix `cd`.
1179−
1180−For example, the syntax to navigate to `/home/gen/ask` is:
1181−
1182−```
1183−~your-urbit:dojo> =dir /=home=/gen/ask
1184−```
1185−
1186−This command will turn your prompt into something like this:
1187−
1188−```
1189−~your-urbit:dojo/=/=/~2018.10.2..00.35.44..d7e8/gen/ask>
1190−```
1191−
1192−Using `=dir` without anything else uses the null path, which returns you to
1193−your home desk.
1194−
1195−```
1196−~your-urbit:dojo/=/=/~2018.10.2..00.35.44..d7e8/gen/ask> =dir
1197−```
1198−
1199−Your dojo prompt will turn back into `~your-urbit:dojo>`.
1200−
1201−To go up levels in the path hierarchy, recall the relative path expression
1202−`%`. Stacking them represents another level higher in the hierarchy than
1203−the current working directory for each `%` beyond the initial. The command below
1204−brings you one level up:
1205−
1206−```
1207−~your-urbit:dojo> =dir %/gen
1208−~your-urbit:dojo/=/=/~2018.10.2..00.35.44..d7e8/gen> =dir %%
1209−```
1210−
1211−### Revision-control
1212−
1213−#### Mount
1214−
1215−Syntax: `|mount /clay/path [Unix-name]`
1216−
1217−Mount the `clay-path` at the Unix mount point `Unix-name`.
1218−
1219−**Examples:**
1220−
1221−```
1222−|mount %/gen generators
1223−```
1224−
1225−Mounts `%/gen` to `/generators` inside your pier directory.
1226−
1227−#### Unmount
1228−
1229−```
1230−|unmount [clay-path || Unix-name]
1231−```
1232−
1233−Unmount the path or name from Unix.
1234−
1235−**Examples:**
1236−
1237−```
1238−|unmount %/gen
1239−```
1240−
1241−Unmounts the Clay path `%/gen` from whatever name it was mounted as.
1242−
1243−```
1244−|unmount %generators
1245−```
1246−
1247−Unmounts the Unix path `/generators`.
1248−
1249−#### Merge
1250−
1251−```
1252−|merge desk beak[, =gem strategy]
1253−```
1254−
1255−Merges a `beak` into a `desk` using an optional merge `strategy`.
1256−
1257−A `beak` is a ship-desk-case triple, encoded as a
1258−path(`/~dozbud/home/2`)
1259−
1260−**Examples:**
1261−
1262−```
1263−|merge %home-work /=home=, =gem %fine
1264−```
1265−
1266−Merge `/=home=` into `%home-work` using merge strategy `%fine`.
1267−
1268−```
1269−|merge %examples ~wacbex-ribmex %examples
1270−```
1271−
1272−Merge the `%examples` desk from `~waxbex-ribmex`
1273−
1274−#### Sync
1275−
1276−```
1277−|sync desk plot [plot-desk]
1278−```
1279−
1280−Subscribe to continuous updates from remote `plot` on local `desk`.
1281−`plot-desk` can specify the remote `desk` name. When omitted it defaults
1282−to being the same as `desk`. Non-comet urbits have
1283−`|sync %home ~parent %kids` automatically set up (where `~parent` is the
1284−planet that issued a moon, the star that issued a planet, or the galaxy
1285−that issued a star).
1286−
1287−**Examples:**
1288−
1289−```
1290−|sync %home-local ~dozbud %home
1291−
1292−|sync %home ~doznec
1293−```
1294−
1295−#### Unsync
1296−
1297−```
1298−|unsync desk plot [plot-desk]
1299−```
1300−
1301−Unsubscribe from updates from remote `plot` on local `desk` with
1302−optional `plot-desk`. Arguments must match original `|sync` command.
1303−
1304−Example:
1305−
1306−```
1307−|unsync %home-local ~dozbud %home
1308−```
1309−
1310−#### Label
1311−
1312−```
1313−|label desk name
1314−```
1315−
1316−Label the current version of `desk` `name`.
1317−
1318−Example:
1319−
1320−```
1321−|label %home release
1322−```
1323−
1324−### Merge strategies
1325−
1326−`%init` - used if it's the first commit to a desk. Also can be used to
1327−"reinitialize" a desk – revision numbers keep going up, but the new
1328−revision isn't necessarily a descendent of the previously numbered
1329−version, allowing merges to be rerun.
1330−
1331−`%this` - keep what's in Bob's desk, but join the ancestry.
1332−
1333−`%that` - take what's in Alice's desk, but join the ancestry. This is
1334−the reverse of `%this`. This is different from `%init` because the new
1335−commit has both sides in its ancestry.
1336−
1337−`%fine` - "fast-forward" merge. This succeeds if and only if one head is in the
1338−ancestry of the other.
1339−
1340−`%meet`, `%mate`, and `%meld` - find the most recent common ancestor to
1341−use as our merge base.
1342−
1343−A `%meet` merge only succeeds if the changes from the merge base to
1344−Alice's head (hereafter, "Alice's changes") are in different files than
1345−Bob's changes. In this case, the parents are both Alice's and Bob's
1346−heads, and the data is the merge base plus Alice's changed files plus
1347−Bob's changed files.
1348−
1349−A `%mate` merge attempts to merge changes to the same file when both
1350−Alice and Bob change it. If the merge is clean, we use it; otherwise, we
1351−fail. A merge between different types of changes – for example,
1352−deleting a file vs changing it – is always a conflict. If we succeed,
1353−the parents are both Alice's and Bob's heads, and the data is the merge
1354−base plus Alice's changed files plus Bob's changed files plus the merged
1355−files.
1356−
1357−A `%meld` merge will succeed even if there are conflicts. If there are
1358−conflicts in a file, then we use the merge base's version of that file,
1359−and we produce a set of files with conflicts. The parents are both
1360−Alice's and Bob's heads, and the data is the merge base plus Alice's
1361−changed files plus Bob's changed files plus the successfully merged
1362−files plus the merge base's version of the conflicting files.
1363−
1364−`%auto` - meta-strategy. Check to see if Bob's desk exists, and if it
1365−doesn't we use an `%init` merge. Otherwise, we progressively try
1366−`%fine`, `%meet`, and `%mate` until one succeeds. If none succeed, we
1367−merge Bob's desk into a scratch desk. Then, we merge Alice's desk into
1368−the scratch desk with the `%meld` option to force the merge. Finally, we
1369−annotate any conflicts, if we know how.
1370−
1371−### Manipulation
1372−
1373−#### `+cat`
1374−
1375−Syntax: `+cat path [path ...]`
1376−
1377−Similar to Unix `cat`. `+cat` takes one or more `path`s, and prints their
1378−contents. If that `path` is a file, the contents of the file is printed. If the
1379−`path` terminates in a directory, the list of names at that path is produced.
1380−
1381−#### `+ls`
1382−
1383−Syntax: `+ls path`
1384−
1385−Similar to Unix `ls`. `+ls` takes a single `path`.
1386−
1387−Produces a list of names at the `path`.
1388−
1389−```
1390−~your-urbit:dojo> +cat %/our/home/gen/curl/hoon
1391−```
1392−
1393−#### `|rm`
1394−
1395−Syntax: `|rm path`
1396−
1397−Remove the data at `path`. `Path` must be a path to the actual node, not a
1398−'directory'.
1399−
1400−#### `|cp`
1401−
1402−Syntax: `|cp to from`
1403−
1404−Copy the file at `from` into the path `to`.
1405−
1406−#### `|mv`
1407−
1408−Syntax: `|mv to from`
1409−
1410−Move the file at `from` into the path `to`.
1411−
1412−In Clay, `|mv` is just a shorthand for `|cp` then `|rm`. The `|rm`
1413−doesn't happen unless the `|cp` succeeds.
content/using/os/_index.mdnew file+36
@@ -0,0 +1,36 @@
1++++
2+title = "Urbit OS"
3+sort_by = "weight"
4+description = "How to use Urbit OS"
5+template = "sections/docs/chapters.html"
6+weight = 10
7++++
8+
9+This section describes how to interact with your running Urbit ship: this
10+includes working with the filesystem, command line (`dojo`), resolving common
11+issues, and more.
12+
13+### [Getting Started](@/using/os/getting-started.md)
14+
15+An overview of common commands and useful general knowledge for operating your
16+ship.
17+
18+### [Messaging](@/using/os/messaging.md)
19+
20+Using chat from its command-line interface.
21+
22+### [Configuring S3 Storage](@/using/os/s3.md)
23+
24+How to set up S3 storage so you can share files in Landscape.
25+
26+### [Shell](@/using/os/shell.md)
27+
28+A comprehensive overview of `dojo` commands.
29+
30+### [Star and Galaxy Operations](@/using/os/stars-and-galaxies.md)
31+
32+How to run an infrastructure node.
33+
34+### [Ship Troubleshooting](@/using/os/ship-troubleshooting.md)
35+
36+How to resolve common problems.
content/using/os/filesystem.mdnew file+397
@@ -0,0 +1,397 @@
1++++
2+title = "Filesystem"
3+template = "doc.html"
4+weight = 3
5++++
6+
7+Urbit has its own revision-controlled filesystem, Clay. Clay is a typed, global,
8+referentially transparent namespace. An easy way to think about it is like typed
9+`git`.
10+
11+The most common way to use Clay is to mount a Clay node in a Unix directory. The mounted directory is always at the root of your pier directory.
12+
13+For more information on Clay, see the [Overview](@/docs/arvo/clay/clay.md), and
14+additional usage information at [Using Clay](@/docs/arvo/clay/using.md).
15+
16+### Quickstart
17+
18+This quick-start guide will walk you through some common commands. Follow along
19+using your Dojo. When you get a `>=` message after entering a command, this means
20+that the command was successful.
21+
22+A [`desk`](@/docs/glossary/desk.md) is something like an independently
23+revision-controlled branch of your urbit's file-system. Your urbit's system
24+files live in the `%home` `desk`.
25+
26+It's important to note that whenever you want to sync changes from your Unix
27+directory to your ship, you must use the `|commit %desk` command, where `%desk`
28+is the `desk` that you'd like to sync to.
29+
30+When developing it's a good idea to use a separate `desk`. Create a `%sandbox`
31+`desk` based on the `%home` `desk`:
32+
33+```
34+~zod:dojo> |merge %sandbox ~zod %home
35+```
36+
37+Running `our` produces your ship-name, meaning that you can run the following
38+command instead of typing out the entire thing. This is especially useful for
39+comets due to their very long names.
40+
41+```
42+~zod:dojo> |merge %sandbox our %home
43+```
44+
45+Most of the time we want to use Clay from Unix. Mount the entire contents of
46+your `sandbox` desk to Unix:
47+
48+```
49+~zod:dojo> |mount /=sandbox=
50+```
51+
52+To explore the filesystem from inside Urbit `+ls` and `+cat` are useful. `+ls`
53+displays files in the current directory, and `+cat` displays the contents of
54+a file.
55+
56+We use `%` to mean "current directory." The result of the command below
57+is just like using `ls` in a Unix terminal.
58+
59+```
60+~zod:dojo> +ls %
61+```
62+
63+Notice how `+cat %` does the same thing. That's because everything in Clay,
64+including directories, is a file.
65+
66+Sync from your friend `~bus`'s `%experiment` desk to your `%sandbox` desk:
67+
68+```
69+~zod:dojo> |sync %sandbox ~bus %experiment
70+```
71+
72+If and when your sync is successful, you will receive a message:
73+
74+```
75+kiln: sync succeeded from %experiment on ~bus to %sandbox
76+```
77+
78+The ship that you sync from will get their own message indicating that you're
79+both connected as peers:
80+
81+```
82+; ~zod is your neighbor.
83+```
84+
85+---
86+
87+### Clay manual
88+
89+The following constitutes an explanation of handy commands that most Urbit
90+pilots will want to know at some point. Reading this section will get you to the
91+point that you can navigate the file system, sync with Unix, merge your desk,
92+and other basic tasks familiar to novice users of the Unix terminal.
93+
94+#### Paths
95+
96+A path in Clay is a list of URL-safe text, restricted to the characters `[a
97+z]`,`[0 9]`, `.`, `-`, `_`, and `~`. This path is a list of strings each
98+prepended by `/`. In other words, paths are expressed as `/foo/bar/baz`. File
99+extensions are separated from file names with `/`, not `.`. Extensions are
100+syntactically identical to subdirectories, except that they must terminate the
101+path.
102+
103+Paths begin with three strings indicating the ship, desk, and revision, and
104+might look like `/~dozbud-namsep/home/11`.
105+
106+The first component is `ship`, which is, as you might guess, the name of
107+an Urbit ship. The second component is `desk`, which is a workspace meant to
108+contain other directories; the default `desk` is `%home`. The third component is
109+the revision, which represents version information in various ways: date and time;
110+a version sequence, which is a value incremented by one whenever a file on the
111+given `desk` is modified; or an arbitrary plaintext label.
112+
113+You can find what your current ship, desk, and revision is at any given moment by
114+typing `%` in the Dojo and looking at the first three results. This will display
115+as a cell rather than a path, like
116+```
117+[~.~zod ~.home ~.~2021.3.19..16.11.20..0c60]
118+```
119+Here we see that the revision consists of the date, time, and a short hash.
120+
121+We use this format because, unlike the current internet, the Urbit network uses a
122+global namespace. That means that a file named `example.hoon` in the `/gen`
123+directory on the `%home` desk of your ship `~lodleb-ritrul` would have a
124+universal address to anyone else on the network:
125+`/~lodleb-ritrul/home/186/gen/example/hoon`. That, of
126+course, doesn't mean that everyone on the network has privileges to access that
127+path. But given the revision-controlled and immutable nature of Urbit, this
128+means that if the file requested is available, it will always be the same. This
129+means that if an Urbit is serving a webpage, that exact version will always be
130+retrievable (assuming you have access to it).
131+
132+
133+#### Relative paths
134+
135+The `%` command, which we gestured at in the above section, represents the
136+**relative path**, which is the path where you are currently working.
137+
138+`%`s can be stacked to indicate one level further up in the hierarchy for each
139+additional `%`. Try the following command:
140+
141+```
142+~zod:dojo> %%%
143+```
144+
145+You'll notice that it only has your ship name and the empty list. The
146+two additional `%`s abandoned the revision and the `desk` information by moving
147+up twice the hierarchy.
148+
149+There are no local relative paths. `/foo/bar` must be written as
150+`%/foo/bar`.
151+
152+#### Substitution
153+
154+You don't need to write out the explicit path every time you want to reference
155+somewhere outside of your working directory. You can substitute `=` for the
156+segments of a path.
157+
158+Recall that a full address in the the Urbit namespace is of the form
159+`/ship/desk/case/path`. To switch to the `%sandbox` `desk`, you would enter
160+
161+```
162+~sampel-palnet:dojo> =dir /=sandbox=
163+```
164+
165+`=dir` is used to change the working directory - we will see more on it
166+[below](#changing-directories.)
167+
168+The above command uses substitution to use your current `ship` and
169+revision; only the `desk` argument, which is located between the other two, is
170+given something new. Without substitution, you would need to write:
171+
172+```
173+~sampel-palnet:dojo> =dir /~sampel-palnet/sandbox/85
174+```
175+
176+Substitutions work the same way in the `ship/desk/case` and
177+paths. For example, if you are in the `/gen` directory, you can reference a file
178+in the `/app` directory like below. (`+cat` displays the contents of a file).
179+
180+```
181+~sampel-palnet:dojo> =dir %/gen
182+~sampel-palnet:dojo/=/=/~2021.3.19..16.11.20..0c60/gen> +cat /===/app/curl/hoon
183+```
184+
185+Note what was substituted out, and note that we don't need to separate `=` with
186+`/`.
187+
188+If we changed our working directory to something called `/gen/gmail`, we could
189+access a file called
190+
191+```
192+~sampel-palnet:dojo/=/=/~2021.3.19..16.11.20..0c60/gen> =dir %/gmail
193+~sampel-palnet:dojo/=/=/~2021.3.19..16.11.20..0c60/gen/gmail> +cat /===/app/=/split/hoon
194+```
195+
196+Because both paths share a directory named `/gmail` at the same position in the
197+address hierarchy – which, if you recall, is just a `list` – the above command
198+works!
199+
200+We can do the same thing between desks. If `%sandbox` has been merged with
201+`%home`, the following command will produce the same results as the above
202+command.
203+
204+```
205+~sampel-palnet:dojo/=/=/~2021.3.19..16.11.20..0c60/gen/gmail> +cat /=sandbox=/app/=/split/hoon
206+```
207+
208+Most commonly this is used to avoid having to know the current revision
209+number in the `dojo`: `/~lodleb-ritrul/home/~2021.3.19..16.11.20..0c60/gen/example/hoon`
210+
211+#### Changing directories
212+
213+Change the working directory with `=dir`. It's our equivalent of the Unix `cd`.
214+
215+For example, the syntax to navigate to `/home/gen/ask` is:
216+
217+```
218+~sampel-palnet:dojo> =dir /=home=/gen/ask
219+```
220+
221+This command will turn your prompt into something like this:
222+
223+```
224+~sampel-palnet:dojo/=/=/~2021.3.19..16.11.20..0c60/gen/ask>
225+```
226+
227+Using `=dir` without anything else uses the null path, which returns you to
228+your home desk.
229+
230+```
231+~sampel-palnet:dojo/=/=/~2021.3.19..16.11.20..0c60/gen/ask> =dir
232+```
233+
234+Your dojo prompt will turn back into `~sampel-palnet:dojo>`.
235+
236+To go up levels in the path hierarchy, recall the relative path expression
237+`%`. Stacking them represents another level higher in the hierarchy than
238+the current working directory for each `%` beyond the initial. The command below
239+brings you one level up:
240+
241+```
242+~sampel-palnet:dojo> =dir %/gen
243+~sampel-palnet:dojo/=/=/~2021.3.19..16.11.20..0c60/gen> =dir %%
244+```
245+
246+### Revision-control
247+
248+#### Mount
249+
250+Syntax: `|mount %/clay/path %mount-point`
251+
252+Mount the `/clay/path` at the Unix mount point `mount-point` with your pier as
253+root directory.
254+
255+**Examples:**
256+
257+```
258+|mount %/gen %generators
259+```
260+
261+Mounts `%/gen` to `/generators` inside your pier directory.
262+
263+#### Unmount
264+
265+```
266+|unmount [clay-path || Unix-name]
267+```
268+
269+Unmount the path or name from Unix.
270+
271+**Examples:**
272+
273+```
274+|unmount %/gen
275+```
276+
277+Unmounts the Clay path `%/gen` from whatever name it was mounted as.
278+
279+```
280+|unmount %generators
281+```
282+
283+Unmounts the Unix path `/generators`.
284+
285+#### Merge
286+
287+```
288+|merge %target-desk ~source-ship %source-desk
289+```
290+
291+Merges a source `desk` into a target `desk`.
292+
293+This can optionally include a [merge
294+strategy](@/docs/arvo/clay/using.md#strategies):
295+
296+```
297+|merge %target-desk ~source-ship %source-desk, =gem %strategy
298+```
299+
300+You may also merge a Clay path on your own ship to a `desk`, along with an
301+optional strategy.
302+
303+```
304+|merge %target-get %/clay/path, =gem %strategy
305+```
306+
307+**Examples:**
308+
309+```
310+|merge %examples ~wacbex-ribmex %examples
311+```
312+
313+Merge the `%examples` `desk` from `~waxbex-ribmex`
314+
315+```
316+|merge %home-work /=home=, =gem %fine
317+```
318+
319+Merge `/=home=` into `%home-work` using merge strategy `%fine`.
320+
321+
322+#### Sync
323+
324+```
325+|sync %target-desk ~source-ship %target-desk
326+```
327+
328+Subscribe to continuous updates from remote `desk` on local `desk`. Non-comet
329+urbits have `|sync %home ~sponsor %kids` automatically set up (where `~sponsor`
330+is the planet that issued a moon, the star that issued a planet, or the galaxy
331+that issued a star).
332+
333+**Examples:**
334+
335+```
336+|sync %home-local ~dozbud %home
337+```
338+
339+#### Unsync
340+
341+```
342+|unsync %target-desk ~source-ship %source-desk
343+```
344+
345+Unsubscribe from updates from remote `desk` on local `desk`. Arguments must
346+match original `|sync` command.
347+
348+Example:
349+
350+```
351+|unsync %home-local ~dozbud %home
352+```
353+
354+
355+### Manipulation
356+
357+#### `+cat`
358+
359+Syntax: `+cat path [path ...]`
360+
361+Similar to Unix `cat`. `+cat` takes one or more `path`s, and prints their
362+contents. If that `path` is a file, the contents of the file is printed. If the
363+`path` terminates in a directory, the list of names at that path is produced.
364+
365+#### `+ls`
366+
367+Syntax: `+ls path`
368+
369+Similar to Unix `ls`. `+ls` takes a single `path`.
370+
371+Produces a list of names at the `path`.
372+
373+```
374+~sampel-palnet:dojo> +cat %/our/home/gen/curl/hoon
375+```
376+
377+#### `|rm`
378+
379+Syntax: `|rm path`
380+
381+Remove the data at `path`. `Path` must be a path to the actual node, not a
382+'directory'.
383+
384+#### `|cp`
385+
386+Syntax: `|cp to from`
387+
388+Copy the file at `from` into the path `to`.
389+
390+#### `|mv`
391+
392+Syntax: `|mv to from`
393+
394+Move the file at `from` into the path `to`.
395+
396+In Clay, `|mv` is just a shorthand for `|cp` then `|rm`. The `|rm`
397+doesn't happen unless the `|cp` succeeds.
content/using/os/getting-started.mdnew file+337
@@ -0,0 +1,337 @@
1++++
2+title = "Getting Started"
3+description = "How to operate your ship, including using your ship's filesystem and messaging applications, starting a moon, or requesting a DNS proxy."
4+template = "doc.html"
5+weight = 1
6+aliases = ["docs/using/messaging/", "docs/using/admin/"]
7+[extra]
8+hidetitle = "true"
9++++
10+
11+Your urbit (also called your _ship_) is a persistent Unix process that you
12+mainly control from its console, called the `dojo`.
13+
14+### Shutdown
15+
16+You can turn your urbit off with `Ctrl-d` from the Chat or Dojo prompts.
17+
18+You can force-quit your urbit with `Ctrl-z` from anywhere.
19+
20+### Restart
21+
22+To restart your urbit simply pass the name of your pier:
23+
24+```sh
25+$ ./urbit some-planet
26+```
27+
28+or
29+
30+```sh
31+$ ./urbit comet
32+```
33+
34+### Logging
35+
36+To log an urbit's command line output to a file, use `script`:
37+
38+```sh
39+$ script urbit.log ./urbit your-urbit
40+```
41+
42+### Moving your pier
43+
44+Piers are designed to be portable, but it _must_ be done while the urbit
45+is not running. Urbit networking is stateful, so you can't run two copies
46+of the same urbit in two places.
47+
48+To move a pier, simply move the contents of the directory it lives in.
49+To keep these files as small as possible we usually use the `--sparse`
50+option in `tar`. With a pier `your-urbit/`, something like this should work:
51+
52+```sh
53+tar -Scvzf ~/your-urbit.tar.gz ~/your-urbit/
54+scp your-old-server:~/your-urbit.tar.gz your-new-server:~
55+```
56+
57+Then to unzip it, on your other Unix server, run:
58+
59+```sh
60+tar xfvz your-urbit.tar.gz
61+```
62+
63+Delete the tar file, and, after installing Urbit on your new server, start your urbit back up with:
64+
65+```sh
66+./urbit your-urbit
67+```
68+
69+### Hardware requirements
70+
71+Urbit can run on any x86 computer (unofficial, unsupported [ARM binaries](https://botter-nidnul.github.io/AArch64_Urbit_Static_Binaries.html) are also available), ideally with at least 2GB of RAM.
72+
73+Urbit maintains a persistent log of the history of your ship. Eventually this log will be automatically trimmed when necessary, but for now it only increases in size. An actively used planet will consume 5-50 GB of storage space per year of operation.
74+
75+### Console
76+
77+Your Urbit terminal is separated into two parts: the prompt (the bottom line) and the record (everything above that). The record is shared; all the output from all the apps in your command set appears in it. The prompt is multiplexed.
78+
79+In the CLI, Urbit apps can process your input before you hit return. To see this in action try entering `)` as the first character at the Dojo prompt. Since there is no Dojo command or Hoon expression that starts with ')', the Dojo rejects it.
80+
81+`Ctrl-x` - Switches the prompt between running console apps
82+
83+`Ctrl-c` - Crash current event. Processed at the Unix layer and prints a stack
84+trace.
85+
86+`Ctrl-d` - From Chat or Dojo, stops your Urbit process.
87+
88+`Ctrl-z` - Stops the Urbit process from _anywhere_.
89+
90+`↑` / `↓` - History navigation
91+
92+The following emacs-style key bindings are available:
93+
94+```
95+Ctrl-a Cursor to beginning of the line (Home)
96+Ctrl-b Cursor one character backward (left-arrow)
97+Ctrl-e Cursor to the end of the line (End)
98+Ctrl-f Cursor one character forward (right-arrow)
99+Ctrl-g Beep; cancel reverse-search
100+Ctrl-k Kill to end of line
101+Ctrl-l Clear the screen
102+Ctrl-n Next line in history (down-arrow)
103+Ctrl-p Previous line in history (up-arrow)
104+Ctrl-r Reverse-search
105+Ctrl-t Transpose characters
106+Ctrl-u Kill to beginning of line
107+Ctrl-y Yank from kill buffer
108+```
109+
110+### Updates
111+
112+By default, you will automatically receive updates ([OTAs](@/docs/glossary/ota-updates.md)) from your sponsor. To check your OTA source, run `|ota` in the [dojo](@/docs/glossary/dojo.md).
113+
114+If for some reason (for example, if your sponsor is out of date), you can switch OTA sources by running `|ota ~otasrc %kids` in the dojo, where `~otasrc` is the ship from which you want to receive updates. It is a good idea to contact the source ship and ask permission to sync from them.
115+
116+If OTAs are not succeeding, or if you are on an version of Urbit before the `|ota` command was introduced, you can run `|merge %home (sein:title our now our) %kids, =gem %take-that`. **Note:** This will wipe out any custom changes to the base distribution.
117+
118+#### Additional OTA Troubleshooting
119+Please check the Support Wiki for additional OTA troubleshooting, such as:
120+[OTA 1.0.71 failed](https://github.com/urbit/support/wiki/OTA-1.0.71-failed),
121+[Missing OTA](https://github.com/urbit/support/wiki/Missing-OTA),
122+[Stuck flow preventing planets from receiving
123+OTAs](https://github.com/urbit/support/wiki/Stuck-flow-preventing-planets-from-receiving-OTAs),
124+and [No content shows in Links page after OTA](https://github.com/urbit/support/wiki/No-content-shows-in-Links-page-after-OTA).
125+
126+### Landscape
127+
128+On startup Urbit tries to bind to `localhost:80`. If you're already running something on port `80` -- such as any other HTTP server, or another urbit -- you'll find the urbit that you just started on `8080`, `8081`, and so on. For planets only, we also proxy web domains through Urbit's own servers. Any planet `~your-urbit` is also at `your-urbit.arvo.network`, but only after you [set up DNS](#dns-proxying).
129+
130+Once running, you can sign into Landscape, your ship’s web interface, from `http://localhost` or `https://your-urbit.arvo.network`. Since our HTTPS isn't audited / battle tested, we just call it "secure" HTTPS. You can find that on `8443`. Or `8444` (and so on) if you're already running something on `8443`.
131+
132+### Moons {#moons}
133+
134+Planets can spawn moons, which are meant for connected devices: phones, smart TVs, digital thermostats. The basic idea is that your planet runs permanently in a data center somewhere, while moons run on all your devices. Each planet can issue ~4 billion (`2^32`) moons.
135+
136+To generate a random moon from your planet, run:
137+
138+```
139+~sampel-palnet:dojo> |moon
140+moon: ~faswep-navred-sampel-palnet
141+\/0w5cT5t.wCO6i.~e1xg.Oz0qb.QNO6I.3Kt2T.h9M9F.U3vU~.X3Qu0.gtb19.IYTkY.80kWZ.SI\/
142+ EUE.DXa8i.TiDof.o3-1C.RHLKS.k81M0.ecz5o.ic0Bg.600g1
143+\/ \/
144+```
145+
146+You must manually edit the output of `|moon` to get the correct format for the `<key>`:
147+
148+- strip out the `\/`
149+
150+- combine into one line, omitting spaces
151+
152+`<key>` would be `0w5cT5t.wCO6i.~e1xg.Oz0qb.QNO6I.3Kt2T.h9M9F.U3vU~.X3Qu0.gtb19.IYTkY.80kWZ.SIEUE.DXa8i.TiDof.o3-1C.RHLKS.k81M0.ecz5o.ic0Bg.600g1`
153+in this example.
154+
155+Put `<key>` in a file and that file becomes `<keyfile>`.
156+
157+You can use the resulting output in the same installation flow from the [Installing Urbit](@/getting-started/_index.md) guide, following the same scheme as for booting a planet. That scheme is:
158+
159+```sh
160+$ ./urbit -w <moonname> -G <key> -c <piername>
161+```
162+
163+or
164+
165+```sh
166+$ ./urbit -w <moonname> -k <keyfile> -c <piername>
167+```
168+
169+The `-c <piername>` argument is not required, but it is recommended; otherwise,
170+the resulting directory is a rather unwieldy moon name.
171+
172+Here's how an example moon might be booted:
173+
174+```sh
175+$ ./urbit -w faswep-navred-sampel-palnet -G <key> -c mymoon
176+```
177+
178+or
179+
180+```sh
181+$ ./urbit -w faswep-navred-sampel-palnet -k <keyfile> -c mymoon
182+```
183+
184+Moons are automatically synced to their parent `%kids` desk, and can control applications on their parent planet using `|link`.
185+
186+To breach a moon -- that is, to reset its presence on the network so that it's treated as a freshly spawned ship by others -- run from the parent ship:
187+
188+```
189+|moon-breach ~faswep-navred-sampel-palnet
190+```
191+
192+To cycle the keys of a moon without breaching, run:
193+
194+```
195+|moon-cycle-keys ~sampel-sipnym-wicdev-wisryt
196+```
197+
198+
199+### Escaping A Sponsor {#escape}
200+
201+To use the network as a planet or star, you must be sponsored by an active star
202+or galaxy, respectively. If your sponsor isn't suiting your needs, you can
203+escape to a different one. This can be done with
204+[Bridge](https://bridge.urbit.org/) following the instructions
205+[here](@/using/id/using-bridge.md#escaping-your-sponsor).
206+
207+### Continuity breaches
208+
209+While the Urbit network is in this alpha state, we sometimes have to reboot the whole network. This happens either when major changes need to be shipped or we hit a bug that can't be fixed over the air.
210+
211+Because Urbit networking is stateful we call this a _continuity breach_. Everything has to be restarted from scratch. Your pier will continue to function after we have breached, but it won’t connect to the rest of the Urbit network.
212+
213+When this happens, back up any files you'd like to save, shut down your urbit, and recreate it (as if you were starting for the first time).
214+
215+### Life and rift number
216+
217+You can check your ship's _life_ and _rift_ number by running `+keys our` in
218+dojo. You can inspect another ship's life and rift number by running `+keys
219+~sampel-palnet`. For information on what life and rift are, see [Guide to Breaches](@/using/id/guide-to-breaches.md).
220+
221+## DNS proxying {#dns-proxying}
222+
223+We have a system that lets you request a domain name for your ship in the form of `ship.arvo.network`, where `ship` is your ship's name minus the `~`. This allows users to access their ships remotely using Landscape, our graphical web interface.
224+
225+Stars and planets follow the same process DNS proxying process, and galaxies have their own requirements. Moons and comets are not supported.
226+
227+### Planets and Stars
228+
229+For a planet or star's DNS proxying request to be made and fulfilled, they must be hosting their ship someplace with a public IP address, and its HTTP server must be listening on port 80.
230+
231+To get `ship.arvo.network` on a planet or star, you must set up DNS routing with its parent ship by starting the `:dns` app.
232+
233+To do so, simply run this command in your ship's Dojo, passing the IP address as an argument, using the .0.0.0.0 (`@if`) syntax. For example:
234+
235+```
236+> -dns-address &dns-address [%if .1.2.3.4]
237+```
238+
239+`:dns`, running locally, will make an HTTP request to that IP address on port 80 to confirm that it is itself available at that IP and port. If that fails, you'll receive a `%bail-early` message in `:chat-cli`; this request will retry a few times. If the self-check is successful, the request is relayed to `~zod`, and you'll receive a message saying, `request for DNS sent to ~zod`. Once `~zod` has acknowledged receipt of the request, your local `:dns` app will send a `:chat-cli` message saying `awaiting response from ~zod`.
240+
241+The request will be picked up shortly, and the `ship.arvo.network` DNS record will be set to the given IP address. Once that's set up, `~zod` will be notified and `~zod` will, in turn, notify your ship. That ship will now try to verify that it can reach itself on `ship.arvo.network` over port 80. If it can't, it'll send a message saying, `unable to access via ship.arvo.network`. If it can, it will configure itself with that domain and say `confirmed access via ship.arvo.network`.
242+
243+Great! You're set up now. Try accessing your `ship.arvo.network` in your browser to use Landscape; we recommend Chrome or Brave.
244+
245+### Configuring SSL
246+
247+To enable SSL on your ship, use the `acme` agent, which will request a certificate through Let's Encrypt. First, make sure the agent is started:
248+
249+```
250+> |start %acme
251+```
252+
253+Next, provide the path for the SSL certificate by poking the `acme` agent. The path format is `/tld/your_domain/your_subdomain`, so if your domain is `sampel-palnet.arvo.network`, you'd use it like so:
254+
255+```
256+> :acme &path /network/arvo/sampel-palnet
257+```
258+
259+### Galaxies
260+
261+Galaxies are already required to have separate DNS entry at galaxy.urbit.org. There's no automated process for getting that binding, so if you're a galaxy-holder, get in touch with us at support@urbit.org.
262+
263+There is a command for galaxies that will try to re-use their already-necessary Ames DNS entry for HTTPS:
264+
265+```
266+> -dns-auto
267+```
268+
269+This will make HTTP-requests to self-check availability over `galaxy.$AMES-DOMAIN` (currently galaxy.urbit.org), where `galaxy` is the galaxy's name minus the `~`.
270+
271+Otherwise, `-dns-auto` works the same as `:dns|ip` does with stars and planets: if it's available or unavailable, Chat messages, and so on.
272+
273+### Ports
274+
275+The built-in logic for listening on port 80 is to try to bind to port 80; if it cannot, it tries 8080, then increments until it can bind a port. Port 80 is available to unprivileged process on recent version of macOS. Otherwise, the process needs to either be run as root, or be given special permission (CAP\_NET_BIND on Linux).
276+
277+### Hoon
278+
279+You can use Chat to evaluate Hoon code and share the results with everyone in a chat. To do so, preface your Hoon with `#`.
280+
281+```
282+~sampel-palnet:chat-cli= #(add 2 2)
283+```
284+
285+This will print as:
286+
287+```
288+~sampel-palnet# (add 2 2)
289+ 4
290+```
291+
292+### URLs
293+
294+To share a URL, send it as its own message, with no content before or after it.
295+
296+```
297+~sampel-palnet:chat-cli= https://urbit.org/
298+```
299+
300+This will print as:
301+
302+```
303+~sampel-palnet/ https://urbit.org/
304+```
305+
306+### Expanding messages
307+
308+In the case of URLs, they may be too long to display on a single message line. For Hoon code, the code or result could be big. In `:chat-cli`, these get shortened when initially printed out. To view the entire contents, you can select the message in various ways.
309+
310+```
311+~sampel-palnet+ some message
312+----------[240]
313+~sampel-palnet+ let's try selecting this message!
314+~sampel-palnet+ another message
315+~sampel-palnet:chat-cli=
316+```
317+
318+In the above example, we can select the middle message by issuing any of the following command:
319+
320+```
321+;240
322+;40
323+;;
324+```
325+
326+`;n` looks for the last message whose sequence number ends in `n`. `;;` simply picks the second-to-last message.
327+
328+Detailed message output will look something like this:
329+
330+```
331+? 240
332+ 0v5.g7r7l.n0d7m.mp4bn.gp6vr.sm5lj at ~2019.10.17..22.08.27..8a03
333+ ~sampel-palnet
334+ to ~dopzod/urbit-help
335+let's try selecting this message!
336+```
337+
content/using/os/messaging.mdnew file+254
@@ -0,0 +1,254 @@
1++++
2+title = "Messaging"
3+template = "doc.html"
4+weight = 2
5++++
6+
7+Let’s get started using the `:chat-cli` application, also known more simply as
8+_Chat_. It's the simplest way to talk to people using the command line
9+interface.
10+
11+### Quickstart
12+
13+The most common use for `:chat-cli` right now is, of course, communicating in group chats.
14+
15+### Joining a chat
16+
17+In `:chat-cli`, any kind of medium for a message is called a _chat_. There are four "types" of chats, but for now we'll be dealing with the _channel_, a publicly accessible chatroom for general use. We'll discuss the other three kinds in the [chat management](#chat-management) section later on.
18+
19+Join the Urbit Community from Dojo using `:group-view &group-view-action [%join [~bitbet-bolbel %urbit-community] ~bitbet-bolbel]`. Once you've joined, join the General chat from chat-cli. Use `ctrl-x` to switch from the Dojo prompt to the Chat prompt.
20+
21+Then:
22+
23+```
24+~sampel-palnet:chat-cli/ ;join ~darrux-landes/general
25+```
26+
27+Now that you're in, try post a line to `~darrux-landes/general`:
28+
29+```
30+~sampel-palnet:chat-cli= Hello, world!
31+```
32+
33+You'll see your message printed below messages from others that came before it. You can always type `;chats` in the `chat-cli` prompt to list all the chats you're in:
34+
35+```
36+~sampel-palnet:chat-cli= ;chats
37+~darrux-landes/general
38+```
39+
40+Glyphs will be automatically assigned to channels, but have the option of binding a glyph (single non-alphanumeric character) to the channel you're joining; the syntax is in the form of `;join ~/~dopzod/books +`. The chosen glyph will be the symbol that ends your prompt, and it will be what you use as a shortcut to switch to this channel.
41+
42+```
43+~sampel-palnet:chat-cli= ;+
44+~sampel-palnet:chat-cli+
45+```
46+
47+Use `;leave` to unsubscribe from a channel:
48+
49+```
50+~sampel-palnet:chat-cli= ;leave ~darrux-landes/general
51+```
52+
53+Now, let's create a channel we can invite some friends to:
54+
55+```
56+~sampel-palnet:chat-cli= ;create channel /my-channel
57+```
58+
59+Now you can tell your friends to `;join ~your-urbit/my-channel`.
60+
61+In order to see messages in `:chat-cli` you may need to do the following in Dojo:
62+
63+```
64+:chat-cli %connect
65+```
66+ ### Creating and managing chats {#chat-management}
67+
68+As mentioned before, any urbit can host any number of chats. Existing chats can be deleted or modified with various commands. All commands in this section should be sent from the `chat-cli>` prompt.
69+
70+#### Create
71+
72+Syntax: `;create [type] /name +`, where `+` represents an optional glyph.
73+
74+Creates and joins a chat, where `[type]` is any of the following:
75+- `channel`: public chat. Has a blacklist for write control.
76+- `village`: invite-only chat.
77+- `journal`: publicly readable, invite-only for writing.
78+- `mailbox`: publicly writeable, invite-only for reading.
79+
80+Let's create an example mailbox:
81+
82+```
83+~sampel-palnet:chat-cli> ;create mailbox /coolbox ^
84+```
85+
86+#### Delete
87+
88+Syntax: `;delete /name`
89+
90+Deletes a chat.
91+
92+#### Permission management
93+
94+You can permit and ban people from reading and/or writing to the chats you host, using `;invite` and `;banish` command respectively.
95+
96+Syntax: `;invite [rw] /name ~ships`
97+
98+Where `rw` is either `r`, `w`, or `rw`, representing "read" and "write" permissions.
99+And where `~ships` is a comma-seperated list of ships to invite.
100+
101+For example, to grant two people full access to a `village` we created:
102+
103+```
104+~sampel-palnet:chat-cli> ;invite rw /hidden-village ~ravmel-ropdyl, ~rapfyr-diglyt
105+```
106+
107+Similarly, if we later want to revoke the writing permissions for one of them, but still allow them to read new messages, we can run:
108+
109+```
110+~sampel-palnet:chat-cli> ;banish w /hidden-village ~rapfyr-diglyt
111+```
112+
113+#### Chat glyphs
114+
115+Glyphs are found at the end of your prompt, as a quick indicator of where
116+your messages will be sent.
117+
118+Glyphs are assigned by chat hash out of the following list:
119+
120+```
121+! @ # $ % ^ & ( ) - = _ + [ ] { } ; ' \ : " , . < > ?
122+```
123+
124+Alphanumeric characters and `|#/*~` are reserved; all others can be manually assigned.
125+
126+For example, `-` the glyph at the end of the prompt below might indicates that
127+messages sent from this prompt will go to some chat with that glyph:
128+
129+```
130+~sampel-palnet:chat-cli-
131+```
132+
133+To see what chat is bound to a glyph, use the `;what` command followed by the
134+glyph in question, or use `;what` without specifying a glyph to see all of your
135+subscriptions which are bound to glyphs. For example, to see `=`:
136+
137+```
138+~sampel-palnet:chat-cli> ;what =
139+~dopzod/urbit-help
140+```
141+
142+To see all of your glyph bindings:
143+
144+```
145+~sampel-palnet:chat-cli> ;what
146+> ~paldev/numismatic-forum
147+. ~middev/ny-martians
148+= ~dopzod/urbit-help
149+```
150+
151+When the messaging target doesn't have a glyph, we see their name at the end of
152+the prompt instead. Here we're talking into `~dannum-mitryl/homework`:
153+
154+```
155+~sampel-palnet:chat-cli[~dannum-mitryl/homework]
156+```
157+
158+#### Bind
159+
160+Syntax: `;bind [glyph] ~host/chat-name`
161+
162+Assigns the chosen glyph to a chat.
163+
164+For example:
165+
166+```
167+~sampel-palnet:chat-cli> ;bind + ~dopzod/urbit-help
168+```
169+
170+#### Unbind
171+
172+Syntax: `;unbind [glyph] ~host/chat-name`
173+
174+Unassigns the chosen glyph from a chat owned by your ship.
175+
176+For example:
177+
178+```
179+~sampel-palnet:chat-cli> ;unbind + ~dopzod/urbit-help
180+```
181+
182+If you don't specify a chat, all bindings for that glyph are removed.
183+
184+#### Prefixes
185+
186+Received posts are prefixed with a glyph to let you know what the
187+audience is. You can activate an individual post to see the full
188+audience.
189+
190+There are a few special-purpose "glyphs":
191+
192+- `|` - Informational messages
193+- `*` - Posts to a target you don't have a glyph binding for
194+
195+
196+### Configuration
197+
198+#### Set audience
199+
200+`;~ship/chat`
201+
202+Set audience to `~ship/chat`.
203+
204+#### Set audience by glyph
205+
206+Syntax: `;[glyph]`
207+
208+Set audience to the chat previously bound to the chosen glyph.
209+
210+#### Set audience to own chat
211+
212+Syntax: `;/chat`
213+
214+Set audience to a chat on your own ship.
215+
216+### Miscellaneous configuration
217+
218+#### Change timezone
219+
220+Syntax: `;set timezone [+/-][hours]`
221+
222+Adjust the display of timestamps to a specific timezone. Relative to UTC.
223+
224+#### Set width
225+
226+Syntax: `;set width [number]`
227+
228+Set the rendering width of `:chat-cli` to a specific number of characters.
229+(Minimum of 30.)
230+
231+#### Show timestamps
232+
233+Syntax: `;set showtime`
234+
235+Show the timestamp for each message. This is set by default.
236+
237+#### Hide timestamps
238+
239+Syntax: `;unset showtime`
240+
241+Stop showing the timestamp for each message.
242+
243+#### Sound notification on
244+
245+Syntax: `;set notify`
246+
247+Emit a terminal bell sound if your six-syllable ship name is mentioned in
248+a message. This is set by default.
249+
250+#### Sound notification off
251+
252+Syntax `;unset notify`
253+
254+Do not notify when your ship name is mentioned.
content/using/os/s3.mdnew file+34
@@ -0,0 +1,34 @@
1++++
2+title = "Configuring S3 Storage"
3+template = "doc.html"
4+weight = 2
5++++
6+
7+Amazon S3, which stands for Amazon Simple Storage Service, is a technology that was introduced by Amazon Web Services for cloud storage that has since been extended more broadly into a [standard programming interface](https://en.wikipedia.org/wiki/Amazon_S3#S3_API_and_competing_services).
8+
9+Our S3 support lets you store credentials for your S3 object storage buckets on your Urbit ship; once you have done so, you will get additional functionality for uploading your own media within Chat and Groups (for avatars).
10+
11+To enable S3 support on your ship you'll need to first set up a bucket, and then add its credentials to Landscape using *either* Landscape or the Dojo.
12+
13+### Bucket Setup
14+
15+If you’re using AWS, it will have to support signature v2, not v4. We've found DigitalOcean's Spaces to work well also. The bucket has to be publicly readable, allow CORS from `*` origins, allow GET and PUT methods, and allow `*` headers. Your provider should have details on setting access permissions and CORS.
16+
17+### Add your credentials: Landscape
18+
19+Navigate to your `https://<your-ship-url>/~settings#s3`, or click your sigil in the upper-right corner of the window. Fill out the **S3 Credentials** and **S3 Buckets** sections and you're all set!
20+
21+### Add your credentials: Dojo
22+
23+Once you have gotten your bucket setup, poke the `s3-store` on your ship with your details. You can do this in Dojo or in web Dojo.
24+
25+```
26+:s3-store|set-endpoint 'endpoint.mys3provider.com'
27+:: AWS endpoint example: s3-us-west-2.amazonaws.com
28+:: Digital Ocean endpoint example: sfo2.digitaloceanspaces.com
29+:s3-store|set-access-key-id 'MYACCESSKEYID'
30+:s3-store|set-secret-access-key 'MYSECRETACCESSKEY'
31+:s3-store|set-current-bucket 'yourbucketname'
32+```
33+
34+Done! If you need to peek at s3-store’s state, you can always run :s3-store +dbug (inside Dojo, not web Dojo, unfortunately). You’ll see the additional functionality appear in Groups and Chat.
content/using/os/shell.mdnew file+413
@@ -0,0 +1,413 @@
1++++
2+title = "Shell"
3+template = "doc.html"
4+weight = 2
5++++
6+
7+The Dojo is our shell; it processes system commands and returns output. It's a
8+good place to quickly experiment with Urbit. On the surface the Dojo is just a
9+Hoon REPL. On the inside, the Dojo is a system for operating on and transforming
10+data in Urbit.
11+
12+### Quickstart
13+
14+You can use the Dojo to run arbitrary Hoon code, as well as non-Hoon system
15+commands.
16+
17+#### Math
18+
19+Evaluate a Hoon expression (whitespace matters):
20+
21+```
22+~your-urbit:dojo> (add 2 2)
23+~your-urbit:dojo> %+ add 2 2
24+```
25+
26+Tall-form Hoon may require multiple lines:
27+
28+```
29+~your-urbit:dojo> %+ add
30+~your-urbit:dojo< 2
31+~your-urbit:dojo< 2
32+```
33+
34+Hoon uses something called [the subject](@/docs/hoon/hoon-school/the-subject-and-its-legs.md).
35+The Dojo has its own subject and that's where Hoon's equivalent of variables,
36+called faces, are stored.
37+
38+Use `=var` to save faces to the Dojo subject.
39+
40+```
41+~your-urbit:dojo> =foo (add 2 2)
42+```
43+
44+Note, however, that `=var` is Dojo syntax, not Hoon syntax. You cannot bind a
45+face in a `.hoon` file in this way.
46+
47+#### System commands
48+
49+Use `=dir` to set the current working directory:
50+
51+```
52+~your-urbit:dojo> =dir %/gen
53+```
54+
55+(`%` represents your current directory. For a complete explanation on urbit
56+paths, see the [filesystem section](#filesystem).)
57+
58+Generators (files in `/gen`) are run with `+`:
59+
60+```
61+~your-urbit:dojo> +hello 'world'
62+```
63+
64+Save output to a file in `%clay` with `*`:
65+
66+```
67+~your-urbit:dojo> *some/file/path/hoon 'hello world'
68+```
69+
70+Run system commands from `:hood`, like `reload`, using `|`:
71+
72+```
73+~your-urbit:dojo> |reload %eyre
74+```
75+
76+### Generators
77+
78+Generators are short Hoon scripts, saved as `.hoon` files in the `/gen`
79+directory. Many Dojo commands exist in the form of generators. The syntax for
80+running a generator is `+genname` for a generator saved as `genname.hoon`.
81+
82+#### `+cat`
83+
84+Accepts a path and displays the file. Similar to Unix `cat`.
85+
86+```
87+~your-urbit:dojo> +cat %/gen/curl/hoon
88+```
89+
90+#### `+code`
91+
92+Generates a code that is used to remotely log into your ship. No
93+arguments.
94+
95+```
96+~your-urbit:dojo> +code
97+```
98+
99+You can change your code to a new randomly generated one by entering `|code
100+%reset`. Please note that this will prevent [Bridge](@/docs/glossary/bridge.md)
101+from being able to derive your code in the future.
102+
103+#### `+curl`
104+
105+Retrieves data from a URL. Accepts a `tape`. Similar to Unix `curl`.
106+
107+```
108+~your-urbit:dojo> +curl "http://nyt.com"
109+```
110+
111+#### `+hello`
112+
113+Just prints the argument. Accepts a `@ta`.
114+
115+```
116+~your-urbit:dojo> +hello 'mars'
117+```
118+
119+#### `+ls`
120+
121+Similar to Unix `ls`. Accepts a path.
122+
123+```
124+~your-urbit:dojo> +ls %/gen
125+~your-urbit:dojo> +ls /~talsur-todres/home/2/gen/program
126+```
127+
128+#### `+solid`
129+
130+Compile the current state of the kernel and output a
131+noun. Usually downloaded to a file in unix. No arguments.
132+
133+```
134+~your-urbit:dojo> .urbit/pill +solid
135+```
136+
137+#### `+test`
138+
139+Testrunner. Can test multiple generators at once, conventionally ones
140+in the `/test` folder. Takes a path.
141+
142+```
143+~your-urbit:dojo> +test /lib
144+```
145+
146+#### `+ticket`
147+
148+Generate a ticket for an urbit ship. Takes an urbit name (`@p`).
149+
150+
151+```
152+~your-urbit:dojo> +ticket ~talsur-todres-your-urbit
153+```
154+
155+#### `+tree`
156+
157+Generate a recursive directory listing. Takes a path.
158+
159+```
160+~your-urbit:dojo> +tree %/sys
161+```
162+
163+### Hood
164+
165+The hood is the system daemon. See `gen/hood` and `app/hood`.
166+
167+`|hi` - Sends a direct message. Sort of like Unix `write`. Accepts
168+an urbit name (`@p`) and a string (`tape`, which is text wrapped with double-quotes).
169+
170+```
171+~your-urbit:dojo> |hi ~binzod "you there?"
172+```
173+
174+`|link` / `|unlink` - Link / unlink a remote app. Accepts an
175+Urbit name and an app name.
176+
177+```
178+~your-urbit:dojo> |link ~talsur-todres %octo
179+```
180+
181+`|mass` - Prints the current memory usage of all the kernel modules.
182+No arguments.
183+
184+```
185+~your-urbit:dojo> |mass
186+```
187+
188+`|reload` - Reloads a kernel module (vane) from source. Accepts any
189+number of vane names.
190+
191+```
192+~your-urbit:dojo> |reload %clay %eyre
193+```
194+
195+`|reset` - Reloads `hoon.hoon` and all modules. No arguments.
196+
197+```
198+~your-urbit:dojo> |reset
199+```
200+
201+`|start` - Starts an app. Accepts an app name.
202+
203+```
204+~your-urbit:dojo> |start %curl
205+```
206+
207+---
208+
209+### Dojo manual
210+
211+#### Sources and sinks
212+
213+A Dojo command is either a **source** or a **sink**. A source is just something
214+that can be printed to your console or the result of some computation. A
215+sink is an **effect**: a change to the filesystem, a network message, a
216+change to your environment, or a typed message to an app.
217+
218+Sources can be chained together, but we can only produce one effect per
219+command.
220+
221+#### Sinks
222+
223+#### `=` - Set variable
224+
225+Set any environment variable:
226+
227+```
228+~your-urbit:dojo> =foo 42
229+~your-urbit:dojo> (add 2 foo)
230+
231+44
232+```
233+
234+Make sure to note that `=var` is Dojo syntax, not Hoon syntax. You cannot bind a
235+variable in a `.hoon` file in this way.
236+
237+#### Special variables
238+
239+There are a few special variables that the Dojo maintains.
240+
241+#### `:` - Send to app
242+
243+`:app` goes to a local `app`, `:~ship/app` goes to the `app` on `~ship`.
244+
245+Send a `helm-hi` message to `hood`:
246+
247+```
248+~your-urbit:dojo> :hood &helm-hi 'hi'
249+```
250+
251+Apps usually expect marked data, so `&` is often used here.
252+
253+#### `*` - Save in `%clay`
254+
255+Save a new `.hoon` file in `gen`:
256+
257+```
258+~your-urbit:dojo> *%/gen/foo/hoon '# hello'
259+```
260+
261+The last component of the path is expected to be the mark (or mime
262+type).
263+
264+#### `.` - Export to Unix
265+
266+Export a noun to Unix with `.`:
267+
268+```
269+~your-urbit:dojo> .foo/bar/baz (add 2 2)
270+```
271+
272+Which creates a file at `pier/.urb/put/foo/bar.baz`.
273+
274+This is very often used with `+solid`:
275+
276+```
277+~your-urbit:dojo> .urbit/pill +solid
278+```
279+
280+Which outputs a new `urbit.pill` to `pier/.urb/put/urbit.pill`
281+
282+### Sources
283+
284+#### `_` - Run a function
285+
286+Use `_` to run a gate (or function):
287+
288+Write an arbitrary function and pass data to it:
289+
290+```
291+~your-urbit:dojo> _|=([a=@] (mul a 3)) 3
292+9
293+```
294+
295+Use a function to get the status code from an http request:
296+
297+```
298+~your-urbit:dojo> _|=([p=@ud q=* r=*] p) +http://google.com
299+301
300+```
301+
302+#### `+` `-` - HTTP requests
303+
304+`+http[s]://example.com` - sends a GET request
305+
306+`+http[s]://example.com &json [%s 'hi']` - sends a POST request with the
307+JSON `"hi"` in the body.
308+
309+`-http[s]://example.com &json [%s 'hi']` - sends a PUT request with the
310+JSON `"hi"` in the body.
311+
312+Note that the first of these is a source while the last two are sinks.
313+
314+#### `+` - Generators
315+
316+Generators are simple Hoon scripts loaded from the filesystem. They live
317+in `gen/`.
318+
319+An example of a generator that is built into your urbit is `+code`. It produces
320+the code needed to log into your ship remotely.
321+
322+```
323+~your-urbit:dojo> +code
324+fintyr-haldet-fassev-solhex
325+```
326+
327+### Variables
328+
329+You can use `=` to set an environment variable in Dojo, but there are
330+a few reserved names that have special uses.
331+
332+#### `dir`
333+
334+Current working `%clay` desk and revision. Read / write.
335+
336+**Examples:**
337+
338+```
339+~your-urbit:dojo> =dir %/gen
340+~your-urbit:dojo> +ls %
341+404/hoon docs/ dojo/hoon lib/ listen/hoon md static/udon talk/ testing/udon tree/main/ unmark/ womb/
342+```
343+
344+#### `lib`
345+
346+Current set of libraries (`/lib`) in your environment. Can be set
347+with `/+`. Read / write.
348+
349+**Examples:**
350+
351+```
352+~your-urbit:dojo> /+ number-to-words
353+```
354+Now we can use arms from lib/number-to-words.hoon
355+```
356+~your-urbit:dojo> (to-words:eng-us:number-to-words 123.456)
357+```
358+
359+#### `sur`
360+
361+Current set of structures (`/sur`) in your environment. Can be set
362+with `/-`. Read / write.
363+
364+**Examples:**
365+
366+```
367+~your-urbit:dojo> /- sole
368+```
369+Now we can use arms in sur/sole.hoon.
370+```
371+~your-urbit:dojo> `sole-effect:sole`[%bel ~]
372+```
373+
374+#### `now`
375+
376+The current (128-bit `@da`) time. Read-only.
377+
378+**Example:**
379+
380+```
381+~your-urbit:dojo> now
382+~2016.3.21..21.10.57..429a
383+```
384+
385+#### `our`
386+
387+The current urbit ship. Read-only.
388+
389+**Example:**
390+
391+```
392+~your-urbit:dojo> our
393+~your-urbit
394+```
395+
396+#### `eny`
397+
398+512 bits of entropy. Read-only.
399+
400+**Example:**
401+
402+```
403+~your-urbit:dojo> eny
404+\/0vnt.d474o.gpahj.jcf3o.448fh.2lamb.82ljm.8ol8u.b02vi.mrvvp.b7et2.knb7m.l8he\/
405+ 8.8qb9s.drm36.77n9b.a0qst.30g03.l5lb5.nvsbc.v39tn
406+\/
407+```
408+
409+### Troubleshooting
410+
411+If you encounter `%dy-edit-busy` while entering commands, it is
412+because your Dojo is blocked on a timer or an HTTP request. Type backspace
413+and your Dojo will end the blocked command.
content/using/os/ship-troubleshooting.mdnew file+213
@@ -0,0 +1,213 @@
1++++
2+title = "Ship Troubleshooting"
3+weight = 8
4+template = "doc.html"
5+aliases = ["docs/using/ship-troubleshooting/"]
6++++
7+
8+Urbit is still in the development stage, so there's a chance that your ship won't start properly, or will stop working properly when you're running it. That's ok! This document is intended to help you in such an event.
9+
10+This page contains resolutions to many of the most commonly encountered issues.
11+If your issue is not covered here, please check out our [Troubleshooting Knowledgebase](https://github.com/urbit/support/wiki).
12+
13+## Table of Contents
14+
15+- [Best practices](#best-practices)
16+- [Operation issues](#operation-issues)
17+- [Connectivity issues](#connectivity-issues)
18+- [Booting issues](#booting-issues)
19+- [Crashing issues](#crashing-issues)
20+
21+## Best Practices {#best-practices}
22+
23+An ounce of prevention is worth a pound of cure, so let's first go over some best practices to keep your ship in working order.
24+
25+### Only initialize your ship once
26+
27+Once your ship has been initialized (with the `-w` variation of the `./urbit` command), you should never do so a second time. If you do initialize it anew without special measures, you will experience trouble communicating with ships on the network you had talked to before.
28+
29+If you accidentally did this a second time, or want to intentionally start fresh, you need to perform a [personal breach](#personal-breach), which is explained in the next section.
30+
31+### Do not delete your pier
32+
33+Urbit is stateful, meaning that it needs to hold onto all your data. If you delete your pier and start your ship again, you won't be able to talk to any ship you've talked to before. The only solution to this is performing a [personal breach](#personal-breach).
34+
35+### Keep track of the directory that you put your ship in
36+
37+When you first start your ship, you should make sure you put it a place where you can find it again and where it won't get accidentally deleted.
38+
39+### Keep up-to-date builds
40+
41+Check for latest Urbit version at https://github.com/urbit/urbit/releases. If you're behind, update using [this guide](@/getting-started/_index.md#updating).
42+
43+### `|hi` your star to see if you're connected
44+
45+Find out who your star is by running `(sein:title our now our)` in the Dojo. Then, run `|hi ~star`, where `~star` is the star's name, and if things are working properly, you should get the message `hi ~star successful`. It could also be helpful to use `|hi` to check connectivity with `~zod` or another planet that you're in a Chat channel with.
46+
47+### Turn your ship off and on again
48+
49+Use `ctrl-d` to gracefully exit your ship, and then start it again. This can solve many issues.
50+
51+### Use the `|knob` command to customize your error messages
52+
53+Error messages can be by overwhelming, so the `|knob` command is intended to remedy this. It's used to silence errors that aren't important.
54+
55+The command takes two arguments, and comes in the form of `|knob %error-tag %level`.
56+
57+`%error-tag` is the name of the error in question. It's usually printed at the top of the stack trace, such as in `crud: %hole event failed` -- `%hole` here is an example of an error tag.
58+
59+`%level` determines how much you will see of errors with your chosen `%error-tag`. There are three levels:
60+
61+- `%hush`: no output.
62+- `%soft`: one line of output, just containing the error tag.
63+- `%loud`: full output.
64+
65+So for example, to silence all Ames packet-related errors, try `|knob %hole %hush`.
66+
67+### Perform a personal breach. {#personal-breach}
68+
69+A personal breach is when a ship tells the rest of the network to treat it as though the ship was just started for the first time again. Any ongoing or outstanding communication is forgotten and connections are reestablished from scratch.
70+
71+Personal breaches often fix connectivity issues, but should only be used as a
72+last resort. To find out how to perform a personal breach, check out our [Guide
73+to Breaches](@/using/id/guide-to-breaches.md). Before taking such a drastic measure, try
74+other methods in this guide. You can also ask for help on
75+in the Help channel in the Urbit Community group at `~bitbet-bolbel/urbit-community` or, failing that, in the `#ship-starting-support`
76+channel in our [Discord server](https://discord.gg/n9xhMdz).
77+
78+### Reset `+code`
79+**WARNING:** Do not reset your +code if you are using a hosted ship. You will be locked out. Please contact your hosting provider for more information.
80+
81+You login to Landscape using the camel-case phrase obtained from dojo by
82+entering `+code`. For security reasons you may wish to change this code
83+regularly. You may do so by entering `|code %reset` into dojo. Doing this
84+will prevent [Bridge](@/docs/glossary/bridge.md) from being able to derive your code,
85+meaning you will only be able to check it from dojo in the future.
86+
87+## Operation Issues {#operation-issues}
88+
89+### My urbit is frozen
90+
91+Sometimes this happens if you're processing a very large event, or if you're in an infinite loop, or for a variety of other reasons.
92+
93+Before doing anything, try waiting for a minute: an event might finish processing. If it doesn't clear up, then use the Unix kill-command, `ctrl-z`, to end your ship's process. Then restart your ship.
94+
95+### When I try to type into the Dojo, it prints `dy-noprompt`
96+
97+This happens when your Dojo is waiting on a request, such as an HTTP request. You can fix it simply by typing `backspace` or (`delete` on Mac).
98+
99+### My ship doesn't recognize file changes that I make in my pier
100+
101+Since version `0.8.0`, changes no longer automatically sync between the Unix side (your pier) and your ship. To sync your file changes, you must run `|commit %desk` in your Dojo, where `%desk` is the desk you'd like to sync.
102+
103+## Connectivity Issues {#connectivity-issues}
104+
105+### I can't communicate with anyone
106+
107+Maybe you booted your ship twice, or ran it using old files. If this is the case, you must perform a [personal breach](#personal-breach).
108+
109+### I don't have the latest OTA
110+
111+You can check what build your ship is on by entering `+trouble` into dojo and
112+reading the `%base` hash. If this does not match the latest hash published in
113+the `urbit-dev` mailing list, you are behind.
114+
115+Your sponsor may just be lagging behind, so sometimes this will resolve on its
116+own with patience. Otherwise, try the procedure outlined [here](https://github.com/urbit/support/wiki/Missing-OTA).
117+
118+### I keep getting an `ames` error stack-trace
119+
120+You may see a message like this one: `/~zod/home/~2019.7.22..18.55.46..83a3/sys/vane/ames:<[line column].[line column]>`. This is a clay path to a Hoon file, pointing to the line and column where an expression crashed. This kind of error might be accompanied by a `crud` message.
121+
122+This means that another ship is sending invalid packets to you. This could be because one of the ships has not updated the other ship's "life number", which is the number that starts at one and increments every time that ship performs a personal breach.
123+
124+This can happen if they have the wrong keys of yours, or if you have the wrong keys of theirs. You can figure out who has the wrong keys by running this scry command in your dojo: `.^(* %j /=life=/shipname)`, where shipname is the other ship's name. Save that information. Then, go to the [Azimuth contract on Etherscan](https://etherscan.io/address/0x223c067f8cf28ae173ee5cafea60ca44c335fecb#readContract), scroll down to `32. points`, and put in the hexadecimal representation of the other ship's `@p`. You can find the hexadecimal representation by running ...
125+
126+```
127+`@ux`~sampel-palnet
128+```
129+
130+... in the Dojo, where `~sampel-palnet` is the other ship's name. Then, compare it to the scry information that you saved. If that information matches up, it means that the other ship is the problem. If it **doesn't** match up, your ship has wrong information about the other ship. If you have such wrong information, you can fix this by running:
131+
132+```
133+:azimuth-tracker|listen ~ %app %azimuth-tracker
134+```
135+
136+The last line above syncs from an Ethereum node for _all_ ships on the network. If you only wanted to sync with certain ships, run:
137+
138+```
139+:azimuth-tracker|listen ~[~sampel-palnet ~zod ~marzod] %app %azimuth-tracker
140+```
141+
142+`~sampel-palnet ~zod ~marzod` are example ship-names; replace these with any number of desired ship-names.
143+
144+The above commands work if you have the wrong keys of other ships. If other ships have wrong keys of _yours_, you need to somehow ask them to to run such a command.
145+
146+### I can talk to some ships, but I can't talk to my sponsor and some other ships
147+
148+This is the result of deleting your pier and starting your ship again. To fix this, you must perform a [personal breach](#personal-breach).
149+
150+## Booting Issues {#booting-issues}
151+
152+### My ship booted for the first time, but it turned into a comet instead of my planet or star
153+
154+You may have used the wrong arguments when booting your ship for the first time. Delete this comet and try again.
155+
156+### My development ship ("fakezod") gets a `boot: malformed` failure
157+
158+This means that you gave your development ship an invalid `@p`. So, you will get this error if you write, for example, `urbit -F zodzod` instead of `urbit -F zod`.
159+
160+## Crashing Issues {#crashing-issues}
161+
162+### I got a `bail` error and my ship crashed
163+
164+Try bringing it back up; it will often start working just fine again.
165+
166+However, if you get a `bail` error again, this is a serious issue and should be reported (see below). It's advised to keep the old files around to assist issue research. If you want to get back on the network immediately, you might want to perform a [personal breach](#personal-breach).
167+
168+#### Making a GitHub issue out of your `bail`
169+
170+You can get help with you problem by creating an issue at [github.com/urbit/urbit](https://github.com/urbit/urbit/issues). But to make a good issue, you need to include some information.
171+
172+When your urbit crashes with a `bail`, you'll probably get a core dump, which is a file that contains the program state of your urbit when it crashed. On Mac, core dumps can be found in `/cores`. On Linux, cores can often be found in `/var/crash`, or the home directory.
173+
174+Navigate to the folder containing your core dumps. Find the most recent core dump by looking at the dates after you run `ls -l`. Then `lldb -c <corename>`. Once that loads, you'll be at an `(lldb)` prompt; type `bt` at this prompt. This will create a stack trace that looks like this:
175+
176+```
177+(lldb) bt
178+* thread #1, stop reason = signal SIGSTOP
179+ * frame #0: 0x000000010583d871 urbit`_box_free + 17
180+ frame #1: 0x0000000105845ee6 urbit`u3j_boot + 182
181+ frame #2: 0x000000010584d1f9 urbit`u3m_boot + 89
182+ frame #3: 0x000000010583d15d urbit`main + 2765
183+ frame #4: 0x00007fff75cb83d5 libdyld.dylib`start + 1
184+(lldb)
185+```
186+
187+Copy this stack trace and include it in your GitHub issue.
188+
189+### My ship crashed with a `bail: meme` error.
190+
191+This means that your ship ran out of memory.
192+
193+1. Make sure you are running the latest binary if you are not already on it.
194+
195+2. Restart your ship. If you don't crash again, everything may be fine.
196+
197+3. If you **do** crash again, try running the following after your ship has shut down:
198+ `./urbit-worker meld your-ship` (Replacing `your-ship` with the name/directory of your ship.)
199+ This will attempt to compact the memory of your ship. Note that this may use large amounts of memory on the machine you are running it on, and will be very slow if the machine has little memory available.
200+
201+4. If the above succeeds, but you still get `bail: meme` immediately, or after running for a little while, please [file an issue](https://github.com/urbit/urbit/issues). If you can, run `|mass` and share its output.
202+
203+5. As a last resort, you may perform a [personal breach](#personal-breach).
204+
205+### My ship crashed with a `bail: oops` error
206+
207+Restart your ship. These issues often just go away on their own. If this error repeats after restart two or more times, post the messages in an issue at [github.com/urbit/urbit](https://github.com/urbit/urbit/issues).
208+
209+This same error might also appear with a message like `Assertion '0'`.
210+
211+### My ship crashed with an `pier: work error` error
212+
213+This means that the Urbit worker process has shut down for one reason or another. Just restart your ship; this is not a notable or reportable error.
content/using/operations/stars-and-galaxies.md → content/using/os/stars-and-galaxies.mdrenamed+14−11
@@ -1,20 +1,21 @@
11+++
22title = "Star and Galaxy Operations"
33description = "Additional information and suggested ettiquette for Star and Galaxy owners."
4−weight = 3
4+weight = 4
55aliases = ["/docs/using/operating-a-star/"]
6−template = "page_indiced.html"
6+template = "doc.html"
77+++
88
9−To boot your galaxy or star, follow our [installation instructions](@/using/install.md).
9+To boot your galaxy or star, follow our [installation instructions](@/getting-started/_index.md).
1010
1111### Hosting your star
1212
13−If you plan to distribute planets in any capacity, you must keep your star running. If you fail to do so, those planets will become orphans that are unable to communicate with the network.
13+If you plan to distribute planets in any capacity, we ask that you keep your star
14+running. If you fail to do so, those planets will become orphans that are unable
15+to communicate with the network unless they transfer to a new star.
1416
15−To make this as simple as possible, we’re building Terraform-based tooling for star and planet hosting via Google Cloud Platform. Once it’s ready we’ll open source the tooling so you can host stars and planets for yourself and others.
16−
17−In the meantime, there are [existing instructions](@/using/install.md) for those familiar with booting a Linux instance on GCP, AWS, Digital Ocean, etc.
17+See our [cloud hosting instructions](@/using/running/hosting.md) for
18+instructions on settings up a Digital Ocean droplet.
1819
1920### Distributing planets
2021
@@ -26,16 +27,18 @@ By default, your star accepts software updates from its galaxy and routes them t
2627
2728#### Breaches
2829
29−To ensure new planets can connect to your ship, users are expected to participate in network-wide breaches by [updating to the latest Urbit version](@/using/install.md), deleting (or archiving) your pier, and then booting your ship using the new binary. If you don’t participate, you won’t be able to communicate with anyone on the network who has updated to the new era.
30+To ensure new planets can connect to your ship, users are expected to participate in network-wide breaches by [updating to the latest Urbit version](@/getting-started/_index.md), deleting (or archiving) your pier, and then booting your ship using the new binary. If you don’t participate, you won’t be able to communicate with anyone on the network who has updated to the new era.
3031
31−Network-wide breaches are distinct from personal breaches, wherein an individual ship cycles its personal network keys using bridge, and then follows the same steps outlined above.
32+Network-wide breaches are distinct from personal breaches, wherein an individual ship cycles its personal network keys using Bridge, and then follows the same steps outlined above.
3233
3334See our [Guide to Breaches](https://urbit.org/docs/tutorials/guide-to-breaches) for more information and for instructions on breaching.
3435
3536### Star-owner etiquette
3637
37−- If you distribute planets, boot and run your star on the Arvo network, or the planets won't be able to boot for the first time or connect.
38−- A star is networking infrastructure. For that reason, the machine running your star or galaxy must have sufficient bandwidth and processing power for your dependent planets.
38+- If you distribute planets, boot and run your star on the Arvo network, or the
39+ planets won't be able to boot for the first time or connect unless they
40+ transfer to a different star.
41+- A star is networking infrastructure. For that reason, the machine running your star or galaxy must have sufficient bandwidth, storage, and processing power for your dependent planets. Until event log pruning is implemented, expect ships to consume more disk space every year; stars looking to serve around 100 planets will want to ensure around 50GB of space per year of operation.
3942- When messaging others, communicate using your star only when speaking in an official/infrastructural capacity. Otherwise, use your personal planet.
4043
4144### Taxes
content/using/running/_index.mdnew file+16
@@ -0,0 +1,16 @@
1++++
2+title = "Running Urbit"
3+sort_by = "weight"
4+description = "How to run Urbit in various environments."
5+template = "sections/docs/chapters.html"
6+weight = 30
7++++
8+
9+Urbit can be run in a variety of contexts. Our [Getting Started
10+Guide](@/getting-started/_index.md) covers how to run an Urbit locally on your
11+computer; this section covers alternative ways of running Urbit.
12+
13+### [Cloud Hosting](@/using/running/hosting.md)
14+
15+This guide covers the provisioning and setup of a cloud server in Digital Ocean
16+running your Urbit. This enables your Urbit to be accessed from anywhere.
content/using/operations/hosting.md → content/using/running/hosting.mdrenamed+26−19
@@ -1,13 +1,12 @@
11+++
2−title = "Hosting Your Ship In The Cloud"
2+title = "Cloud Hosting"
33description = "How to host your ship in the cloud so you can access it from any device."
4−template = "page_indiced.html"
4+template = "doc.html"
55weight = 2
66[extra]
77hidetitle = "true"
88+++
99
10−## Hosting Your Ship In The Cloud
1110The goal of this guide is to have clear and easy to follow best practices for deploying an Urbit node to a server you control in the cloud. Deploying in the cloud allows you to access your Urbit from any device.
1211
1312Most Urbit users start out running their ship locally on one machine in order to play with it, but this means when your machine is offline your Urbit node is offline too (and can't get updates). You can also only access your Urbit from that one machine.
@@ -83,52 +82,60 @@ Continuing to follow the DO docs we're going to configure the ufw firewall.
8382 ```
8483 $ sudo ufw app list
8584 ```
86− - Next we'll configure ufw to allow connections via ssh and to allow Urbit to use the standard web port when the firewall is enabled.
85+
86+ - Next we'll configure ufw to allow connections via ssh and to allow Urbit to use the standard web port when the firewall is enabled,
87+ as well as opening a port that we'll later specify for your urbit to use to communicate directly with other ships.
8788 ```
8889 $ sudo ufw allow OpenSSH
8990 $ sudo ufw allow www
91+ $ sudo ufw allow https
92+ $ sudo ufw allow 34543/udp
9093 ```
94+ Note that you can choose any port in place of 34543 for Ames. Just be sure to pass the same port via the `-p` option when starting your ship.
95+
9196 - Next we'll turn on the firewall.
9297 ```
9398 $ sudo ufw enable
9499 ```
95− - To see the current the current firewall status use the following.
100+ - To see the current firewall status use the following.
96101 ```
97102 $ sudo ufw status
98103 ```
99104
100105## Installing Urbit
101−Finally we're ready to install Urbit on your very own server. This part is actually pretty easy, if you haven't installed Urbit locally then the instructions are the exact same as the ones in the Urbit [install doc](@/using/install.md). If you have a local ship already, we're going to install Urbit on the server and then send your local ship up.
102− - **WARN**: Since Urbit is p2p you don't want to ever run two copies of your ship simultaneously. This is because other nodes that interact with each of your copies will be confused by which one is the most up to date. If you end up accidentally doing this you'll have to do a 'personal breach' described in the [guide to breaches](@/docs/tutorials/guide-to-breaches.md) to fix things.
106+Finally we're ready to install Urbit on your very own server. This part is actually pretty easy, if you haven't installed Urbit locally then the instructions are the exact same as the ones in the Urbit [install doc](@/getting-started/_index.md). If you have a local ship already, we're going to install Urbit on the server and then send your local ship up.
107+ - **WARN**: Since Urbit is p2p you don't want to ever run two copies of your ship simultaneously. This is because other nodes that interact with each of your copies will be confused by which one is the most up to date. If you end up accidentally doing this you'll have to do a 'personal breach' described in the [guide to breaches](@/using/id/guide-to-breaches.md) to fix things.
103108 - The first thing you're going to want to do is shut down your local ship, either with control-d or `|exit` in dojo.
104− - Next we're going to install Urbit on the server and permit it to bind to the web port:
109+ - Next we're going to install Urbit on the server and permit it to bind to the web ports:
105110 ```
106111 $ ssh your_user@your_domain
107112 $ mkdir urbit
108113 $ cd urbit
109− $ curl -O https://bootstrap.urbit.org/urbit-v0.10.8-linux64.tgz
110− $ tar xzf urbit-v0.10.8-linux64.tgz
111− $ cd urbit-v0.10.8-linux64
114+ $ wget --content-disposition https://urbit.org/install/linux64/latest
115+ $ tar zxf ./linux64.tgz --strip=1
112116 $ sudo setcap 'cap_net_bind_service=+ep' urbit
113117 ```
114118 - Now we're going to tar up your local ship and send it to your server, from your local machine's urbit directory:
115119 ```
116120 $ tar -zcvf <ship_dir_name>.tar.gz <ship_dir_name>
117− $ scp <ship_dir_name>.tar.gz your_user@your_domain:/home/your_user/urbit
121+ $ scp <ship_dir_name>.tar.gz your_user@your_domain:urbit
118122 ```
119123 - Back on your server let's untar your ship and start it up with the Ames port we allowed through the firewall:
120124 ```
121125 $ ssh your_user@your_domain
122126 $ cd urbit
123127 $ tar -zxvf <ship_dir_name>.tar.gz
124− $ ./urbit-v0.10.8-linux64/urbit <ship_dir_name>
128+ $ ./urbit -p 34543 <ship_dir_name>
125129 ```
126− - Now we run a few commands in Dojo to request a Let’s Encrypt cert for your domain (replace `tld` with whatever your top-level domain is e.g. `com` in `example.com`:
130+ - Now we run a few commands in Dojo to request a Let’s Encrypt cert for your
131+ domain. Replace `tld` with whatever your top-level domain is e.g. `com` in
132+ `example.com`. `your_subdomain` is optional and that part of the command
133+ should be omitted if you are not using it):
127134 ```
128135 ~sampel-palnet:dojo> |start %acme
129− ~sampel-palnet:dojo> :acme &path /tld/your_domain
136+ ~sampel-palnet:dojo> :acme &path /tld/your_domain/your_subdomain
130137 ```
131− - Your ship should now be sailing on the digital ocean. Check `https://your_domain`, if everything is working properly you should see a login page.
138+ - Your ship should now be sailing on the digital ocean. Check `https://your_subdomain.your_domain.tld`, if everything is working properly you should see a login page.
132139 - Log in with the code from `+code` in dojo like normal and you should see all of your applications.
133140
134141## Leaving your Urbit running in a Screen session
@@ -139,7 +146,7 @@ Finally, to leave your Urbit running after you disconnect we can leave it in a S
139146 ```
140147 - This will start a screen session, we can now start up the Urbit ship from the `urbit` directory in this session:
141148 ```
142− $ ./urbit-v0.10.8-linux64/urbit <ship_dir_name>
149+ $ ./urbit <ship_dir_name>
143150 ```
144151 - Then we can disconnect from the screen session and leave the ship running with `control-a d`
145152 - To get back into the screen session:
@@ -159,7 +166,7 @@ On iOS you can save a website to your homescreen as an icon. If you do this for
159166 - [Digital Ocean Nginx Installation][DO Nginx Install]
160167 - [Digital Ocean Nginx Config][DO Nginx Config]
161168 - [Digital Ocean SSL Cert Setup][DO SSL Config]
162− - [Urbit Install Docs](@/using/install.md)
169+ - [Urbit Install Docs](@/getting-started/_index.md)
163170 - [Urbit Basic Cloud Install][Urbit Basic Cloud Install]
164171
165172 [Gandi]: https://www.gandi.net/
@@ -170,7 +177,7 @@ On iOS you can save a website to your homescreen as an icon. If you do this for
170177 [DO SSL Config]: https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04
171178 [Urbit Basic Cloud Install]: https://medium.com/@urbitlive/hello-world-urbit-edition-install-boot-and-run-your-urbit-planet-on-a-10-cloud-server-b9579745b9a8
172179 [DO Initial Setup]: https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04
173− [Blog Github]: https://github.com/zalberico/zalberico.github.io
180+ [Blog GitHub]: https://github.com/zalberico/zalberico.github.io
174181
175182If you plan to use Nginx as a reverse proxy for your Urbit, it is important that you include the following settings in your configuration in order to allow the Landscape web client to properly communicate with your Urbit:
176183 ```
content/voting-instructions.md+8−8
@@ -5,11 +5,11 @@ template = "page_indiced.html"
55hidetitle = "true"
66+++
77
8−## Arvo Stability Vote
8+## Urbit Continuity & Security Vote
99
10−As a galaxy owner, you have the opportunity to participate in one of the first votes conducted on the Azimuth network – a vote on whether Tlon has designated Arvo as stable, the second component in the [roadmap](https://github.com/urbit/azimuth/blob/master/proposals/0xcb1f81e42b5e75f000f94fc71a3ea70cab4bfc6f236b91e717f1b9516e5596b5.txt) embedded in Azimuth.
10+As a galaxy owner, you have the opportunity to participate in one of the first votes conducted on the Azimuth network – a vote on whether Tlon has designated the Urbit network as continuous and confirmed to be secure by a third-party auditer, the third component in the [roadmap](https://github.com/urbit/azimuth/blob/master/proposals/0xcb1f81e42b5e75f000f94fc71a3ea70cab4bfc6f236b91e717f1b9516e5596b5.txt) embedded in Azimuth.
1111
12−You can read more about this milestone [here](/blog/stable-arvo/).
12+You can read more about this milestone [here](/blog/security-and-continuity/).
1313
1414Below are instructions on how to support this document proposal.
1515
@@ -18,19 +18,19 @@ Below are instructions on how to support this document proposal.
1818- Log into [Bridge](https://bridge.urbit.org) with your Voting Proxy (you can use your Ownership Key as well, but that is probably harder to access)
1919- If you're presented with a list of assets, click on your galaxy.
2020- On the asset's overview screen, click Senate.
21−- The page will show a list of the documents that have previously achieved majority, as well as currently open polls. Tlon's latest proposal has the hash of `0x00000000000000000000000000000000000000000000000000000000000000a0`.
22−- For more information on the text of this proposal, see [here](https://github.com/urbit/azimuth/pull/24).
21+- The page will show a list of the documents that have previously achieved majority, as well as currently open polls. Tlon's latest proposal has the hash of `0x00000000000000000000000000000000000000000000000000000000000000e0`.
22+- For more information on the text of this proposal, see [here](https://github.com/urbit/azimuth/pull/34).
2323- Click "support" or "reject" under the hash, then "generate & sign transaction", then "send transaction", to vote on the proposal.
2424- If this proposal achieves majority support, you can see the result by coming back to this page.
2525
2626## Vote using Etherscan (or other explorers)
2727
28−- Read the document being proposed [here](https://github.com/urbit/azimuth/pull/24).
28+- Read the document being proposed [here](https://github.com/urbit/azimuth/pull/34).
2929- If you're going to use Etherscan, you need to have Metamask installed and authenticate with either your Voting Proxy or your Ownership Key.
30−- Create and sign a transaction using your Galaxy Ownership or Voting Proxy on the [Polls contract](https://etherscan.io/address/0x7fecab617c868bb5996d99d95200d2fa708218e4#writeContract) in castDocumentVote with your galaxy number, the document hash from the above document (`0x00000000000000000000000000000000000000000000000000000000000000a0`) and vote as "true" for yes and "false" for no.
30+- Create and sign a transaction using your Galaxy Ownership or Voting Proxy on the [Polls contract](https://etherscan.io/address/0x7fecab617c868bb5996d99d95200d2fa708218e4#writeContract) in castDocumentVote with your galaxy number, the document hash from the above document (`0x00000000000000000000000000000000000000000000000000000000000000e0`) and vote as "true" for yes and "false" for no.
3131- Submit the transaction.
3232
3333## Verify that this proposal has passed
3434
35−- The Polls contract is [here](https://etherscan.io/dapp/0x7fecab617c868bb5996d99d95200d2fa708218e4#readContract). Input the hash (`0x00000000000000000000000000000000000000000000000000000000000000a0`) into "documentHasAchievedMajority." If this returns "true," it means the proposal was passed by the galactic senate.
35+- The Polls contract is [here](https://etherscan.io/dapp/0x7fecab617c868bb5996d99d95200d2fa708218e4#readContract). Input the hash (`0x00000000000000000000000000000000000000000000000000000000000000e0`) into "documentHasAchievedMajority." If this returns "true," it means the proposal was passed by the galactic senate.
3636- If desired, you can verify the above is in fact the real Polls contract by checking "polls" [here](https://etherscan.io/dapp/ecliptic.eth#readContract).
netlify.toml+3−3
@@ -1,9 +1,9 @@
11[build]
22 publish = "public"
3− command = "curl -sL https://github.com/getzola/zola/releases/download/v0.8.0/zola-v0.8.0-x86_64-unknown-linux-gnu.tar.gz | tar zxv && ./zola build"
3+ command = "curl -sL https://github.com/getzola/zola/releases/download/v0.13.0/zola-v0.13.0-x86_64-unknown-linux-gnu.tar.gz | tar zxv && ./zola build"
44
55[build.environment]
6− ZOLA_VERSION = "0.8.0"
6+ ZOLA_VERSION = "0.13.0"
77
88[context.deploy-preview]
9− command = "curl -sL https://github.com/getzola/zola/releases/download/v0.8.0/zola-v0.8.0-x86_64-unknown-linux-gnu.tar.gz | tar zxv && ./zola build --base-url $DEPLOY_PRIME_URL"
9+ command = "curl -sL https://github.com/getzola/zola/releases/download/v0.13.0/zola-v0.13.0-x86_64-unknown-linux-gnu.tar.gz | tar zxv && ./zola build --base-url $DEPLOY_PRIME_URL"
sass/_events.scssnew file+82
@@ -0,0 +1,82 @@
1+.event .metadata > * {
2+
3+ &::after {
4+ content: ' / ';
5+ }
6+ &:nth-last-child(2)::after,
7+ &:nth-last-child(1)::after {
8+ content: '';
9+ }
10+}
11+
12+#event_months {
13+ ol {
14+ height: 0;
15+ overflow: hidden;
16+ &.current,
17+ &:hover {
18+ height: auto;
19+ }
20+ }
21+ li:hover ol {
22+ height: auto;
23+ }
24+ a.current {
25+ font-weight: bold;
26+ }
27+}
28+
29+// standalone event pages
30+
31+.event > h1 {
32+ text-align: center;
33+ font-size: 16pt;
34+ font-weight: 600;
35+ color: #FF9900;
36+ margin-top: 1.6rem;
37+ margin-bottom: 3.5rem;
38+}
39+
40+.event > h2 {
41+ display: block;
42+ text-align: center;
43+ font-size: 16pt;
44+ font-weight: 500;
45+ color: #CAA182;
46+ @media (min-width: 1024px) {
47+ width: 28rem;
48+ }
49+}
50+
51+.standalone #rsvp {
52+ display: block;
53+ width: 90%;
54+ @media (min-width: 1024px) {
55+ width: 20rem;
56+ }
57+ border-bottom-style: none;
58+ text-align: center;
59+ font-size: 16pt;
60+ font-weight: 700;
61+ color: #FF9900;
62+ margin: 4.4rem auto;
63+ padding: 2rem 1rem;
64+ background-color: rgba(255, 153, 0, 0.2);
65+ border-radius: 60px;
66+}
67+
68+.event > img {
69+ --tw-shadow: 0 16px 80px -5px rgb(241, 210, 175), 0 0px 10px -10px rgb(249, 167, 35);
70+box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
71+ border-radius: 32px;
72+ margin-bottom: 1.6rem;
73+ @media (min-width: 1024px) {
74+ border-radius: 48px;
75+ width: 36%;
76+ }
77+ width: 90%;
78+}
79+
80+.btc-orange {
81+ color: #FF9900;
82+}
sass/_main.scss+34−14
@@ -215,20 +215,21 @@ body.essay {
215215 img {
216216 display: block;
217217 }
218− div.footnote-definition {
219− &[id="1"] {
220− margin-top: 4rem;
221− padding-top: 2rem;
222− border-top: 1px solid black;
223− }
224− &:not([id="1"]) {
225− margin: 1rem 0;
226− }
227− p {
228− display: inline;
229− font-size: smaller;
230− }
231− }
218+}
219+
220+div.footnote-definition {
221+ &[id="0"] {
222+ margin-top: 4rem;
223+ padding-top: 2rem;
224+ border-top: 1px solid black;
225+ }
226+ &:not([id="0"]) {
227+ margin: 1rem 0;
228+ }
229+ p {
230+ display: inline;
231+ font-size: smaller;
232+ }
232233}
233234
234235// components
@@ -650,3 +651,22 @@ hr {
650651nav::-webkit-scrollbar {
651652 display: none;
652653}
654+
655+
656+// custom anchor styling
657+a.zola-anchor {
658+ visibility: hidden;
659+ padding: 0 0.1rem;
660+ &:hover {
661+ background-color: black;
662+ color: white;
663+ }
664+ &:after {content: '¶'}
665+}
666+
667+h1, h2, h3, h4, h5, h6 {
668+ &:hover > a.zola-anchor {
669+ visibility: visible;
670+ border-bottom-style: none;
671+ }
672+}
sass/styles.scss+1
@@ -1,2 +1,3 @@
11@import "main";
2+@import "events";
23@import "responsive";
static/_redirects+163−10
@@ -1,10 +1,163 @@
1−/docs/introduction /docs 301!
2−/docs/getting-started /using/install 301!
3−/docs/getting-started/azimuth /understanding-urbit/urbit-id 301!
4−/landscape /using/develop 301!
5−/docs/getting-started/using-a-star /using/operations/stars-and-galaxies/ 301!
6−/docs/bridge /using/operations/using-bridge/ 301!
7−/docs/pki /docs/concepts/azimuth/ 301!
8−/docs/arvo/internals/ /docs/tutorials/arvo/ 301!
9−/primer /understanding-urbit/ 301!
10−/install /using/install 301!
1+/primer /understanding-urbit/ 301!
2+/breach /reset 301!
3+/landscape /docs/development/develop 301!
4+/install /getting-started 301!
5+/install/mac/latest http://github.com/urbit/urbit/releases/latest/download/darwin.tgz
6+/install/linux64/latest http://github.com/urbit/urbit/releases/latest/download/linux64.tgz
7+/using/install /getting-started 301!
8+/using/planet /getting-started/planet 301!
9+/using/develop /docs/development/develop 301!
10+/using/integrating-api /docs/arvo/eyre/using-eyre 301!
11+/using/operations /using 301!
12+/using/operations/bridge /using/id/using-bridge 301!
13+/using/operations/hosting /using/running/hosting 301!
14+/using/operations/using-your-ship /using/os/getting-started 301!
15+/using/operations/stars-and-galaxies /using/os/stars-and-galaxies 301!
16+/using/operations/bridge-troubleshooting /using/os/bridge-troubleshooting 301!
17+/docs/getting-started/using-a-star /using/os/stars-and-galaxies/ 301!
18+/docs/bridge /using/id/using-bridge/ 301!
19+/docs/pki /docs/system-overview/azimuth 301!
20+/docs/getting-started/azimuth /understanding-urbit/urbit-id 301!
21+/docs/arvo/internals/ /docs/arvo/overview/ 301!
22+/docs/reference/vane-apis/airlock /docs/arvo/eyre/using-eyre 301!
23+/docs/introduction /docs 301!
24+/docs/getting-started /getting-started 301!
25+/docs/tutorials/concepts/technical-overview /docs/system-overview 301!
26+/docs/tutorials/ship-troubleshooting /using/os/ship-troubleshooting 301!
27+/docs/tutorials/creating-an-invite-pool /using/id/creating-an-invite-pool 301!
28+/docs/tutorials/guide-to-breaches/ /using/id/guide-to-breaches 301!
29+/docs/tutorials/arvo/arvo /docs/arvo/overview 301!
30+/docs/tutorials/arvo/ames /docs/arvo/ames/ames 301!
31+/docs/reference/vane-apis/ames /docs/arvo/ames/ames-api 301!
32+/docs/tutorials/arvo/behn /docs/arvo/behn/behn 301!
33+/docs/reference/vane-apis/behn /docs/arvo/behn/behn-api 301!
34+/docs/tutorials/arvo/clay /docs/arvo/clay/clay 301!
35+/docs/tutorials/arvo/dill /docs/arvo/dill/dill 301!
36+/docs/reference/vane-apis/dill /docs/arvo/dill/dill-api 301!
37+/docs/tutorials/arvo/eyre /docs/arvo/eyre/eyre 301!
38+/docs/tutorials/arvo/gall /docs/arvo/gall/gall 301!
39+/docs/reference/vane-apis/gall /docs/arvo/gall/gall-api 301!
40+/docs/reference/vane-apis/iris /docs/arvo/iris/iris-api 301!
41+/docs/reference/vane-apis/jael /docs/arvo/jael/jael-api 301!
42+/docs/tutorials/arvo/move-trace /docs/arvo/tutorials/move-trace 301!
43+/docs/tutorials/advanced-azimuth-tools /docs/azimuth/advanced-azimuth-tools 301!
44+/docs/tutorials/hoon/hoon-school/aqua /docs/hoon/guides/aqua 301!
45+/docs/tutorials/hoon/cli-tutorial /docs/hoon/guides/cli-tutorial 301!
46+/docs/tutorials/hoon/parsing /docs/hoon/guides/parsing 301!
47+/docs/tutorials/hoon/hoon-school/ackermann /docs/hoon/hoon-school/ackermann 301!
48+/docs/tutorials/hoon/hoon-school/arms-and-cores /docs/hoon/hoon-school/arms-and-cores 301!
49+/docs/tutorials/hoon/hoon-school/atoms-auras-and-simple-cell-types /docs/hoon/hoon-school/atoms-auras-and-simple-cell-types 301!
50+/docs/tutorials/hoon/hoon-school/bank-account /docs/hoon/hoon-school/bank-account 301!
51+/docs/tutorials/hoon/hoon-school/behn /docs/hoon/hoon-school/behn 301!
52+/docs/tutorials/hoon/hoon-school/caesar /docs/hoon/hoon-school/caesar 301!
53+/docs/tutorials/hoon/hoon-school/conditionals /docs/hoon/hoon-school/conditionals 301!
54+/docs/tutorials/hoon/hoon-school/doors /docs/hoon/hoon-school/doors 301!
55+/docs/tutorials/hoon/hoon-school/egg-timer /docs/hoon/hoon-school/egg-timer 301!
56+/docs/tutorials/hoon/hoon-school/fibonacci /docs/hoon/hoon-school/fibonacci 301!
57+/docs/tutorials/hoon/hoon-school/gall /docs/hoon/hoon-school/gall 301!
58+/docs/tutorials/hoon/hoon-school/gates /docs/hoon/hoon-school/gates 301!
59+/docs/tutorials/hoon/hoon-school/generators /docs/hoon/hoon-school/generators 301!
60+/docs/tutorials/hoon/hoon-school/hoon-syntax /docs/hoon/hoon-school/hoon-syntax 301!
61+/docs/tutorials/hoon/hoon-school/iron-polymorphism /docs/hoon/hoon-school/iron-polymorphism 301!
62+/docs/tutorials/hoon/hoon-school/lead-polymorphism /docs/hoon/hoon-school/lead-polymorphism 301!
63+/docs/tutorials/hoon/hoon-school/libraries /docs/hoon/hoon-school/libraries 301!
64+/docs/tutorials/hoon/hoon-school/lists /docs/hoon/hoon-school/lists 301!
65+/docs/tutorials/hoon/hoon-school/list-of-numbers /docs/hoon/hoon-school/list-of-numbers 301!
66+/docs/tutorials/hoon/hoon-school/molds /docs/hoon/hoon-school/molds 301!
67+/docs/tutorials/hoon/hoon-school/nouns /docs/hoon/hoon-school/nouns 301!
68+/docs/tutorials/hoon/hoon-school/recursion /docs/hoon/hoon-school/recursion 301!
69+/docs/tutorials/hoon/hoon-school/setup /docs/hoon/hoon-school/setup 301!
70+/docs/tutorials/hoon/hoon-school/structures-and-complex-types /docs/hoon/hoon-school/structures-and-complex-types 301!
71+/docs/tutorials/hoon/hoon-school/the-subject-and-its-legs /docs/hoon/hoon-school/the-subject-and-its-legs 301!
72+/docs/tutorials/hoon/hoon-school/trees-sets-and-maps /docs/hoon/hoon-school/trees-sets-and-maps 301!
73+/docs/tutorials/hoon/hoon-school/type-checking-and-type-inference /docs/hoon/hoon-school/type-checking-and-type-inference 301!
74+/docs/tutorials/hoon/hoon-school/type-polymorphism /docs/hoon/hoon-school/type-polymorphism 301!
75+/docs/tutorials/hoon/hoon-school/_index /docs/hoon/hoon-school/_index 301!
76+/docs/reference/hoon-expressions/advanced /docs/hoon/reference/advanced 301!
77+/docs/reference/hoon-expressions/basic /docs/hoon/reference/basic 301!
78+/docs/reference/cheat-sheet /docs/hoon/reference/cheat-sheet 301!
79+/docs/tutorials/hoon/hoon-errors /docs/hoon/reference/hoon-errors 301!
80+/docs/reference/hoon-expressions/irregular /docs/hoon/reference/irregular 301!
81+/docs/tutorials/hoon/hoon-school/style /docs/hoon/reference/style 301!
82+/docs/reference/hoon-expressions/limb/limb /docs/hoon/reference/limbs/limb 301!
83+/docs/reference/hoon-expressions/rune/bar /docs/hoon/reference/rune/bar 301!
84+/docs/reference/hoon-expressions/rune/buc /docs/hoon/reference/rune/buc 301!
85+/docs/reference/hoon-expressions/rune/cen /docs/hoon/reference/rune/cen 301!
86+/docs/reference/hoon-expressions/rune/col /docs/hoon/reference/rune/col 301!
87+/docs/reference/hoon-expressions/rune/constants /docs/hoon/reference/rune/constants 301!
88+/docs/reference/hoon-expressions/rune/dot /docs/hoon/reference/rune/dot 301!
89+/docs/reference/hoon-expressions/rune/ket /docs/hoon/reference/rune/ket 301!
90+/docs/reference/hoon-expressions/rune/lus /docs/hoon/reference/rune/lus 301!
91+/docs/reference/hoon-expressions/rune/mic /docs/hoon/reference/rune/mic 301!
92+/docs/reference/hoon-expressions/rune/sig /docs/hoon/reference/rune/sig 301!
93+/docs/reference/hoon-expressions/rune/terminators /docs/hoon/reference/rune/terminators 301!
94+/docs/reference/hoon-expressions/rune/tis /docs/hoon/reference/rune/tis 301!
95+/docs/reference/hoon-expressions/rune/wut /docs/hoon/reference/rune/wut 301!
96+/docs/reference/hoon-expressions/rune/zap /docs/hoon/reference/rune/zap 301!
97+/docs/reference/hoon-expressions/rune/_index /docs/hoon/reference/rune/_index 301!
98+/docs/reference/library/1a /docs/hoon/reference/stdlib/1a 301!
99+/docs/reference/library/1b /docs/hoon/reference/stdlib/1b 301!
100+/docs/reference/library/1c /docs/hoon/reference/stdlib/1c 301!
101+/docs/reference/library/2a /docs/hoon/reference/stdlib/2a 301!
102+/docs/reference/library/2b /docs/hoon/reference/stdlib/2b 301!
103+/docs/reference/library/2c /docs/hoon/reference/stdlib/2c 301!
104+/docs/reference/library/2d /docs/hoon/reference/stdlib/2d 301!
105+/docs/reference/library/2e /docs/hoon/reference/stdlib/2e 301!
106+/docs/reference/library/2f /docs/hoon/reference/stdlib/2f 301!
107+/docs/reference/library/2g /docs/hoon/reference/stdlib/2g 301!
108+/docs/reference/library/2h /docs/hoon/reference/stdlib/2h 301!
109+/docs/reference/library/2i /docs/hoon/reference/stdlib/2i 301!
110+/docs/reference/library/2j /docs/hoon/reference/stdlib/2j 301!
111+/docs/reference/library/2k /docs/hoon/reference/stdlib/2k 301!
112+/docs/reference/library/2l /docs/hoon/reference/stdlib/2l 301!
113+/docs/reference/library/2m /docs/hoon/reference/stdlib/2m 301!
114+/docs/reference/library/2n /docs/hoon/reference/stdlib/2n 301!
115+/docs/reference/library/2o /docs/hoon/reference/stdlib/2o 301!
116+/docs/reference/library/2p /docs/hoon/reference/stdlib/2p 301!
117+/docs/reference/library/2q /docs/hoon/reference/stdlib/2q 301!
118+/docs/reference/library/3a /docs/hoon/reference/stdlib/3a 301!
119+/docs/reference/library/3b /docs/hoon/reference/stdlib/3b 301!
120+/docs/reference/library/3c /docs/hoon/reference/stdlib/3c 301!
121+/docs/reference/library/3d /docs/hoon/reference/stdlib/3d 301!
122+/docs/reference/library/3e /docs/hoon/reference/stdlib/3e 301!
123+/docs/reference/library/3f /docs/hoon/reference/stdlib/3f 301!
124+/docs/reference/library/3g /docs/hoon/reference/stdlib/3g 301!
125+/docs/reference/library/4a /docs/hoon/reference/stdlib/4a 301!
126+/docs/reference/library/4b /docs/hoon/reference/stdlib/4b 301!
127+/docs/reference/library/4c /docs/hoon/reference/stdlib/4c 301!
128+/docs/reference/library/4d /docs/hoon/reference/stdlib/4d 301!
129+/docs/reference/library/4e /docs/hoon/reference/stdlib/4e 301!
130+/docs/reference/library/4f /docs/hoon/reference/stdlib/4f 301!
131+/docs/reference/library/4g /docs/hoon/reference/stdlib/4g 301!
132+/docs/reference/library/4h /docs/hoon/reference/stdlib/4h 301!
133+/docs/reference/library/4i /docs/hoon/reference/stdlib/4i 301!
134+/docs/reference/library/4j /docs/hoon/reference/stdlib/4j 301!
135+/docs/reference/library/4k /docs/hoon/reference/stdlib/4k 301!
136+/docs/reference/library/4l /docs/hoon/reference/stdlib/4l 301!
137+/docs/reference/library/4m /docs/hoon/reference/stdlib/4m 301!
138+/docs/reference/library/4n /docs/hoon/reference/stdlib/4n 301!
139+/docs/reference/library/4o /docs/hoon/reference/stdlib/4o 301!
140+/docs/reference/library/5a /docs/hoon/reference/stdlib/5a 301!
141+/docs/reference/library/5b /docs/hoon/reference/stdlib/5b 301!
142+/docs/reference/library/5c /docs/hoon/reference/stdlib/5c 301!
143+/docs/reference/library/5d /docs/hoon/reference/stdlib/5d 301!
144+/docs/reference/library/5e /docs/hoon/reference/stdlib/5e 301!
145+/docs/reference/library/5f /docs/hoon/reference/stdlib/5f 301!
146+/docs/reference/library/5g /docs/hoon/reference/stdlib/5g 301!
147+/docs/reference/library/table-of-contents /docs/hoon/reference/stdlib/table-of-contents 301!
148+/docs/reference/library/_index /docs/hoon/reference/stdlib/_index 301!
149+/docs/tutorials/concepts/arch /docs/landscape/overview 301!
150+/docs/tutorials/hoon/graph /docs/landscape/reference/graph-store 301!
151+/docs/tutorials/nock/definition /docs/nock/definition 301!
152+/docs/tutorials/nock/example /docs/nock/example 301!
153+/docs/tutorials/nock/explanation /docs/nock/explanation 301!
154+/docs/tutorials/nock/implementations /docs/nock/implementations 301!
155+/docs/tutorials/nock/_index /docs/nock/_index 301!
156+/docs/tutorials/vere/api /docs/vere/api 301!
157+/docs/tutorials/vere/c /docs/vere/c 301!
158+/docs/tutorials/vere/jetting /docs/vere/jetting 301!
159+/docs/tutorials/vere/nouns /docs/vere/nouns 301!
160+/docs/tutorials/vere/runtime /docs/vere/runtime 301!
161+/docs/tutorials/vere/_index /docs/vere/_index 301!
162+/docs/tutorials/concepts/azimuth /docs/azimuth/azimuth 301!
163+/docs/tutorials/advanced-azimuth-tools /docs/azimuth/advanced-azimuth-tools 301!
static/glossary.js+22−99
@@ -637,6 +637,13 @@ var glossary = [
637637 "link": "/docs/reference/hoon-expressions/rune/buc/",
638638 "desc": "Runes used for defining custom types."
639639 },
640+ {
641+ "name": "bucbar",
642+ "symbol": "$|",
643+ "usage": "Structures",
644+ "link": "/docs/reference/hoon-expressions/rune/buc/#bucbar",
645+ "desc": "<code>[%bsbr p=spec q=hoon]</code>: structure that satisfies a validator."
646+ },
640647 {
641648 "name": "buccab",
642649 "symbol": "$_",
@@ -735,6 +742,13 @@ var glossary = [
735742 "link": "/docs/reference/hoon-expressions/rune/mic/#miccol",
736743 "desc": "<code>[%mccl p=hoon q=(list hoon)]</code>: call a binary function as an n-ary function."
737744 },
745+ {
746+ "name": "micgal",
747+ "symbol": ";<",
748+ "usage": "Make",
749+ "link": "/docs/reference/hoon-expressions/rune/mic/#micgal",
750+ "desc": "<code>[%mcgl p=spec q=hoon r=hoon s=hoon]</code>: monadic do notation."
751+ },
738752 {
739753 "name": "miclus",
740754 "symbol": ";+",
@@ -893,128 +907,37 @@ var glossary = [
893907 "name": "fas",
894908 "symbol": "/",
895909 "usage": "Ford",
896− "link": "/docs/tutorials/arvo/ford/#ford-runes",
910+ "link": "/docs/arvo/ford/#ford-runes",
897911 "desc": "Runes specific to Ford, not considered to be Hoon runes."
898912 },
899913 {
900914 "name": "faslus",
901915 "symbol": "/+",
902916 "usage": "Ford",
903− "link": "/docs/tutorials/arvo/ford/#faslus",
917+ "link": "/docs/arvo/ford/#ford-runes",
904918 "desc": "Ford rune. Import from <code>lib/</code>"
905919 },
906920 {
907921 "name": "fashep",
908922 "symbol": "/-",
909923 "usage": "Ford",
910− "link": "/docs/tutorials/arvo/ford/#fashep",
924+ "link": "/docs/arvo/ford/#ford-runes",
911925 "desc": "Ford rune. Import from <code>sur/</code>"
912926 },
913− {
914− "name": "fassig",
915− "symbol": "/~",
916− "usage": "Ford",
917− "link": "/docs/tutorials/arvo/ford/#fassig",
918− "desc": "Ford rune. Twig by hand."
919− },
920− {
921− "name": "fasfas",
922− "symbol": "//",
923− "usage": "Ford",
924− "link": "/docs/tutorials/arvo/ford/#fasfas",
925− "desc": "Ford rune. Include a file by relative path."
926− },
927927 {
928928 "name": "fastis",
929929 "symbol": "/=",
930930 "usage": "Ford",
931− "link": "/docs/tutorials/arvo/ford/#fastis",
931+ "link": "/docs/arvo/ford/#ford-runes",
932932 "desc": "Ford rune. Wrap a face around an included horn."
933933 },
934934 {
935− "name": "fascol",
936− "symbol": "/:",
935+ "name": "fastar",
936+ "symbol": "/*",
937937 "usage": "Ford",
938− "link": "/docs/tutorials/arvo/ford/#fascol",
939− "desc": "Ford rune. Evaluate at path, and <code>/mark/</code> at current path"
938+ "link": "/docs/arvo/ford/#ford-runes",
939+ "desc": "Ford rune. Import file, convert to mark, and wrap a face."
940940 },
941− {
942− "name": "faszap",
943− "symbol": "/!",
944− "usage": "Ford",
945− "link": "/docs/tutorials/arvo/ford/#faszap",
946− "desc": "Ford rune. <code>/!mark/</code> evaluates as Hoon, then passes through mark."
947− },
948− {
949− "name": "faspam",
950− "symbol": "/&",
951− "usage": "Ford",
952− "link": "/docs/tutorials/arvo/ford/#faspam",
953− "desc": "Ford rune. Pass through a series of marks."
954− },
955− {
956− "name": "fasbar",
957− "symbol": "/|",
958− "usage": "Ford",
959− "link": "/docs/tutorials/arvo/ford/#fasbar",
960− "desc": "Ford rune. Short-circuiting 'or' "
961− },
962− {
963− "name": "fascab",
964− "symbol": "/_",
965− "usage": "Ford",
966− "link": "/docs/tutorials/arvo/ford/#fascab",
967− "desc": "Ford rune. Runs horns on files in the current directory."
968− },
969− {
970− "name": "fasmic",
971− "symbol": "/;",
972− "usage": "Ford",
973− "link": "/docs/tutorials/arvo/ford/#fasmic",
974− "desc": "Ford rune. Operate on."
975− },
976− {
977− "name": "fascom",
978− "symbol": "/,",
979− "usage": "Ford",
980− "link": "/docs/tutorials/arvo/ford/#fascom",
981− "desc": "Ford rune. Switch by path."
982− },
983− {
984− "name": "fasdot",
985− "symbol": "/.",
986− "usage": "Ford",
987− "link": "/docs/tutorials/arvo/ford/#fasdot",
988− "desc": "Ford rune. Produces a list from a sequence of horns."
989− },
990− {
991− "name": "fasket",
992− "symbol": "/^",
993− "usage": "Ford",
994− "link": "/docs/tutorials/arvo/ford/#fasket",
995− "desc": "Ford rune. Casts the result of a horn to a mold."
996− },
997− {
998− "name": "fashax",
999− "symbol": "/#",
1000− "usage": "Ford",
1001− "link": "/docs/tutorials/arvo/ford/#fashax",
1002− "desc": "Ford rune. Inserts a dependency hash."
1003− },
1004− {
1005− "name": "fasbuc",
1006− "symbol": "/$",
1007− "usage": "Ford",
1008− "link": "/docs/tutorials/arvo/ford/#fasbuc",
1009− "desc": "Ford rune. Process extra arguments."
1010− },
1011− {
1012− "name": "fascen",
1013− "symbol": "/%",
1014− "usage": "Ford",
1015− "link": "/docs/tutorials/arvo/ford/#fascen",
1016− "desc": "Ford rune. Propagate extra arguments into renderers."
1017− },
1018941 // glossary starts here
1019942 {
1020943 "name": "ames",
static/scripts.js+53−12
@@ -371,13 +371,50 @@ if (window.location.href.includes("docs")) {
371371 docsNavScroll();
372372}
373373
374+var getParents = function (elem, selector) {
375+
376+ // Element.matches() polyfill
377+ if (!Element.prototype.matches) {
378+ Element.prototype.matches =
379+ Element.prototype.matchesSelector ||
380+ Element.prototype.mozMatchesSelector ||
381+ Element.prototype.msMatchesSelector ||
382+ Element.prototype.oMatchesSelector ||
383+ Element.prototype.webkitMatchesSelector ||
384+ function(s) {
385+ var matches = (this.document || this.ownerDocument).querySelectorAll(s),
386+ i = matches.length;
387+ while (--i >= 0 && matches.item(i) !== this) {}
388+ return i > -1;
389+ };
390+ }
391+
392+ // Set up a parent array
393+ var parents = [];
394+
395+ // Push each parent element to the array
396+ for ( ; elem && elem !== document; elem = elem.parentNode ) {
397+ if (selector) {
398+ if (elem.matches(selector)) {
399+ parents.push(elem);
400+ }
401+ continue;
402+ }
403+ parents.push(elem);
404+ }
405+
406+ // Return our parent array
407+ return parents;
408+
409+};
410+
411+
412+
413+
374414// same-page navigation on-scroll behaviour
375415
376−if (document.body.classList.contains("page-indiced")) {
377− let h2 = document.getElementsByTagName("h2");
378− let h3 = document.getElementsByTagName("h3");
379− let all = document.querySelectorAll("nav li a");
380− let headers = document.querySelectorAll("details summary");
416+if (document.body.classList.contains("page-indiced") || document.getElementById("event_months")) {
417+ let all = document.querySelectorAll("nav.fixed-xl li a");
381418
382419 // smooth scrolling on click
383420 all.forEach(link => {
@@ -391,26 +428,30 @@ if (document.body.classList.contains("page-indiced")) {
391428 });
392429 });
393430
394− let lastId;
395− let cur = [];
396−
397431 window.addEventListener("scroll", event => {
398432 let fromTop = window.scrollY;
399−
433+ let current;
400434 all.forEach(link => {
435+ if (!link.hash) return;
401436 let section = document.querySelector(link.hash);
402437 let sectionChildren = document.querySelector(link.hash).nextElementSibling;
438+ if (!sectionChildren) sectionChildren = section;
403439
404440 if (
405441 ((section.offsetTop <= fromTop) ||
406442 (sectionChildren.offsetTop <= fromTop)) &&
407443 (section.offsetTop + section.offsetHeight + sectionChildren.offsetHeight > fromTop)
444+ && !current
408445 ) {
409− link.classList.add("current");
410− } else {
411− link.classList.remove("current");
446+ current = link;
412447 }
413448 });
449+ if (current) {
450+ Array.from(document.querySelectorAll('.current')).forEach(current => current.classList.remove('current'));
451+ const parents = getParents(current, 'ol');
452+ current.classList.add('current');
453+ parents.forEach(current => current.classList.add('current'));
454+ }
414455 })
415456};
416457
syntaxes/scheme.sublime-syntaxnew file+566
@@ -0,0 +1,566 @@
1+%YAML 1.2
2+---
3+# http://www.sublimetext.com/docs/3/syntax.html
4+#
5+# `Scheme` Language Reference:
6+#
7+# source: https://github.com/absop/Scheme
8+
9+name: Scheme
10+file_extensions:
11+ - ms
12+ - rkt
13+ - sc
14+ - scm
15+ - ss
16+ - scheme
17+scope: source.scheme
18+
19+variables:
20+ boundary: '[\(\[\s\]\)]'
21+ aux_keyword: \.\.\.|#[,'`;]|['`](?!\(\))|(?<=[\(\[\s\]\)])_(?=[\(\[\s\]\)])|,@?|=>|(?<=[\(\[\s])\.(?=\s)
22+ identifier: (?:[^({\[#"'`,;\\\s\]})]|\\[({\[#"'`,;\\\s\]})]|\\x\h*;)+
23+ syntax_keyword: \&assertion|\&condition|\&continuation|\&error|\&format|\&i/o|\&i/o-decoding|\&i/o-encoding|\&i/o-file-already-exists|\&i/o-file-does-not-exist|\&i/o-file-is-read-only|\&i/o-file-protection|\&i/o-filename|\&i/o-invalid-position|\&i/o-port|\&i/o-read|\&i/o-write|\&implementation-restriction|\&irritants|\&lexical|\&message|\&no-infinities|\&no-nans|\&non-continuable|\&serious|\&source|\&syntax|\&undefined|\&violation|\&warning|\&who|alias|begin|case|case-lambda|cond|do|else|eval-when|export|extend-syntax|fields|for-each|guard|ieee|if|import|immutable|mutable|include|let(?:-syntax|\*?-values)|letrec-syntax|library|meta|meta-cond|module|nongenerative|only|opaque|parent|parent-rtd|protocol|quasiquote|quasisyntax|quote|r6rs:case|rec|record-case|scheme|sealed|set!|syntax(?:-case)?|unless|when|with-(syntax|implicit)|type-descriptor|record-type-descriptor
24+ definitioner: define(?:-(?:enumeration|structure|syntax|ftype|record(?:-type)?|property|top-level-(value|syntax)|condition-type|values))?
25+ operator_comparsion: (?:[<>]=?|=)
26+ operator_arithmetic: (?:[+*/-]|1[+-])
27+ operator_logical: (?:and|or|not|log(?:and|[ix]or|or))
28+
29+contexts:
30+ main:
31+ - include: sexpr
32+ - include: comments
33+ - include: source-control
34+ - include: strings
35+ - include: constants
36+
37+ source-control:
38+ - match: ^\s*#!eof(?=[\{\[\(#,;\s"`'\)\]\}])
39+ scope: keyword.control.end-of-file.scheme
40+ push:
41+ - meta_scope: comment.block.scheme
42+ - match: (#!(?:r6rs|bwp|chezscheme|(no-)?fold-case|base-rtd))(?=[\(\[\s\]\)])
43+ scope: keyword.control.language.scheme
44+
45+ - match: ^\s*#!eof\S
46+ scope: invalid.deprecated.scheme
47+
48+ sexpr:
49+ - include: quote
50+ - match: \(
51+ scope: punctuation.brackets.scheme
52+ push: round-brackets
53+
54+ - match: \[
55+ scope: punctuation.brackets.scheme
56+ push: square-brackets
57+
58+ - match: \#\{
59+ scope: storage.modifier.gensym.begin.scheme
60+ push:
61+ - meta_scope: variable.gensym.scheme
62+ - match: \}
63+ scope: storage.modifier.gensym.end.scheme
64+ pop: true
65+ - include: match-type
66+
67+ - match: \)
68+ scope: invalid.deprecated.scheme
69+ - match: \]
70+ scope: invalid.deprecated.scheme
71+ - match: \}
72+ scope: invalid.deprecated.scheme
73+
74+ round-brackets:
75+ - match: \)
76+ scope: punctuation.brackets.scheme
77+ pop: true
78+ - include: match-type
79+ - include: sexpr
80+
81+ square-brackets:
82+ - match: \]
83+ scope: punctuation.brackets.scheme
84+ pop: true
85+ - include: match-type
86+ - include: sexpr
87+
88+ non-bracket:
89+ - include: quote
90+ - include: comments
91+ - include: aux-keywords
92+ - include: type-prefix
93+ - include: strings
94+ - include: constants
95+ - include: variable
96+
97+ match-type:
98+ - include: comments
99+ - include: primitive-procedures
100+ - include: type-prefix
101+ - include: strings
102+ - include: constants
103+ - include: quote
104+ - include: define-record
105+ - include: defines
106+ - include: lambda
107+ - include: syntax-match
108+ - include: cond
109+ - include: let-expr
110+ # - include: module
111+ - include: control
112+ - include: operators
113+ - include: support-functions-symbols
114+ - include: procedure
115+ - include: variable
116+
117+ # module:
118+ # - match: (module)\s*({{identifier}})*\s*\(
119+ # captures:
120+ # 1: keyword.control.scheme
121+ # 2: storage.scheme
122+ # push:
123+ # - match: \(
124+ # scope: punctuation.brackets.scheme
125+ # push:
126+ # - match: \)
127+ # scope: punctuation.brackets.scheme
128+ # pop: true
129+ # - include: support-functions-symbols
130+ # - match: ({{identifier}})
131+ # scope: entity.name.function.scheme
132+ # - include: support-functions-symbols
133+ # - match: ({{identifier}})
134+ # scope: entity.name.function.scheme
135+ # - match: \)
136+ # pop: true
137+
138+ quote:
139+ - match: (['`])\s*({{identifier}}|[{}])
140+ captures:
141+ 1: keyword.control.aux.quote.scheme
142+ 2: variable.symbol.scheme
143+ - match: (['`])(\()
144+ captures:
145+ 1: keyword.control.aux.quote.scheme
146+ 2: punctuation.section.quote.scheme
147+ push:
148+ - match: \)
149+ scope: punctuation.section.quote.scheme
150+ pop: true
151+ - include: constants
152+ - include: aux-keywords
153+ - match: ({{identifier}})
154+ scope: variable.symbol.scheme
155+ - include: match-type
156+ - include: sexpr
157+
158+ type-prefix:
159+ - match: (#[0-9]*(vu8|vfx)?)(?=\()
160+ scope: storage.modifier.vector.scheme
161+ push: odinary-vaiable-list
162+ - match: (#&)(?=\()
163+ scope: storage.modifier.boxes.scheme
164+ push: odinary-vaiable-list
165+ - match: (#&)
166+ scope: storage.modifier.boxes.scheme
167+ - match: (#@)
168+ scope: storage.modifier.fasl.scheme
169+ - match: (#[0-9]+=)
170+ scope: storage.modifier.pair.scheme
171+ # - match: (#[0-9]+#)
172+ # scope: variable.datum.scheme
173+
174+ odinary-vaiable-list:
175+ - match: \(
176+ scope: punctuation.section.scheme
177+ set:
178+ - match: \)
179+ scope: punctuation.section.scheme
180+ pop: true
181+ - include: constants
182+ - include: type-prefix
183+ - include: aux-keywords
184+ # - include: operators
185+ # - include: support-functions-symbols
186+ - include: variable
187+ - include: sexpr
188+ - include: comments
189+
190+ cond:
191+ - match: (\()(cond)(?=[\[\(\s*])
192+ captures:
193+ 1: punctuation.brackets.cond.begin.scheme
194+ 2: keyword.control.cond.scheme
195+ push:
196+ - match: \)
197+ scope: punctuation.brackets.cond.end.scheme
198+ pop: true
199+ - match: \[
200+ scope: punctuation.section.cond.begin.scheme
201+ push:
202+ - match: \]
203+ scope: punctuation.section.cond.end.scheme
204+ pop: true
205+ - include: constants
206+ - include: sexpr
207+ - include: match-type
208+ - match: \(
209+ scope: punctuation.section.cond.begin.scheme
210+ push:
211+ - match: \)
212+ scope: punctuation.section.cond.end.scheme
213+ pop: true
214+ - include: constants
215+ - include: sexpr
216+ - include: match-type
217+ - include: comments
218+
219+ - match: \]
220+ scope: invalid.deprecated.scheme
221+ - match: \)
222+ scope: invalid.deprecated.scheme
223+
224+
225+ define-record:
226+ - match: (?<=[\(\[])\s*(define-record)(?=[\(\[\s])
227+ captures:
228+ 1: keyword.control.scheme
229+ push: define-record-type
230+
231+ define-record-type:
232+ - match: ({{identifier}})
233+ scope: entity.name.type.scheme
234+ set: variable-list
235+
236+ variable-list:
237+ - match: \(
238+ scope: punctuation.brackets.scheme
239+ set:
240+ - match: \)
241+ scope: punctuation.brackets.scheme
242+ pop: true
243+ - include: variable
244+ - include: sexpr
245+
246+ defines:
247+ - match: (?<=[\(\[])\s*({{definitioner}})(?=[\(\[\s])
248+ captures:
249+ 1: keyword.control.scheme
250+ push: define-name
251+
252+ - match: (set!)\s+({{identifier}})
253+ captures:
254+ 1: keyword.control.syntax.scheme
255+ 2: entity.name.function.scheme # for goto symbol
256+ - match: (set!)\s+({{aux_keyword}})\s*({{identifier}})
257+ captures:
258+ 1: keyword.control.syntax.scheme
259+ 2: keyword.control.aux.scheme
260+ 3: entity.name.function.scheme # for goto symbol
261+
262+ define-name:
263+ - match: ({{identifier}})
264+ scope: entity.name.function.scheme # for goto symbol
265+ pop: true
266+ - match: \(
267+ scope: punctuation.brackets.scheme
268+ set:
269+ - match: ({{identifier}})
270+ scope: entity.name.function.scheme
271+ set:
272+ - match: \)
273+ scope: punctuation.brackets.scheme
274+ pop: true
275+ - include: parameters
276+ - match: '"'
277+ scope: punctuation.definition.string.begin.scheme
278+ set:
279+ - meta_scope: invalid.illegal.scheme string.quoted.double.scheme
280+ - match: '"'
281+ scope: punctuation.definition.string.end.scheme
282+ pop: true
283+ - include: string-escaped-char
284+
285+ syntax-match:
286+ - match: (?<=[\(\[])\s*(syntax-(?:rules|case))(?=[\(\[\s])
287+ captures:
288+ 1: keyword.control.scheme
289+ push:
290+ - match: \(
291+ scope: punctuation.section.parameter.scheme
292+ set:
293+ - match: \)
294+ scope: punctuation.section.parameter.scheme
295+ pop: true
296+ - include: aux-keywords
297+ - include: parameters
298+ - include: sexpr
299+ - match: ({{identifier}})
300+ scope: variable.syntax.scheme
301+
302+ lambda:
303+ - match: (?<=[\(\[])\s*(lambda)(?=[\(\[\s])
304+ captures:
305+ 1: keyword.control.scheme
306+ push:
307+ - include: aux-keywords
308+ - match: ({{identifier}})
309+ scope: variable.parameter.scheme
310+ pop: true
311+ - include: parameter-list
312+
313+ parameter-list:
314+ - match: \(
315+ scope: punctuation.section.parameter.scheme
316+ set:
317+ - match: \)
318+ scope: punctuation.section.parameter.scheme
319+ pop: true
320+ - include: aux-keywords
321+ - include: parameters
322+ - include: sexpr
323+
324+ aux-keywords:
325+ - match: ({{aux_keyword}})
326+ scope: keyword.control.aux.scheme
327+
328+ parameters:
329+ - match: ({{identifier}})
330+ scope: variable.parameter.scheme
331+
332+ variable:
333+ - match: ({{identifier}})
334+ scope: variable.datum.scheme
335+
336+ let-expr:
337+ - match: (?<=[\(\[])\s*(do|let(?:\*|rec\*?|syntax)?|fluid-let(?:-syntax)?)(?=[\(\[\s])
338+ captures:
339+ 1: keyword.control.scheme
340+ push: let-bodies
341+
342+ let-bodies:
343+ - match: ([^\(\[\]\)])*(?=[\]\)])
344+ scope: variable.datum.scheme
345+ pop: true
346+ - match: ({{aux_keyword}})
347+ scope: keyword.control.aux.scheme
348+ pop: true
349+ - match: ({{identifier}})
350+ scope: entity.name.function.scheme
351+ set: let-variable-list
352+ - include: let-variable-list
353+ # - include: sexpr
354+
355+ let-variable-list:
356+ - match: (?=,\s*[\[\(])
357+ push: match-type
358+ - match: \(
359+ scope: punctuation.brackets.scheme
360+ set:
361+ - include: comments
362+ - match: \)
363+ scope: punctuation.brackets.scheme
364+ pop: true
365+ - include: let-variable
366+
367+ let-variable:
368+ - match: (\[)\s*({{aux_keyword}})?({{identifier}})?
369+ captures:
370+ 1: punctuation.section.parameter.scheme
371+ 2: keyword.control.scheme
372+ 3: variable.parameter.scheme
373+ push:
374+ - match: (\])
375+ scope: punctuation.section.parameter.scheme
376+ pop: true
377+ - include: non-bracket
378+ - include: sexpr
379+ - match: (\()\s*({{aux_keyword}})?({{identifier}})?
380+ captures:
381+ 1: punctuation.section.parameter.scheme
382+ 2: keyword.control.scheme
383+ 3: variable.parameter.scheme
384+ push:
385+ - match: (\))
386+ scope: punctuation.section.parameter.scheme
387+ pop: true
388+ - include: non-bracket
389+ - include: sexpr
390+ - match: ({{aux_keyword}})?({{identifier}})?
391+ captures:
392+ 1: keyword.control.scheme
393+ 2: variable.datum.scheme
394+ - match: \]
395+ scope: invalid.deprecated.scheme
396+ - match: \)
397+ scope: invalid.deprecated.scheme
398+
399+
400+ control:
401+ - match: (?<=[\(\[])\s*({{syntax_keyword}})(?=[\(\[\s\]\)])
402+ captures:
403+ 1: keyword.control.scheme
404+ - include: aux-keywords
405+
406+ procedure:
407+ - match: (?<=[\(\[])\s*({{identifier}})(?=[\(\[\s\]\)])
408+ captures:
409+ 1: procedure.datum.scheme
410+
411+ primitive-procedures:
412+ - match: '#(%|2%|3%)'
413+ scope: keyword.control.optimize-level.scheme
414+ push:
415+ - match: ({{identifier}})
416+ scope: procedure.primitive.scheme
417+ pop: true
418+
419+ operators:
420+ - match: (?<=[\(\[])\s*{{operator_comparsion}}(?=[\(\[\s\]\)])
421+ scope: keyword.operator.comparison.scheme
422+ - match: (?<=[\(\[])\s*{{operator_arithmetic}}(?=[\(\[\s\]\)])
423+ scope: keyword.operator.arithmetic.scheme
424+ - match: (?<=[\(\[])\s*{{operator_logical}}(?=[\(\[\s\]\)])
425+ scope: keyword.operator.logical.scheme
426+
427+ constants:
428+ - include: numbers
429+ - match: (['`]\(\)|#t|#f)(?=[\(\[\s\]\)])
430+ scope: constant.language.scheme
431+ - match: (#\\x)(?:\h+)(?=[\(\[\s\]\)])
432+ scope: constant.character.numeric.scheme
433+ captures:
434+ 1: storage.modifier.character.scheme
435+ - match: (#\\0)(?:[0-7]{2})(?=[\(\[\s\]\)])
436+ scope: constant.character.scheme
437+ captures:
438+ 1: storage.modifier.character.scheme
439+ - match: (#\\)(?:alarm|backspace|delete|esc|linefeed|newline|page|return|space|tab|bel|ls|nel|nul|rubout|vt|vtab|[ \S])(?=[\(\[\s\]\)])
440+ scope: constant.character.scheme
441+ captures:
442+ 1: storage.modifier.character.scheme
443+ - match: (#\\\S)(?=[^\{\(\[\s\]\)\}])
444+ scope: invalid.deprecated.scheme
445+ # - match: (#{{identifier}})(?=[\(\[\s\]\)])
446+ # scope: invalid.deprecated.scheme
447+
448+ # (inf|nan)\.0
449+ # binary-number:
450+ # - match: ([-\+]?(([01]+(\.[01]*|/[01]+)?)|\.[01]+)([eE][-\+]?[01]+)?)
451+ # scope: constant.numeric.binary.scheme
452+ # octonary-number:
453+ # - match: ([-\+]?(([0-7]+(\.[0-7]*|/[0-7]+)?)|\.[0-7]+)([eE][-\+]?[0-7]+)?)
454+ # scope: constant.numeric.octonary.scheme
455+ # decimal-number:
456+ # - match: ([-\+]?(([0-9]+(\.[0-9]*|/[0-9]+)?)|\.[0-9]+)([eE][-\+]?[0-9]+)?)
457+ # scope: constant.numeric.decimal.scheme
458+ # hexadecimal-number:
459+ # - match: ([-\+]?[0-9a-fA-F]+[\./]?[0-9a-fA-F]*)
460+ # scope: constant.numeric.hexadecimal.scheme
461+ # force-number-change:
462+ # - match: (#[eEiI])
463+ # scope: prefix.constant.numeric.force.scheme
464+
465+ numbers:
466+ # 2
467+ - match: (#[bB](?:#[eEiI])?|#[eEiI]#[bB])(?:[-\+]?(?:(?:[01]+(?:\.[01]*|/[01]+)?)|\.[01]+)(?:[eE][-\+]?[01]+)?)(?=[\(\[\s\]\)])
468+ scope: constant.numeric.binary.scheme
469+ captures:
470+ 1: storage.modifier.numeric.scheme
471+ # 8
472+ - match: (#[oO](?:#[eEiI])?|#[eEiI]#[oO])(?:[-\+]?(?:(?:[0-7]+(?:\.[0-7]*|/[0-7]+)?)|\.[0-7]+)(?:[eE][-\+]?[0-7]+)?)(?=[\(\[\s\]\)])
473+ scope: constant.numeric.octal.scheme
474+ captures:
475+ 1: storage.modifier.numeric.scheme
476+ # 10
477+ - match: (#[dD](?:#[eEiI])?|#[eEiI](?:#[dD])?)?(?:[-\+]?(?:(?:[0-9]+(?:\.[0-9]*|/[0-9]+)?)|\.[0-9]+)(?:[eE][-\+]?[0-9]+)?)(?=[\(\[\s\]\)])
478+ scope: constant.numeric.decimal.scheme
479+ captures:
480+ 1: storage.modifier.numeric.scheme
481+ # 16
482+ - match: (#[xX](?:#[eEiI])?|#[eEiI]#[xX])(?:[-\+]?[0-9a-fA-F]+[\./]?[0-9a-fA-F]*)(?=[\(\[\s\]\)])
483+ scope: constant.numeric.hex.scheme
484+ captures:
485+ 1: storage.modifier.numeric.scheme
486+ # #<2..36>r
487+ - match: (#(?:0?[2-9]|[1-3][0-6])[rR](?:#[eEiI])?|#[eEiI]#(?:0?[2-9]|[1-3][0-6])[rR])(?:[-\+]?[0-9a-zA-Z]+\.?[0-9a-zA-Z]*)(?=[\(\[\s\]\)])
488+ scope: constant.numeric.various.scheme
489+ captures:
490+ 1: storage.modifier.numeric.scheme
491+ # - match: (#([bB]|[oO]|[dD]|[xX]|[0-9]*[rR])[^{{boundary-chars}}]*)(?=[\(\[\s\]\)])
492+ # scope: invalid.deprecated.scheme
493+
494+ strings:
495+ - match: '"'
496+ scope: punctuation.definition.string.begin.scheme
497+ push:
498+ - meta_scope: string.quoted.double.scheme
499+ - match: '"'
500+ scope: punctuation.definition.string.end.scheme
501+ pop: true
502+ - include: string-escaped-char
503+ - include: string-placeholder
504+
505+ string-escaped-char:
506+ - match: '(\\)$\n'
507+ captures:
508+ 1: punctuation.separator.continuation.scheme
509+ - match: \\(?:\\|[abefnrtv\'"?]|[0-3][0-9]{0,2}|[4-7][0-9]?|x[a-fA-F0-9]+|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8})
510+ scope: constant.character.escape.scheme
511+ - match: \\.
512+ scope: invalid.illegal.unknown-escape.scheme
513+
514+ string-placeholder:
515+ - match: |-
516+ (?x)~
517+ ([~nN%^&*;]
518+ |@?[aA?]
519+ |,?(?:\d+)?@?[eEfFgGtT]
520+ |,?(?:@:|:@|@|:)?[bBoOdDxX$]
521+ |(?:@:|:@|@|:)?[cC]
522+ |(?:\d+)?(?:@:|:@|@|:)?[rRsSwW]
523+ |@:?\(
524+ |\)
525+ |:p)
526+ scope: constant.other.placeholder.scheme
527+
528+ comments:
529+ - include: line-comment
530+ - include: datum-comment
531+ - include: block-comment
532+ - match: '\|#'
533+ scope: invalid.illegal.block-comment-end.scheme
534+
535+ line-comment:
536+ - match: ((?<=[^#]);|^;).*$\n?
537+ scope: comment.line.scheme
538+ captures:
539+ 1: punctuation.definition.comment.scheme
540+ - match: '#!(?=\s*/)'
541+ scope: comment.line.scheme
542+ push:
543+ - match: /([^/]+/)*(scheme|petite)\s+--script$
544+ scope: comment.line.scheme
545+ pop: true
546+ - match: \S+(?=\s*$)
547+ scope: invalid.deprecated.scheme
548+ pop: true
549+
550+ datum-comment:
551+ - match: '#;'
552+ scope: keyword.control.datum-comment.scheme
553+
554+ block-comment:
555+ - match: '#\|'
556+ scope: punctuation.definition.comment.begin.scheme
557+ push:
558+ - meta_scope: comment.block.scheme
559+ - include: block-comment
560+ - match: '\|#'
561+ scope: punctuation.definition.comment.end.scheme
562+ pop: true
563+
564+ support-functions-symbols:
565+ - match: (?<=[\(\[])\s*(abort|abort-handler|abs|acos|acosh|add-duration|add-duration!|add-prefix|add1|alias|andmap|angle|annotation-expression|annotation-option-set|annotation-options|annotation-source|annotation-stripped|annotation\?|append|append!|apply|apropos|apropos-list|ash|asin|asinh|assert|assertion-violation|assertion-violation\?|assertion-violationf|assoc|assp|assq|assv|atan|atanh|atom\?|base-exception-handler|begin|bignum\?|binary-port-input-buffer|binary-port-input-count|binary-port-input-index|binary-port-input-size|binary-port-output-buffer|binary-port-output-count|binary-port-output-index|binary-port-output-size|binary-port\?|bitwise-and|bitwise-arithmetic-shift|bitwise-arithmetic-shift-left|bitwise-arithmetic-shift-right|bitwise-bit-count|bitwise-bit-field|bitwise-bit-set\?|bitwise-copy-bit|bitwise-copy-bit-field|bitwise-first-bit-set|bitwise-if|bitwise-ior|bitwise-length|bitwise-not|bitwise-reverse-bit-field|bitwise-rotate-bit-field|bitwise-xor|block-read|block-write|boolean=\?|boolean\?|bound-identifier=\?|box|box-immutable|box\?|break|break-handler|buffer-mode|buffer-mode\?|bwp-object\?|bytes-allocated|bytes-deallocated|bytevector|bytevector->immutable-bytevector|bytevector->s8-list|bytevector->sint-list|bytevector->string|bytevector->u8-list|bytevector->uint-list|bytevector-compress|bytevector-copy|bytevector-copy!|bytevector-fill!|bytevector-ieee-double-native-ref|bytevector-ieee-double-native-set!|bytevector-ieee-double-ref|bytevector-ieee-double-set!|bytevector-ieee-single-native-ref|bytevector-ieee-single-native-set!|bytevector-ieee-single-ref|bytevector-ieee-single-set!|bytevector-length|bytevector-s16-native-ref|bytevector-s16-native-set!|bytevector-s16-ref|bytevector-s16-set!|bytevector-s24-ref|bytevector-s24-set!|bytevector-s32-native-ref|bytevector-s32-native-set!|bytevector-s32-ref|bytevector-s32-set!|bytevector-s40-ref|bytevector-s40-set!|bytevector-s48-ref|bytevector-s48-set!|bytevector-s56-ref|bytevector-s56-set!|bytevector-s64-native-ref|bytevector-s64-native-set!|bytevector-s64-ref|bytevector-s64-set!|bytevector-s8-ref|bytevector-s8-set!|bytevector-sint-ref|bytevector-sint-set!|bytevector-truncate!|bytevector-u16-native-ref|bytevector-u16-native-set!|bytevector-u16-ref|bytevector-u16-set!|bytevector-u24-ref|bytevector-u24-set!|bytevector-u32-native-ref|bytevector-u32-native-set!|bytevector-u32-ref|bytevector-u32-set!|bytevector-u40-ref|bytevector-u40-set!|bytevector-u48-ref|bytevector-u48-set!|bytevector-u56-ref|bytevector-u56-set!|bytevector-u64-native-ref|bytevector-u64-native-set!|bytevector-u64-ref|bytevector-u64-set!|bytevector-u8-ref|bytevector-u8-set!|bytevector-uint-ref|bytevector-uint-set!|bytevector-uncompress|bytevector=\?|bytevector\?|caaaar|caaadr|caaar|caadar|caaddr|caadr|caar|cadaar|cadadr|cadar|caddar|cadddr|caddr|cadr|call-with-bytevector-output-port|call-with-current-continuation|call-with-input-file|call-with-output-file|call-with-port|call-with-string-output-port|call-with-values|call/1cc|call/cc|car|case-sensitive|cd|cdaaar|cdaadr|cdaar|cdadar|cdaddr|cdadr|cdar|cddaar|cddadr|cddar|cdddar|cddddr|cdddr|cddr|cdr|ceiling|cfl-|cfl-conjugate|cfl-imag-part|cfl-magnitude-squared|cfl-real-part|cfl/|cfl=|cfl\*|cfl\+|cflonum\?|char-|char->integer|char-alphabetic\?|char-ci<=\?|char-ci<\?|char-ci=\?|char-ci>=\?|char-ci>\?|char-downcase|char-foldcase|char-general-category|char-lower-case\?|char-name|char-numeric\?|char-ready\?|char-title-case\?|char-titlecase|char-upcase|char-upper-case\?|char-whitespace\?|char<=\?|char<\?|char=\?|char>=\?|char>\?|char\?|chmod|clear-input-port|clear-output-port|close-input-port|close-output-port|close-port|collect|collect-generation-radix|collect-maximum-generation|collect-notify|collect-request-handler|collect-trip-bytes|collections|command-line|command-line-arguments|compile|compile-compressed|compile-file|compile-file-message|compile-imported-libraries|compile-interpret-simple|compile-library|compile-library-handler|compile-port|compile-profile|compile-program|compile-program-handler|compile-script|compile-to-file|compile-to-port|compile-whole-library|compile-whole-program|complex\?|compute-composition|compute-size|condition|condition-accessor|condition-continuation|condition-irritants|condition-message|condition-predicate|condition-who|condition\?|conjugate|cons|cons\*|console-error-port|console-input-port|console-output-port|constructor|continuation-condition\?|copy-environment|copy-time|cos|cosh|cost-center-allocation-count|cost-center-instruction-count|cost-center-time|cost-center\?|cp0-effort-limit|cp0-outer-unroll-limit|cp0-score-limit|cpu-time|create-exception-state|critical-section|csv7:record-field-accessible\?|csv7:record-field-accessor|csv7:record-field-mutable\?|csv7:record-field-mutator|csv7:record-type-descriptor|csv7:record-type-field-decls|csv7:record-type-field-names|csv7:record-type-name|csv7:record-type-symbol|current-date|current-directory|current-error-port|current-eval|current-exception-state|current-expand|current-input-port|current-locate-source-object-source|current-make-source-object|current-memory-bytes|current-output-port|current-time|current-transcoder|custom-port-buffer-size|date->time-utc|date-and-time|date-day|date-dst\?|date-hour|date-minute|date-month|date-nanosecond|date-second|date-week-day|date-year|date-year-day|date-zone-name|date-zone-offset|date\?|datum|datum->syntax|datum->syntax-object|debug|debug-condition|debug-level|debug-on-exception|decode-float|default-exception-handler|default-prompt-and-read|delay|delete-directory|delete-file|denominator|directory-list|directory-separator|directory-separator\?|disable-interrupts|display|display-condition|display-statistics|display-string|div|div-and-mod|div0|div0-and-mod0|drop-prefix|dynamic-wind|enable-cross-library-optimization|enable-interrupts|enable-object-counts|endianness|engine-block|engine-return|enum-set->list|enum-set-complement|enum-set-constructor|enum-set-difference|enum-set-indexer|enum-set-intersection|enum-set-member\?|enum-set-projection|enum-set-subset\?|enum-set-union|enum-set-universe|enum-set=\?|enum-set\?|enumerate|environment|environment-mutable\?|environment-symbols|environment\?|eof-object|eof-object\?|eol-style|ephemeron-cons|ephemeron-pair\?|eq-hashtable-cell|eq-hashtable-contains\?|eq-hashtable-delete!|eq-hashtable-ephemeron\?|eq-hashtable-ref|eq-hashtable-set!|eq-hashtable-update!|eq-hashtable-weak\?|eq-hashtable\?|eq\?|equal-hash|equal\?|eqv\?|error|error-handling-mode|error\?|errorf|eval|eval-syntax-expanders-when|even\?|exact|exact->inexact|exact-integer-sqrt|exact\?|except|exclusive-cond|exists|exit|exit-handler|exp|expand|expand-output|expand/optimize|expand/optimize-output|export|expression-editor|expt|expt-mod|extend-syntax|fasl-file|fasl-read|fasl-strip-options|fasl-write|file-access-time|file-buffer-size|file-change-time|file-directory\?|file-exists\?|file-length|file-modification-time|file-options|file-port\?|file-position|file-regular\?|file-symbolic-link\?|filter|find|finite\?|fixnum->flonum|fixnum-width|fixnum\?|fl-|fl-make-rectangular|fl/|fl<|fl<=|fl<=\?|fl<\?|fl=|fl=\?|fl>|fl>=|fl>=\?|fl>\?|fl\*|fl\+|flabs|flacos|flasin|flatan|flceiling|flcos|fldenominator|fldiv|fldiv-and-mod|fldiv0|fldiv0-and-mod0|fleven\?|flexp|flexpt|flfinite\?|flfloor|flinfinite\?|flinteger\?|fllog|fllp|flmax|flmin|flmod|flmod0|flnan\?|flnegative\?|flnonnegative\?|flnonpositive\?|flnumerator|flodd\?|flonum->fixnum|flonum\?|floor|flpositive\?|flround|flsin|flsqrt|fltan|fltruncate|flush-output-port|flzero\?|fold-left|fold-right|for-all|force|foreign-address-name|foreign-alloc|foreign-callable|foreign-callable-code-object|foreign-callable-entry-point|foreign-entry|foreign-entry\?|foreign-free|foreign-procedure|foreign-ref|foreign-set!|foreign-sizeof|format|format-condition\?|fprintf|free-identifier=\?|fresh-line|ftype-&ref|ftype-init-lock!|ftype-lock!|ftype-locked-decr!|ftype-locked-incr!|ftype-pointer->sexpr|ftype-pointer-address|ftype-pointer-ftype|ftype-pointer-null\?|ftype-pointer=\?|ftype-pointer\?|ftype-ref|ftype-set!|ftype-sizeof|ftype-spin-lock!|ftype-unlock!|fx-|fx-/carry|fx/|fx1-|fx1\+|fx<|fx<=|fx<=\?|fx<\?|fx=|fx=\?|fx>|fx>=|fx>=\?|fx>\?|fx\*|fx\*/carry|fx\+|fx\+/carry|fxabs|fxand|fxarithmetic-shift|fxarithmetic-shift-left|fxarithmetic-shift-right|fxbit-count|fxbit-field|fxbit-set\?|fxcopy-bit|fxcopy-bit-field|fxdiv|fxdiv-and-mod|fxdiv0|fxdiv0-and-mod0|fxeven\?|fxfirst-bit-set|fxif|fxior|fxlength|fxlogand|fxlogbit0|fxlogbit1|fxlogbit\?|fxlogior|fxlognot|fxlogor|fxlogtest|fxlogxor|fxmax|fxmin|fxmod|fxmod0|fxmodulo|fxnegative\?|fxnonnegative\?|fxnonpositive\?|fxnot|fxodd\?|fxpositive\?|fxquotient|fxremainder|fxreverse-bit-field|fxrotate-bit-field|fxsll|fxsra|fxsrl|fxvector|fxvector->immutable-fxvector|fxvector->list|fxvector-copy|fxvector-fill!|fxvector-length|fxvector-ref|fxvector-set!|fxvector\?|fxxor|fxzero\?|gcd|generate-allocation-counts|generate-inspector-information|generate-instruction-counts|generate-interrupt-trap|generate-profile-forms|generate-temporaries|generate-wpo-files|gensym|gensym->unique-string|gensym-count|gensym-prefix|gensym\?|get-bytevector-all|get-bytevector-n|get-bytevector-n!|get-bytevector-some|get-bytevector-some!|get-char|get-datum|get-datum/annotations|get-hash-table|get-line|get-mode|get-output-string|get-process-id|get-registry|get-string-all|get-string-n|get-string-n!|get-string-some|get-string-some!|get-thread-id|get-u8|getenv|getprop|greatest-fixnum|hash-table-for-each|hash-table-map|hash-table\?|hashtable-cell|hashtable-clear!|hashtable-contains\?|hashtable-copy|hashtable-delete!|hashtable-entries|hashtable-ephemeron\?|hashtable-equivalence-function|hashtable-hash-function|hashtable-keys|hashtable-mutable\?|hashtable-ref|hashtable-set!|hashtable-size|hashtable-update!|hashtable-values|hashtable-weak\?|hashtable\?|heap-reserve-ratio|i/o-decoding-error\?|i/o-encoding-error-char|i/o-encoding-error\?|i/o-error-filename|i/o-error-port|i/o-error-position|i/o-error\?|i/o-file-already-exists-error\?|i/o-file-does-not-exist-error\?|i/o-file-is-read-only-error\?|i/o-file-protection-error\?|i/o-filename-error\?|i/o-invalid-position-error\?|i/o-port-error\?|i/o-read-error\?|i/o-write-error\?|iconv-codec|identifier-syntax|identifier\?|ieee-environment|imag-part|immutable-box\?|immutable-bytevector\?|immutable-fxvector\?|immutable-string\?|immutable-vector\?|implementation-restriction-violation\?|implicit-exports|import-notify|import-only|indirect-export|inexact|inexact->exact|inexact\?|infinite\?|initial-bytes-allocated|input-port-ready\?|input-port\?|inspect|inspect/object|integer->char|integer-length|integer-valued\?|integer\?|interaction-environment|interactive\?|internal-defines-as-letrec\*|interpret|iota|irritants-condition\?|isqrt|keyboard-interrupt-handler|last-pair|latin-1-codec|lcm|least-fixnum|length|lexical-violation\?|library-directories|library-exports|library-extensions|library-list|library-object-filename|library-requirements|library-requirements-options|library-version|list|list->fxvector|list->string|list->vector|list-copy|list-head|list-ref|list-sort|list-tail|list\*|list\?|literal-identifier=\?|load|load-library|load-program|load-shared-object|locate-source|locate-source-object-source|lock-object|locked-object\?|log|logand|logbit0|logbit1|logbit\?|logior|lognot|logor|logtest|logxor|lookahead-char|lookahead-u8|machine-type|magnitude|magnitude-squared|make-annotation|make-assertion-violation|make-boot-file|make-boot-header|make-bytevector|make-compile-time-value|make-continuation-condition|make-cost-center|make-custom-binary-input-port|make-custom-binary-input/output-port|make-custom-binary-output-port|make-custom-textual-input-port|make-custom-textual-input/output-port|make-custom-textual-output-port|make-date|make-engine|make-enumeration|make-ephemeron-eq-hashtable|make-ephemeron-eqv-hashtable|make-eq-hashtable|make-eqv-hashtable|make-error|make-format-condition|make-ftype-pointer|make-fxvector|make-guardian|make-hash-table|make-hashtable|make-i/o-decoding-error|make-i/o-encoding-error|make-i/o-error|make-i/o-file-already-exists-error|make-i/o-file-does-not-exist-error|make-i/o-file-is-read-only-error|make-i/o-file-protection-error|make-i/o-filename-error|make-i/o-invalid-position-error|make-i/o-port-error|make-i/o-read-error|make-i/o-write-error|make-implementation-restriction-violation|make-input-port|make-input/output-port|make-irritants-condition|make-lexical-violation|make-list|make-message-condition|make-no-infinities-violation|make-no-nans-violation|make-non-continuable-violation|make-object-finder|make-output-port|make-parameter|make-polar|make-record-constructor-descriptor|make-record-type|make-record-type-descriptor|make-rectangular|make-serious-condition|make-source-condition|make-source-file-descriptor|make-source-object|make-sstats|make-string|make-syntax-violation|make-time|make-transcoder|make-undefined-violation|make-variable-transformer|make-vector|make-violation|make-warning|make-weak-eq-hashtable|make-weak-eqv-hashtable|make-who-condition|map|mark-port-closed!|max|maximum-memory-bytes|maybe-compile-file|maybe-compile-library|maybe-compile-program|member|memp|memq|memv|merge|merge!|message-condition\?|min|mkdir|mod|mod0|modulo|most-negative-fixnum|most-positive-fixnum|multibyte->string|mutable-box\?|mutable-bytevector\?|mutable-fxvector\?|mutable-string\?|mutable-vector\?|nan\?|native-endianness|native-eol-style|native-transcoder|negative\?|new-cafe|newline|no-infinities-violation\?|no-nans-violation\?|non-continuable-violation\?|nonnegative\?|nonpositive\?|not|null-environment|null\?|number->string|number\?|numerator|object-counts|oblist|odd\?|open-bytevector-input-port|open-bytevector-output-port|open-fd-input-port|open-fd-input/output-port|open-fd-output-port|open-file-input-port|open-file-input/output-port|open-file-output-port|open-input-file|open-input-output-file|open-input-string|open-output-file|open-output-string|open-process-ports|open-source-file|open-string-input-port|open-string-output-port|optimize-level|or|ormap|output-port-buffer-mode|output-port\?|pair\?|parameterize|pariah|partition|path-absolute\?|path-extension|path-first|path-last|path-parent|path-rest|path-root|peek-char|petite\?|port-bol\?|port-closed\?|port-eof\?|port-file-compressed!|port-file-descriptor|port-handler|port-has-port-length\?|port-has-port-nonblocking\?\?|port-has-port-position\?|port-has-set-port-length!\?|port-has-set-port-nonblocking!\?|port-has-set-port-position!\?|port-input-buffer|port-input-count|port-input-empty\?|port-input-index|port-input-size|port-length|port-name|port-nonblocking\?|port-output-buffer|port-output-count|port-output-full\?|port-output-index|port-output-size|port-position|port-transcoder|port\?|positive\?|predicate|prefix|pretty-file|pretty-format|pretty-initial-indent|pretty-line-length|pretty-maximum-lines|pretty-one-line-limit|pretty-print|pretty-standard-indent|print-brackets|print-char-name|print-extended-identifiers|print-gensym|print-graph|print-length|print-level|print-precision|print-radix|print-record|print-unicode|print-vector-length|printf|procedure-arity-mask|procedure\?|process|profile|profile-clear|profile-clear-database|profile-dump|profile-dump-data|profile-dump-html|profile-dump-list|profile-line-number-color|profile-load-data|profile-palette|profile-query-weight|property-list|put-bytevector|put-bytevector-some|put-char|put-datum|put-hash-table!|put-registry!|put-string|put-string-some|put-u8|putenv|putprop|quotient|r5rs|r5rs-syntax|r6rs:<|r6rs:<=|r6rs:=|r6rs:>|r6rs:>=|r6rs:call-with-input-file|r6rs:call-with-output-file|r6rs:char-ci<=\?|r6rs:char-ci<\?|r6rs:char-ci=\?|r6rs:char-ci>=\?|r6rs:char-ci>\?|r6rs:char<=\?|r6rs:char<\?|r6rs:char=\?|r6rs:char>=\?|r6rs:char>\?|r6rs:command-line|r6rs:current-error-port|r6rs:current-input-port|r6rs:current-output-port|r6rs:delete-file|r6rs:dynamic-wind|r6rs:eval|r6rs:exit|r6rs:file-exists\?|r6rs:flush-output-port|r6rs:fx-|r6rs:fx\*|r6rs:fx\+|r6rs:number->string|r6rs:open-input-file|r6rs:open-output-file|r6rs:record-constructor|r6rs:record\?|r6rs:standard-error-port|r6rs:standard-input-port|r6rs:standard-output-port|r6rs:string->number|r6rs:string-ci<=\?|r6rs:string-ci<\?|r6rs:string-ci=\?|r6rs:string-ci>=\?|r6rs:string-ci>\?|r6rs:string<=\?|r6rs:string<\?|r6rs:string=\?|r6rs:string>=\?|r6rs:string>\?|r6rs|r6rs:utf-16-codec|r6rs:with-input-from-file|r6rs:with-output-to-file|raise|raise-continuable|random|random-seed|rational-valued\?|rational\?|rationalize|ratnum\?|read|read-char|read-token|real->flonum|real-part|real-time|real-valued\?|real\?|rec|record-accessor|record-constructor|record-constructor-descriptor|record-constructor-descriptor\?|record-equal-procedure|record-field-mutable\?|record-hash-procedure|record-mutator|record-predicate|record-reader|record-rtd|record-type-descriptor\?|record-type-equal-procedure|record-type-field-names|record-type-generative\?|record-type-hash-procedure|record-type-name|record-type-opaque\?|record-type-parent|record-type-sealed\?|record-type-uid|record-writer|record\?|register-signal-handler|release-minimum-generation|remainder|remove|remove!|remove-foreign-entry|remove-hash-table!|remove-registry!|remp|remprop|remq|remq!|remv|remv!|rename|rename-file|require-nongenerative-clause|reset|reset-cost-center!|reset-handler|reset-maximum-memory-bytes!|reverse|reverse!|revisit|round|run-cp0|s8-list->bytevector|sc-expand|scheme-environment|scheme-program|scheme-report-environment|scheme-script|scheme-start|scheme-version|scheme-version-number|serious-condition\?|set-binary-port-input-buffer!|set-binary-port-input-index!|set-binary-port-input-size!|set-binary-port-output-buffer!|set-binary-port-output-index!|set-binary-port-output-size!|set-box!|set-car!|set-cdr!|set-port-bol!|set-port-eof!|set-port-input-buffer!|set-port-input-index!|set-port-input-size!|set-port-length!|set-port-name!|set-port-nonblocking!|set-port-output-buffer!|set-port-output-index!|set-port-output-size!|set-port-position!|set-sstats-bytes!|set-sstats-cpu!|set-sstats-gc-bytes!|set-sstats-gc-count!|set-sstats-gc-cpu!|set-sstats-gc-real!|set-sstats-real!|set-textual-port-input-buffer!|set-textual-port-input-index!|set-textual-port-input-size!|set-textual-port-output-buffer!|set-textual-port-output-index!|set-textual-port-output-size!|set-time-nanosecond!|set-time-second!|set-time-type!|set-timer|set-top-level-value!|set-virtual-register!|simple-conditions|sin|sinh|sint-list->bytevector|sleep|sort|sort!|source-condition-form|source-condition\?|source-directories|source-file-descriptor|source-file-descriptor-checksum|source-file-descriptor-path|source-file-descriptor\?|source-object-bfp|source-object-column|source-object-efp|source-object-line|source-object-sfd|source-object\?|sqrt|sstats-bytes|sstats-cpu|sstats-difference|sstats-gc-bytes|sstats-gc-count|sstats-gc-cpu|sstats-gc-real|sstats-print|sstats-real|sstats\?|standard-error-port|standard-input-port|standard-output-port|statistics|string|string->bytevector|string->immutable-string|string->list|string->multibyte|string->number|string->symbol|string->utf16|string->utf32|string->utf8|string-append|string-ci-hash|string-ci<=\?|string-ci<\?|string-ci=\?|string-ci>=\?|string-ci>\?|string-copy|string-copy!|string-downcase|string-fill!|string-foldcase|string-for-each|string-hash|string-length|string-normalize-nfc|string-normalize-nfd|string-normalize-nfkc|string-normalize-nfkd|string-ref|string-set!|string-titlecase|string-truncate!|string-upcase|string<=\?|string<\?|string=\?|string>=\?|string>\?|string\?|strip-fasl-file|sub1|subset-mode|subst|subst!|substq|substq!|substring|substring-fill!|substv|substv!|subtract-duration|subtract-duration!|suppress-greeting|symbol->string|symbol-hash|symbol-hashtable-cell|symbol-hashtable-contains\?|symbol-hashtable-delete!|symbol-hashtable-ref|symbol-hashtable-set!|symbol-hashtable-update!|symbol-hashtable\?|symbol=\?|symbol\?|syntax|syntax->annotation|syntax->datum|syntax->list|syntax->vector|syntax-case|syntax-error|syntax-object->datum|syntax-violation|syntax-violation-form|syntax-violation-subform|syntax-violation\?|system|tan|tanh|textual-port-input-buffer|textual-port-input-count|textual-port-input-index|textual-port-input-size|textual-port-output-buffer|textual-port-output-count|textual-port-output-index|textual-port-output-size|textual-port\?|thread\?|threaded\?|time|time-difference|time-difference!|time-nanosecond|time-second|time-type|time-utc->date|time<=\?|time<\?|time=\?|time>=\?|time>\?|time\?|timer-interrupt-handler|top-level-bound\?|top-level-mutable\?|top-level-program|top-level-syntax|top-level-syntax\?|top-level-value|trace|trace-case-lambda|trace-define|trace-define-syntax|trace-do|trace-lambda|trace-let|trace-output-port|trace-print|transcoded-port|transcoder-codec|transcoder-eol-style|transcoder-error-handling-mode|transcoder\?|transcript-cafe|transcript-off|transcript-on|truncate|truncate-file|truncate-port|u8-list->bytevector|uint-list->bytevector|unbox|undefined-variable-warnings|undefined-violation\?|unget-char|unget-u8|unlock-object|unquote|unquote-splicing|unread-char|unsyntax|unsyntax-splicing|untrace|utf-16-codec|utf-16be-codec|utf-16le-codec|utf-8-codec|utf16->string|utf32->string|utf8->string|values|vector|vector->immutable-vector|vector->list|vector-copy|vector-fill!|vector-for-each|vector-length|vector-map|vector-ref|vector-set!|vector-set-fixnum!|vector-sort|vector-sort!|vector\?|violation\?|virtual-register|virtual-register-count|visit|void|waiter-prompt-and-read|waiter-prompt-string|waiter-write|warning|warning\?|warningf|weak-cons|weak-pair\?|who-condition\?|with-cost-center|with-exception-handler|with-input-from-file|with-input-from-string|with-interrupts-disabled|with-output-to-file|with-output-to-string|with-source-path|write|write-char|zero\?)(?=[\(\[\s\]\)])
566+ scope: support.function.scheme
templates/anchor-link.htmlnew file+2
@@ -0,0 +1,2 @@
1+<!-- original at https://github.com/getzola/zola/blob/29b073640e26d96ab167c88ca70b18660f176cb4/docs/sass/_docs.scss#L48 -->
2+<a class="zola-anchor" href="#{{ id }}" aria-label="Anchor link for: {{ id }}"></a>
templates/base.html+1−1
@@ -14,7 +14,7 @@
1414 {% endblock title %}
1515 {% block description %}
1616 {% endblock description %}
17− <meta name="author" content="{{ config.extra.author.name }}">
17+ <meta name="author" content="{{ config.extra.author }}">
1818 <!-- END META -->
1919
2020 <!-- START FAVICON -->
templates/essays/post.html+5−35
@@ -1,4 +1,5 @@
11{% extends "base.html" %}
2+{% import "partials/pagination.html" as pagination %}
23{% block title %}
34 <meta name="og:title" content="{{ page.title }} - {{ config.title }}">
45 <title>{{ page.title }} - {{ config.title }}</title>
@@ -62,40 +63,9 @@
6263
6364 {{ page.content | safe }}
6465
65− {% include "partials/pagination.html" %}
66+ {{ pagination::pagination(page=page) }}
6667</article>
67−<section class="full c4-12-lg lh-copy mt6 mb4 measure-wide">
68− <iframe name="nothing" style="display:none;"></iframe>
69− <p class="mt5">If you’d like to follow our progress, we send monthly updates via email:</p>
70− <form
71− action="https://urbit.us11.list-manage.com/subscribe/post?u=972a03db9e0c6c25bb58de8c8&amp;amp;id=be143888d2"
72− method="post"
73− id="mc-embedded-subscribe-form"
74− name="mc-embedded-subscribe-form"
75− class="validate form"
76− target="_blank"
77− novalidate>
78− <div class="input-group" id="mc_embed_signup_scroll">
79− <div class="mc-field-group w-100 relative">
80− <input
81− class="bg-white black b--black ba pa3 w-100 mb2 br0 wk-appearance-none"
82− type="email"
83− name="EMAIL"
84− id="mce-EMAIL"
85− placeholder="your@email.com"/>
86− <button
87− id="mc-embedded-subscribe"
88− class="dib bn absolute bg-transparent"
89− style="font-family: 'Inter UI', san-serif; right: 3px; top: 15px; -webkit-appearance: none;"
90− type="submit"
91− name="subscribe"
92− onclick="_paq.push(['trackEvent', 'Mailing List', 'Subscribe'])">
93− <span class="fr pr1">-></span>
94− </button>
95− </div>
96− </div>
97− </form>
98− <p class="mt3 mb3 mb3-xl lh-copy">You can also follow us on <a class="bb" href="https://twitter.com/urbit">Twitter</a> or <a class="bb" href="https://github.com/urbit">Github</a>.</p>
99− <p class="mt0 mb3 mb4-xl lh-copy">Or talk to us on Urbit: <code>~bitbet-bolbel/urbit-community</code></p>
100−</section>
68+
69+{% include "partials/subscribe-form.html" %}
70+
10171{% endblock content %}
templates/events/event-landing.htmlnew file+26
@@ -0,0 +1,26 @@
1+{% extends "page.html" %}
2+
3+{% block content %}
4+
5+<article class="event mt4 mb4 c1-13 standalone">
6+
7+ {{ page.content | safe }}
8+
9+ <!-- {% if page.extra.image %}
10+ <img class="db mv2 obj-cover w-20 center" src="{{ page.extra.image }}" />
11+ {% endif %} -->
12+
13+ {% if page.extra.registration_url %}
14+ <!-- TODO only show this if it's in the future. This build of tera doesn't support casting to int, so we have to use JS -->
15+ <a target="_blank" href="{{ page.extra.registration_url }}" id="rsvp" data-date="{{ page.date }}">RSVP</a>
16+ <script>
17+ const rsvp = document.getElementById('rsvp');
18+ if (Date.now() > Date.parse(`${rsvp.dataset.date}T23:59:59`)) {
19+ rsvp.style.display = 'none';
20+ }
21+ </script>
22+ {% endif %}
23+
24+</article>
25+
26+{% endblock content %}
templates/events/event.htmlnew file+94
@@ -0,0 +1,94 @@
1+{% extends "page.html" %}
2+{% import "partials/pagination.html" as pagination %}
3+
4+{% block content %}
5+
6+<!-- header -->
7+<!-- content -->
8+{%- set lowercasetitle = page.title | lower | split(pat=" ") | join(sep="") -%}
9+{% if section or lowercasetitle == page.components[0] %}
10+<nav class="mt4 pb4 fixed-xl full fourth-1-md fourth-1-lg page-indiced mb3 mb0-m mb0-l mb0-xl">
11+ <a class="gray3" href="/">Urbit</a>
12+ <span class="gray3"> / </span>
13+ <a href="/{{ page.components[0] }}">
14+ {{ page.title }}
15+ </a>
16+
17+ {% include "partials/navigation-search.html" %}
18+</nav>
19+{% else %}
20+<nav class="mt4 fixed-xl full fourth-1-md fourth-1-lg page-indiced mb3 mb0-m mb0-l mb0-xl">
21+ <a class="gray3" href="/">Urbit</a>
22+ <span class="gray3"> / </span>
23+ <a href="/{{ page.components[0] }}{% if page.components[2] %}/{{ page.components[1] }}{% endif %}">
24+ {% if page.components[2] %}{{ page.components[1] | capitalize }}
25+ {% else %}
26+ {{ page.components[0] | capitalize }}
27+ {% endif %}
28+ </a>
29+
30+ {% include "partials/navigation-search.html" %}
31+
32+</nav>
33+
34+{% endif %}
35+
36+<article class="mt4 mb4 c1-13 c4-12-lg measure-wide">
37+ {% if page.extra.hidetitle %} {% else %}<h1>{{ page.title }}</h1>{% endif %}
38+
39+ {% if page.extra.youtube %}
40+ <div class="video-container mv4">
41+ <iframe class="w-100" height=auto
42+ src="https://www.youtube.com/embed/{{page.extra.youtube}}"
43+ webkitallowfullscreen
44+ mozallowfullscreen
45+ allowfullscreen>
46+ </iframe>
47+ </div>
48+ {% elif page.extra.image %}
49+ <img class="db mv2 obj-cover w-100 ba" src="{{ page.extra.image }}" />
50+ {% endif %}
51+
52+ {% if page.date %}
53+ <time class="mono db mv1 gray2 f5">{{ page.date | date(format="~%Y.%-m.%-d") }} {{ page.extra.time }}</time>
54+ {% endif %}
55+
56+ {% if page.extra.host %}
57+ <span class="mt2 dib gray2" rel="host">Hosted by {{ page.extra.host }}</span><br />
58+ {% endif %}
59+
60+ {% if page.extra.guests %}
61+ <span class="mt2 dib gray2" rel="guest">Guest: {{ page.extra.guests }} </span><br />
62+ {% endif %}
63+
64+ {% if page.extra.registration_url %}
65+ <!-- TODO only show this if it's in the future. This build of tera doesn't support casting to int, so we have to use JS -->
66+ <a class="f6" target="_blank" href="{{ page.extra.registration_url }}" id="rsvp" data-date="{{ page.date }}">RSVP Here</a>
67+ <script>
68+ const rsvp = document.getElementById('rsvp');
69+ if (Date.now() > Date.parse(`${rsvp.dataset.date}T23:59:59`)) {
70+ rsvp.style.display = 'none';
71+ }
72+ </script>
73+ {% endif %}
74+
75+
76+
77+ <!-- body -->
78+ <span id="rsvp_count"></span>
79+ {{ page.content | safe }}
80+ {{ pagination::pagination(page=page, type="Event") }}
81+
82+ {% if page.extra.registration_url %}
83+ <script>
84+ //fetch(`{{ page.extra.registration_url | replace(from="www", to="api") | safe}}`)
85+ // .then(response => response.json())
86+ // .then(response => {
87+ // console.log('response', response);
88+ // document.getElementById('rsvp_count').innerText = response.yes_rsvp_count;
89+ // });
90+ </script>
91+ {% endif %}
92+</article>
93+
94+{% endblock content %}
templates/events/list.htmlnew file+157
@@ -0,0 +1,157 @@
1+{% extends "base.html" %}
2+{% import "macros/macros.html" as macros %}
3+
4+{% block title %}
5+ <meta name="og:title" content="Events - {{ config.title }}">
6+ <title>Events - {{ config.title }}</title>
7+{% endblock title %}
8+
9+{% block description %}
10+ <meta name="og:description" content="Events facilitated by the Urbit Foundation.">
11+ <meta name="description" content="Events facilitated by the Urbit Foundation.">
12+{% endblock description %}
13+
14+{% block content %}
15+{% set posts = get_section(path="events/_index.md") %}
16+<!-- header -->
17+<nav class="mt4 full fourth-1-lg mb3 mb0-m mb0-l mb0-xl fixed-xl">
18+ <a class="gray3" href="/">Urbit</a>
19+ <span class="gray3"> / </span>
20+ <a href="/events/">Events</a>
21+
22+ {% include "partials/navigation-search.html" %}
23+
24+ <ol id="event_months" class="pa0" style="position: sticky; top: 0;"></ol>
25+
26+</nav>
27+<section class="full c4-12-lg pt4">
28+
29+ <section id="upcoming" class="grid12"></section>
30+
31+ <section id="past" class="grid12"></section>
32+
33+ {% for page in posts.pages %}
34+ <article data-date="{{ page.date }}" id="event-{{ page.slug }}" class="event mb4 c1-10-lg full {% if page.extra.pinned %}bg-gray4 na3 pa3{% endif %}">
35+ <a href="{{ page.permalink }}" class="no-underline bb-0 grid12">
36+ <h1 class="full">{{ page.title }}</h1>
37+ <div class="measure-wide full c1-8-lg">
38+ {% if page.extra.description %}
39+ <p class="lh-copy">{{ page.extra.description }}</p>
40+ {% endif %}
41+ {{ macros::event_metadata(page=page, classes="mt2")}}
42+ </div>
43+ {% if page.extra.image %}
44+ <img class="db mv2 h4 ba obj-cover full c8-13-lg" src="{{ page.extra.image }}" />
45+ {% endif %}
46+ </a>
47+ </article>
48+ {% endfor %}
49+
50+ <script>
51+ const upcoming = document.getElementById('upcoming');
52+ const past = document.getElementById('past');
53+ const upcomingEvents = [];
54+ const pastEvents = [];
55+ Array.from(document.querySelectorAll('article[data-date')).forEach(function (article) {
56+ article.parentElement.removeChild(article);
57+ const articleDate = Date.parse(article.dataset.date);
58+ if(articleDate - Date.now() > 0) {
59+ upcomingEvents.push([articleDate, article]);
60+ } else {
61+ pastEvents.push([articleDate, article]);
62+ }
63+ });
64+
65+ upcomingEvents.sort(function (articleA, articleB) {
66+ return articleA[0] - articleB[0];
67+ });
68+
69+ pastEvents.sort(function (articleA, articleB) {
70+ return articleB[0] - articleA[0];
71+ });
72+
73+ const upcomingHeader = document.createElement('h2');
74+ upcomingHeader.className = 'mb4 full';
75+ upcomingHeader.innerText = 'Upcoming Events';
76+ upcoming.appendChild(upcomingHeader);
77+
78+ upcomingEvents.forEach(function (event) {
79+ upcoming.appendChild(event[1]);
80+ });
81+
82+ const pastHeader = document.createElement('h2');
83+ pastHeader.className = 'mb4 full';
84+ pastHeader.innerText = 'Past Events';
85+ past.appendChild(pastHeader);
86+
87+ pastEvents.forEach(function (event) {
88+ past.appendChild(event[1]);
89+ });
90+ </script>
91+
92+ <script>
93+ const monthMap = [
94+ 'January',
95+ 'February',
96+ 'March',
97+ 'April',
98+ 'May',
99+ 'June',
100+ 'July',
101+ 'August',
102+ 'September',
103+ 'October',
104+ 'November',
105+ 'December',
106+ ];
107+ const wrapper = document.getElementById('event_months');
108+ const years = {};
109+ Array.from(document.querySelectorAll('article[data-date]')).forEach(function (event) {
110+ const date = new Date(Date.parse(event.dataset.date));
111+ const year = date.getFullYear();
112+ if (!years.hasOwnProperty(year)) {
113+ years[year] = {};
114+ }
115+ const month = date.getMonth();
116+ if (!years[year].hasOwnProperty(month)) {
117+ years[year][month] = [];
118+ }
119+ years[year][month].push(event.id);
120+ });
121+ Object.keys(years).reverse().forEach(function (year) {
122+ const yearItem = document.createElement('li');
123+ yearItem.className = 'pt2';
124+ const header = document.createElement('span');
125+ header.className = 'f5';
126+ header.innerText = year;
127+ yearItem.appendChild(header);
128+ const monthList = document.createElement('ol');
129+ monthList.className = 'pa0 months';
130+ yearItem.appendChild(monthList);
131+ Object.keys(years[year]).reverse().forEach(function (month) {
132+ const monthItem = document.createElement('li');
133+ monthItem.className = 'pt1';
134+ const header = document.createElement('span');
135+ header.className = 'f6';
136+ header.innerText = monthMap[month];
137+ monthItem.appendChild(header);
138+ const articleList = document.createElement('ol');
139+ articleList.className = 'pa0 articles';
140+ monthItem.appendChild(articleList);
141+ monthList.appendChild(monthItem);
142+ years[year][month].forEach(function (id) {
143+ const articleItem = document.createElement('li');
144+ const link = document.createElement('a');
145+ link.className = 'bb f6 gray1';
146+ link.href = `#${id}`;
147+ link.innerText = document.getElementById(id).querySelector('h1').innerText;
148+ articleItem.appendChild(link);
149+ articleList.appendChild(articleItem);
150+ });
151+ });
152+ wrapper.appendChild(yearItem);
153+ });
154+ </script>
155+</section>
156+{% include "partials/footer.html" %}
157+{% endblock content %}
templates/getting-started/index.htmlnew file+41
@@ -0,0 +1,41 @@
1+{% extends "base.html" %}
2+{% block title %}
3+ <meta name="og:title" content="Getting Started - {{ config.title }}">
4+ <title>Getting Started - {{ config.title }}</title>
5+{% endblock title %}
6+
7+{% block description %}
8+ <meta name="og:description" content="Urbit is a new kind of computer.">
9+ <meta name="description" content="Urbit is a new kind of computer.">
10+{% endblock description %}
11+
12+{% block image %}
13+ <meta name="twitter:image" content="https://media.urbit.org/logo/urbit-logo-card.png">
14+{% endblock image %}
15+
16+{% block content %}
17+<!-- header -->
18+<nav class="mt4 full fourth-1-lg mb3 mb0-m mb0-l mb0-xl absolute-xl">
19+ <a class="gray3" href="/">Urbit</a>
20+ <span class="gray3"> / </span>
21+ <a href="/getting-started/">
22+ Getting Started
23+ </a>
24+
25+ {% include "partials/navigation-search.html" %}
26+
27+ <li class="dn mw5-xl mw5-l db-xl page-indiced mv2"><a class="fw6 f6" href="/getting-started/">Introduction</a></li>
28+ {% set posts = get_section(path="getting-started/_index.md") %}
29+ {% for directorypage in posts.pages %}
30+ <li class="dn mw5-xl mw5-l db-xl page-indiced mv2"><a class="f6" href="{{directorypage.permalink}}">{{directorypage.title}}</a></li>
31+ {% endfor %}
32+
33+</nav>
34+<!-- content -->
35+<article class="mt4 mb6 full c4-12-lg measure-wide">
36+ <!-- header -->
37+ <h1>{{ section.title }}</h1>
38+ <!-- body -->
39+ {{ section.content | safe }}
40+</article>
41+{% endblock content %}
templates/index.html+73−56
@@ -1,4 +1,6 @@
11{% extends "base.html" %}
2+{% import "macros/macros.html" as macros %}
3+
24<!--External links are differentiated on home page.-->
35{% block templatestyles %}
46
@@ -19,10 +21,9 @@
1921 <meta name="description" content="Urbit is a simple, durable system for running a personal server that you own 100% and forever.">
2022{% endblock description %}
2123{% block content %}
22−
2324<section class="full lh-copy c2-7-md c3-7-lg mt6 mb6">
2425 <p class="mt0 mb4"><strong>Urbit</strong> is a clean-slate OS and network for the 21st century.</p>
25− <p><strong>Urbit OS</strong> is a reimagining of the operating system as an 'overlay OS.'</p>
26+ <p><strong>Urbit OS</strong> is a reimagining of the operating system as an ‘overlay OS.’</p>
2627 <p class="mb4">It's a compact system for an individual to run their own permanent personal server on any Unix machine with an internet connection.</p>
2728 <p class="mb4"><strong>Urbit ID</strong> is a decentralized digital identity system. Your
2829 Urbit ID is a username, network address, and crypto wallet.</p>
@@ -39,22 +40,85 @@
3940<section class="full lh-copy c2-7-md c3-7-lg mb6">
4041 <ul class="list mt0">
4142 <li class="mt0">
42− <a class="bb" href="/understanding-urbit">Introduction</a><br />
43− Never heard of Urbit before? Start here to read a bit about the project.
43+ <a class="b--blue2 blue2 bb" href="/getting-started/">Get Started</a><br />
44+ Learn more about how to run Urbit and join the network.
4445 </li>
4546 <li class="mt3">
46− <a class="b--blue2 blue2 bb" href="/using/install/">Install + Setup</a><br />
47− If you're comfortable in the command-line, feel free to boot a node and try Urbit.
47+ <a class="b--green2 green2 bb" href="/docs/">Documentation</a><br />
48+ Read our documentation to learn more about the technology.
4849 </li>
4950 <li class="mt3">
50− <a class="b--green2 green2 bb" href="/docs/">Documentation</a><br />
51− To learn more about the technology, head to the docs.
51+ <a class="bb" href="/understanding-urbit">Introduction</a><br />
52+ Never heard of Urbit before? Start here to read a bit about the project.
53+ </li>
54+ <li class="mt3">
55+ <a class="bb" href="/faq">FAQ</a> <br />
56+ Answers to commonly asked questions.
5257 </li>
5358 </ul>
5459</section>
5560
61+<section class="full c7-12-md c7-11-lg mb5">
62+ {% set s = get_section(path="events/_index.md") %}
63+ {% set pins = s.pages
64+ | filter(attribute="extra.pinned", value=true)
65+ | sort(attribute="date")
66+ | reverse
67+ %}
68+ {% set allposts = s.pages
69+ | sort(attribute="date")
70+ | filter(attribute="extra.pinned", value=false)
71+ | concat(with=pins)
72+ | reverse
73+ %}
74+ {% for page in allposts | slice (end=2) %}
75+ <li class="mb4 list event">
76+ <a class="bb-0" href="{{ page.permalink }}">
77+ <h2 class="f5 fw6 mt0 mb1">{{ page.title }}</h2>
78+ {% if page.extra.description %}
79+ <p class="lh-copy mt1">{{ page.extra.description }}</p>
80+ {% endif %}
81+ </a>
82+ {{ macros::event_metadata(page=page)}}
83+ </li>
84+ {% endfor %}
85+ <a href="/events" class="bb">View more events</a>
86+</section>
87+
88+
89+
90+<section class="full c2-7-md c3-7-lg mt5">
91+ <h1 class="mb3">Latest Posts</h1>
92+ <p class="lh-copy mt1">We regularly write posts on our <a class="bb" href="/blog">blog</a> about what we're working on.</p>
93+ {% set s = get_section(path="updates/_index.md") %}
94+ {% set e = get_section(path="blog/_index.md") %}
95+ {% set allposts = s.pages
96+ | concat (with=e.pages)
97+ | sort(attribute="date")
98+ | reverse
99+ %}
100+ {% for page in allposts | slice (end=2) %}
101+ <li class="mb4 list">
102+ <a class="bb-0" href="{{ page.permalink }}">
103+ <h2 class="f5 fw6 mt0 mb1">{{ page.title }}</h2>
104+ {% if page.extra.image %}
105+ <img class="db mv2 obj-cover h4 w-50 ba" src="{{ page.extra.image }}" />
106+ {% elif page.extra.description %}
107+ <p class="lh-copy mt1">{{ page.extra.description }}</p>
108+ {% endif %}
109+ <time class="mono f6">{{ page.date | date(format="~%Y.%-m.%-d") }}</time>
110+ <span class="mono f6">
111+ {% if page.extra.ship %}
112+ <address class="mono f6 mh2">{{ page.extra.ship }}</address>
113+ {% endif %}
114+ </span>
115+ </a>
116+ </li>
117+ {% endfor %}
118+</section>
119+
56120
57−<section class="full lh-copy c7-12-md c7-11-lg" id="follow">
121+<section class="full lh-copy c7-12-md c7-11-lg mt5" id="follow">
58122 <p class="lh-copy mt1 mb3">
59123 We send regular updates about our project. Enter your email to get them.
60124 </p>
@@ -101,53 +165,6 @@
101165 </p>
102166</section>
103167
104−<section class="full c2-7-md c3-7-lg mt5">
105− <h1 class="mb3">Understanding Urbit</h1>
106− <p class="lh-copy mt1">This sequence of posts will give you a high-level overview of Urbit. They take about 20 minutes to read.</p>
107− <ul class="list">
108− <li class="mt3">
109− <a class="b--black bb" href="/understanding-urbit/">Introduction</a>
110− </li>
111− {% set posts = get_section(path="understanding-urbit/_index.md") %} {%
112− for page in posts.pages %}
113− <li class="mt3">
114− <a
115− class="b--black bb"
116− href="{{ page.permalink }}">
117− {{ page.title }}
118− </a>
119− </li>
120− {% endfor %}
121− </ul>
122−</section>
123−
124−<section class="full c7-12-md c7-11-lg mv5">
125− <h1 class="mb3">Latest Posts</h1>
126− <p class="lh-copy mt1">We regularly write posts on our <a class="bb" href="/blog">blog</a> about what we're working on.</p>
127− {% set s = get_section(path="updates/_index.md") %}
128− {% set e = get_section(path="blog/_index.md") %}
129− {% set allposts = s.pages
130− | concat (with=e.pages)
131− | sort(attribute="date")
132− | reverse
133− %}
134− {% for page in allposts | slice (end=2) %}
135− <a class="bb-0" href="{{ page.permalink }}">
136− <li class="mb4 list">
137− <h2 class="f5 fw6 mt0 mb1">{{ page.title }}</h2>
138− {% if page.extra.image %}
139− <img class="db mv2 obj-cover h4 w-50 ba" src="{{ page.extra.image }}" />
140− {% endif %}
141− <time class="mono f6">{{ page.date | date(format="~%Y.%-m.%-d") }}</time>
142− <span class="mono f6">
143− {% if page.extra.ship %}
144− <address class="mono f6 mh2">{{ page.extra.ship }}</address>
145− {% endif %}
146− </span>
147− </li>
148− </a>
149− {% endfor %}
150−</section>
151168
152169{% include "partials/footer.html" %}
153170{% endblock content %}
templates/list.html+1
@@ -21,6 +21,7 @@
2121 {{ section.title }}
2222 </a>
2323 {% include "partials/navigation-search.html" %}
24+ <a href="using/install/">Install / Get Started -></a>
2425</nav>
2526<!-- content -->
2627<article class="mt4 mb4 c1-13 c4-12-lg measure-wide">
templates/macros/macros.htmlnew file+11
@@ -0,0 +1,11 @@
1+{% macro event_metadata(page, classes="") %}
2+ <span class="metadata measure-wide db relative {{ classes }}">
3+ {% if page.extra.location %}
4+ <span class="f6 gray1">{{ page.extra.location }}</span>
5+ {% endif %}
6+ {% if page.extra.registration_url and false %}
7+ <a href="{{ page.extra.registration_url | safe}}" target="_blank" class="f6 gray2">34 attending</a>
8+ {% endif %}
9+ <time class="mono f6 gray2 fr">{{ page.date | date(format="~%Y.%-m.%-d") }} {{ page.extra.time }} </time>
10+ </span>
11+{% endmacro event_metadata %}
templates/media/post.htmlnew file+68
@@ -0,0 +1,68 @@
1+{% extends "base.html" %}
2+{% import "partials/pagination.html" as pagination %}
3+{% block title %}
4+ <meta name="og:title" content="{{ page.title }} - {{ config.title }}">
5+ <title>{{ page.title }} - {{ config.title }}</title>
6+{% endblock title %}
7+
8+{% block description %}
9+ {% if page.description %}
10+ <meta name="og:description" content="{{ page.description }}">
11+ <meta name="description" content="{{ page.description }}">
12+ {% else %}
13+ <meta name="og:description" content="{{ config.description }}">
14+ <meta name="description" content="{{ config.description }}">
15+ {% endif %}
16+{% endblock description %}
17+
18+{% block bodyclasses %}
19+ class="
20+ {% if page.extra.classes %}
21+ {{ page.extra.classes }}
22+ {% else %}
23+ bg-white
24+ {% endif %}"
25+{% endblock bodyclasses %}
26+
27+{% block image %}
28+ {% if page.extra.image %}
29+ <meta name="twitter:image" content="{{ page.extra.image }}">
30+ {% else %}
31+ <meta name="twitter:image" content="https://media.urbit.org/logo/urbit-logo-card.png">
32+ {% endif %}
33+{% endblock image %}
34+
35+{% block content %}
36+<nav class="mt4 full fourth-1-lg mb3 mb0-m mb0-l mb0-xl">
37+ <a class="gray3" href="/">Urbit</a>
38+ <span class="gray3"> / </span>
39+ <a class="section" href="/{{ page.components[0] }}">
40+ {% set sectionname = get_section(path=page.components[0] ~ "/_index.md") %}
41+ {{ sectionname.title }}
42+ </a>
43+
44+ {% include "partials/navigation-search.html" %}
45+</nav>
46+
47+<article class="mb4 mt4 measure-wide full c4-12-lg">
48+ <h1 class="f5 fw6 mt0 mb1">{{ page.title }}</h1>
49+ {% if page.extra.author %}
50+ <span class="db">
51+ <span class="dib fw4 mr1" rel="author">{{ page.extra.author }}</span>
52+ {% if page.extra.ship %}
53+ <address class="dib gray0 fw4 mono">{{ page.extra.ship }}</address>
54+ {% endif %}
55+ </span>
56+ {% if page.date %}
57+ <time class="mono db gray0 f5">{{page.date | date(format="~%Y.%-m.%-d") }}</time>
58+ {% endif %}
59+ {% endif %}
60+ {% if page.extra.readtime %}
61+ <span class="dib mono {% if page.date %} ml2{% endif %} gray2 f5">{{ page.reading_time }}m read</span>
62+ {% endif %}
63+
64+ {{ page.content | safe }}
65+
66+ {{ pagination::pagination(page=page) }}
67+</article>
68+{% endblock content %}
templates/page.html+2−1
@@ -1,4 +1,5 @@
11{% extends "base.html" %}
2+{% import "partials/pagination.html" as pagination %}
23
34{% block title %}
45 <meta name="og:title" content="{{ page.title }} - {{ config.title }}">
@@ -71,7 +72,7 @@ class="essay bg-white"
7172 {% endif %}
7273 <!-- body -->
7374 {{ page.content | safe }}
74− {% include "partials/pagination.html" %}
75+ {{ pagination::pagination(page=page) }}
7576</article>
7677
7778{% endblock content %}
templates/page_indiced.html+5−3
@@ -1,4 +1,5 @@
11{% extends "base.html" %}
2+{% import "partials/pagination.html" as pagination %}
23{% block bodyclasses %}class="page-indiced"{% endblock bodyclasses %}
34
45{% block title %}
@@ -44,7 +45,8 @@
4445 <a class="gray3" href="/">Urbit</a>
4546 <span class="gray3"> / </span>
4647 <a href="/{{ page.components[0] }}{% if page.components[2] %}/{{ page.components[1] }}{% endif %}">
47− {% if page.components[2] %}{{ page.components[1] | capitalize }}
48+ {% if page.components[2] %}
49+ {{ page.components[1] | capitalize }}
4850 {% else %}
4951 {{ page.components[0] | capitalize }}
5052 {% endif %}
@@ -54,7 +56,7 @@
5456
5557{% endif %}
5658
57−{% for h2 in toc %}
59+{% for h2 in page.toc %}
5860{% if h2.children %}
5961<details class="dn mw5-xl mt2 mw5-l db-xl page-indiced f6"><summary>{{ h2.title }}</summary>
6062 {% for h3 in h2.children %}
@@ -79,6 +81,6 @@
7981 {% endif %}
8082 <!-- body -->
8183 {{ page.content | safe }}
82− {% include "partials/pagination.html" %}
84+ {{ pagination::pagination(page=page) }}
8385 </article>
8486{% endblock content %}
templates/partials/footer.html+6−5
@@ -18,12 +18,13 @@
1818
1919 <nav class="c7-10-md c7-9-lg half-1 mt5">
2020 <h3 class="mt0 mb3 pt0 pb0">Using + Contributing</h3>
21− <li class="mt2 f6"><a href="/using/install">Install + Setup</a></li>
22− <li class="mt2 f6"><a href="/using/develop">Developer's Guide</a></li>
23− <li class="mt2 f6"><a href="/using/operations">Operations Manual</a></li>
21+ <li class="mt2 f6"><a href="/getting-started">Getting Started</a></li>
22+ <li class="mt2 f6"><a href="/using">Operations Manual</a></li>
23+ <li class="mt2 f6"><a href="/docs/development/develop">Developer's Guide</a></li>
2424 </nav>
2525 <nav class="c10-13-md c9-11-lg half-2 mt5">
2626 <h3 class="mt0 mb3 pt0 pb0">Community</h3>
27+ <li class="mt2 f6"><a href="/events">Events</a></li>
2728 <li class="mt2 f6"><a href="https://groups.google.com/a/urbit.org/forum/#!forum/dev">urbit-dev</a></li>
2829 <li class="mt2 f6"><a href="/community/hoonschool">Hoon School</a></li>
2930 <li class="mt2 f6"><a href="/community/meetups">Meetups</a></li>
@@ -34,7 +35,7 @@
3435 <section class="full-bleed full grid12">
3536 <nav class="c1-4-md c3-5-lg half-1 mt4 mb5">
3637 <h3 class="mt0 mb3 pt0 pb0">Developers</h3>
37− <li class="mt2 f6"><a href="/docs">Documentation</a></li>
38+ <li class="mt2 f6"><a href="/docs">Developer Documentation</a></li>
3839 <li class="mt2 f6"><a href="https://grants.urbit.org">Developer Grants</a></li>
3940 <li class="mt2 f6"><a href="/bounties">Security Bounties</a></li>
4041 </nav>
@@ -47,7 +48,7 @@
4748 <h2 class="mb3">Need help?</h2>
4849 <li class="mt2 f6"><a href="mailto:support@urbit.org">support@urbit.org </a></li>
4950 <li class="mt2 f6"><a href="https://discord.gg/Mae2bk7">Discord</a></li>
50− <li class="mt2 f6"><a href="https://github.com/urbit">Github</a></li>
51+ <li class="mt2 f6"><a href="https://github.com/urbit">GitHub</a></li>
5152 </nav>
5253 </section>
5354</footer>
templates/partials/navigation-docs.html+58−10
@@ -1,9 +1,12 @@
11<!-- First nav is desktop-specific. Second nav is dropdown version for mobile. -->
22
33{% set sectionTitle = "urbit.org" %}
4+{% set directory = "docs" %}
45{% if page %}
56 {% if "docs" in page.components %}
67 {% set sectionTitle = "Docs" %}
8+ {% elif "using" in page.components %}
9+ {% set directory = "using" %}
710 {% endif %}
811 {% if "updates" in page.components %}
912 {% set sectionTitle = "Updates" %}
@@ -16,6 +19,8 @@
1619{% if section %}
1720 {% if "docs" in section.components %}
1821 {% set sectionTitle = "Docs" %}
22+ {% elif "using" in section.components %}
23+ {% set directory = "using" %}
1924 {% endif %}
2025 {% if "updates" in section.components %}
2126 {% set sectionTitle = "Updates" %}
@@ -26,27 +31,70 @@
2631{% endif %}
2732
2833{% block content %}
34+{% if section %}
35+ {%- set base = section.components[0] -%}
36+{% elif page %}
37+ {%- set base = page.components[0] -%}
38+{% endif %}
2939<nav class="bg-gray5 dn db-xl pt4 full-left no-break docs pr4">
3040 <a class="gray3" href="{{config.base_url}}">Urbit</a>
3141 <span class="gray3"> / </span>
42+ {% if base == "docs" %}
3243 <a href="{{config.base_url}}/docs/">
33− Documentation
44+ Development Docs
3445 </a>
35−<button id="js-search-window-toggle" class="pointer pa0 pv3 dn db-m db-l db-xl bw-0 relative" type="button"
46+ {% elif base == "using" %}
47+ <a href="{{config.base_url}}/using/">
48+ Usage Docs
49+ </a>
50+ {% endif %}
51+ <button id="js-search-window-toggle" class="pointer pa0 pv3 dn db-m db-l db-xl bw-0 relative" type="button"
3652 style="outline:none">
37− <span class="dib pv1 v-mid gray3">Search {{sectionTitle}}</span>
53+ <span class="dib pv1 v-mid gray3">Search Docs</span>
3854 <span class="ml1 pa1 dib v-mid ba br1 b--gray3 gray3 f7" id="keyhint">Ctrl + /</span>
3955</button>
4056 <ul class="lh-copy">
41− <li class="ml2 mt1"><a href="/using/install">Install -> </a></li>
42− <li class="ml2 mt1"><a href="/using/operations/">Operations Manual -></a></li>
43− <li class="ml2 mt1 mb4"><a href="/using/develop/">Developer's Guide -></a></li>
57+ <li class="ml2 mt1"><a href="/getting-started">Install / Get Started -> </a></li>
58+ <li class="ml2 mt1">
59+ <a href="/using/"
60+ {% if base == "using" %}
61+ class="fw6"
62+ {% endif %}
63+ >
64+ Usage Docs ->
65+ </a>
66+ </li>
67+ <li class="ml2 mt1 mb4">
68+ <a href="/docs/"
69+ {% if base == "docs" %}
70+ class="fw6"
71+ {% endif %}
72+ >
73+ Development Docs ->
74+ </a>
75+ </li>
4476 {% block menu %}
45− {% set index = get_section(path="docs/_index.md") %}
77+ <li class="ml3 mt1">
78+ <a
79+ {% if section and section.relative_path == "docs/_index.md" %}
80+ class="fw6"
81+ {% elif section and section.relative_path == "using/_index.md" %}
82+ class="fw6"
83+ {% endif %}
84+ {% if base == "docs" %}
85+ href="/docs"
86+ {% elif base == "using" %}
87+ href="/using"
88+ {% endif %}
89+ >
90+ Introduction
91+ </a>
92+ </li>
93+ {% set index = get_section(path=directory ~ "/_index.md") %}
4694 {% for s in index.subsections %}
4795 {% set subsection = get_section(path=s) %}
4896 {% if subsection.extra.nav %}
49− <li class="ml3 mt1"><a
97+ <li class="ml3 mt2"><a
5098 {% if current_url == subsection.permalink %}
5199 class="fw6"
52100 {% endif %}
@@ -126,8 +174,8 @@
126174 <select class="db mt4 pa2 b--black ba br0 mw4 f6 fw5" id="docsSelect" style="text-indent: 0.725rem;">
127175 <option>Navigation ↓</option>
128176 <option> </option>
129− <option value="https://urbit.org/using/install">Install</option>
130− <option value="https://urbit.org/using/operations/">Operations Manual</option>
177+ <option value="https://urbit.org/getting-started">Install</option>
178+ <option value="https://urbit.org/using">Operations Manual</option>
131179 <option value="https://urbit.org/using/develop">Developer's Guide</option>
132180 {% set index = get_section(path="docs/_index.md") %}
133181 {% for s in index.subsections %}
templates/partials/pagination.html+64−62
@@ -1,77 +1,79 @@
1−<footer class="relative measure-wide">{% if page.earlier %}
2− <a class="bb-0" href="{{page.earlier.permalink}}">
3− <nav class="previous absolute right-1 t-right">
4− {% if page.extra.hide_previous_title %} {% else %}<p class="mb0 f5">Previous Post:</p>{% endif %}
5− <p {% if page.extra.flatten_pagination %}
6− data-flat="true"
7− class="mt5 relative mb5
8− {% else %}
9− class="mt0 mb0 fw6 f5
10− {% endif %}
11− ">{{page.earlier.title}}</p>
12− <time class="gray2 mono db f5 mb4">{{page.earlier.date | date(format="~%Y.%-m.%-d") }}</time>
13− </nav>
14− </a>
1+{% macro pagination(page, type="Post") %}
2+ <footer class="relative measure-wide">{% if page.earlier %}
3+ <a class="bb-0" href="{{page.earlier.permalink}}">
4+ <nav class="previous absolute right-1 t-right">
5+ {% if page.extra.hide_previous_title %} {% else %}<p class="mb0 f5">Previous {{ type }}:</p>{% endif %}
6+ <p {% if page.extra.flatten_pagination %}
7+ data-flat="true"
8+ class="mt5 relative mb5
9+ {% else %}
10+ class="mt0 mb0 fw6 f5
11+ {% endif %}
12+ ">{{page.earlier.title}}</p>
13+ <time class="gray2 mono db f5 mb4">{{page.earlier.date | date(format="~%Y.%-m.%-d") }}</time>
14+ </nav>
15+ </a>
1516
16− {% elif page.heavier and not page.extra.hidenext %}
17+ {% elif page.heavier and not page.extra.hidenext %}
1718
18− <a class="bb-0" href="{{page.heavier.permalink}}">
19− <nav class="previous absolute right-1 t-right">
20− {% if page.extra.hide_next_title %} {% else %}<p class="mb0 f5">Next Post:</p>{% endif %}
21− <p {% if page.extra.flatten_pagination %}
22− data-flat="true"
23− class="mt5 relative mb5
24− {% else %}
25− class="mt0 mb0 fw6 f5
26− {% endif %}
27− ">{{page.heavier.title}}</p>
28− </nav>
29− </a>
30− {% endif %}
19+ <a class="bb-0" href="{{page.heavier.permalink}}">
20+ <nav class="previous absolute right-1 t-right">
21+ {% if page.extra.hide_next_title %} {% else %}<p class="mb0 f5">Next {{ type }}:</p>{% endif %}
22+ <p {% if page.extra.flatten_pagination %}
23+ data-flat="true"
24+ class="mt5 relative mb5
25+ {% else %}
26+ class="mt0 mb0 fw6 f5
27+ {% endif %}
28+ ">{{page.heavier.title}}</p>
29+ </nav>
30+ </a>
31+ {% endif %}
3132
32− {% if page.relative_path == "understanding-urbit/urbit-os.md" %}
33− <a class="bb-0" href="/understanding-urbit/">
34− <nav class="next absolute left-1 t-left">
33+ {% if page.relative_path == "understanding-urbit/urbit-os.md" %}
34+ <a class="bb-0" href="/understanding-urbit/">
35+ <nav class="next absolute left-1 t-left">
36+ <p {% if page.extra.flatten_pagination %}
37+ data-flat="true"
38+ class="mt5 relative mb5
39+ {% else %}
40+ class="mt0 mb0 fw6 f5
41+ {% endif %}
42+ ">Introduction</p>
43+ </nav>
44+ </a>
45+ {% elif page.later %}
46+
47+ <a class="bb-0" href="{{page.later.permalink}}">
48+ <nav class="next absolute left-1">
49+ {% if page.extra.hide_next_title %} {% else %}<p class="mb0 f5">Next {{ type }}:</p>{% endif %}
3550 <p {% if page.extra.flatten_pagination %}
3651 data-flat="true"
3752 class="mt5 relative mb5
3853 {% else %}
3954 class="mt0 mb0 fw6 f5
4055 {% endif %}
41− ">Introduction</p>
56+ ">{{page.later.title}}</p>
57+ <time class="gray2 mono db f5 mb4">{{page.later.date | date(format="~%Y.%-m.%-d") }}</time>
4258 </nav>
4359 </a>
44− {% elif page.later %}
45−
46− <a class="bb-0" href="{{page.later.permalink}}">
47− <nav class="next absolute left-1">
48− {% if page.extra.hide_next_title %} {% else %}<p class="mb0 f5">Next Post:</p>{% endif %}
49− <p {% if page.extra.flatten_pagination %}
50− data-flat="true"
51− class="mt5 relative mb5
52− {% else %}
53− class="mt0 mb0 fw6 f5
54− {% endif %}
55− ">{{page.later.title}}</p>
56− <time class="gray2 mono db f5 mb4">{{page.later.date | date(format="~%Y.%-m.%-d") }}</time>
57− </nav>
58− </a>
5960
6061
61− {% elif page.lighter and not page.extra.hideprevious %}
62+ {% elif page.lighter and not page.extra.hideprevious %}
6263
63− <a class="bb-0" href="{{page.lighter.permalink}}">
64− <nav class="next absolute left-1">
65− {% if page.extra.hide_previous_title %} {% else %}<p class="mb0 f5">Previous Post:</p>{% endif %}
66− <p {% if page.extra.flatten_pagination %}
67− data-flat="true"
68− class="mt5 relative mb5
69− {% else %}
70− class="mt0 mb0 fw6 f5
71− {% endif %}
72− ">{{page.lighter.title}}</p>
73− </nav>
74− </a>
75− {% endif %}
64+ <a class="bb-0" href="{{page.lighter.permalink}}">
65+ <nav class="next absolute left-1">
66+ {% if page.extra.hide_previous_title %} {% else %}<p class="mb0 f5">Previous {{ type }}:</p>{% endif %}
67+ <p {% if page.extra.flatten_pagination %}
68+ data-flat="true"
69+ class="mt5 relative mb5
70+ {% else %}
71+ class="mt0 mb0 fw6 f5
72+ {% endif %}
73+ ">{{page.lighter.title}}</p>
74+ </nav>
75+ </a>
76+ {% endif %}
7677
77−</footer>
78+ </footer>
79+{% endmacro pagination %}
templates/partials/subscribe-form.htmlnew file+34
@@ -0,0 +1,34 @@
1+<section class="full c4-12-lg lh-copy mt6 mb4 measure-wide">
2+ <iframe name="nothing" style="display:none;"></iframe>
3+ <p class="mt5">If you’d like to follow our progress, we send monthly updates via email:</p>
4+ <form
5+ action="https://urbit.us11.list-manage.com/subscribe/post?u=972a03db9e0c6c25bb58de8c8&amp;amp;id=be143888d2"
6+ method="post"
7+ id="mc-embedded-subscribe-form"
8+ name="mc-embedded-subscribe-form"
9+ class="validate form"
10+ target="_blank"
11+ novalidate>
12+ <div class="input-group" id="mc_embed_signup_scroll">
13+ <div class="mc-field-group w-100 relative">
14+ <input
15+ class="bg-white black b--black ba pa3 w-100 mb2 br0 wk-appearance-none"
16+ type="email"
17+ name="EMAIL"
18+ id="mce-EMAIL"
19+ placeholder="your@email.com"/>
20+ <button
21+ id="mc-embedded-subscribe"
22+ class="dib bn absolute bg-transparent"
23+ style="font-family: 'Inter UI', san-serif; right: 3px; top: 15px; -webkit-appearance: none;"
24+ type="submit"
25+ name="subscribe"
26+ onclick="_paq.push(['trackEvent', 'Mailing List', 'Subscribe'])">
27+ <span class="fr pr1">-></span>
28+ </button>
29+ </div>
30+ </div>
31+ </form>
32+ <p class="mt3 mb3 mb3-xl lh-copy">You can also follow us on <a class="bb" href="https://twitter.com/urbit">Twitter</a> or <a class="bb" href="https://github.com/urbit">GitHub</a>.</p>
33+ <p class="mt0 mb3 mb4-xl lh-copy">Or talk to us on Urbit: <code>~bitbet-bolbel/urbit-community</code></p>
34+</section>
templates/rss.xml+1−1
@@ -7,7 +7,7 @@
77 <generator>Zola</generator>
88 <language>{{ config.default_language }}</language>
99 <atom:link href="{{ feed_url | safe }}" rel="self" type="application/rss+xml"/>
10− <lastBuildDate>{{ last_build_date | date(format="%a, %d %b %Y %H:%M:%S %z") }}</lastBuildDate>
10+ <lastBuildDate>{{ last_updated | date(format="%a, %d %b %Y %H:%M:%S %z") }}</lastBuildDate>
1111 {% for page in pages %}
1212 <item>
1313 <title>{{ page.title }}</title>
templates/sections/docs/hoon.html+1−1
@@ -25,7 +25,7 @@
2525<div class="measure-wide mb4">
2626{{ section.content | safe }}
2727
28−{% set lessons = get_section(path="docs/tutorials/hoon/hoon-school/_index.md") %}
28+{% set lessons = get_section(path="docs/hoon/hoon-school/_index.md") %}
2929
3030<ul>
3131 <h2 class="mv4">Chapter 1</h2>
templates/understanding-urbit/list.html+4−36
@@ -57,8 +57,8 @@
5757 <p class="full mt0 mb4 mb4-xl lh-copy b">2 - User experience</p>
5858 <p class="full mt0 mb4 mb4-xl lh-copy">We want Urbit to be a single, simple interface for your whole digital life.</p>
5959 <img class="full ba mb4" src="https://media.urbit.org/site/understanding-urbit/uu-intro-4.png"/>
60− <p class="full mt0 mb4 mb4-xl lh-copy">Over the years, Urbit has been built in public as an open source project. Anyone can <a class="bb" href="/using/install/">join the network</a> and check out what we’re up to. It’s a bit like signing on to IRC in the early 90s. </p>
61− <p class="full mt0 mb4 mb4-xl lh-copy">In early 2020, we’ll release Urbit OS 1: a minimal interface for group communication, and our first complete interface. OS 1 is a tool to chat, share notes and links, and stay connected. </p>
60+ <p class="full mt0 mb4 mb4-xl lh-copy">Over the years, Urbit has been built in public as an open source project. Anyone can <a class="bb" href="/getting-started/">join the network</a> and check out what we’re up to. It’s a bit like signing on to IRC in the early 90s. </p>
61+ <p class="full mt0 mb4 mb4-xl lh-copy">In early 2020, we released Urbit OS 1: a minimal interface for group communication, and our first complete interface. OS 1 is a tool to chat, share notes and links, and stay connected. </p>
6262 <p class="full mt0 mb4 mb4-xl lh-copy">OS 1 is the first step toward a truly complete OS for a networked world. </p>
6363 <p class="full mt0 mb4 mb4-xl lh-copy">Over time, Urbit will grow into a system that can bring together all our different modes of communicating: chat, payments, documents, images, biometric data. We want individuals and their communities to be able to both control their software in fact, through the source code, and in action, through a simple interface.</p>
6464 <p class="full mt0 mb4 mb4-xl lh-copy">We want to leave behind a world of apps and services for one where we can bring everything together in one place. And, in doing so, ordinary users can create customized digital environments for their friends and communities.</p>
@@ -79,38 +79,6 @@
7979 {% endfor %}
8080</footer>
8181
82−<section class="full c4-12-lg lh-copy mt6 mb4 measure-wide">
83− <iframe name="nothing" style="display:none;"></iframe>
84− <p class="mt5">If you’d like to follow our progress, we send monthly updates via email:</p>
85− <form
86− action="https://urbit.us11.list-manage.com/subscribe/post?u=972a03db9e0c6c25bb58de8c8&amp;amp;id=be143888d2"
87− method="post"
88− id="mc-embedded-subscribe-form"
89− name="mc-embedded-subscribe-form"
90− class="validate form"
91− target="_blank"
92− novalidate>
93− <div class="input-group" id="mc_embed_signup_scroll">
94− <div class="mc-field-group w-100 relative">
95− <input
96− class="bg-white black b--black ba pa3 w-100 mb2 br0 wk-appearance-none"
97− type="email"
98− name="EMAIL"
99− id="mce-EMAIL"
100− placeholder="your@email.com"/>
101− <button
102− id="mc-embedded-subscribe"
103− class="dib bn absolute bg-transparent"
104− style="font-family: 'Inter UI', san-serif; right: 3px; top: 15px; -webkit-appearance: none;"
105− type="submit"
106− name="subscribe"
107− onclick="_paq.push(['trackEvent', 'Mailing List', 'Subscribe'])">
108− <span class="fr pr1">-></span>
109− </button>
110− </div>
111− </div>
112− </form>
113− <p class="mt3 mb3 mb3-xl lh-copy">You can also follow us on <a class="bb" href="https://twitter.com/urbit">Twitter</a> or <a class="bb" href="https://github.com/urbit">Github</a>.</p>
114− <p class="mt0 mb3 mb4-xl lh-copy">Or, preferably, on Urbit itself in the <code>~bitbet-bolbel/urbit-community</code></p>
115−</section>
82+{% include "partials/subscribe-form.html" %}
83+
11684{% endblock content %}
templates/understanding-urbit/post.html+5−35
@@ -1,4 +1,5 @@
11{% extends "base.html" %}
2+{% import "partials/pagination.html" as pagination %}
23
34{% block title %}
45 <meta name="og:title" content="{{ page.title }} - {{ config.title }}">
@@ -71,40 +72,9 @@
7172
7273 {{ page.content | safe }}
7374
74− {% include "partials/pagination.html" %}
75+ {{ pagination::pagination(page=page) }}
7576 </article>
76− <section class="full c4-12-lg lh-copy mt6 mb4 measure-wide">
77− <iframe name="nothing" style="display:none;"></iframe>
78− <p class="mt5">If you’d like to follow our progress, we send monthly updates via email:</p>
79− <form
80− action="https://urbit.us11.list-manage.com/subscribe/post?u=972a03db9e0c6c25bb58de8c8&amp;amp;id=be143888d2"
81− method="post"
82− id="mc-embedded-subscribe-form"
83− name="mc-embedded-subscribe-form"
84− class="validate form"
85− target="_blank"
86− novalidate>
87− <div class="input-group" id="mc_embed_signup_scroll">
88− <div class="mc-field-group w-100 relative">
89− <input
90− class="bg-white black b--black ba pa3 w-100 mb2 br0 wk-appearance-none"
91− type="email"
92− name="EMAIL"
93− id="mce-EMAIL"
94− placeholder="your@email.com"/>
95− <button
96− id="mc-embedded-subscribe"
97− class="dib bn absolute bg-transparent"
98− style="font-family: 'Inter UI', san-serif; right: 3px; top: 15px; -webkit-appearance: none;"
99− type="submit"
100− name="subscribe"
101− onclick="_paq.push(['trackEvent', 'Mailing List', 'Subscribe'])">
102− <span class="fr pr1">-></span>
103− </button>
104− </div>
105− </div>
106− </form>
107− <p class="mt3 mb3 mb3-xl lh-copy">You can also follow us on <a class="bb" href="https://twitter.com/urbit">Twitter</a> or <a class="bb" href="https://github.com/urbit">Github</a>.</p>
108− <p class="mt0 mb3 mb4-xl lh-copy">Or talk to us on Urbit: <code>~bitbet-bolbel/urbit-community</code></p>
109− </section>
77+
78+ {% include "partials/subscribe-form.html" %}
79+
11080{% endblock content %}