on master help sign in
Merge pull request #1633 from urbit/mp/overview
6c71a7bmatildepark
components/DocsSidebar.jsnew file+32
@@ -0,0 +1,32 @@
1+import Link from "next/link";
2+import { useState } from "react";
3+import MenuTray from "./MenuTray";
4+
5+export default function Sidebar(props) {
6+ const [isOpen, setTray] = useState(false);
7+ return (
8+ <>
9+ <div className="hidden md:flex flex-col w-96 bg-wall-100 max-h-screen h-screen">
10+ <header className="flex shrink-0 justify-between items-center pl-6 pt-12 mt-5 pb-8">
11+ <Link href="/" passHref>
12+ <a className="type-ui text-wall-500">Urbit</a>
13+ </Link>
14+ </header>
15+ <div className="overflow-y-auto p-6 pt-16">
16+ {props.children}
17+ <div className="pb-32" />
18+ </div>
19+ </div>
20+
21+ <MenuTray isOpen={isOpen} setTray={setTray} search={props.search}>
22+ <header className="flex shrink-0 justify-between items-center pb-8">
23+ <Link href="/" passHref>
24+ <a className="type-ui text-wall-500">Urbit</a>
25+ </Link>
26+ </header>
27+ {props.children}
28+ <div className="pt-64" />
29+ </MenuTray>
30+ </>
31+ );
32+}
components/Header.js+16−3
@@ -47,7 +47,6 @@ export default function Header(props) {
47 // Large screen header
47 // Large screen header
48 }
48 }
49 <nav className="items-center hidden md:flex">
49 <nav className="items-center hidden md:flex">
50−
51 <ActiveLink
50 <ActiveLink
52 currentPath={currentPath}
51 currentPath={currentPath}
53 className="mr-5 text-green-400 type-ui button-text"
52 className="mr-5 text-green-400 type-ui button-text"
@@ -56,6 +55,14 @@ export default function Header(props) {
56 Get Started
55 Get Started
57 </ActiveLink>
56 </ActiveLink>
58
57
58+ <ActiveLink
59+ currentPath={currentPath}
60+ className="mr-5 type-ui"
61+ href="/overview"
62+ >
63+ Overview
64+ </ActiveLink>
65+
59 <ActiveLink
66 <ActiveLink
60 currentPath={currentPath}
67 currentPath={currentPath}
61 className="mr-5 type-ui"
68 className="mr-5 type-ui"
@@ -64,14 +71,13 @@ export default function Header(props) {
64 Manual
71 Manual
65 </ActiveLink>
72 </ActiveLink>
66
73
67−
68 <ActiveLink
74 <ActiveLink
69 currentPath={currentPath}
75 currentPath={currentPath}
70 className="mr-5 type-ui"
76 className="mr-5 type-ui"
71 href="/faq"
77 href="/faq"
72 >
78 >
73 FAQ
79 FAQ
74− </ActiveLink>
80+ </ActiveLink>
75
81
76 <ActiveLink
82 <ActiveLink
77 currentPath={currentPath}
83 currentPath={currentPath}
@@ -110,6 +116,13 @@ export default function Header(props) {
110 <ActiveLink
116 <ActiveLink
111 currentPath={currentPath}
117 currentPath={currentPath}
112 className="mt-4 mr-5 mb-4"
118 className="mt-4 mr-5 mb-4"
119+ href="/overview"
120+ >
121+ Overview
122+ </ActiveLink>
123+ <ActiveLink
124+ currentPath={currentPath}
125+ className="mr-5 mb-4"
113 href="/using"
126 href="/using"
114 >
127 >
115 Manual
128 Manual
components/Sidebar.js+2−13
@@ -1,4 +1,3 @@
1−import Link from "next/link";
2import { useState } from "react";
1import { useState } from "react";
3import MenuTray from "./MenuTray";
2import MenuTray from "./MenuTray";
4
3
@@ -6,24 +5,14 @@ export default function Sidebar(props) {
6 const [isOpen, setTray] = useState(false);
5 const [isOpen, setTray] = useState(false);
7 return (
6 return (
8 <>
7 <>
9− <div className="hidden md:flex flex-col w-96 bg-wall-100 max-h-screen h-screen">
8+ <div className="hidden md:flex flex-col h-full sticky top-8">
10− <header className="flex shrink-0 justify-between items-center pl-6 pt-12 mt-5 pb-8">
11− <Link href="/" passHref>
12− <a className="type-ui text-wall-500">Urbit</a>
13− </Link>
14− </header>
15− <div className="overflow-y-auto p-6 pt-16">
9+ <div className="overflow-y-auto">
16 {props.children}
10 {props.children}
17 <div className="pb-32" />
11 <div className="pb-32" />
18 </div>
12 </div>
19 </div>
13 </div>
20
14
21 <MenuTray isOpen={isOpen} setTray={setTray} search={props.search}>
15 <MenuTray isOpen={isOpen} setTray={setTray} search={props.search}>
22− <header className="flex shrink-0 justify-between items-center pb-8">
23− <Link href="/" passHref>
24− <a className="type-ui text-wall-500">Urbit</a>
25− </Link>
26− </header>
27 {props.children}
16 {props.children}
28 <div className="pt-64" />
17 <div className="pt-64" />
29 </MenuTray>
18 </MenuTray>
content/understanding-urbit/_index.md → content/overview/_index.mdrenamed+19−24
@@ -7,8 +7,6 @@ We think the internet can’t be saved. The way things are going, MEGACORP will
7
7
8The only way out of this mess is with a completely new platform that’s owned and controlled by its users.
8The only way out of this mess is with a completely new platform that’s owned and controlled by its users.
9
9
10−![](https://storage.googleapis.com/media.urbit.org/site/understanding-urbit/intro/intro-0.jpg)
11−
12Urbit is a new OS and peer-to-peer network that’s simple by design, built to last forever, and 100% owned by its users. Under the hood, Urbit is a clean-slate software stack compact enough that an individual developer can understand and control it completely.
10Urbit is a new OS and peer-to-peer network that’s simple by design, built to last forever, and 100% owned by its users. Under the hood, Urbit is a clean-slate software stack compact enough that an individual developer can understand and control it completely.
13
11
14We built this new stack to give people a single integrated tool for communicating and building communities – a tool they can trust, control, and extend to their liking. We want to do away with the terrible user experience of the current ‘frankenstack’ of apps and services that we all use today.
12We built this new stack to give people a single integrated tool for communicating and building communities – a tool they can trust, control, and extend to their liking. We want to do away with the terrible user experience of the current ‘frankenstack’ of apps and services that we all use today.
@@ -17,52 +15,49 @@ Urbit is designed to become an effective, customizable productivity tool for col
17
15
18This probably sounds crazy, so let’s get concrete and talk about (1) Urbit as a piece of technology and (2) Urbit as a user experience.
16This probably sounds crazy, so let’s get concrete and talk about (1) Urbit as a piece of technology and (2) Urbit as a user experience.
19
17
20−1 - Technology
18+Technology {% .font-bold .subpixel-antialiased .pt-8 %}
19+
20+Technically, Urbit is two components: Urbit OS and Urbit ID. Both are completely open source and MIT licensed.
21
21
22−Technically, Urbit is two components: Urbit OS and Urbit ID.
22+{% div className="flex justify-between space-x-4" %}
23+{% div %}
24+![](https://media.urbit.org/site/understanding-urbit/uu-intro-2.svg)
25+{% /div %}
23
26
24−Both are completely [open](https://github.com/urbit/urbit) [source](https://github.com/urbit/azimuth) and MIT licensed.
27+{% div %}
28+![](https://media.urbit.org/site/understanding-urbit/uu-intro-3.svg)
29+{% /div %}
25
30
26−![](https://media.urbit.org/site/understanding-urbit/uu-intro-2.svg)
31+{% /div %}
27
32
28−Urbit OS is a new, carefully architected software stack: a VM, programming language and kernel designed to run software for an individual.
33+**Urbit OS** is a new, carefully architected software stack: a VM, programming language and kernel designed to run software for an individual.
29
34
30Urbit OS is a program that runs on almost any cloud server, most laptops and many phones: anything with Unix and an internet connection. Urbit OS is completely sealed from the system it runs on, sort of like WASM or the JVM. We sometimes call it an ‘overlay OS’.
35Urbit OS is a program that runs on almost any cloud server, most laptops and many phones: anything with Unix and an internet connection. Urbit OS is completely sealed from the system it runs on, sort of like WASM or the JVM. We sometimes call it an ‘overlay OS’.
31
36
32In an Urbit world, each person has their own Urbit OS node, or ‘urbit’. Your urbit is secure and private to you and entirely under your control. When you want to connect with others, you connect to their urbit directly — rather than going through a centralized service.
37In an Urbit world, each person has their own Urbit OS node, or ‘urbit’. Your urbit is secure and private to you and entirely under your control. When you want to connect with others, you connect to their urbit directly — rather than going through a centralized service.
33
38
34−If you’re curious to dive even deeper into Urbit OS, feel free to [skip ahead](/understanding-urbit/urbit-os).
39+If you’re curious to dive even deeper into Urbit OS, feel free to skip ahead.
35−
36−![](https://media.urbit.org/site/understanding-urbit/uu-intro-3.svg)
37
40
38−Urbit ID is an identity and authentication system specifically designed to work with Urbit OS. When you boot or log in to Urbit OS, you use your Urbit ID.
41+**Urbit ID** is an identity and authentication system specifically designed to work with Urbit OS. When you boot or log in to Urbit OS, you use your Urbit ID.
39
42
40−Your Urbit ID is a short, memorable name (like `~ravmel-ropdyl`) that’s a username, network address and crypto wallet all in one. It’s registered on a blockchain, you own it with a key and no one can take it away from you. Urbit IDs are cryptographic property.
43+Your Urbit ID is a short, memorable name (like ~ravmel-ropdyl) that’s a username, network address and crypto wallet all in one. It’s registered on a blockchain, you own it with a key and no one can take it away from you. Urbit IDs are cryptographic property.
41
44
42Urbit IDs aren’t money, but they are scarce, so each one costs something. This means that when you meet a stranger on the Urbit network, they have some skin in the game and are less likely to be a bot or a spammer.
45Urbit IDs aren’t money, but they are scarce, so each one costs something. This means that when you meet a stranger on the Urbit network, they have some skin in the game and are less likely to be a bot or a spammer.
43
46
44−The Urbit ID system is live and deployed, and we don’t plan to change it all that much. It works well. If you’re curious to dive further into the details, jump ahead to [this post.](/understanding-urbit/urbit-id)
47+Experience {% .font-bold .subpixel-antialiased .pt-8 %}
45−
46−2 - User experience
47
48
48We want Urbit to be a single, simple interface for your whole digital life.
49We want Urbit to be a single, simple interface for your whole digital life.
49
50
50−![](https://media.urbit.org/site/understanding-urbit/uu-intro-4.png)
51−
52−Over the years, Urbit has been built in public as an open source project. Anyone can [join the network](/getting-started/) and check out what we’re up to. It’s a bit like signing on to IRC in the early 90s.
51+Over the years, Urbit has been built in public as an open source project. Anyone can join the network and check out what we’re up to. It’s a bit like signing on to IRC in the early 90s.
53
52
54−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.
53+In early 2020, Tlon released Urbit OS 1, now called Landscape: a minimal interface for group communication, and our first complete interface. Landscape is a tool to chat, share notes and links, and stay connected.
55−
56−OS 1 is the first step toward a truly complete OS for a networked world.
57
54
58Over 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.
55Over 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.
59
56
60We 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.
57We 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.
61
58
62−![](https://storage.googleapis.com/media.urbit.org/site/understanding-urbit/intro/intro-6.jpg)
63−
64To see how we’re going to get there, let’s walk through these two pieces of new technology individually, Urbit OS and Urbit ID. We’ll then talk about our vision for the future and how we’ll get there.
59To see how we’re going to get there, let’s walk through these two pieces of new technology individually, Urbit OS and Urbit ID. We’ll then talk about our vision for the future and how we’ll get there.
65
60
66For technical people, it’s important to note that Urbit as a stack is in no way required to be used together. Don’t like our client? Feel free to build your own. Just like the Urbit ID system? No problem — use it!
61For technical people, it’s important to note that Urbit as a stack is in no way required to be used together. Don’t like our client? Feel free to build your own. Just like the Urbit ID system? No problem — use it!
67
62
68−Ultimately, we think that new technology is most likely to get adopted if it can provide a much, much better user experience. So that’s what we’re focussing on creating.
63+Ultimately, we think that new technology is most likely to get adopted if it can provide a much, much better user experience. So that’s what we’re focusing on creating.
content/overview/interface.mdnew file+42
@@ -0,0 +1,42 @@
1++++
2+title = "Interface"
3+description = "What Urbit feels like to an everyday user"
4+weight = 4
5+[extra]
6++++
7+
8+We built Urbit OS + Urbit ID to be the software stack for human-scale computing in the cloud. This system wasn’t built solely to be new infrastructure—it was built so that we can build better interfaces on top and people can use Urbit without having to know about the technology at all. For Urbit to actually matter, we have to go all the way from VM to UI.
9+
10+Landscape {% .font-bold .subpixel-antialiased .pt-8 %}
11+
12+To address the interface component of the stack, Tlon built Landscape: a simple, calm, browser-based interface for building digital communities.
13+
14+Today, once you have an Urbit OS node up and running, you can access Landscape from a desktop or mobile browser to pseudonymously chat, write, and share links with a group of friends.
15+
16+![](https://media.urbit.org/site/understanding-urbit/uu-interface-3.png)
17+
18+Landscape is by no means the only possible interface for Urbit OS + Urbit ID, but it’s the one that we need the most. In the future, we look forward to there being lots of different Urbit interfaces (and if you’re at all interested in experimenting with building one, please do.)
19+
20+What problem is Landscape solving? Let’s start with the current situation when it comes to cloud services.
21+
22+In today’s world of apps and services, there’s no operating system in any meaningful sense. Our communities, co-workers, and lives are spread between these services—and the work of combining them is left to the user. It’s completely up to you to remember all your passwords, who sent what message where, what files are on which platform, and so on.
23+
24+It’s annoying and confusing to switch between interfaces, you can’t extend or build on top, and privacy and security are out of your hands. This fragmented, siloed, closely surveilled experience is simply a byproduct of having other people run and control your software. For the ordinary user, the result is restrictive, boring, and painful to manage. The possibility for everyday creativity with the tools we’re stuck with is close to zero. Wasn’t the computer supposed to be a bicycle for the mind?
25+
26+Operating systems for the PC took the desk of the 1970s and made it digital. Paper, drawers, and envelopes became ‘files’ and ‘folders’. It’s a great abstraction, but it’s ancient. We live in a connected, multiplayer world; we need an operating system that acknowledges this world.
27+
28+The ‘desk’ of today is cluttered with apps and services, data structures, and interfaces. Unifying this disjointed user experience is the most important problem that a platform like Urbit can solve. Landscape is built to bring everything together into a unified interface again. Without Urbit ID + Urbit OS, this would be impossible.
29+
30+Landscape is a minimal, multipurpose interface for bringing a group together to chat, share links, write and engage in discussion. It’s free of any ads, tracking, or surveillance (as is the norm for anything built on Urbit). It’s a stripped-down social utility designed for high-trust, direct communication and collaboration. It’s the perfect place for small communities to feel at home.
31+
32+Design {% .font-bold .subpixel-antialiased .pt-8 %}
33+
34+Landscape has two basic building blocks: groups and modules. A group is exactly what it sounds like: one or more people. A module is sort of like an app without the data lock-in. A module is just a tool for getting something done, like ‘tasks’, ‘links’ or ‘votes’ that’s shared by a group.
35+
36+To give a few simple examples, a group of family members may just chat and share photos. A group of traders might share annotated research, watch the markets, and manage payments on a blockchain.
37+
38+The idea is this: any community should be able to customize their digital environment freely. For most users, this is just about choosing the right modules. For anyone with a bit of free time, adding your own modules should only be as difficult as building a simple webapp.
39+
40+When we look forward to what we can do with Landscape in the future, it’s hard to see ourselves going back to the tools we use today. The centralized services we have now are like broadcast media: they’re for distributing content from a producer to a bunch of followers.
41+
42+Landscape is for everything else. Landscape is for actual two-way communication.
content/overview/people-history.mdnew file+68
@@ -0,0 +1,68 @@
1++++
2+title = "History"
3+description = "Where we've been and were we are now"
4+weight = 6
5+[extra]
6+image = "https://media.urbit.org/site/understanding-urbit/project-history/project-status-landscape-earth%402x.png"
7++++
8+
9+So who builds this thing? Where does it come from? What’s the history?
10+
11+Today, Urbit is built and maintained by three organizations, a community of contributors and core developers, infrastructure (star) operators, and governance (galaxy) node owners.
12+
13+Let’s talk first about these individual groups within the Urbit community, then about the history of the project and how it came to be.
14+
15+Organizations {% .font-bold .subpixel-antialiased .pt-8 %}
16+
17+There are currently three principal organizations involved in Urbit’s development and maintenance: Tlon, Urbit.live and the Urbit Foundation.
18+
19+Tlon has been around since 2013 or so, and is primarily focussed on the development of Urbit OS and its user experience. Urbit.live was started in 2018 to make the on ramp into Urbit as easy as possible. Both companies contribute regularly to the code base.
20+
21+Tlon was originally granted about half of the Urbit ID address space, and has used that to fund its operations so far. Over time, Tlon plans to offer hosting and services to make using Urbit as easy as possible.
22+
23+Urbit.live started selling Urbit IDs very early once that became possible, and also plans to offer services within the Urbit ecosystem.
24+
25+The Urbit Foundation was formally established in 2021. The Foundation runs the grants program, maintains urbit.org, the network explorer, and organizes Urbit events like Assembly.
26+
27+The community of contributors and core developers has been steadily contributing to the code base since before Tlon existed, and they’re still going strong. They can primarily be found on Urbit itself, in the Urbit Community ([~bitbet-bolbel/urbit-community](/groups/~bitbet-bolbel/urbit-community)), the urbit-dev mailing list and on GitHub.
28+
29+Timeline {% .font-bold .subpixel-antialiased .pt-8 %}
30+
31+At the beginning, Urbit was just a few people with the right combination of imagination and discipline to try to rebuild computing.
32+
33+**2002**
34+Urbit starts as an open-ended personal project. An “independent study PhD” to reinvent computing for a network-centric world.
35+
36+**2008**
37+Nock, the foundation of Urbit, works. Coming in at 32 lines of code, that’s 1 line of code every two months.
38+
39+**2012**
40+Hoon, Urbit’s programming language, compiles itself to Nock. Writing Hoon is much easier than writing Nock.
41+
42+**2013**
43+Arvo, Urbit’s OS kernel, boots and the first live Urbit network is started with a command-line chat.
44+
45+**2014**
46+Tlon is founded to help support Urbit development (and is < 8 people for the next four years).
47+
48+**2015**
49+Urbit has its first web interface and serves its own website.
50+
51+**2016**
52+The first sale of Urbit address space sells out in four hours.
53+
54+**2017**
55+Our test network runs for ten months without a reboot.
56+
57+Our private sale, shared only with our mailing list, sells out in six hours — limit two per person.
58+
59+**2018**
60+Tlon sells about 8% of its stake in the network to accelerate Urbit development. urbit.live gets going and starts selling Urbit IDs to the public.
61+
62+**2019**
63+Tlon spends the year stabilizing Arvo and building Landscape.
64+
65+**2021**
66+Tlon hosts the first Urbit Assembly and the Urbit Foundation is formally organized.
67+
68+Building Urbit is about building a future where technology doesn’t control us. Instead, we look forward to a future where technology is simpler, more reliable and less invasive.
content/understanding-urbit/urbit-id.md → content/overview/urbit-id.mdrenamed+13−18
@@ -17,31 +17,25 @@ Let’s talk first about what an Urbit ID is and what it does. Then we’ll cove
17
17
18![](https://media.urbit.org/site/understanding-urbit/urbit-id/urbit-id-cards%402x.png)
18![](https://media.urbit.org/site/understanding-urbit/urbit-id/urbit-id-cards%402x.png)
19
19
20−Your Urbit ID is a short, four-syllable name like `~ravmel-ropdyl` that you own with an eight-syllable master passkey like `~palfun-foslup-fallyn-balfus`. This name and key lets you log into Urbit OS, and it’s used to encrypt packets you send over the Urbit network. Soon it will also be a master key that allows holding and sending of Bitcoin and other cryptocurrencies. Your Urbit ID and passkey belong to you like any other cryptographic assets. No one can take them away from you (just make sure to store the key safely).
20+Summary {% .font-bold .subpixel-antialiased .pt-8 %}
21
21
22−The Urbit ID registry is live and deployed to the Ethereum blockchain. Urbit ID isn’t specifically wedded to Ethereum – someday we’d like it to be hosted by Urbit OS itself. Also, Urbit ID is the only component of the stack using Ethereum – your Urbit OS node is hosted wherever you choose. The primary function of the Urbit ID registry is to keep track of who owns what, to specify which keys are associated with which names, and to enforce the rules of address distribution. We’ll get into the details a bit more below.
22+Your Urbit ID is a short, four-syllable name like ~ravmel-ropdyl that you own with an eight-syllable master passkey like ~palfun-foslup-fallyn-balfus. This name and key lets you log into Urbit OS, and it’s used to encrypt packets you send over the Urbit network. Soon it will also be a master key that allows holding and sending of Bitcoin and other cryptocurrencies. Your Urbit ID and passkey belong to you like any other cryptographic assets. No one can take them away from you (just make sure to store the key safely).
23
23
24−First, let’s talk about Urbit ID’s implementation and design goals, then about where we envision it going in the future.
24+The Urbit ID registry is live and deployed to the Ethereum blockchain. Urbit ID isn’t specifically wedded to Ethereum – someday we’d like it to be hosted by Urbit OS itself. Also, Urbit ID is the only component of the stack using Ethereum – your Urbit OS node is hosted wherever you choose. The primary function of the Urbit ID registry is to keep track of who owns what, to specify which keys are associated with which names, and to enforce the rules of address distribution.
25
25
26−If you’re curious to see exactly how this system works, the code is of course [open source](https://github.com/urbit/urbit). Including the source for our [phonemic naming system](https://github.com/urbit/urbit-ob/blob/master/src/internal/co.js) and the [visual representations](https://github.com/urbit/sigil-js). There’s even a [Figma plugin](https://github.com/urbit/sigil-figma-plugin) for using them. There’s also an interface for interacting with Urbit ID whose [source is open](https://github.com/urbit/bridge), too.
26+Each Urbit ID is really just a number. From that number we generate a pronounceable name and a visually identifiable sigil. ~dalwel-fadrun is 3,509,632,436, for example.
27
27
28−Since the Urbit ID registry is live and deployed you can even [look at the chain](https://github.com/urbit/azimuth#live-contracts).
28+Urbit IDs are distributed by a sponsorship tree. At the top of the tree are 28 (256) galaxies. Each galaxy issues 28 stars, making a total of 216 (65K). Stars then each can issue 216 planets, making for 232 (~4B). As you might expect, each planet issues 232 moons.
29
29
30−![](https://media.urbit.org/site/understanding-urbit/urbit-id/urbit-id-paperwallet%402x.png)
30+![](https://media.urbit.org/site/overview/overview-id.png)
31−
32−Each Urbit ID is really just a number. From that number we generate a pronounceable name and a visually identifiable sigil. `~dalwel-fadrun` is `3,509,632,436`, for example.
33−
34−Urbit IDs are distributed by a sponsorship tree. At the top of the tree are 2^8^ (256) galaxies. Each galaxy issues 2^8^ stars, making a total of 2^16^ (65K). Stars then each can issue 2^16^ planets, making for 2^32^ (~4B). As you might expect, each planet issues 2^32^ moons.
35
31
36You can also call stars ‘infrastructure nodes’ and galaxies ‘governance nodes’, since those are more descriptive names for their roles. Stars help route packets, kind of like an ISP. And galaxies are a bit like DNS root servers or ICANN members. The difference, of course, is that Urbit IDs are owned cryptographically by many different people and accrue reputation independently.
32You can also call stars ‘infrastructure nodes’ and galaxies ‘governance nodes’, since those are more descriptive names for their roles. Stars help route packets, kind of like an ISP. And galaxies are a bit like DNS root servers or ICANN members. The difference, of course, is that Urbit IDs are owned cryptographically by many different people and accrue reputation independently.
37
33
38−And that's it. It's a simple system. What's important is why it is the way it is. Let's take a look at that.
34+Design {% .font-bold .subpixel-antialiased .pt-8 %}
39−
40−![](https://media.urbit.org/site/understanding-urbit/urbit-id/urbit-id-address-space-1.svg)
41
35
42At a high level, there are three important things to understand about the overall Urbit ID system design.
36At a high level, there are three important things to understand about the overall Urbit ID system design.
43
37
44−First, scarcity: there are only 2^32^ (~4B) Urbit IDs, so they cost something. Since they cost something, people are less likely to use them to spam or abuse the network. When you meet a stranger with an Urbit ID, you know they have some skin in the game (even without leaking personal data in either direction). That said, each Urbit ID is purely pseudonymous, so `~dalwel-fadrun` for example, is proof of some stake in the network, but not much more.
38+First, scarcity: there are only 232 (~4B) Urbit IDs, so they cost something. Since they cost something, people are less likely to use them to spam or abuse the network. When you meet a stranger with an Urbit ID, you know they have some skin in the game (even without leaking personal data in either direction). That said, each Urbit ID is purely pseudonymous, so ~dalwel-fadrun for example, is proof of some stake in the network, but not much more.
45
39
46Second, decentralization: Urbit IDs are distributed by a sponsorship tree. Each sponsor issues a fixed number of addresses. Since there are lots of sponsors, there are lots of ways to get an Urbit ID — not just one central authority. Once you get one, it’s yours forever.
40Second, decentralization: Urbit IDs are distributed by a sponsorship tree. Each sponsor issues a fixed number of addresses. Since there are lots of sponsors, there are lots of ways to get an Urbit ID — not just one central authority. Once you get one, it’s yours forever.
47
41
@@ -53,16 +47,17 @@ The Urbit ID sponsorship tree is not intended to be a social system in any way.
53
47
54Your relationship with your sponsor should be sort of like your ISP or a utility provider: a passive, non-invasive relationship. If it isn’t to your liking, moving to a new sponsor is very easy.
48Your relationship with your sponsor should be sort of like your ISP or a utility provider: a passive, non-invasive relationship. If it isn’t to your liking, moving to a new sponsor is very easy.
55
49
56−![](https://media.urbit.org/site/understanding-urbit/urbit-id/urbit-id-sigils%402x.png)
50+Digital Land {% .font-bold .subpixel-antialiased .pt-8 %}
57
51
58Urbit IDs are property, and we think of the entire registry of Urbit IDs as a vast territory of digital land.
52Urbit IDs are property, and we think of the entire registry of Urbit IDs as a vast territory of digital land.
59
53
54+![](https://media.urbit.org/site/understanding-urbit/urbit-id/urbit-id-sigils%402x.png)
55+
60The scarcity of Urbit ID address space gives it value and that in turn helps bootstrap decentralization even while the project is young. Broad distribution is important – if Urbit is going to last a long time and succeed as neutral infrastructure, it has to be owned and controlled by a wide variety of people.
56The scarcity of Urbit ID address space gives it value and that in turn helps bootstrap decentralization even while the project is young. Broad distribution is important – if Urbit is going to last a long time and succeed as neutral infrastructure, it has to be owned and controlled by a wide variety of people.
61
57
62When we launched the Urbit ID system, in January of 2019, there were a couple thousand different star and galaxy holders acting as stewards of this digital land. Since then, that number has been steadily on the rise.
58When we launched the Urbit ID system, in January of 2019, there were a couple thousand different star and galaxy holders acting as stewards of this digital land. Since then, that number has been steadily on the rise.
63
59
64−![](https://media.urbit.org/site/understanding-urbit/project-history/uu-id-5.jpg)
65−
66Ultimately, we want your Urbit ID to feel like a civilizational key. If your Urbit ID were a piece of hardware, you could tap it to unlock a door, swipe it to buy a coffee, and plug it into any computer to log in. Your Urbit ID should be a unique, beautiful object that’s both an address and a wallet. It’s a key to a secret club and the ticket to your digital life.
60Ultimately, we want your Urbit ID to feel like a civilizational key. If your Urbit ID were a piece of hardware, you could tap it to unlock a door, swipe it to buy a coffee, and plug it into any computer to log in. Your Urbit ID should be a unique, beautiful object that’s both an address and a wallet. It’s a key to a secret club and the ticket to your digital life.
67
61
68−Moving on, let’s talk about what we want this whole stack to feel like as a user experience.
62+If you’re curious to see exactly how this system works, the code is of course [open source](https://github.com/urbit/urbit). Including the source for our [phonemic naming system](https://github.com/urbit/urbit-ob/blob/master/src/internal/co.js) and the [visual representations](https://github.com/urbit/sigil-js). There’s even a [Figma plugin](https://github.com/urbit/sigil-figma-plugin) for using them. There’s also an interface for interacting with Urbit ID whose [source is open](https://github.com/urbit/bridge), too. Since the Urbit ID registry is live and deployed you can even [look at the chain](https://github.com/urbit/azimuth#live-contracts).
63+
content/understanding-urbit/urbit-os.md → content/overview/urbit-os.mdrenamed+7−20
@@ -3,16 +3,11 @@ title = "Urbit OS"
3description = "What Urbit should feel like to an everyday user"
3description = "What Urbit should feel like to an everyday user"
4weight = 2
4weight = 2
5[extra]
5[extra]
6−flatten_pagination = "true"
7−hide_next_title = "true"
8−hide_previous_title = "true"
9−image = "https://storage.googleapis.com/media.urbit.org/site/understanding-urbit/intro/intro-5.jpg"
6+image = "https://media.urbit.org/site/understanding-urbit/intro/intro-5.jpg"
10+++
7+++
11
8
12For the most part, we use our laptops simply as access points to MEGACORP services. Our phones are the same. These services are amazing and convenient. But for that convenience we’ve traded away control, ownership and privacy. The way we live our digital lives is completely out of our hands.
9For the most part, we use our laptops simply as access points to MEGACORP services. Our phones are the same. These services are amazing and convenient. But for that convenience we’ve traded away control, ownership and privacy. The way we live our digital lives is completely out of our hands.
13
10
14−![](https://storage.googleapis.com/media.urbit.org/site/understanding-urbit/intro/intro-5.jpg)
15−
16Today’s MEGACORP monopolies retain their control because of one central technical advantage: they make the server side usable.
11Today’s MEGACORP monopolies retain their control because of one central technical advantage: they make the server side usable.
17
12
18Urbit OS is built to break these monopolies at this central point of control. Urbit OS makes the server side usable for individuals without the need for MEGACORP to run their software.
13Urbit OS is built to break these monopolies at this central point of control. Urbit OS makes the server side usable for individuals without the need for MEGACORP to run their software.
@@ -23,36 +18,28 @@ Today, we’re more or less back to the timesharing model of the 1970s. Urbit OS
23
18
24Let’s talk about how we think we’re going to pull this off from a technical standpoint, and our vision for using Urbit.
19Let’s talk about how we think we’re going to pull this off from a technical standpoint, and our vision for using Urbit.
25
20
26−If you’d like to skip ahead to what Urbit will be like to use [go ahead](/understanding-urbit/interface). Or if you’re someone who just wants to head to the source, [it’s here](https://github.com/urbit/urbit#urbit). In that case you may also want to [read the docs](https://urbit.org/docs/) to get up and running.
21+Architecture {% .font-bold .subpixel-antialiased .pt-8 %}
27−
28−![](https://media.urbit.org/site/understanding-urbit/technical-overview/technical-overview-kernel@2x.png)
29
22
30Urbit OS is a completely new, carefully architected software stack: a VM, programming language, and kernel designed to run software for an individual. Urbit OS is a program that runs on almost any cloud server, most laptops and many phones: anything with Unix and an internet connection.
23Urbit OS is a completely new, carefully architected software stack: a VM, programming language, and kernel designed to run software for an individual. Urbit OS is a program that runs on almost any cloud server, most laptops and many phones: anything with Unix and an internet connection.
31
24
25+![](https://media.urbit.org/site/overview/overview-os.png)
26+
32The main thing to understand about our ‘overlay OS’, as we call it, is that the foundation is a single, simple function. This function is the Urbit OS virtual machine. We call it ‘Nock’. The entire Urbit OS system compiles down to Nock, and Nock is just 33 lines of code.
27The main thing to understand about our ‘overlay OS’, as we call it, is that the foundation is a single, simple function. This function is the Urbit OS virtual machine. We call it ‘Nock’. The entire Urbit OS system compiles down to Nock, and Nock is just 33 lines of code.
33
28
34−Nock is similar in spirit to WASM or the JVM: it’s a uniform machine code for every Urbit [ship](https://urbit.org/docs/glossary/ship/). A frozen foundation makes for some nice features:
29+Nock is similar in spirit to WASM or the JVM: it’s a uniform machine code for every Urbit ship. A frozen foundation makes for some nice features:
35
30
36−The state of your Urbit OS is a pure function of its event history. It’s auditable, inspectable, repeatable. You can actually trust it.
37−Writing decentralized apps becomes vastly simpler than in the old world, since every node computes exactly the same way.
38−The entire Urbit OS stack, from programming language to applications, is upgradeable over the network. For ordinary users, this makes for almost no system administration.
31+The state of your Urbit OS is a pure function of its event history. It’s auditable, inspectable, repeatable. You can actually trust it. Writing decentralized apps becomes vastly simpler than in the old world, since every node computes exactly the same way. The entire Urbit OS stack, from programming language to applications, is upgradeable over the network. For ordinary users, this makes for almost no system administration.
39
32
40Since Nock is a protocol for computing itself, any two nodes on the Urbit network can easily share data, communicate and connect their software. 20th century systems could never do this without a MEGACORP acting as the intermediary.
33Since Nock is a protocol for computing itself, any two nodes on the Urbit network can easily share data, communicate and connect their software. 20th century systems could never do this without a MEGACORP acting as the intermediary.
41
34
42−![](https://media.urbit.org/site/understanding-urbit/network-os/urbit-os-diagram-apart.svg)
43−
44On top of this tiny VM we built a self-hosting, purely functional programming language, a kernel written in that language and a set of kernel modules that serve all the needs of personal computing. Specifically: a filesystem, build system, application sandbox, secret storage, web server, terminal driver and a networking protocol.
35On top of this tiny VM we built a self-hosting, purely functional programming language, a kernel written in that language and a set of kernel modules that serve all the needs of personal computing. Specifically: a filesystem, build system, application sandbox, secret storage, web server, terminal driver and a networking protocol.
45
36
46This sounds like a lot — but the whole stack is incredibly compact. The whole system clocks in at around 50K lines of code. We’ve seen individual developers understand the entire thing. Who is the last person you met that actually understands their entire computer? Urbit OS is like the 1968 Porsche 911 of operating systems: extremely simple, elegant, and built for the individual.
37This sounds like a lot — but the whole stack is incredibly compact. The whole system clocks in at around 50K lines of code. We’ve seen individual developers understand the entire thing. Who is the last person you met that actually understands their entire computer? Urbit OS is like the 1968 Porsche 911 of operating systems: extremely simple, elegant, and built for the individual.
47
38
48−![](https://media.urbit.org/site/understanding-urbit/project-history/uu-os-4.jpg)
49−
50But why did we build all this technology?
39But why did we build all this technology?
51
40
52−First and foremost, to deliver a better user experience. Urbit OS alone is just a new layer for personal computing in the cloud. But with this new layer we open up the possibility of building a completely unified interface for people to compute in the cloud. (If you’d like to skip to how we envision that interface, [go for it](/understanding-urbit/interface).)
41+First and foremost, to deliver a better user experience. Urbit OS alone is just a new layer for personal computing in the cloud. But with this new layer we open up the possibility of building a completely unified interface for people to compute in the cloud.
53
42
54From a broader perspective, it’s clear that connected computing is important and that it’s here to stay. We just want it to be as calm, simple and reliable as possible, and we don’t think that can happen using existing technology.
43From a broader perspective, it’s clear that connected computing is important and that it’s here to stay. We just want it to be as calm, simple and reliable as possible, and we don’t think that can happen using existing technology.
55
44
56All of Urbit is built to function as a single stack, and we think that building a useful product is the best way to mature the system as a whole. That said, each component of this system can be used on its own. Don’t like our client? That’s okay, you can build your own. Don’t want to use Urbit OS? No problem — you can use Urbit ID as an authentication system for some other OS, or for anything, really.
45All of Urbit is built to function as a single stack, and we think that building a useful product is the best way to mature the system as a whole. That said, each component of this system can be used on its own. Don’t like our client? That’s okay, you can build your own. Don’t want to use Urbit OS? No problem — you can use Urbit ID as an authentication system for some other OS, or for anything, really.
57−
58−Speaking of Urbit ID, let’s talk about what that actually is.
content/understanding-urbit/interface.mddeleted−68
@@ -1,68 +0,0 @@
1−+++
2−title = "Interface"
3−description = "What Urbit feels like to an everyday user"
4−weight = 4
5−[extra]
6−flatten_pagination = "true"
7−hide_next_title = "true"
8−hide_previous_title = "true"
9−+++
10−
11−We built Urbit OS + Urbit ID to be the software stack for human-scale computing in the cloud. This system wasn’t built solely to be new infrastructure—it was built so that we can build better interfaces on top and people can use Urbit without having to know about the technology at all. For Urbit to actually matter, we have to go all the way from VM to UI.
12−
13−This is why we built Landscape: a simple, calm, browser-based interface for building digital communities. We use Landscape to bring together our separate ways of communicating and collaborating.
14−
15−Landscape isn’t just an idea—it’s a real thing. Today, once you have an Urbit OS node up and running, you can access Landscape from a desktop or mobile browser to pseudonymously chat, write, and share links with a group of friends.
16−
17−We see Landscape as a new form of social software that can continue to grow and evolve for quite some time. We use the first version of Landscape, ‘OS 1’ every day. OS 1 is simple to the point of being simplistic. We look forward to evolving Landscape for a long time.
18−
19−Landscape is by no means the only possible interface for Urbit OS + Urbit ID, but it’s the one that we need the most. In the future, we look forward to there being lots of different Urbit interfaces (and if you’re at all interested in experimenting with building one, please do.)
20−
21−But we’ll get into that later. First, we’ll talk about why we built Landscape, where it is now, and where it’s going. Then we’ll cover a bit about other interface possibilities.
22−
23−![](https://media.urbit.org/site/understanding-urbit/project-history/uu-osn-1.svg)
24−
25−What problem is Landscape solving? Let’s start with the current situation when it comes to cloud services.
26−
27−In today’s world of apps and services, there’s no operating system in any meaningful sense. Our communities, co-workers, and lives are spread between these services—and the work of combining them is left to the user. It’s completely up to you to remember all your passwords, who sent what message where, what files are on which platform, and so on.
28−
29−Above all else, our digital lives today are missing a sense of place, a sense of home.
30−
31−It’s annoying and confusing to switch between interfaces, you can’t extend or build on top, and privacy and security are out of your hands. This fragmented, siloed, closely surveilled experience is simply a byproduct of having other people run and control your software. For the ordinary user, the result is restrictive, boring, and painful to manage. The possibility for everyday creativity with the tools we’re stuck with is close to zero. Wasn’t the computer supposed to be a bicycle for the mind?
32−
33−Operating systems for the PC took the desk of the 1970s and made it digital. Paper, drawers, and envelopes became ‘files’ and ‘folders’. It’s a great abstraction, but it’s ancient. We live in a connected, multiplayer world; we need an operating system that acknowledges this world.
34−
35−The ‘desk’ of today is cluttered with apps and services, data structures, and interfaces. Unifying this disjointed user experience is the most important problem that a platform like Urbit can solve. Landscape is built to bring everything together into a unified interface again. Without Urbit ID + Urbit OS, this would be impossible.
36−
37−In March 2020 we shipped the first public version of Landscape, OS 1, to the network and have been using it ever since to communicate, collaborate, and keep in touch.
38−
39−OS 1 is a minimal, multipurpose interface for bringing a group together to chat, share links, write and engage in discussion. OS 1 is free of any ads, tracking, or surveillance (as is the norm for anything built on Urbit). OS 1 is a stripped-down social utility designed for high-trust, direct communication and collaboration. OS 1 is the place for small communities to feel at home.
40−
41−![](https://storage.googleapis.com/media.urbit.org/site/understanding-urbit/uu-interface-3.png)
42−
43−We 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.
44−
45−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/) to come talk to us.
46−
47−Our target with OS 1 was to produce the [Nokia 3310](https://en.wikipedia.org/wiki/Nokia_3310) of cloud computers. Something bordering on simplistic, but still nice to use. We hit that target, but it’s just the first milestone. Let’s talk a bit about how Landscape grows and matures at a high level (for more specifics on the near-to-medium term, check out [the roadmap](https://urbit.org/understanding-urbit/roadmap/)).
48−
49−![](https://storage.googleapis.com/media.urbit.org/site/understanding-urbit/uu-interface-4.png)
50−
51−Landscape has two basic building blocks: groups and modules. A group is exactly what it sounds like: one or more people. A module is sort of like an app without the data lock-in. A module is just a tool for getting something done, like ‘tasks’, ‘links’ or ‘votes’ that’s shared by a group.
52−
53−To give a few simple examples, a group of family members may just chat and share photos. A group of traders might share annotated research, watch the markets, and manage payments on a blockchain.
54−
55−Today, Landscape only has a few modules that come out of the box: chat, links, and publish. Our plan is to keep expanding this suite such that the default suite of modules feels like a nicely balanced toolkit for building community and staying connected. We’d also like to make it easy for anyone to build their own module and share it with others directly over Urbit’s network.
56−
57−The idea is this: any community should be able to customize their digital environment freely. For most users, this is just about choosing the right modules. For anyone with a bit of free time, adding your own modules should only be as difficult as building a simple webapp.
58−
59−When we look forward to what we can do with Landscape in the future, it’s hard to see ourselves going back to the tools we use today. The centralized services we have now are like broadcast media: they’re for distributing content from a producer to a bunch of followers.
60−
61−Landscape is for everything else. Landscape is for actual two-way communication.
62−
63−![](https://media.urbit.org/site/understanding-urbit/your-last-computer/your-last-computer-waves%402x.png)
64−
65−Our desire to build a single place to work together isn’t driven just by convenience
66−(although it is quite convenient). The way we see it, [real communities need to have real ownership over the spaces they inhabit](https://urbit.org/blog/urbit-is-for-communities/). When communities use industrial-grade, one-size-fits-all software they feel as sterile as the software they use. That world always felt a bit like living in a planned community. We’d rather live in the countryside.
67−
68−We think Landscape can evolve into something even _more_ powerful, cleaner, and more satisfying to use. Landscape is neither a social network nor productivity software. Landscape isn’t centrally controlled or passively surveilled. Landscape is something entirely new. It’s software that’s tailored to the people who use it, by the people who use it.
content/understanding-urbit/people-history.mddeleted−98
@@ -1,98 +0,0 @@
1−+++
2−title = "People + History"
3−description = "Where we've been and were we are now"
4−weight = 6
5−[extra]
6−flatten_pagination = "true"
7−hide_next_title = "true"
8−hide_previous_title = "true"
9−image = "https://media.urbit.org/site/understanding-urbit/project-history/project-status-landscape-earth%402x.png"
10−+++
11−
12−So who builds this thing? Where does it come from? What’s the history?
13−
14−Today, Urbit is built and maintained by two companies, a community of contributors and core developers, infrastructure (star) operators, and governance (galaxy) node owners.
15−
16−Let’s talk first about these individual groups within the Urbit community, then about the history of the project and how it came to be.
17−
18−![](https://media.urbit.org/site/understanding-urbit/project-history/project-status-landscape-earth@2x.png)
19−
20−There are currently two independent companies that work on building Urbit full-time: [Tlon](https://tlon.io/) and [urbit.live](https://urbit.live/).
21−
22−Tlon has been around since 2013 or so, and is primarily focussed on the development of Urbit OS and its user experience. Urbit.live was started in 2018 to make the onramp into Urbit as easy as possible. Both companies contribute regularly to the code base.
23−
24−Tlon was originally granted about half of the Urbit ID address space, and has used that to fund its operations so far. Over time, Tlon plans to offer hosting and services to make using Urbit as easy as possible.
25−
26−Tlon is also working to set up an urbit.org foundation. This is still in process, and is expected to happen in 2020.
27−
28−Urbit.live started selling Urbit IDs very early once that became possible, and also plans to offer services within the Urbit ecosystem.
29−
30−The community of contributors and core developers has been steadily contributing to the code base since before Tlon existed, and they’re still going strong. They can primarily be found on Urbit itself, in the Urbit Community (`~bitbet-bolbel/urbit-community)`, the [urbit-dev mailing list](https://groups.google.com/a/urbit.org/forum/#!forum/dev) and on [GitHub](https://github.com/urbit).
31−
32−When the Urbit ID address space went on-chain in early 2019 there were about 2,000 star holders and 70 galaxy holders – that number has since grown steadily. For the most part, the best way to connect with them is through Urbit itself.
33−
34−![](https://media.urbit.org/site/understanding-urbit/uu-people-history-2a.jpg)
35−
36−![](https://media.urbit.org/site/understanding-urbit/uu-people-history-2c.jpg)
37−
38−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) can help you do.
39−
40−For 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.
41−
42−![](https://media.urbit.org/site/understanding-urbit/project-history/history-4.svg)
43−
44−At the beginning, Urbit was just a few people with the right combination of imagination and discipline to try to rebuild computing.
45−
46−**2002**
47−
48−Urbit starts as an open-ended personal project. An “independent study PhD” to reinvent computing for a network-centric world.
49−
50−**2008**
51−
52−Nock, the foundation of Urbit, works. Coming in at 32 lines of code, that’s 1 line of code every two months.
53−
54−**2012**
55−
56−Hoon, Urbit’s programming language, compiles itself to Nock. Writing Hoon is much easier than writing Nock.
57−
58−**2013**
59−
60−Arvo, Urbit’s OS kernel, boots and the first live Urbit network is started with a command-line chat.
61−
62−**2014**
63−
64−Tlon is founded to help support Urbit development (and is < 8 people for the next four years).
65−
66−**2015**
67−
68−Urbit has its first web interface and serves its own website.
69−
70−**2016**
71−
72−The first sale of Urbit address space sells out in four hours.
73−
74−**2017**
75−
76−Our test network runs for ten months without a reboot.
77−
78−Our private sale, shared only with our mailing list, sells out in six hours — limit two per person.
79−
80−**2018**
81−
82−Tlon sells about 8% of its stake in the network to accelerate Urbit development.
83−urbit.live gets going and starts selling Urbit IDs to the public.
84−
85−**2019**
86−
87−Tlon spends the year stabilizing Arvo and building OS 1.
88−
89−![](https://media.urbit.org/site/understanding-urbit/uu-history-4.jpg)
90−
91−Building Urbit is about building a future where technology doesn’t control us. Instead, we look forward to a future where technology is simpler, more reliable and less invasive.
92−
93−Keep 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).
94−
95−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).
96−
97−If you’re interested in homesteading a community when OS 1 comes out, [apply here](/community/community-grants).
98−
content/understanding-urbit/roadmap.mddeleted−87
@@ -1,87 +0,0 @@
1−+++
2−title = "Roadmap: OS 1 -> OS N"
3−description = "The core ideas that Urbit is built around"
4−weight = 5
5−[extra]
6−flatten_pagination = "true"
7−hide_next_title = "true"
8−hide_previous_title = "true"
9−+++
10−
11−## Landscape 1 → 3
12−
13−Let’s talk about where we’d like Urbit to go and how we’re going to get there.
14−
15−We’re working to build Urbit ID + Urbit OS into a human-scale replacement for the industrial-grade software stack that powers our centralized apps and services today. In time, we want Urbit to be as robust as Unix and the internet protocol suite that today’s stack rests on. We look forward to a future where Urbit is a standardized, unremarkable, ubiquitous computing substrate used and owned by everyone.
16−
17−We started out by building a prototype for what this future foundation should look like. We spent the early years working primarily on the architecture of the system—but a new platform needs a clear use-case, a way to put it to work. This is what we’ve been building in the last year or so. It’s called Landscape.
18−
19−Landscape is a flexible tool for communicating and collaborating with friends that runs on top of Urbit OS.
20−
21−Landscape lets you bring a group of people together to communicate, collaborate, and do business. Think of it as a combination of ‘productivity software’ and ‘social networking’. Landscape is for bringing together a group of people to share a set of ‘modules’, or things to do, and customizing an environment for the group to stay connected. For a full rundown, see the [interface section](https://urbit.org/understanding-urbit/interface/).
22−
23−Bringing together many different things in one place is something only a general-purpose platform like Urbit can do, and it’s exactly what we want as an alternative to single-purpose centralized software.
24−
25−As Urbit matures, other killer digital environments may emerge—but Landscape is the app we need if we want to move away from the world of MEGACORP software and onto a secure, distraction-free network of our own.
26−
27−![A Landscape](https://storage.googleapis.com/media.urbit.org/tlon/landscape.png)
28−
29−Today, we pour all of our focus into making Landscape a comfortable place for digital communities to call home, starting with our own. This effort forces us to mature the entire stack, from the interpreter to the interface.
30−
31−Let’s walk through the next few phases of Landscape to get a sense of where we are and where we’re headed.
32−
33−![The current state of Landscape/OS1](https://storage.googleapis.com/media.urbit.org/site/understanding-urbit/uu-interface-3.png)
34−
35−### Today: Landscape OS 1.N
36−
37−We 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.
38−
39−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/).)
40−
41−The 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.
42−
43−Our initial goal was just to get ourselves living on Urbit everyday. We achieved that, and managed to see quite a few other communities pop up along the way. We made enormous progress, but our system isn’t refined or reliable enough. It also still needs a thorough security audit (which we’re already working on).
44−
45−OS 1 was a huge step forward. Let’s talk about what’s next.
46−
47−![A speculative interface for Landscape S2](https://storage.googleapis.com/media.urbit.org/site/understanding-urbit/uu-interface-4.png)
48−
49−## Late 2020: Landscape S2
50−
51−**It’s weird to have both ‘Urbit OS’ and a client called ‘OS 1’. After OS 1 we’re going to move to a different naming scheme for Landscape—starting with Landscape S2.**
52−
53−OS 1 is nice, but it’s only usable by explorers, tinkerers, and hobbyists. It’s rough around the edges. You have to _want_ to use Urbit as much as we do.
54−
55−Landscape S2 is much more comfortable. Landscape S2 has a polished, groups-oriented interface, a much more robust data storage format, significant gains in performance and memory management, and a much more reliable way to migrate your data.
56−
57−Most importantly, Landscape S2 has a completely redesigned invitation and onboarding process that will arrive in tandem with a [hosting service](https://tlon.io) from Tlon. (Last we heard there are a few others working on Urbit hosting as well—we’ll link to them as soon as they’re ready.)
58−
59−This means you can easily invite a friend from within Landscape and have them up and running in a few minutes without ever leaving a browser. Every conventional app does this already, of course, but none of them can offer the simplicity and clarity of running on Urbit OS.
60−
61−We know that getting onto the network can be difficult for less technical users. Everyone currently has to run and care for their own node. With easy onboarding we can use Landscape to start building the communities that never really felt at home on these conventional, one-size-fits-all platforms: the-contemporary-monastery, music-in-the-age-of-COVID, and so on.
62−
63−We’re planning to share the hosted version of S2 with a few small communities to test it out and put it through the paces. If you’re curious, [let us know](https://tlon.io).
64−
65−![A speculative payments interface](https://storage.googleapis.com/media.urbit.org/site/understanding-urbit/uu-roadmap-4.jpg)
66−
67−## Early 2021: Landscape S3
68−
69−Landscape S3 will be a tool for communicating and working together that we can enthusiastically invite others to use.
70−
71−A native desktop and mobile app, Landscape S3 will be supported by at least one host (Tlon) for easy inviting and onboarding that can support urbit-to-urbit crypto payments. With the addition of basic commerce, Landscape S3 will be a comprehensive environment for communities to make their own.
72−
73−Perhaps most importantly, Landscape 3 will be backed by a fully audited networking protocol. We’re in the process of auditing our networking now and, once complete, we can be confident that communication over Urbit is secure.
74−
75−Landscape inherits the benefits of Urbit itself: simplicity, durability, and a real sense of ownership. These come out of the box, from the beginning, but supporting a fully-featured interface makes a lot of demands of a new stack. By Landscape 3 our interface and infrastructure will have matured to the point that it can be confidently held up against alternatives.
76−
77−![A landscape](https://storage.googleapis.com/media.urbit.org/site/understanding-urbit/uu-roadmap-5.jpg)
78−
79−## 2021 and beyond
80−
81−Our goal with Landscape is to give communities the tools they deserve to customize their digital environments. By Landscape S3, our interface and infrastructure will truly support this.
82−
83−But 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.
84−
85−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.
86−
87−For now, let’s move on to who builds this thing and where it came from.
package-lock.json+344−111
@@ -69,14 +69,44 @@
69 }
69 }
70 },
70 },
71 "node_modules/@next/env": {
71 "node_modules/@next/env": {
72− "version": "12.2.0",
72+ "version": "12.2.2",
73− "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.0.tgz",
73+ "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.2.tgz",
74− "integrity": "sha512-/FCkDpL/8SodJEXvx/DYNlOD5ijTtkozf4PPulYPtkPOJaMPpBSOkzmsta4fnrnbdH6eZjbwbiXFdr6gSQCV4w=="
74+ "integrity": "sha512-BqDwE4gDl1F608TpnNxZqrCn6g48MBjvmWFEmeX5wEXDXh3IkAOw6ASKUgjT8H4OUePYFqghDFUss5ZhnbOUjw=="
75+ },
76+ "node_modules/@next/swc-android-arm-eabi": {
77+ "version": "12.2.2",
78+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.2.2.tgz",
79+ "integrity": "sha512-VHjuCHeq9qCprUZbsRxxM/VqSW8MmsUtqB5nEpGEgUNnQi/BTm/2aK8tl7R4D0twGKRh6g1AAeFuWtXzk9Z/vQ==",
80+ "cpu": [
81+ "arm"
82+ ],
83+ "optional": true,
84+ "os": [
85+ "android"
86+ ],
87+ "engines": {
88+ "node": ">= 10"
89+ }
90+ },
91+ "node_modules/@next/swc-android-arm64": {
92+ "version": "12.2.2",
93+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.2.2.tgz",
94+ "integrity": "sha512-v5EYzXUOSv0r9mO/2PX6mOcF53k8ndlu9yeFHVAWW1Dhw2jaJcvTRcCAwYYN8Q3tDg0nH3NbEltJDLKmcJOuVA==",
95+ "cpu": [
96+ "arm64"
97+ ],
98+ "optional": true,
99+ "os": [
100+ "android"
101+ ],
102+ "engines": {
103+ "node": ">= 10"
104+ }
75 },
105 },
76 "node_modules/@next/swc-darwin-arm64": {
106 "node_modules/@next/swc-darwin-arm64": {
77− "version": "12.2.0",
107+ "version": "12.2.2",
78− "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.0.tgz",
108+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.2.tgz",
79− "integrity": "sha512-x5U5gJd7ZvrEtTFnBld9O2bUlX8opu7mIQUqRzj7KeWzBwPhrIzTTsQXAiNqsaMuaRPvyHBVW/5d/6g6+89Y8g==",
109+ "integrity": "sha512-JCoGySHKGt+YBk7xRTFGx1QjrnCcwYxIo3yGepcOq64MoiocTM3yllQWeOAJU2/k9MH0+B5E9WUSme4rOCBbpA==",
80 "cpu": [
110 "cpu": [
81 "arm64"
111 "arm64"
82 ],
112 ],
@@ -88,6 +118,156 @@
88 "node": ">= 10"
118 "node": ">= 10"
89 }
119 }
90 },
120 },
121+ "node_modules/@next/swc-darwin-x64": {
122+ "version": "12.2.2",
123+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.2.2.tgz",
124+ "integrity": "sha512-dztDtvfkhUqiqpXvrWVccfGhLe44yQ5tQ7B4tBfnsOR6vxzI9DNPHTlEOgRN9qDqTAcFyPxvg86mn4l8bB9Jcw==",
125+ "cpu": [
126+ "x64"
127+ ],
128+ "optional": true,
129+ "os": [
130+ "darwin"
131+ ],
132+ "engines": {
133+ "node": ">= 10"
134+ }
135+ },
136+ "node_modules/@next/swc-freebsd-x64": {
137+ "version": "12.2.2",
138+ "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.2.2.tgz",
139+ "integrity": "sha512-JUnXB+2xfxqsAvhFLPJpU1NeyDsvJrKoOjpV7g3Dxbno2Riu4tDKn3kKF886yleAuD/1qNTUCpqubTvbbT2VoA==",
140+ "cpu": [
141+ "x64"
142+ ],
143+ "optional": true,
144+ "os": [
145+ "freebsd"
146+ ],
147+ "engines": {
148+ "node": ">= 10"
149+ }
150+ },
151+ "node_modules/@next/swc-linux-arm-gnueabihf": {
152+ "version": "12.2.2",
153+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.2.2.tgz",
154+ "integrity": "sha512-XeYC/qqPLz58R4pjkb+x8sUUxuGLnx9QruC7/IGkK68yW4G17PHwKI/1njFYVfXTXUukpWjcfBuauWwxp9ke7Q==",
155+ "cpu": [
156+ "arm"
157+ ],
158+ "optional": true,
159+ "os": [
160+ "linux"
161+ ],
162+ "engines": {
163+ "node": ">= 10"
164+ }
165+ },
166+ "node_modules/@next/swc-linux-arm64-gnu": {
167+ "version": "12.2.2",
168+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.2.2.tgz",
169+ "integrity": "sha512-d6jT8xgfKYFkzR7J0OHo2D+kFvY/6W8qEo6/hmdrTt6AKAqxs//rbbcdoyn3YQq1x6FVUUd39zzpezZntg9Naw==",
170+ "cpu": [
171+ "arm64"
172+ ],
173+ "optional": true,
174+ "os": [
175+ "linux"
176+ ],
177+ "engines": {
178+ "node": ">= 10"
179+ }
180+ },
181+ "node_modules/@next/swc-linux-arm64-musl": {
182+ "version": "12.2.2",
183+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.2.2.tgz",
184+ "integrity": "sha512-rIZRFxI9N/502auJT1i7coas0HTHUM+HaXMyJiCpnY8Rimbo0495ir24tzzHo3nQqJwcflcPTwEh/DV17sdv9A==",
185+ "cpu": [
186+ "arm64"
187+ ],
188+ "optional": true,
189+ "os": [
190+ "linux"
191+ ],
192+ "engines": {
193+ "node": ">= 10"
194+ }
195+ },
196+ "node_modules/@next/swc-linux-x64-gnu": {
197+ "version": "12.2.2",
198+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.2.2.tgz",
199+ "integrity": "sha512-ir1vNadlUDj7eQk15AvfhG5BjVizuCHks9uZwBfUgT5jyeDCeRvaDCo1+Q6+0CLOAnYDR/nqSCvBgzG2UdFh9A==",
200+ "cpu": [
201+ "x64"
202+ ],
203+ "optional": true,
204+ "os": [
205+ "linux"
206+ ],
207+ "engines": {
208+ "node": ">= 10"
209+ }
210+ },
211+ "node_modules/@next/swc-linux-x64-musl": {
212+ "version": "12.2.2",
213+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.2.2.tgz",
214+ "integrity": "sha512-bte5n2GzLN3O8JdSFYWZzMgEgDHZmRz5wiispiiDssj4ik3l8E7wq/czNi8RmIF+ioj2sYVokUNa/ekLzrESWw==",
215+ "cpu": [
216+ "x64"
217+ ],
218+ "optional": true,
219+ "os": [
220+ "linux"
221+ ],
222+ "engines": {
223+ "node": ">= 10"
224+ }
225+ },
226+ "node_modules/@next/swc-win32-arm64-msvc": {
227+ "version": "12.2.2",
228+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.2.2.tgz",
229+ "integrity": "sha512-ZUGCmcDmdPVSAlwJ/aD+1F9lYW8vttseiv4n2+VCDv5JloxiX9aY32kYZaJJO7hmTLNrprvXkb4OvNuHdN22Jg==",
230+ "cpu": [
231+ "arm64"
232+ ],
233+ "optional": true,
234+ "os": [
235+ "win32"
236+ ],
237+ "engines": {
238+ "node": ">= 10"
239+ }
240+ },
241+ "node_modules/@next/swc-win32-ia32-msvc": {
242+ "version": "12.2.2",
243+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.2.2.tgz",
244+ "integrity": "sha512-v7ykeEDbr9eXiblGSZiEYYkWoig6sRhAbLKHUHQtk8vEWWVEqeXFcxmw6LRrKu5rCN1DY357UlYWToCGPQPCRA==",
245+ "cpu": [
246+ "ia32"
247+ ],
248+ "optional": true,
249+ "os": [
250+ "win32"
251+ ],
252+ "engines": {
253+ "node": ">= 10"
254+ }
255+ },
256+ "node_modules/@next/swc-win32-x64-msvc": {
257+ "version": "12.2.2",
258+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.2.tgz",
259+ "integrity": "sha512-2D2iinWUL6xx8D9LYVZ5qi7FP6uLAoWymt8m8aaG2Ld/Ka8/k723fJfiklfuAcwOxfufPJI+nRbT5VcgHGzHAQ==",
260+ "cpu": [
261+ "x64"
262+ ],
263+ "optional": true,
264+ "os": [
265+ "win32"
266+ ],
267+ "engines": {
268+ "node": ">= 10"
269+ }
270+ },
91 "node_modules/@nodelib/fs.scandir": {
271 "node_modules/@nodelib/fs.scandir": {
92 "version": "2.1.5",
272 "version": "2.1.5",
93 "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
273 "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -121,9 +301,9 @@
121 }
301 }
122 },
302 },
123 "node_modules/@socialgouv/matomo-next": {
303 "node_modules/@socialgouv/matomo-next": {
124− "version": "1.3.0",
304+ "version": "1.4.0",
125− "resolved": "https://registry.npmjs.org/@socialgouv/matomo-next/-/matomo-next-1.3.0.tgz",
305+ "resolved": "https://registry.npmjs.org/@socialgouv/matomo-next/-/matomo-next-1.4.0.tgz",
126− "integrity": "sha512-1EWGFre4CudvcJPIaLYyAwHsGk8mMK5/IKztEIaU14uUifv117dlIJmcpJIVEow70AMY1VqRHh1x5z7Dx+H7dQ==",
306+ "integrity": "sha512-S+kNX7dwo/cL0VE7GWY8Gnf3t7aeXD4CzallRz9IEttjHJDJI2S8xOrcyaGimYpInr3nDNo+WqeYrafKUdsn1g==",
127 "peerDependencies": {
307 "peerDependencies": {
128 "next": ">= 9.5.5"
308 "next": ">= 9.5.5"
129 }
309 }
@@ -416,9 +596,9 @@
416 }
596 }
417 },
597 },
418 "node_modules/caniuse-lite": {
598 "node_modules/caniuse-lite": {
419− "version": "1.0.30001363",
599+ "version": "1.0.30001365",
420− "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001363.tgz",
600+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001365.tgz",
421− "integrity": "sha512-HpQhpzTGGPVMnCjIomjt+jvyUu8vNFo3TaDiZ/RcoTrlOq/5+tC8zHdsbgFB6MxmaY+jCpsH09aD80Bb4Ow3Sg==",
601+ "integrity": "sha512-VDQZ8OtpuIPMBA4YYvZXECtXbddMCUFJk1qu8Mqxfm/SZJNSr1cy4IuLCOL7RJ/YASrvJcYg1Zh+UEUQ5m6z8Q==",
422 "funding": [
602 "funding": [
423 {
603 {
424 "type": "opencollective",
604 "type": "opencollective",
@@ -513,16 +693,6 @@
513 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
693 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
514 "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
694 "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
515 },
695 },
516− "node_modules/core-js": {
517− "version": "3.23.3",
518− "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.3.tgz",
519− "integrity": "sha512-oAKwkj9xcWNBAvGbT//WiCdOMpb9XQG92/Fe3ABFM/R16BsHgePG00mFOgKf7IsCtfj8tA1kHtf/VwErhriz5Q==",
520− "hasInstallScript": true,
521− "funding": {
522− "type": "opencollective",
523− "url": "https://opencollective.com/core-js"
524− }
525− },
526 "node_modules/cross-spawn": {
696 "node_modules/cross-spawn": {
527 "version": "6.0.5",
697 "version": "6.0.5",
528 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
698 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
@@ -686,9 +856,9 @@
686 }
856 }
687 },
857 },
688 "node_modules/electron-to-chromium": {
858 "node_modules/electron-to-chromium": {
689− "version": "1.4.180",
859+ "version": "1.4.187",
690− "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.180.tgz",
860+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.187.tgz",
691− "integrity": "sha512-7at5ash3FD9U5gPa3/wPr6OdiZd/zBjvDZaaHBpcqFOFUhZiWnb7stkqk8xUFL9H9nk7Yok5vCCNK8wyC/+f8A=="
861+ "integrity": "sha512-t3iFLHVIMhB8jGZ+8ui951nz6Bna5qKfhxezG3wzXdBJ79qFKPsE2chjjVFNqC1ewhfrPQrw9pmVeo4FFpZeQA=="
692 },
862 },
693 "node_modules/end-of-stream": {
863 "node_modules/end-of-stream": {
694 "version": "1.4.4",
864 "version": "1.4.4",
@@ -946,12 +1116,10 @@
946 },
1116 },
947 "node_modules/foundation-design-system": {
1117 "node_modules/foundation-design-system": {
948 "version": "0.0.0",
1118 "version": "0.0.0",
949− "resolved": "git+ssh://git@github.com/urbit/foundation-design-system.git#48782df954c24ed4c399ca89873639280830fbeb",
1119+ "resolved": "git+ssh://git@github.com/urbit/foundation-design-system.git#af413f40c379005cf609c2adde545da9638f38e3",
950− "integrity": "sha512-mX1qj+gDYLy7iWLjrGwYj4vgv94IB1ek8FuCmq+PENICDL0ZKgKFS1ntGKqoA84SOLL5Asl1IGjyokX6NsLD7g==",
951 "license": "MIT",
1120 "license": "MIT",
952 "dependencies": {
1121 "dependencies": {
953 "@markdoc/markdoc": "0.1.3",
1122 "@markdoc/markdoc": "0.1.3",
954− "core-js": "^3.23.1",
955 "html-react-parser": "^1.4.14",
1123 "html-react-parser": "^1.4.14",
956 "patch-package": "^6.4.7",
1124 "patch-package": "^6.4.7",
957 "prism-react-renderer": "^1.3.3",
1125 "prism-react-renderer": "^1.3.3",
@@ -1441,9 +1609,9 @@
1441 }
1609 }
1442 },
1610 },
1443 "node_modules/lilconfig": {
1611 "node_modules/lilconfig": {
1444− "version": "2.0.5",
1612+ "version": "2.0.6",
1445− "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
1613+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
1446− "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==",
1614+ "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==",
1447 "engines": {
1615 "engines": {
1448 "node": ">=10"
1616 "node": ">=10"
1449 }
1617 }
@@ -1492,9 +1660,9 @@
1492 }
1660 }
1493 },
1661 },
1494 "node_modules/luxon": {
1662 "node_modules/luxon": {
1495− "version": "2.4.0",
1663+ "version": "2.5.0",
1496− "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.4.0.tgz",
1664+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.5.0.tgz",
1497− "integrity": "sha512-w+NAwWOUL5hO0SgwOHsMBAmZ15SoknmQXhSO0hIbJCAmPKSsGeK8MlmhYh2w6Iib38IxN2M+/ooXWLbeis7GuA==",
1665+ "integrity": "sha512-IDkEPB80Rb6gCAU+FEib0t4FeJ4uVOuX1CQ9GsvU3O+JAGIgu0J7sf1OarXKaKDygTZIoJyU6YdZzTFRu+YR0A==",
1498 "engines": {
1666 "engines": {
1499 "node": ">=12"
1667 "node": ">=12"
1500 }
1668 }
@@ -1587,11 +1755,11 @@
1587 }
1755 }
1588 },
1756 },
1589 "node_modules/next": {
1757 "node_modules/next": {
1590− "version": "12.2.0",
1758+ "version": "12.2.2",
1591− "resolved": "https://registry.npmjs.org/next/-/next-12.2.0.tgz",
1759+ "resolved": "https://registry.npmjs.org/next/-/next-12.2.2.tgz",
1592− "integrity": "sha512-B4j7D3SHYopLYx6/Ark0fenwIar9tEaZZFAaxmKjgcMMexhVJzB3jt7X+6wcdXPPMeUD6r09weUtnDpjox/vIA==",
1760+ "integrity": "sha512-zAYFY45aBry/PlKONqtlloRFqU/We3zWYdn2NoGvDZkoYUYQSJC8WMcalS5C19MxbCZLUVCX7D7a6gTGgl2yLg==",
1593 "dependencies": {
1761 "dependencies": {
1594− "@next/env": "12.2.0",
1762+ "@next/env": "12.2.2",
1595 "@swc/helpers": "0.4.2",
1763 "@swc/helpers": "0.4.2",
1596 "caniuse-lite": "^1.0.30001332",
1764 "caniuse-lite": "^1.0.30001332",
1597 "postcss": "8.4.5",
1765 "postcss": "8.4.5",
@@ -1605,19 +1773,19 @@
1605 "node": ">=12.22.0"
1773 "node": ">=12.22.0"
1606 },
1774 },
1607 "optionalDependencies": {
1775 "optionalDependencies": {
1608− "@next/swc-android-arm-eabi": "12.2.0",
1776+ "@next/swc-android-arm-eabi": "12.2.2",
1609− "@next/swc-android-arm64": "12.2.0",
1777+ "@next/swc-android-arm64": "12.2.2",
1610− "@next/swc-darwin-arm64": "12.2.0",
1778+ "@next/swc-darwin-arm64": "12.2.2",
1611− "@next/swc-darwin-x64": "12.2.0",
1779+ "@next/swc-darwin-x64": "12.2.2",
1612− "@next/swc-freebsd-x64": "12.2.0",
1780+ "@next/swc-freebsd-x64": "12.2.2",
1613− "@next/swc-linux-arm-gnueabihf": "12.2.0",
1781+ "@next/swc-linux-arm-gnueabihf": "12.2.2",
1614− "@next/swc-linux-arm64-gnu": "12.2.0",
1782+ "@next/swc-linux-arm64-gnu": "12.2.2",
1615− "@next/swc-linux-arm64-musl": "12.2.0",
1783+ "@next/swc-linux-arm64-musl": "12.2.2",
1616− "@next/swc-linux-x64-gnu": "12.2.0",
1784+ "@next/swc-linux-x64-gnu": "12.2.2",
1617− "@next/swc-linux-x64-musl": "12.2.0",
1785+ "@next/swc-linux-x64-musl": "12.2.2",
1618− "@next/swc-win32-arm64-msvc": "12.2.0",
1786+ "@next/swc-win32-arm64-msvc": "12.2.2",
1619− "@next/swc-win32-ia32-msvc": "12.2.0",
1787+ "@next/swc-win32-ia32-msvc": "12.2.2",
1620− "@next/swc-win32-x64-msvc": "12.2.0"
1788+ "@next/swc-win32-x64-msvc": "12.2.2"
1621 },
1789 },
1622 "peerDependencies": {
1790 "peerDependencies": {
1623 "fibers": ">= 3.1.0",
1791 "fibers": ">= 3.1.0",
@@ -1670,9 +1838,9 @@
1670 "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
1838 "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
1671 },
1839 },
1672 "node_modules/node-releases": {
1840 "node_modules/node-releases": {
1673− "version": "2.0.5",
1841+ "version": "2.0.6",
1674− "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
1842+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
1675− "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q=="
1843+ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg=="
1676 },
1844 },
1677 "node_modules/normalize-path": {
1845 "node_modules/normalize-path": {
1678 "version": "3.0.0",
1846 "version": "3.0.0",
@@ -2576,9 +2744,9 @@
2576 }
2744 }
2577 },
2745 },
2578 "node_modules/tailwindcss": {
2746 "node_modules/tailwindcss": {
2579− "version": "3.1.4",
2747+ "version": "3.1.6",
2580− "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.4.tgz",
2748+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.6.tgz",
2581− "integrity": "sha512-NrxbFV4tYsga/hpWbRyUfIaBrNMXDxx5BsHgBS4v5tlyjf+sDsgBg5m9OxjrXIqAS/uR9kicxLKP+bEHI7BSeQ==",
2749+ "integrity": "sha512-7skAOY56erZAFQssT1xkpk+kWt2NrO45kORlxFPXUt3CiGsVPhH1smuH5XoDH6sGPXLyBv+zgCKA2HWBsgCytg==",
2582 "dependencies": {
2750 "dependencies": {
2583 "arg": "^5.0.2",
2751 "arg": "^5.0.2",
2584 "chokidar": "^3.5.3",
2752 "chokidar": "^3.5.3",
@@ -2601,7 +2769,7 @@
2601 "postcss-selector-parser": "^6.0.10",
2769 "postcss-selector-parser": "^6.0.10",
2602 "postcss-value-parser": "^4.2.0",
2770 "postcss-value-parser": "^4.2.0",
2603 "quick-lru": "^5.1.1",
2771 "quick-lru": "^5.1.1",
2604− "resolve": "^1.22.0"
2772+ "resolve": "^1.22.1"
2605 },
2773 },
2606 "bin": {
2774 "bin": {
2607 "tailwind": "lib/cli.js",
2775 "tailwind": "lib/cli.js",
@@ -2808,14 +2976,86 @@
2808 "integrity": "sha512-4n2cobUSeOob+237wZhpNiOEHCSfOydlQnKHTFdRY6ug/DupXGaxkkkszJYQxRftiMs8jmb10XvVO1svEYD43Q=="
2976 "integrity": "sha512-4n2cobUSeOob+237wZhpNiOEHCSfOydlQnKHTFdRY6ug/DupXGaxkkkszJYQxRftiMs8jmb10XvVO1svEYD43Q=="
2809 },
2977 },
2810 "@next/env": {
2978 "@next/env": {
2811− "version": "12.2.0",
2979+ "version": "12.2.2",
2812− "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.0.tgz",
2980+ "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.2.tgz",
2813− "integrity": "sha512-/FCkDpL/8SodJEXvx/DYNlOD5ijTtkozf4PPulYPtkPOJaMPpBSOkzmsta4fnrnbdH6eZjbwbiXFdr6gSQCV4w=="
2981+ "integrity": "sha512-BqDwE4gDl1F608TpnNxZqrCn6g48MBjvmWFEmeX5wEXDXh3IkAOw6ASKUgjT8H4OUePYFqghDFUss5ZhnbOUjw=="
2982+ },
2983+ "@next/swc-android-arm-eabi": {
2984+ "version": "12.2.2",
2985+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.2.2.tgz",
2986+ "integrity": "sha512-VHjuCHeq9qCprUZbsRxxM/VqSW8MmsUtqB5nEpGEgUNnQi/BTm/2aK8tl7R4D0twGKRh6g1AAeFuWtXzk9Z/vQ==",
2987+ "optional": true
2988+ },
2989+ "@next/swc-android-arm64": {
2990+ "version": "12.2.2",
2991+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.2.2.tgz",
2992+ "integrity": "sha512-v5EYzXUOSv0r9mO/2PX6mOcF53k8ndlu9yeFHVAWW1Dhw2jaJcvTRcCAwYYN8Q3tDg0nH3NbEltJDLKmcJOuVA==",
2993+ "optional": true
2814 },
2994 },
2815 "@next/swc-darwin-arm64": {
2995 "@next/swc-darwin-arm64": {
2816− "version": "12.2.0",
2996+ "version": "12.2.2",
2817− "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.0.tgz",
2997+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.2.tgz",
2818− "integrity": "sha512-x5U5gJd7ZvrEtTFnBld9O2bUlX8opu7mIQUqRzj7KeWzBwPhrIzTTsQXAiNqsaMuaRPvyHBVW/5d/6g6+89Y8g==",
2998+ "integrity": "sha512-JCoGySHKGt+YBk7xRTFGx1QjrnCcwYxIo3yGepcOq64MoiocTM3yllQWeOAJU2/k9MH0+B5E9WUSme4rOCBbpA==",
2999+ "optional": true
3000+ },
3001+ "@next/swc-darwin-x64": {
3002+ "version": "12.2.2",
3003+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.2.2.tgz",
3004+ "integrity": "sha512-dztDtvfkhUqiqpXvrWVccfGhLe44yQ5tQ7B4tBfnsOR6vxzI9DNPHTlEOgRN9qDqTAcFyPxvg86mn4l8bB9Jcw==",
3005+ "optional": true
3006+ },
3007+ "@next/swc-freebsd-x64": {
3008+ "version": "12.2.2",
3009+ "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.2.2.tgz",
3010+ "integrity": "sha512-JUnXB+2xfxqsAvhFLPJpU1NeyDsvJrKoOjpV7g3Dxbno2Riu4tDKn3kKF886yleAuD/1qNTUCpqubTvbbT2VoA==",
3011+ "optional": true
3012+ },
3013+ "@next/swc-linux-arm-gnueabihf": {
3014+ "version": "12.2.2",
3015+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.2.2.tgz",
3016+ "integrity": "sha512-XeYC/qqPLz58R4pjkb+x8sUUxuGLnx9QruC7/IGkK68yW4G17PHwKI/1njFYVfXTXUukpWjcfBuauWwxp9ke7Q==",
3017+ "optional": true
3018+ },
3019+ "@next/swc-linux-arm64-gnu": {
3020+ "version": "12.2.2",
3021+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.2.2.tgz",
3022+ "integrity": "sha512-d6jT8xgfKYFkzR7J0OHo2D+kFvY/6W8qEo6/hmdrTt6AKAqxs//rbbcdoyn3YQq1x6FVUUd39zzpezZntg9Naw==",
3023+ "optional": true
3024+ },
3025+ "@next/swc-linux-arm64-musl": {
3026+ "version": "12.2.2",
3027+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.2.2.tgz",
3028+ "integrity": "sha512-rIZRFxI9N/502auJT1i7coas0HTHUM+HaXMyJiCpnY8Rimbo0495ir24tzzHo3nQqJwcflcPTwEh/DV17sdv9A==",
3029+ "optional": true
3030+ },
3031+ "@next/swc-linux-x64-gnu": {
3032+ "version": "12.2.2",
3033+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.2.2.tgz",
3034+ "integrity": "sha512-ir1vNadlUDj7eQk15AvfhG5BjVizuCHks9uZwBfUgT5jyeDCeRvaDCo1+Q6+0CLOAnYDR/nqSCvBgzG2UdFh9A==",
3035+ "optional": true
3036+ },
3037+ "@next/swc-linux-x64-musl": {
3038+ "version": "12.2.2",
3039+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.2.2.tgz",
3040+ "integrity": "sha512-bte5n2GzLN3O8JdSFYWZzMgEgDHZmRz5wiispiiDssj4ik3l8E7wq/czNi8RmIF+ioj2sYVokUNa/ekLzrESWw==",
3041+ "optional": true
3042+ },
3043+ "@next/swc-win32-arm64-msvc": {
3044+ "version": "12.2.2",
3045+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.2.2.tgz",
3046+ "integrity": "sha512-ZUGCmcDmdPVSAlwJ/aD+1F9lYW8vttseiv4n2+VCDv5JloxiX9aY32kYZaJJO7hmTLNrprvXkb4OvNuHdN22Jg==",
3047+ "optional": true
3048+ },
3049+ "@next/swc-win32-ia32-msvc": {
3050+ "version": "12.2.2",
3051+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.2.2.tgz",
3052+ "integrity": "sha512-v7ykeEDbr9eXiblGSZiEYYkWoig6sRhAbLKHUHQtk8vEWWVEqeXFcxmw6LRrKu5rCN1DY357UlYWToCGPQPCRA==",
3053+ "optional": true
3054+ },
3055+ "@next/swc-win32-x64-msvc": {
3056+ "version": "12.2.2",
3057+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.2.tgz",
3058+ "integrity": "sha512-2D2iinWUL6xx8D9LYVZ5qi7FP6uLAoWymt8m8aaG2Ld/Ka8/k723fJfiklfuAcwOxfufPJI+nRbT5VcgHGzHAQ==",
2819 "optional": true
3059 "optional": true
2820 },
3060 },
2821 "@nodelib/fs.scandir": {
3061 "@nodelib/fs.scandir": {
@@ -2842,9 +3082,9 @@
2842 }
3082 }
2843 },
3083 },
2844 "@socialgouv/matomo-next": {
3084 "@socialgouv/matomo-next": {
2845− "version": "1.3.0",
3085+ "version": "1.4.0",
2846− "resolved": "https://registry.npmjs.org/@socialgouv/matomo-next/-/matomo-next-1.3.0.tgz",
3086+ "resolved": "https://registry.npmjs.org/@socialgouv/matomo-next/-/matomo-next-1.4.0.tgz",
2847− "integrity": "sha512-1EWGFre4CudvcJPIaLYyAwHsGk8mMK5/IKztEIaU14uUifv117dlIJmcpJIVEow70AMY1VqRHh1x5z7Dx+H7dQ==",
3087+ "integrity": "sha512-S+kNX7dwo/cL0VE7GWY8Gnf3t7aeXD4CzallRz9IEttjHJDJI2S8xOrcyaGimYpInr3nDNo+WqeYrafKUdsn1g==",
2848 "requires": {}
3088 "requires": {}
2849 },
3089 },
2850 "@swc/helpers": {
3090 "@swc/helpers": {
@@ -3034,9 +3274,9 @@
3034 "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="
3274 "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="
3035 },
3275 },
3036 "caniuse-lite": {
3276 "caniuse-lite": {
3037− "version": "1.0.30001363",
3277+ "version": "1.0.30001365",
3038− "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001363.tgz",
3278+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001365.tgz",
3039− "integrity": "sha512-HpQhpzTGGPVMnCjIomjt+jvyUu8vNFo3TaDiZ/RcoTrlOq/5+tC8zHdsbgFB6MxmaY+jCpsH09aD80Bb4Ow3Sg=="
3279+ "integrity": "sha512-VDQZ8OtpuIPMBA4YYvZXECtXbddMCUFJk1qu8Mqxfm/SZJNSr1cy4IuLCOL7RJ/YASrvJcYg1Zh+UEUQ5m6z8Q=="
3040 },
3280 },
3041 "chalk": {
3281 "chalk": {
3042 "version": "2.4.2",
3282 "version": "2.4.2",
@@ -3106,11 +3346,6 @@
3106 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
3346 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
3107 "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
3347 "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
3108 },
3348 },
3109− "core-js": {
3110− "version": "3.23.3",
3111− "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.3.tgz",
3112− "integrity": "sha512-oAKwkj9xcWNBAvGbT//WiCdOMpb9XQG92/Fe3ABFM/R16BsHgePG00mFOgKf7IsCtfj8tA1kHtf/VwErhriz5Q=="
3113− },
3114 "cross-spawn": {
3349 "cross-spawn": {
3115 "version": "6.0.5",
3350 "version": "6.0.5",
3116 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
3351 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
@@ -3230,9 +3465,9 @@
3230 }
3465 }
3231 },
3466 },
3232 "electron-to-chromium": {
3467 "electron-to-chromium": {
3233− "version": "1.4.180",
3468+ "version": "1.4.187",
3234− "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.180.tgz",
3469+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.187.tgz",
3235− "integrity": "sha512-7at5ash3FD9U5gPa3/wPr6OdiZd/zBjvDZaaHBpcqFOFUhZiWnb7stkqk8xUFL9H9nk7Yok5vCCNK8wyC/+f8A=="
3470+ "integrity": "sha512-t3iFLHVIMhB8jGZ+8ui951nz6Bna5qKfhxezG3wzXdBJ79qFKPsE2chjjVFNqC1ewhfrPQrw9pmVeo4FFpZeQA=="
3236 },
3471 },
3237 "end-of-stream": {
3472 "end-of-stream": {
3238 "version": "1.4.4",
3473 "version": "1.4.4",
@@ -3415,12 +3650,10 @@
3415 "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA=="
3650 "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA=="
3416 },
3651 },
3417 "foundation-design-system": {
3652 "foundation-design-system": {
3418− "version": "git+ssh://git@github.com/urbit/foundation-design-system.git#48782df954c24ed4c399ca89873639280830fbeb",
3653+ "version": "git+ssh://git@github.com/urbit/foundation-design-system.git#af413f40c379005cf609c2adde545da9638f38e3",
3419− "integrity": "sha512-mX1qj+gDYLy7iWLjrGwYj4vgv94IB1ek8FuCmq+PENICDL0ZKgKFS1ntGKqoA84SOLL5Asl1IGjyokX6NsLD7g==",
3420 "from": "foundation-design-system@github:urbit/foundation-design-system",
3654 "from": "foundation-design-system@github:urbit/foundation-design-system",
3421 "requires": {
3655 "requires": {
3422 "@markdoc/markdoc": "0.1.3",
3656 "@markdoc/markdoc": "0.1.3",
3423− "core-js": "^3.23.1",
3424 "html-react-parser": "^1.4.14",
3657 "html-react-parser": "^1.4.14",
3425 "patch-package": "^6.4.7",
3658 "patch-package": "^6.4.7",
3426 "prism-react-renderer": "^1.3.3",
3659 "prism-react-renderer": "^1.3.3",
@@ -3765,9 +3998,9 @@
3765 }
3998 }
3766 },
3999 },
3767 "lilconfig": {
4000 "lilconfig": {
3768− "version": "2.0.5",
4001+ "version": "2.0.6",
3769− "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
4002+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
3770− "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg=="
4003+ "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg=="
3771 },
4004 },
3772 "locate-path": {
4005 "locate-path": {
3773 "version": "5.0.0",
4006 "version": "5.0.0",
@@ -3807,9 +4040,9 @@
3807 }
4040 }
3808 },
4041 },
3809 "luxon": {
4042 "luxon": {
3810− "version": "2.4.0",
4043+ "version": "2.5.0",
3811− "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.4.0.tgz",
4044+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.5.0.tgz",
3812− "integrity": "sha512-w+NAwWOUL5hO0SgwOHsMBAmZ15SoknmQXhSO0hIbJCAmPKSsGeK8MlmhYh2w6Iib38IxN2M+/ooXWLbeis7GuA=="
4045+ "integrity": "sha512-IDkEPB80Rb6gCAU+FEib0t4FeJ4uVOuX1CQ9GsvU3O+JAGIgu0J7sf1OarXKaKDygTZIoJyU6YdZzTFRu+YR0A=="
3813 },
4046 },
3814 "merge-stream": {
4047 "merge-stream": {
3815 "version": "2.0.0",
4048 "version": "2.0.0",
@@ -3875,24 +4108,24 @@
3875 "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
4108 "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
3876 },
4109 },
3877 "next": {
4110 "next": {
3878− "version": "12.2.0",
4111+ "version": "12.2.2",
3879− "resolved": "https://registry.npmjs.org/next/-/next-12.2.0.tgz",
4112+ "resolved": "https://registry.npmjs.org/next/-/next-12.2.2.tgz",
3880− "integrity": "sha512-B4j7D3SHYopLYx6/Ark0fenwIar9tEaZZFAaxmKjgcMMexhVJzB3jt7X+6wcdXPPMeUD6r09weUtnDpjox/vIA==",
4113+ "integrity": "sha512-zAYFY45aBry/PlKONqtlloRFqU/We3zWYdn2NoGvDZkoYUYQSJC8WMcalS5C19MxbCZLUVCX7D7a6gTGgl2yLg==",
3881 "requires": {
4114 "requires": {
3882− "@next/env": "12.2.0",
4115+ "@next/env": "12.2.2",
3883− "@next/swc-android-arm-eabi": "12.2.0",
4116+ "@next/swc-android-arm-eabi": "12.2.2",
3884− "@next/swc-android-arm64": "12.2.0",
4117+ "@next/swc-android-arm64": "12.2.2",
3885− "@next/swc-darwin-arm64": "12.2.0",
4118+ "@next/swc-darwin-arm64": "12.2.2",
3886− "@next/swc-darwin-x64": "12.2.0",
4119+ "@next/swc-darwin-x64": "12.2.2",
3887− "@next/swc-freebsd-x64": "12.2.0",
4120+ "@next/swc-freebsd-x64": "12.2.2",
3888− "@next/swc-linux-arm-gnueabihf": "12.2.0",
4121+ "@next/swc-linux-arm-gnueabihf": "12.2.2",
3889− "@next/swc-linux-arm64-gnu": "12.2.0",
4122+ "@next/swc-linux-arm64-gnu": "12.2.2",
3890− "@next/swc-linux-arm64-musl": "12.2.0",
4123+ "@next/swc-linux-arm64-musl": "12.2.2",
3891− "@next/swc-linux-x64-gnu": "12.2.0",
4124+ "@next/swc-linux-x64-gnu": "12.2.2",
3892− "@next/swc-linux-x64-musl": "12.2.0",
4125+ "@next/swc-linux-x64-musl": "12.2.2",
3893− "@next/swc-win32-arm64-msvc": "12.2.0",
4126+ "@next/swc-win32-arm64-msvc": "12.2.2",
3894− "@next/swc-win32-ia32-msvc": "12.2.0",
4127+ "@next/swc-win32-ia32-msvc": "12.2.2",
3895− "@next/swc-win32-x64-msvc": "12.2.0",
4128+ "@next/swc-win32-x64-msvc": "12.2.2",
3896 "@swc/helpers": "0.4.2",
4129 "@swc/helpers": "0.4.2",
3897 "caniuse-lite": "^1.0.30001332",
4130 "caniuse-lite": "^1.0.30001332",
3898 "postcss": "8.4.5",
4131 "postcss": "8.4.5",
@@ -3927,9 +4160,9 @@
3927 "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
4160 "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
3928 },
4161 },
3929 "node-releases": {
4162 "node-releases": {
3930− "version": "2.0.5",
4163+ "version": "2.0.6",
3931− "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
4164+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
3932− "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q=="
4165+ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg=="
3933 },
4166 },
3934 "normalize-path": {
4167 "normalize-path": {
3935 "version": "3.0.0",
4168 "version": "3.0.0",
@@ -4533,9 +4766,9 @@
4533 }
4766 }
4534 },
4767 },
4535 "tailwindcss": {
4768 "tailwindcss": {
4536− "version": "3.1.4",
4769+ "version": "3.1.6",
4537− "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.4.tgz",
4770+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.6.tgz",
4538− "integrity": "sha512-NrxbFV4tYsga/hpWbRyUfIaBrNMXDxx5BsHgBS4v5tlyjf+sDsgBg5m9OxjrXIqAS/uR9kicxLKP+bEHI7BSeQ==",
4771+ "integrity": "sha512-7skAOY56erZAFQssT1xkpk+kWt2NrO45kORlxFPXUt3CiGsVPhH1smuH5XoDH6sGPXLyBv+zgCKA2HWBsgCytg==",
4539 "requires": {
4772 "requires": {
4540 "arg": "^5.0.2",
4773 "arg": "^5.0.2",
4541 "chokidar": "^3.5.3",
4774 "chokidar": "^3.5.3",
@@ -4558,7 +4791,7 @@
4558 "postcss-selector-parser": "^6.0.10",
4791 "postcss-selector-parser": "^6.0.10",
4559 "postcss-value-parser": "^4.2.0",
4792 "postcss-value-parser": "^4.2.0",
4560 "quick-lru": "^5.1.1",
4793 "quick-lru": "^5.1.1",
4561− "resolve": "^1.22.0"
4794+ "resolve": "^1.22.1"
4562 },
4795 },
4563 "dependencies": {
4796 "dependencies": {
4564 "color-name": {
4797 "color-name": {
package.json+2−2
@@ -7,10 +7,10 @@
7 "build": "next build",
7 "build": "next build",
8 "export": "npm run prebuild && next build && next export",
8 "export": "npm run prebuild && next build && next export",
9 "start": "next start",
9 "start": "next start",
10− "prebuild": "npm run cache-posts && npm run rss && npm run community-tree && npm run getting-started-tree && npm run understanding-urbit-tree && npm run using-tree",
10+ "prebuild": "npm run cache-posts && npm run rss && npm run community-tree && npm run getting-started-tree && npm run overview-tree && npm run using-tree",
11 "community-tree": "node lib/buildPageTree community weight",
11 "community-tree": "node lib/buildPageTree community weight",
12 "getting-started-tree": "node lib/buildPageTree getting-started weight",
12 "getting-started-tree": "node lib/buildPageTree getting-started weight",
13− "understanding-urbit-tree": "node lib/buildPageTree understanding-urbit weight",
13+ "overview-tree": "node lib/buildPageTree overview weight",
14 "using-tree": "node lib/buildPageTree using weight",
14 "using-tree": "node lib/buildPageTree using weight",
15 "cache-posts": "node lib/cache.js",
15 "cache-posts": "node lib/cache.js",
16 "rss": "node lib/rss.js"
16 "rss": "node lib/rss.js"
pages/community/[[...slug]].js+1−1
@@ -7,7 +7,7 @@ import { getPage } from "../../lib/lib";
7import Meta from "../../components/Meta";
7import Meta from "../../components/Meta";
8import { Markdown } from "foundation-design-system";
8import { Markdown } from "foundation-design-system";
9import ContentArea from "../../components/ContentArea";
9import ContentArea from "../../components/ContentArea";
10−import Sidebar from "../../components/Sidebar";
10+import Sidebar from "../../components/DocsSidebar";
11import communityTree from "../../cache/community.json";
11import communityTree from "../../cache/community.json";
12
12
13const breadcrumbs = (posts, paths) => {
13const breadcrumbs = (posts, paths) => {
pages/getting-started/[[...slug]].js+1−1
@@ -7,7 +7,7 @@ import { join } from "path";
7import { getPage } from "../../lib/lib";
7import { getPage } from "../../lib/lib";
8import { Markdown } from "foundation-design-system";
8import { Markdown } from "foundation-design-system";
9import ContentArea from "../../components/ContentArea";
9import ContentArea from "../../components/ContentArea";
10−import Sidebar from "../../components/Sidebar";
10+import Sidebar from "../../components/DocsSidebar";
11import GettingStartedTree from "../../cache/getting-started.json";
11import GettingStartedTree from "../../cache/getting-started.json";
12
12
13export default function UsingLayout({ posts, data, params, search, markdown }) {
13export default function UsingLayout({ posts, data, params, search, markdown }) {
pages/index.js+27−66
@@ -2,7 +2,6 @@ import Head from "next/head";
2import Link from "next/link";
2import Link from "next/link";
3import React from "react";
3import React from "react";
4import { DateTime } from "luxon";
4import { DateTime } from "luxon";
5−
6import {
5import {
7 Container,
6 Container,
8 Section,
7 Section,
@@ -15,7 +14,6 @@ import Contact from "../components/Contact";
15import PostPreview from "../components/PostPreview";
14import PostPreview from "../components/PostPreview";
16import EventPreview from "../components/EventPreview";
15import EventPreview from "../components/EventPreview";
17import TwoUp from "../components/TwoUp";
16import TwoUp from "../components/TwoUp";
18−import BubbleLink from "../components/index/BubbleLink";
19import { getAllPosts, getAllEvents, generateRealtimeDate } from "../lib/lib";
17import { getAllPosts, getAllEvents, generateRealtimeDate } from "../lib/lib";
20import { eventKeys } from "../lib/constants";
18import { eventKeys } from "../lib/constants";
21
19
@@ -31,7 +29,7 @@ export default function Home({ posts, events, grantNumbers, search }) {
31 {
29 {
32 // Hero Statement
30 // Hero Statement
33 }
31 }
34− <Section narrow>
32+ <Section className="pb-36">
35 <div>
33 <div>
36 <h1>A clean-slate OS and network for the 21st&nbsp;century.</h1>
34 <h1>A clean-slate OS and network for the 21st&nbsp;century.</h1>
37 </div>
35 </div>
@@ -42,11 +40,11 @@ export default function Home({ posts, events, grantNumbers, search }) {
42 <Section>
40 <Section>
43 <div className="bg-[#FEFFDA] w-full p-8 md:p-12 rounded-3xl flex flex-col md:flex-row">
41 <div className="bg-[#FEFFDA] w-full p-8 md:p-12 rounded-3xl flex flex-col md:flex-row">
44 <div className="md:w-10/12 w-full md:mr-6">
42 <div className="md:w-10/12 w-full md:mr-6">
45−
46− <h2 className="m-0 p-0 mr-4 pb-6">Assembly 2022</h2>
43+ <h2 className="m-0 p-0 mr-4 pb-6">Assembly 2022</h2>
47
44
48 <p>
45 <p>
49− Assembly 2022 is the second ever Urbit conference coming to you this year from Miami Beach. Grab a towel and get ready.
46+ Assembly 2022 is the second ever Urbit conference coming to you
47+ this year from Miami Beach. Grab a towel and get ready.
50 </p>
48 </p>
51 <p className="pt-4 font-bold pb-8">
49 <p className="pt-4 font-bold pb-8">
52 September 22nd–25th • Miami Beach, Florida
50 September 22nd–25th • Miami Beach, Florida
@@ -59,64 +57,27 @@ export default function Home({ posts, events, grantNumbers, search }) {
59 </div>
57 </div>
60 </div>
58 </div>
61 </Section>
59 </Section>
62−
60+ <Section narrow className="space-y-8">
63−
61+ <h2 className="font-normal">
64− {
62+ Urbit is a <span className="font-bold">new kind of computer</span>{" "}
65− // Hero
63+ that you can <span className="font-bold">own completely</span> in
66− }
64+ ways that matter:{" "}
67− <Section>
65+ <span className="font-bold">networking, identity, and data</span>.
68− <div className="bg-wall-100 w-full p-8 md:p-12 rounded-3xl flex flex-col md:flex-row">
66+ </h2>
69− <div className="md:w-6/12 w-full md:mr-6">
70− <h3>
71− Urbit is a new kind of computer that you can own completely in ways that matter: networking, identity, and data.
72− </h3>
73− <p className="pt-8">
67+ <p className="max-w-prose">
74− Follow these links to contribute to the network through
68+ We realized that in order to fix the internet, we had to build a new
75− developing, operating, and exploring.
69+ computer from scratch. Good thing we started over a decade ago.
76− </p>
70+ </p>
77− </div>
71+ <p className="max-w-prose">
78− <div className="pt-8 md:pt-0 md:w-6/12 w-full md:ml-6">
72+ Today, Urbit a real system with thousands of users that are building
79− <BubbleLink
73+ all kinds of communities, software, DAOs, and more. And it’s getting
80− href="https://developers.urbit.org"
74+ better every day.{" "}
81− title="Developers"
75+ </p>
82− target="_blank"
76+ <Link href="/overview" passHref>
83− className="md:h-16"
77+ <a className="button-lg bg-green-400 text-white type-ui max-w-fit">
84− caption="Start building on Urbit today."
78+ Read the Overview
85− >
79+ </a>
86− <img
80+ </Link>
87− alt="Marketplace logo"
88− className="max-w-none w-12 h-12 rounded-full"
89− src="/images/developers-guide-logo.png"
90− />
91− </BubbleLink>
92− <BubbleLink
93− href="https://operators.urbit.org"
94− className="mt-4 md:h-16"
95− target="_blank"
96− title="Operator’s Guide"
97− caption="Own a star or galaxy? This is for you."
98− >
99− <img
100− alt="Marketplace logo"
101− className="max-w-none w-12 h-12 rounded-full"
102− src="/images/operators-guide-logo.png"
103− />
104− </BubbleLink>
105− <BubbleLink
106− href="https://network.urbit.org/"
107− className="mt-4 md:h-16"
108− target="_blank"
109− title="Network Explorer"
110− caption="View on-chain Urbit activity in real-time."
111− >
112− <img
113− alt="Marketplace logo"
114− className="max-w-none w-12 h-12 rounded-full"
115− src="/images/network-explorer-logo.png"
116− />
117− </BubbleLink>
118− </div>
119− </div>
120 </Section>
81 </Section>
121
82
122 {
83 {
@@ -207,8 +168,8 @@ export default function Home({ posts, events, grantNumbers, search }) {
207 for building on Urbit using the languages you already know.
168 for building on Urbit using the languages you already know.
208 </p>
169 </p>
209 <Link href="https://developers.urbit.org" passHref>
170 <Link href="https://developers.urbit.org" passHref>
210− <a className="button-lg type-ui text-white bg-wall-600 max-w-fit">
171+ <a className="button-lg type-ui text-white bg-green-400 max-w-fit">
211− Read the Developer Docs
172+ Visit Urbit Developers
212 </a>
173 </a>
213 </Link>
174 </Link>
214 </div>
175 </div>
pages/overview/[[...slug]].jsnew file+143
@@ -0,0 +1,143 @@
1+import Head from "next/head";
2+import { useRouter } from "next/router";
3+import classnames from "classnames";
4+import Meta from "../../components/Meta";
5+import {
6+ Container,
7+ SingleColumn,
8+ Section,
9+ Markdown,
10+ IntraNav,
11+} from "foundation-design-system";
12+import { join } from "path";
13+import { getPage, getPreviousPost, getNextPost } from "../../lib/lib";
14+import Header from "../../components/Header";
15+import Footer from "../../components/Footer";
16+import Sidebar from "../../components/Sidebar";
17+import overviewTree from "../../cache/overview.json";
18+import Link from "next/link";
19+
20+export default function Overview({ posts, data, markdown, search }) {
21+ return (
22+ <Container>
23+ <Head>
24+ <title>{data.title} • Overview • Urbit</title>
25+ {Meta(data)}
26+ </Head>
27+ <IntraNav ourSite="https://urbit.org" search={search} />
28+ <SingleColumn>
29+ <Header />
30+ <Section>
31+ <h1>Overview</h1>
32+ </Section>
33+ <Section>
34+ <div className="flex justify-between sidebar">
35+ <Sidebar>{childPages("/overview", posts.pages)}</Sidebar>
36+ <div className="markdown max-w-prose">
37+ <h3>{data.title}</h3>
38+ <Markdown.render content={JSON.parse(markdown)} />
39+ </div>
40+ </div>
41+ </Section>
42+ </SingleColumn>
43+ <Footer />
44+ </Container>
45+ );
46+}
47+
48+const childPages = (thisLink, children, level = 0) => {
49+ const router = useRouter();
50+
51+ const isThisPage = router.asPath === thisLink;
52+
53+ const pageItemClasses = classnames({
54+ "text-base type-ui": level === 0,
55+ "text-wall-400": !isThisPage,
56+ "text-black": isThisPage,
57+ });
58+ return (
59+ <ul className="">
60+ <li className="pb-2">
61+ <Link href="/overview">
62+ <a className={`${pageItemClasses} cursor-pointer`}>Introduction</a>
63+ </Link>
64+ </li>
65+ {children?.map((child) => (
66+ <li className="pb-2">
67+ {pageTree(join(thisLink, child.slug), child, level)}
68+ </li>
69+ ))}
70+ </ul>
71+ );
72+};
73+
74+const pageTree = (thisLink, tree, level = 0) => {
75+ const router = useRouter();
76+
77+ const isThisPage = router.asPath === thisLink;
78+
79+ const pageItemClasses = classnames({
80+ "text-base type-ui": level === 0,
81+ "text-wall-400": !isThisPage,
82+ "text-black": isThisPage,
83+ });
84+
85+ return (
86+ <>
87+ <Link href={thisLink}>
88+ <a className={`${pageItemClasses} cursor-pointer`}>{tree.title}</a>
89+ </Link>
90+ </>
91+ );
92+};
93+
94+export async function getStaticProps({ params }) {
95+ const posts = overviewTree;
96+
97+ const { data, content } = getPage(
98+ join(process.cwd(), "content/overview", params.slug?.join("/") || "/")
99+ );
100+ const markdown = JSON.stringify(Markdown.parse({ post: { content } }));
101+
102+ const previousPost =
103+ getPreviousPost(
104+ params.slug?.slice(-1).join("") || "overview",
105+ ["title", "slug", "weight"],
106+ join("overview", params.slug?.slice(0, -1).join("/") || "/"),
107+ "weight"
108+ ) || null;
109+
110+ const nextPost =
111+ getNextPost(
112+ params.slug?.slice(-1).join("") || "overview",
113+ ["title", "slug", "weight"],
114+ join("overview", params.slug?.slice(0, -1).join("/") || "/"),
115+ "weight"
116+ ) || null;
117+
118+ return { props: { posts, data, markdown, params, previousPost, nextPost } };
119+}
120+
121+export async function getStaticPaths() {
122+ const posts = overviewTree;
123+
124+ const slugs = [];
125+
126+ const allHrefs = (thisLink, tree) => {
127+ slugs.push(thisLink, ...tree.pages.map((e) => join(thisLink, e.slug)));
128+ allHrefsChildren(thisLink, tree.children);
129+ };
130+
131+ const allHrefsChildren = (thisLink, children) => {
132+ Object.entries(children).map(([childSlug, child]) => {
133+ allHrefs(join(thisLink, childSlug), child);
134+ });
135+ };
136+
137+ allHrefs("/overview", posts);
138+
139+ return {
140+ paths: slugs,
141+ fallback: false,
142+ };
143+}
pages/understanding-urbit/[[...slug]].jsdeleted−198
@@ -1,198 +0,0 @@
1−import Head from "next/head";
2−import Meta from "../../components/Meta";
3−import Link from "next/link";
4−import { useRouter } from "next/router";
5−import classnames from "classnames";
6−import { join } from "path";
7−import { getPage, getPreviousPost, getNextPost } from "../../lib/lib";
8−import { Markdown } from "foundation-design-system";
9−import ContentArea from "../../components/ContentArea";
10−import Sidebar from "../../components/Sidebar";
11−import Pagination from "../../components/Pagination";
12−import UnderstandingUrbitTree from "../../cache/understanding-urbit.json";
13−
14−const breadcrumbs = (posts, paths) => {
15− const results = [
16− <Link href="/">Urbit</Link>,
17− <span className="px-1">/</span>,
18− <Link href="/understanding-urbit">Understanding Urbit</Link>,
19− ];
20− let thisLink = "/understanding-urbit";
21− for (const path of paths) {
22− posts = posts.children[path];
23− thisLink = join(thisLink, path);
24− results.push(
25− <span className="px-1">/</span>,
26− <Link href={thisLink}>{posts.title}</Link>
27− );
28− }
29− return results;
30−};
31−
32−const childPages = (thisLink, children, level = 0) => (
33− <ul>
34− {children?.map((child) => (
35− <li>{pageTree(join(thisLink, child.slug), child, level)}</li>
36− ))}
37− </ul>
38−);
39−
40−const pageTree = (thisLink, tree, level = 0) => {
41− const router = useRouter();
42−
43− const isThisPage = router.asPath === thisLink;
44−
45− const pageItemClasses = classnames({
46− "pl-4 text-base hover:text-green-400": level === 0,
47− "pl-8 text-base hover:text-green-400": level === 1,
48− "pl-12 text-base hover:text-green-400": level === 2,
49− "dot relative text-green-400": isThisPage,
50− "text-wall-600": !isThisPage,
51− });
52−
53− return (
54− <>
55− <Link href={thisLink} passHref>
56− <a className={`${pageItemClasses} cursor-pointer`}>{tree.title}</a>
57− </Link>
58− </>
59− );
60−};
61−
62−export default function UnderstandingLayout({
63− posts,
64− data,
65− params,
66− search,
67− markdown,
68− previousPost,
69− nextPost,
70−}) {
71− const router = useRouter();
72− const isSelected = "/understanding-urbit".includes(router.asPath);
73− const selectedClasses = classnames({
74− dot: isSelected,
75− "text-green-400": isSelected,
76− "text-wall-600": !isSelected,
77− });
78− const rootClasses = "pl-4 text-base hover:text-green-400";
79− return (
80− <>
81− <Head>
82− <title>{data.title} • Understanding Urbit • urbit.org</title>
83− {Meta(data)}
84− </Head>
85− <div className="flex h-screen min-h-screen w-screen sidebar">
86− <Sidebar search={search}>
87− <ul>
88− <li>
89− <Link href="/understanding-urbit" passHref>
90− <a className={`relative ${selectedClasses} ${rootClasses}`}>
91− Introduction
92− </a>
93− </Link>
94− </li>
95− </ul>
96− {childPages("/understanding-urbit", posts.pages)}
97− </Sidebar>
98− <ContentArea
99− breadcrumbs={breadcrumbs(posts, params.slug?.slice(0, -1) || "")}
100− title={data.title}
101− search={search}
102− section={"Understanding Urbit"}
103− params={params}
104− disableToC
105− >
106− <div className="markdown">
107− <Markdown.render content={JSON.parse(markdown)} />
108− </div>
109− <div className="flex justify-between mt-16">
110− {previousPost === null ? (
111− <div className={""} />
112− ) : (
113− <Pagination
114− previous
115− title="Previous Post"
116− post={previousPost}
117− className=""
118− section={join(
119− "understanding-urbit",
120− params.slug?.slice(0, -1).join("/")
121− )}
122− />
123− )}
124− {nextPost === null ? (
125− <div className={""} />
126− ) : (
127− <Pagination
128− next
129− title="Next Post"
130− post={nextPost}
131− className=""
132− section={join(
133− "understanding-urbit",
134− params.slug?.slice(0, -1).join("/")
135− )}
136− />
137− )}
138− </div>
139− </ContentArea>
140− </div>
141− </>
142− );
143−}
144−
145−export async function getStaticProps({ params }) {
146− const posts = UnderstandingUrbitTree;
147−
148− const { data, content } = getPage(
149− join(
150− process.cwd(),
151− "content/understanding-urbit",
152− params.slug?.join("/") || "/"
153− )
154− );
155− const markdown = JSON.stringify(Markdown.parse({ post: { content } }));
156−
157− const previousPost =
158− getPreviousPost(
159− params.slug?.slice(-1).join("") || "understanding-urbit",
160− ["title", "slug", "weight"],
161− join("understanding-urbit", params.slug?.slice(0, -1).join("/") || "/"),
162− "weight"
163− ) || null;
164−
165− const nextPost =
166− getNextPost(
167− params.slug?.slice(-1).join("") || "understanding-urbit",
168− ["title", "slug", "weight"],
169− join("understanding-urbit", params.slug?.slice(0, -1).join("/") || "/"),
170− "weight"
171− ) || null;
172−
173− return { props: { posts, data, markdown, params, previousPost, nextPost } };
174−}
175−
176−export async function getStaticPaths() {
177− const posts = UnderstandingUrbitTree;
178−
179− const slugs = [];
180−
181− const allHrefs = (thisLink, tree) => {
182− slugs.push(thisLink, ...tree.pages.map((e) => join(thisLink, e.slug)));
183− allHrefsChildren(thisLink, tree.children);
184− };
185−
186− const allHrefsChildren = (thisLink, children) => {
187− Object.entries(children).map(([childSlug, child]) => {
188− allHrefs(join(thisLink, childSlug), child);
189− });
190− };
191−
192− allHrefs("/understanding-urbit", posts);
193−
194− return {
195− paths: slugs,
196− fallback: false,
197− };
198−}
pages/using/[[...slug]].js+1−1
@@ -8,7 +8,7 @@ import { join } from "path";
8import { getPage } from "../../lib/lib";
8import { getPage } from "../../lib/lib";
9import { Markdown } from "foundation-design-system";
9import { Markdown } from "foundation-design-system";
10import ContentArea from "../../components/ContentArea";
10import ContentArea from "../../components/ContentArea";
11−import Sidebar from "../../components/Sidebar";
11+import Sidebar from "../../components/DocsSidebar";
12import UsingTree from "../../cache/using.json";
12import UsingTree from "../../cache/using.json";
13
13
14const breadcrumbs = (posts, paths) => {
14const breadcrumbs = (posts, paths) => {
vercel.json+1−1
@@ -54,7 +54,7 @@
54 },
54 },
55 {
55 {
56 "source": "/primer",
56 "source": "/primer",
57− "destination": "/understanding-urbit/",
57+ "destination": "/overview",
58 "permanent": true
58 "permanent": true
59 },
59 },
60 {
60 {