on master help sign in
Merge pull request #795 from urbit/ga/events-metadata
33257aeGavin
README.md+4
@@ -30,3 +30,7 @@ To learn more about Tailwind CSS, take a look at the docs:
30## Deployment
30## Deployment
31
31
32WIP
32WIP
33+
34+## Upgrades
35+
36+The `/scripts` contains scripts used to programmatically upgrade site content data.
components/EventPreview.js+93−17
@@ -1,37 +1,113 @@
1import Link from "next/link";
1import Link from "next/link";
2+import { DateTime } from "luxon";
3+import { ShowOrHide, ReadableList, Person } from "../components/Snippets";
4+import {
5+ generateDisplayDate,
6+ generateRealtimeDate,
7+ formatDate,
8+ formatTime,
9+ formatTimeZone,
10+} from "../lib/lib";
2
11
3−export default function EventPreview({ event, className, title, rsvp }) {
12+export default function EventPreview({ event, className, big }) {
4 // Event tiles have a 'dark mode' used when their background images are dark and white text is needed for legibility.
13 // Event tiles have a 'dark mode' used when their background images are dark and white text is needed for legibility.
5− const grayText = event.extra?.dark ? "text-midWhite" : "text-wall-500";
14+ const grayText = event?.dark ? "text-midWhite" : "text-wall-400";
6− const blackText = event.extra?.dark ? "text-white" : "text-wall-600";
15+ const blackText = event?.dark ? "text-white" : "text-wall-600";
16+
17+ const starts = generateDisplayDate(event.starts, event.timezone);
18+ const ends = generateDisplayDate(event.ends, event.timezone);
19+
20+ const inFuture = generateRealtimeDate(starts) > DateTime.now();
21+
22+ const happeningNow =
23+ generateRealtimeDate(event.starts) > DateTime.now() && !inFuture;
7
24
8 return (
25 return (
9− <div className={`cursor-pointer ${className}`}>
26+ <div className={`cursor-pointer aspect-w-5 aspect-h-4 ${className}`}>
10− {title ? <h3 className="mb-2">{title}</h3> : null}
11 <div
27 <div
12 key={event.slug}
28 key={event.slug}
13− className={`bg-wall-100 rounded-xl h-80 bg-cover bg-center bg-no-repeat`}
29+ className={`bg-wall-100 rounded-xl bg-cover bg-center bg-no-repeat `}
14− style={{ backgroundImage: `url(${event.extra?.image})` || "" }}
30+ style={{ backgroundImage: `url(${event.image})` || "" }}
15 >
31 >
16 <Link href={`/events/${event.slug}`}>
32 <Link href={`/events/${event.slug}`}>
33+ <div
17− <div className="flex flex-col p-4 justify-between items-between h-full relative">
34+ className={`flex flex-col p-6 justify-between items-between h-full relative`}
35+ >
36+ <div
18− <div className="flex-grow-1 flex flex-col justify-center h-full">
37+ className={`flex-grow-1 flex ${
38+ big ? "justify-center" : ""
39+ } flex-col h-full`}
40+ >
19− <h4 className={`mb-4 ${blackText}`}>{event.title}</h4>
41+ <h4 className={`${blackText}`}>{event.title}</h4>
20− <p className={grayText}>{event?.type}</p>
42+ <p className={grayText}>{formatDate(starts)}</p>
43+ <p className={grayText}>
44+ {formatTime(starts)}
45+ {typeof event.ends !== "undefined"
46+ ? ` to ${formatTime(ends)}`
47+ : null}
48+ {" " + formatTimeZone(starts)}
49+ </p>
21 </div>
50 </div>
51+
22− <div className="absolute p-4 left-0 bottom-0 w-full">
52+ <div className="absolute p-6 left-0 bottom-0 w-full pr-32">
23− <p className={`${grayText}`}>{event.extra.host}</p>
53+ <ShowOrHide condition={event.hosts}>
24− <p className={`${grayText}`}>{event.extra.guests}</p>
54+ <p className={blackText + " type-sub"}>
55+ <b>{"Hosted by "}</b>
56+ <ReadableList>
57+ {event.hosts?.map((host, index) => (
58+ <Person
59+ key={`${host.name}-${host.patp}`}
60+ nameClassNames={blackText}
61+ patpClassNames={blackText}
62+ name={host.name}
63+ patp={host.patp}
64+ />
65+ ))}
66+ </ReadableList>
67+ </p>
68+ </ShowOrHide>
69+ <ShowOrHide condition={event.guests}>
70+ <p className={blackText + " type-sub"}>
71+ <b>
72+ {event.guests?.length > 1 ? "With guests " : "With guest "}
73+ </b>
74+ <ReadableList>
75+ {event.guests?.map((guest, index) => (
76+ <Person
77+ key={`${guest.name}-${guest.patp}`}
78+ nameClassNames={blackText}
79+ patpClassNames={blackText}
80+ name={guest.name}
81+ patp={guest.patp}
82+ />
83+ ))}
84+ </ReadableList>
85+ </p>
86+ </ShowOrHide>
25 </div>
87 </div>
88+
26− {rsvp && event.extra.registration_url && event.extra.pinned ? (
89+ {inFuture && event.registration_url ? (
27− <div className="absolute right-0 bottom-0 p-4">
90+ <div className="absolute right-0 bottom-0 p-6">
28 <a
91 <a
29 className="button-sm bg-green-400 text-white"
92 className="button-sm bg-green-400 text-white"
30− href={event.extra.registration_url}
93+ href={event.registration_url}
94+ onClick={(e) => e.stopPropagation()}
95+ target="_blank"
31 >
96 >
32 RSVP
97 RSVP
33 </a>
98 </a>
34 </div>
99 </div>
100+ ) : event.youtube ? (
101+ <div className="absolute right-0 bottom-0 p-6">
102+ <a
103+ className="button-sm bg-wall-600 text-white"
104+ href={`https://www.youtube.com/watch?v=${event.youtube}`}
105+ onClick={(e) => e.stopPropagation()}
106+ target="_blank"
107+ >
108+ ▶ Watch
109+ </a>
110+ </div>
35 ) : null}
111 ) : null}
36 </div>
112 </div>
37 </Link>
113 </Link>
components/PostPreview.js+4−4
@@ -1,9 +1,11 @@
1import Link from "next/link";
1import Link from "next/link";
2import BackgroundImage from "./BackgroundImage";
2import BackgroundImage from "./BackgroundImage";
3−import { formatDate } from "../lib/lib";
3+import { formatDate, generateDisplayDate } from "../lib/lib";
4
4
5export default function PostPreview(props) {
5export default function PostPreview(props) {
6 const section = props?.section ? props.section : "blog";
6 const section = props?.section ? props.section : "blog";
7+
8+ const date = generateDisplayDate(props.post.date);
7 return (
9 return (
8 <div className={`cursor-pointer ${props.className}`}>
10 <div className={`cursor-pointer ${props.className}`}>
9 {props.title ? <h3 className="mb-2">{props.title}</h3> : null}
11 {props.title ? <h3 className="mb-2">{props.title}</h3> : null}
@@ -31,9 +33,7 @@ export default function PostPreview(props) {
31 </div>
33 </div>
32 ) : null}
34 ) : null}
33 </div>
35 </div>
34− <div className="text-wall-500 type-sub mt-1">
36+ <div className="text-wall-500 type-sub mt-1">{formatDate(date)}</div>
35− {formatDate(new Date(props.post.date))}
36− </div>
37 </div>
37 </div>
38 </Link>
38 </Link>
39 </div>
39 </div>
components/Search.js−1
@@ -26,7 +26,6 @@ class Search extends Component {
26 }
26 }
27
27
28 onSelect(item) {
28 onSelect(item) {
29− console.log(item);
30 if (item.slug) {
29 if (item.slug) {
31 this.props.router.push(item.slug);
30 this.props.router.push(item.slug);
32 }
31 }
components/Snippets.jsnew file+63
@@ -0,0 +1,63 @@
1+export function Name({ children, className }) {
2+ return <b className={`font-normal ${className || ""}`}>{children}</b>;
3+}
4+
5+export function Patp({ children, className }) {
6+ return <code className={`font-mono ${className || ""}`}>{children}</code>;
7+}
8+
9+// Used to render a human name alongside their @p
10+export function Person({
11+ name,
12+ patp,
13+ nameClassNames,
14+ patpClassNames,
15+ className,
16+}) {
17+ return (
18+ <>
19+ {patp && name ? (
20+ <>
21+ <Name className={nameClassNames}>{name}</Name>{" "}
22+ <Patp className={patpClassNames + " opacity-60"}>{patp}</Patp>
23+ </>
24+ ) : patp ? (
25+ <Patp className={patpClassNames}>{patp}</Patp>
26+ ) : name ? (
27+ <Name className={nameClassNames}>{name}</Name>
28+ ) : null}
29+ </>
30+ );
31+}
32+
33+// This goes inside a <p/> tag
34+export function ReadableList({ children, serial = ",", conjunction = "and" }) {
35+ return (
36+ <>
37+ {children.map((Child, index) => {
38+ if (index < children.length - 2) {
39+ return (
40+ <>
41+ {Child}
42+ {serial}
43+ </>
44+ );
45+ } else if (index < children.length - 1) {
46+ return (
47+ <>
48+ {Child} {conjunction}{" "}
49+ </>
50+ );
51+ }
52+ return <>{Child}</>;
53+ })}
54+ </>
55+ );
56+}
57+
58+export function ShowOrHide({ children, condition }) {
59+ if (condition) {
60+ return children;
61+ }
62+ return null;
63+}
content/blog/2019-10-3-roadmap.md+16−15
@@ -1,8 +1,12 @@
1+++
1+++
2title = "~2019.10 Roadmap"
2title = "~2019.10 Roadmap"
3−date = 2019-10-03
3+date = "2019-10-02"
4description = "Galen Wolfe-Pauly on the road ahead for the identity/OS/interface/community stack."
4description = "Galen Wolfe-Pauly on the road ahead for the identity/OS/interface/community stack."
5+aliases = [
5−aliases = ["/posts/essays/2019-10-3-roadmap", "/posts/2019-10-3-roadmap"]
6+ "/posts/essays/2019-10-3-roadmap",
7+ "/posts/2019-10-3-roadmap"
8+]
9+
6[extra]
10[extra]
7author = "Galen Wolfe-Pauly"
11author = "Galen Wolfe-Pauly"
8ship = "~ravmel-ropdyl"
12ship = "~ravmel-ropdyl"
@@ -15,21 +19,21 @@ The daily work of building a new OS from scratch is so engaging and exciting tha
15
19
16It’s a good thing I have a recurring reminder to write these updates. While our focus is on the future, it’s good to get a sense of the rate that we’re moving forward, and to let everyone know what’s been going on. We’ve made great progress over the past few months.
20It’s a good thing I have a recurring reminder to write these updates. While our focus is on the future, it’s good to get a sense of the rate that we’re moving forward, and to let everyone know what’s been going on. We’ve made great progress over the past few months.
17
21
18−We’ve got a new interface, Urbit 0.8.0, Hoon School, and a grants program among lots of other updates. We’ll go into detail about all of these, and talk a bit about where we’re headed next. The system is improving at a really good pace. We intend to keep it up.
22+We’ve got a new interface, Urbit 0.8.0, Hoon School, and a grants program among lots of other updates. We’ll go into detail about all of these, and talk a bit about where we’re headed next. The system is improving at a really good pace. We intend to keep it up.
19
23
20## Identity (Azimuth)
24## Identity (Azimuth)
21
25
22−The other day I got an email, clicked a link, and got a planet. A real, live, piece of cryptographic property with paper wallets and everything. It took about two minutes. And at the end, I could have easily sent invites to my friends.
26+The other day I got an email, clicked a link, and got a planet. A real, live, piece of cryptographic property with paper wallets and everything. It took about two minutes. And at the end, I could have easily sent invites to my friends.
23
27
24−This experience is part of a completely new Bridge, the interface for interacting with your Urbit identity. The beta experience we’re testing today is quite stripped down, but it’s a huge improvement over the last Bridge release. Clicking a link is a lot easier than downloading source code, running it from the command-line, and probably running into a python-related error.
28+This experience is part of a completely new Bridge, the interface for interacting with your Urbit identity. The beta experience we’re testing today is quite stripped down, but it’s a huge improvement over the last Bridge release. Clicking a link is a lot easier than downloading source code, running it from the command-line, and probably running into a python-related error.
25
29
26Getting to this point involved rewriting Bridge from scratch, figuring out how to host it securely, building infrastructure to fund the requisite transactions involved in registering a new identity, and setting up a service to send emails (and dispose of them afterward). We've also redesigned our paper wallets to make them simpler and clearer.
30Getting to this point involved rewriting Bridge from scratch, figuring out how to host it securely, building infrastructure to fund the requisite transactions involved in registering a new identity, and setting up a service to send emails (and dispose of them afterward). We've also redesigned our paper wallets to make them simpler and clearer.
27
31
28−We still want to get this new version of Bridge a bit further along before releasing it to everyone — but we’re excited about it. We didn’t quite get to the point of building an affordance for payments, which we had hoped to do, but that’s coming later.
32+We still want to get this new version of Bridge a bit further along before releasing it to everyone — but we’re excited about it. We didn’t quite get to the point of building an affordance for payments, which we had hoped to do, but that’s coming later.
29
33
30We want everyone to have an Urbit identity. And we want it to be incredibly easy to get one, so we’ll get Bridge out this month with a new urbit.org (more on that below).
34We want everyone to have an Urbit identity. And we want it to be incredibly easy to get one, so we’ll get Bridge out this month with a new urbit.org (more on that below).
31
35
32−The other area of identity-related work was Sigils — the algorithmically generated images that go with every Urbit identity. (We’ve got a blog post in the works that covers how we created these, which is a good story that needs to be told.) The original version of Sigils didn’t look very good at small sizes and a few collisions were found (thanks to [urbit.live](https://urbit.live) for helping to discover the collisions). The [new, improved sigils](https://github.com/urbit/sigil-js) have no collisions and look great at small sizes.
36+The other area of identity-related work was Sigils — the algorithmically generated images that go with every Urbit identity. (We’ve got a blog post in the works that covers how we created these, which is a good story that needs to be told.) The original version of Sigils didn’t look very good at small sizes and a few collisions were found (thanks to [urbit.live](https://urbit.live) for helping to discover the collisions). The [new, improved sigils](https://github.com/urbit/sigil-js) have no collisions and look great at small sizes.
33
37
34**Q4 2019**
38**Q4 2019**
35
39
@@ -42,7 +46,6 @@ The other area of identity-related work was Sigils — the algorithmically gener
42
46
43- Integrate Bridge with a native app for Arvo
47- Integrate Bridge with a native app for Arvo
44
48
45−
46## OS (Arvo)
49## OS (Arvo)
47
50
48As a team, we want Urbit to be our primary computer, our last computer, our permanent computer. And we want this now — or at least as soon as we possibly can. We’re both ambitious and impatient.
51As a team, we want Urbit to be our primary computer, our last computer, our permanent computer. And we want this now — or at least as soon as we possibly can. We’re both ambitious and impatient.
@@ -51,13 +54,13 @@ The frustration that we can’t move onto Urbit today propels us forward. The sy
51
54
52We’re very nearly to the point that all the kernel-level code in the system has been written by our current team. The one remaining vane that deserves a rewrite (Gall) has had a major cleanup by Jared just recently. The [Ship of Theseus](https://en.wikipedia.org/wiki/Ship_of_Theseus) approach does appear to be working. The infrastructure team is doing fantastic work and has really deepened their ownership of the system. The Urbit of today is on the road to becoming a great piece of system software.
55We’re very nearly to the point that all the kernel-level code in the system has been written by our current team. The one remaining vane that deserves a rewrite (Gall) has had a major cleanup by Jared just recently. The [Ship of Theseus](https://en.wikipedia.org/wiki/Ship_of_Theseus) approach does appear to be working. The infrastructure team is doing fantastic work and has really deepened their ownership of the system. The Urbit of today is on the road to becoming a great piece of system software.
53
56
54−The biggest infrastructure-level milestone was the release of [Urbit 0.8.0](https://github.com/urbit/urbit/releases/tag/v0.8.0). We introduced a new process-separation architecture, implemented the correct bootstrap sequence, moved to LMDB for persistence, replaced our http vane (%eyre) and moved to Nix for our build system.
57+The biggest infrastructure-level milestone was the release of [Urbit 0.8.0](https://github.com/urbit/urbit/releases/tag/v0.8.0). We introduced a new process-separation architecture, implemented the correct bootstrap sequence, moved to LMDB for persistence, replaced our http vane (%eyre) and moved to Nix for our build system.
55
58
56−To put it simply, Arvo is now much more stable and durable. During the beginning of the year we were seeing bugs and instability that were frustrating and unacceptable. While there are still issues on the live network, none of them terrify us much. We also implemented the ability for users to ‘individually breach’, which means that you can now reset your Urbit without waiting for us to reset the network.
59+To put it simply, Arvo is now much more stable and durable. During the beginning of the year we were seeing bugs and instability that were frustrating and unacceptable. While there are still issues on the live network, none of them terrify us much. We also implemented the ability for users to ‘individually breach’, which means that you can now reset your Urbit without waiting for us to reset the network.
57
60
58### Landscape (Arvo UI)
61### Landscape (Arvo UI)
59
62
60−We don’t just build infrastructure for others to develop on top of. We build interfaces too. At the top of the stack, we released a completely new Landscape, the interface for Arvo. This new interface makes it possible to build other ‘modules’ for Arvo that go beyond chat and publishing.
63+We don’t just build infrastructure for others to develop on top of. We build interfaces too. At the top of the stack, we released a completely new Landscape, the interface for Arvo. This new interface makes it possible to build other ‘modules’ for Arvo that go beyond chat and publishing.
61
64
62This new Landscape is a complete departure from the last direction. Your Urbit now has a simple home screen that launches individual modules and it’s [relatively easy](https://github.com/urbit/create-landscape-app) to create new ones. We’re all enjoying using Landscape around the office. It’s still a bit of a prototype — but it’s quite a good one, I think.
65This new Landscape is a complete departure from the last direction. Your Urbit now has a simple home screen that launches individual modules and it’s [relatively easy](https://github.com/urbit/create-landscape-app) to create new ones. We’re all enjoying using Landscape around the office. It’s still a bit of a prototype — but it’s quite a good one, I think.
63
66
@@ -78,10 +81,9 @@ This version of Landscape is, I think, the last one that we’ll call a prototyp
78
81
79**Q1 2020**
82**Q1 2020**
80
83
81−- Integrated client with Bridge and Arvo
84+- Integrated client with Bridge and Arvo
82- New interface framework, codenamed ‘Widescreen’
85- New interface framework, codenamed ‘Widescreen’
83
86
84−
85## Docs + Community
87## Docs + Community
86
88
87We had quite a bit of interest in our second session of Hoon School. We ended up with 150 people enrolled in Hoon 101, and 42 in 201. The 101 session just ended, with a lot of positive responses and feedback from the participants. We learned a lot doing it and got quite a bit of interesting new example code.
89We had quite a bit of interest in our second session of Hoon School. We ended up with 150 people enrolled in Hoon 101, and 42 in 201. The 101 session just ended, with a lot of positive responses and feedback from the participants. We learned a lot doing it and got quite a bit of interesting new example code.
@@ -101,11 +103,10 @@ We also did some experimentation with holding events on Arvo. We held weekly AMA
101- Vane level documentation
103- Vane level documentation
102- An active grant program
104- An active grant program
103
105
104−
105## urbit.org
106## urbit.org
106
107
107Urbit.org is about ready for a refresh — so we’re in the process of rebuilding it. We have, for a long time, told the story of Urbit by describing the system technically. We think Urbit can be explained much more simply and much more concisely. We’re working to put together a new set of materials in this direction.
108Urbit.org is about ready for a refresh — so we’re in the process of rebuilding it. We have, for a long time, told the story of Urbit by describing the system technically. We think Urbit can be explained much more simply and much more concisely. We’re working to put together a new set of materials in this direction.
108
109
109We’d also like to populate urbit.org with a lot more content about what we’re working on and thinking about. We do a reasonable job of writing updates, but many of our projects get released without any background info. Tlon and the Urbit community are full of smart, thoughtful people — and we’d like to do a lot more to surface their work. We plan to close out the year with both a new website and a lot of writing about what we’ve been building. Not everyone wants to read the source code!
110We’d also like to populate urbit.org with a lot more content about what we’re working on and thinking about. We do a reasonable job of writing updates, but many of our projects get released without any background info. Tlon and the Urbit community are full of smart, thoughtful people — and we’d like to do a lot more to surface their work. We plan to close out the year with both a new website and a lot of writing about what we’ve been building. Not everyone wants to read the source code!
110
111
111−That covers it for now. If you have questions or want to chat — find us in `~dopzod/urbit-help`. See you online!
112+That covers it for now. If you have questions or want to chat — find us in `~dopzod/urbit-help`. See you online!
content/blog/2019-5-roadmap.md+4−3
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2019.5 Roadmap"
2title = "~2019.5 Roadmap"
3−date = 2019-05-16
3+date = "2019-05-15"
4description = "Where we are and where we're going as of mid-2019."
4description = "Where we are and where we're going as of mid-2019."
5−aliases = ["/posts/essays/2019-5-roadmap", "/posts/2019-5-roadmap"]
5+aliases = [ "/posts/essays/2019-5-roadmap", "/posts/2019-5-roadmap" ]
6+
6[extra]
7[extra]
7author = "Galen Wolfe-Pauly"
8author = "Galen Wolfe-Pauly"
8ship = "~ravmel-ropdyl"
9ship = "~ravmel-ropdyl"
@@ -29,7 +30,7 @@ It’s true. Azimuth is operational, secure, and well tested. It’s a pretty co
29
30
30So the question is why haven’t we told the world about it?
31So the question is why haven’t we told the world about it?
31
32
32−I tend to think that in order for a technology to succeed it has to not only be an important technical innovation, it also has to be easy to understand as a product. And that’s our answer: we’ve undersold Azimuth because we want it to be easier to understand by *using*, not just by reading the code. Azimuth is quite an elegant piece of technology — but that doesn’t matter until it has a great user experience to match.
33+I tend to think that in order for a technology to succeed it has to not only be an important technical innovation, it also has to be easy to understand as a product. And that’s our answer: we’ve undersold Azimuth because we want it to be easier to understand by _using_, not just by reading the code. Azimuth is quite an elegant piece of technology — but that doesn’t matter until it has a great user experience to match.
33
34
34That’s why, in the near term, we’re focused on building on top of Azimuth ourselves. We can’t ask others to go down roads if we haven’t already been down them.
35That’s why, in the near term, we’re focused on building on top of Azimuth ourselves. We can’t ask others to go down roads if we haven’t already been down them.
35
36
content/blog/2020-to-2021.md+2−2
@@ -1,7 +1,8 @@
1+++
1+++
2title = "2020 -> 2021"
2title = "2020 -> 2021"
3description = "Reflecting and looking forward."
3description = "Reflecting and looking forward."
4−date = 2021-01-21
4+date = "2021-01-20"
5+
5[extra]
6[extra]
6author = "Josh Lehman"
7author = "Josh Lehman"
7ship = "~wolref-podlex"
8ship = "~wolref-podlex"
@@ -43,7 +44,6 @@ Growth in Urbit’s developer community has been growing organically in lockstep
43
44
44My strategy to date has been heavily focused on working directly with contributors to provide technical guidance and direction, and it’s been working really well. To that end I’ll also be scaling our ability to provide such support by bringing more individuals into urbit.org that can mentor, review work, and provide guidance on where to best direct contributors' energy.
45My strategy to date has been heavily focused on working directly with contributors to provide technical guidance and direction, and it’s been working really well. To that end I’ll also be scaling our ability to provide such support by bringing more individuals into urbit.org that can mentor, review work, and provide guidance on where to best direct contributors' energy.
45
46
46−
472021 is shaping up to be a big year for Urbit, and we'd [love your help](https://grants.urbit.org) in building it. If you want to see what we're working on in real time, join us in Landscape at ~wolref-podlex/foundation.
472021 is shaping up to be a big year for Urbit, and we'd [love your help](https://grants.urbit.org) in building it. If you want to see what we're working on in real time, join us in Landscape at ~wolref-podlex/foundation.
48
48
49See you on the network!
49See you on the network!
content/blog/20200929-state-of-urbit.md+4−7
@@ -1,11 +1,12 @@
1+++
1+++
2title = "Late 2020 Progress Update: OS 1 -> OS 1.N"
2title = "Late 2020 Progress Update: OS 1 -> OS 1.N"
3−date = 2020-09-29
3+date = "2020-09-28"
4description = "When we announced OS 1, in April, we started to disappear into Urbit. Since then, we’ve been living on Urbit like we never have before."
4description = "When we announced OS 1, in April, we started to disappear into Urbit. Since then, we’ve been living on Urbit like we never have before."
5+
5[extra]
6[extra]
6author = "Galen Wolfe-Pauly"
7author = "Galen Wolfe-Pauly"
7ship = "~ravmel-ropdyl"
8ship = "~ravmel-ropdyl"
8−image ="https://storage.googleapis.com/media.urbit.org/site/posts/essays/state-of-urbit-1.jpg"
9+image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/state-of-urbit-1.jpg"
9+++
10+++
10
11
11<br>
12<br>
@@ -16,7 +17,7 @@ image ="https://storage.googleapis.com/media.urbit.org/site/posts/essays/state-o
16
17
17When we announced OS 1, in April, we started to disappear into Urbit. Since then, we’ve been living on Urbit like we never have before. This has been our goal for years: to mature the system we’re building by becoming its first committed users. We knew that critical step toward Urbit’s maturity was being able to depend on it ourselves, but the system itself had to mature to the point that we could do that practically.
18When we announced OS 1, in April, we started to disappear into Urbit. Since then, we’ve been living on Urbit like we never have before. This has been our goal for years: to mature the system we’re building by becoming its first committed users. We knew that critical step toward Urbit’s maturity was being able to depend on it ourselves, but the system itself had to mature to the point that we could do that practically.
18
19
19−We’ve done this in fits and starts. We’ve *tried* and failed a few times over the years. We’ve always *used* Urbit to some extent, but we’ve never *relied* on it. These past six months have been different. I can’t tell whether it was out of sheer determination and commitment, or that the system was just genuinely ‘there’. Either way, both Tlon and the Urbit Community genuinely live on Urbit now.
20+We’ve done this in fits and starts. We’ve _tried_ and failed a few times over the years. We’ve always _used_ Urbit to some extent, but we’ve never _relied_ on it. These past six months have been different. I can’t tell whether it was out of sheer determination and commitment, or that the system was just genuinely ‘there’. Either way, both Tlon and the Urbit Community genuinely live on Urbit now.
20
21
21In a way, our ability to use Urbit day to day doesn’t make sense. When we shipped OS 1, it was full of holes. There were serious performance, stability, and reliability issues. Plenty of people showed up and thought, ‘I don’t understand why you think this is useful.’ But, it was good enough that we wanted to use it. And since we wanted to use it, we put our energy into making it better like we hadn’t ever before. Being able to use a system that you can really trust is a wonderful feeling. It’s Computing Without Compromises.
22In a way, our ability to use Urbit day to day doesn’t make sense. When we shipped OS 1, it was full of holes. There were serious performance, stability, and reliability issues. Plenty of people showed up and thought, ‘I don’t understand why you think this is useful.’ But, it was good enough that we wanted to use it. And since we wanted to use it, we put our energy into making it better like we hadn’t ever before. Being able to use a system that you can really trust is a wonderful feeling. It’s Computing Without Compromises.
22
23
@@ -26,7 +27,6 @@ The tl;dr is that Urbit is much faster, more reliable, and nicer to use than it
26
27
27Anyway, let’s walk through the details. We’ll talk about our infrastructure and interface work independently, since that’s how we organize things internally. Then we’ll talk a bit about what’s going on on the network.
28Anyway, let’s walk through the details. We’ll talk about our infrastructure and interface work independently, since that’s how we organize things internally. Then we’ll talk a bit about what’s going on on the network.
28
29
29−
30### Infrastructure
30### Infrastructure
31
31
32![Debugging Interface](https://storage.googleapis.com/media.urbit.org/site/posts/essays/state-of-urbit-2.png)
32![Debugging Interface](https://storage.googleapis.com/media.urbit.org/site/posts/essays/state-of-urbit-2.png)
@@ -43,7 +43,6 @@ We also rewrote a large part of our runtime in Haskell and made overall progress
43
43
44The network is stable, fast, and safe from day to day. We’re pretty confident it can grow quite a bit without serious issues. When we shipped OS 1 we really weren’t sure what we could handle. Now we’re standing on much more solid ground.
44The network is stable, fast, and safe from day to day. We’re pretty confident it can grow quite a bit without serious issues. When we shipped OS 1 we really weren’t sure what we could handle. Now we’re standing on much more solid ground.
45
45
46−
47### Interface
46### Interface
48
47
49![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/state-of-urbit-3.jpg)
48![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/state-of-urbit-3.jpg)
@@ -60,7 +59,6 @@ Those two are by far the most significant, but there’s so much more. We [rewro
60
59
61And I almost forgot [Leap](https://github.com/urbit/urbit/pull/3231): an omnibox for navigating around OS 1 with the keyboard. We have plans to make Leap much more powerful — but it’s a great first start toward making OS 1 keyboard accessible. I almost exclusively use [Leap](https://upload.wikimedia.org/wikipedia/commons/0/06/Canon_Cat_keyboard.jpg) to get around OS 1 these days.
60And I almost forgot [Leap](https://github.com/urbit/urbit/pull/3231): an omnibox for navigating around OS 1 with the keyboard. We have plans to make Leap much more powerful — but it’s a great first start toward making OS 1 keyboard accessible. I almost exclusively use [Leap](https://upload.wikimedia.org/wikipedia/commons/0/06/Canon_Cat_keyboard.jpg) to get around OS 1 these days.
62
61
63−
64### Community + network
62### Community + network
65
63
66![Fishing Village](https://storage.googleapis.com/media.urbit.org/site/posts/essays/state-of-urbit-5.png)
64![Fishing Village](https://storage.googleapis.com/media.urbit.org/site/posts/essays/state-of-urbit-5.png)
@@ -71,7 +69,6 @@ Getting onto Urbit is still relatively challenging. By the standards of software
71
69
72Turns out, there are plenty of people who are up for running Urbit themselves and quite a few small communities have sprouted around the network. Overall the network has a fun, cozy feeling. It’s nice.
70Turns out, there are plenty of people who are up for running Urbit themselves and quite a few small communities have sprouted around the network. Overall the network has a fun, cozy feeling. It’s nice.
73
71
74−
75### What’s next
72### What’s next
76
73
77We’re still more or less flat-out, full speed ahead into an even better Urbit-world. The seeds of change were planted when we made Josh the [interim technical director of urbit.org](https://urbit.org/blog/first-steps-towards-urbit-org/). Urbit itself is getting close to the point where the separation between Urbit and Tlon has to become more real. Urbit is aimed at being an ubiquitous platform, Tlon is aimed at making it as usable and useful as possible.
74We’re still more or less flat-out, full speed ahead into an even better Urbit-world. The seeds of change were planted when we made Josh the [interim technical director of urbit.org](https://urbit.org/blog/first-steps-towards-urbit-org/). Urbit itself is getting close to the point where the separation between Urbit and Tlon has to become more real. Urbit is aimed at being an ubiquitous platform, Tlon is aimed at making it as usable and useful as possible.
content/blog/20201119-models-of-society.md+4−4
@@ -1,14 +1,15 @@
1+++
1+++
2title = "Models of Society"
2title = "Models of Society"
3description = "Conversations compose society. What composes conversation — how do we digitize it in a way that enhances society without imposing upon it? How do we form this new medium, both to facilitate natural human behavior and to inspire the best of it?"
3description = "Conversations compose society. What composes conversation — how do we digitize it in a way that enhances society without imposing upon it? How do we form this new medium, both to facilitate natural human behavior and to inspire the best of it?"
4−date = 2020-11-19
4+date = "2020-11-18"
5+
5[extra]
6[extra]
6author = "Tyler Shuster"
7author = "Tyler Shuster"
7ship = "~radbur-sivmus"
8ship = "~radbur-sivmus"
8image = "https://media.urbit.org/site/posts/essays/cochno-stone.png"
9image = "https://media.urbit.org/site/posts/essays/cochno-stone.png"
9+++
10+++
10
11
11−*I had used Facebook and Google for my entire adult life. I knew they were toxic but I didn't know why. For a few weeks I tried to create a website that would scrape data from Facebook’s API and push data back, puppetting it from my own server. But as I stared headlong into the ever-shifting darkness of the modern web, I despaired and abandoned my attempt. Less than a year later I heard about Urbit. Technically, it went way over my head&mdash;but socially I knew exactly what it was, what it always had to be, why it was a discovery and not an invention, a place and not a product. I've watched the settlers there for four years, only just now using the opportunity of the pandemic to swim to this new landscape and gaze upon this young nation, this digital city, this urbis ec bit. I do not work for Tlon. I just live here.*
12+_I had used Facebook and Google for my entire adult life. I knew they were toxic but I didn't know why. For a few weeks I tried to create a website that would scrape data from Facebook’s API and push data back, puppetting it from my own server. But as I stared headlong into the ever-shifting darkness of the modern web, I despaired and abandoned my attempt. Less than a year later I heard about Urbit. Technically, it went way over my head&mdash;but socially I knew exactly what it was, what it always had to be, why it was a discovery and not an invention, a place and not a product. I've watched the settlers there for four years, only just now using the opportunity of the pandemic to swim to this new landscape and gaze upon this young nation, this digital city, this urbis ec bit. I do not work for Tlon. I just live here._
12
13
13<hr>
14<hr>
14
15
@@ -59,7 +60,6 @@ In theory, we would have a digital city with unique regions, public fora, and so
59
60
60## Urbis ec Bit
61## Urbis ec Bit
61
62
62−
63<br>
63<br>
64
64
65![View of Florence from San Miniato](https://media.urbit.org/site/posts/essays/view-of-florence.jpg)
65![View of Florence from San Miniato](https://media.urbit.org/site/posts/essays/view-of-florence.jpg)
@@ -74,4 +74,4 @@ The default tools work with messages in a few of the ways with which we've grown
74
74
75Similar to working undeveloped land, it takes a lot of hard work, which is why Urbit is not ready for mainstream adoption yet, and why I alluded to the idea of settlers in my opening paragraph. Traveling to the new world is not for everyone, but everyone is welcome.
75Similar to working undeveloped land, it takes a lot of hard work, which is why Urbit is not ready for mainstream adoption yet, and why I alluded to the idea of settlers in my opening paragraph. Traveling to the new world is not for everyone, but everyone is welcome.
76
76
77−*How could one do other than submit to Tlön, to the minute and vast evidence of an orderly plant? It is useless to answer that reality is also orderly. Perhaps it is, but in accordance with divine laws&mdash;I translate: inhuman laws&mdash;which we never quite grasp. Tlön is surely a labyrinth, but it is a labyrinth devised by men, a labyrinth destined to be deciphered by men.*
77+_How could one do other than submit to Tlön, to the minute and vast evidence of an orderly plant? It is useless to answer that reality is also orderly. Perhaps it is, but in accordance with divine laws&mdash;I translate: inhuman laws&mdash;which we never quite grasp. Tlön is surely a labyrinth, but it is a labyrinth devised by men, a labyrinth destined to be deciphered by men._
content/blog/a-founders-farewell.md+36−32
@@ -1,8 +1,12 @@
1+++
1+++
2title = "A Founder's Farewell"
2title = "A Founder's Farewell"
3−date = 2019-01-14
3+date = "2019-01-13"
4description = "My goal was always to fire myself at the first possible opportunity. I'm super happy to reach it."
4description = "My goal was always to fire myself at the first possible opportunity. I'm super happy to reach it."
5+aliases = [
5−aliases = ["/posts/essays/a-founders-farewell", "/posts/a-founders-farewell"]
6+ "/posts/essays/a-founders-farewell",
7+ "/posts/a-founders-farewell"
8+]
9+
6[extra]
10[extra]
7author = "Curtis Yarvin"
11author = "Curtis Yarvin"
8ship = "~sorreg-namtyv"
12ship = "~sorreg-namtyv"
@@ -29,7 +33,7 @@ ceased to be mine and became the world's. Urbit works; its PKI
29is on the Ethereum mainnet; it's open source; in every way,
33is on the Ethereum mainnet; it's open source; in every way,
30technical, legal, and mathematical, it is the world's.
34technical, legal, and mathematical, it is the world's.
31
35
32−(What _is_ Urbit? Please read the [primer](/primer).)
36+(What _is_ Urbit? Please read the [primer](/primer).)
33
37
34Let's talk about: why I've left; the state of Tlon; and the state
38Let's talk about: why I've left; the state of Tlon; and the state
35of Urbit. If there's any time left, we'll read some poetry.
39of Urbit. If there's any time left, we'll read some poetry.
@@ -68,7 +72,7 @@ nothing ever built before.
68
72
69Urbit in 2013 had roughly the same feature set as Slack in 2013,
73Urbit in 2013 had roughly the same feature set as Slack in 2013,
70but less polished, and decentralized. It was pretty buggy and
74but less polished, and decentralized. It was pretty buggy and
71−slow. But had we put all our resources into debugging and
75+slow. But had we put all our resources into debugging and
72optimization, it would not have taken five years.
76optimization, it would not have taken five years.
73
77
74My instinct was always that Urbit's delivery schedule should be
78My instinct was always that Urbit's delivery schedule should be
@@ -88,7 +92,7 @@ As seen from the 2019 Urbit, this is very lame indeed.
88The conventional wisdom is to ship your embarrassing "MVP." For
92The conventional wisdom is to ship your embarrassing "MVP." For
89several reasons, Urbit occupies a unique strategic position.
93several reasons, Urbit occupies a unique strategic position.
90Urbit just isn't relevant until Urbit is, if not perfect,
94Urbit just isn't relevant until Urbit is, if not perfect,
91−uniformly excellent. It can't just work. It has to work right.
95+uniformly excellent. It can't just work. It has to work right.
92Urbit has to be amazing – which is hardly a useless discipline.
96Urbit has to be amazing – which is hardly a useless discipline.
93
97
94I still did not think it would take five years to make Urbit
98I still did not think it would take five years to make Urbit
@@ -121,7 +125,7 @@ not even the best engineer on the project; I just got here first.
121This codebase is very young and very general; there is a lot of
125This codebase is very young and very general; there is a lot of
122fun left to be had with it; others deserve to have that fun.
126fun left to be had with it; others deserve to have that fun.
123
127
124−I have no successor as "BDFL." Technical leadership passes to
128+I have no successor as "BDFL." Technical leadership passes to
125Tlon as a company. Urbit is open source and anyone may play, but
129Tlon as a company. Urbit is open source and anyone may play, but
126anyone who wants to catch up to Tlon still has a lot to learn.
130anyone who wants to catch up to Tlon still has a lot to learn.
127Not that that should stop them!
131Not that that should stop them!
@@ -143,7 +147,7 @@ The startup is the least worst. I'd do it again.
143
147
144A normal startup lifecycle (Tlon actually got into YC, but
148A normal startup lifecycle (Tlon actually got into YC, but
145declined – this was either cool or lame) looks nothing like a
149declined – this was either cool or lame) looks nothing like a
146−normal system-software lifecycle. Nor is Urbit normal. But
150+normal system-software lifecycle. Nor is Urbit normal. But
147while Silicon Valley is absurd, it still fits Marianne Moore's
151while Silicon Valley is absurd, it still fits Marianne Moore's
148line: "with a perfect contempt for it, one discovers that there
152line: "with a perfect contempt for it, one discovers that there
149is in it after all a place for the genuine."
153is in it after all a place for the genuine."
@@ -175,7 +179,7 @@ is not for lack of talent-hours. Imagine a bazaar creating a
175feature film, and you'll get the picture. (And Fuchsia seems
179feature film, and you'll get the picture. (And Fuchsia seems
176like a fairly traditional OS.)
180like a fairly traditional OS.)
177
181
178−Why is creative work so hard for bazaars? We could take this as
182+Why is creative work so hard for bazaars? We could take this as
179an axiom – but it's worth understanding.
183an axiom – but it's worth understanding.
180
184
181The path from concept to product is an annealing process. Your
185The path from concept to product is an annealing process. Your
@@ -204,7 +208,7 @@ now, and hard problems. Unless you postpone anything that isn't
204a hard but solvable problem, your gas will never turn into steel.
208a hard but solvable problem, your gas will never turn into steel.
205There are lots and lots and lots of ways to go nowhere fast.
209There are lots and lots and lots of ways to go nowhere fast.
206
210
207−Somehow it's 2019. Urbit is hot iron under the hammer. It is
211+Somehow it's 2019. Urbit is hot iron under the hammer. It is
208solid, but not yet hard. It has shape, but can yet be shaped.
212solid, but not yet hard. It has shape, but can yet be shaped.
209It is done, but ought to be finished. It is a sword; you don't
213It is done, but ought to be finished. It is a sword; you don't
210want to get stabbed with it; it is not Excalibur, the blade to
214want to get stabbed with it; it is not Excalibur, the blade to
@@ -259,8 +263,8 @@ others know better. When we transitioned from Nock 5 to Nock 4,
259all I contributed was a suggestion. The same for our Ethereum
263all I contributed was a suggestion. The same for our Ethereum
260address collection, which our customers absolutely loved.
264address collection, which our customers absolutely loved.
261
265
262−Who's responsible for growing and maintaining this team? Who's
266+Who's responsible for growing and maintaining this team? Who's
263−the stone at at the top of the pyramid? Not me: if you gave me a
267+the stone at at the top of the pyramid? Not me: if you gave me a
264goat to feed, the goat would die. The stone that holds the arch
268goat to feed, the goat would die. The stone that holds the arch
265together is Tlon's CEO and my cofounder, Galen Wolfe-Pauly.
269together is Tlon's CEO and my cofounder, Galen Wolfe-Pauly.
266
270
@@ -297,8 +301,8 @@ words that might otherwise go unsaid.
297### Urbit, a level and neutral platform
301### Urbit, a level and neutral platform
298
302
299Urbit's distribution and sponsorship hierarchy of galaxies,
303Urbit's distribution and sponsorship hierarchy of galaxies,
300−stars and planets is *not* designed as a political structure,
304+stars and planets is _not_ designed as a political structure,
301−or even a social structure. The actual social layer is in
305+or even a social structure. The actual social layer is in
302userspace -- one layer up.
306userspace -- one layer up.
303
307
304Socially and politically, Urbit is a flat network of planets.
308Socially and politically, Urbit is a flat network of planets.
@@ -334,10 +338,10 @@ less than half). The rest are held by third parties – all of
334whom have either much more, or much less, than they deserve.
338whom have either much more, or much less, than they deserve.
335
339
336But although the distribution of Urbit space was thoroughly
340But although the distribution of Urbit space was thoroughly
337−unfair, it was always _honest_ and never _corrupt_. Everyone
341+unfair, it was always _honest_ and never _corrupt_. Everyone
338who has galaxies or stars did _something_ for Urbit. Some gave a
342who has galaxies or stars did _something_ for Urbit. Some gave a
339lot of money, some gave a little; some contributed a lot of code,
343lot of money, some gave a little; some contributed a lot of code,
340−some just showed up. We paid a lawyer by bartering a pair. A
344+some just showed up. We paid a lawyer by bartering a pair. A
341bunch went to contest winners who solved a trivial Nock problem
345bunch went to contest winners who solved a trivial Nock problem
342in 2010.
346in 2010.
343
347
@@ -347,14 +351,14 @@ often had to be in the right place at the right time. This is
347another problem with life that we can't fix.
351another problem with life that we can't fix.
348
352
349Every real system of property is unfair. Who deserves to own
353Every real system of property is unfair. Who deserves to own
350−Manhattan? Who does own it? If property be not unfair – if it
354+Manhattan? Who does own it? If property be not unfair – if it
351is not the result of respecting past accidents – it is not
355is not the result of respecting past accidents – it is not
352property at all, but something else. I certainly would not do it
356property at all, but something else. I certainly would not do it
353this haphazardly again, but the outcome is no tragedy.
357this haphazardly again, but the outcome is no tragedy.
354
358
355When you live in Manhattan, you simply don't worry about who
359When you live in Manhattan, you simply don't worry about who
356−owns it or why; and nor does it matter. Are they Jews? Muslims?
360+owns it or why; and nor does it matter. Are they Jews? Muslims?
357−Christians? Communists? Italians? You don't care and you don't
361+Christians? Communists? Italians? You don't care and you don't
358have to. You know it's basically random and probably unfair.
362have to. You know it's basically random and probably unfair.
359Randomness, even blatant unfairness, creates a kind of neutral,
363Randomness, even blatant unfairness, creates a kind of neutral,
360peaceful, even promising urban anonymity.
364peaceful, even promising urban anonymity.
@@ -401,7 +405,7 @@ Turing Award – my money is definitely on Raph at this point.
401You can even go and read my Usenix '93 paper on ASLR-secured
405You can even go and read my Usenix '93 paper on ASLR-secured
402RPC, which won Best Student Paper and has like 50 citations.
406RPC, which won Best Student Paper and has like 50 citations.
403
407
404−Well. That whole scene is a bad trip, kids. Avoid it. Also, if
408+Well. That whole scene is a bad trip, kids. Avoid it. Also, if
405you start out as Rimbaud, you might end up as Lebowski. On the
409you start out as Rimbaud, you might end up as Lebowski. On the
406other hand, to have any excuse for boiling the ocean, you do have
410other hand, to have any excuse for boiling the ocean, you do have
407to make some serious CS problems just go away. Here are three.
411to make some serious CS problems just go away. Here are three.
@@ -436,13 +440,13 @@ transactions.
436
440
437This means you can't write a command protocol where your commands
441This means you can't write a command protocol where your commands
438get executed exactly once. You can only choose "at least once"
442get executed exactly once. You can only choose "at least once"
439−or "at most once." This problem is as ridiculous and frustrating
443+or "at most once." This problem is as ridiculous and frustrating
440as it sounds.
444as it sounds.
441
445
442You can address it in three ways: (a) make all your commands
446You can address it in three ways: (a) make all your commands
443formally idempotent, so that repeating them has no additional
447formally idempotent, so that repeating them has no additional
444effect; (b) insert a layer of stateful middleware — a message
448effect; (b) insert a layer of stateful middleware — a message
445−queue; (c) be fine with "almost always once." Guess which
449+queue; (c) be fine with "almost always once." Guess which
446approach is most popular?
450approach is most popular?
447
451
448Your Urbit ship has one permanent brain. Its acks are end-to-end
452Your Urbit ship has one permanent brain. Its acks are end-to-end
@@ -453,14 +457,14 @@ queue. And every message is executed once.
453#### Dependencies
457#### Dependencies
454
458
45520th-century languages are all at least vaguely based on a
45920th-century languages are all at least vaguely based on a
456−formalism from the '30s called the "lambda calculus." The
460+formalism from the '30s called the "lambda calculus." The
457fundamental operation in lambda calculus is variable reduction
461fundamental operation in lambda calculus is variable reduction
458from name to value. So lambda languages all have a symbol table
462from name to value. So lambda languages all have a symbol table
459or environment which binds names to values.
463or environment which binds names to values.
460
464
461Modern build systems assemble large programs out of small files
465Modern build systems assemble large programs out of small files
462by reusing this symbol table for global function names, a process
466by reusing this symbol table for global function names, a process
463−called "linking." Unfortunately, linking causes a problem known
467+called "linking." Unfortunately, linking causes a problem known
464as "dependency hell," involving baffling, unpredictable upgrade
468as "dependency hell," involving baffling, unpredictable upgrade
465failures. The fundamental problem is the "diamond dependency" —
469failures. The fundamental problem is the "diamond dependency" —
466when a build requires two different versions of one symbol.
470when a build requires two different versions of one symbol.
@@ -517,7 +521,7 @@ demands "space-rated" code that documents every variable and
517every line – and almost none of the codebase is space-rated.
521every line – and almost none of the codebase is space-rated.
518
522
519Urbit's internal opacity persists for two reasons, one good and
523Urbit's internal opacity persists for two reasons, one good and
520−one bad. The bad reason is just laziness. The good reason is
524+one bad. The bad reason is just laziness. The good reason is
521justified fear of _premature explanation_, which like premature
525justified fear of _premature explanation_, which like premature
522optimization ruins the annealing process.
526optimization ruins the annealing process.
523
527
@@ -542,7 +546,7 @@ in a box for 50 years, or 100, or 500, and when you turn it on
542in a modern interpreter it will upgrade itself and work fine.
546in a modern interpreter it will upgrade itself and work fine.
543
547
544There aren't any significant structural obstacles to each of
548There aren't any significant structural obstacles to each of
545−these milestones. But we can't claim them yet. We haven't
549+these milestones. But we can't claim them yet. We haven't
546really even worried about them. This is another triage case:
550really even worried about them. This is another triage case:
547in this case, the issue is _premature reliability_.
551in this case, the issue is _premature reliability_.
548
552
@@ -564,10 +568,10 @@ computer obviously suggests.
564
568
565Instead, Urbit today is built more the Unix way (if not the
569Instead, Urbit today is built more the Unix way (if not the
566Windows way). It has separate subsystems for tracking and
570Windows way). It has separate subsystems for tracking and
567−updating these three kinds of data. This was my design. Like
571+updating these three kinds of data. This was my design. Like
568Urbit's opacity or impermanence, this was always obviously lame.
572Urbit's opacity or impermanence, this was always obviously lame.
569
573
570−Why do it the lame way? Because, before understanding the union
574+Why do it the lame way? Because, before understanding the union
571of these problems, we had to understand each problem by itself.
575of these problems, we had to understand each problem by itself.
572We didn't – not even close.
576We didn't – not even close.
573
577
@@ -587,17 +591,17 @@ ahead, and falling down an impossible rathole.
587
591
588## Further reading
592## Further reading
589
593
590−What will I do personally? I'll spend more time with my kids.
594+What will I do personally? I'll spend more time with my kids.
591I'll finish reading my 1911 Britannica – I am only on the B's.
595I'll finish reading my 1911 Britannica – I am only on the B's.
592I have no other long-term plans.
596I have no other long-term plans.
593
597
594But I won't be back to Urbit. I am leaving not just the project
598But I won't be back to Urbit. I am leaving not just the project
595but the field – no less than Satoshi, or Everett, or Rimbaud.
599but the field – no less than Satoshi, or Everett, or Rimbaud.
596−Will Satoshi weigh in on the next Bitcoin Cash fork? Did Rimbaud
600+Will Satoshi weigh in on the next Bitcoin Cash fork? Did Rimbaud
597−fly back from Ethiopia for his book-release tour? (Did anyone
601+fly back from Ethiopia for his book-release tour? (Did anyone
598−want him back?) It's not so bad to be a middle-aged Rimbaud.
602+want him back?) It's not so bad to be a middle-aged Rimbaud.
599
603
600−Is there more to say? Of course, but not in prose. Read
604+Is there more to say? Of course, but not in prose. Read
601Bunting's _Chomei at Toyama_ and _Notes on a Fly-Leaf_; Cavafy's
605Bunting's _Chomei at Toyama_ and _Notes on a Fly-Leaf_; Cavafy's
602_Il Gran Rifiuto_, Keeley & Sherrard translation; Canto XV of the
606_Il Gran Rifiuto_, Keeley & Sherrard translation; Canto XV of the
603Inferno, Pinsky translation. You might learn something.
607Inferno, Pinsky translation. You might learn something.
content/blog/a-topiary.md+2−1
@@ -1,7 +1,8 @@
1+++
1+++
2title = "A Topiary: Hypertext and Urbit"
2title = "A Topiary: Hypertext and Urbit"
3−date = 2021-06-14
3+date = "2021-06-13"
4description = "A brief history of hypertext and Urbit networking"
4description = "A brief history of hypertext and Urbit networking"
5+
5[extra]
6[extra]
6author = "Reid Scoggin"
7author = "Reid Scoggin"
7ship = "~sitful-hatred"
8ship = "~sitful-hatred"
content/blog/aesthetic-culture-1.md+3−2
@@ -1,7 +1,8 @@
1+++
1+++
2title = "Aesthetic Culture #1"
2title = "Aesthetic Culture #1"
3description = "One of the most exciting things about Urbit is the aesthetic and design around it, developed partly by Tlon (through the design of Urbit itself) and partly by the community (by producing great Urbit art)."
3description = "One of the most exciting things about Urbit is the aesthetic and design around it, developed partly by Tlon (through the design of Urbit itself) and partly by the community (by producing great Urbit art)."
4−date = 2020-11-12
4+date = "2020-11-11"
5+
5[extra]
6[extra]
6description = "One of the most exciting things about Urbit is the aesthetic and design around it, developed partly by Tlon (through the design of Urbit itself) and partly by the community (by producing great Urbit art)."
7description = "One of the most exciting things about Urbit is the aesthetic and design around it, developed partly by Tlon (through the design of Urbit itself) and partly by the community (by producing great Urbit art)."
7author = "Nikolai Mallett"
8author = "Nikolai Mallett"
@@ -15,7 +16,7 @@ image = "https://media.urbit.org/site/posts/essays/help-the-environment.jpg"
15
16
16<br>
17<br>
17
18
18−*This post is the first in a series of digests centered on art produced within and about Urbit by a member of the community, ~nartes-fasrum. Monthly digests will be available within the Urbit Community group in Landscape, and will occasionally be compiled here on the blog to give you a sneak peek at some of what’s happening on the network. Enjoy! ~wolref-podlex*
19+_This post is the first in a series of digests centered on art produced within and about Urbit by a member of the community, ~nartes-fasrum. Monthly digests will be available within the Urbit Community group in Landscape, and will occasionally be compiled here on the blog to give you a sneak peek at some of what’s happening on the network. Enjoy! ~wolref-podlex_
19
20
20One of the most exciting things about Urbit is the aesthetic and design around it, developed partly by Tlon (through the design of Urbit itself) and partly by the community (by producing great Urbit art). As the community grows, it creates more art, and we have the opportunity to showcase some of the pieces we love. These works can draw curious new users in, and they give existing users ways to communicate their excitement to friends.
21One of the most exciting things about Urbit is the aesthetic and design around it, developed partly by Tlon (through the design of Urbit itself) and partly by the community (by producing great Urbit art). As the community grows, it creates more art, and we have the opportunity to showcase some of the pieces we love. These works can draw curious new users in, and they give existing users ways to communicate their excitement to friends.
21
22
content/blog/after-machine-war.md+2−2
@@ -1,7 +1,8 @@
1+++
1+++
2title = "After the Machine War"
2title = "After the Machine War"
3description = "The date is January 1, 2050. The place, New York City. The vibe...subdued."
3description = "The date is January 1, 2050. The place, New York City. The vibe...subdued."
4−date = 2021-03-15
4+date = "2021-03-14"
5+
5[extra]
6[extra]
6author = "Simon Kovacs"
7author = "Simon Kovacs"
7ship = "~bacbec-lormur"
8ship = "~bacbec-lormur"
@@ -14,7 +15,6 @@ image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/berlin
14
15
15<br>
16<br>
16
17
17−
18> The following fictional passage, from a book being written in an Urbit Group called “the Aleph,” sketches out a dismal future for the human race. As an item of speculative fiction, the piece is not what one might call original. Anyone could have come up with these ideas. In fact, several already have. The Matrix is an obvious antecedent. Vonnegut isn’t far behind either. And the treacly humanism lodged beneath the bitter humor resembles nothing so much as the work of that beau monde satirist, George Saunders.
18> The following fictional passage, from a book being written in an Urbit Group called “the Aleph,” sketches out a dismal future for the human race. As an item of speculative fiction, the piece is not what one might call original. Anyone could have come up with these ideas. In fact, several already have. The Matrix is an obvious antecedent. Vonnegut isn’t far behind either. And the treacly humanism lodged beneath the bitter humor resembles nothing so much as the work of that beau monde satirist, George Saunders.
19>
19>
20> Really the only notable thing about it is that it was written on Urbit. And that, perhaps, has made all the difference.
20> Really the only notable thing about it is that it was written on Urbit. And that, perhaps, has made all the difference.
content/blog/an-email.md+8−12
@@ -1,7 +1,8 @@
1+++
1+++
2title = "An Email from the Archive"
2title = "An Email from the Archive"
3description = "I found this email in my archives recently and thought it might be fun to share publicly."
3description = "I found this email in my archives recently and thought it might be fun to share publicly."
4−date = 2020-11-30
4+date = "2020-11-29"
5+
5[extra]
6[extra]
6author = "Galen Wolfe-Pauly"
7author = "Galen Wolfe-Pauly"
7ship = "~ravmel-ropdyl"
8ship = "~ravmel-ropdyl"
@@ -27,32 +28,30 @@ Our collective desire to depend on digital communication tools vastly exceeds wh
27
28
28In the pre-digital world we enjoyed a few things about the way we communicated, collaborated and did business that are dwindling: simplicity, durability and ownership. I’ll try to give some straightforward examples of what I mean:
29In the pre-digital world we enjoyed a few things about the way we communicated, collaborated and did business that are dwindling: simplicity, durability and ownership. I’ll try to give some straightforward examples of what I mean:
29
30
30−A - When I talk to someone directly, I’m not worried that someone else is listening in. If they go tell someone else what I said to them, that’s something for us to work out between us — they’re not *always* reporting our conversations back to a third party. The constraints of the interaction and the privacy implications are *simple* — I don’t think about them at all. Good privacy guarantees flow from a strict focus on simplicity. When two people want to talk to each other: give them a secure channel to talk. Putting a centrally-controlled service between them is just an interim solution because no one could figure out a better way to do it.
31+A - When I talk to someone directly, I’m not worried that someone else is listening in. If they go tell someone else what I said to them, that’s something for us to work out between us — they’re not _always_ reporting our conversations back to a third party. The constraints of the interaction and the privacy implications are _simple_ — I don’t think about them at all. Good privacy guarantees flow from a strict focus on simplicity. When two people want to talk to each other: give them a secure channel to talk. Putting a centrally-controlled service between them is just an interim solution because no one could figure out a better way to do it.
31
32
32B - When I write something down on paper, or type into a typewriter, I have an intuitive sense of the durability of what I’ve made. I have notes on my shelf I took ten years ago. I don’t worry about them disappearing. This means I can have a very direct, high-resolution relationship with the medium. I can pour myself into my physically-written notes in a way I would never pour myself into a Google Doc. Our digital tools are deeply untrustworthy because we know they can disappear, that they won’t actually last forever.
33B - When I write something down on paper, or type into a typewriter, I have an intuitive sense of the durability of what I’ve made. I have notes on my shelf I took ten years ago. I don’t worry about them disappearing. This means I can have a very direct, high-resolution relationship with the medium. I can pour myself into my physically-written notes in a way I would never pour myself into a Google Doc. Our digital tools are deeply untrustworthy because we know they can disappear, that they won’t actually last forever.
33
34
34−C - Around 2008 I started limiting myself to a few specific drawing and writing tools. I use them all the time and can actually refine my relationship to them since I know they’re not going to change out from under me. Perhaps at some point these pens wont be made anymore, but the ones I have are actually *mine*. Similarly, the things I make with them actually belong to me in a way that doesn’t require some ridiculous terms of service. A sense of ownership, when it comes to the medium of communication, determines our level of trust and commitment.
35+C - Around 2008 I started limiting myself to a few specific drawing and writing tools. I use them all the time and can actually refine my relationship to them since I know they’re not going to change out from under me. Perhaps at some point these pens wont be made anymore, but the ones I have are actually _mine_. Similarly, the things I make with them actually belong to me in a way that doesn’t require some ridiculous terms of service. A sense of ownership, when it comes to the medium of communication, determines our level of trust and commitment.
35
36
36Our digital tools have to achieve the same level of simplicity, durability and ownership that our pre-digital tools did. Until they do, we’re always going to be in conflict with them, full stop.
37Our digital tools have to achieve the same level of simplicity, durability and ownership that our pre-digital tools did. Until they do, we’re always going to be in conflict with them, full stop.
37
38
38−The main thing is that exactly none of our present platform-centric world can survive when you see things this way. The digital world we live in is composed of an insanely complicated, ephemeral set of tools that distinctly *do not* belong to the people that use them.
39+The main thing is that exactly none of our present platform-centric world can survive when you see things this way. The digital world we live in is composed of an insanely complicated, ephemeral set of tools that distinctly _do not_ belong to the people that use them.
39
40
40We’re going to be in a constant struggle with technology until it conforms to these three very basic expectations. These are the expectations we try to get Urbit to fall in-line with, of course. Something else could also succeed by satisfying them. But I also don’t really see anything else, aside from Bitcoin and maybe Ethereum, falling in line with these core principles.
41We’re going to be in a constant struggle with technology until it conforms to these three very basic expectations. These are the expectations we try to get Urbit to fall in-line with, of course. Something else could also succeed by satisfying them. But I also don’t really see anything else, aside from Bitcoin and maybe Ethereum, falling in line with these core principles.
41
42
42So: while I wish that Urbit was more mature and ready to capture those that are being purged from mainstream social media, are bored with it or are frustrated with the constraints of ‘productivity software’ — I think this conflict is going to drag on until people realize that what we’re in conflict with is the structure of the software we use. Using software that’s managed by other people is always going to cause serious problems all the way up at the user level. For more speculation on how this might play out, watch Black Mirror.
43So: while I wish that Urbit was more mature and ready to capture those that are being purged from mainstream social media, are bored with it or are frustrated with the constraints of ‘productivity software’ — I think this conflict is going to drag on until people realize that what we’re in conflict with is the structure of the software we use. Using software that’s managed by other people is always going to cause serious problems all the way up at the user level. For more speculation on how this might play out, watch Black Mirror.
43
44
44−
452 -
452 -
46
46
47(1) is, in a way, a long-winded way of saying that the state of the world hasn’t changed our direction all that much. In order for Urbit to be approachable to use, it has to be very nicely made and that takes time and iteration. As the system stabilizes, Urbit can evolve in a more traditional way: we, along with others in the ecosystem, release stuff, observe how people use it, and try to make it better. We’re at the point where we’re nearly ready to get into that feedback loop, and we very much need to get there. We’re close.
47(1) is, in a way, a long-winded way of saying that the state of the world hasn’t changed our direction all that much. In order for Urbit to be approachable to use, it has to be very nicely made and that takes time and iteration. As the system stabilizes, Urbit can evolve in a more traditional way: we, along with others in the ecosystem, release stuff, observe how people use it, and try to make it better. We’re at the point where we’re nearly ready to get into that feedback loop, and we very much need to get there. We’re close.
48
48
49−Urbit is a distinctly different *kind* of software than anything we have now. Your Urbit is something you actually own and can do whatever you want with: not unlike your furniture or your kitchen tools. An Urbit is a tool for individual, human-scale computing and our whole approach to designing and making things is completely different. Most computing is about industrial-scale computing: where the software system stores everyone’s data and is managed by the people who build it.
49+Urbit is a distinctly different _kind_ of software than anything we have now. Your Urbit is something you actually own and can do whatever you want with: not unlike your furniture or your kitchen tools. An Urbit is a tool for individual, human-scale computing and our whole approach to designing and making things is completely different. Most computing is about industrial-scale computing: where the software system stores everyone’s data and is managed by the people who build it.
50
50
51Urbit is the opposite of industrial-scale. Urbit is much more like something that’s carefully crafted and delivered to you directly. This craftsman-like approach to building software really isn’t a part of most modern software engineering.
51Urbit is the opposite of industrial-scale. Urbit is much more like something that’s carefully crafted and delivered to you directly. This craftsman-like approach to building software really isn’t a part of most modern software engineering.
52
52
53When I think about this from the standpoint of the person using what we make, it’s especially important. Urbit should feel like something that’s purposefully made by hand — not something you picked off the shelf at Wal-Mart. Some of this ethos was present in the early PC movement, but it’s mostly lost today. The care and attention that goes into building the system is also exactly what we make money on. People pay us to own a piece of it, to use it. We’re incentivized to make nice things, in the Urbit model, and we take that responsibility seriously.
53When I think about this from the standpoint of the person using what we make, it’s especially important. Urbit should feel like something that’s purposefully made by hand — not something you picked off the shelf at Wal-Mart. Some of this ethos was present in the early PC movement, but it’s mostly lost today. The care and attention that goes into building the system is also exactly what we make money on. People pay us to own a piece of it, to use it. We’re incentivized to make nice things, in the Urbit model, and we take that responsibility seriously.
54
54
55−
563 -
553 -
57
56
58Networks are a really important social form that’s only just beginning to come into existence. A network is neither a state nor a company, but something in-between. Bitcoin is a network, Ethereum is network (but it’s still far too centralized). Urbit is a young network.
57Networks are a really important social form that’s only just beginning to come into existence. A network is neither a state nor a company, but something in-between. Bitcoin is a network, Ethereum is network (but it’s still far too centralized). Urbit is a young network.
@@ -63,15 +62,13 @@ Urbit is controlled by the collective of people who use it — in varying degree
63
62
64On a successful Urbit network, Facebook, Airtable, and Signal are just successful applications. You could probably build companies around them that ship software to Urbit — but they’re more like 5 - 10 people instead of thousands.
63On a successful Urbit network, Facebook, Airtable, and Signal are just successful applications. You could probably build companies around them that ship software to Urbit — but they’re more like 5 - 10 people instead of thousands.
65
64
66−Urbit doesn’t aim to eat away at the government per se. Instead, it’s an important communication tool for institutions of any scale to actually take control of their means of collaboration. The efficiency of inter-government communication and government to populace communication can clearly be improved by *a whole lot*.
65+Urbit doesn’t aim to eat away at the government per se. Instead, it’s an important communication tool for institutions of any scale to actually take control of their means of collaboration. The efficiency of inter-government communication and government to populace communication can clearly be improved by _a whole lot_.
67−
68
66
694 -
674 -
70
68
71The most important thing is that people can generate a vision of the future. This can only emerge from a small collective of motivated people. Our public life is overwhelmed by people shooting from the hip, aiming for likes.
69The most important thing is that people can generate a vision of the future. This can only emerge from a small collective of motivated people. Our public life is overwhelmed by people shooting from the hip, aiming for likes.
72
70
73−There are difficult, infrastructural problems *all over the place* that desperately need the considerate attention of small groups of people. Urbit, as communication tooling, is aimed at improving the quality of the fabric that binds these groups together. Or, to put it another way, before you can solve any specific problem you have to improve the problem solving process overall. Everything is gated on solving the process.
71+There are difficult, infrastructural problems _all over the place_ that desperately need the considerate attention of small groups of people. Urbit, as communication tooling, is aimed at improving the quality of the fabric that binds these groups together. Or, to put it another way, before you can solve any specific problem you have to improve the problem solving process overall. Everything is gated on solving the process.
74−
75
72
765 -
735 -
77
74
@@ -83,6 +80,5 @@ The thing that comes to mind lately is Hejduk. He had passed away by the time I
83
80
84Hejduk was able to see that architecture isn’t about building buildings per se, but something else. That was always quite obvious to me.
81Hejduk was able to see that architecture isn’t about building buildings per se, but something else. That was always quite obvious to me.
85
82
86−
87Talk soon!
83Talk soon!
88G
84G
content/blog/an-urbit-overview.md+79−75
@@ -1,8 +1,12 @@
1+++
1+++
2title = "An Urbit Overview"
2title = "An Urbit Overview"
3−date = 2016-05-11
3+date = "2016-05-10"
4description = "A high-level overview of Urbit."
4description = "A high-level overview of Urbit."
5+aliases = [
5−aliases = ["/posts/essays/an-urbit-overview", "/posts/an-urbit-overview"]
6+ "/posts/essays/an-urbit-overview",
7+ "/posts/an-urbit-overview"
8+]
9+
6[extra]
10[extra]
7author = "Galen Wolfe-Pauly"
11author = "Galen Wolfe-Pauly"
8ship = "~ravmel-ropdyl"
12ship = "~ravmel-ropdyl"
@@ -17,79 +21,79 @@ Urbit is a virtual city of general-purpose personal servers.
17
21
18## Your old personal server
22## Your old personal server
19
23
20−What's a personal server? In a sense, you already have one. Your
24+What's a personal server? In a sense, you already have one. Your
21personal server is the combination of all the cloud services you use
25personal server is the combination of all the cloud services you use
22now.
26now.
23
27
24−This "server" is a mess. It's broken into 17 different fragments
28+This "server" is a mess. It's broken into 17 different fragments
25−which are scattered all over the planet. You have no control at all
29+which are scattered all over the planet. You have no control at all
26−over any of the pieces. The more we depend on Web services, the more
30+over any of the pieces. The more we depend on Web services, the more
27we realize how unsustainable this situation is.
31we realize how unsustainable this situation is.
28
32
29−Can you remember all the services you have accounts for? How about
33+Can you remember all the services you have accounts for? How about
30−the username and password for each? Some of them will let you pull
34+the username and password for each? Some of them will let you pull
31−your data out somehow, some won't. Sometimes you can move your data
35+your data out somehow, some won't. Sometimes you can move your data
32−between them, sometimes you can't. But they're all good at
36+between them, sometimes you can't. But they're all good at
33showing you ads.
37showing you ads.
34
38
35## Your new personal server
39## Your new personal server
36
40
37−Your urbit is your own general-purpose server. It holds your
41+Your urbit is your own general-purpose server. It holds your
38data; runs your apps; wrangles your connected devices; and
42data; runs your apps; wrangles your connected devices; and
39−defines your secure identity. If you still need your old
43+defines your secure identity. If you still need your old
40services, it drives them with APIs.
44services, it drives them with APIs.
41
45
42Your urbit presents your whole digital life as a single web
46Your urbit presents your whole digital life as a single web
43−service. And since it's yours, open source and patent-free, it
47+service. And since it's yours, open source and patent-free, it
44−never shows you ads. Or loses your data. Or updates without
48+never shows you ads. Or loses your data. Or updates without
45your consent.
49your consent.
46
50
47Technically, Urbit is a new kind of OS that has a precise formal
51Technically, Urbit is a new kind of OS that has a precise formal
48−definition. (Urbit is actually a [single mathematical function](https://media.urbit.org/whitepaper.pdf).) One advantage of a math-based OS is that Urbit is perfectly
52+definition. (Urbit is actually a [single mathematical function](https://media.urbit.org/whitepaper.pdf).) One advantage of a math-based OS is that Urbit is perfectly
49−portable. It can't tell whether it's in a cloud data center or on
53+portable. It can't tell whether it's in a cloud data center or on
50your home PC.
54your home PC.
51
55
52−Concerned about mass surveillance? Download your urbit and restart it
56+Concerned about mass surveillance? Download your urbit and restart it
53−on your laptop, or move to a new host in Iceland. Urbit's formal
57+on your laptop, or move to a new host in Iceland. Urbit's formal
54simplicity makes managing it as easy as managing an iPhone: all you
58simplicity makes managing it as easy as managing an iPhone: all you
55have to decide is what apps to add.
59have to decide is what apps to add.
56
60
57−Each urbit is a node on a global, encrypted P2P network. Your Urbit
61+Each urbit is a node on a global, encrypted P2P network. Your Urbit
58name, a generated pseudonym like `~talsur-todres`, is also your
62name, a generated pseudonym like `~talsur-todres`, is also your
59−network address. Like Bitcoin, Urbit address space is a cryptographic
63+network address. Like Bitcoin, Urbit address space is a cryptographic
60asset with a limited supply.
64asset with a limited supply.
61
65
62−By keeping addresses scarce, we make spam and abuse expensive. Urbit
66+By keeping addresses scarce, we make spam and abuse expensive. Urbit
63is a "friendly network," like the Internet in 1986, where a stranger
67is a "friendly network," like the Internet in 1986, where a stranger
64−is nice until proven nasty. As it matures, Urbit will grow into a
68+is nice until proven nasty. As it matures, Urbit will grow into a
65decentralized, self-governing virtual city both safe and free.
69decentralized, self-governing virtual city both safe and free.
66
70
67## The Urbit future
71## The Urbit future
68
72
69In an Urbit world, your data is no longer trapped in a jumble of
73In an Urbit world, your data is no longer trapped in a jumble of
70−proprietary servers. Your urbit is a permanent, versioned, typed
74+proprietary servers. Your urbit is a permanent, versioned, typed
71−archive the size of your digital life. Even before you move your data
75+archive the size of your digital life. Even before you move your data
72from a Web service to a local Urbit app, your urbit can drive your
76from a Web service to a local Urbit app, your urbit can drive your
73account with an API or scraper.
77account with an API or scraper.
74
78
75−And within Urbit, data is never locked inside apps. Imagine if you
79+And within Urbit, data is never locked inside apps. Imagine if you
76could painlessly switch between Facebook and Google+, Asana and
80could painlessly switch between Facebook and Google+, Asana and
77−Trello, Tumblr and WordPress. Not only does your urbit upgrade itself
81+Trello, Tumblr and WordPress. Not only does your urbit upgrade itself
78and its apps automatically, you can "sidegrade" a running app to
82and its apps automatically, you can "sidegrade" a running app to
79another vendor without losing data.
83another vendor without losing data.
80
84
81−Your urbit is also your digital identity. Along with your data
85+Your urbit is also your digital identity. Along with your data
82lifestream of media, messages and documents, it has the keys and
86lifestream of media, messages and documents, it has the keys and
83−tokens to manage all your legacy Web services. It holds the keys
87+tokens to manage all your legacy Web services. It holds the keys
84for your cryptocurrency wallets, so it can buy and sell for you.
88for your cryptocurrency wallets, so it can buy and sell for you.
85(With one personal server to secure, not 17 different accounts,
89(With one personal server to secure, not 17 different accounts,
86you actually have the bandwidth to take security seriously.)
90you actually have the bandwidth to take security seriously.)
87
91
88−You still use network services. But instead of interacting with
92+You still use network services. But instead of interacting with
89the service provider's HTML UI, which phones home using
93the service provider's HTML UI, which phones home using
90proprietary HTTP APIs, you interact with a third-party app on
94proprietary HTTP APIs, you interact with a third-party app on
91your urbit, which talks to multiple service providers using
95your urbit, which talks to multiple service providers using
92−public, typed Urbit protocols. For example, your urbit runs a
96+public, typed Urbit protocols. For example, your urbit runs a
93single shopping app, which downloads catalogs and uploads orders.
97single shopping app, which downloads catalogs and uploads orders.
94This app is one store which sells everything in the world, with a
98This app is one store which sells everything in the world, with a
95salesman who's 100% on your side and always has the best price.
99salesman who's 100% on your side and always has the best price.
@@ -97,107 +101,107 @@ Every computing experience is different when the UI is working
97exclusively for the user.
101exclusively for the user.
98
102
99Finally, your urbit is the hub for your network of connected
103Finally, your urbit is the hub for your network of connected
100−devices. Your smart thermostat, your wristband, your phone and
104+devices. Your smart thermostat, your wristband, your phone and
101tablet, all run satellite urbits which talk securely to your main
105tablet, all run satellite urbits which talk securely to your main
102urbit in the cloud.
106urbit in the cloud.
103
107
104## A chance for digital freedom
108## A chance for digital freedom
105
109
106The promise of the personal server isn't just convenience.
110The promise of the personal server isn't just convenience.
107−General-purpose computing is magic. This magic must be in the
111+General-purpose computing is magic. This magic must be in the
108−hands of all, not just those who can master Unix. The computer
112+hands of all, not just those who can master Unix. The computer
109−is a bicycle for the mind. It's an open vehicle for exploration
113+is a bicycle for the mind. It's an open vehicle for exploration
110−and discovery. It's not a way to optimize ad delivery.
114+and discovery. It's not a way to optimize ad delivery.
111
115
112Urbit, as virtual city, is a platform that brings together all our
116Urbit, as virtual city, is a platform that brings together all our
113datastreams -- from emails to heartbeats -- in a way that we ourselves
117datastreams -- from emails to heartbeats -- in a way that we ourselves
114−control. Can we work together to match faces in photos, without
118+control. Can we work together to match faces in photos, without
115−submitting to some panopticon in Mountain View? While the first step
119+submitting to some panopticon in Mountain View? While the first step
116in freedom is the right to be left alone, the second is the power to
120in freedom is the right to be left alone, the second is the power to
117form new intentional communities, to create and evolve a voluntary
121form new intentional communities, to create and evolve a voluntary
118−definition of public space. We have no idea at all what people will
122+definition of public space. We have no idea at all what people will
119do with this power.
123do with this power.
120
124
121−General-purpose computing is digital freedom. And today, a cloud data
125+General-purpose computing is digital freedom. And today, a cloud data
122−center is the technically optimal locus of computation. The cloud is
126+center is the technically optimal locus of computation. The cloud is
123−always on, always available, never loses data. Hosts are sometimes
127+always on, always available, never loses data. Hosts are sometimes
124attacked; but they never intentionally tamper with their virtual
128attacked; but they never intentionally tamper with their virtual
125−computers. The cloud can never be secure against a global adversary;
129+computers. The cloud can never be secure against a global adversary;
126−but most people don't have a global adversary. A single portable
130+but most people don't have a global adversary. A single portable
127platform provides "herd immunity" for the few who do need direct
131platform provides "herd immunity" for the few who do need direct
128physical control over their main computers.
132physical control over their main computers.
129
133
130Though even laptops are atrophying into mere browsers, mass-market,
134Though even laptops are atrophying into mere browsers, mass-market,
131general-purpose computing on the client side remains an endangered
135general-purpose computing on the client side remains an endangered
132−species that must be protected. But on the server side, this species
136+species that must be protected. But on the server side, this species
133−has never even _existed_. There has never been anything like a
137+has never even _existed_. There has never been anything like a
134−mass-market personal server. Why not?
138+mass-market personal server. Why not?
135
139
136## Freedom is an engineering problem
140## Freedom is an engineering problem
137
141
138−Urbit is not a difficult idea. Urbit is like a flying car: the idea
142+Urbit is not a difficult idea. Urbit is like a flying car: the idea
139−is not the hard part. Almost everyone we talk to about Urbit turns
143+is not the hard part. Almost everyone we talk to about Urbit turns
140−out to have had pretty much the same idea themselves. The problem is
144+out to have had pretty much the same idea themselves. The problem is
141building it.
145building it.
142
146
143−A server is a computer. It's running some operating system. This OS
147+A server is a computer. It's running some operating system. This OS
144−is a flavor of Unix. There are no alternatives. It's connected to
148+is a flavor of Unix. There are no alternatives. It's connected to
145−some network. This network is the Internet. It has no competitors.
149+some network. This network is the Internet. It has no competitors.
146You can have a personal server, if it's a Unix server on the Internet.
150You can have a personal server, if it's a Unix server on the Internet.
147
151
148−Almost no one thinks being a Unix system administrator is fun. Not
152+Almost no one thinks being a Unix system administrator is fun. Not
149even Unix system administrators think running an Internet server is
153even Unix system administrators think running an Internet server is
150−fun. So the personal Unix/Internet server is like the personal
154+fun. So the personal Unix/Internet server is like the personal
151−bulldozer. This is not a consumer product. Any number of engineers
155+bulldozer. This is not a consumer product. Any number of engineers
152can't turn a bulldozer into a bicycle.
156can't turn a bulldozer into a bicycle.
153
157
154−How did we build the personal bulldozer? We didn't. We started
158+How did we build the personal bulldozer? We didn't. We started
155−from scratch. (The people who built the first PCs didn't start
159+from scratch. (The people who built the first PCs didn't start
156−with a mainframe OS, either.) We created a new platform: Urbit.
160+with a mainframe OS, either.) We created a new platform: Urbit.
157
161
158−Urbit doesn't compete with Unix and the Internet. It's a new,
162+Urbit doesn't compete with Unix and the Internet. It's a new,
159−opaque layer on top of them. Your browser runs on a native OS,
163+opaque layer on top of them. Your browser runs on a native OS,
160but it doesn't give Web apps any way to talk to the native OS.
164but it doesn't give Web apps any way to talk to the native OS.
161Urbit is like a browser for the server side: code within Urbit is
165Urbit is like a browser for the server side: code within Urbit is
162formally isolated from the platform it runs on top of.
166formally isolated from the platform it runs on top of.
163
167
164−Your urbit is a Unix process, in a data center or your PC. It sends
168+Your urbit is a Unix process, in a data center or your PC. It sends
165−UDP packets over the Internet. It can both load and serve web pages
169+UDP packets over the Internet. It can both load and serve web pages
166−over HTTP. Except for character sets and crypto, nothing in Urbit
170+over HTTP. Except for character sets and crypto, nothing in Urbit
167reuses or depends on any 20th-century code.
171reuses or depends on any 20th-century code.
168
172
169Urbit is a complete, clean-slate system software stack: a
173Urbit is a complete, clean-slate system software stack: a
170non-lambda interpreter (Nock), a functional language (Hoon), and
174non-lambda interpreter (Nock), a functional language (Hoon), and
171an event-driven OS (Arvo), with its own encrypted protocol
175an event-driven OS (Arvo), with its own encrypted protocol
172(Ames), typed revision control (Clay), reactive web server (Eyre)
176(Ames), typed revision control (Clay), reactive web server (Eyre)
173−and functional build system (Ford). The full system, including
177+and functional build system (Ford). The full system, including
174basic apps, is only 30,000 lines of Hoon.
178basic apps, is only 30,000 lines of Hoon.
175
179
176The first end-to-end prototype of Urbit took one engineer eleven
180The first end-to-end prototype of Urbit took one engineer eleven
177−years. The current beta took three more years, with about three
181+years. The current beta took three more years, with about three
178engineers on average.
182engineers on average.
179
183
180−How does it take 14 years to write 30,000 lines of code? The code
184+How does it take 14 years to write 30,000 lines of code? The code
181−wasn't the hard part. The hard part was rewriting it until it was
185+wasn't the hard part. The hard part was rewriting it until it was
182−right. We think we've solved all the real CS problems, and we're
186+right. We think we've solved all the real CS problems, and we're
183−certainly done changing major interfaces. But it will take more than
187+certainly done changing major interfaces. But it will take more than
184our small team to deliver a polished Urbit user experience that can
188our small team to deliver a polished Urbit user experience that can
185actually challenge modern web apps.
189actually challenge modern web apps.
186
190
187## Where we are, what we're doing
191## Where we are, what we're doing
188
192
189−Urbit is in feature freeze. It's a minimum viable product in
193+Urbit is in feature freeze. It's a minimum viable product in
190−early beta. It still needs quite a bit of fit-and-finish work.
194+early beta. It still needs quite a bit of fit-and-finish work.
191We certainly don't recommend it for end users or consider it in
195We certainly don't recommend it for end users or consider it in
192−any way secure. But it's fun to play with, if you're a hacker.
196+any way secure. But it's fun to play with, if you're a hacker.
193
197
194This summer, we're making the switch to an open and transparent
198This summer, we're making the switch to an open and transparent
195−development and specification process. A system as unusual as
199+development and specification process. A system as unusual as
196−Urbit can't be invented in public. But it has to be finished and
200+Urbit can't be invented in public. But it has to be finished and
197maintained in public.
201maintained in public.
198
202
199Additionally, we're creating an open political and economic process,
203Additionally, we're creating an open political and economic process,
200−with a small, fixed-price public presale of Urbit address space. Join
204+with a small, fixed-price public presale of Urbit address space. Join
201us and help make this future actually happen.
205us and help make this future actually happen.
202
206
203To keep reading, learn more about [Urbit's address
207To keep reading, learn more about [Urbit's address
content/blog/announcing-urbit-grants.md+6−2
@@ -1,8 +1,12 @@
1+++
1+++
2title = "Announcing: Urbit Grants Program"
2title = "Announcing: Urbit Grants Program"
3−date = 2019-08-06
3+date = "2019-08-05"
4description = "Announcing Urbit Grants, a way to earn stars through contributing."
4description = "Announcing Urbit Grants, a way to earn stars through contributing."
5+aliases = [
5−aliases = ["/posts/essays/announcing-urbit-grants", "/posts/announcing-urbit-grants"]
6+ "/posts/essays/announcing-urbit-grants",
7+ "/posts/announcing-urbit-grants"
8+]
9+
6[extra]
10[extra]
7author = "Robert Mariani"
11author = "Robert Mariani"
8ship = "~lodleb-ritrul"
12ship = "~lodleb-ritrul"
content/blog/azimuth-as-multipass.md+6−3
@@ -1,8 +1,12 @@
1+++
1+++
2title = "Azimuth as Multipass"
2title = "Azimuth as Multipass"
3−date = 2019-05-16
3+date = "2019-05-15"
4description = "What if everyone had a single 'civilizational key'?"
4description = "What if everyone had a single 'civilizational key'?"
5+aliases = [
5−aliases = ["/posts/essays/azimuth-as-multipass/", "/posts/azimuth-as-multipass"]
6+ "/posts/essays/azimuth-as-multipass/",
7+ "/posts/azimuth-as-multipass"
8+]
9+
6[extra]
10[extra]
7author = "Galen Wolfe-Pauly"
11author = "Galen Wolfe-Pauly"
8ship = "~ravmel-ropdyl"
12ship = "~ravmel-ropdyl"
@@ -28,4 +32,3 @@ If you’re someone who’s worried about getting kidnapped, just use a child id
28Perhaps part of how we ended up in the world we’re in is that we didn’t have something like Azimuth to begin with. Today, it’s backwards: everyone has an address on the network, but no one has an identity.
32Perhaps part of how we ended up in the world we’re in is that we didn’t have something like Azimuth to begin with. Today, it’s backwards: everyone has an address on the network, but no one has an identity.
29
33
30We think everyone needs an identity that can hold money and have packets routed to it. Start there, and it’s quite fun to imagine where you end up. A civilized digital society might even be possible after all.
34We think everyone needs an identity that can hold money and have packets routed to it. Start there, and it’s quite fun to imagine where you end up. A civilized digital society might even be possible after all.
31−
content/blog/azimuth-is-on-chain.md+7−3
@@ -1,8 +1,12 @@
1+++
1+++
2title = "Azimuth is On-Chain"
2title = "Azimuth is On-Chain"
3−date = 2019-01-14
3+date = "2019-01-13"
4description = "The Urbit address space, now called Azimuth, is on the blockchain. And too many other things to fit into a single post."
4description = "The Urbit address space, now called Azimuth, is on the blockchain. And too many other things to fit into a single post."
5+aliases = [
5−aliases = ["/posts/essays/azimuth-is-on-chain", "/posts/azimuth-is-on-chain"]
6+ "/posts/essays/azimuth-is-on-chain",
7+ "/posts/azimuth-is-on-chain"
8+]
9+
6[extra]
10[extra]
7author = "Galen Wolfe-Pauly"
11author = "Galen Wolfe-Pauly"
8ship = "~ravmel-ropdyl"
12ship = "~ravmel-ropdyl"
@@ -64,7 +68,7 @@ So, how do you get an Azimuth point? We've left that question unanswered intenti
64
68
65Arvo boots from Ethereum, is no longer embarrassingly slow, and has a brand new build system. [Our documentation](https://urbit.org/docs/learn/arvo/hoon) has also improved quite a lot. Hoon, Arvo's programming language, has had a lot of work done to its type system and compiler. We built new tooling for generating static sites (you're probably reading this on one right now) that are much, much faster and easier to use.
69Arvo boots from Ethereum, is no longer embarrassingly slow, and has a brand new build system. [Our documentation](https://urbit.org/docs/learn/arvo/hoon) has also improved quite a lot. Hoon, Arvo's programming language, has had a lot of work done to its type system and compiler. We built new tooling for generating static sites (you're probably reading this on one right now) that are much, much faster and easier to use.
66
70
67−It's tough to talk about the progress we've made on Arvo without writing a long technical post. We'll save that for later. In a way, what's remarkable about Arvo is that it has become *less* remarkable. It's more stable, faster, and the code quality has improved.
71+It's tough to talk about the progress we've made on Arvo without writing a long technical post. We'll save that for later. In a way, what's remarkable about Arvo is that it has become _less_ remarkable. It's more stable, faster, and the code quality has improved.
68
72
69There's plenty of work to do, though. Should you be building on top of Arvo? Probably not yet. The kernel and kernel modules are really where the work still lies. We build things on top of Arvo, and in doing so it's pretty clear that the system can be better. Clay (the filesystem) and Gall (the application model) are due for a rewrite. A complete rewrite of the web server, Eyre is almost finished.
73There's plenty of work to do, though. Should you be building on top of Arvo? Probably not yet. The kernel and kernel modules are really where the work still lies. We build things on top of Arvo, and in doing so it's pretty clear that the system can be better. Clay (the filesystem) and Gall (the application model) are due for a rewrite. A complete rewrite of the web server, Eyre is almost finished.
70
74
content/blog/azimuth-security-bounty-program.md+6−2
@@ -1,8 +1,12 @@
1+++
1+++
2title = "Azimuth Security Bounty Program"
2title = "Azimuth Security Bounty Program"
3−date = 2019-07-22
3+date = "2019-07-21"
4description = "Inviting you (and your friends) to help us make Azimuth as secure as possible."
4description = "Inviting you (and your friends) to help us make Azimuth as secure as possible."
5+aliases = [
5−aliases = ["/posts/essays/azimuth-security-bounty-program", "/posts/azimuth-security-bounty-program"]
6+ "/posts/essays/azimuth-security-bounty-program",
7+ "/posts/azimuth-security-bounty-program"
8+]
9+
6[extra]
10[extra]
7author = "Anthony Arroyo"
11author = "Anthony Arroyo"
8ship = "~poldec-tonteg"
12ship = "~poldec-tonteg"
content/blog/beliefs-and-principles.md+28−24
@@ -1,9 +1,13 @@
1+++
1+++
2title = "Beliefs and Principles Guiding the Urbit Project"
2title = "Beliefs and Principles Guiding the Urbit Project"
3−date = 2016-05-11
3+date = "2016-05-10"
4description = "We believe."
4description = "We believe."
5+aliases = [
5−aliases = ["/posts/essays/beliefs-and-principles",
6+ "/posts/essays/beliefs-and-principles",
6−"/posts/beliefs-and-principles", "/posts/principles"]
7+ "/posts/beliefs-and-principles",
8+ "/posts/principles"
9+]
10+
7[extra]
11[extra]
8author = "Curtis Yarvin + Galen Wolfe-Pauly"
12author = "Curtis Yarvin + Galen Wolfe-Pauly"
9ship = "~sorreg-namtyv + ~ravmel-ropdyl"
13ship = "~sorreg-namtyv + ~ravmel-ropdyl"
@@ -25,19 +29,19 @@ software, through the IETF principles of sincerity and rough consensus.
25The ability of the engineering community to govern itself through
29The ability of the engineering community to govern itself through
26republican forms is not an abstract theory; it's a proven fact.
30republican forms is not an abstract theory; it's a proven fact.
27
31
28−We believe in both free speech and individual accountability. We
32+We believe in both free speech and individual accountability. We
29believe that a healthy network is one with diverse and well-defined
33believe that a healthy network is one with diverse and well-defined
30communities, and clear, user-controlled, boundaries between public and
34communities, and clear, user-controlled, boundaries between public and
31private space.
35private space.
32
36
33We believe that no software system can replace human trust and
37We believe that no software system can replace human trust and
34−communication. Dialogue, judgment and governance are essential to
38+communication. Dialogue, judgment and governance are essential to
35−communities of all scales. Code and law can reduce conflict in the
39+communities of all scales. Code and law can reduce conflict in the
36common case; they can never handle all exceptions.
40common case; they can never handle all exceptions.
37
41
38## Principles
42## Principles
39
43
40−Here are some principles of Urbit. Where principles conflict,
44+Here are some principles of Urbit. Where principles conflict,
41the first stated takes precedence.
45the first stated takes precedence.
42
46
43### Digital independence
47### Digital independence
@@ -50,56 +54,56 @@ independence a useful and widely available product.
50### Code is law
54### Code is law
51
55
52Wherever possible, the rules of Urbit must be executable as code.
56Wherever possible, the rules of Urbit must be executable as code.
53−Wherever possible, code must be self-enforcing. If not, it must
57+Wherever possible, code must be self-enforcing. If not, it must
54−be perfectly defined. If not, it must not be stated.
58+be perfectly defined. If not, it must not be stated.
55
59
56### Sovereignty is conserved
60### Sovereignty is conserved
57
61
58Even where code is law, exceptional situations demanding
62Even where code is law, exceptional situations demanding
59−effective collective action will always arise. There must
63+effective collective action will always arise. There must
60always be a collective authority to solve these problems.
64always be a collective authority to solve these problems.
61
65
62Two known problems in Urbit that require central authority are
66Two known problems in Urbit that require central authority are
63−approval of software updates and activation of the network. But
67+approval of software updates and activation of the network. But
64there will certainly be others.
68there will certainly be others.
65
69
66### Purpose of collective authority
70### Purpose of collective authority
67
71
68−Urbit, as opposed to the Tlon corporation, is a republic. Its
72+Urbit, as opposed to the Tlon corporation, is a republic. Its
69government has one task: promoting, preserving and protecting Urbit.
73government has one task: promoting, preserving and protecting Urbit.
70−It may take any legal action which advances this goal. Any other
74+It may take any legal action which advances this goal. Any other
71−actions are *ultra vires*, out of scope. Urbit is not a
75+actions are _ultra vires_, out of scope. Urbit is not a
72general-purpose charity.
76general-purpose charity.
73
77
74### Decentralized control
78### Decentralized control
75
79
76−Urbit should never fall under any kind of central control. All
80+Urbit should never fall under any kind of central control. All
77transitions in galaxy ownership should divide positions, not
81transitions in galaxy ownership should divide positions, not
78unite them.
82unite them.
79
83
80−Galaxy and star ownership should also be separated. It is
84+Galaxy and star ownership should also be separated. It is
81harmful for a single entity to hold both galaxies and stars.
85harmful for a single entity to hold both galaxies and stars.
82
86
83### Property is contingent
87### Property is contingent
84
88
85Property rights are contingent and accidental, not moral or
89Property rights are contingent and accidental, not moral or
86−meritorious. A property register does not record why an owner
90+meritorious. A property register does not record why an owner
87−deserves some property. Ownership is neither a reward nor a
91+deserves some property. Ownership is neither a reward nor a
88right; it is a fact.
92right; it is a fact.
89
93
90### Governance is by stake
94### Governance is by stake
91
95
92−Ultimately, Urbit must be governed by those who own it. In each
96+Ultimately, Urbit must be governed by those who own it. In each
93tier, equal stakes must hold equal authority.
97tier, equal stakes must hold equal authority.
94
98
95### Content-neutral
99### Content-neutral
96
100
97Urbit does not admit a tradeoff between anarchy and tyranny,
101Urbit does not admit a tradeoff between anarchy and tyranny,
98−order and liberty. Urbit has zero tolerance for abuse, nor does
102+order and liberty. Urbit has zero tolerance for abuse, nor does
99it facilitate censorship.
103it facilitate censorship.
100
104
101Urbit will do everything possible to help you block content you
105Urbit will do everything possible to help you block content you
102−don't want to see. It does nothing to help you block content you
106+don't want to see. It does nothing to help you block content you
103don't want others to see.
107don't want others to see.
104
108
105### Trolling considered harmful
109### Trolling considered harmful
@@ -111,12 +115,12 @@ properly for automatic blocking.
111### Sockpuppets considered harmful
115### Sockpuppets considered harmful
112
116
113The only legitimate reason for one individual to use multiple
117The only legitimate reason for one individual to use multiple
114−identities is to maintain multiple active pseudonyms. But
118+identities is to maintain multiple active pseudonyms. But
115multiple identities must never interact in the same context.
119multiple identities must never interact in the same context.
116
120
117### Not a darknet
121### Not a darknet
118
122
119−Urbit is not a darknet. It does not break real-world laws. It
123+Urbit is not a darknet. It does not break real-world laws. It
120is not designed to facilitate the breaking of real-world laws.
124is not designed to facilitate the breaking of real-world laws.
121For any problem that lawbreakers have, there must always be a
125For any problem that lawbreakers have, there must always be a
122better solution that is not Urbit.
126better solution that is not Urbit.
@@ -125,6 +129,6 @@ better solution that is not Urbit.
125
129
126As long as they are not facilitating violations of any of these
130As long as they are not facilitating violations of any of these
127principles, or laws in their own jurisdictions, stars and
131principles, or laws in their own jurisdictions, stars and
128−galaxies are responsible for routing their children. They are
132+galaxies are responsible for routing their children. They are
129also collectively responsible for escape-routing the children of
133also collectively responsible for escape-routing the children of
130stars and galaxies which fail in their responsibility.
134stars and galaxies which fail in their responsibility.
content/blog/bootstrapping-urbit-from-ethereum.md+28−21
@@ -1,13 +1,20 @@
1+++
1+++
2title = "Bootstrapping Urbit from Ethereum"
2title = "Bootstrapping Urbit from Ethereum"
3−date = 2017-09-20
3+date = "2017-09-19"
4description = "We've decided to launch Urbit's constitution as a system of Ethereum contracts."
4description = "We've decided to launch Urbit's constitution as a system of Ethereum contracts."
5+aliases = [
5−aliases = ["/posts/essays/bootstrapping-urbit-from-ethereum", "/posts/bootstrapping-urbit-from-ethereum", "/blog/2017.9.20-bootstrapping-urbit-from-ethereum/", "/blog/2017.9-eth/"]
6+ "/posts/essays/bootstrapping-urbit-from-ethereum",
7+ "/posts/bootstrapping-urbit-from-ethereum",
8+ "/blog/2017.9.20-bootstrapping-urbit-from-ethereum/",
9+ "/blog/2017.9-eth/"
10+]
11+
6[extra]
12[extra]
7author = "Curtis Yarvin + Galen Wolfe-Pauly"
13author = "Curtis Yarvin + Galen Wolfe-Pauly"
8ship = "~sorreg-namtyv + ~ravmel-ropdyl"
14ship = "~sorreg-namtyv + ~ravmel-ropdyl"
9+++
15+++
16+
10−*TL;DR:*
17+_TL;DR:_
11
18
12We've decided to launch Urbit's constitution as a system of Ethereum contracts.
19We've decided to launch Urbit's constitution as a system of Ethereum contracts.
13
20
@@ -19,49 +26,49 @@ auction stars, and stars to distribute planets.
19## A bit of background
26## A bit of background
20
27
21One thing we realized after the last sale was, 'oh hey, the network has been up
28One thing we realized after the last sale was, 'oh hey, the network has been up
22−for about a year.' Not bad! It wasn't that long ago that we were rebooting the
29+for about a year.' Not bad! It wasn't that long ago that we were rebooting the
23−universe every few weeks. We still have plenty of work to do — but Urbit has
30+universe every few weeks. We still have plenty of work to do — but Urbit has
24matured to the point where public ownership of the network really should be
31matured to the point where public ownership of the network really should be
25cryptographically real.
32cryptographically real.
26
33
27But even when the servers stay up, Urbit is still a testnet and remains
34But even when the servers stay up, Urbit is still a testnet and remains
28−centralized in practice. We (Tlon) retain the ability to reset the network keys
35+centralized in practice. We (Tlon) retain the ability to reset the network keys
29−at any time. This just isn't very 2017.
36+at any time. This just isn't very 2017.
30
37
31In theory, Urbit doesn't need a blockchain, because real estate moves slowly.
38In theory, Urbit doesn't need a blockchain, because real estate moves slowly.
32In digital real estate, as opposed to digital currency, a low-friction,
39In digital real estate, as opposed to digital currency, a low-friction,
33zero-trust solution to the double-spend problem isn't an economic necessity.
40zero-trust solution to the double-spend problem isn't an economic necessity.
34
41
35−In practice, though, we have a hard chicken-egg problem. In the current design,
42+In practice, though, we have a hard chicken-egg problem. In the current design,
36the key you use to secure your urbit is the same key that you use to sign your
43the key you use to secure your urbit is the same key that you use to sign your
37−network packets. Abstractly, this is the right design -- you want one
44+network packets. Abstractly, this is the right design -- you want one
38definition of who owns an identity.
45definition of who owns an identity.
39
46
40But concretely, since Urbit keys are valuable, you don't want to put them in an
47But concretely, since Urbit keys are valuable, you don't want to put them in an
41−operating system that isn't generally recognized as systematically secure. It's
48+operating system that isn't generally recognized as systematically secure. It's
42−hard to achieve this status while you're a testnet. So the virtuous cycle never
49+hard to achieve this status while you're a testnet. So the virtuous cycle never
43gets started.
50gets started.
44
51
45Moving the Urbit land registry to Ethereum is an easy and obvious solution to
52Moving the Urbit land registry to Ethereum is an easy and obvious solution to
46−this problem. If your urbit is owned by an offline Ethereum key, there's now a
53+this problem. If your urbit is owned by an offline Ethereum key, there's now a
47−mature ecosystem for protecting this property. And its security doesn't depend
54+mature ecosystem for protecting this property. And its security doesn't depend
48on the security of Urbit. So, we realized, maybe Urbit actually does need a
55on the security of Urbit. So, we realized, maybe Urbit actually does need a
49−blockchain for its land registry. While the system matures, we can bootstrap
56+blockchain for its land registry. While the system matures, we can bootstrap
50off of Ethereum, without changing the design of the Urbit cryptosystem.
57off of Ethereum, without changing the design of the Urbit cryptosystem.
51
58
52And best of all, you can get your Urbit star or planet entirely through the
59And best of all, you can get your Urbit star or planet entirely through the
53blockchain, without interacting with any centralized database or payment
60blockchain, without interacting with any centralized database or payment
54−mechanism. So we're really living in 2017.
61+mechanism. So we're really living in 2017.
55
62
56Sounds good, right?
63Sounds good, right?
57
64
58−It does sound good. Although, as usual, we care about making things that *work*
65+It does sound good. Although, as usual, we care about making things that _work_
59−above all else. So, rather than a 'announcing the Urbit token sale' post, this
66+above all else. So, rather than a 'announcing the Urbit token sale' post, this
60−is going to get fairly technical. We want to start the discussion about how
67+is going to get fairly technical. We want to start the discussion about how
61−this change is going to work, and how it's going to get implemented. We'll save
68+this change is going to work, and how it's going to get implemented. We'll save
62the hype for later.
69the hype for later.
63
70
64−First, we'll walk through the costs and benefits of using Ethereum. Then,
71+First, we'll walk through the costs and benefits of using Ethereum. Then,
65we'll refresh our memories on how the Urbit address space works, and finally
72we'll refresh our memories on how the Urbit address space works, and finally
66we'll walk through some of the details of how we plan on implementing this.
73we'll walk through some of the details of how we plan on implementing this.
67We've thought quite thoroughly about these things, but public criticism is
74We've thought quite thoroughly about these things, but public criticism is
@@ -214,7 +221,7 @@ Following Ethereum best practice, we'll use separate storage and logic
214contracts. The logic contract is stateless, and can upgrade itself without
221contracts. The logic contract is stateless, and can upgrade itself without
215replacing the storage contracts.
222replacing the storage contracts.
216
223
217−We'll walk through how we have designed these contracts in detail here. You can
224+We'll walk through how we have designed these contracts in detail here. You can
218also view our in-progress source at the
225also view our in-progress source at the
219[`urbit/azimuth` GitHub repo](https://github.com/urbit/azimuth).
226[`urbit/azimuth` GitHub repo](https://github.com/urbit/azimuth).
220
227
content/blog/common-objections-to-urbit.md+207−202
@@ -1,18 +1,23 @@
1+++
1+++
2title = "Common Objections to Urbit"
2title = "Common Objections to Urbit"
3−date = 2016-06-28
3+date = "2016-06-27"
4description = "Some common objections to Urbit, discussed."
4description = "Some common objections to Urbit, discussed."
5+aliases = [
5−aliases = ["/posts/essays/common-objections-to-urbit", "/posts/common-objections-to-urbit", "/posts/objections/"]
6+ "/posts/essays/common-objections-to-urbit",
7+ "/posts/common-objections-to-urbit",
8+ "/posts/objections/"
9+]
10+
6[extra]
11[extra]
7author = "Curtis Yarvin"
12author = "Curtis Yarvin"
8ship = "~sorreg-namtyv"
13ship = "~sorreg-namtyv"
9−image ="https://storage.googleapis.com/media.urbit.org/site/posts/essays/common-objections-to-urbit-1.jpg"
14+image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/common-objections-to-urbit-1.jpg"
10+++
15+++
11
16
12![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/common-objections-to-urbit-1.jpg)
17![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/common-objections-to-urbit-1.jpg)
13
18
14−We love crowdsourced criticism. We've heard a lot of great
19+We love crowdsourced criticism. We've heard a lot of great
15−objections to Urbit. Surely there's more out there! We'll
20+objections to Urbit. Surely there's more out there! We'll
16revise this document to include anything new and interesting.
21revise this document to include anything new and interesting.
17
22
18Here's our list right now:
23Here's our list right now:
@@ -21,12 +26,12 @@ Here's our list right now:
21- [Nock jets are a total hoax.](#jets)
26- [Nock jets are a total hoax.](#jets)
22- [Urbit needs an infinitely extending packet/event log.](#log)
27- [Urbit needs an infinitely extending packet/event log.](#log)
23- [Urbit is a total scamcoin. It's 100% premined.](#scam)
28- [Urbit is a total scamcoin. It's 100% premined.](#scam)
24−- [Urbit isn't even really decentralized! It has a government!](#gov)
29+- [Urbit isn't even really decentralized! It has a government!](#gov)
25- [Sandstorm/IPFS/Ethereum is way ahead of Urbit.](#sand)
30- [Sandstorm/IPFS/Ethereum is way ahead of Urbit.](#sand)
26- [Urbit doesn't have enough planets for every human being.](#planet)
31- [Urbit doesn't have enough planets for every human being.](#planet)
27- [Cloud computing is inherently non-private.](#pwned)
32- [Cloud computing is inherently non-private.](#pwned)
28- [Urbit will never be able to call any existing code.](#code)
33- [Urbit will never be able to call any existing code.](#code)
29−- [Hoon is too weird. No one will be able to program in it.](#program)
34+- [Hoon is too weird. No one will be able to program in it.](#program)
30- [Urbit programmers are stuck with Hoon.](#stuck)
35- [Urbit programmers are stuck with Hoon.](#stuck)
31- [Ordinary users will never be able to manage an Urbit server.](#user)
36- [Ordinary users will never be able to manage an Urbit server.](#user)
32- [Urbit has no killer app.](#killer)
37- [Urbit has no killer app.](#killer)
@@ -37,87 +42,87 @@ _"We choose to go to the moon, not because it is easy, but because it is hard."_
37
42
38## <a name="prime"></a>Urbit is not ready for prime time.
43## <a name="prime"></a>Urbit is not ready for prime time.
39
44
40−*TLDR*: we agree.
45+_TLDR_: we agree.
41
46
42−Urbit right now is a fun toy. It is fun to learn Hoon. It is
47+Urbit right now is a fun toy. It is fun to learn Hoon. It is
43even fun and quite practical to make actual contributions.
48even fun and quite practical to make actual contributions.
44(Hoon's IEEE floating-point was written by someone we've never
49(Hoon's IEEE floating-point was written by someone we've never
45−met: `~nym`, formerly `~nodpet-rinned`.) In fact, we have never
50+met: `~nym`, formerly `~nodpet-rinned`.) In fact, we have never
46seen anyone _not_ have fun with Urbit.
51seen anyone _not_ have fun with Urbit.
47
52
48−But there is all kinds of stuff wrong with the codebase. Urbit's
53+But there is all kinds of stuff wrong with the codebase. Urbit's
49documentation is much improved, but remains incredibly weak --
54documentation is much improved, but remains incredibly weak --
50−Arvo is almost totally undocumented. Scaling is poor at best.
55+Arvo is almost totally undocumented. Scaling is poor at best.
51−Urbit's reliability is dubious. Its security is nil.
56+Urbit's reliability is dubious. Its security is nil.
52
57
53−Urbit is feature-frozen. The only thing we're working on now,
58+Urbit is feature-frozen. The only thing we're working on now,
54and for the rest of 2016, is doc, debugging and and self-hosting.
59and for the rest of 2016, is doc, debugging and and self-hosting.
55In that order of importance -- teaching Urbit is more important
60In that order of importance -- teaching Urbit is more important
56than fixing it, which is more important than making it useful.
61than fixing it, which is more important than making it useful.
57But we're quite confident that these are all solvable problems.
62But we're quite confident that these are all solvable problems.
58
63
59The most important milestone about Urbit today is that it's ready
64The most important milestone about Urbit today is that it's ready
60−for technical decisions to be made collectively. A system like
65+for technical decisions to be made collectively. A system like
61−Urbit can only be invented by a mad auteur. It can't be
66+Urbit can only be invented by a mad auteur. It can't be
62−maintained or stabilized by a mad auteur. Our primary goal today
67+maintained or stabilized by a mad auteur. Our primary goal today
63is expanding the number of people who understand Urbit, and we
68is expanding the number of people who understand Urbit, and we
64expect these pioneers to participate in technical governance.
69expect these pioneers to participate in technical governance.
65
70
66## <a name="jets"></a>Nock jets are a total hoax.
71## <a name="jets"></a>Nock jets are a total hoax.
67
72
68−*TLDR*: all of computing is a hoax. You can't compare a hoax
73+_TLDR_: all of computing is a hoax. You can't compare a hoax
69−to nothing. You can only compare it to all the other hoaxes.
74+to nothing. You can only compare it to all the other hoaxes.
70
75
71−A "jet" is a sort of software device driver in Urbit. Urbit is
76+A "jet" is a sort of software device driver in Urbit. Urbit is
72precisely defined in terms of an interpreter that fits on a
77precisely defined in terms of an interpreter that fits on a
73−T-shirt, Nock. But a naive implementation of Nock is nowhere
78+T-shirt, Nock. But a naive implementation of Nock is nowhere
74near practical, because Nock has only one integer operation:
79near practical, because Nock has only one integer operation:
75−increment. For example, to decrement a number in Nock, you
80+increment. For example, to decrement a number in Nock, you
76increment a counter up to the number under it.
81increment a counter up to the number under it.
77
82
78The only way an efficient Nock interpreter can work is to
83The only way an efficient Nock interpreter can work is to
79recognize algorithms like decrement, and implement them
84recognize algorithms like decrement, and implement them
80−non-naively. By far the easiest way to do this is not to analyze
85+non-naively. By far the easiest way to do this is not to analyze
81arbitrary code as it's being executed, but to register and match
86arbitrary code as it's being executed, but to register and match
82−well-known implementations in the standard library. No one
87+well-known implementations in the standard library. No one
83should be writing their own decrement.
88should be writing their own decrement.
84
89
85But the semantics of the interpreter, _so long as the jet and the
90But the semantics of the interpreter, _so long as the jet and the
86jet harness are defined correctly_, are exactly those of Nock.
91jet harness are defined correctly_, are exactly those of Nock.
87−We are not extending or changing Nock in any way. We are just
92+We are not extending or changing Nock in any way. We are just
88taking a shortcut in certain cases we understand perfectly.
93taking a shortcut in certain cases we understand perfectly.
89
94
90It's not at all unprecedented to have implementations much more
95It's not at all unprecedented to have implementations much more
91−complex than the corresponding specification. The x86
96+complex than the corresponding specification. The x86
92instruction set is relatively simple; the complexity of its
97instruction set is relatively simple; the complexity of its
93−decoding and execution path in a modern CPU is enormous. This
98+decoding and execution path in a modern CPU is enormous. This
94path may well have "peephole optimizations" that replace matched
99path may well have "peephole optimizations" that replace matched
95−algorithms, and if it doesn't the modern compiler does. People,
100+algorithms, and if it doesn't the modern compiler does. People,
96_bad_ people, use "jets" to cheat on benchmarks all the time.
101_bad_ people, use "jets" to cheat on benchmarks all the time.
97
102
98−Nock is designed as a standard. It's built like a standard.
103+Nock is designed as a standard. It's built like a standard.
99Typically what causes real problems in standards is ambiguity.
104Typically what causes real problems in standards is ambiguity.
100Two implementations are incompatible, but each swears it has the
105Two implementations are incompatible, but each swears it has the
101−right interpretation of the natural-language spec. This simply
106+right interpretation of the natural-language spec. This simply
102−cannot happen in the Nock world. If two implementations
107+cannot happen in the Nock world. If two implementations
103−disagree, at least one of them is incorrect. This puts us firmly
108+disagree, at least one of them is incorrect. This puts us firmly
104in "with enough eyeballs, all bugs are shallow" territory.
109in "with enough eyeballs, all bugs are shallow" territory.
105
110
106The fact remains, however, that a Nock interpreter without jets
111The fact remains, however, that a Nock interpreter without jets
107−is completely useless. And there is not even an informal
112+is completely useless. And there is not even an informal
108document that tells you what jets you need for a reasonably
113document that tells you what jets you need for a reasonably
109−efficient Urbit. (There should be such a document.)
114+efficient Urbit. (There should be such a document.)
110
115
111The correct way to think about jets is not to compare them to a
116The correct way to think about jets is not to compare them to a
112−perfect interpreter created by unicorns. Jets are a combined
117+perfect interpreter created by unicorns. Jets are a combined
113replacement for two other techniques in language implementation:
118replacement for two other techniques in language implementation:
114intrinsics and a foreign-function interface.
119intrinsics and a foreign-function interface.
115
120
116Compared to both intrinsics and an FFI, your jets have one key
121Compared to both intrinsics and an FFI, your jets have one key
117−disadvantage: they need to be specified in pure code. You may
122+disadvantage: they need to be specified in pure code. You may
118not have this executable specification, which means you need to
123not have this executable specification, which means you need to
119−write it. Is this really so bad for your development process?
124+write it. Is this really so bad for your development process?
120−An executable specification? Which can be trivially tested
125+An executable specification? Which can be trivially tested
121against the efficient implementation?
126against the efficient implementation?
122
127
123Compared to intrinsics, jets give you true separation between
128Compared to intrinsics, jets give you true separation between
@@ -125,7 +130,7 @@ mechanism and policy; only the interpreter, not the programmer
125and not the compiler, needs to know what's accelerated.
130and not the compiler, needs to know what's accelerated.
126
131
127Compared to an FFI, jets preclude I/O, so can be trivially
132Compared to an FFI, jets preclude I/O, so can be trivially
128−sandboxed. Except that the programmer needs to mark routines
133+sandboxed. Except that the programmer needs to mark routines
129which may benefit from optimization with a hint, here too we
134which may benefit from optimization with a hint, here too we
130separate mechanism (efficient implementation) from policy.
135separate mechanism (efficient implementation) from policy.
131
136
@@ -133,41 +138,41 @@ Yes, formal verification of jet equivalence is desirable.
133However, in the real world, many specifications, including quite
138However, in the real world, many specifications, including quite
134complex ones, are tested into equivalence by brute force.
139complex ones, are tested into equivalence by brute force.
135
140
136−Urbit has some jet abuses. The equivalence between our markdown
141+Urbit has some jet abuses. The equivalence between our markdown
137−parser in Hoon and the CommonMark C library is super dubious. It
142+parser in Hoon and the CommonMark C library is super dubious. It
138should be revisited.
143should be revisited.
139
144
140But the miscomputation resulting from a minor jet discrepancy is
145But the miscomputation resulting from a minor jet discrepancy is
141−not a security hole or even fatal. It effectively means the
146+not a security hole or even fatal. It effectively means the
142event history, computed correctly, does not match the current
147event history, computed correctly, does not match the current
143−state. The way to resolve this conflict is for the current state
148+state. The way to resolve this conflict is for the current state
144to win, and the event history to be discarded -- not abnormal
149to win, and the event history to be discarded -- not abnormal
145−anyway. See the next question.
150+anyway. See the next question.
146
151
147## <a name="log"></a>Urbit needs an infinitely extending packet/event.
152## <a name="log"></a>Urbit needs an infinitely extending packet/event.
148
153
149−*TLDR*: no, it doesn't. Urbit can prune the log.
154+_TLDR_: no, it doesn't. Urbit can prune the log.
150
155
151We can prune the event log because the Urbit transition function
156We can prune the event log because the Urbit transition function
152doesn't have any access to the event history -- just the current
157doesn't have any access to the event history -- just the current
153state and the current event.
158state and the current event.
154
159
155−Urbit defines the semantics of a complete event log. It doesn't
160+Urbit defines the semantics of a complete event log. It doesn't
156and can't require an implementation to maintain the whole log.
161and can't require an implementation to maintain the whole log.
157It can maintain a checkpoint and the log since that checkpoint.
162It can maintain a checkpoint and the log since that checkpoint.
158
163
159However, any practical urbit maintains a periodically updated
164However, any practical urbit maintains a periodically updated
160−checkpoint. Our present implementation doesn't provide a way to
165+checkpoint. Our present implementation doesn't provide a way to
161−prune the event log. But that's just a missing feature. We have
166+prune the event log. But that's just a missing feature. We have
162one or two of those!
167one or two of those!
163
168
164−## <a name="scam"></a>Urbit is a total scamcoin. It's 100% premined.
169+## <a name="scam"></a>Urbit is a total scamcoin. It's 100% premined.
165
170
166−*TLDR*: yeah. But at least it's not the DAO.
171+_TLDR_: yeah. But at least it's not the DAO.
167
172
168−Like a cryptocurrency, Urbit is a digital title. But Urbit is
173+Like a cryptocurrency, Urbit is a digital title. But Urbit is
169−digital land, not digital money. If you assess it as a currency,
174+digital land, not digital money. If you assess it as a currency,
170−it's a lousy currency. If you assess a cat as a dog, it's a
175+it's a lousy currency. If you assess a cat as a dog, it's a
171lousy dog.
176lousy dog.
172
177
173In real-world economics, the crucial distinction between land and
178In real-world economics, the crucial distinction between land and
@@ -175,25 +180,25 @@ money is that land (a) has intrinsic utility and (b) is
175non-fungible.
180non-fungible.
176
181
177Because of (b) alone, frictionless transactions in land are
182Because of (b) alone, frictionless transactions in land are
178−impossible. A blockchain is only needed to ensure zero-cost
183+impossible. A blockchain is only needed to ensure zero-cost
179−high-frequency transactions. So digital land doesn't need a
184+high-frequency transactions. So digital land doesn't need a
180−blockchain. Which means it doesn't need mining.
185+blockchain. Which means it doesn't need mining.
181
186
182Of course, just because a digital title system doesn't need
187Of course, just because a digital title system doesn't need
183mining, doesn't mean it can't distribute an initial allocation by
188mining, doesn't mean it can't distribute an initial allocation by
184proof-of-work -- or by any other arbitrary method which is
189proof-of-work -- or by any other arbitrary method which is
185−careful not to benefit the system's own developers. Could we
190+careful not to benefit the system's own developers. Could we
186−give away the Urbit address space randomly? Sure. But why?
191+give away the Urbit address space randomly? Sure. But why?
187
192
188Probably the purest design is the "proof-of-burn" initial
193Probably the purest design is the "proof-of-burn" initial
189−allocation used by some coins. By any standard, proof-of-burn is
194+allocation used by some coins. By any standard, proof-of-burn is
190technically beautiful and results in an extraordinary level of
195technically beautiful and results in an extraordinary level of
191−ethical independence. We can't help but admire it.
196+ethical independence. We can't help but admire it.
192
197
193−But any altcoin or metacoin is just way less work than Urbit. An
198+But any altcoin or metacoin is just way less work than Urbit. An
194altcoin can afford to burn even its creation energy, capturing no
199altcoin can afford to burn even its creation energy, capturing no
195−value at all from its seigniorage. Your altcoin doesn't have a
200+value at all from its seigniorage. Your altcoin doesn't have a
196−clean-slate system software stack to drive. If your rocket has
201+clean-slate system software stack to drive. If your rocket has
197to go to the moon, it's going to leave a little bit of smoke in
202to go to the moon, it's going to leave a little bit of smoke in
198the air.
203the air.
199
204
@@ -202,78 +207,78 @@ of the currency are rewarded disproportionately for their effort.
202The scamcoin is a get-rich-quick scheme, vaguely pyramid-shaped.
207The scamcoin is a get-rich-quick scheme, vaguely pyramid-shaped.
203Nothing about Urbit matches this pattern at all.
208Nothing about Urbit matches this pattern at all.
204
209
205−Curtis invented Urbit. So by the [homestead
210+Curtis invented Urbit. So by the [homestead
206principle](https://en.wikipedia.org/wiki/Homestead_principle), he
211principle](https://en.wikipedia.org/wiki/Homestead_principle), he
207−started out owning all of it. But by now, Urbit's 8-bit galaxies
212+started out owning all of it. But by now, Urbit's 8-bit galaxies
208have already been distributed among [57 separate individuals](https://github.com/urbit/arvo/blob/master/sys/vane/ames.hoon#L118-L373).
213have already been distributed among [57 separate individuals](https://github.com/urbit/arvo/blob/master/sys/vane/ames.hoon#L118-L373).
209Curtis owns 20, or about 8%.
214Curtis owns 20, or about 8%.
210
215
211Tlon, the corporation which still runs Urbit development, has 95.
216Tlon, the corporation which still runs Urbit development, has 95.
212−(Without Tlon, there is basically no Arvo.) 50 are reserved for
217+(Without Tlon, there is basically no Arvo.) 50 are reserved for
213−a hypothetical Urbit Foundation. Tlon employees have another 16.
218+a hypothetical Urbit Foundation. Tlon employees have another 16.
214
219
215The rest of the galaxies belong to donors, investors,
220The rest of the galaxies belong to donors, investors,
216contributors, contest winners, and just random people who were in
221contributors, contest winners, and just random people who were in
217−the right place at the right time. One is a Silicon Valley
222+the right place at the right time. One is a Silicon Valley
218−tycoon. Another is an Orthodox nun in a monastery in Greece. A
223+tycoon. Another is an Orthodox nun in a monastery in Greece. A
219−couple are ex-Tlon employees who might totally hate us. There is
224+couple are ex-Tlon employees who might totally hate us. There is
220nothing they all have in common, which is sort of the point.
225nothing they all have in common, which is sort of the point.
221
226
222This property distribution looks a lot like land ownership in the
227This property distribution looks a lot like land ownership in the
223−real world -- complex and asymmetrical. That's no accident. If
228+real world -- complex and asymmetrical. That's no accident. If
224you have a problem living in New York because New York's real
229you have a problem living in New York because New York's real
225estate is not distributed equally among its residents, you may
230estate is not distributed equally among its residents, you may
226−have a similar problem with Urbit. The reality is that Urbit,
231+have a similar problem with Urbit. The reality is that Urbit,
227like New York, wasn't born yesterday and comes with a complex
232like New York, wasn't born yesterday and comes with a complex
228ownership history which we couldn't possibly change, even if we
233ownership history which we couldn't possibly change, even if we
229wanted to.
234wanted to.
230
235
231−Decentralization is hard. The only real goal of a property
236+Decentralization is hard. The only real goal of a property
232system in address space is to create and maintain
237system in address space is to create and maintain
233−decentralization. The whole network has to exhibit centrifugal
238+decentralization. The whole network has to exhibit centrifugal
234−force, not centripetal force. Proof-of-work systems certainly
239+force, not centripetal force. Proof-of-work systems certainly
235seem to have unexpected centripetal qualities, producing
240seem to have unexpected centripetal qualities, producing
236−unanticipated concentrations of centralized hashpower. See the
241+unanticipated concentrations of centralized hashpower. See the
237next objection.
242next objection.
238
243
239−## <a name="gov"></a>Urbit isn't even really decentralized! It has a government!
244+## <a name="gov"></a>Urbit isn't even really decentralized! It has a government!
240
245
241−*TLDR*: it's technically impossible for Urbit to be
246+_TLDR_: it's technically impossible for Urbit to be
242−decentralized at this stage of its life. Urbit is designed to
247+decentralized at this stage of its life. Urbit is designed to
243achieve decentralization, not be born with it.
248achieve decentralization, not be born with it.
244
249
245−A young network can't afford to be decentralized. It has to act
250+A young network can't afford to be decentralized. It has to act
246−as a unit. Because it has no network effect, it needs every
251+as a unit. Because it has no network effect, it needs every
247scrap of efficiency it can get.
252scrap of efficiency it can get.
248
253
249A decentralized general-purpose computing network like Urbit can
254A decentralized general-purpose computing network like Urbit can
250−_only_ be bootstrapped by a central government. For example, by
255+_only_ be bootstrapped by a central government. For example, by
251default your urbit upgrades its OS automatically (like an
256default your urbit upgrades its OS automatically (like an
252−"evergreen" browser) with signed network updates. Whoever signs
257+"evergreen" browser) with signed network updates. Whoever signs
253these updates is a government by definition.
258these updates is a government by definition.
254
259
255When it's impossible to eliminate centralized power, it becomes
260When it's impossible to eliminate centralized power, it becomes
256−necessary to tame, stabilize, and limit it. This should not be
261+necessary to tame, stabilize, and limit it. This should not be
257surprising to anyone living under a constitutional government.
262surprising to anyone living under a constitutional government.
258
263
259As we found out with the DAO, if a network isn't ready to be
264As we found out with the DAO, if a network isn't ready to be
260−decentralized, its developers shouldn't even try. If Ethereum is
265+decentralized, its developers shouldn't even try. If Ethereum is
261hard-forked to roll back the DAO (which looks like the most
266hard-forked to roll back the DAO (which looks like the most
262probable result), it acknowledges that it both has a central
267probable result), it acknowledges that it both has a central
263−government, and needs a central government. Decentralization is
268+government, and needs a central government. Decentralization is
264−good. Pretend decentralization -- "decentralization theater" --
269+good. Pretend decentralization -- "decentralization theater" --
265is harmful, and not a effective path to actual decentralization.
270is harmful, and not a effective path to actual decentralization.
266
271
267A key test of a free software project's health is whether it can
272A key test of a free software project's health is whether it can
268−fork. So long as the unity of the public-key hierarchy and the
273+fork. So long as the unity of the public-key hierarchy and the
269network protocol is maintained, the Arvo kernel and Urbit system
274network protocol is maintained, the Arvo kernel and Urbit system
270can fork in all kinds of ways without disrupting the network.
275can fork in all kinds of ways without disrupting the network.
271Any stress will fragment the "government" that develops the
276Any stress will fragment the "government" that develops the
272kernel, and as it fragments it grows more limited and stable.
277kernel, and as it fragments it grows more limited and stable.
273
278
274Urbit is designed to govern itself collectively by address space
279Urbit is designed to govern itself collectively by address space
275−ownership -- effectively, "proof of stake." Any arbitrary power,
280+ownership -- effectively, "proof of stake." Any arbitrary power,
276−will tend to fracture along these property lines. For instance,
281+will tend to fracture along these property lines. For instance,
277our hot updates are sent through the galaxy hierarchy; in a
282our hot updates are sent through the galaxy hierarchy; in a
278development fork, active galaxies would pick upstream sources.
283development fork, active galaxies would pick upstream sources.
279Two implementations of a standard are better than one.
284Two implementations of a standard are better than one.
@@ -283,8 +288,8 @@ we've created a global property map which is much more likely to
283splinter further, than reunite.
288splinter further, than reunite.
284
289
285In the long run, every galaxy should have a separate owner, who
290In the long run, every galaxy should have a separate owner, who
286−is a human being rather than a corporation. Combining galaxy
291+is a human being rather than a corporation. Combining galaxy
287−holdings will damage the reputation of both galaxies. The only
292+holdings will damage the reputation of both galaxies. The only
288reason to merge ownership is to move toward incipient monopoly.
293reason to merge ownership is to move toward incipient monopoly.
289Whether a galaxy admits this openly or denies it dishonestly, its
294Whether a galaxy admits this openly or denies it dishonestly, its
290reputation will suffer.
295reputation will suffer.
@@ -292,61 +297,61 @@ reputation will suffer.
292The technical goal of Urbit is to create a network which, _if it
297The technical goal of Urbit is to create a network which, _if it
293actually takes over the world_, inevitably becomes decentralized.
298actually takes over the world_, inevitably becomes decentralized.
294Even if Urbit takes over the world, no individual or coherent
299Even if Urbit takes over the world, no individual or coherent
295−organization takes over the world. There is nothing even close
300+organization takes over the world. There is nothing even close
296to a single point of failure in a mature, successful Urbit.
301to a single point of failure in a mature, successful Urbit.
297
302
298−This is the goal of all the new "web3" decentralized systems. If
303+This is the goal of all the new "web3" decentralized systems. If
299IPFS, Sandstorm or Ethereum takes over the world, nobody takes
304IPFS, Sandstorm or Ethereum takes over the world, nobody takes
300−over the world. (The same is almost true of the Internet --
305+over the world. (The same is almost true of the Internet --
301though it wouldn't be that surprising if a time traveler from
306though it wouldn't be that surprising if a time traveler from
3022116 revealed that ICANN had become a planetary government.)
3072116 revealed that ICANN had become a planetary government.)
303
308
304Urbit, by starting out as a centralized network, just reduces the
309Urbit, by starting out as a centralized network, just reduces the
305−technical problem to match the actual goal. Only long-term
310+technical problem to match the actual goal. Only long-term
306decentralization matters.
311decentralization matters.
307
312
308It's very important that Urbit in 2116 be fully decentralized.
313It's very important that Urbit in 2116 be fully decentralized.
309For Urbit in 2016, pretending to be decentralized would be a joke
314For Urbit in 2016, pretending to be decentralized would be a joke
310−at best, and a hoax at worst. And of course, no one can DAO us
315+at best, and a hoax at worst. And of course, no one can DAO us
311-- since the property system is still just a central registry.
316-- since the property system is still just a central registry.
312−Among other things, we check it into GitHub. GitHub is not a
317+Among other things, we check it into GitHub. GitHub is not a
313blockchain -- but still, good luck with that.
318blockchain -- but still, good luck with that.
314
319
315## <a name="sand"></a>Sandstorm/IPFS/Ethereum is way ahead of Urbit.
320## <a name="sand"></a>Sandstorm/IPFS/Ethereum is way ahead of Urbit.
316
321
317In general, web3 (next distributed web) solutions don't compete
322In general, web3 (next distributed web) solutions don't compete
318−with each other. They support each other. Concretely, they are
323+with each other. They support each other. Concretely, they are
319all part of each others' network effect.
324all part of each others' network effect.
320
325
321IPFS, Sandstorm, Ethereum, and Urbit can all take over the world
326IPFS, Sandstorm, Ethereum, and Urbit can all take over the world
322−at the same time. None of them competes with the others. They
327+at the same time. None of them competes with the others. They
323enable each other.
328enable each other.
324
329
325For instance, IPFS and Urbit are both global immutable
330For instance, IPFS and Urbit are both global immutable
326−namespaces. IPFS is a chord-routed, content-addressed namespace.
331+namespaces. IPFS is a chord-routed, content-addressed namespace.
327−Urbit is a direct-routed, identity-addressed namespace. Urbit is
332+Urbit is a direct-routed, identity-addressed namespace. Urbit is
328−a typed revision-control system; IPFS is a blob store. IPFS
333+a typed revision-control system; IPFS is a blob store. IPFS
329isn't a computer; the work hasn't been done, but Urbit can easily
334isn't a computer; the work hasn't been done, but Urbit can easily
330mount the IPFS namespace and compute functionally against it.
335mount the IPFS namespace and compute functionally against it.
331
336
332So the better IPFS does, the less Urbit needs to struggle against
337So the better IPFS does, the less Urbit needs to struggle against
333−its lack of network effect. The better Urbit does, the easier it
338+its lack of network effect. The better Urbit does, the easier it
334is for IPFS to point to a functional language that can actually
339is for IPFS to point to a functional language that can actually
335−use its referential transparency directly. So their relationship
340+use its referential transparency directly. So their relationship
336is symbiotic, not competitive at all.
341is symbiotic, not competitive at all.
337
342
338The closest thing to a general-purpose competitor that Urbit has
343The closest thing to a general-purpose competitor that Urbit has
339−is Sandstorm. Sandstorm, which by the way rocks, is also a
344+is Sandstorm. Sandstorm, which by the way rocks, is also a
340personal server built around a network protocol.
345personal server built around a network protocol.
341
346
342But Sandstorm and Urbit compete in the way that, on the PC, the
347But Sandstorm and Urbit compete in the way that, on the PC, the
343−OS and the browser compete. In theory, the OS could solve the
348+OS and the browser compete. In theory, the OS could solve the
344problems that the browser solves; or the browser could be the OS.
349problems that the browser solves; or the browser could be the OS.
345In practice, Windows is a great OS to run a browser on.
350In practice, Windows is a great OS to run a browser on.
346
351
347Similarly, a world in which Sandstorm takes off is an awesome
352Similarly, a world in which Sandstorm takes off is an awesome
348world for Urbit, because everyone who has a Sandstorm instance
353world for Urbit, because everyone who has a Sandstorm instance
349−has a great platform for running Urbit on. Urbit on Sandstorm
354+has a great platform for running Urbit on. Urbit on Sandstorm
350will be a sort of "double-hulled" personal server, safer and more
355will be a sort of "double-hulled" personal server, safer and more
351friendly than either system alone.
356friendly than either system alone.
352
357
@@ -354,24 +359,24 @@ Sandstorm and Urbit have very different approaches to network
354identification; Sandstorm uses capabilities, Urbit identity.
359identification; Sandstorm uses capabilities, Urbit identity.
355Broadly speaking, we believe, capabilities are optimal for
360Broadly speaking, we believe, capabilities are optimal for
356expressive power; but identity is optimal for the UI of the
361expressive power; but identity is optimal for the UI of the
357−common case. We'd need to see the Powerbox, Sandstorm's UI, more
362+common case. We'd need to see the Powerbox, Sandstorm's UI, more
358fully fleshed out to understand its UI approach better.
363fully fleshed out to understand its UI approach better.
359
364
360## <a name="planet"></a>Urbit doesn't have enough planets for every human
365## <a name="planet"></a>Urbit doesn't have enough planets for every human
361
366
362−A 32-bit planet is a tool, not a toy. Like a car, it's a device
367+A 32-bit planet is a tool, not a toy. Like a car, it's a device
363−for a responsible and independent adult. There aren't 4 billion
368+for a responsible and independent adult. There aren't 4 billion
364cars in the world, nor 4 billion independent adults.
369cars in the world, nor 4 billion independent adults.
365
370
366If you aren't an independent adult, and you don't need or even
371If you aren't an independent adult, and you don't need or even
367shouldn't have unconditional digital freedom (no one's 8-year-old
372shouldn't have unconditional digital freedom (no one's 8-year-old
368daughter needs unconditional digital freedom), a moon from
373daughter needs unconditional digital freedom), a moon from
369−someone else's planet is fine. (Even most of today's independent
374+someone else's planet is fine. (Even most of today's independent
370adults don't complain enough about being Facebook's moons.)
375adults don't complain enough about being Facebook's moons.)
371
376
372And limiting the supply of anything doesn't create a shortage.
377And limiting the supply of anything doesn't create a shortage.
373−It sets a price. Ideally, in the long run, we think a planet
378+It sets a price. Ideally, in the long run, we think a planet
374−should cost about $10. This could be off by an order of
379+should cost about $10. This could be off by an order of
375magnitude either way, and it wouldn't be the end of the world.
380magnitude either way, and it wouldn't be the end of the world.
376
381
377If a planet costs $10, that means you paid $10 to get a planet.
382If a planet costs $10, that means you paid $10 to get a planet.
@@ -385,49 +390,49 @@ Urbit will always choose free speech.
385
390
386## <a name="pwned"></a>Cloud computing is inherently non-private.
391## <a name="pwned"></a>Cloud computing is inherently non-private.
387
392
388−*TLDR*: a general-purpose cloud computer is much, much more
393+_TLDR_: a general-purpose cloud computer is much, much more
389−private than a special-purpose cloud computer. In general, a
394+private than a special-purpose cloud computer. In general, a
390cloud VM is secure against corporations but not governments.
395cloud VM is secure against corporations but not governments.
391With a global adversary, compute in your closet -- or even on
396With a global adversary, compute in your closet -- or even on
392your body.
397your body.
393
398
394One reason we want the decentralized Internet is that we're tired
399One reason we want the decentralized Internet is that we're tired
395−of giant corporations spying on us. Think about it this way:
400+of giant corporations spying on us. Think about it this way:
396−Amazon is Netflix's main competitor. And yet, Netflix runs its
401+Amazon is Netflix's main competitor. And yet, Netflix runs its
397−whole operation on AWS. Why is Netflix sure that Amazon won't
402+whole operation on AWS. Why is Netflix sure that Amazon won't
398spy on it?
403spy on it?
399
404
400A general-purpose virtual machine is special from a privacy
405A general-purpose virtual machine is special from a privacy
401standpoint, just because it's commercially realistic to design
406standpoint, just because it's commercially realistic to design
402terms of service that prevent the host from peeking and poking at
407terms of service that prevent the host from peeking and poking at
403−the customer's machine. Crossing this moat is technically
408+the customer's machine. Crossing this moat is technically
404nontrivial and can't possibly happen by any reasonable accident.
409nontrivial and can't possibly happen by any reasonable accident.
405No hosting contract could contemplate it.
410No hosting contract could contemplate it.
406
411
407Whereas when your cloud computer is a special-purpose machine --
412Whereas when your cloud computer is a special-purpose machine --
408just a database row on some corporation's mainframe -- there is
413just a database row on some corporation's mainframe -- there is
409no way these services can promise not to handle your data.
414no way these services can promise not to handle your data.
410−Handling your data is _what they do_. On a special-purpose
415+Handling your data is _what they do_. On a special-purpose
411server, the concept of privacy is not even defined.
416server, the concept of privacy is not even defined.
412
417
413Where even a general-purpose server falls down is where the user
418Where even a general-purpose server falls down is where the user
414has a sovereign adversary, which can secretly violate explicit or
419has a sovereign adversary, which can secretly violate explicit or
415−implicit hosting contracts. Users with a sovereign adversary
420+implicit hosting contracts. Users with a sovereign adversary
416must rely only on their own physical security.
421must rely only on their own physical security.
417
422
418−However, most users don't have a sovereign adversary. And those
423+However, most users don't have a sovereign adversary. And those
419who do maximize their "herd immunity" if they can use the same
424who do maximize their "herd immunity" if they can use the same
420−protocols as those who don't. Otherwise, the adversary could
425+protocols as those who don't. Otherwise, the adversary could
421simply focus on everyone who uses the secure protocols.
426simply focus on everyone who uses the secure protocols.
422
427
423−Also, the portability of a cloud server image is critical. Of
428+Also, the portability of a cloud server image is critical. Of
424course, since Urbit is formally specified, it's trivially
429course, since Urbit is formally specified, it's trivially
425−portable. In fact, one strategy against sovereign adversaries
430+portable. In fact, one strategy against sovereign adversaries
426may be continuous rotation between hosts, like an MX missile.
431may be continuous rotation between hosts, like an MX missile.
427
432
428## <a name="code"></a>Urbit will never be able to call any existing code.
433## <a name="code"></a>Urbit will never be able to call any existing code.
429
434
430−*TLDR*: neither will Javascript. And dear Unix, the browser
435+_TLDR_: neither will Javascript. And dear Unix, the browser
431does not miss interacting with your `$LD_LIBRARY_PATH` at all.
436does not miss interacting with your `$LD_LIBRARY_PATH` at all.
432
437
433You can't talk to the OS or use system libraries from Javascript.
438You can't talk to the OS or use system libraries from Javascript.
@@ -436,31 +441,31 @@ compatibility bridge, native methods, or other interface between
436Javascript and C.
441Javascript and C.
437
442
438When in doubt, remember that Urbit is "the browser for the server
443When in doubt, remember that Urbit is "the browser for the server
439−side." It plays by the same general rules. Isolation means
444+side." It plays by the same general rules. Isolation means
440isolation.
445isolation.
441
446
442−## <a name="weird"></a>There's no way Urbit will ever be adopted. It's too weird.
447+## <a name="weird"></a>There's no way Urbit will ever be adopted. It's too weird.
443
448
444−*TLDR*: Urbit adoption is designed to be driven by ordinary end
449+_TLDR_: Urbit adoption is designed to be driven by ordinary end
445−users. Urbit isn't ready for ordinary end users yet. We're
450+users. Urbit isn't ready for ordinary end users yet. We're
446working on it -- come help.
451working on it -- come help.
447
452
448−Right now, Urbit is a developer tool. Or rather, a developer toy
453+Right now, Urbit is a developer tool. Or rather, a developer toy
449−-- since the only thing it's useful for is developing Urbit. It
454+-- since the only thing it's useful for is developing Urbit. It
450−also could be a much better toy. We're working on that too.
455+also could be a much better toy. We're working on that too.
451
456
452But it's absolutely wrong to think of Urbit being adopted as a
457But it's absolutely wrong to think of Urbit being adopted as a
453−developer tool in the conventional sense. If you think this is
458+developer tool in the conventional sense. If you think this is
454almost impossible, you're right.
459almost impossible, you're right.
455
460
456If we look at the way most successful platforms are adopted,
461If we look at the way most successful platforms are adopted,
457−they're not adopted for their own virtues. They're adopted
462+they're not adopted for their own virtues. They're adopted
458−because they're part of a larger solution. It's very hard to
463+because they're part of a larger solution. It's very hard to
459−displace a native component of an existing platform. Urbit is
464+displace a native component of an existing platform. Urbit is
460not trying to do this.
465not trying to do this.
461
466
462C is a better language than Pascal, but it didn't beat Pascal
467C is a better language than Pascal, but it didn't beat Pascal
463−because it's a better language. C beat Pascal because C was the
468+because it's a better language. C beat Pascal because C was the
464native language of Unix, and people wanted to program in Unix.
469native language of Unix, and people wanted to program in Unix.
465People don't use Javascript because Javascript is a great
470People don't use Javascript because Javascript is a great
466language, but because it's the native language of the browser.
471language, but because it's the native language of the browser.
@@ -468,9 +473,9 @@ Replacing the native language of a platform may be doable -- but
468it's incredibly hard.
473it's incredibly hard.
469
474
470Hoon is not competing with C, or even Haskell, as a Unix
475Hoon is not competing with C, or even Haskell, as a Unix
471−programming language. The only reason to program in Hoon is that
476+programming language. The only reason to program in Hoon is that
472−it's the native language of Urbit. Urbit is not competing with
477+it's the native language of Urbit. Urbit is not competing with
473−node.js or Rails as a Web backend. The only reason to run Urbit
478+node.js or Rails as a Web backend. The only reason to run Urbit
474is to run a personal server.
479is to run a personal server.
475
480
476Nock is cool, but it only gets adopted if Hoon gets adopted.
481Nock is cool, but it only gets adopted if Hoon gets adopted.
@@ -479,9 +484,9 @@ Urbit only gets adopted if it's useful as a personal server for
479human beings -- most of whom won't be Hoon programmers, or
484human beings -- most of whom won't be Hoon programmers, or
480programmers at all.
485programmers at all.
481
486
482−## <a name="program"></a>Hoon is too weird. No one will be able to program in it.
487+## <a name="program"></a>Hoon is too weird. No one will be able to program in it.
483
488
484−*TLDR*: Hoon is ridiculously simple. Our documentation and
489+_TLDR_: Hoon is ridiculously simple. Our documentation and
485tooling are just immature.
490tooling are just immature.
486
491
487It's pretty fair to assume that (a) functional programming is
492It's pretty fair to assume that (a) functional programming is
@@ -491,94 +496,94 @@ so (c) Hoon must be hard-squared.
491Actually, Hoon is weird even for a functional language because
496Actually, Hoon is weird even for a functional language because
492it's an attempt to remove the hardest things about functional
497it's an attempt to remove the hardest things about functional
493programming: category theory, lazy evaluation, and gratuitous
498programming: category theory, lazy evaluation, and gratuitous
494−abstraction. To know a language is to know what the compiler is
499+abstraction. To know a language is to know what the compiler is
495doing; all the semantics of the Hoon compiler fit in 2000 lines
500doing; all the semantics of the Hoon compiler fit in 2000 lines
496of code.
501of code.
497
502
498It's too easy for us to wind up living in Isaac Asimov's Trantor,
503It's too easy for us to wind up living in Isaac Asimov's Trantor,
499a world in which everything got invented thousands of years ago
504a world in which everything got invented thousands of years ago
500−and the idea of new technology is just weird and scary. History
505+and the idea of new technology is just weird and scary. History
501isn't over yet, and nor is technical history.
506isn't over yet, and nor is technical history.
502
507
503−New things are harder to learn than old things. We ask smart
508+New things are harder to learn than old things. We ask smart
504−high-school students to learn calculus. Think about how much
509+high-school students to learn calculus. Think about how much
505harder it was for Newton and Leibniz to invent calculus, or for
510harder it was for Newton and Leibniz to invent calculus, or for
506−their first students to pick it up. Hoon is nowhere near as hard
511+their first students to pick it up. Hoon is nowhere near as hard
507as calculus.
512as calculus.
508
513
509Most of the difference is just the collective certainty that our
514Most of the difference is just the collective certainty that our
510society conveys to a high-school student that calculus is
515society conveys to a high-school student that calculus is
511−learnable. When you're learning Urbit, you don't have this
516+learnable. When you're learning Urbit, you don't have this
512collective knowledge; so you don't have the confidence that the
517collective knowledge; so you don't have the confidence that the
513−problem is solvable. Confidence makes a huge difference.
518+problem is solvable. Confidence makes a huge difference.
514Moreover, any bug or glitch in the developer experience destroys
519Moreover, any bug or glitch in the developer experience destroys
515this confidence and takes a long time to heal.
520this confidence and takes a long time to heal.
516
521
517−Yes, we know: Hoon remains quite hard to learn. Again, we have
522+Yes, we know: Hoon remains quite hard to learn. Again, we have
518−no reason to think this problem isn't solvable. Public
523+no reason to think this problem isn't solvable. Public
519enlightenment remains our main priority.
524enlightenment remains our main priority.
520
525
521## <a name="stuck"></a>Urbit programmers are stuck with Hoon.
526## <a name="stuck"></a>Urbit programmers are stuck with Hoon.
522
527
523−*TLDR*: patience, grasshopper.
528+_TLDR_: patience, grasshopper.
524
529
525There's quite a straightforward way to implement any perfectly
530There's quite a straightforward way to implement any perfectly
526−specified language with a reliable interpreter in Hoon. First,
531+specified language with a reliable interpreter in Hoon. First,
527−write an interpreter for that language in Hoon. Second, jet that intepreter function with the existing implementation.
532+write an interpreter for that language in Hoon. Second, jet that intepreter function with the existing implementation.
528
533
529It is not clear that Javascript is _quite_ well-defined enough
534It is not clear that Javascript is _quite_ well-defined enough
530−for this treatment. But Lua probably is.
535+for this treatment. But Lua probably is.
531
536
532## <a name="user"></a>Ordinary users will never be able to manage an Urbit server.
537## <a name="user"></a>Ordinary users will never be able to manage an Urbit server.
533
538
534−*TLDR*: Urbit's technical simplicity has always been designed
539+_TLDR_: Urbit's technical simplicity has always been designed
535−to drive human usability. But the polish is the last thing that
540+to drive human usability. But the polish is the last thing that
536−goes on. So we can't evaluate this claim right now.
541+goes on. So we can't evaluate this claim right now.
537
542
538−Right now, Urbit is only for geeks. You already need to be able
543+Right now, Urbit is only for geeks. You already need to be able
539−to wrangle a Unix machine to run it. What's the point?
544+to wrangle a Unix machine to run it. What's the point?
540
545
541−This Urbit isn't the real Urbit. It's an early milestone on the
546+This Urbit isn't the real Urbit. It's an early milestone on the
542way to the real Urbit.
547way to the real Urbit.
543
548
544The real Urbit -- for normal human beings -- is a hosted service.
549The real Urbit -- for normal human beings -- is a hosted service.
545−Getting a planet is as easy as signing up for Facebook. Probably
550+Getting a planet is as easy as signing up for Facebook. Probably
546−many users will think of it as another web account. They might
551+many users will think of it as another web account. They might
547not even know it can run more apps than the ones they use.
552not even know it can run more apps than the ones they use.
548
553
549A deterministic, persistent cloud computer is something different
554A deterministic, persistent cloud computer is something different
550−from a traditional server. Normally when we think of a server in
555+from a traditional server. Normally when we think of a server in
551the cloud, we think of it like a live animal -- a creature that
556the cloud, we think of it like a live animal -- a creature that
552−needs to be cared for, fed, and herded. A file in the cloud is
557+needs to be cared for, fed, and herded. A file in the cloud is
553more like a rock -- you can forget about it for ten years.
558more like a rock -- you can forget about it for ten years.
554
559
555An urbit is a general-purpose computer, but it doesn't even have
560An urbit is a general-purpose computer, but it doesn't even have
556−the concept of a reboot. It upgrades itself. If you don't feed
561+the concept of a reboot. It upgrades itself. If you don't feed
557it any packets for ten years, then turn it back on, it will spend
562it any packets for ten years, then turn it back on, it will spend
558−a day or two upgrading itself, then be back to normal. Maybe
563+a day or two upgrading itself, then be back to normal. Maybe
559it's something in between a rock and an animal -- a cactus?
564it's something in between a rock and an animal -- a cactus?
560
565
561Another huge difference versus an Internet server is that we're
566Another huge difference versus an Internet server is that we're
562confident that Urbit's limited supply of identities will make it
567confident that Urbit's limited supply of identities will make it
563−easy to keep abusers off the network. So far, so good -- but of
568+easy to keep abusers off the network. So far, so good -- but of
564course, no one abuses a young network.
569course, no one abuses a young network.
565
570
566The bottom line is that managing your urbit has to be as easy as
571The bottom line is that managing your urbit has to be as easy as
567−managing your iPhone. Normally, it consists of deciding what
572+managing your iPhone. Normally, it consists of deciding what
568apps you want to be running, and how much you trust them.
573apps you want to be running, and how much you trust them.
569Resources can't be free, so sometimes you have to play memory
574Resources can't be free, so sometimes you have to play memory
570−police. Humans have shown that they can handle these tasks.
575+police. Humans have shown that they can handle these tasks.
571
576
572Our '70s OSes and networks, which were great designs in their day
577Our '70s OSes and networks, which were great designs in their day
573and have matured into excellent industrial tools, give us a
578and have matured into excellent industrial tools, give us a
574totally misleading impression of how hard it should be to manage
579totally misleading impression of how hard it should be to manage
575−a general-purpose computer. Computing isn't scary or dangerous.
580+a general-purpose computer. Computing isn't scary or dangerous.
576−Unix and the Internet are scary and dangerous. That's fine for
581+Unix and the Internet are scary and dangerous. That's fine for
577an industrial tool, but not a personal tool.
582an industrial tool, but not a personal tool.
578
583
579## <a name="killer"></a>Urbit has no killer app.
584## <a name="killer"></a>Urbit has no killer app.
580
585
581−*TLDR*: the killer app is personal API aggregation.
586+_TLDR_: the killer app is personal API aggregation.
582
587
583It's a truism that any new platform has to be fundamentally much
588It's a truism that any new platform has to be fundamentally much
584better at solving some problem than the mature platform it seeks
589better at solving some problem than the mature platform it seeks
@@ -591,7 +596,7 @@ From the developer's perspective, Urbit's advantage is that it's
591a network stack which provides exactly-once delivery of typed,
596a network stack which provides exactly-once delivery of typed,
592validated, transactional, encrypted and authenticated messages.
597validated, transactional, encrypted and authenticated messages.
593The difference between an Urbit API and a REST API is like the
598The difference between an Urbit API and a REST API is like the
594−difference between a paved road and a dirt road. On the other
599+difference between a paved road and a dirt road. On the other
595hand, you do need to learn a new functional language.
600hand, you do need to learn a new functional language.
596
601
597From the user's perspective, there's one task that any personal
602From the user's perspective, there's one task that any personal
@@ -600,14 +605,14 @@ unrestricted API aggregation.
600
605
601Well before Urbit is ready to _replace_ any conventional web
606Well before Urbit is ready to _replace_ any conventional web
602services, it should be ready to _command_ them in place by API.
607services, it should be ready to _command_ them in place by API.
603−(Or if needed, by scraping.) If all you care about is being in
608+(Or if needed, by scraping.) If all you care about is being in
604control of your own data, it's fine to leave it in the hands of
609control of your own data, it's fine to leave it in the hands of
605these services, as you have the API secrets to get it out.
610these services, as you have the API secrets to get it out.
606
611
607Managing a set of security connections to your existing services
612Managing a set of security connections to your existing services
608is one of the first important tasks of a modern personal server.
613is one of the first important tasks of a modern personal server.
609This is a stateful task that typically requires both a durable
614This is a stateful task that typically requires both a durable
610−API key and a temporary OAuth token. APIs change all the time,
615+API key and a temporary OAuth token. APIs change all the time,
611so connection maintenance also requires evergreen updates.
616so connection maintenance also requires evergreen updates.
612
617
613The origin of this API key will vary, but usually the best way to
618The origin of this API key will vary, but usually the best way to
@@ -619,7 +624,7 @@ do with your own data.
619
624
620Terms of service which constrain the use of data (as opposed to
625Terms of service which constrain the use of data (as opposed to
621the abuse of the service) simply aren't realistic and will no
626the abuse of the service) simply aren't realistic and will no
622−longer apply. This enables a variety of novel user experiences
627+longer apply. This enables a variety of novel user experiences
623which aren't implementable as traditional web services, and also
628which aren't implementable as traditional web services, and also
624aren't available via conventional third-party API aggregators.
629aren't available via conventional third-party API aggregators.
625
630
@@ -627,16 +632,16 @@ Also, since Urbit is after all quite immature, it doesn't make
627much sense to restrict this security state to code within Urbit.
632much sense to restrict this security state to code within Urbit.
628The Urbit interpreter `vere` runs as a Unix daemon that
633The Urbit interpreter `vere` runs as a Unix daemon that
629implements the FUSE user-level filesystem protocol, and maps the
634implements the FUSE user-level filesystem protocol, and maps the
630−data on your services into the Unix filesystem. For example, one
635+data on your services into the Unix filesystem. For example, one
631of our demos lets you `ls` your GitHub issues.
636of our demos lets you `ls` your GitHub issues.
632
637
633So it's straightforward to build, for instance, a Python app that
638So it's straightforward to build, for instance, a Python app that
634−uses Urbit as a gateway to mash up a bunch of web services. As a
639+uses Urbit as a gateway to mash up a bunch of web services. As a
635Unix programmer, you might even just regard Urbit as a generic
640Unix programmer, you might even just regard Urbit as a generic
636Web API gateway daemon, without worrying about its internals.
641Web API gateway daemon, without worrying about its internals.
637
642
638−We have other ideas for initial killer apps. But this, we feel,
643+We have other ideas for initial killer apps. But this, we feel,
639−is the best one. API libraries for `npm` et al abound.
644+is the best one. API libraries for `npm` et al abound.
640Stateful, self-updating, generic API aggregators with FUSE
645Stateful, self-updating, generic API aggregators with FUSE
641integration, also integrated with a reactive web server, are
646integration, also integrated with a reactive web server, are
642rarer.
647rarer.
@@ -645,23 +650,23 @@ rarer.
645
650
646It's difficult to categorize [this awesome
651It's difficult to categorize [this awesome
647essay](http://ngnghm.github.io/blog/2016/06/11/chapter-10-houyhnhnms-vs-martians/)
652essay](http://ngnghm.github.io/blog/2016/06/11/chapter-10-houyhnhnms-vs-martians/)
648−in a single bullet point. So I've saved it for last.
653+in a single bullet point. So I've saved it for last.
649
654
650When reading this essay, it's important not to forget the amazing
655When reading this essay, it's important not to forget the amazing
651absence of genuine, mutually critical discourse in computer
656absence of genuine, mutually critical discourse in computer
652−science (as in most sciences today). You never hear what Swift's
657+science (as in most sciences today). You never hear what Swift's
653−designers think of Go, or vice versa. And critical public
658+designers think of Go, or vice versa. And critical public
654discourse decreases, not increases, with increasing academic
659discourse decreases, not increases, with increasing academic
655legitimacy.
660legitimacy.
656
661
657The basic test of any field purportedly scientific in nature is
662The basic test of any field purportedly scientific in nature is
658whether its researchers are genuinely interested in each others'
663whether its researchers are genuinely interested in each others'
659−work, and willing to share these genuine responses publicly. If
664+work, and willing to share these genuine responses publicly. If
660this practice does not exist, the field may still be useful
665this practice does not exist, the field may still be useful
661−and/or interesting. But it is not science.
666+and/or interesting. But it is not science.
662
667
663What's awesome about Fare's essay is that he's _doing it right_.
668What's awesome about Fare's essay is that he's _doing it right_.
664−All the actual details are irrelevant. And mostly wrong. But
669+All the actual details are irrelevant. And mostly wrong. But
665that's of very little importance compared to _doing it right_.
670that's of very little importance compared to _doing it right_.
666
671
667Anyway, we've already addressed the idea that jets are a sham.
672Anyway, we've already addressed the idea that jets are a sham.
@@ -670,11 +675,11 @@ Some other points:
670### Event-sourcing and/or caching is a pattern, not a layer
675### Event-sourcing and/or caching is a pattern, not a layer
671
676
672Fare' is perfectly right that "one size does not fit all" in
677Fare' is perfectly right that "one size does not fit all" in
673−persistence. Generally, Urbit uses event-sourced persistence.
678+persistence. Generally, Urbit uses event-sourced persistence.
674
679
675But it has multiple layers of event-sourcing: in the definition
680But it has multiple layers of event-sourcing: in the definition
676of Urbit itself; in the application sandbox vane (Gall), and in
681of Urbit itself; in the application sandbox vane (Gall), and in
677−the application itself. Urbit also has a completely orthogonal
682+the application itself. Urbit also has a completely orthogonal
678revision control system (Clay).
683revision control system (Clay).
679
684
680And there is not a single cache across the whole system, though
685And there is not a single cache across the whole system, though
@@ -688,33 +693,33 @@ or feature, and equally fatal whichever direction you fail.
688### Let's be clear about why DSLs suck
693### Let's be clear about why DSLs suck
689
694
690DSLs suck not because they are difficult to newbies in the base
695DSLs suck not because they are difficult to newbies in the base
691−language. DSLs suck because every time a programmer, even one
696+language. DSLs suck because every time a programmer, even one
692_experienced_ in the base language, comes into a new codebase or
697_experienced_ in the base language, comes into a new codebase or
693project, she has to learn a new custom language.
698project, she has to learn a new custom language.
694
699
695−You need enormous wins to justify this cost. It's the goal of
700+You need enormous wins to justify this cost. It's the goal of
696the base language designer to preempt these wins, creating a
701the base language designer to preempt these wins, creating a
697language which is almost never so tiresome and full of
702language which is almost never so tiresome and full of
698boilerplate that it requires a DSL or template layer.
703boilerplate that it requires a DSL or template layer.
699
704
700Hoon is almost entirely made of macros -- but they are internal,
705Hoon is almost entirely made of macros -- but they are internal,
701−fixed, built-in macros (with no gensyms). This fixed set of
706+fixed, built-in macros (with no gensyms). This fixed set of
702−macros is essentially enough. Occasionally we want to add one or
707+macros is essentially enough. Occasionally we want to add one or
703−two. But we never, ever pine for context-dependent macros.
708+two. But we never, ever pine for context-dependent macros.
704
709
705### Determinism is not consensus, and is not constraining
710### Determinism is not consensus, and is not constraining
706
711
707Fare' is totally right that an urbit's data is meant for itself
712Fare' is totally right that an urbit's data is meant for itself
708−alone. In fact, an urbit has the right to compute incorrectly if
713+alone. In fact, an urbit has the right to compute incorrectly if
709−it wants. We go to considerable lengths to ensure that you can't
714+it wants. We go to considerable lengths to ensure that you can't
710gain any particular advantage by incorrect computing.
715gain any particular advantage by incorrect computing.
711
716
712The whole point of Nock is that it's so low-level that there is
717The whole point of Nock is that it's so low-level that there is
713−no conceivable advantage in upgrading it. Divergence is just
718+no conceivable advantage in upgrading it. Divergence is just
714−pointless. This is not a question of network integrity, just of
719+pointless. This is not a question of network integrity, just of
715practical standardization.
720practical standardization.
716
721
717−This consistency stops at Nock. Without anyone violating the
722+This consistency stops at Nock. Without anyone violating the
718correctness of their lifecycle functions, anyone or everyone in
723correctness of their lifecycle functions, anyone or everyone in
719−Urbit could replace Hoon with Javascript. Determinism does not
724+Urbit could replace Hoon with Javascript. Determinism does not
720cramp Urbit's semantic style in any way, shape or form.
725cramp Urbit's semantic style in any way, shape or form.
content/blog/community-spotlight-the-portico.md+2−1
@@ -1,7 +1,8 @@
1+++
1+++
2title = "Community Spotlight: The Portico"
2title = "Community Spotlight: The Portico"
3−date = 2021-05-04
3+date = "2021-05-03"
4description = "Interview with The Portico founder Josh Reagan"
4description = "Interview with The Portico founder Josh Reagan"
5+
5[extra]
6[extra]
6author = "Matt"
7author = "Matt"
7ship = "~tirwyd-sarmes"
8ship = "~tirwyd-sarmes"
content/blog/creating-sigils.md+9−7
@@ -1,14 +1,16 @@
1+++
1+++
2title = "Creating Sigils"
2title = "Creating Sigils"
3−date = 2020-02-04
3+date = "2020-02-03"
4description = "The origin and design process informing Urbit's generative user avatar system, Sigils."
4description = "The origin and design process informing Urbit's generative user avatar system, Sigils."
5+
5[extra]
6[extra]
6author = "Gavin Atkinson"
7author = "Gavin Atkinson"
7ship = "~ridlur-figbud"
8ship = "~ridlur-figbud"
8−image ="https://media.urbit.org/site/posts/essays/sigils3.png"
9+image = "https://media.urbit.org/site/posts/essays/sigils3.png"
9+++
10+++
10
11
11<!-- ![](https://media.urbit.org/site/blog-9.jpg) -->
12<!-- ![](https://media.urbit.org/site/blog-9.jpg) -->
13+
12![](https://media.urbit.org/site/posts/essays/sigils0-v3.png)
14![](https://media.urbit.org/site/posts/essays/sigils0-v3.png)
13
15
14One of the basic building blocks of Urbit is Urbit ID, our naming and identity system. Your Urbit ID is a short, recognizable name that’s also a network address for your Urbit OS instance. (You can find a complete, high level description of Urbit ID [here](https://urbit.org/understanding-urbit/urbit-id/).)
16One of the basic building blocks of Urbit is Urbit ID, our naming and identity system. Your Urbit ID is a short, recognizable name that’s also a network address for your Urbit OS instance. (You can find a complete, high level description of Urbit ID [here](https://urbit.org/understanding-urbit/urbit-id/).)
@@ -33,13 +35,13 @@ So we started by collecting influences.
33
35
34<iframe class="arena-iframe" width="100%" src="https://www.are.na/tlon/seal-zp3irwad52y/embed"></iframe>
36<iframe class="arena-iframe" width="100%" src="https://www.are.na/tlon/seal-zp3irwad52y/embed"></iframe>
35
37
36−The ‘chop’ or [seal](https://en.wikipedia.org/wiki/Seal_(East_Asia)) is conceptually pretty close to what we wanted to get to.
38+The ‘chop’ or [seal](<https://en.wikipedia.org/wiki/Seal_(East_Asia)>) is conceptually pretty close to what we wanted to get to.
37
39
38<br /><br />
40<br /><br />
39
41
40<iframe class="arena-iframe" width="100%" src="https://www.are.na/tlon/kamon/embed"></iframe>
42<iframe class="arena-iframe" width="100%" src="https://www.are.na/tlon/kamon/embed"></iframe>
41
43
42−[Kamon](https://en.wikipedia.org/wiki/Mon_(emblem)) are even closer — especially since they have very little visual complexity.
44+[Kamon](<https://en.wikipedia.org/wiki/Mon_(emblem)>) are even closer — especially since they have very little visual complexity.
43
45
44<br /><br />
46<br /><br />
45
47
@@ -67,11 +69,11 @@ Another influence: international maritime signal flags. We like these not only b
67
69
68You can see the whole collection of our visual research [here](https://www.are.na/tlon/2019-sigils-research).
70You can see the whole collection of our visual research [here](https://www.are.na/tlon/2019-sigils-research).
69
71
70−Ultimately, we didn’t specifically draw on any of these influences very consciously. The goal of visual research is to get a sense of the territory, what has been tried, and what works. We think these threads of prior work are evident in the final result — you can *feel* them, but it’s tough to point to them individually.
72+Ultimately, we didn’t specifically draw on any of these influences very consciously. The goal of visual research is to get a sense of the territory, what has been tried, and what works. We think these threads of prior work are evident in the final result — you can _feel_ them, but it’s tough to point to them individually.
71
73
72## What’s in a name?
74## What’s in a name?
73
75
74−> *“Lev’s sigil appeared, strobing, as Netherton was getting out of the cab in Henrietta Street. “Yes?” Netherton asked.”*
76+> _“Lev’s sigil appeared, strobing, as Netherton was getting out of the cab in Henrietta Street. “Yes?” Netherton asked.”_
75>
77>
76> <cite>— William Gibson, The Peripheral</cite>
78> <cite>— William Gibson, The Peripheral</cite>
77
79
@@ -79,7 +81,7 @@ Before we get to how we worked through the problem of actually designing these t
79
81
80We went through so many names for these things. Crest, symbol, seal, tag, pictograph, stamp, emblem, signet, icon, glyph, holomark, visage, radigy, pattern, the list goes on for an incredibly (embarrassingly) long time. We argued about this, we went back and forth about it.
82We went through so many names for these things. Crest, symbol, seal, tag, pictograph, stamp, emblem, signet, icon, glyph, holomark, visage, radigy, pattern, the list goes on for an incredibly (embarrassingly) long time. We argued about this, we went back and forth about it.
81
83
82−Sigil won, ultimately, because of the way that it’s personified in William Gibson’s *The Peripheral*. In the far future, characters talk to each other by some kind of telepresence. When a call comes in from someone else, they first appear as a ‘sigil.’ It’s a strange word, but we were imagining a similar use-case.
84+Sigil won, ultimately, because of the way that it’s personified in William Gibson’s _The Peripheral_. In the far future, characters talk to each other by some kind of telepresence. When a call comes in from someone else, they first appear as a ‘sigil.’ It’s a strange word, but we were imagining a similar use-case.
83
85
84While we can’t point to any specific parts of our visual research that reappear directly, sigil is lovingly borrowed.
86While we can’t point to any specific parts of our visual research that reappear directly, sigil is lovingly borrowed.
85
87
content/blog/eliza.md+3−2
@@ -1,7 +1,8 @@
1+++
1+++
2title = "Eliza"
2title = "Eliza"
3−date = 2021-02-23
3+date = "2021-02-22"
4description = "Building things, even Calm™ things, makes noise."
4description = "Building things, even Calm™ things, makes noise."
5+
5[extra]
6[extra]
6author = "Christian Langalis"
7author = "Christian Langalis"
7ship = "~pindet-timmut"
8ship = "~pindet-timmut"
@@ -42,7 +43,7 @@ The sum of Urbit's architectural design is a new online economics: a way to fina
42
43
43We all know the basic MEGACORP business model: offer a free service (to suckers who don't own a server), secretly mine the data they generate on the (addictive) platform, then sell targeted ads to advertisers. This model will not survive Urbit. The ubiquitous personal server changes the economic equation. You used to 'pay' for an experience with your time and data. On Urbit, once you purchase core internet infrastructure, it's yours.
44We all know the basic MEGACORP business model: offer a free service (to suckers who don't own a server), secretly mine the data they generate on the (addictive) platform, then sell targeted ads to advertisers. This model will not survive Urbit. The ubiquitous personal server changes the economic equation. You used to 'pay' for an experience with your time and data. On Urbit, once you purchase core internet infrastructure, it's yours.
44
45
45−So, can Urbit meaningfully curtail our world's appetite for data? We'll see. Post-enlightenment society runs on instrumental reason, right down to the last byte. Marketers will always want a fresh dataset. However, when the goods are on your Urbit, you can at least demand the respect you deserve. Long term, we expect a transparent market for data, not an opaque "agreement". An analytics company wants to track everything you see and do on Urbit? They better be paying well.
46+So, can Urbit meaningfully curtail our world's appetite for data? We'll see. Post-enlightenment society runs on instrumental reason, right down to the last byte. Marketers will always want a fresh dataset. However, when the goods are on your Urbit, you can at least demand the respect you deserve. Long term, we expect a transparent market for data, not an opaque "agreement". An analytics company wants to track everything you see and do on Urbit? They better be paying well.
46
47
47Eliza doesn't pay respondents. Her collection is a charity to Urbit's developers. (We're also still busy enabling payments on Urbit with the Bitcoin wallet.) However, her presence is not a term of service either. In a few years, by the nth time some smart aleck uses Eliza's chatbot code and conjures 'Zalexa' to attempt an intrusion upon your Calm™, we will see the economics of Urbit's architecture suddenly vivify. Blacklists, reputation systems, and, eventually, even data markets, all Urbit primitives envisioned long ago, will become real. We won't need Zoogle to underwrite a spam filter for the entire internet; the scarcity of Urbit address space, in tandem with a true web-of-trust, handles that.
48Eliza doesn't pay respondents. Her collection is a charity to Urbit's developers. (We're also still busy enabling payments on Urbit with the Bitcoin wallet.) However, her presence is not a term of service either. In a few years, by the nth time some smart aleck uses Eliza's chatbot code and conjures 'Zalexa' to attempt an intrusion upon your Calm™, we will see the economics of Urbit's architecture suddenly vivify. Blacklists, reputation systems, and, eventually, even data markets, all Urbit primitives envisioned long ago, will become real. We won't need Zoogle to underwrite a spam filter for the entire internet; the scarcity of Urbit address space, in tandem with a true web-of-trust, handles that.
48
49
content/blog/events-series.md+4−3
@@ -1,7 +1,8 @@
1+++
1+++
2title = "Urbit Events Series"
2title = "Urbit Events Series"
3description = "These events are an opportunity for Urbit contributors to share real-time updates that don’t make it into this blog, and for the community to get to know the contributors (and one another)."
3description = "These events are an opportunity for Urbit contributors to share real-time updates that don’t make it into this blog, and for the community to get to know the contributors (and one another)."
4−date = 2020-10-30
4+date = "2020-10-29"
5+
5[extra]
6[extra]
6description = "These events are an opportunity for Urbit contributors to share real-time updates that don’t make it into this blog, and for the community to get to know the contributors (and one another)."
7description = "These events are an opportunity for Urbit contributors to share real-time updates that don’t make it into this blog, and for the community to get to know the contributors (and one another)."
7author = "Lane Rettig"
8author = "Lane Rettig"
@@ -15,7 +16,7 @@ image = "https://media.urbit.org/site/posts/essays/bau.jpg"
15
16
16<br>
17<br>
17
18
18−*TL;DR: Urbit is launching a series of community events, the first of which is a developer call taking place on Thursday, November 5 at 9am PT. [Sign up here](https://www.meetup.com/urbit-sf/events/274279522/), and read on for all of the details.*
19+_TL;DR: Urbit is launching a series of community events, the first of which is a developer call taking place on Thursday, November 5 at 9am PT. [Sign up here](https://www.meetup.com/urbit-sf/events/274279522/), and read on for all of the details._
19
20
20--
21--
21
22
@@ -53,4 +54,4 @@ Tlon could no longer catalog the Urbit community even if it wanted to. This is a
53
54
54--
55--
55
56
56−*Sign up to attend [the first event](https://www.meetup.com/urbit-sf/), and join the channels called “Events Series” on Landscape in the Urbit Community group to get involved.*
57+_Sign up to attend [the first event](https://www.meetup.com/urbit-sf/), and join the channels called “Events Series” on Landscape in the Urbit Community group to get involved._
content/blog/first-contract.md+2−1
@@ -1,7 +1,8 @@
1+++
1+++
2title = "Azimuth’s First Contract Upgrade"
2title = "Azimuth’s First Contract Upgrade"
3−date = 2021-06-05
3+date = "2021-06-04"
4description = "Galactic Senate makes first concrete action"
4description = "Galactic Senate makes first concrete action"
5+
5[extra]
6[extra]
6author = "Jonathan Paprocki and Mark"
7author = "Jonathan Paprocki and Mark"
7ship = "~datnut-pollen and ~palfun-foslup"
8ship = "~datnut-pollen and ~palfun-foslup"
content/blog/first-steps-towards-urbit-org.md+8−13
@@ -1,59 +1,54 @@
1+++
1+++
2title = "First Steps Towards urbit.org"
2title = "First Steps Towards urbit.org"
3−date = 2020-08-12
3+date = "2020-08-11"
4description = "With a stable platform taking shape and a strong community forming that wants to help build Urbit, it’s time to make urbit.org real."
4description = "With a stable platform taking shape and a strong community forming that wants to help build Urbit, it’s time to make urbit.org real."
5+
5[extra]
6[extra]
6author = "Josh Lehman"
7author = "Josh Lehman"
7ship = "~wolref-podlex"
8ship = "~wolref-podlex"
8−image ="https://media.urbit.org/site/posts/essays/first-steps.png"
9+image = "https://media.urbit.org/site/posts/essays/first-steps.png"
9+++
10+++
10
11
11<br>
12<br>
12
13
13<img src="https://media.urbit.org/site/posts/essays/first-steps.png">
14<img src="https://media.urbit.org/site/posts/essays/first-steps.png">
14
15
15−
16## Summary
16## Summary
17
17
18It’s been a long time since we last discussed separating the [governance of urbit.org](https://urbit.org/blog/governance-of-urbit/) from Tlon. In the last few weeks, we’ve taken steps to make such a separation real. In this update we’ll discuss the background that led us here, why we’re doing this now, and what this means for Urbit.
18It’s been a long time since we last discussed separating the [governance of urbit.org](https://urbit.org/blog/governance-of-urbit/) from Tlon. In the last few weeks, we’ve taken steps to make such a separation real. In this update we’ll discuss the background that led us here, why we’re doing this now, and what this means for Urbit.
19
19
20−
21## Background
20## Background
22
21
23At present Urbit is an open-source project developed primarily by the company Tlon. Urbit is an ambitious project with a long roadmap, which has required both careful guidance and resources to sustain its development. These resources have been Urbit’s address space, which have value in direct proportion to the value of Urbit as a platform. Naturally, Tlon has been focused thus far on making Urbit into a platform that people want to use.
22At present Urbit is an open-source project developed primarily by the company Tlon. Urbit is an ambitious project with a long roadmap, which has required both careful guidance and resources to sustain its development. These resources have been Urbit’s address space, which have value in direct proportion to the value of Urbit as a platform. Naturally, Tlon has been focused thus far on making Urbit into a platform that people want to use.
24
23
25−Ultimately, Urbit presents more possibilities than any one organization can manage. We anticipated this, and set aside address space for urbit.org, which we’ve often thought of as some type of software foundation. As Urbit matures to the point where Tlon can shift from developing the platform to developing products *on* the platform, urbit.org is meant to continue to improve and maintain the parts of Urbit that many will come to rely upon.
24+Ultimately, Urbit presents more possibilities than any one organization can manage. We anticipated this, and set aside address space for urbit.org, which we’ve often thought of as some type of software foundation. As Urbit matures to the point where Tlon can shift from developing the platform to developing products _on_ the platform, urbit.org is meant to continue to improve and maintain the parts of Urbit that many will come to rely upon.
26−
27−When we last discussed this, in early 2019, we weren’t quite ready to pull the trigger on setting up urbit.org. We weren’t sure if a software foundation would be the right structure, didn’t have the resources to tackle the overhead, and Urbit wasn’t yet stable enough for Tlon to focus on anything *but* platform development.
28
25
26+When we last discussed this, in early 2019, we weren’t quite ready to pull the trigger on setting up urbit.org. We weren’t sure if a software foundation would be the right structure, didn’t have the resources to tackle the overhead, and Urbit wasn’t yet stable enough for Tlon to focus on anything _but_ platform development.
29
27
30## The Present
28## The Present
31
29
32−Urbit is really starting to look like a platform. Tlon has put tons of work into making Urbit stable and performant, we’ve launched OS1, and hosting services are on the horizon. Meanwhile, the grants program and Hoon School were initiated, and community members have been [contributing](https://github.com/natareo/hooncard/blob/master/hooncard.pdf) [learning](https://github.com/timlucmiptev/gall-guide/blob/master/guide-docs/overview.md) [materials](https://github.com/lukechampine/rote/blob/master/urbit/app/rote.hoon), [issuing](https://github.com/urbit/urbit/pull/2885) [patches](https://github.com/urbit/urbit/pull/3202) [to](https://github.com/urbit/urbit/pull/3238) [Urbit](https://github.com/urbit/urbit/pull/2867), and [building](https://github.com/ryjm/srrs) [new](https://github.com/dclelland/UrsusChat) [applications](https://github.com/yosoyubik/canvas) [in](https://github.com/yosoyubik/urbitcoin) [userspace](https://github.com/taalhavras/ucal).
30+Urbit is really starting to look like a platform. Tlon has put tons of work into making Urbit stable and performant, we’ve launched OS1, and hosting services are on the horizon. Meanwhile, the grants program and Hoon School were initiated, and community members have been [contributing](https://github.com/natareo/hooncard/blob/master/hooncard.pdf) [learning](https://github.com/timlucmiptev/gall-guide/blob/master/guide-docs/overview.md) [materials](https://github.com/lukechampine/rote/blob/master/urbit/app/rote.hoon), [issuing](https://github.com/urbit/urbit/pull/2885) [patches](https://github.com/urbit/urbit/pull/3202) [to](https://github.com/urbit/urbit/pull/3238) [Urbit](https://github.com/urbit/urbit/pull/2867), and [building](https://github.com/ryjm/srrs) [new](https://github.com/dclelland/UrsusChat) [applications](https://github.com/yosoyubik/canvas) [in](https://github.com/yosoyubik/urbitcoin) [userspace](https://github.com/taalhavras/ucal).
33
31
34With a stable platform taking shape and a strong community forming that wants to help build Urbit, it’s time to make urbit.org real. We’ve had plenty of time to think about what it should look like, how it should work, and who should lead it.
32With a stable platform taking shape and a strong community forming that wants to help build Urbit, it’s time to make urbit.org real. We’ve had plenty of time to think about what it should look like, how it should work, and who should lead it.
35
33
36Our plan is to run urbit.org as a protocol—we’ll treat it like a real entity, but instead of dealing with the administrative details of setting up such an organization, we’ll incubate it within Tlon and give it a mandate: To competently distribute address space as a means of improving Urbit.
34Our plan is to run urbit.org as a protocol—we’ll treat it like a real entity, but instead of dealing with the administrative details of setting up such an organization, we’ll incubate it within Tlon and give it a mandate: To competently distribute address space as a means of improving Urbit.
37
35
38−
39## Moving Forward
36## Moving Forward
40
37
41On that note, allow me to introduce myself: I’m Josh[^1], the new Interim Director of urbit.org. I’ve been a follower of this project for several years now and more recently a fairly active community member. I first became fascinated by Urbit as a programmer that saw the potential in a clean-slate OS; I later became compelled by a future in which social computing becomes small, friendly, and human-scale again.
38On that note, allow me to introduce myself: I’m Josh[^1], the new Interim Director of urbit.org. I’ve been a follower of this project for several years now and more recently a fairly active community member. I first became fascinated by Urbit as a programmer that saw the potential in a clean-slate OS; I later became compelled by a future in which social computing becomes small, friendly, and human-scale again.
42
39
43My background is predominantly in building software, companies, and teams—most notably [Starcity](https://starcity.com), where I am a co-founder and CTO. Starcity[^2], like Tlon, is focused on enabling communities to flourish. While the approaches couldn’t be more different, the goal of bringing people together in fundamentally human ways is shared.
40My background is predominantly in building software, companies, and teams—most notably [Starcity](https://starcity.com), where I am a co-founder and CTO. Starcity[^2], like Tlon, is focused on enabling communities to flourish. While the approaches couldn’t be more different, the goal of bringing people together in fundamentally human ways is shared.
44
41
45−My goal is to leverage urbit.org to ensure Urbit’s success. I want to see a world in which Urbit is used by my friends, family, colleagues, everyone I know. To get there, much is left to build.
42+My goal is to leverage urbit.org to ensure Urbit’s success. I want to see a world in which Urbit is used by my friends, family, colleagues, everyone I know. To get there, much is left to build.
46
43
47To that end, the first objective of urbit.org is to recruit builders and give them the tools to succeed. I’ll be focusing heavily on providing technical support to developers that engage with us via Grants, outreach to the wider developer community, supporting the efforts of those that are creating educational courses and documentation, and enlarging the contribution surface by exposing it to other programming languages[^3].
44To that end, the first objective of urbit.org is to recruit builders and give them the tools to succeed. I’ll be focusing heavily on providing technical support to developers that engage with us via Grants, outreach to the wider developer community, supporting the efforts of those that are creating educational courses and documentation, and enlarging the contribution surface by exposing it to other programming languages[^3].
48
45
49The product work that Tlon is doing is crucial to Urbit’s long-term success, so I’ll also be leveraging bounties to more directly accelerate their development efforts. Landscape represents the clearest example of a cohesive vision for Urbit’s use. The existence of a polished product built on Urbit demonstrates to the world that the platform is robust and capable, and the growing community seems eager to help. You can expect more bounties very soon that provide a direct connection to the Landscape roadmap.
46The product work that Tlon is doing is crucial to Urbit’s long-term success, so I’ll also be leveraging bounties to more directly accelerate their development efforts. Landscape represents the clearest example of a cohesive vision for Urbit’s use. The existence of a polished product built on Urbit demonstrates to the world that the platform is robust and capable, and the growing community seems eager to help. You can expect more bounties very soon that provide a direct connection to the Landscape roadmap.
50
47
51−As I’m only just getting started, I’d love to hear your thoughts. If you’re working on any grants you’ll hear from me soon, and if you have an idea that you want to pursue, I’m here to help you make it happen. You can reach me directly via Urbit as `~wolref-podlex` or by email at josh@urbit.org.
48+As I’m only just getting started, I’d love to hear your thoughts. If you’re working on any grants you’ll hear from me soon, and if you have an idea that you want to pursue, I’m here to help you make it happen. You can reach me directly via Urbit as `~wolref-podlex` or by email at josh@urbit.org.
52
49
53I look forward to working with you.
50I look forward to working with you.
54
51
55[^1]: But my friends call me ~wolref-podlex.
52[^1]: But my friends call me ~wolref-podlex.
56−
57[^2]: We’re also really into the idea of being the first builder of housing on Mars. Just saying...
53[^2]: We’re also really into the idea of being the first builder of housing on Mars. Just saying...
58−
59[^3]: We call this project Airlock. You’ll hear more about it soon.
54[^3]: We call this project Airlock. You’ll hear more about it soon.
content/blog/ford-fusion.md+23−23
@@ -1,11 +1,12 @@
1+++
1+++
2title = "Ford Fusion"
2title = "Ford Fusion"
3−date = 2020-07-15
3+date = "2020-07-14"
4description = "Ford Fusion was an overhaul of Urbit's over-the-air upgrade process and a rewrite of its build system. The new update system corrects a few long-standing bugs with the previous one, and the new build system is simpler, smaller (by around 5,000 lines), and easier to manage."
4description = "Ford Fusion was an overhaul of Urbit's over-the-air upgrade process and a rewrite of its build system. The new update system corrects a few long-standing bugs with the previous one, and the new build system is simpler, smaller (by around 5,000 lines), and easier to manage."
5+
5[extra]
6[extra]
6author = "Ted Blackman"
7author = "Ted Blackman"
7ship = "~rovnys-ricfer"
8ship = "~rovnys-ricfer"
8−image ="https://media.urbit.org/site/posts/essays/ford-fusion.png"
9+image = "https://media.urbit.org/site/posts/essays/ford-fusion.png"
9+++
10+++
10
11
11<br>
12<br>
@@ -26,13 +27,14 @@ Urbit isn't exactly a traditional operating system, so the comparison is somewha
26itself in the general case, not just some special cases.
27itself in the general case, not just some special cases.
27
28
28Ford Fusion has fixed the major upgrade issues of the past by guaranteeing three properties that in retrospect are obvious requirements, but, like much of Urbit, took many years and rewrites to identify as such:
29Ford Fusion has fixed the major upgrade issues of the past by guaranteeing three properties that in retrospect are obvious requirements, but, like much of Urbit, took many years and rewrites to identify as such:
30+
29- Atomic: the update should complete or fail in one transaction. If it
31- Atomic: the update should complete or fail in one transaction. If it
30 fails, the system shouldn't get stuck.
32 fails, the system shouldn't get stuck.
31- Self-contained: there must be no implicit dependencies or hysteresis
33- Self-contained: there must be no implicit dependencies or hysteresis
32 (dependence on previous system states) when building the new software
34 (dependence on previous system states) when building the new software
33 from source.
35 from source.
34- Ordered: updates must be monotonically sequenced from the system's
36- Ordered: updates must be monotonically sequenced from the system's
35− lowest layer to highest.
37+ lowest layer to highest.
36
38
37Let’s walk through them one by one.
39Let’s walk through them one by one.
38
40
@@ -42,9 +44,9 @@ In previous versions of Urbit, updates failed atomicity by deferring parts of th
42
44
43We've learned that asynchronicity is an entropic state. A system will tend toward more asynchronicity over time unless effort is put into keeping it synchronous. [As Jonathan Blow has noted](https://youtu.be/pW-SOdj4Kkk?t=2547), the language server protocol has turned every editor plugin into a distributed system, since now it has to communicate asynchronously with the main editor process.
45We've learned that asynchronicity is an entropic state. A system will tend toward more asynchronicity over time unless effort is put into keeping it synchronous. [As Jonathan Blow has noted](https://youtu.be/pW-SOdj4Kkk?t=2547), the language server protocol has turned every editor plugin into a distributed system, since now it has to communicate asynchronously with the main editor process.
44
46
45−Consider an update system that took multiple Arvo events to complete. An ad-hoc higher-level transaction system would need to be built to roll back the effects of the first few events in case of failure. It’s important for various parts of the system to be able to emit effects on upgrade; since those effects would need to be rolled back if a later event in this upgrade fails, the system would need to maintain a queue of those events and only apply them once all the other upgrade events have completed.
47+Consider an update system that took multiple Arvo events to complete. An ad-hoc higher-level transaction system would need to be built to roll back the effects of the first few events in case of failure. It’s important for various parts of the system to be able to emit effects on upgrade; since those effects would need to be rolled back if a later event in this upgrade fails, the system would need to maintain a queue of those events and only apply them once all the other upgrade events have completed.
46
48
47−Note that the asynchronicity has now spread. Some effects that would normally be guaranteed to be processed synchronously might now be asynchronous. Entropy has begun to take hold, chipping away at the set of invariants the system is capable of guaranteeing.
49+Note that the asynchronicity has now spread. Some effects that would normally be guaranteed to be processed synchronously might now be asynchronous. Entropy has begun to take hold, chipping away at the set of invariants the system is capable of guaranteeing.
48
50
49This observation is not purely theoretical. False modularity was the cause of internal asynchronicity in Clay where it had to wait for responses in a complex dance with Ford, which was another vane (Arvo kernel module); moving Ford into Clay allowed function calls that were synchronous from Clay’s perspective, which allowed further simplifications, culminating in about a twenty percent reduction of source code size of the Arvo kernelspace.
51This observation is not purely theoretical. False modularity was the cause of internal asynchronicity in Clay where it had to wait for responses in a complex dance with Ford, which was another vane (Arvo kernel module); moving Ford into Clay allowed function calls that were synchronous from Clay’s perspective, which allowed further simplifications, culminating in about a twenty percent reduction of source code size of the Arvo kernelspace.
50
52
@@ -79,17 +81,17 @@ Emerging from this underworld required making a number of changes to the Arvo ke
79
81
80These are the layers of the stack that update themselves on the fly, from lowest to highest:
82These are the layers of the stack that update themselves on the fly, from lowest to highest:
81
83
82−+ hoon: the hoon language definition and compiler, defined in `/sys/hoon/hoon`
84+- hoon: the hoon language definition and compiler, defined in `/sys/hoon/hoon`
83−+ arvo: the arvo kernel proper and related type definitions, in `/sys/arvo/hoon`
85+- arvo: the arvo kernel proper and related type definitions, in `/sys/arvo/hoon`
84−+ zuse: the standard library, in `/sys/zuse/hoon`
86+- zuse: the standard library, in `/sys/zuse/hoon`
85−+ vanes: arvo kernel modules, including clay itself, in folder `/sys/vane`
87+- vanes: arvo kernel modules, including clay itself, in folder `/sys/vane`
86−+ userspace: apps, marks, ancillary source code like libraries, and user data
88+- userspace: apps, marks, ancillary source code like libraries, and user data
87
89
88An update to one layer necessitates a reload of all layers above it; e.g. a change to Zuse should trigger updates to the vanes and userspace. Conversely, an update to a higher layer should not cause a spurious reload of lower layers, which should not be affected by the change; for example, an update to just userspace should not cause any reloads of system code.
90An update to one layer necessitates a reload of all layers above it; e.g. a change to Zuse should trigger updates to the vanes and userspace. Conversely, an update to a higher layer should not cause a spurious reload of lower layers, which should not be affected by the change; for example, an update to just userspace should not cause any reloads of system code.
89
91
90−Clay is responsible for enforcing the layering of updates. An update to a module is triggered when an attempt is made to commit a change to Clay that affects one or more files needed to build the module. For example, if the 'foo' agent's source, defined in `/app/foo/hoon`, imports the 'bar' library from `/lib/bar/hoon`, then a modification to `/lib/bar/hoon` triggers an update to the 'foo' agent. All vanes and userspace files depend on Zuse, which depends on the Arvo and Hoon sources, so a change to the Hoon, Arvo, or Zuse sources will trigger updates to all vanes and userspace files.
92+Clay is responsible for enforcing the layering of updates. An update to a module is triggered when an attempt is made to commit a change to Clay that affects one or more files needed to build the module. For example, if the 'foo' agent's source, defined in `/app/foo/hoon`, imports the 'bar' library from `/lib/bar/hoon`, then a modification to `/lib/bar/hoon` triggers an update to the 'foo' agent. All vanes and userspace files depend on Zuse, which depends on the Arvo and Hoon sources, so a change to the Hoon, Arvo, or Zuse sources will trigger updates to all vanes and userspace files.
91
93
92−When asked to perform a commit, Clay determines which layers need to be updated based on which files have changed and which modules depend on those files. For now, all running programs load their source from the `%home` desk, so only changes to `%home` trigger stateful updates. Files in other desks can be built, but not installed into the system. This might be relaxed in the future.
94+When asked to perform a commit, Clay determines which layers need to be updated based on which files have changed and which modules depend on those files. For now, all running programs load their source from the `%home` desk, so only changes to `%home` trigger stateful updates. Files in other desks can be built, but not installed into the system. This might be relaxed in the future.
93
95
94The process of updating varies by layer. The Hoon and Zuse layers are stateless, so their newly rebuilt cores (Nock executables) must be stored (somewhere in the system’s Nock tree, in memory; remember, Urbit is a single-level store), but they have no state that would need to be migrated. The Arvo kernel, vanes, and userspace agents are all live, stateful programs, so in order to update one of those, the system must extract the state from the old program, pass that data into the newly built program, then discard the old program and store the new one. Arvo and agent state injection routines can emit effects, but vane updates cannot.
96The process of updating varies by layer. The Hoon and Zuse layers are stateless, so their newly rebuilt cores (Nock executables) must be stored (somewhere in the system’s Nock tree, in memory; remember, Urbit is a single-level store), but they have no state that would need to be migrated. The Arvo kernel, vanes, and userspace agents are all live, stateful programs, so in order to update one of those, the system must extract the state from the old program, pass that data into the newly built program, then discard the old program and store the new one. Arvo and agent state injection routines can emit effects, but vane updates cannot.
95
97
@@ -130,7 +132,7 @@ When Gall receives a newly rebuilt agent from Clay, it calls the gate produced b
130It is a bit counterintuitive that an app reload failure could prevent a kernel update. The reason is that we don't want the system to update itself into a broken state. An Urbit can be rendered practically unusable by the presence of broken agents, even if the kernel hasn't lost integrity,
132It is a bit counterintuitive that an app reload failure could prevent a kernel update. The reason is that we don't want the system to update itself into a broken state. An Urbit can be rendered practically unusable by the presence of broken agents, even if the kernel hasn't lost integrity,
131so it's kinder to the user not to break their agents by installing an incompatible kernel update. This also puts virtuous pressure on kernel developers not to "break userspace", the importance of which has been insisted on for decades by Linus Torvalds, among others.
133so it's kinder to the user not to break their agents by installing an incompatible kernel update. This also puts virtuous pressure on kernel developers not to "break userspace", the importance of which has been insisted on for decades by Linus Torvalds, among others.
132
134
133−If an agent does crash a commit event that included a kernel update, the attempted commit is now trivially rolled back, and the system can deliver an error message to the user. This does not leave the system in an inconsistent or stuck state, so the user could modify the failing agent and try the kernel update again later. Supporting better workflows for keeping third-party agents up-to-date will be an important aspect of Urbit’s upcoming software distribution work.
135+If an agent does crash a commit event that included a kernel update, the attempted commit is now trivially rolled back, and the system can deliver an error message to the user. This does not leave the system in an inconsistent or stuck state, so the user could modify the failing agent and try the kernel update again later. Supporting better workflows for keeping third-party agents up-to-date will be an important aspect of Urbit’s upcoming software distribution work.
134
136
135## Ford Build Semantics
137## Ford Build Semantics
136
138
@@ -146,7 +148,7 @@ Clay exposes file builds into the scry namespace with `%ca`: as an example, `.^(
146
148
147#### Mark Builds
149#### Mark Builds
148
150
149−A mark build produces a `$dais` mark-interface core. It first performs a file build on the Hoon file in `/mar` that defines the mark core, then it does some metaprogramming to make the operations more convenient to use. If the raw mark core delegated revision control operations to another mark core, the mark build will also load the delegate mark core and resolve the result into the `$dais`.
151+A mark build produces a `$dais` mark-interface core. It first performs a file build on the Hoon file in `/mar` that defines the mark core, then it does some metaprogramming to make the operations more convenient to use. If the raw mark core delegated revision control operations to another mark core, the mark build will also load the delegate mark core and resolve the result into the `$dais`.
150
152
151Clay exposes mark builds into the scry namespace with `%cb`: as an example, `.^(dais:clay %cb /~zod/home/3/mar/foo/hoon)` builds a `$dais` for the `%foo` mark.
153Clay exposes mark builds into the scry namespace with `%cb`: as an example, `.^(dais:clay %cb /~zod/home/3/mar/foo/hoon)` builds a `$dais` for the `%foo` mark.
152
154
@@ -154,15 +156,14 @@ Clay exposes mark builds into the scry namespace with `%cb`: as an example, `.^(
154
156
155A cast build produces a `$tube`: a gate that takes a value of one mark as input and converts it to a valid value of another mark or crashes. To convert from mark `%foo` to mark `%bar`, Clay tries the following operations, in order:
157A cast build produces a `$tube`: a gate that takes a value of one mark as input and converts it to a valid value of another mark or crashes. To convert from mark `%foo` to mark `%bar`, Clay tries the following operations, in order:
156
158
157−+ direct grow from `%foo`
159+- direct grow from `%foo`
158−+ direct grab from `%bar`
160+- direct grab from `%bar`
159−+ indirect jump from `%foo` through `%qux`
161+- indirect jump from `%foo` through `%qux`
160−+ indirect grab from `%bar` through `%qux`
162+- indirect grab from `%bar` through `%qux`
161
163
162The `%foo` mark can “grow to” `%bar` by providing an arm in its `+grow` core named `+bar`. `%bar` can convert from `%foo` using a `+foo` arm in its `+grab` core. `%foo` can also chain a conversion through an intermediary using an arm in its `+jump` core, and `%bar` can specify an “indirect grab” by having a `+grab` arm produce a delegate mark instead of directly defining a conversion gate.
164The `%foo` mark can “grow to” `%bar` by providing an arm in its `+grow` core named `+bar`. `%bar` can convert from `%foo` using a `+foo` arm in its `+grab` core. `%foo` can also chain a conversion through an intermediary using an arm in its `+jump` core, and `%bar` can specify an “indirect grab” by having a `+grab` arm produce a delegate mark instead of directly defining a conversion gate.
163
165
164−Clay exposes cast builds into the scry namespace with `%cc`: as an example, `.^(tube:clay %cc
166+Clay exposes cast builds into the scry namespace with `%cc`: as an example, `.^(tube:clay %cc /~zod/home/3/foo/bar)` builds a `$tube` conversion gate from `%foo` to `%bar`.
165−/~zod/home/3/foo/bar)` builds a `$tube` conversion gate from `%foo` to `%bar`.
166
167
167### Ford Runes
168### Ford Runes
168
169
@@ -207,8 +208,7 @@ A valid userspace hoon file must contain a nonempty list of hoons (hoon source e
207
208
208Urbit still needs to make better use of desks other than `%home` and the development process should be adjusted given the tighter coupling between source code and kernel and tighter criteria for accepting an update.
209Urbit still needs to make better use of desks other than `%home` and the development process should be adjusted given the tighter coupling between source code and kernel and tighter criteria for accepting an update.
209
210
210−This work also hopefully provides a good foundation of a package management and software distribution system for Urbit. As `~wicdev-wisryt` has said, a user should be able to run `|install
211+This work also hopefully provides a good foundation of a package management and software distribution system for Urbit. As `~wicdev-wisryt` has said, a user should be able to run `|install ~norsyr-torryn/canvas` to load and build remote source. No one should experience dependency hell on Urbit, but we're not there yet.
211−~norsyr-torryn/canvas` to load and build remote source. No one should experience dependency hell on Urbit, but we're not there yet.
212
212
213At least now, building a desk has no dependencies, other than a Ford with a compatible Hoon compiler. No decisions have been made on this yet, but
213At least now, building a desk has no dependencies, other than a Ford with a compatible Hoon compiler. No decisions have been made on this yet, but
214Ford might get moved to inside the desk, possibly by making Zuse callable. This could allow a desk to expose a Nock interface in addition to a typed Hoon interface, which could even let a desk be used as a "pill" bootloader.
214Ford might get moved to inside the desk, possibly by making Zuse callable. This could allow a desk to expose a Nock interface in addition to a typed Hoon interface, which could even let a desk be used as a "pill" bootloader.
@@ -221,6 +221,6 @@ In early 2020, `~master-morzod` suggested moving Ford into Clay to reduce asynch
221
221
222The first time I rewrote Ford, it took me six months, with help from `~littel-ponnys`, and it weighed in at 6,000 lines of code. The second time, in late 2018, took a few weeks. The third time, in January 2020, took a week. I wrote `+ford` in Ford Fusion in one long day, and it’s about 500 lines of synchronous, functional code.
222The first time I rewrote Ford, it took me six months, with help from `~littel-ponnys`, and it weighed in at 6,000 lines of code. The second time, in late 2018, took a few weeks. The third time, in January 2020, took a week. I wrote `+ford` in Ford Fusion in one long day, and it’s about 500 lines of synchronous, functional code.
223
223
224−It has taken me two or three years to understand this problem as well as I do, and I expect there are parts of it I still don’t understand. The code itself isn’t the issue; it’s finding the right answer to ontological and teleological questions. What *is* Ford? What will it be in a hundred years? I’m confident Ford Fusion is more similar than its predecessor to the Ford of 2120, because it’s smaller, more functional, and easier to understand and administer.
224+It has taken me two or three years to understand this problem as well as I do, and I expect there are parts of it I still don’t understand. The code itself isn’t the issue; it’s finding the right answer to ontological and teleological questions. What _is_ Ford? What will it be in a hundred years? I’m confident Ford Fusion is more similar than its predecessor to the Ford of 2120, because it’s smaller, more functional, and easier to understand and administer.
225
225
226As an engineering discipline and organizational practice, working on a system intended to be frozen yields surprising simplifications like this every so often. Urbit is now reaching the point where we’re starting to see more of the obsidian edges of the frozen future system emerge from the lava.
226As an engineering discipline and organizational practice, working on a system intended to be frozen yields surprising simplifications like this every so often. Urbit is now reaching the point where we’re starting to see more of the obsidian edges of the frozen future system emerge from the lava.
content/blog/gifts-q3-2020.md+6−4
@@ -1,14 +1,16 @@
1+++
1+++
2title = "Gifts Q3 2020"
2title = "Gifts Q3 2020"
3−date = 2020-09-23
3+date = "2020-09-22"
4description = "Twice a year we distribute address space to those that have made valuable contributions to Urbit. Now called our Gifts program, the gifting of address space has been part of Urbit long before we had a grants program."
4description = "Twice a year we distribute address space to those that have made valuable contributions to Urbit. Now called our Gifts program, the gifting of address space has been part of Urbit long before we had a grants program."
5+
5[taxonomies]
6[taxonomies]
6−grant_type = ["Gift"]
7+grant_type = [ "Gift" ]
7−grant_category = []
8+grant_category = [ ]
9+
8[extra]
10[extra]
9author = "Josh Lehman"
11author = "Josh Lehman"
10ship = "~wolref-podlex"
12ship = "~wolref-podlex"
11−image ="https://media.urbit.org/site/posts/essays/gifts.png"
13+image = "https://media.urbit.org/site/posts/essays/gifts.png"
12+++
14+++
13
15
14<br>
16<br>
content/blog/governance-of-urbit.md+7−2
@@ -1,12 +1,17 @@
1+++
1+++
2title = "Governance of urbit.org"
2title = "Governance of urbit.org"
3−date = 2019-01-11
3+date = "2019-01-10"
4description = "Stewardship of the Urbit Project."
4description = "Stewardship of the Urbit Project."
5+aliases = [
5−aliases = ["/posts/essays/governance-of-urbit", "/posts/governance-of-urbit"]
6+ "/posts/essays/governance-of-urbit",
7+ "/posts/governance-of-urbit"
8+]
9+
6[extra]
10[extra]
7author = "Erik Newton"
11author = "Erik Newton"
8ship = "~patnes-rigtyn"
12ship = "~patnes-rigtyn"
9+++
13+++
14+
10![](https://storage.googleapis.com/media.urbit.org/site/governance-1.svg)
15![](https://storage.googleapis.com/media.urbit.org/site/governance-1.svg)
11
16
12## Summary
17## Summary
content/blog/hackathon-results.md+11−15
@@ -1,11 +1,12 @@
1+++
1+++
2title = "Hackathon Results"
2title = "Hackathon Results"
3−date = 2020-06-12
3+date = "2020-06-11"
4description = "We recently held an invite-only Urbit Hackathon for graduates of our Hoon School program, and the submissions really impressed us across the board. Submissions were judged on several criteria: creativity, usefulness, and code quality."
4description = "We recently held an invite-only Urbit Hackathon for graduates of our Hoon School program, and the submissions really impressed us across the board. Submissions were judged on several criteria: creativity, usefulness, and code quality."
5+
5[extra]
6[extra]
6author = "Robert Mariani"
7author = "Robert Mariani"
7ship = "~lodleb-ritrul"
8ship = "~lodleb-ritrul"
8−image ="https://media.urbit.org/site/posts/essays/hackathon-results-wide.png"
9+image = "https://media.urbit.org/site/posts/essays/hackathon-results-wide.png"
9+++
10+++
10
11
11<br>
12<br>
@@ -16,52 +17,47 @@ image ="https://media.urbit.org/site/posts/essays/hackathon-results-wide.png"
16
17
17Results of the Urbit Hackathon
18Results of the Urbit Hackathon
18
19
19−We recently held an invite-only Urbit Hackathon for graduates of our Hoon School program, and the submissions really impressed us across the board. Submissions were judged on several criteria: creativity, usefulness, and code quality.
20+We recently held an invite-only Urbit Hackathon for graduates of our Hoon School program, and the submissions really impressed us across the board. Submissions were judged on several criteria: creativity, usefulness, and code quality.
20
21
21Congratulations to all the participants, especially the winners—their projects are seriously impressive.
22Congratulations to all the participants, especially the winners—their projects are seriously impressive.
22
23
23−
24### First Place: Eight Stars
24### First Place: Eight Stars
25
25
26−Jose’s `~norsyr-torryn` Canvas is a peer-to-peer, collaborative drawing app that comes in the form of a Landscape tile. It’s kind of like a multiplayer MS Paint, but better.
26+Jose’s `~norsyr-torryn` Canvas is a peer-to-peer, collaborative drawing app that comes in the form of a Landscape tile. It’s kind of like a multiplayer MS Paint, but better.
27
27
28Canvas uses Urbit in a way that we think it’s supposed to be used: the stuff that doesn’t require peer-to-peer or storage heavy lifting, such as the actual “drawing” component of the app, is done outside of Urbit.
28Canvas uses Urbit in a way that we think it’s supposed to be used: the stuff that doesn’t require peer-to-peer or storage heavy lifting, such as the actual “drawing” component of the app, is done outside of Urbit.
29
29
30In addition to a freehand template for the classic Paint experience, you can choose from a number of templates to work with, such as a grid of fillable hexagons, or maps of parts of the world and of continents with fillable country divisions. Have you ever wanted to compare which countries you visited, color-coded for how much you liked them? Canvas has a built-in feature for sharing your work on chats in Landscape.
30In addition to a freehand template for the classic Paint experience, you can choose from a number of templates to work with, such as a grid of fillable hexagons, or maps of parts of the world and of continents with fillable country divisions. Have you ever wanted to compare which countries you visited, color-coded for how much you liked them? Canvas has a built-in feature for sharing your work on chats in Landscape.
31
31
32−Check out a video [demonstration](https://www.youtube.com/watch?v=S6DySv730Hw) of Canvas, and view [the code](https://github.com/yosoyubik/canvas).
32+Check out a video [demonstration](https://www.youtube.com/watch?v=S6DySv730Hw) of Canvas, and view [the code](https://github.com/yosoyubik/canvas).
33
33
34Jose wins eight stars, and he also wins [le internet for the day](https://news.ycombinator.com/item?id=23228058). Bravo!
34Jose wins eight stars, and he also wins [le internet for the day](https://news.ycombinator.com/item?id=23228058). Bravo!
35
35
36−
37### Second Place: Four Stars Each
36### Second Place: Four Stars Each
38
37
39−Luke Champine’s (`~watter-parter`) flashcard app for Landscape, Rote, has been awarded one of two second-place prizes.
38+Luke Champine’s (`~watter-parter`) flashcard app for Landscape, Rote, has been awarded one of two second-place prizes.
40
39
41−Rote users write decks in udon, review them, and share them with other ships. His immaculate backend code-style and documentation secured his high placement in the Hackathon—his Hoon code also functions as a full-blown walkthrough. If you’re a Gall novice and you’re looking to learn, take a look at his [code](https://github.com/lukechampine/rote). Luke also kept a Notebook documenting his experience at `~watter-parter/hackathon`.
40+Rote users write decks in udon, review them, and share them with other ships. His immaculate backend code-style and documentation secured his high placement in the Hackathon—his Hoon code also functions as a full-blown walkthrough. If you’re a Gall novice and you’re looking to learn, take a look at his [code](https://github.com/lukechampine/rote). Luke also kept a Notebook documenting his experience at `~watter-parter/hackathon`.
42
41
43Luke also included example decks for flashcards on Hoon runes and their irregular forms. So, all said and done, everything about Rote is an excellent resource to the eager Hoon neophyte.
42Luke also included example decks for flashcards on Hoon runes and their irregular forms. So, all said and done, everything about Rote is an excellent resource to the eager Hoon neophyte.
44
43
45Pyry Kovanen (`~dinleb-rambep`) was also awarded second prize for his reading-list-sharing app, Books. Also a Landscape tile, and it’s pretty darn useful, with the ability to import books from Goodreads. Check out [the code](https://github.com/pkova/urbit/tree/books/pkg/interface/books) and the [video demo](https://youtu.be/Spy7FoPdfx8).
44Pyry Kovanen (`~dinleb-rambep`) was also awarded second prize for his reading-list-sharing app, Books. Also a Landscape tile, and it’s pretty darn useful, with the ability to import books from Goodreads. Check out [the code](https://github.com/pkova/urbit/tree/books/pkg/interface/books) and the [video demo](https://youtu.be/Spy7FoPdfx8).
46
45
47−
48### Third Place: Two Stars Each
46### Third Place: Two Stars Each
49
47
50−
51−N E Davis (`~lagrev-nocfep`) brought the heavy infrastructural artillery with Roessler, and won third prize. Roessler is actually three related Hoon tools:
48+N E Davis (`~lagrev-nocfep`) brought the heavy infrastructural artillery with Roessler, and won third prize. Roessler is actually three related Hoon tools:
52`roessler` proper, a library for solving the differential equations producing the [Roessler attractor](https://en.wikipedia.org/wiki/R%C3%B6ssler_attractor).
49`roessler` proper, a library for solving the differential equations producing the [Roessler attractor](https://en.wikipedia.org/wiki/R%C3%B6ssler_attractor).
53`lazytrig`, a library for transcendental functions.
50`lazytrig`, a library for transcendental functions.
54−`proj-3d`, a generator that takes the 3D coordinates produced by `Roessler`.
51+`proj-3d`, a generator that takes the 3D coordinates produced by `Roessler`.
55
52
56The Roessler project is full of cool, novel features. You might enjoy taking a look at the [GitHub repo](https://github.com/sigilante/roessler) ...if your brain is big enough.
53The Roessler project is full of cool, novel features. You might enjoy taking a look at the [GitHub repo](https://github.com/sigilante/roessler) ...if your brain is big enough.
57
54
58John Franklin (`~dirwex-dosrev`) also secured third place for his Notes application. True to its name, it’s a Landscape tile that allows the user to create and search notes by keyword. Look at the [code](https://github.com/jfranklin9000/notes/) and the [demo video](https://www.youtube.com/watch?v=7DurNjCFOmA).
55John Franklin (`~dirwex-dosrev`) also secured third place for his Notes application. True to its name, it’s a Landscape tile that allows the user to create and search notes by keyword. Look at the [code](https://github.com/jfranklin9000/notes/) and the [demo video](https://www.youtube.com/watch?v=7DurNjCFOmA).
59
56
60−Jon (`~ribnes-fonbex`) was awarded third prize for his Quadratic Voting project. It implements for Urbit ships a [quadratic voting system](https://en.wikipedia.org/wiki/Quadratic_voting), which is sort of like ranked-choice voting but allows people to express their stronger preferences.
57+Jon (`~ribnes-fonbex`) was awarded third prize for his Quadratic Voting project. It implements for Urbit ships a [quadratic voting system](https://en.wikipedia.org/wiki/Quadratic_voting), which is sort of like ranked-choice voting but allows people to express their stronger preferences.
61
58
62Congratulations to the winners and to everyone who submitted—nice work!
59Congratulations to the winners and to everyone who submitted—nice work!
63
60
64−
65### The Future
61### The Future
66
62
67We were thoroughly impressed with all of the projects from this inaugural Hackathon. Not only did this Hackathon demonstrate the talent and dedication of our community members, it’s an encouraging sign about the maturity of the Urbit system. We’re going to hold more Hackathons in the future, with one big change: they will be open to anyone who applies.
63We were thoroughly impressed with all of the projects from this inaugural Hackathon. Not only did this Hackathon demonstrate the talent and dedication of our community members, it’s an encouraging sign about the maturity of the Urbit system. We’re going to hold more Hackathons in the future, with one big change: they will be open to anyone who applies.
content/blog/hosting-the-future.md+7−6
@@ -1,11 +1,12 @@
1+++
1+++
2title = "Hosting the Future"
2title = "Hosting the Future"
3−date = 2020-10-01
3+date = "2020-09-30"
4description = "The way we see it, hosting is the most important thing, next to Landscape, that Tlon can do to help Urbit continue toward widespread adoption."
4description = "The way we see it, hosting is the most important thing, next to Landscape, that Tlon can do to help Urbit continue toward widespread adoption."
5+
5[extra]
6[extra]
6author = "Nick Simmons"
7author = "Nick Simmons"
7ship = "~simfur-ritwed"
8ship = "~simfur-ritwed"
8−image ="https://storage.googleapis.com/media.urbit.org/site/posts/essays/200930-hosting-by-tlon.jpg"
9+image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/200930-hosting-by-tlon.jpg"
9+++
10+++
10
11
11<br>
12<br>
@@ -16,13 +17,13 @@ image ="https://storage.googleapis.com/media.urbit.org/site/posts/essays/200930-
16
17
17Urbit users tend to be interesting, creative, and capable people; we’re genuinely impressed with the communities that have formed on the network, and with the quality of discourse there. But for the number of communities to continue to grow, getting on the network has to become dramatically easier. It’s not realistic to expect most people to configure their own Urbit OS node in the command line.
18Urbit users tend to be interesting, creative, and capable people; we’re genuinely impressed with the communities that have formed on the network, and with the quality of discourse there. But for the number of communities to continue to grow, getting on the network has to become dramatically easier. It’s not realistic to expect most people to configure their own Urbit OS node in the command line.
18
19
19−At the moment, the biggest lever we have here is to help ordinary users get online, so they can participate in communities inside Urbit, and eventually form their own. This means hosting their Urbit nodes and showing them around the network when they first arrive. There are already several businesses overlapping with this space to varying degrees: [planet.market](https://planet.market/), [urth.systems](https://urth.systems/), and [geturbitid](https://www.geturbitid.com/). Now, Tlon is releasing its own hosting offering. For the uninitiated, “Hosting” just means that we run your urbit ship for you, making it easier for you to get onto the network. We’ve been testing our hosting service with friends and family for the past few months, and now we’re ready to bring it to the rest of the world.
20+At the moment, the biggest lever we have here is to help ordinary users get online, so they can participate in communities inside Urbit, and eventually form their own. This means hosting their Urbit nodes and showing them around the network when they first arrive. There are already several businesses overlapping with this space to varying degrees: [planet.market](https://planet.market/), [urth.systems](https://urth.systems/), and [geturbitid](https://www.geturbitid.com/). Now, Tlon is releasing its own hosting offering. For the uninitiated, “Hosting” just means that we run your urbit ship for you, making it easier for you to get onto the network. We’ve been testing our hosting service with friends and family for the past few months, and now we’re ready to bring it to the rest of the world.
20
21
21−To learn more about Tlon hosting and sign up for the waiting list, check out the new [tlon.io](https://tlon.io/) website. We are officially launching the service on October 9th, with a virtual event and demo; we’ll also show off some of the new features and improvements to Landscape, the Urbit web client.
22+To learn more about Tlon hosting and sign up for the waiting list, check out the new [tlon.io](https://tlon.io/) website. We are officially launching the service on October 9th, with a virtual event and demo; we’ll also show off some of the new features and improvements to Landscape, the Urbit web client.
22
23
23To be very clear, hosting isn’t for everyone; if you’re deeply security-conscious or privacy-oriented, you’ll still want to self-host so that nobody else needs to touch your keys. That said, hosting isn’t a walled garden; you’ll get a planet when you sign up for hosting, which you will own 100% and forever. You’ll also always have the option to roll up your data and take it with you if you choose to stop using our service. Your Urbit data is just a single file, and we’ll happily hand it back to you if you ever decide to leave. Nothing will ever stop you from self-hosting.
24To be very clear, hosting isn’t for everyone; if you’re deeply security-conscious or privacy-oriented, you’ll still want to self-host so that nobody else needs to touch your keys. That said, hosting isn’t a walled garden; you’ll get a planet when you sign up for hosting, which you will own 100% and forever. You’ll also always have the option to roll up your data and take it with you if you choose to stop using our service. Your Urbit data is just a single file, and we’ll happily hand it back to you if you ever decide to leave. Nothing will ever stop you from self-hosting.
24
25
25−We’ve talked for a while about how the ultimate destiny of Urbit is to escape the control of Tlon. For Urbit to really succeed, it has to be managed by its own community. We started Tlon in order to solidify the foundation of this young platform. Now that Urbit is starting to grow up, Tlon and Urbit will naturally drift apart a bit.
26+We’ve talked for a while about how the ultimate destiny of Urbit is to escape the control of Tlon. For Urbit to really succeed, it has to be managed by its own community. We started Tlon in order to solidify the foundation of this young platform. Now that Urbit is starting to grow up, Tlon and Urbit will naturally drift apart a bit.
26
27
27Urbit is meant to be universal, ubiquitous infrastructure. Tlon exists to make that infrastructure useful and usable. We expect Urbit, as a platform, to be cared for by the community in collaboration with the emerging [Urbit Foundation](https://urbit.org/blog/first-steps-towards-urbit-org/). We intend Tlon to become increasingly focussed on providing a great user experience for anyone interested in this new network, so the network can continue to grow and thrive.
28Urbit is meant to be universal, ubiquitous infrastructure. Tlon exists to make that infrastructure useful and usable. We expect Urbit, as a platform, to be cared for by the community in collaboration with the emerging [Urbit Foundation](https://urbit.org/blog/first-steps-towards-urbit-org/). We intend Tlon to become increasingly focussed on providing a great user experience for anyone interested in this new network, so the network can continue to grow and thrive.
28
29
@@ -30,4 +31,4 @@ The way we see it, hosting is the most important thing, next to Landscape, that
30
31
31If you’re curious to keep up with what Tlon is doing here, head to [tlon.io](https://tlon.io) and join the waiting list. We’ll be posting updates to that list as well as to the Tlon Transmissions notebook in the Urbit Community group. Going forward we’ll do our best to keep urbit.org neutral and focussed on the technology itself.
32If you’re curious to keep up with what Tlon is doing here, head to [tlon.io](https://tlon.io) and join the waiting list. We’ll be posting updates to that list as well as to the Tlon Transmissions notebook in the Urbit Community group. Going forward we’ll do our best to keep urbit.org neutral and focussed on the technology itself.
32
33
33−See you all on the network!
34+See you all on the network!
content/blog/infrastructural.md+10−9
@@ -1,11 +1,12 @@
1+++
1+++
2title = "Infrastructural"
2title = "Infrastructural"
3−date = 2020-04-10
3+date = "2020-04-09"
4description = "A reflection–meditation on OS 1’s initial form development, and the attitude we brought to bear in designing it."
4description = "A reflection–meditation on OS 1’s initial form development, and the attitude we brought to bear in designing it."
5+
5[extra]
6[extra]
6author = "É. Urcades"
7author = "É. Urcades"
7ship = "~fabled-faster"
8ship = "~fabled-faster"
8−image ="https://media.urbit.org/site/posts/essays/infrastructural-2.jpg"
9+image = "https://media.urbit.org/site/posts/essays/infrastructural-2.jpg"
9+++
10+++
10
11
11<br>
12<br>
@@ -26,9 +27,9 @@ This post serves as a reflection–meditation on OS 1’s initial form developme
26
27
27## Products
28## Products
28
29
29−Urbit’s interfaces, and the process by which we build them, are resolutely not projections of the world’s current conception of digital design—that of mass digital product design. Products are sold, bought, and discarded as they are in their physical sense. Digital products are slotted into the [vending machines](https://urcad.es/writing/personal-computer-vending-machine/) we call our phones and are mass produced as candy is produced. Candy is *essentially* free, and contemporary digital products are *absolutely* free of cost. If you’re reading this, you probably already have a good idea of what free corporate digital products mean for your privacy.
30+Urbit’s interfaces, and the process by which we build them, are resolutely not projections of the world’s current conception of digital design—that of mass digital product design. Products are sold, bought, and discarded as they are in their physical sense. Digital products are slotted into the [vending machines](https://urcad.es/writing/personal-computer-vending-machine/) we call our phones and are mass produced as candy is produced. Candy is _essentially_ free, and contemporary digital products are _absolutely_ free of cost. If you’re reading this, you probably already have a good idea of what free corporate digital products mean for your privacy.
30
31
31−Urbit is distinctly *not* free (as in freely offered as a service via a corporate entity), and your urbit is distinctly *not* a product. As we trace over the interfaces we design with our cursors, we’re not building a product, we’re not selling a product, we’re not painting a product, and we’re certainly not decorating a product.
32+Urbit is distinctly _not_ free (as in freely offered as a service via a corporate entity), and your urbit is distinctly _not_ a product. As we trace over the interfaces we design with our cursors, we’re not building a product, we’re not selling a product, we’re not painting a product, and we’re certainly not decorating a product.
32
33
33Here at Tlon, we’re assembling thoughtful infrastructure you can spend your life using, learning, and extending. We’re attempting to assemble spaces you can one day pass on to friends, close collaborators, or possibly your grandchildren. We are resolute in our practice and stay our hands to the greatest degree possible as a result of this mindset.
34Here at Tlon, we’re assembling thoughtful infrastructure you can spend your life using, learning, and extending. We’re attempting to assemble spaces you can one day pass on to friends, close collaborators, or possibly your grandchildren. We are resolute in our practice and stay our hands to the greatest degree possible as a result of this mindset.
34
35
@@ -40,17 +41,17 @@ OS 1, while incremental in its initial expression from OS 0, serves to outline o
40
41
41**Beautiful infrastructure is a gravitational force**. Even if you can’t feel it or directly experience it, well-designed infrastructure is a cohering force. One is grounded with respect to the infrastructure they live alongside.
42**Beautiful infrastructure is a gravitational force**. Even if you can’t feel it or directly experience it, well-designed infrastructure is a cohering force. One is grounded with respect to the infrastructure they live alongside.
42
43
43−**Beautiful infrastructure is like a [shell](https://en.wikipedia.org/wiki/Shell)**. Well-considered infrastructural projects provide durable, generalized, reusable, and most importantly, *self-designed* containers around otherwise formless flows of information.
44+**Beautiful infrastructure is like a [shell](https://en.wikipedia.org/wiki/Shell)**. Well-considered infrastructural projects provide durable, generalized, reusable, and most importantly, _self-designed_ containers around otherwise formless flows of information.
44The current state of mass software design has gotten many of the “reusable” elements of design down pat, but these structures are optimized to pump ads and information into your brain, algorithmically-sorted-linear-feed style.
45The current state of mass software design has gotten many of the “reusable” elements of design down pat, but these structures are optimized to pump ads and information into your brain, algorithmically-sorted-linear-feed style.
45In Urbit, I can take the conceptual container of "temporal linearity" and use this to shape communication data as I see fit. I should be able to shape once-linear communication and cast it into a nodal communication model: My DM is now a MUD.
46In Urbit, I can take the conceptual container of "temporal linearity" and use this to shape communication data as I see fit. I should be able to shape once-linear communication and cast it into a nodal communication model: My DM is now a MUD.
46
47
47Truly beautiful infrastructure undergirds the daily exchanges people actually care about—I don’t drink plumbing, I drink the water it carries and protects.
48Truly beautiful infrastructure undergirds the daily exchanges people actually care about—I don’t drink plumbing, I drink the water it carries and protects.
48
49
49−Another way of thinking about “Infrastructure” (here defined loosely as “the *truly* essential structures that allow society at varying scales to operate”) is to think about it in terms of interpersonal support structure.
50+Another way of thinking about “Infrastructure” (here defined loosely as “the _truly_ essential structures that allow society at varying scales to operate”) is to think about it in terms of interpersonal support structure.
50
51
51We deeply hope that Urbit can form a support structure for you and your community.
52We deeply hope that Urbit can form a support structure for you and your community.
52
53
53−These self-evident statements underlie the core problems we sought to address in designing a userspace for OS 1: How do we design an *actually* personal digital infrastructure? What does infrastructure look like when shared with immediate friends? With a cooperative organization? How can we impress upon Urbit's earliest adopters that once they've obtained an Urbit ID, their computer is at that moment *literally* entirely theirs?
54+These self-evident statements underlie the core problems we sought to address in designing a userspace for OS 1: How do we design an _actually_ personal digital infrastructure? What does infrastructure look like when shared with immediate friends? With a cooperative organization? How can we impress upon Urbit's earliest adopters that once they've obtained an Urbit ID, their computer is at that moment _literally_ entirely theirs?
54
55
55<br>
56<br>
56
57
@@ -62,7 +63,7 @@ These self-evident statements underlie the core problems we sought to address in
62
63
63OS 1 was optimized from an interface design standpoint to ensure that a new inhabitant viscerally felt like there was a “space to inhabit”, or a “canvas to be painted”, or a set of simple and fundamental digital structures they could arrange to make their computer their own.
64OS 1 was optimized from an interface design standpoint to ensure that a new inhabitant viscerally felt like there was a “space to inhabit”, or a “canvas to be painted”, or a set of simple and fundamental digital structures they could arrange to make their computer their own.
64
65
65−Counterintuitively, designing around this notion of a "rich blank slate” required OS 1 to be designed in a manner that *almost* results in it feeling incomplete, or on the verge of appearing deeply unremarkable.
66+Counterintuitively, designing around this notion of a "rich blank slate” required OS 1 to be designed in a manner that _almost_ results in it feeling incomplete, or on the verge of appearing deeply unremarkable.
66
67
67A few key design decisions emphasized the above gestalt we sought to express:
68A few key design decisions emphasized the above gestalt we sought to express:
68
69
@@ -75,4 +76,4 @@ Many other small constraints have been set into place to build what we truly bel
75
76
76While visually primitive, OS 1 has managed to manifest a rich systematic expressiveness based on how it seems to be currently inhabited. We've been enjoying witnessing the ways people are beginning to interpret and make use of the faculties provided to create communal computing experiences of their own.
77While visually primitive, OS 1 has managed to manifest a rich systematic expressiveness based on how it seems to be currently inhabited. We've been enjoying witnessing the ways people are beginning to interpret and make use of the faculties provided to create communal computing experiences of their own.
77
78
78−What's most wonderful to observe is the fun people are having in striking out on their own in this collective endeavor. More than anything, we hope Urbit’s inhabitants are having a good time and learning to enjoy computers again.
79+What's most wonderful to observe is the fun people are having in striking out on their own in this collective endeavor. More than anything, we hope Urbit’s inhabitants are having a good time and learning to enjoy computers again.
content/blog/interim-constitution.md+28−27
@@ -1,8 +1,9 @@
1+++
1+++
2title = "Interim Constitution"
2title = "Interim Constitution"
3−date = 2016-05-16
3+date = "2016-05-15"
4description = "The governing rules for the early days of the Urbit network."
4description = "The governing rules for the early days of the Urbit network."
5−aliases = ["/posts/essays/interim-constitution", "/posts/constitution"]
5+aliases = [ "/posts/essays/interim-constitution", "/posts/constitution" ]
6+
6[extra]
7[extra]
7author = "Tlon"
8author = "Tlon"
8ship = ""
9ship = ""
@@ -13,17 +14,17 @@ image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/interi
13
14
14## Declaration of purpose
15## Declaration of purpose
15
16
16−Urbit is a new network created by the Tlon Corporation. Tlon's
17+Urbit is a new network created by the Tlon Corporation. Tlon's
17broad intention is to surrender governance of Urbit to its users,
18broad intention is to surrender governance of Urbit to its users,
18as soon as the community is collectively ready to receive it.
19as soon as the community is collectively ready to receive it.
19
20
20This constitution (which is not a legal contract, just our present
21This constitution (which is not a legal contract, just our present
21intent, which may be updated arbitrarily) describes our governance
22intent, which may be updated arbitrarily) describes our governance
22−process during this interim period. Its design borrows from validated
23+process during this interim period. Its design borrows from validated
23historical structures, mainly Roman and Anglo-American.
24historical structures, mainly Roman and Anglo-American.
24
25
25The last and most important task of the interim government is to
26The last and most important task of the interim government is to
26−write the next version of the constitution. This document may or
27+write the next version of the constitution. This document may or
27may not incorporate any or all of the interim structures.
28may not incorporate any or all of the interim structures.
28
29
29## Beliefs and principles
30## Beliefs and principles
@@ -36,15 +37,15 @@ The interim republic has four branches: an executive consulate, a
36galactic senate, a stellar congress and a planetary assembly.
37galactic senate, a stellar congress and a planetary assembly.
37
38
38For the interim, full authority is held by the (Roman style)
39For the interim, full authority is held by the (Roman style)
39−consulate. The legislature (senate, congress, assembly) is
40+consulate. The legislature (senate, congress, assembly) is
40−advisory. The senate is never consulted and the congress is
41+advisory. The senate is never consulted and the congress is
41almost never consulted.
42almost never consulted.
42
43
43In the future, the assembly of planets specializes in technical
44In the future, the assembly of planets specializes in technical
44−governance. The congress of stars specializes in internal, but
45+governance. The congress of stars specializes in internal, but
45−nontechnical, governance. The senate of galaxies selects the
46+nontechnical, governance. The senate of galaxies selects the
46consuls and holds them accountable, and specializes in compliance
47consuls and holds them accountable, and specializes in compliance
47−with external powers. All votes, elections and other public
48+with external powers. All votes, elections and other public
48actions are logged in the Urbit global namespace.
49actions are logged in the Urbit global namespace.
49
50
50As in most parliamentary systems, each of these structures sets
51As in most parliamentary systems, each of these structures sets
@@ -52,29 +53,29 @@ and enforces its own internal rules of operation.
52
53
53### Consulate
54### Consulate
54
55
55−A consulate is a two-person executive. The consuls must work out
56+A consulate is a two-person executive. The consuls must work out
56−their own organization and division of labor. Disagreements
57+their own organization and division of labor. Disagreements
57between consuls are resolved by the senate.
58between consuls are resolved by the senate.
58
59
59−A consul must be a senator. The senate, voting per galaxy,
60+A consul must be a senator. The senate, voting per galaxy,
60replaces the consulate whenever either a vacancy exists, or a
61replaces the consulate whenever either a vacancy exists, or a
61−vote of no confidence gains a majority. When electing consuls,
62+vote of no confidence gains a majority. When electing consuls,
62first a plurality selects one consul; then the plurality of those
63first a plurality selects one consul; then the plurality of those
63who voted for anyone but the winner selects the second.
64who voted for anyone but the winner selects the second.
64
65
65### Senate
66### Senate
66
67
67The _senate_ is the set of all galaxy holders, voting per galaxy.
68The _senate_ is the set of all galaxy holders, voting per galaxy.
68−It does not convene except to replace the consuls. Its
69+It does not convene except to replace the consuls. Its
69proceedings are in private.
70proceedings are in private.
70
71
71To avoid growing the network too quickly, galaxies are activated
72To avoid growing the network too quickly, galaxies are activated
72−gradually. Initially, only one galaxy is active, the root `~zod`
73+gradually. Initially, only one galaxy is active, the root `~zod`
73(galaxy 0).
74(galaxy 0).
74
75
75Further activation is at the discretion of the consuls, who
76Further activation is at the discretion of the consuls, who
76control `urbit.org` and will only bind activated galaxies to
77control `urbit.org` and will only bind activated galaxies to
77−`galaxy.urbit.org`. Routing at the galaxy layer is by DNS, so
78+`galaxy.urbit.org`. Routing at the galaxy layer is by DNS, so
78unbound galaxies, and any stars or planets they launch, hear no
79unbound galaxies, and any stars or planets they launch, hear no
79packets.
80packets.
80
81
@@ -85,36 +86,36 @@ Non-activated galaxies can still be rekeyed.
85### Congress
86### Congress
86
87
87The _congress_ is the set of all active independent stars.
88The _congress_ is the set of all active independent stars.
88−voting per star. An _independent star_ is any star _not_ owned
89+voting per star. An _independent star_ is any star _not_ owned
89by anyone who is either a senator, or has some connection to one
90by anyone who is either a senator, or has some connection to one
90that would pose a conflict of interest.
91that would pose a conflict of interest.
91
92
92The congress of stars is designed to exercise project and
93The congress of stars is designed to exercise project and
93−community governance. Its proceedings are in private. The
94+community governance. Its proceedings are in private. The
94consuls convene it at their pleasure, and keep it informed.
95consuls convene it at their pleasure, and keep it informed.
95
96
96### Assembly
97### Assembly
97
98
98The _assembly_ is the set of all active primary planets, voting
99The _assembly_ is the set of all active primary planets, voting
99−per planet. A _primary planet_ is the main planet of a unique
100+per planet. A _primary planet_ is the main planet of a unique
100human (no sockpuppets).
101human (no sockpuppets).
101
102
102−The assembly is responsible for technical governance. Its
103+The assembly is responsible for technical governance. Its
103proceedings are in public.
104proceedings are in public.
104
105
105### The next constitution
106### The next constitution
106
107
107The congress proposes, and the senate approves, the next version
108The congress proposes, and the senate approves, the next version
108−of this constitution. Future constitutions should be defined in
109+of this constitution. Future constitutions should be defined in
109a smart contract platform, such as Ethereum.
110a smart contract platform, such as Ethereum.
110
111
111## Galaxy table
112## Galaxy table
112
113
113−95 galaxies are held by the [Tlon Corporation](https://tlon.io/). 50,
114+95 galaxies are held by the [Tlon Corporation](https://tlon.io/). 50,
114−reserved for urbit.org, the future community foundation. 40, by
115+reserved for urbit.org, the future community foundation. 40, by
115Tlon employees and their family members (24 by Curtis, who
116Tlon employees and their family members (24 by Curtis, who
116−started in 2002; 16 by everyone else, who started in 2014). 34,
117+started in 2002; 16 by everyone else, who started in 2014). 34,
117−by outside investors in Tlon. 37, by 33 other individuals, who
118+by outside investors in Tlon. 37, by 33 other individuals, who
118donated to the project, contributed code or services, won a
119donated to the project, contributed code or services, won a
119contest, or were just at the right place at the right time.
120contest, or were just at the right place at the right time.
120
121
@@ -134,7 +135,7 @@ intended as property of the republic, and will be used only in
134the interests of the republic and Urbit as a whole.
135the interests of the republic and Urbit as a whole.
135
136
136Externally, these galaxies are held by Tlon; internally, they are
137Externally, these galaxies are held by Tlon; internally, they are
137−managed and voted by Tlon. Once the republic acquires a legal
138+managed and voted by Tlon. Once the republic acquires a legal
138identity and an independent human organization, Tlon pledges to
139identity and an independent human organization, Tlon pledges to
139donate the `urbit.org` galaxies, the DNS domain, and the GitHub
140donate the `urbit.org` galaxies, the DNS domain, and the GitHub
140`urbit` account to it.
141`urbit` account to it.
content/blog/interplanetary_commerce.md+5−4
@@ -1,7 +1,8 @@
1+++
1+++
2title = "Interplanetary Commerce"
2title = "Interplanetary Commerce"
3−date = 2021-04-09
3+date = "2021-04-08"
4description = "OS-level commercial primitives."
4description = "OS-level commercial primitives."
5+
5[extra]
6[extra]
6author = "Christian Langalis"
7author = "Christian Langalis"
7ship = "~pindet-timmut"
8ship = "~pindet-timmut"
@@ -22,15 +23,15 @@ Things only accelerate from here. Our next objective, to integrate Lightning Net
22
23
23## Being Paid
24## Being Paid
24
25
25−>And there is all the difference in the world between paying and being paid. The act of paying is perhaps the most uncomfortable infliction that the two orchard thieves entailed upon us. But being paid,—what will compare with it?
26+> And there is all the difference in the world between paying and being paid. The act of paying is perhaps the most uncomfortable infliction that the two orchard thieves entailed upon us. But being paid,—what will compare with it?
26>
27>
27−><cite>Herman Melville</cite>
28+> <cite>Herman Melville</cite>
28
29
29However, a good wallet is only half the equation for a holistic P2P commercial experience. Interfaces for selling goods and services is the other half. While we don’t part with our Bitcoin [easily](https://nakamotoinstitute.org/mempool/everyones-a-scammer/), two initial markets appear logical and attractive: content and Urbit-native services.
30However, a good wallet is only half the equation for a holistic P2P commercial experience. Interfaces for selling goods and services is the other half. While we don’t part with our Bitcoin [easily](https://nakamotoinstitute.org/mempool/everyones-a-scammer/), two initial markets appear logical and attractive: content and Urbit-native services.
30
31
31First, digital cottage industry, the “creator economy”, is blossoming. Streaming, podcasting, and writing on platforms like Youtube, Patreon, and Substack has been big business [lately](https://otherlife.co/barbarians-past-the-gate/). What fintech did to “unbundle the banks", we will now do to media monopolies and their centralized distribution platforms. With the introduction of Urbit payments, you can syndicate, distribute, and monetize your media on Urbit. By selling access to a private group containing content, digital creatives can begin doing this today.
32First, digital cottage industry, the “creator economy”, is blossoming. Streaming, podcasting, and writing on platforms like Youtube, Patreon, and Substack has been big business [lately](https://otherlife.co/barbarians-past-the-gate/). What fintech did to “unbundle the banks", we will now do to media monopolies and their centralized distribution platforms. With the introduction of Urbit payments, you can syndicate, distribute, and monetize your media on Urbit. By selling access to a private group containing content, digital creatives can begin doing this today.
32
33
33−Second, Urbit-native [service providers](https://urbit.org/blog/providers/) are now operating at scale. Companies offering Urbit hosting, onboarding, Urbit IDs, and software now communicate with their customers directly on the network. A basic set of commercial tools will make their processes more efficient. Storefront interfaces, paywalls, CRM, and reputation tools will replace the ad-hoc assemblages they currently use.
34+Second, Urbit-native [service providers](https://urbit.org/blog/providers/) are now operating at scale. Companies offering Urbit hosting, onboarding, Urbit IDs, and software now communicate with their customers directly on the network. A basic set of commercial tools will make their processes more efficient. Storefront interfaces, paywalls, CRM, and reputation tools will replace the ad-hoc assemblages they currently use.
34
35
35The Urbit Foundation is soliciting contributors to this project through Urbit Grants. If you’re interested in working on any of these components [send us a proposal](https://grants.urbit.org/create).
36The Urbit Foundation is soliciting contributors to this project through Urbit Grants. If you’re interested in working on any of these components [send us a proposal](https://grants.urbit.org/create).
36
37
content/blog/introducing-os1.md+4−3
@@ -1,11 +1,12 @@
1+++
1+++
2title = "Introducing OS 1"
2title = "Introducing OS 1"
3−date = 2020-04-30
3+date = "2020-04-29"
4description = "OS 1 is somewhere between ‘productivity software’ and a ‘social network’. We think it’s the beginning of an altogether new breed of social computing."
4description = "OS 1 is somewhere between ‘productivity software’ and a ‘social network’. We think it’s the beginning of an altogether new breed of social computing."
5+
5[extra]
6[extra]
6author = "Galen Wolfe-Pauly"
7author = "Galen Wolfe-Pauly"
7ship = "~ravmel-ropdyl"
8ship = "~ravmel-ropdyl"
8−image ="https://media.urbit.org/site/posts/essays/intro-os1-landscape.png"
9+image = "https://media.urbit.org/site/posts/essays/intro-os1-landscape.png"
9+++
10+++
10
11
11<br>
12<br>
@@ -110,7 +111,7 @@ OS 1 is a first step down the road back to a system that’s simple, durable, an
110
111
111One really critical thing about OS 1 is the pattern of ‘groups sharing modules’. This pattern makes it perfectly clear how a virtual computer can outcompete a bunch of different services. As the collection of modules in OS 1 → N grows, we make it easier for others to contribute modules, and we increase the flexibility of connecting modules our system quickly outruns the messy, disconnected world we’re currently stuck in.
112One really critical thing about OS 1 is the pattern of ‘groups sharing modules’. This pattern makes it perfectly clear how a virtual computer can outcompete a bunch of different services. As the collection of modules in OS 1 → N grows, we make it easier for others to contribute modules, and we increase the flexibility of connecting modules our system quickly outruns the messy, disconnected world we’re currently stuck in.
112
113
113−OS 1 isn’t mature enough to be *easy* for outside contributors to add modules — but it is [open source](https://github.com/urbit/urbit), and anyone is welcome to tinker and experiment with modifying it. We run a [grants program](https://grants.urbit.org/) to reward contributors for improving any part of Urbit OS. As the system matures we expect this program to expand and accelerate.
114+OS 1 isn’t mature enough to be _easy_ for outside contributors to add modules — but it is [open source](https://github.com/urbit/urbit), and anyone is welcome to tinker and experiment with modifying it. We run a [grants program](https://grants.urbit.org/) to reward contributors for improving any part of Urbit OS. As the system matures we expect this program to expand and accelerate.
114
115
115## Looking ahead
116## Looking ahead
116
117
content/blog/io-in-hoon.md+3−3
@@ -1,7 +1,8 @@
1+++
1+++
2title = "Input and Output in Hoon"
2title = "Input and Output in Hoon"
3description = "Let's talk about IO in Urbit."
3description = "Let's talk about IO in Urbit."
4−date = 2020-12-16
4+date = "2020-12-15"
5+
5[extra]
6[extra]
6author = "Philip Monk"
7author = "Philip Monk"
7ship = "~wicdev-wisryt"
8ship = "~wicdev-wisryt"
@@ -14,7 +15,6 @@ image = "https://media.urbit.org/site/posts/essays/zion-canyon-1.jpg"
14
15
15<br>
16<br>
16
17
17−
18Let's talk about IO in Urbit. I won't say much about how events and effects are processed by the runtime; it suffices to note that the runtime is a normal Unix program which (1) listens for various events, (2) passes them to Arvo (Urbit OS), and (3) processes the effects produced by Arvo. Instead, I’ll focus on how IO works from the perspective of Hoon programs, like Arvo or apps running on Arvo. But first, let's review IO paradigms in other languages.
18Let's talk about IO in Urbit. I won't say much about how events and effects are processed by the runtime; it suffices to note that the runtime is a normal Unix program which (1) listens for various events, (2) passes them to Arvo (Urbit OS), and (3) processes the effects produced by Arvo. Instead, I’ll focus on how IO works from the perspective of Hoon programs, like Arvo or apps running on Arvo. But first, let's review IO paradigms in other languages.
19
19
20All examples are in a made-up language, since it's useful to understand this information even before you're comfortable in Hoon. If you're learning Hoon and want a challenge, try translating them!
20All examples are in a made-up language, since it's useful to understand this information even before you're comfortable in Hoon. If you're learning Hoon and want a challenge, try translating them!
@@ -35,7 +35,7 @@ For readability, intermediate variables would be a good idea, but nothing stops
35
35
36### Monadic IO
36### Monadic IO
37
37
38−Languages that use explicit monads for IO (such as Haskell) perform IO by running IO behind a bind operation, which I'll notate with `<-`. Thus, while you can't put IO *anywhere*, the general structure is a sequence of IO operations.
38+Languages that use explicit monads for IO (such as Haskell) perform IO by running IO behind a bind operation, which I'll notate with `<-`. Thus, while you can't put IO _anywhere_, the general structure is a sequence of IO operations.
39
39
40 fileName <- cliInput()
40 fileName <- cliInput()
41 url <- readFile(fileName)
41 url <- readFile(fileName)
content/blog/iot.md+4−3
@@ -1,7 +1,8 @@
1+++
1+++
2title = "Lunar Urbit and the Internet of Things"
2title = "Lunar Urbit and the Internet of Things"
3−date = 2021-04-30
3+date = "2021-04-29"
4description = "Potential future use cases of moons for industry and consumers"
4description = "Potential future use cases of moons for industry and consumers"
5+
5[extra]
6[extra]
6author = "Jonathan Paprocki"
7author = "Jonathan Paprocki"
7ship = "~datnut-pollen"
8ship = "~datnut-pollen"
@@ -441,8 +442,8 @@ microtransactions. On Mars, this task will be trivial, and is merely a stone's
441throw away from a vast and undiscovered universe of other possibilities unlocked
442throw away from a vast and undiscovered universe of other possibilities unlocked
442by SSI networks.
443by SSI networks.
443
444
444−
445+[^0]:
445−[^0]: Of course, all moon names have four words, not three. What the fourth word
446+ Of course, all moon names have four words, not three. What the fourth word
446 needs to be for only three words to display is a matter of Urbit lore that
447 needs to be for only three words to display is a matter of Urbit lore that
447 is more fun to discover yourself than have it told to you, so we won't spoil
448 is more fun to discover yourself than have it told to you, so we won't spoil
448 it here.
449 it here.
content/blog/landscape-a-portrait.md+10−6
@@ -1,8 +1,12 @@
1+++
1+++
2title = "Landscape: A Portrait"
2title = "Landscape: A Portrait"
3−date = 2019-09-03
3+date = "2019-09-02"
4description = "On the latest Urbit user interface, and the interfaces to come."
4description = "On the latest Urbit user interface, and the interfaces to come."
5+aliases = [
5−aliases = ["/posts/essays/landscape-a-portrait/", "/posts/landscape-a-portrait"]
6+ "/posts/essays/landscape-a-portrait/",
7+ "/posts/landscape-a-portrait"
8+]
9+
6[extra]
10[extra]
7author = "Matilde Park"
11author = "Matilde Park"
8ship = "~haddef-sigwen"
12ship = "~haddef-sigwen"
@@ -28,7 +32,7 @@ Urbit has been in “research mode” for most of its history, but the system ha
28
32
29Urbit’s kernel is graduating from its rebellious period, however its _userspace_ has remained embryonic for most of its history. The project of building an application model has been restarted and rescoped into _aspects_ that could weather the chaotic growth of the kernel, but it would never quite serve as an interface to the entire operating system. Due to one of our latest vane refactors, it’s becoming possible to start that work in earnest.
33Urbit’s kernel is graduating from its rebellious period, however its _userspace_ has remained embryonic for most of its history. The project of building an application model has been restarted and rescoped into _aspects_ that could weather the chaotic growth of the kernel, but it would never quite serve as an interface to the entire operating system. Due to one of our latest vane refactors, it’s becoming possible to start that work in earnest.
30
34
31−Alongside the latest release of Landscape came the rewrite of the [`%eyre`](https://urbit.org/docs/learn/arvo/eyre/) vane, which serves a ship’s files and applications over HTTP. Among the improvements came the decision to move from serving from one ‘/web’ folder by default to an application-specific endpoint.
35+Alongside the latest release of Landscape came the rewrite of the [`%eyre`](https://urbit.org/docs/learn/arvo/eyre/) vane, which serves a ship’s files and applications over HTTP. Among the improvements came the decision to move from serving from one ‘/web’ folder by default to an application-specific endpoint.
32
36
33That is, a Hoon application, upon being started, now tells Eyre it wants to serve _these files_ at _this endpoint_ over HTTP and Eyre facilitates that.
37That is, a Hoon application, upon being started, now tells Eyre it wants to serve _these files_ at _this endpoint_ over HTTP and Eyre facilitates that.
34
38
@@ -50,9 +54,9 @@ All of this is fantastic news; and while Landscape-oriented userspace developmen
50
54
51Among the inspirations for our team are [the tales of Andy Hertzfeld](https://www.folklore.org/StoryView.py?project=Macintosh&story=Were_Not_Hackers!.txt), working on the Macintosh, and ongoing [discussions](http://doc.cat-v.org/plan_9/4th_edition/papers/812/) and [decisions](https://research.swtch.com/help.pdf) that went into Plan 9 from Bell Labs. (Sometimes, for fun, we also watch videos about [the Xerox Alto](https://www.youtube.com/watch?v=tngrLvyiNEI).)
55Among the inspirations for our team are [the tales of Andy Hertzfeld](https://www.folklore.org/StoryView.py?project=Macintosh&story=Were_Not_Hackers!.txt), working on the Macintosh, and ongoing [discussions](http://doc.cat-v.org/plan_9/4th_edition/papers/812/) and [decisions](https://research.swtch.com/help.pdf) that went into Plan 9 from Bell Labs. (Sometimes, for fun, we also watch videos about [the Xerox Alto](https://www.youtube.com/watch?v=tngrLvyiNEI).)
52
56
53−These inspirations share that their creators were dealing with really primordial stuff – the font of human-computer interface had really just sprung and they were _seeing things no one had seen before_ because they _had to_.
57+These inspirations share that their creators were dealing with really primordial stuff – the font of human-computer interface had really just sprung and they were _seeing things no one had seen before_ because they _had to_.
54
58
55−Doing that now, after a lifetime of reflexive familiarity with the dominant solutions – from Apple’s macOS to Google’s Material Design – we have to do the work of _unseeing_. By engaging with what it was like to see for the first time, we get closer to seeing with fresh eyes. We work to avoid implicitly categorising the new territory as simply, well, comparative to the old one.
59+Doing that now, after a lifetime of reflexive familiarity with the dominant solutions – from Apple’s macOS to Google’s Material Design – we have to do the work of _unseeing_. By engaging with what it was like to see for the first time, we get closer to seeing with fresh eyes. We work to avoid implicitly categorising the new territory as simply, well, comparative to the old one.
56
60
57So, while it’s not the same to simply _read_ these dialogues, it can get us pretty close.
61So, while it’s not the same to simply _read_ these dialogues, it can get us pretty close.
58
62
@@ -66,7 +70,7 @@ So what do we think that new platform needs from its interface?
66
70
67- **Landscape, and all of Urbit’s future interfaces, need a way to easily organise around _cohorts_ of ships, or _groups_,** with shared applications or files and a socially-oriented computing experience in turn — [something always in the vision](https://urbit.org/posts/azimuth-is-on-chain/#aegean), but not quite implemented yet.
71- **Landscape, and all of Urbit’s future interfaces, need a way to easily organise around _cohorts_ of ships, or _groups_,** with shared applications or files and a socially-oriented computing experience in turn — [something always in the vision](https://urbit.org/posts/azimuth-is-on-chain/#aegean), but not quite implemented yet.
68
72
69−- Lastly, **Landscape, and all of Urbit’s future interfaces, need a userspace-specific, software design pattern** to integrate all of this: access to the file system, permissioning shared sets of files, and tying it together, an underlying representation of both data and interface amongst many computers.
73+- Lastly, **Landscape, and all of Urbit’s future interfaces, need a userspace-specific, software design pattern** to integrate all of this: access to the file system, permissioning shared sets of files, and tying it together, an underlying representation of both data and interface amongst many computers.
70
74
71No more siloed input/output in applications on a ‘timeshared computer’ with your redundant data always belonging to someone else.
75No more siloed input/output in applications on a ‘timeshared computer’ with your redundant data always belonging to someone else.
72
76
content/blog/magic.md+87−86
@@ -1,8 +1,9 @@
1+++
1+++
2title = "Magic"
2title = "Magic"
3−date = 2016-05-16
3+date = "2016-05-15"
4description = "A thought-experiment to explain the Urbit user experience."
4description = "A thought-experiment to explain the Urbit user experience."
5−aliases = ["/posts/essays/magic", "/posts/magic"]
5+aliases = [ "/posts/essays/magic", "/posts/magic" ]
6+
6[extra]
7[extra]
7author = "Curtis Yarvin"
8author = "Curtis Yarvin"
8ship = "~sorreg-namtyv"
9ship = "~sorreg-namtyv"
@@ -11,186 +12,186 @@ image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/magic.
11
12
12![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/magic.jpg)
13![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/magic.jpg)
13
14
14−It's easy to get too obsessed with Urbit's alien technology. We
15+It's easy to get too obsessed with Urbit's alien technology. We
15−didn't build Urbit for its tech. We built it for people to use.
16+didn't build Urbit for its tech. We built it for people to use.
16
17
17It's also hard to understand the power of Urbit, because it's
18It's also hard to understand the power of Urbit, because it's
18−still quite immature. Unless you understand it already, it's
19+still quite immature. Unless you understand it already, it's
19just a weird OS that doesn't work all that well.
20just a weird OS that doesn't work all that well.
20
21
21And this OS is supposedly designed as a new kind of product: a
22And this OS is supposedly designed as a new kind of product: a
22−personal server. What is a personal server? If you had one,
23+personal server. What is a personal server? If you had one,
23−you'd know. Since you don't, you don't. So both your problem
24+you'd know. Since you don't, you don't. So both your problem
24and our solution are totally unclear.
25and our solution are totally unclear.
25
26
26One way to understand Urbit is to forget the technology totally.
27One way to understand Urbit is to forget the technology totally.
27−Instead, let's build the same product out of magic. Technology
28+Instead, let's build the same product out of magic. Technology
28−is hard and imperfect and slow. Magic is easy and perfect and
29+is hard and imperfect and slow. Magic is easy and perfect and
29−fast. Why not use it? At least for a demo?
30+fast. Why not use it? At least for a demo?
30
31
31## Magic step one: total integration.
32## Magic step one: total integration.
32
33
33Make a list of all the cloud apps which have your personal data.
34Make a list of all the cloud apps which have your personal data.
34−OK, just imagine making a list. OK, use magic.
35+OK, just imagine making a list. OK, use magic.
35
36
36−By magic, we make some giant company buy all these apps. It
37+By magic, we make some giant company buy all these apps. It
37−could be any of them, but let's say it's Facebook. Facebook buys
38+could be any of them, but let's say it's Facebook. Facebook buys
38−_all the apps_. As of now, _all your cloud computing happens in
39+_all the apps_. As of now, _all your cloud computing happens in
39your Facebook profile_.
40your Facebook profile_.
40
41
41Your Facebook is now your Dropbox and your Evernote and your
42Your Facebook is now your Dropbox and your Evernote and your
42−Wordpress and your Gmail. And it's not just Web apps; all your
43+Wordpress and your Gmail. And it's not just Web apps; all your
43−servers move to Facebook. Your Nest talks to a Facebook server.
44+servers move to Facebook. Your Nest talks to a Facebook server.
44−Your iPhone talks to Facebook instead of iCloud. Your Fitbit
45+Your iPhone talks to Facebook instead of iCloud. Your Fitbit
45−records your heart rate in a Facebook log. Your Facebook
46+records your heart rate in a Facebook log. Your Facebook
46−manages your finances and pays your bills. Got bitcoin?
47+manages your finances and pays your bills. Got bitcoin?
47−Facebook is your wallet. Shop online? Check out the Facebook
48+Facebook is your wallet. Shop online? Check out the Facebook
48Store -- it sells everything!
49Store -- it sells everything!
49
50
50−In short, you can just lock your browser to `facebook.com`. The
51+In short, you can just lock your browser to `facebook.com`. The
51−Web is dead. Or more precisely, it's an obsolete protocol which
52+Web is dead. Or more precisely, it's an obsolete protocol which
52you use to log in to Facebook.
53you use to log in to Facebook.
53
54
54−Does this sound creepy? Sure. It's incredibly creepy. But look
55+Does this sound creepy? Sure. It's incredibly creepy. But look
55−on the bright side: it's also incredibly convenient. (And
56+on the bright side: it's also incredibly convenient. (And
56incredibly secure, at least with a 2-factor key.)
57incredibly secure, at least with a 2-factor key.)
57
58
58−For the first time ever, _all your data is in one place_. For
59+For the first time ever, _all your data is in one place_. For
59example, the engineers at Facebook, who are awesome, would never
60example, the engineers at Facebook, who are awesome, would never
60leave Dropbox, Instagram and iCloud as three separate things.
61leave Dropbox, Instagram and iCloud as three separate things.
61−You don't need an "integration" between them. Your profile is
62+You don't need an "integration" between them. Your profile is
62−one thing: you. Your entire digital life.
63+one thing: you. Your entire digital life.
63
64
64(In fact, if you're a geek and have Unix boxes, your Facebook is
65(In fact, if you're a geek and have Unix boxes, your Facebook is
65−magically integrated with Unix. You can just open your laptop
66+magically integrated with Unix. You can just open your laptop
66and type `ls /photos/2016/May/` -- as if your digital life was a
67and type `ls /photos/2016/May/` -- as if your digital life was a
67chip in a box in your backpack, not redundant servers in multiple
68chip in a box in your backpack, not redundant servers in multiple
68secure data centers.)
69secure data centers.)
69
70
70Imagine we all lived in hotels, all the time, even in just one
71Imagine we all lived in hotels, all the time, even in just one
71−city. Imagine you don't even have one room with a long-term
72+city. Imagine you don't even have one room with a long-term
72−lease. You sleep in one pod Mondays, another on Tuesdays...
73+lease. You sleep in one pod Mondays, another on Tuesdays...
73−then, someone offers you a home. Your own house. With your own
74+then, someone offers you a home. Your own house. With your own
74furniture, your own books in your own bookcases...
75furniture, your own books in your own bookcases...
75
76
76## Magic step two: free your data.
77## Magic step two: free your data.
77
78
78−The good news is, you get your own house. The bad news is, it's
79+The good news is, you get your own house. The bad news is, it's
79in North Korea.
80in North Korea.
80
81
81−Having your whole life owned by Facebook is still creepy. Or so
82+Having your whole life owned by Facebook is still creepy. Or so
82−most people would think. It's not actually clear that it's more
83+most people would think. It's not actually clear that it's more
83creepy to be owned by one corporation, than nine corporations.
84creepy to be owned by one corporation, than nine corporations.
84But it _feels_ creepier.
85But it _feels_ creepier.
85
86
86−By magic, Facebook cares. So it decides to free you. Actually,
87+By magic, Facebook cares. So it decides to free you. Actually,
87−Facebook's business is owning you. So freedom will destroy its
88+Facebook's business is owning you. So freedom will destroy its
88−business. But magically, Facebook doesn't mind.
89+business. But magically, Facebook doesn't mind.
89
90
90Right now, the software behind your Facebook experience is a
91Right now, the software behind your Facebook experience is a
91−million lines of Facebook goo. It solves your problems and shows
92+million lines of Facebook goo. It solves your problems and shows
92your ads and does whatever the heck it wants with your data.
93your ads and does whatever the heck it wants with your data.
93−(Not that it's "your" data. It's Facebook's data, about you.)
94+(Not that it's "your" data. It's Facebook's data, about you.)
94
95
95Without changing the functionality of your Facebook experience,
96Without changing the functionality of your Facebook experience,
96Facebook replaces every component of this goo with an "agent."
97Facebook replaces every component of this goo with an "agent."
97−(You have about as many agents as you used to have apps.) If you
98+(You have about as many agents as you used to have apps.) If you
98−don't care about being free, you won't notice the change. If you
99+don't care about being free, you won't notice the change. If you
99do care, everything changes.
100do care, everything changes.
100
101
101−One, you don't have to run Facebook's agents. You can replace
102+One, you don't have to run Facebook's agents. You can replace
102−them with anyone else's software, free or paid. Agents upgrade
103+them with anyone else's software, free or paid. Agents upgrade
103themselves automatically, but you are never locked in; you can
104themselves automatically, but you are never locked in; you can
104always switch agents and/or vendors without damaging your data.
105always switch agents and/or vendors without damaging your data.
105
106
106−Don't like your email UI? Change it. Don't like to see ads?
107+Don't like your email UI? Change it. Don't like to see ads?
107You no longer see any ads -- why would someone use an agent that
108You no longer see any ads -- why would someone use an agent that
108−showed them ads? Ick. Unless it's something ridiculously
109+showed them ads? Ick. Unless it's something ridiculously
109specialized, an agent is either free software or costs $3.99.
110specialized, an agent is either free software or costs $3.99.
110
111
111−Two, agents _act as you_. Facebook is no longer the Panopticon.
112+Two, agents _act as you_. Facebook is no longer the Panopticon.
112It is not a giant mainframe where all the code can access all the
113It is not a giant mainframe where all the code can access all the
113−data. An agent can use as much of your own data as you give it;
114+data. An agent can use as much of your own data as you give it;
114−it cannot use anyone else's data. At least not without asking.
115+it cannot use anyone else's data. At least not without asking.
115
116
116−When anyone can write an agent, only code can be law. Privacy is
117+When anyone can write an agent, only code can be law. Privacy is
117no longer enforced by the informal decisions of Facebook product
118no longer enforced by the informal decisions of Facebook product
118−managers. It must be enforced by formal security policies.
119+managers. It must be enforced by formal security policies.
119
120
120This might constrict the services Facebook can offer, but only a
121This might constrict the services Facebook can offer, but only a
121−little. Since privacy is a human universal, apps that don't
122+little. Since privacy is a human universal, apps that don't
122−respect it (for instance, image face tagging) feel weird. A
123+respect it (for instance, image face tagging) feel weird. A
123service like this can't be broken up into personal agents; it
124service like this can't be broken up into personal agents; it
124−still requires a Big Data mainframe somewhere. But it's okay;
125+still requires a Big Data mainframe somewhere. But it's okay;
125the agents can still talk to it.
126the agents can still talk to it.
126
127
127For the most part, Big Data (everyone's) has become little data
128For the most part, Big Data (everyone's) has become little data
128−(yours). You no longer have a Facebook profile -- a fancy UI
129+(yours). You no longer have a Facebook profile -- a fancy UI
129backed by a million lines of Facebook goo on one big mainframe.
130backed by a million lines of Facebook goo on one big mainframe.
130−Now what you have is a Facebook _server_: a real computer. Or at
131+Now what you have is a Facebook _server_: a real computer. Or at
131least, a virtual computer (which is much more reliable than any
132least, a virtual computer (which is much more reliable than any
132one physical computer).
133one physical computer).
133
134
134−Is this computer hard to manage? You have the same basic job as
135+Is this computer hard to manage? You have the same basic job as
135−someone who owns an iPhone: deciding what software to run. If
136+someone who owns an iPhone: deciding what software to run. If
136you skip this job, your iPhone or your Facebook is still pretty
137you skip this job, your iPhone or your Facebook is still pretty
137−useful. You also need to decide what data to keep. An iPhone
138+useful. You also need to decide what data to keep. An iPhone
138has finite, free storage; the cloud has infinite, non-free
139has finite, free storage; the cloud has infinite, non-free
139−storage. You still want a warning when your server gets fat.
140+storage. You still want a warning when your server gets fat.
140But at least it keeps working.
141But at least it keeps working.
141
142
142## Magic step three: free your server.
143## Magic step three: free your server.
143
144
144−This agent-oriented Facebook can't show you ads. But this is not
145+This agent-oriented Facebook can't show you ads. But this is not
145−actually a huge business problem. Since Facebook owns everyone's
146+actually a huge business problem. Since Facebook owns everyone's
146−life, it has the mother of all monopoly lockins. It can just
147+life, it has the mother of all monopoly lockins. It can just
147−bill you $9.99 a month for running your Facebook server. This is
148+bill you $9.99 a month for running your Facebook server. This is
148a great deal, for you and for Facebook.
149a great deal, for you and for Facebook.
149
150
150−But you're still a slave, Neo. A Facebook server still isn't a
151+But you're still a slave, Neo. A Facebook server still isn't a
151−personal server. Monopolies suck.
152+personal server. Monopolies suck.
152
153
153−Magic works, so Facebook feels guilty. It goes all the way
154+Magic works, so Facebook feels guilty. It goes all the way
154toward freeing you, and ruins its own business.
155toward freeing you, and ruins its own business.
155
156
156Now, your server is just a big file whose format is precisely
157Now, your server is just a big file whose format is precisely
157−defined. You can move it to any hosting service, or even run it
158+defined. You can move it to any hosting service, or even run it
158−on a home PC. Since hosting is now a commodity, it costs almost
159+on a home PC. Since hosting is now a commodity, it costs almost
159−nothing and has zero profit margin. It may even come bundled
160+nothing and has zero profit margin. It may even come bundled
160with your Internet service.
161with your Internet service.
161
162
162−Every data center is owned by the local government. If you have
163+Every data center is owned by the local government. If you have
163−data to hide from the authorities, compute at home. Most people
164+data to hide from the authorities, compute at home. Most people
164don't have anything to hide and should run in the cloud, because
165don't have anything to hide and should run in the cloud, because
165−the cloud works better. But using the _same platform_ as those
166+the cloud works better. But using the _same platform_ as those
166−who do have something to hide creates "herd immunity". You don't
167+who do have something to hide creates "herd immunity". You don't
167have to choose between a secure platform with no network effect,
168have to choose between a secure platform with no network effect,
168and a non-secure platform that everyone else uses.
169and a non-secure platform that everyone else uses.
169
170
170## Magic step four: free your name.
171## Magic step four: free your name.
171
172
172−Freeing your server also means freeing your identity. It's no
173+Freeing your server also means freeing your identity. It's no
173−longer true that Facebook decides who you are. Facebook just
174+longer true that Facebook decides who you are. Facebook just
174−wrote the algorithm. Your server contains cryptographic secrets
175+wrote the algorithm. Your server contains cryptographic secrets
175−that control your identity. If your identity was a bitcoin, your
176+that control your identity. If your identity was a bitcoin, your
176server would be a giant bitcoin wallet.
177server would be a giant bitcoin wallet.
177
178
178−The bad news: lose the file, lose the identity. The good news:
179+The bad news: lose the file, lose the identity. The good news:
179−your server is genuinely personal now. It's yours in every way.
180+your server is genuinely personal now. It's yours in every way.
180It's so personal that if you destroy it, it's gone.
181It's so personal that if you destroy it, it's gone.
181
182
182−Facebook doesn't even keep its power to create new servers. The
183+Facebook doesn't even keep its power to create new servers. The
183"real name" policy has done great things to control spam, because
184"real name" policy has done great things to control spam, because
184−spam always depends on disposable accounts. But it implies a
185+spam always depends on disposable accounts. But it implies a
185central authority.
186central authority.
186
187
187Instead, Facebook borrows an idea from bitcoin and just limits
188Instead, Facebook borrows an idea from bitcoin and just limits
188−the number of identities. If you need one, you have to buy one.
189+the number of identities. If you need one, you have to buy one.
189They don't cost that much; just enough to deter spammers.
190They don't cost that much; just enough to deter spammers.
190
191
191−(Is your real name still linked to your identity? Maybe, maybe
192+(Is your real name still linked to your identity? Maybe, maybe
192−not. There's a role for name validation, but not everyone needs
193+not. There's a role for name validation, but not everyone needs
193−to have a real name, and not everyone else needs to know it. A
194+to have a real name, and not everyone else needs to know it. A
194dissident, or anyone who wants to speak out and let the words
195dissident, or anyone who wants to speak out and let the words
195speak for themselves, might want a second anonymous identity.
196speak for themselves, might want a second anonymous identity.
196But sock puppets remain evil -- two names for the same person
197But sock puppets remain evil -- two names for the same person
@@ -200,5 +201,5 @@ should not interact in the same place.)
200
201
201And, with magic, we've succeeded in turning Facebook into Urbit.
202And, with magic, we've succeeded in turning Facebook into Urbit.
202Technically, Urbit is pretty close to magic, but there is no way
203Technically, Urbit is pretty close to magic, but there is no way
203−it's going to happen this way. See the [roadmap](/blog/roadmap) for how it
204+it's going to happen this way. See the [roadmap](/blog/roadmap) for how it
204actually happens.
205actually happens.
content/blog/metaphase.md+2−1
@@ -1,7 +1,8 @@
1+++
1+++
2title = "Metaphase"
2title = "Metaphase"
3−date = 2020-12-09
3+date = "2020-12-08"
4description = "On the upcoming and foregoing Landscape lifecycles, and other forms of mitosis across the Urbit project."
4description = "On the upcoming and foregoing Landscape lifecycles, and other forms of mitosis across the Urbit project."
5+
5[extra]
6[extra]
6author = "Matilde Park"
7author = "Matilde Park"
7ship = "~haddef-sigwen"
8ship = "~haddef-sigwen"
content/blog/on-christopher-alexander.md+2−1
@@ -1,7 +1,8 @@
1+++
1+++
2title = "On Christopher Alexander"
2title = "On Christopher Alexander"
3−date = 2021-07-20
3+date = "2021-07-19"
4description = "An overview of his writing and relevance"
4description = "An overview of his writing and relevance"
5+
5[extra]
6[extra]
6author = "Matt"
7author = "Matt"
7ship = "~tirwyd-sarmes"
8ship = "~tirwyd-sarmes"
content/blog/pki-maze.md+4−8
@@ -1,7 +1,8 @@
1+++
1+++
2title = "Designing a Permanent Personal Identity"
2title = "Designing a Permanent Personal Identity"
3−date = 2019-11-27
3+date = "2019-11-26"
4description = "A public key infrastructure (PKI) is a system for binding a set of keys to a name. Sometimes a small amount of metadata is included."
4description = "A public key infrastructure (PKI) is a system for binding a set of keys to a name. Sometimes a small amount of metadata is included."
5+
5[extra]
6[extra]
6author = "Philip Monk"
7author = "Philip Monk"
7ship = "~wicdev-wisryt"
8ship = "~wicdev-wisryt"
@@ -40,7 +41,7 @@ However, Urbit is yours and it's forever. Trusting central registries jeopardize
40
41
41Some argue that blockchain is only good for money. This is myopic and is generally based on the experience that its most valuable application so far has been money. However, blockchain is a cryptographic primitive to do what was previously impossible: prove that one message was signed before another without a central party. Blockchain was discovered by someone trying to create digital money, and he needed that primitive, but that doesn't mean that's all it's good for.
42Some argue that blockchain is only good for money. This is myopic and is generally based on the experience that its most valuable application so far has been money. However, blockchain is a cryptographic primitive to do what was previously impossible: prove that one message was signed before another without a central party. Blockchain was discovered by someone trying to create digital money, and he needed that primitive, but that doesn't mean that's all it's good for.
42
43
43−Thus, we store our PKI data on a blockchain for our second kind of name: planets. A planet is a 32-bit address which has key information stored on the blockchain.[^2] The owner of a planet may broadcast new PKI data by adding it to the blockchain. Any later messages by the old keys will be rejected, and everyone on the network will listen to the blockchain for key data. Thus, we have global consistency, permanence, and self sovereignty. We know of no other solution that can provide these properties.
44+Thus, we store our PKI data on a blockchain for our second kind of name: planets. A planet is a 32-bit address which has key information stored on the blockchain.[^2] The owner of a planet may broadcast new PKI data by adding it to the blockchain. Any later messages by the old keys will be rejected, and everyone on the network will listen to the blockchain for key data. Thus, we have global consistency, permanence, and self sovereignty. We know of no other solution that can provide these properties.
44
45
45However, while small individually, the aggregate PKI data for all nodes on the network may become very large. This is not an issue for comets because nobody needs to store comet keys except for those which they're talking with, and even those can be garbage-collected and re-requested and verified. For planets, there is a canonical set of keys, and somebody must store that. There are about 2<sup>32</sup>, or 4 billion planets. If the PKI data is about 100 bytes for each planet, this is about 400 GB of data. This may be more than most users wish to store, but it's small enough that it would be very cheap for someone to host this data for many users[^3].
46However, while small individually, the aggregate PKI data for all nodes on the network may become very large. This is not an issue for comets because nobody needs to store comet keys except for those which they're talking with, and even those can be garbage-collected and re-requested and verified. For planets, there is a canonical set of keys, and somebody must store that. There are about 2<sup>32</sup>, or 4 billion planets. If the PKI data is about 100 bytes for each planet, this is about 400 GB of data. This may be more than most users wish to store, but it's small enough that it would be very cheap for someone to host this data for many users[^3].
46
47
@@ -62,13 +63,8 @@ To create a sane network, we require global consistency for all our names. There
62
63
63Fancifully, comets are wayward celestial bodies that are great for testing and miscellaneous low-value things that won't last for long. Planets are where you can build a home and shape it into anything you want it to be. People can always find your planet; it's not going anywhere. Moons are useful for special purposes, like storage, heavy industry, and anything else you might want to do off-planet.[^4]
64Fancifully, comets are wayward celestial bodies that are great for testing and miscellaneous low-value things that won't last for long. Planets are where you can build a home and shape it into anything you want it to be. People can always find your planet; it's not going anywhere. Moons are useful for special purposes, like storage, heavy industry, and anything else you might want to do off-planet.[^4]
64
65
65−
66[^0]: Or the equivalent with a hierarchical key structure. In practice, you want to have a master key which signs a junior key for everyday use. You use the master key to rotate the junior key.
66[^0]: Or the equivalent with a hierarchical key structure. In practice, you want to have a master key which signs a junior key for everyday use. You use the master key to rotate the junior key.
67−
68[^1]: More strictly: it proves that he didn't mine it after the other blocks currently on the Bitcoin blockchain. It only gives an ordering within the chain, not a literal timestamp.
67[^1]: More strictly: it proves that he didn't mine it after the other blocks currently on the Bitcoin blockchain. It only gives an ordering within the chain, not a literal timestamp.
69−
70[^2]: In addition to planets, there are stars and galaxies. From a PKI perspective they're treated exactly like planets, but on the network they provide infrastructure services like routing.
68[^2]: In addition to planets, there are stars and galaxies. From a PKI perspective they're treated exactly like planets, but on the network they provide infrastructure services like routing.
71−
72[^3]: In practice, this will likely be an included service by your sponsoring star. It could be a separate service, but it will be very cheap because it's a commodity and the "cost of production" is very cheap. At any rate, it should never rise above the capital cost of a 400GB hard drive.
69[^3]: In practice, this will likely be an included service by your sponsoring star. It could be a separate service, but it will be very cheap because it's a commodity and the "cost of production" is very cheap. At any rate, it should never rise above the capital cost of a 400GB hard drive.
73−
74−[^4]: To extend the metaphor, stars are a neighborhood to live in -- they're easier for other planets to see, so when they want to send you a message they look for your star first. If they don't even know where your star is, they can certainly find your star's galaxy, and that will be enough to locate the star. Of course, if your star is not providing satisfactory service, you can take your planet and move to another star.
70+[^4]: To extend the metaphor, stars are a neighborhood to live in -- they're easier for other planets to see, so when they want to send you a message they look for your star first. If they don't even know where your star is, they can certainly find your star's galaxy, and that will be enough to locate the star. Of course, if your star is not providing satisfactory service, you can take your planet and move to another star.
content/blog/platform-decay.md+4−3
@@ -1,11 +1,12 @@
1+++
1+++
2title = "Platform Decay, Decentralized Marketplaces, and Urbit"
2title = "Platform Decay, Decentralized Marketplaces, and Urbit"
3−date = 2020-05-08
3+date = "2020-05-07"
4description = "Urbit is calm computing. Calm commerce follows naturally. "
4description = "Urbit is calm computing. Calm commerce follows naturally. "
5+
5[extra]
6[extra]
6author = "Nicholas Simmons"
7author = "Nicholas Simmons"
7ship = "~simfur-ritwed"
8ship = "~simfur-ritwed"
8−image ="https://media.urbit.org/site/posts/essays/platform-decay-preview.png"
9+image = "https://media.urbit.org/site/posts/essays/platform-decay-preview.png"
9+++
10+++
10
11
11<br>
12<br>
@@ -36,7 +37,7 @@ Even more subtle and worrying effects come when e-commerce platforms realize tha
36
37
37The manufacturing of consumer desire in this way feels creepy. It’s frustrating to have your tastes dictated to you by whoever has the biggest ad spend. It also spells the end of small business on the Internet—you can spend years mastering knowledge of a profitable niche, but if Amazon profiles your customers and decides they’re more likely to spend their money on the latest Pixar DVD, your listings will be shoved below the fold. Pixar paid for placement and you didn’t; the Pixar ad placement deal made a splash in the quarterly report, your fees didn’t. In cultural terms, this threatens to create a winner-take-all situation that will prevent new and niche artists and thinkers from gaining attention at the expense of explicitly placed, ‘premium’ content.
38The manufacturing of consumer desire in this way feels creepy. It’s frustrating to have your tastes dictated to you by whoever has the biggest ad spend. It also spells the end of small business on the Internet—you can spend years mastering knowledge of a profitable niche, but if Amazon profiles your customers and decides they’re more likely to spend their money on the latest Pixar DVD, your listings will be shoved below the fold. Pixar paid for placement and you didn’t; the Pixar ad placement deal made a splash in the quarterly report, your fees didn’t. In cultural terms, this threatens to create a winner-take-all situation that will prevent new and niche artists and thinkers from gaining attention at the expense of explicitly placed, ‘premium’ content.
38
39
39−Again, this is all accelerated by the way that ad sales function; platforms like broadly popular content and products because the larger number of customers searching for and purchasing them creates more granular data and increased opportunities for micro-targeting ads. This incentive leads to the increasing invisibility of long-tail, niche content or products whose appeal has less to do with lowest-common-denominator addictive virality, whether it’s the repair manual for your ‘85 Toyota or a copy of Plato’s *Republic*. It also accelerates the stampede toward a ‘sharing’ and ‘renting’ economy; when ad impressions are a sizable part of company revenue, forcing customers to return to ad-infested platforms to continue renting objects or content, rather than making one-time purchases, is a no-brainer.
40+Again, this is all accelerated by the way that ad sales function; platforms like broadly popular content and products because the larger number of customers searching for and purchasing them creates more granular data and increased opportunities for micro-targeting ads. This incentive leads to the increasing invisibility of long-tail, niche content or products whose appeal has less to do with lowest-common-denominator addictive virality, whether it’s the repair manual for your ‘85 Toyota or a copy of Plato’s _Republic_. It also accelerates the stampede toward a ‘sharing’ and ‘renting’ economy; when ad impressions are a sizable part of company revenue, forcing customers to return to ad-infested platforms to continue renting objects or content, rather than making one-time purchases, is a no-brainer.
40
41
41There’s a nightmare scenario here, a kind of hybrid, zombie brainchild of Jean Baudrillard’s concerns about the simulation of common meaning and Peter Thiel’s arguments about the stealthy hollowing-out of industrial capacity. In this nightmare future, financial and legal regulation strangle the viability of anything like a real industry, and we’re left with a handful of incumbent platforms which have concluded that the smartest move is to just sell vaporware ‘content,’ collectible bobbleheads, and sugar water. The supposed niche of any platform business is academic at this level; Amazon, Spotify, and Patreon are simply machines for converting user attention into the highest-margin purchases possible. The ‘high-velocity trash economy’ (h/t Pierre Rochard) increasingly shows itself as a network of funnels by which insider prognostications about government and central bank policy are turned into profits, with the illusion of productive activity serving only as window dressing. This deforming process extends all the way down to the vagaries of the consumer economy. If there is no financial reason for available consumer offerings to be anything we actually need, they can and will be deprecated and displaced; useful goods and services will be sidelined by literal trash that has the ‘financial’ logic of maintaining an unbroken, upward metric by virtue of direct parasitism upon the human brainstem.
42There’s a nightmare scenario here, a kind of hybrid, zombie brainchild of Jean Baudrillard’s concerns about the simulation of common meaning and Peter Thiel’s arguments about the stealthy hollowing-out of industrial capacity. In this nightmare future, financial and legal regulation strangle the viability of anything like a real industry, and we’re left with a handful of incumbent platforms which have concluded that the smartest move is to just sell vaporware ‘content,’ collectible bobbleheads, and sugar water. The supposed niche of any platform business is academic at this level; Amazon, Spotify, and Patreon are simply machines for converting user attention into the highest-margin purchases possible. The ‘high-velocity trash economy’ (h/t Pierre Rochard) increasingly shows itself as a network of funnels by which insider prognostications about government and central bank policy are turned into profits, with the illusion of productive activity serving only as window dressing. This deforming process extends all the way down to the vagaries of the consumer economy. If there is no financial reason for available consumer offerings to be anything we actually need, they can and will be deprecated and displaced; useful goods and services will be sidelined by literal trash that has the ‘financial’ logic of maintaining an unbroken, upward metric by virtue of direct parasitism upon the human brainstem.
42
43
content/blog/precepts-discussion.md+48−46
@@ -1,11 +1,12 @@
1+++
1+++
2title = "Precepts: Discussion"
2title = "Precepts: Discussion"
3−date = 2020-03-18
3+date = "2020-03-17"
4description = "The precepts aren’t arguments. We discuss and justify them here."
4description = "The precepts aren’t arguments. We discuss and justify them here."
5+
5[extra]
6[extra]
6author = "Philip Monk"
7author = "Philip Monk"
7ship = "~wicdev-wisryt"
8ship = "~wicdev-wisryt"
8−image ="https://media.urbit.org/site/posts/essays/discuss-01.jpg"
9+image = "https://media.urbit.org/site/posts/essays/discuss-01.jpg"
9+++
10+++
10
11
11<br>
12<br>
@@ -86,7 +87,7 @@ Some examples of things that are objectively quite simple but subjectively hard
86 more obvious in retrospect than it does on first glance.
87 more obvious in retrospect than it does on first glance.
87
88
88- Any language that induces a moment where you exclaim to yourself,
89- Any language that induces a moment where you exclaim to yourself,
89− "This is true programming! Everyone should program this way, it's so
90+ "This is true programming! Everyone should program this way, it's so
90 obviously better!". People say that often about Lisp, Haskell,
91 obviously better!". People say that often about Lisp, Haskell,
91 Prolog, and Smalltalk. Nobody ever said that about C, Java,
92 Prolog, and Smalltalk. Nobody ever said that about C, Java,
92 Javascript, or Python. And yet, which ones are easier to learn?
93 Javascript, or Python. And yet, which ones are easier to learn?
@@ -240,7 +241,7 @@ strong guarantees on top of something with weak guarantees — for
240example, delivery guarantees on top of an unreliable transport protocol.
241example, delivery guarantees on top of an unreliable transport protocol.
241In that case, you are sure of the underlying system, it's just that what
242In that case, you are sure of the underlying system, it's just that what
242you're sure of is that you can't rely on it delivering packets in order
243you're sure of is that you can't rely on it delivering packets in order
243−or at all. So, you formalize what you *are* sure of, which is that it
244+or at all. So, you formalize what you _are_ sure of, which is that it
244will eventually get your packets through if you keep sending them
245will eventually get your packets through if you keep sending them
245forever. And that's something you can build on.
246forever. And that's something you can build on.
246
247
@@ -364,7 +365,7 @@ There are some principles that aren't obviously better than the alternatives, bu
364
365
365> B1: Always ack a dupe; never ack an ack.
366> B1: Always ack a dupe; never ack an ack.
366>
367>
367−> It's okay to ack a nack as long as you never nack a nack.
368+> It's okay to ack a nack as long as you never nack a nack.
368
369
369This is a simple rule, and if you follow it you get various guarantees for free. For example, sending a message will always cause up to a constant number of additional messages to be sent by direct or indirect causality (other than application-level code), so you never have to worry about accidentally causing a loop.
370This is a simple rule, and if you follow it you get various guarantees for free. For example, sending a message will always cause up to a constant number of additional messages to be sent by direct or indirect causality (other than application-level code), so you never have to worry about accidentally causing a loop.
370
371
@@ -423,21 +424,21 @@ Better to define rules in a more powerful language. This allows you to follow A6
423Good code is the result of people approaching the act of engineering with the right attitude.
424Good code is the result of people approaching the act of engineering with the right attitude.
424
425
425> C1: Code courageously.
426> C1: Code courageously.
426−
427+
427− If you avoid changing a section of code for fear of awakening the
428+If you avoid changing a section of code for fear of awakening the
428− demons therein, you are living in fear. If you stay in the
429+demons therein, you are living in fear. If you stay in the
429− comfortable confines of the small section of the code you wrote or
430+comfortable confines of the small section of the code you wrote or
430− know well, you will never write legendary code. All code was
431+know well, you will never write legendary code. All code was
431− written by humans and can be mastered by humans.
432+written by humans and can be mastered by humans.
432−
433+
433− It's natural to feel fear of code; however, you must act as though
434+It's natural to feel fear of code; however, you must act as though
434− you are able to master and change any part of it. To code
435+you are able to master and change any part of it. To code
435− courageously is to walk into any abyss, bring light, and make it
436+courageously is to walk into any abyss, bring light, and make it
436− right.
437+right.
437
438
438The unix/internet stack is a giant ball of mud. It's so big that when you're standing on it, it looks like a bog, and it's not clear that there is a bottom to it. You know there must be, but it doesn't matter because you learned long ago that the best solution is to not dig too deep. Build a strong structure by spreading out your weight and using strong construction materials. If there's something useful deep in the mud, it's probably not worth diving in to pull it out. That's dangerous and prone to failure, and you know many people who have gotten stuck down there.
439The unix/internet stack is a giant ball of mud. It's so big that when you're standing on it, it looks like a bog, and it's not clear that there is a bottom to it. You know there must be, but it doesn't matter because you learned long ago that the best solution is to not dig too deep. Build a strong structure by spreading out your weight and using strong construction materials. If there's something useful deep in the mud, it's probably not worth diving in to pull it out. That's dangerous and prone to failure, and you know many people who have gotten stuck down there.
439
440
440−This is an appropriate reaction to the unix/internet stack. It's also self-perpetuating. The bog is filled — even *composed* of — countless predecessors who did that same thing. If you ever find yourself on solid ground, protect that with your life. Learn how it works and how to use it well. Then build a strong structure on top of that. Don't let it decompose into a layer of mud.
441+This is an appropriate reaction to the unix/internet stack. It's also self-perpetuating. The bog is filled — even _composed_ of — countless predecessors who did that same thing. If you ever find yourself on solid ground, protect that with your life. Learn how it works and how to use it well. Then build a strong structure on top of that. Don't let it decompose into a layer of mud.
441
442
442Urbit is small enough that, while there's definitely some construction-related dirt and muck covering it, the solid metallic core is not very deep — not more than waist deep in most places. The feeling of always being in contact with the bottom is very different than flailing about in a bog.
443Urbit is small enough that, while there's definitely some construction-related dirt and muck covering it, the solid metallic core is not very deep — not more than waist deep in most places. The feeling of always being in contact with the bottom is very different than flailing about in a bog.
443
444
@@ -451,11 +452,11 @@ follow conventions, and fire anyone who won't. Anything that can
451be solved by discipline is not a real problem.
452be solved by discipline is not a real problem.
452
453
453> "To him who knows to do good and does not do it, to him it is
454> "To him who knows to do good and does not do it, to him it is
454−sin."
455+> sin."
455
456
456Preserving the property of solid ground requires perpetual discipline. Once lost, it's often impossible to reacquire. Don't compromise your standards.
457Preserving the property of solid ground requires perpetual discipline. Once lost, it's often impossible to reacquire. Don't compromise your standards.
457
458
458−Call people out when they're being lazy. And when someone calls you out, recognize it and fix it. Sometimes it's just a question on a code review — "why did you do it this way?" Upon reflection, you determine that you did it that way because you couldn't be bothered to do it right. Maybe that was a reasonable choice at the time you were coding so you wouldn't be distracted, but if it's been called out in a code review, now's the time to fix it, not make excuses.
459+Call people out when they're being lazy. And when someone calls you out, recognize it and fix it. Sometimes it's just a question on a code review — "why did you do it this way?" Upon reflection, you determine that you did it that way because you couldn't be bothered to do it right. Maybe that was a reasonable choice at the time you were coding so you wouldn't be distracted, but if it's been called out in a code review, now's the time to fix it, not make excuses.
459
460
460> C3: When a smart person makes an obviously stupid suggestion, before
461> C3: When a smart person makes an obviously stupid suggestion, before
461> responding take a full 60 seconds to envision how you would implement
462> responding take a full 60 seconds to envision how you would implement
@@ -464,7 +465,7 @@ Call people out when they're being lazy. And when someone calls you out, recogni
464Once you've determined that someone understands a situation well, if they earnestly make a suggestion that you haven't thought of, or that you immediately dismissed as impractical, stop and consciously consider it. This is one of the best ways of countering the natural echo chamber
465Once you've determined that someone understands a situation well, if they earnestly make a suggestion that you haven't thought of, or that you immediately dismissed as impractical, stop and consciously consider it. This is one of the best ways of countering the natural echo chamber
465of your own mind.
466of your own mind.
466
467
467−This is also one of the best ways to build stuff correctly. Very often, you will be tempted to cut a corner, and someone will point out that it should be done correctly. You should consider why you immediately rejected it. Was it because you were afraid of the relevant piece of code? If so, you should learn more about that code to determine if it's actually a good idea. Did you reject it because you felt it would distract you from working on what you thought was more important?
468+This is also one of the best ways to build stuff correctly. Very often, you will be tempted to cut a corner, and someone will point out that it should be done correctly. You should consider why you immediately rejected it. Was it because you were afraid of the relevant piece of code? If so, you should learn more about that code to determine if it's actually a good idea. Did you reject it because you felt it would distract you from working on what you thought was more important?
468Consider carefully whether this particular piece of technical debt is worth taking on. It's worth 60 seconds of thinking about how you could solve it correctly right now — often it would be quite easy to do correctly and you'd be paying interest on the incorrectness for a long time.
469Consider carefully whether this particular piece of technical debt is worth taking on. It's worth 60 seconds of thinking about how you could solve it correctly right now — often it would be quite easy to do correctly and you'd be paying interest on the incorrectness for a long time.
469
470
470<br>
471<br>
@@ -541,7 +542,7 @@ Some of these are strongly affected by workflows. We can't force a developer to
541
542
542One of the primary inputs to code navigability is how much of it you can have on your screen. Code that is too wide limits the number of columns of code. Some people keep only one column on their screen, so they don't see a problem with long lines of code. The most efficient navigation is to already be there (i.e. to only have to move your eyes). If you only have one column of code open, you can only be in one place, which eliminates the best form of navigation.
543One of the primary inputs to code navigability is how much of it you can have on your screen. Code that is too wide limits the number of columns of code. Some people keep only one column on their screen, so they don't see a problem with long lines of code. The most efficient navigation is to already be there (i.e. to only have to move your eyes). If you only have one column of code open, you can only be in one place, which eliminates the best form of navigation.
543
544
544−Dually, code that is too narrow limits the number of lines you can have on a screen (this isn't a separate precept simply because we've never had to tell someone to write *wider* code). This suggests there is some happy medium. This is dependent on the language, but in Hoon we've
545+Dually, code that is too narrow limits the number of lines you can have on a screen (this isn't a separate precept simply because we've never had to tell someone to write _wider_ code). This suggests there is some happy medium. This is dependent on the language, but in Hoon we've
545found that up to 55 columns is a pretty good number for most code. However, there are plenty of legitimate reasons to go a bit longer than that. 70 columns is rare, but not surprising. There is essentially never a reason to extend beyond 80 columns.
546found that up to 55 columns is a pretty good number for most code. However, there are plenty of legitimate reasons to go a bit longer than that. 70 columns is rare, but not surprising. There is essentially never a reason to extend beyond 80 columns.
546
547
547> E2: Tabs aren't real.
548> E2: Tabs aren't real.
@@ -553,6 +554,7 @@ There can be good reason for inconsistency in some areas, but not in
553code formatting, which is such an intensely communicative action.
554code formatting, which is such an intensely communicative action.
554
555
555> E3: A text file is a series of lines, each ending with a newline
556> E3: A text file is a series of lines, each ending with a newline
557+
556 character.
558 character.
557
559
558There are several competing definitions of text files, but most commonly-used software uses this one. It's simple and consistent.
560There are several competing definitions of text files, but most commonly-used software uses this one. It's simple and consistent.
@@ -581,9 +583,9 @@ However, cache invalidation and naming things are genuinely hard because they mu
581context.
583context.
582
584
583You shouldn't solve hard problems if you don't need to, so don't name anything you don't have to. Giving unique names to things is tiring, and it reduces readability. A consistent pattern for naming things makes it easy to keep track of what is what and reduces the number of
585You shouldn't solve hard problems if you don't need to, so don't name anything you don't have to. Giving unique names to things is tiring, and it reduces readability. A consistent pattern for naming things makes it easy to keep track of what is what and reduces the number of
584−decisions you must make.
586+decisions you must make.
585
587
586−Examples:
588+Examples:
587
589
588- If the only difference between three things is that they're not the
590- If the only difference between three things is that they're not the
589 same, consider naming them `thing-1`, `thing-2`, and `thing-3`.
591 same, consider naming them `thing-1`, `thing-2`, and `thing-3`.
@@ -632,43 +634,43 @@ This is the most important passage in all that has ever been written
632about Urbit:
634about Urbit:
633
635
634> What is Martian code actually like? There are two possibilities.
636> What is Martian code actually like? There are two possibilities.
635−>
637+>
636> One: since Earth code is fifty years old, and Martian code is fifty
638> One: since Earth code is fifty years old, and Martian code is fifty
637> million years old, Martian code has been evolving into a big ball of mud
639> million years old, Martian code has been evolving into a big ball of mud
638> for a million times longer than Earth software. (And two million times
640> for a million times longer than Earth software. (And two million times
639> longer than Windows.)
641> longer than Windows.)
640−>
642+>
641−> This hypothesis strikes me as possible, but implausible. Since the *big
643+> This hypothesis strikes me as possible, but implausible. Since the _big
642−> ball of mud* expands indefinitely, Martian code would therefore be so
644+> ball of mud_ expands indefinitely, Martian code would therefore be so
643> large and horrible that, despite its underground installed base, the
645> large and horrible that, despite its underground installed base, the
644> server room bulged into space like a termite mound, intercepting
646> server room bulged into space like a termite mound, intercepting
645> low-flying asteroids and stinking up the solar system all the way to
647> low-flying asteroids and stinking up the solar system all the way to
646> Pluto. Our latest space telescopes would surely have detected this
648> Pluto. Our latest space telescopes would surely have detected this
647> abominable structure - if not, in fact, collided with it.
649> abominable structure - if not, in fact, collided with it.
648−>
650+>
649> Two: therefore, at some point in Martian history, some abject fsck of a
651> Two: therefore, at some point in Martian history, some abject fsck of a
650−> Martian code-monkey must have said: *fsck* this entire fscking ball of
652+> Martian code-monkey must have said: _fsck_ this entire fscking ball of
651−> mud. For *lo*, its defects cannot be summarized; for they exceed the
653+> mud. For _lo_, its defects cannot be summarized; for they exceed the
652> global supply of bullet points; for numerous as the fishes in the sea,
654> global supply of bullet points; for numerous as the fishes in the sea,
653> like the fishes in the sea they fsck, making more little fscking fishes.
655> like the fishes in the sea they fsck, making more little fscking fishes.
654−> For lo, it is *fscked*, and a big ball of mud. And there is only one thing
656+> For lo, it is _fscked_, and a big ball of mud. And there is only one thing
655−> to do with it: *obliterate* the trunk, *fire* the developers, and hire a
657+> to do with it: _obliterate_ the trunk, _fire_ the developers, and hire a
656−> whole new fscking *army* of Martian code-monkeys to rewrite the *entire
658+> whole new fscking _army_ of Martian code-monkeys to rewrite the _entire
657−> fscking thing*.
659+> fscking thing_.
658−>
660+>
659−> This is such an obvious and essential response to the *big ball of mud*
661+> This is such an obvious and essential response to the _big ball of mud_
660> pattern that, despite the fact that we know nothing about Mars, we can
662> pattern that, despite the fact that we know nothing about Mars, we can
661> deduce that it must have happened on Mars. Probably several times.
663> deduce that it must have happened on Mars. Probably several times.
662> Probably several hundred. For each of these attempts but the last, of
664> Probably several hundred. For each of these attempts but the last, of
663−> course, the result was either (a) abject failure, (b) another *big ball
665+> course, the result was either (a) abject failure, (b) another _big ball
664−> of mud*, or (c) both.
666+> of mud_, or (c) both.
665−>
667+>
666> But the last, by definition, succeeded. This is the crucial inference we
668> But the last, by definition, succeeded. This is the crucial inference we
667> can draw about Mars: since the Martians had 50 million years to try, in
669> can draw about Mars: since the Martians had 50 million years to try, in
668> the end they must have succeeded. The result: Martian code, as we know
670> the end they must have succeeded. The result: Martian code, as we know
669−> it today. Not enormous and horrible — *tiny and diamond-perfect*.
671+> it today. Not enormous and horrible — _tiny and diamond-perfect_.
670> Moreover, because it is tiny and diamond-perfect, it is perfectly stable
672> Moreover, because it is tiny and diamond-perfect, it is perfectly stable
671−> and never changes or decays. It neither is a *big ball of mud*, nor tends
673+> and never changes or decays. It neither is a _big ball of mud_, nor tends
672> to become one. It has achieved its final, permanent and excellent state.
674> to become one. It has achieved its final, permanent and excellent state.
673
675
674We don't know that Urbit will achieve this final form, but Urbit is an attempt to make progress in that direction. Any software that isn't a candidate for "tiny and diamond-perfect" is either a prototype or scaffolding.
676We don't know that Urbit will achieve this final form, but Urbit is an attempt to make progress in that direction. Any software that isn't a candidate for "tiny and diamond-perfect" is either a prototype or scaffolding.
@@ -692,17 +694,17 @@ acceptable. If you depend on a piece of source code to be kept forever, copied a
692Another way to look at this is to say that anything that wouldn't work on a spaceship is architecturally flawed. Maybe it requires many sequential round-trips to a central server because it doesn't have all the relevant information. See discussion of A7.
694Another way to look at this is to say that anything that wouldn't work on a spaceship is architecturally flawed. Maybe it requires many sequential round-trips to a central server because it doesn't have all the relevant information. See discussion of A7.
693
695
694> F3: If it's owned by someone else, it isn't yours.
696> F3: If it's owned by someone else, it isn't yours.
695−>
697+>
696> F4: If it's managed by someone else and you can't change who that is, it
698> F4: If it's managed by someone else and you can't change who that is, it
697> isn't yours.
699> isn't yours.
698−>
700+>
699> F5: If it's not yours, it isn't permanent.
701> F5: If it's not yours, it isn't permanent.
700−>
702+>
701> F6: If it's not permanent, it isn't real.
703> F6: If it's not permanent, it isn't real.
702
704
703Nobody is as aligned with your values as you are. If you don't control the software, then you can't guarantee you'll always have access to it. Whoever does control the software may destroy it, move away, or simply revoke your access to it.
705Nobody is as aligned with your values as you are. If you don't control the software, then you can't guarantee you'll always have access to it. Whoever does control the software may destroy it, move away, or simply revoke your access to it.
704
706
705−Control has some nuance. If it's physically controlled by a company and you can't get your data and the software that makes it useful, you definitely don't have control. If you have physical control of it, you do have control. But if you're hosting the data and software on a commodity cloud server, you still mostly have control of it. Your privacy has been reduced, sure. However, as long as you keep regular backups of the data and software, if the hosting provider disappears you just need to find another host, or host it yourself. Any particular host is likely to disappear, but the situation where *every* host disappears and you can't even host it yourself is much less likely. Brands are mortal, commodities are not.
707+Control has some nuance. If it's physically controlled by a company and you can't get your data and the software that makes it useful, you definitely don't have control. If you have physical control of it, you do have control. But if you're hosting the data and software on a commodity cloud server, you still mostly have control of it. Your privacy has been reduced, sure. However, as long as you keep regular backups of the data and software, if the hosting provider disappears you just need to find another host, or host it yourself. Any particular host is likely to disappear, but the situation where _every_ host disappears and you can't even host it yourself is much less likely. Brands are mortal, commodities are not.
706
708
707Some branded hosts allow you to download a zip file of your data. This gives you a little more control over your data, but it's much closer to "no control" than "total control". This is because your online world is data plus code, and without the code that makes it useful, data is only good for scrapbooking. The scrapbook will remind you of the good old days, but you won't be able to live them again.
709Some branded hosts allow you to download a zip file of your data. This gives you a little more control over your data, but it's much closer to "no control" than "total control". This is because your online world is data plus code, and without the code that makes it useful, data is only good for scrapbooking. The scrapbook will remind you of the good old days, but you won't be able to live them again.
708
710
@@ -765,4 +767,4 @@ other communities and may spread if they provide some benefit.
765Many technologies today combine us into a single community, or at least a single set of norms. If many communities are hosted by a single entity, there will be pressure from some of those communities toward the entity to pressure other communities to follow certain of their norms.
767Many technologies today combine us into a single community, or at least a single set of norms. If many communities are hosted by a single entity, there will be pressure from some of those communities toward the entity to pressure other communities to follow certain of their norms.
766This crosstalk isn't all bad, but there must be an equilibrium. All too often the lines between the communities are so permeable as to be inconsequential. In this case, the communities will converge in a single large community, at the cost of the memetic diversity of the original communities.
768This crosstalk isn't all bad, but there must be an equilibrium. All too often the lines between the communities are so permeable as to be inconsequential. In this case, the communities will converge in a single large community, at the cost of the memetic diversity of the original communities.
767
769
768−Technology should mirror human interaction, and humans interact in communities.
770+Technology should mirror human interaction, and humans interact in communities.
content/blog/precepts.md+187−187
@@ -1,18 +1,19 @@
1+++
1+++
2title = "Precepts"
2title = "Precepts"
3−date = 2020-03-18
3+date = "2020-03-17"
4description = "Technical maxims that define Urbit's approach to engineering."
4description = "Technical maxims that define Urbit's approach to engineering."
5+
5[extra]
6[extra]
6author = "Philip Monk"
7author = "Philip Monk"
7ship = "~wicdev-wisryt"
8ship = "~wicdev-wisryt"
8−image ="https://media.urbit.org/site/posts/essays/pre-01.jpg"
9+image = "https://media.urbit.org/site/posts/essays/pre-01.jpg"
9+++
10+++
10
11
11<br>
12<br>
12
13
13<img class="ba" src="https://media.urbit.org/site/posts/essays/pre-01.jpg">
14<img class="ba" src="https://media.urbit.org/site/posts/essays/pre-01.jpg">
14
15
15−Urbit is a principled approach to system design and programming, but it's often not obvious what those principles are. We have many specific terms for the different parts of the project: Arvo is the OS, Hoon is the language, Tlon is the company, Azimuth is the identity system, Ames is the network. But the word most associated with the project is "Urbit", and it's not clear what technically it refers to. It's only a small stretch to say that "Urbit" *is* this set of principles, and that if anybody follows these principles strictly they will create a system that is isomorphic to the Urbit.
16+Urbit is a principled approach to system design and programming, but it's often not obvious what those principles are. We have many specific terms for the different parts of the project: Arvo is the OS, Hoon is the language, Tlon is the company, Azimuth is the identity system, Ames is the network. But the word most associated with the project is "Urbit", and it's not clear what technically it refers to. It's only a small stretch to say that "Urbit" _is_ this set of principles, and that if anybody follows these principles strictly they will create a system that is isomorphic to the Urbit.
16
17
17Some of these are commonly held among many software projects, and some are not. Some are only debatably better than the alternatives, but Urbit exclusively chooses them.
18Some of these are commonly held among many software projects, and some are not. Some are only debatably better than the alternatives, but Urbit exclusively chooses them.
18
19
@@ -22,120 +23,119 @@ We’ll start with a brief description of many principles, then we’ll go into
22
23
23<img class="ba" src="https://media.urbit.org/site/posts/essays/pre-02.jpg">
24<img class="ba" src="https://media.urbit.org/site/posts/essays/pre-02.jpg">
24
25
25−
26### A: General Design
26### A: General Design
27
27
28−1) Data is better than code.
28+1. Data is better than code.
29
29
30− Store data in your state, send data over the wire, dispatch based
30+ Store data in your state, send data over the wire, dispatch based
31− on data.
31+ on data.
32
32
33−2) Everything should be CQRS.
33+2. Everything should be CQRS.
34
34
35−3) (Almost) Everything should be pubsub.
35+3. (Almost) Everything should be pubsub.
36
36
37−4) A subscriber shouldn't affect a publisher.
37+4. A subscriber shouldn't affect a publisher.
38
38
39−5) Communication between nodes should be communication between
39+5. Communication between nodes should be communication between
40 independent actors.
40 independent actors.
41
41
42− Each message should do one complete thing, and there shouldn't
42+ Each message should do one complete thing, and there shouldn't
43− need to be a sequence of coupled messages.
43+ need to be a sequence of coupled messages.
44
44
45−6) Represent your data as closely as possible to the essential structure
45+6. Represent your data as closely as possible to the essential structure
46 of the problem.
46 of the problem.
47
47
48−7) A client's representation of data should be as close as possible to
48+7. A client's representation of data should be as close as possible to
49 that of the server.
49 that of the server.
50
50
51− This blurs the distinction between client and server. It allows
51+ This blurs the distinction between client and server. It allows
52− offline-mode, reduces communication to syncing, and decentralizes.
52+ offline-mode, reduces communication to syncing, and decentralizes.
53
53
54−8) When mating different paradigms, build one cleanly on top of the
54+8. When mating different paradigms, build one cleanly on top of the
55 other.
55 other.
56
56
57− Never try to make them work on some of the same primitives. Never
57+ Never try to make them work on some of the same primitives. Never
58− abuse one to make the other work. For example, ducts in
58+ abuse one to make the other work. For example, ducts in
59− themselves are very general - if you want to do pubsub, that can
59+ themselves are very general - if you want to do pubsub, that can
60− easily be built on top of ducts, but don't pretend that pubsub is
60+ easily be built on top of ducts, but don't pretend that pubsub is
61− a *part* of the duct system.
61+ a _part_ of the duct system.
62
62
63−9) Never misuse an abstraction.
63+9. Never misuse an abstraction.
64
64
65− An abstraction provides a certain set of tools; use them and only
65+ An abstraction provides a certain set of tools; use them and only
66− them.
66+ them.
67
67
68−10) Correctness is more important than performance.
68+10. Correctness is more important than performance.
69
69
70−11) Be simple and uncompromising in defining what's correct; go crazy
70+11. Be simple and uncompromising in defining what's correct; go crazy
71 with optimizations.
71 with optimizations.
72
72
73− Nock is a great example of this. It contains the character of the
73+ Nock is a great example of this. It contains the character of the
74− virtual machine, but its asymptotics are bad. Add jets to fix the
74+ virtual machine, but its asymptotics are bad. Add jets to fix the
75− asymptotics.
75+ asymptotics.
76−
76+
77− Another example is the ACID nature of Arvo. Arvo is a pure
77+ Another example is the ACID nature of Arvo. Arvo is a pure
78− function f(logs) of its event log, so formally Arvo is just a
78+ function f(logs) of its event log, so formally Arvo is just a
79− function run against an event log. A naive implementation has
79+ function run against an event log. A naive implementation has
80− very bad asymptotics; processing each new event is O(n) in the
80+ very bad asymptotics; processing each new event is O(n) in the
81− number of historical events. Choose the function g(state,log)
81+ number of historical events. Choose the function g(state,log)
82− such that f(logs ++ log) = g(f(logs),log). Then, as long as you
82+ such that f(logs ++ log) = g(f(logs),log). Then, as long as you
83− keep the state in memory, processing each new event is constant in
83+ keep the state in memory, processing each new event is constant in
84− the number of previous events. This still requires O(n) restart
84+ the number of previous events. This still requires O(n) restart
85− from disk, but you can also periodically (and non-blockingly)
85+ from disk, but you can also periodically (and non-blockingly)
86− write a checkpoint of the state to disk, so that restart from disk
86+ write a checkpoint of the state to disk, so that restart from disk
87− is only linear in the number of events since the last checkpoint.
87+ is only linear in the number of events since the last checkpoint.
88−
88+
89−12) Correctness is more important than optimality.
89+12. Correctness is more important than optimality.
90−
90+
91−13) If you don't completely understand your code and the semantics of
91+13. If you don't completely understand your code and the semantics of
92 all the code it depends on, your code is wrong.
92 all the code it depends on, your code is wrong.
93
93
94−14) Deterministic beats heuristic.
94+14. Deterministic beats heuristic.
95
95
96− Heuristics are evil and should only be used where determinism is
96+ Heuristics are evil and should only be used where determinism is
97− infeasible, such as in cache reclamation.
97+ infeasible, such as in cache reclamation.
98
98
99−15) Stateless is better than stateful.
99+15. Stateless is better than stateful.
100
100
101−16) Explicit state is better than implicit state.
101+16. Explicit state is better than implicit state.
102
102
103−17) Referential transparency is honesty and stability.
103+17. Referential transparency is honesty and stability.
104
104
105− Lack of referential transparency and other forms of
105+ Lack of referential transparency and other forms of
106− disingenuousness are some of the world's big problems. Only
106+ disingenuousness are some of the world's big problems. Only
107− deviate from referential transparency if absolutely necessary.
107+ deviate from referential transparency if absolutely necessary.
108
108
109−18) Responsibilities should be clearly separated.
109+18. Responsibilities should be clearly separated.
110
110
111− This applies from kernel modules through network citizens.
111+ This applies from kernel modules through network citizens.
112
112
113−19) Dualities must be faced head-on and analyzed differently at
113+19. Dualities must be faced head-on and analyzed differently at
114 different layers.
114 different layers.
115
115
116− Statically typed vs. dynamically typed, imperative vs. functional,
116+ Statically typed vs. dynamically typed, imperative vs. functional,
117− code vs. data, and effectful vs. pure can all be a matter of
117+ code vs. data, and effectful vs. pure can all be a matter of
118− perspective, and all relevant perspectives must have coherent
118+ perspective, and all relevant perspectives must have coherent
119− answers.
119+ answers.
120
120
121−20) One hundred lines of simplicity is better than twenty lines of
121+20. One hundred lines of simplicity is better than twenty lines of
122 complexity.
122 complexity.
123
123
124− It's not enough for an abstraction to reduce code duplication; it
124+ It's not enough for an abstraction to reduce code duplication; it
125− must actually make the code simpler.
125+ must actually make the code simpler.
126
126
127−21) Prefer mechanical simplicity to mathematical simplicity.
127+21. Prefer mechanical simplicity to mathematical simplicity.
128
128
129− Often mechanical simplicity and mathematical simplicity go
129+ Often mechanical simplicity and mathematical simplicity go
130− together.
130+ together.
131
131
132−22) The Law of Leaky Abstractions is a lie; abstract airtightly.
132+22. The Law of Leaky Abstractions is a lie; abstract airtightly.
133
133
134− If your abstractions are leaking, it's not due to some law of the
134+ If your abstractions are leaking, it's not due to some law of the
135− universe; you just suck at abstracting. Usually, you didn't
135+ universe; you just suck at abstracting. Usually, you didn't
136− specify the abstraction narrowly enough.
136+ specify the abstraction narrowly enough.
137
137
138−23) Some cliches are repeated because they are true; others must be
138+23. Some cliches are repeated because they are true; others must be
139 repeated because they are not.
139 repeated because they are not.
140
140
141<br>
141<br>
@@ -144,31 +144,31 @@ We’ll start with a brief description of many principles, then we’ll go into
144
144
145### B: Specific Design
145### B: Specific Design
146
146
147−1) Always ack a dupe; never ack an ack.
147+1. Always ack a dupe; never ack an ack.
148+
149+ It's okay to ack a nack as long as you never nack a nack.
148
150
149− It's okay to ack a nack as long as you never nack a nack.
151+2. Never construct or deconstruct a duct.
150
152
151−2) Never construct or deconstruct a duct.
153+3. Route on wire before sign, never sign before wire.
152
154
153−3) Route on wire before sign, never sign before wire.
155+4. Only go from statically typed to dynamically typed if you must.
154
156
155−4) Only go from statically typed to dynamically typed if you must.
157+ Once you go into a dynamically typed world, it's hard to go back.
158+ Statically typed is better than dynamically typed, so if something
159+ can be made static, it should be.
156
160
157− Once you go into a dynamically typed world, it's hard to go back.
158− Statically typed is better than dynamically typed, so if something
159− can be made static, it should be.
160−
161− Each timeless data structure is a brick in the foundation of
161+ Each timeless data structure is a brick in the foundation of
162− digital civilization.
162+ digital civilization.
163
163
164−5) Anything with business logic speaks one paradigm; anything that
164+5. Anything with business logic speaks one paradigm; anything that
165 translates paradigms has no business logic.
165 translates paradigms has no business logic.
166
166
167−6) Functionally enforced semantic rules are better security primitives
167+6. Functionally enforced semantic rules are better security primitives
168 than memory access restrictions.
168 than memory access restrictions.
169
169
170− A compiler can use type safety as an effective tool to enforce
170+ A compiler can use type safety as an effective tool to enforce
171− some classes of security guarantees.
171+ some classes of security guarantees.
172
172
173<br>
173<br>
174
174
@@ -176,30 +176,30 @@ We’ll start with a brief description of many principles, then we’ll go into
176
176
177### C: Attitude
177### C: Attitude
178
178
179−1) Code courageously.
179+1. Code courageously.
180
180
181− If you avoid changing a section of code for fear of awakening the
181+ If you avoid changing a section of code for fear of awakening the
182− demons therein, you are living in fear. If you stay in the
182+ demons therein, you are living in fear. If you stay in the
183− comfortable confines of the small section of the code you wrote or
183+ comfortable confines of the small section of the code you wrote or
184− know well, you will never write legendary code. All code was
184+ know well, you will never write legendary code. All code was
185− written by humans and can be mastered by humans.
185+ written by humans and can be mastered by humans.
186
186
187− It's natural to feel fear of code; however, you must act as though
187+ It's natural to feel fear of code; however, you must act as though
188− you are able to master and change any part of it. To code
188+ you are able to master and change any part of it. To code
189− courageously is to walk into any abyss, bring light, and make it
189+ courageously is to walk into any abyss, bring light, and make it
190− right.
190+ right.
191
191
192−2) No time for lazy people.
192+2. No time for lazy people.
193
193
194− If there's clearly a right way to do something and a wrong way, do
194+ If there's clearly a right way to do something and a wrong way, do
195− it the right way. Coding requires incredible discipline. Always
195+ it the right way. Coding requires incredible discipline. Always
196− follow conventions, and fire anyone who won't. Anything that can
196+ follow conventions, and fire anyone who won't. Anything that can
197− be solved by discipline is not a real problem.
197+ be solved by discipline is not a real problem.
198
198
199− > "To him who knows to do good and does not do it, to him it is
199+ > "To him who knows to do good and does not do it, to him it is
200− sin."
200+ > sin."
201
201
202−3) When a smart person makes an obviously stupid suggestion, before
202+3. When a smart person makes an obviously stupid suggestion, before
203 responding take a full 60 seconds to envision how you would implement
203 responding take a full 60 seconds to envision how you would implement
204 it and what the effects would be.
204 it and what the effects would be.
205
205
@@ -209,46 +209,46 @@ We’ll start with a brief description of many principles, then we’ll go into
209
209
210### D: Theory
210### D: Theory
211
211
212−1) Academia is a succubus.
212+1. Academia is a succubus.
213
213
214− Academia has a really high ratio of smart people to useful
214+ Academia has a really high ratio of smart people to useful
215− products. Academia has many genuinely smart and interesting
215+ products. Academia has many genuinely smart and interesting
216− ideas, but always remember that pursuing them whole-heartedly will
216+ ideas, but always remember that pursuing them whole-heartedly will
217− never result in a useful product.
217+ never result in a useful product.
218
218
219−2) Never fear math.
219+2. Never fear math.
220
220
221− Academia is inefficient, but it's also correct. Those people
221+ Academia is inefficient, but it's also correct. Those people
222− wasted a lot of time finding the right answer, but now that
222+ wasted a lot of time finding the right answer, but now that
223− they've done it, you must exploit it. If you don't know the
223+ they've done it, you must exploit it. If you don't know the
224− theory, learn it. No excuse for being "bad at math". Most who
224+ theory, learn it. No excuse for being "bad at math". Most who
225− are "bad at math" are simply lazy or fearful. Be strong and of
225+ are "bad at math" are simply lazy or fearful. Be strong and of
226− good courage. If you're truly so bad at math that you cannot
226+ good courage. If you're truly so bad at math that you cannot
227− learn it, you should not design systems.
227+ learn it, you should not design systems.
228
228
229−3) Not being qualified to solve a problem is no reason not to solve it.
229+3. Not being qualified to solve a problem is no reason not to solve it.
230
230
231− If you don't know how to do it, do it anyway. "We are too young
231+ If you don't know how to do it, do it anyway. "We are too young
232− to realize that certain things are impossible. So, we will do
232+ to realize that certain things are impossible. So, we will do
233− them anyway."
233+ them anyway."
234
234
235−4) The best way to get the right answer is to try it the wrong way.
235+4. The best way to get the right answer is to try it the wrong way.
236
236
237− You cannot design a good system without spending most of your time
237+ You cannot design a good system without spending most of your time
238− in contact with the problem. The bad parts about systems are
238+ in contact with the problem. The bad parts about systems are
239− rarely obvious in theory, but often in practice.
239+ rarely obvious in theory, but often in practice.
240
240
241−5) Practice tells you that things are good or bad; theory tells you why.
241+5. Practice tells you that things are good or bad; theory tells you why.
242
242
243− Never use theory to design a good system from scratch; only
243+ Never use theory to design a good system from scratch; only
244− practice can tell whether the system is good.
244+ practice can tell whether the system is good.
245
245
246−6) Everyone must regularly alternate between theory and practice.
246+6. Everyone must regularly alternate between theory and practice.
247
247
248− There is an eternal wheel of system design. Given a system, use
248+ There is an eternal wheel of system design. Given a system, use
249− practice to discover what is bad, missing, or unnecessary. Then,
249+ practice to discover what is bad, missing, or unnecessary. Then,
250− use theory to fix the bad, add the missing, and remove the
250+ use theory to fix the bad, add the missing, and remove the
251− unnecessary. Repeat.
251+ unnecessary. Repeat.
252
252
253<br>
253<br>
254
254
@@ -256,34 +256,34 @@ We’ll start with a brief description of many principles, then we’ll go into
256
256
257### E: Text Style
257### E: Text Style
258
258
259−1) No code should extend beyond 80 characters, most within 55.
259+1. No code should extend beyond 80 characters, most within 55.
260
260
261−2) Tabs aren't real.
261+2. Tabs aren't real.
262
262
263−3) A text file is a series of lines, each ending with a newline
263+3. A text file is a series of lines, each ending with a newline
264 character.
264 character.
265
265
266− Corollary: all non-empty text files end with a newline (often
266+ Corollary: all non-empty text files end with a newline (often
267− hidden by editors). An empty text file does not end with a
267+ hidden by editors). An empty text file does not end with a
268− newline.
268+ newline.
269
269
270−4) One block comment is better than interleaved comments on every line.
270+4. One block comment is better than interleaved comments on every line.
271
271
272−5) Don't name anything you don't have to.
272+5. Don't name anything you don't have to.
273
273
274− This includes conventional names for variables of particular
274+ This includes conventional names for variables of particular
275− types. For example, the conventional name for a variable of type
275+ types. For example, the conventional name for a variable of type
276− `path` is `pax`. You should have a good reason for using any
276+ `path` is `pax`. You should have a good reason for using any
277− other name for a `path`.
277+ other name for a `path`.
278
278
279− A more recent convention that follows the same principle is to
279+ A more recent convention that follows the same principle is to
280− give the variable the same name as its type.
280+ give the variable the same name as its type.
281
281
282−6) If it's the same thing, give it the same name.
282+6. If it's the same thing, give it the same name.
283
283
284−7) Humans are good at memorizing.
284+7. Humans are good at memorizing.
285
285
286−8) Abbreviations aren't worth it.
286+8. Abbreviations aren't worth it.
287
287
288<br>
288<br>
289
289
@@ -291,65 +291,65 @@ We’ll start with a brief description of many principles, then we’ll go into
291
291
292### F: Real Software
292### F: Real Software
293
293
294−1) If it's not deterministic, it isn't real.
294+1. If it's not deterministic, it isn't real.
295
295
296−2) If it's centralized, it isn't real.
296+2. If it's centralized, it isn't real.
297
297
298−3) If it's owned by someone else, it isn't yours.
298+3. If it's owned by someone else, it isn't yours.
299
299
300−4) If it's managed by someone else and you can't change who that is, it
300+4. If it's managed by someone else and you can't change who that is, it
301 isn't yours.
301 isn't yours.
302
302
303−5) If it's not yours, it isn't permanent.
303+5. If it's not yours, it isn't permanent.
304
304
305−6) If it's not permanent, it isn't real.
305+6. If it's not permanent, it isn't real.
306
306
307−7) The way it is isn't always the way it ought to be.
307+7. The way it is isn't always the way it ought to be.
308
308
309− If you can make it the way it ought to be, do so.
309+ If you can make it the way it ought to be, do so.
310
310
311−8) The way it ought to be isn't always the way it is.
311+8. The way it ought to be isn't always the way it is.
312
312
313− Some things can't be made more elegant.
313+ Some things can't be made more elegant.
314
314
315− For every ailment under the sun
315+ For every ailment under the sun
316− There is a remedy, or there is none;
316+ There is a remedy, or there is none;
317− If there be one, try to find it;
317+ If there be one, try to find it;
318− If there be none, never mind it.
318+ If there be none, never mind it.
319
319
320−9) Timeless software is good software.
320+9. Timeless software is good software.
321
321
322−10) System modules should be designed to be frozen permanently;
322+10. System modules should be designed to be frozen permanently;
323 conversely, Urbit consists of that system software which admits of a
323 conversely, Urbit consists of that system software which admits of a
324 Kelvin version.
324 Kelvin version.
325
325
326−11) The two procedures for achieving timelessness are distillation and
326+11. The two procedures for achieving timelessness are distillation and
327 generalization.
327 generalization.
328
328
329− Every temporary or contingent feature in a system module should
329+ Every temporary or contingent feature in a system module should
330− eventually either be removed (distillation) or relaxed into
330+ eventually either be removed (distillation) or relaxed into
331− timelessness (generalization). For an example of the result of
331+ timelessness (generalization). For an example of the result of
332− both procedures, consider the abstraction of the core in Nock and
332+ both procedures, consider the abstraction of the core in Nock and
333− Hoon.
333+ Hoon.
334
334
335−12) Standardization is better than perfection.
335+12. Standardization is better than perfection.
336
336
337− Kelvin versioning stops when we run out of versions, not when
337+ Kelvin versioning stops when we run out of versions, not when
338− every defect has been rectified.
338+ every defect has been rectified.
339
339
340−13) That which cannot be Kelvin-versioned should update fluidly and
340+13. That which cannot be Kelvin-versioned should update fluidly and
341 automatically.
341 automatically.
342
342
343− All incompatible upgrades should provide permanent and automatic
343+ All incompatible upgrades should provide permanent and automatic
344− upgrade paths. This is principled permanent backward
344+ upgrade paths. This is principled permanent backward
345− compatibility.
345+ compatibility.
346
346
347−14) Humans are interactive and temporal; technology is permanent and
347+14. Humans are interactive and temporal; technology is permanent and
348 exhaustive.
348 exhaustive.
349
349
350−15) Communities are autonomous.
350+15. Communities are autonomous.
351
351
352−16) Sovereignty necessitates understanding.
352+16. Sovereignty necessitates understanding.
353
353
354− If you don't understand a system you're using, you don't control
354+ If you don't understand a system you're using, you don't control
355− it. If nobody understands the system, the system is in control.
355+ it. If nobody understands the system, the system is in control.
content/blog/providers.md+24−27
@@ -1,11 +1,12 @@
1+++
1+++
2title = "Providers"
2title = "Providers"
3−date = 2020-08-18
3+date = "2020-08-17"
4description = "We’ve always assumed that providers would have to come into existence sooner or later. By the look of it, that time is now. Tlon and a few others have provider-like services in the works."
4description = "We’ve always assumed that providers would have to come into existence sooner or later. By the look of it, that time is now. Tlon and a few others have provider-like services in the works."
5+
5[extra]
6[extra]
6author = "Galen Wolfe-Pauly"
7author = "Galen Wolfe-Pauly"
7ship = "~ravmel-ropdyl"
8ship = "~ravmel-ropdyl"
8−image ="https://storage.googleapis.com/media.urbit.org/site/posts/essays/providers.png"
9+image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/providers.png"
9+++
10+++
10
11
11<br>
12<br>
@@ -14,76 +15,72 @@ image ="https://storage.googleapis.com/media.urbit.org/site/posts/essays/provide
14
15
15<br>
16<br>
16
17
17−We look forward to a future where your Urbit is an always-on, always-available service. You should be able to pick up any device and conjure up your whole digital life immediately.
18+We look forward to a future where your Urbit is an always-on, always-available service. You should be able to pick up any device and conjure up your whole digital life immediately.
18−
19−Sounds good—but how does this actually come to pass? Urbit has to be technically robust and have a nice interface. Assuming we can deliver both of those things, your Urbit node also has to be safe, secure, and running somewhere with a network connection.
20
19
21−Urbit has been getting nicer to use and more stable every day. We use it constantly, both as a company (Tlon) and for the broader Urbit community. From what we can tell, people are using Urbit to start communities of their own here and there. The problem is: to use our platform, you’ve got to run it yourself. This limits our audience *a lot*. Setting up a VPS and running an Urbit OS node is pretty easy if you’re comfortable in the command line, which makes it completely impossible for most people.
20+Sounds good—but how does this actually come to pass? Urbit has to be technically robust and have a nice interface. Assuming we can deliver both of those things, your Urbit node also has to be safe, secure, and running somewhere with a network connection.
22
21
23−We hear from people regularly who want to be able to sign up for Urbit like it was any cloud service. What they want is what we’ve been calling a *provider*: a service to provide easy onboarding and hosting. Given a good provider, we’d be pretty close to our long-term vision: Urbit would feel like a ubiquitous, easily accessible service.
22+Urbit has been getting nicer to use and more stable every day. We use it constantly, both as a company (Tlon) and for the broader Urbit community. From what we can tell, people are using Urbit to start communities of their own here and there. The problem is: to use our platform, you’ve got to run it yourself. This limits our audience _a lot_. Setting up a VPS and running an Urbit OS node is pretty easy if you’re comfortable in the command line, which makes it completely impossible for most people.
24
23
25−We’ve always assumed that providers would have to come into existence sooner or later. By the look of it, that time is now. Tlon and a few others have provider-like services in the works. We’ll talk about the specifics of what Tlon is planning to do in a future post. In this one, we’ll talk about what a provider is, why anyone would start one, and give a few examples of what they might look like.
24+We hear from people regularly who want to be able to sign up for Urbit like it was any cloud service. What they want is what we’ve been calling a _provider_: a service to provide easy onboarding and hosting. Given a good provider, we’d be pretty close to our long-term vision: Urbit would feel like a ubiquitous, easily accessible service.
26
25
26+We’ve always assumed that providers would have to come into existence sooner or later. By the look of it, that time is now. Tlon and a few others have provider-like services in the works. We’ll talk about the specifics of what Tlon is planning to do in a future post. In this one, we’ll talk about what a provider is, why anyone would start one, and give a few examples of what they might look like.
27
27
28## What is a provider?
28## What is a provider?
29
29
30−A provider is anyone (company, DAO, a group of friends) that provides easy onboarding and hosting.
30+A provider is anyone (company, DAO, a group of friends) that provides easy onboarding and hosting.
31
31
32−From a user perspective, signing up with a provider should be as simple as picking a planet and hosting plan, paying, and getting connected to a running Urbit OS node. This should be able to be done entirely in a browser or a standalone app and feel more or less like signing up for a conventional service.
32+From a user perspective, signing up with a provider should be as simple as picking a planet and hosting plan, paying, and getting connected to a running Urbit OS node. This should be able to be done entirely in a browser or a standalone app and feel more or less like signing up for a conventional service.
33
33
34From a technical perspective, this means a provider needs to create an Ethereum wallet for the user (client-side, of course), deliver an Urbit ID to it, and boot an Urbit OS node for them. And, at some point in the process, collect payment.
34From a technical perspective, this means a provider needs to create an Ethereum wallet for the user (client-side, of course), deliver an Urbit ID to it, and boot an Urbit OS node for them. And, at some point in the process, collect payment.
35
35
36−As a user, your provider is somewhere between your ISP and your WordPress host. Your provider both runs the star that sponsors your planet (and provides peer discovery) as well as potentially providing both access to communities and even provider-specific software. We don’t really expect providers to be terribly generic—quite the opposite. Providers are likely to differentiate themselves on price, available software, and available communities. We’ll get into some examples later.
36+As a user, your provider is somewhere between your ISP and your WordPress host. Your provider both runs the star that sponsors your planet (and provides peer discovery) as well as potentially providing both access to communities and even provider-specific software. We don’t really expect providers to be terribly generic—quite the opposite. Providers are likely to differentiate themselves on price, available software, and available communities. We’ll get into some examples later.
37
37
38−The utility that a provider offers involves quite a lot of trust on behalf of the user. While the provider never actually holds the keys to your Urbit ID, they do run your node and, in turn, can access its contents. Unlike giant cloud services, your data isn’t in an easily searchable database. Inspecting your data should be something explicitly protected by a good provider ToS.
38+The utility that a provider offers involves quite a lot of trust on behalf of the user. While the provider never actually holds the keys to your Urbit ID, they do run your node and, in turn, can access its contents. Unlike giant cloud services, your data isn’t in an easily searchable database. Inspecting your data should be something explicitly protected by a good provider ToS.
39
39
40−If a strongly worded ToS isn’t enough for you, you can always host yourself. And, given the way Urbit works, downloading your Urbit from a provider and running it elsewhere should be both really simple and something a provider will *always* let you do. It’s perfectly fine to run Urbit in your closet—which means that providers are really competing on ease of use and price.
40+If a strongly worded ToS isn’t enough for you, you can always host yourself. And, given the way Urbit works, downloading your Urbit from a provider and running it elsewhere should be both really simple and something a provider will _always_ let you do. It’s perfectly fine to run Urbit in your closet—which means that providers are really competing on ease of use and price.
41
41
42Let’s move on and talk a bit about why starting a provider makes sense to begin with.
42Let’s move on and talk a bit about why starting a provider makes sense to begin with.
43
43
44−
45## Why would anyone start a provider?
44## Why would anyone start a provider?
46
45
47Our aim is to make Urbit OS so obviously nice to use that it’s well worth paying for. Today, a planet goes for about $10–$20 and, once you buy one, you’ve got to figure out how to really put it to use. Which takes some work.
46Our aim is to make Urbit OS so obviously nice to use that it’s well worth paying for. Today, a planet goes for about $10–$20 and, once you buy one, you’ve got to figure out how to really put it to use. Which takes some work.
48
47
49Any large holder of address space should immediately see the opportunity here: the more useful Urbit is, the more value can be captured by starting a provider. Providers make it possible to actually capture the value in address space, both by selling it and by operating nodes.
48Any large holder of address space should immediately see the opportunity here: the more useful Urbit is, the more value can be captured by starting a provider. Providers make it possible to actually capture the value in address space, both by selling it and by operating nodes.
50
49
51−Let’s say the base cost of running an Urbit OS node, in a hosted environment, is $10 / node / month. If you can sell hosting for $200 / year, you’re making back the ‘cost’ of the planet when someone signs up. Given that it’s more desirable to buy a planet when you know the star is online and you can put it to good use, this seems like a pretty good proposition: both for the provider and the customer.
50+Let’s say the base cost of running an Urbit OS node, in a hosted environment, is $10 / node / month. If you can sell hosting for $200 / year, you’re making back the ‘cost’ of the planet when someone signs up. Given that it’s more desirable to buy a planet when you know the star is online and you can put it to good use, this seems like a pretty good proposition: both for the provider and the customer.
52
51
53−Starting a provider doesn’t *have* to be done by address-space holders. You could start a provider with no address space of your own by custodying the address space of others. Then, you could take a cut of the address space sales and all of the hosting revenue. With a market of people looking to use Urbit, the crux of success with this approach is simply whether you can compete on user experience.
52+Starting a provider doesn’t _have_ to be done by address-space holders. You could start a provider with no address space of your own by custodying the address space of others. Then, you could take a cut of the address space sales and all of the hosting revenue. With a market of people looking to use Urbit, the crux of success with this approach is simply whether you can compete on user experience.
54
53
55Providers are, in a way, like the miners of Urbit. They’re incentivized to run fleets of very specific VMs for profit. The profit motive, in Urbit’s case, is just a bit more conventional than a bitcoin miner. An Urbit provider is just offering a service in exchange for money.
54Providers are, in a way, like the miners of Urbit. They’re incentivized to run fleets of very specific VMs for profit. The profit motive, in Urbit’s case, is just a bit more conventional than a bitcoin miner. An Urbit provider is just offering a service in exchange for money.
56
55
57−
58## What are some examples of providers?
56## What are some examples of providers?
59
57
60−If you think of a provider simply as a business, its most basic incentive is to attract as many customers as possible. You can do that by competing on price or performance, or by competing on aesthetics and community—there are lots of ways that providers can compete.
58+If you think of a provider simply as a business, its most basic incentive is to attract as many customers as possible. You can do that by competing on price or performance, or by competing on aesthetics and community—there are lots of ways that providers can compete.
61
59
62−As a roughly similar ecosystem, the world of webhosting is a great comparison. There are lots of small webhosts that all have very specific services: Dreamhost, MediaTemple, prgmr.com, and Linode all come to mind. Then there are the more generic, large-scale, performance-oriented options: AWS, GCP, Azure. It’s not quite time for an AWS-scale Urbit provider, but perhaps the AWS of Urbit will start as something much smaller.
60+As a roughly similar ecosystem, the world of webhosting is a great comparison. There are lots of small webhosts that all have very specific services: Dreamhost, MediaTemple, prgmr.com, and Linode all come to mind. Then there are the more generic, large-scale, performance-oriented options: AWS, GCP, Azure. It’s not quite time for an AWS-scale Urbit provider, but perhaps the AWS of Urbit will start as something much smaller.
63
61
64Let’s walk through a few examples to get a feel for what’s possible:
62Let’s walk through a few examples to get a feel for what’s possible:
65
63
66Communities -
64Communities -
67
65
68−A provider could easily curate community content like news, events, and discussion that it only delivers to its customers. Think of it as a bit like the days of sharing a server among friends—only in this case it could be hundreds or thousands of people who form a collective to run infrastructure and share information.
66+A provider could easily curate community content like news, events, and discussion that it only delivers to its customers. Think of it as a bit like the days of sharing a server among friends—only in this case it could be hundreds or thousands of people who form a collective to run infrastructure and share information.
69
67
70−Custom software -
68+Custom software -
71
69
72−There are so many ways that providers can offer custom software. Urbit isn’t ready for third party software distribution. When it is, subscribers to a specific provider could get unique modules and applications synced directly to their Urbit nodes along with their membership.
70+There are so many ways that providers can offer custom software. Urbit isn’t ready for third party software distribution. When it is, subscribers to a specific provider could get unique modules and applications synced directly to their Urbit nodes along with their membership.
73
71
74Aside from Urbit-specific software, providers could provide custom software services to their subscribers. A straightforward example of this could come in the form of Bitcoin or Ethereum nodes for processing transactions. Sign up with a provider and get the ability to send transactions to the chain quickly and reliably.
72Aside from Urbit-specific software, providers could provide custom software services to their subscribers. A straightforward example of this could come in the form of Bitcoin or Ethereum nodes for processing transactions. Sign up with a provider and get the ability to send transactions to the chain quickly and reliably.
75
73
76−Security -
74+Security -
77
75
78Let’s say our base cost of $10 / month / planet from above is correct (it’s probably high, but it’s a simple number). Would someone pay $100 / month for a planet hosted in a bunker or in the pylon of an abandoned oil rig? Maybe.
76Let’s say our base cost of $10 / month / planet from above is correct (it’s probably high, but it’s a simple number). Would someone pay $100 / month for a planet hosted in a bunker or in the pylon of an abandoned oil rig? Maybe.
79
77
80−
81## What about Tlon?
78## What about Tlon?
82
79
83−Before there can be an ecosystem of providers, there has to be *one* provider. While we’ve heard of a few other people working on things, we expect Tlon to be the first to try to really get into the provider business in earnest.
80+Before there can be an ecosystem of providers, there has to be _one_ provider. While we’ve heard of a few other people working on things, we expect Tlon to be the first to try to really get into the provider business in earnest.
84
81
85I’ll save the details of what we’re going to do for a future post. Launching Tlon as a separate business will be the beginning of the separation of Tlon and Urbit. I’m really quite excited about it. Tlon is only able to consider becoming a business of its own because Urbit is mature enough that we can actually do it.
82I’ll save the details of what we’re going to do for a future post. Launching Tlon as a separate business will be the beginning of the separation of Tlon and Urbit. I’m really quite excited about it. Tlon is only able to consider becoming a business of its own because Urbit is mature enough that we can actually do it.
86
83
87−For now, I’ll just say that Tlon will pick the low-hanging fruit first. Our goal is to make onboarding a group into Urbit incredibly simple. We want people to be able to go from email invite to running Urbit in a few minutes without ever knowing anything about Ethereum, Unix, or what a private key is.
84+For now, I’ll just say that Tlon will pick the low-hanging fruit first. Our goal is to make onboarding a group into Urbit incredibly simple. We want people to be able to go from email invite to running Urbit in a few minutes without ever knowing anything about Ethereum, Unix, or what a private key is.
88
85
89−Once we’ve laid the groundwork with something that *just works*, we plan to open-source some of our components. Scaling up Urbit isn’t going to be easy. We hope that others will help us, and will help explore what’s possible in supporting Urbit users in the future.
86+Once we’ve laid the groundwork with something that _just works_, we plan to open-source some of our components. Scaling up Urbit isn’t going to be easy. We hope that others will help us, and will help explore what’s possible in supporting Urbit users in the future.
content/blog/rollups.md+12−10
@@ -1,7 +1,8 @@
1+++
1+++
2title = "The Gang Solves the Gas Crisis"
2title = "The Gang Solves the Gas Crisis"
3−date = 2021-05-14
3+date = "2021-05-13"
4description = "How we're making Urbit ID affordable again"
4description = "How we're making Urbit ID affordable again"
5+
5[extra]
6[extra]
6author = "Jonathan Paprocki"
7author = "Jonathan Paprocki"
7ship = "~datnut-pollen"
8ship = "~datnut-pollen"
@@ -175,10 +176,11 @@ these factors to be included in the roller documentation.
175governing Urbit ID. They will require a few changes to accommodate the new
176governing Urbit ID. They will require a few changes to accommodate the new
176system. Some of this has been implicit above, but to be clear, we will only be
177system. Some of this has been implicit above, but to be clear, we will only be
177making a couple minor alterations:
178making a couple minor alterations:
179+
178− - Once a star's spawn proxy is set to the layer 2 address, it can't be switched
180+- Once a star's spawn proxy is set to the layer 2 address, it can't be switched
179− back, and they can no longer spawn layer 1 planets.
181+ back, and they can no longer spawn layer 1 planets.
180− - Galaxies and their proxies cannot be deposited to layer 2.
182+- Galaxies and their proxies cannot be deposited to layer 2.
181−Some other minor details are yet to be worked out, but again, nothing will change for those who wish to remain on layer 1.
183+ Some other minor details are yet to be worked out, but again, nothing will change for those who wish to remain on layer 1.
182
184
183### Technical details {#technical}
185### Technical details {#technical}
184
186
@@ -187,10 +189,11 @@ What's really going on behind the scenes here? Briefly, only the data of the Urb
187In layer 1, the [Ethereum Virtual Machine (EVM)](https://ethereum.org/en/developers/docs/evm/) guarantees the validity of state transitions, while for layer 2 transactions, each Urbit node guarantees the validity of the state transitions.
189In layer 1, the [Ethereum Virtual Machine (EVM)](https://ethereum.org/en/developers/docs/evm/) guarantees the validity of state transitions, while for layer 2 transactions, each Urbit node guarantees the validity of the state transitions.
188
190
189Changes to the state of Urbit ID on layer 1 works as follows:
191Changes to the state of Urbit ID on layer 1 works as follows:
192+
190− 1. A transaction is posted to the Ethereum blockchain.
193+1. A transaction is posted to the Ethereum blockchain.
191− 2. The EVM calculates the resulting state transition and checks its validity, then updates the state.
194+2. The EVM calculates the resulting state transition and checks its validity, then updates the state.
192− 3. Your urbit downloads the new state from an Ethereum node.
195+3. Your urbit downloads the new state from an Ethereum node.
193− 4. Your urbit makes the final decision on whether the new state is valid.
196+4. Your urbit makes the final decision on whether the new state is valid.
194
197
195In practice, the fourth step is never used in layer 1. The primary change to our
198In practice, the fourth step is never used in layer 1. The primary change to our
196security model is that we are cutting out step 2 and beefing up step 4. Your
199security model is that we are cutting out step 2 and beefing up step 4. Your
@@ -217,4 +220,3 @@ post on the `urbit-dev` mailing list. Lastly, the primary working branch on
217Github for the Urbit side of naive rollups is
220Github for the Urbit side of naive rollups is
218[here](https://github.com/urbit/urbit/tree/philip/naive), though it is not the
221[here](https://github.com/urbit/urbit/tree/philip/naive), though it is not the
219only place code is accumulating.
222only place code is accumulating.
220−
content/blog/security-and-continuity.md+3−5
@@ -1,7 +1,8 @@
1+++
1+++
2title = "Security and Continuity"
2title = "Security and Continuity"
3description = "An update on our primary infrastructure milestones for 2020."
3description = "An update on our primary infrastructure milestones for 2020."
4−date = 2020-12-01
4+date = "2020-11-30"
5+
5[extra]
6[extra]
6author = "Galen Wolfe-Pauly"
7author = "Galen Wolfe-Pauly"
7ship = "~ravmel-ropdyl"
8ship = "~ravmel-ropdyl"
@@ -20,7 +21,6 @@ For this year, we committed to completing two things: passing a third-party secu
20
21
21We’ve been steadily making progress on these two fronts, and I’m happy to report both are nearly complete. We’ll walk through some of the details here and then follow up in another post soon to report on how the final work turned out.
22We’ve been steadily making progress on these two fronts, and I’m happy to report both are nearly complete. We’ll walk through some of the details here and then follow up in another post soon to report on how the final work turned out.
22
23
23−
24## Ames Audit
24## Ames Audit
25
25
26Urbit OS is an ‘overlay OS’: it runs on top of (pretty much) any flavor of Unix. Each Urbit OS node communicates with other nodes over UDP using Ames, the Urbit-specific networking protocol.
26Urbit OS is an ‘overlay OS’: it runs on top of (pretty much) any flavor of Unix. Each Urbit OS node communicates with other nodes over UDP using Ames, the Urbit-specific networking protocol.
@@ -41,18 +41,16 @@ The good thing about an audit scoped in this way is that we can trust the protoc
41
41
42As of the end of November 2020, the audit is very nearly complete, and we’ve handled all the important issues that were brought up. We’ll post the results and talk about our mitigation strategies in a future writeup.
42As of the end of November 2020, the audit is very nearly complete, and we’ve handled all the important issues that were brought up. We’ll post the results and talk about our mitigation strategies in a future writeup.
43
43
44−
45## Continuity
44## Continuity
46
45
47Urbit is designed to last a long time. What’s the use of a personal computer if it’s gonna disappear along with all the data you put in it? Ideally, you can put your Urbit on a USB stick, forget about it for ten years and have it work again when you plug it in. It’ll need to update for a while, but once our work on continuity is complete, your urbit should be able to upgrade itself through ten years of updates, all over the air.
46Urbit is designed to last a long time. What’s the use of a personal computer if it’s gonna disappear along with all the data you put in it? Ideally, you can put your Urbit on a USB stick, forget about it for ten years and have it work again when you plug it in. It’ll need to update for a while, but once our work on continuity is complete, your urbit should be able to upgrade itself through ten years of updates, all over the air.
48
47
49−While Urbit is designed to upgrade seamlessly over the network we have occasionally run into issues that have caused us to reboot the entire network. Most of the time this is when some incompatibility between the interpreter and the kernel means we have to force everyone to do a hard reset to ensure compatibility between the two. Our current work on continuity addresses this. Soon, your urbit will tell you when your interpreter needs to be upgraded. At first this won’t be that different from an application notifying you to download an update. Eventually, we think we can make this a lot smoother.
48+While Urbit is designed to upgrade seamlessly over the network we have occasionally run into issues that have caused us to reboot the entire network. Most of the time this is when some incompatibility between the interpreter and the kernel means we have to force everyone to do a hard reset to ensure compatibility between the two. Our current work on continuity addresses this. Soon, your urbit will tell you when your interpreter needs to be upgraded. At first this won’t be that different from an application notifying you to download an update. Eventually, we think we can make this a lot smoother.
50
49
51A network reboot isn’t the only way that we can break continuity. Urbit is a general-purpose computer — which means you’re free to attempt to destroy it. If, for any reason, you do manage to screw the system up we want you to be able to get your data out and effectively reset continuity on a single node. We built the affordance for that a while ago, but before the end of the year we’ll also distribute tooling to migrate userspace data between hard resets.
50A network reboot isn’t the only way that we can break continuity. Urbit is a general-purpose computer — which means you’re free to attempt to destroy it. If, for any reason, you do manage to screw the system up we want you to be able to get your data out and effectively reset continuity on a single node. We built the affordance for that a while ago, but before the end of the year we’ll also distribute tooling to migrate userspace data between hard resets.
52
51
53The combination of version negotiation and data migration should afford us the ability to run the network indefinitely into the future. Unfortunately, to get this change in, we’ll need to reset the network. We’re optimistic that this will be the last time we ever do it. And, given our data migration tooling, this breach won’t involve losing data.
52The combination of version negotiation and data migration should afford us the ability to run the network indefinitely into the future. Unfortunately, to get this change in, we’ll need to reset the network. We’re optimistic that this will be the last time we ever do it. And, given our data migration tooling, this breach won’t involve losing data.
54
53
55−
56## Status + conclusion
54## Status + conclusion
57
55
58We have been working with auditors since this summer and should have a report ready to publish in the next few weeks. Both version negotiation and data migration are in testing and are ready to be deployed.
56We have been working with auditors since this summer and should have a report ready to publish in the next few weeks. Both version negotiation and data migration are in testing and are ready to be deployed.
content/blog/security-audit.md+46−46
@@ -1,7 +1,8 @@
1+++
1+++
2title = "Ames Security Audit and the Future of the Protocol"
2title = "Ames Security Audit and the Future of the Protocol"
3description = "Ames’ design has unparalleled potential to deter, mitigate, and recover from attacks, since every packet is authenticated and encrypted and backed by a stable, decentralized PKI."
3description = "Ames’ design has unparalleled potential to deter, mitigate, and recover from attacks, since every packet is authenticated and encrypted and backed by a stable, decentralized PKI."
4−date = 2020-12-18
4+date = "2020-12-17"
5+
5[extra]
6[extra]
6author = "Ted Blackman + Anthony Arroyo"
7author = "Ted Blackman + Anthony Arroyo"
7ship = "~rovnys-ricfer + ~poldec-tonteg"
8ship = "~rovnys-ricfer + ~poldec-tonteg"
@@ -18,140 +19,139 @@ The security firm Leviathan has now finished their initial audit of the security
18
19
19I'm pleased to report they confirmed the cryptographic soundness of the protocol, namely that "a ship must have possession of their own valid Urbit key in order to authenticate as that ship and to send valid Ames messages. Additionally, no other ship except the two communicating may be able to decrypt or modify messages during transport."
20I'm pleased to report they confirmed the cryptographic soundness of the protocol, namely that "a ship must have possession of their own valid Urbit key in order to authenticate as that ship and to send valid Ames messages. Additionally, no other ship except the two communicating may be able to decrypt or modify messages during transport."
20
21
21−This means Ames uses cryptography in a mathematically sound manner that protects your privacy, keeps your secrets secret, and ensures nobody else will be able to impersonate you on the network. Since this was an architectural audit, it’s possible there are still vulnerabilities in the runtime implementation. Until the runtime has been hardened, Tlon continues to recommend against storing valuables in your ship.
22+This means Ames uses cryptography in a mathematically sound manner that protects your privacy, keeps your secrets secret, and ensures nobody else will be able to impersonate you on the network. Since this was an architectural audit, it’s possible there are still vulnerabilities in the runtime implementation. Until the runtime has been hardened, Tlon continues to recommend against storing valuables in your ship.
22
23
23Aside from a couple of minor issues that have already been resolved, there are three general classes of problem highlighted in their report that future work will need to address:
24Aside from a couple of minor issues that have already been resolved, there are three general classes of problem highlighted in their report that future work will need to address:
24
25
25−+ Forward secrecy
26+- Forward secrecy
26−+ Protection against denial of service attacks
27+- Protection against denial of service attacks
27−+ Enforcement of social boundaries
28+- Enforcement of social boundaries
28
29
29Ames’ design allows for versioning of the protocol, which means that the proposed changes below can be deployed as over-the-air updates as they become more pressing concerns. This feature gives us confidence that we can address future security issues as they arise.
30Ames’ design allows for versioning of the protocol, which means that the proposed changes below can be deployed as over-the-air updates as they become more pressing concerns. This feature gives us confidence that we can address future security issues as they arise.
30
31
31−We will need to improve all of these over the next couple of years, as independent lines of work. As the network grows: better forward secrecy will decrease the damage from a key getting compromised; resistance against denial of service attacks will make the Urbit network resilient to increasingly determined saboteurs; and stricter enforcement of social boundaries will let Urbit’s social networks remain safe and friendly despite potentially increasingly large numbers of bad actors and increasingly complex app ecosystems.
32+We will need to improve all of these over the next couple of years, as independent lines of work. As the network grows: better forward secrecy will decrease the damage from a key getting compromised; resistance against denial of service attacks will make the Urbit network resilient to increasingly determined saboteurs; and stricter enforcement of social boundaries will let Urbit’s social networks remain safe and friendly despite potentially increasingly large numbers of bad actors and increasingly complex app ecosystems.
32
33
33## Forward Secrecy
34## Forward Secrecy
34
35
35−A protocol is said to have forward secrecy if compromising a key used in a recent message doesn’t also compromise all previous messages. Similarly, a protocol is said to have backward secrecy -- also called future secrecy -- if compromising a key used in a previous message fails to compromise all future messages. Ames has some degree of both, but more would be better, to decrease the damage an attacker could inflict by compromising a key.
36+A protocol is said to have forward secrecy if compromising a key used in a recent message doesn’t also compromise all previous messages. Similarly, a protocol is said to have backward secrecy -- also called future secrecy -- if compromising a key used in a previous message fails to compromise all future messages. Ames has some degree of both, but more would be better, to decrease the damage an attacker could inflict by compromising a key.
36
37
37−As it stands, an Urbit user can change their Ames keys whenever they want, by conducting an Ethereum transaction to update the Ames public key listed in the Azimuth contract, which implements Urbit’s PKI on Ethereum. Compromise of one Ames private key does not compromise earlier or later keys, so this has both forward and backward secrecy. The main drawback is that Ethereum transactions can be expensive, so key rotation is likely to be infrequent, and an attacker might be able to gain access to a long stretch of time by compromising a single key.
38+As it stands, an Urbit user can change their Ames keys whenever they want, by conducting an Ethereum transaction to update the Ames public key listed in the Azimuth contract, which implements Urbit’s PKI on Ethereum. Compromise of one Ames private key does not compromise earlier or later keys, so this has both forward and backward secrecy. The main drawback is that Ethereum transactions can be expensive, so key rotation is likely to be infrequent, and an attacker might be able to gain access to a long stretch of time by compromising a single key.
38
39
39Various key rotation “ratchet” schemes could be added to Ames to establish varying degrees of forward and backward secrecy, and other kinds of cryptographic protections beyond basic soundness, such as break-in recovery.
40Various key rotation “ratchet” schemes could be added to Ames to establish varying degrees of forward and backward secrecy, and other kinds of cryptographic protections beyond basic soundness, such as break-in recovery.
40
41
41−Right now, changing a key through Azimuth is a manual process. It could be automated, possibly as one of a suite of services that an Urbit Provider will offer. Unfortunately, each key rotation costs the user money, so automating rotation could get prohibitively expensive.
42+Right now, changing a key through Azimuth is a manual process. It could be automated, possibly as one of a suite of services that an Urbit Provider will offer. Unfortunately, each key rotation costs the user money, so automating rotation could get prohibitively expensive.
42−Existing protocols, such as the Signal app's encrypted messaging protocol, the Noise protocol framework, and the Wireguard VPN protocol, use ephemeral Diffie-Hellman key exchange and KDF chaining to achieve forward and backward secrecy and self-healing.
43+Existing protocols, such as the Signal app's encrypted messaging protocol, the Noise protocol framework, and the Wireguard VPN protocol, use ephemeral Diffie-Hellman key exchange and KDF chaining to achieve forward and backward secrecy and self-healing.
43
44
44−Ames could be upgraded to use one of these existing ratchet algorithms, or we might create an Urbit-specific variant optimized for the Urbit network. This is work that should be done, but fortunately it will not require any novel research or drastic changes to Ames’s architecture.
45+Ames could be upgraded to use one of these existing ratchet algorithms, or we might create an Urbit-specific variant optimized for the Urbit network. This is work that should be done, but fortunately it will not require any novel research or drastic changes to Ames’s architecture.
45
46
46While Urbit’s cryptographic protections don’t yet match those of Signal or a few other privacy-focused apps, Ames is cryptographically sound, and since Urbit updates itself over-the-air and is backed by a stable, decentralized PKI, I’m confident that the level of sophistication of Urbit’s cryptography has the potential to be world-class with just a bit more work.
47While Urbit’s cryptographic protections don’t yet match those of Signal or a few other privacy-focused apps, Ames is cryptographically sound, and since Urbit updates itself over-the-air and is backed by a stable, decentralized PKI, I’m confident that the level of sophistication of Urbit’s cryptography has the potential to be world-class with just a bit more work.
47
48
48## Denial of Service
49## Denial of Service
49
50
50−A denial of service (DoS) attack against an Urbit ship is an attempt to overwhelm it remotely by sending it network data in such a way as to interfere with the ship’s ability to communicate with other ships or process other events -- usually by hogging its resources (computational power, memory, or bandwidth) until normal operation slows down or ceases entirely. Since the promise of Urbit is that everyone can run their own server, that server needs to be able to defend itself against DoS attacks. This is in fact one of the main impediments to running your own server in the modern world.
51+A denial of service (DoS) attack against an Urbit ship is an attempt to overwhelm it remotely by sending it network data in such a way as to interfere with the ship’s ability to communicate with other ships or process other events -- usually by hogging its resources (computational power, memory, or bandwidth) until normal operation slows down or ceases entirely. Since the promise of Urbit is that everyone can run their own server, that server needs to be able to defend itself against DoS attacks. This is in fact one of the main impediments to running your own server in the modern world.
51
52
52−Right now, Urbit has no protection. Soon, it will need to at least be able to resist a simple attack carried out by an individual. Eventually, it should be able to resist a determined Distributed Denial of Service (“DDoS”) attack, which is more difficult.
53+Right now, Urbit has no protection. Soon, it will need to at least be able to resist a simple attack carried out by an individual. Eventually, it should be able to resist a determined Distributed Denial of Service (“DDoS”) attack, which is more difficult.
53
54
54−There are two categories of DoS attacks in Urbit: authenticated and unauthenticated. An authenticated attack requires access to a ship's private key to construct valid Ames packets intended to overwhelm a target. All authenticated attacks will be handled primarily through enforcement of social boundaries, as discussed in the next section.
55+There are two categories of DoS attacks in Urbit: authenticated and unauthenticated. An authenticated attack requires access to a ship's private key to construct valid Ames packets intended to overwhelm a target. All authenticated attacks will be handled primarily through enforcement of social boundaries, as discussed in the next section.
55
56
56An unauthenticated DoS attack constructs packets that eventually fail to authenticate and decrypt but still overwhelm the target by causing it to waste resources (CPU, memory, disk, bandwidth) in such a way that it can't keep up with legitimate communications.
57An unauthenticated DoS attack constructs packets that eventually fail to authenticate and decrypt but still overwhelm the target by causing it to waste resources (CPU, memory, disk, bandwidth) in such a way that it can't keep up with legitimate communications.
57
58
58−An unauthenticated DoS attack relies on the lack of Sybil resistance of IP networks: it's possible to generate new IP addresses rapidly, and a determined attacker might also be able to spoof its sender IP address. This is best considered an IP-layer attack that must be handled mostly at the IP layer itself, by maintaining state about which IP addresses can be trusted and which can't, determined empirically and heuristically by the Urbit runtime. The best any higher-level protocol, such as Ames or TCP, can do is make it as cheap as possible for a DoS target to reject a bad packet.
59+An unauthenticated DoS attack relies on the lack of Sybil resistance of IP networks: it's possible to generate new IP addresses rapidly, and a determined attacker might also be able to spoof its sender IP address. This is best considered an IP-layer attack that must be handled mostly at the IP layer itself, by maintaining state about which IP addresses can be trusted and which can't, determined empirically and heuristically by the Urbit runtime. The best any higher-level protocol, such as Ames or TCP, can do is make it as cheap as possible for a DoS target to reject a bad packet.
59
60
60The overall strategy that Ames can take, as a protocol layering over the IP protocol, is to add an authentication procedure to each packet that can quickly identify bad packets, which an implementation will then use to mark that IP address as suspect and to refrain from adding the sender IP to a list of known-good IPs.
61The overall strategy that Ames can take, as a protocol layering over the IP protocol, is to add an authentication procedure to each packet that can quickly identify bad packets, which an implementation will then use to mark that IP address as suspect and to refrain from adding the sender IP to a list of known-good IPs.
61
62
62−Currently, Ames handles this by attempting to decrypt a message and rejecting the message on failure. This may be a more costly solution than other methods, such as attaching a signature or a MAC to each message. The way to mitigate unauthenticated attacks is to make bad packets fail faster by augmenting each packet with a signature or MAC to each packet, since those are faster to validate than encryption.
63+Currently, Ames handles this by attempting to decrypt a message and rejecting the message on failure. This may be a more costly solution than other methods, such as attaching a signature or a MAC to each message. The way to mitigate unauthenticated attacks is to make bad packets fail faster by augmenting each packet with a signature or MAC to each packet, since those are faster to validate than encryption.
63
64
64−So far, we have identified three approaches that could be taken here. Of these three, Leviathan recommended the end-to-end HMAC solution, since that would not impose additional CPU requirements on packet-relay nodes, such as stars.
65+So far, we have identified three approaches that could be taken here. Of these three, Leviathan recommended the end-to-end HMAC solution, since that would not impose additional CPU requirements on packet-relay nodes, such as stars.
65
66
66−+ Sign each packet, and any relay or final recipient could validate the signature
67+- Sign each packet, and any relay or final recipient could validate the signature
67−+ Wrap each packet in an HMAC, validated by the final receiver
68+- Wrap each packet in an HMAC, validated by the final receiver
68−+ Wrap each packet in a HMAC for each hop in a relay chain; each relay would validate and strip the previous HMAC and add a new one for the next hop
69+- Wrap each packet in a HMAC for each hop in a relay chain; each relay would validate and strip the previous HMAC and add a new one for the next hop
69
70
70−Any of these solutions would be attempts to increase the rate at which the network could discard invalid packets, with different tradeoffs. I'll back up a bit to provide some context, and then I'll compare the approaches.
71+Any of these solutions would be attempts to increase the rate at which the network could discard invalid packets, with different tradeoffs. I'll back up a bit to provide some context, and then I'll compare the approaches.
71
72
72−In any DoS solution, a planet will want to block or throttle IPs that have been sending it packets that fail to authenticate and decrypt. Ideally, a star will help protect planets for whom it’s relaying, too. Many different arrangements among galaxy, star, and planet are imaginable here, from an open policy to a policy wherein each packet has to come from a known-good IP. This sort of paranoid, closed-off arrangement might still not be enough to withstand a determined DDoS, but it's difficult for me to imagine doing better than that without launching Urbit-specific ISPs. Ames packets are cryptographically authenticated, so an Urbit ISP would actually be feasible.
73+In any DoS solution, a planet will want to block or throttle IPs that have been sending it packets that fail to authenticate and decrypt. Ideally, a star will help protect planets for whom it’s relaying, too. Many different arrangements among galaxy, star, and planet are imaginable here, from an open policy to a policy wherein each packet has to come from a known-good IP. This sort of paranoid, closed-off arrangement might still not be enough to withstand a determined DDoS, but it's difficult for me to imagine doing better than that without launching Urbit-specific ISPs. Ames packets are cryptographically authenticated, so an Urbit ISP would actually be feasible.
73
74
74−This brings us back to the three possible ways of mitigating DoS from within the Ames protocol. They all involve adding a piece of authenticating information to each packet that can be verified more quickly than waiting for the cyphertext to fail to decrypt — Ames's symmetric encryption is authenticated, so it's not a cryptographic soundness issue, but the performance impact of trying to decrypt could be significant enough to make it hard to prevent a DoS.
75+This brings us back to the three possible ways of mitigating DoS from within the Ames protocol. They all involve adding a piece of authenticating information to each packet that can be verified more quickly than waiting for the cyphertext to fail to decrypt — Ames's symmetric encryption is authenticated, so it's not a cryptographic soundness issue, but the performance impact of trying to decrypt could be significant enough to make it hard to prevent a DoS.
75
76
76As-is, an Ames packet is basically `[protocol-version checksum sndr rcvr (nullable origin) cyphertext]` (visit [this PR](https://github.com/urbit/urbit/pull/4051#issue-530369627) for a full specification). Let’s walk through the construction of the packet and how it can be upgraded to offer different DOS mitigations.
77As-is, an Ames packet is basically `[protocol-version checksum sndr rcvr (nullable origin) cyphertext]` (visit [this PR](https://github.com/urbit/urbit/pull/4051#issue-530369627) for a full specification). Let’s walk through the construction of the packet and how it can be upgraded to offer different DOS mitigations.
77
78
78### DoS Mitigation Approach 1: Signature
79### DoS Mitigation Approach 1: Signature
79
80
80−The first approach to DoS protection would be to add a signature to the packet. The signature would cover everything except the checksum and the origin, since those need to be swapped out by relays. The signature would probably obviate the need for the (20-bit) checksum, although we could also leave it in there if we can't figure out what else to do with those header bits.
81+The first approach to DoS protection would be to add a signature to the packet. The signature would cover everything except the checksum and the origin, since those need to be swapped out by relays. The signature would probably obviate the need for the (20-bit) checksum, although we could also leave it in there if we can't figure out what else to do with those header bits.
81
82
82#### Advantages of a signature over other approaches
83#### Advantages of a signature over other approaches
83
84
84−- It can be validated by anyone on the network. Relays would not need to modify it. This might also give it symmetry with the upcoming remote scry protocol, which might also sign every packet. I'm not quite sure this is an important property, actually, but it might theoretically make launching an Urbit ISP or internet backbone easier one day.
85+- It can be validated by anyone on the network. Relays would not need to modify it. This might also give it symmetry with the upcoming remote scry protocol, which might also sign every packet. I'm not quite sure this is an important property, actually, but it might theoretically make launching an Urbit ISP or internet backbone easier one day.
85- It would be signed directly by the key listed on Ethereum, not something that might get ratcheted at some point for better forward secrecy — this could eventually lower the rate at which intermediate validators need their key caches invalidated, although this is a bit of a theoretical concern.
86- It would be signed directly by the key listed on Ethereum, not something that might get ratcheted at some point for better forward secrecy — this could eventually lower the rate at which intermediate validators need their key caches invalidated, although this is a bit of a theoretical concern.
86
87
87#### Disadvantages of a signature over other approaches
88#### Disadvantages of a signature over other approaches
88
89
89- Generating and validating a signature is significantly slower than generating and validating an HMAC.
90- Generating and validating a signature is significantly slower than generating and validating an HMAC.
90−- An ECDSA signature is 64 bytes, which is ~6% of a packet payload. As far as I can tell, it can't be compressed.
91+- An ECDSA signature is 64 bytes, which is ~6% of a packet payload. As far as I can tell, it can't be compressed.
91- Since the signature could be validated by anyone, it doesn't attest to a specific communication channel, so it might not help as much with IP filtering.
92- Since the signature could be validated by anyone, it doesn't attest to a specific communication channel, so it might not help as much with IP filtering.
92
93
93### DoS Mitigation Approach 2: End-to-End HMAC
94### DoS Mitigation Approach 2: End-to-End HMAC
94
95
95−The second approach would be to use an HMAC instead of a signature, validated by the eventual receiver. This HMAC would also cover everything except the mug and origin. I'm calling this the "end-to-end HMAC" design. An HMAC requires a shared secret, for which we could use the same symmetric key that Ames uses.
96+The second approach would be to use an HMAC instead of a signature, validated by the eventual receiver. This HMAC would also cover everything except the mug and origin. I'm calling this the "end-to-end HMAC" design. An HMAC requires a shared secret, for which we could use the same symmetric key that Ames uses.
96
97
97#### Advantages of end-to-end HMAC
98#### Advantages of end-to-end HMAC
98
99
99- It's simple in some sense; relays don't need to do anything cryptographic.
100- It's simple in some sense; relays don't need to do anything cryptographic.
100- HMACs are much faster to create and validate than signatures.
101- HMACs are much faster to create and validate than signatures.
101−- HMACs, since they're hashes, can be truncated arbitrarily and still maintain some security — to find hash collisions, you'd still have to guess what packet||shared-secret would hash to; it would just be a smaller search space. Since Ames's encryption already guarantees authentication and we'd just be using this as a performance optimization, I suspect we could get away with using one that's significantly smaller than a signature — I'm not sure how small, but if 4 bytes would be enough in practice, that would take up less than 0.5% of the space in a packet.
102+- HMACs, since they're hashes, can be truncated arbitrarily and still maintain some security — to find hash collisions, you'd still have to guess what packet||shared-secret would hash to; it would just be a smaller search space. Since Ames's encryption already guarantees authentication and we'd just be using this as a performance optimization, I suspect we could get away with using one that's significantly smaller than a signature — I'm not sure how small, but if 4 bytes would be enough in practice, that would take up less than 0.5% of the space in a packet.
102
103
103#### Disadvantages of end-to-end HMAC
104#### Disadvantages of end-to-end HMAC
104
105
105−- Only the recipient can validate. This means the authentication couldn't be used by relays to discard invalid packets. The recipient could provide back-pressure out-of-band to a relay to ask the relay to discard packets from an IP with an invalid HMAC, but this is indirect and might need to filter backward through multiple relays to work properly.
106+- Only the recipient can validate. This means the authentication couldn't be used by relays to discard invalid packets. The recipient could provide back-pressure out-of-band to a relay to ask the relay to discard packets from an IP with an invalid HMAC, but this is indirect and might need to filter backward through multiple relays to work properly.
106
107
107### DoS Mitigation Approach 3: Point-to-Point HMAC
108### DoS Mitigation Approach 3: Point-to-Point HMAC
108
109
109−The third approach, which is what I would build unless convinced otherwise, is what I'm calling "point-to-point HMAC". This design would include a different HMAC for each hop in a relay chain, instead of (or maybe in addition to) including one end-to-end HMAC.
110+The third approach, which is what I would build unless convinced otherwise, is what I'm calling "point-to-point HMAC". This design would include a different HMAC for each hop in a relay chain, instead of (or maybe in addition to) including one end-to-end HMAC.
110
111
111−We have a couple different options for how to construct the shared secret for each hop. I would intuitively construct it using a Diffie-Hellman of my private signing key and your public signing key — the "networking keys" on Ethereum include a currently unused signing key in addition to the encryption key that Ames uses. This way even if we add more forward secrecy to Ames, changing the symmetric key used for encryption, relays wouldn't have to have their caches invalidated as often; the state required to perform relaying wouldn't be as tied to the state required to receive a message.
112+We have a couple different options for how to construct the shared secret for each hop. I would intuitively construct it using a Diffie-Hellman of my private signing key and your public signing key — the "networking keys" on Ethereum include a currently unused signing key in addition to the encryption key that Ames uses. This way even if we add more forward secrecy to Ames, changing the symmetric key used for encryption, relays wouldn't have to have their caches invalidated as often; the state required to perform relaying wouldn't be as tied to the state required to receive a message.
112
113
113#### Advantages of point-to-point HMAC
114#### Advantages of point-to-point HMAC
114
115
115−- A star could perform some validation on every packet it's asked to relay. This makes it more difficult for an attacker to route a ton of packets to a planet through a star, or even through many relays. Signatures also have this property, but they're slower to verify. This approach and the signature approach, but not the end-to-end HMACs, force an attacker to use an (at least partially) authenticated attack in order to use a relay as a way to get to a planet.
116+- A star could perform some validation on every packet it's asked to relay. This makes it more difficult for an attacker to route a ton of packets to a planet through a star, or even through many relays. Signatures also have this property, but they're slower to verify. This approach and the signature approach, but not the end-to-end HMACs, force an attacker to use an (at least partially) authenticated attack in order to use a relay as a way to get to a planet.
116- A planet could quickly validate that a relayed packet actually came from its star, not an attacker who's managed to spoof the star's IP address.
117- A planet could quickly validate that a relayed packet actually came from its star, not an attacker who's managed to spoof the star's IP address.
117
118
118#### Disadvantages of point-to-point HMAC
119#### Disadvantages of point-to-point HMAC
119
120
120- Not everyone on the network can validate a packet, unlike a signature.
121- Not everyone on the network can validate a packet, unlike a signature.
121−- Each relay needs to validate and strip off the previous HMAC and create a new one before sending it. This should be quite fast, since an HMAC is just a hash, but it's still some CPU, and potentially creates an imbalance where an attacker could induce the relay to spend more CPU in validation than the attacker spent in constructing the packets.
122+- Each relay needs to validate and strip off the previous HMAC and create a new one before sending it. This should be quite fast, since an HMAC is just a hash, but it's still some CPU, and potentially creates an imbalance where an attacker could induce the relay to spend more CPU in validation than the attacker spent in constructing the packets.
122−- By itself, it doesn't validate the cyphertext in an end-to-end way. I suspect we might want to include both a per-route HMAC and an end-to-end one, especially if we use truncated HMACs — although per-route might be enough on its own, since if the receiver fails to validate a bunch of packets whose HMACs were validated by the relay, the receiver can ask the relay to block that whole Urbit address regardless of IP, so it shouldn't be possible to sustain that kind of attack for long.
123+- By itself, it doesn't validate the cyphertext in an end-to-end way. I suspect we might want to include both a per-route HMAC and an end-to-end one, especially if we use truncated HMACs — although per-route might be enough on its own, since if the receiver fails to validate a bunch of packets whose HMACs were validated by the relay, the receiver can ask the relay to block that whole Urbit address regardless of IP, so it shouldn't be possible to sustain that kind of attack for long.
123
124
124#### An Aside About Cryptographic Performance
125#### An Aside About Cryptographic Performance
125
126
126−I'm not sure exactly how much faster HMAC is. According to DJB (https://ed25519.cr.yp.to/ed25519-20110705.pdf), an ECDSA signature can be created in around 30 microseconds and verified in around 100 microseconds. This source (https://www.jacksondunstan.com/articles/3206) suggests about 21 microseconds for HMAC-SHA256, so about a 1.5x improvement in generation speed and 5x in validation speed. We should verify these numbers for ourselves before making a decision.
127+I'm not sure exactly how much faster HMAC is. According to DJB (https://ed25519.cr.yp.to/ed25519-20110705.pdf), an ECDSA signature can be created in around 30 microseconds and verified in around 100 microseconds. This source (https://www.jacksondunstan.com/articles/3206) suggests about 21 microseconds for HMAC-SHA256, so about a 1.5x improvement in generation speed and 5x in validation speed. We should verify these numbers for ourselves before making a decision.
127
128
128### DoS Protection Strategy and Timeline
129### DoS Protection Strategy and Timeline
129
130
130−Tlon is not currently pursuing adding any of the extra cryptographic authentication on Ames packets described above. Since this is ultimately a performance issue, there are other more pressing performance issues that we could improve upon before decryption will become the limiting factor in how many packets can be processed by a ship. We will revisit this authentication performance question once some of the low-hanging fruit has been done, perhaps roughly a year from now.
131+Tlon is not currently pursuing adding any of the extra cryptographic authentication on Ames packets described above. Since this is ultimately a performance issue, there are other more pressing performance issues that we could improve upon before decryption will become the limiting factor in how many packets can be processed by a ship. We will revisit this authentication performance question once some of the low-hanging fruit has been done, perhaps roughly a year from now.
131
132
132Since the audit, we’ve already improved the Ames packet format to allow faster parsing, faster validation of basic fields, and faster relaying; in the future, increases in performance of Nock execution and inter-process communication between Urbit's I/O process and Nock worker would allow Urbit to absorb somewhat more punishment before service can be effectively denied.
133Since the audit, we’ve already improved the Ames packet format to allow faster parsing, faster validation of basic fields, and faster relaying; in the future, increases in performance of Nock execution and inter-process communication between Urbit's I/O process and Nock worker would allow Urbit to absorb somewhat more punishment before service can be effectively denied.
133
134
134## Enforcement of Social Boundaries
135## Enforcement of Social Boundaries
135
136
136−While Urbit needs to rely largely on its runtime to mitigate unauthenticated attacks, any attack conducted from an Urbit ship needs to be handled inside Arvo itself, not just by IP filtering in the runtime. Just like in any DoS, an attacker ship might try to induce you to use too much memory, CPU, or disk space in order to sabotage normal operation. An authenticated attack is harder to define than an unauthenticated attack, because it depends on what social relationship the attacker and target have, and it involves valid, authenticated Ames packets; once discovered, though, it’s easier to mitigate, because it can use Urbit’s permanent identity system to enforce social consequences, i.e. stop listening to that Urbit address and possibly encourage others to do so as well.
137+While Urbit needs to rely largely on its runtime to mitigate unauthenticated attacks, any attack conducted from an Urbit ship needs to be handled inside Arvo itself, not just by IP filtering in the runtime. Just like in any DoS, an attacker ship might try to induce you to use too much memory, CPU, or disk space in order to sabotage normal operation. An authenticated attack is harder to define than an unauthenticated attack, because it depends on what social relationship the attacker and target have, and it involves valid, authenticated Ames packets; once discovered, though, it’s easier to mitigate, because it can use Urbit’s permanent identity system to enforce social consequences, i.e. stop listening to that Urbit address and possibly encourage others to do so as well.
137
138
138There are a couple of different kinds of authenticated attack: attempts to exploit vulnerabilities in the Nock worker (the interpreter, allocator, and jets) by causing particular Nock code to run, and attempts to induce the target to exhaust various computational resources.
139There are a couple of different kinds of authenticated attack: attempts to exploit vulnerabilities in the Nock worker (the interpreter, allocator, and jets) by causing particular Nock code to run, and attempts to induce the target to exhaust various computational resources.
139
140
140−Protecting against attempts to break out of the sandbox and hijack or otherwise interfere with the Unix process running Nock will require a process of hardening, fuzzing, and likely further security audits specifically evaluating the security of that boundary. This is largely out of scope of the Ames protocol itself, which was the subject of this audit.
141+Protecting against attempts to break out of the sandbox and hijack or otherwise interfere with the Unix process running Nock will require a process of hardening, fuzzing, and likely further security audits specifically evaluating the security of that boundary. This is largely out of scope of the Ames protocol itself, which was the subject of this audit.
141−
142−This leaves us with the latter case: resource exhaustion attacks. A peer could try to get my ship to use too much RAM, disk, CPU, or bandwidth by sending it valid Ames packets. This represents a social problem: a person on the network is trying to interfere with me. It's what's known in blockchain circles as an "attributable fault": once the attack is detected, it's trivial to determine the identity of the culprit.
143
142
144−Once the attacker’s Urbit address is known, Urbit will fall back on the Sybil resistance of its identity system: there are a finite number of identities, each of which costs some money. Because Urbit identities are relatively permanent, they can be blocked permanently. As long as the expected value of an authenticated attack is less than the cost of the identity, the attacks won't happen very much — they'll cost money to sustain, instead of being self-perpetuating.
143+This leaves us with the latter case: resource exhaustion attacks. A peer could try to get my ship to use too much RAM, disk, CPU, or bandwidth by sending it valid Ames packets. This represents a social problem: a person on the network is trying to interfere with me. It's what's known in blockchain circles as an "attributable fault": once the attack is detected, it's trivial to determine the identity of the culprit.
145
144
146−Attacks like this are best thought of as attempts to violate social boundaries. I don't want you using up too many of my resources; that's a social boundary, and an attempt to force my ship to spend its resources on your behalf constitutes a violation of this boundary. The strategy for mitigating these attacks is to impose social and, indirectly, economic consequences on the perpetrators. The main social consequence is other ships refusing to communicate with you anymore.
145+Once the attacker’s Urbit address is known, Urbit will fall back on the Sybil resistance of its identity system: there are a finite number of identities, each of which costs some money. Because Urbit identities are relatively permanent, they can be blocked permanently. As long as the expected value of an authenticated attack is less than the cost of the identity, the attacks won't happen very much — they'll cost money to sustain, instead of being self-perpetuating.
147
146
148−Some of this mitigation will take place in the Arvo kernel, and some will need to be application-specific. To protect the system from attackers, the kernel needs to be able to free space (Urbit is a single-level store, so there's no distinction between disk and RAM from Arvo's perspective) taken up by unfinished messages sent by peers. This can be done by allowing an application to ask Ames to delete partially received messages from a peer, generally replacing the received packets with an intent to nack (negative acknowledgment) to indicate that the transaction the peer wanted me to perform has been rejected.
147+Attacks like this are best thought of as attempts to violate social boundaries. I don't want you using up too many of my resources; that's a social boundary, and an attempt to force my ship to spend its resources on your behalf constitutes a violation of this boundary. The strategy for mitigating these attacks is to impose social and, indirectly, economic consequences on the perpetrators. The main social consequence is other ships refusing to communicate with you anymore.
149
148
150−Applications should also be able to set resource usage policies that the Arvo kernel will enforce. For example, a chat application should configure Ames to reject any chat messages larger than, say, two hundred kilobytes. A file-sharing application would need a much larger per-message limit (ideally no per-message limit), but it might need to place a cap on its bandwidth usage to make sure lower-latency communications aren't swamped by a large file transfer. This kernel/application interface starts to resemble a permissioning or capabilities system, and it could be built as part of the crucial larger project of providing for configurable application permissions.
149+Some of this mitigation will take place in the Arvo kernel, and some will need to be application-specific. To protect the system from attackers, the kernel needs to be able to free space (Urbit is a single-level store, so there's no distinction between disk and RAM from Arvo's perspective) taken up by unfinished messages sent by peers. This can be done by allowing an application to ask Ames to delete partially received messages from a peer, generally replacing the received packets with an intent to nack (negative acknowledgment) to indicate that the transaction the peer wanted me to perform has been rejected.
151
150
152−To close the loop on enforcing social boundaries, reputation information should be shared across ships. This will likely be done by building one or more applications that share statistics and block operations. Some forms of reputation are likely to be globally shared, whereas others are likely to be multipolar, i.e. some people like you and some don’t. Generally, the lower the layer of the attack, the more global the reputation effect will be; the higher the layer, the more multipolar. An attempt to spam the network with millions of malicious packets will cause most people not to want to talk to you; sending me a movie I found mediocre is probably not even information worth sharing with anyone else.
151+Applications should also be able to set resource usage policies that the Arvo kernel will enforce. For example, a chat application should configure Ames to reject any chat messages larger than, say, two hundred kilobytes. A file-sharing application would need a much larger per-message limit (ideally no per-message limit), but it might need to place a cap on its bandwidth usage to make sure lower-latency communications aren't swamped by a large file transfer. This kernel/application interface starts to resemble a permissioning or capabilities system, and it could be built as part of the crucial larger project of providing for configurable application permissions.
153
152
153+To close the loop on enforcing social boundaries, reputation information should be shared across ships. This will likely be done by building one or more applications that share statistics and block operations. Some forms of reputation are likely to be globally shared, whereas others are likely to be multipolar, i.e. some people like you and some don’t. Generally, the lower the layer of the attack, the more global the reputation effect will be; the higher the layer, the more multipolar. An attempt to spam the network with millions of malicious packets will cause most people not to want to talk to you; sending me a movie I found mediocre is probably not even information worth sharing with anyone else.
154
154
155## Conclusion
155## Conclusion
156
156
157−Ames’ design has unparalleled potential to deter, mitigate, and recover from attacks, since every packet is authenticated and encrypted and backed by a stable, decentralized PKI. It feels good to have our design for encryption and authentication be confirmed by a third party as cryptographically sound, and we know more or less what we need to build to reach the full security potential of the platform, including the steps outlined here.
157+Ames’ design has unparalleled potential to deter, mitigate, and recover from attacks, since every packet is authenticated and encrypted and backed by a stable, decentralized PKI. It feels good to have our design for encryption and authentication be confirmed by a third party as cryptographically sound, and we know more or less what we need to build to reach the full security potential of the platform, including the steps outlined here.
content/blog/simple-durable-yours.md+2−4
@@ -1,18 +1,16 @@
1+++
1+++
2title = "Simple, Durable, Yours"
2title = "Simple, Durable, Yours"
3−date = 2019-10-17
3+date = "2019-10-16"
4description = "We built Urbit from scratch to be a system that’s simple, durable, and yours. Everything that computing today is not — but should be."
4description = "We built Urbit from scratch to be a system that’s simple, durable, and yours. Everything that computing today is not — but should be."
5−[extra]
5+extra = { }
6+++
6+++
7
7
8We live in a world dense with digital services. We see the world through them, we depend on them completely, and they’re not going away. They’re only becoming more ubiquitous.
8We live in a world dense with digital services. We see the world through them, we depend on them completely, and they’re not going away. They’re only becoming more ubiquitous.
9
9
10But computers are a mess.
10But computers are a mess.
11
11
12−
13<img class="ba mv5 w-100" src="https://media.urbit.org/site/understanding-urbit/simple-durable-yours/simple-durable-yours-notifications.svg">
12<img class="ba mv5 w-100" src="https://media.urbit.org/site/understanding-urbit/simple-durable-yours/simple-durable-yours-notifications.svg">
14
13
15−
16We spend all our time switching between services, juggling logins and different interfaces. And once we’re logged in, the services we use harvest our data, spy on us, and often shut down with little warning.
14We spend all our time switching between services, juggling logins and different interfaces. And once we’re logged in, the services we use harvest our data, spy on us, and often shut down with little warning.
17
15
18If computers are going to be a part of our lives for generations to come, we need a sound foundation for them. We need a _system_, not a grab bag of apps and services. Urbit is that system.
16If computers are going to be a part of our lives for generations to come, we need a sound foundation for them. We need a _system_, not a grab bag of apps and services. Urbit is that system.
content/blog/stable-arvo.md+11−13
@@ -1,7 +1,8 @@
1+++
1+++
2title = "Stable Arvo"
2title = "Stable Arvo"
3−date = 2019-11-20
3+date = "2019-11-19"
4description = "This year we set out to get Arvo to a point that we can credibly call ‘stable.' "
4description = "This year we set out to get Arvo to a point that we can credibly call ‘stable.' "
5+
5[extra]
6[extra]
6author = "Anthony Arroyo"
7author = "Anthony Arroyo"
7ship = "~poldec-tonteg"
8ship = "~poldec-tonteg"
@@ -14,21 +15,20 @@ image = "https://media.urbit.org/site/posts/essays/stable-arvo.png"
14
15
15We want your Urbit to last forever. We want an ordinary Urbit user to never worry about their Urbit breaking, going away or failing unexpectedly. We don’t just want this — we think this is one of the most incredible things Urbit can actually deliver.
16We want your Urbit to last forever. We want an ordinary Urbit user to never worry about their Urbit breaking, going away or failing unexpectedly. We don’t just want this — we think this is one of the most incredible things Urbit can actually deliver.
16
17
17−In order to get closer to an Urbit that can last forever, we set for ourselves the goal of getting Arvo (the kernel of what we’ve been calling ‘Urbit OS’) to a point that we can credibly call ‘stable’ by the end of 2019.
18+In order to get closer to an Urbit that can last forever, we set for ourselves the goal of getting Arvo (the kernel of what we’ve been calling ‘Urbit OS’) to a point that we can credibly call ‘stable’ by the end of 2019.
18
19
19−But what do we mean exactly by ‘stable’? For something meant to last far into the future, stability really means *resilience*. Arvo has to both run and upgrade itself without ever breaking or falling into an unrecoverable state.
20+But what do we mean exactly by ‘stable’? For something meant to last far into the future, stability really means _resilience_. Arvo has to both run and upgrade itself without ever breaking or falling into an unrecoverable state.
20
21
21Getting Arvo to this point doesn’t quite achieve the user-level goal we’re hoping to achieve. But if you’re comfortable doing a bit of system administration, Arvo itself should need almost no maintenance.
22Getting Arvo to this point doesn’t quite achieve the user-level goal we’re hoping to achieve. But if you’re comfortable doing a bit of system administration, Arvo itself should need almost no maintenance.
22
23
23To achieve stability in practice Arvo needs three things:
24To achieve stability in practice Arvo needs three things:
24
25
25−- The Arvo network (Ames) has to be stable
26+- The Arvo network (Ames) has to be stable
26- Arvo can’t easily fall into an unrecoverable state
27- Arvo can’t easily fall into an unrecoverable state
27- Arvo has to have a clear and formalized upgrade mechanic
28- Arvo has to have a clear and formalized upgrade mechanic
28
29
29All of these are actively being worked on, and are mostly near completion. Let’s walk through them one by one.
30All of these are actively being worked on, and are mostly near completion. Let’s walk through them one by one.
30
31
31−
32### A new Ames
32### A new Ames
33
33
34To ensure that Arvo can upgrade itself forever, it needs a network to deliver the updates. Toward this end we’ve put a lot of work into making Ames, the Urbit networking protocol, as reliable as possible.
34To ensure that Arvo can upgrade itself forever, it needs a network to deliver the updates. Toward this end we’ve put a lot of work into making Ames, the Urbit networking protocol, as reliable as possible.
@@ -41,7 +41,6 @@ We’ve been working on that rewrite, codenamed Alef, for a few months now. Alef
41
41
42We expect to switch to Alef in a continuity breach (network reset) during this quarter. This will be a huge step toward resilience. A networking protocol we can trust to deliver updates is essential for a computer that will last a long time.
42We expect to switch to Alef in a continuity breach (network reset) during this quarter. This will be a huge step toward resilience. A networking protocol we can trust to deliver updates is essential for a computer that will last a long time.
43
43
44−
45### Recoverability
44### Recoverability
46
45
47Another barrier to stability with existing Urbit is that a ship can, under specific conditions, fall into a terminal state. If part of your ship’s state relies on event in the future and this event crashes, then that part of the state can become unrecoverable. Consider, for example, an event that is set to be triggered by a timer. If this timer crashes, that event will never happen. This is a huge problem.
46Another barrier to stability with existing Urbit is that a ship can, under specific conditions, fall into a terminal state. If part of your ship’s state relies on event in the future and this event crashes, then that part of the state can become unrecoverable. Consider, for example, an event that is set to be triggered by a timer. If this timer crashes, that event will never happen. This is a huge problem.
@@ -52,25 +51,24 @@ This architecture means that errors have to be considered not simply as an excep
52
51
53Deterministic errors are currently handled within the virtual interpreter, Mock, and result in a “bail: exit.” They can be handled “within” Arvo and are never written to the event log. The real difficulty lies with non-deterministic errors, specifically ones can potentially cause other events.
52Deterministic errors are currently handled within the virtual interpreter, Mock, and result in a “bail: exit.” They can be handled “within” Arvo and are never written to the event log. The real difficulty lies with non-deterministic errors, specifically ones can potentially cause other events.
54
53
55−An obvious case of causally-connected events is a timer; any code that sets a timer eventually suspends itself, waiting to be awoken. And yet, if the subsequent timer event were to crash, the state machine awaiting it would remain suspended, expecting a transition that can and will not
54+An obvious case of causally-connected events is a timer; any code that sets a timer eventually suspends itself, waiting to be awoken. And yet, if the subsequent timer event were to crash, the state machine awaiting it would remain suspended, expecting a transition that can and will not
56occur.
55occur.
57
56
58−We believe that we have a general scheme that accounts for both classes of error. We’ve formalized this and will use it going forward to avoid falling into inconsistent states.
57+We believe that we have a general scheme that accounts for both classes of error. We’ve formalized this and will use it going forward to avoid falling into inconsistent states.
59
58
60Our solution to this problem is simple: if Arvo or one of its vanes crashes while processing an event, the fact of the failed event itself becomes a new event. The runtime injects an error notification in the event log, named, as is befitting of a failed event: %crud.
59Our solution to this problem is simple: if Arvo or one of its vanes crashes while processing an event, the fact of the failed event itself becomes a new event. The runtime injects an error notification in the event log, named, as is befitting of a failed event: %crud.
61
60
62In the case of a failed timer event, the error notification is routed back to the code that set the timer and communicates the following: you were expecting to be woken up, but, when you were, you crashed. The code in question could then consider the logical operation of which the timer was a part to have failed, or perhaps it could try again. In any case, it must not crash when handling the error notification, and it must not continue to expect to be woken up.
61In the case of a failed timer event, the error notification is routed back to the code that set the timer and communicates the following: you were expecting to be woken up, but, when you were, you crashed. The code in question could then consider the logical operation of which the timer was a part to have failed, or perhaps it could try again. In any case, it must not crash when handling the error notification, and it must not continue to expect to be woken up.
63
62
64−This quarter, building on previous work, we’ve built on the %crud pattern and mapped the protocols between the vanes and between arvo and vere. This allows us to make sure that %cruds are all handled (so as to avoid the crash discussed above) and, in future iterations of the vanes, know what conditions need to be accommodated to avoid introducing regressions.
63+This quarter, building on previous work, we’ve built on the %crud pattern and mapped the protocols between the vanes and between arvo and vere. This allows us to make sure that %cruds are all handled (so as to avoid the crash discussed above) and, in future iterations of the vanes, know what conditions need to be accommodated to avoid introducing regressions.
65
64
66By adopting this pattern and virtualizing userspace, we can make completely sure that code running in the kernel or an app can’t cause your ship to get into an inconsistent state.
65By adopting this pattern and virtualizing userspace, we can make completely sure that code running in the kernel or an app can’t cause your ship to get into an inconsistent state.
67
66
68−
69### Telescoping Kelvins
67### Telescoping Kelvins
70
68
71−Finally, in order for a ship to reliably receive and apply upgrades, we need to formalize and enforce a versioning scheme inside the system.
69+Finally, in order for a ship to reliably receive and apply upgrades, we need to formalize and enforce a versioning scheme inside the system.
72
70
73−Most software simply increases its version number on each release. Nock (our VM spec) and Hoon, on the other hand, uses kelvin versioning. Kelvin versioning doesn’t infinitely increase version numbers. Instead, we decrease the version number on each significant change in the hope that our software will eventually not need to change at all. Infrastructure, if it’s going to be truly reliable, should eventually reach absolute zero.
71+Most software simply increases its version number on each release. Nock (our VM spec) and Hoon, on the other hand, uses kelvin versioning. Kelvin versioning doesn’t infinitely increase version numbers. Instead, we decrease the version number on each significant change in the hope that our software will eventually not need to change at all. Infrastructure, if it’s going to be truly reliable, should eventually reach absolute zero.
74
72
75Nock is already nearly frozen at 4K. A change to Nock is a major event.
73Nock is already nearly frozen at 4K. A change to Nock is a major event.
76
74
@@ -84,7 +82,7 @@ The mechanism for the kernel is pretty simple. In short, we’ll enforce that ev
84
82
85The versioning scheme between the runtime and Arvo is similarly straightforward. We’ll build in an affordance for notifying the user if we need them to manually upgrade the interpreter. This ensures that API changes between interpreter and kernel can always be non-breaking. Someday interpreter changes can be done over the air (like your browser downloading its own upgrades), but we’re not there yet.
83The versioning scheme between the runtime and Arvo is similarly straightforward. We’ll build in an affordance for notifying the user if we need them to manually upgrade the interpreter. This ensures that API changes between interpreter and kernel can always be non-breaking. Someday interpreter changes can be done over the air (like your browser downloading its own upgrades), but we’re not there yet.
86
84
87−What’s important about these two things is that they let us take continuity seriously. "Continuity" or "permanence" is arguably Urbit's killer feature: you start your ship, it just works, forever. Back it up on a USB drive, throw it in a drawer for forty years, and upon reconnecting to the network in 2059 (and pulling down all the updates you've missed) you're back in the game.
85+What’s important about these two things is that they let us take continuity seriously. "Continuity" or "permanence" is arguably Urbit's killer feature: you start your ship, it just works, forever. Back it up on a USB drive, throw it in a drawer for forty years, and upon reconnecting to the network in 2059 (and pulling down all the updates you've missed) you're back in the game.
88
86
89With the recent 0.9.0 release we’ve gotten to the point where we can make almost all our upgrades over the air. Even the language is now upgradeable over the wire.
87With the recent 0.9.0 release we’ve gotten to the point where we can make almost all our upgrades over the air. Even the language is now upgradeable over the wire.
90
88
content/blog/the-100-year-computer.md+13−9
@@ -1,8 +1,12 @@
1+++
1+++
2title = "The 100-Year Computer"
2title = "The 100-Year Computer"
3−date = 2019-05-14
3+date = "2019-05-13"
4−description = "One way to think about Urbit: as a \"100-year computer.\""
4+description = 'One way to think about Urbit: as a "100-year computer."'
5+aliases = [
5−aliases = ["/posts/essays/the-100-year-computer/", "/posts/the-100-year-computer"]
6+ "/posts/essays/the-100-year-computer/",
7+ "/posts/the-100-year-computer"
8+]
9+
6[extra]
10[extra]
7author = "Galen Wolfe-Pauly"
11author = "Galen Wolfe-Pauly"
8ship = "~ravmel-ropdyl"
12ship = "~ravmel-ropdyl"
@@ -11,16 +15,16 @@ image = "https://media.urbit.org/site/posts/essays/100-year-computer-1.png"
11
15
12![](https://media.urbit.org/site/posts/essays/100-year-computer-1.png)
16![](https://media.urbit.org/site/posts/essays/100-year-computer-1.png)
13
17
14−Around the Tlon office, we’re always looking for more concise ways to describe what we do. We kicked around ‘personal server’ for a long time. It’s pretty close. ‘Personal cloud computer’ did okay for a while, but it’s a little confusing.
18+Around the Tlon office, we’re always looking for more concise ways to describe what we do. We kicked around ‘personal server’ for a long time. It’s pretty close. ‘Personal cloud computer’ did okay for a while, but it’s a little confusing.
15
19
16−One way to think about Urbit is as a 100-year computer.
20+One way to think about Urbit is as a 100-year computer.
17
21
18−A 100-year computer has to be durable, reliable and permanent. It has to never lose data or fail in unpredictable ways. It has to be continuous, meaning it should never need to be updated by the user. If I put it in a closet for 10 years and take it out, it should work again without any intervention.
22+A 100-year computer has to be durable, reliable and permanent. It has to never lose data or fail in unpredictable ways. It has to be continuous, meaning it should never need to be updated by the user. If I put it in a closet for 10 years and take it out, it should work again without any intervention.
19
23
20−And, perhaps most importantly, it should be easy and enjoyable to use. Both for a casual user and for a technical person. If it’s not enjoyable to use, and doesn’t actually *get used*, it’s never going to survive for 100 years.
24+And, perhaps most importantly, it should be easy and enjoyable to use. Both for a casual user and for a technical person. If it’s not enjoyable to use, and doesn’t actually _get used_, it’s never going to survive for 100 years.
21
25
22In theory we could all be using Apple I’s today, but they’re a bit cumbersome. In large part that’s because they don’t update themselves. Those magnetic tapes don’t strike me as particularly durable either.
26In theory we could all be using Apple I’s today, but they’re a bit cumbersome. In large part that’s because they don’t update themselves. Those magnetic tapes don’t strike me as particularly durable either.
23
27
24−Imagine that a computer was something you kept forever. It would comfortably store your entire life: your writing, photos, blood tests, even your genome. Your computer would never show you ads, interrupt you against your wishes, or send your data to someone else without your permission.
28+Imagine that a computer was something you kept forever. It would comfortably store your entire life: your writing, photos, blood tests, even your genome. Your computer would never show you ads, interrupt you against your wishes, or send your data to someone else without your permission.
25
29
26−Imagine a computer that was extremely valuable to you, that you’d pay thousands of dollars to recover, but you used *less* than the one you do today.
30+Imagine a computer that was extremely valuable to you, that you’d pay thousands of dollars to recover, but you used _less_ than the one you do today.
content/blog/the-dao-as-a-lesson-in-decentralized-governance.md+100−94
@@ -1,18 +1,24 @@
1+++
1+++
2title = "The DAO as a Lesson in Decentralized Governance"
2title = "The DAO as a Lesson in Decentralized Governance"
3−date = 2016-06-24
3+date = "2016-06-23"
4description = "What's the right lesson for the decentralization community to learn from the collapse of the DAO?"
4description = "What's the right lesson for the decentralization community to learn from the collapse of the DAO?"
5+aliases = [
5−aliases = ["/posts/essays/the-dao-as-a-lesson-in-decentralized-governance", "/posts/the-dao-as-a-lesson-in-decentralized-governance", "/blog/dao"]
6+ "/posts/essays/the-dao-as-a-lesson-in-decentralized-governance",
7+ "/posts/the-dao-as-a-lesson-in-decentralized-governance",
8+ "/blog/dao"
9+]
10+
6[extra]
11[extra]
7author = "Curtis Yarvin"
12author = "Curtis Yarvin"
8ship = "~sorreg-namtyv"
13ship = "~sorreg-namtyv"
9+++
14+++
15+
10What's the right lesson for the decentralization community to
16What's the right lesson for the decentralization community to
11learn from the collapse of the DAO?
17learn from the collapse of the DAO?
12
18
13Perhaps the simplest lesson is that even decentralized networks
19Perhaps the simplest lesson is that even decentralized networks
14−need governments, and have governments. Every network is a
20+need governments, and have governments. Every network is a
15−state. Every state has a government.
21+state. Every state has a government.
16
22
17## Decentralization theater considered harmful
23## Decentralization theater considered harmful
18
24
@@ -30,79 +36,79 @@ A network without decentralization theater is one that admits:
30- any new state is born at war with full emergency powers.
36- any new state is born at war with full emergency powers.
31- limiting and/or eliminating governance is a slow, hard task.
37- limiting and/or eliminating governance is a slow, hard task.
32
38
33−TLDR: true decentralization isn't just a technical problem. It's
39+TLDR: true decentralization isn't just a technical problem. It's
34−also a political problem, and not an easy one. Believing you've
40+also a political problem, and not an easy one. Believing you've
35solved it, before actually solving it, is not a way to solve it.
41solved it, before actually solving it, is not a way to solve it.
36
42
37## Decentralization and legitimacy
43## Decentralization and legitimacy
38
44
39Steve Randy Waldman is not alone in pointing out that [a
45Steve Randy Waldman is not alone in pointing out that [a
40blockchain is a
46blockchain is a
41−parliament](http://www.interfluidity.com/v2/6581.html). It's
47+parliament](http://www.interfluidity.com/v2/6581.html). It's
42just the technical reality that a majority of miners in a
48just the technical reality that a majority of miners in a
43proof-of-work blockchain, or stakeholders under proof of stake,
49proof-of-work blockchain, or stakeholders under proof of stake,
44have the mathematical power to govern the network absolutely.
50have the mathematical power to govern the network absolutely.
45
51
46But this power does not give them the legitimate authority to do
52But this power does not give them the legitimate authority to do
47−whatever they want. Mathematically, the Ethereum miners can
53+whatever they want. Mathematically, the Ethereum miners can
48−easily roll back the DAO. Do they have the _right_ to roll back
54+easily roll back the DAO. Do they have the _right_ to roll back
49−the DAO? As we write, this question is one much debated.
55+the DAO? As we write, this question is one much debated.
50
56
51−We have an easy answer: no. The most basic principle of law is
57+We have an easy answer: no. The most basic principle of law is
52−that _pacta sunt servanda_, agreements must be respected. A good
58+that _pacta sunt servanda_, agreements must be respected. A good
53clue is that before the DAO hack, everyone swore great oaths to
59clue is that before the DAO hack, everyone swore great oaths to
54−"the steadfast iron will of immutable code." Methinks the lady
60+"the steadfast iron will of immutable code." Methinks the lady
55−did protest too much. But these oaths make rolling back the DAO
61+did protest too much. But these oaths make rolling back the DAO
56blatantly illegitimate.
62blatantly illegitimate.
57
63
58From a governance perspective, the line of lawlessness isn't the
64From a governance perspective, the line of lawlessness isn't the
59−line between soft and hard forks. It's any fork which makes an
65+line between soft and hard forks. It's any fork which makes an
60−exception for a specific address. Ethereum has already done this
66+exception for a specific address. Ethereum has already done this
61−by freezing the DAO contract. At this point, it might as well be
67+by freezing the DAO contract. At this point, it might as well be
62hanged for an ox, and go through with the full rollback.
68hanged for an ox, and go through with the full rollback.
63
69
64## Illegitimacy and belligerency
70## Illegitimacy and belligerency
65
71
66Within the ethos of Ethereum (we are obviously not qualified to
72Within the ethos of Ethereum (we are obviously not qualified to
67−comment on "real" law), a rollback is a _lawless act_. This does
73+comment on "real" law), a rollback is a _lawless act_. This does
68−not make it a wrongful act. It simply cannot be judged as an act
74+not make it a wrongful act. It simply cannot be judged as an act
69−of law. Rather, it is an act of war.
75+of law. Rather, it is an act of war.
70
76
71And judged as an act of war, a DAO rollback is _exactly right_.
77And judged as an act of war, a DAO rollback is _exactly right_.
72−Ethereum is not dealing with a "participant." It is dealing with
78+Ethereum is not dealing with a "participant." It is dealing with
73a pirate, a thief, _hostis humani generis_.
79a pirate, a thief, _hostis humani generis_.
74
80
75As a state at war with an external enemy, the Ethereum network
81As a state at war with an external enemy, the Ethereum network
76−shouldn't just zero the DAO hacker's booty. It must do all it
82+shouldn't just zero the DAO hacker's booty. It must do all it
77−can to destroy her. If possible, it must dox and report her.
83+can to destroy her. If possible, it must dox and report her.
78The right place for this fool is the supermax, not the Riviera.
84The right place for this fool is the supermax, not the Riviera.
79
85
80−But does Ethereum really want to be at war? And if Ethereum is
86+But does Ethereum really want to be at war? And if Ethereum is
81at war -- and this certainly isn't the only pirate in the sea --
87at war -- and this certainly isn't the only pirate in the sea --
82−how does it become decentralized? If Ethereum is at war, where
88+how does it become decentralized? If Ethereum is at war, where
83there is no law, how can it achieve its goal of creating a world
89there is no law, how can it achieve its goal of creating a world
84where code is law?
90where code is law?
85
91
86−But we really shouldn't panic. It is actually possible to go
92+But we really shouldn't panic. It is actually possible to go
87from wartime government to peacetime government, from absolute
93from wartime government to peacetime government, from absolute
88−martial law to absolute rule of law. It is just nontrivial.
94+martial law to absolute rule of law. It is just nontrivial.
89It's a political engineering problem that can't be ignored.
95It's a political engineering problem that can't be ignored.
90If it has to be solved, it should be solved properly.
96If it has to be solved, it should be solved properly.
91
97
92What really doesn't work is to declare martial law, execute all
98What really doesn't work is to declare martial law, execute all
93traitors, terrorists and enemies of the state, then declare that
99traitors, terrorists and enemies of the state, then declare that
94−elections will proceed as scheduled next week. If the goal is
100+elections will proceed as scheduled next week. If the goal is
95the decentralized rule of code as law, a rollback takes an
101the decentralized rule of code as law, a rollback takes an
96−enormous step backward. Reversing this setback isn't trivial.
102+enormous step backward. Reversing this setback isn't trivial.
97
103
98−Should Ethereum actually go to war? Or should it just let the
104+Should Ethereum actually go to war? Or should it just let the
99−hacker win? Clearly, from a pure blockchain perspective, the
105+hacker win? Clearly, from a pure blockchain perspective, the
100only correct thing to do is let the DAO burn -- as a painful
106only correct thing to do is let the DAO burn -- as a painful
101warning to all future contract authors and participants.
107warning to all future contract authors and participants.
102
108
103At present, it seems that Ethereum's leadership has chosen war.
109At present, it seems that Ethereum's leadership has chosen war.
104−Certainly, neither choice is obviously imprudent. Ethereum is a
110+Certainly, neither choice is obviously imprudent. Ethereum is a
105−winner and probably has a bright future either way. But who
111+winner and probably has a bright future either way. But who
106chooses war needs a plan to win that war, and return to peace.
112chooses war needs a plan to win that war, and return to peace.
107
113
108## Sovereignty is conserved
114## Sovereignty is conserved
@@ -111,32 +117,32 @@ For a government to even have the power to consider wartime
111measures, a government has to exist in the first place.
117measures, a government has to exist in the first place.
112
118
113Again, we can't remind ourselves too often that a blockchain just
119Again, we can't remind ourselves too often that a blockchain just
114−puts absolute authority in the hands of the miners. We just
120+puts absolute authority in the hands of the miners. We just
115think of this power in terms of the law it's supposed to enforce.
121think of this power in terms of the law it's supposed to enforce.
116But the two are different -- at least in wartime.
122But the two are different -- at least in wartime.
117
123
118−Why is it so hard to eliminate unaccountable power? Who watches
124+Why is it so hard to eliminate unaccountable power? Who watches
119−the watchmen? The German legal scholar [Carl
125+the watchmen? The German legal scholar [Carl
120Schmitt](https://en.wikipedia.org/wiki/Carl_Schmitt) defined the
126Schmitt](https://en.wikipedia.org/wiki/Carl_Schmitt) defined the
121problem well when he wrote: "the sovereign is who decides the
127problem well when he wrote: "the sovereign is who decides the
122exception."
128exception."
123
129
124In the American regime, the Supreme Court is sovereign by
130In the American regime, the Supreme Court is sovereign by
125−Schmitt's definition. We have a complex system of laws, which
131+Schmitt's definition. We have a complex system of laws, which
126are not formal code but in some ways aspire to be; above it, we
132are not formal code but in some ways aspire to be; above it, we
127have a judiciary system that can decide arbitrary exceptions to
133have a judiciary system that can decide arbitrary exceptions to
128−those laws. Pure rule of law, Schmitt tells us, is always and
134+those laws. Pure rule of law, Schmitt tells us, is always and
129−everywhere an illusion. We can and should strive to approach
135+everywhere an illusion. We can and should strive to approach
130this limit, but it's an infinity that we can't actually reach.
136this limit, but it's an infinity that we can't actually reach.
131
137
132Schmitt's exception principle can be rephrased as "sovereignty is
138Schmitt's exception principle can be rephrased as "sovereignty is
133−conserved." There is always someone who answers to nobody. We
139+conserved." There is always someone who answers to nobody. We
134cannot eliminate government; the best we can do is tame it.
140cannot eliminate government; the best we can do is tame it.
135
141
136One way to think of the problem of reducing exceptional force to
142One way to think of the problem of reducing exceptional force to
137zero is to compare it to a simple unstable equilibrium, like a
143zero is to compare it to a simple unstable equilibrium, like a
138−pencil standing on its point. The pencil on its point needs
144+pencil standing on its point. The pencil on its point needs
139−almost no force to stay upright. But the farther it deviates
145+almost no force to stay upright. But the farther it deviates
140from this orderly, self-sustaining equilibrium, the more energy
146from this orderly, self-sustaining equilibrium, the more energy
141must be applied to return it to vertical.
147must be applied to return it to vertical.
142
148
@@ -146,26 +152,26 @@ things like 'fairness', but it's hard to define what fairness
146even means."
152even means."
147
153
148If we could define fairness, we would have a rule to which there
154If we could define fairness, we would have a rule to which there
149−were no exceptions. We would need no judges, or governments, or
155+were no exceptions. We would need no judges, or governments, or
150−even soldiers. We would need no sovereignty. But since we can't
156+even soldiers. We would need no sovereignty. But since we can't
151define fairness -- yet need to enforce some clear vision of
157define fairness -- yet need to enforce some clear vision of
152fairness -- sovereignty remains conserved.
158fairness -- sovereignty remains conserved.
153
159
154## Bitcoin, a blockchain at peace
160## Bitcoin, a blockchain at peace
155
161
156Bitcoin has done an excellent job of freezing the war power of
162Bitcoin has done an excellent job of freezing the war power of
157−its own "parliament." Ironically, mining power in Bitcoin is
163+its own "parliament." Ironically, mining power in Bitcoin is
158quite centralized -- a small number of Chinese mining-pool
164quite centralized -- a small number of Chinese mining-pool
159managers, who have every opportunity to collude, could roll back
165managers, who have every opportunity to collude, could roll back
160−anything. But they never have and they probably never will.
166+anything. But they never have and they probably never will.
161
167
162Even if a single pool controlled 51% of Bitcoin mining power,
168Even if a single pool controlled 51% of Bitcoin mining power,
163they'd have no incentive to break the rules -- quite the
169they'd have no incentive to break the rules -- quite the
164−converse. We equate physical decentralization with limited
170+converse. We equate physical decentralization with limited
165governance, perhaps because we think of the physical difficulty
171governance, perhaps because we think of the physical difficulty
166of coordination as the main protection against arbitrary power.
172of coordination as the main protection against arbitrary power.
167
173
168−Bitcoin shows that this isn't true. As far as we can tell,
174+Bitcoin shows that this isn't true. As far as we can tell,
169Bitcoin would keep working fine if there was only one miner.
175Bitcoin would keep working fine if there was only one miner.
170This uni-miner would have still have no incentive to corrupt the
176This uni-miner would have still have no incentive to corrupt the
171network -- though another party, such as a real government, might
177network -- though another party, such as a real government, might
@@ -173,41 +179,41 @@ have an incentive to coerce the miner.
173
179
174The important success of Bitcoin is the collective acceptance --
180The important success of Bitcoin is the collective acceptance --
175mathematically false, but politically true -- that rollbacks in
181mathematically false, but politically true -- that rollbacks in
176−Bitcoin are inconceivable. Bitcoin has governance problems, but
182+Bitcoin are inconceivable. Bitcoin has governance problems, but
177they're confined to relatively unimportant questions, like the
183they're confined to relatively unimportant questions, like the
178−blocksize debate. "Decentralization" may not be quite the word,
184+blocksize debate. "Decentralization" may not be quite the word,
179−but somehow Bitcoin has achieved limited government. The pencil
185+but somehow Bitcoin has achieved limited government. The pencil
180−is standing on its point. For now.
186+is standing on its point. For now.
181
187
182## Ethereum's dilemma
188## Ethereum's dilemma
183
189
184−A rollback creates a scary precedent. It's a sort of military
190+A rollback creates a scary precedent. It's a sort of military
185−coup. Just as the miners have the power to rule any blockchain,
191+coup. Just as the miners have the power to rule any blockchain,
186−the military has the power to rule any country. Do they want it?
192+the military has the power to rule any country. Do they want it?
187−The first coup makes the next coup much easier. Same with the
193+The first coup makes the next coup much easier. Same with the
188first rollback.
194first rollback.
189
195
190In retrospect, the great mistake here was that Ethereum didn't
196In retrospect, the great mistake here was that Ethereum didn't
191know it needed a government, and did its best to pretend it
197know it needed a government, and did its best to pretend it
192−didn't have one. After a rollback, Ethereum doesn't just have a
198+didn't have one. After a rollback, Ethereum doesn't just have a
193−government. It has a military dictatorship.
199+government. It has a military dictatorship.
194
200
195−Ethereum and Bitcoin are qualitatively different. Bitcoin has a
201+Ethereum and Bitcoin are qualitatively different. Bitcoin has a
196−simple UI metaphor: cash. Everyone knows how cash works. A
202+simple UI metaphor: cash. Everyone knows how cash works. A
197−smart contract has its own UI metaphor: law. But as we see,
203+smart contract has its own UI metaphor: law. But as we see,
198mechanically administered law, law without judges, is a very
204mechanically administered law, law without judges, is a very
199different thing from ordinary human law.
205different thing from ordinary human law.
200
206
201What the DAO shows is that Ethereum just wasn't ready to be
207What the DAO shows is that Ethereum just wasn't ready to be
202−decentralized. It was not ready to allow a $150 million contract
208+decentralized. It was not ready to allow a $150 million contract
203−with no supervision or appeals process. The problem was not
209+with no supervision or appeals process. The problem was not
204Ethereum's code per se -- although Solidity doesn't seem terribly
210Ethereum's code per se -- although Solidity doesn't seem terribly
205well designed for preventing these pitfalls -- but the human
211well designed for preventing these pitfalls -- but the human
206understanding of its capabilities and limits.
212understanding of its capabilities and limits.
207
213
208−A rollback acknowledges this. It acknowledges that Ethereum
214+A rollback acknowledges this. It acknowledges that Ethereum
209wasn't ready for complete self-government, and _someone_ needed
215wasn't ready for complete self-government, and _someone_ needed
210−to have stopped the DAO from trading. It's not quite clear what
216+to have stopped the DAO from trading. It's not quite clear what
211the principle behind the rollback was.
217the principle behind the rollback was.
212
218
213Perhaps the best kind of DAO rollback would be a rollback which
219Perhaps the best kind of DAO rollback would be a rollback which
@@ -215,13 +221,13 @@ understood this error fully, and acknowledged that -- for the
215moment -- Ethereum needs a sovereign government, with the power
221moment -- Ethereum needs a sovereign government, with the power
216to restrict and/or steward contracts.
222to restrict and/or steward contracts.
217
223
218−Contracts are not payments. They are infinitely more complex.
224+Contracts are not payments. They are infinitely more complex.
219−They will keep blowing up. Ethereum is full of buggy contracts,
225+They will keep blowing up. Ethereum is full of buggy contracts,
220−scammy contracts, ponzis and casinos, etc. A governed Ethereum,
226+scammy contracts, ponzis and casinos, etc. A governed Ethereum,
221in the present state of the technology, might well choose to vet
227in the present state of the technology, might well choose to vet
222all contracts centrally _before_ they started trading.
228all contracts centrally _before_ they started trading.
223
229
224−Would this be a permanent feature? Certainly not -- it would be
230+Would this be a permanent feature? Certainly not -- it would be
225a way for the community to collectively define a good contract.
231a way for the community to collectively define a good contract.
226Once we know what a responsible, well-tested, non-scammy Ethereum
232Once we know what a responsible, well-tested, non-scammy Ethereum
227contract looks like, it's much easier to return to the principle
233contract looks like, it's much easier to return to the principle
@@ -233,49 +239,49 @@ are able to make this decision rationally, and get it right.
233This work simply hasn't been done.
239This work simply hasn't been done.
234
240
235Perhaps the worst-case scenario is one in which Ethereum approves
241Perhaps the worst-case scenario is one in which Ethereum approves
236−the hard fork, on the "just this once" principle. To save the
242+the hard fork, on the "just this once" principle. To save the
237−country, we need a military coup. But don't panic! "After
243+country, we need a military coup. But don't panic! "After
238executing all traitors and enemies of the people, the generals
244executing all traitors and enemies of the people, the generals
239will immediately restore democracy and the rule of law."
245will immediately restore democracy and the rule of law."
240
246
241The "just this once" fork takes us back to decentralization
247The "just this once" fork takes us back to decentralization
242−theater, where Ethereum pretends not to have a government. But
248+theater, where Ethereum pretends not to have a government. But
243−now, this pretense is even more threadbare. The next hack, which
249+now, this pretense is even more threadbare. The next hack, which
244will certainly happen, will produce yet another coup -- or at
250will certainly happen, will produce yet another coup -- or at
245−least a food fight over whether to have a coup. This is the path
251+least a food fight over whether to have a coup. This is the path
246to a "digital banana republic," where the tattered illusion of
252to a "digital banana republic," where the tattered illusion of
247law barely conceals the real law of nature.
253law barely conceals the real law of nature.
248
254
249The bottom line is that if a rollback happens once, we can expect
255The bottom line is that if a rollback happens once, we can expect
250−it to happen again. This time, the rollback can be treated as an
256+it to happen again. This time, the rollback can be treated as an
251−act of war, and no process is necessary. Next time, there needs
257+act of war, and no process is necessary. Next time, there needs
252to be a process -- or the dream of code as law will drift further
258to be a process -- or the dream of code as law will drift further
253away.
259away.
254
260
255Having a central government isn't inconsistent with the ultimate
261Having a central government isn't inconsistent with the ultimate
256−objective of eliminating central government. Certainly, before
262+objective of eliminating central government. Certainly, before
257−Ethereum was released, its developers were its government. Every
263+Ethereum was released, its developers were its government. Every
258government is born in a state of chaos and war.
264government is born in a state of chaos and war.
259
265
260The mistake is just in thinking something as complex as Ethereum
266The mistake is just in thinking something as complex as Ethereum
261−can jump directly to decentralization in a single step. The
267+can jump directly to decentralization in a single step. The
262−pencil is not standing on its point, or anywhere close. Before
268+pencil is not standing on its point, or anywhere close. Before
263anyone can think about letting go, someone needs to actually lift
269anyone can think about letting go, someone needs to actually lift
264−it. To reach law, first enforce peace.
270+it. To reach law, first enforce peace.
265
271
266## Constitutional structure
272## Constitutional structure
267
273
268One of the governance problems of blockchains, related to the
274One of the governance problems of blockchains, related to the
269fundamental error of decentralization theater, is the failure to
275fundamental error of decentralization theater, is the failure to
270build deliberative institutions on top of the "parliament of
276build deliberative institutions on top of the "parliament of
271−miners." Voting by proof of work is great, especially if the
277+miners." Voting by proof of work is great, especially if the
272majority is well above 51%, and can demonstrate its strength
278majority is well above 51%, and can demonstrate its strength
273−without an actual hashing race. It's a good way to finalize
279+without an actual hashing race. It's a good way to finalize
274−decisions. But not a good way to make them.
280+decisions. But not a good way to make them.
275
281
276But blockchain governance would be considerably improved if the
282But blockchain governance would be considerably improved if the
277miners actually had a formal way to delegate their power to a
283miners actually had a formal way to delegate their power to a
278−structured institution that represented them. Both Bitcoin and
284+structured institution that represented them. Both Bitcoin and
279Ethereum have foundations and/or core teams, but authority in
285Ethereum have foundations and/or core teams, but authority in
280these institutions isn't tied in any way to actual mining power.
286these institutions isn't tied in any way to actual mining power.
281Informal politics fills this void with personality cults and
287Informal politics fills this void with personality cults and
@@ -287,22 +293,22 @@ Misalignment between a fundamental power, like the miners, and a
287group purporting to represent them, like the foundations, is
293group purporting to represent them, like the foundations, is
288inherently dangerous.
294inherently dangerous.
289
295
290−What's the alternative? An actual constitution. Perhaps the
296+What's the alternative? An actual constitution. Perhaps the
291first smart contract that Ethereum needs is not the DAO, not even
297first smart contract that Ethereum needs is not the DAO, not even
292well-engineered, high-quality smart contracts like Augur and
298well-engineered, high-quality smart contracts like Augur and
293−Maker, but just its own equivalent of 1789. If Ethereum needs a
299+Maker, but just its own equivalent of 1789. If Ethereum needs a
294−government, it must govern itself. It certainly has all the
300+government, it must govern itself. It certainly has all the
295technical tools it needs!
301technical tools it needs!
296
302
297−Or, of course, it could just let the hackers win. This is the
303+Or, of course, it could just let the hackers win. This is the
298−easiest path. And in the end, it may still be the best. War,
304+easiest path. And in the end, it may still be the best. War,
299who needs it?
305who needs it?
300
306
301## A quick Urbit plug
307## A quick Urbit plug
302
308
303Technically, Urbit needs governance much more than Ethereum.
309Technically, Urbit needs governance much more than Ethereum.
304Decentralization remains our goal -- but it's a long-term goal.
310Decentralization remains our goal -- but it's a long-term goal.
305−Decentralization theater has never even been a temptation. It's
311+Decentralization theater has never even been a temptation. It's
306just technically impossible.
312just technically impossible.
307
313
308For example, until the Urbit OS and language (Arvo and Hoon) are
314For example, until the Urbit OS and language (Arvo and Hoon) are
@@ -311,10 +317,10 @@ Urbit is still "evergreen" -- it still needs automatic hotpatches
311from the network.
317from the network.
312
318
313Whatever institution signs these updates is, by any standard, an
319Whatever institution signs these updates is, by any standard, an
314−absolute government. It's as if the Ethereum Foundation could
320+absolute government. It's as if the Ethereum Foundation could
315push a hardfork of all clients by signing the new code on the
321push a hardfork of all clients by signing the new code on the
316−blockchain. Getting out of this situation is a long-term goal --
322+blockchain. Getting out of this situation is a long-term goal --
317−where "long term" means years. Decentralization is hard.
323+where "long term" means years. Decentralization is hard.
318
324
319Read our [interim
325Read our [interim
320constitution](http://urbit.org/essays/interim-constitution) and our
326constitution](http://urbit.org/essays/interim-constitution) and our
content/blog/the-missing-middle.md+20−19
@@ -1,11 +1,12 @@
1+++
1+++
2title = "The Missing Middle"
2title = "The Missing Middle"
3−date = 2020-05-26
3+date = "2020-05-25"
4description = "Urbit stars can facilitate a flexible continuum of community norms."
4description = "Urbit stars can facilitate a flexible continuum of community norms."
5+
5[extra]
6[extra]
6author = "Nicholas Simmons"
7author = "Nicholas Simmons"
7ship = "~simfur-ritwed"
8ship = "~simfur-ritwed"
8−image ="https://media.urbit.org/site/posts/essays/missing-middle.png"
9+image = "https://media.urbit.org/site/posts/essays/missing-middle.png"
9+++
10+++
10
11
11<br>
12<br>
@@ -14,40 +15,40 @@ image ="https://media.urbit.org/site/posts/essays/missing-middle.png"
14
15
15<br>
16<br>
16
17
17−The promise of social technology is that we can discover more friends; *specifically, people more similar to us* than we previously had access to. The means by which we do so, the methods of collaboration, the quality of connected experiences; these factors matter, but they are marginal considerations compared to the basic offering of an expanded choice of connections.
18+The promise of social technology is that we can discover more friends; _specifically, people more similar to us_ than we previously had access to. The means by which we do so, the methods of collaboration, the quality of connected experiences; these factors matter, but they are marginal considerations compared to the basic offering of an expanded choice of connections.
18
19
19−The wilder-eyed, utopian end of early computing drew greatly from this promise; such unprecedented connection could bring about world peace, intellectual serendipity, higher consciousness. We didn’t get world peace, but we did get a genuine revolution in collaborative information-sharing and rapid communication. That ability to refactor our social preferences gave birth to an uncountable universe of online communities and subcultures that would be unimaginable to anyone who didn’t see it happen.
20+The wilder-eyed, utopian end of early computing drew greatly from this promise; such unprecedented connection could bring about world peace, intellectual serendipity, higher consciousness. We didn’t get world peace, but we did get a genuine revolution in collaborative information-sharing and rapid communication. That ability to refactor our social preferences gave birth to an uncountable universe of online communities and subcultures that would be unimaginable to anyone who didn’t see it happen.
20
21
21−We didn’t get a million friends either. Dunbar’s number, which posits an upper bound of ~150 trusted relationships per person, put the lie to dreams of a ‘global community.’ Better social tools give us more choice in who to fill those slots with, but not the ability to expand the personal spheres where we actually spend most of our time and forge most of our familiarity and trust with others.
22+We didn’t get a million friends either. Dunbar’s number, which posits an upper bound of ~150 trusted relationships per person, put the lie to dreams of a ‘global community.’ Better social tools give us more choice in who to fill those slots with, but not the ability to expand the personal spheres where we actually spend most of our time and forge most of our familiarity and trust with others.
22
23
23−We know this, and the social networks know it. To combat a slump in user activity, Facebook jettisoned promises of boundless discovery and started promoting Groups. The success of Discord and Slack happened precisely because they promised tools for gated communities, not open commons.
24+We know this, and the social networks know it. To combat a slump in user activity, Facebook jettisoned promises of boundless discovery and started promoting Groups. The success of Discord and Slack happened precisely because they promised tools for gated communities, not open commons.
24
25
25−One of those early promises came true in spades, though: while we still live in Dunbar communities, we’ve sped up the sorting process. We can find people like us at astonishing speed, and the diversity of options for what ‘people like us’ means has expanded exponentially. The ‘Big Sort’ of modern society is rapid, unprecedented, and utterly reliant on social technology. The problem is that for all of our freedom to find each other and make mutual agreements, the underlying technologies used for all of this sorting and trusting don’t actually reflect the diversity of expectations, norms, or approaches we might want to try. One major reason for this status quo is the underlying structure of the client-server Internet. Unlike in the physical world, where cities, religious groups, and professional associations both own real assets and collectively determine rules and norms, there is no median level of civic compromise on the Internet; just massive technical providers and platform companies, and dispossessed Dunbar communities and individuals unable to determine such rules and norms for themselves.
26+One of those early promises came true in spades, though: while we still live in Dunbar communities, we’ve sped up the sorting process. We can find people like us at astonishing speed, and the diversity of options for what ‘people like us’ means has expanded exponentially. The ‘Big Sort’ of modern society is rapid, unprecedented, and utterly reliant on social technology. The problem is that for all of our freedom to find each other and make mutual agreements, the underlying technologies used for all of this sorting and trusting don’t actually reflect the diversity of expectations, norms, or approaches we might want to try. One major reason for this status quo is the underlying structure of the client-server Internet. Unlike in the physical world, where cities, religious groups, and professional associations both own real assets and collectively determine rules and norms, there is no median level of civic compromise on the Internet; just massive technical providers and platform companies, and dispossessed Dunbar communities and individuals unable to determine such rules and norms for themselves.
26
27
27−Both internal norms (‘how do we act’) and external perceptions (‘who are we?’) get yanked around by the dictates of platform owners, routing infrastructure providers, and the societal consensus that governs both, at levels far above our Dunbar phyles. Privacy is contradicted by the need to surveil internal activity in order to target ads. The current model of social connection technology sets the bar for self-determination so high as to prevent it from adapting to external circumstances. The technical realities of the situation are due to client-server technology and its institutional history. The social aspect is a holdover from the 20th-century media paradigm of mass consensus cultures.
28+Both internal norms (‘how do we act’) and external perceptions (‘who are we?’) get yanked around by the dictates of platform owners, routing infrastructure providers, and the societal consensus that governs both, at levels far above our Dunbar phyles. Privacy is contradicted by the need to surveil internal activity in order to target ads. The current model of social connection technology sets the bar for self-determination so high as to prevent it from adapting to external circumstances. The technical realities of the situation are due to client-server technology and its institutional history. The social aspect is a holdover from the 20th-century media paradigm of mass consensus cultures.
28
29
29−The ‘long 20th century’ of mass institutions and broad consensus realities is over. Contrary to impressions, it was not the inevitable or final result of moral and civil progress. Rather, it arose from pragmatic external incentives of mass advertising and great-power ideological rivalries.
30+The ‘long 20th century’ of mass institutions and broad consensus realities is over. Contrary to impressions, it was not the inevitable or final result of moral and civil progress. Rather, it arose from pragmatic external incentives of mass advertising and great-power ideological rivalries.
30
31
31−The assumption that we must inevitably play by the same rules of discourse, given the autonomy granted by wealth, technology, and knowledge, is rapidly degrading. This status quo is a leftover from a time when mass education prepared workers for mass jobs, where mass communication hammered the same messages over the factory loudspeaker and advertised the same small number of products over the few television channels available. Yet we still assume that the shape and function of the tools and spaces for dialogue we inherited from that era are immutable and inevitable; this outdated belief cuts us off from new methods of choice and collaboration.
32+The assumption that we must inevitably play by the same rules of discourse, given the autonomy granted by wealth, technology, and knowledge, is rapidly degrading. This status quo is a leftover from a time when mass education prepared workers for mass jobs, where mass communication hammered the same messages over the factory loudspeaker and advertised the same small number of products over the few television channels available. Yet we still assume that the shape and function of the tools and spaces for dialogue we inherited from that era are immutable and inevitable; this outdated belief cuts us off from new methods of choice and collaboration.
32
33
33Without the external political and economic pressures which created our mass culture, inclusion in or acceptance by it becomes just another sinecure for sale, the outcome of a zero-sum auction to benefit from and utilize for further gain, the power accumulated by the legacy institutions safeguarding it. The ‘objective’ model has become a straightjacket on human ingenuity and community self-determination. The fact that it is ‘supposed to exist’ means that it is the ultimate prize. Inclusion in the mainstream Discourse grants scalable exploitation of any idea and prestige to its proponents. But it is a booby prize. No serious and nuanced idea, no dedicated community can withstand its flattening effects or the ways that it commercializes and cargo-cults its subject into an artificial shape. The resulting conversations are lackluster in form as well as subject.
34Without the external political and economic pressures which created our mass culture, inclusion in or acceptance by it becomes just another sinecure for sale, the outcome of a zero-sum auction to benefit from and utilize for further gain, the power accumulated by the legacy institutions safeguarding it. The ‘objective’ model has become a straightjacket on human ingenuity and community self-determination. The fact that it is ‘supposed to exist’ means that it is the ultimate prize. Inclusion in the mainstream Discourse grants scalable exploitation of any idea and prestige to its proponents. But it is a booby prize. No serious and nuanced idea, no dedicated community can withstand its flattening effects or the ways that it commercializes and cargo-cults its subject into an artificial shape. The resulting conversations are lackluster in form as well as subject.
34
35
35−The stiffer the Discourse is; the less input it deems useful, the more fragile it becomes. The inside becomes a stultifying garden party of outdated, anodyne official narratives; the outside a stew of paranoid, enraged rump factions shut out of any path to respectability or good-faith engagement with their perspective.
36+The stiffer the Discourse is; the less input it deems useful, the more fragile it becomes. The inside becomes a stultifying garden party of outdated, anodyne official narratives; the outside a stew of paranoid, enraged rump factions shut out of any path to respectability or good-faith engagement with their perspective.
36
37
37−The same dynamic wreaks havoc inside Dunbar groups as well; when there are fewer gradations of acceptable difference, internal schisms take on a stark tinge of zero-sum loyalty versus betrayal, rather than consensual drift. Savvy users, knowing the stakes, migrate quickly, leaving behind wastelands of the obstinate and clueless, who are in turn preyed upon by grifters and demagogues. Only when external events force a ‘tectonic shift’ in official understanding do these standards change. The problem is that the usual result of a ‘tectonic shift’ is a sudden, destructive earthquake. If networked culture is going to survive dramatic events out in the real world, we’re going to need a middle structural layer that allows norms and agreements to shift and negotiate based on observed reality and the wishes of ordinary participants.
38+The same dynamic wreaks havoc inside Dunbar groups as well; when there are fewer gradations of acceptable difference, internal schisms take on a stark tinge of zero-sum loyalty versus betrayal, rather than consensual drift. Savvy users, knowing the stakes, migrate quickly, leaving behind wastelands of the obstinate and clueless, who are in turn preyed upon by grifters and demagogues. Only when external events force a ‘tectonic shift’ in official understanding do these standards change. The problem is that the usual result of a ‘tectonic shift’ is a sudden, destructive earthquake. If networked culture is going to survive dramatic events out in the real world, we’re going to need a middle structural layer that allows norms and agreements to shift and negotiate based on observed reality and the wishes of ordinary participants.
38
39
39−This omission of a ‘middle layer’ of technical governance directly informs our vision for the Urbit network. In an Urbit-based world, we envision stars will be consensus hubs. There are 256 Urbit galaxies, each able to spawn 255 stars for a total of 65,280 potential stars. Each star, in turn, can spawn 65,535 planets—far above the Dunbar number of an intimate community, but also far below the ratios of authoritarian control under which current platform regimes operate. Stars and galaxies perform the essential routing and peer discovery functions of the Urbit network; planets represent distinct individual identities.
40+This omission of a ‘middle layer’ of technical governance directly informs our vision for the Urbit network. In an Urbit-based world, we envision stars will be consensus hubs. There are 256 Urbit galaxies, each able to spawn 255 stars for a total of 65,280 potential stars. Each star, in turn, can spawn 65,535 planets—far above the Dunbar number of an intimate community, but also far below the ratios of authoritarian control under which current platform regimes operate. Stars and galaxies perform the essential routing and peer discovery functions of the Urbit network; planets represent distinct individual identities.
40
41
41−Although every star is spawned by a particular galaxy, it can move to any other galaxy which agrees to host it. Similarly, planets may migrate between stars. Many imagine the extreme ramifications of such a system, projecting a Darwinian competition of starkly diverse political models encoded in governance. When we think about the future of Urbit, though, we don’t see a chaotic universe of iconoclastic outposts. We don’t doubt there will be diversity among stars (driven by the wishes of their owners and resident planet users/customers), but the real value is in the antifragility allowed by far more subtle gradations of difference in rules and structures decided upon by stars. Each star will have much, but not all, in common with its immediate neighbors, across a constellation which contains a great overall diversity of norms. Changes in policy or alignment will resemble ripples across a pond more than a buildup of tectonic force against a brittle fault.
42+Although every star is spawned by a particular galaxy, it can move to any other galaxy which agrees to host it. Similarly, planets may migrate between stars. Many imagine the extreme ramifications of such a system, projecting a Darwinian competition of starkly diverse political models encoded in governance. When we think about the future of Urbit, though, we don’t see a chaotic universe of iconoclastic outposts. We don’t doubt there will be diversity among stars (driven by the wishes of their owners and resident planet users/customers), but the real value is in the antifragility allowed by far more subtle gradations of difference in rules and structures decided upon by stars. Each star will have much, but not all, in common with its immediate neighbors, across a constellation which contains a great overall diversity of norms. Changes in policy or alignment will resemble ripples across a pond more than a buildup of tectonic force against a brittle fault.
42
43
43−Stars are Schelling points for such gradations precisely because they are discrete cogs in the overall technical infrastructure of Urbit. Technical responsibility and any bounds of ownership will always mark such points. Their designation in the case of Urbit or any other system is necessarily somewhat arbitrary. Our vision is orders of magnitude less centralized than the status quo, but not devolved so far towards the individual that community formation demands massive amounts of *individual* technical knowledge and maintenance tasks. There will always be a need for routing infrastructure, ergo power (the power to set community norms and external relations) will always accrue to the points of control over that infrastructure.
44+Stars are Schelling points for such gradations precisely because they are discrete cogs in the overall technical infrastructure of Urbit. Technical responsibility and any bounds of ownership will always mark such points. Their designation in the case of Urbit or any other system is necessarily somewhat arbitrary. Our vision is orders of magnitude less centralized than the status quo, but not devolved so far towards the individual that community formation demands massive amounts of _individual_ technical knowledge and maintenance tasks. There will always be a need for routing infrastructure, ergo power (the power to set community norms and external relations) will always accrue to the points of control over that infrastructure.
44
45
45−Urbit simplifies much of this infrastructure but, just as importantly, it makes those technical locations, and the conditions of ownership and control, explicit. It allows for them to be owned and controlled by anyone who purchases them, rather than controlled by network-level overlords and unelected government regulators. Stars are somewhere between ISPs and consumer hosting platforms (like Geocities an eon ago, or Wordpress today); independent enough to set their own policies, but generally subject to the realities of running a profitable business. The decisions made by service providers inevitably have a great influence on the norms of any network, and Urbit is no different. The advantage of the Urbit model is that there are far more stars than ISPs, they are easier to run, they are fungible properties with clear ownership, and they are not burdened with technical and regulatory debt which ties them to the status quo. These qualities allow them to be purchased and maintained by a far wider range of people than might be able to control an ISP today; the massive decentralization of routing infrastructure also seems a likely antidote to the current state of regulatory overreach and centralized snooping which ISPs are subject to.
46+Urbit simplifies much of this infrastructure but, just as importantly, it makes those technical locations, and the conditions of ownership and control, explicit. It allows for them to be owned and controlled by anyone who purchases them, rather than controlled by network-level overlords and unelected government regulators. Stars are somewhere between ISPs and consumer hosting platforms (like Geocities an eon ago, or Wordpress today); independent enough to set their own policies, but generally subject to the realities of running a profitable business. The decisions made by service providers inevitably have a great influence on the norms of any network, and Urbit is no different. The advantage of the Urbit model is that there are far more stars than ISPs, they are easier to run, they are fungible properties with clear ownership, and they are not burdened with technical and regulatory debt which ties them to the status quo. These qualities allow them to be purchased and maintained by a far wider range of people than might be able to control an ISP today; the massive decentralization of routing infrastructure also seems a likely antidote to the current state of regulatory overreach and centralized snooping which ISPs are subject to.
46
47
47−The Internet gave us an unprecedented flowering of diverse cultures; it gave communities the option to pursue a vast number of paths and goals. And we *should* have the ability, granted by wealth, free time, and communications technology, to arrange the rules of our collaboration as we wish. The structural design of the Urbit network is an effort to provide that power, encoded in a digital asset with private keys that can be held both by individuals and (via multisig arrangements) by groups. The lower price and complexity of stars compared to current ISPs also makes a lot more room for innovation in business models; star owners can make their own judgments about how to prioritize commercial revenue versus cooperative ownership, anonymity versus identity, short-term versus long-term contracts.
48+The Internet gave us an unprecedented flowering of diverse cultures; it gave communities the option to pursue a vast number of paths and goals. And we _should_ have the ability, granted by wealth, free time, and communications technology, to arrange the rules of our collaboration as we wish. The structural design of the Urbit network is an effort to provide that power, encoded in a digital asset with private keys that can be held both by individuals and (via multisig arrangements) by groups. The lower price and complexity of stars compared to current ISPs also makes a lot more room for innovation in business models; star owners can make their own judgments about how to prioritize commercial revenue versus cooperative ownership, anonymity versus identity, short-term versus long-term contracts.
48
49
49We see stars as an opportunity to incubate community hubs, to plant a flag in the wilderness, declare values and alignments, and see who shows up. This process can be varied; some stars might advertise widely, others might quietly and slowly invite other communities on board. That’s the point. There’s a nice juxtaposition between first mover-effect and overall availability here; early adopters will have an opportunity to shape discourse, but the supply is not so constrained that they’ll capture all of it. Early adopters will likely have an immense and permanent value of voice, infrastructural ownership, and ongoing revenue over their shorter-term speculative one.
50We see stars as an opportunity to incubate community hubs, to plant a flag in the wilderness, declare values and alignments, and see who shows up. This process can be varied; some stars might advertise widely, others might quietly and slowly invite other communities on board. That’s the point. There’s a nice juxtaposition between first mover-effect and overall availability here; early adopters will have an opportunity to shape discourse, but the supply is not so constrained that they’ll capture all of it. Early adopters will likely have an immense and permanent value of voice, infrastructural ownership, and ongoing revenue over their shorter-term speculative one.
50
51
51−The diversity and non-discoverability of Urbit are already showing themselves: we hear whisperings of insular communities that we not only *don’t* know about but by our express intentions *can’t* know about unless they make themselves known.
52+The diversity and non-discoverability of Urbit are already showing themselves: we hear whisperings of insular communities that we not only _don’t_ know about but by our express intentions _can’t_ know about unless they make themselves known.
52
53
53−Regardless of whether we or anyone else know about them, star owners already possess legible chunks of the ‘missing middle’’—large enough to affect the map of the Urbit universe, small enough to allow a wide array of voices—in a way that the ownership models of the current Internet can’t come anywhere close to providing. Not every neighborhood poker club needs an Urbit star. But the institution-founders, tastemakers, and social connectors of today and tomorrow, those who want to build opera houses on the digital prairie, should consider the advantages of building on a star.
54+Regardless of whether we or anyone else know about them, star owners already possess legible chunks of the ‘missing middle’’—large enough to affect the map of the Urbit universe, small enough to allow a wide array of voices—in a way that the ownership models of the current Internet can’t come anywhere close to providing. Not every neighborhood poker club needs an Urbit star. But the institution-founders, tastemakers, and social connectors of today and tomorrow, those who want to build opera houses on the digital prairie, should consider the advantages of building on a star.
content/blog/the-state-of-landscape.md+16−13
@@ -1,8 +1,12 @@
1+++
1+++
2title = "The State of Landscape"
2title = "The State of Landscape"
3−date = 2019-05-16
3+date = "2019-05-15"
4description = "An update on the state of Landscape and the Urbit network."
4description = "An update on the state of Landscape and the Urbit network."
5+aliases = [
5−aliases = ["/posts/essays/the-state-of-landscape", "/posts/the-state-of-landscape"]
6+ "/posts/essays/the-state-of-landscape",
7+ "/posts/the-state-of-landscape"
8+]
9+
6[extra]
10[extra]
7author = "Galen Wolfe-Pauly"
11author = "Galen Wolfe-Pauly"
8ship = "~ravmel-ropdyl"
12ship = "~ravmel-ropdyl"
@@ -11,27 +15,27 @@ image = "https://media.urbit.org/site/posts/essays/the-state-of-landscape-1.png"
11
15
12![](https://media.urbit.org/site/posts/essays/the-state-of-landscape-1.png)
16![](https://media.urbit.org/site/posts/essays/the-state-of-landscape-1.png)
13
17
14−The TL;DR is: if you’re really excited about living on Mars, Landscape is fun to try out. Come join `~dopzod/urbit-help`, experiment with creating your own chats and collections (did anyone find that easter egg, yet?), and see what you can do with the thing.
18+The TL;DR is: if you’re really excited about living on Mars, Landscape is fun to try out. Come join `~dopzod/urbit-help`, experiment with creating your own chats and collections (did anyone find that easter egg, yet?), and see what you can do with the thing.
15
19
16Landscape today is for the intrepid adventurer. So is much of the system. If you want to read about what we’re doing to make it more welcoming, [check out the 2019 roadmap](/posts/essays/2019-5-roadmap/).
20Landscape today is for the intrepid adventurer. So is much of the system. If you want to read about what we’re doing to make it more welcoming, [check out the 2019 roadmap](/posts/essays/2019-5-roadmap/).
17
21
18## The Broad View
22## The Broad View
19
23
20−We thought a lot last year about how to avoid the pitfalls of modern social networks. The services we all use today each feel like *one place*. It’s as if everyone on MEGANET is living together in the same city.
24+We thought a lot last year about how to avoid the pitfalls of modern social networks. The services we all use today each feel like _one place_. It’s as if everyone on MEGANET is living together in the same city.
21
25
22In the real world, cities have their own cultures. So we thought: there must be some way to build more granular communities online. Living in a single world-city is kind of a bummer, honestly.
26In the real world, cities have their own cultures. So we thought: there must be some way to build more granular communities online. Living in a single world-city is kind of a bummer, honestly.
23
27
24−Landscape was our first experiment in this direction. It’s a ruthlessly simple interface for chat and discussion that runs on top of Arvo. You can connect to Landscape in a browser or in an app on your iOS device. All communication is pseudonymous and authenticated (as with everything in Arvo) with your Azimuth point.
28+Landscape was our first experiment in this direction. It’s a ruthlessly simple interface for chat and discussion that runs on top of Arvo. You can connect to Landscape in a browser or in an app on your iOS device. All communication is pseudonymous and authenticated (as with everything in Arvo) with your Azimuth point.
25
29
26Over the past few months, we’ve been running small experiments, experimenting with ways to support our own work and finding the limits of what we can do on the network. Originally, we built Landscape out of our desire to get away from using MEGACORP communication tools in our daily work. We thought: if we’re trying to build a whole new network and society, we had better go live there first.
30Over the past few months, we’ve been running small experiments, experimenting with ways to support our own work and finding the limits of what we can do on the network. Originally, we built Landscape out of our desire to get away from using MEGACORP communication tools in our daily work. We thought: if we’re trying to build a whole new network and society, we had better go live there first.
27
31
28−Landscape is an experiment — it’s supposed to be fun, above all, and a good way to help focus our efforts on maturing the platform.
32+Landscape is an experiment — it’s supposed to be fun, above all, and a good way to help focus our efforts on maturing the platform.
29
33
30Anyway, let’s show off some of the specifics, and give an update on this experiment so far.
34Anyway, let’s show off some of the specifics, and give an update on this experiment so far.
31
35
32## A Quick Tour
36## A Quick Tour
33
37
34−Landscape is pretty simple. It lets you subscribe to chats, in the spirit of IRC, and ‘collections’, which are effectively forums or blogs with comments. You can also direct message with other running ‘ships’ or Arvo nodes.
38+Landscape is pretty simple. It lets you subscribe to chats, in the spirit of IRC, and ‘collections’, which are effectively forums or blogs with comments. You can also direct message with other running ‘ships’ or Arvo nodes.
35
39
36For the most part, this happens through a web interface that you can access at `https://ship.arvo.network` or via `localhost:80`.
40For the most part, this happens through a web interface that you can access at `https://ship.arvo.network` or via `localhost:80`.
37
41
@@ -45,7 +49,7 @@ What’s keeping us from asking others to use this thing more aggressively? Let
45
49
46They have gotten a lot better, but there are still a few things that can crash your Arvo ship. This, of course, has nothing to do with your Azimuth point, which is completely separate and, as far as we know, secure.
50They have gotten a lot better, but there are still a few things that can crash your Arvo ship. This, of course, has nothing to do with your Azimuth point, which is completely separate and, as far as we know, secure.
47
51
48−The first (and most severe) is a bug in our event persistence that occurs very rarely. Basically, there are conditions under which you can cause events not to be properly written to disk and corrupt your event log. It’s pretty unlikely, but it’s unacceptable for a real product since it basically causes you to have to wait out the current network era.
52+The first (and most severe) is a bug in our event persistence that occurs very rarely. Basically, there are conditions under which you can cause events not to be properly written to disk and corrupt your event log. It’s pretty unlikely, but it’s unacceptable for a real product since it basically causes you to have to wait out the current network era.
49
53
50The second is that Ames (our network protocol) has occasional connectivity problems. Originally, we thought we had found this issue as being related to [a timer bug](https://github.com/urbit/arvo/pull/1072). It may be, but the networking is in the process of a major overhaul — so we’ve implemented a few bandaids to make the situation workable. `|bonk` sometimes needs to be used to reset connections between peers, and `:ethmanage` sometimes need to be used to re-synchronize with the blockchain. It’s an ugly fix, but it usually works.
54The second is that Ames (our network protocol) has occasional connectivity problems. Originally, we thought we had found this issue as being related to [a timer bug](https://github.com/urbit/arvo/pull/1072). It may be, but the networking is in the process of a major overhaul — so we’ve implemented a few bandaids to make the situation workable. `|bonk` sometimes needs to be used to reset connections between peers, and `:ethmanage` sometimes need to be used to re-synchronize with the blockchain. It’s an ugly fix, but it usually works.
51
55
@@ -55,21 +59,20 @@ Relatedly, we have occasionally been seeing errors caused by the Arvo network be
55
59
56One great thing about the Arvo network is that it’s more like a giant single computer than a network. When you talk to another ship, use remote files or sync data it’s almost the same as working with local data.
60One great thing about the Arvo network is that it’s more like a giant single computer than a network. When you talk to another ship, use remote files or sync data it’s almost the same as working with local data.
57
61
58−The main thing underlying this is *sequence numbers*. Your Arvo ship keeps track of every message it has exchanged with every other ship, and it never breaks that sequence. If our ships are talking, and we’re on packet `83910` but you reset and try to start again at `0` my ship just thinks you’ve lost your mind and won’t talk to you anymore.
62+The main thing underlying this is _sequence numbers_. Your Arvo ship keeps track of every message it has exchanged with every other ship, and it never breaks that sequence. If our ships are talking, and we’re on packet `83910` but you reset and try to start again at `0` my ship just thinks you’ve lost your mind and won’t talk to you anymore.
59
63
60−We’d like individual resets to work, and we’re [working on it](https://github.com/urbit/arvo/pull/1169). But, for the time being, if you have any fatal error on your ship, it means you’ve got to sit this era out.
64+We’d like individual resets to work, and we’re [working on it](https://github.com/urbit/arvo/pull/1169). But, for the time being, if you have any fatal error on your ship, it means you’ve got to sit this era out.
61
65
62This is another unacceptable bug for anything we truly rely on.
66This is another unacceptable bug for anything we truly rely on.
63
67
64### 3 - There are no push notifications, yet
68### 3 - There are no push notifications, yet
65
69
66−What’s one thing that a chat application needs to do? Notify you of new messages. What does Landscape notify you about? Well, at the moment, basically nothing.
70+What’s one thing that a chat application needs to do? Notify you of new messages. What does Landscape notify you about? Well, at the moment, basically nothing.
67
71
68We implemented and tested a push notifications server for iOS, which is slated for release in the next few months (it depends on things in our `cc-release` branch). We’d also love to work on having your ship connect to your email provider and send you alerts over email. We’re thinking about how to do that.
72We implemented and tested a push notifications server for iOS, which is slated for release in the next few months (it depends on things in our `cc-release` branch). We’d also love to work on having your ship connect to your email provider and send you alerts over email. We’re thinking about how to do that.
69
73
70## What We’ve Learned and What We’re Doing
74## What We’ve Learned and What We’re Doing
71
75
72−Many of us spend all day on Landscape, use it from our phones, and find it really fun. The bugs above bite less than you might think and, in many cases, the experience is quite nice. It’s a passive, distraction-free way to interact with others around the office.
76+Many of us spend all day on Landscape, use it from our phones, and find it really fun. The bugs above bite less than you might think and, in many cases, the experience is quite nice. It’s a passive, distraction-free way to interact with others around the office.
73
77
74We operate one public channel, `~dopzod/urbit-help` for answering any of your questions about the system. And, from time to time, we have been creating topic-centric channels and announcing them publicly. This has been a lot of fun. Come join us if you’re feeling brave.
78We operate one public channel, `~dopzod/urbit-help` for answering any of your questions about the system. And, from time to time, we have been creating topic-centric channels and announcing them publicly. This has been a lot of fun. Come join us if you’re feeling brave.
75−
content/blog/the-understanding-urbit-podcast.md+3−2
@@ -1,11 +1,12 @@
1+++
1+++
2title = "The Understanding Urbit Podcast"
2title = "The Understanding Urbit Podcast"
3−date = 2020-04-03
3+date = "2020-04-02"
4description = "An interview-based podcast series about the Urbit project, as told by those working on it."
4description = "An interview-based podcast series about the Urbit project, as told by those working on it."
5+
5[extra]
6[extra]
6author = "Arthur Falls"
7author = "Arthur Falls"
7ship = "~satsyt-sogleb"
8ship = "~satsyt-sogleb"
8−image ="https://media.urbit.org/site/posts/essays/uu-podcast.png"
9+image = "https://media.urbit.org/site/posts/essays/uu-podcast.png"
9+++
10+++
10
11
11<br>
12<br>
content/blog/the-urbit-address-space.md+93−88
@@ -1,34 +1,39 @@
1+++
1+++
2title = "The Urbit Address Space"
2title = "The Urbit Address Space"
3−date = 2016-05-16
3+date = "2016-05-15"
4description = "An overview of Urbit's cryptographic address space."
4description = "An overview of Urbit's cryptographic address space."
5+aliases = [
5−aliases = ["/posts/essays/the-urbit-address-space", "/posts/the-urbit-address-space"]
6+ "/posts/essays/the-urbit-address-space",
7+ "/posts/the-urbit-address-space"
8+]
9+
6[extra]
10[extra]
7author = "Galen Wolfe-Pauly + Curtis Yarvin"
11author = "Galen Wolfe-Pauly + Curtis Yarvin"
8ship = "~ravmel-ropdyl + ~sorreg-namtyv"
12ship = "~ravmel-ropdyl + ~sorreg-namtyv"
9image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/the-urbit-address-space.jpg"
13image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/the-urbit-address-space.jpg"
10+++
14+++
15+
11![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/the-urbit-address-space.jpg)
16![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/the-urbit-address-space.jpg)
12
17
13## Basics
18## Basics
14
19
15−Urbit contains a lot of new technology. As an ordinary user, all you
20+Urbit contains a lot of new technology. As an ordinary user, all you
16−need to understand is Urbit's identity model. If you're in a hurry,
21+need to understand is Urbit's identity model. If you're in a hurry,
17just read these simplified basics.
22just read these simplified basics.
18
23
19−An Urbit identity, or "ship," is a string like `~firbyr-napbes`. It
24+An Urbit identity, or "ship," is a string like `~firbyr-napbes`. It
20means nothing, but it's easy to remember and say out loud.
25means nothing, but it's easy to remember and say out loud.
21`~firbyr-napbes` is actually just a 32-bit number, like an IP address,
26`~firbyr-napbes` is actually just a 32-bit number, like an IP address,
22that we turn into a human-memorable string.
27that we turn into a human-memorable string.
23
28
24Technically, a ship is a secure digital identity that you own and
29Technically, a ship is a secure digital identity that you own and
25−control with a cryptographic key, like a Bitcoin wallet. As in
30+control with a cryptographic key, like a Bitcoin wallet. As in
26−Bitcoin, the supply of ships is mathematically limited. This keeps
31+Bitcoin, the supply of ships is mathematically limited. This keeps
27the network friendly, by making spam and abuse expensive.
32the network friendly, by making spam and abuse expensive.
28
33
29A ship name is just a number; smaller numbers make shorter names.
34A ship name is just a number; smaller numbers make shorter names.
30−Shorter names are easier to remember, so they're more valuable. So
35+Shorter names are easier to remember, so they're more valuable. So
31−ships are classified by the number of bits in their name. (A ship
36+ships are classified by the number of bits in their name. (A ship
32name is just a scrambled base-256 representation of the number.)
37name is just a scrambled base-256 representation of the number.)
33
38
34A 32-bit ship (like `~firbyr-napbes`) is called a "planet." A 16-bit
39A 32-bit ship (like `~firbyr-napbes`) is called a "planet." A 16-bit
@@ -37,48 +42,48 @@ ship (like `~pollev)` is a "star." An 8-bit ship (like `~mun`) is a
37Stars and galaxies are network infrastructure.
42Stars and galaxies are network infrastructure.
38
43
39Each planet or star is launched by its "parent," the star or galaxy
44Each planet or star is launched by its "parent," the star or galaxy
40−whose number is its bottom half. So the planet `~firbyr-napbes`,
45+whose number is its bottom half. So the planet `~firbyr-napbes`,
41`0xdead.beef` or `3.735.928.559`, is the child of `~pollev`, `0xbeef`
46`0xdead.beef` or `3.735.928.559`, is the child of `~pollev`, `0xbeef`
42−or `48.879`, whose parent is `~mun`, `0xef`, `239`. The parent of
47+or `48.879`, whose parent is `~mun`, `0xef`, `239`. The parent of
43`~mun` and all galaxies is `~zod`, `0`.
48`~mun` and all galaxies is `~zod`, `0`.
44
49
45−If Bitcoin is money, Urbit is land. Much as all real-estate titles in
50+If Bitcoin is money, Urbit is land. Much as all real-estate titles in
46England trace back to William the Conqueror, all certificates in Urbit
51England trace back to William the Conqueror, all certificates in Urbit
47trace back to `~zod`.
52trace back to `~zod`.
48
53
49−But this universe is worthless unless dispersed. It's already quite
54+But this universe is worthless unless dispersed. It's already quite
50−well fragmented. And as it grows distributed, it grows decentralized.
55+well fragmented. And as it grows distributed, it grows decentralized.
51The endpoint is a virtual city of 4 billion (`2^32`) citizens, all
56The endpoint is a virtual city of 4 billion (`2^32`) citizens, all
52−owners of their own independent digital identities. The stars and
57+owners of their own independent digital identities. The stars and
53galaxies continue as a federated governance and service network.
58galaxies continue as a federated governance and service network.
54
59
55This city is a social network, a peer-to-peer packet network, and a
60This city is a social network, a peer-to-peer packet network, and a
56−public-key infrastructure (PKI). In the social layer, your ship is
61+public-key infrastructure (PKI). In the social layer, your ship is
57−your name. In the packet layer, your ship is your network address.
62+your name. In the packet layer, your ship is your network address.
58−In the PKI, your ship is your cryptographic identity. Perhaps more
63+In the PKI, your ship is your cryptographic identity. Perhaps more
59intuitively, a ship is a sort of pronounceable phone number.
64intuitively, a ship is a sort of pronounceable phone number.
60
65
61−And once Urbit is built, no one owns the city. No one can control it.
66+And once Urbit is built, no one owns the city. No one can control it.
62It does need governance; but it governs itself as a digital republic.
67It does need governance; but it governs itself as a digital republic.
63
68
64## Details
69## Details
65
70
66−As an Urbit user, these basics are all you need to know. As a
71+As an Urbit user, these basics are all you need to know. As a
67−developer, a few more details might interest you. (An even more
72+developer, a few more details might interest you. (An even more
68comprehensive treatment is in the [whitepaper](https://media.urbit.org/whitepaper.pdf)).
73comprehensive treatment is in the [whitepaper](https://media.urbit.org/whitepaper.pdf)).
69
74
70### Design goals
75### Design goals
71
76
72An identity system has three goals: a name wants to be secure,
77An identity system has three goals: a name wants to be secure,
73−human-meaningful, and decentralized. A principle called "Zooko's
78+human-meaningful, and decentralized. A principle called "Zooko's
74triangle" says that a practical identity system can achieve any two of
79triangle" says that a practical identity system can achieve any two of
75these goals.
80these goals.
76
81
77The art of OS design is the art of using strategic tradeoffs to almost
82The art of OS design is the art of using strategic tradeoffs to almost
78−solve unsolvable problems. Urbit's goals are to be secure,
83+solve unsolvable problems. Urbit's goals are to be secure,
79−human-_memorable_, and _eventually_ decentralized. We sacrifice
84+human-_memorable_, and _eventually_ decentralized. We sacrifice
80meaning (Urbit is not competing with the DNS), and postpone
85meaning (Urbit is not competing with the DNS), and postpone
81−decentralization. These tradeoffs buy us a simple system that can
86+decentralization. These tradeoffs buy us a simple system that can
82actually be built.
87actually be built.
83
88
84### Comparison to existing identity layers
89### Comparison to existing identity layers
@@ -92,43 +97,43 @@ addresses (like `126.78.92.112`), domain names (like
92`@galenwp`).
97`@galenwp`).
93
98
94Urbit (or more precisely, its Ames protocol) squeezes all three layers
99Urbit (or more precisely, its Ames protocol) squeezes all three layers
95−into one. At the network level, Urbit is a P2P overlay network; your
100+into one. At the network level, Urbit is a P2P overlay network; your
96−ship is your network address. It's also the name of your server.
101+ship is your network address. It's also the name of your server.
97−Finally, it's your secure digital pseudonym. And we map your ship
102+Finally, it's your secure digital pseudonym. And we map your ship
98name into the DNS, at `ship.urbit.org`.
103name into the DNS, at `ship.urbit.org`.
99
104
100(One way to use Urbit is as an identity for the Internet, which
105(One way to use Urbit is as an identity for the Internet, which
101−doesn't have a standard system of secure authentication. Urbit has a
106+doesn't have a standard system of secure authentication. Urbit has a
102single-signon API which lets any Web server accept Urbit logins, like
107single-signon API which lets any Web server accept Urbit logins, like
103a normal social login -- but not captive to any central mainframe.)
108a normal social login -- but not captive to any central mainframe.)
104
109
105### Cryptographic ownership
110### Cryptographic ownership
106
111
107−You own an Urbit ship cryptographically, like a Bitcoin wallet. But
112+You own an Urbit ship cryptographically, like a Bitcoin wallet. But
108Urbit doesn't use a blockchain or mining.
113Urbit doesn't use a blockchain or mining.
109
114
110You transfer a ship by signing a new public key with the old private
115You transfer a ship by signing a new public key with the old private
111−key, then broadcasting the signature. Any urbit that receives this
116+key, then broadcasting the signature. Any urbit that receives this
112new certificate will no longer trust the old key.
117new certificate will no longer trust the old key.
113
118
114−Urbit is digital land, not digital money. A currency needs to support
119+Urbit is digital land, not digital money. A currency needs to support
115−high-frequency, zero-friction transfers. Real estate transfers are
120+high-frequency, zero-friction transfers. Real estate transfers are
116low frequency and high friction, so the "double spend" problem (which
121low frequency and high friction, so the "double spend" problem (which
117mining solves) is much less pressing.
122mining solves) is much less pressing.
118
123
119−Don't expect urbits to be tradeable on cryptocurrency exchanges. A
124+Don't expect urbits to be tradeable on cryptocurrency exchanges. A
120trade adds at least one signature to the ship's certificate, or two if
125trade adds at least one signature to the ship's certificate, or two if
121−the parties don't trust each other and an intermediary is needed. A
126+the parties don't trust each other and an intermediary is needed. A
122bulky certificate isn't free, since it slows down new connections.
127bulky certificate isn't free, since it slows down new connections.
123
128
124−This isn't a serious problem if urbits are treated like land. But it
129+This isn't a serious problem if urbits are treated like land. But it
125−prevents Urbit from being a competent currency. This is a feature,
130+prevents Urbit from being a competent currency. This is a feature,
126−not a bug. Urbit has no need to compete with Bitcoin or Ethereum,
131+not a bug. Urbit has no need to compete with Bitcoin or Ethereum,
127and every reason not to.
132and every reason not to.
128
133
129## Moons and comets
134## Moons and comets
130
135
131−In the general case, a ship is actually a 128-bit number. A full
136+In the general case, a ship is actually a 128-bit number. A full
132table of ship classes:
137table of ship classes:
133
138
134```
139```
@@ -140,154 +145,154 @@ table of ship classes:
140```
145```
141
146
142Moons are for clients and connected devices: a laptop, a phone, a
147Moons are for clients and connected devices: a laptop, a phone, a
143−digital thermostat. A moon is not independent; its parent planet has
148+digital thermostat. A moon is not independent; its parent planet has
144−to sign its key updates. (We don't want rogue clients floating
149+to sign its key updates. (We don't want rogue clients floating
145randomly around the universe.)
150randomly around the universe.)
146
151
147−A comet's address is the hash of its initial public key. Anyone can
152+A comet's address is the hash of its initial public key. Anyone can
148−launch a comet. Nothing stops you from using a comet as your
153+launch a comet. Nothing stops you from using a comet as your
149identity, except that the name is a mouthful and everyone will assume
154identity, except that the name is a mouthful and everyone will assume
150you're a bot.
155you're a bot.
151
156
152### Scarcity, reputation, friendliness and trust
157### Scarcity, reputation, friendliness and trust
153
158
154A crucial difference between Urbit and other networks is that planets
159A crucial difference between Urbit and other networks is that planets
155−are scarce. Even when the network is fully populated, there are only
160+are scarce. Even when the network is fully populated, there are only
156−4 billion. Early in Urbit's life, most stars and galaxies are not yet
161+4 billion. Early in Urbit's life, most stars and galaxies are not yet
157−operating, so far fewer are available. No one will ever be able to
162+operating, so far fewer are available. No one will ever be able to
158get planets trivially and for free.
163get planets trivially and for free.
159
164
160Urbit is a _friendly network_: a network on which you can assume that
165Urbit is a _friendly network_: a network on which you can assume that
161−a stranger is nice until proven nasty. Friendliness is a direct
166+a stranger is nice until proven nasty. Friendliness is a direct
162−consequence of scarce, individually owned identities. We're not
167+consequence of scarce, individually owned identities. We're not
163changing human nature, just creating the right economic incentives.
168changing human nature, just creating the right economic incentives.
164
169
165Most forms of network abuse are "Sybil attacks": they rely on an
170Most forms of network abuse are "Sybil attacks": they rely on an
166−infinite supply of fresh identities. Scarcity makes reputation work.
171+infinite supply of fresh identities. Scarcity makes reputation work.
167Spam is a business; if the cost of a new planet exceeds the amount of
172Spam is a business; if the cost of a new planet exceeds the amount of
168money you can make by spamming from that planet until its reputation
173money you can make by spamming from that planet until its reputation
169is trashed, there will be no spam.
174is trashed, there will be no spam.
170
175
171Shady stars and galaxies that sell blocks of planets to spammers will
176Shady stars and galaxies that sell blocks of planets to spammers will
172also develop reputations as "bad neighborhoods," damaging the value of
177also develop reputations as "bad neighborhoods," damaging the value of
173−the whole block. Abuse at any level is designed to be
178+the whole block. Abuse at any level is designed to be
174counterproductive and economically self-terminating.
179counterproductive and economically self-terminating.
175
180
176Urbit has no reputation system at all at the moment, simply because
181Urbit has no reputation system at all at the moment, simply because
177−we're so small that friendliness is automatic. The clear and rigorous
182+we're so small that friendliness is automatic. The clear and rigorous
178structure of the address space is not a reputation system; it is a
183structure of the address space is not a reputation system; it is a
179platform on which any number of such systems can and should be built.
184platform on which any number of such systems can and should be built.
180But we can't build one until we need one.
185But we can't build one until we need one.
181
186
182### Initial allocation and rationale
187### Initial allocation and rationale
183
188
184−In cryptocurrency terms, Urbit is "100% premined." Why? Three
189+In cryptocurrency terms, Urbit is "100% premined." Why? Three
185reasons.
190reasons.
186
191
187−One, Urbit doesn't need mining. Two, Urbit is a much more ambitious
192+One, Urbit doesn't need mining. Two, Urbit is a much more ambitious
188−software project than Bitcoin or even Ethereum. To fund its own
193+software project than Bitcoin or even Ethereum. To fund its own
189development, the project needs to capture the potential value of its
194development, the project needs to capture the potential value of its
190own real estate.
195own real estate.
191
196
192Three, most theories of property agree that anyone whoever creates or
197Three, most theories of property agree that anyone whoever creates or
193−discovers new property starts out by owning it. Because galaxies are
198+discovers new property starts out by owning it. Because galaxies are
194−premined, Urbit starts as a centralized system. But it has two strong
199+premined, Urbit starts as a centralized system. But it has two strong
195motivations to decentralize.
200motivations to decentralize.
196
201
197−One, the more decentralized Urbit is, the more Urbit is worth. Two,
202+One, the more decentralized Urbit is, the more Urbit is worth. Two,
198the only way for Urbit to fund its own development is to homestead its
203the only way for Urbit to fund its own development is to homestead its
199own real estate.
204own real estate.
200
205
201Urbit was created by Curtis Yarvin, who has distributed the 256
206Urbit was created by Curtis Yarvin, who has distributed the 256
202galaxies as follows (allocation as of June 1, 2016):
207galaxies as follows (allocation as of June 1, 2016):
203
208
204−95, to the [Tlon Corporation](/blog/company). 50, to urbit.org, the future
209+95, to the [Tlon Corporation](/blog/company). 50, to urbit.org, the future
205−community foundation. 40, to Tlon employees and their family members
210+community foundation. 40, to Tlon employees and their family members
206(24 to Curtis, who started in 2002; 16 to everyone else, who started
211(24 to Curtis, who started in 2002; 16 to everyone else, who started
207−in 2014). 34, to outside investors in Tlon. 37, to 33 other
212+in 2014). 34, to outside investors in Tlon. 37, to 33 other
208individuals, who donated to the project, contributed code or services,
213individuals, who donated to the project, contributed code or services,
209won a contest, or were just in the right place at the right time.
214won a contest, or were just in the right place at the right time.
210
215
211What's critical is that the whole system is unlikely to collapse back
216What's critical is that the whole system is unlikely to collapse back
212−into a single landlord. This is why we've intentionally scattered
217+into a single landlord. This is why we've intentionally scattered
213Urbit's ownership across a diverse set of entities.
218Urbit's ownership across a diverse set of entities.
214
219
215Furthermore, we've defined informal conventions designed to motivate a
220Furthermore, we've defined informal conventions designed to motivate a
216healthy ownership structure by punishing violators with reputation
221healthy ownership structure by punishing violators with reputation
217−cost. Address blocks should only split, never merge; galaxies and
222+cost. Address blocks should only split, never merge; galaxies and
218stars should be owned by different parties; galaxies should be owned
223stars should be owned by different parties; galaxies should be owned
219−by true individuals, not corporations. Urbit does not live up to
224+by true individuals, not corporations. Urbit does not live up to
220these ideals at present, but must always progress toward them.
225these ideals at present, but must always progress toward them.
221
226
222### Federated services, adoption and escape
227### Federated services, adoption and escape
223
228
224−Urbit is a peer-to-peer network. Urbits that live behind a firewall
229+Urbit is a peer-to-peer network. Urbits that live behind a firewall
225or on a home network need "supernodes" to help them route packets.
230or on a home network need "supernodes" to help them route packets.
226−The supernode is the parent. So a parent's work isn't done once it's
231+The supernode is the parent. So a parent's work isn't done once it's
227launched all its children.
232launched all its children.
228
233
229−There's no way to enforce this responsibility. So a star or planet
234+There's no way to enforce this responsibility. So a star or planet
230can be _adopted_ by a new parent of the same class, letting it escape
235can be _adopted_ by a new parent of the same class, letting it escape
231−from a bad default parent. If your parent stops serving you, and no
236+from a bad default parent. If your parent stops serving you, and no
232other parent is willing to adopt you, you're probably a bad actor.
237other parent is willing to adopt you, you're probably a bad actor.
233
238
234−Supernode routing is just one example of why you need a parent. A
239+Supernode routing is just one example of why you need a parent. A
235mature Urbit will naturally develop all kinds of other _federated
240mature Urbit will naturally develop all kinds of other _federated
236services_ -- from technical standardization and update approval, to
241services_ -- from technical standardization and update approval, to
237−certificate update broadcast, to reputation and friend lookup. All
242+certificate update broadcast, to reputation and friend lookup. All
238−these services are delivered by cooperating stars and galaxies. Bad
243+these services are delivered by cooperating stars and galaxies. Bad
239actors at this level should be rare.
244actors at this level should be rare.
240
245
241Especially when Urbit is young, the level of trust that a child places
246Especially when Urbit is young, the level of trust that a child places
242−in its parent is high. The trust implied by automatic kernel updates
247+in its parent is high. The trust implied by automatic kernel updates
243−is almost infinite. You can disable updates, but that's nowhere near
248+is almost infinite. You can disable updates, but that's nowhere near
244−practical yet. (Ideally we will be able to freeze the Arvo kernel,
249+practical yet. (Ideally we will be able to freeze the Arvo kernel,
245like Nock, and turn off kernel updates; but this will take years at
250like Nock, and turn off kernel updates; but this will take years at
246least.)
251least.)
247
252
248### Code is law: seeing like a pattern language of great cities
253### Code is law: seeing like a pattern language of great cities
249
254
250−Constitutional innovation is dangerous. Our vision of digital
255+Constitutional innovation is dangerous. Our vision of digital
251governance isn't ours, but is synthesized as best we can from the work
256governance isn't ours, but is synthesized as best we can from the work
252of four great 20th-century thinkers: the legal scholar Lawrence
257of four great 20th-century thinkers: the legal scholar Lawrence
253Lessig, the political scientist James C. Scott, the urbanist Jane
258Lessig, the political scientist James C. Scott, the urbanist Jane
254Jacobs and the architect Christopher Alexander.
259Jacobs and the architect Christopher Alexander.
255
260
256All decentralized computation systems rely to some extent on Lessig's
261All decentralized computation systems rely to some extent on Lessig's
257−principle: "code is law." Where law uses human interpretation to
262+principle: "code is law." Where law uses human interpretation to
258−determine an outcome, code uses mathematics. It is code, not law,
263+determine an outcome, code uses mathematics. It is code, not law,
259that decides who owns a Bitcoin wallet.
264that decides who owns a Bitcoin wallet.
260
265
261−But all these systems, including Bitcoin, need governance. They need
266+But all these systems, including Bitcoin, need governance. They need
262−as little as possible, but not none. In the digital world as in the
267+as little as possible, but not none. In the digital world as in the
263real world, _laissez-faire_ is always necessary, never sufficient.
268real world, _laissez-faire_ is always necessary, never sufficient.
264Governance is a human universal.
269Governance is a human universal.
265
270
266−That's why we call Urbit a "virtual city." And as a city, it can't be
271+That's why we call Urbit a "virtual city." And as a city, it can't be
267−a corporate gated community. It might start as that, but it has to
272+a corporate gated community. It might start as that, but it has to
268grow up into a true city-state: a self-governing digital republic.
273grow up into a true city-state: a self-governing digital republic.
269This pattern is not just blind clinging to Anglo-American tradition;
274This pattern is not just blind clinging to Anglo-American tradition;
270like every prudent constitution, it fits the actual virtues and vices
275like every prudent constitution, it fits the actual virtues and vices
271of its target population.
276of its target population.
272
277
273Urbit's galactic hierarchy resembles the natural patterns we find in
278Urbit's galactic hierarchy resembles the natural patterns we find in
274−many existing human political systems. As Alexander wrote:
279+many existing human political systems. As Alexander wrote:
275
280
276> Wherever possible, work toward the evolution of independent regions
281> Wherever possible, work toward the evolution of independent regions
277− in the world, each with its own natural and geographic boundaries;
282+> in the world, each with its own natural and geographic boundaries;
278− each with its own economy; each one autonomous and self-governing;
283+> each with its own economy; each one autonomous and self-governing;
279− each with a seat in a world government, without the intervening power
284+> each with a seat in a world government, without the intervening power
280− of larger states or countries.
285+> of larger states or countries.
281
286
282We adapt Alexander's vision to a digital republic as the pattern that
287We adapt Alexander's vision to a digital republic as the pattern that
283−_authority is proportional to property_. This pattern already has a
288+_authority is proportional to property_. This pattern already has a
284name in the cryptocurrency community, which calls it _proof of stake_.
289name in the cryptocurrency community, which calls it _proof of stake_.
285Urbit's launch hierarchy is a sort of built-in proof of stake.
290Urbit's launch hierarchy is a sort of built-in proof of stake.
286
291
287Another governance pattern, a political cliche but no less valuable
292Another governance pattern, a political cliche but no less valuable
288−for it, is the system of checks and balances. The address space of
293+for it, is the system of checks and balances. The address space of
289Urbit is covered by three independent tiers, galaxies, stars and
294Urbit is covered by three independent tiers, galaxies, stars and
290−planets; which should govern? The obvious design is a three-chambered
295+planets; which should govern? The obvious design is a three-chambered
291legislature balanced against itself.
296legislature balanced against itself.
292
297
293For more on Urbit's governance design, see our [beliefs and
298For more on Urbit's governance design, see our [beliefs and
content/blog/tools-of-our-own.md+5−4
@@ -1,11 +1,12 @@
1+++
1+++
2title = "Tools of Our Own"
2title = "Tools of Our Own"
3−date = 2020-05-13
3+date = "2020-05-12"
4description = "What is a digital environment? What does it mean to shape your own digital environment?"
4description = "What is a digital environment? What does it mean to shape your own digital environment?"
5+
5[extra]
6[extra]
6author = "Matilde Park"
7author = "Matilde Park"
7ship = "~haddef-sigwen"
8ship = "~haddef-sigwen"
8−image ="https://media.urbit.org/site/posts/essays/tools-of-our-own-1.png"
9+image = "https://media.urbit.org/site/posts/essays/tools-of-our-own-1.png"
9+++
10+++
10
11
11<br>
12<br>
@@ -18,7 +19,7 @@ image ="https://media.urbit.org/site/posts/essays/tools-of-our-own-1.png"
18>
19>
19> <cite>Ivan Illich, <em>Tools for Conviviality</em></cite>
20> <cite>Ivan Illich, <em>Tools for Conviviality</em></cite>
20
21
21−One of the recent ways we've come to describe the mission of the Urbit project is to give communities [the power to shape, or evolve, their digital environments](https://urbit.org/blog/urbit-is-for-communities/). Of course, like many of our definitions, it requires some background to really contextualize the claim. When I describe this particular statement to people, they often ask, "What does that *mean*, though? What is a digital environment, and why would I need Urbit to do it?"
22+One of the recent ways we've come to describe the mission of the Urbit project is to give communities [the power to shape, or evolve, their digital environments](https://urbit.org/blog/urbit-is-for-communities/). Of course, like many of our definitions, it requires some background to really contextualize the claim. When I describe this particular statement to people, they often ask, "What does that _mean_, though? What is a digital environment, and why would I need Urbit to do it?"
22
23
23After all, we think of our slate of tools as our entire toolbox. This makes sense for physical tools. And for a lot of people in the real world (at least, I think), their tools remain physical notebooks and paper. I, however, left those tools behind ages ago, and found myself in a world that used my habits, my memory, to loosely organize a wide array of online tools, that were themselves shaped according to the values of their creators.
24After all, we think of our slate of tools as our entire toolbox. This makes sense for physical tools. And for a lot of people in the real world (at least, I think), their tools remain physical notebooks and paper. I, however, left those tools behind ages ago, and found myself in a world that used my habits, my memory, to loosely organize a wide array of online tools, that were themselves shaped according to the values of their creators.
24
25
@@ -50,7 +51,7 @@ But this is crazy: for decades, an aspect of the Internet stack that necessitate
50
51
51And for productivity tools—for the personal activities we do every day—the same problem ultimately applies. Either you wrangle more and more single-use "products" into a framework, wrangling combinatorial explosion, or you punt the problem to the user's brain, remembering the relation between tools.
52And for productivity tools—for the personal activities we do every day—the same problem ultimately applies. Either you wrangle more and more single-use "products" into a framework, wrangling combinatorial explosion, or you punt the problem to the user's brain, remembering the relation between tools.
52
53
53−This is why hybrid products are born *and* why massive enterprises are shifting toward subscription models for office software. With the [clearnet](https://en.wikipedia.org/wiki/Clearnet_(networking)), using our own computers for everyday tasks that extend outside themselves is not easy. It's way easier to sign into an enterprise's server farm for your persistent data storage and manipulation. In 2020, the prefab parts for the exoskeleton only come in "left arm, right leg" pairs, or you can just give up and plug straight into SkyNet.
54+This is why hybrid products are born _and_ why massive enterprises are shifting toward subscription models for office software. With the [clearnet](<https://en.wikipedia.org/wiki/Clearnet_(networking)>), using our own computers for everyday tasks that extend outside themselves is not easy. It's way easier to sign into an enterprise's server farm for your persistent data storage and manipulation. In 2020, the prefab parts for the exoskeleton only come in "left arm, right leg" pairs, or you can just give up and plug straight into SkyNet.
54
55
55<br>
56<br>
56
57
content/blog/toward-a-frozen-operating-system.md+89−83
@@ -1,52 +1,58 @@
1+++
1+++
2title = "Toward a Frozen Operating System"
2title = "Toward a Frozen Operating System"
3−date = 2017-05-10
3+date = "2017-05-09"
4description = "Is it possible to freeze an entire OS?"
4description = "Is it possible to freeze an entire OS?"
5+aliases = [
5−aliases = ["/posts/essays/toward-a-frozen-operating-system", "/posts/toward-a-frozen-operating-system", "/blog/2017.5-frozen/"]
6+ "/posts/essays/toward-a-frozen-operating-system",
7+ "/posts/toward-a-frozen-operating-system",
8+ "/blog/2017.5-frozen/"
9+]
10+
6[extra]
11[extra]
7author = "Curtis Yarvin + Galen Wolfe-Pauly"
12author = "Curtis Yarvin + Galen Wolfe-Pauly"
8ship = "~sorreg-namtyv + ~ravmel-ropdyl"
13ship = "~sorreg-namtyv + ~ravmel-ropdyl"
9+++
14+++
15+
10Is it possible to freeze an entire OS, so that its codebase never changes and
16Is it possible to freeze an entire OS, so that its codebase never changes and
11−never has to change? Is the proposition even meaningful? Is it practical?
17+never has to change? Is the proposition even meaningful? Is it practical?
12And if so, why would we want a frozen OS?
18And if so, why would we want a frozen OS?
13
19
14−Think about it intuitively. There's a reason we call an OS a "platform." It's
20+Think about it intuitively. There's a reason we call an OS a "platform." It's
15−a piece of permanent infrastructure. Paul Graham wrote a
21+a piece of permanent infrastructure. Paul Graham wrote a
16[great essay](http://www.paulgraham.com/hundred.html) about the
22[great essay](http://www.paulgraham.com/hundred.html) about the
17"hundred-year language," but the language is only one part of any complete
23"hundred-year language," but the language is only one part of any complete
18−platform. And in infrastructure terms, a hundred years isn't that long.
24+platform. And in infrastructure terms, a hundred years isn't that long.
19
25
20−Why not think of structures that have lasted _thousands_ of years? An aqueduct,
26+Why not think of structures that have lasted _thousands_ of years? An aqueduct,
21−a pyramid, a Parthenon? Why set our sights lower? Why isn't it time to aim for
27+a pyramid, a Parthenon? Why set our sights lower? Why isn't it time to aim for
22−perfect and timeless code? If not now, when?
28+perfect and timeless code? If not now, when?
23
29
24## Scope of the problem
30## Scope of the problem
25
31
26−More prosaically, a frozen OS just means your OS never changes. A frozen OS
32+More prosaically, a frozen OS just means your OS never changes. A frozen OS
27−never gets any updates. Not because it can't update itself, just because it
33+never gets any updates. Not because it can't update itself, just because it
28doesn't need to.
34doesn't need to.
29
35
30−Is this even a meaningful concept? A frozen OS? First we'll have to decide
36+Is this even a meaningful concept? A frozen OS? First we'll have to decide
31−what "OS" even means. Certainly, if "OS" means "the code that your hardware
37+what "OS" even means. Certainly, if "OS" means "the code that your hardware
32boots into," hardware always changes and so will the OS.
38boots into," hardware always changes and so will the OS.
33
39
34A broader, more useful definition: the "OS" is _an opaque model of a persistent
40A broader, more useful definition: the "OS" is _an opaque model of a persistent
35−general-purpose computer_. This definition allows for arbitrary levels of
41+general-purpose computer_. This definition allows for arbitrary levels of
36−virtualization. Linux on a droplet is an OS. A browser is an OS, because it's
42+virtualization. Linux on a droplet is an OS. A browser is an OS, because it's
37−persistent (sorta) and opaque. But `node.js` is not an OS, because it's not
43+persistent (sorta) and opaque. But `node.js` is not an OS, because it's not
38opaque: it exports Linux system calls.
44opaque: it exports Linux system calls.
39
45
40Within this opaque model, we have to decide what's "system" and "user" software.
46Within this opaque model, we have to decide what's "system" and "user" software.
41−It clearly makes no sense to freeze userspace. Let's use the
47+It clearly makes no sense to freeze userspace. Let's use the
42[trusted codebase](https://en.wikipedia.org/wiki/Trusted_computing_base): code
48[trusted codebase](https://en.wikipedia.org/wiki/Trusted_computing_base): code
43is system software, if compromising it would compromise the whole system.
49is system software, if compromising it would compromise the whole system.
44
50
45## Infinite maturity
51## Infinite maturity
46
52
47It's important to remember that just because a system is designed to achieve
53It's important to remember that just because a system is designed to achieve
48−frozenness, doesn't mean it's useless until it's frozen. It doesn't even mean
54+frozenness, doesn't mean it's useless until it's frozen. It doesn't even mean
49−it's immature. It just means that in the very long term, the system's maturity
55+it's immature. It just means that in the very long term, the system's maturity
50goals are infinite.
56goals are infinite.
51
57
52Systems designed to diverge infinitely (with normal X.X.X semantic versioning),
58Systems designed to diverge infinitely (with normal X.X.X semantic versioning),
@@ -54,30 +60,30 @@ even those designed to converge infinitely (as with
54[Knuth versioning](http://www.tex.ac.uk/FAQ-TeXfuture.html)), also achieve
60[Knuth versioning](http://www.tex.ac.uk/FAQ-TeXfuture.html)), also achieve
55maturity, often great maturity, without being quite frozen.
61maturity, often great maturity, without being quite frozen.
56
62
57−For example, C is a very mature language. C has long since mastered backward
63+For example, C is a very mature language. C has long since mastered backward
58−compatibility. We can be sure that any C program which compiles on today's
64+compatibility. We can be sure that any C program which compiles on today's
59correct C compilers will compile on any future correct C compiler.
65correct C compilers will compile on any future correct C compiler.
60
66
61But, since C is not frozen, we can't be sure that today's C compilers will
67But, since C is not frozen, we can't be sure that today's C compilers will
62−compile any future C program. So C has not yet achieved perfect _forward_
68+compile any future C program. So C has not yet achieved perfect _forward_
63−compatibility. By definition, a frozen system is compatible both forward and
69+compatibility. By definition, a frozen system is compatible both forward and
64−backward. So C is mature, but it could still get more mature.
70+backward. So C is mature, but it could still get more mature.
65
71
66−The point of a frozen OS is to shoot for _infinite_ maturity. Obviously a
72+The point of a frozen OS is to shoot for _infinite_ maturity. Obviously a
67frozen platform is compatible forever in both directions.
73frozen platform is compatible forever in both directions.
68
74
69−Infinite maturity does exist in the real world. But only in a few simple file
75+Infinite maturity does exist in the real world. But only in a few simple file
70−formats and protocols — IP, JSON, XML. And not all this maturity is the result
76+formats and protocols — IP, JSON, XML. And not all this maturity is the result
71−of perfection. Some is just the accident of a missing update mechanism.
77+of perfection. Some is just the accident of a missing update mechanism.
72
78
73But IP, JSON, XML... this is how stable, how taken for granted, system software
79But IP, JSON, XML... this is how stable, how taken for granted, system software
74−should be. And can be. Certainly, any JSON parser today will parse any JSON
80+should be. And can be. Certainly, any JSON parser today will parse any JSON
75document made in the future.
81document made in the future.
76
82
77The dream of absolute zero is an OS whose core components are so simple, so
83The dream of absolute zero is an OS whose core components are so simple, so
78boring, and so mechanically straightforward that we can imagine them becoming
84boring, and so mechanically straightforward that we can imagine them becoming
79−finished and never changing. We need to freeze not just a format or a protocol,
85+finished and never changing. We need to freeze not just a format or a protocol,
80−but a language, a kernel, a standard library. To succeed, we need to flush out
86+but a language, a kernel, a standard library. To succeed, we need to flush out
81each quirk, complexity, and creeping feature, until the system is so boring and
87each quirk, complexity, and creeping feature, until the system is so boring and
82obvious that no one even wants to change it.
88obvious that no one even wants to change it.
83
89
@@ -85,19 +91,19 @@ obvious that no one even wants to change it.
85
91
86"Kelvin versioning" is one way to track a project designed to be frozen.
92"Kelvin versioning" is one way to track a project designed to be frozen.
87
93
88−In Kelvin versioning, a version is an integer in degrees Kelvin. Absolute zero
94+In Kelvin versioning, a version is an integer in degrees Kelvin. Absolute zero
89−is frozen — no further updates are possible. If your Kelvin versions don't
95+is frozen — no further updates are possible. If your Kelvin versions don't
90−track your actual progress, you run out of integers. This danger is a concrete
96+track your actual progress, you run out of integers. This danger is a concrete
91incentive for the project to track its own progress accurately.
97incentive for the project to track its own progress accurately.
92
98
93−(Kelvin versioning isn't useful only at lifecycle scale. It can be used for any
99+(Kelvin versioning isn't useful only at lifecycle scale. It can be used for any
94development process with an irreversible end — as build numbers for a release,
100development process with an irreversible end — as build numbers for a release,
95for example.)
101for example.)
96
102
97## The palm-tree dependency model
103## The palm-tree dependency model
98
104
99−A whole OS can't have a single Kelvin number. It has to consist of multiple
105+A whole OS can't have a single Kelvin number. It has to consist of multiple
100−components which depend on each other. What's the right dependency model for
106+components which depend on each other. What's the right dependency model for
101the parts of a frozen OS?
107the parts of a frozen OS?
102
108
103One way to think about dependencies across a whole OS is the "palm-tree model."
109One way to think about dependencies across a whole OS is the "palm-tree model."
@@ -106,11 +112,11 @@ components (where we have to choose one version of the code), and "inclusive"
106ones (where different users can see different versions).
112ones (where different users can see different versions).
107
113
108The exclusive components are the trunk of the palm tree: a stack of layers, each
114The exclusive components are the trunk of the palm tree: a stack of layers, each
109−of which has one active copy. For instance, you are only running one kernel at
115+of which has one active copy. For instance, you are only running one kernel at
110−a time. Different apps cannot use different versions of the kernel.
116+a time. Different apps cannot use different versions of the kernel.
111
117
112The inclusive components are the fronds, branching out in any direction they
118The inclusive components are the fronds, branching out in any direction they
113−want. Not only can two apps use different versions of the same library, in
119+want. Not only can two apps use different versions of the same library, in
114many situations _one_ app needs to be able to use two different versions of the
120many situations _one_ app needs to be able to use two different versions of the
115same library.
121same library.
116
122
@@ -118,28 +124,28 @@ same library.
118
124
119Any subsystem that serves as any kind of platform is exclusive, since anything
125Any subsystem that serves as any kind of platform is exclusive, since anything
120that runs on top of the platform has to choose one version of the platform to
126that runs on top of the platform has to choose one version of the platform to
121−run on. Since layers are good, this creates a natural stack which can get quite
127+run on. Since layers are good, this creates a natural stack which can get quite
122tall — and include components which are technically in userspace.
128tall — and include components which are technically in userspace.
123
129
124The right way for this trunk to approach absolute zero is to "telescope" its
130The right way for this trunk to approach absolute zero is to "telescope" its
125−Kelvin versions. The rules of telescoping are simple:
131+Kelvin versions. The rules of telescoping are simple:
126
132
1271. If tool B sits on platform A, either both A and B must be at absolute zero,
1331. If tool B sits on platform A, either both A and B must be at absolute zero,
128−or B must be warmer than A.
134+ or B must be warmer than A.
129
135
1302. Whenever the temperature of A (the platform) declines, the temperature of B
1362. Whenever the temperature of A (the platform) declines, the temperature of B
131−(the tool) must also decline.
137+ (the tool) must also decline.
132
138
133−3. B must state the version of A it was developed against. A, when loading B,
139+3. B must state the version of A it was developed against. A, when loading B,
134−must state its own current version, and the warmest version of itself with which
140+ must state its own current version, and the warmest version of itself with which
135−it's backward-compatible.
141+ it's backward-compatible.
136
142
137Of course, if B itself is a platform on which some higher-level tool C depends,
143Of course, if B itself is a platform on which some higher-level tool C depends,
138it must follow the same constraints recursively.
144it must follow the same constraints recursively.
139
145
140The important effect of obeying rule 2: in a tall trunk, it's sufficient to
146The important effect of obeying rule 2: in a tall trunk, it's sufficient to
141−state your dependency on the platform directly below you. Suppose C sits on B,
147+state your dependency on the platform directly below you. Suppose C sits on B,
142−which sits on A and exports features of A. C can state only the version of B
148+which sits on A and exports features of A. C can state only the version of B
143it's written against, because when A chills, B must also chill.
149it's written against, because when A chills, B must also chill.
144
150
145If A could chill without B chilling, we could modify C to use new features of A.
151If A could chill without B chilling, we could modify C to use new features of A.
@@ -148,73 +154,73 @@ received the A update.
148
154
149## The palm fronds: total flexibility
155## The palm fronds: total flexibility
150
156
151−The goal of the trunk is to get to the fronds. In the fronds, no one should
157+The goal of the trunk is to get to the fronds. In the fronds, no one should
152−ever worry about dependency conflicts. And nothing is ever frozen, or has to be
158+ever worry about dependency conflicts. And nothing is ever frozen, or has to be
153frozen.
159frozen.
154
160
155The right way to solve dependencies in userspace is: within an organization, use
161The right way to solve dependencies in userspace is: within an organization, use
156−a monorepo and link relative to its head. Between organizations, use pinned
162+a monorepo and link relative to its head. Between organizations, use pinned
157−version numbers that are as immutable as possible. Avoid programming
163+version numbers that are as immutable as possible. Avoid programming
158environments that create exclusion problems in userspace — for instance, that
164environments that create exclusion problems in userspace — for instance, that
159compel a single process to choose one version of a library when a diamond
165compel a single process to choose one version of a library when a diamond
160dependency exists.
166dependency exists.
161
167
162There is almost never any good reason to automatically update dependencies with
168There is almost never any good reason to automatically update dependencies with
163−fresh versions of foreign code. In the case of a security update, the
169+fresh versions of foreign code. In the case of a security update, the
164maintainer of an app which depends on a patched library needs to catch the
170maintainer of an app which depends on a patched library needs to catch the
165−patch and propagate the update in a new version of the app. An app shouldn't be
171+patch and propagate the update in a new version of the app. An app shouldn't be
166security-critical to begin with, and propagating updates is a basic function of
172security-critical to begin with, and propagating updates is a basic function of
167−a modern OS. Also, if the app is security-critical, it could have its own bugs,
173+a modern OS. Also, if the app is security-critical, it could have its own bugs,
168so it needs a maintainer and an update pathway anyway.
174so it needs a maintainer and an update pathway anyway.
169
175
170## Urbit: status and prospects
176## Urbit: status and prospects
171
177
172−Yes, we do believe it's possible to write a freezable OS. In fact, we wrote
178+Yes, we do believe it's possible to write a freezable OS. In fact, we wrote
173−one. And it works. It's not yet frozen (except at the bottom layer), but it's
179+one. And it works. It's not yet frozen (except at the bottom layer), but it's
174getting there.
180getting there.
175
181
176−Urbit, a clean-slate functional OS, has been under development since 2002. It
182+Urbit, a clean-slate functional OS, has been under development since 2002. It
177took a decade (as a one-man project) just to build a prototype of a freezable OS.
183took a decade (as a one-man project) just to build a prototype of a freezable OS.
178The result in 2017 (now with a small company) is a telescoping Kelvin stack of
184The result in 2017 (now with a small company) is a telescoping Kelvin stack of
179layers from VM to UI.
185layers from VM to UI.
180
186
181At the bottom (the VM Nock), this stack is slightly warmer than liquid helium
187At the bottom (the VM Nock), this stack is slightly warmer than liquid helium
182−(5K). It's easy for Nock to get this cold, because it's defined in a page of
188+(5K). It's easy for Nock to get this cold, because it's defined in a page of
183−axioms that gzips to 340 bytes. We are in no hurry to declare zero, but any
189+axioms that gzips to 340 bytes. We are in no hurry to declare zero, but any
184change at this point would be both very unlikely and very difficult to
190change at this point would be both very unlikely and very difficult to
185implement.
191implement.
186
192
187Urbit's typed functional language, Hoon, which compiles itself to Nock, is
193Urbit's typed functional language, Hoon, which compiles itself to Nock, is
188−closing in on liquid krypton at 143K. Hoon is defined in about 5,000 lines of
194+closing in on liquid krypton at 143K. Hoon is defined in about 5,000 lines of
189−Hoon, or 10,000 if you count the deep standard library. Nock will never need to
195+Hoon, or 10,000 if you count the deep standard library. Nock will never need to
190change; Hoon is perfectly serviceable but has some well-known rough spots.
196change; Hoon is perfectly serviceable but has some well-known rough spots.
191
197
192−Above Hoon, the stack rapidly gets much warmer. Arvo is an event-driven
198+Above Hoon, the stack rapidly gets much warmer. Arvo is an event-driven
193−microkernel that's 1,000 lines of Hoon. Above this are another 5,000 lines of
199+microkernel that's 1,000 lines of Hoon. Above this are another 5,000 lines of
194system library, then 12,000 lines of Arvo modules: a peer-to-peer network, a
200system library, then 12,000 lines of Arvo modules: a peer-to-peer network, a
195PKI and private ledger, a revision-control system, an HTTP gateway, a functional
201PKI and private ledger, a revision-control system, an HTTP gateway, a functional
196−build system, and an application sandbox. A trivial working system needs
202+build system, and an application sandbox. A trivial working system needs
197another 5,000 lines for basic chat and shell apps.
203another 5,000 lines for basic chat and shell apps.
198
204
199We haven't had meaningful Kelvin numbers for the Arvo layer, but this release
205We haven't had meaningful Kelvin numbers for the Arvo layer, but this release
200−will change that. About a third of Arvo has been or will be rewritten in the
206+will change that. About a third of Arvo has been or will be rewritten in the
201last year; we'll assign Kelvins once this code (which now compiles) is tested
207last year; we'll assign Kelvins once this code (which now compiles) is tested
202into existence, largely based on how close the last compiling draft was to the
208into existence, largely based on how close the last compiling draft was to the
203−first working draft. But you'll certainly be able to cook eggs on it.
209+first working draft. But you'll certainly be able to cook eggs on it.
204
210
205−(Once again, not being frozen doesn't mean not working. Until all these layers
211+(Once again, not being frozen doesn't mean not working. Until all these layers
206−are finished, we'll be updating them over the air. To be exact, Urbit
212+are finished, we'll be updating them over the air. To be exact, Urbit
207distributes its own updates through subscriptions in its own revision-control
213distributes its own updates through subscriptions in its own revision-control
208system.)
214system.)
209
215
210The actual status of Urbit is that in 2017, we hope to make our last
216The actual status of Urbit is that in 2017, we hope to make our last
211discontinuous update — meaning that instead of your Urbit node updating itself
217discontinuous update — meaning that instead of your Urbit node updating itself
212−silently, you destroy and recreate it. Urbit works today, but it isn't really
218+silently, you destroy and recreate it. Urbit works today, but it isn't really
213alive until today's Urbit data lives forever.
219alive until today's Urbit data lives forever.
214
220
215Even committing to continuity is a significant step toward the frozen OS,
221Even committing to continuity is a significant step toward the frozen OS,
216because we're committing to never making another change that the present
222because we're committing to never making another change that the present
217−platform can't install. Fortunately, the only layer that has to stay frozen for
223+platform can't install. Fortunately, the only layer that has to stay frozen for
218this is Nock.
224this is Nock.
219
225
220## The style of convergent system software
226## The style of convergent system software
@@ -223,22 +229,22 @@ We're obviously in no position to declare victory at any layer above Nock, but
223aiming at absolute zero creates a system design style we think works very well —
229aiming at absolute zero creates a system design style we think works very well —
224even if we never get to zero.
230even if we never get to zero.
225
231
226−Deep, onion-like layering is essential. A thin layer has no room to grow. A
232+Deep, onion-like layering is essential. A thin layer has no room to grow. A
227good example of this principle is the difference between Urbit and Lisp
233good example of this principle is the difference between Urbit and Lisp
228−machines. Both Nock and Lisp are very simple axiomatic definitions of
234+machines. Both Nock and Lisp are very simple axiomatic definitions of
229−computing. But practical Lisp systems expand by extending the model, whereas
235+computing. But practical Lisp systems expand by extending the model, whereas
230Urbit layers over a frozen axiom system.
236Urbit layers over a frozen axiom system.
231
237
232−Software that expands by extension is inevitable. But we need to be able to
238+Software that expands by extension is inevitable. But we need to be able to
233−kick it up to userspace. System software should be concerned with the
239+kick it up to userspace. System software should be concerned with the
234−fundamental problems of computing, which don't change. The few cases in which
240+fundamental problems of computing, which don't change. The few cases in which
235they do change — like crypto algorithms — are special cases, easily
241they do change — like crypto algorithms — are special cases, easily
236−encapsulated. And even these changes can be expected to slow down in the long
242+encapsulated. And even these changes can be expected to slow down in the long
237term.
243term.
238
244
239Perhaps the best example of the convergent style in existing, mature system
245Perhaps the best example of the convergent style in existing, mature system
240−software is the relational database. The genius of the relational model is that
246+software is the relational database. The genius of the relational model is that
241−it's designed to never grow hair. Even SQL, with its COBOL-era syntax, is
247+it's designed to never grow hair. Even SQL, with its COBOL-era syntax, is
242essentially invulnerable to any significant non-cosmetic improvement.
248essentially invulnerable to any significant non-cosmetic improvement.
243
249
244The lesson: when we see a system that seems to want to expand indefinitely, we
250The lesson: when we see a system that seems to want to expand indefinitely, we
@@ -248,7 +254,7 @@ Layering is what distinguishes true system software from the giant balls of mud
248that all deep codebases want to become.
254that all deep codebases want to become.
249
255
250Are all balls of mud, or at least all the muddy parts of an OS, susceptible to
256Are all balls of mud, or at least all the muddy parts of an OS, susceptible to
251−this transformation? We think so. But we'll see.
257+this transformation? We think so. But we'll see.
252
258
253−As usual, comments are on fora. Check out
259+As usual, comments are on fora. Check out
254[this thread](https://urbit.org/fora/posts/~2017.5.12..20.30.11..0050~/).
260[this thread](https://urbit.org/fora/posts/~2017.5.12..20.30.11..0050~/).
content/blog/toward-a-new-clay.md+233−227
@@ -1,63 +1,68 @@
1+++
1+++
2title = "Toward a New %clay"
2title = "Toward a New %clay"
3−date = 2016-07-14
3+date = "2016-07-13"
4description = "Urbit's revision-control system, %clay, is itself due for a (medium-sized) revision!"
4description = "Urbit's revision-control system, %clay, is itself due for a (medium-sized) revision!"
5+aliases = [
5−aliases = ["/posts/essays/toward-a-new-clay", "/posts/toward-a-new-clay", "/blog/clay"]
6+ "/posts/essays/toward-a-new-clay",
7+ "/posts/toward-a-new-clay",
8+ "/blog/clay"
9+]
10+
6[extra]
11[extra]
7author = "Curtis Yarvin"
12author = "Curtis Yarvin"
8ship = "~sorreg-namtyv"
13ship = "~sorreg-namtyv"
9+++
14+++
10
15
11TLDR: (a) Urbit's revision-control system, `%clay`, is itself due
16TLDR: (a) Urbit's revision-control system, `%clay`, is itself due
12−for a (medium-sized) revision! (b) this time, you yourself can
17+for a (medium-sized) revision! (b) this time, you yourself can
13−really help! (c) please don't give away the buried spoiler!
18+really help! (c) please don't give away the buried spoiler!
14
19
15This explanation does not (or at least should not) require you to
20This explanation does not (or at least should not) require you to
16know anything about Urbit.
21know anything about Urbit.
17
22
18### But %clay is already pretty cool
23### But %clay is already pretty cool
19
24
20−Of course, nothing in Urbit is allowed to be _lame_. `%clay` is
25+Of course, nothing in Urbit is allowed to be _lame_. `%clay` is
21−actually quite cool. It does need some work. But first, let's
26+actually quite cool. It does need some work. But first, let's
22talk about what it is and why it's cool.
27talk about what it is and why it's cool.
23
28
24`%clay` is the Arvo vane (Urbit kernel module) for revision
29`%clay` is the Arvo vane (Urbit kernel module) for revision
25−control. It's an authenticated, human-memorable global immutable
30+control. It's an authenticated, human-memorable global immutable
26−namespace which is also a typed revision-control system. It's
31+namespace which is also a typed revision-control system. It's
27−also very good at subscription and synchronization. Urbit
32+also very good at subscription and synchronization. Urbit
28currently uses `%clay` to distribute live hotpatches; we
33currently uses `%clay` to distribute live hotpatches; we
29transparently upgrade the whole network with one checkin.
34transparently upgrade the whole network with one checkin.
30
35
31### Compared to other revision-control systems
36### Compared to other revision-control systems
32
37
33−`%clay` is clearly a vanilla DVCS in the modern `git` style. Of
38+`%clay` is clearly a vanilla DVCS in the modern `git` style. Of
34deployed DVCS these days, `%clay` is probably closest in spirit
39deployed DVCS these days, `%clay` is probably closest in spirit
35to `bzr` or maybe `fossil`.
40to `bzr` or maybe `fossil`.
36
41
37Obviously, as a part of a larger whole, you would expect any
42Obviously, as a part of a larger whole, you would expect any
38−Urbit RCS to be brutally spartan. `%clay` is. It's even more
43+Urbit RCS to be brutally spartan. `%clay` is. It's even more
39spartan than `bzr`.
44spartan than `bzr`.
40
45
41−(In fact, it's really too spartan to fully use at the moment. We
46+(In fact, it's really too spartan to fully use at the moment. We
42ourselves still use `%clay` mainly as a distribution system, and
47ourselves still use `%clay` mainly as a distribution system, and
43−do all internal development on GitHub. This is because the
48+do all internal development on GitHub. This is because the
44present `%clay` lacks a few little conveniences, like commit
49present `%clay` lacks a few little conveniences, like commit
45−messages. See upgrades, below.)
50+messages. See upgrades, below.)
46
51
47−There are lots of normal DVCS things in `%clay`. But there are
52+There are lots of normal DVCS things in `%clay`. But there are
48−also cool and unusual ones. Let's take a brief tour of the
53+also cool and unusual ones. Let's take a brief tour of the
49high-level system, then describe what we think should change
54high-level system, then describe what we think should change
50about it.
55about it.
51
56
52### Anatomy of a DVCS
57### Anatomy of a DVCS
53
58
54−A DVCS is a historical state graph. A point in this graph is a
59+A DVCS is a historical state graph. A point in this graph is a
55snapshot of some tree-structured system, like a filesystem.
60snapshot of some tree-structured system, like a filesystem.
56
61
57These snapshots, including recursive internal nodes, are stored in
62These snapshots, including recursive internal nodes, are stored in
58−a content-addressable store. Pointers in this store are used to
63+a content-addressable store. Pointers in this store are used to
59construct a revision graph, whose edges are edit and/or merge
64construct a revision graph, whose edges are edit and/or merge
60−actions. Some sort of namespace attaches meaningful names to
65+actions. Some sort of namespace attaches meaningful names to
61current revisions in this graph.
66current revisions in this graph.
62
67
63There are six big questions in the design of a DVCS:
68There are six big questions in the design of a DVCS:
@@ -73,16 +78,16 @@ There are six big questions in the design of a DVCS:
73
78
74A good way to summarize `%clay` (at present) is that its answers
79A good way to summarize `%clay` (at present) is that its answers
75to the first four questions are interesting, and its answers to
80to the first four questions are interesting, and its answers to
76−the last two are boring. We'll talk about all six, though.
81+the last two are boring. We'll talk about all six, though.
77
82
78### Global namespace: [ship desk case]
83### Global namespace: [ship desk case]
79
84
80−The permanent global name of a `%clay` snapshot is a `++beak`. A beak
85+The permanent global name of a `%clay` snapshot is a `++beak`. A beak
81is a triple: `[ship desk case]`.
86is a triple: `[ship desk case]`.
82
87
83−The `++ship` is an Urbit ship. A ship is a network address, a
88+The `++ship` is an Urbit ship. A ship is a network address, a
84−human-memorable name and a cryptographic identity. The address
89+human-memorable name and a cryptographic identity. The address
85−width is variable; shorter addresses are more desirable. Most
90+width is variable; shorter addresses are more desirable. Most
86users have 32-bit addresses, which we map to four-syllable
91users have 32-bit addresses, which we map to four-syllable
87synthetic names like `~sorreg-namtyv`.
92synthetic names like `~sorreg-namtyv`.
88
93
@@ -95,44 +100,44 @@ In the Urbit path syntax, the beak is the first three segments of
95the path: `/ship/desk/case/my/cat/picture`.
100the path: `/ship/desk/case/my/cat/picture`.
96
101
97In most cases, a path parser has a default ship, desk and case,
102In most cases, a path parser has a default ship, desk and case,
98−each of which can be replaced by `=`. So `/=home=/my/cat/picture`
103+each of which can be replaced by `=`. So `/=home=/my/cat/picture`
99is the data at `/my/cat/picture` on your own ship, in the `%home`
104is the data at `/my/cat/picture` on your own ship, in the `%home`
100−desk, right now. Immutability doesn't have to be inconvenient.
105+desk, right now. Immutability doesn't have to be inconvenient.
101
106
102−`%clay` has no concept of a mutable name or a magic `HEAD`. Use
107+`%clay` has no concept of a mutable name or a magic `HEAD`. Use
103−the current date. If you're referring to remote data and you're
108+the current date. If you're referring to remote data and you're
104worried about clock skew, subtract a second or three, or be
109worried about clock skew, subtract a second or three, or be
105−prepared to block. (Or keep your clock unskewed, which shouldn't
110+prepared to block. (Or keep your clock unskewed, which shouldn't
106−be _that_ hard.) It's not like mutable-name schemes work any
111+be _that_ hard.) It's not like mutable-name schemes work any
107better than this anyway.
112better than this anyway.
108
113
109−(Immutability is central to `%clay`. `git` merely adopted the
114+(Immutability is central to `%clay`. `git` merely adopted the
110−reflog. `%clay` was born in it, molded by it...)
115+reflog. `%clay` was born in it, molded by it...)
111
116
112`%clay` is objective; each Urbit node hosts only one ship, but
117`%clay` is objective; each Urbit node hosts only one ship, but
113−treats domestic and foreign data (almost) the same way. If you
118+treats domestic and foreign data (almost) the same way. If you
114ask your `%clay` repository for someone else's data, it will
119ask your `%clay` repository for someone else's data, it will
115block the request until it gets the data, which it then caches.
120block the request until it gets the data, which it then caches.
116At present, we always fulfill requests from the origin ship,
121At present, we always fulfill requests from the origin ship,
117though in future we could certainly use it as a tracker.
122though in future we could certainly use it as a tracker.
118
123
119If `%clay` discards cached data, it keeps a hash, so that your
124If `%clay` discards cached data, it keeps a hash, so that your
120−urbit can't violate the local illusion of immutability. We
125+urbit can't violate the local illusion of immutability. We
121can't, of course, prevent anyone else's ship from sending
126can't, of course, prevent anyone else's ship from sending
122−conflicting claims in different directions. But we can prevent
127+conflicting claims in different directions. But we can prevent
123programs on our own ship from hearing about them, meaning that we
128programs on our own ship from hearing about them, meaning that we
124retain local referential transparency.
129retain local referential transparency.
125
130
126### Local structure: dome, arch, leaf and mark
131### Local structure: dome, arch, leaf and mark
127
132
128−A `%clay` snapshot is called a `++dome`. A dome is the `%clay`
133+A `%clay` snapshot is called a `++dome`. A dome is the `%clay`
129equivalent of a tree-structured filesystem.
134equivalent of a tree-structured filesystem.
130
135
131Each node in this tree is one uniform structure, an `++arch`,
136Each node in this tree is one uniform structure, an `++arch`,
132−which is both file and directory. A `++leaf` or data value in
137+which is both file and directory. A `++leaf` or data value in
133this arch is a typed document.
138this arch is a typed document.
134
139
135−A logical document type is called a `++mark`. A mark is a
140+A logical document type is called a `++mark`. A mark is a
136symbolic pointer to a Hoon source file, in the same dome, for an
141symbolic pointer to a Hoon source file, in the same dome, for an
137engine that can validate, compare, and/or convert
142engine that can validate, compare, and/or convert
138documents of that mark.
143documents of that mark.
@@ -141,8 +146,8 @@ Let's go over arches and marks a little more closely...
141
146
142#### An arch is a uniform filesystem node
147#### An arch is a uniform filesystem node
143
148
144−Most filesystems and RCS have modal nodes. For instance, a git
149+Most filesystems and RCS have modal nodes. For instance, a git
145−data node can be a blob or a tree. `%clay` (and the Urbit
150+data node can be a blob or a tree. `%clay` (and the Urbit
146namespace in general) has one kind of node, an `arch`:
151namespace in general) has one kind of node, an `arch`:
147
152
148```
153```
@@ -151,24 +156,24 @@ namespace in general) has one kind of node, an `arch`:
151```
156```
152
157
153An arch has an optional typed-data leaf, and optional named
158An arch has an optional typed-data leaf, and optional named
154−children. In Unix terms, it's a file, a directory, or both. It
159+children. In Unix terms, it's a file, a directory, or both. It
155can't be neither: an empty arch, with no data and no children, is
160can't be neither: an empty arch, with no data and no children, is
156−auto-pruned. As in `git` (but not in Unix), the hierarchy is a
161+auto-pruned. As in `git` (but not in Unix), the hierarchy is a
157−pure function of its leaves. Paths exist only because of the
162+pure function of its leaves. Paths exist only because of the
158data they point to.
163data they point to.
159
164
160The `++knot` names in an arch path are also a little special.
165The `++knot` names in an arch path are also a little special.
161They're typed, in a sense; any knot can be parsed invertibly into
166They're typed, in a sense; any knot can be parsed invertibly into
162−a typed atom. The atom is an arbitrary unsigned integer. Its
167+a typed atom. The atom is an arbitrary unsigned integer. Its
163type (an `++aura` if you know Hoon) defines the semantics and
168type (an `++aura` if you know Hoon) defines the semantics and
164presentation of the atom: for instance, a symbol, a decimal,
169presentation of the atom: for instance, a symbol, a decimal,
165a date, etc.
170a date, etc.
166
171
167Ultimately a filesystem is a database, and a path is a primary
172Ultimately a filesystem is a database, and a path is a primary
168−key. It's very useful to be able to store simple data in this
173+key. It's very useful to be able to store simple data in this
169key, in a standard and unambiguous way.
174key, in a standard and unambiguous way.
170
175
171−Why uniform nodes? One, they map nicely to information trees
176+Why uniform nodes? One, they map nicely to information trees
172where a subtree may need some custom collective presentation,
177where a subtree may need some custom collective presentation,
173not an automatically generated Apache style directory listing.
178not an automatically generated Apache style directory listing.
174Two, non-uniform nodes introduce a whole pointless category of
179Two, non-uniform nodes introduce a whole pointless category of
@@ -176,34 +181,34 @@ node type conflicts -- for which life is far too short.
176
181
177#### A mark is an executable document type
182#### A mark is an executable document type
178
183
179−A mark is "like an executable MIME type." It's best defined as a
184+A mark is "like an executable MIME type." It's best defined as a
180symbolic mapping from a filesystem to a schema engine.
185symbolic mapping from a filesystem to a schema engine.
181
186
182If you have a MIME type `text/html`, you need to watch the
187If you have a MIME type `text/html`, you need to watch the
183−Internets to track what the W3C thinks HTML is. If you have an
188+Internets to track what the W3C thinks HTML is. If you have an
184Urbit mark `%html`, you can functionally construct (using our
189Urbit mark `%html`, you can functionally construct (using our
185insanely powerful functional build vane `%ford`) a core which
190insanely powerful functional build vane `%ford`) a core which
186can validate or normalize HTML, apply patch and diff logic, and
191can validate or normalize HTML, apply patch and diff logic, and
187−translate to and from other marks. `%ford` can even reason about
192+translate to and from other marks. `%ford` can even reason about
188translation paths and construct multistep conversions.
193translation paths and construct multistep conversions.
189
194
190(Urbit does not actually have this super-smart `%html` mark right
195(Urbit does not actually have this super-smart `%html` mark right
191−now. But it probably should, huh. And this page was composed in
196+now. But it probably should, huh. And this page was composed in
192Markdown and translated to HTML by `%ford`.)
197Markdown and translated to HTML by `%ford`.)
193
198
194−Where does the source code of a mark live? Within the same dome
199+Where does the source code of a mark live? Within the same dome
195−as the data it describes. `%html` files are described by the
200+as the data it describes. `%html` files are described by the
196Hoon source at `/===/mar/html`, which perhaps gets mapped into
201Hoon source at `/===/mar/html`, which perhaps gets mapped into
197your Unix filesystem at `$ship/home/mar/html.hoon`.
202your Unix filesystem at `$ship/home/mar/html.hoon`.
198
203
199−This Hoon file is not self-contained. It has dependencies. The
204+This Hoon file is not self-contained. It has dependencies. The
200`%html` mark may depend on various structures and libraries
205`%html` mark may depend on various structures and libraries
201−elsewhere in Urbit. But the source code for all them is within
206+elsewhere in Urbit. But the source code for all them is within
202this dome.
207this dome.
203
208
204One constraint this puts on domes is that _all domes are
209One constraint this puts on domes is that _all domes are
205−descendants of the base system dome_. Domes are versions of one
210+descendants of the base system dome_. Domes are versions of one
206−reality, not fragments of that reality. You can't create a new
211+reality, not fragments of that reality. You can't create a new
207empty dome -- you'd have no mark source, and be unable to install
212empty dome -- you'd have no mark source, and be unable to install
208any validated files.
213any validated files.
209
214
@@ -214,13 +219,13 @@ weird collisions between non-parallel things don't happen.
214
219
215### Unix mapping and mounting
220### Unix mapping and mounting
216
221
217−Every DVCS is its own filesystem in a sense. But every DVCS
222+Every DVCS is its own filesystem in a sense. But every DVCS
218works by mapping and mounting itself, in some sense, to Unix.
223works by mapping and mounting itself, in some sense, to Unix.
219
224
220#### Mapping arches to Unix
225#### Mapping arches to Unix
221
226
222−How do we map arches into Unix? The arch structure maps 1:1 to
227+How do we map arches into Unix? The arch structure maps 1:1 to
223−the Unix directory tree. When the arch has a leaf, we derive a
228+the Unix directory tree. When the arch has a leaf, we derive a
224dot extension from the file's mark.
229dot extension from the file's mark.
225
230
226So, supposing we have a leaf `foo` which is an HTML document
231So, supposing we have a leaf `foo` which is an HTML document
@@ -234,19 +239,19 @@ foo/moo.html
234```
239```
235
240
236This maps invertibly back into `%clay`, and it looks perfectly
241This maps invertibly back into `%clay`, and it looks perfectly
237−unremarkable from the Unix side. File completion sometimes gets
242+unremarkable from the Unix side. File completion sometimes gets
238a little annoying.
243a little annoying.
239
244
240It would be if nice every possible Unix tree, even every
245It would be if nice every possible Unix tree, even every
241plausible Unix tree, mapped cleanly and completely to a `%clay`
246plausible Unix tree, mapped cleanly and completely to a `%clay`
242−dome. There are always horrid exceptions, even in common use --
247+dome. There are always horrid exceptions, even in common use --
243−like extensionless Makefiles. The trivial solution is that if
248+like extensionless Makefiles. The trivial solution is that if
244`%clay` finds a file mysterious, it won't track it.
249`%clay` finds a file mysterious, it won't track it.
245
250
246One often unquestioned assumption in new system software is that
251One often unquestioned assumption in new system software is that
247−compatibility with old content is important. It's nice, but not
252+compatibility with old content is important. It's nice, but not
248−that important. Most content in a new system is new content.
253+that important. Most content in a new system is new content.
249−The important compatibility direction is export, not import. So
254+The important compatibility direction is export, not import. So
250the new system should subset, not superset, the ancient formats.
255the new system should subset, not superset, the ancient formats.
251
256
252### Mounting desks to Unix
257### Mounting desks to Unix
@@ -257,36 +262,36 @@ the Unix directory of the same name within the pier.
257When files in a mount directory change, `%clay` notices it
262When files in a mount directory change, `%clay` notices it
258through `libuv` filesystem watching (ultimately `inotify()` or
263through `libuv` filesystem watching (ultimately `inotify()` or
259`FSEvents`), computes diffs, and automatically commits them to
264`FSEvents`), computes diffs, and automatically commits them to
260−the desk. And if `%clay` creates a new version for its own
265+the desk. And if `%clay` creates a new version for its own
261urbity reasons, it will revise the Unix files.
266urbity reasons, it will revise the Unix files.
262
267
263Keeping all mounted files in the same Unix subdirectory makes it
268Keeping all mounted files in the same Unix subdirectory makes it
264−easy to move the whole pier in a tarfile. Edits applied while
269+easy to move the whole pier in a tarfile. Edits applied while
265the `urbit` process isn't running will be detected and applied
270the `urbit` process isn't running will be detected and applied
266the next time it starts.
271the next time it starts.
267
272
268In conventional DVCS terms, `%clay` has a 1:1 static mapping from
273In conventional DVCS terms, `%clay` has a 1:1 static mapping from
269−branches to working directories. Why?
274+branches to working directories. Why?
270
275
271−Why not? Do we need that "what branches are checked out in what
276+Why not? Do we need that "what branches are checked out in what
272−directories" piece of state? Why force the user to worry about
277+directories" piece of state? Why force the user to worry about
273−which branches are mounted to which directories? Why not just
278+which branches are mounted to which directories? Why not just
274−mount them under their own names? Is there some crippling global
279+mount them under their own names? Is there some crippling global
275shortage of disk space for source files? Our planet is running
280shortage of disk space for source files? Our planet is running
276−out of inodes? Wut?
281+out of inodes? Wut?
277
282
278### Queries, subscriptions and synchronization
283### Queries, subscriptions and synchronization
279
284
280There are two ways to get data out of `%clay`: dereference the Urbit
285There are two ways to get data out of `%clay`: dereference the Urbit
281−namespace, or send a request/subscription. Sync is in userspace.
286+namespace, or send a request/subscription. Sync is in userspace.
282
287
283#### Dereferencing the namespace
288#### Dereferencing the namespace
284
289
285−`%clay` is just part of the full Urbit namespace. The full namespace
290+`%clay` is just part of the full Urbit namespace. The full namespace
286has a two-character prefix which expresses what vane to query
291has a two-character prefix which expresses what vane to query
287−(always `%c` for `%clay`). The suffix is a mode flag; `%x` for
292+(always `%c` for `%clay`). The suffix is a mode flag; `%x` for
288data, `%y` for a list of children, `%z` for the whole arch
293data, `%y` for a list of children, `%z` for the whole arch
289−subtree, `%w` for the version number. (Each vane has its own
294+subtree, `%w` for the version number. (Each vane has its own
290modes.)
295modes.)
291
296
292For example, the full path to my cat picture is
297For example, the full path to my cat picture is
@@ -300,6 +305,7 @@ For example, the full path to my cat picture is
300If the data model is `++image` (hypothetical -- we don't really
305If the data model is `++image` (hypothetical -- we don't really
301do image processing in Urbit right now), the normal way to load
306do image processing in Urbit right now), the normal way to load
302this data in a Hoon program is
307this data in a Hoon program is
308+
303```
309```
304.^(image /cx/~sorreg-namtyv/home/[now]/my/cat/picture)
310.^(image /cx/~sorreg-namtyv/home/[now]/my/cat/picture)
305```
311```
@@ -316,15 +322,15 @@ learn it in future, `[~ ~]` if we know we'll never know it, or
316`[~ ~ value]` if we know it now.
322`[~ ~ value]` if we know it now.
317
323
318In high-level shell programming (`:dojo`), we can make apparently
324In high-level shell programming (`:dojo`), we can make apparently
319−"blocking" requests to `%clay`. What actually happens: when `%clay`
325+"blocking" requests to `%clay`. What actually happens: when `%clay`
320produces `~`, we stop trying to compute this expression and wait
326produces `~`, we stop trying to compute this expression and wait
321−on one or more blocking requests. When we are unblocked, we
327+on one or more blocking requests. When we are unblocked, we
322recompute again from scratch; the intermediate computation is not
328recompute again from scratch; the intermediate computation is not
323saved at all.
329saved at all.
324
330
325−Urbit doesn't like to block. It likes to save coherent data
331+Urbit doesn't like to block. It likes to save coherent data
326−structures, not incomplete computation contexts. When Urbit
332+structures, not incomplete computation contexts. When Urbit
327−pretends to block for you, this is a courtesy service. You
333+pretends to block for you, this is a courtesy service. You
328can return the courtesy of not expecting miracles from it.
334can return the courtesy of not expecting miracles from it.
329When in doubt, send an actual request.
335When in doubt, send an actual request.
330
336
@@ -335,7 +341,7 @@ namespace, but can (a) read across case (revision) ranges,
335and (b) filter by subtree.
341and (b) filter by subtree.
336
342
337If the revision range in a request stretches into the future, the
343If the revision range in a request stretches into the future, the
338−request becomes a subscription. Urbit messaging always regards a
344+request becomes a subscription. Urbit messaging always regards a
339single response as a special case of a subscription.
345single response as a special case of a subscription.
340
346
341Generally, the response stream created by a request starts with
347Generally, the response stream created by a request starts with
@@ -345,10 +351,10 @@ closed when the request range is complete.
345
351
346#### Userspace synchronization
352#### Userspace synchronization
347
353
348−Synchronization per se is done in userspace. In `%clay`, sync just
354+Synchronization per se is done in userspace. In `%clay`, sync just
349means an application (typically the `%kiln` module in the system
355means an application (typically the `%kiln` module in the system
350app `:hood`) subscribes to a remote desk, and saves its change
356app `:hood`) subscribes to a remote desk, and saves its change
351−stream locally. So sync is really an emergent feature of `%clay`.
357+stream locally. So sync is really an emergent feature of `%clay`.
352
358
353### Revision graph
359### Revision graph
354
360
@@ -356,16 +362,16 @@ stream locally. So sync is really an emergent feature of `%clay`.
356Some changes are proposed below, however.
362Some changes are proposed below, however.
357
363
358As in any DVCS, a dome is the child of one parent dome (an edit)
364As in any DVCS, a dome is the child of one parent dome (an edit)
359−or more parents (a merge). Often the parent of any revision is
365+or more parents (a merge). Often the parent of any revision is
360the previous version in the sequence, but it can be anything.
366the previous version in the sequence, but it can be anything.
361
367
362### Storage model
368### Storage model
363
369
364−`%clay`'s storage model is completely uninteresting. It's also a
370+`%clay`'s storage model is completely uninteresting. It's also a
365little funky and I want to change it, so I'll be super vague.
371little funky and I want to change it, so I'll be super vague.
366
372
367A `++lobe`, a 128-bit atom, is the Merkle hash of a `blob`, which
373A `++lobe`, a 128-bit atom, is the Merkle hash of a `blob`, which
368−is essentially a leaf. All blobs are stored in a hash table
374+is essentially a leaf. All blobs are stored in a hash table
369(`(map lobe blob)`), and reference each other through lobes.
375(`(map lobe blob)`), and reference each other through lobes.
370
376
371At present we don't GC this space at all, because we don't
377At present we don't GC this space at all, because we don't
@@ -374,12 +380,12 @@ actually delete any roots.
374A `blob` may be `%direct`, meaning it's defined as the data
380A `blob` may be `%direct`, meaning it's defined as the data
375itself, or `%delta`, defined as a change against another blob.
381itself, or `%delta`, defined as a change against another blob.
376This is motivated by the desire not to store a full snapshot
382This is motivated by the desire not to store a full snapshot
377−on every file change. But it may be misguided (see changes #0
383+on every file change. But it may be misguided (see changes #0
378and #1 below).
384and #1 below).
379
385
380We cache the full arch tree (`++ankh`) of the latest state in
386We cache the full arch tree (`++ankh`) of the latest state in
381−each desk. For current queries, this mitigates a lot of the
387+each desk. For current queries, this mitigates a lot of the
382−opportunities for slowness that this data model creates. But the
388+opportunities for slowness that this data model creates. But the
383disparity between the speed of the current version and the
389disparity between the speed of the current version and the
384speed previous version is an undesirable glitch in the API.
390speed previous version is an undesirable glitch in the API.
385
391
@@ -391,38 +397,38 @@ We actually have _three_ motivations for change...
391
397
392At present, we're still using `git` as a development platform.
398At present, we're still using `git` as a development platform.
393`%clay` is certainly used, but just for its strength --
399`%clay` is certainly used, but just for its strength --
394−deployment. This is starving Urbit of essential experience and
400+deployment. This is starving Urbit of essential experience and
395−basically keeping it lame. So, change is necessary.
401+basically keeping it lame. So, change is necessary.
396
402
397### Change must come from the community
403### Change must come from the community
398
404
399−"Why?" you ask? "Why must change come from the community?" Well,
405+"Why?" you ask? "Why must change come from the community?" Well,
400−one, duh. Change always comes from the community.
406+one, duh. Change always comes from the community.
401
407
402−But two, a great force for change has departed. Philip Monk,
408+But two, a great force for change has departed. Philip Monk,
403late maintainer of `%clay` (`~wictuc-folrex` in the old era,
409late maintainer of `%clay` (`~wictuc-folrex` in the old era,
404−`~wicdev-wisryt` in the new), is tired of types and typing. He
410+`~wicdev-wisryt` in the new), is tired of types and typing. He
405spent September roaming with the bison in Montana, and is now
411spent September roaming with the bison in Montana, and is now
406−literally on his way to Patagonia. On the one hand, Phil still
412+literally on his way to Patagonia. On the one hand, Phil still
407exists and is not at all unwilling to answer questions, even dumb
413exists and is not at all unwilling to answer questions, even dumb
408−questions. On the other hand, _Patagonia_.
414+questions. On the other hand, _Patagonia_.
409
415
410−So %clay needs a new owner, or owners. At this point, we think
416+So %clay needs a new owner, or owners. At this point, we think
411the community might be indoctrinated enough to take a stab.
417the community might be indoctrinated enough to take a stab.
412
418
413Alas, `%clay` already has a pretty checkered ownership history.
419Alas, `%clay` already has a pretty checkered ownership history.
414Long ago I built a `%clay` that was really the only serious
420Long ago I built a `%clay` that was really the only serious
415−design failure in Arvo. Then Jared Hance, a brilliant summer
421+design failure in Arvo. Then Jared Hance, a brilliant summer
416intern, took my broken `%clay` and reformed it into a minimal `git`
422intern, took my broken `%clay` and reformed it into a minimal `git`
417−in about a week. Then Philip modified Jared's `%clay` to be a
423+in about a week. Then Philip modified Jared's `%clay` to be a
418_typed_ revision-control system, which is a pretty cool thing.
424_typed_ revision-control system, which is a pretty cool thing.
419
425
420But... in none of these transitions did `%clay` actually get
426But... in none of these transitions did `%clay` actually get
421−_rewritten_ per se. While it's a reasonably good vane, it
427+_rewritten_ per se. While it's a reasonably good vane, it
422does contain one or two historical decisions.
428does contain one or two historical decisions.
423
429
424We know a lot more about Arvo than we used to, and I think we can
430We know a lot more about Arvo than we used to, and I think we can
425−revisit many of these decisions. The point of this post is to
431+revisit many of these decisions. The point of this post is to
426start a `%clay` design discussion that will evolve into actual
432start a `%clay` design discussion that will evolve into actual
427collective action.
433collective action.
428
434
@@ -432,41 +438,41 @@ We're planning a rewards program for contributions to `%clay`.
432It'll simply involve setting a time period and a pool of real
438It'll simply involve setting a time period and a pool of real
433estate, and allocating the pool by judged contribution.
439estate, and allocating the pool by judged contribution.
434
440
435−This is an experimental program. We'll say more about it later.
441+This is an experimental program. We'll say more about it later.
436−It may not even happen. It may happen very differently. When in
442+It may not even happen. It may happen very differently. When in
437doubt, don't talk about Fight Club.
443doubt, don't talk about Fight Club.
438
444
439## Some openings for change
445## Some openings for change
440
446
441−Change, of course, must come from the community. No one can
447+Change, of course, must come from the community. No one can
442−dictate change from the top down. We _know_ this. But...
448+dictate change from the top down. We _know_ this. But...
443
449
444This list of suggested changes for the next `%clay` is not in any
450This list of suggested changes for the next `%clay` is not in any
445−sort of order: priority, structure, difficulty, etc. Let's talk
451+sort of order: priority, structure, difficulty, etc. Let's talk
446−about the changes first; make actual plans second. The numbers
452+about the changes first; make actual plans second. The numbers
447here are just for convenience.
453here are just for convenience.
448
454
449−*All changes in this program will happen on the next-generation
455+_All changes in this program will happen on the next-generation
450−(`cc-release`) branch.*
456+(`cc-release`) branch._
451
457
452### Change #0: state reform
458### Change #0: state reform
453
459
454As mentioned above, the storage model in `%clay`, as the code is
460As mentioned above, the storage model in `%clay`, as the code is
455−at present, feels a little funky to me. There's nothing terribly
461+at present, feels a little funky to me. There's nothing terribly
456awful about it, but it doesn't feel quite right and its scaling
462awful about it, but it doesn't feel quite right and its scaling
457properties are very questionable.
463properties are very questionable.
458
464
459Briefly, `%clay` today actually derives the hierarchy from its
465Briefly, `%clay` today actually derives the hierarchy from its
460−leaves -- rather than _logically_ so deriving it. Only leaves
466+leaves -- rather than _logically_ so deriving it. Only leaves
461−are in the object store. This is just weird, and you can feel
467+are in the object store. This is just weird, and you can feel
462−`%clay` trying to be something other than what it is. (I blame
468+`%clay` trying to be something other than what it is. (I blame
463Jared, though it's actually my fault.)
469Jared, though it's actually my fault.)
464
470
465To store a dome snapshot (`++yaki`), the present code keeps a
471To store a dome snapshot (`++yaki`), the present code keeps a
466−`(map path blob)` at the root of the dome. This is enough to
472+`(map path blob)` at the root of the dome. This is enough to
467reconstruct the `++arch` structures the namespace exports.
473reconstruct the `++arch` structures the namespace exports.
468However, all kinds of basic arch operations, like basically `ls`,
474However, all kinds of basic arch operations, like basically `ls`,
469−become `O(n)` in the number of leaves in the dome. This is
475+become `O(n)` in the number of leaves in the dome. This is
470obviously not quite right.
476obviously not quite right.
471
477
472I believe the storage structure should be (removing everything
478I believe the storage structure should be (removing everything
@@ -487,46 +493,46 @@ Here a `++root` is the universal node, with children addressed by
487hash, but logically representing the abstract `++arch`.
493hash, but logically representing the abstract `++arch`.
488
494
489Users of hierarchical filesystems basically expect performance
495Users of hierarchical filesystems basically expect performance
490−qualities that match the filesystem structure. A huge directory
496+qualities that match the filesystem structure. A huge directory
491−in one place shouldn't affect search speeds somewhere else. And
497+in one place shouldn't affect search speeds somewhere else. And
492of course, `ls` can't be O(n) in the size of the filesystem.
498of course, `ls` can't be O(n) in the size of the filesystem.
493
499
494### Change #1: store edges, cache snapshots
500### Change #1: store edges, cache snapshots
495
501
496−The current `%clay` is snapshot-oriented, like `git`. The actual
502+The current `%clay` is snapshot-oriented, like `git`. The actual
497−changes are discarded. I think this is a bad choice.
503+changes are discarded. I think this is a bad choice.
498
504
499`%clay` is not a research project, and has no idea of going as
505`%clay` is not a research project, and has no idea of going as
500−far as `darcs` in the "set-of-patches" direction. However, at
506+far as `darcs` in the "set-of-patches" direction. However, at
501present we actually throw away the patch (`++nori`).
507present we actually throw away the patch (`++nori`).
502
508
503I think the right DVCS design for `%clay` is a snapshot-oriented
509I think the right DVCS design for `%clay` is a snapshot-oriented
504−system which also keeps the patches. The revision graph has the
510+system which also keeps the patches. The revision graph has the
505−same general shape as in the old `git` style. But rather than
511+same general shape as in the old `git` style. But rather than
506just deriving the diffs from the snapshots, we can also derive
512just deriving the diffs from the snapshots, we can also derive
507−the snapshots from the diffs. When in doubt, we save space by
513+the snapshots from the diffs. When in doubt, we save space by
508dropping the snapshot, not the diff.
514dropping the snapshot, not the diff.
509
515
510For an RCS which is also a general-purpose typed filesystem, it's
516For an RCS which is also a general-purpose typed filesystem, it's
511clear that considering edges (deltas, diffs, changes, etc) as the
517clear that considering edges (deltas, diffs, changes, etc) as the
512−primary state is optimal. You can use diff functions to derive
518+primary state is optimal. You can use diff functions to derive
513deltas from snapshots, but in many data models this will always
519deltas from snapshots, but in many data models this will always
514−risk losing information from the original action. When in
520+risk losing information from the original action. When in
515doubt, save what the user did.
521doubt, save what the user did.
516
522
517This is even more true for operations on the tree structure, not
523This is even more true for operations on the tree structure, not
518−on individual leaves. Consider the heuristic energy that `git` has
524+on individual leaves. Consider the heuristic energy that `git` has
519to go through to figure out when `mv` has been used -- even when
525to go through to figure out when `mv` has been used -- even when
520−`git mv` has been used! (According to the `git` faq, this is
526+`git mv` has been used! (According to the `git` faq, this is
521because the lowest common denominator remains Linus' style of
527because the lowest common denominator remains Linus' style of
522working with emailed patches.)
528working with emailed patches.)
523
529
524−Edges probably don't even need to be deduplicated. They also can
530+Edges probably don't even need to be deduplicated. They also can
525contain metadata such as commit messages (which `%clay` has no
531contain metadata such as commit messages (which `%clay` has no
526place for at present).
532place for at present).
527
533
528Once edges are recognized as unreclaimed primary state, snapshots
534Once edges are recognized as unreclaimed primary state, snapshots
529−can always be derived from the edges. So we can reclaim memory
535+can always be derived from the edges. So we can reclaim memory
530being used for snapshots.
536being used for snapshots.
531
537
532It's also straightforward to have a kind of edge which is a list
538It's also straightforward to have a kind of edge which is a list
@@ -534,27 +540,27 @@ of edges, letting us collapse feature branches trivially.
534
540
535Finally, I think references in edges should wherever possible
541Finally, I think references in edges should wherever possible
536indirect through the namespace, rather than directly to the
542indirect through the namespace, rather than directly to the
537−content address. The user has strictly more information if you
543+content address. The user has strictly more information if you
538say you merged `/~sorreg-namtyv/base/987/`, than if all you have
544say you merged `/~sorreg-namtyv/base/987/`, than if all you have
539is the hash that this reference refers to.
545is the hash that this reference refers to.
540
546
541### Change #2: unconfuse merge and rebase
547### Change #2: unconfuse merge and rebase
542
548
543The dispute between merge and rebase has all the bad smells of
549The dispute between merge and rebase has all the bad smells of
544−a historical wart. But here I'm just not sure what's right.
550+a historical wart. But here I'm just not sure what's right.
545
551
546The user has one _intent_ whether merging or rebasing, which is
552The user has one _intent_ whether merging or rebasing, which is
547−to combine changes on one desk into another. The _algorithm_
553+to combine changes on one desk into another. The _algorithm_
548used to construct this change, whether operational transformation
554used to construct this change, whether operational transformation
549(rebasing) or a 3-way diff (merging) has one goal: use all
555(rebasing) or a 3-way diff (merging) has one goal: use all
550available information to model the authors' editing intent as
556available information to model the authors' editing intent as
551−realistically as possible. If we save edges, we should use
557+realistically as possible. If we save edges, we should use
552edges.
558edges.
553
559
554Whether to define the resulting change graph with the typical
560Whether to define the resulting change graph with the typical
555structure of a merge, or the typical structure of a rebase,
561structure of a merge, or the typical structure of a rebase,
556strikes me as quite arbitrary, and well into the land of "pick
562strikes me as quite arbitrary, and well into the land of "pick
557−one and force everyone to stick with it." But this call demands
563+one and force everyone to stick with it." But this call demands
558a real expert on RCS workflow, which I'm not.
564a real expert on RCS workflow, which I'm not.
559
565
560Since `%clay` is a humble part of a larger system and needs to
566Since `%clay` is a humble part of a larger system and needs to
@@ -564,23 +570,23 @@ different preferences" is not usually the right answer.
564### Change #3: comment jihad
570### Change #3: comment jihad
565
571
566`%clay` needs to be brought up to the documentation standards of
572`%clay` needs to be brought up to the documentation standards of
567−`%jael`. This means (a) the formatting matches; (b) the comments
573+`%jael`. This means (a) the formatting matches; (b) the comments
568are at the same level of quality and ubiquity.
574are at the same level of quality and ubiquity.
569
575
570The basic commenting standards are: (a) every core (class) needs
576The basic commenting standards are: (a) every core (class) needs
571a block comment explanation; (b) every gate (function) needs a
577a block comment explanation; (b) every gate (function) needs a
572line comment; (c) every face (variable) needs a line comment.
578line comment; (c) every face (variable) needs a line comment.
573
579
574−This is obviously not just a clerical task. To write these
580+This is obviously not just a clerical task. To write these
575−comments, you need to actually understand the code. This is a
581+comments, you need to actually understand the code. This is a
576nontrivial but extremely rewarding task, even if the code you're
582nontrivial but extremely rewarding task, even if the code you're
577commenting will get replaced.
583commenting will get replaced.
578
584
579Also, the _symbols_ in `%clay` must be brought up to `%jael`
585Also, the _symbols_ in `%clay` must be brought up to `%jael`
580−quality. There is still far too much four-letterism here.
586+quality. There is still far too much four-letterism here.
581
587
582NB: `%clay` is about 3000 lines of pretty clean Hoon, which is
588NB: `%clay` is about 3000 lines of pretty clean Hoon, which is
583−certainly not at all undocumented. We're not exactly looking at
589+certainly not at all undocumented. We're not exactly looking at
584a Matterhorn of reverse engineering here.
590a Matterhorn of reverse engineering here.
585
591
586### Change #4: knot to coin internal paths
592### Change #4: knot to coin internal paths
@@ -591,26 +597,26 @@ ASCII symbol as an atom) must be within the range of the
591invertible noun printer, `++co`.
597invertible noun printer, `++co`.
592
598
593`++co` maps a described data value, a `++coin`, to an ASCII
599`++co` maps a described data value, a `++coin`, to an ASCII
594−string which is a valid URL segment and Unix filename. Its
600+string which is a valid URL segment and Unix filename. Its
595friend `++so` inverts the function, perfectly.
601friend `++so` inverts the function, perfectly.
596
602
597−Almost every knot is the simplest kind of `coin`, a `dime.` A
603+Almost every knot is the simplest kind of `coin`, a `dime.` A
598dime is a single atom with a rendering type (`aura` if you know
604dime is a single atom with a rendering type (`aura` if you know
599−Hoon). Auras include `@tas` for symbolic text, `@ud` for
605+Hoon). Auras include `@tas` for symbolic text, `@ud` for
600−unsigned decimal, `@p` for Urbit ship, etc. `++co` can also
606+unsigned decimal, `@p` for Urbit ship, etc. `++co` can also
601print arbitrary cells, though less prettily.
607print arbitrary cells, though less prettily.
602
608
603This feature is cool because it lets us stuff data into names in
609This feature is cool because it lets us stuff data into names in
604−a precise and predictable way. Usually the names in a namespace
610+a precise and predictable way. Usually the names in a namespace
605are human-meaningful and human-originated, and are therefore
611are human-meaningful and human-originated, and are therefore
606−symbolic, but there are exceptions. For example, blogposts may
612+symbolic, but there are exceptions. For example, blogposts may
607want to be named by date.
613want to be named by date.
608
614
609However, it is slightly retarded for the fundamental state of our
615However, it is slightly retarded for the fundamental state of our
610arches to store the _rendered_ string (`++knot`), not the source
616arches to store the _rendered_ string (`++knot`), not the source
611−data (`++coin`). It leads to all kinds of inefficiencies where
617+data (`++coin`). It leads to all kinds of inefficiencies where
612−we're doing way more parsing than we want to. (Parsing also
618+we're doing way more parsing than we want to. (Parsing also
613−should be jet-propelled, but is not.) It also makes it way too
619+should be jet-propelled, but is not.) It also makes it way too
614easy to sneak in bad data and make it `%clay`'s problem.
620easy to sneak in bad data and make it `%clay`'s problem.
615
621
616So, logically, we'd be shifting from
622So, logically, we'd be shifting from
@@ -625,7 +631,7 @@ So, logically, we'd be shifting from
625
631
626Also, a vanilla `++map` might not be quite the right data
632Also, a vanilla `++map` might not be quite the right data
627structure at this point -- we probably want a custom sorted tree,
633structure at this point -- we probably want a custom sorted tree,
628−which separates auras and imposes a custom order on each. This
634+which separates auras and imposes a custom order on each. This
629would let us serve simple range queries quite efficiently, so
635would let us serve simple range queries quite efficiently, so
630long as they match the standard aura order (eg, alphabetical
636long as they match the standard aura order (eg, alphabetical
631order for symbols).
637order for symbols).
@@ -633,23 +639,23 @@ order for symbols).
633### Change #5: dome semantics by reference
639### Change #5: dome semantics by reference
634
640
635While the principle that a dome contains its own mark source is
641While the principle that a dome contains its own mark source is
636−elegant, it's a pain in the ass to implement properly. `%clay`
642+elegant, it's a pain in the ass to implement properly. `%clay`
637certainly does not do it justice at present.
643certainly does not do it justice at present.
638
644
639The complexity is in checking every change to see whether it
645The complexity is in checking every change to see whether it
640includes a change to the mark source (which is very unlikely),
646includes a change to the mark source (which is very unlikely),
641or a dependency of the mark source (slightly less unlikely).
647or a dependency of the mark source (slightly less unlikely).
642And if so, do we have to update all the leaves in the dome?
648And if so, do we have to update all the leaves in the dome?
643−This is also very unlikely. And yet, it happens.
649+This is also very unlikely. And yet, it happens.
644
650
645Instead, we could simply designate, by beak (ship, desk, and
651Instead, we could simply designate, by beak (ship, desk, and
646−case) a dome which contains the canonical mark source. This
652+case) a dome which contains the canonical mark source. This
647would rarely change -- you could upgrade a desk to a new mark
653would rarely change -- you could upgrade a desk to a new mark
648dome, but it would be a manual operation and probably a rare one.
654dome, but it would be a manual operation and probably a rare one.
649
655
650The common case would just be that everyone uses the current
656The common case would just be that everyone uses the current
651version of the `%base` desk when a desk is created, and never
657version of the `%base` desk when a desk is created, and never
652−changes it. In practice, this means not every two-byte edit
658+changes it. In practice, this means not every two-byte edit
653needs to get involved in detecting and/or applying schema
659needs to get involved in detecting and/or applying schema
654evolution, a welcome simplification.
660evolution, a welcome simplification.
655
661
@@ -661,14 +667,14 @@ design is one mark per message structure, the mark namespace gets
661overloaded fast.
667overloaded fast.
662
668
663So we added an app hierarchy within the mark namespace, using hep
669So we added an app hierarchy within the mark namespace, using hep
664−`-` as a divider. The `:talk` app expects messages with the mark
670+`-` as a divider. The `:talk` app expects messages with the mark
665`talk-message`, whose sources is in `/===/mar/talk/message`.
671`talk-message`, whose sources is in `/===/mar/talk/message`.
666
672
667This helps, but it doesn't solve another two problems: trivial
673This helps, but it doesn't solve another two problems: trivial
668nouns and containers.
674nouns and containers.
669
675
670It's retarded to have to add a source file to send a `@ud` or a
676It's retarded to have to add a source file to send a `@ud` or a
671−`*`. An aura (see above under `coin`) should be a trivial mark.
677+`*`. An aura (see above under `coin`) should be a trivial mark.
672
678
673Also, we need to be able to construct standard containers of
679Also, we need to be able to construct standard containers of
674marks: lists, maps, sets, and tuples (or, as a database person
680marks: lists, maps, sets, and tuples (or, as a database person
@@ -680,32 +686,32 @@ Another kind of complex mark that needs to exist: conflict,
680difference, and invalid marks.
686difference, and invalid marks.
681
687
682Conflict data and difference data are two types of noun that are
688Conflict data and difference data are two types of noun that are
683−generated in normal RCS operation. If we have the concept of an
689+generated in normal RCS operation. If we have the concept of an
684`%html` noun, we also need the concept of an invertible change
690`%html` noun, we also need the concept of an invertible change
685from one `%html` file to another; a merge conflict between two
691from one `%html` file to another; a merge conflict between two
686`%html` files; and even a conflict between two marks.
692`%html` files; and even a conflict between two marks.
687
693
688There are two kinds of changes to a dome: manual and automatic.
694There are two kinds of changes to a dome: manual and automatic.
689Manual changes are initiated by the user and should crash, unless
695Manual changes are initiated by the user and should crash, unless
690−manually overridden. Automatic changes should not crash, ever,
696+manually overridden. Automatic changes should not crash, ever,
691−and should not lose data. If they create problems, which they
697+and should not lose data. If they create problems, which they
692shouldn't, these problems will need to be cleaned up manually.
698shouldn't, these problems will need to be cleaned up manually.
693
699
694This is a complex space to navigate, but it requires a conflicted
700This is a complex space to navigate, but it requires a conflicted
695merge to be able to resolve to a valid dome containing conflict
701merge to be able to resolve to a valid dome containing conflict
696−leaves, not crash. The present `%clay` goes halfway there and
702+leaves, not crash. The present `%clay` goes halfway there and
697resolves to a scratch desk, but we can go farther: the whole `git`
703resolves to a scratch desk, but we can go farther: the whole `git`
698−dumpster-fire of "merge state" deserves destruction. One change
704+dumpster-fire of "merge state" deserves destruction. One change
699is a merge that produces conflicts, the next is an edit that
705is a merge that produces conflicts, the next is an edit that
700resolves them.
706resolves them.
701
707
702−Similarly, all sorts of errors can produce invalid leaves. One
708+Similarly, all sorts of errors can produce invalid leaves. One
703particularly rare case which is nonetheless important is schema
709particularly rare case which is nonetheless important is schema
704evolution: what happens to files in a mark, when the mark source
710evolution: what happens to files in a mark, when the mark source
705−code changes. They all need to be re-normalized. And this
711+code changes. They all need to be re-normalized. And this
706−operation can fail, producing an invalid value. (We don't do any
712+operation can fail, producing an invalid value. (We don't do any
707of this now, BTW, although `%ford` has the dependency mechanism to
713of this now, BTW, although `%ford` has the dependency mechanism to
708−make it possible.) Again, in some cases this should crash the
714+make it possible.) Again, in some cases this should crash the
709update to the mark source; in other cases, there is no local way
715update to the mark source; in other cases, there is no local way
710to handle the crash.
716to handle the crash.
711
717
@@ -716,46 +722,46 @@ into using the bad content.
716
722
717The bottom line: a mark needs to be split into two models:
723The bottom line: a mark needs to be split into two models:
718`++mark`, the original symbolic mark with its source engine, and
724`++mark`, the original symbolic mark with its source engine, and
719−something like `++logo`, the meta-mark or mark container. The
725+something like `++logo`, the meta-mark or mark container. The
720mark is the building block; the logo is the building.
726mark is the building block; the logo is the building.
721
727
722### Change #8: filesystem hierarchy standard
728### Change #8: filesystem hierarchy standard
723
729
724While all filesystems remain forks of one ur-filesystem, the
730While all filesystems remain forks of one ur-filesystem, the
725−standard tends to enforce itself. But not define itself.
731+standard tends to enforce itself. But not define itself.
726
732
727−I've always hated the current `/mar` for marks, for instance. I
733+I've always hated the current `/mar` for marks, for instance. I
728−prefer `/mac`. But others hate this. And so on. Also, by
734+prefer `/mac`. But others hate this. And so on. Also, by
729necessity, our nascent "FHS" is heavily biased toward system
735necessity, our nascent "FHS" is heavily biased toward system
730−data, away from user data. This is retarded.
736+data, away from user data. This is retarded.
731
737
732−Please focus all bikeshedding energy on this problem! Better to
738+Please focus all bikeshedding energy on this problem! Better to
733bikeshed about what color to paint the bikeshed, then what shape
739bikeshed about what color to paint the bikeshed, then what shape
734the bike gears should be.
740the bike gears should be.
735
741
736### Change #9: security and access control
742### Change #9: security and access control
737
743
738−Oh, yeah, that! They always say not to design security in at the
744+Oh, yeah, that! They always say not to design security in at the
739−last minute. Unfortunately, this is exactly what we did. There
745+last minute. Unfortunately, this is exactly what we did. There
740−is no security at all in present `%clay`. (There is also no push
746+is no security at all in present `%clay`. (There is also no push
741operation in `%clay`, so it's not as mad as you think -- anyone
747operation in `%clay`, so it's not as mad as you think -- anyone
742can read anything, no one can write anything, which is fine in a
748can read anything, no one can write anything, which is fine in a
743young network where there are no secrets.)
749young network where there are no secrets.)
744
750
745Fortunately, we don't have anything super fancy planned in this
751Fortunately, we don't have anything super fancy planned in this
746−area, just basic access-control lists. These obviously need to
752+area, just basic access-control lists. These obviously need to
747be designed along with the filesystem-hierarchy standard (see
753be designed along with the filesystem-hierarchy standard (see
748elsewhere).
754elsewhere).
749
755
750−Is it even possible to do ACLs properly in `%clay`? At this
756+Is it even possible to do ACLs properly in `%clay`? At this
751−point, yes. There is an event-oriented security model in Arvo,
757+point, yes. There is an event-oriented security model in Arvo,
752though it isn't really hooked up to anything at the moment.
758though it isn't really hooked up to anything at the moment.
753−There is also a privilege badge system in `%jael`. The
759+There is also a privilege badge system in `%jael`. The
754combination of these two features is quite sufficient for a
760combination of these two features is quite sufficient for a
755decent ACL model.
761decent ACL model.
756
762
757The idea of event-based security is that every event passed to
763The idea of event-based security is that every event passed to
758−`%clay` has a security `++mask`. The mask tells us:
764+`%clay` has a security `++mask`. The mask tells us:
759
765
760- the set of ships that has _contaminated_ this event
766- the set of ships that has _contaminated_ this event
761- the set of ships that has _endorsed_ this event
767- the set of ships that has _endorsed_ this event
@@ -763,20 +769,20 @@ The idea of event-based security is that every event passed to
763
769
764To simplify this system a little and maybe explain it, the
770To simplify this system a little and maybe explain it, the
765security question in any event is: (a) who has _caused_ this
771security question in any event is: (a) who has _caused_ this
766−event? (b) who may receive its _effects_? (These sets never
772+event? (b) who may receive its _effects_? (These sets never
767include your urbit itself, of course, only neighbors.)
773include your urbit itself, of course, only neighbors.)
768
774
769For example, if we're doing something because ship X sent us a
775For example, if we're doing something because ship X sent us a
770packet, and we're going to leak the results of this something
776packet, and we're going to leak the results of this something
771back in a response to ship X, once `%clay` knows what our ship
777back in a response to ship X, once `%clay` knows what our ship
772thinks of its neighbor X, we should have a good picture of what
778thinks of its neighbor X, we should have a good picture of what
773−effects this event should be allowed to cause. If `%jael` knows
779+effects this event should be allowed to cause. If `%jael` knows
774that X is our friend, `%clay` can know that X can see our cat
780that X is our friend, `%clay` can know that X can see our cat
775picture.
781picture.
776
782
777Causality is separated out into contamination (data from ship X
783Causality is separated out into contamination (data from ship X
778got into the event) and endorsement (ship X signed the whole
784got into the event) and endorsement (ship X signed the whole
779−event). (This may be overdesign.) All these sets can be defined
785+event). (This may be overdesign.) All these sets can be defined
780as the empty set (eg, releasing to the empty set means no output)
786as the empty set (eg, releasing to the empty set means no output)
781or the universal set (input from the universal set could be from
787or the universal set (input from the universal set could be from
782anyone, ie, is unauthenticated).
788anyone, ie, is unauthenticated).
@@ -785,11 +791,11 @@ anyone, ie, is unauthenticated).
785
791
786When you read a leaf from a `%clay` dome, `%clay` is happy to
792When you read a leaf from a `%clay` dome, `%clay` is happy to
787perform any necessary mark conversions (the actual work is done
793perform any necessary mark conversions (the actual work is done
788−by the `%ford` build vane). You can also just ask for the leaf
794+by the `%ford` build vane). You can also just ask for the leaf
789in whatever mark `%clay` has it.
795in whatever mark `%clay` has it.
790
796
791It's confusing to think of this mark extension as part of the
797It's confusing to think of this mark extension as part of the
792−path. You shouldn't say `+cat /===/app/talk/hoon`. You should say
798+path. You shouldn't say `+cat /===/app/talk/hoon`. You should say
793`+cat /===/app/talk`, or maybe `+cat %hoon /===/app/talk`.
799`+cat /===/app/talk`, or maybe `+cat %hoon /===/app/talk`.
794
800
795A mark-extended namespace may be added to `%ford`, to compensate.
801A mark-extended namespace may be added to `%ford`, to compensate.
@@ -798,7 +804,7 @@ But type-converting reads are the rare case, not the common case.
798### Change #11: real queries and indexes
804### Change #11: real queries and indexes
799
805
800A filesystem should postpone being a database until it can no
806A filesystem should postpone being a database until it can no
801−longer do so. So, please don't think about this problem yet.
807+longer do so. So, please don't think about this problem yet.
802I'm joking, of course!
808I'm joking, of course!
803
809
804### Change #12: meta-query
810### Change #12: meta-query
@@ -807,24 +813,24 @@ Make it possible to query the list of desks in a ship :-)
807
813
808### Change #13: completely redesign Unix mounting
814### Change #13: completely redesign Unix mounting
809
815
810−This is actually a series of changes, described below. But
816+This is actually a series of changes, described below. But
811broadly...
817broadly...
812
818
813One of Urbit's experiments is live two-way synchronization
819One of Urbit's experiments is live two-way synchronization
814between the Unix filesystem and the revision-control store.
820between the Unix filesystem and the revision-control store.
815−Dropbox style, as it were. I think this experiment is basically
821+Dropbox style, as it were. I think this experiment is basically
816−a failure. It may be right for cat pictures, but I don't think
822+a failure. It may be right for cat pictures, but I don't think
817it's right for Urbit.
823it's right for Urbit.
818
824
819The fundamental problem is that there are all sorts of weird,
825The fundamental problem is that there are all sorts of weird,
820−flaky ways applications use a mutable filesystem. It's not at
826+flaky ways applications use a mutable filesystem. It's not at
821all unusual for an editor to change a file by deleting the old
827all unusual for an editor to change a file by deleting the old
822file, then writing the new one in its place.
828file, then writing the new one in its place.
823
829
824−You really don't want this to produce a delete change. A simple
830+You really don't want this to produce a delete change. A simple
825cooldown timer for the sync helps a lot with this, but causes
831cooldown timer for the sync helps a lot with this, but causes
826−other weirdnesses. In theory, a sync can even cause another
832+other weirdnesses. In theory, a sync can even cause another
827−change to the same version of the same desk. And so on.
833+change to the same version of the same desk. And so on.
828
834
829The thing we fear is just too funky to work (there is some
835The thing we fear is just too funky to work (there is some
830strange "reflux bug" still affecting it) is any sort of _two-way_
836strange "reflux bug" still affecting it) is any sort of _two-way_
@@ -835,8 +841,8 @@ cold storage, is that there's no useful workflow that actually
835uses it -- at least, when editing Urbit code.
841uses it -- at least, when editing Urbit code.
836
842
837It's actually really nice to have files on a disk that nothing
843It's actually really nice to have files on a disk that nothing
838−will automatically modify. If you're using `git` and `%clay` in
844+will automatically modify. If you're using `git` and `%clay` in
839−parallel, it's nice to mount your `git` working directory. The
845+parallel, it's nice to mount your `git` working directory. The
840original Urbit workflow was to work out of a mounted directory,
846original Urbit workflow was to work out of a mounted directory,
841but the two-way updates were just too weird and scary, so now we
847but the two-way updates were just too weird and scary, so now we
842tend to edit elsewhere and copy in -- which is lame.
848tend to edit elsewhere and copy in -- which is lame.
@@ -849,25 +855,25 @@ FUSE (in a somewhat experimental state), and filesystem watching
849
855
850The FUSE interface is a good one, though it needs more work.
856The FUSE interface is a good one, though it needs more work.
851Moreover, it exports the whole Urbit namespace to Unix, not just
857Moreover, it exports the whole Urbit namespace to Unix, not just
852−`%clay`. For reading Urbit data, FUSE is basically ideal.
858+`%clay`. For reading Urbit data, FUSE is basically ideal.
853
859
854−The obvious impulse is to make a read-write FUSE. But I don't
860+The obvious impulse is to make a read-write FUSE. But I don't
855think FUSE should be used for recording changes to an RCS, even
861think FUSE should be used for recording changes to an RCS, even
856though the FUSE API sends you changes as events.
862though the FUSE API sends you changes as events.
857
863
858−There are three reasons for this. One, the actual filesystem
864+There are three reasons for this. One, the actual filesystem
859writes that Unix apps make are typically of low quality and
865writes that Unix apps make are typically of low quality and
860−confusing. Some crack-brained editor will find it completely
866+confusing. Some crack-brained editor will find it completely
861normal and unremarkable to modify a byte in a file, by deleting
867normal and unremarkable to modify a byte in a file, by deleting
862−the file and rewriting it from scratch. You can use a cooldown
868+the file and rewriting it from scratch. You can use a cooldown
863timer to wait for this nonsense to converge, but leaving data in
869timer to wait for this nonsense to converge, but leaving data in
864heuristic limbo seems like a very bad idea in FUSE-land.
870heuristic limbo seems like a very bad idea in FUSE-land.
865
871
866The second is that people derive a lot of comfort from seeing
872The second is that people derive a lot of comfort from seeing
867−actual files on an actual disk. The idea that your datas are
873+actual files on an actual disk. The idea that your datas are
868stuck in Urbit is slightly terrifying as a user experience.
874stuck in Urbit is slightly terrifying as a user experience.
869−We claim to be reliable. It's actually hard to imagine datas that
875+We claim to be reliable. It's actually hard to imagine datas that
870−couldn't be recovered from either snapshot or log. But how can
876+couldn't be recovered from either snapshot or log. But how can
871you possibly believe us on this?
877you possibly believe us on this?
872
878
873So I think it's correct to lean all the weight of reading data
879So I think it's correct to lean all the weight of reading data
@@ -882,35 +888,35 @@ But this is a separate discussion.
882
888
883### Change #15: one-way, nonced working desk
889### Change #15: one-way, nonced working desk
884
890
885−A one-way mount is a much less crazy thing. It works the same
891+A one-way mount is a much less crazy thing. It works the same
886way our two-way mount works today, but with only one writer: the
892way our two-way mount works today, but with only one writer: the
887user, via Unix.
893user, via Unix.
888
894
889Since a mount is one-way, it needs to have an absolute write lock
895Since a mount is one-way, it needs to have an absolute write lock
890−on the desk it's writing to. We cannot have a `%home` desk which
896+on the desk it's writing to. We cannot have a `%home` desk which
891we are also editing with filesystem watching.
897we are also editing with filesystem watching.
892
898
893Instead, we have a temporary and anonymous state that's connected
899Instead, we have a temporary and anonymous state that's connected
894−itself with your `%home` desk. Desk names have to be valid
900+itself with your `%home` desk. Desk names have to be valid
895−symbols, but we can use `hep`, `-`. A reasonable choice is to
901+symbols, but we can use `hep`, `-`. A reasonable choice is to
896pick a random 32-bit name for each mount instance -- so the desk
902pick a random 32-bit name for each mount instance -- so the desk
897−name is not `%home`, but `%home-bosdut-sigder`. (Randomizing
903+name is not `%home`, but `%home-bosdut-sigder`. (Randomizing
898instead of always using a fixed suffix, say, `%home-work`,
904instead of always using a fixed suffix, say, `%home-work`,
899just makes all kinds of screwups less likely.)
905just makes all kinds of screwups less likely.)
900
906
901You create a mount simply by mkdiring the desk name in your pier.
907You create a mount simply by mkdiring the desk name in your pier.
902Just the base name, Urbit will come up with the `%bosdut-sigder`
908Just the base name, Urbit will come up with the `%bosdut-sigder`
903−part and put it in a `.desk` file at the desk root. To forget
909+part and put it in a `.desk` file at the desk root. To forget
904−the mount, just delete this file. This avoids the ugly confusion
910+the mount, just delete this file. This avoids the ugly confusion
905between unmounting a mount, and deleting all the data in it.
911between unmounting a mount, and deleting all the data in it.
906
912
907(Urbit will keep a set of the mount desks it's used and
913(Urbit will keep a set of the mount desks it's used and
908−forgotten, not reuse them, and block all requests into them. By
914+forgotten, not reuse them, and block all requests into them. By
909blocking, we can delete without losing referential transparency.
915blocking, we can delete without losing referential transparency.
910Yes, Virginia, Urbit can forget!)
916Yes, Virginia, Urbit can forget!)
911
917
912Note that the auto-reload behavior of applications is extremely
918Note that the auto-reload behavior of applications is extremely
913−useful when testing. When testing, you can either switch the
919+useful when testing. When testing, you can either switch the
914active application desk from `%home` to `%home-bosdut-sigder`,
920active application desk from `%home` to `%home-bosdut-sigder`,
915or activate autosync from the latter to the former.
921or activate autosync from the latter to the former.
916
922
@@ -933,7 +939,7 @@ Otherwise, you're basically, like, reinventing Perforce.
933
939
934More concretely, the Urbit experience today requires `:hood`
940More concretely, the Urbit experience today requires `:hood`
935pokes (Urbit shell commands, basically) for all nontrivial RCS
941pokes (Urbit shell commands, basically) for all nontrivial RCS
936−operations, from mounting to merging. Again, there are lots of
942+operations, from mounting to merging. Again, there are lots of
937situations in which you can write into a mounted filesystem (the
943situations in which you can write into a mounted filesystem (the
938protocol for Unix communication could be easily adapted to
944protocol for Unix communication could be easily adapted to
939communicate with a browser-based editor, for instance), but you
945communicate with a browser-based editor, for instance), but you
@@ -943,20 +949,20 @@ Even commands like mounting and merging are easily communicated,
943through filesystem writes that any Unix tool (including many
949through filesystem writes that any Unix tool (including many
944macro editors).
950macro editors).
945
951
946−This is very easy for a filesystem watcher. One such protocol:
952+This is very easy for a filesystem watcher. One such protocol:
947if you want to send the daemon a command relative to some
953if you want to send the daemon a command relative to some
948−directory, write a `.ur-command` metafile in that directory. The
954+directory, write a `.ur-command` metafile in that directory. The
949daemon accepts the command by deleting it.
955daemon accepts the command by deleting it.
950
956
951The user experience is that you configure your mounts by simply
957The user experience is that you configure your mounts by simply
952−making the directories and configuring dotfiles in them. Unlike
958+making the directories and configuring dotfiles in them. Unlike
953in the present system, Urbit will never modify your datas
959in the present system, Urbit will never modify your datas
954silently in the background.
960silently in the background.
955
961
956Here's what this looks like:
962Here's what this looks like:
957
963
958−Suppose you want to edit some data in the `%home` desk. Your
964+Suppose you want to edit some data in the `%home` desk. Your
959−data is in `/=home=/mar/talk`. You also want a read-only view
965+data is in `/=home=/mar/talk`. You also want a read-only view
960of `/=home=/arvo`.
966of `/=home=/arvo`.
961
967
962From Unix, you do something like this:
968From Unix, you do something like this:
@@ -969,18 +975,18 @@ From Unix, you do something like this:
969 $ touch home/arvo/.read
975 $ touch home/arvo/.read
970```
976```
971
977
972−Want to commit your changes? That means merging the working
978+Want to commit your changes? That means merging the working
973−desk, `%home-bosdut-sigder`, into the `%home`. Put a commit message
979+desk, `%home-bosdut-sigder`, into the `%home`. Put a commit message
974−into `home/.commit` and it'll happen. If there's an error, it
980+into `home/.commit` and it'll happen. If there's an error, it
975will appear as `.error`.
981will appear as `.error`.
976
982
977The mount has a .version file which simply contains the change
983The mount has a .version file which simply contains the change
978−number (of the working desk) which any edits are relative to. If
984+number (of the working desk) which any edits are relative to. If
979the urbit daemon is running and watching, edits will be absorbed
985the urbit daemon is running and watching, edits will be absorbed
980quickly (probably after a heuristic timeout), and the version
986quickly (probably after a heuristic timeout), and the version
981−incremented. But we always are confident that the edits are
987+incremented. But we always are confident that the edits are
982against the latest version, or at least we can use this as a
988against the latest version, or at least we can use this as a
983−sanity check. All kinds of insane things can happen to get a
989+sanity check. All kinds of insane things can happen to get a
984filesystem out of consistency.
990filesystem out of consistency.
985
991
986This design obviously needs a little fleshing out, but I'm quite
992This design obviously needs a little fleshing out, but I'm quite
@@ -989,12 +995,12 @@ from Unix.
989
995
990## In conclusion
996## In conclusion
991
997
992−There's obviously a lot of fun here! There are two things you
998+There's obviously a lot of fun here! There are two things you
993can do right now.
999can do right now.
994
1000
995One, talk about `%clay` on [this forum
1001One, talk about `%clay` on [this forum
996thread](http://urbit.org/~~/fora/posts/~2016.10.25..17.37.47..6937~/) or
1002thread](http://urbit.org/~~/fora/posts/~2016.10.25..17.37.47..6937~/) or
997−on [:talk](http://urbit.org/stream). Both hosted on Urbit
1003+on [:talk](http://urbit.org/stream). Both hosted on Urbit
998itself!
1004itself!
999
1005
1000Two, poke around the
1006Two, poke around the
content/blog/urbit-and-bitcoin.md+6−6
@@ -1,7 +1,8 @@
1+++
1+++
2title = "Urbit and Bitcoin"
2title = "Urbit and Bitcoin"
3description = "A sound money deserves a sound computer."
3description = "A sound money deserves a sound computer."
4−date = 2019-10-17
4+date = "2019-10-16"
5+
5[extra]
6[extra]
6author = "Christian Langalis"
7author = "Christian Langalis"
7ship = "~pindet-timmut"
8ship = "~pindet-timmut"
@@ -9,13 +10,12 @@ ship = "~pindet-timmut"
9
10
10Sound money deserves a sound computer.
11Sound money deserves a sound computer.
11
12
12−Urbit imagines a new model for an OS that – among other changes – includes money as a native service. Developers within the Urbit ecosystem will be able to securely use money in their applications as easily as they might use file systems or networking protocols. Creating a new sound currency, however is not our goal; Bitcoin has already done that.
13+Urbit imagines a new model for an OS that – among other changes – includes money as a native service. Developers within the Urbit ecosystem will be able to securely use money in their applications as easily as they might use file systems or networking protocols. Creating a new sound currency, however is not our goal; Bitcoin has already done that.
13
14
14−Running a Bitcoin node is very much like running a single purpose personal server (one that hosts the Bitcoin blockchain and verifies transactions). Urbit is designed to be the *final* personal server, so this week we launched several grants to incorporate Bitcoin into our development cycle. The first of these are directed towards interacting with Bitcoin nodes directly from Urbit.
15+Running a Bitcoin node is very much like running a single purpose personal server (one that hosts the Bitcoin blockchain and verifies transactions). Urbit is designed to be the _final_ personal server, so this week we launched several grants to incorporate Bitcoin into our development cycle. The first of these are directed towards interacting with Bitcoin nodes directly from Urbit.
15
16
16−Bitcoin and Urbit are complementary systems. Sound digital money requires sound computing to be used safely and effectively. Urbit’s OS is strictly-typed and entirely functional, and as a result, it’s orders of magnitude more secure than the Unix ecosystem when fully implemented.
17+Bitcoin and Urbit are complementary systems. Sound digital money requires sound computing to be used safely and effectively. Urbit’s OS is strictly-typed and entirely functional, and as a result, it’s orders of magnitude more secure than the Unix ecosystem when fully implemented.
17
18
18−Urbit and Bitcoin converge along the realization that the Virtual is subsuming the Real. In other words, the locus of control over your life is no longer embodied in the physical, but the digital. For example, what worries you more: a pickpocket or a sim-swapper? The bogeymen of today don’t target our physical selves; they target our private keys, our searches, and our data. The client-server computing paradigm is falling in upon itself, and cannot protect us in this new reality. Without peer-to-peer tools like Urbit and Bitcoin, our property and lives lie vulnerable to control by platforms.
19+Urbit and Bitcoin converge along the realization that the Virtual is subsuming the Real. In other words, the locus of control over your life is no longer embodied in the physical, but the digital. For example, what worries you more: a pickpocket or a sim-swapper? The bogeymen of today don’t target our physical selves; they target our private keys, our searches, and our data. The client-server computing paradigm is falling in upon itself, and cannot protect us in this new reality. Without peer-to-peer tools like Urbit and Bitcoin, our property and lives lie vulnerable to control by platforms.
19
20
20To integrate Bitcoin with Urbit, we’re starting with the basics: a Bitcoin wallet and a Bitcoin node solution for Urbit. These tools will bring Urbit’s Bitcoin functionality from 0 to 1, and will serve as building blocks for our upcoming push from 1 to `n`. We’ll be sharing more about this in the coming weeks and months. If this excites you, please feel free to get involved with some of our current Bitcoin bounties, found [here](https://grants.urbit.org/bounties).
21To integrate Bitcoin with Urbit, we’re starting with the basics: a Bitcoin wallet and a Bitcoin node solution for Urbit. These tools will bring Urbit’s Bitcoin functionality from 0 to 1, and will serve as building blocks for our upcoming push from 1 to `n`. We’ll be sharing more about this in the coming weeks and months. If this excites you, please feel free to get involved with some of our current Bitcoin bounties, found [here](https://grants.urbit.org/bounties).
21−
content/blog/urbit-and-the-blockchain.md+85−80
@@ -1,8 +1,13 @@
1+++
1+++
2title = "Urbit and the Blockchain Wars"
2title = "Urbit and the Blockchain Wars"
3−date = 2017-09-25
3+date = "2017-09-24"
4description = "A bit about the 'idea maze' of choosing to bootstrap from Ethereum."
4description = "A bit about the 'idea maze' of choosing to bootstrap from Ethereum."
5+aliases = [
5−aliases = ["/posts/essays/urbit-and-the-blockchain", "/posts/urbit-and-the-blockchain", "/blog/2017.9-critique/"]
6+ "/posts/essays/urbit-and-the-blockchain",
7+ "/posts/urbit-and-the-blockchain",
8+ "/blog/2017.9-critique/"
9+]
10+
6[extra]
11[extra]
7author = "Curtis Yarvin"
12author = "Curtis Yarvin"
8ship = "~sorreg-namtyv"
13ship = "~sorreg-namtyv"
@@ -11,34 +16,34 @@ image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/urbit-
11
16
12![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/urbit-and-the-blockchain-1.jpg)
17![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/urbit-and-the-blockchain-1.jpg)
13
18
14−One core principle of the Urbit network is that *Urbit doesn't take sides*.
19+One core principle of the Urbit network is that _Urbit doesn't take sides_.
15This is true in all kinds of conflicts -- and especially blockchain wars.
20This is true in all kinds of conflicts -- and especially blockchain wars.
16
21
17We're [moving the Urbit PKI onto Ethereum](https://urbit.org/blog/2017.9.20-bootstrapping-urbit-from-ethereum/)
22We're [moving the Urbit PKI onto Ethereum](https://urbit.org/blog/2017.9.20-bootstrapping-urbit-from-ethereum/)
18not because we like Ethereum, but because it's the most practical thing for
23not because we like Ethereum, but because it's the most practical thing for
19−Urbit right now. This is not a moral or aesthetic choice.
24+Urbit right now. This is not a moral or aesthetic choice.
20
25
21−Some have objected to this decision. Some of these objections are excellent.
26+Some have objected to this decision. Some of these objections are excellent.
22The rest are understandable.
27The rest are understandable.
23
28
24−Let's review our decision, responding to objections along the way. Not everyone
29+Let's review our decision, responding to objections along the way. Not everyone
25−has to agree on everything. No one should stay confused. And we welcome
30+has to agree on everything. No one should stay confused. And we welcome
26further comment.
31further comment.
27
32
28## Urbit is not endorsing or supporting Ethereum
33## Urbit is not endorsing or supporting Ethereum
29
34
30−There are many technical criticisms of Ethereum. We agree with many of these
35+There are many technical criticisms of Ethereum. We agree with many of these
31−criticisms -- even most. But still more important: Bitcoin is the strongest
36+criticisms -- even most. But still more important: Bitcoin is the strongest
32−chain. If Bitcoin could directly enforce Urbit's PKI rules, we'd use Bitcoin,
37+chain. If Bitcoin could directly enforce Urbit's PKI rules, we'd use Bitcoin,
33−for this reason alone. (That said, Ethereum may be less exposed to Chinese
38+for this reason alone. (That said, Ethereum may be less exposed to Chinese
34politics.)
39politics.)
35
40
36−We chose ETH because it is the strongest *computational* chain. It is certainly
41+We chose ETH because it is the strongest _computational_ chain. It is certainly
37stronger than the way we're storing the Urbit land registry now: GitHub, plus
42stronger than the way we're storing the Urbit land registry now: GitHub, plus
38internal records.
43internal records.
39
44
40−Urbit is not endorsing Ethereum. Urbit is not creating any appreciable monetary
45+Urbit is not endorsing Ethereum. Urbit is not creating any appreciable monetary
41−demand for Ethereum. Urbit is not even locked in to Ethereum: with a fully
46+demand for Ethereum. Urbit is not even locked in to Ethereum: with a fully
42self-governing constitution, the Urbit galaxies can decide to migrate to another
47self-governing constitution, the Urbit galaxies can decide to migrate to another
43consensus engine, or no consensus engine, or even our own consensus engine, any
48consensus engine, or no consensus engine, or even our own consensus engine, any
44time we like.
49time we like.
@@ -46,20 +51,20 @@ time we like.
46And even if the whole Ethereum network unexpectedly implodes, and stops
51And even if the whole Ethereum network unexpectedly implodes, and stops
47generating meaningful new blocks, we (or more generally: the set of active
52generating meaningful new blocks, we (or more generally: the set of active
48Urbit galaxies) cannot abandon the social power to manually hard-fork the
53Urbit galaxies) cannot abandon the social power to manually hard-fork the
49−network. Ultimately, the Ethereum contract is just a hardcoded address in a
54+network. Ultimately, the Ethereum contract is just a hardcoded address in a
50piece of Urbit source code.
55piece of Urbit source code.
51
56
52Let's address each of these points at a little more length.
57Let's address each of these points at a little more length.
53
58
54## On moving to a blockchain
59## On moving to a blockchain
55
60
56−The first point to remember: our choice wasn't between Ethereum and nothing. It
61+The first point to remember: our choice wasn't between Ethereum and nothing. It
57−wasn't between a blockchain and nothing. It was a choice between 21st-century
62+wasn't between a blockchain and nothing. It was a choice between 21st-century
58tools and 20th-century tools.
63tools and 20th-century tools.
59
64
60The current Urbit land registry is divided into parts stored in various places:
65The current Urbit land registry is divided into parts stored in various places:
61GitHub commits, database records held by Tlon Corporation, and insecure keys on
66GitHub commits, database records held by Tlon Corporation, and insecure keys on
62−a test network. This might have been fine, for us, in 2015. In 2017, it's
67+a test network. This might have been fine, for us, in 2015. In 2017, it's
63borderline unacceptable.
68borderline unacceptable.
64
69
65## On choosing a chain
70## On choosing a chain
@@ -68,31 +73,31 @@ Our first decision point: whether the public chain enforces the rules of Urbit,
68or just logs raw data that anyone can interpret.
73or just logs raw data that anyone can interpret.
69
74
70The simplest procedure, with the strongest blockchain, would be just to encode
75The simplest procedure, with the strongest blockchain, would be just to encode
71−each Urbit event as raw (OP_RETURN) data on the Bitcoin blockchain. Or we could
76+each Urbit event as raw (OP_RETURN) data on the Bitcoin blockchain. Or we could
72use another simple layer on top of Bitcoin; classic "colored coins," for
77use another simple layer on top of Bitcoin; classic "colored coins," for
73instance.
78instance.
74
79
75The resemblance between Urbit land-registry titles and colored coins is one we
80The resemblance between Urbit land-registry titles and colored coins is one we
76−noticed a long time ago, of course. For a long time it wasn't that relevant,
81+noticed a long time ago, of course. For a long time it wasn't that relevant,
77because colored coins remained largely theoretical.
82because colored coins remained largely theoretical.
78
83
79The larger problem is just that a non-computational blockchain can't enforce the
84The larger problem is just that a non-computational blockchain can't enforce the
80specific rules of the Urbit land registry (like the right of a star to create
85specific rules of the Urbit land registry (like the right of a star to create
81specific planets).
86specific planets).
82
87
83−You can put arbitrary data into a blockchain and enforce it off-chain. This
88+You can put arbitrary data into a blockchain and enforce it off-chain. This
84−strikes us as unsatisfactory, though. For instance, you have to define the
89+strikes us as unsatisfactory, though. For instance, you have to define the
85−semantics of erroneous or malformed operations. If this is not done perfectly,
90+semantics of erroneous or malformed operations. If this is not done perfectly,
86−it's a short road to major weirdness. Also, your interpretation tools are a
91+it's a short road to major weirdness. Also, your interpretation tools are a
87special-purpose one-off not shared with anyone.
92special-purpose one-off not shared with anyone.
88
93
89There are other second-order "virtualchains" (Blockstack is one example), which
94There are other second-order "virtualchains" (Blockstack is one example), which
90build computation layers on top of arbitrary chains. These tools are interesting
95build computation layers on top of arbitrary chains. These tools are interesting
91−and cool. They are also quite young. As is Urbit, so we need all the maturity
96+and cool. They are also quite young. As is Urbit, so we need all the maturity
92we can get.
97we can get.
93
98
94Also, our use case, as a land registry, is quite simple -- we don't have any
99Also, our use case, as a land registry, is quite simple -- we don't have any
95−desire to pay (in complexity) for power we don't use. A two-layer solution
100+desire to pay (in complexity) for power we don't use. A two-layer solution
96just seems to leave more room for bad weirdness.
101just seems to leave more room for bad weirdness.
97
102
98## As normal Urbit state?
103## As normal Urbit state?
@@ -100,122 +105,122 @@ just seems to leave more room for bad weirdness.
100The original design was for Urbit to host its own primary copy of the PKI state,
105The original design was for Urbit to host its own primary copy of the PKI state,
101not mirror some external master.
106not mirror some external master.
102
107
103−As more people start believing in Urbit, this makes us extremely nervous. Being
108+As more people start believing in Urbit, this makes us extremely nervous. Being
104the single source of truth implies a strong commitment to security and
109the single source of truth implies a strong commitment to security and
105−continuity. Urbit needs to get there, but it isn't there yet.
110+continuity. Urbit needs to get there, but it isn't there yet.
106
111
107Trust in the security, continuity, and general maturity of Urbit needs to
112Trust in the security, continuity, and general maturity of Urbit needs to
108−develop gradually. An Urbit that isn't ready to store crypto-assets can still
113+develop gradually. An Urbit that isn't ready to store crypto-assets can still
109−be a great product. But it can't be a great product if its supposedly valuable
114+be a great product. But it can't be a great product if its supposedly valuable
110keys are in fact insecure, yet needed to operate on the network.
115keys are in fact insecure, yet needed to operate on the network.
111
116
112−In short: we can't follow this original plan. It has the same chicken-egg
117+In short: we can't follow this original plan. It has the same chicken-egg
113problem we discussed [last time](https://urbit.org/blog/2017.9.20-bootstrapping-urbit-from-ethereum/).
118problem we discussed [last time](https://urbit.org/blog/2017.9.20-bootstrapping-urbit-from-ethereum/).
114
119
115## An Urbit consensus engine?
120## An Urbit consensus engine?
116
121
117−Urbit is itself a deterministic computer. Building a consensus computer within
122+Urbit is itself a deterministic computer. Building a consensus computer within
118Urbit, which is actually a general-purpose OS, is an attractive long-term
123Urbit, which is actually a general-purpose OS, is an attractive long-term
119possibility.
124possibility.
120
125
121But Urbit lacks the principal feature of Ethereum: deterministic performance.
126But Urbit lacks the principal feature of Ethereum: deterministic performance.
122In both Ethereum and Urbit, the semantics of a computation are precisely
127In both Ethereum and Urbit, the semantics of a computation are precisely
123−defined. In Ethereum, the computation's cost is also precisely defined.
128+defined. In Ethereum, the computation's cost is also precisely defined.
124
129
125−This would be quite hard to do in Urbit. We traded deterministic performance
130+This would be quite hard to do in Urbit. We traded deterministic performance
126−off for semantic simplicity. Designing a consensus computer without a
131+off for semantic simplicity. Designing a consensus computer without a
127performance definition is a research problem.
132performance definition is a research problem.
128
133
129−We have solved a number of research problems here at Urbit. Could we build an
134+We have solved a number of research problems here at Urbit. Could we build an
130−Urbit blockchain? This problem doesn't seem utterly intractable. For instance,
135+Urbit blockchain? This problem doesn't seem utterly intractable. For instance,
131we could leverage the semi-trusted hierarchy in some direction resembling proof
136we could leverage the semi-trusted hierarchy in some direction resembling proof
132of stake.
137of stake.
133
138
134One thing is certain, though: research problems don't solve themselves
139One thing is certain, though: research problems don't solve themselves
135−overnight. If you have any ideas on this one, give us a holler.
140+overnight. If you have any ideas on this one, give us a holler.
136
141
137In any case, if Urbit got its own consensus engine, it's obvious that we'd
142In any case, if Urbit got its own consensus engine, it's obvious that we'd
138−simply copy the state of the Urbit PKI on Ethereum, and shut it down. Or we
143+simply copy the state of the Urbit PKI on Ethereum, and shut it down. Or we
139could migrate to another computational blockchain which works better than
144could migrate to another computational blockchain which works better than
140Ethereum.
145Ethereum.
141
146
142## An existing computational blockchain
147## An existing computational blockchain
143
148
144−So we need an existing, mature, computational blockchain. There are only two
149+So we need an existing, mature, computational blockchain. There are only two
145major candidates: ETH and ETC (Ethereum Classic).
150major candidates: ETH and ETC (Ethereum Classic).
146
151
147−It's no secret that we prefer the governance model of ETC. It's also no secret
152+It's no secret that we prefer the governance model of ETC. It's also no secret
148that the whole Ethereum system, especially Solidity, isn't exactly put together
153that the whole Ethereum system, especially Solidity, isn't exactly put together
149in the way we would do it.
154in the way we would do it.
150
155
151But an optimal governance model is just one virtue among many others we need to
156But an optimal governance model is just one virtue among many others we need to
152−consider. ETH's network capitalization is 25x that of ETC. Its hashrate is 15x.
157+consider. ETH's network capitalization is 25x that of ETC. Its hashrate is 15x.
153Its tooling support -- in software, hardware, vaulting, exchanging, etc -- is
158Its tooling support -- in software, hardware, vaulting, exchanging, etc -- is
154considerably stronger.
159considerably stronger.
155
160
156−ETC's governance model is Bitcoin's: code is law. For the network, this is
161+ETC's governance model is Bitcoin's: code is law. For the network, this is
157−better. But we are considering threats to Urbit, not threats to the rest of
162+better. But we are considering threats to Urbit, not threats to the rest of
158Ethereum.
163Ethereum.
159
164
160−ETH has embraced discretionary human governance. It's quite plausible that this
165+ETH has embraced discretionary human governance. It's quite plausible that this
161−will lead to total political collapse. But the human political structure of ETH
166+will lead to total political collapse. But the human political structure of ETH
162−seems reasonably strong at the moment. It's relatively difficult to imagine
167+seems reasonably strong at the moment. It's relatively difficult to imagine
163−successful, near-term "proof of Vitalik" attacks via Ethereum on Urbit. Political
168+successful, near-term "proof of Vitalik" attacks via Ethereum on Urbit. Political
164conflict tends to develop over longer periods of time, giving us room to migrate.
169conflict tends to develop over longer periods of time, giving us room to migrate.
165
170
166Ultimately we decided that the minority power of ETC outweighs the governance
171Ultimately we decided that the minority power of ETC outweighs the governance
167−issues with ETH. This is of course how imperfect standards win. Betamax had
172+issues with ETH. This is of course how imperfect standards win. Betamax had
168better resolution than VHS.
173better resolution than VHS.
169
174
170## One reminder
175## One reminder
171
176
172For Bitcoin maximalists in particular (some of our best friends are Bitcoin
177For Bitcoin maximalists in particular (some of our best friends are Bitcoin
173maximalists), it's important to note that (besides the gas price of
178maximalists), it's important to note that (besides the gas price of
174−transactions) putting Urbit on Ethereum *does not create any net monetary demand
179+transactions) putting Urbit on Ethereum _does not create any net monetary demand
175−for Ethereum*.
180+for Ethereum_.
176
181
177−Yes, you will get an Urbit ship through an Ethereum transaction. However, no
182+Yes, you will get an Urbit ship through an Ethereum transaction. However, no
178−value stays in ether. If you want to buy a ship with bitcoin, you are just
183+value stays in ether. If you want to buy a ship with bitcoin, you are just
179−going through a conversion layer. These conversion layers work pretty well
184+going through a conversion layer. These conversion layers work pretty well
180−these days. If you have a religious objection to handling altcoins, have a
185+these days. If you have a religious objection to handling altcoins, have a
181friend help.
186friend help.
182
187
183Bitcoin maximalists understand that all monetary energy should concentrate in a
188Bitcoin maximalists understand that all monetary energy should concentrate in a
184−single currency. But land isn't money. And the technical details of the
189+single currency. But land isn't money. And the technical details of the
185implementation of the Urbit registry -- whether `OP_RETURN`, Ethereum, or GitHub
190implementation of the Urbit registry -- whether `OP_RETURN`, Ethereum, or GitHub
186-- have no effect on Bitcoin supply and demand.
191-- have no effect on Bitcoin supply and demand.
187
192
188## Another reminder
193## Another reminder
189
194
190−Ethereum is not using Urbit. Urbit is using Ethereum. We know every cool
195+Ethereum is not using Urbit. Urbit is using Ethereum. We know every cool
191alternative band that gets signed to a major label says this, but we mean it.
196alternative band that gets signed to a major label says this, but we mean it.
192
197
193Urbit, as a land registry, is almost a textbook example of very weak, boring use
198Urbit, as a land registry, is almost a textbook example of very weak, boring use
194−of a computational blockchain. We're not expecting a lot out of Ethereum.
199+of a computational blockchain. We're not expecting a lot out of Ethereum.
195Ethereum does not feel like a system whose technical envelope should be pushed.
200Ethereum does not feel like a system whose technical envelope should be pushed.
196We have no intention of pushing it.
201We have no intention of pushing it.
197
202
198Moreover, the ability to vote formally in an Ethereum constitution will allow us
203Moreover, the ability to vote formally in an Ethereum constitution will allow us
199−to migrate in a cohesive way to *any other formalization of the Urbit PKI*.
204+to migrate in a cohesive way to _any other formalization of the Urbit PKI_.
200−This could be another Ethereum contract. Or another blockchain.
205+This could be another Ethereum contract. Or another blockchain.
201
206
202This "clean escape" implies that Ethereum is still operating normally, or at
207This "clean escape" implies that Ethereum is still operating normally, or at
203−least normally enough to conduct a galaxy vote. What could happen to Ethereum?
208+least normally enough to conduct a galaxy vote. What could happen to Ethereum?
204The blockchain could stop generating new blocks; it could fork; it could be
209The blockchain could stop generating new blocks; it could fork; it could be
205−filtered by some kind of collective attacker; it could even start accepting invalid transactions. What seems implausible is destruction of all copies of the whole chain.
210+filtered by some kind of collective attacker; it could even start accepting invalid transactions. What seems implausible is destruction of all copies of the whole chain.
206
211
207When Ethereum ceases to be functional or trustworthy for any reason, a "dirty
212When Ethereum ceases to be functional or trustworthy for any reason, a "dirty
208−escape" becomes necessary. The galaxy operators need to identify the last point
213+escape" becomes necessary. The galaxy operators need to identify the last point
209in the Ethereum chain at which the Urbit constitution remains valid, copy that
214in the Ethereum chain at which the Urbit constitution remains valid, copy that
210data to the new primary record, and resume from there.
215data to the new primary record, and resume from there.
211
216
212But unlike other blockchains that have wrestled with human-centric governance,
217But unlike other blockchains that have wrestled with human-centric governance,
213−Urbit still has a formal procedure for making this decision. With the Ethereum
218+Urbit still has a formal procedure for making this decision. With the Ethereum
214chain compromised, we no longer have an automated system that implements the
219chain compromised, we no longer have an automated system that implements the
215−rules. The rules remain, though. Humans have spent thousands of years
220+rules. The rules remain, though. Humans have spent thousands of years
216following non-automated rules.
221following non-automated rules.
217
222
218−Basically, we're just using ETH as a self-validating ownership record. So long
223+Basically, we're just using ETH as a self-validating ownership record. So long
219as the chain isn't destroyed and owners retain their secrets, Urbit retains the
224as the chain isn't destroyed and owners retain their secrets, Urbit retains the
220power to migrate to any record that works better.
225power to migrate to any record that works better.
221
226
@@ -229,30 +234,30 @@ the Urbit PKI at all.
229
234
230In Urbit, if your parent galaxy is sending you fraudulent reports about the
235In Urbit, if your parent galaxy is sending you fraudulent reports about the
231blockchain (any blockchain), you have a very serious problem which goes way
236blockchain (any blockchain), you have a very serious problem which goes way
232−past blockchains. It's time to switch galaxies.
237+past blockchains. It's time to switch galaxies.
233
238
234The trust relationship between an urbit and its parent is like the trust
239The trust relationship between an urbit and its parent is like the trust
235−relationship between you and a gas station. For all you know, what's coming
240+relationship between you and a gas station. For all you know, what's coming
236−out of the hose could be Welch's grape juice. But why have you never, ever worried about cheap surplus vegetable products destroying your engine?
241+out of the hose could be Welch's grape juice. But why have you never, ever worried about cheap surplus vegetable products destroying your engine?
237
242
238−ExxonMobil has no business motivation to ruin its customers' engines. If it
243+ExxonMobil has no business motivation to ruin its customers' engines. If it
239−did, it would just destroy its business, and gain… what? If you don't have an
244+did, it would just destroy its business, and gain… what? If you don't have an
240−attack motivation, you don't have a threat model. If you don't have a threat
245+attack motivation, you don't have a threat model. If you don't have a threat
241−model, you don't have a threat. This is why we don't tend to worry about
246+model, you don't have a threat. This is why we don't tend to worry about
242"parent attacks" in Urbit.
247"parent attacks" in Urbit.
243
248
244But that said: there's no reason not to make Urbit's cryptographic structure as
249But that said: there's no reason not to make Urbit's cryptographic structure as
245−strong as possible. If you don't want to trust your gas station -- you
250+strong as possible. If you don't want to trust your gas station -- you
246−shouldn't have to. We don't need to eliminate reliance on trust. We do prefer
251+shouldn't have to. We don't need to eliminate reliance on trust. We do prefer
247−to *minimize* it.
252+to _minimize_ it.
248
253
249Therefore, the Urbit Ethereum mirror needs to track all the Ethereum
254Therefore, the Urbit Ethereum mirror needs to track all the Ethereum
250transactions that touch the Urbit constitution, and propagate these raw
255transactions that touch the Urbit constitution, and propagate these raw
251−transactions into Urbit. Urbit nodes can check the transactions and their
256+transactions into Urbit. Urbit nodes can check the transactions and their
252−signatures themselves, without relying on Ethereum. Then, anyone in Urbit can
257+signatures themselves, without relying on Ethereum. Then, anyone in Urbit can
253validate the Urbit PKI without an Ethereum node.
258validate the Urbit PKI without an Ethereum node.
254
259
255−(We don't anticipate running a node *in* Urbit, eg an EVM in Hoon -- for now,
260+(We don't anticipate running a node _in_ Urbit, eg an EVM in Hoon -- for now,
256galaxies will just RPC to a local Unix node.)
261galaxies will just RPC to a local Unix node.)
257
262
258## And in closing
263## And in closing
@@ -260,7 +265,7 @@ galaxies will just RPC to a local Unix node.)
260We appreciate everyone's feedback and hope no one remains confused.
265We appreciate everyone's feedback and hope no one remains confused.
261
266
262We're happy to address any remaining concerns -- and happier still if someone
267We're happy to address any remaining concerns -- and happier still if someone
263−finds a mistake on our end. If you have a good counterargument, now is better
268+finds a mistake on our end. If you have a good counterargument, now is better
264than later!
269than later!
265
270
266Fora thread for discussion is here:
271Fora thread for discussion is here:
content/blog/urbit-for-normies.md+56−57
@@ -1,55 +1,55 @@
1+++
1+++
2title = "Urbit for Normies"
2title = "Urbit for Normies"
3−date = 2020-02-12
3+date = "2020-02-11"
4description = "A layperson’s guide to the coming new internet."
4description = "A layperson’s guide to the coming new internet."
5+
5[extra]
6[extra]
6author = "Erik Newton"
7author = "Erik Newton"
7ship = "~patnes-rigtyn"
8ship = "~patnes-rigtyn"
8−image ="https://media.urbit.org/site/posts/essays/normies-2.png"
9+image = "https://media.urbit.org/site/posts/essays/normies-2.png"
9+++
10+++
10
11
11Urbit is a challenging project to fully describe because, rather than a single product, it’s an entire system. Often when I talk about one of the individual elements of the system, someone will tell me that another company is already building that — and they’re usually right. What sets Urbit apart is that we’re building all these elements at once to work together seamlessly.
12Urbit is a challenging project to fully describe because, rather than a single product, it’s an entire system. Often when I talk about one of the individual elements of the system, someone will tell me that another company is already building that — and they’re usually right. What sets Urbit apart is that we’re building all these elements at once to work together seamlessly.
12
13
13−For that reason, this overview is long. I wanted to explain, at a very high level, as much of the system as possible, to share an image of the entire forest rather than spending too much time on any of the trees.
14+For that reason, this overview is long. I wanted to explain, at a very high level, as much of the system as possible, to share an image of the entire forest rather than spending too much time on any of the trees.
14
15
15My own path to Urbit was not predictable, so it turns out I’m a useful ambassador to describe what the heck we’re doing to my fellow normies.
16My own path to Urbit was not predictable, so it turns out I’m a useful ambassador to describe what the heck we’re doing to my fellow normies.
16
17
17I refer to myself as a normie because I’m a lawyer by training, not the typical code-savvy early Urbit adopter. I ran a law firm and, after retiring, founded a podcast and magazine about relationship dynamics. During that time I came to believe that humanity was in desperate need of better ways to relate. I didn’t know how, but I knew that my podcast about romance wasn’t going to move the needle. I began to look for a bigger project. I wanted something I truly could invest myself in; something that could have a real impact on this problem.
18I refer to myself as a normie because I’m a lawyer by training, not the typical code-savvy early Urbit adopter. I ran a law firm and, after retiring, founded a podcast and magazine about relationship dynamics. During that time I came to believe that humanity was in desperate need of better ways to relate. I didn’t know how, but I knew that my podcast about romance wasn’t going to move the needle. I began to look for a bigger project. I wanted something I truly could invest myself in; something that could have a real impact on this problem.
18
19
19−That’s when a friend introduced me to Urbit. Saying it was the most credible project he’d seen in years, he described it as “an open-source decentralized internet project,” and that it “would give control of computing back to regular people.” That sparked my interest, but I didn’t totally understand it. After looking over the website and watching a couple of obscure descriptive videos on YouTube my response was threefold:
20+That’s when a friend introduced me to Urbit. Saying it was the most credible project he’d seen in years, he described it as “an open-source decentralized internet project,” and that it “would give control of computing back to regular people.” That sparked my interest, but I didn’t totally understand it. After looking over the website and watching a couple of obscure descriptive videos on YouTube my response was threefold:
20
21
21−1) **This is huge** — if it actually works, it’s the future.
22+1. **This is huge** — if it actually works, it’s the future.
22−2) **This is real** — It’s got working code, dozens of engineers, and a very unorthodox solution.
23+2. **This is real** — It’s got working code, dozens of engineers, and a very unorthodox solution.
23−3) **I don’t truly understand this** — I can’t read the code, and I can barely comprehend the paradigm shift.
24+3. **I don’t truly understand this** — I can’t read the code, and I can barely comprehend the paradigm shift.
24
25
25So of course I asked for an intro.
26So of course I asked for an intro.
26
27
27−Fast forward: I ended up becoming COO at Tlon, the primary developer of Urbit. Urbit is exactly the sort of project I was looking for — one that represents an important promise for humanity. But, boy, did I have to fake my way through the technical elements of my new job those first few months.
28+Fast forward: I ended up becoming COO at Tlon, the primary developer of Urbit. Urbit is exactly the sort of project I was looking for — one that represents an important promise for humanity. But, boy, did I have to fake my way through the technical elements of my new job those first few months.
28
29
29−What I eventually came to realize is that if Urbit is only accessible to programmers, it’s dead on arrival. In order to be useful, Urbit has to be understandable by the non-technical user. Like me. And maybe like you.
30+What I eventually came to realize is that if Urbit is only accessible to programmers, it’s dead on arrival. In order to be useful, Urbit has to be understandable by the non-technical user. Like me. And maybe like you.
30
31
31I understand as well as anyone how complicated Urbit can appear. But, fundamentally, Urbit is quite simple and it promises a critical upgrade to human interaction. That might sound like hyperbole but it’s the reason I work here. This is my attempt to explain to fellow normies the scope and scale of this world-changing project called Urbit.
32I understand as well as anyone how complicated Urbit can appear. But, fundamentally, Urbit is quite simple and it promises a critical upgrade to human interaction. That might sound like hyperbole but it’s the reason I work here. This is my attempt to explain to fellow normies the scope and scale of this world-changing project called Urbit.
32
33
33−
34## What is Urbit?
34## What is Urbit?
35
35
36Let’s take this one step at a time and start with the most basic definition:
36Let’s take this one step at a time and start with the most basic definition:
37
37
38−Urbit is a peer-to-peer internet being built from scratch to be more private, secure, and durable than the current internet.
38+Urbit is a peer-to-peer internet being built from scratch to be more private, secure, and durable than the current internet.
39
39
40At its most basic level, an Urbit is:
40At its most basic level, an Urbit is:
41
41
42−1) A super-private computer, combined with
42+1. A super-private computer, combined with
43−2) an ID, which is
43+2. an ID, which is
44−3) connected peer-to-peer with other Urbit computers.
44+3. connected peer-to-peer with other Urbit computers.
45
45
46−Taking that a half-step deeper, each Urbit user gets a permanent identity, which allows them to access their personal computer in the cloud, and then talk to directly with other Urbit computers (i.e. other people) on the network, all without using an intermediary.
46+Taking that a half-step deeper, each Urbit user gets a permanent identity, which allows them to access their personal computer in the cloud, and then talk to directly with other Urbit computers (i.e. other people) on the network, all without using an intermediary.
47
47
48When I say “computer” I’m not talking about a physical device, but rather the software that computes. Urbit is a virtual computer, not a hardware device. Today that means you can access your Urbit computer from anywhere, on just about any device with a web browser. Eventually you won’t even need the web browser.
48When I say “computer” I’m not talking about a physical device, but rather the software that computes. Urbit is a virtual computer, not a hardware device. Today that means you can access your Urbit computer from anywhere, on just about any device with a web browser. Eventually you won’t even need the web browser.
49
49
50By “intermediary” I’m talking about all those centralized servers that we use every day to do our computing. Servers owned by Google, Facebook, YouTube, Instagram, Twitter, Slack, Amazon, Nest, Apple, and so on. All of these companies and products keep close tabs on our activity and use that information to sell us things and influence our opinions. Everything we do online is watched and recorded.
50By “intermediary” I’m talking about all those centralized servers that we use every day to do our computing. Servers owned by Google, Facebook, YouTube, Instagram, Twitter, Slack, Amazon, Nest, Apple, and so on. All of these companies and products keep close tabs on our activity and use that information to sell us things and influence our opinions. Everything we do online is watched and recorded.
51
51
52−Urbit will fundamentally change that — more about the privacy implications later.
52+Urbit will fundamentally change that — more about the privacy implications later.
53
53
54<img class="ba" src="https://media.urbit.org/site/posts/essays/normies-1.png">
54<img class="ba" src="https://media.urbit.org/site/posts/essays/normies-1.png">
55
55
@@ -57,121 +57,120 @@ Urbit will fundamentally change that — more about the privacy implications lat
57
57
58Another way of explaining Urbit is to describe how it feels and looks. Visually, Urbit belongs to a genre often called “calm computing.” Urbit is designed to be simple, basic, and non-addictive. You won’t find any flashy-blinky lights here; no zany colors; no wacky branding. Just calm, functional, purpose-built tools for people to connect and work together. (One of my favorite examples of calm computing is the [light phone](https://www.thelightphone.com/).)
58Another way of explaining Urbit is to describe how it feels and looks. Visually, Urbit belongs to a genre often called “calm computing.” Urbit is designed to be simple, basic, and non-addictive. You won’t find any flashy-blinky lights here; no zany colors; no wacky branding. Just calm, functional, purpose-built tools for people to connect and work together. (One of my favorite examples of calm computing is the [light phone](https://www.thelightphone.com/).)
59
59
60−Today Urbit’s interface looks like a tab in your web browser that has some limited functionality (chat, a weather app, a notebook, link sharing). Soon, you won’t even need the web browser — you’ll be able to access or run Urbit directly in its own window. Inside will be a super clean interface with all the functionality you might want from your computer, in one place and with one login (think document creation, email, social media access, accounting) — but it will run on your virtual Urbit computer, so it will be safe from corporate prying and data leaks, available on any device, and all inside one simple interface.
60+Today Urbit’s interface looks like a tab in your web browser that has some limited functionality (chat, a weather app, a notebook, link sharing). Soon, you won’t even need the web browser — you’ll be able to access or run Urbit directly in its own window. Inside will be a super clean interface with all the functionality you might want from your computer, in one place and with one login (think document creation, email, social media access, accounting) — but it will run on your virtual Urbit computer, so it will be safe from corporate prying and data leaks, available on any device, and all inside one simple interface.
61
61
62## What it’s for
62## What it’s for
63
63
64−Fundamentally, Urbit is neutral open-source infrastructure, so it can be for many things. From our highest level perspective Urbit is computing for real communities and normal people, not for corporations. To make that real, Urbit focuses on delivering a computing experience that is secure, private, durable, and calm.
64+Fundamentally, Urbit is neutral open-source infrastructure, so it can be for many things. From our highest level perspective Urbit is computing for real communities and normal people, not for corporations. To make that real, Urbit focuses on delivering a computing experience that is secure, private, durable, and calm.
65
65
66−For me, Urbit’s core purpose is to give us all back our privacy and our autonomy. It’s time for humanity to control its tools rather than the other way around.
66+For me, Urbit’s core purpose is to give us all back our privacy and our autonomy. It’s time for humanity to control its tools rather than the other way around.
67
67
68## Key elements
68## Key elements
69
69
70−One potential barrier to understanding Urbit is that we’re building out multiple layers of this new internet simultaneously, and each has its own explanations and value propositions. Remember, what sets Urbit apart is that we’re building of all these elements at once to work together as a system.
70+One potential barrier to understanding Urbit is that we’re building out multiple layers of this new internet simultaneously, and each has its own explanations and value propositions. Remember, what sets Urbit apart is that we’re building of all these elements at once to work together as a system.
71
71
72I’ll try to explain the most important of these without straying too deep into the technical weeds.
72I’ll try to explain the most important of these without straying too deep into the technical weeds.
73
73
741. **A peer-to-peer network**
741. **A peer-to-peer network**
75
75
76− Peer-to-peer networking is a really big deal. On the current internet, essentially all of our communications and activities go through centralized servers owned by corporations (Facebook, Google, etc.) — and those corporations can’t help but use all that information to make money. They’re capitalists, after all, and so we get constant privacy violations and interfaces built for maximum dopamine addiction.
76+ Peer-to-peer networking is a really big deal. On the current internet, essentially all of our communications and activities go through centralized servers owned by corporations (Facebook, Google, etc.) — and those corporations can’t help but use all that information to make money. They’re capitalists, after all, and so we get constant privacy violations and interfaces built for maximum dopamine addiction.
77
77
78− In an Urbit world, all those communications go directly between users (i.e. peer-to-peer) with nobody in the middle. That means there’s no data capture by any megacorp, less intrusion into your life online, and communications go back to the semi-private one-to-one or small group format that is most comfortable for humans. It’s more like real life.
78+ In an Urbit world, all those communications go directly between users (i.e. peer-to-peer) with nobody in the middle. That means there’s no data capture by any megacorp, less intrusion into your life online, and communications go back to the semi-private one-to-one or small group format that is most comfortable for humans. It’s more like real life.
79
79
802. **Your own server**
802. **Your own server**
81
81
82− Servers are complicated. Too complicated. Have you ever tried to use a command line? Exactly. It’s a terrible way to work, and that’s just a hint at how complex servers are to operate. To hide that complexity, we let corporations run our servers for us — they can afford teams of engineers. The problem is that today most of our computing is handled by these corporate servers — and that means we’re giving up control because of complexity.
82+ Servers are complicated. Too complicated. Have you ever tried to use a command line? Exactly. It’s a terrible way to work, and that’s just a hint at how complex servers are to operate. To hide that complexity, we let corporations run our servers for us — they can afford teams of engineers. The problem is that today most of our computing is handled by these corporate servers — and that means we’re giving up control because of complexity.
83
83
84− As an example, every time you use Siri, your message is sent to Apple’s servers, where it is processed, and the response is sent back to you (which is admittedly amazing). Unfortunately that’s why it never works if you’re offline, and it’s also why Apple knows what you’re saying to Siri. And this applies to all the apps we use: The actual computing happens on corporate servers. The problem is that we consumers aren’t in control and, again, the corporate entities watch, record, and gate-keep all of our activity.
84+ As an example, every time you use Siri, your message is sent to Apple’s servers, where it is processed, and the response is sent back to you (which is admittedly amazing). Unfortunately that’s why it never works if you’re offline, and it’s also why Apple knows what you’re saying to Siri. And this applies to all the apps we use: The actual computing happens on corporate servers. The problem is that we consumers aren’t in control and, again, the corporate entities watch, record, and gate-keep all of our activity.
85
85
86− Fundamentally, Urbit is a super simple server. That means Urbit can run those computations and hold all that data for you, eliminating the need for a corporate intermediary.
86+ Fundamentally, Urbit is a super simple server. That means Urbit can run those computations and hold all that data for you, eliminating the need for a corporate intermediary.
87
87
883. **Permanent, personal ownership of your digital identity and all your data**
883. **Permanent, personal ownership of your digital identity and all your data**
89
89
90− Urbit IDs are permanently ownable — and that ownership is backed by cryptography, not some corporate database. Once you take possession of your Urbit ID, no central authority can ever take it away from you. Sure, if you start spamming people on the network, word could get around and you might get blocked by other users, but none of them can prevent you from using your ID or accessing your Urbit computer. Compare that to the current internet where Facebook owns your Facebook profile, Google owns your Gmail account, Twitter owns your Twitter handle, etc. At any time and for any reason, those services can arbitrarily shut off your access, and you have little to no recourse — all that data, all those followers, and all that reputation is wiped out instantly. Your Urbit, on the other hand — both the identity, and all the data inside your Urbit computer — is yours permanently, so long as you know your secret key.
90+ Urbit IDs are permanently ownable — and that ownership is backed by cryptography, not some corporate database. Once you take possession of your Urbit ID, no central authority can ever take it away from you. Sure, if you start spamming people on the network, word could get around and you might get blocked by other users, but none of them can prevent you from using your ID or accessing your Urbit computer. Compare that to the current internet where Facebook owns your Facebook profile, Google owns your Gmail account, Twitter owns your Twitter handle, etc. At any time and for any reason, those services can arbitrarily shut off your access, and you have little to no recourse — all that data, all those followers, and all that reputation is wiped out instantly. Your Urbit, on the other hand — both the identity, and all the data inside your Urbit computer — is yours permanently, so long as you know your secret key.
91
91
92− A secure decentralized identity system like the one we’ve built leads to some very interesting use cases that are otherwise insurmountable. For example: decentralized Uber, decentralized delivery services, and a solid solution to the problem of fake reviews. To build any of these services, the problem of permanent identity needs to be solved first, and we’ve done that as part of our overall system. I’ll spend more time on use cases below.
92+ A secure decentralized identity system like the one we’ve built leads to some very interesting use cases that are otherwise insurmountable. For example: decentralized Uber, decentralized delivery services, and a solid solution to the problem of fake reviews. To build any of these services, the problem of permanent identity needs to be solved first, and we’ve done that as part of our overall system. I’ll spend more time on use cases below.
93
93
94− It’s worth noting that this problem has never been solved before. All of our communication channels on the internet today rely on someone else to authenticate our identity. Urbit is — to my knowledge — the first practical application of a decentralized ID system that actually works.
94+ It’s worth noting that this problem has never been solved before. All of our communication channels on the internet today rely on someone else to authenticate our identity. Urbit is — to my knowledge — the first practical application of a decentralized ID system that actually works.
95
95
96−4. **An incentive for good behavior**
96+4. **An incentive for good behavior**
97
97
98− On the Urbit network, identities are finite, and they accrue reputation. Compare that to the current internet where identity is infinite (anyone can create as many email addresses or social media profiles as they want, essentially for free) and so spam, scams, and DoS attacks (“denial-of-service”: when many disposable identities ‘attack’ a server at the same time) are rampant. On the Urbit network, there are just over 4 billion total IDs (2<sup>32</sup> to be exact). Scarcity creates value. That scarcity, combined with reputation accrual, means there's an incentive for good behavior.
98+ On the Urbit network, identities are finite, and they accrue reputation. Compare that to the current internet where identity is infinite (anyone can create as many email addresses or social media profiles as they want, essentially for free) and so spam, scams, and DoS attacks (“denial-of-service”: when many disposable identities ‘attack’ a server at the same time) are rampant. On the Urbit network, there are just over 4 billion total IDs (2<sup>32</sup> to be exact). Scarcity creates value. That scarcity, combined with reputation accrual, means there's an incentive for good behavior.
99
99
100− You might think 4 billion IDs sounds like too few given how many humans we have on the planet. I won’t go into the technical details here, but if we ever get to the point where that’s a problem (which would be a great problem to have), we’ve outlined several solutions that allow everyone alive to get on the network. We don’t intend to lock anyone out.
100+ You might think 4 billion IDs sounds like too few given how many humans we have on the planet. I won’t go into the technical details here, but if we ever get to the point where that’s a problem (which would be a great problem to have), we’ve outlined several solutions that allow everyone alive to get on the network. We don’t intend to lock anyone out.
101
101
1025. **Tools anyone can learn and use**
1025. **Tools anyone can learn and use**
103
103
104− Urbit is a system that anyone with patience can understand completely from top to bottom, from the integers of byte code to the complete OS and everything in between. Urbit in its entirety is just over 50,000 lines of code. That is tiny. Compare that to Linux (the open-source OS that most modern computing is built upon), which is tens of millions of lines of code, and you start to see how important this is for efficiency. Apple’s and Windows’ codebases are similarly massive. In our current computing system, nobody can understand the entire thing completely, and that means there are innumerable security holes. With Urbit, while it may demand something of you, any reasonably intelligent developer can grasp the whole thing. We’ve worked very hard to keep our system simple at each level. That makes it more efficient, more durable, and much more secure.
104+ Urbit is a system that anyone with patience can understand completely from top to bottom, from the integers of byte code to the complete OS and everything in between. Urbit in its entirety is just over 50,000 lines of code. That is tiny. Compare that to Linux (the open-source OS that most modern computing is built upon), which is tens of millions of lines of code, and you start to see how important this is for efficiency. Apple’s and Windows’ codebases are similarly massive. In our current computing system, nobody can understand the entire thing completely, and that means there are innumerable security holes. With Urbit, while it may demand something of you, any reasonably intelligent developer can grasp the whole thing. We’ve worked very hard to keep our system simple at each level. That makes it more efficient, more durable, and much more secure.
105
105
1066. **Lessons from the last half century**
1066. **Lessons from the last half century**
107
107
108− Bear with me — this is where some jargon kicks in. In many ways, Urbit is an attempt to apply lessons learned from the failures of 20th century computer development. From an engineer’s perspective, Urbit solves a series of problems that we end users rarely notice, but which cause extraordinary amounts of complexity and waste. The list of applied lessons is long, but rather than bullet them all, I’ll explain the one that surprised me the most.
108+ Bear with me — this is where some jargon kicks in. In many ways, Urbit is an attempt to apply lessons learned from the failures of 20th century computer development. From an engineer’s perspective, Urbit solves a series of problems that we end users rarely notice, but which cause extraordinary amounts of complexity and waste. The list of applied lessons is long, but rather than bullet them all, I’ll explain the one that surprised me the most.
109
109
110− Urbit is deterministic. That is, a given sequence of inputs always produces the same output. When I first heard that, I thought, “Wait, isn’t that what all operating systems do? Give you the same result every time?” Weirdly, the answer is no. Normal operating systems don’t work this way. Normal modern operating systems actually get varying results when they compute things. This is a deep problem that causes programmers countless hours of frustration. The most common implication of this that you’ve probably experienced is having to reboot your computer — either because it’s locked up, or because it simply won’t do something that it was totally doing a second ago. What’s annoying to a regular user, though, is absolutely crazy-making to developers.
110+ Urbit is deterministic. That is, a given sequence of inputs always produces the same output. When I first heard that, I thought, “Wait, isn’t that what all operating systems do? Give you the same result every time?” Weirdly, the answer is no. Normal operating systems don’t work this way. Normal modern operating systems actually get varying results when they compute things. This is a deep problem that causes programmers countless hours of frustration. The most common implication of this that you’ve probably experienced is having to reboot your computer — either because it’s locked up, or because it simply won’t do something that it was totally doing a second ago. What’s annoying to a regular user, though, is absolutely crazy-making to developers.
111
111
112− This determinism makes programming on an Urbit immensely more efficient than other environments.
112+ This determinism makes programming on an Urbit immensely more efficient than other environments.
113+
114+ Urbit applies this and a whole list of other lessons from the past half-century of systems software to increase reliability and security in everything from file storage to networking to user-facing apps. All this adds up to more security and reliability and less service-lock-in with Urbit than with our current systems.
113
115
114− Urbit applies this and a whole list of other lessons from the past half-century of systems software to increase reliability and security in everything from file storage to networking to user-facing apps. All this adds up to more security and reliability and less service-lock-in with Urbit than with our current systems.
115−
1167. **Private, human-sized, and efficient**
1167. **Private, human-sized, and efficient**
117
117
118− Because Urbit isn’t centralized or owned by any one company, there’s no incentive for it to dominate your life. Your Urbit isn’t designed to spy on you, get you addicted to clicking its buttons, manipulate your emotions to gain attention, or nudge you to buy something. Your Urbit is a simple, customizable, permanent place for you to do all your computer-based tasks with your friends in absolute privacy.
118+ Because Urbit isn’t centralized or owned by any one company, there’s no incentive for it to dominate your life. Your Urbit isn’t designed to spy on you, get you addicted to clicking its buttons, manipulate your emotions to gain attention, or nudge you to buy something. Your Urbit is a simple, customizable, permanent place for you to do all your computer-based tasks with your friends in absolute privacy.
119
119
120− This is so much the case, in fact, that it presents a bit of a problem for Tlon. We don’t know how many people use Urbit every day, who they talk to, or what they’re doing. While we think this is how things should be, it puts us in a bind when a VC wants to know about our user base; we can only make educated guesses. That said, we think this is the right problem to have.
120+ This is so much the case, in fact, that it presents a bit of a problem for Tlon. We don’t know how many people use Urbit every day, who they talk to, or what they’re doing. While we think this is how things should be, it puts us in a bind when a VC wants to know about our user base; we can only make educated guesses. That said, we think this is the right problem to have.
121
121
122− What all this adds up to is that the Urbit network is immensely more resource efficient, secure, easier to customize, and smaller in size than any other computing system in the world. If you care about data security, privacy, durability, or even just elegance, Urbit has the best design going.
122+ What all this adds up to is that the Urbit network is immensely more resource efficient, secure, easier to customize, and smaller in size than any other computing system in the world. If you care about data security, privacy, durability, or even just elegance, Urbit has the best design going.
123
123
124− <br></br>
124+ <br></br>
125
125
126<img class="ba" src="https://media.urbit.org/site/posts/essays/normies-2.png">
126<img class="ba" src="https://media.urbit.org/site/posts/essays/normies-2.png">
127
127
128## How it compares
128## How it compares
129
129
130−A final way to understand Urbit is to make comparisons between Urbit and current products we use today. This is limited, because ultimately Urbit will grow in directions we can’t predict, but comparisons are a useful starting place.
130+A final way to understand Urbit is to make comparisons between Urbit and current products we use today. This is limited, because ultimately Urbit will grow in directions we can’t predict, but comparisons are a useful starting place.
131
131
132Again, on the current internet, we all access megacorp software using our web browsers and app interfaces. This means that we each exist as a line in a megacorp database, and those megacorps use that data to make money, which results in rampant privacy violations and addictive interfaces. Urbit is the alternative to all that: it’s decentralized, private, and secure. And it’s yours.
132Again, on the current internet, we all access megacorp software using our web browsers and app interfaces. This means that we each exist as a line in a megacorp database, and those megacorps use that data to make money, which results in rampant privacy violations and addictive interfaces. Urbit is the alternative to all that: it’s decentralized, private, and secure. And it’s yours.
133
133
134−Let’s get to some real-world examples.
134+Let’s get to some real-world examples.
135−
136
135
137## Urbit vs. Reddit
136## Urbit vs. Reddit
138
137
139−Imagine you’d like to discuss a certain research topic with a group of friends. Say, Canadian small cap equities or the best cookie recipes. You’ll need a chat interface for live discussion, a notebook to record concepts, and a way to share links for discussion. You can do this in the default web if you want: use Reddit for the links (but make sure it’s a private group), use Google Docs for the notebook (but make sure everyone has Gmail), and use iMessage for the chat (but everyone needs a Mac). And don’t forget, each service has their own login and security holes, and they’re all mining your data.
138+Imagine you’d like to discuss a certain research topic with a group of friends. Say, Canadian small cap equities or the best cookie recipes. You’ll need a chat interface for live discussion, a notebook to record concepts, and a way to share links for discussion. You can do this in the default web if you want: use Reddit for the links (but make sure it’s a private group), use Google Docs for the notebook (but make sure everyone has Gmail), and use iMessage for the chat (but everyone needs a Mac). And don’t forget, each service has their own login and security holes, and they’re all mining your data.
140
139
141−The alternative is spin up a group on Urbit. All of that functionality is available today in one clean, simple interface. It’s private, you own the data, there’s only one login, and you can even learn to build apps for your group.
140+The alternative is spin up a group on Urbit. All of that functionality is available today in one clean, simple interface. It’s private, you own the data, there’s only one login, and you can even learn to build apps for your group.
142
141
143## Urbit vs. Facebook, Twitter, etc.
142## Urbit vs. Facebook, Twitter, etc.
144
143
145−Or let’s say you want to share pictures with your friends, post micro-messages to the world, write a blog, or share a podcast. There’s simply no reason you should use some centralized company (one that then owns your content) to broadcast any of those things. Instead, send it out from your Urbit. You’ll own the content, you’ll control the data, no company will spy on you, and nobody can ever take your ID from you. With Urbit we all finally own the tools, and that means we own the data by default.
144+Or let’s say you want to share pictures with your friends, post micro-messages to the world, write a blog, or share a podcast. There’s simply no reason you should use some centralized company (one that then owns your content) to broadcast any of those things. Instead, send it out from your Urbit. You’ll own the content, you’ll control the data, no company will spy on you, and nobody can ever take your ID from you. With Urbit we all finally own the tools, and that means we own the data by default.
146
145
147## Urbit vs. Nest
146## Urbit vs. Nest
148
147
149−Imagine, as I do, that you want a connected video camera in your house, but don’t want the Nest corporation (which is now owned by Google) to be able to spy on you. Or perhaps you just don’t want to have to sign up for yet another duplicative service in order to use the camera you just bought. If any of that is the case, you can run your camera through your Urbit instead. The video feed will never leave your control, because it no longer has to live on Nest’s servers. Your camera will talk over a secure channel only to your Urbit. Your Urbit is the server.
148+Imagine, as I do, that you want a connected video camera in your house, but don’t want the Nest corporation (which is now owned by Google) to be able to spy on you. Or perhaps you just don’t want to have to sign up for yet another duplicative service in order to use the camera you just bought. If any of that is the case, you can run your camera through your Urbit instead. The video feed will never leave your control, because it no longer has to live on Nest’s servers. Your camera will talk over a secure channel only to your Urbit. Your Urbit is the server.
150
149
151−You can apply this same concept to smart speakers, a Ring doorbell, connected baby monitor, smart fridge, or any of the innumerable connected devices that give someone else access to your personal life. Why should anyone else have access to that information?
150+You can apply this same concept to smart speakers, a Ring doorbell, connected baby monitor, smart fridge, or any of the innumerable connected devices that give someone else access to your personal life. Why should anyone else have access to that information?
152
151
153## Urbit vs. Google Docs
152## Urbit vs. Google Docs
154
153
155−Imagine you want to write a screenplay with a small group of friends, but you don’t want Google mining the content of your shared doc for advertising keywords, and you won’t want to use multiple services for chat, document sharing, email, etc. In that case, simply create an Urbit group with your friends and write together using Urbit’s writing tools. Your content will stay completely private to the team until you decide to release it to the world, and you’ll communicate using one simple interface. Even better, the archive of your multimodal work lives in one place, so looking back at your process doesn’t require reconstructing it from dozens of different apps. And everything is stored on your respective Urbit computers, not Google’s servers.
154+Imagine you want to write a screenplay with a small group of friends, but you don’t want Google mining the content of your shared doc for advertising keywords, and you won’t want to use multiple services for chat, document sharing, email, etc. In that case, simply create an Urbit group with your friends and write together using Urbit’s writing tools. Your content will stay completely private to the team until you decide to release it to the world, and you’ll communicate using one simple interface. Even better, the archive of your multimodal work lives in one place, so looking back at your process doesn’t require reconstructing it from dozens of different apps. And everything is stored on your respective Urbit computers, not Google’s servers.
156
155
157## Urbit for your protected health information
156## Urbit for your protected health information
158
157
159−Imagine, as is already becoming the case, that it becomes highly valuable to have your genome sequenced in order to make good healthcare decisions. In that scenario, most of us would want our health care providers to be able to make precise assessments of parts of our genome, but we wouldn’t want insurance companies or other third parties to have access without our permission. In the current paradigm, once you share the information, it’s out there and can be leaked or sold. So much so that we all sort of assume that leaks are the default. In the Urbit paradigm, that information lives on your Urbit computer and nowhere else, and any software necessary to process it can be run on your Urbit as well. In other words, there’s never any need to share the raw data with anyone; instead, you can download a small program, run it on your Urbit, and share the final analyses only without ever exposing your data.
158+Imagine, as is already becoming the case, that it becomes highly valuable to have your genome sequenced in order to make good healthcare decisions. In that scenario, most of us would want our health care providers to be able to make precise assessments of parts of our genome, but we wouldn’t want insurance companies or other third parties to have access without our permission. In the current paradigm, once you share the information, it’s out there and can be leaked or sold. So much so that we all sort of assume that leaks are the default. In the Urbit paradigm, that information lives on your Urbit computer and nowhere else, and any software necessary to process it can be run on your Urbit as well. In other words, there’s never any need to share the raw data with anyone; instead, you can download a small program, run it on your Urbit, and share the final analyses only without ever exposing your data.
160
159
161−Some of these cases are, admittedly, a bit speculative since we haven’t built all the functionality yet. But it’s coming, and quite soon.
160+Some of these cases are, admittedly, a bit speculative since we haven’t built all the functionality yet. But it’s coming, and quite soon.
162
161
163For now, if you like the way this sounds you can [get yourself an Urbit ID](https://urbit.org/getting-started/#id) and start learning about how to safely store cryptographic keys (it’s really not that hard, and we give you suggestions). If you’re feeling technical or adventurous, you can try booting our beta OS interface to see what it looks like. It’s fussy, but it exists. Soon it will be less fussy. You can check out our [roadmap](https://urbit.org/understanding-urbit/roadmap/) if you’d like to know when.
162For now, if you like the way this sounds you can [get yourself an Urbit ID](https://urbit.org/getting-started/#id) and start learning about how to safely store cryptographic keys (it’s really not that hard, and we give you suggestions). If you’re feeling technical or adventurous, you can try booting our beta OS interface to see what it looks like. It’s fussy, but it exists. Soon it will be less fussy. You can check out our [roadmap](https://urbit.org/understanding-urbit/roadmap/) if you’d like to know when.
164
163
165## Why we need Urbit
164## Why we need Urbit
166
165
167−We humans haven’t evolved enough to manage the firehose of information that modern technology blasts us with. There’s too much news, too many connections, too many opinions, and more agendas out there than any of us can mindfully comprehend. We’re designed for much smaller communities, one-to-one connections, and slower idea assimilation than our modern infrastructure allows. The pace of change is increasing, and we don’t know how to manage it.
166+We humans haven’t evolved enough to manage the firehose of information that modern technology blasts us with. There’s too much news, too many connections, too many opinions, and more agendas out there than any of us can mindfully comprehend. We’re designed for much smaller communities, one-to-one connections, and slower idea assimilation than our modern infrastructure allows. The pace of change is increasing, and we don’t know how to manage it.
168
167
169−We’re scared, and to manage that fear we’re becoming more insular, more entrenched. Layer on top of all that the incentives that big business and big politics have to manipulate our emotions, and we’re headed in a very dangerous direction.
168+We’re scared, and to manage that fear we’re becoming more insular, more entrenched. Layer on top of all that the incentives that big business and big politics have to manipulate our emotions, and we’re headed in a very dangerous direction.
170
169
171−We can’t turn back the technological clock; humanity can only ever press onward. This is where Urbit comes in. Urbit is a forward-looking solution to this particular set of problems around human-scale computing and personal autonomy. Urbit provides a means by which groups can live peacefully in parallel.
170+We can’t turn back the technological clock; humanity can only ever press onward. This is where Urbit comes in. Urbit is a forward-looking solution to this particular set of problems around human-scale computing and personal autonomy. Urbit provides a means by which groups can live peacefully in parallel.
172
171
173−Urbit is a computing environment that allows humans to do everything they want on computers, but in communities of their choosing, in a way that feels direct and natural, and in a way that allows true personal freedom. Urbit is calm, secure, and private in its most fundamental architecture. No spying corporations. No manipulative politicians.
172+Urbit is a computing environment that allows humans to do everything they want on computers, but in communities of their choosing, in a way that feels direct and natural, and in a way that allows true personal freedom. Urbit is calm, secure, and private in its most fundamental architecture. No spying corporations. No manipulative politicians.
174
173
175−And that is what we need. Humans need a way to at once take advantage of our vast technological advances but not be dominated by them. Urbit is an open-source tool that we all own, that anyone can understand down to its roots, that’s fully under its user’s control. It is human-scale computing for human-scale communities. Simple, durable, yours.
174+And that is what we need. Humans need a way to at once take advantage of our vast technological advances but not be dominated by them. Urbit is an open-source tool that we all own, that anyone can understand down to its roots, that’s fully under its user’s control. It is human-scale computing for human-scale communities. Simple, durable, yours.
176
175
177For me, this first iteration of Urbit is more than enough, and it’s exactly the sort of peaceful future I want to work towards.
176For me, this first iteration of Urbit is more than enough, and it’s exactly the sort of peaceful future I want to work towards.
content/blog/urbit-grants-and-mid-2019-gifts.md+9−4
@@ -1,11 +1,16 @@
1+++
1+++
2title = "Urbit Grants and mid-2019 Gifts"
2title = "Urbit Grants and mid-2019 Gifts"
3−date = 2019-06-10
3+date = "2019-06-09"
4description = "Announcing an upcoming Urbit grants program and star gifts for Mid-2019."
4description = "Announcing an upcoming Urbit grants program and star gifts for Mid-2019."
5+aliases = [
5−aliases = ["/posts/essays/urbit-grants-and-mid-2019-gifts", "/posts/urbit-grants-and-mid-2019-gifts"]
6+ "/posts/essays/urbit-grants-and-mid-2019-gifts",
7+ "/posts/urbit-grants-and-mid-2019-gifts"
8+]
9+
6[taxonomies]
10[taxonomies]
7−grant_type = ["Gift"]
11+grant_type = [ "Gift" ]
8−grant_category = []
12+grant_category = [ ]
13+
9[extra]
14[extra]
10author = "Galen Wolfe-Pauly + Alex Matzner"
15author = "Galen Wolfe-Pauly + Alex Matzner"
11ship = "~ravmel-ropdyl + ~mignyt-mogseb"
16ship = "~ravmel-ropdyl + ~mignyt-mogseb"
content/blog/urbit-is-for-communities.md+3−6
@@ -1,11 +1,12 @@
1+++
1+++
2title = "Urbit is for Communities"
2title = "Urbit is for Communities"
3−date = 2020-03-23
3+date = "2020-03-22"
4description = "Urbit is for giving communities the tools to shape their own environments; for us all to feel a sense of life and self-directedness in the digital world."
4description = "Urbit is for giving communities the tools to shape their own environments; for us all to feel a sense of life and self-directedness in the digital world."
5+
5[extra]
6[extra]
6author = "Galen Wolfe-Pauly"
7author = "Galen Wolfe-Pauly"
7ship = "~ravmel-ropdyl"
8ship = "~ravmel-ropdyl"
8−image ="https://media.urbit.org/site/posts/essays/urbit-is-for-communities.jpg"
9+image = "https://media.urbit.org/site/posts/essays/urbit-is-for-communities.jpg"
9+++
10+++
10
11
11<br>
12<br>
@@ -34,7 +35,6 @@ We don’t often talk about it explicitly, but this is what Urbit is for. Urbit
34
35
35It’s not any single specific technical feature of Urbit that makes it well-suited for communities to homestead and develop. It’s the combination of the technology under the hood and the interfaces we build on top. Let’s talk about both.
36It’s not any single specific technical feature of Urbit that makes it well-suited for communities to homestead and develop. It’s the combination of the technology under the hood and the interfaces we build on top. Let’s talk about both.
36
37
37−
38## Technically capable
38## Technically capable
39
39
40I love [this tweet](https://twitter.com/devonzuegel/status/1221804267083718656) about becoming a ‘digital prepper’. It feels like it has already happened to me, too. I’ve seen enough centralized services shut down and disappear (often with my data) that I’m reluctant to try new ones. No matter how friendly and cozy their branding.
40I love [this tweet](https://twitter.com/devonzuegel/status/1221804267083718656) about becoming a ‘digital prepper’. It feels like it has already happened to me, too. I’ve seen enough centralized services shut down and disappear (often with my data) that I’m reluctant to try new ones. No matter how friendly and cozy their branding.
@@ -57,7 +57,6 @@ That means we have to solve the problems inherent to the legacy internet. There
57
57
58But even with a system that fixes all of these issues by default, it only matters if the system is usable and understandable. What we really want is a digital world that’s generated by the communities that inhabit it — which means it has to be generated by people with no technical knowledge.
58But even with a system that fixes all of these issues by default, it only matters if the system is usable and understandable. What we really want is a digital world that’s generated by the communities that inhabit it — which means it has to be generated by people with no technical knowledge.
59
59
60−
61## Communities are built by people
60## Communities are built by people
62
61
63In the physical world, you can arrange the furniture in your house, or go to Ikea, or build your own furniture, or figure out how to build a house from scratch. By taking your preferred approach to design, you contribute to the shape of your city. The world around us is a wonderfully loose collaboration between the more technically oriented architects and planners, and the everyday homeowners and residents.
62In the physical world, you can arrange the furniture in your house, or go to Ikea, or build your own furniture, or figure out how to build a house from scratch. By taking your preferred approach to design, you contribute to the shape of your city. The world around us is a wonderfully loose collaboration between the more technically oriented architects and planners, and the everyday homeowners and residents.
@@ -70,7 +69,6 @@ For most people, customizing your Urbit should be a matter of picking from an av
70
69
71We’re not quite to this level of sophistication, but we’re on the path. Let’s talk about where we are and where we’re going.
70We’re not quite to this level of sophistication, but we’re on the path. Let’s talk about where we are and where we’re going.
72
71
73−
74## OS 1
72## OS 1
75
73
76Our rough attempt to satisfy this goal is hovering on the horizon. We call it OS 1.
74Our rough attempt to satisfy this goal is hovering on the horizon. We call it OS 1.
@@ -85,7 +83,6 @@ Currently, our Ikea experience is pretty limited, there are only a few Legos to
85
83
86The system is ripe for experimentation, customization, and exploration. It’s ready for earnest homesteading. Come build.
84The system is ripe for experimentation, customization, and exploration. It’s ready for earnest homesteading. Come build.
87
85
88−
89## → N
86## → N
90
87
91OS 1 is really just the beginning. There are so many more modules and means of communicating and collaborating to add. There is so much we can do to make the system more customizable.
88OS 1 is really just the beginning. There are so many more modules and means of communicating and collaborating to add. There is so much we can do to make the system more customizable.
content/blog/value-of-address-space-pt1.md+6−5
@@ -1,11 +1,12 @@
1+++
1+++
2title = "The Value of Urbit Address Space (1 of 3)"
2title = "The Value of Urbit Address Space (1 of 3)"
3−date = 2020-04-07
3+date = "2020-04-06"
4description = "An expansion of our position on Urbit's address space value."
4description = "An expansion of our position on Urbit's address space value."
5+
5[extra]
6[extra]
6author = "Erik Newton + Galen Wolfe-Pauly"
7author = "Erik Newton + Galen Wolfe-Pauly"
7ship = "~patnes-rigtyn + ~ravmel-ropdyl"
8ship = "~patnes-rigtyn + ~ravmel-ropdyl"
8−image ="https://media.urbit.org/site/posts/essays/value-of-address-space-pt1.jpg"
9+image = "https://media.urbit.org/site/posts/essays/value-of-address-space-pt1.jpg"
9+++
10+++
10
11
11<br>
12<br>
@@ -14,7 +15,7 @@ image ="https://media.urbit.org/site/posts/essays/value-of-address-space-pt1.jpg
14
15
15<br>
16<br>
16
17
17−*This is the first in a series of three posts on Urbit address space. See also [part 2](https://urbit.org/blog/value-of-address-space-pt2/) and [part 3](https://urbit.org/blog/value-of-address-space-pt3/).*
18+_This is the first in a series of three posts on Urbit address space. See also [part 2](https://urbit.org/blog/value-of-address-space-pt2/) and [part 3](https://urbit.org/blog/value-of-address-space-pt3/)._
18
19
19## Part One – What/why, a history, and some analogies
20## Part One – What/why, a history, and some analogies
20
21
@@ -84,7 +85,7 @@ So how did these ~4B names get initialized and distributed? Urbit address space
84
85
85Now that the system is up and running, Urbit address space has steadily become more distributed. This arguably follows the distribution patterns of the Bitcoin UTXO set, and even historical distribution patterns of physical land.
86Now that the system is up and running, Urbit address space has steadily become more distributed. This arguably follows the distribution patterns of the Bitcoin UTXO set, and even historical distribution patterns of physical land.
86
87
87−Let’s take a look at how this came to be.
88+Let’s take a look at how this came to be.
88
89
89Urbit was originally an experimental personal project. The original Urbit address space registry was just a text file in the source code at that time. At the very beginning, all of the address space was owned by Curtis — its creator — and it was all pretty much worthless. In the years leading up to 2013, Curtis gave away galaxies to anyone who would help or contribute to the project, and to several people who were simply in the right place at the right time.
90Urbit was originally an experimental personal project. The original Urbit address space registry was just a text file in the source code at that time. At the very beginning, all of the address space was owned by Curtis — its creator — and it was all pretty much worthless. In the years leading up to 2013, Curtis gave away galaxies to anyone who would help or contribute to the project, and to several people who were simply in the right place at the right time.
90
91
@@ -96,7 +97,7 @@ It was then decided that a public key infrastructure was the most logical way to
96
97
97## Analogues and the intrinsic value of address space
98## Analogues and the intrinsic value of address space
98
99
99−We’ve often said that Urbit address space, particularly stars and galaxies, have intrinsic value that should be understood beyond simply the price of the planets they contain. Another way of putting this is that, because stars and galaxies are infrastructure nodes, they’re uniquely positioned to generate cash flow from activities on the network beyond simply selling their planets.
100+We’ve often said that Urbit address space, particularly stars and galaxies, have intrinsic value that should be understood beyond simply the price of the planets they contain. Another way of putting this is that, because stars and galaxies are infrastructure nodes, they’re uniquely positioned to generate cash flow from activities on the network beyond simply selling their planets.
100
101
101This cash flow won't likely come from passive activity, but from actively working to develop businesses located on stars and galaxies. Let’s dig a bit deeper into these activities through the lens of some analogues to the existing world.
102This cash flow won't likely come from passive activity, but from actively working to develop businesses located on stars and galaxies. Let’s dig a bit deeper into these activities through the lens of some analogues to the existing world.
102
103
content/blog/value-of-address-space-pt2.md+52−44
@@ -1,11 +1,12 @@
1+++
1+++
2title = "The Value of Urbit Address Space (2 of 3)"
2title = "The Value of Urbit Address Space (2 of 3)"
3−date = 2020-04-13
3+date = "2020-04-12"
4description = "Scarcity, utility, liquidity, and network effect."
4description = "Scarcity, utility, liquidity, and network effect."
5+
5[extra]
6[extra]
6author = "Erik Newton + Galen Wolfe-Pauly"
7author = "Erik Newton + Galen Wolfe-Pauly"
7ship = "~patnes-rigtyn + ~ravmel-ropdyl"
8ship = "~patnes-rigtyn + ~ravmel-ropdyl"
8−image ="https://media.urbit.org/site/posts/essays/value-of-address-space-pt2.jpg"
9+image = "https://media.urbit.org/site/posts/essays/value-of-address-space-pt2.jpg"
9+++
10+++
10
11
11<br>
12<br>
@@ -14,16 +15,15 @@ image ="https://media.urbit.org/site/posts/essays/value-of-address-space-pt2.jpg
14
15
15<br>
16<br>
16
17
17−*This is the second in a series of three posts on Urbit address space. See also [part 1](https://urbit.org/blog/value-of-address-space-pt1/) and [part 3](https://urbit.org/blog/value-of-address-space-pt3/).*
18+_This is the second in a series of three posts on Urbit address space. See also [part 1](https://urbit.org/blog/value-of-address-space-pt1/) and [part 3](https://urbit.org/blog/value-of-address-space-pt3/)._
18
19
19## Measuring value
20## Measuring value
20
21
21Value and price are distinct concepts that often get conflated. In our view, Urbit address space has value for four fundamental reasons: it’s scarce; it has utility; it has some limited liquidity; and it has network effect. Price, on the other hand, is always a function of supply and demand, and it's not something we – as builders – concern ourselves with very much. Let’s take a look at these fundamentals within the Urbit ecosystem.
22Value and price are distinct concepts that often get conflated. In our view, Urbit address space has value for four fundamental reasons: it’s scarce; it has utility; it has some limited liquidity; and it has network effect. Price, on the other hand, is always a function of supply and demand, and it's not something we – as builders – concern ourselves with very much. Let’s take a look at these fundamentals within the Urbit ecosystem.
22
23
23−
24−
25## Scarcity
24## Scarcity
25+
26−256 galaxies, ~65,000 stars, ~4B planets.
26+256 galaxies, ~65,000 stars, ~4B planets.
27
27
28<br>
28<br>
29
29
@@ -31,36 +31,39 @@ Value and price are distinct concepts that often get conflated. In our view, Urb
31
31
32<br>
32<br>
33
33
34−A foundational design principle of the Urbit network is that the address space is limited. This rarity helps qualify Urbit as a [collectible](https://nakamotoinstitute.org/shelling-out/), and thus creates a non-zero acquisition cost for an address. This cost discourages abuses like spam and bot-net attacks. Traditionally, these attacks are made with quasi-unlimited access to IP addresses. The unit economics of acquiring planets for these nefarious purposes is a strong deterrent.
34+A foundational design principle of the Urbit network is that the address space is limited. This rarity helps qualify Urbit as a [collectible](https://nakamotoinstitute.org/shelling-out/), and thus creates a non-zero acquisition cost for an address. This cost discourages abuses like spam and bot-net attacks. Traditionally, these attacks are made with quasi-unlimited access to IP addresses. The unit economics of acquiring planets for these nefarious purposes is a strong deterrent.
35
35
36−There are 256 galaxies on the network. Each galaxy is initialized with ownership of 256 stars. Galaxies act as root nodes for peer discovery and packet routing within the Urbit network, and they are each also entitled to vote on updates to the smart contracts which govern the network. To date, galaxies trade primarily on OTC (over the counter) desks, and rarely appear on the open market.
36+There are 256 galaxies on the network. Each galaxy is initialized with ownership of 256 stars. Galaxies act as root nodes for peer discovery and packet routing within the Urbit network, and they are each also entitled to vote on updates to the smart contracts which govern the network. To date, galaxies trade primarily on OTC (over the counter) desks, and rarely appear on the open market.
37
37
38−There are 65,536 total stars on the network. In turn, each star is initialized with ownership of 65,536 planets. Stars currently trade on platforms independent of Tlon, such as [urbit.live](https://urbit.live/) and [opensea.io](https://opensea.io/). The current price range can easily be ascertained on those sites, but as of the time of this writing, stars are selling at a price that greatly discounts their planet holdings.
38+There are 65,536 total stars on the network. In turn, each star is initialized with ownership of 65,536 planets. Stars currently trade on platforms independent of Tlon, such as [urbit.live](https://urbit.live/) and [opensea.io](https://opensea.io/). The current price range can easily be ascertained on those sites, but as of the time of this writing, stars are selling at a price that greatly discounts their planet holdings.
39
39
40−One would expect that in an efficient market the relative pricing of stars on one hand, and planets on the other hand would eventually align (so to speak). This may come to pass as the Urbit community increases education about Urbit, and as additional planet sellers and hosting providers enter the space.
40+One would expect that in an efficient market the relative pricing of stars on one hand, and planets on the other hand would eventually align (so to speak). This may come to pass as the Urbit community increases education about Urbit, and as additional planet sellers and hosting providers enter the space.
41
41
42−Finally, there are 4,294,967,296 (or 2<sup>32</sup>) planets on the network. Planets currently trade largely in a range of $10 to $15. We expect planet prices to fluctuate from provider to provider as described in the previous post, based on the quality of services various providers offer. That said, it's worth noting that the cost to configure addresses for distribution is fairly static and this may act as something of a lower bound.
42+Finally, there are 4,294,967,296 (or 2<sup>32</sup>) planets on the network. Planets currently trade largely in a range of $10 to $15. We expect planet prices to fluctuate from provider to provider as described in the previous post, based on the quality of services various providers offer. That said, it's worth noting that the cost to configure addresses for distribution is fairly static and this may act as something of a lower bound.
43
43
44−That said, we also anticipate that planet prices will be abstracted away from most purchasers, and will be included in bundled annual packages of hosting and data routing services. For this reason, infrastructure service providers (i.e. hosting providers) will likely be the best positioned parties to capture value from planet distribution.
44+That said, we also anticipate that planet prices will be abstracted away from most purchasers, and will be included in bundled annual packages of hosting and data routing services. For this reason, infrastructure service providers (i.e. hosting providers) will likely be the best positioned parties to capture value from planet distribution.
45
45
46−While an increase in the supply of Urbit address space is a technical possibility, it would run counter to the economic incentives of Urbit address space owners. This is why we view a galaxy vote to dilute address space as improbable.
46+While an increase in the supply of Urbit address space is a technical possibility, it would run counter to the economic incentives of Urbit address space owners. This is why we view a galaxy vote to dilute address space as improbable.
47
47
48Scarcity may be sufficient alone to drive value, but it’s much more impactful when the unit has some underlying purpose, which brings us to utility.
48Scarcity may be sufficient alone to drive value, but it’s much more impactful when the unit has some underlying purpose, which brings us to utility.
49
49
50## Utility
50## Utility
51+
51Utility (i.e. what Urbit addresses can be used for) has largely been addressed in the previous installation of this series. Briefly, our view is that stars and galaxies are useful for more than simply selling their subsidiary address space. Their use value encompasses their unique functionality on the network and the business models that functionality represents.
52Utility (i.e. what Urbit addresses can be used for) has largely been addressed in the previous installation of this series. Briefly, our view is that stars and galaxies are useful for more than simply selling their subsidiary address space. Their use value encompasses their unique functionality on the network and the business models that functionality represents.
52
53
53−As a refresher, this use value falls in five broad categories.
54+As a refresher, this use value falls in five broad categories.
55+
541. Authentication technology is broadly useful. All Urbit identities — planets, stars, and galaxies — can be used for authenticating one’s Urbit computer, and for authentication in general. Urbit ID was designed for Urbit-specific authentication, but a lot of general functionality can be built on top of this infrastructure. Urbit ID is simple, extensible, and easy to use, making PGP style claims much more useful than they are today.
561. Authentication technology is broadly useful. All Urbit identities — planets, stars, and galaxies — can be used for authenticating one’s Urbit computer, and for authentication in general. Urbit ID was designed for Urbit-specific authentication, but a lot of general functionality can be built on top of this infrastructure. Urbit ID is simple, extensible, and easy to use, making PGP style claims much more useful than they are today.
552. Network infrastructure services represent a potential revenue stream. Stars and galaxies specifically should be understood as providing their owners the opportunity to develop and use network infrastructure. We anticipate that stars and galaxies will eventually charge for infrastructure related services, like hosting and packet routing, and will distinguish themselves on quality and service.
572. Network infrastructure services represent a potential revenue stream. Stars and galaxies specifically should be understood as providing their owners the opportunity to develop and use network infrastructure. We anticipate that stars and galaxies will eventually charge for infrastructure related services, like hosting and packet routing, and will distinguish themselves on quality and service.
56−3. Stars and galaxies are well positioned to offer additional services. Because of their role as high level network nodes, stars and galaxies are uniquely positioned to offer additional services, including content delivery networks (CDNs), Bitcoin and other blockchain-related nodes, 0x relays, and Tor exit nodes.
58+3. Stars and galaxies are well positioned to offer additional services. Because of their role as high level network nodes, stars and galaxies are uniquely positioned to offer additional services, including content delivery networks (CDNs), Bitcoin and other blockchain-related nodes, 0x relays, and Tor exit nodes.
574. Schelling points have value. Because stars and galaxies hold a certain authority on the network (by dint of their relationship to their subsidiary nodes), they act as [Schelling points](https://nav.al/schelling-point), or default hubs, for various activities that will arise as the network grows. Already various groups and communities are beginning to collect around stars. This gravity has value and will eventually be priced.
594. Schelling points have value. Because stars and galaxies hold a certain authority on the network (by dint of their relationship to their subsidiary nodes), they act as [Schelling points](https://nav.al/schelling-point), or default hubs, for various activities that will arise as the network grows. Already various groups and communities are beginning to collect around stars. This gravity has value and will eventually be priced.
58−5. Voting has value. Galaxies exclusively hold a vote on the network. This voting right can be separated from the galaxy itself and transferred, and we anticipate that this will happen eventually. The value of this right has not and may never be priced into the market, though as Urbit adoption grows, the value of a vote may emerge.
60+5. Voting has value. Galaxies exclusively hold a vote on the network. This voting right can be separated from the galaxy itself and transferred, and we anticipate that this will happen eventually. The value of this right has not and may never be priced into the market, though as Urbit adoption grows, the value of a vote may emerge.
59
61
60Utility is only one component of a value calculation. To further develop the inquiry into value, let’s move on to trading factors.
62Utility is only one component of a value calculation. To further develop the inquiry into value, let’s move on to trading factors.
61
63
62## Trading, volume, and liquidity
64## Trading, volume, and liquidity
65+
63−Urbit IDs are individually represented by non-fungible ERC-721 tokens, and can therefore be sold by any platform that supports this token standard. Currently there are three known Urbit-exclusive sales platforms and one generalized ERC-721 platform that list Urbit IDs. Prices for stars and planets are readily available. Volume is low, as no effort has been made to promote the fact of availability, yet the number of [total transactions](https://azimuth.network/stats/events.txt) has increased steadily since the network was launched to Ethereum in 2019, even absent public messaging.
66+Urbit IDs are individually represented by non-fungible ERC-721 tokens, and can therefore be sold by any platform that supports this token standard. Currently there are three known Urbit-exclusive sales platforms and one generalized ERC-721 platform that list Urbit IDs. Prices for stars and planets are readily available. Volume is low, as no effort has been made to promote the fact of availability, yet the number of [total transactions](https://azimuth.network/stats/events.txt) has increased steadily since the network was launched to Ethereum in 2019, even absent public messaging.
64
67
65<br>
68<br>
66<img class="" src="https://media.urbit.org/site/posts/essays/value-of-address-space-pt2-tps.svg">
69<img class="" src="https://media.urbit.org/site/posts/essays/value-of-address-space-pt2-tps.svg">
@@ -70,7 +73,7 @@ Urbit IDs are individually represented by non-fungible ERC-721 tokens, and can t
70<img class="" src="https://media.urbit.org/site/posts/essays/value-of-address-space-pt2-tss.svg">
73<img class="" src="https://media.urbit.org/site/posts/essays/value-of-address-space-pt2-tss.svg">
71<br>
74<br>
72
75
73−Buying non-fungible tokens like Urbit IDs is rather different than trading quasi-fungible tokens like Bitcoin (even setting aside the issue of volume). Each Urbit ID is unique, and so they tend to be purchased by end users for their specific characteristics, rather than generically. As an example, the planet `~parret-barret` sold for about $1,000 at a time when most planets were selling for $10-20, perhaps due to its rhyming name. Planets with circular sigils also often sell for significantly more than other planets — we’re not entirely sure why this is the case.
76+Buying non-fungible tokens like Urbit IDs is rather different than trading quasi-fungible tokens like Bitcoin (even setting aside the issue of volume). Each Urbit ID is unique, and so they tend to be purchased by end users for their specific characteristics, rather than generically. As an example, the planet `~parret-barret` sold for about $1,000 at a time when most planets were selling for $10-20, perhaps due to its rhyming name. Planets with circular sigils also often sell for significantly more than other planets — we’re not entirely sure why this is the case.
74
77
75## Planet Sales
78## Planet Sales
76
79
@@ -88,9 +91,9 @@ Buying non-fungible tokens like Urbit IDs is rather different than trading quasi
88<img class="w-100" src="https://media.urbit.org/site/posts/essays/value-of-address-space-pt2e-price-btc-usd.svg">
91<img class="w-100" src="https://media.urbit.org/site/posts/essays/value-of-address-space-pt2e-price-btc-usd.svg">
89<br>
92<br>
90
93
91−This ID-specific trading pattern is generally appropriate in our view: Urbit ID isn’t designed to be rapidly traded at high volume. Urbit is more like a house than a fungible good like a currency.
94+This ID-specific trading pattern is generally appropriate in our view: Urbit ID isn’t designed to be rapidly traded at high volume. Urbit is more like a house than a fungible good like a currency.
92
95
93−For the time being buying and selling of Urbit IDs happens through auctions on specific platforms, and via person-to-person transactions, because each transaction is for a _specific_ Urbit ID. Again, Urbit ID is designed in the spirit of property titles, rather than currencies, so this makes sense.
96+For the time being buying and selling of Urbit IDs happens through auctions on specific platforms, and via person-to-person transactions, because each transaction is for a _specific_ Urbit ID. Again, Urbit ID is designed in the spirit of property titles, rather than currencies, so this makes sense.
94
97
95Strictly speaking, liquidity is a measure of the degree to which a given asset will change in value due to a given transaction. In that sense, Urbit address space is likely fairly illiquid. But liquidity can’t be properly understood without volume. As noted above, the volume of transactions on the network has been steadily increasing since inception, and yet the price has remained fairly constant. This seems to indicate a healthy ratio.
98Strictly speaking, liquidity is a measure of the degree to which a given asset will change in value due to a given transaction. In that sense, Urbit address space is likely fairly illiquid. But liquidity can’t be properly understood without volume. As noted above, the volume of transactions on the network has been steadily increasing since inception, and yet the price has remained fairly constant. This seems to indicate a healthy ratio.
96
99
@@ -100,56 +103,61 @@ Strictly speaking, liquidity is a measure of the degree to which a given asset w
100
103
101<br>
104<br>
102
105
103−A further impact on liquidity and volume is that of available supply. At present, the majority of Urbit address space is locked by smart contracts. These lockups began to release at varying linear rates in January 2019. All address space will be completely unlocked and tradeable by January 2025. Eventually as both understanding and demand increase, we anticipate that planets will find an equilibrium price, and stars will be repriced accordingly.
106+A further impact on liquidity and volume is that of available supply. At present, the majority of Urbit address space is locked by smart contracts. These lockups began to release at varying linear rates in January 2019. All address space will be completely unlocked and tradeable by January 2025. Eventually as both understanding and demand increase, we anticipate that planets will find an equilibrium price, and stars will be repriced accordingly.
104
107
105−We’ll discuss lockups and spawning limits in more detail in the third installment of this series.
108+We’ll discuss lockups and spawning limits in more detail in the third installment of this series.
106
109
107In our view, this combination of scarcity, utility, and the above trading factors is a useful description of existing market dynamics for Urbit address space. A further description of why Urbit has value lies not just in its trading characteristics, but in the utility of human interaction. This brings us to network effect.
110In our view, this combination of scarcity, utility, and the above trading factors is a useful description of existing market dynamics for Urbit address space. A further description of why Urbit has value lies not just in its trading characteristics, but in the utility of human interaction. This brings us to network effect.
108
111
109## Network effect
112## Network effect
113+
110−Much is made of the concept of network effect and its impact on network valuations generally. The concept is fairly straightforward so long as numbers aren’t applied. Broadly speaking, networks are interconnected systems of people or things. Network effects are mechanisms wherein every new user of a given system makes the system more valuable to every other user.
114+Much is made of the concept of network effect and its impact on network valuations generally. The concept is fairly straightforward so long as numbers aren’t applied. Broadly speaking, networks are interconnected systems of people or things. Network effects are mechanisms wherein every new user of a given system makes the system more valuable to every other user.
111
115
112Urbit is a network of networks, and it’s designed specifically for communities — for communication and collaboration. The more people who use Urbit, the more communities get started by design. The more communities there are, the more likely outsiders get pulled in to join them, and so the virtuous network effect cycle continues.
116Urbit is a network of networks, and it’s designed specifically for communities — for communication and collaboration. The more people who use Urbit, the more communities get started by design. The more communities there are, the more likely outsiders get pulled in to join them, and so the virtuous network effect cycle continues.
113
117
114−Digging deeper, Urbit is unusual as a network for the following interrelated reasons:
118+Digging deeper, Urbit is unusual as a network for the following interrelated reasons:
119+
115−1. Urbit is a platform in the true sense; wherein
120+1. Urbit is a platform in the true sense; wherein
116−2. connections are peer-to-peer;
121+2. connections are peer-to-peer;
117−3. privacy is high;
122+3. privacy is high;
118−4. discoverability is low;
123+4. discoverability is low;
119−5. customization and autonomy are nearly limitless; and yet
124+5. customization and autonomy are nearly limitless; and yet
120−6. the number of possible groups and node connections is essentially unbounded.
125+6. the number of possible groups and node connections is essentially unbounded.
121
126
122The upshot is that Urbit can serve as the meta-network for many different kinds of individual networks, each with their own value. Urbit is much more akin to the internet itself than it is to, say, Facebook. Reed’s and Metcalf’s laws therefore apply to Urbit in some very interesting ways.
127The upshot is that Urbit can serve as the meta-network for many different kinds of individual networks, each with their own value. Urbit is much more akin to the internet itself than it is to, say, Facebook. Reed’s and Metcalf’s laws therefore apply to Urbit in some very interesting ways.
123
128
124## Network laws
129## Network laws
125−Before diving into a discussion of network effect, it's worth noting that although individual tokens and users of those tokens benefit in various ways from a thriving network, the structure of the Urbit network does not grant token holders any rights to profits or losses "generated by the network" as a whole. In fact the very notion is counter to the intent of Urbit's ethos of decentralization. Individuals on the network may profit by their own activities, but there is no central authority profiting off activity in the aggregate; there is no ownership of the network as a whole, and so there are no centralized profits and losses to share. Address space tokens represent one's ownership of their own parcel of land as it were.
126
130
127−That said, an entire continent may have aggregate value even though it is distributed. To explore this notion with regards to Urbit, it's worth reviewing the three laws typically cited to express the value of a network as a whole:
131+Before diving into a discussion of network effect, it's worth noting that although individual tokens and users of those tokens benefit in various ways from a thriving network, the structure of the Urbit network does not grant token holders any rights to profits or losses "generated by the network" as a whole. In fact the very notion is counter to the intent of Urbit's ethos of decentralization. Individuals on the network may profit by their own activities, but there is no central authority profiting off activity in the aggregate; there is no ownership of the network as a whole, and so there are no centralized profits and losses to share. Address space tokens represent one's ownership of their own parcel of land as it were.
128−- Sarnoff’s law states that the value of a network increases proportionally to its size. This is widely understood to understate the value of most modern networks.
129−- Metcalf’s law states that the value of a network is the square of the number of users (n^2).
130−- Reed’s law states that the value of a network increases with the number of groups that can be built on the network. This is expressed as 2^n, where n is the number of groups.
131
132
132−Reed’s law captures the notion that groups vastly increase the density of connections on a network and so scale value more quickly.
133+That said, an entire continent may have aggregate value even though it is distributed. To explore this notion with regards to Urbit, it's worth reviewing the three laws typically cited to express the value of a network as a whole:
133
134
134−Urbit is a network of networks, and so is best described by Reed’s law.
135+- Sarnoff’s law states that the value of a network increases proportionally to its size. This is widely understood to understate the value of most modern networks.
136+- Metcalf’s law states that the value of a network is the square of the number of users (n^2).
137+- Reed’s law states that the value of a network increases with the number of groups that can be built on the network. This is expressed as 2^n, where n is the number of groups.
135
138
136−Urbit’s unique approach to groups also helps resolve two other problems which lead to value loss in many networks: Urbit’s design significantly reduces both network pollution (i.e. irrelevant feeds) and network congestion (clogged bandwidth), as individual clusters can easily separate their activity from other networks on the platform.
139+Reed’s law captures the notion that groups vastly increase the density of connections on a network and so scale value more quickly.
137
140
141+Urbit is a network of networks, and so is best described by Reed’s law.
138
142
143+Urbit’s unique approach to groups also helps resolve two other problems which lead to value loss in many networks: Urbit’s design significantly reduces both network pollution (i.e. irrelevant feeds) and network congestion (clogged bandwidth), as individual clusters can easily separate their activity from other networks on the platform.
139
144
140## Urbit is a platform network
145## Urbit is a platform network
141−It’s important to note that Urbit has utility absent the network, as Urbit OS is in fact a Turing-complete virtual computer. Though the system is designed around communities, individuals can use Urbit to create personal documents, archive data, and write code for the system. This is how Urbit’s total network size can be relatively small and still provide value for individual users and clusters. However, Urbit already has users, and for many of these, critical mass — the point at which the network is more valuable than its cost — has already been reached. In addition, as each of these individual clusters writes code for the platform, positive indirect network effects increase (more utility arises from these individual development efforts).
142
146
143−This combination of effects makes Urbit significantly more robust than non-platform networks which can’t rely on this intrinsic utility.
147+It’s important to note that Urbit has utility absent the network, as Urbit OS is in fact a Turing-complete virtual computer. Though the system is designed around communities, individuals can use Urbit to create personal documents, archive data, and write code for the system. This is how Urbit’s total network size can be relatively small and still provide value for individual users and clusters. However, Urbit already has users, and for many of these, critical mass — the point at which the network is more valuable than its cost — has already been reached. In addition, as each of these individual clusters writes code for the platform, positive indirect network effects increase (more utility arises from these individual development efforts).
144
148
149+This combination of effects makes Urbit significantly more robust than non-platform networks which can’t rely on this intrinsic utility.
150+
145−That said, we do not intend to ever rely simply on this individuated computing utility alone. Urbit is for communities, and Tlon’s primary focus is to increase adoption of the system as a whole, including the network. To this end we’re working steadily to increase functionality of the system, improve messaging, and actively onboard communities.
151+That said, we do not intend to ever rely simply on this individuated computing utility alone. Urbit is for communities, and Tlon’s primary focus is to increase adoption of the system as a whole, including the network. To this end we’re working steadily to increase functionality of the system, improve messaging, and actively onboard communities.
146
152
147## Network identity
153## Network identity
154+
148−Another distinguishing characteristic of Urbit is that identities are pseudonymous but can easily be de-pseudonymized by users at will (though not by outside authorities). This flexibility combined with identity reputation accrual means people can behave in different ways depending on the social context. People can communicate privately, publicly, or in small groups, and they can do it anonymously or otherwise. This natural and extensible approach to social engagement results in personal comfort and drives adoption.
155+Another distinguishing characteristic of Urbit is that identities are pseudonymous but can easily be de-pseudonymized by users at will (though not by outside authorities). This flexibility combined with identity reputation accrual means people can behave in different ways depending on the social context. People can communicate privately, publicly, or in small groups, and they can do it anonymously or otherwise. This natural and extensible approach to social engagement results in personal comfort and drives adoption.
149
156
150## Extensibility
157## Extensibility
158+
151Because Urbit is vastly customizable, and because it’s a network platform for other networks, it can and should grow in ways we can’t predict. Each new use case that develops creates a new market, new communities, and new hubs. Each of these contributes to the diversity of the overall ecosystem, making it vastly more interesting and diverse than anything we might create alone. We expect this extensibility to contribute greatly to retention as users are able to build the world they want to inhabit.
159Because Urbit is vastly customizable, and because it’s a network platform for other networks, it can and should grow in ways we can’t predict. Each new use case that develops creates a new market, new communities, and new hubs. Each of these contributes to the diversity of the overall ecosystem, making it vastly more interesting and diverse than anything we might create alone. We expect this extensibility to contribute greatly to retention as users are able to build the world they want to inhabit.
152
160
153−Urbit is a deeply extensible platform for communities: it’s a network of networks. Users join to be part of communities, then launch communities of their own, further driving growth and engagement in a virtuous cycle.
161+Urbit is a deeply extensible platform for communities: it’s a network of networks. Users join to be part of communities, then launch communities of their own, further driving growth and engagement in a virtuous cycle.
154
162
155−In the next installment of this series, we’ll describe lockups and availability in more detail and will share the data we’ve managed to compile about address space distribution.
163+In the next installment of this series, we’ll describe lockups and availability in more detail and will share the data we’ve managed to compile about address space distribution.
content/blog/value-of-address-space-pt3.md+29−30
@@ -1,11 +1,12 @@
1+++
1+++
2title = "The Value of Urbit Address Space (3 of 3)"
2title = "The Value of Urbit Address Space (3 of 3)"
3−date = 2020-07-10
3+date = "2020-07-09"
4description = ""
4description = ""
5+
5[extra]
6[extra]
6author = "Erik Newton + Galen Wolfe-Pauly"
7author = "Erik Newton + Galen Wolfe-Pauly"
7ship = "~patnes-rigtyn + ~ravmel-ropdyl"
8ship = "~patnes-rigtyn + ~ravmel-ropdyl"
8−image ="https://media.urbit.org/site/posts/essays/value-of-address-space-pt3.jpg"
9+image = "https://media.urbit.org/site/posts/essays/value-of-address-space-pt3.jpg"
9+++
10+++
10
11
11<br>
12<br>
@@ -14,35 +15,35 @@ image ="https://media.urbit.org/site/posts/essays/value-of-address-space-pt3.jpg
14
15
15<br>
16<br>
16
17
17−*This is the third in a series of three posts on Urbit address space. See also [part 1](https://urbit.org/blog/value-of-address-space-pt1/) and [part 2](https://urbit.org/blog/value-of-address-space-pt2/).*
18+_This is the third in a series of three posts on Urbit address space. See also [part 1](https://urbit.org/blog/value-of-address-space-pt1/) and [part 2](https://urbit.org/blog/value-of-address-space-pt2/)._
18
19
19−It has been some time since we revisited this series of posts, so let’s start with a summary.
20+It has been some time since we revisited this series of posts, so let’s start with a summary.
20
21
21Our framework for understanding the value of Urbit address space is that it’s useful, it’s rare, it’s easy to exchange, and the more that people use it, the more useful it becomes. Let’s briefly review each concept in a little more detail.
22Our framework for understanding the value of Urbit address space is that it’s useful, it’s rare, it’s easy to exchange, and the more that people use it, the more useful it becomes. Let’s briefly review each concept in a little more detail.
22
23
23−First, utility. Urbit address space was designed for logging into Urbit OS, but Urbit ID can be used as an identity primitive for any internet service. That means it’s vastly extensible. Perhaps more importantly, because Urbit IDs at the star and galaxy level represent network infrastructure for the Urbit network, users have already begun to build a range of business models upon them, from hosting providers to community hubs. We explored several of these possibilities in detail in the [first post](https://urbit.org/blog/value-of-address-space-pt1/) in the series, and we also provide a primer on Urbit ID itself.
24+First, utility. Urbit address space was designed for logging into Urbit OS, but Urbit ID can be used as an identity primitive for any internet service. That means it’s vastly extensible. Perhaps more importantly, because Urbit IDs at the star and galaxy level represent network infrastructure for the Urbit network, users have already begun to build a range of business models upon them, from hosting providers to community hubs. We explored several of these possibilities in detail in the [first post](https://urbit.org/blog/value-of-address-space-pt1/) in the series, and we also provide a primer on Urbit ID itself.
24
25
25Second, Urbit address space is finite, and that means it’s scarce. This design, which we explained in more detail in the [second post](https://urbit.org/blog/value-of-address-space-pt2/) in the series, was intended to promote good behavior and to limit spam. So far, that has worked. Scarcity is also impacted by availability of supply, which we’ll explore in this post.
26Second, Urbit address space is finite, and that means it’s scarce. This design, which we explained in more detail in the [second post](https://urbit.org/blog/value-of-address-space-pt2/) in the series, was intended to promote good behavior and to limit spam. So far, that has worked. Scarcity is also impacted by availability of supply, which we’ll explore in this post.
26
27
27−Third, network effects, also described in the second post in this series, have the potential to build upon themselves quite rapidly within the Urbit ecosystem. Urbit is essentially a network of other networks, each owned and controlled by their individual users. For this reason, Urbit’s network effect is best described by Reed’s law, which argues that the value of a network increases with the number of groups that can be built on the network. In Urbit’s case, this number is essentially bounded only by the amount of data that can be stored in Urbit itself, which today is 2GB. That size is already enough to support vastly more groups than anyone has tried to launch, and we plan to grow beyond that limit in the coming year.
28+Third, network effects, also described in the second post in this series, have the potential to build upon themselves quite rapidly within the Urbit ecosystem. Urbit is essentially a network of other networks, each owned and controlled by their individual users. For this reason, Urbit’s network effect is best described by Reed’s law, which argues that the value of a network increases with the number of groups that can be built on the network. In Urbit’s case, this number is essentially bounded only by the amount of data that can be stored in Urbit itself, which today is 2GB. That size is already enough to support vastly more groups than anyone has tried to launch, and we plan to grow beyond that limit in the coming year.
28
29
29−Also in Part 2, we explored trading of Urbit address space. We look at the current price of stars and planets as denominated in both BTC, and USD, and we see that the price of Urbit address space has remained fairly constant since its launch on-chain, while volume has been steadily increasing. The market is continually developing, with more ways to buy and sell Urbit address space cropping up.
30+Also in Part 2, we explored trading of Urbit address space. We look at the current price of stars and planets as denominated in both BTC, and USD, and we see that the price of Urbit address space has remained fairly constant since its launch on-chain, while volume has been steadily increasing. The market is continually developing, with more ways to buy and sell Urbit address space cropping up.
30
31
31−So, to recap: our view is that the value of Urbit address space is a function of its utility, scarcity, network effects, and ease of trade.
32+So, to recap: our view is that the value of Urbit address space is a function of its utility, scarcity, network effects, and ease of trade.
32
33
33−In this post, we don’t expand that framework, but rather explore two elements that are important to actually using the framework. We’ll explain lockups, since they impact scarcity, and we’ll discuss usage metrics — including why we don’t (and in most cases can’t) track them.
34+In this post, we don’t expand that framework, but rather explore two elements that are important to actually using the framework. We’ll explain lockups, since they impact scarcity, and we’ll discuss usage metrics — including why we don’t (and in most cases can’t) track them.
34
35
35−## Lockups and spawning limits
36+## Lockups and spawning limits
36
37
37One way to think about galaxies, stars, and planets is that they’re different-sized buckets of Urbit IDs. A star contains 2<sup>16</sup> (~65K) planets, a galaxy contains 2<sup>8</sup> (256) stars and, in turn, 2<sup>24</sup> planets (16,777,216). Beyond this nesting pattern, there are three further considerations to note: booted versus unbooted addresses, locked versus unlocked addresses, and planet spawning limits.
38One way to think about galaxies, stars, and planets is that they’re different-sized buckets of Urbit IDs. A star contains 2<sup>16</sup> (~65K) planets, a galaxy contains 2<sup>8</sup> (256) stars and, in turn, 2<sup>24</sup> planets (16,777,216). Beyond this nesting pattern, there are three further considerations to note: booted versus unbooted addresses, locked versus unlocked addresses, and planet spawning limits.
38
39
39Booted and Unbooted Addresses –
40Booted and Unbooted Addresses –
40
41
41−A booted address is one that has actually been used to boot Urbit OS. By convention, booted addresses are expected to have some existing reputation outside of their name alone, since they’ve been used on the network. Reputation, good and bad, comes in many forms. Did the address operate any useful infrastructure? Did it get placed on any blacklists for spam or abuse? Did it simply send and receive messages? The ability to programatically track reputation is still in its infancy, but we expect the tooling to develop as Urbit grows.
42+A booted address is one that has actually been used to boot Urbit OS. By convention, booted addresses are expected to have some existing reputation outside of their name alone, since they’ve been used on the network. Reputation, good and bad, comes in many forms. Did the address operate any useful infrastructure? Did it get placed on any blacklists for spam or abuse? Did it simply send and receive messages? The ability to programatically track reputation is still in its infancy, but we expect the tooling to develop as Urbit grows.
42
43
43−Unbooted addresses, on the other hand, have no reputation. Both booted and unbooted addresses can be transferred between owners, but booted addresses will likely vary widely in price depending on the reputation each of them has acquired, and how they’ve been used.
44+Unbooted addresses, on the other hand, have no reputation. Both booted and unbooted addresses can be transferred between owners, but booted addresses will likely vary widely in price depending on the reputation each of them has acquired, and how they’ve been used.
44
45
45−For the purposes of this discussion, we’re primarily referring to unbooted addresses, as they have no reputation, and so are more similar to one another. We anticipate that booted addresses will trade infrequently — and likely via broker or auction, since users will prefer to control the reputation of the ID they’ve developed, rather than transfer that reputation to another.
46+For the purposes of this discussion, we’re primarily referring to unbooted addresses, as they have no reputation, and so are more similar to one another. We anticipate that booted addresses will trade infrequently — and likely via broker or auction, since users will prefer to control the reputation of the ID they’ve developed, rather than transfer that reputation to another.
46
47
47Locked vs. Unlocked Addresses –
48Locked vs. Unlocked Addresses –
48
49
@@ -50,7 +51,7 @@ At present, the majority of Urbit address space is locked by smart contracts. Wh
50
51
51A locked star is held in a contract and can neither be booted nor issue planets. The lockup contracts can be examined on [GitHub](https://github.com/urbit/azimuth).
52A locked star is held in a contract and can neither be booted nor issue planets. The lockup contracts can be examined on [GitHub](https://github.com/urbit/azimuth).
52
53
53−In practice, the only Urbit IDs that are ‘locked’ are stars. A galaxy that is said to be locked is simply a galaxy whose stars are currently held by a lockup contract. A locked galaxy can be transferred (i.e. sold or simply moved to a new key) and booted (importantly, any galaxy—booted or not—can vote), but it can’t issue stars until the lockup contract expires.
54+In practice, the only Urbit IDs that are ‘locked’ are stars. A galaxy that is said to be locked is simply a galaxy whose stars are currently held by a lockup contract. A locked galaxy can be transferred (i.e. sold or simply moved to a new key) and booted (importantly, any galaxy—booted or not—can vote), but it can’t issue stars until the lockup contract expires.
54
55
55<br>
56<br>
56<img class="ba" src="https://media.urbit.org/site/posts/essays/value-of-address-space-pt3-graph1.png">
57<img class="ba" src="https://media.urbit.org/site/posts/essays/value-of-address-space-pt3-graph1.png">
@@ -60,24 +61,22 @@ In practice, the only Urbit IDs that are ‘locked’ are stars. A galaxy that i
60<img class="ba" src="https://media.urbit.org/site/posts/essays/value-of-address-space-pt3-graph2.png">
61<img class="ba" src="https://media.urbit.org/site/posts/essays/value-of-address-space-pt3-graph2.png">
61<br>
62<br>
62
63
63−These lockups all began to release at varying linear rates in January 2019 (specifically on Tue Jan 08 23:34:41 2019 UTC).
64+These lockups all began to release at varying linear rates in January 2019 (specifically on Tue Jan 08 23:34:41 2019 UTC).
64
65
65The various linear unlocking schedules are grouped as follows:
66The various linear unlocking schedules are grouped as follows:
66
67
67- The urbit.org addresses, and early prize winners unlock linearly from 2019-2021.
68- The urbit.org addresses, and early prize winners unlock linearly from 2019-2021.
68−- Tlon, its founders, employees, and most purchasers from Tlon were frozen for a year, and now unlock linearly from 2020-2024.
69+- Tlon, its founders, employees, and most purchasers from Tlon were frozen for a year, and now unlock linearly from 2020-2024.
69−- 2018 private buyers were frozen for a year, and then began to unlock linearly over the course of one or three years, depending on the terms of their respective contracts.
70+- 2018 private buyers were frozen for a year, and then began to unlock linearly over the course of one or three years, depending on the terms of their respective contracts.
70- Earlier private buyer addresses—including those in our first two crowdsales—were unlocked right away.
71- Earlier private buyer addresses—including those in our first two crowdsales—were unlocked right away.
71
72
73+As of January 2020, 17,283 stars were unlocked and tradeable. By January 2021, 33,355 will be available. On January 9, 2024, all 65,536 stars will be unlocked and available for trading.
72
74
73−As of January 2020, 17,283 stars were unlocked and tradeable. By January 2021, 33,355 will be available. On January 9, 2024, all 65,536 stars will be unlocked and available for trading.
74−
75−Being unlocked does not necessarily mean that a star can spawn all of its planets. For that calculation, we must turn to spawning limits.
75+Being unlocked does not necessarily mean that a star can spawn all of its planets. For that calculation, we must turn to spawning limits.
76−
77
76
78Spawning Limits –
77Spawning Limits –
79
78
80−Unlocked stars are further gated by the number of planets they’re able to spawn. Every unlocked star was immediately able to spawn 1024 planets from the moment Urbit went live on the blockchain in January 2019—we wanted everyone to be able to invite some friends to their communities right away. From that date forward, the spawnable amount doubles every year (365 days), maxing out at 65,535 spawnable planets after 6 years.
79+Unlocked stars are further gated by the number of planets they’re able to spawn. Every unlocked star was immediately able to spawn 1024 planets from the moment Urbit went live on the blockchain in January 2019—we wanted everyone to be able to invite some friends to their communities right away. From that date forward, the spawnable amount doubles every year (365 days), maxing out at 65,535 spawnable planets after 6 years.
81
80
82<br>
81<br>
83<img class="ba" src="https://media.urbit.org/site/posts/essays/value-of-address-space-pt3-graph3.png">
82<img class="ba" src="https://media.urbit.org/site/posts/essays/value-of-address-space-pt3-graph3.png">
@@ -87,17 +86,17 @@ When we layer the spawning limits over the various lockup contracts, we find tha
87
86
88## Address space distribution
87## Address space distribution
89
88
90−Address space has continued to change hands since we put Urbit on-chain in January 2019. At that time, we had a fairly granular understanding of who owned what. Today we only have precise numbers for the Tlon and urbit.org owned address space. Galaxies change hands quite infrequently, so we know more about that ownership than stars and planets. We know next to nothing about the distribution of planets.
89+Address space has continued to change hands since we put Urbit on-chain in January 2019. At that time, we had a fairly granular understanding of who owned what. Today we only have precise numbers for the Tlon and urbit.org owned address space. Galaxies change hands quite infrequently, so we know more about that ownership than stars and planets. We know next to nothing about the distribution of planets.
91
90
92−We consider the opacity of our understanding about transactions on the network to be a privacy feature rather than a bug. To be specific about the information we can collect here: first, we don’t know anything about users beyond their ETH address, and second, we can’t tell the difference between a transfer of an address, and the re-keying of an address. This means we’re never entirely sure if a transfer has in fact occurred; we only know that the address has changed.
91+We consider the opacity of our understanding about transactions on the network to be a privacy feature rather than a bug. To be specific about the information we can collect here: first, we don’t know anything about users beyond their ETH address, and second, we can’t tell the difference between a transfer of an address, and the re-keying of an address. This means we’re never entirely sure if a transfer has in fact occurred; we only know that the address has changed.
93
92
94−The chart below is an estimate (as of January 2020) based on our general understanding of how galaxies are distributed. Much of this is anecdotal, and it’s largely based on the very few transactions we’ve observed within the galaxy table since Urbit went on chain in 2019. This chart should therefore be understood as incomplete, and an estimate only.
93+The chart below is an estimate (as of January 2020) based on our general understanding of how galaxies are distributed. Much of this is anecdotal, and it’s largely based on the very few transactions we’ve observed within the galaxy table since Urbit went on chain in 2019. This chart should therefore be understood as incomplete, and an estimate only.
95
94
96<br>
95<br>
97<img class="ba" src="https://media.urbit.org/site/posts/essays/value-of-address-space-pt3-graph4.png">
96<img class="ba" src="https://media.urbit.org/site/posts/essays/value-of-address-space-pt3-graph4.png">
98<br>
97<br>
99
98
100−Address space distribution is best understood in terms of galaxies and stars independently, as they’re distinct assets. The chart above only illustrates galaxy distribution, but describes Tlon’s “naked” galaxy holdings, which are galaxies empty of their stars. These galaxies are empty because the stars they once contained have been distributed, primarily to Tlon contractors, employees, and to certain private buyers.
99+Address space distribution is best understood in terms of galaxies and stars independently, as they’re distinct assets. The chart above only illustrates galaxy distribution, but describes Tlon’s “naked” galaxy holdings, which are galaxies empty of their stars. These galaxies are empty because the stars they once contained have been distributed, primarily to Tlon contractors, employees, and to certain private buyers.
101
100
102We believe that wide distribution is important to the health of the network and the growth of Urbit as a whole. Our own distribution efforts are focused on disbursing Urbit address space ownership as broadly as possible to those interested in using and developing the network.
101We believe that wide distribution is important to the health of the network and the growth of Urbit as a whole. Our own distribution efforts are focused on disbursing Urbit address space ownership as broadly as possible to those interested in using and developing the network.
103
102
@@ -111,19 +110,19 @@ First, it’s too early. Urbit’s current users are a fanbase of pioneers who a
111
110
112We’re laying the groundwork so that we can, in earnest, invite our friends and communities to a network they will love. That means we’re designing smooth onboarding, an elegant user interface, and increasing the stability of both the system and network. Tlon’s forthcoming hosting services will vastly reduce barriers to entry, and will be our first major push into the public sphere.
111We’re laying the groundwork so that we can, in earnest, invite our friends and communities to a network they will love. That means we’re designing smooth onboarding, an elegant user interface, and increasing the stability of both the system and network. Tlon’s forthcoming hosting services will vastly reduce barriers to entry, and will be our first major push into the public sphere.
113
112
114−Second, and perhaps more importantly, capturing data about traction on the network is difficult by design. Due to Urbit's privacy-forward architecture, there’s quite a lot we will never know. Once an Urbit ID is up and running, we don’t know how often it operates, where it’s hosted, or what it’s doing. This makes capturing usage metrics challenging, but we think this is the right problem to have.
113+Second, and perhaps more importantly, capturing data about traction on the network is difficult by design. Due to Urbit's privacy-forward architecture, there’s quite a lot we will never know. Once an Urbit ID is up and running, we don’t know how often it operates, where it’s hosted, or what it’s doing. This makes capturing usage metrics challenging, but we think this is the right problem to have.
115
114
116The Network Explorer –
115The Network Explorer –
117
116
118In the next several months we plan to roll out the first iteration of a network explorer that will allow users to visualize the structure and composition of the network as well as some basic activity data. Our first version of the network explorer will include representations of how the various layers of address space fit together, the finiteness of address space, historical uptime for nodes, and the various unlocking schedules.
117In the next several months we plan to roll out the first iteration of a network explorer that will allow users to visualize the structure and composition of the network as well as some basic activity data. Our first version of the network explorer will include representations of how the various layers of address space fit together, the finiteness of address space, historical uptime for nodes, and the various unlocking schedules.
119−The network explorer will also allow users to zoom in on various nodes to learn more about them and what they offer.
118+The network explorer will also allow users to zoom in on various nodes to learn more about them and what they offer.
120Urbit’s privacy-forward design makes collection of data appropriately impossible in many cases. That said, the network explorer should begin to collect all the elements of the value framework we’ve laid out here in one dynamic visualization.
119Urbit’s privacy-forward design makes collection of data appropriately impossible in many cases. That said, the network explorer should begin to collect all the elements of the value framework we’ve laid out here in one dynamic visualization.
121
120
122Closing –
121Closing –
123
122
124−We have long said that Urbit address space had value because it was both useful and scarce. Taking a deeper look, we found that some limited liquidity, and network effect also play an important role in the value framework.
123+We have long said that Urbit address space had value because it was both useful and scarce. Taking a deeper look, we found that some limited liquidity, and network effect also play an important role in the value framework.
125
124
126−All of the factors that make up our framework are, in turn, impacted by availability of supply and by user growth. In the Urbit ecosystem, supply is effectively gated—as described above—in order to prevent flooding of the network.
125+All of the factors that make up our framework are, in turn, impacted by availability of supply and by user growth. In the Urbit ecosystem, supply is effectively gated—as described above—in order to prevent flooding of the network.
127
126
128User growth, on the other hand, is something we simply have not yet pursued in earnest. Instead, our development efforts have been focused on enhancing usability and stability of the platform. Our focus on user growth will begin as we roll out hosting. Once that happens, usage metrics will become both more interesting and more relevant.
127User growth, on the other hand, is something we simply have not yet pursued in earnest. Instead, our development efforts have been focused on enhancing usability and stability of the platform. Our focus on user growth will begin as we roll out hosting. Once that happens, usage metrics will become both more interesting and more relevant.
129
128
content/blog/what-is-urbit-for.md+67−62
@@ -1,85 +1,90 @@
1+++
1+++
2title = "What is Urbit For?"
2title = "What is Urbit For?"
3−date = 2016-05-11
3+date = "2016-05-10"
4description = "A vision of the Urbit-powered future."
4description = "A vision of the Urbit-powered future."
5+aliases = [
5−aliases = ["/posts/essays/what-is-urbit-for", "/posts/what-is-urbit-for"]
6+ "/posts/essays/what-is-urbit-for",
7+ "/posts/what-is-urbit-for"
8+]
9+
6[extra]
10[extra]
7author = "Galen Wolfe-Pauly"
11author = "Galen Wolfe-Pauly"
8ship = "~ravmel-ropdyl"
12ship = "~ravmel-ropdyl"
9−image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/what-is-urbit-for.jpg"
13+image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/what-is-urbit-for.jpg"
10+++
14+++
15+
11![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/what-is-urbit-for.jpg)
16![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/what-is-urbit-for.jpg)
12
17
13Open platforms don't beat closed systems just because they're open.
18Open platforms don't beat closed systems just because they're open.
14−They win because you can do more exciting things with them. We
19+They win because you can do more exciting things with them. We
15believe we're overdue for new infrastructure not purely on principle:
20believe we're overdue for new infrastructure not purely on principle:
16but because we think you can build better products on top.
21but because we think you can build better products on top.
17
22
18We look forward to a future where your fleet of Urbits run the devices
23We look forward to a future where your fleet of Urbits run the devices
19throughout your house, keep your biometric data in sync with the data
24throughout your house, keep your biometric data in sync with the data
20−center and hold your secure medical and financial data. Today Urbit
25+center and hold your secure medical and financial data. Today Urbit
21is just a proof of concept — but we see a road from here to there.
26is just a proof of concept — but we see a road from here to there.
22
27
23## Today
28## Today
24
29
25−These are things that work but are under development today. We expect
30+These are things that work but are under development today. We expect
26them to improve and stabilize in the coming months.
31them to improve and stabilize in the coming months.
27
32
28### Making the web programmable
33### Making the web programmable
29
34
30The first thing your Urbit can do is act as a transparent layer to
35The first thing your Urbit can do is act as a transparent layer to
31−your existing services. We'd like urbit to be usable as a self-hosted
36+your existing services. We'd like urbit to be usable as a self-hosted
32−IFTTT for geeks. Your urbit can hold your keys, store data, run
37+IFTTT for geeks. Your urbit can hold your keys, store data, run
33−programs and seamlessly connect to your existing services. Plus, with
38+programs and seamlessly connect to your existing services. Plus, with
34a global revision controlled filesystem it's easy to share API
39a global revision controlled filesystem it's easy to share API
35connectors and keep them up to date.
40connectors and keep them up to date.
36
41
37With an Urbit running on your machine you can `ls` your Gmail from
42With an Urbit running on your machine you can `ls` your Gmail from
38−Unix. Write a short script to poll Twitter on a keyword and deliver
43+Unix. Write a short script to poll Twitter on a keyword and deliver
39−the results to your email or into a Slack channel. Send an SMS when
44+the results to your email or into a Slack channel. Send an SMS when
40−an HTTP request doesn't resolve. These are just a few examples. Your
45+an HTTP request doesn't resolve. These are just a few examples. Your
41Urbit is designed to make data trapped in your existing services feel
46Urbit is designed to make data trapped in your existing services feel
42like an extension of your local programming environment.
47like an extension of your local programming environment.
43
48
44### Self-hosted publishing and communication
49### Self-hosted publishing and communication
45
50
46Additionally your Urbit is a flexible platform for publishing data to
51Additionally your Urbit is a flexible platform for publishing data to
47−the web and communicating with others. Sort of like a self-hosted
52+the web and communicating with others. Sort of like a self-hosted
48−Slack, WordPress and Wiki in one. It's more common to use many tools
53+Slack, WordPress and Wiki in one. It's more common to use many tools
49−for sharing our content and communicating. Urbit is designed to bring
54+for sharing our content and communicating. Urbit is designed to bring
50those tools together; giving the individual control over their
55those tools together; giving the individual control over their
51creative output.
56creative output.
52
57
53Simply write markdown in your favorite editor and have an Urbit sync
58Simply write markdown in your favorite editor and have an Urbit sync
54−them to the cloud. Use React components to control your layout and
59+them to the cloud. Use React components to control your layout and
55−extend our toolset. Host your own discussion channels and comment
60+extend our toolset. Host your own discussion channels and comment
56−threads. On a computer you own and control, whose source is 100%
61+threads. On a computer you own and control, whose source is 100%
57open.
62open.
58
63
59### Cryptographic identity
64### Cryptographic identity
60
65
61Your Urbit is your digital identity, cryptographically secured but not
66Your Urbit is your digital identity, cryptographically secured but not
62−controlled by any central authority. The Urbit PKI fills a gap that
67+controlled by any central authority. The Urbit PKI fills a gap that
63−remains unsolved on the web. We can send encrypted messages, securely
68+remains unsolved on the web. We can send encrypted messages, securely
64exchange digital currency, but how do I know who anyone is?
69exchange digital currency, but how do I know who anyone is?
65
70
66Your Urbit can post public proof to your third party services and its
71Your Urbit can post public proof to your third party services and its
67−validity is easily auditable. Using Urbit as an identity scheme for
72+validity is easily auditable. Using Urbit as an identity scheme for
68new services would be a great decentralized alternative to 'Sign in
73new services would be a great decentralized alternative to 'Sign in
69with [company x]'.
74with [company x]'.
70
75
71## Tomorrow
76## Tomorrow
72
77
73Urbit's crypto isn't tested, the network still gets rebooted from time
78Urbit's crypto isn't tested, the network still gets rebooted from time
74−to time. The next milestone comes when Urbit matures to the point
79+to time. The next milestone comes when Urbit matures to the point
75that it's as reliable as its SaaS counterparts.
80that it's as reliable as its SaaS counterparts.
76
81
77### Lifestreams, finally
82### Lifestreams, finally
78
83
79The combination of great API tools and great publishing tools means we
84The combination of great API tools and great publishing tools means we
80can finally build an integrated interface for today's social networks.
85can finally build an integrated interface for today's social networks.
81−The web is full of streams of data. For the user there's not much
86+The web is full of streams of data. For the user there's not much
82−utility in bouncing from service to service. Instead, it'd be great
87+utility in bouncing from service to service. Instead, it'd be great
83to have general-purpose tools for consuming and publishing data.
88to have general-purpose tools for consuming and publishing data.
84Imagine a Medium-quality interface that makes no distinction between
89Imagine a Medium-quality interface that makes no distinction between
85Facebook and Twitter; SMS and Skype.
90Facebook and Twitter; SMS and Skype.
@@ -87,54 +92,54 @@ Facebook and Twitter; SMS and Skype.
87### Secret storage, web3
92### Secret storage, web3
88
93
89Bitcoin and Ethereum are both part of a new era of decentralized
94Bitcoin and Ethereum are both part of a new era of decentralized
90−infrastructure that's just beginning. For the blockchain to realize
95+infrastructure that's just beginning. For the blockchain to realize
91its potential individuals need ought to have a way to host their own
96its potential individuals need ought to have a way to host their own
92−nodes. At the very least, individuals need a reliable place to keep
97+nodes. At the very least, individuals need a reliable place to keep
93−their secrets. What's more, the blockchain isn't designed for
98+their secrets. What's more, the blockchain isn't designed for
94−computation. It's great for contracts and currency, but too slow for
99+computation. It's great for contracts and currency, but too slow for
95practical computing.
100practical computing.
96
101
97−Urbit is a great complement to the blockchain. Your Urbit can safely
102+Urbit is a great complement to the blockchain. Your Urbit can safely
98store your keys, providing an always-available keychain on the
103store your keys, providing an always-available keychain on the
99−network. Even better, your Urbit can hold your blockchain assets and
104+network. Even better, your Urbit can hold your blockchain assets and
100−provide an off-chain computation layer. Urbit's computation doesn't
105+provide an off-chain computation layer. Urbit's computation doesn't
101provide any kind of distributed consensus, but our computation model
106provide any kind of distributed consensus, but our computation model
102−is very simple and lends itself well to auditing. This makes it a
107+is very simple and lends itself well to auditing. This makes it a
103very blockchain-friendly platform.
108very blockchain-friendly platform.
104
109
105## Over the horizon
110## Over the horizon
106
111
107If there's one thing we know from the history of personal computers
112If there's one thing we know from the history of personal computers
108it's that computers are always expanding into more and more of our
113it's that computers are always expanding into more and more of our
109−lives. The more _personal_ our computers get the more they need to
114+lives. The more _personal_ our computers get the more they need to
110−reflect our thinking and our relationships. We don't know exactly
115+reflect our thinking and our relationships. We don't know exactly
111what this will look like, but we can certainly speculate on the areas
116what this will look like, but we can certainly speculate on the areas
112that deserve the most attention.
117that deserve the most attention.
113
118
114### Data permanence and software competition
119### Data permanence and software competition
115
120
116Right now applications and data are practically the same thing.
121Right now applications and data are practically the same thing.
117−There's no practical way for the user to separate them. Apps come and
122+There's no practical way for the user to separate them. Apps come and
118−go, either by falling out of fashion or actually shutting down. In
123+go, either by falling out of fashion or actually shutting down. In
119−both cases our data becomes orphaned. There's no practical way for us
124+both cases our data becomes orphaned. There's no practical way for us
120−to get it back. The raw data from your LiveJournal is as good as a
125+to get it back. The raw data from your LiveJournal is as good as a
121−floppy disk from the 80s. Computers hold the records of our lives.
126+floppy disk from the 80s. Computers hold the records of our lives.
122Losing the history of the world to bitrot is a preventable problem.
127Losing the history of the world to bitrot is a preventable problem.
123
128
124Since each person owns their own Urbit there's no way to separate the
129Since each person owns their own Urbit there's no way to separate the
125−user from their data. When you run software on your Urbit you
130+user from their data. When you run software on your Urbit you
126_actually run it_ and your programs manipulate data that _you own_.
131_actually run it_ and your programs manipulate data that _you own_.
127−The individual has permanent access to their data by design. Ensuring
132+The individual has permanent access to their data by design. Ensuring
128its durability is a technical problem, not a license agreement
133its durability is a technical problem, not a license agreement
129problem.
134problem.
130
135
131When individuals are running their own software it's no longer
136When individuals are running their own software it's no longer
132−possible to lock them in by controlling their data. Instead, software
137+possible to lock them in by controlling their data. Instead, software
133−has to actually compete on utility. If one could trivially replace
138+has to actually compete on utility. If one could trivially replace
134the interface for Evernote with one from another developer for $10
139the interface for Evernote with one from another developer for $10
135−wouldn't it be worth it? Even more so with Urbit, since after
140+wouldn't it be worth it? Even more so with Urbit, since after
136installing software you're not dependent on the developer staying
141installing software you're not dependent on the developer staying
137−alive. You're running a local copy. This model puts pressure on
142+alive. You're running a local copy. This model puts pressure on
138applications to interoperate better and become more modular.
143applications to interoperate better and become more modular.
139
144
140### Reputation
145### Reputation
@@ -145,14 +150,14 @@ Just like the marriage of applications and data, reputation is
145permanently tethered to and jealously guarded by the services we use.
150permanently tethered to and jealously guarded by the services we use.
146
151
147For example, today we have karma systems on a per-site basis, like
152For example, today we have karma systems on a per-site basis, like
148−Reddit. Is there any reason that individuals shouldn't have karma
153+Reddit. Is there any reason that individuals shouldn't have karma
149−scores per-topic? An individual's authority on a certain topic could
154+scores per-topic? An individual's authority on a certain topic could
150−be verified by other experts while still denied by detractors. It's
155+be verified by other experts while still denied by detractors. It's
151−easy to extend this to services like Yelp. With a strong identity
156+easy to extend this to services like Yelp. With a strong identity
152system it's possible for pseudonymous reviews to be counted with real
157system it's possible for pseudonymous reviews to be counted with real
153−value. We'd no longer need a central authority for deciding on the
158+value. We'd no longer need a central authority for deciding on the
154reputation of a restaurant, but just a way to pseudonymously aggregate
159reputation of a restaurant, but just a way to pseudonymously aggregate
155−individual opinions. There's a broad swath of territory ripe for
160+individual opinions. There's a broad swath of territory ripe for
156exploration here.
161exploration here.
157
162
158### Privacy
163### Privacy
@@ -160,32 +165,32 @@ exploration here.
160With a reliably secure place to store your data on the network,
165With a reliably secure place to store your data on the network,
161wouldn't you want to store even more personal information yourself?
166wouldn't you want to store even more personal information yourself?
162Why is it that we don't store our own medical records, biometric data
167Why is it that we don't store our own medical records, biometric data
163−or financial data? In a world where we have a safe place to keep them
168+or financial data? In a world where we have a safe place to keep them
164we wouldn't require anyone else to keep them for us.
169we wouldn't require anyone else to keep them for us.
165
170
166−Furthermore, we'd be able to share them pseudonymously. One could
171+Furthermore, we'd be able to share them pseudonymously. One could
167imagine medical research or census-like polling being done without
172imagine medical research or census-like polling being done without
168−compromising the privacy of those involved. This also lowers the
173+compromising the privacy of those involved. This also lowers the
169−barrier to entry for fintech and medical software developers. If I
174+barrier to entry for fintech and medical software developers. If I
170can run my own personal health and finance software that can reliably
175can run my own personal health and finance software that can reliably
171access my own transactions and medical records, what would developers
176access my own transactions and medical records, what would developers
172come up with?
177come up with?
173
178
174### IoT
179### IoT
175
180
176−What needs a network _and_ computation? Devices. Turning a unix box
181+What needs a network _and_ computation? Devices. Turning a unix box
177into a usable platform for hardware isn't something that any
182into a usable platform for hardware isn't something that any
178−individual manufacturer is incentivized to do. For the internet of
183+individual manufacturer is incentivized to do. For the internet of
179things to actually work we need a platform for devices to interoperate
184things to actually work we need a platform for devices to interoperate
180−simply and securely. Urbit is up to the task. Your Urbit isn't just
185+simply and securely. Urbit is up to the task. Your Urbit isn't just
181a single instance, it can sign the keys for a whole network of Urbits
186a single instance, it can sign the keys for a whole network of Urbits
182intended to be used for your devices, sensors, appliances, machines,
187intended to be used for your devices, sensors, appliances, machines,
183robots, VR helmet, etc.
188robots, VR helmet, etc.
184
189
185The future of the individual's computing experience may very likely be
190The future of the individual's computing experience may very likely be
186−among many different devices. Bret Victor's 'Seeing Spaces' is a
191+among many different devices. Bret Victor's 'Seeing Spaces' is a
187−great exploration of what this future may look like. For the
192+great exploration of what this future may look like. For the
188industrial enterprise there's a whole other set of parallel problems:
193industrial enterprise there's a whole other set of parallel problems:
189tracking inventory, controlling a vast array of machines, and managing
194tracking inventory, controlling a vast array of machines, and managing
190−logistics. In both cases we need a decentralized network and
195+logistics. In both cases we need a decentralized network and
191−computing platform. Urbit is up to the task.
196+computing platform. Urbit is up to the task.
content/blog/why-hoon.md+4−2
@@ -1,7 +1,8 @@
1+++
1+++
2title = "Why Hoon?"
2title = "Why Hoon?"
3−date = 2019-11-14
3+date = "2019-11-13"
4description = "The promise of Urbit lies in its reimagination of the digital world using components that are as constrained and limited as possible."
4description = "The promise of Urbit lies in its reimagination of the digital world using components that are as constrained and limited as possible."
5+
5[extra]
6[extra]
6author = "Ted Blackman"
7author = "Ted Blackman"
7ship = "~rovnys-ricfer"
8ship = "~rovnys-ricfer"
@@ -19,6 +20,7 @@ sense.
19
20
20In particular, the problems Hoon solves that aren't solved by other
21In particular, the problems Hoon solves that aren't solved by other
21functional languages are:
22functional languages are:
23+
22- Compile and run other code in a typesafe manner at full speed,
24- Compile and run other code in a typesafe manner at full speed,
23- Typesafe metaprogramming, and
25- Typesafe metaprogramming, and
24- Hot code reload and online data migration.
26- Hot code reload and online data migration.
@@ -143,7 +145,7 @@ Hoon and Nock have several unusual properties:
143 the runtime has a matching jet, it will use that instead of the Nock
145 the runtime has a matching jet, it will use that instead of the Nock
144 implementation. Nock isn't as slow as you might think, especially
146 implementation. Nock isn't as slow as you might think, especially
145 considering it's a minimal, dynamic, axiomatic language.
147 considering it's a minimal, dynamic, axiomatic language.
146−<br/><br/>
148+ <br/><br/>
147 This arrangement has the deeper implication that all code written in
149 This arrangement has the deeper implication that all code written in
148 Nock is best considered as a specification for a program, which can be
150 Nock is best considered as a specification for a program, which can be
149 executed directly but might never run at all due to being jetted.
151 executed directly but might never run at all due to being jetted.
content/blog/why-urbit-probably-does-not-need-a-blockchain.md+160−154
@@ -1,13 +1,19 @@
1+++
1+++
2title = "Why Urbit Probably Doesn't Need a Blockchain"
2title = "Why Urbit Probably Doesn't Need a Blockchain"
3−date = 2016-07-14
3+date = "2016-07-13"
4description = "Urbit (probably) doesn't need a blockchain, because the Urbit address-space PKI is a special case of a consensus ledger."
4description = "Urbit (probably) doesn't need a blockchain, because the Urbit address-space PKI is a special case of a consensus ledger."
5+aliases = [
5−aliases = ["/posts/essays/why-urbit-probably-does-not-need-a-blockchain/", "/posts/why-urbit-probably-does-not-need-a-blockchain/", "/blog/blockchain/"]
6+ "/posts/essays/why-urbit-probably-does-not-need-a-blockchain/",
7+ "/posts/why-urbit-probably-does-not-need-a-blockchain/",
8+ "/blog/blockchain/"
9+]
10+
6[extra]
11[extra]
7author = "Curtis Yarvin"
12author = "Curtis Yarvin"
8ship = "~sorreg-namtyv"
13ship = "~sorreg-namtyv"
9image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/why-urbit-probably-does-not-need-a-blockchain.jpg"
14image = "https://storage.googleapis.com/media.urbit.org/site/posts/essays/why-urbit-probably-does-not-need-a-blockchain.jpg"
10+++
15+++
16+
11![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/why-urbit-probably-does-not-need-a-blockchain.jpg)
17![](https://storage.googleapis.com/media.urbit.org/site/posts/essays/why-urbit-probably-does-not-need-a-blockchain.jpg)
12
18
13TLDR: Urbit (probably) doesn't need a blockchain, because the Urbit
19TLDR: Urbit (probably) doesn't need a blockchain, because the Urbit
@@ -26,27 +32,27 @@ Gabriel's famous
26["worse is better"](https://en.wikipedia.org/wiki/Worse_is_better) essay.
32["worse is better"](https://en.wikipedia.org/wiki/Worse_is_better) essay.
27
33
28There are two kinds of mindsets when approaching hard technical
34There are two kinds of mindsets when approaching hard technical
29−problems. The "MIT" mindset, more typical among mathematicians and
35+problems. The "MIT" mindset, more typical among mathematicians and
30scientists, wants to attack the problem as its simplest and broadest
36scientists, wants to attack the problem as its simplest and broadest
31−case, producing the most general and powerful solution available. In
37+case, producing the most general and powerful solution available. In
32short: better-is-better.
38short: better-is-better.
33
39
34The "New Jersey" worse-is-better mentality, more typical among
40The "New Jersey" worse-is-better mentality, more typical among
35programmers and engineers, wants to do everything possible to _not_
41programmers and engineers, wants to do everything possible to _not_
36−attack the problem. Can I produce a serviceable approximation to a
42+attack the problem. Can I produce a serviceable approximation to a
37−true solution? Do I actually have to solve the general problem, or
43+true solution? Do I actually have to solve the general problem, or
38−can I reduce it to an easier special case? Can I change the product
44+can I reduce it to an easier special case? Can I change the product
39so it doesn't have this problem?
45so it doesn't have this problem?
40
46
41Ideally, anyone building anything has both these mindsets in their
47Ideally, anyone building anything has both these mindsets in their
42−toolbox. But it's worth noting that (a) Jersey designs (meaning the
48+toolbox. But it's worth noting that (a) Jersey designs (meaning the
43Bell Labs school that produced Unix, C, and Go) tend to beat MIT
49Bell Labs school that produced Unix, C, and Go) tend to beat MIT
44designs in the marketplace, and (b) there are very few pure-functional
50designs in the marketplace, and (b) there are very few pure-functional
45systems built with the true Jersey spirit.
51systems built with the true Jersey spirit.
46
52
47## Why Urbit (probably) doesn't need a blockchain
53## Why Urbit (probably) doesn't need a blockchain
48
54
49−Nakamoto consensus is an example of better-is-better. The blockchain
55+Nakamoto consensus is an example of better-is-better. The blockchain
50design is actually more powerful than it needs to be. It's not just a
56design is actually more powerful than it needs to be. It's not just a
51trustless decentralized ledger; it's a trustless decentralized
57trustless decentralized ledger; it's a trustless decentralized
52database and (as Ethereum has realized; but this idea is clearly
58database and (as Ethereum has realized; but this idea is clearly
@@ -54,29 +60,29 @@ present in Bitcoin's scripting language) a general-purpose, zero-trust
54decentralized computer.
60decentralized computer.
55
61
56Again, Urbit is not a general-purpose decentralized database or
62Again, Urbit is not a general-purpose decentralized database or
57−consensus computer. It's a special case of the former, which is a
63+consensus computer. It's a special case of the former, which is a
58−special case of the latter. Urbit is nothing but a digital title
64+special case of the latter. Urbit is nothing but a digital title
59−chain for network addresses. Our belief is that the special case is
65+chain for network addresses. Our belief is that the special case is
60much easier than the general case, which is why Urbit (probably)
66much easier than the general case, which is why Urbit (probably)
61doesn't need a blockchain.
67doesn't need a blockchain.
62
68
63The rest of this essay describes what makes this special case special,
69The rest of this essay describes what makes this special case special,
64−and how we can use that to not need full Nakamoto consensus, or any
70+and how we can use that to not need full Nakamoto consensus, or any
65kind of general-purpose Byzantine agreement.
71kind of general-purpose Byzantine agreement.
66
72
67## The double-sell problem
73## The double-sell problem
68
74
69−Urbit has the same basic "double-spend" issue as Bitcoin. As Satoshi
75+Urbit has the same basic "double-spend" issue as Bitcoin. As Satoshi
70puts it: "The problem of course is the payee can't verify that one of
76puts it: "The problem of course is the payee can't verify that one of
71the owners did not double-spend the coin." But Urbit is not a
77the owners did not double-spend the coin." But Urbit is not a
72currency, so we say "double-selling."
78currency, so we say "double-selling."
73
79
74−"Double-selling" means signing over an Urbit address (_ship_) to two
80+"Double-selling" means signing over an Urbit address (_ship_) to two
75different parties at the same time, presumably with the intent to sell
81different parties at the same time, presumably with the intent to sell
76it to both and skip town with the loot.
82it to both and skip town with the loot.
77
83
78−Again, the logical problem is the same. Bitcoin attacks it as a broad
84+Again, the logical problem is the same. Bitcoin attacks it as a broad
79−theoretical breakthrough: better-is-better. Urbit attacks it as a
85+theoretical breakthrough: better-is-better. Urbit attacks it as a
80narrow special case: worse-is-better.
86narrow special case: worse-is-better.
81
87
82Intuitively, Urbit's answer is that a real-estate transaction is
88Intuitively, Urbit's answer is that a real-estate transaction is
@@ -90,40 +96,40 @@ a quick look at the Urbit address space and PKI.
90## The Urbit address space and PKI
96## The Urbit address space and PKI
91
97
92(NB: this description differs in minor ways from the running code.
98(NB: this description differs in minor ways from the running code.
93−Where they differ, the description is right. Urbit is not at present
99+Where they differ, the description is right. Urbit is not at present
94secure: use for entertainment purpose only.)
100secure: use for entertainment purpose only.)
95
101
96An Urbit ship is an unsigned integer that serves four purposes: a
102An Urbit ship is an unsigned integer that serves four purposes: a
97cryptographic identity, a packet routing address, a stateful virtual
103cryptographic identity, a packet routing address, a stateful virtual
98computer, and a unique, human-memorable name.
104computer, and a unique, human-memorable name.
99
105
100−Each ship is owned by a private key. To transfer a ship to a new
106+Each ship is owned by a private key. To transfer a ship to a new
101−keypair, sign the new public key with the old private key. This
107+keypair, sign the new public key with the old private key. This
102−revokes the old key and activates the new key. Propagating this
108+revokes the old key and activates the new key. Propagating this
103−update globally makes the revocation global. This is essentially the
109+update globally makes the revocation global. This is essentially the
104digital title system a smart 12-year-old would design.
110digital title system a smart 12-year-old would design.
105
111
106### Ships and wills
112### Ships and wills
107
113
108−Ships are 128-bit numbers classified into tiers by bitwidth. An 8-bit
114+Ships are 128-bit numbers classified into tiers by bitwidth. An 8-bit
109−ship (a number less than 256) is a _galaxy_. A 16-bit ship is a
115+ship (a number less than 256) is a _galaxy_. A 16-bit ship is a
110−_star_. A 32-bit ship is a _planet_. A 64-bit ship is a _moon_. A
116+_star_. A 32-bit ship is a _planet_. A 64-bit ship is a _moon_. A
111128-bit ship is a _comet_.
117128-bit ship is a _comet_.
112
118
113−The chain of signatures for each ship is called a _will_. Unlike most
119+The chain of signatures for each ship is called a _will_. Unlike most
114certificate systems, there is no metadata in an Urbit will. Nothing is
120certificate systems, there is no metadata in an Urbit will. Nothing is
115−signed but the public-key fingerprint. The length of the will is the
121+signed but the public-key fingerprint. The length of the will is the
116−keypair version that owns the ship. This version is called its
122+keypair version that owns the ship. This version is called its
117−_life_. Each new signed fingerprint in the will is a _deed_.
123+_life_. Each new signed fingerprint in the will is a _deed_.
118
124
119−Who gets to create a ship? Comets are fingerprints of a random
125+Who gets to create a ship? Comets are fingerprints of a random
120−keypair. Moons, planets and stars are created by their _prefix_, the
126+keypair. Moons, planets and stars are created by their _prefix_, the
121ship whose bits are the bottom half of their formal width. For
127ship whose bits are the bottom half of their formal width. For
122instance, the star `0xbeef` is the prefix of the planet `0xdeadbeef`.
128instance, the star `0xbeef` is the prefix of the planet `0xdeadbeef`.
123Galaxies have their fingerprints hardcoded in the official kernel.
129Galaxies have their fingerprints hardcoded in the official kernel.
124
130
125−Ship numbers are not generally written in hex. They're written in
131+Ship numbers are not generally written in hex. They're written in
126−Hoon's `@p` syntax, a phonemic base-256. `@p` also permutes within
132+Hoon's `@p` syntax, a phonemic base-256. `@p` also permutes within
127tiers, to superficially conceal prefix structure; for instance,
133tiers, to superficially conceal prefix structure; for instance,
128`0xdead.beef` is `~firbyr-napbes`, while `0xcafe.beef` is
134`0xdead.beef` is `~firbyr-napbes`, while `0xcafe.beef` is
129`~nissep-sopnub`.
135`~nissep-sopnub`.
@@ -133,18 +139,18 @@ tiers, to superficially conceal prefix structure; for instance,
133The prefix of a moon, planet, or star also becomes its _parent_. The
139The prefix of a moon, planet, or star also becomes its _parent_. The
134parent of a ship is its natural locus of federated services. The most
140parent of a ship is its natural locus of federated services. The most
135basic such service is to mediate P2P routing, as a so-called
141basic such service is to mediate P2P routing, as a so-called
136−"supernode." But the set of potential federated services is
142+"supernode." But the set of potential federated services is
137unbounded.
143unbounded.
138
144
139−For moons, each new key update is signed by the parent. Planets and
145+For moons, each new key update is signed by the parent. Planets and
140−stars sign their own updates, making them independent. To prevent
146+stars sign their own updates, making them independent. To prevent
141denial-of-service attacks by parents against children, stars and
147denial-of-service attacks by parents against children, stars and
142−planets can _exit_, choosing a new parent. An exit deed is a key
148+planets can _exit_, choosing a new parent. An exit deed is a key
143update also signed by the new parent.
149update also signed by the new parent.
144
150
145The full public cryptographic record of a ship is its _dossier_. The
151The full public cryptographic record of a ship is its _dossier_. The
146dossier is the set of ship-will pairs, including all parents and
152dossier is the set of ship-will pairs, including all parents and
147−prefixes recursively, needed to validate the ship's current key. A
153+prefixes recursively, needed to validate the ship's current key. A
148ship can process a dossier from an untrusted source.
154ship can process a dossier from an untrusted source.
149
155
150The full set of ship-will pairs a ship knows is its _cabinet_. So the
156The full set of ship-will pairs a ship knows is its _cabinet_. So the
@@ -155,11 +161,11 @@ accepted into a ship's cabinet.
155
161
156The rule is simple: any deeds in the dossier which are new (not
162The rule is simple: any deeds in the dossier which are new (not
157already in the cabinet) must not use keys superseded in the cabinet.
163already in the cabinet) must not use keys superseded in the cabinet.
158−Otherwise revocation doesn't work. But revocation affects only
164+Otherwise revocation doesn't work. But revocation affects only
159dossiers received in the future; nothing already in the cabinet can be
165dossiers received in the future; nothing already in the cabinet can be
160revoked.
166revoked.
161
167
162−Intuitively, this algorithm creates a propagation race. Life `2` of
168+Intuitively, this algorithm creates a propagation race. Life `2` of
163`~firbyr-napbes` revokes life `1` of `~firbyr-napbes`, so propagating
169`~firbyr-napbes` revokes life `1` of `~firbyr-napbes`, so propagating
164life `2` to the whole network ensures that anyone who steals the
170life `2` to the whole network ensures that anyone who steals the
165private key for life `1` can't use it in any way -- whether to launch
171private key for life `1` can't use it in any way -- whether to launch
@@ -181,15 +187,15 @@ As the Karame ["Two Bitcoins at the Price of
181One"](http://eprint.iacr.org/2012/248.pdf) paper points out:
187One"](http://eprint.iacr.org/2012/248.pdf) paper points out:
182
188
183> An efficient countermeasure to combat double-spending on fast
189> An efficient countermeasure to combat double-spending on fast
184− Bitcoin payments would be for Bitcoin peers to propagate alerts
190+> Bitcoin payments would be for Bitcoin peers to propagate alerts
185− whenever they receive two or more transactions that share common
191+> whenever they receive two or more transactions that share common
186− inputs and different outputs.
192+> inputs and different outputs.
187
193
188"Fast Bitcoin payments" means zero-confirmation, ie, Bitcoin without
194"Fast Bitcoin payments" means zero-confirmation, ie, Bitcoin without
189−the blockchain. These double-spend alerts have never been integrated
195+the blockchain. These double-spend alerts have never been integrated
190into Bitcoin Core, despite frequent proposals. Given that Bitcoin
196into Bitcoin Core, despite frequent proposals. Given that Bitcoin
191_does_ have a blockchain, it seems quite sensible for purists to shun
197_does_ have a blockchain, it seems quite sensible for purists to shun
192−hacks that make zero-conf transactions somewhat more secure. Also,
198+hacks that make zero-conf transactions somewhat more secure. Also,
193double-spend alerts in Bitcoin are a DoS vulnerability; Bitcoin has
199double-spend alerts in Bitcoin are a DoS vulnerability; Bitcoin has
194fees to control the cost of propagating transactions, but who pays for
200fees to control the cost of propagating transactions, but who pays for
195an alert?
201an alert?
@@ -201,29 +207,29 @@ An accepted transaction is simply one that propagates to one or more
201randomly chosen observer nodes.
207randomly chosen observer nodes.
202
208
203This design, for the problem that Bitcoin is solving, intuitively
209This design, for the problem that Bitcoin is solving, intuitively
204−feels weak and a little hacky. The Karame paper is not actually
210+feels weak and a little hacky. The Karame paper is not actually
205−advocating for removing the blockchain from Bitcoin. At the same
211+advocating for removing the blockchain from Bitcoin. At the same
206time, low-value zero-confirmation payments are commonly used.
212time, low-value zero-confirmation payments are commonly used.
207
213
208One way to think about security is to flip the tables and think of the
214One way to think about security is to flip the tables and think of the
209−defender as the attacker, and vice versa. Just imagine you have some
215+defender as the attacker, and vice versa. Just imagine you have some
210−moral right to double spend. The rest of the world is unfairly trying
216+moral right to double spend. The rest of the world is unfairly trying
211−to stop you. Can you defend yourself?
217+to stop you. Can you defend yourself?
212
218
213In the context of a gossip network that shares all the things, a
219In the context of a gossip network that shares all the things, a
214procedure that involves telling one person one thing, and another
220procedure that involves telling one person one thing, and another
215person another conflicting thing, and not getting "hacked" by the
221person another conflicting thing, and not getting "hacked" by the
216unfair world which believes there should be only one truth, is
222unfair world which believes there should be only one truth, is
217−inherently quite fragile. And where the attack is fragile, the
223+inherently quite fragile. And where the attack is fragile, the
218defense is robust.
224defense is robust.
219
225
220Most of the security in any digital title system comes from the PKI
226Most of the security in any digital title system comes from the PKI
221−itself. The double-spend problem, the general issue of Byzantine
227+itself. The double-spend problem, the general issue of Byzantine
222−failures in information propagation, is already a corner case. So
228+failures in information propagation, is already a corner case. So
223perhaps we can solve it as a corner case.
229perhaps we can solve it as a corner case.
224
230
225Again: _even Bitcoin_ isn't that far from being able to build a
231Again: _even Bitcoin_ isn't that far from being able to build a
226−practical decentralized ledger without a blockchain. The same gossip
232+practical decentralized ledger without a blockchain. The same gossip
227model that broadcasts nonconflicting transactions is not at all
233model that broadcasts nonconflicting transactions is not at all
228incapable of reacting to conflicting transactions. We're not really
234incapable of reacting to conflicting transactions. We're not really
229recommending that Bitcoin ditch the blockchain, but this gives us hope
235recommending that Bitcoin ditch the blockchain, but this gives us hope
@@ -232,41 +238,41 @@ with our fundamentally easier problem.
232## Various specific specialnesses
238## Various specific specialnesses
233
239
234What are the differences between the Urbit double-sell problem and the
240What are the differences between the Urbit double-sell problem and the
235−Bitcoin double-spend problem? Is our special case really, truly,
241+Bitcoin double-spend problem? Is our special case really, truly,
236special?
242special?
237
243
238In worse-is-better mode, we want every special-case advantage we can
244In worse-is-better mode, we want every special-case advantage we can
239−get. Every difference we find is one we can use as a leverage point.
245+get. Every difference we find is one we can use as a leverage point.
240
246
241### Minimal transaction interdependency
247### Minimal transaction interdependency
242
248
243The first major technical difference between the Urbit title history
249The first major technical difference between the Urbit title history
244and the Bitcoin blockchain is that Bitcoin and its relatives are
250and the Bitcoin blockchain is that Bitcoin and its relatives are
245designed to secure a complete, interdependent, collective transaction
251designed to secure a complete, interdependent, collective transaction
246−history. Except for the parent-child relationship, Urbit wills are
252+history. Except for the parent-child relationship, Urbit wills are
247independent of each other.
253independent of each other.
248
254
249Bitcoin's use of UTXOs rather than balances reduces interdependency
255Bitcoin's use of UTXOs rather than balances reduces interdependency
250−somewhat. But the validity of each transaction is still dependent on
256+somewhat. But the validity of each transaction is still dependent on
251−all the transactions that created its inputs. (Ethereum drops the
257+all the transactions that created its inputs. (Ethereum drops the
252UTXO model, whose value in reducing dependencies may not match its
258UTXO model, whose value in reducing dependencies may not match its
253cost in complexity.)
259cost in complexity.)
254
260
255−Urbit is not a payment system or a shared ledger. Bitcoins are
261+Urbit is not a payment system or a shared ledger. Bitcoins are
256−divisible, but Urbit ships aren't. An Urbit will containing its
262+divisible, but Urbit ships aren't. An Urbit will containing its
257parent chain is self-validating and has no dependencies. There is no
263parent chain is self-validating and has no dependencies. There is no
258−collective history. There is no Merkle tree. There is no chain, with
264+collective history. There is no Merkle tree. There is no chain, with
259or without blocks.
265or without blocks.
260
266
261This simplification doesn't eliminate the double-sell problem in
267This simplification doesn't eliminate the double-sell problem in
262−theory, but makes it much more tractable in practice. The set of past
268+theory, but makes it much more tractable in practice. The set of past
263transactions (key transfers) that a new transaction could conflict
269transactions (key transfers) that a new transaction could conflict
264with is much smaller.
270with is much smaller.
265
271
266### Trust hierarchy and governance structure
272### Trust hierarchy and governance structure
267
273
268The second major technical difference is that Bitcoin is a flat,
274The second major technical difference is that Bitcoin is a flat,
269−trustless, fully decentralized system. Urbit has a hierarchical,
275+trustless, fully decentralized system. Urbit has a hierarchical,
270polycentric governance system which is a trust hierarchy.
276polycentric governance system which is a trust hierarchy.
271
277
272Now and for quite some time, urbits default to automatically accepting
278Now and for quite some time, urbits default to automatically accepting
@@ -276,41 +282,41 @@ You trust your browser quite a bit, which means you trust your browser
276vendor.
282vendor.
277
283
278And since few Bitcoin node operators code their own daemons, the same
284And since few Bitcoin node operators code their own daemons, the same
279−dependency on a source distribution exists in Bitcoin. It's informal
285+dependency on a source distribution exists in Bitcoin. It's informal
280and off-chain, though, which is not really a good thing. (Urbit is
286and off-chain, though, which is not really a good thing. (Urbit is
281like if Bitcoin Core hotpatched itself automatically by publishing
287like if Bitcoin Core hotpatched itself automatically by publishing
282source-code diffs on the blockchain.)
288source-code diffs on the blockchain.)
283
289
284To be on the safe side, we should think of Urbit as a centralized
290To be on the safe side, we should think of Urbit as a centralized
285system until the OS update that turns off automatic updates is
291system until the OS update that turns off automatic updates is
286−shipped. This of course requires a certain measure of perfection,
292+shipped. This of course requires a certain measure of perfection,
287which cannot in any way be predicted.
293which cannot in any way be predicted.
288
294
289After Arvo proper becomes "deciduous" (apps will of course always be
295After Arvo proper becomes "deciduous" (apps will of course always be
290remotely hotpatched), child-to-parent trust should diminish to the
296remotely hotpatched), child-to-parent trust should diminish to the
291−power of the parent to deny service to the child. This will always be
297+power of the parent to deny service to the child. This will always be
292present without some major redesign.
298present without some major redesign.
293
299
294But it's opposed by the equal and opposite power of the child to
300But it's opposed by the equal and opposite power of the child to
295switch to a different parent, creating a competitive market in
301switch to a different parent, creating a competitive market in
296−governance. This should deliver service at the highest quality and
302+governance. This should deliver service at the highest quality and
297−lowest price, fortifying trust with incentives. The power of a
303+lowest price, fortifying trust with incentives. The power of a
298restaurant owner to deny you service does not give the food industry
304restaurant owner to deny you service does not give the food industry
299the power to starve you to death.
305the power to starve you to death.
300
306
301And if no parent wants your business, with 2^16 stars who could accept
307And if no parent wants your business, with 2^16 stars who could accept
302it, you probably shouldn't be on the network at all. Urbit, like a
308it, you probably shouldn't be on the network at all. Urbit, like a
303real society, is designed to be a network of incentives that holds
309real society, is designed to be a network of incentives that holds
304−everyone in productive tension. We want everyone to be free, and no
310+everyone in productive tension. We want everyone to be free, and no
305one to be unaccountable.
311one to be unaccountable.
306
312
307For example: a parent which extends its will also needs to send
313For example: a parent which extends its will also needs to send
308−updated signatures to its children and former children. Either will
314+updated signatures to its children and former children. Either will
309otherwise be unable to propagate their dossiers to ships whose
315otherwise be unable to propagate their dossiers to ships whose
310cabinets have the updated parent will, _even if some other parent
316cabinets have the updated parent will, _even if some other parent
311adopts them_.
317adopts them_.
312
318
313−But Urbit is a collectively governed and updatable system. A star or
319+But Urbit is a collectively governed and updatable system. A star or
314galaxy which denies service to its own children will (a) get a bad
320galaxy which denies service to its own children will (a) get a bad
315reputation, (b) drive its children to other parents, and (c) force the
321reputation, (b) drive its children to other parents, and (c) force the
316network to hardcode a ship-specific exception into the propagation
322network to hardcode a ship-specific exception into the propagation
@@ -319,29 +325,29 @@ algorithm, overriding stale-key revocation.
319In theory, a parent can extort its children by denying service. In
325In theory, a parent can extort its children by denying service. In
320practice, since Urbit is self-governing, not ungoverned, and its
326practice, since Urbit is self-governing, not ungoverned, and its
321government can right this wrong with a source-code patch, the
327government can right this wrong with a source-code patch, the
322−extortion won't work. So it won't happen. So the act of government
328+extortion won't work. So it won't happen. So the act of government
323won't be necessary, and won't happen either.
329won't be necessary, and won't happen either.
324
330
325−Of course a perfectly decentralized system would be freer. But worse,
331+Of course a perfectly decentralized system would be freer. But worse,
326−as usual, is better. And since we are paying for this worseness,
332+as usual, is better. And since we are paying for this worseness,
327imperfect decentralization, we'd like to get all the mileage out of it
333imperfect decentralization, we'd like to get all the mileage out of it
328that we can.
334that we can.
329
335
330Again, Urbit, not being a trustless system, does not have to solve the
336Again, Urbit, not being a trustless system, does not have to solve the
331trustless consensus problem -- although we still very much want to
337trustless consensus problem -- although we still very much want to
332−minimize and bound the delegation of trust. This is an obvious
338+minimize and bound the delegation of trust. This is an obvious
333relaxation of Bitcoin's hard theoretical problem.
339relaxation of Bitcoin's hard theoretical problem.
334
340
335### Routing: security through topology
341### Routing: security through topology
336
342
337−Please don't laugh. Security through routing topology isn't a joke --
343+Please don't laugh. Security through routing topology isn't a joke --
338−unless firewalls are a joke. Cisco sells too many firewalls for them
344+unless firewalls are a joke. Cisco sells too many firewalls for them
339to be a joke.
345to be a joke.
340
346
341In Bitcoin we may have all sorts of reasons to ask what ship holds
347In Bitcoin we may have all sorts of reasons to ask what ship holds
342−what coins. In Urbit, when we ask what key controls an ship, we are
348+what coins. In Urbit, when we ask what key controls an ship, we are
343−either sending or receiving a message. Is our outgoing message safely
349+either sending or receiving a message. Is our outgoing message safely
344−sealed to the current owner? Is our incoming message properly signed
350+sealed to the current owner? Is our incoming message properly signed
345by the current owner?
351by the current owner?
346
352
347When the parent also forwards all packets until a P2P link is
353When the parent also forwards all packets until a P2P link is
@@ -350,29 +356,29 @@ full cone NAT, TURN if not), we can design in all kinds of
350interactions between routing and certificate management.
356interactions between routing and certificate management.
351
357
352In particular, a parent which is a single source of truth in some
358In particular, a parent which is a single source of truth in some
353−sense is a very attractive design element. Again, we're paying for
359+sense is a very attractive design element. Again, we're paying for
354−our imperfect decentralization. We might as well use it.
360+our imperfect decentralization. We might as well use it.
355
361
356−For example: I want to send a packet to ship X. Two parties, A and B,
362+For example: I want to send a packet to ship X. Two parties, A and B,
357−are competing for ownership of X. A is the rightful owner. I am
363+are competing for ownership of X. A is the rightful owner. I am
358secure against B if either of these conditions are true: my packet can
364secure against B if either of these conditions are true: my packet can
359−only be decoded by A, or my packet is not sent to B. Both would be
365+only be decoded by A, or my packet is not sent to B. Both would be
360−ideal, of course. Either will do.
366+ideal, of course. Either will do.
361
367
362### Latency and friction tolerance
368### Latency and friction tolerance
363
369
364Confirmed Bitcoin payments aren't especially low-latency by payment
370Confirmed Bitcoin payments aren't especially low-latency by payment
365−standards. They're reasonably low-friction by payment standards. But
371+standards. They're reasonably low-friction by payment standards. But
366fees are certainly a thing.
372fees are certainly a thing.
367
373
368−Urbit is digital real estate, not digital money. When we look at the
374+Urbit is digital real estate, not digital money. When we look at the
369standards of latency and friction in actual real estate -- where a
375standards of latency and friction in actual real estate -- where a
370transaction that takes a week is super-fast, a 5% payment overhead is
376transaction that takes a week is super-fast, a 5% payment overhead is
371normal, and a third-party intermediary is standard -- we see a much,
377normal, and a third-party intermediary is standard -- we see a much,
372much weaker set of requirements.
378much weaker set of requirements.
373
379
374Obviously a week and a 5% overhead are incredibly sucky levels of
380Obviously a week and a 5% overhead are incredibly sucky levels of
375−latency and friction. The point is that even if this is the only
381+latency and friction. The point is that even if this is the only
376level of performance Urbit can achieve, that's not necessarily the end
382level of performance Urbit can achieve, that's not necessarily the end
377of the world for Urbit.
383of the world for Urbit.
378
384
@@ -384,48 +390,48 @@ just not that hard.
384(One little-made point about Bitcoin, by the way, is that Bitcoin
390(One little-made point about Bitcoin, by the way, is that Bitcoin
385enables trust-free _payments_, but not trust-free _exchanges_. The
391enables trust-free _payments_, but not trust-free _exchanges_. The
386seller still needs to deliver the goods either before or after the
392seller still needs to deliver the goods either before or after the
387−payment; in either case, there is trust. Only Ethereum can solve this
393+payment; in either case, there is trust. Only Ethereum can solve this
388problem -- and only for digital exchanges.)
394problem -- and only for digital exchanges.)
389
395
390## We can afford to be patient
396## We can afford to be patient
391
397
392With a better-is-better, general-purpose solution, one size fits all
398With a better-is-better, general-purpose solution, one size fits all
393−until the end of time. With a worse-is-better, special-case solution,
399+until the end of time. With a worse-is-better, special-case solution,
394the details of that case are critical.
400the details of that case are critical.
395
401
396−But we actually don't know these details. One rule of the
402+But we actually don't know these details. One rule of the
397worse-is-better school: never solve a problem before you have to. You
403worse-is-better school: never solve a problem before you have to. You
398−don't know all the details, and you need those details. (Of course,
404+don't know all the details, and you need those details. (Of course,
399with the better-is-better approach, the details don't matter at all.)
405with the better-is-better approach, the details don't matter at all.)
400
406
401−Is there such a thing as a transitive adjective? Grammarians are
407+Is there such a thing as a transitive adjective? Grammarians are
402−unclear. But technically, the adjective "secure" is always an error.
408+unclear. But technically, the adjective "secure" is always an error.
403−Nothing is "secure." "Secure against X" is the correct usage, where X
409+Nothing is "secure." "Secure against X" is the correct usage, where X
404is some threat model.
410is some threat model.
405
411
406Urbit is an insecure test network with no sensitive data on it. This
412Urbit is an insecure test network with no sensitive data on it. This
407−will remain true for a while. No Urbit ship has ever been transferred
413+will remain true for a while. No Urbit ship has ever been transferred
408−cryptographically. This will also remain the status quo for quite a
414+cryptographically. This will also remain the status quo for quite a
409while.
415while.
410
416
411−We _don't know the threat model_. We _can't solve the problem_. It's
417+We _don't know the threat model_. We _can't solve the problem_. It's
412−as simple as that. The best Urbit can do, at the present time, is map
418+as simple as that. The best Urbit can do, at the present time, is map
413out the ballpark of solutions.
419out the ballpark of solutions.
414
420
415−And we have time to proceed patiently. One way to think about the
421+And we have time to proceed patiently. One way to think about the
416−timing of cryptographic decentralization is to look at the DNS. It's
422+timing of cryptographic decentralization is to look at the DNS. It's
417clear that now, a decentralized DNS with cryptographic domain-name
423clear that now, a decentralized DNS with cryptographic domain-name
418−titles would be extremely desirable. It was never designed to happen.
424+titles would be extremely desirable. It was never designed to happen.
419It will probably never happen.
425It will probably never happen.
420
426
421But if we look at when cryptographic DNS with allodial title _should_
427But if we look at when cryptographic DNS with allodial title _should_
422have happened, it's probably sometime in the mid-90s. Ie, after over a
428have happened, it's probably sometime in the mid-90s. Ie, after over a
423−decade of production use of the Domain Name System. In short: there's
429+decade of production use of the Domain Name System. In short: there's
424no need to hurry here.
430no need to hurry here.
425
431
426## A map of the solution space
432## A map of the solution space
427
433
428−But we still need a map of the worse-is-better ballpark. Let's look
434+But we still need a map of the worse-is-better ballpark. Let's look
429at some options, from least secure to most.
435at some options, from least secure to most.
430
436
431The essential question we can't answer, without a better sense of the
437The essential question we can't answer, without a better sense of the
@@ -434,19 +440,19 @@ especially are not sure about the threat model of malicious stars
434(16-bit ships) and/or galaxies (8-bit ships).
440(16-bit ships) and/or galaxies (8-bit ships).
435
441
436We need to know what kinds of double-sell attacks are plausible. Since
442We need to know what kinds of double-sell attacks are plausible. Since
437−we don't know this yet, we need not one propagation design, but a
443+we don't know this yet, we need not one propagation design, but a
438range of designs -- stretching all the way up to a full blockchain.
444range of designs -- stretching all the way up to a full blockchain.
439
445
440### Acceptance model
446### Acceptance model
441
447
442−What doesn't change is the will _acceptance_ model. A ship will
448+What doesn't change is the will _acceptance_ model. A ship will
443always accept a new will if (a) the new will extends the old will, (b)
449always accept a new will if (a) the new will extends the old will, (b)
444the parent signature on the initial public key is at least as recent
450the parent signature on the initial public key is at least as recent
445as the ship's current version of that parent.
451as the ship's current version of that parent.
446
452
447The parent clause implies that when a parent extends its will, it
453The parent clause implies that when a parent extends its will, it
448needs to send updated initial signatures to all the children it's
454needs to send updated initial signatures to all the children it's
449−launched. Otherwise, their own future updates will not be accepted by
455+launched. Otherwise, their own future updates will not be accepted by
450ships that have seen the parent's update.
456ships that have seen the parent's update.
451
457
452This is not a big deal in the world of parent responsibilities. But
458This is not a big deal in the world of parent responsibilities. But
@@ -460,30 +466,30 @@ Scarcity rules.
460
466
461### Level 0: passive propagation only
467### Level 0: passive propagation only
462
468
463−The Ames protocol can piggyback a will on any packet. Each ship also
469+The Ames protocol can piggyback a will on any packet. Each ship also
464permanently records which other ships hold which version of its own
470permanently records which other ships hold which version of its own
465−will. An update is automatically sent when needed.
471+will. An update is automatically sent when needed.
466
472
467With level 0 propagation, all key exchanges in Ames are passive and
473With level 0 propagation, all key exchanges in Ames are passive and
468−invisible to the programmer. When the sender has no will or symmetric
474+invisible to the programmer. When the sender has no will or symmetric
469key for the receiver, the packet is signed, bundled with the will, and
475key for the receiver, the packet is signed, bundled with the will, and
470sent as cleartext.
476sent as cleartext.
471
477
472−Signed cleartext? If you have no will for a peer, you've never talked
478+Signed cleartext? If you have no will for a peer, you've never talked
473−to this ship before. Your first words to a stranger probably won't be
479+to this ship before. Your first words to a stranger probably won't be
474−super secret. If this isn't true, the programmer has to send an
480+super secret. If this isn't true, the programmer has to send an
475−innocuous message first and wait for it to be acknowledged. Kicking a
481+innocuous message first and wait for it to be acknowledged. Kicking a
476rare corner case up to the programmer is a classic worse-is-better
482rare corner case up to the programmer is a classic worse-is-better
477move.
483move.
478
484
479With level 0 propagation only (the current implementation, because we
485With level 0 propagation only (the current implementation, because we
480don't even care about key updates yet), an updated does not
486don't even care about key updates yet), an updated does not
481−effectively revoke the old key. If Alice updates to a new key,
487+effectively revoke the old key. If Alice updates to a new key,
482Mallory steals the old key, then Mallory talks to Bob before Alice
488Mallory steals the old key, then Mallory talks to Bob before Alice
483does, Mallory can impersonate Alice.
489does, Mallory can impersonate Alice.
484
490
485So not only does level 0 not solve double-sell, it's also quite
491So not only does level 0 not solve double-sell, it's also quite
486−insecure. But it's still fine for now (because Urbit isn't really
492+insecure. But it's still fine for now (because Urbit isn't really
487decentralized yet).
493decentralized yet).
488
494
489### Level 1: neighbor-only propagation with parent filtering
495### Level 1: neighbor-only propagation with parent filtering
@@ -491,7 +497,7 @@ decentralized yet).
491The list of other ships which hold your will, essentially the list of
497The list of other ships which hold your will, essentially the list of
492all ships you've talked to, is your list of _neighbors_. You
498all ships you've talked to, is your list of _neighbors_. You
493essentially have permanent, if perhaps very sporadic, conversations
499essentially have permanent, if perhaps very sporadic, conversations
494−with all your cryptographic neighbors. Symmetric keys time out fast,
500+with all your cryptographic neighbors. Symmetric keys time out fast,
495but wills are held forever.
501but wills are held forever.
496
502
497By proactively pinging all your neighbors when you extend your will,
503By proactively pinging all your neighbors when you extend your will,
@@ -499,99 +505,99 @@ you prevent anyone who finds the old private key (ideally you update
499when your old key is stale, not when it's actually been _stolen_) from
505when your old key is stale, not when it's actually been _stolen_) from
500jumping into these conversations.
506jumping into these conversations.
501
507
502−What about non-neighbors? We add a second feature: a parent will only
508+What about non-neighbors? We add a second feature: a parent will only
503−forward a packet if its sender matches the current will. So updating
509+forward a packet if its sender matches the current will. So updating
504your parent (who is always your neighbor) transforms it
510your parent (who is always your neighbor) transforms it
505
511
506There are two cases: where Alice's parent Trent is also Bob's parent,
512There are two cases: where Alice's parent Trent is also Bob's parent,
507−and where Bob has a separate parent Walter. In the first case, the
513+and where Bob has a separate parent Walter. In the first case, the
508expected packet flow is that Alice will send the packet to Trent, who
514expected packet flow is that Alice will send the packet to Trent, who
509−sends it to Bob. In the second case, Trent sends it to Walter, who
515+sends it to Bob. In the second case, Trent sends it to Walter, who
510sends it to Bob.
516sends it to Bob.
511
517
512In either flow, Bob or Walter is sure that the packet came through
518In either flow, Bob or Walter is sure that the packet came through
513−Trent. Since Trent is Alice's parent and hence Alice's neighbor, and
519+Trent. Since Trent is Alice's parent and hence Alice's neighbor, and
514−hence is updated, Trent will forward no packets from Mallory. So
520+hence is updated, Trent will forward no packets from Mallory. So
515Mallory has no way to reach Bob.
521Mallory has no way to reach Bob.
516
522
517Non-neighborly packets not matching this flow can't be accepted.
523Non-neighborly packets not matching this flow can't be accepted.
518−Suppose Mallory gets Bob's public IP address directly? If Bob gets a
524+Suppose Mallory gets Bob's public IP address directly? If Bob gets a
519non-forwarded packet marked "Alice," but Alice is not his neighbor,
525non-forwarded packet marked "Alice," but Alice is not his neighbor,
520−that's super weird. He must reject the packet.
526+that's super weird. He must reject the packet.
521
527
522Level 1 is nice because it provides a reasonable level of security,
528Level 1 is nice because it provides a reasonable level of security,
523−but it's still extremely simple. Not only does it not use a
529+but it's still extremely simple. Not only does it not use a
524blockchain, it doesn't even need a gossip flood!
530blockchain, it doesn't even need a gossip flood!
525
531
526And level 1 propagation also does a competent worse-is-better job on
532And level 1 propagation also does a competent worse-is-better job on
527−the double-sell problem. Trent simply becomes the single source of
533+the double-sell problem. Trent simply becomes the single source of
528−truth. The buyer of Alice needs to check that Trent, her parent, has
534+truth. The buyer of Alice needs to check that Trent, her parent, has
529Alice's latest will from the buyer's perspective. If Alice's seller
535Alice's latest will from the buyer's perspective. If Alice's seller
530propagates a different fork to other ships, this damages Alice's
536propagates a different fork to other ships, this damages Alice's
531ability to communicate, but produces no obvious gain for the seller.
537ability to communicate, but produces no obvious gain for the seller.
532
538
533−Level 1 puts a lot of security weight on the parent. If Trent
539+Level 1 puts a lot of security weight on the parent. If Trent
534misbehaves, for example by not filtering Mallory's packets, Alice can
540misbehaves, for example by not filtering Mallory's packets, Alice can
535−be impersonated. And its solution to the double-sell problem is
541+be impersonated. And its solution to the double-sell problem is
536−adequate, but not ideal. Level 1 is the worse-is-better sweet spot
542+adequate, but not ideal. Level 1 is the worse-is-better sweet spot
537for a young Urbit, but will probably give way to level 2.
543for a young Urbit, but will probably give way to level 2.
538
544
539### Level 2: broadcast all wills
545### Level 2: broadcast all wills
540
546
541−We can't say definitively that level 1 will be inadequate. But
547+We can't say definitively that level 1 will be inadequate. But
542−intuitively, it feels slightly weak. We will probably need a gossip
548+intuitively, it feels slightly weak. We will probably need a gossip
543protocol.
549protocol.
544
550
545The only ships that can be transferred are galaxies, stars and
551The only ships that can be transferred are galaxies, stars and
546planets; if all updates of all wills of all these major ships are
552planets; if all updates of all wills of all these major ships are
547−broadcast, we hardly have a scaling problem like Bitcoin's. Even if
553+broadcast, we hardly have a scaling problem like Bitcoin's. Even if
548changing the lock on your front door counted as a real-estate
554changing the lock on your front door counted as a real-estate
549transaction, there are a lot fewer real-estate transactions than
555transaction, there are a lot fewer real-estate transactions than
550credit-card payments.
556credit-card payments.
551
557
552Moreover, conflict detection (double-sell alerts) is a natural part of
558Moreover, conflict detection (double-sell alerts) is a natural part of
553−any gossip protocol. Gossip should be between stars, not directly
559+any gossip protocol. Gossip should be between stars, not directly
554between planets; horizontal gossip, vertical distribution.
560between planets; horizontal gossip, vertical distribution.
555Star-to-planet distribution may still be limited.
561Star-to-planet distribution may still be limited.
556
562
557Especially since stars are somewhat trusted, ganking a gossip protocol
563Especially since stars are somewhat trusted, ganking a gossip protocol
558with random update edges is incredibly hard and requires a pretty
564with random update edges is incredibly hard and requires a pretty
559−preposterous conspiracy. And flooding all planet wills does a lot to
565+preposterous conspiracy. And flooding all planet wills does a lot to
560−keep stars honest. It would be incredibly stupid for a star to try a
566+keep stars honest. It would be incredibly stupid for a star to try a
561double-sell attack against its own planets, but code is always more
567double-sell attack against its own planets, but code is always more
562powerful than mere incentives.
568powerful than mere incentives.
563
569
564Finally, the exit model isn't fully baked yet, but it will probably
570Finally, the exit model isn't fully baked yet, but it will probably
565−have more aggressive propagation needs. What's clear is that an exit
571+have more aggressive propagation needs. What's clear is that an exit
566statement is another type of will entry, involving a signature both
572statement is another type of will entry, involving a signature both
567−from the previous key and the new parent. You can only escape to
573+from the previous key and the new parent. You can only escape to
568another ship of your parent's class that agrees to adopt you.
574another ship of your parent's class that agrees to adopt you.
569
575
570In general, because escaping need to work for routing (without the
576In general, because escaping need to work for routing (without the
571cooperation of the former parent), wills containing an exit statement
577cooperation of the former parent), wills containing an exit statement
572(a planet moving to a new star, or a star moving to a new galaxy)
578(a planet moving to a new star, or a star moving to a new galaxy)
573exit) probably need to be flooded globally among all 8-bit galaxies
579exit) probably need to be flooded globally among all 8-bit galaxies
574−and 16-bit stars. Exits should be rare, so they shouldn't present
580+and 16-bit stars. Exits should be rare, so they shouldn't present
575much of a scaling problem.
581much of a scaling problem.
576
582
577### Level 3: full blockchain
583### Level 3: full blockchain
578
584
579−Obviously a blockchain can solve Urbit's problem. Probably the right
585+Obviously a blockchain can solve Urbit's problem. Probably the right
580thing to do would be to use the Bitcoin blockchain, and confirm the
586thing to do would be to use the Bitcoin blockchain, and confirm the
581−current Urbit key version with a "colored coin" of some kind. (This
587+current Urbit key version with a "colored coin" of some kind. (This
582should not be confused with the orthogonal idea of representing Urbit
588should not be confused with the orthogonal idea of representing Urbit
583_invitations_ as colored coins.)
589_invitations_ as colored coins.)
584
590
585This involves making all Urbit ships into Bitcoin SPV nodes at the
591This involves making all Urbit ships into Bitcoin SPV nodes at the
586−least. Not the worst fate in the world, but also a cost.
592+least. Not the worst fate in the world, but also a cost.
587Alternatively, Urbit could have its own "altcoin" blockchain, with
593Alternatively, Urbit could have its own "altcoin" blockchain, with
588actual Urbit-specific mining.
594actual Urbit-specific mining.
589
595
590Again, given that level 2 seems like it should work quite well, it's
596Again, given that level 2 seems like it should work quite well, it's
591−hard to see why level 3 propagation would be needed. But we can't
597+hard to see why level 3 propagation would be needed. But we can't
592−really know at this point. There's a reason Urbit can update itself
598+really know at this point. There's a reason Urbit can update itself
593−over the air. That's why we say: Urbit (probably) doesn't need a
599+over the air. That's why we say: Urbit (probably) doesn't need a
594−blockchain. If it does, we can retrofit it.
600+blockchain. If it does, we can retrofit it.
595
601
596## Retrospective note
602## Retrospective note
597
603
@@ -600,18 +606,18 @@ stripped-down, worse-is-better variation of Nakamoto consensus.
600That's clearly the right way to introduce it in 2016.
606That's clearly the right way to introduce it in 2016.
601
607
602Actually, though, this part of Urbit was designed before the Bitcoin
608Actually, though, this part of Urbit was designed before the Bitcoin
603−paper was published. There were other academic approaches to
609+paper was published. There were other academic approaches to
604Byzantine consensus, but certainly none validated on a large scale as
610Byzantine consensus, but certainly none validated on a large scale as
605−Nakamoto consensus has been. It never seemed appropriate to treat
611+Nakamoto consensus has been. It never seemed appropriate to treat
606cryptographic titles to network addresses as a case of generalized
612cryptographic titles to network addresses as a case of generalized
607Byzantine consensus, and without the existence of Bitcoin there was no
613Byzantine consensus, and without the existence of Bitcoin there was no
608temptation in this direction.
614temptation in this direction.
609
615
610−In a sense the secret of PKIs is that PKIs are easy. What's hard is
616+In a sense the secret of PKIs is that PKIs are easy. What's hard is
611adapting an existing identity and authorization structure into a PKI.
617adapting an existing identity and authorization structure into a PKI.
612If you build the simplest possible PKI, then force the human processes
618If you build the simplest possible PKI, then force the human processes
613to fit themselves to the protocol instead of vice versa, you have a
619to fit themselves to the protocol instead of vice versa, you have a
614−much easier job. Similarly, if you are not adding PKI to an existing
620+much easier job. Similarly, if you are not adding PKI to an existing
615network, but building the network and the PKI as one system, many
621network, but building the network and the PKI as one system, many
616−simplifications are possible. This is once again the classic
622+simplifications are possible. This is once again the classic
617worse-is-better method.
623worse-is-better method.
content/blog/your-last-computer.md+2−2
@@ -1,7 +1,8 @@
1+++
1+++
2title = "Your Last Computer"
2title = "Your Last Computer"
3−date = 2019-10-17
3+date = "2019-10-16"
4description = "Your Urbit is a simpler computer, a quieter computer, a more private computer. We want it to feel predictable, safe, and reliable — things only a complete, sealed system can do. This, we hope, can get us a world where technology keeps us connected, but doesn’t dominate our lives."
4description = "Your Urbit is a simpler computer, a quieter computer, a more private computer. We want it to feel predictable, safe, and reliable — things only a complete, sealed system can do. This, we hope, can get us a world where technology keeps us connected, but doesn’t dominate our lives."
5+
5[extra]
6[extra]
6image = "https://media.urbit.org/site/understanding-urbit/your-last-computer/your-last-computer-waves%402x.png"
7image = "https://media.urbit.org/site/understanding-urbit/your-last-computer/your-last-computer-waves%402x.png"
7+++
8+++
@@ -10,7 +11,6 @@ This whole ‘simple, durable, yours’ thing may sound good, but what does it a
10
11
11First, let’s talk about what it should feel like in the future.
12First, let’s talk about what it should feel like in the future.
12
13
13−
14<img class="mv5 w-100" src="https://media.urbit.org/site/understanding-urbit/your-last-computer/your-last-computer-waves%402x.png">
14<img class="mv5 w-100" src="https://media.urbit.org/site/understanding-urbit/your-last-computer/your-last-computer-waves%402x.png">
15
15
16Imagine that you can log in from anywhere with one simple, memorable name and password. And when you do, an entire OS appears for you. Inside is your whole digital life. Every conversation you’ve ever had, all your biometric data — every step and heartbeat. Your personal mesh of devices: your doors, your car, your irrigation. All of your communities, every message you’ve shared with friends and family. Every connection you’ve made and every archival piece of data, in one place. Secure and private, forever.
16Imagine that you can log in from anywhere with one simple, memorable name and password. And when you do, an entire OS appears for you. Inside is your whole digital life. Every conversation you’ve ever had, all your biometric data — every step and heartbeat. Your personal mesh of devices: your doors, your car, your irrigation. All of your communities, every message you’ve shared with friends and family. Every connection you’ve made and every archival piece of data, in one place. Secure and private, forever.
content/docs/arvo/clay/tasks.md+1−1
@@ -4,7 +4,7 @@ weight = 6
4template = "doc.html"
4template = "doc.html"
5+++
5+++
6
6
7−This document details all the `task`s you're likely to use to interact with Clay, as well as the `gift`s you'll receive in response. Each section has a corresponding practical example in the [Examples](/docs/arvo/clay/examples) document. Many of the types referenced are detailed in the [Data Types](/docs/arvo/clay/data-types) document. It may also be useful to look at the `++ clay` section of `/sys/lull.hoon` in Arvo where these `task`s, `gift`s and data structures are defined.
7+This document details all the `task`s you're likely to use to interact with Clay, as well as the `gift`s you'll receive in response. Each section has a corresponding practical example in the [Examples](/docs/arvo/clay/examples) document. Many of the types referenced are detailed in the [Data Types](/docs/arvo/clay/data-types) document. It may also be useful to look at the `++ clay` section of `/sys/lull.hoon` in Arvo where these `task`s, `gift`s and data structures are defined.
8
8
9The focus of this document is on interacting with Clay from userspace applications and threads, so it doesn't delve into the internal mechanics of Clay from a kernel development perspective.
9The focus of this document is on interacting with Clay from userspace applications and threads, so it doesn't delve into the internal mechanics of Clay from a kernel development perspective.
10
10
content/docs/arvo/overview.md+53−56
@@ -119,9 +119,7 @@ the larval stage in more detail in the [larval stage](#larval-stage-core) sectio
119
119
120More information on the structure of the Arvo event log and the Arvo state is given in the section on [the kernel](#the-kernel).
120More information on the structure of the Arvo event log and the Arvo state is given in the section on [the kernel](#the-kernel).
121
121
122−
123−
124−## Solid state interpreter
122+## Solid state interpreter
125
123
126Arvo is a _solid state interpreter_. In this section we describe what is meant
124Arvo is a _solid state interpreter_. In this section we describe what is meant
127by this new term, and how this behavior derives from the fact that Arvo is an [ACID database](#acid-database) and a [single-level store](#single-level-store).
125by this new term, and how this behavior derives from the fact that Arvo is an [ACID database](#acid-database) and a [single-level store](#single-level-store).
@@ -145,7 +143,6 @@ it as a chip. Plug this chip into power and network; packets go in and
145out, sometimes changing its state. The chip never loses data and has
143out, sometimes changing its state. The chip never loses data and has
146no concept of a reboot; every packet is an [ACID transaction](#acid-database).
144no concept of a reboot; every packet is an [ACID transaction](#acid-database).
147
145
148−
149### Over-the-air updates
146### Over-the-air updates
150
147
151Arvo can hotpatch any other semantics at any layer in the system (apps, vanes, Arvo or Hoon itself) with automatic over-the-air updates.
148Arvo can hotpatch any other semantics at any layer in the system (apps, vanes, Arvo or Hoon itself) with automatic over-the-air updates.
@@ -174,22 +171,22 @@ In order to dismantle the client-server model and build a peer-to-peer internet,
174
171
175Database theory studies in precise terms the possible properties of anything that could be considered to be a database. In this context, Arvo has the properties of an [ACID database](https://en.wikipedia.org/wiki/ACID), and the Ames network could be thought of as network of such databases. ACID stands for _atomicity_, _consistency_, _isolation_, and _durability_. We review here how Arvo satisfies these properties.
172Database theory studies in precise terms the possible properties of anything that could be considered to be a database. In this context, Arvo has the properties of an [ACID database](https://en.wikipedia.org/wiki/ACID), and the Ames network could be thought of as network of such databases. ACID stands for _atomicity_, _consistency_, _isolation_, and _durability_. We review here how Arvo satisfies these properties.
176
173
177− - Atomicity: Events in Arvo are _atomic_, meaning that they either succeed completely or fail completely. In other words, there are no transient periods in which something like a power failure will leave the operating system in an invalid state. When an event occurs in Arvo, e.g. [the kernel](#the-kernel) is `poke`d, the effects of an event are computed, the event is [persisted](https://en.wikipedia.org/wiki/Persistence_(computer_science)) by writing it to the event log, and only then are the actual effects applied.
174+- Atomicity: Events in Arvo are _atomic_, meaning that they either succeed completely or fail completely. In other words, there are no transient periods in which something like a power failure will leave the operating system in an invalid state. When an event occurs in Arvo, e.g. [the kernel](#the-kernel) is `poke`d, the effects of an event are computed, the event is [persisted](<https://en.wikipedia.org/wiki/Persistence_(computer_science)>) by writing it to the event log, and only then are the actual effects applied.
178
175
179− - Consistency: Every possible update to the database puts it into another valid state. Given that Arvo is purely functional, this is easier to accomplish than it would be in an imperative setting.
176+- Consistency: Every possible update to the database puts it into another valid state. Given that Arvo is purely functional, this is easier to accomplish than it would be in an imperative setting.
180
177
181− - Isolation: Transactions in databases often happen concurrently, and isolation
178+- Isolation: Transactions in databases often happen concurrently, and isolation
182− ensures that the transactions occur as if they were performed sequentially,
179+ ensures that the transactions occur as if they were performed sequentially,
183− making it so that their effects are isolated from one another. Arvo ensures
180+ making it so that their effects are isolated from one another. Arvo ensures
184− this simply by the fact that it only ever performs events sequentially. While
181+ this simply by the fact that it only ever performs events sequentially. While
185− Arvo
182+ Arvo
186− transactions are sequential and performed by the daemon, persistence and effect application are performed
183+ transactions are sequential and performed by the daemon, persistence and effect application are performed
187− in parallel by the worker; see [worker and
184+ in parallel by the worker; see [worker and
188− daemon](/docs/vere/) for more detail.
185+ daemon](/docs/vere/) for more detail.
189
186
190− - Durability: Completed transactions will survive permanently. In other words,
187+- Durability: Completed transactions will survive permanently. In other words,
191− since the event log is stored on disk, if power is lost you are guaranteed
188+ since the event log is stored on disk, if power is lost you are guaranteed
192− that no transactions will be reversed.
189+ that no transactions will be reversed.
193
190
194It is easy to think that "completed transaction will survive permanently"
191It is easy to think that "completed transaction will survive permanently"
195along with "the state of Arvo is pure function of its event log" implies that
192along with "the state of Arvo is pure function of its event log" implies that
@@ -219,11 +216,9 @@ This is known as
219[non-preemptive](https://en.wikipedia.org/wiki/Cooperative_multitasking) or
216[non-preemptive](https://en.wikipedia.org/wiki/Cooperative_multitasking) or
220cooperative multitasking.
217cooperative multitasking.
221
218
222−
223> Parts of the remainder of this document are out of date as of 2020.07.20, please use information here with
219> Parts of the remainder of this document are out of date as of 2020.07.20, please use information here with
224> caution. This message will be removed once it is up to date.
220> caution. This message will be removed once it is up to date.
225
221
226−
227# The kernel
222# The kernel
228
223
229The Arvo kernel, stored in `sys/arvo.hoon`, is about 1k lines of Hoon whose primary purpose is to implement the transition function, `+poke`. In this section we point out the most important parts of `arvo.hoon` and describe their role in the greater system. We also give brief descriptions of Arvo's kernel modules, known as vanes, and how Arvo interfaces with them.
224The Arvo kernel, stored in `sys/arvo.hoon`, is about 1k lines of Hoon whose primary purpose is to implement the transition function, `+poke`. In this section we point out the most important parts of `arvo.hoon` and describe their role in the greater system. We also give brief descriptions of Arvo's kernel modules, known as vanes, and how Arvo interfaces with them.
@@ -237,12 +232,13 @@ which applies many of the concepts covered below.
237## Overall structure
232## Overall structure
238
233
239`arvo.hoon` contains five top level cores as well as a "formal interface" consisting of a single [gate](/docs/glossary/gate/) that implements the transition function. They are nested with the `=<` and `=>` runes like so, where items lower on the list are contained within items higher on the list:
234`arvo.hoon` contains five top level cores as well as a "formal interface" consisting of a single [gate](/docs/glossary/gate/) that implements the transition function. They are nested with the `=<` and `=>` runes like so, where items lower on the list are contained within items higher on the list:
235+
240− + Types
236+- Types
241− + Section 3bE Arvo Core
237+- Section 3bE Arvo Core
242− + Implementation core
238+- Implementation core
243− + Structural interface core, or adult core
239+- Structural interface core, or adult core
244− + Larval stage core
240+- Larval stage core
245− + Formal interface
241+- Formal interface
246
242
247See [Section 1.7](/docs/hoon/hoon-school/arms-and-cores) of the Hoon tutorial for further explanation of what is meant here by "nesting". We now describe the functionality of each of these components.
243See [Section 1.7](/docs/hoon/hoon-school/arms-and-cores) of the Hoon tutorial for further explanation of what is meant here by "nesting". We now describe the functionality of each of these components.
248
244
@@ -311,7 +307,6 @@ initial element of the empty span, so this is routed to Unix, which applies the
311
307
312This is a call stack, with a crucial feature: the stack is a first-class citizen. You can respond over a `duct` zero, one, or many times. You can save `duct`s for later use. There are definitely parallels to Scheme-style continuations, but simpler and with more structure.
308This is a call stack, with a crucial feature: the stack is a first-class citizen. You can respond over a `duct` zero, one, or many times. You can save `duct`s for later use. There are definitely parallels to Scheme-style continuations, but simpler and with more structure.
313
309
314−
315#### `wire`
310#### `wire`
316
311
317```hoon
312```hoon
@@ -419,31 +414,31 @@ described within the current type system. Then the `wire` here is the default Un
419
414
420A short summary of the purpose of each these arms are as follows:
415A short summary of the purpose of each these arms are as follows:
421
416
422− - `+poke` is the transition function that `move`s Arvo from one state to the
417+- `+poke` is the transition function that `move`s Arvo from one state to the
423− next. It is the most fundamental arm in the entire system. It is a typed
418+ next. It is the most fundamental arm in the entire system. It is a typed
424− transactional message that is processed at most once. If the `+poke` causes
419+ transactional message that is processed at most once. If the `+poke` causes
425− Arvo to send an message over [Ames](/docs/arvo/ames/ames) Ames
420+ Arvo to send an message over [Ames](/docs/arvo/ames/ames) Ames
426− guarantees that the message will be delivered exactly once. This is sometimes said
421+ guarantees that the message will be delivered exactly once. This is sometimes said
427− to be impossible, and it is for standard operating systems, but that is not the case for single-level stores engaged in
422+ to be impossible, and it is for standard operating systems, but that is not the case for single-level stores engaged in
428− a permanent session, as is the case among Arvo ships.
423+ a permanent session, as is the case among Arvo ships.
429− - `+peek` is an arm used for inspecting things outside of the kernel. It grants
424+- `+peek` is an arm used for inspecting things outside of the kernel. It grants
430− read-only access to `scry` Arvo's global referentially transparent namespace.
425+ read-only access to `scry` Arvo's global referentially transparent namespace.
431− It takes in a `path` and returns a `unit (unit)`. If the product is `~`, the
426+ It takes in a `path` and returns a `unit (unit)`. If the product is `~`, the
432− path is unknown and its value cannot be produced synchronously. If its
427+ path is unknown and its value cannot be produced synchronously. If its
433− product is `[~ ~]` the `path` is known to be unbound and can never become
428+ product is `[~ ~]` the `path` is known to be unbound and can never become
434− bound. Otherwise the product is a `mark` and a noun.
429+ bound. Otherwise the product is a `mark` and a noun.
435− - `+wish` is a function that takes in a core and then parses and compiles it
430+- `+wish` is a function that takes in a core and then parses and compiles it
436− with the standard library, `zuse`. It is useful from the outside if you ever
431+ with the standard library, `zuse`. It is useful from the outside if you ever
437− want to run code within. One particular way in which it is used is by the
432+ want to run code within. One particular way in which it is used is by the
438− runtime to read out the version of `zuse` so that it knows if it is
433+ runtime to read out the version of `zuse` so that it knows if it is
439− compatible with this particular version of the kernel.
434+ compatible with this particular version of the kernel.
440− - `+load` is used when upgrading the kernel. It is only ever called by Arvo
435+- `+load` is used when upgrading the kernel. It is only ever called by Arvo
441− itself, never by the runtime. If upgrading to a kernel where types are
436+ itself, never by the runtime. If upgrading to a kernel where types are
442− compatible, `+load` is used, otherwise `+come` is used.
437+ compatible, `+load` is used, otherwise `+come` is used.
443− - `+come` is used when the new kernel has incompatible types, but ultimately
438+- `+come` is used when the new kernel has incompatible types, but ultimately
444− reduces to a series of `+load` calls.
439+ reduces to a series of `+load` calls.
445−
440+
446− The [Section 3bE core](#section-3be-core) does not follow this pattern.
441+The [Section 3bE core](#section-3be-core) does not follow this pattern.
447
442
448#### Section 3bE core
443#### Section 3bE core
449
444
@@ -461,10 +456,10 @@ This core could be thought of as the primary "adult core" - the one that is in o
461
456
462This core is in use only during the larval stage of Arvo, which is after the Arvo kernel has compiled itself but before it has "broken symmetry" by acquiring identity and entropy, the point at which the larval stage has concluded. We call this breaking symmetry because prior to this point, every Urbit is completely identical. The larval stage performs the following steps in order:
457This core is in use only during the larval stage of Arvo, which is after the Arvo kernel has compiled itself but before it has "broken symmetry" by acquiring identity and entropy, the point at which the larval stage has concluded. We call this breaking symmetry because prior to this point, every Urbit is completely identical. The larval stage performs the following steps in order:
463
458
464− + The standard library, `zuse`, is installed.
459+- The standard library, `zuse`, is installed.
465− + Entropy is added
460+- Entropy is added
466− + Identity is added
461+- Identity is added
467− + Metamorph into the next stage of Arvo
462+- Metamorph into the next stage of Arvo
468
463
469Once the larval stage has passed its functionality will never be used again.
464Once the larval stage has passed its functionality will never be used again.
470
465
@@ -497,6 +492,7 @@ Let's investigate the state piece by piece.
497```hoon
492```hoon
498=/ pit=vase !>(..is) ::
493=/ pit=vase !>(..is) ::
499```
494```
495+
500This `vase` is part of the state but does not get directly migrated when `+poke`
496This `vase` is part of the state but does not get directly migrated when `+poke`
501is called. `!>(..is)` consists of the code in `arvo.hoon` written above this core contained in
497is called. `!>(..is)` consists of the code in `arvo.hoon` written above this core contained in
502a `vase`. Thus this part of the state changes only when that code changes in an
498a `vase`. Thus this part of the state changes only when that code changes in an
@@ -506,6 +502,7 @@ update.
506=/ vil=vile (viol p.pit) :: cached reflexives
502=/ vil=vile (viol p.pit) :: cached reflexives
507
503
508```
504```
505+
509This is a cache of specific types that are of fundamental importance to Arvo -
506This is a cache of specific types that are of fundamental importance to Arvo -
510namely `type`s, `duct`s, `path`s, and `vase`s. This is kept because it is
507namely `type`s, `duct`s, `path`s, and `vase`s. This is kept because it is
511unnecessarily wasteful to recompile these fundamental types on a regular basis.
508unnecessarily wasteful to recompile these fundamental types on a regular basis.
@@ -519,6 +516,7 @@ Again, this part of the state is never updated directly by `+poke`.
519 vanes=(list [label=@tas =vane]) :: modules
516 vanes=(list [label=@tas =vane]) :: modules
520 ==
517 ==
521```
518```
519+
522This is where the real state of the Arvo kernel is kept. `lac` detemines whether
520This is where the real state of the Arvo kernel is kept. `lac` detemines whether
523Arvo's output is verbose, which can be set using the `|verb` command in the
521Arvo's output is verbose, which can be set using the `|verb` command in the
524dojo. `eny` is the current entropy. `our` is the ship, which is permanently
522dojo. `eny` is the current entropy. `our` is the ship, which is permanently
@@ -528,7 +526,6 @@ is of course the list of vanes, which have their own internal states.
528As you can see, the state of Arvo itself is quite simple. Its primary role is that of
526As you can see, the state of Arvo itself is quite simple. Its primary role is that of
529a traffic cop, and most of the interesting part of the state lies in `vanes`.
527a traffic cop, and most of the interesting part of the state lies in `vanes`.
530
528
531−
532## Vanes
529## Vanes
533
530
534The Arvo kernel can do very little on its own. Its functionality is extended in a careful and controlled way with vanes, also known as kernel modules.
531The Arvo kernel can do very little on its own. Its functionality is extended in a careful and controlled way with vanes, also known as kernel modules.
content/docs/hoon/reference/stdlib/2c.md+26−15
@@ -43,6 +43,7 @@ An atom.
43```
43```
44
44
45---
45---
46+
46### `++can`
47### `++can`
47
48
48Assemble
49Assemble
@@ -101,6 +102,7 @@ An atom.
101```
102```
102
103
103---
104---
105+
104### `++cat`
106### `++cat`
105
107
106Concatenate
108Concatenate
@@ -164,6 +166,7 @@ An atom.
164```
166```
165
167
166---
168---
169+
167### `++cut`
170### `++cut`
168
171
169Slice
172Slice
@@ -222,8 +225,8 @@ An atom.
222 0b10.0001
225 0b10.0001
223```
226```
224
227
225−
226---
228---
229+
227### `++end`
230### `++end`
228
231
229Tail
232Tail
@@ -242,7 +245,6 @@ with optional block count.
242
245
243An atom.
246An atom.
244
247
245−
246#### Source
248#### Source
247
249
248```hoon
250```hoon
@@ -293,8 +295,8 @@ An atom.
293 'ab'
295 'ab'
294```
296```
295
297
296−
297---
298---
299+
298### `++fil`
300### `++fil`
299
301
300Fill bloqstream
302Fill bloqstream
@@ -345,8 +347,8 @@ An atom.
345 0b1.0001.0001.0001.0001.0001
347 0b1.0001.0001.0001.0001.0001
346```
348```
347
349
348−
349---
350---
351+
350### `++lsh`
352### `++lsh`
351
353
352Left-shift
354Left-shift
@@ -400,8 +402,8 @@ An atom.
400 65.280
402 65.280
401```
403```
402
404
403−
404---
405---
406+
405### `++met`
407### `++met`
406
408
407Measure
409Measure
@@ -446,8 +448,8 @@ Computes the number of blocks of size `a` in `b`, producing an atom.
446 5
448 5
447```
449```
448
450
449−
450---
451---
452+
451### `++rap`
453### `++rap`
452
454
453Assemble non-zero
455Assemble non-zero
@@ -509,6 +511,7 @@ An atom.
509Any element of the value `0` is not included in concatenation.
511Any element of the value `0` is not included in concatenation.
510
512
511---
513---
514+
512### `++rep`
515### `++rep`
513
516
514Assemble single
517Assemble single
@@ -585,6 +588,7 @@ An atom.
585```
588```
586
589
587---
590---
591+
588### `++rev`
592### `++rev`
589
593
590Reverses block order, accounting for leading zeroes.
594Reverses block order, accounting for leading zeroes.
@@ -599,8 +603,8 @@ is longer, trailing zeroes will be added.
599#### Accepts
603#### Accepts
600
604
601`boz` is a block size with optional block count (see
605`boz` is a block size with optional block count (see
602− [`$bloq`](/docs/hoon/reference/stdlib/1c#bloq)).
606+[`$bloq`](/docs/hoon/reference/stdlib/1c#bloq)).
603−
607+
604`len` is a `@ud` of the number of blocks of size `boz` to be reversed.
608`len` is a `@ud` of the number of blocks of size `boz` to be reversed.
605
609
606`dat` is an atom.
610`dat` is an atom.
@@ -653,6 +657,7 @@ An atom.
653```
657```
654
658
655---
659---
660+
656### `++rip`
661### `++rip`
657
662
658Disassemble
663Disassemble
@@ -716,8 +721,8 @@ A list of atoms.
716 "abcd"
721 "abcd"
717```
722```
718
723
719−
720---
724---
725+
721### `++rsh`
726### `++rsh`
722
727
723Right-shift
728Right-shift
@@ -786,8 +791,8 @@ An atom.
786 0x6362
791 0x6362
787```
792```
788
793
789−
790---
794---
795+
791### `++run`
796### `++run`
792
797
793`++turn` into atom.
798`++turn` into atom.
@@ -828,8 +833,8 @@ An atom.
828 0xeeee
833 0xeeee
829```
834```
830
835
831−
832---
836---
837+
833### `++rut`
838### `++rut`
834
839
835`++turn` into list.
840`++turn` into list.
@@ -870,8 +875,8 @@ A list.
870 ~[0xe 0xe 0xe 0xe]
875 ~[0xe 0xe 0xe 0xe]
871```
876```
872
877
873−
874---
878---
879+
875### `++swp`
880### `++swp`
876
881
877Reverse block order
882Reverse block order
@@ -879,7 +884,6 @@ Reverse block order
879Switches little-endian to big-endian and vice versa: produces an atom by
884Switches little-endian to big-endian and vice versa: produces an atom by
880reversing the block order of `b` using block size `a`.
885reversing the block order of `b` using block size `a`.
881
886
882−
883#### Accepts
887#### Accepts
884
888
885`a` is a block size (see [`++bloq`](/docs/hoon/reference/stdlib/1c)).
889`a` is a block size (see [`++bloq`](/docs/hoon/reference/stdlib/1c)).
@@ -915,8 +919,8 @@ An atom
915 1
919 1
916```
920```
917
921
918−
919---
922---
923+
920### `++xeb`
924### `++xeb`
921
925
922Binary logarithm
926Binary logarithm
@@ -963,8 +967,8 @@ An atom.
963 2
967 2
964```
968```
965
969
966−
967---
970---
971+
968### `++fe`
972### `++fe`
969
973
970Modulo bloq
974Modulo bloq
@@ -982,6 +986,7 @@ Core that contains arms for `bloq` and modular integer operations.
982```
986```
983
987
984---
988---
989+
985### `++dif:fe`
990### `++dif:fe`
986
991
987Produces the difference between two atoms in the modular basis
992Produces the difference between two atoms in the modular basis
@@ -1034,6 +1039,7 @@ A `@s`
1034```
1039```
1035
1040
1036---
1041---
1042+
1037### `++inv:fe`
1043### `++inv:fe`
1038
1044
1039Inverse
1045Inverse
@@ -1077,6 +1083,7 @@ An atom.
1077```
1083```
1078
1084
1079---
1085---
1086+
1080### `++net:fe`
1087### `++net:fe`
1081
1088
1082Flip endianness
1089Flip endianness
@@ -1166,6 +1173,7 @@ An atom.
1166```
1173```
1167
1174
1168---
1175---
1176+
1169### `++out:fe`
1177### `++out:fe`
1170
1178
1171Max integer value
1179Max integer value
@@ -1215,6 +1223,7 @@ An atom.
1215```
1223```
1216
1224
1217---
1225---
1226+
1218### `++rol:fe`
1227### `++rol:fe`
1219
1228
1220Roll left
1229Roll left
@@ -1265,6 +1274,7 @@ An atom.
1265```
1274```
1266
1275
1267---
1276---
1277+
1268### `++ror:fe`
1278### `++ror:fe`
1269
1279
1270Roll right
1280Roll right
@@ -1318,6 +1328,7 @@ An atom.
1318```
1328```
1319
1329
1320---
1330---
1331+
1321### `++sit:fe`
1332### `++sit:fe`
1322
1333
1323Enforce modulo
1334Enforce modulo
content/docs/hoon/reference/stdlib/2j.md+6−3
@@ -26,6 +26,7 @@ A container arm for `++jar` operation arms. A `++jar` is a `++map` of
26```
26```
27
27
28---
28---
29+
29### `++get:ja`
30### `++get:ja`
30
31
31Grab value by key
32Grab value by key
@@ -65,6 +66,7 @@ Examples
65```
66```
66
67
67---
68---
69+
68### `++add:ja`
70### `++add:ja`
69
71
70Prepend to list
72Prepend to list
@@ -111,7 +113,8 @@ mull-grow
111mull-nice
113mull-nice
112```
114```
113
115
114−**
116+\*\*
117+
115### `++ju`
118### `++ju`
116
119
117Jug operations
120Jug operations
@@ -145,7 +148,6 @@ Container arm for jug operation arms. A `++jug` is a `++map` of
145
148
146Remove
149Remove
147
150
148−
149#### Source
151#### Source
150
152
151```hoon
153```hoon
@@ -210,6 +212,7 @@ Produces a set retrieved from jar `a` using key `b`.
210```
212```
211
213
212---
214---
215+
213### `++has:ju`
216### `++has:ju`
214
217
215Check contents
218Check contents
@@ -246,6 +249,7 @@ with jar `a`. Produces a loobean.
246 > (~(has ju s) 'c' 7)
249 > (~(has ju s) 'c' 7)
247 %.n
250 %.n
248```
251```
252+
249---
253---
250
254
251### `++put:ju`
255### `++put:ju`
@@ -282,5 +286,4 @@ Produces jar `a` with `c` added to the set value located at key `b`.
282 {[p='a' q={1 3 2}] [p='c' q={7}] [p='b' q={5 4 6}]}
286 {[p='a' q={1 3 2}] [p='c' q={7}] [p='b' q={5 4 6}]}
283```
287```
284
288
285−
286---
289---
content/docs/hoon/reference/stdlib/2n.md+13−4
@@ -27,15 +27,16 @@ Build `f` such that `(f x) .= (b (a x))`.
27```
27```
28 > (:(cork dec dec dec) 20)
28 > (:(cork dec dec dec) 20)
29 17
29 17
30−
30+
31 > `@ub`(bex (met 0 23))
31 > `@ub`(bex (met 0 23))
32 0b10.0000
32 0b10.0000
33−
33+
34 > `@ub`((cork (cury met 0) bex) 23)
34 > `@ub`((cork (cury met 0) bex) 23)
35 0b10.0000
35 0b10.0000
36```
36```
37
37
38---
38---
39+
39### `++corl`
40### `++corl`
40
41
41Compose backward
42Compose backward
@@ -67,6 +68,7 @@ Build `f` such that
67```
68```
68
69
69---
70---
71+
70### `++curr` {#curry}
72### `++curr` {#curry}
71
73
72Right curry
74Right curry
@@ -104,6 +106,7 @@ A gate.
104```
106```
105
107
106---
108---
109+
107### `++cury`
110### `++cury`
108
111
109Curry left
112Curry left
@@ -141,6 +144,7 @@ A gate.
141```
144```
142
145
143---
146---
147+
144### `++hard`
148### `++hard`
145
149
146Force remold
150Force remold
@@ -173,8 +177,8 @@ not.
173 ! exit
177 ! exit
174```
178```
175
179
176−
177---
180---
181+
178### `++soft`
182### `++soft`
179
183
180Maybe remold
184Maybe remold
@@ -211,8 +215,8 @@ is not.
211 ~
215 ~
212```
216```
213
217
214−
215---
218---
219+
216### `++head`
220### `++head`
217
221
218Get head
222Get head
@@ -247,6 +251,7 @@ An atom.
247```
251```
248
252
249---
253---
254+
250### `++same`
255### `++same`
251
256
252Identity
257Identity
@@ -281,6 +286,7 @@ A noun.
281```
286```
282
287
283---
288---
289+
284### `++slog`
290### `++slog`
285
291
286Deify printf
292Deify printf
@@ -319,6 +325,7 @@ calls that string a piece of data through them, so that an error message will be
319printed if there's one to print.
325printed if there's one to print.
320
326
321---
327---
328+
322### `++mean`
329### `++mean`
323
330
324Crash and printf
331Crash and printf
@@ -352,6 +359,7 @@ A crash.
352```
359```
353
360
354---
361---
362+
355### `++tail`
363### `++tail`
356
364
357Get tail
365Get tail
@@ -386,6 +394,7 @@ A noun.
386```
394```
387
395
388---
396---
397+
389### `++test`
398### `++test`
390
399
391Test for equality
400Test for equality
content/docs/userspace/threads/basics/bind.md+10−10
@@ -4,12 +4,11 @@ weight = 2
4template = "doc.html"
4template = "doc.html"
5+++
5+++
6
6
7−
8Having looked at `form` and `pure`, we'll now look at the last `strand` arm `bind`. Bind is typically used in combination with micgal (`;<`).
7Having looked at `form` and `pure`, we'll now look at the last `strand` arm `bind`. Bind is typically used in combination with micgal (`;<`).
9
8
10## Micgal
9## Micgal
11
10
12−Micgal takes four arguments like `spec hoon hoon hoon`. Given `;< a b c d`, it composes them like `((b ,a) c |=(a d))`. So, for example, these two expressions are equivalent:
11+Micgal takes four arguments like `spec hoon hoon hoon`. Given `;< a b c d`, it composes them like `((b ,a) c |=(a d))`. So, for example, these two expressions are equivalent:
13
12
14```hoon
13```hoon
15;< ~ bind:m (sleep:strandio ~s2)
14;< ~ bind:m (sleep:strandio ~s2)
@@ -30,6 +29,7 @@ Micgal exists simply for readability. The above isn't too bad, but consider this
30;< g h i
29;< g h i
31j
30j
32```
31```
32+
33...as opposed to this monstrosity: `((b ,a) c |=(a ((e ,d) f |=(d ((h ,g) i |=(g j))))))`
33...as opposed to this monstrosity: `((b ,a) c |=(a ((e ,d) f |=(d ((h ,g) i |=(g j))))))`
34
34
35## bind
35## bind
@@ -39,11 +39,11 @@ Bind by itself must be specialised like `(bind:m ,&lt;type>)` and it takes two a
39- The first argument is a function that returns the `form` of a strand which produces `&lt;type>`.
39- The first argument is a function that returns the `form` of a strand which produces `&lt;type>`.
40- The second argument is a gate whose sample is `&lt;type>` and which returns a `form`.
40- The second argument is a gate whose sample is `&lt;type>` and which returns a `form`.
41
41
42−Since you'll invariably use it in conjunction with micgal, the `&lt;type>` in `;< &lt;type> bind:m ...` will both specialise `bind` and specify the gate's sample.
42+Since you'll invariably use it in conjunction with micgal, the `&lt;type>` in `;< &lt;type> bind:m ...` will both specialise `bind` and specify the gate's sample.
43
43
44Bind calls the first function then, if it succeeded, calls the second gate with the result of the first as its sample. If the first function failed, it will instead just return an error message and not bother calling the next gate. So it's essentially "strand A then strand B".
44Bind calls the first function then, if it succeeded, calls the second gate with the result of the first as its sample. If the first function failed, it will instead just return an error message and not bother calling the next gate. So it's essentially "strand A then strand B".
45
45
46−Since the second gate may itself contain another `;< &lt;type> bind:m ...`, you can see how this allows you to glue together an arbitrarily large pipeline, where subsequent gates depend on the previous ones.
46+Since the second gate may itself contain another `;< &lt;type> bind:m ...`, you can see how this allows you to glue together an arbitrarily large pipeline, where subsequent gates depend on the previous ones.
47
47
48## strandio
48## strandio
49
49
@@ -67,10 +67,10 @@ Here's a simple thread with a couple of `strandio` functions:
67```hoon
67```hoon
68/- spider
68/- spider
69/+ strandio
69/+ strandio
70−=, strand=strand:spider
70+=, strand=strand:spider
71−^- thread:spider
71+^- thread:spider
72−|= arg=vase
72+|= arg=vase
73−=/ m (strand ,vase)
73+=/ m (strand ,vase)
74^- form:m
74^- form:m
75;< t=@da bind:m get-time:strandio
75;< t=@da bind:m get-time:strandio
76;< s=ship bind:m get-our:strandio
76;< s=ship bind:m get-our:strandio
@@ -86,11 +86,11 @@ Save it as `/ted/mythread.hoon`, `|commit` it and run it with `-mythread`. You s
86
86
87## Analysis
87## Analysis
88
88
89−To use `strandio` functions we've imported the library with `/+ strandio`.
89+To use `strandio` functions we've imported the library with `/+ strandio`.
90
90
91`get-time` and `get-our` get the current time & ship from the bowl in `strand-input`. We'll discuss `strand-input` in more detail later.
91`get-time` and `get-our` get the current time & ship from the bowl in `strand-input`. We'll discuss `strand-input` in more detail later.
92
92
93−Note how we've specified the face and return type of each strand like `t=@da`, etc.
93+Note how we've specified the face and return type of each strand like `t=@da`, etc.
94
94
95You can see how `pure` has access to the results of previous strands in the pipeline. Note how we've wrapped `pure`'s argument in a `!>` because the thread must produce a `vase`.
95You can see how `pure` has access to the results of previous strands in the pipeline. Note how we've wrapped `pure`'s argument in a `!>` because the thread must produce a `vase`.
96
96
content/docs/userspace/threads/basics/input.md+23−23
@@ -10,40 +10,40 @@ The input to a `strand` is defined in `/lib/strand/hoon` as:
10+$ strand-input [=bowl in=(unit input)]
10+$ strand-input [=bowl in=(unit input)]
11```
11```
12
12
13−When a thread is first started, spider will populate the `bowl` and provide it along with an `input` of `~`. If/when new input comes in (such as a poke, sign or watch) it will provide a new updated bowl along with the new input.
13+When a thread is first started, spider will populate the `bowl` and provide it along with an `input` of `~`. If/when new input comes in (such as a poke, sign or watch) it will provide a new updated bowl along with the new input.
14
14
15For example, here's a thread that gets the time from the bowl, runs an IO-less function that takes one or two seconds to compute, and then gets the time again:
15For example, here's a thread that gets the time from the bowl, runs an IO-less function that takes one or two seconds to compute, and then gets the time again:
16
16
17```hoon
17```hoon
18/- spider
18/- spider
19−/+ *strandio
19+/+ *strandio
20=, strand=strand:spider
20=, strand=strand:spider
21−|%
21+|%
22−++ ackermann
22+++ ackermann
23− |= [m=@ n=@]
23+ |= [m=@ n=@]
24− ?: =(m 0) +(n)
24+ ?: =(m 0) +(n)
25− ?: =(n 0) $(m (dec m), n 1)
25+ ?: =(n 0) $(m (dec m), n 1)
26− $(m (dec m), n $(n (dec n)))
26+ $(m (dec m), n $(n (dec n)))
27−--
27+--
28^- thread:spider
28^- thread:spider
29|= arg=vase
29|= arg=vase
30=/ m (strand ,vase)
30=/ m (strand ,vase)
31−^- form:m
31+^- form:m
32−;< t1=@da bind:m get-time
32+;< t1=@da bind:m get-time
33−=/ ack (ackermann 3 8)
33+=/ ack (ackermann 3 8)
34−;< t2=@da bind:m get-time
34+;< t2=@da bind:m get-time
35−(pure:m !>([t1 t2]))
35+(pure:m !>([t1 t2]))
36```
36```
37
37
38Since it never does any IO, `t1` and `t2` are the same: `[~2021.3.17..07.47.39..e186 ~2021.3.17..07.47.39..e186]`. However, if we replace the ackermann function with a 2 second `sleep` from strandio:
38Since it never does any IO, `t1` and `t2` are the same: `[~2021.3.17..07.47.39..e186 ~2021.3.17..07.47.39..e186]`. However, if we replace the ackermann function with a 2 second `sleep` from strandio:
39
39
40```hoon
40```hoon
41−/- spider
41+/- spider
42/+ *strandio
42/+ *strandio
43−=, strand=strand:spider
43+=, strand=strand:spider
44−^- thread:spider
44+^- thread:spider
45−|= arg=vase
45+|= arg=vase
46−=/ m (strand ,vase)
46+=/ m (strand ,vase)
47^- form:m
47^- form:m
48;< t1=@da bind:m get-time
48;< t1=@da bind:m get-time
49;< ~ bind:m (sleep ~s2)
49;< ~ bind:m (sleep ~s2)
@@ -90,7 +90,7 @@ You can also write a function with a gate whose sample is `strand-input:strand`
90```hoon
90```hoon
91/- spider
91/- spider
92/+ strandio
92/+ strandio
93−=, strand=strand:spider
93+=, strand=strand:spider
94=>
94=>
95|%
95|%
96++ bowl-stuff
96++ bowl-stuff
@@ -99,9 +99,9 @@ You can also write a function with a gate whose sample is `strand-input:strand`
99 |= tin=strand-input:strand
99 |= tin=strand-input:strand
100 `[%done [wex.bowl.tin sup.bowl.tin]]
100 `[%done [wex.bowl.tin sup.bowl.tin]]
101--
101--
102−^- thread:spider
102+^- thread:spider
103−|= arg=vase
103+|= arg=vase
104−=/ m (strand ,vase)
104+=/ m (strand ,vase)
105^- form:m
105^- form:m
106;< res=[boat:gall bitt:gall] bind:m bowl-stuff
106;< res=[boat:gall bitt:gall] bind:m bowl-stuff
107(pure:m !>(res))
107(pure:m !>(res))
content/docs/userspace/threads/basics/output.md+18−18
@@ -16,7 +16,7 @@ So, for example, if you feed `2 2` into the following function:
16
16
17```hoon
17```hoon
18 |= [a=@ud b=@ud]
18 |= [a=@ud b=@ud]
19− =/ m (strand ,vase)
19+ =/ m (strand ,vase)
20 ^- form:m
20 ^- form:m
21 =/ res !>(`@ud`(add a b))
21 =/ res !>(`@ud`(add a b))
22 (pure:m res)
22 (pure:m res)
@@ -36,12 +36,12 @@ Since a strand is a function from the previously discussed `strand-input` to the
36So this is a valid thread:
36So this is a valid thread:
37
37
38```hoon
38```hoon
39−/- spider
39+/- spider
40−=, strand=strand:spider
40+=, strand=strand:spider
41−^- thread:spider
41+^- thread:spider
42−|= arg=vase
42+|= arg=vase
43−=/ m (strand ,vase)
43+=/ m (strand ,vase)
44−^- form:m
44+^- form:m
45|= strand-input:strand
45|= strand-input:strand
46[~ %done arg]
46[~ %done arg]
47```
47```
@@ -49,8 +49,8 @@ So this is a valid thread:
49As is this:
49As is this:
50
50
51```hoon
51```hoon
52−/- spider
52+/- spider
53−=, strand=strand:spider
53+=, strand=strand:spider
54|%
54|%
55++ my-function
55++ my-function
56 =/ m (strand ,@t)
56 =/ m (strand ,@t)
@@ -58,9 +58,9 @@ As is this:
58 |= strand-input:strand
58 |= strand-input:strand
59 [~ %done 'foo']
59 [~ %done 'foo']
60--
60--
61−^- thread:spider
61+^- thread:spider
62−|= arg=vase
62+|= arg=vase
63−=/ m (strand ,vase)
63+=/ m (strand ,vase)
64^- form:m
64^- form:m
65;< msg=@t bind:m my-function
65;< msg=@t bind:m my-function
66(pure:m !>(msg))
66(pure:m !>(msg))
@@ -69,12 +69,12 @@ As is this:
69As is this:
69As is this:
70
70
71```hoon
71```hoon
72−/- spider
72+/- spider
73−=, strand=strand:spider
73+=, strand=strand:spider
74−^- thread:spider
74+^- thread:spider
75−|= arg=vase
75+|= arg=vase
76−=/ m (strand ,vase)
76+=/ m (strand ,vase)
77−^- form:m
77+^- form:m
78|= strand-input:strand
78|= strand-input:strand
79=/ umsg !< (unit @tas) arg
79=/ umsg !< (unit @tas) arg
80?~ umsg
80?~ umsg
content/docs/userspace/threads/basics/summary.md+13−7
@@ -14,6 +14,7 @@ Now here's a quick recap of the main points covered:
14- Details of interacting with threads via spider can be seen [here](/docs/userspace/threads/reference).
14- Details of interacting with threads via spider can be seen [here](/docs/userspace/threads/reference).
15
15
16## Threads
16## Threads
17+
17- are like transient gall agents
18- are like transient gall agents
18- are used mostly to chain a series of IO operations
19- are used mostly to chain a series of IO operations
19- can be used by gall agents to spin out IO operations
20- can be used by gall agents to spin out IO operations
@@ -24,12 +25,12 @@ Now here's a quick recap of the main points covered:
24#### Example
25#### Example
25
26
26```hoon
27```hoon
27−/- spider
28+/- spider
28−=, strand=strand:spider
29+=, strand=strand:spider
29−^- thread:spider
30+^- thread:spider
30−|= arg=vase
31+|= arg=vase
31−=/ m (strand ,vase)
32+=/ m (strand ,vase)
32−^- form:m
33+^- form:m
33(pure:m arg)
34(pure:m arg)
34```
35```
35
36
@@ -42,11 +43,16 @@ Now here's a quick recap of the main points covered:
42- are a core that has three main arms - `form`, `pure` and `bind`:
43- are a core that has three main arms - `form`, `pure` and `bind`:
43
44
44#### form
45#### form
46+
45- is the mold of the strand suitable for casting
47- is the mold of the strand suitable for casting
46- is the type returned by the other arms
48- is the type returned by the other arms
49+
47#### pure
50#### pure
51+
48- simply returns the `form` of a `strand` that produces pure's argument without doing any IO
52- simply returns the `form` of a `strand` that produces pure's argument without doing any IO
53+
49#### bind
54#### bind
55+
50- is used to chain strands together like javascript promises
56- is used to chain strands together like javascript promises
51- is used in conjunction with micgal (`;<`)
57- is used in conjunction with micgal (`;<`)
52- must be specialised to a type like `;< &lt;type> bind:m ...`
58- must be specialised to a type like `;< &lt;type> bind:m ...`
@@ -63,7 +69,7 @@ Now here's a quick recap of the main points covered:
63## Strand output
69## Strand output
64
70
65- contains `[cards=(list card:agent:gall) &lt;response>]`
71- contains `[cards=(list card:agent:gall) &lt;response>]`
66−- `cards` are any cards to be sent immediately
72+- `cards` are any cards to be sent immediately
67- `&lt;response>` is something like `[%done value]`, `[%fail err]`, etc.
73- `&lt;response>` is something like `[%done value]`, `[%fail err]`, etc.
68- `%done` will contain the result
74- `%done` will contain the result
69- responses are only used internally to manage the flow of the thread and are not returned to subscribers.
75- responses are only used internally to manage the flow of the thread and are not returned to subscribers.
content/events/2017-08-11-after-hours-bootstrapping-urbit-from-the-ethereum-blockchain.md+10−8
@@ -1,19 +1,21 @@
1+++
1+++
2title = "After hours: Bootstrapping Urbit from the Ethereum blockchain"
2title = "After hours: Bootstrapping Urbit from the Ethereum blockchain"
3−date = 2017-08-11
3+ends = "2017-08-12T07:00:00.000-07:00"
4−[extra]
5pinned = false
4pinned = false
6−host = "Urbit"
7−time = "20:00 PST"
8location = "Urbit Office"
5location = "Urbit Office"
9image = ""
6image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/242295411/"
7registration_url = "https://www.meetup.com/urbit-sf/events/242295411/"
11−+++
8+description = "This time we'll be opening up the office, opening up a few cold ones, and talking about Urbit + Ethereum."
9+guests = ""
10+timezone = "America/Los_Angeles"
11+starts = "2017-08-12T04:00:00.000-07:00"
12
12
13−This time we'll be opening up the office, opening up a few cold ones, and talking about Urbit + Ethereum.
13+[[hosts]]
14+name = "Urbit"
15++++
14
16
15One thing that's been keeping us busy over the past month is designing the relationship between Urbit and the Ethereum blockchain.  We'll present our current design for this (from ~8:30 - 9) for people to comment on and ask questions about.
17One thing that's been keeping us busy over the past month is designing the relationship between Urbit and the Ethereum blockchain.  We'll present our current design for this (from ~8:30 - 9) for people to comment on and ask questions about.
16
18
17−Otherwise, as usual, there will be plenty of time to hang out and chat with other Urbit people.  
19+Otherwise, as usual, there will be plenty of time to hang out and chat with other Urbit people.
18
20
19−The backyard is really nice in the evening!  Feel free to bring friends
21+The backyard is really nice in the evening!  Feel free to bring friends"
content/events/2017-09-22-after-hours-fun-with-arvo-the-urbit-os.md+9−8
@@ -1,19 +1,20 @@
1+++
1+++
2title = "After hours: Fun with %arvo (the Urbit OS)"
2title = "After hours: Fun with %arvo (the Urbit OS)"
3−date = 2017-09-22
3+ends = "2017-09-23T07:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "20:00 PST"
8location = "Urbit Office"
4location = "Urbit Office"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/243213975/"
6registration_url = "https://www.meetup.com/urbit-sf/events/243213975/"
11−+++
7+description = "Same as usual: cold drinks in the backyard with the hoons.  Come meet other people crazy enough to want to replace the internet."
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2017-09-23T04:00:00.000-07:00"
12
11
13−Same as usual: cold drinks in the backyard with the hoons.  Come meet other people crazy enough to want to replace the internet.  
12+[[hosts]]
13+name = "Urbit"
14++++
14
15
15Ted, the newest addition to our team, has been working on making changes to %arvo all over the place.  He'll give a short talk about some of his adventures in the Urbit OS and how they're going to make Urbit faster and easier to use.
16Ted, the newest addition to our team, has been working on making changes to %arvo all over the place.  He'll give a short talk about some of his adventures in the Urbit OS and how they're going to make Urbit faster and easier to use.
16
17
17That, and discussing why Equifax should have never been holding all that customer data in the first place.
18That, and discussing why Equifax should have never been holding all that customer data in the first place.
18
19
19−Oh yeah, and we just got a fresh batch of Nock shirts!
20+Oh yeah, and we just got a fresh batch of Nock shirts!"
content/events/2017-10-26-after-hours-designing-robust-human-systems.md+11−10
@@ -1,19 +1,20 @@
1+++
1+++
2title = "After hours: Designing robust human systems"
2title = "After hours: Designing robust human systems"
3−date = 2017-10-26
3+ends = "2017-10-27T07:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "20:00 PST"
8location = "Urbit Office"
4location = "Urbit Office"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/244316080/"
6registration_url = "https://www.meetup.com/urbit-sf/events/244316080/"
11−+++
7+description = "The office will be open and the beer will be cold.  Come hang out and talk about all things Urbit and Urbit related.  Cryptoeconomics, protocols, architecture, Japanese poetry, ancient aqueducts.  You get the idea."
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2017-10-27T04:00:00.000-07:00"
12
11
13−The office will be open and the beer will be cold.  Come hang out and talk about all things Urbit and Urbit related.  Cryptoeconomics, protocols, architecture, Japanese poetry, ancient aqueducts.  You get the idea.
12+[[hosts]]
13+name = "Urbit"
14++++
14
15
15−Galen is going to give a short (~20m) talk on designing robust human systems.  No code, no math, no time in the terminal.  This is a completely non-technical talk about design principles.  It was originally given at the IDEO Blueprint event a few weeks ago.  
16+Galen is going to give a short (~20m) talk on designing robust human systems.  No code, no math, no time in the terminal.  This is a completely non-technical talk about design principles.  It was originally given at the IDEO Blueprint event a few weeks ago.
16
17
17−Above all, these meetups are for meeting other people crazy enough to think the internet can be replaced.  
18+Above all, these meetups are for meeting other people crazy enough to think the internet can be replaced.
18
19
19−Feel free to bring friends!  
20+Feel free to bring friends!
content/events/2017-11-16-after-hours-visiting-contributors.md+8−8
@@ -1,17 +1,17 @@
1+++
1+++
2title = "After hours: Visiting contributors"
2title = "After hours: Visiting contributors"
3−date = 2017-11-16
3+ends = "2017-11-17T07:00:00.000-08:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "20:00 PST"
8location = "Urbit Office"
4location = "Urbit Office"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/245090392/"
6registration_url = "https://www.meetup.com/urbit-sf/events/245090392/"
11−+++
7+description = "We've moved! Come check out our new digs, have a beer and hear about what people have been working on."
8+timezone = "America/Los_Angeles"
9+starts = "2017-11-17T04:00:00.000-08:00"
12
10
13−We've moved! Come check out our new digs, have a beer and hear about what people have been working on. 
11+[[hosts]]
12+name = "Urbit"
13++++
14
14
15This week we have ~mastyr-morzod, ~littel-ponnys and ~mastyr-harlud visiting the office. They've all been contributing great stuff from afar, so we figured out how to get them all in the same room to hack on Urbit for the week. On Thursday evening they'll talk about what they've been coming up with.
15This week we have ~mastyr-morzod, ~littel-ponnys and ~mastyr-harlud visiting the office. They've all been contributing great stuff from afar, so we figured out how to get them all in the same room to hack on Urbit for the week. On Thursday evening they'll talk about what they've been coming up with.
16
16
17−We'll also spend plenty of time just hanging around and talking about Parity, BCH, and everything else crypto-related. Feel free to bring friends!
17+We'll also spend plenty of time just hanging around and talking about Parity, BCH, and everything else crypto-related. Feel free to bring friends!"
content/events/2018-01-26-urbit-irl-20181.md+9−8
@@ -1,17 +1,18 @@
1+++
1+++
2title = "Urbit IRL ~2018.1"
2title = "Urbit IRL ~2018.1"
3−date = 2018-01-26
3+ends = "2018-01-27T06:00:00.000-08:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "20:00 PST"
8location = "Urbit office"
4location = "Urbit office"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/246972285/"
6registration_url = "https://www.meetup.com/urbit-sf/events/246972285/"
11−+++
7+description = "Happy New Year!"
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2018-01-27T04:00:00.000-08:00"
12
11
13−Happy New Year!
12+[[hosts]]
13+name = "Urbit"
14++++
14
15
15Turns out that just getting Urbit fans in one room is pretty fun — so come join. No demos or talks this time. Just some time to hang, listen to music and meet up IRL. The room is full of desks and the internet is pretty fast. So impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you.
16Turns out that just getting Urbit fans in one room is pretty fun — so come join. No demos or talks this time. Just some time to hang, listen to music and meet up IRL. The room is full of desks and the internet is pretty fast. So impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you.
16
17
17−Feel free to bring friends!
18+Feel free to bring friends!"
content/events/2018-02-23-urbit-irl-20182.md+9−8
@@ -1,17 +1,18 @@
1+++
1+++
2title = "Urbit IRL ~2018.2"
2title = "Urbit IRL ~2018.2"
3−date = 2018-02-23
3+ends = "2018-02-24T07:00:00.000-08:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "20:00 PST"
8location = "Urbit office"
4location = "Urbit office"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/247797527/"
6registration_url = "https://www.meetup.com/urbit-sf/events/247797527/"
11−+++
7+description = "Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have something to drink."
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2018-02-24T04:00:00.000-08:00"
12
11
13−Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have something to drink.
12+[[hosts]]
13+name = "Urbit"
14++++
14
15
15No demos or talks. Just some time to hang, listen to music and meet up IRL. The room is full of desks and the internet is pretty fast. So impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you. Or just relax and talk to people.
16No demos or talks. Just some time to hang, listen to music and meet up IRL. The room is full of desks and the internet is pretty fast. So impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you. Or just relax and talk to people.
16
17
17−Feel free to bring friends!
18+Feel free to bring friends!"
content/events/2018-03-11-20183-hoon-school.md+9−8
@@ -1,15 +1,16 @@
1+++
1+++
2title = "~2018.3 Hoon School"
2title = "~2018.3 Hoon School"
3−date = 2018-03-11
3+ends = "2018-03-12T07:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "14:00 PST"
8location = "Urbit office"
4location = "Urbit office"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/248416276/"
6registration_url = "https://www.meetup.com/urbit-sf/events/248416276/"
11−+++
7+description = "Come, bring your laptop, and we'll get you started building things in Urbit's language — Hoon."
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2018-03-12T04:00:00.000-07:00"
12
11
13−Come, bring your laptop, and we'll get you started building things in Urbit's language — Hoon.
12+[[hosts]]
13+name = "Urbit"
14++++
14
15
15−There's no lesson per-se, think of it more like an 'independent projects' class. A few of us will be around to help you get started working on whatever you're interested in. It's completely fine if you're new to the language. We're going to start with only 10 spots so we can help everyone individually.
16+There's no lesson per-se, think of it more like an 'independent projects' class. A few of us will be around to help you get started working on whatever you're interested in. It's completely fine if you're new to the language. We're going to start with only 10 spots so we can help everyone individually.
content/events/2018-03-23-urbit-irl-20183.md+9−8
@@ -1,17 +1,18 @@
1+++
1+++
2title = "Urbit IRL ~2018.3"
2title = "Urbit IRL ~2018.3"
3−date = 2018-03-23
3+ends = "2018-03-24T07:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "20:00 PST"
8location = "Urbit office"
4location = "Urbit office"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/248852261/"
6registration_url = "https://www.meetup.com/urbit-sf/events/248852261/"
11−+++
7+description = "Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer."
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2018-03-24T04:00:00.000-07:00"
12
11
13−Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer.
12+[[hosts]]
13+name = "Urbit"
14++++
14
15
15No demos or talks. Just some time to hang, listen to music and meet up IRL. The room is full of desks and the internet is pretty fast. So impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you. Or just relax and talk to the weird array of people who also want to replace the internet.
16No demos or talks. Just some time to hang, listen to music and meet up IRL. The room is full of desks and the internet is pretty fast. So impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you. Or just relax and talk to the weird array of people who also want to replace the internet.
16
17
17−Feel free to bring friends!
18+Feel free to bring friends!
content/events/2018-04-08-20184-hoon-school.md+9−8
@@ -1,15 +1,16 @@
1+++
1+++
2title = "~2018.4 Hoon School"
2title = "~2018.4 Hoon School"
3−date = 2018-04-08
3+ends = "2018-04-09T00:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "13:00 PST"
8location = "Urbit office"
4location = "Urbit office"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/249019207/"
6registration_url = "https://www.meetup.com/urbit-sf/events/249019207/"
11−+++
7+description = "Come, bring your laptop, and we'll get you started building things in Urbit's language — Hoon."
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2018-04-08T21:00:00.000-07:00"
12
11
13−Come, bring your laptop, and we'll get you started building things in Urbit's language — Hoon.
12+[[hosts]]
13+name = "Urbit"
14++++
14
15
15−There's no lesson per-se, think of it more like an 'independent projects' class. A few of us will be around to help you get started working on whatever you're interested in. It's completely fine if you're new to the language. We're going to start with 20 spots so we can help everyone individually.
16+There's no lesson per-se, think of it more like an 'independent projects' class. A few of us will be around to help you get started working on whatever you're interested in. It's completely fine if you're new to the language. We're going to start with 20 spots so we can help everyone individually.
content/events/2018-05-25-urbit-irl-20185.md+9−8
@@ -1,17 +1,18 @@
1+++
1+++
2title = "Urbit IRL ~2018.5"
2title = "Urbit IRL ~2018.5"
3−date = 2018-05-25
3+ends = "2018-05-26T07:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "20:00 PST"
8location = "Urbit office"
4location = "Urbit office"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/250889557/"
6registration_url = "https://www.meetup.com/urbit-sf/events/250889557/"
11−+++
7+description = "Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer (or wine)."
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2018-05-26T04:00:00.000-07:00"
12
11
13−Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer (or wine).
12+[[hosts]]
13+name = "Urbit"
14++++
14
15
15Ted will give a quick update on Urbit's new build system, ford. Then it's time to hang, listen to music (our friend Grayson will be playing records) and meet up IRL. The room is full of desks and the internet is pretty fast. Impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you. Or just relax and talk to the weird array of people who also want to replace the internet.
16Ted will give a quick update on Urbit's new build system, ford. Then it's time to hang, listen to music (our friend Grayson will be playing records) and meet up IRL. The room is full of desks and the internet is pretty fast. Impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you. Or just relax and talk to the weird array of people who also want to replace the internet.
16
17
17−Feel free to bring friends!
18+Feel free to bring friends!
content/events/2018-08-03-after-hours-decentralized-web-summit.md+8−7
@@ -1,13 +1,14 @@
1+++
1+++
2title = "After hours 'decentralized web summit'"
2title = "After hours 'decentralized web summit'"
3−date = 2018-08-03
3+ends = "2018-08-04T03:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "17:00 PST"
8location = "Orbit Room"
4location = "Orbit Room"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/253423219/"
6registration_url = "https://www.meetup.com/urbit-sf/events/253423219/"
11−+++
7+description = "We’re hosting a last minute happy hour for our friends in town for the Decentralized Web Summit. All are welcome to join us tomorrow, Friday, August 3 at the Orbit Room from 5-7PM."
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2018-08-04T01:00:00.000-07:00"
12
11
13−We’re hosting a last minute happy hour for our friends in town for the Decentralized Web Summit. All are welcome to join us tomorrow, Friday, August 3 at the Orbit Room from 5-7PM.
12+[[hosts]]
13+name = "Urbit"
14++++
content/events/2018-08-17-urbit-irl-20188.md+9−8
@@ -1,19 +1,20 @@
1+++
1+++
2title = "Urbit IRL ~2018.8"
2title = "Urbit IRL ~2018.8"
3−date = 2018-08-17
3+ends = "2018-08-18T06:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "20:00 PST"
8location = "Urbit Office"
4location = "Urbit Office"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/253292678/"
6registration_url = "https://www.meetup.com/urbit-sf/events/253292678/"
11−+++
7+description = "UPDATE: Hey Everyone! Due to a conflict, we are rescheduling our gathering to the following Friday, August 17."
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2018-08-18T04:00:00.000-07:00"
12
11
13−UPDATE: Hey Everyone! Due to a conflict, we are rescheduling our gathering to the following Friday, August 17.
12+[[hosts]]
13+name = "Urbit"
14++++
14
15
15Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer.
16Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer.
16
17
17No demos or talks this time, but we will be hosting Hoon School again soon. Just some time to hang, listen to music and meet up IRL. The room is full of desks and the internet is pretty fast. So impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you. Or just relax and talk to the weird array of people who also want to replace the internet.
18No demos or talks this time, but we will be hosting Hoon School again soon. Just some time to hang, listen to music and meet up IRL. The room is full of desks and the internet is pretty fast. So impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you. Or just relax and talk to the weird array of people who also want to replace the internet.
18
19
19−Feel free to bring friends!
20+Feel free to bring friends!
content/events/2018-09-21-urbit-irl-20189.md+9−8
@@ -1,17 +1,18 @@
1+++
1+++
2title = "Urbit IRL ~2018.9"
2title = "Urbit IRL ~2018.9"
3−date = 2018-09-21
3+ends = "2018-09-22T07:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "20:00 PST"
8location = "Urbit Office"
4location = "Urbit Office"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/254602025/"
6registration_url = "https://www.meetup.com/urbit-sf/events/254602025/"
11−+++
7+description = "Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer (or wine)."
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2018-09-22T04:00:00.000-07:00"
12
11
13−Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer (or wine).
12+[[hosts]]
13+name = "Urbit"
14++++
14
15
15Gavin will give an update on Urbit design at 8:30. Then it's time to hang, listen to music and meet up IRL. The room has tables and the internet is pretty fast. Impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you. Or just relax and talk to the weird array of people who also want to replace the internet.
16Gavin will give an update on Urbit design at 8:30. Then it's time to hang, listen to music and meet up IRL. The room has tables and the internet is pretty fast. Impromptu demos and tutorials are the norm. Bring your laptop and we'll install Urbit for you. Or just relax and talk to the weird array of people who also want to replace the internet.
16
17
17−Feel free to bring friends!
18+Feel free to bring friends!
content/events/2018-10-10-urbit-zcash-blockchain-week.md+9−8
@@ -1,16 +1,17 @@
1+++
1+++
2title = "Urbit + Zcash: 'Blockchain Week'"
2title = "Urbit + Zcash: 'Blockchain Week'"
3−date = 2018-10-10
3+ends = "2018-10-11T06:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "19:00 PST"
8location = "Urbit Office"
4location = "Urbit Office"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/255001807/"
6registration_url = "https://www.meetup.com/urbit-sf/events/255001807/"
11−+++
7+description = "We're all full and looking forward to seeing you tonight. After you check-in at the front door please come up to floor 2, room 222."
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2018-10-11T03:00:00.000-07:00"
12
11
13−We're all full and looking forward to seeing you tonight. After you check-in at the front door please come up to floor 2, room 222.
12+[[hosts]]
13+name = "Urbit"
14++++
14
15
15~Schedule
16~Schedule
16
17
@@ -20,4 +21,4 @@ We're all full and looking forward to seeing you tonight. After you check-in at
20
21
218:30 - 9: Galen Wolfe-Pauly will tell you things about Urbit and our wallet
228:30 - 9: Galen Wolfe-Pauly will tell you things about Urbit and our wallet
22
23
23−9 - 10: Hangout
24+9 - 10: Hangout
content/events/2018-12-20-after-hours-its-just-a-party-man.md+9−8
@@ -1,17 +1,18 @@
1+++
1+++
2title = "After hours: It's just a party, man"
2title = "After hours: It's just a party, man"
3−date = 2018-12-20
3+ends = "2018-12-21T06:00:00.000-08:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "19:00 PST"
8location = "Urbit Office"
4location = "Urbit Office"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/256732938/"
6registration_url = "https://www.meetup.com/urbit-sf/events/256732938/"
11−+++
7+description = "We had a busy and productive 2018. This time around, we're just going to play music and relax."
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2018-12-21T03:00:00.000-08:00"
12
11
13−We had a busy and productive 2018. This time around, we're just going to play music and relax.
12+[[hosts]]
13+name = "Urbit"
14++++
14
15
15Come have a beer, connect with Urbit developers, fans and friends IRL, and ask questions about the address space going on-chain (if you have them).
16Come have a beer, connect with Urbit developers, fans and friends IRL, and ask questions about the address space going on-chain (if you have them).
16
17
17−Feel free to bring friends!
18+Feel free to bring friends!
content/events/2019-03-01-after-hours-ask-galen-anything.md+9−8
@@ -1,19 +1,20 @@
1+++
1+++
2title = "After hours: Ask Galen Anything"
2title = "After hours: Ask Galen Anything"
3−date = 2019-03-01
3+ends = "2019-03-02T06:30:00.000-08:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "19:30 PST"
8location = "Urbit Office"
4location = "Urbit Office"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/259144802/"
6registration_url = "https://www.meetup.com/urbit-sf/events/259144802/"
11−+++
7+description = "We thought we'd try something new this month. Come hang out and ask Galen questions about Azimuth, Arvo, or any part of Urbit."
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2019-03-02T03:30:00.000-08:00"
12
11
13−We thought we'd try something new this month. Come hang out and ask Galen questions about Azimuth, Arvo, or any part of Urbit.
12+[[hosts]]
13+name = "Urbit"
14++++
14
15
158:00-9:00pm: AMA
168:00-9:00pm: AMA
16
17
17Afterwards, have a beer, connect with Urbit developers, fans, and friends IRL.
18Afterwards, have a beer, connect with Urbit developers, fans, and friends IRL.
18
19
19−Feel free to bring friends and share the primer. <a href="https://urbit.org/primer" class="linkified">https://urbit.org/primer</a>
20+Feel free to bring friends and share the primer. <a href="https://urbit.org/primer" class="linkified">https://urbit.org/primer</a>
content/events/2019-03-08-urbit-irl-austin-tx.md+9−8
@@ -1,15 +1,16 @@
1+++
1+++
2title = "Urbit IRL: Austin, TX"
2title = "Urbit IRL: Austin, TX"
3−date = 2019-03-08
3+ends = "2019-03-09T03:00:00.000-08:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "17:00 PST"
8location = "Garage"
4location = "Garage"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/259307805/"
6registration_url = "https://www.meetup.com/urbit-sf/events/259307805/"
11−+++
7+description = "We're coming to Austin, TX! It turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a drink on us. Feel free to bring friends and come early for Urbit shirts."
8+guests = ""
9+timezone = "America/Chicago"
10+starts = "2019-03-09T01:00:00.000-08:00"
12
11
13−We're coming to Austin, TX! It turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a drink on us. Feel free to bring friends and come early for Urbit shirts.
12+[[hosts]]
13+name = "Urbit"
14++++
14
15
15−Thank you to our friends over at Garage for hosting us. We'll be there from 5-7 PM.
16+Thank you to our friends over at Garage for hosting us. We'll be there from 5-7 PM.
content/events/2019-04-19-urbit-irl-20194.md+9−8
@@ -1,19 +1,20 @@
1+++
1+++
2title = "Urbit IRL ~2019.4"
2title = "Urbit IRL ~2019.4"
3−date = 2019-04-19
3+ends = "2019-04-20T06:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "19:00 PST"
8location = "Urbit Office"
4location = "Urbit Office"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/260326318/"
6registration_url = "https://www.meetup.com/urbit-sf/events/260326318/"
11−+++
7+description = "Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer (or wine)."
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2019-04-20T03:00:00.000-07:00"
12
11
13−Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer (or wine).
12+[[hosts]]
13+name = "Urbit"
14++++
14
15
15By popular demand: we'll try to keep this one QUIET so everybody can talk.
16By popular demand: we'll try to keep this one QUIET so everybody can talk.
16
17
17Come for a quick update on what we're working on. Stay to relax and talk to a weird array of people who also want to replace the internet.
18Come for a quick update on what we're working on. Stay to relax and talk to a weird array of people who also want to replace the internet.
18
19
19−Feel free to bring friends!
20+Feel free to bring friends!
content/events/2019-05-17-urbit-irl-20195.md+9−8
@@ -1,17 +1,18 @@
1+++
1+++
2title = "Urbit IRL ~2019.5"
2title = "Urbit IRL ~2019.5"
3−date = 2019-05-17
3+ends = "2019-05-18T06:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "19:00 PST"
8location = "Urbit Office"
4location = "Urbit Office"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/261110620/"
6registration_url = "https://www.meetup.com/urbit-sf/events/261110620/"
11−+++
7+description = "Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer, or wine."
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2019-05-18T03:00:00.000-07:00"
12
11
13−Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have a beer, or wine.
12+[[hosts]]
13+name = "Urbit"
14++++
14
15
15This time we'll give a brief update on what we've been up to around 8pm. Turning the music down worked well, so we'll do that again. And if you want help installing Urbit, bring a laptop.
16This time we'll give a brief update on what we've been up to around 8pm. Turning the music down worked well, so we'll do that again. And if you want help installing Urbit, bring a laptop.
16
17
17−Feel free to bring friends!
18+Feel free to bring friends!
content/events/2019-06-21-urbit-irl-20196.md+9−8
@@ -1,17 +1,18 @@
1+++
1+++
2title = "Urbit IRL ~2019.6"
2title = "Urbit IRL ~2019.6"
3−date = 2019-06-21
3+ends = "2019-06-22T06:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "19:00 PST"
8location = "Urbit Office"
4location = "Urbit Office"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/262079477/"
6registration_url = "https://www.meetup.com/urbit-sf/events/262079477/"
11−+++
7+description = "Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have some beer and pizza."
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2019-06-22T03:00:00.000-07:00"
12
11
13−Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and have some beer and pizza.
12+[[hosts]]
13+name = "Urbit"
14++++
14
15
15This time we'll give a brief update on what we've been up to around 8pm. Turning the music down worked well, so we'll do that again. And if you want help installing Urbit, bring a laptop.
16This time we'll give a brief update on what we've been up to around 8pm. Turning the music down worked well, so we'll do that again. And if you want help installing Urbit, bring a laptop.
16
17
17−Feel free to bring friends!
18+Feel free to bring friends!
content/events/2019-07-19-urbit-irl-20197.md+8−9
@@ -1,18 +1,17 @@
1+++
1+++
2title = "Urbit IRL ~2019.7"
2title = "Urbit IRL ~2019.7"
3−date = 2019-07-19
3+ends = "2019-07-20T06:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "19:00 PST"
8location = "Urbit Office"
4location = "Urbit Office"
9image = "https://secure.meetupstatic.com/photos/event/e/0/5/b/600_482817435.jpeg"
5image = "https://secure.meetupstatic.com/photos/event/e/0/5/b/600_482817435.jpeg"
10registration_url = "https://www.meetup.com/urbit-sf/events/262858100/"
6registration_url = "https://www.meetup.com/urbit-sf/events/262858100/"
11−dark = true
7+description = "Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and chat with old and new friends over a beer."
12−overlay = true
8+guests = ""
13−+++
9+timezone = "America/Los_Angeles"
10+starts = "2019-07-20T03:00:00.000-07:00"
14
11
15−Turns out that just getting Urbit fans in one room is pretty fun — so come hang out and chat with old and new friends over a beer.
12+[[hosts]]
13+name = "Urbit"
14++++
16
15
17Turning the music down has worked well, so we'll continue doing that. And if you want help installing Urbit, bring a laptop.
16Turning the music down has worked well, so we'll continue doing that. And if you want help installing Urbit, bring a laptop.
18
17
content/events/2019-08-29-urbit-austin-20198.md+8−9
@@ -1,17 +1,16 @@
1+++
1+++
2title = "Urbit Austin ~2019.8"
2title = "Urbit Austin ~2019.8"
3−date = 2019-08-29
3+ends = "2019-08-30T04:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "18:00 PST"
8location = "Garage"
4location = "Garage"
9image = "https://secure.meetupstatic.com/photos/event/a/8/d/4/600_483643220.jpeg"
5image = "https://secure.meetupstatic.com/photos/event/a/8/d/4/600_483643220.jpeg"
10registration_url = "https://www.meetup.com/urbit-sf/events/263655974/"
6registration_url = "https://www.meetup.com/urbit-sf/events/263655974/"
11−dark = true
7+description = "Thanks to our friends over at Garage for offering to host another meetup in Austin, Texas."
12−overlay = true
8+guests = ""
13−+++
9+timezone = "America/Chicago"
10+starts = "2019-08-30T02:00:00.000-07:00"
14
11
15−Thanks to our friends over at Garage for offering to host another meetup in Austin, Texas.
12+[[hosts]]
13+name = "Urbit"
14++++
16
15
17Come have a drink on us, and bring friends! We'll be there 6–8pm.
16Come have a drink on us, and bring friends! We'll be there 6–8pm.
content/events/2019-10-04-urbit-irl-201910.md+8−9
@@ -1,18 +1,17 @@
1+++
1+++
2title = "Urbit IRL ~2019.10"
2title = "Urbit IRL ~2019.10"
3−date = 2019-10-04
3+ends = "2019-10-05T06:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "19:00 PST"
8location = "Urbit Office"
4location = "Urbit Office"
9image = "https://secure.meetupstatic.com/photos/event/e/1/c/5/600_485217797.jpeg"
5image = "https://secure.meetupstatic.com/photos/event/e/1/c/5/600_485217797.jpeg"
10registration_url = "https://www.meetup.com/urbit-sf/events/265165676/"
6registration_url = "https://www.meetup.com/urbit-sf/events/265165676/"
11−dark = true
7+description = "Lately, Urbit has been having dangerous amounts of fun online. So we got thinking, 'Wouldn't it be smart to try having fun offline as well?' Thus, we invented something totally new: an offline chatroom."
12−overlay = true
8+guests = ""
13−+++
9+timezone = "America/Los_Angeles"
10+starts = "2019-10-05T03:00:00.000-07:00"
14
11
15−Lately, Urbit has been having dangerous amounts of fun online. So we got thinking, "Wouldn't it be smart to try having fun offline as well?" Thus, we invented something totally new: an offline chatroom.
12+[[hosts]]
13+name = "Urbit"
14++++
16
15
17We're calling it Urbit IRL. You can use it to see your friends face-to-face, converse about Urbit, even to share a beer. And we're trying it out Friday, October 4.
16We're calling it Urbit IRL. You can use it to see your friends face-to-face, converse about Urbit, even to share a beer. And we're trying it out Friday, October 4.
18
17
content/events/2019-11-15-urbit-irl-201911.md+8−9
@@ -1,18 +1,17 @@
1+++
1+++
2title = "Urbit IRL ~2019.11"
2title = "Urbit IRL ~2019.11"
3−date = 2019-11-15
3+ends = "2019-11-16T06:00:00.000-08:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "19:00 PST"
8location = "Urbit Office"
4location = "Urbit Office"
9image = "https://secure.meetupstatic.com/photos/event/4/c/e/6/600_486379686.jpeg"
5image = "https://secure.meetupstatic.com/photos/event/4/c/e/6/600_486379686.jpeg"
10registration_url = "https://www.meetup.com/urbit-sf/events/266146513/"
6registration_url = "https://www.meetup.com/urbit-sf/events/266146513/"
11−dark = true
7+description = "Lately, Urbit has been having dangerous amounts of fun online. So we got thinking, 'Wouldn't it be smart to try having fun offline as well?' Thus, we invented something totally new: an offline chatroom."
12−overlay = true
8+guests = ""
13−+++
9+timezone = "America/Los_Angeles"
10+starts = "2019-11-16T03:00:00.000-08:00"
14
11
15−Lately, Urbit has been having dangerous amounts of fun online. So we got thinking, "Wouldn't it be smart to try having fun offline as well?" Thus, we invented something totally new: an offline chatroom.
12+[[hosts]]
13+name = "Urbit"
14++++
16
15
17We're calling it Urbit IRL. You can use it to see your friends face-to-face, converse about Urbit, even to share a beer. And we're trying it out Friday, November 15.
16We're calling it Urbit IRL. You can use it to see your friends face-to-face, converse about Urbit, even to share a beer. And we're trying it out Friday, November 15.
18
17
content/events/2019-12-13-urbit-irl-201912.md+8−9
@@ -1,18 +1,17 @@
1+++
1+++
2title = "Urbit IRL ~2019.12"
2title = "Urbit IRL ~2019.12"
3−date = 2019-12-13
3+ends = "2019-12-14T05:00:00.000-08:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "19:00 PST"
8location = "Urbit Office"
4location = "Urbit Office"
9image = "https://secure.meetupstatic.com/photos/event/6/a/8/8/600_487107272.jpeg"
5image = "https://secure.meetupstatic.com/photos/event/6/a/8/8/600_487107272.jpeg"
10registration_url = "https://www.meetup.com/urbit-sf/events/266904108/"
6registration_url = "https://www.meetup.com/urbit-sf/events/266904108/"
11−dark = true
7+description = "Come celebrate, friends! Urbit has had quite the decade, transforming from an intercepted interstellar transmission to a functional operating system, which also functions."
12−overlay = true
8+guests = ""
13−+++
9+timezone = "America/Los_Angeles"
10+starts = "2019-12-14T03:00:00.000-08:00"
14
11
15−Come celebrate, friends! Urbit has had quite the decade, transforming from an intercepted interstellar transmission to a functional operating system, which also functions.
12+[[hosts]]
13+name = "Urbit"
14++++
16
15
17We're getting together to savor the moment and get hype about what the next decade holds (the whole replacing the internet thing).
16We're getting together to savor the moment and get hype about what the next decade holds (the whole replacing the internet thing).
18
17
content/events/2020-01-24-urbit-irl-20201.md+9−8
@@ -1,18 +1,19 @@
1+++
1+++
2title = "Urbit IRL ~2020.1"
2title = "Urbit IRL ~2020.1"
3−date = 2020-01-24
3+ends = "2020-01-25T06:00:00.000-08:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "19:00 PST"
8location = "Urbit Office"
4location = "Urbit Office"
9image = "https://secure.meetupstatic.com/photos/event/2/1/7/6/600_487988566.jpeg"
5image = "https://secure.meetupstatic.com/photos/event/2/1/7/6/600_487988566.jpeg"
10registration_url = "https://www.meetup.com/urbit-sf/events/267753862/"
6registration_url = "https://www.meetup.com/urbit-sf/events/267753862/"
11−dark = true
7+description = "Neo-Urbit arrives from the future."
12−overlay = true
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2020-01-25T03:00:00.000-08:00"
11+
12+[[hosts]]
13+name = "Urbit"
13+++
14+++
14
15
15−"Neo-Urbit arrives from the future." It's 2020 and Urbit is accelerating. We've got a lot going live this year.
16+It's 2020 and Urbit is accelerating. We've got a lot going live this year.
16
17
17Replacing the internet is a thing to behold. Come by the offices to hang out, have a drink, and hear the latest.
18Replacing the internet is a thing to behold. Come by the offices to hang out, have a drink, and hear the latest.
18
19
content/events/2020-02-28-urbit-irl-20202.md+8−9
@@ -1,18 +1,17 @@
1+++
1+++
2title = "Urbit IRL ~2020.2"
2title = "Urbit IRL ~2020.2"
3−date = 2020-02-28
3+ends = "2020-02-29T06:00:00.000-08:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "19:00 PST"
8location = "Urbit Office"
4location = "Urbit Office"
9image = "https://secure.meetupstatic.com/photos/event/8/5/e/b/600_488794283.jpeg"
5image = "https://secure.meetupstatic.com/photos/event/8/5/e/b/600_488794283.jpeg"
10registration_url = "https://www.meetup.com/urbit-sf/events/268519069/"
6registration_url = "https://www.meetup.com/urbit-sf/events/268519069/"
11−dark = true
7+description = "Urbit is a wilderness right now. A vast continent of possibility. We're gonna head out there and hack around. Join us."
12−overlay = true
8+guests = ""
13−+++
9+timezone = "America/Los_Angeles"
10+starts = "2020-02-29T03:00:00.000-08:00"
14
11
15−Urbit is a wilderness right now. A vast continent of possibility. We're gonna head out there and hack around. Join us.
12+[[hosts]]
13+name = "Urbit"
14++++
16
15
17Before we go headlong into that unknown region, we're gonna have a party at basecamp (aka the office). Come hang out and have a drink with your fellow Urbit explorers.
16Before we go headlong into that unknown region, we're gonna have a party at basecamp (aka the office). Come hang out and have a drink with your fellow Urbit explorers.
18
17
content/events/2020-04-03-urbit-os1-launch-party.md+8−9
@@ -1,19 +1,18 @@
1+++
1+++
2title = "Urbit OS1 Launch Party"
2title = "Urbit OS1 Launch Party"
3−date = 2020-04-03
3+ends = "2020-04-04T06:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "19:00 PST"
8location = "Online event"
4location = "Online event"
9image = "https://secure.meetupstatic.com/photos/event/1/f/8/b/600_489548075.jpeg"
5image = "https://secure.meetupstatic.com/photos/event/1/f/8/b/600_489548075.jpeg"
10registration_url = "https://www.meetup.com/urbit-sf/events/268519156/"
6registration_url = "https://www.meetup.com/urbit-sf/events/268519156/"
11youtube = "71ViyftPkGk"
7youtube = "71ViyftPkGk"
12−dark = true
8+description = "Join us as we launch Urbit OS1!"
13−overlay = true
9+guests = ""
14−+++
10+timezone = "America/Los_Angeles"
11+starts = "2020-04-04T03:00:00.000-07:00"
15
12
16−Join us as we launch Urbit OS1!
13+[[hosts]]
14+name = "Urbit"
15++++
17
16
18The presentation will begin at 7pm Pacific.
17The presentation will begin at 7pm Pacific.
19
18
content/events/2020-10-09-urbit-hosting-launch-event.md+8−8
@@ -1,18 +1,18 @@
1+++
1+++
2title = "Urbit Hosting Launch Event"
2title = "Urbit Hosting Launch Event"
3−date = 2020-10-09
3+ends = "2020-10-10T03:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "17:00 PST"
8location = "Online event"
4location = "Online event"
9image = "https://secure.meetupstatic.com/photos/event/8/600_492480008.jpeg"
5image = "https://secure.meetupstatic.com/photos/event/8/600_492480008.jpeg"
10registration_url = "https://www.meetup.com/urbit-sf/events/273439025/"
6registration_url = "https://www.meetup.com/urbit-sf/events/273439025/"
11youtube = "w3qKe_WZr50"
7youtube = "w3qKe_WZr50"
12−dark = true
8+description = ""
13−+++
9+guests = ""
10+timezone = "America/Los_Angeles"
11+starts = "2020-10-10T01:00:00.000-07:00"
14
12
15−---
13+[[hosts]]
14+name = "Urbit"
15++++
16
16
17We've been busy building, testing and refining — and now it's time to show off what we've been up to.
17We've been busy building, testing and refining — and now it's time to show off what we've been up to.
18
18
content/events/2020-11-05-developer-call-graph-store.md+12−6
@@ -1,18 +1,24 @@
1+++
1+++
2title = "Developer Call: Graph Store"
2title = "Developer Call: Graph Store"
3−date = 2020-11-05
3+ends = "2020-11-05T18:30:00.000-08:00"
4−[extra]
5−pinned = false
6−host = "Lane R., Urbit"
7−time = "09:00 PST"
8location = "Online event"
4location = "Online event"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/274279522/"
6registration_url = "https://www.meetup.com/urbit-sf/events/274279522/"
11youtube = "E4DFuAZQ32Y"
7youtube = "E4DFuAZQ32Y"
8+description = ""
9+guests = ""
10+timezone = "America/Los_Angeles"
11+starts = "2020-11-05T17:00:00.000-08:00"
12+
13+[[hosts]]
14+name = "Lane R."
15+
16+[[hosts]]
17+name = "Urbit"
12+++
18+++
13
19
14Developer calls are focused on the technologies that underpin Urbit, from the top of the stack to the very bottom. They’re an opportunity for the people developing and contributing to Urbit to share their knowledge and expertise, including things that typically don’t make it into the docs, such as how and why Urbit works the way it does.
20Developer calls are focused on the technologies that underpin Urbit, from the top of the stack to the very bottom. They’re an opportunity for the people developing and contributing to Urbit to share their knowledge and expertise, including things that typically don’t make it into the docs, such as how and why Urbit works the way it does.
15
21
16This call will feature a discussion by Tlon engineer Logan Allen about graph-store, the general-purpose store that is gradually replacing the bespoke stores behind Chat, Publish and Links.
22This call will feature a discussion by Tlon engineer Logan Allen about graph-store, the general-purpose store that is gradually replacing the bespoke stores behind Chat, Publish and Links.
17
23
18−You can join the event by clicking the gotowebinar.com link posted here. Details for joining the conversation were also emailed to all registered attendees, and will be sent again shortly before the event starts. Please check your email inbox for a message from Meetup.com.
24+You can join the event by clicking the gotowebinar.com link posted here. Details for joining the conversation were also emailed to all registered attendees, and will be sent again shortly before the event starts. Please check your email inbox for a message from Meetup.com.
content/events/2020-11-19-developer-call-bittorrent-tracking-on-urbit.md+12−8
@@ -1,18 +1,22 @@
1+++
1+++
2title = "Developer Call: BitTorrent tracking on Urbit"
2title = "Developer Call: BitTorrent tracking on Urbit"
3−date = 2020-11-19
3+ends = "2020-11-19T18:30:00.000-08:00"
4−[extra]
5−pinned = false
6−host = "Lane R., Urbit"
7−time = "09:00 PST"
8location = "Online event"
4location = "Online event"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/274650693/"
6registration_url = "https://www.meetup.com/urbit-sf/events/274650693/"
11youtube = "cvx2UV6TJ5I"
7youtube = "cvx2UV6TJ5I"
12−+++
8+description = "Developer calls are focused on the technologies that underpin Urbit, from the top of the stack to the very bottom. They’re an opportunity for the people developing and contributing to Urbit to share their knowledge and expertise, including things that typically don’t make it into the docs, such as how and why Urbit works the way it does."
9+guests = ""
10+timezone = "America/Los_Angeles"
11+starts = "2020-11-19T17:00:00.000-08:00"
12+
13+[[hosts]]
14+name = "Lane R."
13
15
14−Developer calls are focused on the technologies that underpin Urbit, from the top of the stack to the very bottom. They’re an opportunity for the people developing and contributing to Urbit to share their knowledge and expertise, including things that typically don’t make it into the docs, such as how and why Urbit works the way it does.
16+[[hosts]]
17+name = "Urbit"
18++++
15
19
16This call will feature a discussion by Tlon engineer Mark Staarink, also known as ~palfun-foslup, about writing an HTTP BitTorrent tracker and command line app in 1500 lines of code.
20This call will feature a discussion by Tlon engineer Mark Staarink, also known as ~palfun-foslup, about writing an HTTP BitTorrent tracker and command line app in 1500 lines of code.
17
21
18−The livestream will be held on YouTube, and a group video call will be made available via Google Meet after the talk for casual discussion and in-person conversation.
22+The livestream will be held on YouTube, and a group video call will be made available via Google Meet after the talk for casual discussion and in-person conversation.
content/events/2020-12-10-developer-call-injecting-external-services-into-urbit.md+13−6
@@ -1,18 +1,25 @@
1+++
1+++
2title = "Developer Call: Injecting External Services into Urbit"
2title = "Developer Call: Injecting External Services into Urbit"
3−date = 2020-12-10
3+ends = "2020-12-10T18:30:00.000-08:00"
4−[extra]
5−pinned = false
6−host = "Lane R., Urbit"
7−time = "09:00 PST"
8location = "Online event"
4location = "Online event"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/275051926/"
6registration_url = "https://www.meetup.com/urbit-sf/events/275051926/"
11youtube = "LaWNHMmxQag"
7youtube = "LaWNHMmxQag"
8+description = ""
9+guests = ""
10+timezone = "America/Los_Angeles"
11+starts = "2020-12-10T17:00:00.000-08:00"
12+
13+[[hosts]]
14+name = "Lane R."
15+
16+[[hosts]]
17+name = "Urbit"
12+++
18+++
13
19
14This call will feature a discussion by well-known developer in the Urbit community, ~timluc-miptev. ~timluc will be discussing the work he's been doing to provide access to a Bitcoin full node, which will enable Urbit ships to make Bitcoin payments to other ships. More generally, he'll be discussing the patterns that he's using to manage an Urbit ship's connection to externally-running infrastructure, and how access to that infrastructure can be provided to other Urbit nodes.
20This call will feature a discussion by well-known developer in the Urbit community, ~timluc-miptev. ~timluc will be discussing the work he's been doing to provide access to a Bitcoin full node, which will enable Urbit ships to make Bitcoin payments to other ships. More generally, he'll be discussing the patterns that he's using to manage an Urbit ship's connection to externally-running infrastructure, and how access to that infrastructure can be provided to other Urbit nodes.
15
21
16Developer calls are focused on the technologies that underpin Urbit, from the top of the stack to the very bottom. They’re an opportunity for the people developing and contributing to Urbit to share their knowledge and expertise, including things that typically don’t make it into the docs, such as how and why Urbit works the way it does.
22Developer calls are focused on the technologies that underpin Urbit, from the top of the stack to the very bottom. They’re an opportunity for the people developing and contributing to Urbit to share their knowledge and expertise, including things that typically don’t make it into the docs, such as how and why Urbit works the way it does.
17
23
18−The livestream will be held on YouTube, and a group video call will be made available via Google Meet after the talk for casual discussion and in-person conversation.
24+The livestream will be held on YouTube, and a group video call will be made available via Google Meet after the talk for casual discussion and in-person conversation."
25++++
content/events/2021-02-04-developer-call-architectural-idea-maze.md+13−7
@@ -1,17 +1,23 @@
1+++
1+++
2title = "Developer Call: Architectural Idea Maze"
2title = "Developer Call: Architectural Idea Maze"
3−date = 2021-02-04
3+ends = "2021-02-04T18:30:00.000-08:00"
4−[extra]
5−pinned = false
6−host = "Lane R., Urbit"
7−time = "09:00 PST"
8location = "Online event"
4location = "Online event"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/275992798/"
6registration_url = "https://www.meetup.com/urbit-sf/events/275992798/"
7+description = ""
8+guests = ""
9+timezone = "America/Los_Angeles"
10+starts = "2021-02-04T17:00:00.000-08:00"
11+
12+[[hosts]]
13+name = "Lane R."
14+
15+[[hosts]]
16+name = "Urbit"
11+++
17+++
12
18
13−Tlon Engineer Philip Monk is interviewed by Poprox in an "Architectural Idea Maze" discussion, where Phil will discuss the choices made, and possibly more importantly, the choices *not* made in the design of a component of Urbit. In this discussion, Phil will be focusing on subscriptions in all their forms throughout Urbit.
19+Tlon Engineer Philip Monk is interviewed by Poprox in an "Architectural Idea Maze" discussion, where Phil will discuss the choices made, and possibly more importantly, the choices _not_ made in the design of a component of Urbit. In this discussion, Phil will be focusing on subscriptions in all their forms throughout Urbit.
14
20
15Developer calls are focused on the technologies that underpin Urbit, from the top of the stack to the very bottom. They’re an opportunity for the people developing and contributing to Urbit to share their knowledge and expertise, including things that typically don’t make it into the docs, such as how and why Urbit works the way it does.
21Developer calls are focused on the technologies that underpin Urbit, from the top of the stack to the very bottom. They’re an opportunity for the people developing and contributing to Urbit to share their knowledge and expertise, including things that typically don’t make it into the docs, such as how and why Urbit works the way it does.
16
22
17−The livestream will be held on YouTube, and a group video call will be made available via Google Meet after the talk for casual discussion and in-person conversation.
23+The livestream will be held on YouTube, and a group video call will be made available via Google Meet after the talk for casual discussion and in-person conversation.
content/events/2021-03-04-developer-call-scaling-azimuth.md+9−6
@@ -1,14 +1,17 @@
1+++
1+++
2title = "Developer Call: Scaling Azimuth"
2title = "Developer Call: Scaling Azimuth"
3−date = 2021-03-04
3+ends = "2021-03-04T18:30:00.000-08:00"
4−[extra]
5−pinned = false
6−host = "Urbit"
7−time = "09:00 PST"
8location = "Online event"
4location = "Online event"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/276692816/"
6registration_url = "https://www.meetup.com/urbit-sf/events/276692816/"
11youtube = "CKuHXrdkIw0"
7youtube = "CKuHXrdkIw0"
8+description = ""
9+guests = ""
10+timezone = "America/Los_Angeles"
11+starts = "2021-03-04T17:00:00.000-08:00"
12+
13+[[hosts]]
14+name = "Urbit"
12+++
15+++
13
16
14Urbit engineer Philip Monk will be discussing the solution space to scaling Azimuth, the infrastructure for Urbit ID that's built on Ethereum.
17Urbit engineer Philip Monk will be discussing the solution space to scaling Azimuth, the infrastructure for Urbit ID that's built on Ethereum.
@@ -19,4 +22,4 @@ Phil has been doing a ton of research for the past few months on different appro
19
22
20As usual, this talk will feature a presentation, a Q&amp;A period and a follow-up video call that anyone from the audience can join.
23As usual, this talk will feature a presentation, a Q&amp;A period and a follow-up video call that anyone from the audience can join.
21
24
22−See you there!
25+See you there!
content/events/2021-03-18-developer-call-pressure-and-protolith.md+11−6
@@ -1,16 +1,21 @@
1+++
1+++
2title = "Developer Call: Pressure and Protolith"
2title = "Developer Call: Pressure and Protolith"
3−date = 2021-03-18
3+ends = "2021-03-04T18:30:00.000-08:00"
4−[extra]
5−pinned = false
6−host = "Josh Lehman (~wolref-podlex)"
7−guests = "Matilde Park (~haddef-sigwen)"
8−time = "09:00 PST"
9location = "Online event"
4location = "Online event"
10image = ""
5image = ""
11registration_url = "https://www.meetup.com/urbit-sf/events/276898246/"
6registration_url = "https://www.meetup.com/urbit-sf/events/276898246/"
12description = "Matilde Park, Landscape team lead, talks about the distinctions between the Landscape product and basic Urbit development, and the significance of building Landscape for Tlon."
7description = "Matilde Park, Landscape team lead, talks about the distinctions between the Landscape product and basic Urbit development, and the significance of building Landscape for Tlon."
13youtube = "XjIDZQUZZtE"
8youtube = "XjIDZQUZZtE"
9+timezone = "America/Los_Angeles"
10+starts = "2021-03-18T17:00:00.000-07:00"
11+
12+[[hosts]]
13+name = "Josh Lehman"
14+patp = "~wolref-podlex)"
15+
16+[[guests]]
17+name = "Matilde Park"
18+patp = "~haddef-sigwen"
14+++
19+++
15
20
16Landscape was an experiment. Now it’s Tlon's flagship client for the Urbit project: a product, a full-stack application, spread across a variety of Gall agents and libraries, lighting the way forward against the dwindling unknowns in the reality of Urbit userspace development and distribution.
21Landscape was an experiment. Now it’s Tlon's flagship client for the Urbit project: a product, a full-stack application, spread across a variety of Gall agents and libraries, lighting the way forward against the dwindling unknowns in the reality of Urbit userspace development and distribution.
content/events/2021-04-01-developer-call-javascript-apps-on-urbit.md+12−7
@@ -1,20 +1,25 @@
1+++
1+++
2title = "Developer Call: JavaScript Apps on Urbit"
2title = "Developer Call: JavaScript Apps on Urbit"
3−date = 2021-04-01
3+ends = "2021-04-01T18:30:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Mike Osborne (~taller-ravnut)"
7−time = "09:00 PST"
8location = "Online Event"
4location = "Online Event"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/277261928/"
6registration_url = "https://www.meetup.com/urbit-sf/events/277261928/"
11−guests = "Tyler Brown Cifu Shuster (~radbur-sivmus)"
12description = "In this talk, Tyler Brown Cifu Shuster (~radbur-sivmus) explains how to use Javascript tools to develop a client for Urbit."
7description = "In this talk, Tyler Brown Cifu Shuster (~radbur-sivmus) explains how to use Javascript tools to develop a client for Urbit."
13youtube = "avLSSdb2VLM"
8youtube = "avLSSdb2VLM"
9+timezone = "America/Los_Angeles"
10+starts = "2021-04-01T17:00:00.000-07:00"
11+
12+[[hosts]]
13+name = "Mike Osborne"
14+patp = "~taller-ravnut"
15+
16+[[guests]]
17+name = "Tyler Brown Cifu Shuster"
18+patp = "~radbur-sivmus"
14+++
19+++
15
20
16Urbit provides a powerful and extensible platform for all kinds of app development. It can serve as a general-purpose datastore, decentralized network, and identity solution for a variety of front-end applications. The client that ships with Urbit, Landscape, provides one example of the kind of applications that can be built on the platform. However, other developers can use the same tools used to create Landscape to power their own interfaces and clients for Urbit.
21Urbit provides a powerful and extensible platform for all kinds of app development. It can serve as a general-purpose datastore, decentralized network, and identity solution for a variety of front-end applications. The client that ships with Urbit, Landscape, provides one example of the kind of applications that can be built on the platform. However, other developers can use the same tools used to create Landscape to power their own interfaces and clients for Urbit.
17
22
18Tyler Brown Cifu Shuster (~radbur-sivmus) has worked with the Landscape team over the past few months to extract these tools into reusable Javascript packages. In this talk, he will explain how to use them to develop a client for Urbit independent of Landscape. He will cover the basic lifecycle of a client and explain how Javascript interface and state frameworks pair with Urbit's data model.
23Tyler Brown Cifu Shuster (~radbur-sivmus) has worked with the Landscape team over the past few months to extract these tools into reusable Javascript packages. In this talk, he will explain how to use them to develop a client for Urbit independent of Landscape. He will cover the basic lifecycle of a client and explain how Javascript interface and state frameworks pair with Urbit's data model.
19
24
20−This talk should enable anyone familiar with modern Javascript development and HTTP grammar to build an application on top of Urbit without writing any back-end code.
25+This talk should enable anyone familiar with modern Javascript development and HTTP grammar to build an application on top of Urbit without writing any back-end code
content/events/2021-04-15-developer-call-software-distribution.md+16−7
@@ -1,16 +1,25 @@
1+++
1+++
2title = "Developer Call: 3rd Party Software Distribution"
2title = "Developer Call: 3rd Party Software Distribution"
3−date = 2021-04-15
3+ends = "2021-04-15T18:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Josh Lehman (~wolref-podlex)"
7−time = "09:00 PST"
8location = "Online Event"
4location = "Online Event"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/277474491/"
6registration_url = "https://www.meetup.com/urbit-sf/events/277474491/"
11−guests = "Raghu (~sovmep-ripsum) and Philip Monk (~wicdev-wisryt)"
12description = "Some exciting work has been going on behind the scenes to provide the foundation for 3rd party software distribution."
7description = "Some exciting work has been going on behind the scenes to provide the foundation for 3rd party software distribution."
13youtube = "XwICC6Its1E"
8youtube = "XwICC6Its1E"
9+timezone = "America/Los_Angeles"
10+starts = "2021-04-15T17:00:00.000-07:00"
11+
12+[[hosts]]
13+name = "Josh Lehman"
14+patp = "~wolref-podlex"
15+
16+[[guests]]
17+name = "Raghu"
18+patp = "~sovmep-ripsum"
19+
20+[[guests]]
21+name = " Philip Monk"
22+patp = "~wicdev-wisryt"
14+++
23+++
15
24
16Some exciting work has been going on behind the scenes to provide the foundation for 3rd party software distribution. In this talk Phil (~wicdev-wisryt) and Raghu (~sovmep-ripsum) will discuss the work they've been doing to clay to provide "virtual desks"—an integral part of the infrastructure needed to have safe, generic software distribution.
25Some exciting work has been going on behind the scenes to provide the foundation for 3rd party software distribution. In this talk Phil (~wicdev-wisryt) and Raghu (~sovmep-ripsum) will discuss the work they've been doing to clay to provide "virtual desks"—an integral part of the infrastructure needed to have safe, generic software distribution.
@@ -19,7 +28,7 @@ Raghu is a software engineer at Hudson River Trading who is perhaps best known f
19
28
20As usual, there'll be an opportunity to jump on the call with us afterward to ask questions and hang out.
29As usual, there'll be an opportunity to jump on the call with us afterward to ask questions and hang out.
21
30
22−## Resources
31+## Resources
23
32
24- [Original mailing list discussion of 3rd party software distribution](https://groups.google.com/a/urbit.org)
33- [Original mailing list discussion of 3rd party software distribution](https://groups.google.com/a/urbit.org)
25- [ucal](https://github.com/taalhavras/ucal)
34- [ucal](https://github.com/taalhavras/ucal)
content/events/2021-04-27-bitcoin-launch.md+9−7
@@ -1,17 +1,19 @@
1+++
1+++
2title = "Bitcoin Launch"
2title = "Bitcoin Launch"
3−date = 2021-04-27
3+ends = "2021-04-27T21:30:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Urbit Foundation"
7−time = "12:00pm PDT"
8location = "Online Event"
4location = "Online Event"
9image = "https://media.urbit.org/site/events/bitcoin-launch-event.png"
5image = "https://media.urbit.org/site/events/bitcoin-launch-event.png"
10registration_url = "https://www.meetup.com/urbit-sf/events/276741426/"
6registration_url = "https://www.meetup.com/urbit-sf/events/276741426/"
11youtube = "_aRnfacZPto"
7youtube = "_aRnfacZPto"
12−guests = "Marty Bent"
13description = "Bitcoin is coming to Urbit! With the upcoming release of the Bitcoin Wallet, you will be able to pay Urbit ships directly with BTC."
8description = "Bitcoin is coming to Urbit! With the upcoming release of the Bitcoin Wallet, you will be able to pay Urbit ships directly with BTC."
14−dark = true
9+timezone = "America/Los_Angeles"
10+starts = "2021-04-27T20:00:00.000-07:00"
11+
12+[[hosts]]
13+name = "Urbit Foundation"
14+
15+[[guests]]
16+name = "Marty Bent"
15+++
17+++
16
18
17Bitcoin is coming to Urbit! With the upcoming release of the Bitcoin Wallet, you will be able to pay Urbit ships directly with BTC.
19Bitcoin is coming to Urbit! With the upcoming release of the Bitcoin Wallet, you will be able to pay Urbit ships directly with BTC.
content/events/2021-04-29-developer-call-real-time-communications-on-urbit.md+11−6
@@ -1,16 +1,21 @@
1+++
1+++
2title = "Developer Call: Real-Time Communication on Urbit"
2title = "Developer Call: Real-Time Communication on Urbit"
3−date = 2021-04-29
3+ends = "2021-04-29T18:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Josh Lehman (~wolref-podlex)"
7−time = "09:00 PST"
8location = "Online Event"
4location = "Online Event"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/277674273/"
6registration_url = "https://www.meetup.com/urbit-sf/events/277674273/"
11−guests = "Edward Amsden (~ritpub-sipsyl)"
12description = "Video chat on Urbit? It's nearly here with WebRTC."
7description = "Video chat on Urbit? It's nearly here with WebRTC."
13youtube = "XFct6JZHPC0"
8youtube = "XFct6JZHPC0"
9+timezone = "America/Los_Angeles"
10+starts = "2021-04-29T17:00:00.000-07:00"
11+
12+[[hosts]]
13+name = "Josh Lehman"
14+patp = "~wolref-podlex"
15+
16+[[guests]]
17+name = "Edward Amsden"
18+patp = "~ritpub-sipsyl"
14+++
19+++
15
20
16Video chat on Urbit? It's nearly here using the WebRTC protocol. Edward Amsden (`~ritpub-sipsyl`) will be giving us a look at the WebRTC Airlock library that he has developed that handles all the hard parts of WebRTC. This will allow developers to simply call or answer calls by ship or app name. Edward will also be giving us a live text-based demo of WebRTC on urbit. Please join us for an exciting presentation.
21Video chat on Urbit? It's nearly here using the WebRTC protocol. Edward Amsden (`~ritpub-sipsyl`) will be giving us a look at the WebRTC Airlock library that he has developed that handles all the hard parts of WebRTC. This will allow developers to simply call or answer calls by ship or app name. Edward will also be giving us a live text-based demo of WebRTC on urbit. Please join us for an exciting presentation.
content/events/2021-05-13-developer-call-versioned-networking.md+11−6
@@ -1,16 +1,21 @@
1+++
1+++
2title = "Developer Call: P2P Versioned Networking"
2title = "Developer Call: P2P Versioned Networking"
3−date = 2021-05-13
3+ends = "2021-05-14T01:00:00.000-07:00"
4−[extra]
5−pinned = false
6−host = "Josh Lehman (~wolref-podlex)"
7−time = "16:00 PST"
8location = "Online Event"
4location = "Online Event"
9image = ""
5image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/278052029/"
6registration_url = "https://www.meetup.com/urbit-sf/events/278052029/"
11−guests = "Liam Fitzgerald (~hastuc-dibtux)"
12description = "Versioned Networking for Application Developers"
7description = "Versioned Networking for Application Developers"
13youtube = "BhQ1vk4jGsk"
8youtube = "BhQ1vk4jGsk"
9+timezone = "America/Los_Angeles"
10+starts = "2021-05-14T00:00:00.000-07:00"
11+
12+[[hosts]]
13+name = "Josh Lehman"
14+patp = "~wolref-podlex"
15+
16+[[guests]]
17+name = "Liam Fitzgerald"
18+patp = "~hastuc-dibtux"
14+++
19+++
15
20
16Building solid networking infrastructure has been a major focus of the Urbit project since its inception. There's a lot going on under the hood
21Building solid networking infrastructure has been a major focus of the Urbit project since its inception. There's a lot going on under the hood
content/events/2021-05-27-town-hall.md+16−7
@@ -1,17 +1,26 @@
1+++
1+++
2title = "Town Hall"
2title = "Town Hall"
3−date = 2021-05-27
3+ends = "2021-05-27T23:30"
4−[extra]
5−pinned = false
6−host = "Josh Lehman (~wolref-podlex)"
7−time = "12:00 - 15:30 PDT"
8location = "Online Event"
4location = "Online Event"
9image = "https://media.urbit.org/site/events/URBIT-TOWN-HALL.png"
5image = "https://media.urbit.org/site/events/URBIT-TOWN-HALL.png"
10registration_url = "https://www.meetup.com/urbit-sf/events/278188361/"
6registration_url = "https://www.meetup.com/urbit-sf/events/278188361/"
11−guests = "Hunter Miller (~nocsyx-lassul) and Justin Murphy (~hatryx-lastud)"
12description = "A virtual mini-conference for the Urbit community featuring a special keynote talk from our friend Justin Murphy."
7description = "A virtual mini-conference for the Urbit community featuring a special keynote talk from our friend Justin Murphy."
13youtube = "8YSwt0vDPj0"
8youtube = "8YSwt0vDPj0"
14−dark=true
9+dark = true
10+timezone = "America/Los_Angeles"
11+starts = "2021-05-27T20:00"
12+
13+[[hosts]]
14+name = "Josh Lehman"
15+patp = "~wolref-podlex"
16+
17+[[guests]]
18+name = "Hunter Miller"
19+patp = "~nocsyx-lassul"
20+
21+[[guests]]
22+name = "Justin Murphy"
23+patp = "~hatryx-lastud"
15+++
24+++
16
25
17The Urbit community has grown at a rapid clip throughout 2021. There are so many exciting things going on that it's hard to convey them all, even with Developer Calls happening every two weeks. This event will function as a virtual "mini-conference" where we'll give a series of important and exciting announcements, including both formal and informal talks from many members of our community.
26The Urbit community has grown at a rapid clip throughout 2021. There are so many exciting things going on that it's hard to convey them all, even with Developer Calls happening every two weeks. This event will function as a virtual "mini-conference" where we'll give a series of important and exciting announcements, including both formal and informal talks from many members of our community.
content/events/2021-07-01-developer-call-runtime-future.md+14−11
@@ -1,18 +1,21 @@
1+++
1+++
2−
3title = "Developer Call: The Urbit Runtime and its Future"
2title = "Developer Call: The Urbit Runtime and its Future"
4−date = 2021-07-01
3+ends = "2021-07-01T18:00:00.000-07:00"
5−[extra]
6−pinned = false
7−host = "Ted Blackman (~rovnys-ricfer)"
8−guests = "Joe Bryan (~master-morzod)"
9−time = "9:00 PDT"
10−location = "Online Event"
4+location = "Online Event"
11−image = ""
5+image = ""
12−registration_url = "https://www.meetup.com/urbit-sf/events/279137337/"
6+registration_url = "https://www.meetup.com/urbit-sf/events/279137337/"
13−description = "The current and future thinking about the Urbit runtime"
7+description = "The current and future thinking about the Urbit runtime"
14youtube = "z0grAh_yhE8"
8youtube = "z0grAh_yhE8"
9+timezone = "America/Los_Angeles"
10+starts = "2021-07-01T17:00:00.000-07:00"
11+
12+[[hosts]]
13+name = "Ted Blackman"
14+patp = "~rovnys-ricfer"
15
15
16+[[guests]]
17+name = "Joe Bryan"
18+patp = "~master-morzod"
16+++
19+++
17
20
18Please join us for a look behind the curtain at the Urbit Runtime. Host Ted Blackman (~rovnys-ricfer) will be interviewing Joe Bryan (~master-morzod). Topics will include event log truncation, plans for storing more than 2GB, multithreading implementation, and much more.
21Please join us for a look behind the curtain at the Urbit Runtime. Host Ted Blackman (~rovnys-ricfer) will be interviewing Joe Bryan (~master-morzod). Topics will include event log truncation, plans for storing more than 2GB, multithreading implementation, and much more.
content/events/2021-07-15-developer-call-yakshaving.md+14−11
@@ -1,18 +1,21 @@
1+++
1+++
2−
3title = "Developer Call: Urbit Yakshaving"
2title = "Developer Call: Urbit Yakshaving"
4−date = 2021-07-15
3+ends = "2021-07-15T18:00"
5−[extra]
6−pinned = false
7−host = "Josh Lehman (~wolref-podlex)"
8−guests = "Jake Miller (~littel-wolfur)"
9−time = "9:00 PDT"
10−location = "Online Event"
4+location = "Online Event"
11−image = ""
5+image = ""
12−registration_url = "https://www.meetup.com/urbit-sf/events/279349114/"
6+registration_url = "https://www.meetup.com/urbit-sf/events/279349114/"
13−description = "A look at ~littel-wolfer's Hoon development setup"
7+description = "A look at ~littel-wolfer's Hoon development setup"
14youtube = "AG6IPaXbiiY"
8youtube = "AG6IPaXbiiY"
9+timezone = "America/Los_Angeles"
10+starts = "2021-07-15T17:00"
11+
12+[[hosts]]
13+name = "Josh Lehman"
14+patp = "~wolref-podlex"
15
15
16+[[guests]]
17+name = "Jake Miller"
18+patp = "~littel-wolfur"
16+++
19+++
17
20
18This week Jake Miller (~littel-wolfer) will be giving us a look at his development process, walking through his "urbit-emacs" setup and how he uses org-mode and tmux for hoon development. He'll also be giving us a quick demo of his work-in-progress Roam importer.
21This week Jake Miller (~littel-wolfer) will be giving us a look at his development process, walking through his "urbit-emacs" setup and how he uses org-mode and tmux for hoon development. He'll also be giving us a quick demo of his work-in-progress Roam importer.
content/events/2021-09-02-21q3-dc-meetup.md+12−10
@@ -1,16 +1,18 @@
1+++
1+++
2−
3title = "Urbit DC Meetup Q3 2021"
2title = "Urbit DC Meetup Q3 2021"
4−date = 2021-09-02
3+ends = ""
5−[extra]
6−pinned = false
7−host = "~tillys-fasryp and Robert Sherwood"
8−time = "5:30 EDT"
9−location = "Room 1213, 1730 Rhode Island Ave NW, Washington, DC"
4+location = "Room 1213, 1730 Rhode Island Ave NW, Washington, DC"
10−image = ""
5+image = ""
11−registration_url = "https://www.meetup.com/DC-Urbit-Meetup-Group/events/279885879/"
6+registration_url = "https://www.meetup.com/DC-Urbit-Meetup-Group/events/279885879/"
12−description = "Urbit Meetup in DC"
7+description = "Urbit Meetup in DC"
8+timezone = "America/New_York"
9+starts = "2021-09-02T17:30:00"
10+
11+[[hosts]]
12+patp = "~tillys-fasryp"
13
13
14+[[hosts]]
15+name = "Robert Sherwood"
14+++
16+++
15
17
16Come on out to the Urbit Meetup! Whether you are an OG Martian or just curious about the decentralized internet, come say hello and hang out with us! There will be a brief presentation on Urbit followed by a socializing and drinks nearby.
18Come on out to the Urbit Meetup! Whether you are an OG Martian or just curious about the decentralized internet, come say hello and hang out with us! There will be a brief presentation on Urbit followed by a socializing and drinks nearby.
content/grants/-smol-future-sustained-knowledge-sharing-and-marketing.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "-=[smol future]=- Sustained Knowledge Sharing and Marketing"
2title = "-=[smol future]=- Sustained Knowledge Sharing and Marketing"
3−date = 2021-01-15
3+date = "2021-01-14"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Create sustained documentation and marketing efforts that will support and encourage new users to run Urbit on their own RPi devices."
11description = "Create sustained documentation and marketing efforts that will support and encourage new users to run Urbit on their own RPi devices."
content/grants/a-book-about-urbit.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "A book about Urbit"
2title = "A book about Urbit"
3−date = 2020-07-23
3+date = "2020-07-22"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "A short book about Urbit, on Urbit, including Urbit-centric sections about the wider world of computing"
11description = "A short book about Urbit, on Urbit, including Urbit-centric sections about the wider world of computing"
content/grants/a-collaborative-web-mapping-system-for-urbit.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "A Collaborative Web Mapping System for Urbit"
2title = "A Collaborative Web Mapping System for Urbit"
3−date = 2020-09-03
3+date = "2020-09-02"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev"]
7+grant_category = [ "App Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Allow small scale spatial data to be stored and retrieved in Urbit, for use in landscape and external applications, and shared across ships."
11description = "Allow small scale spatial data to be stored and retrieved in Urbit, for use in landscape and external applications, and shared across ships."
content/grants/analytics-script.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Analytics Script"
2title = "Analytics Script"
3−date = 2021-05-12
3+date = "2021-05-11"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev"]
7+grant_category = [ "App Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Write a generator that exports chat data into a CSV."
11description = "Write a generator that exports chat data into a CSV."
content/grants/antechamber.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Antechamber"
2title = "Antechamber"
3−date = 2020-11-17
3+date = "2020-11-16"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev"]
7+grant_category = [ "App Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Antechamber is an initiative to provide a group within Landscape that is restricted to only galaxies and delegates of galaxies."
11description = "Antechamber is an initiative to provide a group within Landscape that is restricted to only galaxies and delegates of galaxies."
content/grants/art-by-urbit.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Art by Urbit"
2title = "Art by Urbit"
3−date = 2020-08-27
3+date = "2020-08-26"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Art by Urbit will provide a monthly digest of art produced by & for Urbit, on a publicly available website & social media presence."
11description = "Art by Urbit will provide a monthly digest of art produced by & for Urbit, on a publicly available website & social media presence."
content/grants/bart-train-tracker-landscape-tile.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "BART Train Tracker Landscape Tile"
2title = "BART Train Tracker Landscape Tile"
3−date = 2020-03-05
3+date = "2020-03-04"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "A backend for a BART client on Urbit."
11description = "A backend for a BART client on Urbit."
content/grants/bitcoin-full-node-provider-and-wallet.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Bitcoin Full Node Provider and Wallet"
2title = "Bitcoin Full Node Provider and Wallet"
3−date = 2020-09-23
3+date = "2020-09-22"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "This bounty covers the creation of infrastructure (gall agents) required to enable a Bitcoin-based payments system from within Landscape."
11description = "This bounty covers the creation of infrastructure (gall agents) required to enable a Bitcoin-based payments system from within Landscape."
content/grants/bitcoin-key-derivation.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Bitcoin Key Derivation"
2title = "Bitcoin Key Derivation"
3−date = 2020-10-02
3+date = "2020-10-01"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev"]
7+grant_category = [ "App Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "The Urbit HD Wallet allows for many different keys to be generated from a single master ticket. Your task is to use this mechanism to generate Bitcoin keys and expose ways of interacting with them."
11description = "The Urbit HD Wallet allows for many different keys to be generated from a single master ticket. Your task is to use this mechanism to generate Bitcoin keys and expose ways of interacting with them."
content/grants/bitcoin-node-json-rpc-api-part-1.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Bitcoin Node JSON RPC API (Part 1)"
2title = "Bitcoin Node JSON RPC API (Part 1)"
3−date = 2019-11-15
3+date = "2019-11-14"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Write a Remote Procedure Call library for a Bitcoin Gall app -- part one."
11description = "Write a Remote Procedure Call library for a Bitcoin Gall app -- part one."
content/grants/bitcoin-node-json-rpc-api-part-2.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Bitcoin Node JSON RPC API (Part 2)"
2title = "Bitcoin Node JSON RPC API (Part 2)"
3−date = 2019-10-01
3+date = "2019-09-30"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Write a Remote Procedure Call library for a Bitcoin Gall app -- part two."
11description = "Write a Remote Procedure Call library for a Bitcoin Gall app -- part two."
content/grants/bitcoin-node-json-rpc-api-part-3.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Bitcoin Node JSON RPC API (Part 3)"
2title = "Bitcoin Node JSON RPC API (Part 3)"
3−date = 2019-10-01
3+date = "2019-09-30"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Write a Remote Procedure Call library for a Bitcoin Gall app -- part three."
11description = "Write a Remote Procedure Call library for a Bitcoin Gall app -- part three."
content/grants/bitcoin-node-json-rpc-api-part-4.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Bitcoin Node JSON RPC API (Part 4)"
2title = "Bitcoin Node JSON RPC API (Part 4)"
3−date = 2019-10-01
3+date = "2019-09-30"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Write a Remote Procedure Call library for a Bitcoin Gall app -- part four."
11description = "Write a Remote Procedure Call library for a Bitcoin Gall app -- part four."
content/grants/bitcoin-wallet-maintenance.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Bitcoin Wallet Maintenance"
2title = "Bitcoin Wallet Maintenance"
3−date = 2021-06-17
3+date = "2021-06-16"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Help us maintain the Bitcoin Wallet."
11description = "Help us maintain the Bitcoin Wallet."
content/grants/bitcoin-wallet-on-bridge.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Bitcoin Wallet on Bridge"
2title = "Bitcoin Wallet on Bridge"
3−date = 2019-12-09
3+date = "2019-12-08"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Azimuth"]
7+grant_category = [ "App Dev", "Azimuth" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Add Bitcoin support to the Bridge interface. "
11description = "Add Bitcoin support to the Bridge interface. "
content/grants/boston-t-train-tracker-landscape-tile.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Boston T Train Tracker Landscape Tile"
2title = "Boston T Train Tracker Landscape Tile"
3−date = 2020-03-24
3+date = "2020-03-23"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Create a landscape tile that tracks the Boston T train."
11description = "Create a landscape tile that tracks the Boston T train."
content/grants/bridge-l2-revamp.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Bridge UI/UX Revamp for Layer 2"
2title = "Bridge UI/UX Revamp for Layer 2"
3−date = 2021-06-01
3+date = "2021-05-31"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Azimuth"]
7+grant_category = [ "Azimuth" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Our Layer 2 scaling solution is nearing completion, and the Bridge UI/UX needs to be refactored to take it into account."
11description = "Our Layer 2 scaling solution is nearing completion, and the Bridge UI/UX needs to be refactored to take it into account."
content/grants/calendar-ui.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Calendar UI"
2title = "Calendar UI"
3−date = 2020-07-16
3+date = "2020-07-15"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Build a Landscape-native calendar UI"
11description = "Build a Landscape-native calendar UI"
content/grants/calendar.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Calendar"
2title = "Calendar"
3−date = 2020-05-19
3+date = "2020-05-18"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "An Arvo calendar agent based on the iCalendar spec."
11description = "An Arvo calendar agent based on the iCalendar spec."
content/grants/comprehensive-local-server-and-mum-explanation-video.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Comprehensive local, server and mum explanation video"
2title = "Comprehensive local, server and mum explanation video"
3−date = 2021-01-31
3+date = "2021-01-30"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Series of three videos:1) Purchase planet, install and run on a local machine2) nginx setup3) Explaining Urbit to my tech illiterate mum "
11description = "Series of three videos:1) Purchase planet, install and run on a local machine2) nginx setup3) Explaining Urbit to my tech illiterate mum "
content/grants/contacts.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Userspace Apprenticeship: Contacts App"
2title = "Userspace Apprenticeship: Contacts App"
3−date = 2021-06-17
3+date = "2021-06-16"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Apprenticeship"]
6+grant_type = [ "Apprenticeship" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Contact Management App"
11description = "Contact Management App"
content/grants/content-producer.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Content Producer"
2title = "Content Producer"
3−date = 2021-07-08
3+date = "2021-07-07"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Documentation"]
7+grant_category = [ "Documentation" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Work with the content manager in producing content"
11description = "Work with the content manager in producing content"
content/grants/content-saver.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Content Saver"
2title = "Content Saver"
3−date = 2020-03-20
3+date = "2020-03-19"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Extract and save content from HTML."
11description = "Extract and save content from HTML."
content/grants/cross-platform-desktop-urbit-app.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Cross-Platform Desktop Urbit App"
2title = "Cross-Platform Desktop Urbit App"
3−date = 2021-02-23
3+date = "2021-02-22"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev"]
7+grant_category = [ "App Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "A native app that makes running Urbit near friction-less for everyone."
11description = "A native app that makes running Urbit near friction-less for everyone."
content/grants/cta-train-tracker-landscape-tile.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "CTA Train Tracker Landscape Tile"
2title = "CTA Train Tracker Landscape Tile"
3−date = 2020-03-18
3+date = "2020-03-17"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev"]
7+grant_category = [ "App Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Build an app to track the schedule of the Chicago Transit Authority."
11description = "Build an app to track the schedule of the Chicago Transit Authority."
content/grants/display-eth-data.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Display ETH Data"
2title = "Display ETH Data"
3−date = 2020-01-31
3+date = "2020-01-30"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "The Urbit identity system uses a suite of Ethereum contracts as its PKI. As such, a lot of Ethereum-related functionality is available within the system."
11description = "The Urbit identity system uses a suite of Ethereum contracts as its PKI. As such, a lot of Ethereum-related functionality is available within the system."
content/grants/docker-image-for-cloud-container-orchestration.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Docker image for cloud container orchestration"
2title = "Docker image for cloud container orchestration"
3−date = 2020-12-21
3+date = "2020-12-20"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Dev Tool"]
7+grant_category = [ "Dev Tool" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Nix infrastructure to generate Docker images for Urbit releases. Images would be suitable for cloud orchestration in e.g. Amazon ECS"
11description = "Nix infrastructure to generate Docker images for Urbit releases. Images would be suitable for cloud orchestration in e.g. Amazon ECS"
content/grants/educational-guide-todomvc-urbit-edition.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Educational Guide: TodoMVC, Urbit Edition"
2title = "Educational Guide: TodoMVC, Urbit Edition"
3−date = 2021-01-05
3+date = "2021-01-04"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Documentation"]
7+grant_category = [ "Documentation" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "The goal of this bounty is to create a series of guides that can instruct a newcomer to Urbit as to how to go about creating a full-stack application from scratch."
11description = "The goal of this bounty is to create a series of guides that can instruct a newcomer to Urbit as to how to go about creating a full-stack application from scratch."
content/grants/escape.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Escape"
2title = "Escape"
3−date = 2019-12-04
3+date = "2019-12-03"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "A reputation agent for Stars."
11description = "A reputation agent for Stars."
content/grants/ethereum-abi-parser.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Ethereum ABI Parser"
2title = "Ethereum ABI Parser"
3−date = 2020-03-10
3+date = "2020-03-09"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Create a Gall app that takes the bytecode for a contract ABI."
11description = "Create a Gall app that takes the bytecode for a contract ABI."
content/grants/feed-aggregator.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit Feed Aggregator"
2title = "Urbit Feed Aggregator"
3−date = 2021-07-16
3+date = "2021-07-15"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev: Other"]
7+grant_category = [ "App Dev: Other" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "A feed aggregation application"
11description = "A feed aggregation application"
content/grants/gall-api-documentation.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Gall API documentation"
2title = "Gall API documentation"
3−date = 2019-07-22
3+date = "2019-07-21"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Documentation"]
7+grant_category = [ "Documentation" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Write reference documentation for using the API for developing Gall apps."
11description = "Write reference documentation for using the API for developing Gall apps."
content/grants/go-airlock-library.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Go Airlock Library"
2title = "Go Airlock Library"
3−date = 2020-06-25
3+date = "2020-06-24"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Core Dev"]
7+grant_category = [ "Core Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Create a library for the Go language to be used for Airlock, the protocols for interfacing with Urbit."
11description = "Create a library for the Go language to be used for Airlock, the protocols for interfacing with Urbit."
content/grants/graph-store-documentation-guide.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Graph Store Documentation Guide"
2title = "Graph Store Documentation Guide"
3−date = 2021-02-13
3+date = "2021-02-12"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Documentation"]
7+grant_category = [ "Documentation" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Explainer, tutorial, and cookbook for `graph-store`"
11description = "Explainer, tutorial, and cookbook for `graph-store`"
content/grants/guide-to-s3.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Guide to S3"
2title = "Guide to S3"
3−date = 2021-03-18
3+date = "2021-03-17"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Documentation"]
7+grant_category = [ "Documentation" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Contribute an easy-to-follow guide on self-hosting an S3 storage solution for use with Urbit to urbit.org."
11description = "Contribute an easy-to-follow guide on self-hosting an S3 storage solution for use with Urbit to urbit.org."
content/grants/haskell-airlock-library.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Haskell Airlock Library"
2title = "Haskell Airlock Library"
3−date = 2020-06-25
3+date = "2020-06-24"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Core Dev"]
7+grant_category = [ "Core Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Create a library for the Haskell language to be used for Airlock, the API suite for outside communication with Urbit."
11description = "Create a library for the Haskell language to be used for Airlock, the API suite for outside communication with Urbit."
content/grants/hoon-001-learner-efficiency-and-early-learner-resources.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Hoon 001: Learner efficiency and early-learner resources"
2title = "Hoon 001: Learner efficiency and early-learner resources"
3−date = 2020-02-10
3+date = "2020-02-09"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Documentation"]
7+grant_category = [ "Documentation" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Create Hoon learning resources catered to learner efficiency, with orienting materials for Hoon & coding, learning examples, videos."
11description = "Create Hoon learning resources catered to learner efficiency, with orienting materials for Hoon & coding, learning examples, videos."
content/grants/host-three-college-university-urbit-meetups-1.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Host Three College/University Urbit Meetups (1)"
2title = "Host Three College/University Urbit Meetups (1)"
3−date = 2020-03-02
3+date = "2020-03-01"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Hold a meetup and presentation about Urbit."
11description = "Hold a meetup and presentation about Urbit."
content/grants/host-three-college-university-urbit-meetups-2.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Host Three College/University Urbit Meetups (2)"
2title = "Host Three College/University Urbit Meetups (2)"
3−date = 2020-03-03
3+date = "2020-03-02"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Hold a meetup and presentation about Urbit."
11description = "Hold a meetup and presentation about Urbit."
content/grants/host-three-college-university-urbit-meetups-3.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Host Three College/University Urbit Meetups (3)"
2title = "Host Three College/University Urbit Meetups (3)"
3−date = 2020-03-03
3+date = "2020-03-02"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Hold a meetup and presentation about Urbit."
11description = "Hold a meetup and presentation about Urbit."
content/grants/host-three-virtual-urbit-meetups.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Host Three Virtual Urbit Meetups"
2title = "Host Three Virtual Urbit Meetups"
3−date = 2020-03-27
3+date = "2020-03-26"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing."
11description = "Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing."
content/grants/host-two-urbit-meetups-1.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Host Two Urbit Meetups (1)"
2title = "Host Two Urbit Meetups (1)"
3−date = 2019-11-19
3+date = "2019-11-18"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Host two Urbit meetups in your city."
11description = "Host two Urbit meetups in your city."
content/grants/host-two-urbit-meetups-10.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Host Two Urbit Meetups (10)"
2title = "Host Two Urbit Meetups (10)"
3−date = 2019-11-26
3+date = "2019-11-25"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing."
11description = "Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing."
content/grants/host-two-urbit-meetups-11.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Host Two Urbit Meetups (11)"
2title = "Host Two Urbit Meetups (11)"
3−date = 2021-02-07
3+date = "2021-02-06"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Urbit needs champions! The Urbit Foundation is looking for community members to host local or online meetups to spread the word."
11description = "Urbit needs champions! The Urbit Foundation is looking for community members to host local or online meetups to spread the word."
content/grants/host-two-urbit-meetups-12.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Host Two Urbit Meetups (12)"
2title = "Host Two Urbit Meetups (12)"
3−date = 2021-06-15
3+date = "2021-06-14"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Urbit needs champions! The Urbit Foundation is looking for community members to host local or online meetups to spread the word."
11description = "Urbit needs champions! The Urbit Foundation is looking for community members to host local or online meetups to spread the word."
content/grants/host-two-urbit-meetups-2.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Host Two Urbit Meetups (2)"
2title = "Host Two Urbit Meetups (2)"
3−date = 2019-11-19
3+date = "2019-11-18"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Host two Urbit meetups in your city."
11description = "Host two Urbit meetups in your city."
content/grants/host-two-urbit-meetups-3.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Host Two Urbit Meetups (3)"
2title = "Host Two Urbit Meetups (3)"
3−date = 2019-11-19
3+date = "2019-11-18"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Host two Urbit meetups in your city."
11description = "Host two Urbit meetups in your city."
content/grants/host-two-urbit-meetups-4.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Host Two Urbit Meetups (4)"
2title = "Host Two Urbit Meetups (4)"
3−date = 2019-11-19
3+date = "2019-11-18"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Host two Urbit meetups in your city."
11description = "Host two Urbit meetups in your city."
content/grants/host-two-urbit-meetups-5.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Host Two Urbit Meetups (5)"
2title = "Host Two Urbit Meetups (5)"
3−date = 2019-11-19
3+date = "2019-11-18"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Host two Urbit meetups in your city."
11description = "Host two Urbit meetups in your city."
content/grants/host-two-urbit-meetups-6.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Host Two Urbit Meetups (6)"
2title = "Host Two Urbit Meetups (6)"
3−date = 2019-11-21
3+date = "2019-11-20"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Host two Urbit meetups in your city."
11description = "Host two Urbit meetups in your city."
content/grants/host-two-urbit-meetups-7.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Host Two Urbit Meetups (7)"
2title = "Host Two Urbit Meetups (7)"
3−date = 2019-11-21
3+date = "2019-11-20"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Host two Urbit meetups in your city."
11description = "Host two Urbit meetups in your city."
content/grants/host-two-urbit-meetups-8.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Host Two Urbit Meetups (8)"
2title = "Host Two Urbit Meetups (8)"
3−date = 2019-11-22
3+date = "2019-11-21"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing."
11description = "Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing."
content/grants/host-two-urbit-meetups-9.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Host Two Urbit Meetups (9)"
2title = "Host Two Urbit Meetups (9)"
3−date = 2019-11-26
3+date = "2019-11-25"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing."
11description = "Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing."
content/grants/json-jet.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "JSON Parsing/Serialization Jet"
2title = "JSON Parsing/Serialization Jet"
3−date = 2021-06-17
3+date = "2021-06-16"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Core Dev"]
7+grant_category = [ "Core Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Create high performance JSON parsing/serializing jet."
11description = "Create high performance JSON parsing/serializing jet."
content/grants/links-in-urbit-reference-docs.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Links in Urbit Reference Docs"
2title = "Links in Urbit Reference Docs"
3−date = 2020-06-16
3+date = "2020-06-15"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Documentation"]
7+grant_category = [ "Documentation" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Add links to our reference doc pages so that people can easily discover new concepts"
11description = "Add links to our reference doc pages so that people can easily discover new concepts"
content/grants/llelogram.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Llelogram"
2title = "Llelogram"
3−date = 2020-07-29
3+date = "2020-07-28"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Towards creating a political-econometric of federal legislation people can read as easily as a stock ticker: Llelogram"
11description = "Towards creating a political-econometric of federal legislation people can read as easily as a stock ticker: Llelogram"
content/grants/login-with-urbit.md+6−4
@@ -1,12 +1,14 @@
1+++
1+++
2title = "Login with Urbit ID"
2title = "Login with Urbit ID"
3−date = 2021-04-27
3+date = "2021-04-26"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev: Other"]
7+grant_category = [ "App Dev: Other" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9−description = "One of the killer pieces of missing functionality in the ecosystem is to seamlessly \"login\" to Urbit web apps at the click of a button."
11+description = 'One of the killer pieces of missing functionality in the ecosystem is to seamlessly "login" to Urbit web apps at the click of a button.'
10reward = 8
12reward = 8
11assignee = "dcSpark"
13assignee = "dcSpark"
12id = ""
14id = ""
content/grants/matrices-in-hoon.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Matrices in Hoon"
2title = "Matrices in Hoon"
3−date = 2020-02-21
3+date = "2020-02-20"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Core Dev"]
7+grant_category = [ "Core Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Add array types to Hoon."
11description = "Add array types to Hoon."
content/grants/matrixriotim-bridge-bot.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Matrix(Riot.im) bridge/bot"
2title = "Matrix(Riot.im) bridge/bot"
3−date = 2020-11-05
3+date = "2020-11-04"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "This would be a python bot to connect urbit to any Matrix server. It would act as a bridge, mirroring messages between the two platforms."
11description = "This would be a python bot to connect urbit to any Matrix server. It would act as a bridge, mirroring messages between the two platforms."
content/grants/minimal-urbit-os.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Minimal Urbit OS"
2title = "Minimal Urbit OS"
3−date = 2021-01-20
3+date = "2021-01-19"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Core Dev"]
7+grant_category = [ "Core Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "A Linux based host OS with only the essentials needed to run Urbit, designed to help the process of getting Urbit running on bare metal"
11description = "A Linux based host OS with only the essentials needed to run Urbit, designed to help the process of getting Urbit running on bare metal"
content/grants/network-explorer-data-pipeline-http-api.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Network Explorer: Data Pipeline & HTTP API"
2title = "Network Explorer: Data Pipeline & HTTP API"
3−date = 2021-03-12
3+date = "2021-03-11"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev"]
7+grant_category = [ "App Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Build a public, open HTTP API for exploring metrics about the Urbit network."
11description = "Build a public, open HTTP API for exploring metrics about the Urbit network."
content/grants/network-explorer.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Network Explorer: Data Pipeline and HTTP API"
2title = "Network Explorer: Data Pipeline and HTTP API"
3−date = 2021-03-12
3+date = "2021-03-11"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev: Other"]
7+grant_category = [ "App Dev: Other" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Build a public, open HTTP API for exploring metrics about the Urbit network."
11description = "Build a public, open HTTP API for exploring metrics about the Urbit network."
content/grants/nuck-jet.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Nuck Jet"
2title = "Nuck Jet"
3−date = 2021-06-17
3+date = "2021-06-16"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Core Dev"]
7+grant_category = [ "Core Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Create new high performance string parser jet."
11description = "Create new high performance string parser jet."
content/grants/open-street-maps-data-importation.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Open Street Maps Data Importation"
2title = "Open Street Maps Data Importation"
3−date = 2020-07-09
3+date = "2020-07-08"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Core Dev"]
7+grant_category = [ "Core Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "reate a mapping tool which allows Open Street Maps data to be imported into Urbit."
11description = "reate a mapping tool which allows Open Street Maps data to be imported into Urbit."
content/grants/overhaul-the-urbitorg-website.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Overhaul the urbit.org website"
2title = "Overhaul the urbit.org website"
3−date = 2021-02-19
3+date = "2021-02-18"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Design"]
7+grant_category = [ "Design" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Rework urbit.org to encourage participation with the project."
11description = "Rework urbit.org to encourage participation with the project."
content/grants/ra-page-tracking.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Runtime Apprenticeship: Improve Page Tracking"
2title = "Runtime Apprenticeship: Improve Page Tracking"
3−date = 2021-06-24
3+date = "2021-06-23"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Apprenticeship"]
6+grant_type = [ "Apprenticeship" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Improve Page Tracking"
11description = "Improve Page Tracking"
content/grants/ra-segfaults.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Runtime Apprenticeship: Segfaults"
2title = "Runtime Apprenticeship: Segfaults"
3−date = 2021-06-24
3+date = "2021-06-23"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Apprenticeship"]
6+grant_type = [ "Apprenticeship" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Segfaults"
11description = "Segfaults"
content/grants/ra-stack-overflow.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Runtime Apprenticeship: Stack Overflow"
2title = "Runtime Apprenticeship: Stack Overflow"
3−date = 2021-06-24
3+date = "2021-06-23"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Apprenticeship"]
6+grant_type = [ "Apprenticeship" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Stack Overflow"
11description = "Stack Overflow"
content/grants/ragnarok-online-on-urbit.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Ragnarok Online on Urbit"
2title = "Ragnarok Online on Urbit"
3−date = 2019-08-30
3+date = "2019-08-29"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev"]
7+grant_category = [ "App Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Landscape app that supports registering an urbit ID with an RO server, exposing various account management actions and guild / channel chats"
11description = "Landscape app that supports registering an urbit ID with an RO server, exposing various account management actions and guild / channel chats"
content/grants/search-in-groups.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Search in groups"
2title = "Search in groups"
3−date = 2021-02-25
3+date = "2021-02-24"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev"]
7+grant_category = [ "App Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Implement a basic text search in groups channels"
11description = "Implement a basic text search in groups channels"
content/grants/slaw-scot-jets.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Tune slaw/scot Jets"
2title = "Tune slaw/scot Jets"
3−date = 2021-06-17
3+date = "2021-06-16"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Core Dev"]
7+grant_category = [ "Core Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Tune slaw/scot jets for better perfomance."
11description = "Tune slaw/scot jets for better perfomance."
content/grants/staff-the-urbit-help-desk-1.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Staff the Urbit Help Desk (1)"
2title = "Staff the Urbit Help Desk (1)"
3−date = 2020-02-19
3+date = "2020-02-18"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Help Urbit users with their various problems."
11description = "Help Urbit users with their various problems."
content/grants/staff-the-urbit-help-desk-2.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Staff the Urbit Help Desk (2)"
2title = "Staff the Urbit Help Desk (2)"
3−date = 2020-02-21
3+date = "2020-02-20"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Help Urbit users with their various problems."
11description = "Help Urbit users with their various problems."
content/grants/staff-the-urbit-helpdesk-east.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Staff the Urbit Helpdesk, East"
2title = "Staff the Urbit Helpdesk, East"
3−date = 2021-01-25
3+date = "2021-01-24"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Help guide newcomers onto the network."
11description = "Help guide newcomers onto the network."
content/grants/staff-the-urbit-helpdesk-west.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Staff the Urbit Helpdesk, West"
2title = "Staff the Urbit Helpdesk, West"
3−date = 2020-12-03
3+date = "2020-12-02"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Help guide newcomers onto the network."
11description = "Help guide newcomers onto the network."
content/grants/the-complete-guide-to-gall-and-landscape.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "The Complete Guide to Gall and Landscape"
2title = "The Complete Guide to Gall and Landscape"
3−date = 2020-06-22
3+date = "2020-06-21"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Documentation"]
7+grant_category = [ "Documentation" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "A full text and video course on every aspect of creating Gall and Landscape apps. Students will create their own full application to finish."
11description = "A full text and video course on every aspect of creating Gall and Landscape apps. Students will create their own full application to finish."
content/grants/thread-documentation.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Thread Documentation"
2title = "Thread Documentation"
3−date = 2021-02-18
3+date = "2021-02-17"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Documentation"]
7+grant_category = [ "Documentation" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Document, explain, and give simple howtos for the usage patterns of threads in the Dojo and Gall agents."
11description = "Document, explain, and give simple howtos for the usage patterns of threads in the Dojo and Gall agents."
content/grants/tor-nodes-relay-search-tile.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Tor Nodes Relay Search Tile"
2title = "Tor Nodes Relay Search Tile"
3−date = 2020-03-31
3+date = "2020-03-30"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "An Urbit-native Tor search-tool."
11description = "An Urbit-native Tor search-tool."
content/grants/translate-key-parts-of-urbitorg-into-german.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Translate key parts of Urbit.org into German"
2title = "Translate key parts of Urbit.org into German"
3−date = 2021-01-19
3+date = "2021-01-18"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Documentation"]
7+grant_category = [ "Documentation" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Introduction, Urbit OS, Urbit ID, Interface, Roadmap: OS1-> OS N, People + History, and Install + Setup (analog to Korean translation)"
11description = "Introduction, Urbit OS, Urbit ID, Interface, Roadmap: OS1-> OS N, People + History, and Install + Setup (analog to Korean translation)"
content/grants/translate-key-parts-of-urbitorg-into-korean.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Translate key parts of Urbit.org into Korean"
2title = "Translate key parts of Urbit.org into Korean"
3−date = 2021-01-30
3+date = "2021-01-29"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Documentation"]
7+grant_category = [ "Documentation" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "The content found on urbit.org/understanding-urbit/ and urbit.org/using/install/ is only in English. Translation will be helpful to Koreans."
11description = "The content found on urbit.org/understanding-urbit/ and urbit.org/using/install/ is only in English. Translation will be helpful to Koreans."
content/grants/translate-key-parts-of-urbitorg-into-norwegian.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Translate key parts of Urbit.org into Norwegian"
2title = "Translate key parts of Urbit.org into Norwegian"
3−date = 2021-04-07
3+date = "2021-04-06"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Help the Urbit community grow internationally by translating key resources, guides, and documentation to Norwegian."
11description = "Help the Urbit community grow internationally by translating key resources, guides, and documentation to Norwegian."
content/grants/translate-key-parts-of-urbitorg-into-spanish.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Translate key parts of Urbit.org into Spanish"
2title = "Translate key parts of Urbit.org into Spanish"
3−date = 2021-03-20
3+date = "2021-03-19"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Documentation"]
7+grant_category = [ "Documentation" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Help the Urbit community grow internationally by translating key resources, guides, and documentation to Spanish."
11description = "Help the Urbit community grow internationally by translating key resources, guides, and documentation to Spanish."
content/grants/try-urbit-website.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Try Urbit Website"
2title = "Try Urbit Website"
3−date = 2021-02-14
3+date = "2021-02-13"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev"]
7+grant_category = [ "App Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "A website where prospective Martians can experience the Landscape interface without any technical chops."
11description = "A website where prospective Martians can experience the Landscape interface without any technical chops."
content/grants/typescript-airlock-library.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Typescript Airlock Library"
2title = "Typescript Airlock Library"
3−date = 2020-06-26
3+date = "2020-06-25"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Core Dev"]
7+grant_category = [ "Core Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Create a library for the Typescript language to be used for Airlock, the API suite for outside communication with Urbit."
11description = "Create a library for the Typescript language to be used for Airlock, the API suite for outside communication with Urbit."
content/grants/ua-collaborative-text-editor.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Userspace Apprenticeship: Collaborative text editor and annotator"
2title = "Userspace Apprenticeship: Collaborative text editor and annotator"
3−date = 2021-05-27
3+date = "2021-05-26"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Apprenticeship"]
6+grant_type = [ "Apprenticeship" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "A line-based editor for looking at text and code."
11description = "A line-based editor for looking at text and code."
content/grants/ua-filesharer.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Filesharer"
2title = "Filesharer"
3−date = 2021-05-27
3+date = "2021-05-26"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Apprenticeship"]
6+grant_type = [ "Apprenticeship" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "An application that allows peers to upload files to managed storage, either on or off Urbit, and share files with each other."
11description = "An application that allows peers to upload files to managed storage, either on or off Urbit, and share files with each other."
content/grants/ua-heads-up-poker.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Userspace Apprenticeship: Heads-Up Poker"
2title = "Userspace Apprenticeship: Heads-Up Poker"
3−date = 2021-05-27
3+date = "2021-05-26"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Apprenticeship"]
6+grant_type = [ "Apprenticeship" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "A fun client app that would be a good way to get acquainted with Urbit's networking and p2p abilities."
11description = "A fun client app that would be a good way to get acquainted with Urbit's networking and p2p abilities."
content/grants/ua-invoice-system.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Invoice system"
2title = "Invoice system"
3−date = 2021-05-27
3+date = "2021-05-26"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Apprenticeship"]
6+grant_type = [ "Apprenticeship" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "A system to request and record payments made and received."
11description = "A system to request and record payments made and received."
content/grants/ua-marketplace.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Userspace Apprenticeship: Marketplace"
2title = "Userspace Apprenticeship: Marketplace"
3−date = 2021-05-27
3+date = "2021-05-26"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Apprenticeship"]
6+grant_type = [ "Apprenticeship" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "A marketplace in which users can post items for sale and browse goods for sale by other users."
11description = "A marketplace in which users can post items for sale and browse goods for sale by other users."
content/grants/ucal-google-and-outlook-integration.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "ucal Google and Outlook Integration"
2title = "ucal Google and Outlook Integration"
3−date = 2021-05-13
3+date = "2021-05-12"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Extend the Urbit Calendar (ucal) to integrate with other calendaring systems."
11description = "Extend the Urbit Calendar (ucal) to integrate with other calendaring systems."
content/grants/udon-syntax-highlighter.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Udon syntax highlighter"
2title = "Udon syntax highlighter"
3−date = 2019-07-19
3+date = "2019-07-18"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Dev Tool"]
7+grant_category = [ "Dev Tool" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Write a syntax highlighter for the Udon markup language."
11description = "Write a syntax highlighter for the Udon markup language."
content/grants/unit-tests-for-json-parsing.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Unit tests for JSON parsing"
2title = "Unit tests for JSON parsing"
3−date = 2019-11-15
3+date = "2019-11-14"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Core Dev"]
7+grant_category = [ "Core Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Write unit tests for JSON-parsing arms of the zuse.hoon standard library."
11description = "Write unit tests for JSON-parsing arms of the zuse.hoon standard library."
content/grants/unit-tests-for-pure-algorithms.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Unit tests for pure algorithms"
2title = "Unit tests for pure algorithms"
3−date = 2019-07-25
3+date = "2019-07-24"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Core Dev"]
7+grant_category = [ "Core Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Write unit tests for +in, +by, +to, and +diff."
11description = "Write unit tests for +in, +by, +to, and +diff."
content/grants/unit-tests-for-sha-functions.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Unit tests for SHA functions"
2title = "Unit tests for SHA functions"
3−date = 2019-07-25
3+date = "2019-07-24"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Core Dev"]
7+grant_category = [ "Core Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Write unit tests for SHA cryptographic functions of the Hoon standard library."
11description = "Write unit tests for SHA cryptographic functions of the Hoon standard library."
content/grants/unit-tests-for-zuse-cryptographic-functions.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Unit tests for Zuse cryptographic functions"
2title = "Unit tests for Zuse cryptographic functions"
3−date = 2019-07-25
3+date = "2019-07-24"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Dev Tool"]
7+grant_category = [ "Dev Tool" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Write unit tests for cryptographic functions of the Zuse library."
11description = "Write unit tests for cryptographic functions of the Zuse library."
content/grants/up-to-date-hoon-reference-card.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Up-to-date Hoon reference card"
2title = "Up-to-date Hoon reference card"
3−date = 2020-03-15
3+date = "2020-03-14"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Documentation"]
7+grant_category = [ "Documentation" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "I have made an up-to-date version of the Urbit Hoon reference card and will maintain it.https://github.com/natareo/hooncard"
11description = "I have made an up-to-date version of the Urbit Hoon reference card and will maintain it.https://github.com/natareo/hooncard"
content/grants/urbian-a-customized-linux-distribution-for-urbit-appliances.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbian: a customized Linux distribution for Urbit appliances"
2title = "Urbian: a customized Linux distribution for Urbit appliances"
3−date = 2020-10-06
3+date = "2020-10-05"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Dev Tool"]
7+grant_category = [ "Dev Tool" ]
8+
7[extra]
9[extra]
8image = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Bromeliaceae20020312.JPG/640px-Bromeliaceae20020312.JPG"
10image = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Bromeliaceae20020312.JPG/640px-Bromeliaceae20020312.JPG"
9description = "A package for the generation of custom Linux images with Urbit running as service, for the backend of a turnkey Urbit appliance or IoT hub."
11description = "A package for the generation of custom Linux images with Urbit running as service, for the backend of a turnkey Urbit appliance or IoT hub."
content/grants/urbit-api-for-elixir.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit API for Elixir"
2title = "Urbit API for Elixir"
3−date = 2021-02-11
3+date = "2021-02-10"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev"]
7+grant_category = [ "App Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "A proposal to build an Urbit HTTP Api for the Elixir language, bringing to Urbit its state of the art concurrency capabilities."
11description = "A proposal to build an Urbit HTTP Api for the Elixir language, bringing to Urbit its state of the art concurrency capabilities."
content/grants/urbit-community-concierge-east-coast-2q2021.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit Community Concierge - East Coast - 2Q2021"
2title = "Urbit Community Concierge - East Coast - 2Q2021"
3−date = 2021-04-27
3+date = "2021-04-26"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Provide concierge service assisting new users in the Urbit Community Group"
11description = "Provide concierge service assisting new users in the Urbit Community Group"
content/grants/urbit-community-concierge-east-coast.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit Community Concierge - East Coast"
2title = "Urbit Community Concierge - East Coast"
3−date = 2021-02-10
3+date = "2021-02-09"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Provide concierge service assisting new users in the Urbit Community Group"
11description = "Provide concierge service assisting new users in the Urbit Community Group"
content/grants/urbit-community-concierge-west-coast-2q2021.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit Community Concierge - West Coast - 2Q2021"
2title = "Urbit Community Concierge - West Coast - 2Q2021"
3−date = 2021-04-27
3+date = "2021-04-26"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Provide concierge service assisting new users in the Urbit Community Group"
11description = "Provide concierge service assisting new users in the Urbit Community Group"
content/grants/urbit-community-concierge-west-coast.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit Community Concierge - West Coast"
2title = "Urbit Community Concierge - West Coast"
3−date = 2021-02-10
3+date = "2021-02-09"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Provide concierge service assisting new users in the Urbit Community Group"
11description = "Provide concierge service assisting new users in the Urbit Community Group"
content/grants/urbit-event-series.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit Event Series"
2title = "Urbit Event Series"
3−date = 2020-10-11
3+date = "2020-10-10"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "A series of community-focused events to create a new knowledge base for urbit.org, and help new community members learn about Urbit"
11description = "A series of community-focused events to create a new knowledge base for urbit.org, and help new community members learn about Urbit"
content/grants/urbit-explainer-video.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit Explainer Video"
2title = "Urbit Explainer Video"
3−date = 2020-09-13
3+date = "2020-09-12"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "We want to make a short animated video that introduces Urbit to a wider audience."
11description = "We want to make a short animated video that introduces Urbit to a wider audience."
content/grants/urbit-http-api-for-emacs-elisp.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit HTTP API for Emacs (elisp)"
2title = "Urbit HTTP API for Emacs (elisp)"
3−date = 2021-01-18
3+date = "2021-01-17"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Dev Tool"]
7+grant_category = [ "Dev Tool" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Connecting Urbit with Emacs would enable all sorts of cool and creative apps. I'd love to be able to chat without leaving my editor."
11description = "Connecting Urbit with Emacs would enable all sorts of cool and creative apps. I'd love to be able to chat without leaving my editor."
content/grants/urbit-http-api-for-kotlin.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit HTTP API for Kotlin"
2title = "Urbit HTTP API for Kotlin"
3−date = 2020-10-27
3+date = "2020-10-26"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev"]
7+grant_category = [ "App Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Write an urbit HTTP API (aka Airlock) for Kotlin."
11description = "Write an urbit HTTP API (aka Airlock) for Kotlin."
content/grants/urbit-http-api-for-python.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit HTTP API for Python"
2title = "Urbit HTTP API for Python"
3−date = 2021-06-22
3+date = "2021-06-21"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev: Other"]
7+grant_category = [ "App Dev: Other" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Write an Urbit HTTP API (aka airlock) for Python"
11description = "Write an Urbit HTTP API (aka airlock) for Python"
content/grants/urbit-http-api-for-rust.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit HTTP API for Rust"
2title = "Urbit HTTP API for Rust"
3−date = 2020-12-16
3+date = "2020-12-15"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev"]
7+grant_category = [ "App Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "This proposal seeks to create an API to interact with an Urbit ship over HTTP written in Rust."
11description = "This proposal seeks to create an API to interact with an Urbit ship over HTTP written in Rust."
content/grants/urbit-http-interface-java-edition.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit HTTP Interface — Java Edition"
2title = "Urbit HTTP Interface — Java Edition"
3−date = 2020-10-20
3+date = "2020-10-19"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Core Dev"]
7+grant_category = [ "Core Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "This proposal seeks to implement an HTTP interface to an Urbit instance in Java, and also seeks to build various related tooling."
11description = "This proposal seeks to implement an HTTP interface to an Urbit instance in Java, and also seeks to build various related tooling."
content/grants/urbit-http-library-for-ruby.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit HTTP Library for Ruby"
2title = "Urbit HTTP Library for Ruby"
3−date = 2020-11-05
3+date = "2020-11-04"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Dev Tool"]
7+grant_category = [ "Dev Tool" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Create a Ruby language HTTP library to connect to Urbit."
11description = "Create a Ruby language HTTP library to connect to Urbit."
content/grants/urbit-irc-bridge.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit <-> IRC Bridge"
2title = "Urbit <-> IRC Bridge"
3−date = 2021-05-14
3+date = "2021-05-13"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev: Other"]
7+grant_category = [ "App Dev: Other" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Create a bot that that will relay messages between Urbit chatrooms and IRC rooms, allowing users to communicate on a singular platform."
11description = "Create a bot that that will relay messages between Urbit chatrooms and IRC rooms, allowing users to communicate on a singular platform."
content/grants/urbit-lfs-filehosting.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit LFS - filehosting"
2title = "Urbit LFS - filehosting"
3−date = 2021-03-11
3+date = "2021-03-10"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev"]
7+grant_category = [ "App Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Share large files"
11description = "Share large files"
content/grants/urbit-online-meetup.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit online meetup."
2title = "Urbit online meetup."
3−date = 2020-06-08
3+date = "2020-06-07"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "I teach a Python class online. Many students would be interested in learning about Urbit too. I'd give a lecture and help them host planets."
11description = "I teach a Python class online. Many students would be interested in learning about Urbit too. I'd give a lecture and help them host planets."
content/grants/urbit-react-cookbook.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit React Cookbook"
2title = "Urbit React Cookbook"
3−date = 2021-04-10
3+date = "2021-04-09"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev"]
7+grant_category = [ "App Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Provide concrete examples of React UI driven by @urbit/http-api to quickly start building on top of Urbit"
11description = "Provide concrete examples of React UI driven by @urbit/http-api to quickly start building on top of Urbit"
content/grants/urbit-ship-and-star-hosting-and-troubleshooting-docs.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Urbit Ship and Star Hosting and Troubleshooting Docs"
2title = "Urbit Ship and Star Hosting and Troubleshooting Docs"
3−date = 2020-08-19
3+date = "2020-08-18"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["Documentation"]
7+grant_category = [ "Documentation" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "User docs for ship/star owners around best practices for hosting"
11description = "User docs for ship/star owners around best practices for hosting"
content/grants/verifying-urbit-id-on-keybase.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Verifying Urbit ID on Keybase"
2title = "Verifying Urbit ID on Keybase"
3−date = 2020-02-19
3+date = "2020-02-18"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Create a Gall app that links Urbit identities with Keybase."
11description = "Create a Gall app that links Urbit identities with Keybase."
content/grants/video-content-manager.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Video Content Manager"
2title = "Video Content Manager"
3−date = 2021-02-10
3+date = "2021-02-09"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["Community"]
7+grant_category = [ "Community" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Keep your finger on the pulse of video content produced by the community, and ensure that it's made visible."
11description = "Keep your finger on the pulse of video content produced by the community, and ensure that it's made visible."
content/grants/volt-lightning-on-urbit.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "volt: Lightning on Urbit"
2title = "volt: Lightning on Urbit"
3−date = 2021-04-02
3+date = "2021-04-01"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "An Urbit-native Lightning client and integration with `lnd` on 'provider' ships."
11description = "An Urbit-native Lightning client and integration with `lnd` on 'provider' ships."
content/grants/web-scraper.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "Web Scraper"
2title = "Web Scraper"
3−date = 2020-02-07
3+date = "2020-02-06"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Bounty"]
6+grant_type = [ "Bounty" ]
6−grant_category = ["App Dev", "Arvo"]
7+grant_category = [ "App Dev", "Arvo" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "It is often useful for archival purposes to pull down an entire website, however many sites have a complex network of pages that would be difficult to download one at a time."
11description = "It is often useful for archival purposes to pull down an entire website, however many sites have a complex network of pages that would be difficult to download one at a time."
content/grants/webrtc-gall-agent-and-external-app.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "WebRTC Gall Agent and external app"
2title = "WebRTC Gall Agent and external app"
3−date = 2021-01-08
3+date = "2021-01-07"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev"]
7+grant_category = [ "App Dev" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Add WebRTC support to Urbit, including call/stream setup and teardown messaging and ICE/STUN/TURN advertisement and authentication."
11description = "Add WebRTC support to Urbit, including call/stream setup and teardown messaging and ICE/STUN/TURN advertisement and authentication."
content/grants/webrtc.md+5−3
@@ -1,9 +1,11 @@
1+++
1+++
2title = "WebRTC Gall Agent and External App"
2title = "WebRTC Gall Agent and External App"
3−date = 2021-01-12
3+date = "2021-01-11"
4+
4[taxonomies]
5[taxonomies]
5−grant_type = ["Proposal"]
6+grant_type = [ "Proposal" ]
6−grant_category = ["App Dev: Other"]
7+grant_category = [ "App Dev: Other" ]
8+
7[extra]
9[extra]
8image = ""
10image = ""
9description = "Add WebRTC support to Urbit, including call/stream setup and teardown messaging and ICE/STUN/TURN advertisement and authentication."
11description = "Add WebRTC support to Urbit, including call/stream setup and teardown messaging and ICE/STUN/TURN advertisement and authentication."
content/media/blockchannel-episode-19-virtual-land-in-the-clouds-with-urbit.md+3−1
@@ -1,12 +1,14 @@
1+++
1+++
2title = "Episode 19: Virtual Land in the Clouds, with Urbit"
2title = "Episode 19: Virtual Land in the Clouds, with Urbit"
3−date = 2017-04-16
3+date = "2017-04-15"
4description = "Galen and Curtis talk Urbit on the BlockChannel podcast."
4description = "Galen and Curtis talk Urbit on the BlockChannel podcast."
5+
5[extra]
6[extra]
6author = "Galen Wolfe-Pauly + Curtis Yarvin"
7author = "Galen Wolfe-Pauly + Curtis Yarvin"
7ship = "~ravmel-ropdyl + ~sorreg-namtyv"
8ship = "~ravmel-ropdyl + ~sorreg-namtyv"
8soundcloud = "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/318017856&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true"
9soundcloud = "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/318017856&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true"
9+++
10+++
11+
10{{ soundcloud(url="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/318017856&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true") }}
12{{ soundcloud(url="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/318017856&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true") }}
11
13
12[Episode 19: Virtual Land in the Clouds, with Urbit](https://medium.com/blockchannel/episode-19-virtual-land-in-the-clouds-with-urbit-1428ba98243a)
14[Episode 19: Virtual Land in the Clouds, with Urbit](https://medium.com/blockchannel/episode-19-virtual-land-in-the-clouds-with-urbit-1428ba98243a)
content/media/blueprint-2017-galen-wolfe-pauly-on-the-distributed-web.md+5−2
@@ -1,8 +1,11 @@
1+++
1+++
2title = "Blueprint 2017 Talks: Galen Wolfe-Pauly on the Distributed Web"
2title = "Blueprint 2017 Talks: Galen Wolfe-Pauly on the Distributed Web"
3−date = 2017-11-20
3+date = "2017-11-19"
4description = "Galen presents to IDEO on Urbit and decentralized systems."
4description = "Galen presents to IDEO on Urbit and decentralized systems."
5+aliases = [
5−aliases = ["/posts/blueprint-2017-galen-wolfe-pauly-on-the-distributed-web/"]
6+ "/posts/blueprint-2017-galen-wolfe-pauly-on-the-distributed-web/"
7+]
8+
6[extra]
9[extra]
7author = "Galen Wolfe-Pauly"
10author = "Galen Wolfe-Pauly"
8ship = "~ravmel-ropdyl"
11ship = "~ravmel-ropdyl"
content/media/epicenter-episode-205-urbit-a-digital-republic-reinventing-the-internet.md+5−2
@@ -1,8 +1,11 @@
1+++
1+++
2title = "Epicenter #205: Urbit – A Digital Republic Reinventing the Internet"
2title = "Epicenter #205: Urbit – A Digital Republic Reinventing the Internet"
3−date = 2017-10-18
3+date = "2017-10-17"
4description = "Galen discusses Urbit with Brian Fabian Crain and Meher Roy on the Epicenter podcast."
4description = "Galen discusses Urbit with Brian Fabian Crain and Meher Roy on the Epicenter podcast."
5+aliases = [
5−aliases = ["/posts/epicenter-episode-205-urbit-a-digital-republic-reinventing-the-internet/"]
6+ "/posts/epicenter-episode-205-urbit-a-digital-republic-reinventing-the-internet/"
7+]
8+
6[extra]
9[extra]
7author = "Galen Wolfe-Pauly"
10author = "Galen Wolfe-Pauly"
8ship = "~ravmel-ropdyl"
11ship = "~ravmel-ropdyl"
content/media/governing-the-future-e09-urbit-a-user-owned-internet-on-top-of-the-internet.md+6−2
@@ -1,12 +1,16 @@
1+++
1+++
2title = "Governing the Future E09: Urbit – A User Owned Internet on top of the Internet"
2title = "Governing the Future E09: Urbit – A User Owned Internet on top of the Internet"
3−date = 2017-08-10
3+date = "2017-08-09"
4description = "Galen talks with Hampus Jakobsson about Urbit on the Governing the Future podcast."
4description = "Galen talks with Hampus Jakobsson about Urbit on the Governing the Future podcast."
5+aliases = [
5−aliases = ["/posts/governing-the-future-e09-urbit-a-user-owned-internet-on-top-of-the-internet/"]
6+ "/posts/governing-the-future-e09-urbit-a-user-owned-internet-on-top-of-the-internet/"
7+]
8+
6[extra]
9[extra]
7author = "Galen Wolfe-Pauly"
10author = "Galen Wolfe-Pauly"
8ship = "~ravmel-ropdyl"
11ship = "~ravmel-ropdyl"
9+++
12+++
13+
10> What happens when users get to control a piece of the internet. What does this browser of servers mean when we can use own client and still communicate? Can we create a new Internet owned by the people, an internet designed like a city by an architect and not only engineers?
14> What happens when users get to control a piece of the internet. What does this browser of servers mean when we can use own client and still communicate? Can we create a new Internet owned by the people, an internet designed like a city by an architect and not only engineers?
11
15
12[E09: Galen Wolfe-Pauly, Urbit - a user owned internet on top of the internet](http://podcast.hajak.se/104117/548011-e09-galen-wolfe-pauly-urbit-a-user-owned-internet-on-top-of-the-internet)
16[E09: Galen Wolfe-Pauly, Urbit - a user owned internet on top of the internet](http://podcast.hajak.se/104117/548011-e09-galen-wolfe-pauly-urbit-a-user-owned-internet-on-top-of-the-internet)
content/media/lambdaconf-2016-curtis-yarvin-urbit-a-clean-slate-functional-operating-stack.md+5−2
@@ -1,8 +1,11 @@
1+++
1+++
2title = "LambdaConf 2016: Curtis Yarvin - Urbit: A Clean Slate Functional Operating Stack"
2title = "LambdaConf 2016: Curtis Yarvin - Urbit: A Clean Slate Functional Operating Stack"
3−date = 2016-09-28
3+date = "2016-09-27"
4description = "Curtis presents a comprehensive technical overview of Urbit at LambdaConf 2016."
4description = "Curtis presents a comprehensive technical overview of Urbit at LambdaConf 2016."
5+aliases = [
5−aliases = ["/posts/lambdaconf-2016-curtis-yarvin-urbit-a-clean-slate-functional-operating-stack/"]
6+ "/posts/lambdaconf-2016-curtis-yarvin-urbit-a-clean-slate-functional-operating-stack/"
7+]
8+
6[extra]
9[extra]
7author = "Curtis Yarvin"
10author = "Curtis Yarvin"
8ship = "~sorreg-namtyv"
11ship = "~sorreg-namtyv"
content/media/lambdaconf-2018-ted-blackman-ford-urbits-build-system.md+5−2
@@ -1,8 +1,11 @@
1+++
1+++
2title = "LambdaConf 2018: Ted Blackman - Ford: Urbit's Build System"
2title = "LambdaConf 2018: Ted Blackman - Ford: Urbit's Build System"
3−date = 2018-12-20
3+date = "2018-12-19"
4description = "Ted presents a technical overview of Ford, Urbit's build system, at LambdaConf 2018."
4description = "Ted presents a technical overview of Ford, Urbit's build system, at LambdaConf 2018."
5+aliases = [
5−aliases = ["/posts/lambdaconf-2018-ted-blackman-ford-urbits-build-system/"]
6+ "/posts/lambdaconf-2018-ted-blackman-ford-urbits-build-system/"
7+]
8+
6[extra]
9[extra]
7author = "Ted Blackman"
10author = "Ted Blackman"
8ship = "~rovnys-ricfer"
11ship = "~rovnys-ricfer"
content/media/on-the-brink-castle-island.md+3−3
@@ -1,7 +1,8 @@
1+++
1+++
2title = "On The Brink with Castle Island - Episode 17"
2title = "On The Brink with Castle Island - Episode 17"
3description = "Christian Langalis and Logan Allen discuss Urbit with Nic Carter: its mutual benefits with Bitcoin, and why a complete rewrite of Unix and the computing stack is necessary."
3description = "Christian Langalis and Logan Allen discuss Urbit with Nic Carter: its mutual benefits with Bitcoin, and why a complete rewrite of Unix and the computing stack is necessary."
4−date = 2019-11-11
4+date = "2019-11-10"
5+
5[extra]
6[extra]
6author = "Christian Langalis + Logan Allen"
7author = "Christian Langalis + Logan Allen"
7ship = "~pindet-timmut + ~tacryt-socryp"
8ship = "~pindet-timmut + ~tacryt-socryp"
@@ -10,5 +11,4 @@ libsyn = "https://html5-player.libsyn.com/embed/episode/id/11959088/height/90/th
10
11
11"Christian Langalis and Logan Allen from Tlon join the show to discuss Urbit, the ambitious and somewhat mysterious computing project that they work on. We discuss how Bitcoin and Urbit could be mutually beneficial, how Urbit might free us from the tyrannical tech oligopolies, and why a from-scratch rewrite of Unix and the computing stack is necessary."
12"Christian Langalis and Logan Allen from Tlon join the show to discuss Urbit, the ambitious and somewhat mysterious computing project that they work on. We discuss how Bitcoin and Urbit could be mutually beneficial, how Urbit might free us from the tyrannical tech oligopolies, and why a from-scratch rewrite of Unix and the computing stack is necessary."
12
13
13−
14−<iframe style="border: none" src="//html5-player.libsyn.com/embed/episode/id/11959088/height/90/theme/custom/thumbnail/yes/direction/forward/render-playlist/no/custom-color/000000/" height="90" width="100%" scrolling="no" allowfullscreen webkitallowfullscreen mozallowfullscreen oallowfullscreen msallowfullscreen></iframe>
14+<iframe style="border: none" src="//html5-player.libsyn.com/embed/episode/id/11959088/height/90/theme/custom/thumbnail/yes/direction/forward/render-playlist/no/custom-color/000000/" height="90" width="100%" scrolling="no" allowfullscreen webkitallowfullscreen mozallowfullscreen oallowfullscreen msallowfullscreen></iframe>
content/media/the-ether-review-46-curtis-yarvin-and-galen-wolfe-pauly-on-urbit.md+5−2
@@ -1,8 +1,11 @@
1+++
1+++
2title = "The Ether Review #46: Curtis Yarvin & Galen Wolfe-Pauly on Urbit"
2title = "The Ether Review #46: Curtis Yarvin & Galen Wolfe-Pauly on Urbit"
3−date = 2016-10-24
3+date = "2016-10-23"
4description = "Curtis and Galen talk about Urbit on The Ether Review podcast."
4description = "Curtis and Galen talk about Urbit on The Ether Review podcast."
5+aliases = [
5−aliases = ["/posts/the-ether-review-46-curtis-yarvin-and-galen-wolfe-pauly-on-urbit/"]
6+ "/posts/the-ether-review-46-curtis-yarvin-and-galen-wolfe-pauly-on-urbit/"
7+]
8+
6[extra]
9[extra]
7author = "Curtis Yarvin + Galen Wolfe-Pauly"
10author = "Curtis Yarvin + Galen Wolfe-Pauly"
8ship = "~sorreg-namtyv + ~ravmel-ropdyl"
11ship = "~sorreg-namtyv + ~ravmel-ropdyl"
content/media/urbit-and-the-not-so-dark-future-of-the-internet.md+3−2
@@ -1,8 +1,9 @@
1+++
1+++
2title = "Urbit and the Not-So-Dark Future of the Internet"
2title = "Urbit and the Not-So-Dark Future of the Internet"
3−date = 2017-04-12
3+date = "2017-04-11"
4description = "Isaac Simpson's high-level introduction to Urbit."
4description = "Isaac Simpson's high-level introduction to Urbit."
5−aliases = ["/posts/urbit-and-the-not-so-dark-future-of-the-internet/"]
5+aliases = [ "/posts/urbit-and-the-not-so-dark-future-of-the-internet/" ]
6+
6[extra]
7[extra]
7author = "Isaac Simpson"
8author = "Isaac Simpson"
8+++
9+++
content/media/what-is-urbit.md+2−1
@@ -1,7 +1,8 @@
1+++
1+++
2title = "What is Urbit?"
2title = "What is Urbit?"
3−date = 2017-05-15
3+date = "2017-05-14"
4description = "A quick video explainer of how Urbit works."
4description = "A quick video explainer of how Urbit works."
5+
5[extra]
6[extra]
6youtube = "M04AKTCDavc"
7youtube = "M04AKTCDavc"
7+++
8+++
content/updates/2016-10-6-update.md+73−72
@@ -1,29 +1,30 @@
1+++
1+++
2title = "~2016.10.6 Update"
2title = "~2016.10.6 Update"
3−date = 2016-10-06
3+date = "2016-10-05"
4description = "September's monthly update slipped into October! But don't worry, it's a good one."
4description = "September's monthly update slipped into October! But don't worry, it's a good one."
5−aliases = ["/posts/2016-10-6-update/", "/blog/2016.10-update/"]
5+aliases = [ "/posts/2016-10-6-update/", "/blog/2016.10-update/" ]
6+
6[extra]
7[extra]
7author = "Curtis Yarvin + Galen Wolfe-Pauly"
8author = "Curtis Yarvin + Galen Wolfe-Pauly"
8ship = "~sorreg-namtyv + ~ravmel-ropdyl"
9ship = "~sorreg-namtyv + ~ravmel-ropdyl"
9+++
10+++
10
11
11−September's monthly update slipped into October! But don't
12+September's monthly update slipped into October! But don't
12worry, it's a good one.
13worry, it's a good one.
13
14
14## "Hard tech"
15## "Hard tech"
15
16
16In [this amusing talk](http://www.themacro.com/articles/2016/09/chad-rigetti-on-building-quantum-computers/),
17In [this amusing talk](http://www.themacro.com/articles/2016/09/chad-rigetti-on-building-quantum-computers/),
17Chad Rigetti defines "hard tech" as "solving problems you don't
18Chad Rigetti defines "hard tech" as "solving problems you don't
18−even know are solvable." Rigetti is building a quantum
19+even know are solvable." Rigetti is building a quantum
19−computer, which is definitely "hard tech." More power to him!
20+computer, which is definitely "hard tech." More power to him!
20
21
21−But software can be "hard," too. Is Urbit "hard tech"?
22+But software can be "hard," too. Is Urbit "hard tech"?
22
23
23The correct answer at this point is: no, but it _used_ to be hard
24The correct answer at this point is: no, but it _used_ to be hard
24−tech. Now it's actually real, if not exactly easy. The Urbit
25+tech. Now it's actually real, if not exactly easy. The Urbit
25network hasn't crashed once this summer, though we did one
26network hasn't crashed once this summer, though we did one
26−intentional breach (right before delivering the stars). I'm
27+intentional breach (right before delivering the stars). I'm
27still kind of amazed by this.
28still kind of amazed by this.
28
29
29But we still need to get to the point where (a) the whole network
30But we still need to get to the point where (a) the whole network
@@ -34,24 +35,24 @@ human beings and not have them be like, "gah, what is this?"
34
35
35If we had the resources of Microsoft or Google, or even of
36If we had the resources of Microsoft or Google, or even of
36Mozilla, we could solve these problems with a brute-force
37Mozilla, we could solve these problems with a brute-force
37−human-wave attack. We could just debug the system into
38+human-wave attack. We could just debug the system into
38−existence. It must be nice.
39+existence. It must be nice.
39−
40+
40−But not. In some ways it's essential to Urbit's mission that
41+But not. In some ways it's essential to Urbit's mission that
41−there isn't a giant army behind it. It means that the only way
42+there isn't a giant army behind it. It means that the only way
42−Urbit can succeed, or even survive, is to be excellent. That's
43+Urbit can succeed, or even survive, is to be excellent. That's
43−the right attitude for a stack designed for the 2020s. Not that
44+the right attitude for a stack designed for the 2020s. Not that
44−we can wait until the 2020s to get (a) through (d). Just that we
45+we can wait until the 2020s to get (a) through (d). Just that we
45don't want our children and grandchildren to curse the day this
46don't want our children and grandchildren to curse the day this
46−stack was born. Unix, the Internet and the Web gained the world
47+stack was born. Unix, the Internet and the Web gained the world
47and lost their souls -- we don't have that option.
48and lost their souls -- we don't have that option.
48
49
49Given this attitude, the thing that terrified me most of all
50Given this attitude, the thing that terrified me most of all
50about this summer's crowdsale is that the most important parts of
51about this summer's crowdsale is that the most important parts of
51Arvo -- the network and the PKI -- simply didn't exist in any
52Arvo -- the network and the PKI -- simply didn't exist in any
52−viable sense. Yes, the present `%ames` network does net work.
53+viable sense. Yes, the present `%ames` network does net work.
53There is even in theory a sort of PKI, although no one has ever
54There is even in theory a sort of PKI, although no one has ever
54−even tried to revoke a key. It might be secure -- who knows?
55+even tried to revoke a key. It might be secure -- who knows?
55
56
56More concretely, the existing `%ames` vane (kernel module) contains
57More concretely, the existing `%ames` vane (kernel module) contains
57both the protocol and the PKI, mixed together in a single giant
58both the protocol and the PKI, mixed together in a single giant
@@ -61,26 +62,26 @@ but the only body of _dead-end_ code -- which needs replacement,
61not documentation and maintenance -- is `%ames`.
62not documentation and maintenance -- is `%ames`.
62
63
63Unfortunately, networking and key management is the most
64Unfortunately, networking and key management is the most
64−important part of Urbit. In a sense it _is_ Urbit. So having it
65+important part of Urbit. In a sense it _is_ Urbit. So having it
65not exist, except as a design in our heads, was not a good thing.
66not exist, except as a design in our heads, was not a good thing.
66
67
67While documenting, evangelizing and in general growing Urbit is
68While documenting, evangelizing and in general growing Urbit is
68vastly important, what's even more important is finishing it --
69vastly important, what's even more important is finishing it --
69−without compromising its elegance. Elegance is the only thing
70+without compromising its elegance. Elegance is the only thing
70−Urbit has. It's not like there aren't other operating systems.
71+Urbit has. It's not like there aren't other operating systems.
71
72
72So the first thing I did after the crowdsale was to disappear
73So the first thing I did after the crowdsale was to disappear
73−into a hole and take care of this technical debt. This was not
74+into a hole and take care of this technical debt. This was not
74−"hard tech" in the sense that I knew it was solvable. I didn't
75+"hard tech" in the sense that I knew it was solvable. I didn't
75−know it was solvable _well_, though. And it has to be solved
76+know it was solvable _well_, though. And it has to be solved
76_well_, because otherwise who cares.
77_well_, because otherwise who cares.
77
78
78## Check out our new, improved cc-release
79## Check out our new, improved cc-release
79
80
80I'm delighted to report that the new, rewritten `%ames` network,
81I'm delighted to report that the new, rewritten `%ames` network,
81−and the all-new `%jael` PKI, are now at code complete. (Code
82+and the all-new `%jael` PKI, are now at code complete. (Code
82complete means "compiling but not tested," which is actually
83complete means "compiling but not tested," which is actually
83−saying a lot in a typed functional language.) They've been
84+saying a lot in a typed functional language.) They've been
84checked in to a new `cc-release` branch on
85checked in to a new `cc-release` branch on
85[`github.com/urbit/arvo`](https://github.com/urbit/arvo).
86[`github.com/urbit/arvo`](https://github.com/urbit/arvo).
86
87
@@ -94,127 +95,127 @@ clear and surprises seem unlikely.
94
95
95New `%ames` (currently `arvo/xmas.hoon`, since old `%ames` is still in
96New `%ames` (currently `arvo/xmas.hoon`, since old `%ames` is still in
96the build) has had all the key management stripped out; it's just
97the build) has had all the key management stripped out; it's just
97−a network vane. It's also no longer a single giant state
98+a network vane. It's also no longer a single giant state
98machine, but a system of five simple 200-line state machines.
99machine, but a system of five simple 200-line state machines.
99
100
100It was wonderful to discover that Hoon lets you write purely
101It was wonderful to discover that Hoon lets you write purely
101functional programs with what are essentially global variables.
102functional programs with what are essentially global variables.
102Specifically, nested cores generalize across global variables,
103Specifically, nested cores generalize across global variables,
103local variables, and objects, in a way I find technically quite
104local variables, and objects, in a way I find technically quite
104−lovely if I do say so myself. On the other hand, Hoon ain't
105+lovely if I do say so myself. On the other hand, Hoon ain't
105magic, and it's not like we've solved any of the
106magic, and it's not like we've solved any of the
106software-engineering problems inherent in a 2000-line state
107software-engineering problems inherent in a 2000-line state
107−machine based on global variables. So, nice to kill that.
108+machine based on global variables. So, nice to kill that.
108
109
109−Don't look at new `%ames` just yet. It was done in July and
110+Don't look at new `%ames` just yet. It was done in July and
110−August. It needs a few touchups to fit the `%jael` interface.
111+August. It needs a few touchups to fit the `%jael` interface.
111And it needs to be brought up to `%jael`'s quality standards.
112And it needs to be brought up to `%jael`'s quality standards.
112
113
113## `%jael`: reference code, PKI, and personal ledger
114## `%jael`: reference code, PKI, and personal ledger
114
115
115`%jael` (`/arvo/jael.hoon`), the PKI, is what I'm really excited
116`%jael` (`/arvo/jael.hoon`), the PKI, is what I'm really excited
116−about. It's what you should take a look at if you know any Hoon
117+about. It's what you should take a look at if you know any Hoon
117−or even if you don't. There's several really important things
118+or even if you don't. There's several really important things
118about `%jael`.
119about `%jael`.
119
120
120−The first is that it's actually reference-quality code. Or so I
121+The first is that it's actually reference-quality code. Or so I
121−believe. It's literally intended to serve as a reference style
122+believe. It's literally intended to serve as a reference style
122−for what all production-quality Hoon should look like. If you're
123+for what all production-quality Hoon should look like. If you're
123reading the code and you see anything that isn't absolutely
124reading the code and you see anything that isn't absolutely
124perfect, whether it's cosmetic or structural or anything in
125perfect, whether it's cosmetic or structural or anything in
125−between, file a PR. `%jael` is fully commented -- if you think
126+between, file a PR. `%jael` is fully commented -- if you think
126it needs more comments, or fewer, file a PR...
127it needs more comments, or fewer, file a PR...
127
128
128Needless to say, a reference style will be an enormous help in
129Needless to say, a reference style will be an enormous help in
129−managing community contributions. It's not that, for now at
130+managing community contributions. It's not that, for now at
130least, we won't accept patches not written in line with the
131least, we won't accept patches not written in line with the
131reference `%jael` style. But we'll always accept patches to bring
132reference `%jael` style. But we'll always accept patches to bring
132−'those patches' up to reference. For the moment, the code will just
133+'those patches' up to reference. For the moment, the code will just
133define the style by analogy, but it'll eventually spawn an actual
134define the style by analogy, but it'll eventually spawn an actual
134document.
135document.
135
136
136If you're feeling ambitious and want to change the reference
137If you're feeling ambitious and want to change the reference
137style itself, your change is best submitted as a patch to `%jael`
138style itself, your change is best submitted as a patch to `%jael`
138−itself. And _really_ ambitious people can create their own
139+itself. And _really_ ambitious people can create their own
139alternative Hoon styles -- hopefully defined at the same same
140alternative Hoon styles -- hopefully defined at the same same
140level of precision.
141level of precision.
141
142
142Second, `%jael` actually implements the Urbit PKI as designed,
143Second, `%jael` actually implements the Urbit PKI as designed,
143right down to unusual but politically critical features like
144right down to unusual but politically critical features like
144−escaping a bad parent. Since the code is readable and heavily
145+escaping a bad parent. Since the code is readable and heavily
145commented, it can and will serve as the best possible reference
146commented, it can and will serve as the best possible reference
146for the PKI's semantics.
147for the PKI's semantics.
147
148
148Both `%ames` and `%jael` are designed for the new and correct
149Both `%ames` and `%jael` are designed for the new and correct
149−single-homed urbit model, where one pier is one ship. In the new
150+single-homed urbit model, where one pier is one ship. In the new
150world, to boot your planet, you use your ticket to generate a
151world, to boot your planet, you use your ticket to generate a
151−symmetric key that authenticates you to your parent. When you
152+symmetric key that authenticates you to your parent. When you
152share your public key with your parent, over that initial secure
153share your public key with your parent, over that initial secure
153channel, it notices that it hasn't signed it yet and shares its
154channel, it notices that it hasn't signed it yet and shares its
154signature back to you.
155signature back to you.
155
156
156Third, `%jael` isn't just a PKI -- it's a generalized system for
157Third, `%jael` isn't just a PKI -- it's a generalized system for
157−formal promises. The whole point of a PKI is that entities can
158+formal promises. The whole point of a PKI is that entities can
158−make secure statements to each other. Of course, every `:talk`
159+make secure statements to each other. Of course, every `:talk`
159message is a signed statement, but the really important messages
160message is a signed statement, but the really important messages
160are _promises_ -- such as, for instance, "Tlon owes you 3 stars."
161are _promises_ -- such as, for instance, "Tlon owes you 3 stars."
161
162
162(Right now, the stars we sold in the crowdsale are recorded in the
163(Right now, the stars we sold in the crowdsale are recorded in the
163−state of a higher-level application (`:womb`). (We have an
164+state of a higher-level application (`:womb`). (We have an
164−encrypted offline backup, of course.) This is fine at a certain
165+encrypted offline backup, of course.) This is fine at a certain
165level, but it's a bit rickety and not really up to Urbit's
166level, but it's a bit rickety and not really up to Urbit's
166−standards of architectural elegance. Promises and secrets are
167+standards of architectural elegance. Promises and secrets are
167fundamental state and need to be handled at a fundamental level.)
168fundamental state and need to be handled at a fundamental level.)
168
169
169In a secure distributed social network, people need to be able to
170In a secure distributed social network, people need to be able to
170−make formal promises to each other. Essentially, every ship is
171+make formal promises to each other. Essentially, every ship is
171−an _accounting entity_. It records its liabilities, which are
172+an _accounting entity_. It records its liabilities, which are
172the promises it's made to others, and its assets, which are the
173the promises it's made to others, and its assets, which are the
173−promises others have made to it. When I update the promises I've
174+promises others have made to it. When I update the promises I've
174made to you, I send you an updated statement.
175made to you, I send you an updated statement.
175
176
176−All kinds of promises fit this mold. For instance, while you
177+All kinds of promises fit this mold. For instance, while you
177don't usually think of a symmetric key as a promise from one
178don't usually think of a symmetric key as a promise from one
178−entity to another, it is. It's a promise from ship A to ship B,
179+entity to another, it is. It's a promise from ship A to ship B,
179that B can identify itself to A by this secret.
180that B can identify itself to A by this secret.
180
181
181So `%jael` will, among other glorious things, essentially allow
182So `%jael` will, among other glorious things, essentially allow
182every galaxy to serve as an exchange for star invitations, and
183every galaxy to serve as an exchange for star invitations, and
183−any star to serve as an exchange for planet invitations. Mere
184+any star to serve as an exchange for planet invitations. Mere
184−payments are just the start of what you can do with this. And of
185+payments are just the start of what you can do with this. And of
185course, one of our big near-term goals is to make first Urbit
186course, one of our big near-term goals is to make first Urbit
186invitations, then (once the crypto is truly final) actual ships,
187invitations, then (once the crypto is truly final) actual ships,
187tradeable on "regular" cryptocurrency exchanges.
188tradeable on "regular" cryptocurrency exchanges.
188
189
189One of my views about Bitcoin is that its decentralized,
190One of my views about Bitcoin is that its decentralized,
190trust-free ledger isn't really the most important thing about it.
191trust-free ledger isn't really the most important thing about it.
191−Humans build trust quite easily. For instance, Bitcoin doesn't
192+Humans build trust quite easily. For instance, Bitcoin doesn't
192even enable trust-free payments -- a payment is always an
193even enable trust-free payments -- a payment is always an
193−exchange for other good or service. Do I provide the good or
194+exchange for other good or service. Do I provide the good or
194−service before, or after, the Bitcoin payment? Either way,
195+service before, or after, the Bitcoin payment? Either way,
195trust is unavoidable.
196trust is unavoidable.
196
197
197The important thing about Bitcoin is just that it enables users
198The important thing about Bitcoin is just that it enables users
198to manage their obligations to each other digitally, without
199to manage their obligations to each other digitally, without
199interacting with a 20th-century asset management system made of
200interacting with a 20th-century asset management system made of
200−paper and magnetic tape. Giving every user their own asset
201+paper and magnetic tape. Giving every user their own asset
201management ledger is another small revolution in that direction.
202management ledger is another small revolution in that direction.
202And if I'm defining and issuing my own digital assets, why do I
203And if I'm defining and issuing my own digital assets, why do I
203−need to put them on a global blockchain? You're still trusting
204+need to put them on a global blockchain? You're still trusting
204me to actually live up to my promises.
205me to actually live up to my promises.
205
206
206Last but not least, `%jael` solves one of Urbit's most important
207Last but not least, `%jael` solves one of Urbit's most important
207−and hardest problems: how do I back up my urbit? I know I said
208+and hardest problems: how do I back up my urbit? I know I said
208this was impossible, but I lied.
209this was impossible, but I lied.
209
210
210Urbit uses persistent sessions, which means a pair of ships uses
211Urbit uses persistent sessions, which means a pair of ships uses
211−the same session sequence numbers for life. Since every packet
212+the same session sequence numbers for life. Since every packet
212is a transaction, when you send an acknowledgment, you mean it.
213is a transaction, when you send an acknowledgment, you mean it.
213The upside is that we get exactly-once messaging, which if you've
214The upside is that we get exactly-once messaging, which if you've
214ever done distributed programming is a very, very good thing.
215ever done distributed programming is a very, very good thing.
215The downside is that if you lose your state, there's no way to
216The downside is that if you lose your state, there's no way to
216recover it, since you don't know what sequence number to send
217recover it, since you don't know what sequence number to send
217−next. (See under: [Two Generals'
218+next. (See under: [Two Generals'
218Problem](https://en.wikipedia.org/wiki/Two_Generals%27_Problem)).
219Problem](https://en.wikipedia.org/wiki/Two_Generals%27_Problem)).
219
220
220In the new world, the Unix layer will subscribe to a stream of
221In the new world, the Unix layer will subscribe to a stream of
@@ -225,13 +226,13 @@ it's small and trivial to back up.
225When restoring, if you have all your private keys but have lost
226When restoring, if you have all your private keys but have lost
226all other state (obviously if you don't have the latest private
227all other state (obviously if you don't have the latest private
227key, you're hosed), you sign a new version of your will which
228key, you're hosed), you sign a new version of your will which
228−contains a "brain damage" bit. When this will is propagated to
229+contains a "brain damage" bit. When this will is propagated to
229your neighbors, they learn that you're brain-damaged and reset
230your neighbors, they learn that you're brain-damaged and reset
230their sequence numbers -- and forget you know anything they told
231their sequence numbers -- and forget you know anything they told
231you, treating you as a new stranger.
232you, treating you as a new stranger.
232
233
233At the application level, all your subscriptions get closed.
234At the application level, all your subscriptions get closed.
234−Apps already have to deal with this. Forward messages shouldn't
235+Apps already have to deal with this. Forward messages shouldn't
235involve any state coupling; that's what subscriptions are for.
236involve any state coupling; that's what subscriptions are for.
236In case there is some coupling anyway, you'll get an event that
237In case there is some coupling anyway, you'll get an event that
237"ship X lost his mind, forget anything you know about him."
238"ship X lost his mind, forget anything you know about him."
@@ -239,23 +240,23 @@ In case there is some coupling anyway, you'll get an event that
239Essentially, we're cheating the fact that you can't have
240Essentially, we're cheating the fact that you can't have
240transient sessions and [exactly-once delivery](http://bravenewgeek.com/you-cannot-have-exactly-once-delivery/)
241transient sessions and [exactly-once delivery](http://bravenewgeek.com/you-cannot-have-exactly-once-delivery/)
241by letting the abstraction leak in this special case, and putting
242by letting the abstraction leak in this special case, and putting
242−the responsibility for fixing it on the brain-damaged ship. It
243+the responsibility for fixing it on the brain-damaged ship. It
243−may even leak up to the user. But dude, you're the one that let
244+may even leak up to the user. But dude, you're the one that let
244your brain fall out of your skull.
245your brain fall out of your skull.
245
246
246Another thing I like about this solution (and about `%jael` in
247Another thing I like about this solution (and about `%jael` in
247general) is that it solves the problem of how you use someone
248general) is that it solves the problem of how you use someone
248−else's secrets, if you manage to steal them. There's no point in
249+else's secrets, if you manage to steal them. There's no point in
249security through technical difficulty -- if you have the latest
250security through technical difficulty -- if you have the latest
250−private key for a ship, you're the captain now. You shouldn't
251+private key for a ship, you're the captain now. You shouldn't
251have to hack something up to make this work.
252have to hack something up to make this work.
252
253
253## Keep in touch / office hours
254## Keep in touch / office hours
254
255
255`:talk` is always a great place to come and ask questions.
256`:talk` is always a great place to come and ask questions.
256Someone from Tlon will be available in `:talk` from 12PM - 3PM
257Someone from Tlon will be available in `:talk` from 12PM - 3PM
257−PDT each weekday. And [our forum](https://fora.urbit.org) is a
258+PDT each weekday. And [our forum](https://fora.urbit.org) is a
258−great place to post questions. We've created [this
259+great place to post questions. We've created [this
259thread](https://urbit.org/fora/posts/~2016.10.7..17.28.21..b058~/) to
260thread](https://urbit.org/fora/posts/~2016.10.7..17.28.21..b058~/) to
260discuss this post.
261discuss this post.
261
262
content/updates/2016-5-16-roadmap.md+62−61
@@ -1,55 +1,56 @@
1+++
1+++
2title = "~2016.5.16 Urbit Roadmap 2016"
2title = "~2016.5.16 Urbit Roadmap 2016"
3−date = 2016-05-16
3+date = "2016-05-15"
4description = "Our near-term goals for the Urbit community, documentation, maturity, utility and governance."
4description = "Our near-term goals for the Urbit community, documentation, maturity, utility and governance."
5−aliases = ["/posts/2016-5-16-roadmap/"]
5+aliases = [ "/posts/2016-5-16-roadmap/" ]
6+
6[extra]
7[extra]
7author = "Curtis Yarvin"
8author = "Curtis Yarvin"
8ship = "~sorreg-namtyv"
9ship = "~sorreg-namtyv"
9+++
10+++
10
11
11−Urbit is in early beta. It works. It doesn't work well enough to be
12+Urbit is in early beta. It works. It doesn't work well enough to be
12particularly useful, though it's not that far away.
13particularly useful, though it's not that far away.
13
14
14It's important to understand that the present Hoon codebase was
15It's important to understand that the present Hoon codebase was
15developed almost entirely by three full-time engineers (Curtis,
16developed almost entirely by three full-time engineers (Curtis,
16−Philip, Anton). We are good, but not superhuman.
17+Philip, Anton). We are good, but not superhuman.
17
18
18We have four separate problems to attack in 2016: community, maturity,
19We have four separate problems to attack in 2016: community, maturity,
19utility, and governance.
20utility, and governance.
20
21
21## Community
22## Community
22
23
23−Working on Urbit is incredibly fun. We've kind of bogarted that fun.
24+Working on Urbit is incredibly fun. We've kind of bogarted that fun.
24We're sorry -- no, we're not actually sorry -- but we're going to
25We're sorry -- no, we're not actually sorry -- but we're going to
25change that.
26change that.
26
27
27Since 2013, the community status of Urbit has been that it's open
28Since 2013, the community status of Urbit has been that it's open
28source and you can mess with it if you want, but we don't really do
29source and you can mess with it if you want, but we don't really do
29−much to encourage you. Or to put it differently: open source,
30+much to encourage you. Or to put it differently: open source,
30secretly wishing it was still stealth.
31secretly wishing it was still stealth.
31
32
32The sad truth is that we've been doing research, and research doesn't
33The sad truth is that we've been doing research, and research doesn't
33−scale. This is one of the reasons why open-source projects are
34+scale. This is one of the reasons why open-source projects are
34−notoriously focused on copying proprietary products. Open source is
35+notoriously focused on copying proprietary products. Open source is
35great for incremental maintenance and development -- almost nothing in
36great for incremental maintenance and development -- almost nothing in
36software is as mature as a mature open-source project, because "with
37software is as mature as a mature open-source project, because "with
37−enough eyeballs, all bugs are shallow." But it's terrible for
38+enough eyeballs, all bugs are shallow." But it's terrible for
38creative research, because the smallest decisions invite the notorious
39creative research, because the smallest decisions invite the notorious
39"bikeshedding" syndrome.
40"bikeshedding" syndrome.
40
41
41Now that Urbit does all the things we want it to do, in (pretty much)
42Now that Urbit does all the things we want it to do, in (pretty much)
42−the way we want it to do them, our focus is changing. All we really
43+the way we want it to do them, our focus is changing. All we really
43−care about going forward is maturity and traction. Also, it's a lot
44+care about going forward is maturity and traction. Also, it's a lot
44harder to argue about what color the bikeshed should be painted, if
45harder to argue about what color the bikeshed should be painted, if
45the bikeshed is already painted.
46the bikeshed is already painted.
46
47
47−So, working on Urbit is incredibly fun. If only because it's the
48+So, working on Urbit is incredibly fun. If only because it's the
48−programmer's equivalent of astrobiology. But not only because --
49+programmer's equivalent of astrobiology. But not only because --
49Urbit is very far from being a mere esoteric curiosity.
50Urbit is very far from being a mere esoteric curiosity.
50
51
51The first challenge we face is making sure Urbit is properly
52The first challenge we face is making sure Urbit is properly
52−documented. (See below.) We'll also be:
53+documented. (See below.) We'll also be:
53
54
54- holding weekly public meetings / office hours
55- holding weekly public meetings / office hours
55- maintaining public developer blogs
56- maintaining public developer blogs
@@ -57,7 +58,7 @@ documented. (See below.) We'll also be:
57
58
58## Maturity
59## Maturity
59
60
60−At the systems layer, Urbit has enough features for right now. What
61+At the systems layer, Urbit has enough features for right now. What
61it needs is maturity.
62it needs is maturity.
62
63
63Aside from mere bugs and issues, maturity comes in five flavors:
64Aside from mere bugs and issues, maturity comes in five flavors:
@@ -66,55 +67,55 @@ documentation, dogfooding, optimization, security, and testing.
66### Documentation
67### Documentation
67
68
68Anyone outside the core team who's done any serious work in Urbit has
69Anyone outside the core team who's done any serious work in Urbit has
69−earned their scout badge in Reverse Engineering. The number of people
70+earned their scout badge in Reverse Engineering. The number of people
70who have done this is impressive, but also slightly embarrassing.
71who have done this is impressive, but also slightly embarrassing.
71Since Urbit is so technically unusual, we have no excuse for leaving
72Since Urbit is so technically unusual, we have no excuse for leaving
72any part of it undocumented.
73any part of it undocumented.
73
74
74Documenting Urbit is not just a matter of writing down specifications
75Documenting Urbit is not just a matter of writing down specifications
75−for the code as it exists. That would be easy if the code was
76+for the code as it exists. That would be easy if the code was
76−perfect. It's not perfect.
77+perfect. It's not perfect.
77
78
78One truism of CS is Knuth's observation that "premature optimization
79One truism of CS is Knuth's observation that "premature optimization
79−is the root of all evil." Yes, but premature documentation is at
80+is the root of all evil." Yes, but premature documentation is at
80−least the trunk of all evil. "Documenting into existence" -- making
81+least the trunk of all evil. "Documenting into existence" -- making
81something that doesn't exist exist, by describing it -- is the trap of
82something that doesn't exist exist, by describing it -- is the trap of
82all vaporware projects.
83all vaporware projects.
83
84
84−On the other hand, Urbit does exist. It doesn't need to be documented
85+On the other hand, Urbit does exist. It doesn't need to be documented
85−into existence. It does need to be documented into completion. This
86+into existence. It does need to be documented into completion. This
86doesn't mean simply describing the codebase.
87doesn't mean simply describing the codebase.
87
88
88−Documenting to completion is a two-way process. It always produces a
89+Documenting to completion is a two-way process. It always produces a
89−nontrivial set of technical revisions. Large design questions are not
90+nontrivial set of technical revisions. Large design questions are not
90−open for discussion, but small ones are. This makes documenting to
91+open for discussion, but small ones are. This makes documenting to
91completion a fun and fascinating community process, which neither
92completion a fun and fascinating community process, which neither
92reduces to mere stenography, nor descends into endless bikeshedding.
93reduces to mere stenography, nor descends into endless bikeshedding.
93
94
94−Nock is completely done, and completely documented. Hoon still has a
95+Nock is completely done, and completely documented. Hoon still has a
95few small rough spots; its reference documentation is decent but not
96few small rough spots; its reference documentation is decent but not
96perfect; its tutorial documentation needs more work, but is reasonably
97perfect; its tutorial documentation needs more work, but is reasonably
97adequate.
98adequate.
98
99
99The real target of documentation into completion is Arvo (including
100The real target of documentation into completion is Arvo (including
100−the Hoon library). The ideal point at which to prepare stable
101+the Hoon library). The ideal point at which to prepare stable
101documentation is the point Arvo is at now: basically working, but
102documentation is the point Arvo is at now: basically working, but
102largely undocumented.
103largely undocumented.
103
104
104Since Hoon is a programming language for Arvo, not for Unix, Hoon
105Since Hoon is a programming language for Arvo, not for Unix, Hoon
105documentation without Arvo documentation remains mostly useless -- so
106documentation without Arvo documentation remains mostly useless -- so
106−we've got a strong incentive to get this done. But not without
107+we've got a strong incentive to get this done. But not without
107actually getting it right.
108actually getting it right.
108
109
109### Dogfooding
110### Dogfooding
110
111
111−Urbit has no alternative but to dogfood itself into maturity. If the
112+Urbit has no alternative but to dogfood itself into maturity. If the
112Urbit team itself doesn't solve some problem with Urbit, who else can
113Urbit team itself doesn't solve some problem with Urbit, who else can
113−be expected to? Any use of any external tool in the Urbit development
114+be expected to? Any use of any external tool in the Urbit development
114process is a damaging energy leak.
115process is a damaging energy leak.
115
116
116We already use Urbit to publish documents about Urbit, to chat about
117We already use Urbit to publish documents about Urbit, to chat about
117−Urbit, and of course to deliver Urbit updates. With this release,
118+Urbit, and of course to deliver Urbit updates. With this release,
118we're adding a public chat stream and public comments.
119we're adding a public chat stream and public comments.
119
120
120The next dogfooding steps: using GitHub as a backup to Clay, not Clay
121The next dogfooding steps: using GitHub as a backup to Clay, not Clay
@@ -124,74 +125,74 @@ replacing internal email with long-form `:talk` messages.
124### Optimization
125### Optimization
125
126
126You'll notice that some aspects of Urbit are slower than you might
127You'll notice that some aspects of Urbit are slower than you might
127−expect. This is because of our approach to optimization, which is to
128+expect. This is because of our approach to optimization, which is to
128throw some elbow grease at it when it gets annoying.
129throw some elbow grease at it when it gets annoying.
129
130
130Death by unsolvable slowness is a common cause of mortality in
131Death by unsolvable slowness is a common cause of mortality in
131−language-oriented projects like Urbit. But Urbit actually has two big
132+language-oriented projects like Urbit. But Urbit actually has two big
132advantages in optimization.
133advantages in optimization.
133
134
134First, our profiler is simple, but quite effective, because it's
135First, our profiler is simple, but quite effective, because it's
135integrated with the language and runtime at a level usually not found
136integrated with the language and runtime at a level usually not found
136−in profilers. Second, anything that's slow can be jetted; as long as
137+in profilers. Second, anything that's slow can be jetted; as long as
137there's an inner loop, that inner loop is vulnerable to anyone who can
138there's an inner loop, that inner loop is vulnerable to anyone who can
138−write C. And there's always an inner loop.
139+write C. And there's always an inner loop.
139
140
140### Testing
141### Testing
141
142
142There is plenty of design work to be done in even figuring out how to
143There is plenty of design work to be done in even figuring out how to
143systematically test Urbit.
144systematically test Urbit.
144
145
145−We've done appallingly little systematic testing. We've mostly relied
146+We've done appallingly little systematic testing. We've mostly relied
146on simplicity and elbow grease to get the system to the reliability
147on simplicity and elbow grease to get the system to the reliability
147−level it's at now. `~zod` has been up for a few months and has a 22GB
148+level it's at now. `~zod` has been up for a few months and has a 22GB
148−event log. There's no reason to think that if we replayed that log,
149+event log. There's no reason to think that if we replayed that log,
149we'd end up with any different bits.
150we'd end up with any different bits.
150
151
151−Simplicity buys a lot. Urbit is not always as simple as we want it to
152+Simplicity buys a lot. Urbit is not always as simple as we want it to
152−be, though. There are plenty of known bugs; and we're nowhere ready
153+be, though. There are plenty of known bugs; and we're nowhere ready
153to declare Urbit ready for mission-critical data.
154to declare Urbit ready for mission-critical data.
154
155
155### Security
156### Security
156
157
157−Urbit is not yet secure at all. We don't even think it's secure. And
158+Urbit is not yet secure at all. We don't even think it's secure. And
158−this is just the first step in making it secure. After that comes an
159+this is just the first step in making it secure. After that comes an
159independent audit and penetration testing.
160independent audit and penetration testing.
160
161
161## Utility
162## Utility
162
163
163However much we want Urbit to succeed because we're geeks and love
164However much we want Urbit to succeed because we're geeks and love
164functional programming, it can only go somewhere by being useful -- to
165functional programming, it can only go somewhere by being useful -- to
165−people who don't care about the technology. Moreover, even for geeks,
166+people who don't care about the technology. Moreover, even for geeks,
166the amount of fun in working on something that's permanently un-useful
167the amount of fun in working on something that's permanently un-useful
167is quite limited.
168is quite limited.
168
169
169−What is Urbit? Urbit is a general-purpose personal server whose
170+What is Urbit? Urbit is a general-purpose personal server whose
170−long-term goal is to replace the whole web-service ecosystem. The
171+long-term goal is to replace the whole web-service ecosystem. The
171long term takes a long time by definition and is always preceded by
172long term takes a long time by definition and is always preceded by
172the short term.
173the short term.
173
174
174Fortunately, Urbit isn't that far from being useful in the short term.
175Fortunately, Urbit isn't that far from being useful in the short term.
175Three directions we're pushing in: APIs, publishing, and distributed
176Three directions we're pushing in: APIs, publishing, and distributed
176−chat. Urbit is a general-purpose system, of course, and it's very
177+chat. Urbit is a general-purpose system, of course, and it's very
177−hard for us to know what "killer app" will catch on first. It might
178+hard for us to know what "killer app" will catch on first. It might
178not even be any of these.
179not even be any of these.
179
180
180### API aggregation
181### API aggregation
181
182
182It takes a long time to replace Facebook -- or any other mature Web
183It takes a long time to replace Facebook -- or any other mature Web
183−service. But most of these services have APIs. Early in its life,
184+service. But most of these services have APIs. Early in its life,
184your general-purpose personal server puts most of its energy into
185your general-purpose personal server puts most of its energy into
185controlling special-purpose personal servers.
186controlling special-purpose personal servers.
186
187
187The use case seems a little trivial, but Urbit is actually a great API
188The use case seems a little trivial, but Urbit is actually a great API
188−client. An API client is stateful; it has keys and tokens to manage.
189+client. An API client is stateful; it has keys and tokens to manage.
189And APIs are notoriously unstable, which requires over-the-air
190And APIs are notoriously unstable, which requires over-the-air
190hotpatches, which Urbit is quite good at.
191hotpatches, which Urbit is quite good at.
191
192
192Also, having your own personal API token on your own personal server
193Also, having your own personal API token on your own personal server
193−is enormously empowering. Most services make it quite easy to
194+is enormously empowering. Most services make it quite easy to
194−register yourself as an "app." Unlike a third-party startup, this "me
195+register yourself as an "app." Unlike a third-party startup, this "me
195app" doesn't have to obey any TOS constraints on user experience.
196app" doesn't have to obey any TOS constraints on user experience.
196
197
197For example, if you build an API-driven web service that shows an
198For example, if you build an API-driven web service that shows an
@@ -202,20 +203,20 @@ It's good for adoption when Urbit can present a user experience that
202nothing else can.
203nothing else can.
203
204
204Another area we're focusing on is using Urbit as a shim to put your
205Another area we're focusing on is using Urbit as a shim to put your
205−Unix box in control of your API-driven services. With Urbit and FUSE,
206+Unix box in control of your API-driven services. With Urbit and FUSE,
206−you can actually mount remote services in your filesystem. Our first
207+you can actually mount remote services in your filesystem. Our first
207prototypes of this are quite exciting, though they could use some
208prototypes of this are quite exciting, though they could use some
208optimization.
209optimization.
209
210
210API drivers are also a great area for people to contribute code to
211API drivers are also a great area for people to contribute code to
211−Urbit. There's an almost infinite number of drivers to write, each of
212+Urbit. There's an almost infinite number of drivers to write, each of
212them is slightly different from the others,
213them is slightly different from the others,
213
214
214### Personal publishing
215### Personal publishing
215
216
216If you put it behind nginx, Urbit already works quite well as a
217If you put it behind nginx, Urbit already works quite well as a
217−personal publishing tool. You can copy a tree of Markdown files into
218+personal publishing tool. You can copy a tree of Markdown files into
218−a directory and have a website or a blog. There's no reason why a
219+a directory and have a website or a blog. There's no reason why a
219well-cached functional publishing system shouldn't replace a static
220well-cached functional publishing system shouldn't replace a static
220site generator.
221site generator.
221
222
@@ -226,16 +227,16 @@ that `planet.urbit.org` doesn't have to be proxied.
226### Decentralized chat
227### Decentralized chat
227
228
228A lot of people want an encrypted, decentralized, persistent chat
229A lot of people want an encrypted, decentralized, persistent chat
229−network. Urbit already is this, though its human interface is nowhere
230+network. Urbit already is this, though its human interface is nowhere
230near as refined as a marvelous product like Slack.
231near as refined as a marvelous product like Slack.
231
232
232−Urbit needs chat because it needs to talk about itself. But the most
233+Urbit needs chat because it needs to talk about itself. But the most
233mature parts of Urbit will always be the ones we dogfood, and chat is
234mature parts of Urbit will always be the ones we dogfood, and chat is
234central to this list.
235central to this list.
235
236
236−Can Urbit gain traction as a messaging platform alone? It's certainly
237+Can Urbit gain traction as a messaging platform alone? It's certainly
237−conceivable. It's difficult, to put it mildly, to understand what
238+conceivable. It's difficult, to put it mildly, to understand what
238−makes one messaging network more popular than another. Ideally,
239+makes one messaging network more popular than another. Ideally,
239someone who cares deeply about decentralized messaging would take this
240someone who cares deeply about decentralized messaging would take this
240ball and run with it.
241ball and run with it.
241
242
content/updates/2016-7-20-update.md+34−33
@@ -1,25 +1,26 @@
1+++
1+++
2title = "~2016.7.20 Update"
2title = "~2016.7.20 Update"
3−date = 2016-07-20
3+date = "2016-07-19"
4description = "It's an amazing feeling to realize that the Internet is fully capable of funding and programming its own replacement."
4description = "It's an amazing feeling to realize that the Internet is fully capable of funding and programming its own replacement."
5−aliases = ["/posts/2016-7-20-update/", "/blog/2016.7-update/"]
5+aliases = [ "/posts/2016-7-20-update/", "/blog/2016.7-update/" ]
6+
6[extra]
7[extra]
7author = "Curtis Yarvin"
8author = "Curtis Yarvin"
8ship = "~sorreg-namtyv"
9ship = "~sorreg-namtyv"
9+++
10+++
10
11
11First, a huge thank you to everyone who helped make our crowdsale a
12First, a huge thank you to everyone who helped make our crowdsale a
12−success. It's an amazing feeling to realize that the Internet is
13+success. It's an amazing feeling to realize that the Internet is
13fully capable of funding and programming its own replacement. The
14fully capable of funding and programming its own replacement. The
14world both knows enough about it, and cares enough about it.
15world both knows enough about it, and cares enough about it.
15
16
16It will still be a lot of work to make Urbit a polished product for
17It will still be a lot of work to make Urbit a polished product for
17ordinary humans, and organizing this work remains a tremendous
18ordinary humans, and organizing this work remains a tremendous
18−responsibility. But now we're confident that it can be done.
19+responsibility. But now we're confident that it can be done.
19
20
20Now that the public has a serious stake in Urbit, we can't really keep
21Now that the public has a serious stake in Urbit, we can't really keep
21up our old habit of working in the dark and occasionally releasing
22up our old habit of working in the dark and occasionally releasing
22−mysterious beautiful things. We'll keep up with these monthly
23+mysterious beautiful things. We'll keep up with these monthly
23updates, on or about the 20th of each month.
24updates, on or about the 20th of each month.
24
25
25As always, you can see the beating pulse of Urbit development at
26As always, you can see the beating pulse of Urbit development at
@@ -32,8 +33,8 @@ of our two strongest engineers, Philip (`~wictuc-folrex`) and Anton
32(`~fyr`).
33(`~fyr`).
33
34
34Rather than remain on the path to total burnout we decided to push
35Rather than remain on the path to total burnout we decided to push
35−back the issuing of stars. Our goal is to activate invites on August
36+back the issuing of stars. Our goal is to activate invites on August
36−12th, 2016. Apologies for the delay, and the short notice.
37+12th, 2016. Apologies for the delay, and the short notice.
37
38
38## Great renaming, rekeying, and new ames
39## Great renaming, rekeying, and new ames
39
40
@@ -50,23 +51,23 @@ AES).
50
51
51Not only will this let star buyers collect their stars (they don't
52Not only will this let star buyers collect their stars (they don't
52need to, but it might be fun), but all planet owners will now claim
53need to, but it might be fun), but all planet owners will now claim
53−their new planets via the womb. If you have an old ticket, the womb
54+their new planets via the womb. If you have an old ticket, the womb
54will convert it into a new invitation.
55will convert it into a new invitation.
55
56
56We had planned to run the great renaming today, but about a week or so
57We had planned to run the great renaming today, but about a week or so
57−ago we found ourselves reconsidering. This isn't because the new
58+ago we found ourselves reconsidering. This isn't because the new
58crypto and `@p` code isn't ready -- it is (largely because it's the work
59crypto and `@p` code isn't ready -- it is (largely because it's the work
59−of Ray, `~raplys-lornex`). But...
60+of Ray, `~raplys-lornex`). But...
60
61
61−1: Anton needed a break and the womb is his code. For a piece of
62+1: Anton needed a break and the womb is his code. For a piece of
62critical infrastructure, it's also a little under-documented and
63critical infrastructure, it's also a little under-documented and
63−under-tested. Hoon as a typed language makes you lucky. Urbit is
64+under-tested. Hoon as a typed language makes you lucky. Urbit is
64still a testnet, but we're a little tired of relying on luck.
65still a testnet, but we're a little tired of relying on luck.
65
66
662: Slipping the great renaming lets me (Curtis, `~tasfyn-partyv`)
672: Slipping the great renaming lets me (Curtis, `~tasfyn-partyv`)
67resuscitate and integrate my rewrite of the `%ames` network module,
68resuscitate and integrate my rewrite of the `%ames` network module,
68which was mostly completed and then put aside six months ago (so that
69which was mostly completed and then put aside six months ago (so that
69−I could do things that didn't involve writing code). New `%ames` is
70+I could do things that didn't involve writing code). New `%ames` is
70sorely needed, because right now there's a network bug that actually
71sorely needed, because right now there's a network bug that actually
71sinks (permanently disables) ships, and we basically can't debug
72sinks (permanently disables) ships, and we basically can't debug
72anything in the area because we'd be debugging old code.
73anything in the area because we'd be debugging old code.
@@ -74,49 +75,49 @@ anything in the area because we'd be debugging old code.
74People have also expressed some concern about the fact that `%ames` is
75People have also expressed some concern about the fact that `%ames` is
75sending mysterious UDP messages which aren't documented in any way
76sending mysterious UDP messages which aren't documented in any way
76(the whitepaper has some protocol description, but it's still not
77(the whitepaper has some protocol description, but it's still not
77−quite comprehensive. Actually, `%ames` is a pretty clean system overall
78+quite comprehensive. Actually, `%ames` is a pretty clean system overall
78and shouldn't be hard to turn into the kind of literate, stable Hoon
79and shouldn't be hard to turn into the kind of literate, stable Hoon
79−code the future should be made of. But again, documenting obsolete
80+code the future should be made of. But again, documenting obsolete
80code kind of sucks.
81code kind of sucks.
81
82
82Finally, we have an idea (half Anton's, half mine) about how to
83Finally, we have an idea (half Anton's, half mine) about how to
83actually end the unfortunate tradition of continuity breaches, by
84actually end the unfortunate tradition of continuity breaches, by
84providing a "rough start" model which lets you create a working ship
85providing a "rough start" model which lets you create a working ship
85−with just the private key. Needless to say, it would be very exciting
86+with just the private key. Needless to say, it would be very exciting
86to actually stop rebooting the universe, permanently.
87to actually stop rebooting the universe, permanently.
87
88
88So it's a pretty good fit to push the renaming and the new network
89So it's a pretty good fit to push the renaming and the new network
89protocol out into a single Great Inception, which currently seems like
90protocol out into a single Great Inception, which currently seems like
90−it should happen in early August. I certainly can't wait to pick my
91+it should happen in early August. I certainly can't wait to pick my
91−new, permanent Urbit name! But as always, we ship no code before its
92+new, permanent Urbit name! But as always, we ship no code before its
92−time. We will keep you up to date on our progress.
93+time. We will keep you up to date on our progress.
93
94
94## Other near-term goals
95## Other near-term goals
95
96
96−The short-term focus remains self-hosting and onboarding. Ray is
97+The short-term focus remains self-hosting and onboarding. Ray is
97currently working on building a simple message board on top of `tree`,
98currently working on building a simple message board on top of `tree`,
98−so that Urbit can be its own phpBB as well as its own IRC. Persistent
99+so that Urbit can be its own phpBB as well as its own IRC. Persistent
99IRC (ie, `:talk`) is extremely useful, but we need long-form
100IRC (ie, `:talk`) is extremely useful, but we need long-form
100discussion. Reddit is pretty good, but not _quite_ right -- and an
101discussion. Reddit is pretty good, but not _quite_ right -- and an
101ounce of self-hosting is worth a pound of SaaS.
102ounce of self-hosting is worth a pound of SaaS.
102
103
103Basically, we don't intend to work on user-level features that we
104Basically, we don't intend to work on user-level features that we
104−don't use ourselves for quite some time, if not ever. Self-hosting is
105+don't use ourselves for quite some time, if not ever. Self-hosting is
105the path to maturity, always and everywhere.
106the path to maturity, always and everywhere.
106
107
107## Medium-term goals
108## Medium-term goals
108
109
109Our medium-term focus is expanding the attack surface of Urbit as an
110Our medium-term focus is expanding the attack surface of Urbit as an
110−open-source project in every possible way. We want to completely
111+open-source project in every possible way. We want to completely
111dispel the aura of mystery.
112dispel the aura of mystery.
112
113
113There are two general paths toward this: teaching and documentation.
114There are two general paths toward this: teaching and documentation.
114On the teaching front, I think you'll like the new, super-easy Urbit
115On the teaching front, I think you'll like the new, super-easy Urbit
115−learning series I started [here](https://urbit.org/docs/byte). More
116+learning series I started [here](https://urbit.org/docs/byte). More
116Urbytes are forthcoming.
117Urbytes are forthcoming.
117
118
118On the documentation front, Urbit has a large volume of basically
119On the documentation front, Urbit has a large volume of basically
119−undocumented and undescribed code at the Hoon and Arvo levels. This
120+undocumented and undescribed code at the Hoon and Arvo levels. This
120is incredibly shitty from the perspective of an open-source project,
121is incredibly shitty from the perspective of an open-source project,
121especially because neither I nor anyone has the kind of obsessive
122especially because neither I nor anyone has the kind of obsessive
122attachment to random details that you'd expect in an under-documented
123attachment to random details that you'd expect in an under-documented
@@ -128,27 +129,27 @@ attack surface.
128
129
129The right way to solve this, I think, is to "document into existence" --
130The right way to solve this, I think, is to "document into existence" --
130producing design documents from the existing codebase, reviewing these
131producing design documents from the existing codebase, reviewing these
131−designs collectively, then converging the actual code with them. The
132+designs collectively, then converging the actual code with them. The
132−key areas to attack are Arvo itself and the vanes. The first area I
133+key areas to attack are Arvo itself and the vanes. The first area I
133want to do this with is the new `%ames`.
134want to do this with is the new `%ames`.
134
135
135There is an excuse for not having done this already: premature
136There is an excuse for not having done this already: premature
136−documentation is a serious evil. When you're figuring out how a
137+documentation is a serious evil. When you're figuring out how a
137−system should work at all, documenting it is counterproductive. But
138+system should work at all, documenting it is counterproductive. But
138−Urbit is past this point. It needs to settle down and become a
139+Urbit is past this point. It needs to settle down and become a
139grownup.
140grownup.
140
141
141## Contributors
142## Contributors
142
143
143Many thanks to those who have been providing the fantastic stream of
144Many thanks to those who have been providing the fantastic stream of
144−PRs we have been getting. We've had great help on all parts of the
145+PRs we have been getting. We've had great help on all parts of the
145stack, from the front-end to the C interpreter to Arvo vanes.
146stack, from the front-end to the C interpreter to Arvo vanes.
146
147
147−We'd love to help you get involved. Come join us on `:talk`!
148+We'd love to help you get involved. Come join us on `:talk`!
148
149
149## Keep in touch / office hours
150## Keep in touch / office hours
150
151
151−`:talk` is always a great place to come and ask questions. Going
152+`:talk` is always a great place to come and ask questions. Going
152forward someone from Tlon will be available in `:talk` from 12PM - 3PM
153forward someone from Tlon will be available in `:talk` from 12PM - 3PM
153PDT each weekday.
154PDT each weekday.
154
155
content/updates/2016-8-30-update.md+48−47
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2016.8.30 Update"
2title = "~2016.8.30 Update"
3−date = 2016-08-30
3+date = "2016-08-29"
4description = "Here's August's monthly letter from Tlon, only slightly late."
4description = "Here's August's monthly letter from Tlon, only slightly late."
5−aliases = ["/posts/2016-8-30-update/", "/blog/2016.8-update/"]
5+aliases = [ "/posts/2016-8-30-update/", "/blog/2016.8-update/" ]
6+
6[extra]
7[extra]
7author = "Curtis Yarvin"
8author = "Curtis Yarvin"
8ship = "~sorreg-namtyv"
9ship = "~sorreg-namtyv"
@@ -12,8 +13,8 @@ Here's August's monthly letter from Tlon, only slightly late.
12We've been doing a lot of planning and, unfortunately, a little
13We've been doing a lot of planning and, unfortunately, a little
13bit of research.
14bit of research.
14
15
15−We hope we're done with this research stuff. There is really nothing
16+We hope we're done with this research stuff. There is really nothing
16−more unpleasant than CS research. But the protocol and crypto state
17+more unpleasant than CS research. But the protocol and crypto state
17(`%ames` and `%jael`) needed another round of basic architecture.
18(`%ames` and `%jael`) needed another round of basic architecture.
18
19
19## Infrastructure milestones
20## Infrastructure milestones
@@ -22,29 +23,29 @@ By "infrastructure" we roughly mean everything in `/===/arvo,`
22ie, the kernel and vanes.
23ie, the kernel and vanes.
23
24
24Infrastructure development in the presently foreseeable future is
25Infrastructure development in the presently foreseeable future is
25−a system of four milestones, the first of which we've hit. We
26+a system of four milestones, the first of which we've hit. We
26have a reasonably good start on the second:
27have a reasonably good start on the second:
27
28
28−- *FI - First inception*: The first milestone (August 15) was "first inception"
29+- _FI - First inception_: The first milestone (August 15) was "first inception"
29 (FI), where we claimed our true and final urbits.
30 (FI), where we claimed our true and final urbits.
30
31
31−- *CC - Continuity candidate*: The next milestone is a "continuity candidate"
32+- _CC - Continuity candidate_: The next milestone is a "continuity candidate"
32 (CC), a release where it's at least possible that we'll need no further
33 (CC), a release where it's at least possible that we'll need no further
33− continuity breaches and/or reinstalls. CC requires a nontrivial amount of
34+ continuity breaches and/or reinstalls. CC requires a nontrivial amount of
34 further engineering work.
35 further engineering work.
35
36
36−- *FC - Final continuity*: Sometime after that comes "final continuity" (FC),
37+- _FC - Final continuity_: Sometime after that comes "final continuity" (FC),
37− where we explicitly renounce continuity breaches. CC to FC is a testing
38+ where we explicitly renounce continuity breaches. CC to FC is a testing
38 milestone and is satisfied by collective judgment.
39 milestone and is satisfied by collective judgment.
39
40
40−- *SF - Security freeze*: The last milestone is "security freeze" (SF), where we
41+- _SF - Security freeze_: The last milestone is "security freeze" (SF), where we
41 declare the PKI final and issue live keys.
42 declare the PKI final and issue live keys.
42
43
43## FI: first inception
44## FI: first inception
44
45
45The outcome of the FI milestone was a working network, with
46The outcome of the FI milestone was a working network, with
46−multiple federated stars and final `@p` names. (Modulo some
47+multiple federated stars and final `@p` names. (Modulo some
47−justified complaints about the `lut` suffix.) Federation
48+justified complaints about the `lut` suffix.) Federation
48probably means we can invite a lot more people to Urbit and it'll
49probably means we can invite a lot more people to Urbit and it'll
49keep working, but let's still be a little cautious.
50keep working, but let's still be a little cautious.
50
51
@@ -60,14 +61,14 @@ but the documentation is lacking and involves wide gaps, which
60must be filled by reverse engineering or public assistance.
61must be filled by reverse engineering or public assistance.
61Fortunately the Tlon people are reputed to be quite helpful.
62Fortunately the Tlon people are reputed to be quite helpful.
62
63
63−At least one breach is certain. All data in your FI urbits will
64+At least one breach is certain. All data in your FI urbits will
64−be destroyed! In the breach to the CC release, we will port the
65+be destroyed! In the breach to the CC release, we will port the
65address allocation registry (the urbit.org womb) manually to the
66address allocation registry (the urbit.org womb) manually to the
66new network.
67new network.
67
68
68If you have been spawning planets from your stars, you'll need to
69If you have been spawning planets from your stars, you'll need to
69follow our procedures, which we'll post before the next breach.
70follow our procedures, which we'll post before the next breach.
70−Emergency breaches may also happen. We recommend against
71+Emergency breaches may also happen. We recommend against
71spawning at the moment, but of course your star is yours.
72spawning at the moment, but of course your star is yours.
72
73
73Data in FI urbits should also be considered completely insecure.
74Data in FI urbits should also be considered completely insecure.
@@ -77,23 +78,23 @@ not done any real security analysis and network data is used.)
77
78
78## CC/FC: continuity
79## CC/FC: continuity
79
80
80−The CC release at least attempts to maintain continuity. What is
81+The CC release at least attempts to maintain continuity. What is
81continuity?
82continuity?
82
83
83−Continuity is when we stop rebooting the universe. You can leave
84+Continuity is when we stop rebooting the universe. You can leave
84a continuous urbit turned off on a USB key in your attic for 10
85a continuous urbit turned off on a USB key in your attic for 10
85−years. When you activate it on in 2026, it will probably spend
86+years. When you activate it on in 2026, it will probably spend
86several days upgrading itself, but it will work.
87several days upgrading itself, but it will work.
87
88
88−CC is just a candidate. FC is when we actually believe we've
89+CC is just a candidate. FC is when we actually believe we've
89achieved continuity.
90achieved continuity.
90
91
91−Here are some features we've lumped into the CC/FC bag. This
92+Here are some features we've lumped into the CC/FC bag. This
92list may expand, but hopefully won't contract.
93list may expand, but hopefully won't contract.
93
94
94−Urbit is a reliable datastore. For instance, as a developer, you
95+Urbit is a reliable datastore. For instance, as a developer, you
95should edit your source files in the Urbit filesystem `%clay`,
96should edit your source files in the Urbit filesystem `%clay`,
96−then back them up with `git` via a one-way mirror. (Most people
97+then back them up with `git` via a one-way mirror. (Most people
97now edit outside Urbit and copy trees in.) Of course, `%gall`
98now edit outside Urbit and copy trees in.) Of course, `%gall`
98application state you create in a FC urbit can and should also
99application state you create in a FC urbit can and should also
99last forever, via state adapters.
100last forever, via state adapters.
@@ -102,11 +103,11 @@ Urbit has a reliable storage system that can use a cluster log
102like Kafka, does not lose data even on Linux, encrypts the image
103like Kafka, does not lose data even on Linux, encrypts the image
103as well as the log, and allows log pruning.
104as well as the log, and allows log pruning.
104
105
105−Urbit handles all crashes correctly on all platforms. A stack
106+Urbit handles all crashes correctly on all platforms. A stack
106overflow or interrupt always produces a usable trace.
107overflow or interrupt always produces a usable trace.
107
108
108Urbit boots with the proper, beautiful, functional, boot sequence
109Urbit boots with the proper, beautiful, functional, boot sequence
109−defined in the whitepaper. It's single-homed -- designed to
110+defined in the whitepaper. It's single-homed -- designed to
110operate one ship per kernel -- and uses the event security model
111operate one ship per kernel -- and uses the event security model
111from the whitepaper.
112from the whitepaper.
112
113
@@ -116,7 +117,7 @@ and perfect causal consistency over the wire with no head-of-line
116blocking between different ducts.
117blocking between different ducts.
117
118
118Urbit no longer mixes cryptosystem code with networking code.
119Urbit no longer mixes cryptosystem code with networking code.
119−Secret storage moves into a separate `%jael` vane. `%jael` will
120+Secret storage moves into a separate `%jael` vane. `%jael` will
120hold public, private and symmetric Urbit keys, foreign API keys,
121hold public, private and symmetric Urbit keys, foreign API keys,
121tokens, passwords, etc; and other capabilities, like Urbit
122tokens, passwords, etc; and other capabilities, like Urbit
122invitations.
123invitations.
@@ -143,25 +144,25 @@ Urbit handles library versioning properly in `%ford`, never using
143conflicting versions in a dependency graph.
144conflicting versions in a dependency graph.
144
145
145Urbit has a stable, extensible but backward-compatible I/O
146Urbit has a stable, extensible but backward-compatible I/O
146−protocol between Arvo and vere (the Unix process). Any future
147+protocol between Arvo and vere (the Unix process). Any future
147Arvo will work on an old vere.
148Arvo will work on an old vere.
148
149
149Urbit uses Murmur32 rather than FNV as a short hash (mug).
150Urbit uses Murmur32 rather than FNV as a short hash (mug).
150
151
151Urbit is still not a cryptographically secure system, and doesn't
152Urbit is still not a cryptographically secure system, and doesn't
152−allow true cryptographic ownership transfers. The cryptographic
153+allow true cryptographic ownership transfers. The cryptographic
153transfer features exist, but using them is a bad idea until the
154transfer features exist, but using them is a bad idea until the
154keys are final.
155keys are final.
155
156
156(For right now, everyone who issues urbits to others needs to at
157(For right now, everyone who issues urbits to others needs to at
157least track ownership centrally, ideally with a mirror database
158least track ownership centrally, ideally with a mirror database
158−outside Urbit. We could not stress this more stressfully!)
159+outside Urbit. We could not stress this more stressfully!)
159
160
160Urbit has received a thorough performance and scaling audit, and
161Urbit has received a thorough performance and scaling audit, and
161there are no trivial efficiency problems to solve.
162there are no trivial efficiency problems to solve.
162
163
163The Urbit console can output colored text and control a 2D ASCII
164The Urbit console can output colored text and control a 2D ASCII
164−text array (curses style). The web console (not web dojo) works
165+text array (curses style). The web console (not web dojo) works
165with some keylag.
166with some keylag.
166
167
167All Urbit vanes are thoroughly documented/specified with an
168All Urbit vanes are thoroughly documented/specified with an
@@ -179,13 +180,13 @@ cryptographic structure, even if it hasn't been compromised.
179Since it's not secure, we don't know it hasn't been compromised.)
180Since it's not secure, we don't know it hasn't been compromised.)
180
181
181However, the SF release keys will be instantiated via network
182However, the SF release keys will be instantiated via network
182−update, which is essentially "god mode." New keys will be
183+update, which is essentially "god mode." New keys will be
183distributed to old key holders, and any disparities between
184distributed to old key holders, and any disparities between
184cryptographic and centralized ownership records will be resolved
185cryptographic and centralized ownership records will be resolved
185−in favor of the latter. Before SF, no one can gain anything by
186+in favor of the latter. Before SF, no one can gain anything by
186stealing a key or transferring it without authorization.
187stealing a key or transferring it without authorization.
187
188
188−A software update can of course do anything to the PKI. After
189+A software update can of course do anything to the PKI. After
189SF, at least, global Arvo updates (which ideally can become rarer
190SF, at least, global Arvo updates (which ideally can become rarer
190and rarer) will need to be approved through a constitutional,
191and rarer) will need to be approved through a constitutional,
191republican governance process.
192republican governance process.
@@ -198,21 +199,21 @@ minimize velocity and keep Urbit from acting as a currency.
198The SF release needs to run the actual Arvo interpreter, with
199The SF release needs to run the actual Arvo interpreter, with
199jets, in a completely sandboxed subprocess with no I/O privilege.
200jets, in a completely sandboxed subprocess with no I/O privilege.
200Sandboxing jets, or even a safe jet language, should also be
201Sandboxing jets, or even a safe jet language, should also be
201−investigated. Network jet update must also be possible.
202+investigated. Network jet update must also be possible.
202
203
203An SF urbit can issue and manage children without any problem.
204An SF urbit can issue and manage children without any problem.
204−It can be hosted easily in a commercial data centre. The
205+It can be hosted easily in a commercial data centre. The
205interpreter can migrate images securely, automatically and
206interpreter can migrate images securely, automatically and
206efficiently to a different hosting service.
207efficiently to a different hosting service.
207
208
208An SF urbit will have a framework for DoS defence, blocking and
209An SF urbit will have a framework for DoS defence, blocking and
209−banning, and other nuisances of the modern world. There will be
210+banning, and other nuisances of the modern world. There will be
210at least the beginning of a global reputation system.
211at least the beginning of a global reputation system.
211
212
212## CC: work overview
213## CC: work overview
213
214
214The one subsystem that needs a complete rewrite is `%ames` (the
215The one subsystem that needs a complete rewrite is `%ames` (the
215−network). The `%jael` vane is completely new. Fortunately, the
216+network). The `%jael` vane is completely new. Fortunately, the
216new `%ames` vane compiles, and the `%jael` interface is defined
217new `%ames` vane compiles, and the `%jael` interface is defined
217(and not that `%jael` can be complicated).
218(and not that `%jael` can be complicated).
218
219
@@ -221,7 +222,7 @@ The mug replacement work is also done, but needs to be debugged
221
222
222Applying the canonical boot event system sounds like a giant
223Applying the canonical boot event system sounds like a giant
223change, but it's actually pretty straightforward -- same for
224change, but it's actually pretty straightforward -- same for
224−single-homing. Arvo proper is only a few hundred lines of Hoon.
225+single-homing. Arvo proper is only a few hundred lines of Hoon.
225
226
226The event system in `vere` needs to be replaced, but we have a
227The event system in `vere` needs to be replaced, but we have a
227module built by a contractor with both the local FS and Kafka.
228module built by a contractor with both the local FS and Kafka.
@@ -233,32 +234,32 @@ any other vane.
233## Community involvement
234## Community involvement
234
235
235Urbit's most serious problem right now is that many more people
236Urbit's most serious problem right now is that many more people
236−are interested in it than are actually working on it. This
237+are interested in it than are actually working on it. This
237reflects its heritage as a basement project.
238reflects its heritage as a basement project.
238
239
239Our most important work item remains opening up the codebase so
240Our most important work item remains opening up the codebase so
240−that community development can happen. We'll start turning the
241+that community development can happen. We'll start turning the
241CC tasks into community operations as fast as possible.
242CC tasks into community operations as fast as possible.
242
243
243−But this is a separate topic. It fits under a discussion of
244+But this is a separate topic. It fits under a discussion of
244Tlon's corporate plans and operations, which we'll post later.
245Tlon's corporate plans and operations, which we'll post later.
245
246
246## Contributors
247## Contributors
247
248
248−The contributors have been amazing. We need to make more use of
249+The contributors have been amazing. We need to make more use of
249−their talents, which are growing daily. And we need to do a
250+their talents, which are growing daily. And we need to do a
250−better job of chronicling their deeds! But for now, github
251+better job of chronicling their deeds! But for now, github
251remembers.
252remembers.
252
253
253## Keep in touch / office hours
254## Keep in touch / office hours
254
255
255−`:talk` is always a great place to come and ask questions. Going
256+`:talk` is always a great place to come and ask questions. Going
256forward someone from Tlon will be available in `:talk` from 12PM - 3PM
257forward someone from Tlon will be available in `:talk` from 12PM - 3PM
257PDT each weekday.
258PDT each weekday.
258
259
259−Post to our [new forum](https://urbit.org/fora)! Especially [this
260+Post to our [new forum](https://urbit.org/fora)! Especially [this
260thread](https://urbit.org/fora/posts/~2016.8.30..18.05.18..8ba3~/) to
261thread](https://urbit.org/fora/posts/~2016.8.30..18.05.18..8ba3~/) to
261−discuss this very post. Don't be afraid, the water's fine! Actually there
262+discuss this very post. Don't be afraid, the water's fine! Actually there
262are a few glitches, but it's hosted on Urbit (and also backed up).
263are a few glitches, but it's hosted on Urbit (and also backed up).
263For the less daring, [r/urbit](https://www.reddit.com/r/urbit) is a
264For the less daring, [r/urbit](https://www.reddit.com/r/urbit) is a
264reliable old standby.
265reliable old standby.
content/updates/2017-1-30-update.md+124−123
@@ -1,21 +1,22 @@
1+++
1+++
2title = "~2017.1.30 Update"
2title = "~2017.1.30 Update"
3−date = 2017-01-30
3+date = "2017-01-29"
4description = "In 2017, we're ready to start making the damn thing useful."
4description = "In 2017, we're ready to start making the damn thing useful."
5−aliases = ["/posts/2017-1-30-update/", "/blog/2017.1-update/"]
5+aliases = [ "/posts/2017-1-30-update/", "/blog/2017.1-update/" ]
6+
6[extra]
7[extra]
7author = "Curtis Yarvin + Galen Wolfe-Pauly"
8author = "Curtis Yarvin + Galen Wolfe-Pauly"
8ship = "~sorreg-namtyv + ~ravmel-ropdyl"
9ship = "~sorreg-namtyv + ~ravmel-ropdyl"
9+++
10+++
10
11
11−> TLDR: a real Urbit is an Urbit that does real work. This means nontrivial
12+> TLDR: a real Urbit is an Urbit that does real work. This means nontrivial
12− progress in two areas: systems maturity and user experience. In 2H 2016 we
13+> progress in two areas: systems maturity and user experience. In 2H 2016 we
13− cleaned out most of the worst holes in Arvo and vere, and totally reconceived the
14+> cleaned out most of the worst holes in Arvo and vere, and totally reconceived the
14− user experience. The new Urbit feels like an MVP and we can't wait to ship it.
15+> user experience. The new Urbit feels like an MVP and we can't wait to ship it.
15
16
16−In 2013 Urbit was intriguing. By 2015 it had become interesting. In 2016 it was
17+In 2013 Urbit was intriguing. By 2015 it had become interesting. In 2016 it was
17−actually exciting (if not always in a good way!). In 2017, we're actually
18+actually exciting (if not always in a good way!). In 2017, we're actually
18−planning to make the darn thing useful. (For certain values of the word "useful.")
19+planning to make the darn thing useful. (For certain values of the word "useful.")
19
20
20Our `cc-release` stability upgrade (mainly affecting the OS layer `arvo` and the
21Our `cc-release` stability upgrade (mainly affecting the OS layer `arvo` and the
21interpreter `vere`) is roughly code-complete and being tested into existence.
22interpreter `vere`) is roughly code-complete and being tested into existence.
@@ -23,13 +24,13 @@ Once it exists and is stable, it can actually be documented -- often, for the
23first time.
24first time.
24
25
25And `cc-release` is our first release really designed so that neither your ship,
26And `cc-release` is our first release really designed so that neither your ship,
26−nor the whole network, can actually sink. The Urbit network had zero unplanned,
27+nor the whole network, can actually sink. The Urbit network had zero unplanned,
27−and one planned, breach (network flag day) in 2H 2016. The last planned breach,
28+and one planned, breach (network flag day) in 2H 2016. The last planned breach,
28the `cc-release` update, is planned for 1H 2017.
29the `cc-release` update, is planned for 1H 2017.
29
30
30With the infrastructure converging, we can finally think seriously about the user
31With the infrastructure converging, we can finally think seriously about the user
31−experience of Urbit. What we're imagining is a small-scale social network and
32+experience of Urbit. What we're imagining is a small-scale social network and
32−command-line API aggregator. It's just screenshots right now, but we're confident
33+command-line API aggregator. It's just screenshots right now, but we're confident
33that we can build it and make it work.
34that we can build it and make it work.
34
35
35System software is boring (at least when done right). So let's start with the user
36System software is boring (at least when done right). So let's start with the user
@@ -37,113 +38,113 @@ experience.
37
38
38## Design
39## Design
39
40
40−Galen Wolfe-Pauly is Tlon's CEO and Urbit's interaction designer. Galen went to
41+Galen Wolfe-Pauly is Tlon's CEO and Urbit's interaction designer. Galen went to
41−architecture school. He talks like it. We recorded him secretly and came away
42+architecture school. He talks like it. We recorded him secretly and came away
42with these notes:
43with these notes:
43
44
44![](https://media.urbit.org/site/sketch-1.png)
45![](https://media.urbit.org/site/sketch-1.png)
45
46
46−- _UX_? As a kid it was just _design_ or maybe _web design_. At some point I
47+- _UX_? As a kid it was just _design_ or maybe _web design_. At some point I
47− remember people talking about _user interface_ or _UI_. But I truly don't
48+ remember people talking about _user interface_ or _UI_. But I truly don't
48− understand where the _X_ came from. It's like Monster Energy got involved in
49+ understand where the _X_ came from. It's like Monster Energy got involved in
49 the branding.
50 the branding.
50
51
51- An _experience_ sounds like the kind of thing that's going to be littered
52- An _experience_ sounds like the kind of thing that's going to be littered
52− with ads, or is going to manipulate me in some way. Something I passively
53+ with ads, or is going to manipulate me in some way. Something I passively
53− consume. Not something I actively control. So I prefer _interface_ to
54+ consume. Not something I actively control. So I prefer _interface_ to
54 _experience_, and I think you should too.
55 _experience_, and I think you should too.
55
56
56![](https://media.urbit.org/site/sketch-2.png)
57![](https://media.urbit.org/site/sketch-2.png)
57
58
58−- Urbit has to be just as usable as any widely used app in 2017. For a personal
59+- Urbit has to be just as usable as any widely used app in 2017. For a personal
59− server, the usability bar can't be Unix. A Unix server is an industrial tool.
60+ server, the usability bar can't be Unix. A Unix server is an industrial tool.
60− An industrial tool can't be a consumer product. You can attach a blade to the
61+ An industrial tool can't be a consumer product. You can attach a blade to the
61 end of a drill and use it as a blender, but it's not a Vitamix.
62 end of a drill and use it as a blender, but it's not a Vitamix.
62
63
63−- What is an app, anyway? It's _shared computing_. Everyone's data is one data
64+- What is an app, anyway? It's _shared computing_. Everyone's data is one data
64 structure, in one program, on one server, owned by one corporation. With _one_
65 structure, in one program, on one server, owned by one corporation. With _one_
65 UI for everyone to do _one_ thing.
66 UI for everyone to do _one_ thing.
66
67
67−- But there isn't one big corporation that writes _all_ the code. Everyone's
68+- But there isn't one big corporation that writes _all_ the code. Everyone's
68− lives are spread across a bunch of different apps. Every app solves the
69+ lives are spread across a bunch of different apps. Every app solves the
69 ownership problem separately.
70 ownership problem separately.
70
71
71- So the whole user experience of using Web apps involves tracking all these
72- So the whole user experience of using Web apps involves tracking all these
72 silly little accounts, learning each and every user experience, and glaring
73 silly little accounts, learning each and every user experience, and glaring
73 helplessly at each little piece of data trapped in a different silo.
74 helplessly at each little piece of data trapped in a different silo.
74
75
75−- Even your Google account doesn't feel like one thing. Whatever your Google
76+- Even your Google account doesn't feel like one thing. Whatever your Google
76− Docs are, it's not a bunch of document files on your Google Drive. All the
77+ Docs are, it's not a bunch of document files on your Google Drive. All the
77 resources of Google can't make their Borg backend feel like one computer which
78 resources of Google can't make their Borg backend feel like one computer which
78 belongs to you.
79 belongs to you.
79
80
80- The phrase 'general-purpose computing' sounds scary, but it shouldn't be.
81- The phrase 'general-purpose computing' sounds scary, but it shouldn't be.
81− 'Computing' doesn't mean writing code. We're computing when we browse
82+ 'Computing' doesn't mean writing code. We're computing when we browse
82 Facebook or talk to Alexa.
83 Facebook or talk to Alexa.
83
84
84- Your personal server will be solving the same problems today's whole ecosystem
85- Your personal server will be solving the same problems today's whole ecosystem
85 of network apps solves, just all in one place that belongs to you.
86 of network apps solves, just all in one place that belongs to you.
86
87
87- The closest thing to a general-purpose personal server today is probably the
88- The closest thing to a general-purpose personal server today is probably the
88− Chinese service WeChat. If you don't know much about WeChat, you should
89+ Chinese service WeChat. If you don't know much about WeChat, you should
89 really watch [this NYT video](https://www.nytimes.com/video/technology/100000004574648/china-internet-wechat.html).
90 really watch [this NYT video](https://www.nytimes.com/video/technology/100000004574648/china-internet-wechat.html).
90
91
91−- From a distance WeChat is great. Everyone in China loves the one-app,
92+- From a distance WeChat is great. Everyone in China loves the one-app,
92− one-identity, all-my-own-stuff user experience. It's clearly better than
93+ one-identity, all-my-own-stuff user experience. It's clearly better than
93 being forced to switch apps constantly.
94 being forced to switch apps constantly.
94
95
95−- But WeChat is just another giant shared-computing service. It's made out of
96+- But WeChat is just another giant shared-computing service. It's made out of
96− the usual 2010s server stack mess. The visual and interaction design looks
97+ the usual 2010s server stack mess. The visual and interaction design looks
97− pretty dated. WeChat tells us that users want one experience, but not much more than that.
98+ pretty dated. WeChat tells us that users want one experience, but not much more than that.
98
99
99![](https://media.urbit.org/site/sketch-3.png)
100![](https://media.urbit.org/site/sketch-3.png)
100
101
101- To paraphrase Walter Sobchak: say what you want about the tenets of shared
102- To paraphrase Walter Sobchak: say what you want about the tenets of shared
102− computing, but at least it's an ethos. We know how to build very good
103+ computing, but at least it's an ethos. We know how to build very good
103− special-purpose user experiences. What's the conventional UI for a
104+ special-purpose user experiences. What's the conventional UI for a
104− general-purpose personal server? It doesn't exist.
105+ general-purpose personal server? It doesn't exist.
105
106
106−- For most users, your urbit runs in a data center (like a web app). You log
107+- For most users, your urbit runs in a data center (like a web app). You log
107− into it with your browser (like a web app). Other than that, where do you
108+ into it with your browser (like a web app). Other than that, where do you
108− even start? A `bash` prompt isn't what we're looking for.
109+ even start? A `bash` prompt isn't what we're looking for.
109
110
110−- But wait, is the idea of a command line bad UI? Or is the Unix command line
111+- But wait, is the idea of a command line bad UI? Or is the Unix command line
111− just bad UI? We know ordinary people can use command lines. They use
112+ just bad UI? We know ordinary people can use command lines. They use
112− chatbots. Long ago, they used MS-DOS.
113+ chatbots. Long ago, they used MS-DOS.
113
114
114- Today's computing user experiences, the PC and its mobile cousin, rejected the
115- Today's computing user experiences, the PC and its mobile cousin, rejected the
115− command line. This made computing easy enough, at the cost of hiding much of
116+ command line. This made computing easy enough, at the cost of hiding much of
116 its creative power.
117 its creative power.
117
118
118- The power of a general-purpose server which can command not only local
119- The power of a general-purpose server which can command not only local
119− applications, but also network services, is at a whole new level. We don't
120+ applications, but also network services, is at a whole new level. We don't
120 think any visual metaphor or 2D control panel can do it justice.
121 think any visual metaphor or 2D control panel can do it justice.
121
122
122- We need to bring the full power of the machine to the user, without breaking
123- We need to bring the full power of the machine to the user, without breaking
123− their trust that the machine is on their side. We can't let the user get lost
124+ their trust that the machine is on their side. We can't let the user get lost
124− or break the system. It has to feel safe and simple to explore its furthest
125+ or break the system. It has to feel safe and simple to explore its furthest
125 reaches.
126 reaches.
126
127
127![](https://media.urbit.org/site/sketch-4.png)
128![](https://media.urbit.org/site/sketch-4.png)
128
129
129- As Neal Stephenson [tells us](http://cristal.inria.fr/~weis/info/commandline.html),
130- As Neal Stephenson [tells us](http://cristal.inria.fr/~weis/info/commandline.html),
130− the command line is the natural UI for any computer. It's especially the
131+ the command line is the natural UI for any computer. It's especially the
131− natural UI for a _network_ computer, like a personal server. A command line
132+ natural UI for a _network_ computer, like a personal server. A command line
132− scales way better than a GUI to a large selection of actions. And a network
133+ scales way better than a GUI to a large selection of actions. And a network
133 computer can do almost infinitely many things.
134 computer can do almost infinitely many things.
134
135
135- When we've tried to put a simplified "for dummies" GUI on top of Urbit, it's
136- When we've tried to put a simplified "for dummies" GUI on top of Urbit, it's
136− just awful. It's like a bad Linux desktop GUI. You feel instantly that
137+ just awful. It's like a bad Linux desktop GUI. You feel instantly that
137 you've got a choice between something limited and lame, and something
138 you've got a choice between something limited and lame, and something
138− mysterious and scary. So we threw those designs out, in search of something
139+ mysterious and scary. So we threw those designs out, in search of something
139 better.
140 better.
140
141
141- The true command line is generally thought of as something mysterious and
142- The true command line is generally thought of as something mysterious and
142− scary. Somewhere that you can do things to irreparably damage your computer.
143+ scary. Somewhere that you can do things to irreparably damage your computer.
143 It's powerful, but also dangerous.
144 It's powerful, but also dangerous.
144
145
145−- This tradeoff — between control and safety — is false. The unfriendly command
146+- This tradeoff — between control and safety — is false. The unfriendly command
146− line is actually just another artifact of 70s computing. The UI of the
147+ line is actually just another artifact of 70s computing. The UI of the
147 command line is designed for a programmer, not an ordinary person.
148 command line is designed for a programmer, not an ordinary person.
148
149
149- `bash` is a bad UI because there's no easy way to control its power, or learn
150- `bash` is a bad UI because there's no easy way to control its power, or learn
@@ -151,80 +152,80 @@ with these notes:
151 its power to do safe ones.
152 its power to do safe ones.
152
153
153- At the other end of the spectrum is the chatbot, which is a bad UI because
154- At the other end of the spectrum is the chatbot, which is a bad UI because
154− it's hard to make it much more than a toy. Like so many innovations, chatbots
155+ it's hard to make it much more than a toy. Like so many innovations, chatbots
155− happened by accident. It's just a way to connect an input string to network
156+ happened by accident. It's just a way to connect an input string to network
156− services. But the natural-language metaphor of "chat" is confining. It
157+ services. But the natural-language metaphor of "chat" is confining. It
157 doesn't scale well to any problem that isn't trivial.
158 doesn't scale well to any problem that isn't trivial.
158
159
159−- What does a great command line look like? It should have a strict syntax, not
160+- What does a great command line look like? It should have a strict syntax, not
160− try to guess what you mean. But it can't be a constant test of your ability
161+ try to guess what you mean. But it can't be a constant test of your ability
161 to memorize the phonebook.
162 to memorize the phonebook.
162
163
163![](https://media.urbit.org/site/sketch-6.png)
164![](https://media.urbit.org/site/sketch-6.png)
164
165
165−- Urbit already has the beginnings of a great command line. We parse your input
166+- Urbit already has the beginnings of a great command line. We parse your input
166− with an actual grammar and catch errors as you type. You can't even press
167+ with an actual grammar and catch errors as you type. You can't even press
167 return on an invalid command.
168 return on an invalid command.
168
169
169−- What's missing is help. A great command line needs to reach out and hug you
170+- What's missing is help. A great command line needs to reach out and hug you
170− in every way it can. It needs to assume you don't know anything at all about
171+ in every way it can. It needs to assume you don't know anything at all about
171− the system. It's there for you to solve your problems, but also to help you explore.
172+ the system. It's there for you to solve your problems, but also to help you explore.
172
173
173- There's actually one exotic Unix shell that does it right:
174- There's actually one exotic Unix shell that does it right:
174− [`fish`](https://en.wikipedia.org/wiki/Friendly_interactive_shell). `fish`
175+ [`fish`](https://en.wikipedia.org/wiki/Friendly_interactive_shell). `fish`
175 jumps through some pretty amazing hoops, like parsing manpages, to give you
176 jumps through some pretty amazing hoops, like parsing manpages, to give you
176 context and completion.
177 context and completion.
177
178
178- It's a lot easier for Urbit because we're designing the system from scratch.
179- It's a lot easier for Urbit because we're designing the system from scratch.
179 From a technical standpoint, all we have to do is add contextual help to our
180 From a technical standpoint, all we have to do is add contextual help to our
180− existing parser framework. An extended rule can parse a string, or tell the
181+ existing parser framework. An extended rule can parse a string, or tell the
181− user what it wants to parse. In simple terms: we have to make the `:dojo`
182+ user what it wants to parse. In simple terms: we have to make the `:dojo`
182 (our shell) much friendlier.
183 (our shell) much friendlier.
183
184
184- The `:dojo` shell is built around the concept of a _generator_, a program that
185- The `:dojo` shell is built around the concept of a _generator_, a program that
185− builds a noun. The idea is that how you build the noun is orthogonal to what
186+ builds a noun. The idea is that how you build the noun is orthogonal to what
186− you do with it. You could print it, send it as a command, etc. There are
187+ you do with it. You could print it, send it as a command, etc. There are
187 several kinds of generators -- simple scripts, prompting dialogs, HTTP
188 several kinds of generators -- simple scripts, prompting dialogs, HTTP
188 scrapers, etc.
189 scrapers, etc.
189
190
190- A generator is initialized with command-line arguments and options, in the
191- A generator is initialized with command-line arguments and options, in the
191− classic Unix style (except typed). In the classic Unix style, Urbit at
192+ classic Unix style (except typed). In the classic Unix style, Urbit at
192− present provides no help at all in constructing a command line. You just have
193+ present provides no help at all in constructing a command line. You just have
193 to know.
194 to know.
194
195
195−- How should it actually work? Let's say you're trying to put Urbit in control
196+- How should it actually work? Let's say you're trying to put Urbit in control
196− of your Twitter feed. That means you're creating a Twitter gateway on Urbit,
197+ of your Twitter feed. That means you're creating a Twitter gateway on Urbit,
197 which you can control with a `|twitter` command.
198 which you can control with a `|twitter` command.
198
199
199- Before you type a character, Urbit offers you `|` (any command with side
200- Before you type a character, Urbit offers you `|` (any command with side
200− effects). (You could also add a `!` prefix, which is like `sudo` -- it lets
201+ effects). (You could also add a `!` prefix, which is like `sudo` -- it lets
201− you do something dangerous.) Once you type `|`, you can page through a list
202+ you do something dangerous.) Once you type `|`, you can page through a list
202− of commands. Once you type `|t`, that list is much shorter. Once it can tab
203+ of commands. Once you type `|t`, that list is much shorter. Once it can tab
203 complete to `|twitter`, it prompts you with that.
204 complete to `|twitter`, it prompts you with that.
204
205
205- And once you get to `|twitter`, you're in a "meta-generator" that's helping
206- And once you get to `|twitter`, you're in a "meta-generator" that's helping
206− you build the correct command line. At least in a browser, you'll be stepping
207+ you build the correct command line. At least in a browser, you'll be stepping
207− through a form with rich entry. But the command line will show you the text
208+ through a form with rich entry. But the command line will show you the text
208 of the command you're building, so next time you can just type it.
209 of the command you're building, so next time you can just type it.
209
210
210−- Building a command is just a case of data entry. In a command-line world,
211+- Building a command is just a case of data entry. In a command-line world,
211− data entry is always serial. You answer questions serially, one at a time.
212+ data entry is always serial. You answer questions serially, one at a time.
212 The only navigation is forward and back.
213 The only navigation is forward and back.
213
214
214- A great Urbit console also has to be accessible both from a browser and a Unix
215- A great Urbit console also has to be accessible both from a browser and a Unix
215− terminal. That means a prompt needs to tell the console if it could be a
216+ terminal. That means a prompt needs to tell the console if it could be a
216− radio button, even though a terminal can't have a radio button. We'll improve
217+ radio button, even though a terminal can't have a radio button. We'll improve
217 the interactivity of our terminal a little, but we're not rewriting Lynx.
218 the interactivity of our terminal a little, but we're not rewriting Lynx.
218
219
219−- So, what do you do with this fancy command line? Command everything -- from
220+- So, what do you do with this fancy command line? Command everything -- from
220− your urbit to the world. Installing an app is a command. Publishing a tweet
221+ your urbit to the world. Installing an app is a command. Publishing a tweet
221− is a command. Paying someone in bitcoin is a command.
222+ is a command. Paying someone in bitcoin is a command.
222
223
223−- Your urbit can show you all the things you can do, and help you do them. If
224+- Your urbit can show you all the things you can do, and help you do them. If
224 there's something you'd like it to do, build it!
225 there's something you'd like it to do, build it!
225
226
226−- A great command line alone is not all that Urbit needs. But it feels like the
227+- A great command line alone is not all that Urbit needs. But it feels like the
227− right central paradigm for interacting with your Urbit. We'll get into the
228+ right central paradigm for interacting with your Urbit. We'll get into the
228 specifics in a future post.
229 specifics in a future post.
229
230
230![](https://media.urbit.org/site/sketch-5.png)
231![](https://media.urbit.org/site/sketch-5.png)
@@ -234,61 +235,61 @@ with these notes:
234We dragged Curtis, whose hide has turned completely white like a cave fish, from
235We dragged Curtis, whose hide has turned completely white like a cave fish, from
235his coding hole to stammer out this update:
236his coding hole to stammer out this update:
236
237
237−We're actually doing pretty well on the infar. Despite there being all kinds of
238+We're actually doing pretty well on the infar. Despite there being all kinds of
238unacceptably broken things about Urbit 2016, the network has actually stayed up
239unacceptably broken things about Urbit 2016, the network has actually stayed up
239since August, and we haven't had an unintentional continuity breach since June.
240since August, and we haven't had an unintentional continuity breach since June.
240
241
241−Of course, it helps that we don't ask anyone to _use_ Urbit in earnest. And ships
242+Of course, it helps that we don't ask anyone to _use_ Urbit in earnest. And ships
242−still do sink. Since an urbit is an identity, sinking your planet is a horrendous
243+still do sink. Since an urbit is an identity, sinking your planet is a horrendous
243−experience. You'll never bond with your second planet the way you did with your
244+experience. You'll never bond with your second planet the way you did with your
244first -- never mind any _data_ you may have lost.
245first -- never mind any _data_ you may have lost.
245
246
246−Our upcoming `cc-release` is the last planned breaching release. With certain
247+Our upcoming `cc-release` is the last planned breaching release. With certain
247exceptions discussed below, all major parts are now (January 2017) code complete
248exceptions discussed below, all major parts are now (January 2017) code complete
248or better.
249or better.
249
250
250This includes the rewritten network stack (`%ames`), code complete but untested;
251This includes the rewritten network stack (`%ames`), code complete but untested;
251the new secret vault and promise tracker (`%jael`), mostly tested; and the new
252the new secret vault and promise tracker (`%jael`), mostly tested; and the new
252`u3_pier` event execution framework, with worker processes and real two-phase
253`u3_pier` event execution framework, with worker processes and real two-phase
253−commit, smoke-tested. We've also completely restructured `hoon.hoon` and
254+commit, smoke-tested. We've also completely restructured `hoon.hoon` and
254`zuse.hoon`, which now are at least cosmetically acceptable.
255`zuse.hoon`, which now are at least cosmetically acceptable.
255
256
256This is not to say that the `cc-release` Urbit won't in many ways embarrass us as
257This is not to say that the `cc-release` Urbit won't in many ways embarrass us as
257−engineers. It will. But your ships won't randomly sink, your secrets won't
258+engineers. It will. But your ships won't randomly sink, your secrets won't
258−randomly leak, and your datas won't randomly rot. Or if they do, it's an
259+randomly leak, and your datas won't randomly rot. Or if they do, it's an
259implementation bug, not a design flaw.
260implementation bug, not a design flaw.
260
261
261−There are still a few cracks we need to fill in. The main one: some top-level
262+There are still a few cracks we need to fill in. The main one: some top-level
262−adjustments to the Arvo event system. The boot sequence now executes correctly,
263+adjustments to the Arvo event system. The boot sequence now executes correctly,
263but the actual boot events need to be totally refactored, as does the rather
264but the actual boot events need to be totally refactored, as does the rather
264−critical Unix-Arvo interface. The long-promised security mask and voltage flags
265+critical Unix-Arvo interface. The long-promised security mask and voltage flags
265−need to be added, and vanes adjusted to use them. Causal tracking of execution
266+need to be added, and vanes adjusted to use them. Causal tracking of execution
266−crashes needs to actually work. At the user level, `:talk` needs to be split into
267+crashes needs to actually work. At the user level, `:talk` needs to be split into
267a user agent and a daemon, and the user-level `%kiln`, the "systemd of Urbit,"
268a user agent and a daemon, and the user-level `%kiln`, the "systemd of Urbit,"
268needs a rethink to make upgrade logic state-triggered, not edge-triggered.
269needs a rethink to make upgrade logic state-triggered, not edge-triggered.
269
270
270−The console and the dojo need some work to make our user experience real. One way
271+The console and the dojo need some work to make our user experience real. One way
271to view a high-usability command line is that a command, if you don't have the
272to view a high-usability command line is that a command, if you don't have the
272esoteric knowledge to fill it in by just typing the syntax, is essentially a
273esoteric knowledge to fill it in by just typing the syntax, is essentially a
273−form. This form needs to work both in the browser and the terminal, which isn't
274+form. This form needs to work both in the browser and the terminal, which isn't
274−trivial. Browser and terminal both need a simple multiscreen navigation model,
275+trivial. Browser and terminal both need a simple multiscreen navigation model,
275which we don't have yet.
276which we don't have yet.
276
277
277There's also a bunch of Unix-level work to do, mainly in converting the old
278There's also a bunch of Unix-level work to do, mainly in converting the old
278−"single-player mode" console-bound Urbit into a real system service. Urbit works
279+"single-player mode" console-bound Urbit into a real system service. Urbit works
279better as a daemon which runs one or more worker processes, and talks to client
280better as a daemon which runs one or more worker processes, and talks to client
280−consoles over a Unix socket. A real architecture actually makes it practical for
281+consoles over a Unix socket. A real architecture actually makes it practical for
281star owners to host the planets they issue, for example.
282star owners to host the planets they issue, for example.
282
283
283Finally, because we never forget the wisdom of the sages, our last act before
284Finally, because we never forget the wisdom of the sages, our last act before
284−asking people to use Urbit will be the long awaited performance crusade. The new
285+asking people to use Urbit will be the long awaited performance crusade. The new
285event system now at least releases outgoing events before the input queue is
286event system now at least releases outgoing events before the input queue is
286−clear! You never know what optimization will achieve before you make a serious
287+clear! You never know what optimization will achieve before you make a serious
287effort, but I don't see any reason we can't carve out a new empire of speed in the
288effort, but I don't see any reason we can't carve out a new empire of speed in the
288savage, uncharted east.
289savage, uncharted east.
289
290
290−We haven't touched the documentation since the first half of 2016. As always,
291+We haven't touched the documentation since the first half of 2016. As always,
291−maturity has to come before documentation. Premature documentation is almost as
292+maturity has to come before documentation. Premature documentation is almost as
292dangerous as premature optimization.
293dangerous as premature optimization.
293
294
294## Notable contributions
295## Notable contributions
@@ -300,45 +301,45 @@ Some notable contributions of late:
300- `~master-morzod` reworked the console in both the Hoon and C layers, adding color and cleaning up a bunch of stuff.
301- `~master-morzod` reworked the console in both the Hoon and C layers, adding color and cleaning up a bunch of stuff.
301
302
302Anyone who contributes at this point deserves extreme praise for the ability to
303Anyone who contributes at this point deserves extreme praise for the ability to
303−work in an immature, often broken system. We look forward to being ready for
304+work in an immature, often broken system. We look forward to being ready for
304normal programmers who aren't intrepid jungle explorers.
305normal programmers who aren't intrepid jungle explorers.
305
306
306## Next crowdsale
307## Next crowdsale
307
308
308−We'll do another crowdsale in the spring. We understand that the last sale left a
309+We'll do another crowdsale in the spring. We understand that the last sale left a
309lot of people unable to participate — and our first priority is making sure those
310lot of people unable to participate — and our first priority is making sure those
310−who are excited about Urbit can own some real estate. We'll announce our plans on
311+who are excited about Urbit can own some real estate. We'll announce our plans on
311−how this might happen soon. If you're interested, make sure you're on our mailing
312+how this might happen soon. If you're interested, make sure you're on our mailing
312list.
313list.
313
314
314## Contribution prizes
315## Contribution prizes
315
316
316We're still thinking about the right way to award Urbit real estate to outside
317We're still thinking about the right way to award Urbit real estate to outside
317−contributors. Especially after the crowdsale, it really has to feel 100% fair.
318+contributors. Especially after the crowdsale, it really has to feel 100% fair.
318But it can't be in any way, whether legally or emotionally, a form of compensation.
319But it can't be in any way, whether legally or emotionally, a form of compensation.
319We can't afford to kill the fun.
320We can't afford to kill the fun.
320
321
321It doesn't feel right to do this at all when the documentation is completely
322It doesn't feel right to do this at all when the documentation is completely
322inadequate, because it's not fair to people who don't have the time to reverse
323inadequate, because it's not fair to people who don't have the time to reverse
323−engineer. But we're thinking hard about this issue.
324+engineer. But we're thinking hard about this issue.
324
325
325## Future updates
326## Future updates
326
327
327−We know you love these opinionated, literary state-of-the-urbit updates. We love
328+We know you love these opinionated, literary state-of-the-urbit updates. We love
328−writing them. But we obsess over them too long and they take too long to write.
329+writing them. But we obsess over them too long and they take too long to write.
329Urbit's ultimate success depends almost entirely on the code.
330Urbit's ultimate success depends almost entirely on the code.
330
331
331Going forward we're going to switch to commit-message style updates on a monthly
332Going forward we're going to switch to commit-message style updates on a monthly
332−basis, with longer updates arriving sporadically. Maker DAO does a great job of
333+basis, with longer updates arriving sporadically. Maker DAO does a great job of
333these shorter updates
334these shorter updates
334([here](https://blog.makerdao.com/2016/12/14/maker-update-925/) is an example).
335([here](https://blog.makerdao.com/2016/12/14/maker-update-925/) is an example).
335
336
336If you're ever curious to check in or hear what's going on, don't hesitate to get
337If you're ever curious to check in or hear what's going on, don't hesitate to get
337−in touch. You can always chat with us on
338+in touch. You can always chat with us on
338[urbit.org/stream](https://urbit.org/stream), or by booting your own Urbit.
339[urbit.org/stream](https://urbit.org/stream), or by booting your own Urbit.
339[Twitter](https://twitter.com/urbit) or email
340[Twitter](https://twitter.com/urbit) or email
340([urbit@urbit.org](mailto:urbit@urbit.org)) are also perfectly fine.
341([urbit@urbit.org](mailto:urbit@urbit.org)) are also perfectly fine.
341
342
342−There's also [our forum](https://urbit.org/fora/) that anyone can post to. We've
343+There's also [our forum](https://urbit.org/fora/) that anyone can post to. We've
343created [this thread](http://urbit.org/fora/posts/~2017.2.1..22.36.47..9f54~/) to
344created [this thread](http://urbit.org/fora/posts/~2017.2.1..22.36.47..9f54~/) to
344discuss this post.
345discuss this post.
content/updates/2017-10-7-update.md+3−2
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2017.10.17 Update"
2title = "~2017.10.17 Update"
3−date = 2017-10-17
3+date = "2017-10-16"
4description = "A short update from the Tlon team for the week of ~2017.10.17."
4description = "A short update from the Tlon team for the week of ~2017.10.17."
5−aliases = ["/posts/2017-10-17-update/"]
5+aliases = [ "/posts/2017-10-17-update/" ]
6+
6[extra]
7[extra]
7author = ""
8author = ""
8ship = "tonlur-sarret"
9ship = "tonlur-sarret"
content/updates/2017-11-14-update.md+33−34
@@ -1,9 +1,10 @@
1+++
1+++
2title = "~2017.11.14 Update"
2title = "~2017.11.14 Update"
3−date = 2017-11-14
3+date = "2017-11-13"
4description = "As usual, we're guilty of wanting to write code more than prose."
4description = "As usual, we're guilty of wanting to write code more than prose."
5slug = "2017-11-14-update"
5slug = "2017-11-14-update"
6−aliases = ["/posts/2017-11-14-update/", "/blog/2017.11-update/"]
6+aliases = [ "/posts/2017-11-14-update/", "/blog/2017.11-update/" ]
7+
7[extra]
8[extra]
8author = "Curtis Yarvin + Galen Wolfe-Pauly"
9author = "Curtis Yarvin + Galen Wolfe-Pauly"
9ship = "~sorreg-namtyv + ~ravmel-ropdyl"
10ship = "~sorreg-namtyv + ~ravmel-ropdyl"
@@ -15,21 +16,21 @@ project status:
15
16
16## Fall release goals and status
17## Fall release goals and status
17
18
18−*Curtis, Ted, Paul*
19+_Curtis, Ted, Paul_
19
20
20Sometime in the next few weeks, we'll ship the Hoon 143 / Vere 0.5 release.
21Sometime in the next few weeks, we'll ship the Hoon 143 / Vere 0.5 release.
21−This release will of course be a continuity breach. The mighty engine is still
22+This release will of course be a continuity breach. The mighty engine is still
22running in the lab while we screw on the last bells and make sure the boiler
23running in the lab while we screw on the last bells and make sure the boiler
23−isn't leaking oil, steam or memory. Currently, Curtis is fighting memory leaks
24+isn't leaking oil, steam or memory. Currently, Curtis is fighting memory leaks
24while Ted and Paul make sure the memoization cache can actually get reclaimed.
25while Ted and Paul make sure the memoization cache can actually get reclaimed.
25
26
26We want this fall 2017 Urbit testnet release to be reasonably rugged across the
27We want this fall 2017 Urbit testnet release to be reasonably rugged across the
27−board. It is not a production network and its keys remain test keys. However,
28+board. It is not a production network and its keys remain test keys. However,
28it should not crash, sink, etc.
29it should not crash, sink, etc.
29
30
30−This is new. For previous releases, it wasn't a realistic goal to keep ships
31+This is new. For previous releases, it wasn't a realistic goal to keep ships
31from sinking, or salvage every pier. It's just incredibly disruptive and
32from sinking, or salvage every pier. It's just incredibly disruptive and
32−unpleasant in a pseudonymous network to sink people's identities. In this era,
33+unpleasant in a pseudonymous network to sink people's identities. In this era,
33if your ship sinks, please (a) post an incident report to the Urbit fora; (b)
34if your ship sinks, please (a) post an incident report to the Urbit fora; (b)
34know that we will strain every fiber to help you wrest it from Poseidon's grim
35know that we will strain every fiber to help you wrest it from Poseidon's grim
35grip.
36grip.
@@ -37,29 +38,29 @@ grip.
37Furthermore, although there will be no direct formal continuity between this
38Furthermore, although there will be no direct formal continuity between this
38release and the next one, we will provide tools to directly convert any data
39release and the next one, we will provide tools to directly convert any data
39in your urbit. So, in case you actually do put meaningful datas in your urbit,
40in your urbit. So, in case you actually do put meaningful datas in your urbit,
40−you won't have to convert your datas completely by hand. Again, we will do
41+you won't have to convert your datas completely by hand. Again, we will do
41everything to help.
42everything to help.
42
43
43## Hoon 143
44## Hoon 143
44
45
45−*Curtis, Iceman, Ted, Anton, Mark*
46+_Curtis, Iceman, Ted, Anton, Mark_
46
47
47Curtis has spent most of 2017 quasi-surreptitiously in "auteur mode," trying to
48Curtis has spent most of 2017 quasi-surreptitiously in "auteur mode," trying to
48−complete his initial authorship of Hoon. After this release he promises to work
49+complete his initial authorship of Hoon. After this release he promises to work
49only on Arvo and above.
50only on Arvo and above.
50
51
51−Hoon 143 is not perfect, but it will do for a while. Nothing in Hoon 143 is so
52+Hoon 143 is not perfect, but it will do for a while. Nothing in Hoon 143 is so
52−bad it's embarrassing. No one has any need to wait for it to stabilize. Any
53+bad it's embarrassing. No one has any need to wait for it to stabilize. Any
53errors in the above must be fixed by Hoon 142.
54errors in the above must be fixed by Hoon 142.
54
55
55Hoon 143 establishes a set of standards and conventions which define modern,
56Hoon 143 establishes a set of standards and conventions which define modern,
56−high-quality code. Most of the Urbit codebase isn't quite to this standard.
57+high-quality code. Most of the Urbit codebase isn't quite to this standard.
57Changing this includes removing the use of deprecated language features, then
58Changing this includes removing the use of deprecated language features, then
58−removing support for the deprecated features (to create Hoon 142). Someone
59+removing support for the deprecated features (to create Hoon 142). Someone
59should definitely do this work.
60should definitely do this work.
60
61
61Here are some of the things Curtis has done to Hoon, without asking anyone's
62Here are some of the things Curtis has done to Hoon, without asking anyone's
62−permission. (Did Godard ask permission?) On some of these things he had fellow
63+permission. (Did Godard ask permission?) On some of these things he had fellow
63conspirators -- Iceman was an equal contributor on the decorators, the team of
64conspirators -- Iceman was an equal contributor on the decorators, the team of
64Ted, Anton and Mark on Udon.
65Ted, Anton and Mark on Udon.
65
66
@@ -71,28 +72,27 @@ Big changes in Hoon 143:
71 `error: %mull-bonk-b`.
72 `error: %mull-bonk-b`.
72- There's now only one wide syntax `{a/term b/term}` becomes `[a=term b=term]`.
73- There's now only one wide syntax `{a/term b/term}` becomes `[a=term b=term]`.
73 This is like Hoon 164 syntax, but without the ubiquitous, and horrible, prefix
74 This is like Hoon 164 syntax, but without the ubiquitous, and horrible, prefix
74− comma. The price is modes.
75+ comma. The price is modes.
75- Decorators: formal syntax for adding documentation to types, available at
76- Decorators: formal syntax for adding documentation to types, available at
76 runtime for reflexive help and diagnosis.
77 runtime for reflexive help and diagnosis.
77- In addition to the Sail dynamic XML syntax (which everyone forgets about, and
78- In addition to the Sail dynamic XML syntax (which everyone forgets about, and
78 which is basically JSX in Hoon), Hoon now has an embedded, Markdown-flavored
79 which is basically JSX in Hoon), Hoon now has an embedded, Markdown-flavored
79− rich text language: Udon. Few dynamic document platforms have this kind of
80+ rich text language: Udon. Few dynamic document platforms have this kind of
80 range -- one file, with everything from code to tree-structured data to styled text.
81 range -- one file, with everything from code to tree-structured data to styled text.
81- Keywords, which everyone despised, have been fully eradicated.
82- Keywords, which everyone despised, have been fully eradicated.
82
83
83Curtis is done with Hoon and will never again change or improve it.
84Curtis is done with Hoon and will never again change or improve it.
84−He may offer occasional opinions. Ted and Iceman are the new maintainers of
85+He may offer occasional opinions. Ted and Iceman are the new maintainers of
85Hoon (including all of hoon.hoon and zuse.hoon, excluding Arvo models).
86Hoon (including all of hoon.hoon and zuse.hoon, excluding Arvo models).
86Anything all they agree on is probably good.
87Anything all they agree on is probably good.
87
88
88−
89## What's not in this release
89## What's not in this release
90
90
91−*Curtis*
91+_Curtis_
92
92
932017 was also the year we learned the lesson that, while Urbit is awesome and
932017 was also the year we learned the lesson that, while Urbit is awesome and
94makes many system-software problems trivial, it is not so awesome that a team
94makes many system-software problems trivial, it is not so awesome that a team
95−this small can advance two branches at once. This fall 2017 release is a
95+this small can advance two branches at once. This fall 2017 release is a
96classic, Microsoft-style stick save, cutting off about half of the research
96classic, Microsoft-style stick save, cutting off about half of the research
97("master" or "cc-release") branch and merging it back with splints and bandaids.
97("master" or "cc-release") branch and merging it back with splints and bandaids.
98
98
@@ -105,13 +105,12 @@ What got cut (this work is mostly coded, but not fully tested / integrated):
105- The all-new Jael authentication vane
105- The all-new Jael authentication vane
106- The new generalized console library
106- The new generalized console library
107
107
108−There is plenty of other stuff that needs to go into our next release. Some of
108+There is plenty of other stuff that needs to go into our next release. Some of
109it is described below.
109it is described below.
110
110
111−
112## SPA rendering and build system
111## SPA rendering and build system
113
112
114−*Ted and Anton*
113+_Ted and Anton_
115
114
116Ever notice how urbit.org gives 504 errors far too much? Hell, it probably
115Ever notice how urbit.org gives 504 errors far too much? Hell, it probably
117504-ed when you tried to load this page. This is clearly a problem.
116504-ed when you tried to load this page. This is clearly a problem.
@@ -150,7 +149,7 @@ More on UPs below.
150
149
151## New primer
150## New primer
152
151
153−*Isaac, Galen and Jimmy*
152+_Isaac, Galen and Jimmy_
154
153
155One thing we still don't do a particularly good job of is communicating about
154One thing we still don't do a particularly good job of is communicating about
156what Urbit is. Even to savvy tech and crypto folks.
155what Urbit is. Even to savvy tech and crypto folks.
@@ -160,7 +159,7 @@ urbit.org. The text is coming together and we're starting to work on design.
160
159
161## Nock tutorials
160## Nock tutorials
162
161
163−*Josh and Galen*
162+_Josh and Galen_
164
163
165Josh is a PhD student who has a lot more teaching experience than we do. To
164Josh is a PhD student who has a lot more teaching experience than we do. To
166boot, he's convinced that Nock is incredibly simple and can be taught to just
165boot, he's convinced that Nock is incredibly simple and can be taught to just
@@ -171,7 +170,7 @@ so.
171
170
172## ETH contracts
171## ETH contracts
173
172
174−*Mark and Curtis*
173+_Mark and Curtis_
175
174
176Working from Curtis' designs, Mark has helped us implement the Urbit
175Working from Curtis' designs, Mark has helped us implement the Urbit
177constitution as a set of ETH contracts. They're off to the auditors, but the
176constitution as a set of ETH contracts. They're off to the auditors, but the
@@ -180,7 +179,7 @@ for public scrutiny.
180
179
181## MyEtherWallet
180## MyEtherWallet
182
181
183−*Anthony and Galen*
182+_Anthony and Galen_
184
183
185We want to make interacting with the Urbit ETH contracts as easy as possible.
184We want to make interacting with the Urbit ETH contracts as easy as possible.
186Especially for people who aren't necessarily particularly familiar with
185Especially for people who aren't necessarily particularly familiar with
@@ -193,7 +192,7 @@ privately, but progress will be visible here:
193
192
194## UPs
193## UPs
195
194
196−*Keaton, Ted and Galen*
195+_Keaton, Ted and Galen_
197
196
198About a month ago we were discussing how we'd really like to be more transparent
197About a month ago we were discussing how we'd really like to be more transparent
199about the projects we undertake. And, we'd really like to have a way of
198about the projects we undertake. And, we'd really like to have a way of
@@ -205,14 +204,14 @@ contain:
205
204
206## Jaque, an independent interpreter in Java
205## Jaque, an independent interpreter in Java
207
206
208−*Paul*
207+_Paul_
209
208
210Paul is delighted to announce Jaque, an independent implementation of Urbit
209Paul is delighted to announce Jaque, an independent implementation of Urbit
211using Graal/Truffle on the JVM.
210using Graal/Truffle on the JVM.
212
211
213Jaque is not just another Nock function -- it boots an actual Urbit pill to a
212Jaque is not just another Nock function -- it boots an actual Urbit pill to a
214−working dojo prompt. Jaque has no compiler jets and has exposed several jet
213+working dojo prompt. Jaque has no compiler jets and has exposed several jet
215−mismatches in Vere. It works and is reportedly quite snappy. Paul is still
214+mismatches in Vere. It works and is reportedly quite snappy. Paul is still
216tuning the interpreter, changing it from a tree interpreter to a small bytecode,
215tuning the interpreter, changing it from a tree interpreter to a small bytecode,
217because Graal does not like big stacks and tree interpreters make big stacks.
216because Graal does not like big stacks and tree interpreters make big stacks.
218−He'll say more about it when he considers it done, which is not yet.
217+He'll say more about it when he considers it done, which is not yet.
content/updates/2017-12-16-update.md+11−9
@@ -1,9 +1,10 @@
1+++
1+++
2title = "~2017.12.16 Update"
2title = "~2017.12.16 Update"
3−date = 2017-12-16
3+date = "2017-12-15"
4description = "A short update from the Tlon team for the week of ~2017.12.16."
4description = "A short update from the Tlon team for the week of ~2017.12.16."
5slug = "2017-12-16-update"
5slug = "2017-12-16-update"
6−aliases = ["/posts/2017-12-16-update/"]
6+aliases = [ "/posts/2017-12-16-update/" ]
7+
7[extra]
8[extra]
8author = ""
9author = ""
9ship = "~rovnys-ricfer"
10ship = "~rovnys-ricfer"
@@ -14,13 +15,14 @@ Greetings, intrepid Martians. Thanks for bearing with us these past couple weeks
14Last Thursday night, we performed the continuity breach, bringing with it some deep changes to the Hoon language, a parser for a new markup language for web publishing, and an entirely new `:talk` app. Those changes had been in the works since the beginning of the summer, and we spent the past month or so preparing the breach itself. We pushed the breach out knowing there would likely be some bugs, with the explicit intent of using the deployment to find and fix those bugs as soon as possible.
15Last Thursday night, we performed the continuity breach, bringing with it some deep changes to the Hoon language, a parser for a new markup language for web publishing, and an entirely new `:talk` app. Those changes had been in the works since the beginning of the summer, and we spent the past month or so preparing the breach itself. We pushed the breach out knowing there would likely be some bugs, with the explicit intent of using the deployment to find and fix those bugs as soon as possible.
15
16
16Here's what's been going on since the breach:
17Here's what's been going on since the breach:
18+
17−- Urbit is somewhat slower than it was -- Galen may have exaggerated when he said it's 300x slower, but it is noticeable. *Curtis* `~sorreg-namtyv` is working on fixing a major performance issue in the Nock output of the Hoon compiler involving constants not getting folded at compile-time. I assure you, no one is more upset about Urbit being slow than the people who work on it all day long ... we'll fix it.
19+- Urbit is somewhat slower than it was -- Galen may have exaggerated when he said it's 300x slower, but it is noticeable. _Curtis_ `~sorreg-namtyv` is working on fixing a major performance issue in the Nock output of the Hoon compiler involving constants not getting folded at compile-time. I assure you, no one is more upset about Urbit being slow than the people who work on it all day long ... we'll fix it.
18−- New `:talk` is working, more or less. There are a few bugs that we're still working on, including some fixes for urbit.org/stream, which is currently down. *Mark* `~palfun-foslup` has been putting out fires like crazy, and due to his efforts, with some help from *Ted* `~rovnys-ricfer` and *Anton* `~pittyp-datfyn`, new `:talk` is getting under control.
20+- New `:talk` is working, more or less. There are a few bugs that we're still working on, including some fixes for urbit.org/stream, which is currently down. _Mark_ `~palfun-foslup` has been putting out fires like crazy, and due to his efforts, with some help from _Ted_ `~rovnys-ricfer` and _Anton_ `~pittyp-datfyn`, new `:talk` is getting under control.
19−- *Keaton* `~tonlur-sarret` has updated the docs for new Hoon, and also improved the links and organization. *Joshua* `~taglux-nidsep` has also made some docs improvements.
21+- _Keaton_ `~tonlur-sarret` has updated the docs for new Hoon, and also improved the links and organization. _Joshua_ `~taglux-nidsep` has also made some docs improvements.
20−- *Isaac* `~davtyr-nimren` is progressing on server-side rendering for web publishing, using the new `udon` markup language. Latest code (still a work in progress) can be found [here](https://github.com/ixv/arvo/tree/153ae2e35e77c7453601f84f956be3fe4509c104/ren/tree).
22+- _Isaac_ `~davtyr-nimren` is progressing on server-side rendering for web publishing, using the new `udon` markup language. Latest code (still a work in progress) can be found [here](https://github.com/ixv/arvo/tree/153ae2e35e77c7453601f84f956be3fe4509c104/ren/tree).
21−- *Ted* has started working on designing a system to run automated stress tests of a fleet of Urbits, sort of like a DIY botnet. This should help us hit more bugs *before* pushing code to the live network, many of which only appeared at "web scale."
23+- _Ted_ has started working on designing a system to run automated stress tests of a fleet of Urbits, sort of like a DIY botnet. This should help us hit more bugs _before_ pushing code to the live network, many of which only appeared at "web scale."
22−- *Anthony* `~poldec-tonteg` now has a working alpha of an [Urbit fork of myetherwallet](https://github.com/urbit/etherwallet) (design by *Galen*), with usage instructions. We haven't gone live on Ethereum yet, but you can still check this out to see a glimpse of the future.
24+- _Anthony_ `~poldec-tonteg` now has a working alpha of an [Urbit fork of myetherwallet](https://github.com/urbit/etherwallet) (design by _Galen_), with usage instructions. We haven't gone live on Ethereum yet, but you can still check this out to see a glimpse of the future.
23−- *Galen* `~ravmel-ropdyl` and *Jimmy* have been working on an Urbit primer to help explain whatever it is we do here.
25+- _Galen_ `~ravmel-ropdyl` and _Jimmy_ have been working on an Urbit primer to help explain whatever it is we do here.
24
26
25There have also been two Mars Talk episodes since our last update:
27There have also been two Mars Talk episodes since our last update:
26[What is Urbit? Panel Discussion](https://www.youtube.com/watch?v=hqACJVSJc5s&t=3703s)
28[What is Urbit? Panel Discussion](https://www.youtube.com/watch?v=hqACJVSJc5s&t=3703s)
content/updates/2017-12-2-update.md+17−16
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2017.12.2 Update"
2title = "~2017.12.2 Update"
3−date = 2017-12-02
3+date = "2017-12-01"
4description = "A short update from the Tlon team for the week of ~2017.12.2."
4description = "A short update from the Tlon team for the week of ~2017.12.2."
5−aliases = ["/posts/2017-12-2-update/"]
5+aliases = [ "/posts/2017-12-2-update/" ]
6+
6[extra]
7[extra]
7author = ""
8author = ""
8ship = "~rovnys-ricfer"
9ship = "~rovnys-ricfer"
@@ -13,55 +14,56 @@ progress on restructuring web publishing to use server-side rendering, and have
13oldest open pull requests. From the community, we're excited to report that `~master-morzod` has an initial
14oldest open pull requests. From the community, we're excited to report that `~master-morzod` has an initial
14implementation of SSL termination in vere.
15implementation of SSL termination in vere.
15
16
16−*Ted* `~rovnys-ricfer` has been working on the [urbit fleet
17+_Ted_ `~rovnys-ricfer` has been working on the [urbit fleet
17repo](https://github.com/urbit/fleet/tree/e20400315bbea2091579b7beaa36eb50bbbd2796), which we use for spawning testnets.
18repo](https://github.com/urbit/fleet/tree/e20400315bbea2091579b7beaa36eb50bbbd2796), which we use for spawning testnets.
18The repo now works with the new `urbit` command-line arguments that are part of the breach, and it's now at the point
19The repo now works with the new `urbit` command-line arguments that are part of the breach, and it's now at the point
19where we can launch ships from galaxies all the way down to comets. We've been using it to test various aspects of
20where we can launch ships from galaxies all the way down to comets. We've been using it to test various aspects of
20Urbit's multi-ship functionality, such as `:talk` and filesystem syncing. Turns out there is a bug with filesystem
21Urbit's multi-ship functionality, such as `:talk` and filesystem syncing. Turns out there is a bug with filesystem
21syncing in master, so we're going to have to fix that before breaching.
22syncing in master, so we're going to have to fix that before breaching.
22
23
23−*Anton* `~pittyp-datfyn` has knocked out a bunch of items in our breach checklist. Some highlights:
24+_Anton_ `~pittyp-datfyn` has knocked out a bunch of items in our breach checklist. Some highlights:
25+
24- Fixed single-sign-on
26- Fixed single-sign-on
25- Cleaned up a bunch of old unused code
27- Cleaned up a bunch of old unused code
26- Reorganized `:hood` libraries
28- Reorganized `:hood` libraries
27- Lots of testing
29- Lots of testing
28
30
29−*Keaton* `~tonlur-sarret` has been working with Anton on the breach checklist. He also updated the docs and examples to
31+_Keaton_ `~tonlur-sarret` has been working with Anton on the breach checklist. He also updated the docs and examples to
30reflect the changes made in hoon `%143` (which will be deployed with the breach) and helped Ted debug some urbit/fleet
32reflect the changes made in hoon `%143` (which will be deployed with the breach) and helped Ted debug some urbit/fleet
31problems.
33problems.
32
34
33−*Curtis* `~sorreg-namtyv` has made a number of improvements to hoon's defaulting system (bunting). Part of the work
35+_Curtis_ `~sorreg-namtyv` has made a number of improvements to hoon's defaulting system (bunting). Part of the work
34included fixing an inconsistency in how hoon determined which subtype of a fork type would be chosen as default. After
36included fixing an inconsistency in how hoon determined which subtype of a fork type would be chosen as default. After
35fixing that, he implemented a cache for those defaults, which improved compilation speed by 10-20%. This code has been
37fixing that, he implemented a cache for those defaults, which improved compilation speed by 10-20%. This code has been
36merged into Arvo's master branch. He's still working on a parallel defaulting system, which might go even faster.
38merged into Arvo's master branch. He's still working on a parallel defaulting system, which might go even faster.
37
39
38−*Galen* `~ravmel-ropdyl` and Jimmy have been working on the new urbit.org homepage, which will be Tlon's next priority
40+_Galen_ `~ravmel-ropdyl` and Jimmy have been working on the new urbit.org homepage, which will be Tlon's next priority
39after the breach. This will feature a complete redesign using a new base.css to provide a standardized look and feel for
41after the breach. This will feature a complete redesign using a new base.css to provide a standardized look and feel for
40the Urbit web experience.
42the Urbit web experience.
41
43
42−*Mark* `~palfun-foslup` / `~palnup-salwyx-mortyl-silfyl--digrel-pitbud-dorsym-livpyl` has been working with
44+_Mark_ `~palfun-foslup` / `~palnup-salwyx-mortyl-silfyl--digrel-pitbud-dorsym-livpyl` has been working with
43~poldec-tonteg to troubleshoot some issues with Urbit's Ethereum constitution. He's still waiting for the rest of Tlon to
45~poldec-tonteg to troubleshoot some issues with Urbit's Ethereum constitution. He's still waiting for the rest of Tlon to
44test his [monumental PR](https://github.com/urbit/arvo/pull/452) for new talk, which he submitted a couple weeks ago. Now
46test his [monumental PR](https://github.com/urbit/arvo/pull/452) for new talk, which he submitted a couple weeks ago. Now
45that we have the fleet repo working, we can use it to test this work more thoroughly. This week he also made some changes
47that we have the fleet repo working, we can use it to test this work more thoroughly. This week he also made some changes
46to Hall, which he has expressed in haiku form:
48to Hall, which he has expressed in haiku form:
47
49
48> the hall has opened,
50> the hall has opened,
49− circles form to admire,
51+> circles form to admire,
50− people's collections.
52+> people's collections.
51
53
52He also says:
54He also says:
53
55
54> Or if you want something slightly more serious:
56> Or if you want something slightly more serious:
55− Hall has received some more fixes and quality of life improvements since I opened the PR. It's > never been more ready
57+> Hall has received some more fixes and quality of life improvements since I opened the PR. It's > never been more ready
56− for the breach! I'm already working on something interesting that uses > it: an interface for managing your own notes,
58+> for the breach! I'm already working on something interesting that uses > it: an interface for managing your own notes,
57− blogs and foras. Complete with filesystem, storage, and hall notifications!
59+> blogs and foras. Complete with filesystem, storage, and hall notifications!
58
60
59−*Joe* `~master-morzod` has written an implementation of SSL termination in vere. This will allow your Urbit to serve true
61+_Joe_ `~master-morzod` has written an implementation of SSL termination in vere. This will allow your Urbit to serve true
60end-to-end-encrypted HTTPS, as opposed to Tlon's servers operating as man-in-the-middle, which is not a viable long-term
62end-to-end-encrypted HTTPS, as opposed to Tlon's servers operating as man-in-the-middle, which is not a viable long-term
61solution. This has been an important piece of missing functionality, so we're excited to see it start to come together.
63solution. This has been an important piece of missing functionality, so we're excited to see it start to come together.
62Latest code can be found [here](https://github.com/joemfb/urbit/tree/346de776c5fabe3e02fecb7cab3d1652e4cc46e3).
64Latest code can be found [here](https://github.com/joemfb/urbit/tree/346de776c5fabe3e02fecb7cab3d1652e4cc46e3).
63
65
64−*Isaac* `~davtyr-nimren` has been building the next generation of Urbit's web publishing system, currently located in the
66+_Isaac_ `~davtyr-nimren` has been building the next generation of Urbit's web publishing system, currently located in the
65ren/tree directory of Arvo. This new system, instead of serializing data down to the client to be fetched after the
67ren/tree directory of Arvo. This new system, instead of serializing data down to the client to be fetched after the
66initial page load, will perform the HTML rendering on the server. This is now possible because of the integration of our
68initial page load, will perform the HTML rendering on the server. This is now possible because of the integration of our
67Udon markup language with the Hoon compiler. This allows us to include Udon files in other Udon files using Ford runes.
69Udon markup language with the Hoon compiler. This allows us to include Udon files in other Udon files using Ford runes.
@@ -72,4 +74,3 @@ working on smaller bugfixes.
72There was also a [new episode of Mars Talk](https://youtu.be/1xcjnBu6qFo) with Ted and Joe discussing Hoon's type system.
74There was also a [new episode of Mars Talk](https://youtu.be/1xcjnBu6qFo) with Ted and Joe discussing Hoon's type system.
73
75
74Those are the highlights from this week. Back to breaching!
76Those are the highlights from this week. Back to breaching!
75−
content/updates/2017-12-22-update.md+13−12
@@ -1,9 +1,10 @@
1+++
1+++
2title = "~2017.12.22 Update"
2title = "~2017.12.22 Update"
3−date = 2017-12-22
3+date = "2017-12-21"
4description = "A short update from the Tlon team for the week of ~2017.12.22."
4description = "A short update from the Tlon team for the week of ~2017.12.22."
5slug = "2017-12-22-update"
5slug = "2017-12-22-update"
6−aliases = ["/posts/2017-12-22-update/"]
6+aliases = [ "/posts/2017-12-22-update/" ]
7+
7[extra]
8[extra]
8author = ""
9author = ""
9ship = "~rovnys-ricfer"
10ship = "~rovnys-ricfer"
@@ -11,22 +12,22 @@ ship = "~rovnys-ricfer"
11
12
12This past week:
13This past week:
13
14
14−*Mark* `~palfun-foslup` has continued to fix bugs in new `:talk`. We've finally reinstated our public chat stream [urbit.org/stream](https://urbit.org/stream), which had been down since the breach, and as far as we know all the major, show-stopping `:talk` bugs have now been fixed. All currently known `:talk` bugs can be found on our [github issues page](https://github.com/urbit/arvo/issues). Mark, with some help from Ted, has also been working on reproducing and diagnosing [an old Clay bug](https://github.com/urbit/arvo/issues/501) that popped up again recently involving failed filesystem syncing across ships. We now know how to fix the bug, so that's up next for Mark.
15+_Mark_ `~palfun-foslup` has continued to fix bugs in new `:talk`. We've finally reinstated our public chat stream [urbit.org/stream](https://urbit.org/stream), which had been down since the breach, and as far as we know all the major, show-stopping `:talk` bugs have now been fixed. All currently known `:talk` bugs can be found on our [github issues page](https://github.com/urbit/arvo/issues). Mark, with some help from Ted, has also been working on reproducing and diagnosing [an old Clay bug](https://github.com/urbit/arvo/issues/501) that popped up again recently involving failed filesystem syncing across ships. We now know how to fix the bug, so that's up next for Mark.
15
16
16−*Ted* `~rovnys-ricfer` submitted a [PR](https://github.com/urbit/urbit/pull/910) that fixes a long-standing performance bug in Urbit's event-processing model, where effects wouldn't be performed until the whole queue of input events had been processed. The PR is currently in review. He's also resumed work on the Ford caching fixes that he and Anton had been working on before the breach. It's a difficult project, but once it lands, the dreaded 504 errors when loading urbit.org should finally cease.
17+_Ted_ `~rovnys-ricfer` submitted a [PR](https://github.com/urbit/urbit/pull/910) that fixes a long-standing performance bug in Urbit's event-processing model, where effects wouldn't be performed until the whole queue of input events had been processed. The PR is currently in review. He's also resumed work on the Ford caching fixes that he and Anton had been working on before the breach. It's a difficult project, but once it lands, the dreaded 504 errors when loading urbit.org should finally cease.
17
18
18−*Anton* `~pittyp-datfyn` has been working on the `:collections` app, which will replace and generalize `:fora`. This work is nearing completion. This work will likely land with the frontend overhaul that Galen is leading.
19+_Anton_ `~pittyp-datfyn` has been working on the `:collections` app, which will replace and generalize `:fora`. This work is nearing completion. This work will likely land with the frontend overhaul that Galen is leading.
19
20
20−*Isaac* `~davtyr-nimren` has contined to make progress on the new version of `ren/tree`, Urbit's web publishing frontend. The new system has now matured enough that Keaton has been able to translate several of our docs pages to it.
21+_Isaac_ `~davtyr-nimren` has contined to make progress on the new version of `ren/tree`, Urbit's web publishing frontend. The new system has now matured enough that Keaton has been able to translate several of our docs pages to it.
21
22
22−*Keaton* `~tonlur-sarret` has been chugging along on converting Urbit's documentation to the new `ren/tree`. He also booted up a new web ship to run urbit.org, since the old one had gotten verklempt.
23+_Keaton_ `~tonlur-sarret` has been chugging along on converting Urbit's documentation to the new `ren/tree`. He also booted up a new web ship to run urbit.org, since the old one had gotten verklempt.
23
24
24−*Galen* `~ravmel-ropdyl` has continued work on the revamped Urbit frontend, including a base.css and a redesigned look and feel and more diagrams, explanations, and blog posts. *Jimmy* and *Chris* are working with him on this project. He's also been working with Anton on the `:collections` app.
25+_Galen_ `~ravmel-ropdyl` has continued work on the revamped Urbit frontend, including a base.css and a redesigned look and feel and more diagrams, explanations, and blog posts. _Jimmy_ and _Chris_ are working with him on this project. He's also been working with Anton on the `:collections` app.
25
26
26−*Anthony* `~poldec-tonteg` has fixed several more bugs with [Urbit's fork of myetherwallet](https://github.com/urbit/etherwallet).
27+_Anthony_ `~poldec-tonteg` has fixed several more bugs with [Urbit's fork of myetherwallet](https://github.com/urbit/etherwallet).
27
28
28−*Curtis* `~sorreg-namtyv` has continued working on Hoon performance. Performance of his branch is currently estimated at 30% faster than master.
29+_Curtis_ `~sorreg-namtyv` has continued working on Hoon performance. Performance of his branch is currently estimated at 30% faster than master.
29
30
30−*Joshua Reagan* `~taglux-nidsep` and Ted had Mark and Keaton on [Mars Talk episode 13](https://youtu.be/CfdoGY0u044) and they live-coded a Gall app.
31+_Joshua Reagan_ `~taglux-nidsep` and Ted had Mark and Keaton on [Mars Talk episode 13](https://youtu.be/CfdoGY0u044) and they live-coded a Gall app.
31
32
32−We also threw what was generally considered to be a pretty good party last night. It was a nice way to end the year. Happy holidays from Mars!
33+We also threw what was generally considered to be a pretty good party last night. It was a nice way to end the year. Happy holidays from Mars!
content/updates/2017-3-1-update.md+41−40
@@ -1,26 +1,27 @@
1+++
1+++
2title = "~2017.3.1 Update"
2title = "~2017.3.1 Update"
3−date = 2017-03-01
3+date = "2017-02-28"
4description = "Arvo is done, there's a prototype in progress, and more."
4description = "Arvo is done, there's a prototype in progress, and more."
5−aliases = ["/posts/2017-3-1-update/", "/blog/2017.3.1-update/"]
5+aliases = [ "/posts/2017-3-1-update/", "/blog/2017.3.1-update/" ]
6+
6[extra]
7[extra]
7author = "Curtis Yarvin + Galen Wolfe-Pauly"
8author = "Curtis Yarvin + Galen Wolfe-Pauly"
8ship = "~sorreg-namtyv + ~ravmel-ropdyl"
9ship = "~sorreg-namtyv + ~ravmel-ropdyl"
9+++
10+++
10
11
11−*Curtis* (`~sorreg-namtyv`) has reached code-complete (compiling but not tested) on
12+_Curtis_ (`~sorreg-namtyv`) has reached code-complete (compiling but not tested) on
12−the `arvo.hoon` rewrite. The super-impatient can have a look at
13+the `arvo.hoon` rewrite. The super-impatient can have a look at
13[this file](https://github.com/cgyarvin/arvo/blob/revere-ivory/sys/parv.hoon).
14[this file](https://github.com/cgyarvin/arvo/blob/revere-ivory/sys/parv.hoon).
14
15
15The entire boot sequence from Nock through the Arvo kernel has now been rewritten,
16The entire boot sequence from Nock through the Arvo kernel has now been rewritten,
16−and actually makes sense. The old Arvo did work, it's true, under most
17+and actually makes sense. The old Arvo did work, it's true, under most
17−conditions. It didn't work because it made sense, but mainly through pure
18+conditions. It didn't work because it made sense, but mainly through pure
18−persistence and luck. This is not viable for the deep core of a stable platform.
19+persistence and luck. This is not viable for the deep core of a stable platform.
19It has, however, managed to stay alive on the network for the past 7 months.
20It has, however, managed to stay alive on the network for the past 7 months.
20
21
21This all-new Arvo kernel (at a very fluffy 1065 lines) joins the all-new `%ames`
22This all-new Arvo kernel (at a very fluffy 1065 lines) joins the all-new `%ames`
22and `%jael` vanes (kernel modules), and the `%zuse` library, in the new family of
23and `%jael` vanes (kernel modules), and the `%zuse` library, in the new family of
23−reference-quality Hoon code. (`%ames` is almost there -- the code is good, but not
24+reference-quality Hoon code. (`%ames` is almost there -- the code is good, but not
24documented.)
25documented.)
25
26
26Roughly speaking, Urbit including all application, library, and kernel code, is
27Roughly speaking, Urbit including all application, library, and kernel code, is
@@ -31,77 +32,77 @@ C-grade Hoon is found in `%eyre` (Web server) and `%dill` (console); a bit of it
31has accumulated in `:talk`; the markdown parser; some of the examples; some of
32has accumulated in `:talk`; the markdown parser; some of the examples; some of
32`hoon.hoon`; etc.
33`hoon.hoon`; etc.
33
34
34−C-grade Hoon is write-only code. To even look at it, even if you know Hoon, is
35+C-grade Hoon is write-only code. To even look at it, even if you know Hoon, is
35−reverse engineering. It follows no conventions, not even its own. If it has
36+reverse engineering. It follows no conventions, not even its own. If it has
36−comments, they mean nothing, except (possibly) to the author. (One bad property of
37+comments, they mean nothing, except (possibly) to the author. (One bad property of
37Hoon is that, like C, it does nothing to stop you from writing obfuscated code.)
38Hoon is that, like C, it does nothing to stop you from writing obfuscated code.)
38Most C-grade Hoon dates to 2014 or early '15.
39Most C-grade Hoon dates to 2014 or early '15.
39
40
40−B-grade Hoon can be followed with some effort. It is structurally simple, but not
41+B-grade Hoon can be followed with some effort. It is structurally simple, but not
41−always conceptually simple. It makes no particular effort to explain itself,
42+always conceptually simple. It makes no particular effort to explain itself,
42−either through documentation or otherwise. `%behn`, `%clay` (B+ for decent
43+either through documentation or otherwise. `%behn`, `%clay` (B+ for decent
43comments), `%ford`, `%gall`, most of `hoon.hoon` and most userspace code is
44comments), `%ford`, `%gall`, most of `hoon.hoon` and most userspace code is
44−B-grade. Most B-grade code is from late '15 or early '16.
45+B-grade. Most B-grade code is from late '15 or early '16.
45
46
46The A-grade Hoon is everything produced since our crowdsale: `%ames`, `%zuse`,
47The A-grade Hoon is everything produced since our crowdsale: `%ames`, `%zuse`,
47−`%jael`, and `%parv`. Hoon of this quality, you just spread on a cracker and eat.
48+`%jael`, and `%parv`. Hoon of this quality, you just spread on a cracker and eat.
48−It's completely smooth. You can almost see what it's doing even if you don't know
49+It's completely smooth. You can almost see what it's doing even if you don't know
49−Hoon. The only places where A-grade Hoon is hard to understand are places where
50+Hoon. The only places where A-grade Hoon is hard to understand are places where
50the problem is actually tricky.
51the problem is actually tricky.
51
52
52−Urbit succeeds exclusively through software quality. All A-grade code should be
53+Urbit succeeds exclusively through software quality. All A-grade code should be
53−permanently maintainable at consistent quality. All B-grade and C-grade code will
54+permanently maintainable at consistent quality. All B-grade and C-grade code will
54deteriorate over time and eventually needs to be replaced.
55deteriorate over time and eventually needs to be replaced.
55
56
56But `cc-release` is an "infrastructure MVP" in which the critical parts are
57But `cc-release` is an "infrastructure MVP" in which the critical parts are
57−A-grade: the boot sequence and OS, networking, and secrets. Lower-grade code
58+A-grade: the boot sequence and OS, networking, and secrets. Lower-grade code
58−remains suitable for light-duty kernel and userspace work. The good news is that
59+remains suitable for light-duty kernel and userspace work. The good news is that
59the longer we wait to rewrite it, the better the replacement will be.
60the longer we wait to rewrite it, the better the replacement will be.
60
61
61These new A-grade subsystems remain untested (except `%jael` and `%zuse`) and have
62These new A-grade subsystems remain untested (except `%jael` and `%zuse`) and have
62−not been integrated. This will involve further tinkering with other vanes and
63+not been integrated. This will involve further tinkering with other vanes and
63−userspace code. However, Arvo should be the last major module rewrite before
64+userspace code. However, Arvo should be the last major module rewrite before
64`cc-release`, so we're on our way.
65`cc-release`, so we're on our way.
65
66
66−*Anton* (`~pittyp-pittyp`) and *Galen* (`~ravmel-ropdyl`) are working from the
67+_Anton_ (`~pittyp-pittyp`) and _Galen_ (`~ravmel-ropdyl`) are working from the
67−opposite end. They're designing the new, easy-to-use, command-completing Urbit UI
68+opposite end. They're designing the new, easy-to-use, command-completing Urbit UI
68from the top down, using ES6 and React.
69from the top down, using ES6 and React.
69
70
70−This new framework isn't even connected to Urbit. Its first use is actually a demo
71+This new framework isn't even connected to Urbit. Its first use is actually a demo
71−video. We published a few screenshots from our mockups in the last blog post, and
72+video. We published a few screenshots from our mockups in the last blog post, and
72want to give a more complete impression of where we're headed to the public.
73want to give a more complete impression of where we're headed to the public.
73Making this interface real will, of course, require nontrivial console engineering
74Making this interface real will, of course, require nontrivial console engineering
74−on the Urbit side. We think it's going to be great.
75+on the Urbit side. We think it's going to be great.
75
76
76Like our new server-side code, the new Urbit client-side framework is designed to
77Like our new server-side code, the new Urbit client-side framework is designed to
77be high-quality code that other human beings can read and extend.
78be high-quality code that other human beings can read and extend.
78
79
79−*Raymond* (`~maldeb-hapben`) has finished breaking the new `vere` system into
80+_Raymond_ (`~maldeb-hapben`) has finished breaking the new `vere` system into
80−client, manager and worker processes. Curtis earlier rewrote the event loop and
81+client, manager and worker processes. Curtis earlier rewrote the event loop and
81the logging system, with correct use of concurrency and `fsync()` in an actual
82the logging system, with correct use of concurrency and `fsync()` in an actual
82two-phase commit.
83two-phase commit.
83
84
84There's still a large number of small tasks to perform, but we're essentially
85There's still a large number of small tasks to perform, but we're essentially
85turning `vere` into the C equivalent of A-grade Hoon: clean code that just
86turning `vere` into the C equivalent of A-grade Hoon: clean code that just
86−obviously works. Also, the new `vere` works like an actual, industrial-grade
87+obviously works. Also, the new `vere` works like an actual, industrial-grade
87server, and should be reasonably adapted to the task of hosting nontrivial numbers
88server, and should be reasonably adapted to the task of hosting nontrivial numbers
88of urbits.
89of urbits.
89
90
90−The absolutely crucial requirement for `cc-release` is ships that don't sink. We
91+The absolutely crucial requirement for `cc-release` is ships that don't sink. We
91have not observed any problems with the new event log so far, but we still need to
92have not observed any problems with the new event log so far, but we still need to
92−stress-test it with powercycles. Yes, Urbit really is an ACID database!
93+stress-test it with powercycles. Yes, Urbit really is an ACID database!
93
94
94−*Keaton* (`~livweb-havweb`), our intern, has written a bunch of examples and
95+_Keaton_ (`~livweb-havweb`), our intern, has written a bunch of examples and
95cleaned up a bunch of doc.
96cleaned up a bunch of doc.
96
97
97−*Elliot* (`~ponnys-podfer`), an outside contributor, sent an amazing `doccords`
98+_Elliot_ (`~ponnys-podfer`), an outside contributor, sent an amazing `doccords`
98−patch that adds documentation strings to Hoon. This sounds like a superficial
99+patch that adds documentation strings to Hoon. This sounds like a superficial
99−change, but it actually involved deep work in the heart of the type system. He's
100+change, but it actually involved deep work in the heart of the type system. He's
100also added a bunch of this doc himself.
101also added a bunch of this doc himself.
101
102
102You can check out the pull requests [here](https://github.com/urbit/arvo/pull/353)
103You can check out the pull requests [here](https://github.com/urbit/arvo/pull/353)
103−and [here](https://github.com/urbit/arvo/pull/356). The original `fora`
104+and [here](https://github.com/urbit/arvo/pull/356). The original `fora`
104discussion is [here](http://urbit.org/fora/posts/~2017.1.16..06.08.17..ae0f~/).
105discussion is [here](http://urbit.org/fora/posts/~2017.1.16..06.08.17..ae0f~/).
105
106
106−As usual, comments are on fora. Check out
107+As usual, comments are on fora. Check out
107[this thread](http://urbit.org/fora/posts/~2017.3.1..22.06.50..bf2a~/).
108[this thread](http://urbit.org/fora/posts/~2017.3.1..22.06.50..bf2a~/).
content/updates/2017-4-17-update.md+37−36
@@ -1,17 +1,18 @@
1+++
1+++
2title = "~2017.4.17 Update"
2title = "~2017.4.17 Update"
3−date = 2017-04-17
3+date = "2017-04-16"
4description = "Individual updates from everyone"
4description = "Individual updates from everyone"
5−aliases = ["/posts/2017-4-17-update/", "/blog/2017.4-update/"]
5+aliases = [ "/posts/2017-4-17-update/", "/blog/2017.4-update/" ]
6+
6[extra]
7[extra]
7author = "The Urbit team"
8author = "The Urbit team"
8ship = ""
9ship = ""
9+++
10+++
10
11
11−Here's our April update, covering the last month or so. I've taken people's own
12+Here's our April update, covering the last month or so. I've taken people's own
12reports and added a little background where necessary.
13reports and added a little background where necessary.
13
14
14−It might help to have a broader roadmap. We'll post that next.
15+It might help to have a broader roadmap. We'll post that next.
15
16
16### `~palfun-foslup` (Fang)
17### `~palfun-foslup` (Fang)
17
18
@@ -27,14 +28,14 @@ mostly works, but there's still some improvements to be made, both in existing
27implementation and in new features.
28implementation and in new features.
28
29
29_Background: in the cc-release world, the user-level application container %gall
30_Background: in the cc-release world, the user-level application container %gall
30−is scheduled for a somewhat cosmetic internal partitioning. Right now there is
31+is scheduled for a somewhat cosmetic internal partitioning. Right now there is
31−only one kind of "app," ie, dynamic core managed by the `%gall` vane. In future
32+only one kind of "app," ie, dynamic core managed by the `%gall` vane. In future
32there are "guardians" (system daemons), "agents" (user agents), "tunnels" (HTTP
33there are "guardians" (system daemons), "agents" (user agents), "tunnels" (HTTP
33security drivers, currently in %eyre), and "gateways" (foreign API interpreters)._
34security drivers, currently in %eyre), and "gateways" (foreign API interpreters)._
34
35
35_This is not as big as a change as it sounds -- all these partitions use the same
36_This is not as big as a change as it sounds -- all these partitions use the same
36−mechanisms. It's just about policy limitations. Eg: only a guardian can receive
37+mechanisms. It's just about policy limitations. Eg: only a guardian can receive
37−inbound messages and subscriptions. In `:talk`, the separation matches the split
38+inbound messages and subscriptions. In `:talk`, the separation matches the split
38between mailserver and mailreader in classic Unix email, news server and news
39between mailserver and mailreader in classic Unix email, news server and news
39reader in NNTP, etc._
40reader in NNTP, etc._
40
41
@@ -50,9 +51,9 @@ But userspace isn't going to change that much, so we're trying to make it more
50accessible for early explorers._
51accessible for early explorers._
51
52
52_It's true that the network has now maintained continuity for almost nine months,
53_It's true that the network has now maintained continuity for almost nine months,
53−while ~zod has eaten 180GB of of events and seems no worse for the wear. This
54+while ~zod has eaten 180GB of of events and seems no worse for the wear. This
54−should not be mistaken for stability! Any data in your present urbit will need to
55+should not be mistaken for stability! Any data in your present urbit will need to
55−be retrieved by hand when the universe is finally rebooted. And of course, the
56+be retrieved by hand when the universe is finally rebooted. And of course, the
56PKI is still non-final and invalid._
57PKI is still non-final and invalid._
57
58
58_And the changes to the core `%gall` programming model will be mostly cosmetic.
59_And the changes to the core `%gall` programming model will be mostly cosmetic.
@@ -61,7 +62,7 @@ will be inside your core; little stuff like that._
61
62
62_The main change for the programmer is just that in the present `%arvo` and
63_The main change for the programmer is just that in the present `%arvo` and
63`%ames` (whose total rewrite is now being tested), message transaction handling is
64`%ames` (whose total rewrite is now being tested), message transaction handling is
64−shitty from end to end. But you're used to that. Distributed programming with
65+shitty from end to end. But you're used to that. Distributed programming with
65exactly-once transactional messages is such an awesome experience that even when
66exactly-once transactional messages is such an awesome experience that even when
66it's broken, it's kind of ok._
67it's broken, it's kind of ok._
67
68
@@ -69,7 +70,7 @@ it's broken, it's kind of ok._
69
70
70Before 0.5, Urbit ran as a single monolithic process controlling everything from
71Before 0.5, Urbit ran as a single monolithic process controlling everything from
71terminal I/O to computing and storing events. In 0.5, Urbit is split into a more
72terminal I/O to computing and storing events. In 0.5, Urbit is split into a more
72−traditional database-server architecture. Thanks to a wrapper application, casual
73+traditional database-server architecture. Thanks to a wrapper application, casual
73users don't have to notice much difference if they don't want to - except that the
74users don't have to notice much difference if they don't want to - except that the
74bottleneck in the old event code is gone, so things are a lot faster. But the new
75bottleneck in the old event code is gone, so things are a lot faster. But the new
75architecture has a lot more flexibility.
76architecture has a lot more flexibility.
@@ -77,7 +78,7 @@ architecture has a lot more flexibility.
77At the top level, there is a single urbit daemon process which runs in the
78At the top level, there is a single urbit daemon process which runs in the
78background, handling I/O. The daemon can govern multiple ships, each of which has
79background, handling I/O. The daemon can govern multiple ships, each of which has
79its own worker process to compute and record events. Terminal I/O is moved to a
80its own worker process to compute and record events. Terminal I/O is moved to a
80−separate client process, which speaks a noun-based protocol to the daemon. The
81+separate client process, which speaks a noun-based protocol to the daemon. The
81sole client isn't the only thing that can speak this protocol - there's also a
82sole client isn't the only thing that can speak this protocol - there's also a
82command-line client that can handle system admin tasks like loading piers, and
83command-line client that can handle system admin tasks like loading piers, and
83urbit commands like the current `urb.py`. You can also write your own clients if
84urbit commands like the current `urb.py`. You can also write your own clients if
@@ -85,12 +86,12 @@ you're adventurous, though `libnoun` doesn't quite reach the level of a stable A
85yet.
86yet.
86
87
87_Background: the "bottleneck" is that old event code processes its full input
88_Background: the "bottleneck" is that old event code processes its full input
88−queue before deigning to emit any outputs. This highlights Urbit's chelonian
89+queue before deigning to emit any outputs. This highlights Urbit's chelonian
89−agility with brilliantly perverse moments of inexplicable latency. We also have
90+agility with brilliantly perverse moments of inexplicable latency. We also have
90no confidence whatsoever in the data integrity of the old storage layer._
91no confidence whatsoever in the data integrity of the old storage layer._
91
92
92−_The new Urbit looks much more like a regular production server. Everything
93+_The new Urbit looks much more like a regular production server. Everything
93−outside the noun library has been replaced. We're also hoping to add FUSE access
94+outside the noun library has been replaced. We're also hoping to add FUSE access
94to the Urbit namespace, though the priority isn't immediate._
95to the Urbit namespace, though the priority isn't immediate._
95
96
96### `~pittyp-pittyp` (Anton)
97### `~pittyp-pittyp` (Anton)
@@ -99,23 +100,23 @@ I am in the middle of making an architecture change to the console protocol, wit
99the eventual goal of being able to reconnect sessions.
100the eventual goal of being able to reconnect sessions.
100
101
101_Background: the console protocol was in a sense the initial test case for Urbit
102_Background: the console protocol was in a sense the initial test case for Urbit
102−as a true OS. If you've built a working command line by passing events between
103+as a true OS. If you've built a working command line by passing events between
103separate input, history, and application subsystems, with correction/completion
104separate input, history, and application subsystems, with correction/completion
104that requires multiple writers to the input buffer, you've built an OS._
105that requires multiple writers to the input buffer, you've built an OS._
105
106
106−_On the other hand, your initial test case rarely ends up as a showcase demo. For
107+_On the other hand, your initial test case rarely ends up as a showcase demo. For
107instance, one of the things we didn't understand at first was the importance of
108instance, one of the things we didn't understand at first was the importance of
108the CQRS pattern (command-query separation) behind Urbit's separation of `%poke`
109the CQRS pattern (command-query separation) behind Urbit's separation of `%poke`
109−and `%peer`. Pokes (messages) are one-way commands, not queries. Peers
110+and `%peer`. Pokes (messages) are one-way commands, not queries. Peers
110(subscriptions) have no effect on the server state._
111(subscriptions) have no effect on the server state._
111
112
112_The relationship between pokes and peers is particulary delicate in a very
113_The relationship between pokes and peers is particulary delicate in a very
113−interactive application, like a console. Proper CQRS dictates that sending input
114+interactive application, like a console. Proper CQRS dictates that sending input
114to a virtual console, and subscribing to its updates, should be totally
115to a virtual console, and subscribing to its updates, should be totally
115−orthogonal. But needless to say, this is not how we originally did it._
116+orthogonal. But needless to say, this is not how we originally did it._
116
117
117_If you remember the last update, we are obviously asking our console for a lot of
118_If you remember the last update, we are obviously asking our console for a lot of
118−UI power. We are also redesigning `:talk` to use it even on the Web. But we have
119+UI power. We are also redesigning `:talk` to use it even on the Web. But we have
119to fix the protocol first._
120to fix the protocol first._
120
121
121### `~ravmel-ropdyl` (Galen)
122### `~ravmel-ropdyl` (Galen)
@@ -128,30 +129,30 @@ I've done two main things: adding formal decorations to Hoon, and making the Arv
128boot sequence coherent.
129boot sequence coherent.
129
130
130The coherent boot sequence puts a complete Urbit installation in a single sequence
131The coherent boot sequence puts a complete Urbit installation in a single sequence
131−of initial events. As always in the development branch, this is a true boot
132+of initial events. As always in the development branch, this is a true boot
132−sequence which proceeds directly from nock. We no longer use the `-A` flag to
133+sequence which proceeds directly from nock. We no longer use the `-A` flag to
133load the initial filesystem from an Arvo repository, nor do we boot userspace over
134load the initial filesystem from an Arvo repository, nor do we boot userspace over
134−the network. Treating the whole install as a single noun is very helpful in
135+the network. Treating the whole install as a single noun is very helpful in
135−ensuring consistency for the developer. (We're aware that distributing source
136+ensuring consistency for the developer. (We're aware that distributing source
136files jammed into a binary pill isn't optimal from the Internet's perspective --
137files jammed into a binary pill isn't optimal from the Internet's perspective --
137the only inscrutable content actually in the event stream is the self-compiling
138the only inscrutable content actually in the event stream is the self-compiling
138−compiler. A fancier interpreter should probably assemble its own boot sequence
139+compiler. A fancier interpreter should probably assemble its own boot sequence
139from a transparent resource directory, not a binary pill.)
140from a transparent resource directory, not a binary pill.)
140
141
141−For formal decorations, see the accompanying forum post. Briefly, I started from
142+For formal decorations, see the accompanying forum post. Briefly, I started from
142−an initial draft by `~ponnys-nacwer` and added a lot of elaborations. The goal is
143+an initial draft by `~ponnys-nacwer` and added a lot of elaborations. The goal is
143to get Hoon to a high level of literate programming, which documents not only APIs
144to get Hoon to a high level of literate programming, which documents not only APIs
144−but also data structures. Integrating documentation into the type system is
145+but also data structures. Integrating documentation into the type system is
145especially important on a user-friendly system with long-lived typed data
146especially important on a user-friendly system with long-lived typed data
146−structures. Hoon is now at 144 Kelvin.
147+structures. Hoon is now at 144 Kelvin.
147
148
148The parser and AST changes required for decorations also helped me find a way to
149The parser and AST changes required for decorations also helped me find a way to
149disambiguate direct and indirect Hoon syntax, eliminating the duplicate irregular
150disambiguate direct and indirect Hoon syntax, eliminating the duplicate irregular
150−syntax introduced in Hoon 151 -- if we want. Backward compatibility was almost
151+syntax introduced in Hoon 151 -- if we want. Backward compatibility was almost
151perfect, requiring only a few touchups across the whole codebase.
152perfect, requiring only a few touchups across the whole codebase.
152
153
153### Oh, and
154### Oh, and
154
155
155−This actually went up on `/fora` before anything else. Feel free to chime in on
156+This actually went up on `/fora` before anything else. Feel free to chime in on
156[this thread](http://urbit.org/fora/posts/~2017.3.1..22.06.50..bf2a~/) with
157[this thread](http://urbit.org/fora/posts/~2017.3.1..22.06.50..bf2a~/) with
157−comments and questions. We're here to answer them!
158+comments and questions. We're here to answer them!
content/updates/2017-5-11-roadmap.md+71−70
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2017.5.11 Roadmap"
2title = "~2017.5.11 Roadmap"
3−date = 2017-05-11
3+date = "2017-05-10"
4description = "From AVP to MVP."
4description = "From AVP to MVP."
5−aliases = ["/posts/2017-5-11-roadmap/", "/blog/2017.5-plans/"]
5+aliases = [ "/posts/2017-5-11-roadmap/", "/blog/2017.5-plans/" ]
6+
6[extra]
7[extra]
7author = "Curtis Yarvin + Galen Wolfe-Pauly"
8author = "Curtis Yarvin + Galen Wolfe-Pauly"
8ship = "~sorreg-namtyv + ~ravmel-ropdyl"
9ship = "~sorreg-namtyv + ~ravmel-ropdyl"
@@ -18,44 +19,44 @@ product).
18
19
19## From AVP to MVP
20## From AVP to MVP
20
21
21−Urbit is an open-source project. Its sponsor, Tlon, is a company. So we can't
22+Urbit is an open-source project. Its sponsor, Tlon, is a company. So we can't
22−exactly tell the public to _go away_. But there is nothing much the public can
23+exactly tell the public to _go away_. But there is nothing much the public can
23use Urbit for, besides hanging around and talking about Urbit.
24use Urbit for, besides hanging around and talking about Urbit.
24
25
25−Going from AVP to MVP means changing that. And of course, it means issuing real
26+Going from AVP to MVP means changing that. And of course, it means issuing real
26−Urbit keys. And promoting Urbit to users. And preaching it at developers. And
27+Urbit keys. And promoting Urbit to users. And preaching it at developers. And
27−all that normal stuff. But not until we're ready, because we ship only the most
28+all that normal stuff. But not until we're ready, because we ship only the most
28beautiful bits.
29beautiful bits.
29
30
30Sometimes we forget to remind people that _no one has ever built anything even
31Sometimes we forget to remind people that _no one has ever built anything even
31−remotely like Urbit_. It's not like, people had cars, so we built a better car.
32+remotely like Urbit_. It's not like, people had cars, so we built a better car.
32It's like, people had cars, so we built a [rocket unicycle](https://media.urbit.org/whitepaper.pdf).
33It's like, people had cars, so we built a [rocket unicycle](https://media.urbit.org/whitepaper.pdf).
33
34
34−Our rocket unicycle is a lot more awesome than a Chevy. But it demands more
35+Our rocket unicycle is a lot more awesome than a Chevy. But it demands more
35−custom engineering. We have to invent every little widget as we need it.
36+custom engineering. We have to invent every little widget as we need it.
36Usually that involves rebuilding it two or three times (see the (see the [long-term
37Usually that involves rebuilding it two or three times (see the (see the [long-term
37−strategy](/essays/toward-a-frozen-operating-system/)). This process converges
38+strategy](/essays/toward-a-frozen-operating-system/)). This process converges
38from the bottom of the stack up, and accelerates as our progress advances.
39from the bottom of the stack up, and accelerates as our progress advances.
39
40
40Nock, which is now frozen, and which is a page of pseudocode, took from 2002 to
41Nock, which is now frozen, and which is a page of pseudocode, took from 2002 to
41−2008 to invent. Hoon took from 2008 to 2012, and is stable but not frozen. All
42+2008 to invent. Hoon took from 2008 to 2012, and is stable but not frozen. All
42the real technical problems in 2016 Urbit are either in the top layers (Arvo,
43the real technical problems in 2016 Urbit are either in the top layers (Arvo,
43its vanes and apps), or outside Urbit proper (Vere, the Unix event processor).
44its vanes and apps), or outside Urbit proper (Vere, the Unix event processor).
44
45
45Except for one major component (the security vault `%jael`), there isn't any
46Except for one major component (the security vault `%jael`), there isn't any
46−single big thing wrong with 2016 Arvo or Vere. In retrospect, they can even be
47+single big thing wrong with 2016 Arvo or Vere. In retrospect, they can even be
47−seen as inspired stabs in the right direction. But hammering square pegs into
48+seen as inspired stabs in the right direction. But hammering square pegs into
48round holes isn't the Urbit way.
49round holes isn't the Urbit way.
49
50
50If we made our AVP into an MVP by straight-out _debugging_, we'd be limping
51If we made our AVP into an MVP by straight-out _debugging_, we'd be limping
51−across the finish line. An MVP must be minimal in affordances. In its
52+across the finish line. An MVP must be minimal in affordances. In its
52−aesthetics, it must be sublime. It has the rest of its life to grow features,
53+aesthetics, it must be sublime. It has the rest of its life to grow features,
53but beauty only fades.
54but beauty only fades.
54
55
55## A parallel process
56## A parallel process
56
57
57−Architecture is entropy in reverse. Urbit has to become _more_ elegant, as it
58+Architecture is entropy in reverse. Urbit has to become _more_ elegant, as it
58−becomes more functional. This delicate process must be carefully controlled.
59+becomes more functional. This delicate process must be carefully controlled.
59
60
60To keep Urbit on the path to absolute zero, we have to work in three directions at
61To keep Urbit on the path to absolute zero, we have to work in three directions at
61the same time:
62the same time:
@@ -64,56 +65,56 @@ the same time:
64- Developing the Urbit user experience
65- Developing the Urbit user experience
65- Documenting the Urbit system
66- Documenting the Urbit system
66
67
67−Pushing in all three directions at once keeps the whole project in balance. We
68+Pushing in all three directions at once keeps the whole project in balance. We
68−could drop any two of these goals and head at top speed for the other. This
69+could drop any two of these goals and head at top speed for the other. This
69would produce a nice simulation of doneness in a single dimension.
70would produce a nice simulation of doneness in a single dimension.
70
71
71But if we just hardened our infrastructure from the bottom up, we wouldn't be
72But if we just hardened our infrastructure from the bottom up, we wouldn't be
72−responding to the needs of the user experience. If we just built a user
73+responding to the needs of the user experience. If we just built a user
73experience on top of our prototype infrastructure, it wouldn't be stable enough
74experience on top of our prototype infrastructure, it wouldn't be stable enough
74to be usable. If we documented the prototype, it would become much harder to
75to be usable. If we documented the prototype, it would become much harder to
75−revise. And so on.
76+revise. And so on.
76
77
77−And the balance between these directions shifts with the seasons. After
78+And the balance between these directions shifts with the seasons. After
78spending the fall and winter writing infrastructure, and the spring testing it,
79spending the fall and winter writing infrastructure, and the spring testing it,
79it'll be time to spend summer and fall working toward the user and the
80it'll be time to spend summer and fall working toward the user and the
80developer.
81developer.
81
82
82## Since the last crowdsale
83## Since the last crowdsale
83
84
84−Maybe this is too vague. What we actually did since the last crowdsale:
85+Maybe this is too vague. What we actually did since the last crowdsale:
85
86
86We replaced about half the Unix interpreter (the whole `vere` directory, event
87We replaced about half the Unix interpreter (the whole `vere` directory, event
87handing and storage), and about a third of Arvo: the lifecycle function, boot
88handing and storage), and about a third of Arvo: the lifecycle function, boot
88sequence and kernel `%arvo`, the network `%ames`, the PKI (adding a new security
89sequence and kernel `%arvo`, the network `%ames`, the PKI (adding a new security
89−module `%jael`), the console `:drum`, and the `:talk` app. If Arvo was a car, we
90+module `%jael`), the console `:drum`, and the `:talk` app. If Arvo was a car, we
90replaced the powertrain.
91replaced the powertrain.
91
92
92At the Hoon level, we added formal docstrings and reorganized (or rather,
93At the Hoon level, we added formal docstrings and reorganized (or rather,
93−organized) the kernel and standard library. At the Nock level, we of course did
94+organized) the kernel and standard library. At the Nock level, we of course did
94−nothing. And on the client side, we redesigned the Web API, and prototyped a
95+nothing. And on the client side, we redesigned the Web API, and prototyped a
95−completely new Urbit user experience. And all the new code is high-quality,
96+completely new Urbit user experience. And all the new code is high-quality,
96fully documented, and generally ready for anyone to copy and/or abuse.
97fully documented, and generally ready for anyone to copy and/or abuse.
97
98
98This `cc-release` (continuity candidate) isn't quite done — the Arvo code is
99This `cc-release` (continuity candidate) isn't quite done — the Arvo code is
99written but not fully tested, and one module (the application sandbox `%gall`)
100written but not fully tested, and one module (the application sandbox `%gall`)
100−is still waiting for its rewrite. But the new Arvo has that "not quite perfect,
101+is still waiting for its rewrite. But the new Arvo has that "not quite perfect,
101but basically right" feeling of architectural doneness which Hoon has had for a
102but basically right" feeling of architectural doneness which Hoon has had for a
102while.
103while.
103
104
104−Note that we remain a super-tiny team. We've had some serious outside
105+Note that we remain a super-tiny team. We've had some serious outside
105contributions, but clean loose ends that outsiders can pull on remain
106contributions, but clean loose ends that outsiders can pull on remain
106−frustratingly scarce. Hoon is too stable and Arvo is too unstable.
107+frustratingly scarce. Hoon is too stable and Arvo is too unstable.
107Architectural work scales poorly in personnel, and you can't really renovate a
108Architectural work scales poorly in personnel, and you can't really renovate a
108house while people are trying to live in it.
109house while people are trying to live in it.
109
110
110## Moving forward
111## Moving forward
111
112
112After `cc-release` this summer, we'll move from bottom-up, infrastructure-driven
113After `cc-release` this summer, we'll move from bottom-up, infrastructure-driven
113−engineering, to top-down, user-driven engineering. Naturally this is
114+engineering, to top-down, user-driven engineering. Naturally this is
114`dd-release` (deck-directed).
115`dd-release` (deck-directed).
115
116
116−Our planning target is a stable, useful Urbit we can ship in 2017. Since we're
117+Our planning target is a stable, useful Urbit we can ship in 2017. Since we're
117working top-down, we can abandon the deep architectural essays and work, like
118working top-down, we can abandon the deep architectural essays and work, like
118normal human beings, from an illegible list of features scribbled on a
119normal human beings, from an illegible list of features scribbled on a
119poorly-erased whiteboard.
120poorly-erased whiteboard.
@@ -123,34 +124,34 @@ poorly-erased whiteboard.
123Our feature list for `dd-release`, in no particular order:
124Our feature list for `dd-release`, in no particular order:
124
125
125- The top-level `:deck` UI, an interaction multiplexer like GNU screen, but for
126- The top-level `:deck` UI, an interaction multiplexer like GNU screen, but for
126− terminals or web consoles. (The front end of `:deck` is a working prototype
127+ terminals or web consoles. (The front end of `:deck` is a working prototype
127 now.)
128 now.)
128
129
129- The "helpful console," which offers contextual help and lets you construct any
130- The "helpful console," which offers contextual help and lets you construct any
130− dojo command with a wizard-style UI. The three-way combination of a command
131+ dojo command with a wizard-style UI. The three-way combination of a command
131 parser, contextual completion and help, and webform input, may be our most
132 parser, contextual completion and help, and webform input, may be our most
132− interesting little challenge. We think we know to do it.
133+ interesting little challenge. We think we know to do it.
133
134
134- Useful, well-designed web API integrations which contributors can easily clone
135- Useful, well-designed web API integrations which contributors can easily clone
135− to extend Urbit's reach. Stars can proxy APIs for their planets, metering
136+ to extend Urbit's reach. Stars can proxy APIs for their planets, metering
136 free service.
137 free service.
137
138
138- Integrations for email and SMS are live, so that any ship can at least message
139- Integrations for email and SMS are live, so that any ship can at least message
139− its owner. A storage integration to S3, etc, lets us save external blobs. A
140+ its owner. A storage integration to S3, etc, lets us save external blobs. A
140 DNS integration lets us forward ship.urbit.org to ships with public IPs.
141 DNS integration lets us forward ship.urbit.org to ships with public IPs.
141
142
142−- Real keys are ready to be born. An instantiation protocol for the real Urbit
143+- Real keys are ready to be born. An instantiation protocol for the real Urbit
143− keys exists and has received some public review. The current options:
144+ keys exists and has received some public review. The current options:
144 physical delivery of tamper-resistant artifacts, or registering ownership on
145 physical delivery of tamper-resistant artifacts, or registering ownership on
145− Ethereum or another blockchain. (We'll release a separate essay on this
146+ Ethereum or another blockchain. (We'll release a separate essay on this
146 question soon.)
147 question soon.)
147
148
148- All key updates at the planet level or above are propagated hierarchically
149- All key updates at the planet level or above are propagated hierarchically
149− across the network. An offline key can block all transfers. Planet owners
150+ across the network. An offline key can block all transfers. Planet owners
150 can invite their friends to a self-hosted conversation with webmoons (guest
151 can invite their friends to a self-hosted conversation with webmoons (guest
151 accounts).
152 accounts).
152
153
153−- The `%eyre` HTTP server is cleaned up and its API simplified. Web
154+- The `%eyre` HTTP server is cleaned up and its API simplified. Web
154 programmers see a clear, CQRS-based query and subscription interface in JSON.
155 programmers see a clear, CQRS-based query and subscription interface in JSON.
155 A cookie makes your browser into a virtual moon, with a unique causal identity
156 A cookie makes your browser into a virtual moon, with a unique causal identity
156 for each page instance.
157 for each page instance.
@@ -159,75 +160,75 @@ Our feature list for `dd-release`, in no particular order:
159 with just the private key.
160 with just the private key.
160
161
161- Personal urbits on a home computer don't lose data, except in case of
162- Personal urbits on a home computer don't lose data, except in case of
162− system/OS failure. Mutual exclusion on interrupt handlers is perfect.
163+ system/OS failure. Mutual exclusion on interrupt handlers is perfect.
163− Timeouts, crashes, and user interrupts are handled perfectly. Snapshot
164+ Timeouts, crashes, and user interrupts are handled perfectly. Snapshot
164 handling is asynchronous and uses two A/B images.
165 handling is asynchronous and uses two A/B images.
165
166
166- Urbits are configured to rotate logs by default, so they don't grow
167- Urbits are configured to rotate logs by default, so they don't grow
167− infinitely. All caches have continuous expiration, and out-of-memory can't
168+ infinitely. All caches have continuous expiration, and out-of-memory can't
168− sink a ship. The Web server is secure and has adequate performance without
169+ sink a ship. The Web server is secure and has adequate performance without
169 an external cache or any auxiliary servers.
170 an external cache or any auxiliary servers.
170
171
171- Urbit can connect its event loop to Kafka or a similar event replication
172- Urbit can connect its event loop to Kafka or a similar event replication
172− service. Replicated urbits on a hosted service don't lose data, except
173+ service. Replicated urbits on a hosted service don't lose data, except
173 through acts of God or government.
174 through acts of God or government.
174
175
175- One star on a normal virtual host can comfortably manage at least 256 active
176- One star on a normal virtual host can comfortably manage at least 256 active
176− planets. Dormant planets consume minimal local or remote resources.
177+ planets. Dormant planets consume minimal local or remote resources.
177
178
178−- The whole Urbit stack is managed with telescoping Kelvin numbers. Upgrades
179+- The whole Urbit stack is managed with telescoping Kelvin numbers. Upgrades
179− succeed perfectly or crash the transaction. The stack is permanently
180+ succeed perfectly or crash the transaction. The stack is permanently
180 upgradeable, even for backward-incompatible changes in Hoon.
181 upgradeable, even for backward-incompatible changes in Hoon.
181
182
182−- Hand maintenance is only needed to upgrade the Unix interpreter, vere. The
183+- Hand maintenance is only needed to upgrade the Unix interpreter, vere. The
183 owner gets a notification when an obsolete `vere` blocks an Urbit update.
184 owner gets a notification when an obsolete `vere` blocks an Urbit update.
184
185
185−- The new security masks are respected across all vanes. The revision-control
186+- The new security masks are respected across all vanes. The revision-control
186− system `%clay` has permission masks. Untrusted code can be installed as a
187+ system `%clay` has permission masks. Untrusted code can be installed as a
187 gateway to a foreign service with same-origin network permissions.
188 gateway to a foreign service with same-origin network permissions.
188
189
189- Backward-incompatible changes in the Hoon language or Hoon libraries are
190- Backward-incompatible changes in the Hoon language or Hoon libraries are
190− unlikely. But the Arvo upgrade mechanism can make arbitrary Hoon changes,
191+ unlikely. But the Arvo upgrade mechanism can make arbitrary Hoon changes,
191 compatible or not.
192 compatible or not.
192
193
193−- All major Arvo subsystems are architecturally stable. Namespaces, cards, URL
194+- All major Arvo subsystems are architecturally stable. Namespaces, cards, URL
194− routes, the boot sequence, and the upgrade model, are well-specified. Further
195+ routes, the boot sequence, and the upgrade model, are well-specified. Further
195− change in these specs will involve a slow-track community process. But the
196+ change in these specs will involve a slow-track community process. But the
196 definitions are stable enough to be taught.
197 definitions are stable enough to be taught.
197
198
198- Architectural overviews of all major Arvo components are attached to the
199- Architectural overviews of all major Arvo components are attached to the
199− source code. Tutorial documentation for both Hoon and Arvo is good enough to
200+ source code. Tutorial documentation for both Hoon and Arvo is good enough to
200 lead a naive programmer up through building a web API gateway (server side
201 lead a naive programmer up through building a web API gateway (server side
201 Hoon) and a web agent (client side JS).
202 Hoon) and a web agent (client side JS).
202
203
203- Urbit stores and manages all Urbit-related development metadata: todos, bugs,
204- Urbit stores and manages all Urbit-related development metadata: todos, bugs,
204− releases, PRs, discussion, etc. It routes this metadata through `:talk` and
205+ releases, PRs, discussion, etc. It routes this metadata through `:talk` and
205 logs it to `%clay`.
206 logs it to `%clay`.
206
207
207- A precise system coding convention is in place and enforced, if only by
208- A precise system coding convention is in place and enforced, if only by
208− measurement. All code in Urbit is graded A, B, or C. Grade A Hoon ("Prime")
209+ measurement. All code in Urbit is graded A, B, or C. Grade A Hoon ("Prime")
209− is well-structured and well-explained. Grade B ("Select") is well-structured,
210+ is well-structured and well-explained. Grade B ("Select") is well-structured,
210− but not well-explained. Grade C ("Choice") is still great code, but its
211+ but not well-explained. Grade C ("Choice") is still great code, but its
211 style or technique may not meet our latest standards.
212 style or technique may not meet our latest standards.
212
213
213- All code in Urbit except `++ut` (the compiler itself) is grade B. (We can
214- All code in Urbit except `++ut` (the compiler itself) is grade B. (We can
214− relax standards on the compiler because it tests itself so thoroughly.) All
215+ relax standards on the compiler because it tests itself so thoroughly.) All
215 code on the Arvo powertrain (`%arvo`, `%ames`, `%jael`, `%gall`, `:dojo`,
216 code on the Arvo powertrain (`%arvo`, `%ames`, `%jael`, `%gall`, `:dojo`,
216 `:helm`) is grade A.
217 `:helm`) is grade A.
217
218
218If you know the current maintenance Urbit, you know that most of these features
219If you know the current maintenance Urbit, you know that most of these features
219−are mostly in sight. None of them is exactly _quite_ complete. None of them is
220+are mostly in sight. None of them is exactly _quite_ complete. None of them is
220−anywhere near a stretch. We have significant parts of all of them.
221+anywhere near a stretch. We have significant parts of all of them.
221
222
222Also, since this is the release after the release we're doing now, we're
223Also, since this is the release after the release we're doing now, we're
223−probably missing as many checkboxes as we've caught. And triage is a thing
224+probably missing as many checkboxes as we've caught. And triage is a thing
224that happens. It's really better understood as the _kind_ of work we're going
225that happens. It's really better understood as the _kind_ of work we're going
225to do.
226to do.
226
227
227−We'd really like to get all these things done in 2017. But a lot depends on
228+We'd really like to get all these things done in 2017. But a lot depends on
228−what kinds of resources we have access to. And of course, as we document the
229+what kinds of resources we have access to. And of course, as we document the
229system, it gets easier for all the people who believe in Urbit to help us build
230system, it gets easier for all the people who believe in Urbit to help us build
230it.
231it.
231
232
232−As usual, comments are on fora. Check out
233+As usual, comments are on fora. Check out
233[this thread](https://urbit.org/fora/posts/~2017.5.12..20.33.04..3db0~/).
234[this thread](https://urbit.org/fora/posts/~2017.5.12..20.33.04..3db0~/).
content/updates/2017-8-11-update.md+30−31
@@ -1,37 +1,36 @@
1+++
1+++
2title = "~2017.8.11 Update"
2title = "~2017.8.11 Update"
3−date = 2017-08-11
3+date = "2017-08-10"
4description = "A short update from the Tlon team for the week of ~2017.8.11."
4description = "A short update from the Tlon team for the week of ~2017.8.11."
5−aliases = ["/posts/2017-8-11-update/"]
5+aliases = [ "/posts/2017-8-11-update/" ]
6+
6[extra]
7[extra]
7author = "Curtis Yarvin + Galen Wolfe-Pauly"
8author = "Curtis Yarvin + Galen Wolfe-Pauly"
8ship = "~sorreg-namtyv + ~ravmel-ropdyl"
9ship = "~sorreg-namtyv + ~ravmel-ropdyl"
9+++
10+++
10
11
11−Usually after a crowdsale we rethink our direction a little. Sorry for the
12+Usually after a crowdsale we rethink our direction a little. Sorry for the
12radio silence — it's hard to talk while you're thinking.
13radio silence — it's hard to talk while you're thinking.
13
14
14We've decided to refocus our efforts a little in the short term, optimizing
15We've decided to refocus our efforts a little in the short term, optimizing
15against long-term infrastructure work in favor of making Urbit work better
16against long-term infrastructure work in favor of making Urbit work better
16−right now. Bear in mind that this is a short-term decision and Urbit is still
17+right now. Bear in mind that this is a short-term decision and Urbit is still
17−a long-term project! We just find ourselves in, um, a very fast-moving
18+a long-term project! We just find ourselves in, um, a very fast-moving
18industry.
19industry.
19
20
20There are two sides to this effort: design/usability and stability.
21There are two sides to this effort: design/usability and stability.
21
22
22−
23## Design and usability
23## Design and usability
24
24
25−
26### Making static publishing static
25### Making static publishing static
27
26
28−`:tree`, the Urbit publishing framework, can be painfully slow. In part, this
27+`:tree`, the Urbit publishing framework, can be painfully slow. In part, this
29−is because we do too much work client-side to put pages together. It would make
28+is because we do too much work client-side to put pages together. It would make
30a lot more sense for a page to be a single fixed function of a URL -- the
29a lot more sense for a page to be a single fixed function of a URL -- the
31original "functional publishing" design.
30original "functional publishing" design.
32
31
33−So, we've gone and made that actually work. Server-side includes will now be
32+So, we've gone and made that actually work. Server-side includes will now be
34−possible, since we're adding a Markdown subset to Hoon itself. We're also going
33+possible, since we're adding a Markdown subset to Hoon itself. We're also going
35to improve Vere's internal HTTP server to include our own caching with proper
34to improve Vere's internal HTTP server to include our own caching with proper
36dependency invalidation.
35dependency invalidation.
37
36
@@ -39,40 +38,40 @@ dependency invalidation.
39
38
40![](https://storage.googleapis.com/media.urbit.org/site/type-2-up.png)
39![](https://storage.googleapis.com/media.urbit.org/site/type-2-up.png)
41
40
42−Currently, all of Urbit's CSS and styling is based on Bootstrap. It's not a
41+Currently, all of Urbit's CSS and styling is based on Bootstrap. It's not a
43−very good fit. We do a lot of work to override the default styles.
42+very good fit. We do a lot of work to override the default styles.
44
43
45While we were improving some of our example apps a little while back it became
44While we were improving some of our example apps a little while back it became
46−obvious that we need our own base CSS and style guide. So, we went ahead and
45+obvious that we need our own base CSS and style guide. So, we went ahead and
47−started down that path. After years of working with other CSS frameworks, it's
46+started down that path. After years of working with other CSS frameworks, it's
48a relief to be producing one that's purpose-built for Urbit itself.
47a relief to be producing one that's purpose-built for Urbit itself.
49
48
50−Urbit is a tool, so its branding needs to be completely calm and quiet. It
49+Urbit is a tool, so its branding needs to be completely calm and quiet. It
51−can't get in the way. In a way, a CSS framework is the brand itself. Urbit
50+can't get in the way. In a way, a CSS framework is the brand itself. Urbit
52−isn't a logo or a tagline — it's a look and feel. This way, it's a look and
51+isn't a logo or a tagline — it's a look and feel. This way, it's a look and
53feel that you can also send pull requests to.
52feel that you can also send pull requests to.
54
53
55There's a working prototype of this style guide today, and we'll publish a repo
54There's a working prototype of this style guide today, and we'll publish a repo
56−sometime in the next week or two. Hopefully some substantive design discussions
55+sometime in the next week or two. Hopefully some substantive design discussions
57can be had in connection with the code itself.
56can be had in connection with the code itself.
58
57
59### Write, talk, socialize
58### Write, talk, socialize
60
59
61![](https://storage.googleapis.com/media.urbit.org/site/app-2-up.png)
60![](https://storage.googleapis.com/media.urbit.org/site/app-2-up.png)
62
61
63−We already use Urbit to chat and write, but the edges are pretty rough. Better,
62+We already use Urbit to chat and write, but the edges are pretty rough. Better,
64faster publishing and a look and feel refresh will allow us to update and clean
63faster publishing and a look and feel refresh will allow us to update and clean
65−up our existing tools for chatting and writing. Hopefully to the point that
64+up our existing tools for chatting and writing. Hopefully to the point that
66−they clear the 'Facebook 2004' bar. But, of course, in a pretty different way.
65+they clear the 'Facebook 2004' bar. But, of course, in a pretty different way.
67
66
68## Examples
67## Examples
69
68
70![](https://storage.googleapis.com/media.urbit.org/site/examples-screen.png)
69![](https://storage.googleapis.com/media.urbit.org/site/examples-screen.png)
71
70
72−Also, our examples repo is now hosted on Urbit itself. You can just `|sync` a
71+Also, our examples repo is now hosted on Urbit itself. You can just `|sync` a
73desk and open a URL on your own Urbit to view the examples.
72desk and open a URL on your own Urbit to view the examples.
74
73
75−Try it yourself! The instructions are in
74+Try it yourself! The instructions are in
76[this fora post](https://urbit.org/fora/posts/~2017.8.3..20.53.26..c361~/).
75[this fora post](https://urbit.org/fora/posts/~2017.8.3..20.53.26..c361~/).
77If you've got ideas for examples to contribute, that'd be great.
76If you've got ideas for examples to contribute, that'd be great.
78The source is on [GitHub](https://github.com/urbit/examples).
77The source is on [GitHub](https://github.com/urbit/examples).
@@ -82,23 +81,23 @@ to syndicate his Tumblr through Urbit.
82
81
83## Remaint
82## Remaint
84
83
85−The last test network managed to stay up for about a year. That's pretty good!
84+The last test network managed to stay up for about a year. That's pretty good!
86During that time we discovered a few bugs that would cause urbits to end up in
85During that time we discovered a few bugs that would cause urbits to end up in
87−one-way-connectivity. A short explanation is that remote crashes would often
86+one-way-connectivity. A short explanation is that remote crashes would often
88not get properly passed back to the requesting ship.
87not get properly passed back to the requesting ship.
89
88
90−So we fixed that. We could probably hack this change in via an OTA update, but
89+So we fixed that. We could probably hack this change in via an OTA update, but
91it's much easier to breach this change in, and it'll be great to have it out on
90it's much easier to breach this change in, and it'll be great to have it out on
92−the network. So, we'll be doing a breach once the code has been properly
91+the network. So, we'll be doing a breach once the code has been properly
93tested.
92tested.
94
93
95## Urbit + ETH
94## Urbit + ETH
96
95
97Finally, we've been working on a design for how Urbit can bootstrap itself off
96Finally, we've been working on a design for how Urbit can bootstrap itself off
98−of the Ethereum blockchain. We have a loose specification of how this could
97+of the Ethereum blockchain. We have a loose specification of how this could
99happen, and will present those at the meetup
98happen, and will present those at the meetup
100−[tonight](https://www.meetup.com/urbit-sf/events/242295411/). Come, critique
99+[tonight](https://www.meetup.com/urbit-sf/events/242295411/). Come, critique
101−and ask questions. We'll publish what we come up with in the coming weeks.
100+and ask questions. We'll publish what we come up with in the coming weeks.
102
101
103## Keep in touch
102## Keep in touch
104
103
content/updates/2017-9-23-update.md+3−2
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2017.9.23 Update"
2title = "~2017.9.23 Update"
3−date = 2017-09-23
3+date = "2017-09-22"
4description = "A short update from the Tlon team for the week of ~2017.9.23."
4description = "A short update from the Tlon team for the week of ~2017.9.23."
5−aliases = ["/posts/2017-9-23-update/"]
5+aliases = [ "/posts/2017-9-23-update/" ]
6+
6[extra]
7[extra]
7author = ""
8author = ""
8ship = "tonlur-sarret"
9ship = "tonlur-sarret"
content/updates/2017-9-29-update.md+3−2
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2017.9.29 Update"
2title = "~2017.9.29 Update"
3−date = 2017-09-29
3+date = "2017-09-28"
4description = "A short update from the Tlon team for the week of ~2017.9.29."
4description = "A short update from the Tlon team for the week of ~2017.9.29."
5−aliases = ["/posts/2017-9-29-update/"]
5+aliases = [ "/posts/2017-9-29-update/" ]
6+
6[extra]
7[extra]
7author = ""
8author = ""
8ship = "tonlur-sarret"
9ship = "tonlur-sarret"
content/updates/2018-1-13-update.md+3−2
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.1.13 Update"
2title = "~2018.1.13 Update"
3−date = 2018-01-13
3+date = "2018-01-12"
4description = "A short update from the Tlon team for the week of ~2018.1.13."
4description = "A short update from the Tlon team for the week of ~2018.1.13."
5−aliases = ["/posts/2018-1-13-update/"]
5+aliases = [ "/posts/2018-1-13-update/" ]
6+
6[extra]
7[extra]
7author = ""
8author = ""
8ship = "~rovnys-ricfer"
9ship = "~rovnys-ricfer"
content/updates/2018-1-6-update.md+11−10
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.1.6 Update"
2title = "~2018.1.6 Update"
3−date = 2018-01-06
3+date = "2018-01-05"
4description = "A short update from the Tlon team for the week of ~2018.1.6."
4description = "A short update from the Tlon team for the week of ~2018.1.6."
5−aliases = ["/posts/2018-1-6-update/"]
5+aliases = [ "/posts/2018-1-6-update/" ]
6+
6[extra]
7[extra]
7author = ""
8author = ""
8ship = "~rovnys-ricfer"
9ship = "~rovnys-ricfer"
@@ -13,25 +14,25 @@ complete!
13
14
14Feel free to download it and try it out: https://github.com/urbit/etherwallet
15Feel free to download it and try it out: https://github.com/urbit/etherwallet
15
16
16−Thanks to *Anthony* `~poldec-tonteg` for building it and to Mark for testing it.
17+Thanks to _Anthony_ `~poldec-tonteg` for building it and to Mark for testing it.
17
18
18−*Mark* `~palfun-foslup` has diagnosed [a tricky bug](https://github.com/urbit/arvo/issues/533) involving what appeared to
19+_Mark_ `~palfun-foslup` has diagnosed [a tricky bug](https://github.com/urbit/arvo/issues/533) involving what appeared to
19be one-way communication in Gall. More updates on that forthcoming.
20be one-way communication in Gall. More updates on that forthcoming.
20
21
21−*Galen* `~ravmel-ropdyl` has been working on the Urbit primer that will become the new urbit.org landing page. That's in
22+_Galen_ `~ravmel-ropdyl` has been working on the Urbit primer that will become the new urbit.org landing page. That's in
22review now.
23review now.
23
24
24−*Curtis* `~sorreg-namtyv` has been helping out with the primer and has begun work on an HTTP cache in Vere to help with
25+_Curtis_ `~sorreg-namtyv` has been helping out with the primer and has begun work on an HTTP cache in Vere to help with
25web performance. That should synergize nicely with upcoming Ford fixes.
26web performance. That should synergize nicely with upcoming Ford fixes.
26
27
27−*Ted* `~rovnys-ricfer` has been modernizing his and Anton's work on Ford caching to work with new Hoon and Arvo.
28+_Ted_ `~rovnys-ricfer` has been modernizing his and Anton's work on Ford caching to work with new Hoon and Arvo.
28
29
29−*Keaton* `~tonlur-sarret` has been helping Ted with Ford. With Mark's help, he also moved Fora onto a standalone ship to
30+_Keaton_ `~tonlur-sarret` has been helping Ted with Ford. With Mark's help, he also moved Fora onto a standalone ship to
30improve the loading times of the rest of urbit.org. All the old links still work, but Fora's true home is now at
31improve the loading times of the rest of urbit.org. All the old links still work, but Fora's true home is now at
31[https://fora.urbit.org](https://fora.urbit.org).
32[https://fora.urbit.org](https://fora.urbit.org).
32
33
33−*Isaac* `~davtyr-nimren` has made some [more
34+_Isaac_ `~davtyr-nimren` has made some [more
34progress](https://github.com/ixv/arvo/commit/bc52d9fc494399c2063cfa7817046d180b6f78d5) on the new static webpage serving
35progress](https://github.com/ixv/arvo/commit/bc52d9fc494399c2063cfa7817046d180b6f78d5) on the new static webpage serving
35(`ren/tree`).
36(`ren/tree`).
36
37
37−Early 2018 should see a lot of usability improvements. We're looking forward to being able to ship them soon.
38+Early 2018 should see a lot of usability improvements. We're looking forward to being able to ship them soon.
content/updates/2018-10-12-update.md+13−12
@@ -1,9 +1,10 @@
1+++
1+++
2title = "~2018.10.12 Update"
2title = "~2018.10.12 Update"
3−date = 2018-10-12
3+date = "2018-10-11"
4description = "A short update from the Tlon team for the week of ~2018.10.12."
4description = "A short update from the Tlon team for the week of ~2018.10.12."
5slug = "2018-10-12-update"
5slug = "2018-10-12-update"
6−aliases = ["/posts/2018-10-12-update/"]
6+aliases = [ "/posts/2018-10-12-update/" ]
7+
7[extra]
8[extra]
8author = "Rob"
9author = "Rob"
9ship = "~lodleb-ritrul"
10ship = "~lodleb-ritrul"
@@ -17,8 +18,8 @@ It's an exciting time here at Tlon.
17The Keys team is toiling to make the Urbit Wallet air-tight and foolproof. The
18The Keys team is toiling to make the Urbit Wallet air-tight and foolproof. The
18Urbit Wallet, a cousin to the more typical cryptocurrency wallet, is an original
19Urbit Wallet, a cousin to the more typical cryptocurrency wallet, is an original
19system for securing cryptographic assets. It's original enough to demand its own
20system for securing cryptographic assets. It's original enough to demand its own
20−Manual, a document that *Will* `~hadrud-lodsef`, *Rob* `~lodleb-ritrul`, and
21+Manual, a document that _Will_ `~hadrud-lodsef`, _Rob_ `~lodleb-ritrul`, and
21−*Morgan* `~hidrel-fabtel` are in the process of perfecting. The Wallet Manual
22+_Morgan_ `~hidrel-fabtel` are in the process of perfecting. The Wallet Manual
22will be a one-stop shop for information on using the Urbit Wallet system, both
23will be a one-stop shop for information on using the Urbit Wallet system, both
23general concepts and technical details.
24general concepts and technical details.
24
25
@@ -27,29 +28,29 @@ attempt is probably lying. The Keys team are an honest bunch, and they've
27decided to simplify our in-house wallet-generation software into something that
28decided to simplify our in-house wallet-generation software into something that
28produces one Urbit Wallet for each ship. That wallet generator provides secret
29produces one Urbit Wallet for each ship. That wallet generator provides secret
29keys to users in the form of PDFs, and these PDFs have been redesigned by
30keys to users in the form of PDFs, and these PDFs have been redesigned by
30−*Gavin* `~riglur-figbud` so that they are more informative and easier to
31+_Gavin_ `~riglur-figbud` so that they are more informative and easier to
31organize.
32organize.
32
33
33−Gavin and *Jimmy* `~fallyn-balfus` are designing the UI flows for software
34+Gavin and _Jimmy_ `~fallyn-balfus` are designing the UI flows for software
34that takes the grief out of accessing your ships on the blockchain. This is
35that takes the grief out of accessing your ships on the blockchain. This is
35distinct from the aforementioned wallet-generation software which helps you
36distinct from the aforementioned wallet-generation software which helps you
36secure your ships on the blockchain, but we will soon to merge the two apps into
37secure your ships on the blockchain, but we will soon to merge the two apps into
37a combined application known as Bridge.
38a combined application known as Bridge.
38
39
39Our foreign correspondents are lending their talents to the Bridge mission.
40Our foreign correspondents are lending their talents to the Bridge mission.
40−New Zealand's *Jared* `~nidsut-tomdun` has been working on the attendant
41+New Zealand's _Jared_ `~nidsut-tomdun` has been working on the attendant
41key-derivation library, and is also creating the library for displaying
42key-derivation library, and is also creating the library for displaying
42−Urbit Wallet tickets as human-memorable strings. *Mark* `~palfun-foslup`, our
43+Urbit Wallet tickets as human-memorable strings. _Mark_ `~palfun-foslup`, our
43beloved Dutchman, worked with Jared to develop a JavaScript interface to the
44beloved Dutchman, worked with Jared to develop a JavaScript interface to the
44Urbit constitution.
45Urbit constitution.
45
46
46The infrastructure team has labored clanking towards the goal of making Vere
47The infrastructure team has labored clanking towards the goal of making Vere
47−less clanky. Two of *Paul's* `~fodwyt-ragful` changes -- a custom-bytecode
48+less clanky. Two of _Paul's_ `~fodwyt-ragful` changes -- a custom-bytecode
48Nock interpreter and a new jet dashboard -- have been integrated, resulting in a
49Nock interpreter and a new jet dashboard -- have been integrated, resulting in a
49faster and more robust Urbit. Nock itself was updated, too, with the notable
50faster and more robust Urbit. Nock itself was updated, too, with the notable
50−addition being the Nock 12 "edit" operator. Paul, *Ted* `~rovnys-ricfer`, and
51+addition being the Nock 12 "edit" operator. Paul, _Ted_ `~rovnys-ricfer`, and
51−*Joe* `~master-morzod` joined forces to make this happen, and borrowed our
52+_Joe_ `~master-morzod` joined forces to make this happen, and borrowed our
52−resident logician *Josh* `~taglux-nidsep` from the docs team to check it for
53+resident logician _Josh_ `~taglux-nidsep` from the docs team to check it for
53correctness.
54correctness.
54
55
55All of the above points to the big enchilada: using the Constitution as the
56All of the above points to the big enchilada: using the Constitution as the
content/updates/2018-10-24-update.md+8−7
@@ -1,9 +1,10 @@
1+++
1+++
2title = "~2018.10.24 Update"
2title = "~2018.10.24 Update"
3−date = 2018-10-24
3+date = "2018-10-23"
4description = "A short update from the Tlon team for the week of ~2018.10.24."
4description = "A short update from the Tlon team for the week of ~2018.10.24."
5slug = "2018-10-24-update"
5slug = "2018-10-24-update"
6−aliases = ["/posts/2018-10-24-update/"]
6+aliases = [ "/posts/2018-10-24-update/" ]
7+
7[extra]
8[extra]
8author = "Rob"
9author = "Rob"
9ship = "~lodleb-ritrul"
10ship = "~lodleb-ritrul"
@@ -14,17 +15,17 @@ Here's a short update from the team at Tlon for the week of `~2018.10.24`:
14
15
15![](https://media.urbit.org/fora/updates/2018.10.24-update.jpg)
16![](https://media.urbit.org/fora/updates/2018.10.24-update.jpg)
16
17
17−The heroic efforts of *Mark* `~palfun-foslup` have ensured that the Ethereum
18+The heroic efforts of _Mark_ `~palfun-foslup` have ensured that the Ethereum
18testnet Constitution is transacting properly, all in the face of the testnet
19testnet Constitution is transacting properly, all in the face of the testnet
19itself encountering a consensus-failure bug. We can now test various pieces of
20itself encountering a consensus-failure bug. We can now test various pieces of
20our tooling and Urbit functionality against really existing blockchain state.
21our tooling and Urbit functionality against really existing blockchain state.
21
22
22−On the Landscape side, *Logan* `~tacryt-socryp` and *Chris* `~sigtus-hossyn`
23+On the Landscape side, _Logan_ `~tacryt-socryp` and _Chris_ `~sigtus-hossyn`
23finished integration between the mobile app and its desktop counterpart so that
24finished integration between the mobile app and its desktop counterpart so that
24there is a QR-code pairing functionality. These interfaces are now in shape for
25there is a QR-code pairing functionality. These interfaces are now in shape for
25internal testing.
26internal testing.
26
27
27−*Ted* `~rovnys-ricfer` has brought important changes to our build system,
28+_Ted_ `~rovnys-ricfer` has brought important changes to our build system,
28Ford. The latest, fastest version of that system is titled Ford Fiesta, and
29Ford. The latest, fastest version of that system is titled Ford Fiesta, and
29it's shaping up to have all the Spartan utility that its name indicates: stack
30it's shaping up to have all the Spartan utility that its name indicates: stack
30traces, new Ford-specific runes, and a parser for those runes. Ted also tweaked
31traces, new Ford-specific runes, and a parser for those runes. Ted also tweaked
@@ -32,8 +33,8 @@ Clay and Gall so that they use Ford Fiesta for builds.
32
33
33In one of our cavernous basement labs, we've been poking away at a replacement
34In one of our cavernous basement labs, we've been poking away at a replacement
34for our beleagured HTTP server, `%eyre`. This new beast, dubbed `%light`, has
35for our beleagured HTTP server, `%eyre`. This new beast, dubbed `%light`, has
35−benefited from the talents of *Elliot* `~littel-ponnys`. A test version of this
36+benefited from the talents of _Elliot_ `~littel-ponnys`. A test version of this
36new vane can now hold a connection open and send a steady stream of HTTP data to
37new vane can now hold a connection open and send a steady stream of HTTP data to
37the client. Big things have small beginnings...
38the client. Big things have small beginnings...
38
39
39−See you next week.
40+See you next week.
content/updates/2018-11-20-update.md+12−11
@@ -1,9 +1,10 @@
1+++
1+++
2title = "~2018.11.20 Update"
2title = "~2018.11.20 Update"
3−date = 2018-11-20
3+date = "2018-11-19"
4description = "A short update from the Tlon team for the week of ~2018.11.20."
4description = "A short update from the Tlon team for the week of ~2018.11.20."
5slug = "2018-11-20-update"
5slug = "2018-11-20-update"
6−aliases = ["/posts/2018-11-20-update/"]
6+aliases = [ "/posts/2018-11-20-update/" ]
7+
7[extra]
8[extra]
8author = "Rob"
9author = "Rob"
9ship = "~lodleb-ritrul"
10ship = "~lodleb-ritrul"
@@ -15,8 +16,8 @@ Here's a short update from the team at Tlon for the week of `~2018.11.20`:
15![](https://media.urbit.org/fora/updates/2018.11.19-update.jpg)
16![](https://media.urbit.org/fora/updates/2018.11.19-update.jpg)
16
17
17The dreams of the keys crew are finally escaping their heads. After months of
18The dreams of the keys crew are finally escaping their heads. After months of
18−excruciating reworking and fine-turning, *Will* `~hadrud-lodsef`, *Gavin*
19+excruciating reworking and fine-turning, _Will_ `~hadrud-lodsef`, _Gavin_
19−`~ridlur-figbud`, *Morgan* `~hidrel-fabtel`, and *Jimmy* `~haptyl-wanwes`
20+`~ridlur-figbud`, _Morgan_ `~hidrel-fabtel`, and _Jimmy_ `~haptyl-wanwes`
20have completed the client-side tools for registering Ethereum addresses to
21have completed the client-side tools for registering Ethereum addresses to
21receive and access their purchased ships. The registration process begins with
22receive and access their purchased ships. The registration process begins with
22the emails that we've begun to send out to ship-owners. The first batch has been
23the emails that we've begun to send out to ship-owners. The first batch has been
@@ -25,7 +26,7 @@ space, keep an eye out for an email from the urbit.org domain.
25
26
26Address registration points towards the real prize: the full ledger of Urbit
27Address registration points towards the real prize: the full ledger of Urbit
27ships nesting in the cozy, decentralized embrace of the Ethereum-based PKI. To
28ships nesting in the cozy, decentralized embrace of the Ethereum-based PKI. To
28−this end, *Mark* `~palfun-foslup` added some Ethereum-facing cryptographic
29+this end, _Mark_ `~palfun-foslup` added some Ethereum-facing cryptographic
29functions [in the form of jets](https://github.com/urbit/urbit/pull/1028). And
30functions [in the form of jets](https://github.com/urbit/urbit/pull/1028). And
30they do what exactly what jets are supposed to do: take things from "unusably
31they do what exactly what jets are supposed to do: take things from "unusably
31slow" to "actually pretty good." This means that we can start deploying
32slow" to "actually pretty good." This means that we can start deploying
@@ -33,22 +34,22 @@ Constitution transactions.
33
34
34Performance isn't always a matter of engineering challenges being surmounted,
35Performance isn't always a matter of engineering challenges being surmounted,
35though. Occasionally it's a matter of hearing the cracking of joints in
36though. Occasionally it's a matter of hearing the cracking of joints in
36−something that's turning the wrong way. *Elliot* `~littel-ponnys` felt something
37+something that's turning the wrong way. _Elliot_ `~littel-ponnys` felt something
37so ghastly: a 200-millisecond delay on every Ford build. So the search began.
38so ghastly: a 200-millisecond delay on every Ford build. So the search began.
38What was uncovered was two otherwise-benign lines that didn't get along with
39What was uncovered was two otherwise-benign lines that didn't get along with
39−*Paul's* `~fodwyt-ragful` recently merged Vere changes. Elliot handled the
40+_Paul's_ `~fodwyt-ragful` recently merged Vere changes. Elliot handled the
40Arvo side, Paul charged the Vere flank, and the build-system bug was vanquished.
41Arvo side, Paul charged the Vere flank, and the build-system bug was vanquished.
41
42
42Yes, Urbit is a mission fearsome and sprawling, but we at Tlon live for the
43Yes, Urbit is a mission fearsome and sprawling, but we at Tlon live for the
43hunt. Tearing up and replacing the entire stack just isn't enough, so we put our
44hunt. Tearing up and replacing the entire stack just isn't enough, so we put our
44−own, meticulous spin on the concept of a cryptocurrency wallet. The *Urbit
45+own, meticulous spin on the concept of a cryptocurrency wallet. The _Urbit
45−Hierarchical Deterministic Wallet* is a _system_ of related key-pairs that have
46+Hierarchical Deterministic Wallet_ is a _system_ of related key-pairs that have
46distinct powers. That's because you want it to be easy to, say, authenticate
47distinct powers. That's because you want it to be easy to, say, authenticate
47−packets without having to risk a chunk of your net worth. It's *deterministic*
48+packets without having to risk a chunk of your net worth. It's _deterministic_
48because key-pairs of a lower tier can be derived from those of a higher-tier,
49because key-pairs of a lower tier can be derived from those of a higher-tier,
49making the whole system a nice balance of usability and security. Sound cool?
50making the whole system a nice balance of usability and security. Sound cool?
50Check out the details in Tlon's
51Check out the details in Tlon's
51[Urbit Proposal](https://fora.urbit.org/proposals/posts/~2018.11.8..19.31.59..ba77~/)
52[Urbit Proposal](https://fora.urbit.org/proposals/posts/~2018.11.8..19.31.59..ba77~/)
52on the matter.
53on the matter.
53
54
54−See you next week.
55+See you next week.
content/updates/2018-11-6-update.md+8−7
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.11.6 Update"
2title = "~2018.11.6 Update"
3−date = 2018-11-06
3+date = "2018-11-05"
4description = "A short update from the Tlon team for the week of ~2018.11.6."
4description = "A short update from the Tlon team for the week of ~2018.11.6."
5−aliases = ["/posts/2018-11-6-update/"]
5+aliases = [ "/posts/2018-11-6-update/" ]
6+
6[extra]
7[extra]
7author = "Rob"
8author = "Rob"
8ship = "~lodleb-ritrul"
9ship = "~lodleb-ritrul"
@@ -13,12 +14,12 @@ Here's a short update from the team at Tlon for the week of `~2018.11.6`:
13
14
14![](https://media.urbit.org/fora/updates/2018.11.7-update.jpg)
15![](https://media.urbit.org/fora/updates/2018.11.7-update.jpg)
15
16
16−*Gavin* `~ridlur-figbud`, *Will* `~hadrud-lodsef`, and *Jimmy* `~haptyl-wanwes`
17+_Gavin_ `~ridlur-figbud`, _Will_ `~hadrud-lodsef`, and _Jimmy_ `~haptyl-wanwes`
17have been working tirelessly on the front-end tooling for bootstrapping our
18have been working tirelessly on the front-end tooling for bootstrapping our
18[PKI on Ethereum](https://urbit.org/blog/2017.9-eth/). The fruits of their labor
19[PKI on Ethereum](https://urbit.org/blog/2017.9-eth/). The fruits of their labor
19are nearly ripe: all that's left is finalizing the copy and the documentation.
20are nearly ripe: all that's left is finalizing the copy and the documentation.
20
21
21−*Philip* `~wicdev-wisryt`, a powerful Hoonist, is making sure that the Arvo
22+_Philip_ `~wicdev-wisryt`, a powerful Hoonist, is making sure that the Arvo
22level of the stack is ready for the Great PKI Migration. Previously, every time
23level of the stack is ready for the Great PKI Migration. Previously, every time
23a ship booted, it would need to process every Ethereum block all the way up to
24a ship booted, it would need to process every Ethereum block all the way up to
24the present. This was _slow_, and we prefer life in the fast lane. So Philip
25the present. This was _slow_, and we prefer life in the fast lane. So Philip
@@ -29,8 +30,8 @@ restore an earlier snapshot instead of starting from scratch.
29
30
30Landscape is the charming, user-facing bow on the top of all of this, and it's
31Landscape is the charming, user-facing bow on the top of all of this, and it's
31just completed the first round of internal user-feedback testing. The entire
32just completed the first round of internal user-feedback testing. The entire
32−company came together to raise interface hell, providing *Isaac*
33+company came together to raise interface hell, providing _Isaac_
33−`~davtyr-nimren` and *Chris* `~sigtus-hossyn` with a lot of useful data on the
34+`~davtyr-nimren` and _Chris_ `~sigtus-hossyn` with a lot of useful data on the
34performance and reliability characteristics of the web-facing Arvo
35performance and reliability characteristics of the web-facing Arvo
35infrastructure, by way of the profiler in the Arvo interpreter.
36infrastructure, by way of the profiler in the Arvo interpreter.
36
37
@@ -38,7 +39,7 @@ Pretty sweet.
38
39
39Or, _probably_ sweet. They tell you in college that it's never a compiler error,
40Or, _probably_ sweet. They tell you in college that it's never a compiler error,
40but some of the "interesting" results of our profiling may, in fact, be
41but some of the "interesting" results of our profiling may, in fact, be
41−artifacts of a compiler error. *Ted* `~rovnys-ricfer` and *Elliot*
42+artifacts of a compiler error. _Ted_ `~rovnys-ricfer` and _Elliot_
42`~littel-ponnys` are spelunking the lowest depths of the stack, illuminating any
43`~littel-ponnys` are spelunking the lowest depths of the stack, illuminating any
43profiler bugs with their combined brilliance. It's unlikely that our heroes will
44profiler bugs with their combined brilliance. It's unlikely that our heroes will
44find any Balrogs, but you can never be too sure.
45find any Balrogs, but you can never be too sure.
content/updates/2018-12-18-update.md+9−8
@@ -1,9 +1,10 @@
1+++
1+++
2title = "~2018.12.18 Update"
2title = "~2018.12.18 Update"
3−date = 2018-12-18
3+date = "2018-12-17"
4description = "A short update from the Tlon team for the week of ~2018.12.18."
4description = "A short update from the Tlon team for the week of ~2018.12.18."
5slug = "2018-12-18-update"
5slug = "2018-12-18-update"
6−aliases = ["/posts/2018-12-18-update/"]
6+aliases = [ "/posts/2018-12-18-update/" ]
7+
7[extra]
8[extra]
8author = "Rob"
9author = "Rob"
9ship = "~lodleb-ritrul"
10ship = "~lodleb-ritrul"
@@ -18,30 +19,30 @@ With December comes a promise of the land going to sleep to awaken renewed. We
18at Tlon carry spirit of the season with us, even amid the perpetual 60-degree
19at Tlon carry spirit of the season with us, even amid the perpetual 60-degree
19weather of San Francisco.
20weather of San Francisco.
20
21
21−The Urbit network has, indeed, been renewed. *Logan* `~tacryt-socryp`
22+The Urbit network has, indeed, been renewed. _Logan_ `~tacryt-socryp`
22performed a breach on the network, wiping the slate clean. All urbits must be
23performed a breach on the network, wiping the slate clean. All urbits must be
23booted again with their original tickets, which means that your crashed ships
24booted again with their original tickets, which means that your crashed ships
24now have a second chance at life. If your ship is now experiencing connectivity
25now have a second chance at life. If your ship is now experiencing connectivity
25troubles, don't worry: deleting your old pier should fix everything.
26troubles, don't worry: deleting your old pier should fix everything.
26
27
27−On the infrastructure side, *Elliot* the Wonderworker `~littel-ponnys` brought
28+On the infrastructure side, _Elliot_ the Wonderworker `~littel-ponnys` brought
28us a gift-sack of miraculous performance improvements. He started by fixing
29us a gift-sack of miraculous performance improvements. He started by fixing
29memory management, slashing the amount that is required to be pre-allocated for
30memory management, slashing the amount that is required to be pre-allocated for
30cells. Next, he found multiple places where the compiler was called
31cells. Next, he found multiple places where the compiler was called
31unnecessarily, replacing such calls with less-expensive caching. Also redundant
32unnecessarily, replacing such calls with less-expensive caching. Also redundant
32−were many type-checker calls, which were squashed as well. Elliot *also* updated
33+were many type-checker calls, which were squashed as well. Elliot _also_ updated
33the atom parser to remove a big chunk of latency from its operations. And, if
34the atom parser to remove a big chunk of latency from its operations. And, if
34that wasn't enough, he wrote new jets that shaved precious milliseconds from the
35that wasn't enough, he wrote new jets that shaved precious milliseconds from the
35web interface. Yes, five separate fixes, all of which add up to Urbit becoming
36web interface. Yes, five separate fixes, all of which add up to Urbit becoming
36much, _much_ faster. The once-characteristic CLI input lag is now almost
37much, _much_ faster. The once-characteristic CLI input lag is now almost
37imperceptible.
38imperceptible.
38
39
39−*Morgan* `~hidrel-fabtel` and *Jimmy* `~haptyl-wanwes` are hard at work
40+_Morgan_ `~hidrel-fabtel` and _Jimmy_ `~haptyl-wanwes` are hard at work
40overhauling the site for the New Year, both in terms of web design and the
41overhauling the site for the New Year, both in terms of web design and the
41presentation of content. The new website will also include Jimmy's primer,
42presentation of content. The new website will also include Jimmy's primer,
42which neatly explains Urbit in layman's terms.
43which neatly explains Urbit in layman's terms.
43
44
44−The docs boys -- *Rob* `~lodleb-ritrul`, *Josh* `~taglux-nidsep`, and *David*
45+The docs boys -- _Rob_ `~lodleb-ritrul`, _Josh_ `~taglux-nidsep`, and _David_
45`~rapfyr-diglyt` -- are helping out on this front. The documentation is being
46`~rapfyr-diglyt` -- are helping out on this front. The documentation is being
46completely reorganized so that it's more accessible and less overwhelming. A
47completely reorganized so that it's more accessible and less overwhelming. A
47great deal of new tutorial content will be included, and it's good enough that
48great deal of new tutorial content will be included, and it's good enough that
@@ -55,4 +56,4 @@ cryptographic ownership of your address space. If you haven't received an email
55a) check your spam folder and, if that doesn't work, b) send an email to
56a) check your spam folder and, if that doesn't work, b) send an email to
56[registration@urbit.org](mailto:registration@urbit.org).
57[registration@urbit.org](mailto:registration@urbit.org).
57
58
58−See you next week.
59+See you next week.
content/updates/2018-2-17-update.md+6−4
@@ -1,11 +1,13 @@
1+++
1+++
2title = "~2018.2.17 Update"
2title = "~2018.2.17 Update"
3−date = 2018-02-17
3+date = "2018-02-16"
4description = "A short update from the Tlon team for the week of ~2018.2.17."
4description = "A short update from the Tlon team for the week of ~2018.2.17."
5−aliases = ["/posts/2018-2-17-update/"]
5+aliases = [ "/posts/2018-2-17-update/" ]
6+
6[taxonomies]
7[taxonomies]
7−grant_type = ["Gift"]
8+grant_type = [ "Gift" ]
8−grant_category = []
9+grant_category = [ ]
10+
9[extra]
11[extra]
10ship = "~tonlur-sarret"
12ship = "~tonlur-sarret"
11author = ""
13author = ""
content/updates/2018-2-24-update.md+10−9
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.2.24 Update"
2title = "~2018.2.24 Update"
3−date = 2018-02-24
3+date = "2018-02-23"
4description = "A short update from the Tlon team for the week of ~2018.2.24."
4description = "A short update from the Tlon team for the week of ~2018.2.24."
5−aliases = ["/posts/2018-2-24-update/"]
5+aliases = [ "/posts/2018-2-24-update/" ]
6+
6[extra]
7[extra]
7ship = "~tonlur-sarret"
8ship = "~tonlur-sarret"
8author = ""
9author = ""
@@ -12,19 +13,19 @@ This week was another busy one at the Tlon office. Here's what we were up to.
12
13
13This week we performed another [continuity breach](https://urbit.org/docs/using/admin/#-continuity-breaches). Now that we've fixed most of the bugs in new Talk, we think the network is going to be pretty smooth for a while. If you haven't already, follow our [setup](https://urbit.org/docs/using/setup) doc again to reboot your planet in this new continuity era. If you'd like a planet, [email me](mailto:keaton@tlon.io)!
14This week we performed another [continuity breach](https://urbit.org/docs/using/admin/#-continuity-breaches). Now that we've fixed most of the bugs in new Talk, we think the network is going to be pretty smooth for a while. If you haven't already, follow our [setup](https://urbit.org/docs/using/setup) doc again to reboot your planet in this new continuity era. If you'd like a planet, [email me](mailto:keaton@tlon.io)!
14
15
15−We're hosting a [Meetup now](https://www.meetup.com/urbit-sf/events/247797527/) at the Tlon office. *Josh* `~taglux-nidsep` is in town, and we all need a drink after the breach. Bring your laptop, stop by for a beer, and let us install Urbit for you. Or just relax and talk to people.
16+We're hosting a [Meetup now](https://www.meetup.com/urbit-sf/events/247797527/) at the Tlon office. _Josh_ `~taglux-nidsep` is in town, and we all need a drink after the breach. Bring your laptop, stop by for a beer, and let us install Urbit for you. Or just relax and talk to people.
16
17
17−*Mark* `~palfun-foslup` had a number of PRs merged this week for various bug fixes to Talk and Hall.
18+_Mark_ `~palfun-foslup` had a number of PRs merged this week for various bug fixes to Talk and Hall.
18
19
19−*Joe* `~master-morzod` fixed several issues with Urbit's terminal.
20+_Joe_ `~master-morzod` fixed several issues with Urbit's terminal.
20
21
21−*Anton* `~pittyp-datfyn` made a one-line fix in Ford that fixed a major bug in cache performance. As a result, the website and Fora feel snappier.
22+_Anton_ `~pittyp-datfyn` made a one-line fix in Ford that fixed a major bug in cache performance. As a result, the website and Fora feel snappier.
22
23
23−*Ted* `~rovnys-ricfer` and *Keaton* `~tonlur-sarret` continued working on the new Ford design.
24+_Ted_ `~rovnys-ricfer` and _Keaton_ `~tonlur-sarret` continued working on the new Ford design.
24
25
25−*Galen* `~ravmel-ropdyl`, *Jimmy* `~haptyl-wanwes`, and *Chris* `~sigtus-hossyn` worked more on the new frontend.
26+_Galen_ `~ravmel-ropdyl`, _Jimmy_ `~haptyl-wanwes`, and _Chris_ `~sigtus-hossyn` worked more on the new frontend.
26
27
27−*Curtis* `~sorreg-namtyv` is finishing up work on Hoon type defaulting, and has started working on a new design for the Hoon pretty printer.
28+_Curtis_ `~sorreg-namtyv` is finishing up work on Hoon type defaulting, and has started working on a new design for the Hoon pretty printer.
28
29
29Josh, Ted and Keaton took a hiatus from Mars Talk this week to discuss future plans. We'll be back next week, better than ever.
30Josh, Ted and Keaton took a hiatus from Mars Talk this week to discuss future plans. We'll be back next week, better than ever.
30
31
content/updates/2018-2-5-update.md+10−10
@@ -1,26 +1,26 @@
1+++
1+++
2title = "~2018.2.5 Update"
2title = "~2018.2.5 Update"
3−date = 2018-02-05
3+date = "2018-02-04"
4description = "A short update from the Tlon team for the week of ~2018.2.5."
4description = "A short update from the Tlon team for the week of ~2018.2.5."
5−aliases = ["/posts/2018-2-5-update/"]
5+aliases = [ "/posts/2018-2-5-update/" ]
6+
6[extra]
7[extra]
7author = ""
8author = ""
8ship = "~rovnys-ricfer"
9ship = "~rovnys-ricfer"
9+++
10+++
10
11
11−*Galen* `~ravmel-ropdyl`, *Jimmy* `~haptyl-wanwes`, and *Chris* `~sigtus-hossyn` worked on the upcoming frontend overhaul, including the new homepage, the _Collections_ and _Streams_ apps, and the primer. *Ted* `~rovnys-ricfer` and *Anton* `~pittyp-datfyn` continued to work on Ford.
12+_Galen_ `~ravmel-ropdyl`, _Jimmy_ `~haptyl-wanwes`, and _Chris_ `~sigtus-hossyn` worked on the upcoming frontend overhaul, including the new homepage, the _Collections_ and _Streams_ apps, and the primer. _Ted_ `~rovnys-ricfer` and _Anton_ `~pittyp-datfyn` continued to work on Ford.
12
13
13−*Curtis* `~sorreg-namtyv` worked on fixing the defaulting behavior in Hoon. "The future is not wonky," he declares.
14+_Curtis_ `~sorreg-namtyv` worked on fixing the defaulting behavior in Hoon. "The future is not wonky," he declares.
14
15
15−*Keaton* `~tonlur-sarret` tested Isaac V's Fora implementation using his static `ren/tree`. It works.
16+_Keaton_ `~tonlur-sarret` tested Isaac V's Fora implementation using his static `ren/tree`. It works.
16
17
17−*Mark* `~palfun-foslup` gave a presentation at the FOSDEM open source conference in Belgium. Video can be found [here](https://www.youtube.com/watch?v=U-QBW6QIDto).
18+_Mark_ `~palfun-foslup` gave a presentation at the FOSDEM open source conference in Belgium. Video can be found [here](https://www.youtube.com/watch?v=U-QBW6QIDto).
18
19
19−*Isaac V* `~davtyr-nimren` completed the initial version of the static `ren/tree` replacement. The _Collections_ and _Streams_ apps are now being built on top of this foundation. See the [`mve` branch](https://github.com/urbit/arvo/tree/mve) of Arvo to track development.
20+_Isaac V_ `~davtyr-nimren` completed the initial version of the static `ren/tree` replacement. The _Collections_ and _Streams_ apps are now being built on top of this foundation. See the [`mve` branch](https://github.com/urbit/arvo/tree/mve) of Arvo to track development.
20
21
21−*Paul* `~fodwyt-ragful` [fixed a performance issue](https://github.com/urbit/urbit/pull/920) in unifying large nouns.
22+_Paul_ `~fodwyt-ragful` [fixed a performance issue](https://github.com/urbit/urbit/pull/920) in unifying large nouns.
22
23
23−*Iceman* `~littel-ponnys`'s testing framework has been merged into master. To use the framework to write unit tests, see the [user guide](https://github.com/urbit/arvo/blob/master/web/testing.umd). This pull request also includes a Hoon port of [Haskell's Prelude](https://hackage.haskell.org/package/base-4.10.1.0/docs/Prelude.html), which is [now available](https://github.com/urbit/arvo/blob/master/lib/new-hoon.hoon) as an alternate version of the Hoon standard library, including [unit tests](https://github.com/urbit/arvo/tree/master/tests/new-hoon). Discussion of this subject can be found on [Fora](https://fora.urbit.org/posts/~2017.10.17..04.09.16..7eb8~/).
24+_Iceman_ `~littel-ponnys`'s testing framework has been merged into master. To use the framework to write unit tests, see the [user guide](https://github.com/urbit/arvo/blob/master/web/testing.umd). This pull request also includes a Hoon port of [Haskell's Prelude](https://hackage.haskell.org/package/base-4.10.1.0/docs/Prelude.html), which is [now available](https://github.com/urbit/arvo/blob/master/lib/new-hoon.hoon) as an alternate version of the Hoon standard library, including [unit tests](https://github.com/urbit/arvo/tree/master/tests/new-hoon). Discussion of this subject can be found on [Fora](https://fora.urbit.org/posts/~2017.10.17..04.09.16..7eb8~/).
24
25
25On [Mars Talk Episode 19](https://www.youtube.com/watch?v=q3Fjnv0RcR0) (our 20th episode!) this week, Keaton and Ted explained Ford, Urbit's functional reactive build system.
26On [Mars Talk Episode 19](https://www.youtube.com/watch?v=q3Fjnv0RcR0) (our 20th episode!) this week, Keaton and Ted explained Ford, Urbit's functional reactive build system.
26−
content/updates/2018-2-9-update.md+9−8
@@ -1,16 +1,17 @@
1+++
1+++
2title = "~2018.2.9 Update"
2title = "~2018.2.9 Update"
3−date = 2018-02-09
3+date = "2018-02-08"
4description = "A short update from the Tlon team for the week of ~2018.2.9."
4description = "A short update from the Tlon team for the week of ~2018.2.9."
5−aliases = ["/posts/2018-2-9-update/"]
5+aliases = [ "/posts/2018-2-9-update/" ]
6+
6[extra]
7[extra]
7ship = "~tonlur-sarret"
8ship = "~tonlur-sarret"
8author = ""
9author = ""
9+++
10+++
10
11
11−*Galen* `~ravmel-ropdyl`, *Jimmy* `~haptyl-wanwes`, and *Chris* `~sigtus-hossyn` continue work on the new Urbit front-end.
12+_Galen_ `~ravmel-ropdyl`, _Jimmy_ `~haptyl-wanwes`, and _Chris_ `~sigtus-hossyn` continue work on the new Urbit front-end.
12
13
13−*Ted* `~rovnys-ricfer` and *Mark* `~palfun-foslup` finished their month-long project of labelling the Arvo issues.
14+_Ted_ `~rovnys-ricfer` and _Mark_ `~palfun-foslup` finished their month-long project of labelling the Arvo issues.
14
15
15`~palfun` says:
16`~palfun` says:
16After moving over Arvo-related issues from the Vere repository, Arvo hit >100 open issues. Knowing a lot is wrong is the
17After moving over Arvo-related issues from the Vere repository, Arvo hit >100 open issues. Knowing a lot is wrong is the
@@ -25,15 +26,15 @@ tackle. There's plenty of labels now for all your filtering needs. Internally, w
25wanted](https://github.com/urbit/arvo/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) every so often.
26wanted](https://github.com/urbit/arvo/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) every so often.
26While contributors can't add labels themselves, we'll make sure your issues get tagged correctly. Enjoy!
27While contributors can't add labels themselves, we'll make sure your issues get tagged correctly. Enjoy!
27
28
28−*Curtis* `~sorreg-namtyv` has been helping Ted and *Anton* `~pittyp-datfyn` with Ford. He's also continued his work on
29+_Curtis_ `~sorreg-namtyv` has been helping Ted and _Anton_ `~pittyp-datfyn` with Ford. He's also continued his work on
29improving default values for types in Hoon.
30improving default values for types in Hoon.
30
31
31−*Keaton* `~tonlur-sarret` has been working on a super-secret project that he cannot discuss. Loose lips sink ships ...
32+_Keaton_ `~tonlur-sarret` has been working on a super-secret project that he cannot discuss. Loose lips sink ships ...
32
33
33−*Mark* `~palfun-foslup` has submitted a PR for Clay permissions. We just completed a second round of review, and Mark is
34+_Mark_ `~palfun-foslup` has submitted a PR for Clay permissions. We just completed a second round of review, and Mark is
34now doing more testing.
35now doing more testing.
35
36
36−*Iceman* `~littel-ponnys`, *Joe* `~master-morzod`, and Ted [had some
37+_Iceman_ `~littel-ponnys`, _Joe_ `~master-morzod`, and Ted [had some
37fun](https://fora.urbit.org/posts/~2018.2.9..21.50.49..709f~/) discussing various forms of persistence in Clay and Gall
38fun](https://fora.urbit.org/posts/~2018.2.9..21.50.49..709f~/) discussing various forms of persistence in Clay and Gall
38in `urbit-meta`.
39in `urbit-meta`.
39
40
content/updates/2018-3-24-update.md+12−11
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.3.24 Update"
2title = "~2018.3.24 Update"
3−date = 2018-03-24
3+date = "2018-03-23"
4description = "A short update from the Tlon team for the week of ~2018.4.7."
4description = "A short update from the Tlon team for the week of ~2018.4.7."
5−aliases = ["/posts/2018-3-24-update/"]
5+aliases = [ "/posts/2018-3-24-update/" ]
6+
6[extra]
7[extra]
7ship = "~tonlur-sarret"
8ship = "~tonlur-sarret"
8author = ""
9author = ""
@@ -12,28 +13,28 @@ We've had a busy past few weeks here at Tlon -- here's an update:
12
13
13We hired some people! We've added to the full-time team:
14We hired some people! We've added to the full-time team:
14
15
15−- *Chris* `~sigtus-hossyn`
16+- _Chris_ `~sigtus-hossyn`
16−- *Jimmy* `~haptyl-wanwes`
17+- _Jimmy_ `~haptyl-wanwes`
17−- *Morgan* `~hidrel-fabtel`
18+- _Morgan_ `~hidrel-fabtel`
18−- *Anthony* `~poldec-tonteg`
19+- _Anthony_ `~poldec-tonteg`
19−- *Elliot* `~littel-ponnys`
20+- _Elliot_ `~littel-ponnys`
20
21
21Tonight we're hosting a [meetup](https://www.meetup.com/urbit-sf/events/248852261/) at the Tlon office. It's a party.
22Tonight we're hosting a [meetup](https://www.meetup.com/urbit-sf/events/248852261/) at the Tlon office. It's a party.
22Morgan is DJing. Galen's showing Beat Takeshi movies on the back wall. Bring your laptop, and we can write Fizzbuzz in
23Morgan is DJing. Galen's showing Beat Takeshi movies on the back wall. Bring your laptop, and we can write Fizzbuzz in
23Hoon together. Or just relax, have some drinks, and talk to the weird array of people who also want to replace the
24Hoon together. Or just relax, have some drinks, and talk to the weird array of people who also want to replace the
24internet.
25internet.
25
26
26−*Curtis* `~sorreg-namtyv` is in the Netherlands this week visiting *Mark* `~palfun-foslup`. They're self-auditing the
27+_Curtis_ `~sorreg-namtyv` is in the Netherlands this week visiting _Mark_ `~palfun-foslup`. They're self-auditing the
27last parts of the [Urbit Constitution](https://github.com/urbit/constitution). While sitting in Gatwick Airport, Curtis
28last parts of the [Urbit Constitution](https://github.com/urbit/constitution). While sitting in Gatwick Airport, Curtis
28also wrote up some ideas he's been thinking about. Check out these essay drafts, posted to Fora:
29also wrote up some ideas he's been thinking about. Check out these essay drafts, posted to Fora:
29
30
30- [The Urbit public record draft](https://fora.urbit.org/posts/~2018.3.23..03.42.41..ab6d~)
31- [The Urbit public record draft](https://fora.urbit.org/posts/~2018.3.23..03.42.41..ab6d~)
31- [Spirit and practice of digital homecoming draft](https://fora.urbit.org/posts/~2018.3.22..19.46.35..3499~)
32- [Spirit and practice of digital homecoming draft](https://fora.urbit.org/posts/~2018.3.22..19.46.35..3499~)
32
33
33−*Galen* `~ravmel-ropdyl`, *Anton* `~pittyp-datfyn`, *Chris* `~sigtus-hossyn`, *Jimmy* `~haptyl-wanwes`, and *Anthony*
34+_Galen_ `~ravmel-ropdyl`, _Anton_ `~pittyp-datfyn`, _Chris_ `~sigtus-hossyn`, _Jimmy_ `~haptyl-wanwes`, and _Anthony_
34`~poldec-tonteg` have been working more on the new Urbit frontend.
35`~poldec-tonteg` have been working more on the new Urbit frontend.
35
36
36−*Ted* `~rovnys-ricfer`, *Elliot* `~littel-ponnys`, and *Keaton* `~tonlur-sarret` authored and published an Urbit Proposal
37+_Ted_ `~rovnys-ricfer`, _Elliot_ `~littel-ponnys`, and _Keaton_ `~tonlur-sarret` authored and published an Urbit Proposal
37(UP) on New Ford:
38(UP) on New Ford:
38
39
39- [UP 4 - Ford Turboencabulator](https://fora.urbit.org/posts/~2018.3.15..04.24.35..a47f~)
40- [UP 4 - Ford Turboencabulator](https://fora.urbit.org/posts/~2018.3.15..04.24.35..a47f~)
@@ -45,7 +46,7 @@ Ted's and Elliot's daily Ford progress can be tracked here:
45
46
46- [`urbit/arvo 'ford-turbo'`](https://github.com/urbit/arvo/tree/ford-turbo)
47- [`urbit/arvo 'ford-turbo'`](https://github.com/urbit/arvo/tree/ford-turbo)
47
48
48−*Joshua* `~taglux-nidsep`, Ted, and Keaton debuted _Mars Talk, Season 2_ on Wednesday night. To reboot the show, we gave
49+_Joshua_ `~taglux-nidsep`, Ted, and Keaton debuted _Mars Talk, Season 2_ on Wednesday night. To reboot the show, we gave
49a high-level overview of the Urbit stack for new developers:
50a high-level overview of the Urbit stack for new developers:
50
51
51- [Mars Talk Season 2, Ep. 1: High-Level Overview of the Urbit Stack](https://www.youtube.com/watch?v=UaRZVxthVeY)
52- [Mars Talk Season 2, Ep. 1: High-Level Overview of the Urbit Stack](https://www.youtube.com/watch?v=UaRZVxthVeY)
content/updates/2018-3-5-update.md+8−7
@@ -1,22 +1,23 @@
1+++
1+++
2title = "~2018.3.5 Update"
2title = "~2018.3.5 Update"
3−date = 2018-03-05
3+date = "2018-03-04"
4description = "A short update from the Tlon team for the week of ~2018.3.5."
4description = "A short update from the Tlon team for the week of ~2018.3.5."
5−aliases = ["/posts/2018-3-5-update/"]
5+aliases = [ "/posts/2018-3-5-update/" ]
6+
6[extra]
7[extra]
7author = ""
8author = ""
8ship = "~rovnys-ricfer"
9ship = "~rovnys-ricfer"
9+++
10+++
10
11
11−*Galen* `~ravmel-ropdyl`, *Anthony* `~poldec-tonteg`, *Chris* `~sigtus-hossyn`, *Jimmy* `~haptyl-wanwes`, and *Anton*
12+_Galen_ `~ravmel-ropdyl`, _Anthony_ `~poldec-tonteg`, _Chris_ `~sigtus-hossyn`, _Jimmy_ `~haptyl-wanwes`, and _Anton_
12`~pittyp-datfyn` have continued the push toward the new Urbit frontend.
13`~pittyp-datfyn` have continued the push toward the new Urbit frontend.
13
14
14−*Curtis* `~sorreg-namtyv` has been working more on simplifying default value calculation in the Hoon type system.
15+_Curtis_ `~sorreg-namtyv` has been working more on simplifying default value calculation in the Hoon type system.
15
16
16−*Ted* `~rovnys-ricfer` and *Keaton* `~tonlur-sarret` have a design for a better Ford caching and rebuilding architecture,
17+_Ted_ `~rovnys-ricfer` and _Keaton_ `~tonlur-sarret` have a design for a better Ford caching and rebuilding architecture,
17and are now converting it to a UP to be reviewed by the community.
18and are now converting it to a UP to be reviewed by the community.
18
19
19−*Mark* `~palfun-foslup` submitted a [pull request](https://github.com/urbit/arvo/pull/651) that implements the _Keccak_
20+_Mark_ `~palfun-foslup` submitted a [pull request](https://github.com/urbit/arvo/pull/651) that implements the _Keccak_
20family of cryptographic hashing functions in Hoon, including `SHA-3`, `shake`, and `rawshake`. We'll need `keccak` to
21family of cryptographic hashing functions in Hoon, including `SHA-3`, `shake`, and `rawshake`. We'll need `keccak` to
21integrate Urbit with Ethereum.
22integrate Urbit with Ethereum.
22
23
@@ -25,7 +26,7 @@ star or planet to create a ticket for a new moon. If you run your ship in the cl
25moon on your laptop and using that for Talk instead. Messages you send from your moon will appear to have been sent from
26moon on your laptop and using that for Talk instead. Messages you send from your moon will appear to have been sent from
26your usual (parent) identity.
27your usual (parent) identity.
27
28
28−*Iceman* `~littel-ponnys` wrote some deep thoughts on Clay, Urbit's filesystem, in this [meaty Fora
29+_Iceman_ `~littel-ponnys` wrote some deep thoughts on Clay, Urbit's filesystem, in this [meaty Fora
29post](https://fora.urbit.org/posts/~2018.2.25..02.28.04..bd6d~/).
30post](https://fora.urbit.org/posts/~2018.2.25..02.28.04..bd6d~/).
30
31
31P.S. We're hiring! If you're interested, email `galen@tlon.io`.
32P.S. We're hiring! If you're interested, email `galen@tlon.io`.
content/updates/2018-4-14-update.md+16−15
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.4.14 Update"
2title = "~2018.4.14 Update"
3−date = 2018-04-14
3+date = "2018-04-13"
4description = "A short update from the Tlon team for the week of ~2018.4.14."
4description = "A short update from the Tlon team for the week of ~2018.4.14."
5−aliases = ["/posts/2018-4-14-update/"]
5+aliases = [ "/posts/2018-4-14-update/" ]
6+
6[extra]
7[extra]
7ship = "~tonlur-sarret"
8ship = "~tonlur-sarret"
8author = ""
9author = ""
@@ -12,27 +13,27 @@ Replacing the internet is hard. Luckily, we have great people helping us do it.
12
13
13We hired more people! Tlon is pleased to have with us:
14We hired more people! Tlon is pleased to have with us:
14
15
15−- *Erik* `~patnes-rigtyn` - Erik is our new head of operations. He'll be keeping us all fed and organized, as well as
16+- _Erik_ `~patnes-rigtyn` - Erik is our new head of operations. He'll be keeping us all fed and organized, as well as
16 helping us with some legal things.
17 helping us with some legal things.
17−- *Joe* `~master-morzod` - Joe... well, [you know Joe](https://joemfb.github.io/ez-urbits/). He's going to help us make
18+- _Joe_ `~master-morzod` - Joe... well, [you know Joe](https://joemfb.github.io/ez-urbits/). He's going to help us make
18 Urbit easier.
19 Urbit easier.
19−- *Logan* `~tacryt-socryp` - Logan is going to build us a mobile app, work on which has already begun! Very exciting,
20+- _Logan_ `~tacryt-socryp` - Logan is going to build us a mobile app, work on which has already begun! Very exciting,
20 indeed.
21 indeed.
21
22
22−*Ted* `~rovnys-ricfer` and *Elliot* `~littel-ponnys` have been working more on [new
23+_Ted_ `~rovnys-ricfer` and _Elliot_ `~littel-ponnys` have been working more on [new
23Ford](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/). They turbocharged the `+execute` algorithm to
24Ford](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/). They turbocharged the `+execute` algorithm to
24use a worklist data structure. This will not only be simpler to reason about, but in the future, it will allow future
25use a worklist data structure. This will not only be simpler to reason about, but in the future, it will allow future
25support for parallelization of builds at the Vere level in MapReduce fashion. Their work is on
26support for parallelization of builds at the Vere level in MapReduce fashion. Their work is on
26[GitHub](https://github.com/urbit/arvo/tree/ford-turbo).
27[GitHub](https://github.com/urbit/arvo/tree/ford-turbo).
27
28
28−*Curtis* `~sorreg-namtyv` has been working hard to make Hoon's type system less confusing, as well as working on the
29+_Curtis_ `~sorreg-namtyv` has been working hard to make Hoon's type system less confusing, as well as working on the
29problem of data inspection in Hoon. Now that his "structure-to-type" code is mostly done (going from an abstract type
30problem of data inspection in Hoon. Now that his "structure-to-type" code is mostly done (going from an abstract type
30definition to its real compiled internal representation), he'll soon be done with his "type-to-structure" reverse
31definition to its real compiled internal representation), he'll soon be done with his "type-to-structure" reverse
31converter for getting abstract structure data out of any sets of values. More soon, but all of this will supersede the
32converter for getting abstract structure data out of any sets of values. More soon, but all of this will supersede the
32current mold system and help make Hoon easier to understand, we think.
33current mold system and help make Hoon easier to understand, we think.
33
34
34−*Galen* `~ravmel-ropdyl`, *Anton* `~pittyp-datfyn`, *Jimmy* `~haptyl-wanwes`, *Gavin* `~ridlur-figbud`, *Chris*
35+_Galen_ `~ravmel-ropdyl`, _Anton_ `~pittyp-datfyn`, _Jimmy_ `~haptyl-wanwes`, _Gavin_ `~ridlur-figbud`, _Chris_
35−`~sigtus-hossyn`, and *Logan* `~tacryt-socryp` have been putting in more hard work on the new Urbit frontend. It's all
36+`~sigtus-hossyn`, and _Logan_ `~tacryt-socryp` have been putting in more hard work on the new Urbit frontend. It's all
36coming together really nicely, and things seem to be on schedule for a big mid-to-late summer release.
37coming together really nicely, and things seem to be on schedule for a big mid-to-late summer release.
37
38
38We haven't posted an obscure graphic in a while. Here's one for the update to tide you over:
39We haven't posted an obscure graphic in a while. Here's one for the update to tide you over:
@@ -41,16 +42,16 @@ We haven't posted an obscure graphic in a while. Here's one for the update to ti
41
42
42What it's for is totally top secret.
43What it's for is totally top secret.
43
44
44−*Keaton* `~tonlur-sarret` deployed sections to Fora, which will help categorize discussion content better and lead to better curation of StackOverflow-like questions and Urbit Proposals (UPs). He also merged some important pull requests into the system and deployed them to the network.
45+_Keaton_ `~tonlur-sarret` deployed sections to Fora, which will help categorize discussion content better and lead to better curation of StackOverflow-like questions and Urbit Proposals (UPs). He also merged some important pull requests into the system and deployed them to the network.
45
46
46−*Mikolaj* `~ponmep-litsem`'s contributor work on moving Vere from Make to the [Meson](https://github.com/mesonbuild/meson) build system was merged this week. This solves several issues with bundling of dependencies, as well as making binary builds generally faster. Great work!
47+_Mikolaj_ `~ponmep-litsem`'s contributor work on moving Vere from Make to the [Meson](https://github.com/mesonbuild/meson) build system was merged this week. This solves several issues with bundling of dependencies, as well as making binary builds generally faster. Great work!
47
48
48−*Joe* `~master-morzod` got his [HTTP pull request](https://github.com/urbit/urbit/pull/942) finally merged, which rewrites Vere's HTTP client and server to use the `h2o` library. This is great, as it will allow for full TLS termination in Urbit, which sets us up for full HTTPS connections to direct IP addresses of Urbit ships at `your-ship.urbit.org`, to be fully implemented soon.
49+_Joe_ `~master-morzod` got his [HTTP pull request](https://github.com/urbit/urbit/pull/942) finally merged, which rewrites Vere's HTTP client and server to use the `h2o` library. This is great, as it will allow for full TLS termination in Urbit, which sets us up for full HTTPS connections to direct IP addresses of Urbit ships at `your-ship.urbit.org`, to be fully implemented soon.
49
50
50−*Robert* `~lodleb-ritrul` has made a number of helpful PR's to the [Urbit docs](https://github.com/urbit/docs).
51+_Robert_ `~lodleb-ritrul` has made a number of helpful PR's to the [Urbit docs](https://github.com/urbit/docs).
51
52
52−*Mark* `~palfun-foslup` worked more on the Urbit constitution and put out some important fires caused by code-update syncs over the network and type mismatches. Computers are hard!
53+_Mark_ `~palfun-foslup` worked more on the Urbit constitution and put out some important fires caused by code-update syncs over the network and type mismatches. Computers are hard!
53
54
54−*Joshua* `~taglux-nidsep`, Ted, Keaton, and Joe went on [Mars Talk](https://www.youtube.com/watch?v=EZKNLcdRbE0) to discuss the Facebook data scandal, the greater battle for privacy and personal computing, and Urbit's role in all of this. We think it turned out great.
55+_Joshua_ `~taglux-nidsep`, Ted, Keaton, and Joe went on [Mars Talk](https://www.youtube.com/watch?v=EZKNLcdRbE0) to discuss the Facebook data scandal, the greater battle for privacy and personal computing, and Urbit's role in all of this. We think it turned out great.
55
56
56All in all, life has been good over here. Now it's time for a good weekend. See you all on the network!
57All in all, life has been good over here. Now it's time for a good weekend. See you all on the network!
content/updates/2018-4-7-update.md+9−8
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.4.7 Update"
2title = "~2018.4.7 Update"
3−date = 2018-04-07
3+date = "2018-04-06"
4description = "A short update from the Tlon team for the week of ~2018.4.7."
4description = "A short update from the Tlon team for the week of ~2018.4.7."
5−aliases = ["/posts/2018-4-7-update/"]
5+aliases = [ "/posts/2018-4-7-update/" ]
6+
6[extra]
7[extra]
7ship = "~tonlur-sarret"
8ship = "~tonlur-sarret"
8author = ""
9author = ""
@@ -14,24 +15,24 @@ We're hosting [Hoon School](https://www.meetup.com/urbit-sf/events/249019207/) a
14
15
15Tlon has brought on two new interns! We're excited to have with us:
16Tlon has brought on two new interns! We're excited to have with us:
16
17
17−- *Gavin* `~ridlur-figbud` - Gavin's going to help us with some promising frontend design projects.
18+- _Gavin_ `~ridlur-figbud` - Gavin's going to help us with some promising frontend design projects.
18−- *Robert* `~lodleb-ritrul` - Robert's going to work with us on revamping our documentation, examples, and blog, writing
19+- _Robert_ `~lodleb-ritrul` - Robert's going to work with us on revamping our documentation, examples, and blog, writing
19 high-quality original content. He has submitted several pull requests to the docs already this week, which have been
20 high-quality original content. He has submitted several pull requests to the docs already this week, which have been
20 merged.
21 merged.
21
22
22−*Galen* `~ravmel-ropdyl`, *Anton* `~pittyp-datfyn`, *Chris* `~sigtus-hossyn`, and *Jimmy* `~haptyl-wanwes` have been
23+_Galen_ `~ravmel-ropdyl`, _Anton_ `~pittyp-datfyn`, _Chris_ `~sigtus-hossyn`, and _Jimmy_ `~haptyl-wanwes` have been
23continuing to advance the state of the new Urbit frontend.
24continuing to advance the state of the new Urbit frontend.
24
25
25−*Mark* `~palfun-foslup` has been working hard with *Curtis* `~sorreg-namtyv` to bring the Urbit constitution into its
26+_Mark_ `~palfun-foslup` has been working hard with _Curtis_ `~sorreg-namtyv` to bring the Urbit constitution into its
26final, launchable state. He believes it's ready for its final security audit, which keeps us on track to launch it this
27final, launchable state. He believes it's ready for its final security audit, which keeps us on track to launch it this
27summer. You can find the latest contract code [here](https://github.com/urbit/constitution).
28summer. You can find the latest contract code [here](https://github.com/urbit/constitution).
28
29
29−*Ted* `~rovnys-ricfer` and *Elliot* `~littel-ponnys` have assembled a basic prototype of the main engine of the new Ford
30+_Ted_ `~rovnys-ricfer` and _Elliot_ `~littel-ponnys` have assembled a basic prototype of the main engine of the new Ford
30redesign. They've been improving the design as they go, posting updates as comments to the [original Fora
31redesign. They've been improving the design as they go, posting updates as comments to the [original Fora
31post](https://fora.urbit.org/posts/~2018.3.15..04.24.35..a47f~/). Their code can be found
32post](https://fora.urbit.org/posts/~2018.3.15..04.24.35..a47f~/). Their code can be found
32[here](https://github.com/urbit/arvo/tree/ford-turbo).
33[here](https://github.com/urbit/arvo/tree/ford-turbo).
33
34
34−Lastly, big shoutout to *Mikolaj* `~ponmep-litsem` for his work on [Plato](http://plato.urbitetorbi.org:8080/plato.html),
35+Lastly, big shoutout to _Mikolaj_ `~ponmep-litsem` for his work on [Plato](http://plato.urbitetorbi.org:8080/plato.html),
35which now allows remote Hoon code execution without logging in. This is a big step towards improving our developer
36which now allows remote Hoon code execution without logging in. This is a big step towards improving our developer
36onboarding, as it will allow newcomers to experience interactive Urbit programming in the browser quickly without having
37onboarding, as it will allow newcomers to experience interactive Urbit programming in the browser quickly without having
37to wait to boot their own ship. See Mikolaj's original thread on GitHub [here](https://github.com/urbit/docs/issues/239).
38to wait to boot their own ship. See Mikolaj's original thread on GitHub [here](https://github.com/urbit/docs/issues/239).
content/updates/2018-5-16-update.md+13−13
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.5.16 Update"
2title = "~2018.5.16 Update"
3−date = 2018-05-16
3+date = "2018-05-15"
4description = "A short update from the Tlon team for the week of ~2018.5.16."
4description = "A short update from the Tlon team for the week of ~2018.5.16."
5−aliases = ["/posts/2018-5-16-update/"]
5+aliases = [ "/posts/2018-5-16-update/" ]
6+
6[extra]
7[extra]
7ship = "~tonlur-sarret"
8ship = "~tonlur-sarret"
8author = ""
9author = ""
@@ -10,36 +11,36 @@ author = ""
10
11
11Summer is around the corner, and the community has been working hard to make Urbit real. Here's an update on what new and exciting things have been happening:
12Summer is around the corner, and the community has been working hard to make Urbit real. Here's an update on what new and exciting things have been happening:
12
13
13−> _Meta_: We're going to start posting these to the new *Updates* section in Fora now -- and actually weekly!
14+> _Meta_: We're going to start posting these to the new _Updates_ section in Fora now -- and actually weekly!
14
15
15−On [Mars Talk last week](https://www.youtube.com/watch?v=gBd0TZyz_HE), *Anthony* `~poldec-tonteg`, *Joshua* `~taglux-nidsep`, *Ted* `~rovnys-ricfer`, and *Keaton* `~tonlur-sarret` talked about Sail, a DSL for representing XML/HTML data in Hoon. We built a simple web page with Sail and highlighted what features Sail gives you, like Hoon's type system, the Ford build system, and full access to Hoon programming inline. Check it out!
16+On [Mars Talk last week](https://www.youtube.com/watch?v=gBd0TZyz_HE), _Anthony_ `~poldec-tonteg`, _Joshua_ `~taglux-nidsep`, _Ted_ `~rovnys-ricfer`, and _Keaton_ `~tonlur-sarret` talked about Sail, a DSL for representing XML/HTML data in Hoon. We built a simple web page with Sail and highlighted what features Sail gives you, like Hoon's type system, the Ford build system, and full access to Hoon programming inline. Check it out!
16
17
17Tlon hired someone this week! We're excited to have with us:
18Tlon hired someone this week! We're excited to have with us:
18
19
19−- *Isaac V* `~davtyr-nimren`
20+- _Isaac V_ `~davtyr-nimren`
20
21
21Isaac has solid Hoon and frontend chops, having already implemented server-side rendering of Tree pages for us a short while back. He'll be taking on some of the Collections/Streams work to help us get ready for our summer release.
22Isaac has solid Hoon and frontend chops, having already implemented server-side rendering of Tree pages for us a short while back. He'll be taking on some of the Collections/Streams work to help us get ready for our summer release.
22
23
23−*Galen* `~ravmel-ropdyl`, *Anthony* `~poldec-tonteg`, *Chris* `~sigtus-hossyn`, *Gavin* `~ridlur-figbud`, and *Jimmy* `~haptyl-wanwes` have been working more on the new interface projects. Here's another leak:
24+_Galen_ `~ravmel-ropdyl`, _Anthony_ `~poldec-tonteg`, _Chris_ `~sigtus-hossyn`, _Gavin_ `~ridlur-figbud`, and _Jimmy_ `~haptyl-wanwes` have been working more on the new interface projects. Here's another leak:
24
25
25![New visual leak](https://media.urbit.org/fora/updates/~2018.5.15-Update-1.png)
26![New visual leak](https://media.urbit.org/fora/updates/~2018.5.15-Update-1.png)
26
27
27−*Logan* `~tacryt-socryp` almost has a complete demo of the new Urbit iOS app working. This includes TouchID login authentication, an encrypted local database, full support for the Talk/Hall API for Streams, and automatic background fetching, among other features.
28+_Logan_ `~tacryt-socryp` almost has a complete demo of the new Urbit iOS app working. This includes TouchID login authentication, an encrypted local database, full support for the Talk/Hall API for Streams, and automatic background fetching, among other features.
28
29
29−*Curtis* `~sorreg-namtyv` has been working more on several important major language feature improvements to Hoon: namely, pretty-printing of typed data, and simplifying the type system. Work can be found on his [research branches](https://github.com/cgyarvin/arvo), but we plan on publishing a more formal post of the changes and major documentation updates when they roll out in the coming months. More soon!
30+_Curtis_ `~sorreg-namtyv` has been working more on several important major language feature improvements to Hoon: namely, pretty-printing of typed data, and simplifying the type system. Work can be found on his [research branches](https://github.com/cgyarvin/arvo), but we plan on publishing a more formal post of the changes and major documentation updates when they roll out in the coming months. More soon!
30
31
31−*Ted* `~rovnys-ricfer` and *Elliot* `~littel-ponnys` have made a bunch of progress on Ford Turbo. In addition to having a proof-of-concept solution for the main performance bottleneck of current Ford, they've now finished writing over half of the schematics (build types), implemented proper cache reclamation support, and they've gotten basic Clay integration functioning properly. You can find their work [here](https://github.com/urbit/arvo/tree/ford-turbo). They're posting more detailed updates as comments to their original [Urbit Proposal](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/).
32+_Ted_ `~rovnys-ricfer` and _Elliot_ `~littel-ponnys` have made a bunch of progress on Ford Turbo. In addition to having a proof-of-concept solution for the main performance bottleneck of current Ford, they've now finished writing over half of the schematics (build types), implemented proper cache reclamation support, and they've gotten basic Clay integration functioning properly. You can find their work [here](https://github.com/urbit/arvo/tree/ford-turbo). They're posting more detailed updates as comments to their original [Urbit Proposal](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/).
32
33
33−*Mark* `~palfun-foslup` has been wrapping up Urbit/ETH integration, and is now working on getting Jael, the new Arvo secret-storage vane, to compile. This would be a great addition to the summer release.
34+_Mark_ `~palfun-foslup` has been wrapping up Urbit/ETH integration, and is now working on getting Jael, the new Arvo secret-storage vane, to compile. This would be a great addition to the summer release.
34
35
35−*Joshua* `~taglux-nidsep`, *Robert* `~lodleb-ritrul`, and *Keaton* `~tonlur-sarret` have been getting lots of
36+_Joshua_ `~taglux-nidsep`, _Robert_ `~lodleb-ritrul`, and _Keaton_ `~tonlur-sarret` have been getting lots of
36documentation work done. They've seen several PR's go through to improve the Hoon standard library docs, simplify the
37documentation work done. They've seen several PR's go through to improve the Hoon standard library docs, simplify the
37Hoon demo, update our examples to the latest syntax, improve the Urbit installation process, and more. Josh's
38Hoon demo, update our examples to the latest syntax, improve the Urbit installation process, and more. Josh's
38work-in-progress is happening [here](https://github.com/joshuareagan/doc-drafts/). The main docs are [on
39work-in-progress is happening [here](https://github.com/joshuareagan/doc-drafts/). The main docs are [on
39GitHub](https://github.com/urbit/docs): if there's a piece of doc that's confusing to you, don't hesitate to file an
40GitHub](https://github.com/urbit/docs): if there's a piece of doc that's confusing to you, don't hesitate to file an
40issue. Or better, submit a pull request.
41issue. Or better, submit a pull request.
41
42
42−*Joe* `~master-morzod` is making strides on full HTTPS support for individual ships. He's implemented LetsEncrypt
43+_Joe_ `~master-morzod` is making strides on full HTTPS support for individual ships. He's implemented LetsEncrypt
43support, ASN.1, and has Dynamic DNS functioning on our testnet. When all this work is done, `your-ship.urbit.org` should
44support, ASN.1, and has Dynamic DNS functioning on our testnet. When all this work is done, `your-ship.urbit.org` should
44connect automatically to the IP of the Unix machine your urbit is running on, rather than connecting to one of Tlon's
45connect automatically to the IP of the Unix machine your urbit is running on, rather than connecting to one of Tlon's
45ships, which currently proxies Urbit network data through one of our stars, is slow, and is basically a straight-up
46ships, which currently proxies Urbit network data through one of our stars, is slow, and is basically a straight-up
@@ -47,4 +48,3 @@ man-in-the-middle. Combined with private Collections and Streams, Urbit will be
47year.
48year.
48
49
49Overall, we're making progress. More next week!
50Overall, we're making progress. More next week!
50−
content/updates/2018-5-23-update.md+11−11
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.5.23 Update"
2title = "~2018.5.23 Update"
3−date = 2018-05-23
3+date = "2018-05-22"
4description = "A short update from the Tlon team for the week of ~2018.5.23."
4description = "A short update from the Tlon team for the week of ~2018.5.23."
5−aliases = ["/posts/2018-5-23-update/"]
5+aliases = [ "/posts/2018-5-23-update/" ]
6+
6[extra]
7[extra]
7ship = "~tonlur-sarret"
8ship = "~tonlur-sarret"
8author = ""
9author = ""
@@ -17,38 +18,38 @@ We're hosting a meetup [this Friday](https://www.meetup.com/urbit-sf/events/2508
17quick update on new Ford, and then it'll be time to relax, listen to music (our friend Grayson will be playing records),
18quick update on new Ford, and then it'll be time to relax, listen to music (our friend Grayson will be playing records),
18and talk IRL. Feel free to bring your laptop, and we'll install Urbit for you and give you a tour of Arvo.
19and talk IRL. Feel free to bring your laptop, and we'll install Urbit for you and give you a tour of Arvo.
19
20
20−This week, the interface team -- *Galen* `~ravmel-ropdyl`, *Gavin* `~ridlur-figbud`, *Jimmy* `~haptyl-wanwes`, *Chris*
21+This week, the interface team -- _Galen_ `~ravmel-ropdyl`, _Gavin_ `~ridlur-figbud`, _Jimmy_ `~haptyl-wanwes`, _Chris_
21−`~sigtus-hossyn`, *Isaac V* `~davtyr-nimren`, *Logan* `~tacryt-socryp`, and *Anthony* `~poldec-tonteg` -- has continued
22+`~sigtus-hossyn`, _Isaac V_ `~davtyr-nimren`, _Logan_ `~tacryt-socryp`, and _Anthony_ `~poldec-tonteg` -- has continued
22building the new Arvo frontend. Here's a teaser of something the desktop guys have been working on:
23building the new Arvo frontend. Here's a teaser of something the desktop guys have been working on:
23
24
24![](https://media.urbit.org/fora/updates/~2018.5.22-Update-2.jpg)
25![](https://media.urbit.org/fora/updates/~2018.5.22-Update-2.jpg)
25
26
26−*Joe* `~master-morzod` fixed an important performance issue in Vere where galaxy IP resolution has been happening
27+_Joe_ `~master-morzod` fixed an important performance issue in Vere where galaxy IP resolution has been happening
27synchronously. This now works asynchronously, which should help take some load off of our stars. He also got support for
28synchronously. This now works asynchronously, which should help take some load off of our stars. He also got support for
28`/.well-known/*` LetsEncrypt paths working in Eyre and refactored a lot of parsing and cryptography code in Arvo as part
29`/.well-known/*` LetsEncrypt paths working in Eyre and refactored a lot of parsing and cryptography code in Arvo as part
29of his HTTPS-implementation work on his [personal WIP Arvo fork](https://github.com/joemfb/arvo/tree/acme-wip), to be
30of his HTTPS-implementation work on his [personal WIP Arvo fork](https://github.com/joemfb/arvo/tree/acme-wip), to be
30brought onto master soon.
31brought onto master soon.
31
32
32−*Keaton* `~tonlur-sarret` got a demo AMI (Amazon Machine Image) working on Amazon Web Services with the Urbit binary
33+_Keaton_ `~tonlur-sarret` got a demo AMI (Amazon Machine Image) working on Amazon Web Services with the Urbit binary
33pre-installed, avoiding the need for the user to manually build from source. He plans on documenting this more and
34pre-installed, avoiding the need for the user to manually build from source. He plans on documenting this more and
34−working on a clean-slate onboarding system with *Morgan* `~hidrel-fabtel` for our summer MVE release. But for now,
35+working on a clean-slate onboarding system with _Morgan_ `~hidrel-fabtel` for our summer MVE release. But for now,
35consider this a proof-of-concept for one way to get an Urbit running in the cloud more easily. You can follow the short
36consider this a proof-of-concept for one way to get an Urbit running in the cloud more easily. You can follow the short
36bulleted steps [here](https://gist.github.com/keatondunsford/8c19bc232650ec1adbb9b6c38954cd90) to get up and running .
37bulleted steps [here](https://gist.github.com/keatondunsford/8c19bc232650ec1adbb9b6c38954cd90) to get up and running .
37
38
38−*Ted* `~rovnys-ricfer` and *Elliot* `~littel-ponnys` are getting their new beautiful build system closer to the finish
39+_Ted_ `~rovnys-ricfer` and _Elliot_ `~littel-ponnys` are getting their new beautiful build system closer to the finish
39line. New Ford supports nearly all of the functionality laid out in the original [Urbit
40line. New Ford supports nearly all of the functionality laid out in the original [Urbit
40Proposal](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/) and passes all current tests. This past
41Proposal](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/) and passes all current tests. This past
41week, Ted and Elliot have implemented more schematics and a bunch of the `+cranes`, or Ford runes. If you're into build
42week, Ted and Elliot have implemented more schematics and a bunch of the `+cranes`, or Ford runes. If you're into build
42systems, check out their more detailed updates they've been posting as comments to the UP.
43systems, check out their more detailed updates they've been posting as comments to the UP.
43
44
44−*Mark* `~palfun-foslup` has been working on getting the Urbit/ETH integration logic into Jael, Arvo's new secret-storage
45+_Mark_ `~palfun-foslup` has been working on getting the Urbit/ETH integration logic into Jael, Arvo's new secret-storage
45vane, to go live in the summer MVE release. Part of this is implementing direct support for querying the Ethereum
46vane, to go live in the summer MVE release. Part of this is implementing direct support for querying the Ethereum
46blockchain for the state of the the Urbit constitution smart contract. In this model, Urbit ships can choose to either
47blockchain for the state of the the Urbit constitution smart contract. In this model, Urbit ships can choose to either
47get this state directly from their parent stars or galaxies, or they can query the blockchain themselves. An important
48get this state directly from their parent stars or galaxies, or they can query the blockchain themselves. An important
48step towards making Urbit address-space ownership real, Mark's work-in-progress can be found
49step towards making Urbit address-space ownership real, Mark's work-in-progress can be found
49[here](https://github.com/Fang-/arvo/tree/research-constitution).
50[here](https://github.com/Fang-/arvo/tree/research-constitution).
50
51
51−*Josh* `~taglux-nidsep` and *Robert* `~lodleb-ritrul` have been continuing to do ~zod's work to improve the state of the
52+_Josh_ `~taglux-nidsep` and _Robert_ `~lodleb-ritrul` have been continuing to do ~zod's work to improve the state of the
52Urbit documentation. Josh has been writing a [new Hoon tutorial series](https://github.com/joshuareagan/doc-drafts) to
53Urbit documentation. Josh has been writing a [new Hoon tutorial series](https://github.com/joshuareagan/doc-drafts) to
53supersede the current Urbytes, while Robert has been blazing a trail through the current standard library docs, making
54supersede the current Urbytes, while Robert has been blazing a trail through the current standard library docs, making
54sure they're up-to-date and [improving them](https://github.com/urbit/docs/tree/rmariani-patch-6) as he goes. There's
55sure they're up-to-date and [improving them](https://github.com/urbit/docs/tree/rmariani-patch-6) as he goes. There's
@@ -61,4 +62,3 @@ link in Talk. Tune in!
61Overall, summer is getting closer, and we're excited about the work that's getting done. More this week.
62Overall, summer is getting closer, and we're excited about the work that's getting done. More this week.
62
63
63See you on Friday!
64See you on Friday!
64−
content/updates/2018-5-29-update.md+3−2
@@ -1,8 +1,9 @@
1+++
1+++
2title = "There is no Urbit ICO"
2title = "There is no Urbit ICO"
3−date = 2018-05-29
3+date = "2018-05-28"
4description = "It's a dangerous internet out there, don't get scammed."
4description = "It's a dangerous internet out there, don't get scammed."
5−aliases = ["/posts/2018-5-29-update/"]
5+aliases = [ "/posts/2018-5-29-update/" ]
6+
6[extra]
7[extra]
7author = "Erik Newton"
8author = "Erik Newton"
8ship = "~patnes-rigtyn"
9ship = "~patnes-rigtyn"
content/updates/2018-5-30-update.md+11−10
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.5.30 Update"
2title = "~2018.5.30 Update"
3−date = 2018-05-30
3+date = "2018-05-29"
4description = "A short update from the Tlon team for the week of ~2018.5.30."
4description = "A short update from the Tlon team for the week of ~2018.5.30."
5−aliases = ["/posts/2018-5-30-update/"]
5+aliases = [ "/posts/2018-5-30-update/" ]
6+
6[extra]
7[extra]
7ship = "~tonlur-sarret"
8ship = "~tonlur-sarret"
8author = ""
9author = ""
@@ -22,16 +23,16 @@ in in `/urbit-meta`, and a couple of infrastructure changes were made to make `u
22bit more snappy. See [this post](https://fora.urbit.org/general/posts/~2018.5.26..03.57.28..7b26~/) for help getting set
23bit more snappy. See [this post](https://fora.urbit.org/general/posts/~2018.5.26..03.57.28..7b26~/) for help getting set
23back up.
24back up.
24
25
25−*Curtis* `~sorreg-namtyv` has been working more on data printing in Hoon. Still work-in-progress, the end result will
26+_Curtis_ `~sorreg-namtyv` has been working more on data printing in Hoon. Still work-in-progress, the end result will
26have new, simpler ways to express Hoon types, data you want to print, helpful conversion arms accessible via the standard
27have new, simpler ways to express Hoon types, data you want to print, helpful conversion arms accessible via the standard
27library, and a couple new runes. If you like deep language code and compiler internals, you can check out Curtis's
28library, and a couple new runes. If you like deep language code and compiler internals, you can check out Curtis's
28research branch [here](https://github.com/cgyarvin/arvo/tree/research-tome).
29research branch [here](https://github.com/cgyarvin/arvo/tree/research-tome).
29
30
30−The interface team -- *Galen* `~ravmel-ropdyl`, *Anthony* `~poldec-tonteg`, *Logan* `~tacryt-socryp`, *Chris*
31+The interface team -- _Galen_ `~ravmel-ropdyl`, _Anthony_ `~poldec-tonteg`, _Logan_ `~tacryt-socryp`, _Chris_
31−`~sigtus-hossyn`, *Jimmy* `~haptyl-wanwes`, and *Gavin* `~ridlur-figbud` -- has been working more on MVE. We'll have more
32+`~sigtus-hossyn`, _Jimmy_ `~haptyl-wanwes`, and _Gavin_ `~ridlur-figbud` -- has been working more on MVE. We'll have more
32to show in the next couple weeks.
33to show in the next couple weeks.
33
34
34−*Isaac V* `~davtyr-nimren` worked on Arvo and Collections last week. He implemented a query parameter in Eyre to support
35+_Isaac V_ `~davtyr-nimren` worked on Arvo and Collections last week. He implemented a query parameter in Eyre to support
35setting the longpoll timeout duration manually, which solves an issue in the way of us doing background refreshes in our
36setting the longpoll timeout duration manually, which solves an issue in the way of us doing background refreshes in our
36iOS app we're developing. He also got Clay permissions logic into Collections so that the tool will support read-only,
37iOS app we're developing. He also got Clay permissions logic into Collections so that the tool will support read-only,
37write-only, and private/invite-only collections in addition to public ones. Lastly, Isaac's been working on a static-site
38write-only, and private/invite-only collections in addition to public ones. Lastly, Isaac's been working on a static-site
@@ -40,7 +41,7 @@ modifying Kiln to support batch-writing multiple files to Clay at once. Isaac's
40[here](https://github.com/ixv/arvo/branches) -- check it out if you're looking to start hacking near the border between
41[here](https://github.com/ixv/arvo/branches) -- check it out if you're looking to start hacking near the border between
41Arvo's interface and infrastructure.
42Arvo's interface and infrastructure.
42
43
43−*Ted* `~rovnys-ricfer` and *Elliot* `~littel-ponnys` finished _all_ of the new Ford Turbo schematics (Ford build types)
44+_Ted_ `~rovnys-ricfer` and _Elliot_ `~littel-ponnys` finished _all_ of the new Ford Turbo schematics (Ford build types)
44and a bunch more cranes (Ford runes). Their next step is to integrate new Ford with the current master kernel by loading
45and a bunch more cranes (Ford runes). Their next step is to integrate new Ford with the current master kernel by loading
45it in as a separate vane, then incrementally connecting the wires needed for it to start working together with real Arvo.
46it in as a separate vane, then incrementally connecting the wires needed for it to start working together with real Arvo.
46You can find Ted and Elliot's work [here](https://github.com/urbit/arvo/tree/ford-turbo). If you're into functional
47You can find Ted and Elliot's work [here](https://github.com/urbit/arvo/tree/ford-turbo). If you're into functional
@@ -48,7 +49,7 @@ programming, build systems, or just want to read the best Hoon code we have on d
48updates they've been posting to their Urbit Proposal
49updates they've been posting to their Urbit Proposal
49[here](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~).
50[here](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~).
50
51
51−*Mark* `~palfun-foslup` worked on Jael, Urbit's new secret-storage vane, which we're also expanding to include the logic
52+_Mark_ `~palfun-foslup` worked on Jael, Urbit's new secret-storage vane, which we're also expanding to include the logic
52for querying the state of the [Urbit consitution](https://github.com/urbit/constitution) which will go live on the
53for querying the state of the [Urbit consitution](https://github.com/urbit/constitution) which will go live on the
53Ethereum blockchain in the coming months. Mark has been implementing the necessary Arvo `+gift`s and `+task`s of Jael's
54Ethereum blockchain in the coming months. Mark has been implementing the necessary Arvo `+gift`s and `+task`s of Jael's
54to properly interface with the Urbit constitution via the Ethereum API, then update the local urbit's state of the land
55to properly interface with the Urbit constitution via the Ethereum API, then update the local urbit's state of the land
@@ -56,13 +57,13 @@ registry and other contract data so that it can use it for networking and in oth
56work-in-progress [here](https://github.com/Fang-/arvo/tree/research-constitution). Check it out if you're excited by
57work-in-progress [here](https://github.com/Fang-/arvo/tree/research-constitution). Check it out if you're excited by
57blockchains, or also just want to see what good, documented Hoon code looks like.
58blockchains, or also just want to see what good, documented Hoon code looks like.
58
59
59−*Joe* `~master-morzod` worked more on the HTTPS project. This week was mostly about refactoring the existing code by
60+_Joe_ `~master-morzod` worked more on the HTTPS project. This week was mostly about refactoring the existing code by
60adding comments, renaming some things, and improving the style. Safe to say that when this project is done, we think it
61adding comments, renaming some things, and improving the style. Safe to say that when this project is done, we think it
61will be understandable. The ASN1 and PKCS libraries are mostly complete; progress will continue to finish up the last of
62will be understandable. The ASN1 and PKCS libraries are mostly complete; progress will continue to finish up the last of
62the libraries and necessary styling, then integrate this into current Arvo/Vere. Joe's work-in-progress is
63the libraries and necessary styling, then integrate this into current Arvo/Vere. Joe's work-in-progress is
63[here](https://github.com/joemfb/arvo/tree/acme-wip).
64[here](https://github.com/joemfb/arvo/tree/acme-wip).
64
65
65−*Josh* `~taglux-nidsep` and *Robert* `~lodleb-ritrul` made a bunch more progress on the docs. Josh has been adding more
66+_Josh_ `~taglux-nidsep` and _Robert_ `~lodleb-ritrul` made a bunch more progress on the docs. Josh has been adding more
66to his [new WIP Hoon tutorials](https://github.com/joshuareagan/doc-drafts), and both Josh and Rob have gifted us with
67to his [new WIP Hoon tutorials](https://github.com/joshuareagan/doc-drafts), and both Josh and Rob have gifted us with
67several [pull requests](https://github.com/urbit/docs/pulls) documenting the simple but elusive `=,` rune and refactoring
68several [pull requests](https://github.com/urbit/docs/pulls) documenting the simple but elusive `=,` rune and refactoring
68much of the existing standard library doc. The docs are a great place to start learning and contributing. [Check them
69much of the existing standard library doc. The docs are a great place to start learning and contributing. [Check them
content/updates/2018-6-14-update.md+13−12
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.6.14 Update"
2title = "~2018.6.14 Update"
3−date = 2018-06-14
3+date = "2018-06-13"
4description = "A short update from the Tlon team for the week of ~2018.6.14."
4description = "A short update from the Tlon team for the week of ~2018.6.14."
5−aliases = ["/posts/2018-6-14-update/"]
5+aliases = [ "/posts/2018-6-14-update/" ]
6+
6[extra]
7[extra]
7author = "~tonlur-sarret"
8author = "~tonlur-sarret"
8ship = "~poldec-tonteg"
9ship = "~poldec-tonteg"
@@ -12,7 +13,7 @@ Here's a short update from the team at Tlon for the week of `~2018.6.14`:
12
13
13![](https://media.urbit.org/fora/updates/~2018.6.13-Update-1.jpg)
14![](https://media.urbit.org/fora/updates/~2018.6.13-Update-1.jpg)
14
15
15−*Ted* `~rovnys-ricfer` and *J* `~leb / ~ribben-donnyl` had a great time in Boulder, CO last week at LambdaConf 2018. Ted
16+_Ted_ `~rovnys-ricfer` and _J_ `~leb / ~ribben-donnyl` had a great time in Boulder, CO last week at LambdaConf 2018. Ted
16gave his same Ford talk he gave at the last meetup to a small group there. We should see the video recording of that
17gave his same Ford talk he gave at the last meetup to a small group there. We should see the video recording of that
17published in a few months when the editing process is finished. J's talk on Hoon was a success. He posted to Fora this
18published in a few months when the editing process is finished. J's talk on Hoon was a success. He posted to Fora this
18week with a link to his slides and talk turned into article form for Martian consumption. Check it out
19week with a link to his slides and talk turned into article form for Martian consumption. Check it out
@@ -26,38 +27,38 @@ between versions from a breaking change, but breaching fixed it. We posted a sho
26[here](https://fora.urbit.org/general/posts/~2018.6.9..08.37.48..f79a~/). Let us know if you're hitting any issues
27[here](https://fora.urbit.org/general/posts/~2018.6.9..08.37.48..f79a~/). Let us know if you're hitting any issues
27getting back up and running in the new continuity era.
28getting back up and running in the new continuity era.
28
29
29−*Ted* `~rovnys-ricfer` and *Elliot* `~littel-ponnys` reunited this week after LambdaConf. Gall and Dojo on the
30+_Ted_ `~rovnys-ricfer` and _Elliot_ `~littel-ponnys` reunited this week after LambdaConf. Gall and Dojo on the
30`ford-turbo` branch now both use new Ford. Next up is Clay, in tandem with one big necessary algorithm change: adding
31`ford-turbo` branch now both use new Ford. Next up is Clay, in tandem with one big necessary algorithm change: adding
31support for the promotion of one-time builds, useful for things like generators. As usual, their code progress is
32support for the promotion of one-time builds, useful for things like generators. As usual, their code progress is
32[here](https://github.com/urbit/arvo/tree/ford-turbo).
33[here](https://github.com/urbit/arvo/tree/ford-turbo).
33
34
34−The interface team -- *Galen* `~ravmel-ropdyl`, *Anthony* `~poldec-tonteg`, *Jimmy* `~haptyl-wanwes`, *Gavin*
35+The interface team -- _Galen_ `~ravmel-ropdyl`, _Anthony_ `~poldec-tonteg`, _Jimmy_ `~haptyl-wanwes`, _Gavin_
35−`~ridlur-figbud`, *Chris* `~sigtus-hossyn`, *Isaac* `~davtyr-nimren`, and *Logan* `~tacryt-socryp` -- has commenced
36+`~ridlur-figbud`, _Chris_ `~sigtus-hossyn`, _Isaac_ `~davtyr-nimren`, and _Logan_ `~tacryt-socryp` -- has commenced
36internal private alpha MVE testing on web and mobile. Our alpha Urbit iOS app is shipped to Apple's TestFlight, and we've
37internal private alpha MVE testing on web and mobile. Our alpha Urbit iOS app is shipped to Apple's TestFlight, and we've
37all been having a blast testing it out on our phones. New web Talk in MVE even supports image display. We can't wait to
38all been having a blast testing it out on our phones. New web Talk in MVE even supports image display. We can't wait to
38ship this all soon -- just need to fix the last of bugs and design issues here and there first.
39ship this all soon -- just need to fix the last of bugs and design issues here and there first.
39
40
40![](https://media.urbit.org/fora/updates/~2018.6.13-Update-2.jpg)
41![](https://media.urbit.org/fora/updates/~2018.6.13-Update-2.jpg)
41
42
42−*Curtis* `~sorreg-namtyv` worked more on Hoon. He's been working on generalizing name binding by replacing `+toga` in
43+_Curtis_ `~sorreg-namtyv` worked more on Hoon. He's been working on generalizing name binding by replacing `+toga` in
43`hoon.hoon` as part of the new Hoon doc integration. That work in progress is
44`hoon.hoon` as part of the new Hoon doc integration. That work in progress is
44[here](https://github.com/cgyarvin/arvo/tree/research-tome). He's also been working on designing the "launch ceremony"
45[here](https://github.com/cgyarvin/arvo/tree/research-tome). He's also been working on designing the "launch ceremony"
45−for Urbit/Ethereum private keys with *Morgan* `~hidrel-fabtel` and *Will* for when we go on chain with our Urbit
46+for Urbit/Ethereum private keys with _Morgan_ `~hidrel-fabtel` and _Will_ for when we go on chain with our Urbit
46constitution on ETH very soon. We'll publish details about all of this once we've squared everything away.
47constitution on ETH very soon. We'll publish details about all of this once we've squared everything away.
47
48
48−*Mark* `~palfun-foslup` worked more on locking down the Urbit constitution by incorporating feedback from our audits and
49+_Mark_ `~palfun-foslup` worked more on locking down the Urbit constitution by incorporating feedback from our audits and
49putting more safeguards around how address space is transferred. Martian soil is too valuable to be lost through a
50putting more safeguards around how address space is transferred. Martian soil is too valuable to be lost through a
50fat-fingered Ethereum transaction or, worse, malice! We've also been working with some contributors out Texas way to get
51fat-fingered Ethereum transaction or, worse, malice! We've also been working with some contributors out Texas way to get
51our MyEtherWallet fork up to speed with the latest, greatest contract work. You can check out those changes
52our MyEtherWallet fork up to speed with the latest, greatest contract work. You can check out those changes
52[here](https://github.com/urbit/etherwallet/pull/29)
53[here](https://github.com/urbit/etherwallet/pull/29)
53
54
54−*Joe* `~master-morzod` is cranking away at setting up a reverse TCP proxy (and all of the associated machinery), so that
55+_Joe_ `~master-morzod` is cranking away at setting up a reverse TCP proxy (and all of the associated machinery), so that
55we can scrap the Ames-based proxy currently done by ship.urbit.org and move over to real, live HTTPS termination for all
56we can scrap the Ames-based proxy currently done by ship.urbit.org and move over to real, live HTTPS termination for all
56ships. This is a major undertaking and has required `~master` to touch a lot of different parts of the system: Eyre,
57ships. This is a major undertaking and has required `~master` to touch a lot of different parts of the system: Eyre,
57Vere, Ames -- you name it. Once his head is above water, he's going to write something up for us and tell us what he's
58Vere, Ames -- you name it. Once his head is above water, he's going to write something up for us and tell us what he's
58seen in his wanderings through the system.
59seen in his wanderings through the system.
59
60
60−And *Josh* `~taglux-nidsep` and *Robert* `~lodleb-ritrul` have spent yet another week making the docs more awesome.
61+And _Josh_ `~taglux-nidsep` and _Robert_ `~lodleb-ritrul` have spent yet another week making the docs more awesome.
61Josh's new Hoon tutorials (WIP link: [here](https://github.com/joshuareagan/doc-drafts)) are nearing completion. Rob
62Josh's new Hoon tutorials (WIP link: [here](https://github.com/joshuareagan/doc-drafts)) are nearing completion. Rob
62opened up a couple more PR's improving the standard-library docs. You can check the latest `urbit/docs` pull requests
63opened up a couple more PR's improving the standard-library docs. You can check the latest `urbit/docs` pull requests
63[here](https://github.com/urbit/docs/pulls).
64[here](https://github.com/urbit/docs/pulls).
@@ -67,4 +68,4 @@ There's also a third set of Hoon exercises which Josh posted to Fora
67
68
68No Mars Talk this week. Ted and Josh will return next week to talk about treaps, and where we're using them in Arvo.
69No Mars Talk this week. Ted and Josh will return next week to talk about treaps, and where we're using them in Arvo.
69
70
70−That's it for this week!
71+That's it for this week!
content/updates/2018-6-21-update.md+12−12
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.6.21 Update"
2title = "~2018.6.21 Update"
3−date = 2018-06-21
3+date = "2018-06-20"
4description = "A short update from the Tlon team for the week of ~2018.6.21."
4description = "A short update from the Tlon team for the week of ~2018.6.21."
5−aliases = ["/posts/2018-6-21-update/"]
5+aliases = [ "/posts/2018-6-21-update/" ]
6+
6[extra]
7[extra]
7author = "~tonlur-sarret"
8author = "~tonlur-sarret"
8ship = "~poldec-tonteg"
9ship = "~poldec-tonteg"
@@ -12,17 +13,17 @@ Here's a short update from the team at Tlon for the week of `~2018.6.21`
12
13
13![](https://media.urbit.org/fora/updates/~2018.6.13-Update-1.jpg)
14![](https://media.urbit.org/fora/updates/~2018.6.13-Update-1.jpg)
14
15
15−The interface team -- *Galen* `~ravmel-ropdyl`, *Jimmy* `~haptyl-wanwes`,
16+The interface team -- _Galen_ `~ravmel-ropdyl`, _Jimmy_ `~haptyl-wanwes`,
16−*Gavin* `~ridlur-figbud`, *Chris* `~sigtus-hossyn`, *Anthony* `~poldec-tonteg`, and *Isaac* `~davtyr-nimren` -- worked
17+_Gavin_ `~ridlur-figbud`, _Chris_ `~sigtus-hossyn`, _Anthony_ `~poldec-tonteg`, and _Isaac_ `~davtyr-nimren` -- worked
17more on MVE. We're getting incrementally closer to being able to release a public beta. Life has been active on the
18more on MVE. We're getting incrementally closer to being able to release a public beta. Life has been active on the
18testnet as the team coordinates to fix the last known bugs and design issues.
19testnet as the team coordinates to fix the last known bugs and design issues.
19
20
20−*Logan* `~tacryt-socryp` noticed a lacking feature in Hall: read vs. unread messages, a common feature in most messaging
21+_Logan_ `~tacryt-socryp` noticed a lacking feature in Hall: read vs. unread messages, a common feature in most messaging
21applications. Logan decided to embark on his first real Hoon project and successfully implemented this last week. You can
22applications. Logan decided to embark on his first real Hoon project and successfully implemented this last week. You can
22check out the code [here](https://github.com/loganallenc/arvo/tree/hall-unread), to be merged into MVE soon.
23check out the code [here](https://github.com/loganallenc/arvo/tree/hall-unread), to be merged into MVE soon.
23
24
24−The constitution team -- *Mark* `~palfun-foslup`, *Curtis* `~sorreg-namtyv`, *Morgan* `~hidrel-fabtel`, *Will*
25+The constitution team -- _Mark_ `~palfun-foslup`, _Curtis_ `~sorreg-namtyv`, _Morgan_ `~hidrel-fabtel`, _Will_
25−`~hadrud-lodsef`, *Anthony* `~poldec-tonteg`, and Texan *Ben* `~mirfet-hocbyt` -- has been continuing to work to get us
26+`~hadrud-lodsef`, _Anthony_ `~poldec-tonteg`, and Texan _Ben_ `~mirfet-hocbyt` -- has been continuing to work to get us
26on chain by the end of the summer. Mark has been fortifying some of the contracts and Arvo-side cryptography and Jael
27on chain by the end of the summer. Mark has been fortifying some of the contracts and Arvo-side cryptography and Jael
27functionality, while Ben and Anthony continue to finalize the control flow of our `MyUrbitWallet` fork. Curtis, Morgan,
28functionality, while Ben and Anthony continue to finalize the control flow of our `MyUrbitWallet` fork. Curtis, Morgan,
28and Will are striding forward on designing the key-launch ceremony, more details of which we'll publish soon. The latest
29and Will are striding forward on designing the key-launch ceremony, more details of which we'll publish soon. The latest
@@ -30,12 +31,12 @@ and Will are striding forward on designing the key-launch ceremony, more details
30[Arvo](https://github.com/Fang-/arvo/tree/research-constitution) code with the latest Jael work can all be found on
31[Arvo](https://github.com/Fang-/arvo/tree/research-constitution) code with the latest Jael work can all be found on
31GitHub.
32GitHub.
32
33
33−*Curtis* `~sorreg-namtyv` worked more on Hoon, continuing to improve face-wrapping (variable naming) around values. He's
34+_Curtis_ `~sorreg-namtyv` worked more on Hoon, continuing to improve face-wrapping (variable naming) around values. He's
34also been working on a couple of new runes, like `^#`, whose designs aren't yet fully complete, but when they are, we'll
35also been working on a couple of new runes, like `^#`, whose designs aren't yet fully complete, but when they are, we'll
35document and share with y'all. Curtis' research [Arvo](https://github.com/cgyarvin/arvo/tree/research-tome) and
36document and share with y'all. Curtis' research [Arvo](https://github.com/cgyarvin/arvo/tree/research-tome) and
36[Vere](https://github.com/cgyarvin/urbit-1/tree/research-tome) code can be found on GitHub.
37[Vere](https://github.com/cgyarvin/urbit-1/tree/research-tome) code can be found on GitHub.
37
38
38−*Joe* `~master-morzod` worked more on HTTPS this past week and got some of his work merged into the `urbit/arvo`
39+_Joe_ `~master-morzod` worked more on HTTPS this past week and got some of his work merged into the `urbit/arvo`
39`collections` branch, which will go live with the MVE release. Included in the PR are new moves in Eyre and Ames to
40`collections` branch, which will go live with the MVE release. Included in the PR are new moves in Eyre and Ames to
40support his reverse TCP proxy, HTTPS server configuration changes, and child-ship IP address changes. Additionally added
41support his reverse TCP proxy, HTTPS server configuration changes, and child-ship IP address changes. Additionally added
41is a dynamic-DNS Gall app, which brings us closer to our envisioned ideal of getting `your-ship.urbit.org` to connect
42is a dynamic-DNS Gall app, which brings us closer to our envisioned ideal of getting `your-ship.urbit.org` to connect
@@ -43,18 +44,17 @@ directly to your ship's IP address, rather than going through Tlon's intermediar
43deploy this to our internal testnet before releasing it into the wild. Joe's work can be found
44deploy this to our internal testnet before releasing it into the wild. Joe's work can be found
44[here](https://github.com/urbit/arvo/pull/752) on GitHub -- very exciting.
45[here](https://github.com/urbit/arvo/pull/752) on GitHub -- very exciting.
45
46
46−*Ted* `~rovnys-ricfer` and *Elliot* `~littel-ponnys` now nearly have a fully-integrated Ford Turbo. They can boot a ship
47+_Ted_ `~rovnys-ricfer` and _Elliot_ `~littel-ponnys` now nearly have a fully-integrated Ford Turbo. They can boot a ship
47with a Clay that exclusively uses Ford Turbo and not old, slow Ford. Gall integration is also complete. Now they're
48with a Clay that exclusively uses Ford Turbo and not old, slow Ford. Gall integration is also complete. Now they're
48focused on finishing the caching implementation, as well as a new `%walk` schematic to perform a graph-search through the
49focused on finishing the caching implementation, as well as a new `%walk` schematic to perform a graph-search through the
49available marks for data conversion. Ted and Elliot's work is [here](https://github.com/urbit/arvo/tree/ford-turbo) on
50available marks for data conversion. Ted and Elliot's work is [here](https://github.com/urbit/arvo/tree/ford-turbo) on
50GitHub, and their more detailed updates are [here](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/)
51GitHub, and their more detailed updates are [here](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/)
51as comments to their original Fora post.
52as comments to their original Fora post.
52
53
53−And last, but not least, *Josh* `~taglux-nidsep` and *Robert* `~lodleb-ritrul` have continued their much-needed
54+And last, but not least, _Josh_ `~taglux-nidsep` and _Robert_ `~lodleb-ritrul` have continued their much-needed
54doc-improvement work. Josh's in-progress drafts of his new Hoon tutorials are
55doc-improvement work. Josh's in-progress drafts of his new Hoon tutorials are
55[here](https://github.com/joshuareagan/doc-drafts), and Rob's latest pull requests improving the standard library docs
56[here](https://github.com/joshuareagan/doc-drafts), and Rob's latest pull requests improving the standard library docs
56are [here](https://github.com/urbit/docs/pulls). If there's anything you feel should be documented and currently isn't,
57are [here](https://github.com/urbit/docs/pulls). If there's anything you feel should be documented and currently isn't,
57feel free to write us a comment below.
58feel free to write us a comment below.
58
59
59May `~zod` be with you all. Have a great rest of your week.
60May `~zod` be with you all. Have a great rest of your week.
60−
content/updates/2018-6-6-update.md+13−12
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.6.6 Update"
2title = "~2018.6.6 Update"
3−date = 2018-06-06
3+date = "2018-06-05"
4description = "A short update from the Tlon team for the week of ~2018.6.6."
4description = "A short update from the Tlon team for the week of ~2018.6.6."
5−aliases = ["/posts/2018-6-6-update/"]
5+aliases = [ "/posts/2018-6-6-update/" ]
6+
6[extra]
7[extra]
7ship = "~tonlur-sarret"
8ship = "~tonlur-sarret"
8author = ""
9author = ""
@@ -15,51 +16,51 @@ Here's a short update from the team at Tlon for the week of `~2018.6.6`:
15
16
16We hired somebody! We're happy to welcome to Tlon:
17We hired somebody! We're happy to welcome to Tlon:
17
18
18−- *Will* `~hadrud-lodsef` -- Will studied CS at Stanford and worked for years in VC. Among other things, he likes
19+- _Will_ `~hadrud-lodsef` -- Will studied CS at Stanford and worked for years in VC. Among other things, he likes
19 ceramics and decentralized systems. He's going to work on a mix of things for us, from operations to Urbit private-key
20 ceramics and decentralized systems. He's going to work on a mix of things for us, from operations to Urbit private-key
20 distribution and management.
21 distribution and management.
21
22
22−The interface team -- *Galen* `~ravmel-ropdyl`, *Anthony* `~poldec-tonteg`, *Isaac V* `~davtyr-nimren`, *Jimmy*
23+The interface team -- _Galen_ `~ravmel-ropdyl`, _Anthony_ `~poldec-tonteg`, _Isaac V_ `~davtyr-nimren`, _Jimmy_
23−`~haptyl-wanwes`, *Chris* `~sigtus-hossyn`, *Logan* `~tacryt-socryp`, and *Gavin* `~ridlur-figbud` -- is narrowing in on
24+`~haptyl-wanwes`, _Chris_ `~sigtus-hossyn`, _Logan_ `~tacryt-socryp`, and _Gavin_ `~ridlur-figbud` -- is narrowing in on
24an alpha version of MVE, nearing readiness to start testing internally. Anthony and Isaac have been getting our internal
25an alpha version of MVE, nearing readiness to start testing internally. Anthony and Isaac have been getting our internal
25testnet set up, and Logan is ready to submit our alpha iOS app to Apple's TestFlight. We'll keep you posted about public
26testnet set up, and Logan is ready to submit our alpha iOS app to Apple's TestFlight. We'll keep you posted about public
26beta testing, on the way soon.
27beta testing, on the way soon.
27
28
28−*Isaac V* `~davtyr-nimren` finished an [in-Urbit static-site generator](https://github.com/urbit/arvo/pull/745) this
29+_Isaac V_ `~davtyr-nimren` finished an [in-Urbit static-site generator](https://github.com/urbit/arvo/pull/745) this
29week. When merged, this will give you the option to easily host your urbit's static files through a production-ready Unix
30week. When merged, this will give you the option to easily host your urbit's static files through a production-ready Unix
30web server like Nginx in tandem with Arvo's web server, Eyre. This way, you can still host fast collections while we
31web server like Nginx in tandem with Arvo's web server, Eyre. This way, you can still host fast collections while we
31continue to work on Arvo's performance.
32continue to work on Arvo's performance.
32
33
33−*Ted* `~rovnys-ricfer` has been at LambdaConf 2018 this week spreading the good news of `~zod` and
34+_Ted_ `~rovnys-ricfer` has been at LambdaConf 2018 this week spreading the good news of `~zod` and
34non-lambda-calculus-based functional programming. Our good friend and galactic senator Justin LeBlanc `~leb` gave a talk,
35non-lambda-calculus-based functional programming. Our good friend and galactic senator Justin LeBlanc `~leb` gave a talk,
35_Hoon and You - A Functional Programming Perspective_. Hopefully we can get slides and a video for you soon.
36_Hoon and You - A Functional Programming Perspective_. Hopefully we can get slides and a video for you soon.
36
37
37−*Elliot* `~littel-ponnys` worked more on new Ford. It's now working as its own separate vane in the kernel, `%turbo`, and
38+_Elliot_ `~littel-ponnys` worked more on new Ford. It's now working as its own separate vane in the kernel, `%turbo`, and
38it reloads itself on Arvo `|reset`s and `|reload`s. While old `%ford` still exists, the next steps are to integrate
39it reloads itself on Arvo `|reset`s and `|reload`s. While old `%ford` still exists, the next steps are to integrate
39`%turbo` with the rest of the system. Elliot has been working on a separate Dojo, _Dontjo_, that uses Turbo instead of
40`%turbo` with the rest of the system. Elliot has been working on a separate Dojo, _Dontjo_, that uses Turbo instead of
40old Ford. New Ford work is [here](https://github.com/urbit/arvo/tree/ford-turbo), and Fora updates are
41old Ford. New Ford work is [here](https://github.com/urbit/arvo/tree/ford-turbo), and Fora updates are
41[here](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/).
42[here](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/).
42
43
43−*Mark* `~palfun-foslup` has been wrapping up Urbit-on-ETH constitution work this week. We're just about in our final lap,
44+_Mark_ `~palfun-foslup` has been wrapping up Urbit-on-ETH constitution work this week. We're just about in our final lap,
44finalizing our audit reports, fixing the last of known bugs, upgrading the contracts to latest Solidity and OpenZeppelin
45finalizing our audit reports, fixing the last of known bugs, upgrading the contracts to latest Solidity and OpenZeppelin
45versions, and rounding our our test coverage, code comments and documentation, and ERC721 compliance. The latest contract
46versions, and rounding our our test coverage, code comments and documentation, and ERC721 compliance. The latest contract
46code can be found [here](https://github.com/urbit/constitution). We'll come out with an official email blast and
47code can be found [here](https://github.com/urbit/constitution). We'll come out with an official email blast and
47urbit.org post with more information when we're all ready to go.
48urbit.org post with more information when we're all ready to go.
48
49
49−*Curtis* `~sorreg-namtyv` has been working more on Hoon. Notably, one new change on the table is switching the model-arm
50+_Curtis_ `~sorreg-namtyv` has been working more on Hoon. Notably, one new change on the table is switching the model-arm
50rune from `+=` to `+$`, keeping it more in line with the `$` family of Hoon syntax relating to models. The feedback from
51rune from `+=` to `+$`, keeping it more in line with the `$` family of Hoon syntax relating to models. The feedback from
51the community in `/urbit-meta` on this was positive. Additionally, he's been rethinking the `+toga` data structure for
52the community in `/urbit-meta` on this was positive. Additionally, he's been rethinking the `+toga` data structure for
52dealing with faces (variable names) on Hoon values. His research branch is
53dealing with faces (variable names) on Hoon values. His research branch is
53[here](https://github.com/cgyarvin/arvo/tree/research-tome). We'll have more to report next week.
54[here](https://github.com/cgyarvin/arvo/tree/research-tome). We'll have more to report next week.
54
55
55−*Joe* `~master-morzod` has been continuing work on the HTTPS project. Notably this week, Joe's been working on an
56+_Joe_ `~master-morzod` has been continuing work on the HTTPS project. Notably this week, Joe's been working on an
56in-Urbit reverse TCP proxy, so that planets behind private networks / NATs can still have their data served to
57in-Urbit reverse TCP proxy, so that planets behind private networks / NATs can still have their data served to
57`ship.urbit.org` via their star over Ames. With this last feature, in addition to Joe's mostly-completed `libh2o`,
58`ship.urbit.org` via their star over Ames. With this last feature, in addition to Joe's mostly-completed `libh2o`,
58LetsEncrypt, and dynamic-DNS Gall-app implementations, the fast and secure direct `ship.urbit.org` feature of MVE should
59LetsEncrypt, and dynamic-DNS Gall-app implementations, the fast and secure direct `ship.urbit.org` feature of MVE should
59be primed to get tested into existence, then shipped. Joe's latest work-in-progress is
60be primed to get tested into existence, then shipped. Joe's latest work-in-progress is
60[here](https://github.com/joemfb/arvo/tree/reverse-proxy-notification).
61[here](https://github.com/joemfb/arvo/tree/reverse-proxy-notification).
61
62
62−*Josh* `~taglux-nidsep` and *Robert* `~lodleb-ritrul` blazed through more doc this week. Josh's [new Hoon
63+_Josh_ `~taglux-nidsep` and _Robert_ `~lodleb-ritrul` blazed through more doc this week. Josh's [new Hoon
63tutorials](https://github.com/joshuareagan/doc-drafts) are starting to come together. Rob has been improving the
64tutorials](https://github.com/joshuareagan/doc-drafts) are starting to come together. Rob has been improving the
64standard-library docs and has open [several pull requests](https://github.com/urbit/docs/pulls), to be reviewed and
65standard-library docs and has open [several pull requests](https://github.com/urbit/docs/pulls), to be reviewed and
65merged this week. The docs are getting better.
66merged this week. The docs are getting better.
content/updates/2018-7-13-update.md+12−11
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.7.13 Update"
2title = "~2018.7.13 Update"
3−date = 2018-07-13
3+date = "2018-07-12"
4description = "A short update from the Tlon team for the week of ~2018.7.13."
4description = "A short update from the Tlon team for the week of ~2018.7.13."
5−aliases = ["/posts/2018-7-13-update/"]
5+aliases = [ "/posts/2018-7-13-update/" ]
6+
6[extra]
7[extra]
7author = "~tonlur-sarret"
8author = "~tonlur-sarret"
8ship = "~poldec-tonteg"
9ship = "~poldec-tonteg"
@@ -12,15 +13,15 @@ image = "https://media.urbit.org/fora/updates/~2018.7.13-Update-1.jpg"
12Here's a short update from the team at Tlon for the week of `~2018.7.13`:
13Here's a short update from the team at Tlon for the week of `~2018.7.13`:
13
14
14> "A complex system that works is invariably found to have evolved from a simple
15> "A complex system that works is invariably found to have evolved from a simple
15− system that worked. A complex system designed from scratch never works and
16+> system that worked. A complex system designed from scratch never works and
16− cannot be patched up to make it work. You have to start over with a working
17+> cannot be patched up to make it work. You have to start over with a working
17− simple system."
18+> simple system."
18
19
19−-[John Gall](https://en.wikipedia.org/wiki/John_Gall_(author))
20+-[John Gall](<https://en.wikipedia.org/wiki/John_Gall_(author)>)
20
21
21![](https://media.urbit.org/fora/updates/~2018.7.13-Update-1.jpg)
22![](https://media.urbit.org/fora/updates/~2018.7.13-Update-1.jpg)
22
23
23−The Infrastructure team -- *Curtis* `~sorreg-namtyv`, *Anthony* `~poldec-tonteg`, *Joe* `~master-morzod`, *Ted* `~rovnys-ricfer`, *Elliot* `~littel-ponnys`, *Mark* `~palfun-foslup` -- worked on improving the core of the Urbit system:
24+The Infrastructure team -- _Curtis_ `~sorreg-namtyv`, _Anthony_ `~poldec-tonteg`, _Joe_ `~master-morzod`, _Ted_ `~rovnys-ricfer`, _Elliot_ `~littel-ponnys`, _Mark_ `~palfun-foslup` -- worked on improving the core of the Urbit system:
24
25
25- Curtis worked on improving Hoon: [`research-tome` Arvo](https://github.com/cgyarvin/arvo/tree/research-tome),
26- Curtis worked on improving Hoon: [`research-tome` Arvo](https://github.com/cgyarvin/arvo/tree/research-tome),
26 [`research-tome` Vere](https://github.com/cgyarvin/urbit-1/tree/research-tome)
27 [`research-tome` Vere](https://github.com/cgyarvin/urbit-1/tree/research-tome)
@@ -32,15 +33,15 @@ The Infrastructure team -- *Curtis* `~sorreg-namtyv`, *Anthony* `~poldec-tonteg`
32 [updates](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/)
33 [updates](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/)
33- Mark made crypto additions to the kernel: [`crypto-additions` Arvo](https://github.com/urbit/arvo/tree/crypto-additions)
34- Mark made crypto additions to the kernel: [`crypto-additions` Arvo](https://github.com/urbit/arvo/tree/crypto-additions)
34
35
35−The documentation team -- *Josh* `~taglux-nidsep` and *Robert* `~lodleb-ritrul` --
36+The documentation team -- _Josh_ `~taglux-nidsep` and _Robert_ `~lodleb-ritrul` --
36improved how we communicate how Urbit works:
37improved how we communicate how Urbit works:
37
38
38- Josh continued work on the new Hoon tutorials: [`master` doc drafts](https://github.com/joshuareagan/doc-drafts)
39- Josh continued work on the new Hoon tutorials: [`master` doc drafts](https://github.com/joshuareagan/doc-drafts)
39- Robert put in more work improving the Hoon standard library doc: [docs pull
40- Robert put in more work improving the Hoon standard library doc: [docs pull
40 requests](https://github.com/urbit/docs/pulls)
41 requests](https://github.com/urbit/docs/pulls)
41
42
42−The Interface team -- *Galen* `~ravmel-ropdyl`, *Anthony* `~poldec-tonteg`, *Jimmy* `~haptyl-wanwes`, *Gavin*
43+The Interface team -- _Galen_ `~ravmel-ropdyl`, _Anthony_ `~poldec-tonteg`, _Jimmy_ `~haptyl-wanwes`, _Gavin_
43−`~ridlur-figbud`, *Chris* `~sigtus-hossyn`, *Isaac V* `~davtyr-nimren`, *Logan* `~tacryt-socryp`, and *Keaton*
44+`~ridlur-figbud`, _Chris_ `~sigtus-hossyn`, _Isaac V_ `~davtyr-nimren`, _Logan_ `~tacryt-socryp`, and _Keaton_
44`~tonlur-sarret` -- worked on Landscape (formerly MVE):
45`~tonlur-sarret` -- worked on Landscape (formerly MVE):
45
46
46- Galen, Jimmy, and Gavin have continued work on Landscape's visual design
47- Galen, Jimmy, and Gavin have continued work on Landscape's visual design
@@ -51,7 +52,7 @@ The Interface team -- *Galen* `~ravmel-ropdyl`, *Anthony* `~poldec-tonteg`, *Jim
51- Anthony has been getting the latest Landscape code onto the testnet: [`testnet`
52- Anthony has been getting the latest Landscape code onto the testnet: [`testnet`
52 Arvo](https://github.com/urbit/arvo/tree/testnet)
53 Arvo](https://github.com/urbit/arvo/tree/testnet)
53
54
54−The Constitution/Keys team -- *Mark* `~palfun-foslup`, *Curtis* `~sorreg-namtyv`, *Morgan* `~hidrel-fabtel`, *Will* `~hadrud-lodsef`, *Anthony* `~poldec-tonteg`, and *Ben* `~mirfet-hocbyt` -- worked to make Urbit computing cryptographically real:
55+The Constitution/Keys team -- _Mark_ `~palfun-foslup`, _Curtis_ `~sorreg-namtyv`, _Morgan_ `~hidrel-fabtel`, _Will_ `~hadrud-lodsef`, _Anthony_ `~poldec-tonteg`, and _Ben_ `~mirfet-hocbyt` -- worked to make Urbit computing cryptographically real:
55
56
56- Curtis, Morgan, and Will have been fortifying the current proposed key ceremony, still in private draft mode
57- Curtis, Morgan, and Will have been fortifying the current proposed key ceremony, still in private draft mode
57- Ben has been cleaning up Wallet: [`mercury` Wallet](https://github.com/urbit/etherwallet)
58- Ben has been cleaning up Wallet: [`mercury` Wallet](https://github.com/urbit/etherwallet)
content/updates/2018-7-20-update.md+20−20
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.7.20 Update"
2title = "~2018.7.20 Update"
3−date = 2018-07-20
3+date = "2018-07-19"
4description = "A short update from the Tlon team for the week of ~2018.7.20."
4description = "A short update from the Tlon team for the week of ~2018.7.20."
5−aliases = ["/posts/2018-7-20-update/"]
5+aliases = [ "/posts/2018-7-20-update/" ]
6+
6[extra]
7[extra]
7author = "~tonlur-sarret"
8author = "~tonlur-sarret"
8ship = "~poldec-tonteg"
9ship = "~poldec-tonteg"
@@ -13,46 +14,45 @@ Here's a short update from the team at Tlon for the week of `~2018.7.20`:
13
14
14![](https://media.urbit.org/fora/updates/~2018.7.13-Update-1.jpg)
15![](https://media.urbit.org/fora/updates/~2018.7.13-Update-1.jpg)
15
16
16−The Keys team spent another week moving fast to get us on chain. *Anthony*
17+The Keys team spent another week moving fast to get us on chain. _Anthony_
17−`~poldec-tonteg` and *Morgan* `~hidrel-fabtel` worked on a new design for
18+`~poldec-tonteg` and _Morgan_ `~hidrel-fabtel` worked on a new design for
18−Wallet, which will manage your Urbit address-space ownership. *Curtis*
19+Wallet, which will manage your Urbit address-space ownership. _Curtis_
19−`~sorreg-namtyv` and *Mark* `~palfun-foslup` fortified the Constitution more.
20+`~sorreg-namtyv` and _Mark_ `~palfun-foslup` fortified the Constitution more.
20−*Will* `~hadrud-lodsef` and *Keaton* `~tonlur-sarret` worked to make sure that
21+_Will_ `~hadrud-lodsef` and _Keaton_ `~tonlur-sarret` worked to make sure that
21existing address-space owners can safely and easily register their ownership
22existing address-space owners can safely and easily register their ownership
22within the new system. More on this soon.
23within the new system. More on this soon.
23
24
24−The Infrastructure team was hard at work this week. *Joe* `~master-morzod`
25+The Infrastructure team was hard at work this week. _Joe_ `~master-morzod`
25merged much of his HTTPS work into the `collections` branch of Arvo and is onto
26merged much of his HTTPS work into the `collections` branch of Arvo and is onto
26broader Arvo integration testing (code [here](https://github.com/urbit/arvo/tree/collections)).
27broader Arvo integration testing (code [here](https://github.com/urbit/arvo/tree/collections)).
27−*Ted* `~rovnys-ricfer`
28+_Ted_ `~rovnys-ricfer`
28−and *Elliot* `~littel-ponnys` cleaned up new Ford (code
29+and _Elliot_ `~littel-ponnys` cleaned up new Ford (code
29[here](https://github.com/urbit/arvo/branches/all?utf8=%E2%9C%93&query=ford-turbo)),
30[here](https://github.com/urbit/arvo/branches/all?utf8=%E2%9C%93&query=ford-turbo)),
30trimming off several hundred lines
31trimming off several hundred lines
31of code and making it easier to reason about while staying within our desired
32of code and making it easier to reason about while staying within our desired
32−performance goals. *Curtis* `~sorreg-namtyv` finished the new implementation of
33+performance goals. _Curtis_ `~sorreg-namtyv` finished the new implementation of
33the `?=` ("wut-tis") rune and designed the type analysis infrastructure for the
34the `?=` ("wut-tis") rune and designed the type analysis infrastructure for the
34−new noun printer. *Mark* `~palfun-foslup` produced an Urbit-specific variant of
35+new noun printer. _Mark_ `~palfun-foslup` produced an Urbit-specific variant of
35the Argon2 password-hashing function (code [here](https://github.com/urbit/argon2)).
36the Argon2 password-hashing function (code [here](https://github.com/urbit/argon2)).
36−*Travis* `~rigdyn-sondur`, an old friend of Tlon, has also been writing crypto
37+_Travis_ `~rigdyn-sondur`, an old friend of Tlon, has also been writing crypto
37jets this week, and those will go in the kernel soon.
38jets this week, and those will go in the kernel soon.
38
39
39The Interface team has had another great week of making Urbit more usable.
40The Interface team has had another great week of making Urbit more usable.
40−*Jimmy* `~haptyl-wanwes` has been working on a new urbit.org, written in Sail.
41+_Jimmy_ `~haptyl-wanwes` has been working on a new urbit.org, written in Sail.
41−*Galen* `~ravmel-ropdyl` and *Gavin* `~ridlur-figbud` have been reviewing and
42+_Galen_ `~ravmel-ropdyl` and _Gavin_ `~ridlur-figbud` have been reviewing and
42finalizing some Landscape design edits and coordinating with the frontend team.
43finalizing some Landscape design edits and coordinating with the frontend team.
43−*Chris* `~sigtus-hossyn` and *Logan* `~tacryt-socryp` have been implementing the
44+_Chris_ `~sigtus-hossyn` and _Logan_ `~tacryt-socryp` have been implementing the
44−updated designs on desktop and mobile and churning through issues. *Isaac*
45+updated designs on desktop and mobile and churning through issues. _Isaac_
45`~davtyr-nimren` worked on a better backend JSON interface for the Collections
46`~davtyr-nimren` worked on a better backend JSON interface for the Collections
46app and made sure that Collections is using all of the permissioning that Clay now offers.
47app and made sure that Collections is using all of the permissioning that Clay now offers.
47
48
48−And the Documentation team continued their quest to teach the world Hoon. *Josh*
49+And the Documentation team continued their quest to teach the world Hoon. _Josh_
49`~taglux-nidsep` worked more on his new Hoon tutorials (drafts [here](https://github.com/joshuareagan/doc-drafts)).
50`~taglux-nidsep` worked more on his new Hoon tutorials (drafts [here](https://github.com/joshuareagan/doc-drafts)).
50−*Robert* `~lodleb-ritrul` successfully documented the Hoon standard library cores
51+_Robert_ `~lodleb-ritrul` successfully documented the Hoon standard library cores
51for date/time and hashing (PR's [here](https://github.com/urbit/docs/pulls)).
52for date/time and hashing (PR's [here](https://github.com/urbit/docs/pulls)).
52
53
53Keep on Hooning, Martians. See you in `/urbit-meta`.
54Keep on Hooning, Martians. See you in `/urbit-meta`.
54
55
55−
56---
56---
57
57
58Photo credit: [OMA](http://oma.eu/news/from-ciam-to-cyberspace-architecture-and-the-community)
58Photo credit: [OMA](http://oma.eu/news/from-ciam-to-cyberspace-architecture-and-the-community)
content/updates/2018-7-3-update.md+13−13
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.7.3 Update"
2title = "~2018.7.3 Update"
3−date = 2018-07-03
3+date = "2018-07-02"
4description = "A short update from the Tlon team for the week of ~2018.7.3."
4description = "A short update from the Tlon team for the week of ~2018.7.3."
5−aliases = ["/posts/2018-7-3-update/"]
5+aliases = [ "/posts/2018-7-3-update/" ]
6+
6[extra]
7[extra]
7author = "~tonlur-sarret"
8author = "~tonlur-sarret"
8ship = "~poldec-tonteg"
9ship = "~poldec-tonteg"
@@ -13,9 +14,9 @@ image = "https://media.urbit.org/fora/updates/~2018.7.2-Update-1.jpg"
13
14
14Here's a short update from the team at Tlon for the week of `~2018.7.2`
15Here's a short update from the team at Tlon for the week of `~2018.7.2`
15
16
16−The interface team -- *Galen* `~ravmel-ropdyl`, *Jimmy* `~haptyl-wanwes`, *Logan*
17+The interface team -- _Galen_ `~ravmel-ropdyl`, _Jimmy_ `~haptyl-wanwes`, _Logan_
17−`~tacryt-socryp`, *Gavin* `~ridlur-figbud`, *Chris* `~sigtus-hossyn`, *Anthony*
18+`~tacryt-socryp`, _Gavin_ `~ridlur-figbud`, _Chris_ `~sigtus-hossyn`, _Anthony_
18−`~poldec-tonteg`, and *Isaac V* `~davtyr-nimren` -- worked more on MVE. Chris
19+`~poldec-tonteg`, and _Isaac V_ `~davtyr-nimren` -- worked more on MVE. Chris
19deployed a new _command palette_ for MVE to our internal testnet which we've been
20deployed a new _command palette_ for MVE to our internal testnet which we've been
20playing around with and are excited to ship soon. Isaac is re-architecting
21playing around with and are excited to ship soon. Isaac is re-architecting
21Collections a bit. Logan has been buffing up his read/unread code for Hall/Talk.
22Collections a bit. Logan has been buffing up his read/unread code for Hall/Talk.
@@ -25,9 +26,9 @@ syllables which we've been pretty entranced by:
25
26
26![](https://media.urbit.org/fora/updates/~2018.7.2-Update-2.jpg)
27![](https://media.urbit.org/fora/updates/~2018.7.2-Update-2.jpg)
27
28
28−The constitution team -- *Mark* `~palfun-foslup`, *Curtis* `~sorreg-namtyv`,
29+The constitution team -- _Mark_ `~palfun-foslup`, _Curtis_ `~sorreg-namtyv`,
29−*Morgan* `~hidrel-fabtel`, *Will*
30+_Morgan_ `~hidrel-fabtel`, _Will_
30−`~hadrud-lodsef`, *Anthony* `~poldec-tonteg`, and *Ben* `~mirfet-hocbyt` -- worked more on fortifying our summer
31+`~hadrud-lodsef`, _Anthony_ `~poldec-tonteg`, and _Ben_ `~mirfet-hocbyt` -- worked more on fortifying our summer
31key-ceremony gameplan. Mark completed a BIP32 key-derivation library in Arvo. Will has a solid outline for our ETH launch
32key-ceremony gameplan. Mark completed a BIP32 key-derivation library in Arvo. Will has a solid outline for our ETH launch
32plan, which we're now getting some feedback on from our crypto nerd friends. Ben, Anthony, and Galen have been scheming a
33plan, which we're now getting some feedback on from our crypto nerd friends. Ben, Anthony, and Galen have been scheming a
33MyUrbitWallet redesign while we're still awaiting our final contract audits. Overall, everything here is coming together.
34MyUrbitWallet redesign while we're still awaiting our final contract audits. Overall, everything here is coming together.
@@ -37,7 +38,7 @@ while away from launching all of this, but we'll keep you posted.
37
38
38![](https://media.urbit.org/fora/updates/~2018.7.2-Update-3.jpg)
39![](https://media.urbit.org/fora/updates/~2018.7.2-Update-3.jpg)
39
40
40−*Joe* `~master-morzod` continued his HTTPS work, moving his development to an actual testnet to sort out the bugs
41+_Joe_ `~master-morzod` continued his HTTPS work, moving his development to an actual testnet to sort out the bugs
41entailed by generating LetsEncrypt certificates and dynamically changing server configs on running ships. In doing so,
42entailed by generating LetsEncrypt certificates and dynamically changing server configs on running ships. In doing so,
42he's helped track down some of our gnarlier bugs (like [this one](https://github.com/urbit/arvo/issues/740)) and provided
43he's helped track down some of our gnarlier bugs (like [this one](https://github.com/urbit/arvo/issues/740)) and provided
43some more food for thought for the inevitable Gall and Eyre redesigns. He's also chipping away at a UP describing all
44some more food for thought for the inevitable Gall and Eyre redesigns. He's also chipping away at a UP describing all
@@ -45,11 +46,11 @@ this new, exciting functionality. We'll let you know when that comes out. Joe's
45[Vere](https://github.com/joemfb/urbit/branches) and [Arvo](https://github.com/joemfb/arvo/branches) work-in-progrsss is
46[Vere](https://github.com/joemfb/urbit/branches) and [Arvo](https://github.com/joemfb/arvo/branches) work-in-progrsss is
46on GitHub.
47on GitHub.
47
48
48−*Curtis* `~sorreg-namtyv` worked mostly on internal Tlon things this week, but you might get a kick out of his current
49+_Curtis_ `~sorreg-namtyv` worked mostly on internal Tlon things this week, but you might get a kick out of his current
49rendition of renamings for some of Hoon's symbols, pointed out in this recent Fora post: [_Symbol
50rendition of renamings for some of Hoon's symbols, pointed out in this recent Fora post: [_Symbol
50renaming_](https://fora.urbit.org/general/posts/~2018.7.2..01.08.03..c4af~/).
51renaming_](https://fora.urbit.org/general/posts/~2018.7.2..01.08.03..c4af~/).
51
52
52−*Ted* `~rovnys-ricfer` and *Elliot* `~littel-ponnys` continued work this week on new Ford. They've been hitting several
53+_Ted_ `~rovnys-ricfer` and _Elliot_ `~littel-ponnys` continued work this week on new Ford. They've been hitting several
53frustrating bugs, and the code they had wasn't as easy to reason about as they were hoping. So to help tackle all this,
54frustrating bugs, and the code they had wasn't as easy to reason about as they were hoping. So to help tackle all this,
54they decided to start re-architecting parts of new Ford to track the statuses of builds with per-build state machines.
55they decided to start re-architecting parts of new Ford to track the statuses of builds with per-build state machines.
55This will entail a pretty significant reorganization of the `+ford-state` date structure, but they're confident this will
56This will entail a pretty significant reorganization of the `+ford-state` date structure, but they're confident this will
@@ -57,10 +58,9 @@ simplify new Ford's semantics and help them get this project fully across the fi
57work-in-progress can be found is [here](https://github.com/urbit/arvo/branches/all?utf8=%E2%9C%93&query=ford-turbo), and
58work-in-progress can be found is [here](https://github.com/urbit/arvo/branches/all?utf8=%E2%9C%93&query=ford-turbo), and
58you can read their technical Fora updates [here](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/).
59you can read their technical Fora updates [here](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/).
59
60
60−Finally, *Josh* `~taglux-nidsep` and *Robert* `~lodleb-ritrul` continue to strengthen our documentation. Josh is well
61+Finally, _Josh_ `~taglux-nidsep` and _Robert_ `~lodleb-ritrul` continue to strengthen our documentation. Josh is well
61into Chapter 2 of his new tutorials, and Rob has a couple new standard-library documentation sections which turned out to
62into Chapter 2 of his new tutorials, and Rob has a couple new standard-library documentation sections which turned out to
62not be documented at all until now. Josh's in-progress work is [here](https://github.com/joshuareagan/doc-drafts); Rob's
63not be documented at all until now. Josh's in-progress work is [here](https://github.com/joshuareagan/doc-drafts); Rob's
63latest pull requests are [here](https://github.com/urbit/docs/pulls).
64latest pull requests are [here](https://github.com/urbit/docs/pulls).
64
65
65And that's the way it is. Have a great week!
66And that's the way it is. Have a great week!
66−
content/updates/2018-7-30-update.md+18−18
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.7.30 Update"
2title = "~2018.7.30 Update"
3−date = 2018-07-30
3+date = "2018-07-29"
4description = "A short update from the Tlon team for the week of ~2018.7.30."
4description = "A short update from the Tlon team for the week of ~2018.7.30."
5−aliases = ["/posts/2018-7-30-update/"]
5+aliases = [ "/posts/2018-7-30-update/" ]
6+
6[extra]
7[extra]
7author = "~tonlur-sarret"
8author = "~tonlur-sarret"
8ship = "~poldec-tonteg"
9ship = "~poldec-tonteg"
@@ -14,17 +15,17 @@ Here's a short update from the team at Tlon for the week of `~2018.7.30`:
14![](https://media.urbit.org/fora/updates/~2018.7.30-Update-1.jpg)
15![](https://media.urbit.org/fora/updates/~2018.7.30-Update-1.jpg)
15
16
16The Keys team worked more this past week on specifying and implementing the plan
17The Keys team worked more this past week on specifying and implementing the plan
17−to get the Urbit constitution on the Ethereum blockchain. *Anthony*
18+to get the Urbit constitution on the Ethereum blockchain. _Anthony_
18−`~poldec-tonteg` and *Morgan* `~hidrel-fabtel` have nearly completed updating
19+`~poldec-tonteg` and _Morgan_ `~hidrel-fabtel` have nearly completed updating
19−the specification for Wallet. *Will* `~hadrud-lodsef` and *Keaton*
20+the specification for Wallet. _Will_ `~hadrud-lodsef` and _Keaton_
20`~tonlur-sarret` have a better idea of how to create a smooth experience for
21`~tonlur-sarret` have a better idea of how to create a smooth experience for
21current address-space holders to generate their Ethereum keys and get them to us
22current address-space holders to generate their Ethereum keys and get them to us
22−to put in the contract. *Mark* `~palfun-foslup` and *Travis* `~rigdyn-sondur`
23+to put in the contract. _Mark_ `~palfun-foslup` and _Travis_ `~rigdyn-sondur`
23spent the week implementing more crypto jets (code:
24spent the week implementing more crypto jets (code:
24[`urbit/argon2`](https://github.com/urbit/argon2)), and Mark is also working
25[`urbit/argon2`](https://github.com/urbit/argon2)), and Mark is also working
25−on an `argon2` WebAssembly library (code:
26+on an `argon2` WebAssembly library (code:
26[`urbit/argon2-wasm`](https://github.com/urbit/argon2-wasm)),
27[`urbit/argon2-wasm`](https://github.com/urbit/argon2-wasm)),
27−which will help us generate private keys during onboarding. *Robert*
28+which will help us generate private keys during onboarding. _Robert_
28`~lodleb-ritrul` is now working with us to write user documentation for all of
29`~lodleb-ritrul` is now working with us to write user documentation for all of
29the processes that will be part of our key generation and management
30the processes that will be part of our key generation and management
30applications. We can't wait for Urbit ownership to be cryptographically real.
31applications. We can't wait for Urbit ownership to be cryptographically real.
@@ -32,33 +33,32 @@ applications. We can't wait for Urbit ownership to be cryptographically real.
32![](https://media.urbit.org/fora/updates/~2018.7.30-Update-2.png)
33![](https://media.urbit.org/fora/updates/~2018.7.30-Update-2.png)
33
34
34The Infrastructure team spent the week making the Urbit computer more beautiful.
35The Infrastructure team spent the week making the Urbit computer more beautiful.
35−*Curtis* `~sorreg-namtyv` worked more on Hoon improvements and started work on
36+_Curtis_ `~sorreg-namtyv` worked more on Hoon improvements and started work on
36−the Tlon-official Hoon style guide. *Ted* `~rovnys-ricfer` and *Elliot*
37+the Tlon-official Hoon style guide. _Ted_ `~rovnys-ricfer` and _Elliot_
37`~littel-ponnys` completed several Ford Turbo design changes and got all their
38`~littel-ponnys` completed several Ford Turbo design changes and got all their
38tests passing again, now working on completing caching implementation and Eyre
39tests passing again, now working on completing caching implementation and Eyre
39integration
40integration
40(code [here](https://github.com/urbit/arvo/branches/all?utf8=%E2%9C%93&query=ford-turbo),
41(code [here](https://github.com/urbit/arvo/branches/all?utf8=%E2%9C%93&query=ford-turbo),
41technical updates [here](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/)).
42technical updates [here](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/)).
42−*Joe* `~master-morzod` got full HTTPS support working on the testnet! Ted also
43+_Joe_ `~master-morzod` got full HTTPS support working on the testnet! Ted also
43wrote up a new UP on his thoughts on Urbit parallelism. Check that out [here](https://fora.urbit.org/proposals/posts/~2018.7.28..19.57.33..7ed3~/).
44wrote up a new UP on his thoughts on Urbit parallelism. Check that out [here](https://fora.urbit.org/proposals/posts/~2018.7.28..19.57.33..7ed3~/).
44
45
45The Interface team worked more on Landscape, our application to allow better
46The Interface team worked more on Landscape, our application to allow better
46−communication and collaboration. *Galen* `~ravmel-ropdyl`, *Gavin*
47+communication and collaboration. _Galen_ `~ravmel-ropdyl`, _Gavin_
47−`~ridlur-figbud`, and *Jimmy* `~haptyl-wanwes` continued their iterative design
48+`~ridlur-figbud`, and _Jimmy_ `~haptyl-wanwes` continued their iterative design
48−revision feedback process, and Landscape is looking good. *Chris* `~sigtus-hossyn`
49+revision feedback process, and Landscape is looking good. _Chris_ `~sigtus-hossyn`
49−and *Logan* `~tacryt-socryp` continued implementing the latest desktop/mobile
50+and _Logan_ `~tacryt-socryp` continued implementing the latest desktop/mobile
50features to get the product ready to ship, as well as extending support for the
51features to get the product ready to ship, as well as extending support for the
51−latest backend Landscape API's that *Isaac* `~davtyr-nimren` has been improving.
52+latest backend Landscape API's that _Isaac_ `~davtyr-nimren` has been improving.
52Urbit is becoming more usable by the day.
53Urbit is becoming more usable by the day.
53
54
54Last but not least, the Documentation team continued doing `~zod`'s work helping
55Last but not least, the Documentation team continued doing `~zod`'s work helping
55−teach Urbit to the world. *Josh* `~taglux-nidsep` extended his new Hoon docs to cover Hoon cores, an introduction to the Hoon standard library, and a couple of Hoon examples with very detailed walkthrough commentary (drafts [here](https://github.com/joshuareagan/doc-drafts)). And *Robert* `~lodleb-ritrul` extended the current Hoon-standard-library documentation on random atom generation and atom scrambling, as well as the Hoon cores for computing modular and signed-integer arithmetic (`urbit/docs` pull requests [here](https://github.com/urbit/docs/pulls)). Very soon you'll actually be able to understand how Urbit works.
56+teach Urbit to the world. _Josh_ `~taglux-nidsep` extended his new Hoon docs to cover Hoon cores, an introduction to the Hoon standard library, and a couple of Hoon examples with very detailed walkthrough commentary (drafts [here](https://github.com/joshuareagan/doc-drafts)). And _Robert_ `~lodleb-ritrul` extended the current Hoon-standard-library documentation on random atom generation and atom scrambling, as well as the Hoon cores for computing modular and signed-integer arithmetic (`urbit/docs` pull requests [here](https://github.com/urbit/docs/pulls)). Very soon you'll actually be able to understand how Urbit works.
56
57
57Also: we'll be hosting another party this month on Friday, August 17th. Save the date! Link: [meetup.com: Urbit IRL ~2018.8](https://www.meetup.com/urbit-sf/events/253292678/)
58Also: we'll be hosting another party this month on Friday, August 17th. Save the date! Link: [meetup.com: Urbit IRL ~2018.8](https://www.meetup.com/urbit-sf/events/253292678/)
58
59
59Okay! Have a great week.
60Okay! Have a great week.
60
61
61−
62---
62---
63
63
64Photo credit: [Studio Olafur Eliasson](http://olafureliasson.net/)
64Photo credit: [Studio Olafur Eliasson](http://olafureliasson.net/)
content/updates/2018-8-23-update.md+16−15
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.8.23 Update"
2title = "~2018.8.23 Update"
3−date = 2018-08-23
3+date = "2018-08-22"
4description = "A short update from the Tlon team for the week of ~2018.8.23."
4description = "A short update from the Tlon team for the week of ~2018.8.23."
5−aliases = ["/posts/2018-8-23-update/"]
5+aliases = [ "/posts/2018-8-23-update/" ]
6+
6[extra]
7[extra]
7author = "Anthony"
8author = "Anthony"
8ship = "~poldec-tonteg"
9ship = "~poldec-tonteg"
@@ -22,21 +23,21 @@ Ethereum roll out. We're excited to share them with y'all.
22
23
23We've finalized our suggested wallet derivation scheme. This was a monumental
24We've finalized our suggested wallet derivation scheme. This was a monumental
24effort that included the expertise of a lot of different parts of Tlon,
25effort that included the expertise of a lot of different parts of Tlon,
25−thanks to *Morgan* `~hidrel-fabtel`, *Curtis* `~sorreg-namtyv`, *Will*
26+thanks to _Morgan_ `~hidrel-fabtel`, _Curtis_ `~sorreg-namtyv`, _Will_
26−`~hadrud-lodsef` and *Mark* `~palfun-foslup`! Look forward to a full public
27+`~hadrud-lodsef` and _Mark_ `~palfun-foslup`! Look forward to a full public
27announcement of this derivation scheme once the audit has taken place.
28announcement of this derivation scheme once the audit has taken place.
28
29
29Now that that's all wrapped up, we are finalizing work on client-side tools
30Now that that's all wrapped up, we are finalizing work on client-side tools
30−for generating and decrypting these wallets in a usable way. *Gavin*
31+for generating and decrypting these wallets in a usable way. _Gavin_
31−`~ridlur-figbud` and *Will* `~hadrud-lodsef` have been leading this effort, with
32+`~ridlur-figbud` and _Will_ `~hadrud-lodsef` have been leading this effort, with
32−a non-trivial wasm assist from *Chris* `~sigtus-hossyn` and *Mark*
33+a non-trivial wasm assist from _Chris_ `~sigtus-hossyn` and _Mark_
33`~palfun-foslup` (codenamed the Dutch Destroyer). We now have parity between the
34`~palfun-foslup` (codenamed the Dutch Destroyer). We now have parity between the
34front end crypto tools and their Hoon-side cousins.
35front end crypto tools and their Hoon-side cousins.
35
36
36A key part of this is also the Wallet application, which will allow you to
37A key part of this is also the Wallet application, which will allow you to
37−manage your assets easily. *Morgan* `~hidrel-fabtel` has changed the Wallet
38+manage your assets easily. _Morgan_ `~hidrel-fabtel` has changed the Wallet
38application architecture a bit to accommodate our wallet deriviation scheme and
39application architecture a bit to accommodate our wallet deriviation scheme and
39−we're working on getting those changes implemented. *Robert* `~lodleb-ritrul`
40+we're working on getting those changes implemented. _Robert_ `~lodleb-ritrul`
40is on loan from the Docs team to help us make sure that all of our documentation
41is on loan from the Docs team to help us make sure that all of our documentation
41and copy around these tools is crystal clear.
42and copy around these tools is crystal clear.
42
43
@@ -52,10 +53,10 @@ Webtalk is not long for this world, into the breach will step: Landscape.
52After a lot of prototyping and design iteration, we've settled on a feature
53After a lot of prototyping and design iteration, we've settled on a feature
53set that will help the Urbit community (that's you!) communicate and
54set that will help the Urbit community (that's you!) communicate and
54collaborate to reach our next incarnation. Landscape will be on your computer
55collaborate to reach our next incarnation. Landscape will be on your computer
55−and in your pocket. *Chris* `~sigtus-hossyn` and *Jimmy* `~haptyl-wanwes` have
56+and in your pocket. _Chris_ `~sigtus-hossyn` and _Jimmy_ `~haptyl-wanwes` have
56been hard at work hitting the details of the design implementation, including
57been hard at work hitting the details of the design implementation, including
57nuances like disconnected and reconnected states and other interaction concepts
58nuances like disconnected and reconnected states and other interaction concepts
58−that we think you'll like. *Logan* `~tacryt-socryp` has been doing double duty
59+that we think you'll like. _Logan_ `~tacryt-socryp` has been doing double duty
59on Mobile and improving `%hall` support for DMs. Needless to say, Sigils are
60on Mobile and improving `%hall` support for DMs. Needless to say, Sigils are
60present throughout.
61present throughout.
61
62
@@ -66,18 +67,18 @@ of a merge between our various long running lines of work.
66[Ford Turbo](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/),
67[Ford Turbo](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/),
67whose development you've all been following closely, is now in the process of
68whose development you've all been following closely, is now in the process of
68being integrated with the rest of the our code, complete with not one but two
69being integrated with the rest of the our code, complete with not one but two
69−caches (thanks *Ted* `~rovnys-ricfer`). *Elliot* `~littel-ponnys` is taking on
70+caches (thanks _Ted_ `~rovnys-ricfer`). _Elliot_ `~littel-ponnys` is taking on
70the task of integrating Ford Turbo with various affordance we've added in
71the task of integrating Ford Turbo with various affordance we've added in
71−support of Landscape. *Joe* `~master-morzod`, meanwhile, is integrating updates
72+support of Landscape. _Joe_ `~master-morzod`, meanwhile, is integrating updates
72to ames and the boot process occasioned by the Ethereum bootstrap. And finally,
73to ames and the boot process occasioned by the Ethereum bootstrap. And finally,
73−*Curtis'* `~sorreg-namtyv` long-anticipated improvements to Hoon are being
74+_Curtis'_ `~sorreg-namtyv` long-anticipated improvements to Hoon are being
74incorporated into all of the above.
75incorporated into all of the above.
75
76
76The last of these changes will be of particular interest to new learners of
77The last of these changes will be of particular interest to new learners of
77hoon, since one of their benefits is the ability to pretty print type
78hoon, since one of their benefits is the ability to pretty print type
78information; a useful tool when working in the %dojo.
79information; a useful tool when working in the %dojo.
79
80
80−*Josh* `~taglux-nidsep` is closing out a revision of the docs to be released
81+_Josh_ `~taglux-nidsep` is closing out a revision of the docs to be released
81very soon. We hope that the new docs and friendlier Goon will make the task of
82very soon. We hope that the new docs and friendlier Goon will make the task of
82learning Hoon less of a task and more of an adventure.
83learning Hoon less of a task and more of an adventure.
83
84
content/updates/2018-8-30-update.md+11−10
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.8.30 Update"
2title = "~2018.8.30 Update"
3−date = 2018-08-30
3+date = "2018-08-29"
4description = "A short update from the Tlon team for the week of ~2018.8.30."
4description = "A short update from the Tlon team for the week of ~2018.8.30."
5−aliases = ["/posts/2018-8-30-update/"]
5+aliases = [ "/posts/2018-8-30-update/" ]
6+
6[extra]
7[extra]
7author = "Anthony"
8author = "Anthony"
8ship = "~poldec-tonteg"
9ship = "~poldec-tonteg"
@@ -14,7 +15,7 @@ image = "https://media.urbit.org/fora/updates/2018.8.29-update-1.jpg"
14Here is a smattering of the exciting things going on at Tlon this week.
15Here is a smattering of the exciting things going on at Tlon this week.
15
16
16Now that we know what the infrastructure for transferring our current
17Now that we know what the infrastructure for transferring our current
17−property registry will look like, *Will* `~hadrud-lodsef`, *Morgan*
18+property registry will look like, _Will_ `~hadrud-lodsef`, _Morgan_
18`~hidrel-fabtel` are getting the logistics in order. Primary to this is securely
19`~hidrel-fabtel` are getting the logistics in order. Primary to this is securely
19generating new keys and securely transferring existing assets. Since Tlon owns a
20generating new keys and securely transferring existing assets. Since Tlon owns a
20_bit_ of address space, we're particularly interested in making sure this
21_bit_ of address space, we're particularly interested in making sure this
@@ -22,33 +23,33 @@ transfer goes down smoothly!
22
23
23The Landscape team has been busy integrating changes to Collections (our new
24The Landscape team has been busy integrating changes to Collections (our new
24concept for writing, reading and subscribing to static files... like this one!).
25concept for writing, reading and subscribing to static files... like this one!).
25−Our very own Canadian visionary *Isaac* `~davtyr-nimren` did a redesign recently
26+Our very own Canadian visionary _Isaac_ `~davtyr-nimren` did a redesign recently
26that makes this system more general and takes advantage of the permissions in
27that makes this system more general and takes advantage of the permissions in
27our file system, `%clay`.
28our file system, `%clay`.
28
29
29Of course, what kind of a square only chats from their desk? Don't most of us
30Of course, what kind of a square only chats from their desk? Don't most of us
30want to chat from our soylent-powered electric scooters as well? Luckily,
31want to chat from our soylent-powered electric scooters as well? Luckily,
31−wunderkinder *Logan* `~tacryt-socryp` and *Jimmy* `~haptyl-wanwes` have been
32+wunderkinder _Logan_ `~tacryt-socryp` and _Jimmy_ `~haptyl-wanwes` have been
32grinding on Landscape mobile, including new features such as slick navigation
33grinding on Landscape mobile, including new features such as slick navigation
33an improved DM flow and, maybe most importantly, a QR-based device pairing flow.
34an improved DM flow and, maybe most importantly, a QR-based device pairing flow.
34
35
35![](https://media.urbit.org/fora/updates/2018.8.29-update-2.jpg)
36![](https://media.urbit.org/fora/updates/2018.8.29-update-2.jpg)
36
37
37−*Mark*, resident solidity jurist, is busy updating `%jael` (our vane for
38+_Mark_, resident solidity jurist, is busy updating `%jael` (our vane for
38handling secrets) to accomodate our newest Constitution.
39handling secrets) to accomodate our newest Constitution.
39
40
40−*Joe* `~master-morzod` is making good use of his time in the office to make
41+_Joe_ `~master-morzod` is making good use of his time in the office to make
41everyone else feel unproductive. Not only is he the maestro behind the
42everyone else feel unproductive. Not only is he the maestro behind the
42mergepocalypse that I mentioned last week, he is also finishing up work on
43mergepocalypse that I mentioned last week, he is also finishing up work on
43booting a ship using a keypair generated by, you guessed it, the front end key
44booting a ship using a keypair generated by, you guessed it, the front end key
44tools mentioned above.
45tools mentioned above.
45
46
46Ford Turbo is getting a good work out from its integration with the updates we
47Ford Turbo is getting a good work out from its integration with the updates we
47−made to `%arvo` to accomodate Landscape. Dynamic duo *Ted* `~rovnys-ricfer` and
48+made to `%arvo` to accomodate Landscape. Dynamic duo _Ted_ `~rovnys-ricfer` and
48−*Elliot* `~littel-ponnys` are fixing these bugs and updating the test suite to
49+_Elliot_ `~littel-ponnys` are fixing these bugs and updating the test suite to
49account for these cases.
50account for these cases.
50
51
51−Last but not least *David* `~patpex_ponleg` joins the Docs crew. *David* has
52+Last but not least _David_ `~patpex_ponleg` joins the Docs crew. _David_ has
52experience teaching programming, and has even used Hoon in his classes. We're
53experience teaching programming, and has even used Hoon in his classes. We're
53happy to have him help us teach the world to hoon. Come and say hi to him on
54happy to have him help us teach the world to hoon. Come and say hi to him on
54`%talk`, or even better, ask him to help you with your hoon homework ;)
55`%talk`, or even better, ask him to help you with your hoon homework ;)
content/updates/2018-8-8-update.md+18−17
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.8.8 Update"
2title = "~2018.8.8 Update"
3−date = 2018-08-08
3+date = "2018-08-07"
4description = "A short update from the Tlon team for the week of ~2018.8.8."
4description = "A short update from the Tlon team for the week of ~2018.8.8."
5−aliases = ["/posts/2018-8-8-update/"]
5+aliases = [ "/posts/2018-8-8-update/" ]
6+
6[extra]
7[extra]
7author = "~tonlur-sarret"
8author = "~tonlur-sarret"
8ship = "~poldec-tonteg"
9ship = "~poldec-tonteg"
@@ -13,39 +14,39 @@ Here's a short update from the team at Tlon for the week of `~2018.8.8`:
13
14
14![](https://media.urbit.org/fora/updates/~2018.8.8-Update-1.jpeg)
15![](https://media.urbit.org/fora/updates/~2018.8.8-Update-1.jpeg)
15
16
16−The Interface team spent another week completing the new Urbit frontend. *Gavin*
17+The Interface team spent another week completing the new Urbit frontend. _Gavin_
17`~ridlur-figbud` finished up his project for putting an image to your `@p`
18`~ridlur-figbud` finished up his project for putting an image to your `@p`
18−("pat-P") (image is teaser). *Galen* `~ravmel-ropdyl` and *Jimmy* `~haptyl-wanwes`
19+("pat-P") (image is teaser). _Galen_ `~ravmel-ropdyl` and _Jimmy_ `~haptyl-wanwes`
19−did another round of design reviews for a couple of our interfaces. *Chris*
20+did another round of design reviews for a couple of our interfaces. _Chris_
20`~sigtus-hossyn` implemented Landscape functionality to reconnect to your Urbit
21`~sigtus-hossyn` implemented Landscape functionality to reconnect to your Urbit
21after a long period of disconnection (we _never_ leave `:talk`, so we of course
22after a long period of disconnection (we _never_ leave `:talk`, so we of course
22−wouldn't know about that). *Logan* `~tacryt-socryp` fixed some more iOS bugs and
23+wouldn't know about that). _Logan_ `~tacryt-socryp` fixed some more iOS bugs and
23implemented mobile in-app caching of Collections, making the app more
24implemented mobile in-app caching of Collections, making the app more
24−feature-complete. *Isaac V* `~davtyr-nimren` continued the Collections redesign
25+feature-complete. _Isaac V_ `~davtyr-nimren` continued the Collections redesign
25−(code [here](https://github.com/urbit/arvo/tree/collections-redesign)).
26+(code [here](https://github.com/urbit/arvo/tree/collections-redesign)).
26
27
27−The Infrastructure team put another week in forming a more perfect kernel. *Ted*
28+The Infrastructure team put another week in forming a more perfect kernel. _Ted_
28`~rovnys-ricfer` continued bug hunting in his Ford Turbo cache implementation.
29`~rovnys-ricfer` continued bug hunting in his Ford Turbo cache implementation.
29−*Elliot* `~littel-ponnys` has Ford Turbo integrated with all of Arvo now, but
30+_Elliot_ `~littel-ponnys` has Ford Turbo integrated with all of Arvo now, but
30some last steps are still needed to be able to fully remove old Ford from the
31some last steps are still needed to be able to fully remove old Ford from the
31system. You can find Ted and Elliot's code
32system. You can find Ted and Elliot's code
32[here](https://github.com/urbit/arvo/branches/all?utf8=%E2%9C%93&query=ford-turbo),
33[here](https://github.com/urbit/arvo/branches/all?utf8=%E2%9C%93&query=ford-turbo),
33and their technical updates are posted to Fora
34and their technical updates are posted to Fora
34[here](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/).
35[here](https://fora.urbit.org/proposals/posts/~2018.3.15..04.24.35..a47f~/).
35As Ford Turbo has approached completion, we've realized major performance
36As Ford Turbo has approached completion, we've realized major performance
36−bottlenecks in our Hoon compiler. So we've called upon *Paul* `~fodwyt-ragful`
37+bottlenecks in our Hoon compiler. So we've called upon _Paul_ `~fodwyt-ragful`
37to help make Hoon really fast. Ted's parallelism UP has also some gotten
38to help make Hoon really fast. Ted's parallelism UP has also some gotten
38comments since it was posted last week -- check out the proposal
39comments since it was posted last week -- check out the proposal
39[here](https://fora.urbit.org/proposals/posts/~2018.7.28..19.57.33..7ed3~/).
40[here](https://fora.urbit.org/proposals/posts/~2018.7.28..19.57.33..7ed3~/).
40
41
41−The Keys team got us another week closer to getting on chain. *Joe*
42+The Keys team got us another week closer to getting on chain. _Joe_
42`~master-morzod` now has ships booting from the keys in our testnet contract.
43`~master-morzod` now has ships booting from the keys in our testnet contract.
43−*Travis* `~rigdyn-sondur` finished implementing our much-needed `secp256k1`
44+_Travis_ `~rigdyn-sondur` finished implementing our much-needed `secp256k1`
44−crypto jet (code [here](https://github.com/urbit/secp256k1)). *Mark*
45+crypto jet (code [here](https://github.com/urbit/secp256k1)). _Mark_
45`~palfun-foslup` nearly completed his `argon2-wasm` library for key
46`~palfun-foslup` nearly completed his `argon2-wasm` library for key
46−generation/derivation. Our man *Chris* `~sigtus-hossyn` is helping him integrate
47+generation/derivation. Our man _Chris_ `~sigtus-hossyn` is helping him integrate
47−it with our other front end libraries (code [here](https://github.com/urbit/argon2-wasm)). *Anthony* `~poldec-tonteg` and *Morgan* `~hidrel-fabtel` are busy folding all of this new functionality into
48+it with our other front end libraries (code [here](https://github.com/urbit/argon2-wasm)). _Anthony_ `~poldec-tonteg` and _Morgan_ `~hidrel-fabtel` are busy folding all of this new functionality into
48−Urbit Wallet to help you manage your ships. *Robert* `~lodleb-ritrul` is working
49+Urbit Wallet to help you manage your ships. _Robert_ `~lodleb-ritrul` is working
49on the copy for all of these apps, so that their functionality is crystal clear
50on the copy for all of these apps, so that their functionality is crystal clear
50to users.
51to users.
51
52
content/updates/2018-9-11-update.md+17−16
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2018.9.11 Update"
2title = "~2018.9.11 Update"
3−date = 2018-09-11
3+date = "2018-09-10"
4description = "A short update from the Tlon team for the week of ~2018.9.11."
4description = "A short update from the Tlon team for the week of ~2018.9.11."
5−aliases = ["/posts/2018-9-11-update/"]
5+aliases = [ "/posts/2018-9-11-update/" ]
6+
6[extra]
7[extra]
7author = "Anthony"
8author = "Anthony"
8ship = "~poldec-tonteg"
9ship = "~poldec-tonteg"
@@ -22,12 +23,12 @@ This branch brings together, for the first time, a few long-running
22lines of development. `%ford-turbo`, our new and improved [reactive build
23lines of development. `%ford-turbo`, our new and improved [reactive build
23system](https://github.com/urbit/arvo/blob/release-candidate/sys/vane/ford.hoon),
24system](https://github.com/urbit/arvo/blob/release-candidate/sys/vane/ford.hoon),
24totally replaces `%old-ford` on this branch (take a look at those comments!).
25totally replaces `%old-ford` on this branch (take a look at those comments!).
25−Proud papa *Joe* `~master-morzod`
26+Proud papa _Joe_ `~master-morzod`
26[hard work](https://github.com/urbit/arvo/blob/release-candidate/app/acme.hoon)
27[hard work](https://github.com/urbit/arvo/blob/release-candidate/app/acme.hoon)
27on HTTPS proxying is baked right in (meaning that ship.urbit.org is graduating
28on HTTPS proxying is baked right in (meaning that ship.urbit.org is graduating
28from novelty to utility). `%jael` now actually [holds your
29from novelty to utility). `%jael` now actually [holds your
29secrets](https://github.com/urbit/arvo/blob/release-candidate/sys/vane/jael.hoon)
30secrets](https://github.com/urbit/arvo/blob/release-candidate/sys/vane/jael.hoon)
30−and is being used to boot ships. *Curtis'* `~sorreg-namtyv` swansong as the
31+and is being used to boot ships. _Curtis'_ `~sorreg-namtyv` swansong as the
31auteur behind `hoon` is now included (a crispy new styleguide is also in the
32auteur behind `hoon` is now included (a crispy new styleguide is also in the
32works). Various niceties related to our new web ui are in here (_au revoir_ old
33works). Various niceties related to our new web ui are in here (_au revoir_ old
33Fora and Webtalk), as well as an actually existing
34Fora and Webtalk), as well as an actually existing
@@ -38,23 +39,23 @@ you, dear Martian.
38
39
39Much of the Infrastructure team is living the life of the fireman: making chili
40Much of the Infrastructure team is living the life of the fireman: making chili
40with your friends interspersed with someone yelling at you to put out a fire.
41with your friends interspersed with someone yelling at you to put out a fire.
41−Except, instead of making chili, *Ted* `~rovnys-ricfer` is redesigning the Ford
42+Except, instead of making chili, _Ted_ `~rovnys-ricfer` is redesigning the Ford
42−Rune language (why should `~sorreg-namtyv` get all the fun?) and *Elliot*
43+Rune language (why should `~sorreg-namtyv` get all the fun?) and _Elliot_
43−`~littel-ponnys` is bringing `%eyre` into the new Millenium. *Mark*
44+`~littel-ponnys` is bringing `%eyre` into the new Millenium. _Mark_
44−`~palfun-foslup` and *Joe* `~master-morzod`, though, continue in their quest to
45+`~palfun-foslup` and _Joe_ `~master-morzod`, though, continue in their quest to
45−make Ethereum safe for Martians and *Ben* continues his grueling (for some value
46+make Ethereum safe for Martians and _Ben_ continues his grueling (for some value
46−of gruel) pair programming regime with *Curtis* `~sorreg-namtyv`.
47+of gruel) pair programming regime with _Curtis_ `~sorreg-namtyv`.
47−
48+
48−*Chris* `~sigtus-hossyn`, *Isaac* `~davtyr-nimren`, *Jimmy* `~fallyn-balfus` and
49+_Chris_ `~sigtus-hossyn`, _Isaac_ `~davtyr-nimren`, _Jimmy_ `~fallyn-balfus` and
49−*Logan* `~tacryt-socryp` continue refining our new web UI, Landscape. Fonts have
50+_Logan_ `~tacryt-socryp` continue refining our new web UI, Landscape. Fonts have
50been argued over, tables overturned over line heights. But it will all be worth
51been argued over, tables overturned over line heights. But it will all be worth
51it in the end.
52it in the end.
52
53
53−The Keys crew (*Will* `~hadrud-lodsef`, *Morgan* `~hidrel-fabtel` and *Gavin*
54+The Keys crew (_Will_ `~hadrud-lodsef`, _Morgan_ `~hidrel-fabtel` and _Gavin_
54`~ridlur-figbud`) are forming like Voltron to get our address space ported
55`~ridlur-figbud`) are forming like Voltron to get our address space ported
55over and make sure that we can generate our HD wallets in a secure, usable
56over and make sure that we can generate our HD wallets in a secure, usable
56−way. They are joined by the newest edition to Tlon: *Jared* `~nidsut-tomdun`.
57+way. They are joined by the newest edition to Tlon: _Jared_ `~nidsut-tomdun`.
57−*Jared* is down south New Zealand way, bringing Tlon ever closer to our goal of
58+_Jared_ is down south New Zealand way, bringing Tlon ever closer to our goal of
58`%amesing` over the entire globe. Say `|hi`!
59`%amesing` over the entire globe. Say `|hi`!
59
60
60Next year on Mars!
61Next year on Mars!
content/updates/2019-11-06-update.md+6−2
@@ -1,8 +1,12 @@
1+++
1+++
2title = "~2019.11.06 Update"
2title = "~2019.11.06 Update"
3−date = 2019-11-06
3+date = "2019-11-05"
4description = "Weekly Web Update"
4description = "Weekly Web Update"
5+aliases = [
5−aliases = ["/posts/updates/2019-11-06-update", "/posts/2019-11-06-update/"]
6+ "/posts/updates/2019-11-06-update",
7+ "/posts/2019-11-06-update/"
8+]
9+
6[extra]
10[extra]
7author = ""
11author = ""
8ship = ""
12ship = ""
content/updates/2019-12-06-update.md+2−1
@@ -1,7 +1,8 @@
1+++
1+++
2title = "~2019.12.6 Weekly Web Update"
2title = "~2019.12.6 Weekly Web Update"
3−date = 2019-12-06
3+date = "2019-12-05"
4description = "Weekly Web Update"
4description = "Weekly Web Update"
5+
5[extra]
6[extra]
6author = ""
7author = ""
7ship = ""
8ship = ""
content/updates/2019-2-11-update.md+8−6
@@ -1,20 +1,22 @@
1+++
1+++
2title = "~2019.2.11 Update"
2title = "~2019.2.11 Update"
3−date = 2019-02-11
3+date = "2019-02-10"
4description = "A short update from the Tlon team for the week of ~2019.2.11."
4description = "A short update from the Tlon team for the week of ~2019.2.11."
5−aliases = ["/posts/2019-2-11-update/"]
5+aliases = [ "/posts/2019-2-11-update/" ]
6+
6[extra]
7[extra]
7author = "Morgan"
8author = "Morgan"
8ship = "~hidrel-fabtel"
9ship = "~hidrel-fabtel"
9image = "https://media.urbit.org/site/posts/updates/~2019.2.11-update-1.jpg"
10image = "https://media.urbit.org/site/posts/updates/~2019.2.11-update-1.jpg"
10+++
11+++
12+
11Here’s a short update from the team for the week of `~2019.2.11`:
13Here’s a short update from the team for the week of `~2019.2.11`:
12
14
13![](https://media.urbit.org/site/posts/updates/~2019.2.11-update-1.jpg)
15![](https://media.urbit.org/site/posts/updates/~2019.2.11-update-1.jpg)
14
16
15## Network
17## Network
16
18
17−The network has been frothy since [the transition](https://urbit.org/posts/essays/azimuth-is-on-chain/), with *Isaac* `~novlud-padtyv`, *Joe* `~master-morzod`, *Philip* `~wicdev-wisryt`, *Ben* `~pitmug-roptic`, and *Ted* `~rovnys-ricfer` working non-stop to fix first memory and then `%ames` connectivity issues. Their efforts have paid off and we now appear to be sailing calm seas.
19+The network has been frothy since [the transition](https://urbit.org/posts/essays/azimuth-is-on-chain/), with _Isaac_ `~novlud-padtyv`, _Joe_ `~master-morzod`, _Philip_ `~wicdev-wisryt`, _Ben_ `~pitmug-roptic`, and _Ted_ `~rovnys-ricfer` working non-stop to fix first memory and then `%ames` connectivity issues. Their efforts have paid off and we now appear to be sailing calm seas.
18
20
19If you haven’t booted into the new era, follow [Getting Started](https://urbit.org/docs/getting-started/) and feel free to `;join ~dopzod/urbit-help` if you need help or want to learn more about the system. See [Messaging](https://urbit.org/docs/learn/arvo/arvo-internals/messaging/) if you don’t know what that means.
21If you haven’t booted into the new era, follow [Getting Started](https://urbit.org/docs/getting-started/) and feel free to `;join ~dopzod/urbit-help` if you need help or want to learn more about the system. See [Messaging](https://urbit.org/docs/learn/arvo/arvo-internals/messaging/) if you don’t know what that means.
20
22
@@ -24,9 +26,9 @@ To stay up to date on network status, follow [@zodisok](https://twitter.com/zodi
24
26
25## Team
27## Team
26
28
27−*Ted* `~rovnys-ricfer` and *Joe* `~master-morzod` got an `%ames` rewrite to compile and are working on documentation and unit tests. *Elliot* `~littel-ponys` is rewriting `%eyre`, our webserver, which is some of the gnarliest code in Arvo. Outbound web requests are now working, which has allowed us to delete old `%eyre` from the [lighter-than-eyre branch](https://github.com/urbit/arvo/tree/lighter-than-eyre), and work continues porting individual `%gall` applications over to `%light`. We’re looking forward to moving Landscape onto new `%eyre` soon. *Logan* `~tacryt-socryp` is rewriting the HTTP client in Vere (Arvo’s interpreter) to better support HTTP/2. This will allow us to provide push notifications in the heretofore rumored Landscape iOS app. Finally, *Gavin* `ridlur-figbud` and *Jimmy* `fallyn-balfus` are working on a new design system to enable fast UI prototyping. We’re very excited to share more about that in the near future!
29+_Ted_ `~rovnys-ricfer` and _Joe_ `~master-morzod` got an `%ames` rewrite to compile and are working on documentation and unit tests. _Elliot_ `~littel-ponys` is rewriting `%eyre`, our webserver, which is some of the gnarliest code in Arvo. Outbound web requests are now working, which has allowed us to delete old `%eyre` from the [lighter-than-eyre branch](https://github.com/urbit/arvo/tree/lighter-than-eyre), and work continues porting individual `%gall` applications over to `%light`. We’re looking forward to moving Landscape onto new `%eyre` soon. _Logan_ `~tacryt-socryp` is rewriting the HTTP client in Vere (Arvo’s interpreter) to better support HTTP/2. This will allow us to provide push notifications in the heretofore rumored Landscape iOS app. Finally, _Gavin_ `ridlur-figbud` and _Jimmy_ `fallyn-balfus` are working on a new design system to enable fast UI prototyping. We’re very excited to share more about that in the near future!
28
30
29−Shout-out to *Philip* `wicdev-wisryt` for [this heroic weekend PR](https://github.com/urbit/arvo/pull/1072) that fixed persistent connectivity issues on the network after [Thursday’s breach](https://twitter.com/zodisok/status/1096225302210957312).
31+Shout-out to _Philip_ `wicdev-wisryt` for [this heroic weekend PR](https://github.com/urbit/arvo/pull/1072) that fixed persistent connectivity issues on the network after [Thursday’s breach](https://twitter.com/zodisok/status/1096225302210957312).
30
32
31## Media
33## Media
32
34
@@ -34,4 +36,4 @@ Palladium, a magazine on governance futurism, talk about Urbit through the secon
34
36
35## Meetups
37## Meetups
36
38
37−If you're in San Francisco on March 1st, we're hosting [an AMA with Galen Wolfe-Pauly](https://www.meetup.com/urbit-sf/events/259144802/), Tlon's CEO.
39+If you're in San Francisco on March 1st, we're hosting [an AMA with Galen Wolfe-Pauly](https://www.meetup.com/urbit-sf/events/259144802/), Tlon's CEO.
content/updates/2019-2-25-update.md+7−5
@@ -1,13 +1,15 @@
1+++
1+++
2title = "~2019.2.25 Update"
2title = "~2019.2.25 Update"
3−date = 2019-02-25
3+date = "2019-02-24"
4description = "A short update from the Tlon team for the week of ~2019.2.25."
4description = "A short update from the Tlon team for the week of ~2019.2.25."
5−aliases = ["/posts/2019-2-25-update/"]
5+aliases = [ "/posts/2019-2-25-update/" ]
6+
6[extra]
7[extra]
7author = "Morgan"
8author = "Morgan"
8ship = "~hidrel-fabtel"
9ship = "~hidrel-fabtel"
9image = "https://media.urbit.org/site/posts/updates/~2019.2.25-update-1.jpg"
10image = "https://media.urbit.org/site/posts/updates/~2019.2.25-update-1.jpg"
10+++
11+++
12+
11Here’s a short update from the team for the week of `~2019.2.25`:
13Here’s a short update from the team for the week of `~2019.2.25`:
12
14
13![](https://media.urbit.org/site/posts/updates/~2019.2.25-update-1.jpg)
15![](https://media.urbit.org/site/posts/updates/~2019.2.25-update-1.jpg)
@@ -22,12 +24,12 @@ Expect a breach next week. We’ll announce the date and instructions on [@zodis
22
24
23## Team
25## Team
24
26
25−Work continues on *Elliot*'s `~littel-ponys` [lighter-than-eyre](https://github.com/urbit/urbit/tree/lighter-than-eyre) branch. *Ted* `~rovnys-ricfer` made great strides toward the design for new `%ames`. Most notably, *Ben* `~pitmug-roptic` got a [Nix](https://nixos.org/nix/) build working and [merged it](https://github.com/urbit/urbit/pull/1196) into the [cc-release](https://github.com/urbit/urbit/tree/cc-release) branch. Finally, support for push notifications is [coming along](https://github.com/urbit/urbit/pull/1203) thanks to *Logan* `~tacryt-socryp`.
27+Work continues on _Elliot_'s `~littel-ponys` [lighter-than-eyre](https://github.com/urbit/urbit/tree/lighter-than-eyre) branch. _Ted_ `~rovnys-ricfer` made great strides toward the design for new `%ames`. Most notably, _Ben_ `~pitmug-roptic` got a [Nix](https://nixos.org/nix/) build working and [merged it](https://github.com/urbit/urbit/pull/1196) into the [cc-release](https://github.com/urbit/urbit/tree/cc-release) branch. Finally, support for push notifications is [coming along](https://github.com/urbit/urbit/pull/1203) thanks to _Logan_ `~tacryt-socryp`.
26
28
27## Community
29## Community
28
30
29The Hoon School pilot begins Monday. We've received a lot of interest since announcing it last week and we can't wait to get started. [Contact us](mailto:support@urbit.org) if you want to be added to the waitlist for future iterations.
31The Hoon School pilot begins Monday. We've received a lot of interest since announcing it last week and we can't wait to get started. [Contact us](mailto:support@urbit.org) if you want to be added to the waitlist for future iterations.
30
32
31−If you're in Austin on March 8th, *Anthony* `~poldec-tonteg` and *Alex* `~mignyt-mogseb` are hosting [a meetup](https://www.meetup.com/urbit-sf/events/259307805/) at [Garage](https://www.garagetx.com/) from 5–7pm.
33+If you're in Austin on March 8th, _Anthony_ `~poldec-tonteg` and _Alex_ `~mignyt-mogseb` are hosting [a meetup](https://www.meetup.com/urbit-sf/events/259307805/) at [Garage](https://www.garagetx.com/) from 5–7pm.
32
34
33−In San Francisco on March 26th, *Galen* `~ravmel-ropdyl` is speaking on [a panel](https://www.eventbrite.com/e/the-future-of-free-speech-online-registration-57429323653) hosted by [Lincoln Network](https://joinlincoln.org/) at [Galvanize](https://www.galvanize.com/campuses/san-francisco).
35+In San Francisco on March 26th, _Galen_ `~ravmel-ropdyl` is speaking on [a panel](https://www.eventbrite.com/e/the-future-of-free-speech-online-registration-57429323653) hosted by [Lincoln Network](https://joinlincoln.org/) at [Galvanize](https://www.galvanize.com/campuses/san-francisco).
content/updates/2019-2-26-network-update.md+4−2
@@ -1,13 +1,15 @@
1+++
1+++
2title = "~2019.2.26 Network Update"
2title = "~2019.2.26 Network Update"
3−date = 2019-02-26
3+date = "2019-02-25"
4description = "A short update on network status as of ~2019.2.26."
4description = "A short update on network status as of ~2019.2.26."
5−aliases = ["/posts/2019-2-26-network-update/"]
5+aliases = [ "/posts/2019-2-26-network-update/" ]
6+
6[extra]
7[extra]
7author = "Anthony"
8author = "Anthony"
8ship = "~poldec-tonteg"
9ship = "~poldec-tonteg"
9image = "https://media.urbit.org/site/posts/updates/~2019.2.26-update-1.jpg"
10image = "https://media.urbit.org/site/posts/updates/~2019.2.26-update-1.jpg"
10+++
11+++
12+
11![](https://media.urbit.org/site/posts/updates/~2019.2.26-update-1.jpg)
13![](https://media.urbit.org/site/posts/updates/~2019.2.26-update-1.jpg)
12
14
13## Toward a Permanent Network
15## Toward a Permanent Network
content/updates/2019-2-4-update.md+9−7
@@ -1,27 +1,29 @@
1+++
1+++
2title = "~2019.2.5 Update"
2title = "~2019.2.5 Update"
3−date = 2019-02-05
3+date = "2019-02-04"
4description = "A short update from the Tlon team for the week of ~2019.2.5."
4description = "A short update from the Tlon team for the week of ~2019.2.5."
5−aliases = ["/posts/2019-2-5-update/"]
5+aliases = [ "/posts/2019-2-5-update/" ]
6+
6[extra]
7[extra]
7author = "Rob"
8author = "Rob"
8ship = "~lodleb-ritrul"
9ship = "~lodleb-ritrul"
9image = "https://media.urbit.org/fora/updates/2019.2.4-update.jpg"
10image = "https://media.urbit.org/fora/updates/2019.2.4-update.jpg"
10+++
11+++
12+
11Here's a short update from the team at Tlon for the week of `~2019.2.5`:
13Here's a short update from the team at Tlon for the week of `~2019.2.5`:
12
14
13![](https://media.urbit.org/fora/updates/2019.2.4-update.jpg)
15![](https://media.urbit.org/fora/updates/2019.2.4-update.jpg)
14
16
15Welcome to the other side. The Urbit PKI, Azimuth, now fully [migrated to the Ethereum blockchain](https://urbit.org/posts/essays/azimuth-is-on-chain/). This migration means that all address-space-holders have cryptographic ownership of their assets. The guide to getting on the network can be found [here](https://urbit.org/docs/getting-started/).
17Welcome to the other side. The Urbit PKI, Azimuth, now fully [migrated to the Ethereum blockchain](https://urbit.org/posts/essays/azimuth-is-on-chain/). This migration means that all address-space-holders have cryptographic ownership of their assets. The guide to getting on the network can be found [here](https://urbit.org/docs/getting-started/).
16
18
17−Azimuth is one of three layers of the Urbit project, alongside _Arvo_ and _Aegean_. Arvo is the Urbit operating system. Aegean is something more abstract; a pattern for building “cities”: Urbit communities whose members run the same custom suite of software on their Arvo servers. Our [Primer](https://urbit.org/primer/) explains these concepts in depth.
19+Azimuth is one of three layers of the Urbit project, alongside _Arvo_ and _Aegean_. Arvo is the Urbit operating system. Aegean is something more abstract; a pattern for building “cities”: Urbit communities whose members run the same custom suite of software on their Arvo servers. Our [Primer](https://urbit.org/primer/) explains these concepts in depth.
18
20
19−An integration of this size is not without its difficulties, though. ~zod labored mightily for a few days then `bail: meme`d (Arvo for “ran out of memory”). *Joe* `~master-morzod`, *Ted* `~rovnys-ricfer`, and *Isaac* `~novlud-padtyv` discovered the problem: `~zod` had so many neighbors that Vere ran out of memory upon restart. [One fix](https://github.com/urbit/urbit/pull/1167) changed how Vere put header metadata on the event log, allowing it to be traversed both forwards and backwards, and [another fix](https://github.com/urbit/urbit/pull/1180) conserves memory by clearing the cache more often. A [third improvement](https://github.com/urbit/urbit/pull/1171) brings an important memory diagnostic tool, `|mass`, back to Arvo. Our champions breached the network to implement these changes, and problems seemed to be solved. _However_, they ran into new issues with event-playback, and they’ve been debugging that ever since.
21+An integration of this size is not without its difficulties, though. ~zod labored mightily for a few days then `bail: meme`d (Arvo for “ran out of memory”). _Joe_ `~master-morzod`, _Ted_ `~rovnys-ricfer`, and _Isaac_ `~novlud-padtyv` discovered the problem: `~zod` had so many neighbors that Vere ran out of memory upon restart. [One fix](https://github.com/urbit/urbit/pull/1167) changed how Vere put header metadata on the event log, allowing it to be traversed both forwards and backwards, and [another fix](https://github.com/urbit/urbit/pull/1180) conserves memory by clearing the cache more often. A [third improvement](https://github.com/urbit/urbit/pull/1171) brings an important memory diagnostic tool, `|mass`, back to Arvo. Our champions breached the network to implement these changes, and problems seemed to be solved. _However_, they ran into new issues with event-playback, and they’ve been debugging that ever since.
20
22
21(There’s also a new Twitter account, [@zodisok](https://twitter.com/zodisok), that tweets out updates about `~zod`’s network status and any relevant pull-requests. It also provides a bit more insight into the challenges of building your own tools to maintain a network. Follow it to stay in the loop.)
23(There’s also a new Twitter account, [@zodisok](https://twitter.com/zodisok), that tweets out updates about `~zod`’s network status and any relevant pull-requests. It also provides a bit more insight into the challenges of building your own tools to maintain a network. Follow it to stay in the loop.)
22
24
23−*Will* `~hadrud-lodsef`, *Gavin* `~ridlur-figbud`, and *Jared* `~nidsut-tomdun` are making incremental changes to our Azimuth front-end, Bridge: UI fixes, new wallet support, adding conditional star-release capabilities for galaxies, and integrating a wallet-generator feature. The Bridge crew will try to implement these changes on a weekly schedule, and you can keep track of them in the Bridge repo’s new [CHANGELOG](https://github.com/urbit/bridge/blob/master/CHANGELOG) file.
25+_Will_ `~hadrud-lodsef`, _Gavin_ `~ridlur-figbud`, and _Jared_ `~nidsut-tomdun` are making incremental changes to our Azimuth front-end, Bridge: UI fixes, new wallet support, adding conditional star-release capabilities for galaxies, and integrating a wallet-generator feature. The Bridge crew will try to implement these changes on a weekly schedule, and you can keep track of them in the Bridge repo’s new [CHANGELOG](https://github.com/urbit/bridge/blob/master/CHANGELOG) file.
24
26
25−BONUS: *Mark* `~palfun-foslup` aka The Dutch Destroyer decided that full bitcoinification was not happening fast enough for his liking and submitted a PR that added bitcoin rpc support to Arvo. Watch the demo [here](https://twitter.com/mdfang/status/1092171862178701313).
27+BONUS: _Mark_ `~palfun-foslup` aka The Dutch Destroyer decided that full bitcoinification was not happening fast enough for his liking and submitted a PR that added bitcoin rpc support to Arvo. Watch the demo [here](https://twitter.com/mdfang/status/1092171862178701313).
26
28
27−See you next week.
29+See you next week.
content/updates/2019-3-11-update.md+8−6
@@ -1,27 +1,29 @@
1+++
1+++
2title = "~2019.3.11 Update"
2title = "~2019.3.11 Update"
3−date = 2019-03-11
3+date = "2019-03-10"
4description = "A short update from the Tlon team for the week of ~2019.3.11."
4description = "A short update from the Tlon team for the week of ~2019.3.11."
5−aliases = ["/posts/2019-3-11-update/"]
5+aliases = [ "/posts/2019-3-11-update/" ]
6+
6[extra]
7[extra]
7author = "Morgan"
8author = "Morgan"
8ship = "~hidrel-fabtel"
9ship = "~hidrel-fabtel"
9image = "https://media.urbit.org/site/posts/updates/~2019.3.11-update-1.jpg"
10image = "https://media.urbit.org/site/posts/updates/~2019.3.11-update-1.jpg"
10+++
11+++
12+
11Here’s a short update from the team for the week of `~2019.3.11`:
13Here’s a short update from the team for the week of `~2019.3.11`:
12
14
13![](https://media.urbit.org/site/posts/updates/~2019.3.11-update-1.jpg)
15![](https://media.urbit.org/site/posts/updates/~2019.3.11-update-1.jpg)
14
16
15## `@p` Bug
17## `@p` Bug
16
18
17−The `@p` bug [is solved](https://github.com/urbit/arvo/pull/1110), thanks to [@max19](https://github.com/urbit/arvo/issues/1105#issuecomment-472585937) and *Jared* `~nidsut-tomdun`.
19+The `@p` bug [is solved](https://github.com/urbit/arvo/pull/1110), thanks to [@max19](https://github.com/urbit/arvo/issues/1105#issuecomment-472585937) and _Jared_ `~nidsut-tomdun`.
18
20
19## Team
21## Team
20
22
21−*Ted* `~rovnys-ricfer`, *Philip* `~wicdev-wisryt`, and *Joe* `~master-morzod` developed a proposal for formalizing the semantics around state persistence in a way that enables parallelism, event replay, and a new model for error handling. *Joe* `~master-morzod` worked on integrating new `%eyre`. *Elliot* `~littel-ponnys` worked on an elaborate proposal for resolving the `@p` bug involving constraint solvers, which turned out to be unnecessary, but was quite impressive nonetheless!
23+_Ted_ `~rovnys-ricfer`, _Philip_ `~wicdev-wisryt`, and _Joe_ `~master-morzod` developed a proposal for formalizing the semantics around state persistence in a way that enables parallelism, event replay, and a new model for error handling. _Joe_ `~master-morzod` worked on integrating new `%eyre`. _Elliot_ `~littel-ponnys` worked on an elaborate proposal for resolving the `@p` bug involving constraint solvers, which turned out to be unnecessary, but was quite impressive nonetheless!
22
24
23−*David* `~rapfyr-diglyt`, *Robert* `~lodleb-ritrul`, and 23 students completed the first week of Hoon School. `~hadrud-lodsef` implemented automation for handling requests from the community. In the next few weeks we're looking forward to automating Urbit support, the Hoon School queue, and contributor onboarding, toward the end of allowing all of our community support systems to scale.
25+_David_ `~rapfyr-diglyt`, _Robert_ `~lodleb-ritrul`, and 23 students completed the first week of Hoon School. `~hadrud-lodsef` implemented automation for handling requests from the community. In the next few weeks we're looking forward to automating Urbit support, the Hoon School queue, and contributor onboarding, toward the end of allowing all of our community support systems to scale.
24
26
25−*Anthony* `~poldec-tonteg`, *Jared* `~nidsut-tomdun`, and *Morgan* `~hidrel-fabtel` made progress on a plan to upgrade our open-source development processes. We’re moving toward making Tlon’s work more public and making it easier for contributors to get involved. As a first step, we’ve assigned maintainers for each of our repositories, and both repository guidelines and a new proposal system are in the works. *Morgan* `~hidrel-fabtel` also started working on re-implementing the website to make content updates and external contributions easier.
27+_Anthony_ `~poldec-tonteg`, _Jared_ `~nidsut-tomdun`, and _Morgan_ `~hidrel-fabtel` made progress on a plan to upgrade our open-source development processes. We’re moving toward making Tlon’s work more public and making it easier for contributors to get involved. As a first step, we’ve assigned maintainers for each of our repositories, and both repository guidelines and a new proposal system are in the works. _Morgan_ `~hidrel-fabtel` also started working on re-implementing the website to make content updates and external contributions easier.
26
28
27Until next time.
29Until next time.
content/updates/2019-3-27-update.md+6−4
@@ -1,19 +1,21 @@
1+++
1+++
2title = "~2019.3.27 Update"
2title = "~2019.3.27 Update"
3−date = 2019-03-27
3+date = "2019-03-26"
4description = "A short update from the Tlon team for the week of ~2019.3.27."
4description = "A short update from the Tlon team for the week of ~2019.3.27."
5−aliases = ["/posts/2019-3-27-update/"]
5+aliases = [ "/posts/2019-3-27-update/" ]
6+
6[extra]
7[extra]
7author = "Morgan"
8author = "Morgan"
8ship = "~hidrel-fabtel"
9ship = "~hidrel-fabtel"
9image = "https://media.urbit.org/site/posts/updates/~2019.3.27-update-1.jpg"
10image = "https://media.urbit.org/site/posts/updates/~2019.3.27-update-1.jpg"
10+++
11+++
12+
11Here’s a short update from the team as of `~2019.3.27`:
13Here’s a short update from the team as of `~2019.3.27`:
12
14
13![](https://media.urbit.org/site/posts/updates/~2019.3.27-update-1.jpg)
15![](https://media.urbit.org/site/posts/updates/~2019.3.27-update-1.jpg)
14
16
15## Team
17## Team
16
18
17−*Philip* `~wicdev-wisryt` [finished](https://github.com/urbit/arvo/pull/1120) Aquarium, which runs a virtual fleet of ships inside a host ship, and pH, an integration testing framework. `~rigdyn-sondur` [pushed](https://github.com/urbit/urbit/pull/1228) ncurses support. *Joe* `~master-morzod` and *Elliot* `~littel-ponnys` continued work on new `%eyre` (webserver) while Isaac `~novlud-padtyv` [integrated](https://github.com/urbit/arvo/pull/1119) Landscape. Finally, `~pilfer-pandex` and *Benjamin* `~pitmug-roptec` made progress on a reimplementation of the compiler.
19+_Philip_ `~wicdev-wisryt` [finished](https://github.com/urbit/arvo/pull/1120) Aquarium, which runs a virtual fleet of ships inside a host ship, and pH, an integration testing framework. `~rigdyn-sondur` [pushed](https://github.com/urbit/urbit/pull/1228) ncurses support. _Joe_ `~master-morzod` and _Elliot_ `~littel-ponnys` continued work on new `%eyre` (webserver) while Isaac `~novlud-padtyv` [integrated](https://github.com/urbit/arvo/pull/1119) Landscape. Finally, `~pilfer-pandex` and _Benjamin_ `~pitmug-roptec` made progress on a reimplementation of the compiler.
18
20
19−Until next time.
21+Until next time.
content/updates/2019-3-4-update.md+7−5
@@ -1,13 +1,15 @@
1+++
1+++
2title = "~2019.3.04 Update"
2title = "~2019.3.04 Update"
3−date = 2019-03-04
3+date = "2019-03-03"
4description = "A short update from the Tlon team for the week of ~2019.3.4."
4description = "A short update from the Tlon team for the week of ~2019.3.4."
5−aliases = ["/posts/2019-3-4-update/"]
5+aliases = [ "/posts/2019-3-4-update/" ]
6+
6[extra]
7[extra]
7author = "Morgan"
8author = "Morgan"
8ship = "~hidrel-fabtel"
9ship = "~hidrel-fabtel"
9image = "https://media.urbit.org/site/posts/updates/~2019.3.4-update-1.jpg"
10image = "https://media.urbit.org/site/posts/updates/~2019.3.4-update-1.jpg"
10+++
11+++
12+
11Here’s a short update from the team for the week of `~2019.3.4`:
13Here’s a short update from the team for the week of `~2019.3.4`:
12
14
13![](https://media.urbit.org/site/posts/updates/~2019.3.4-update-1.jpg)
15![](https://media.urbit.org/site/posts/updates/~2019.3.4-update-1.jpg)
@@ -33,9 +35,9 @@ Stay tuned for a post with a full report.
33
35
34## Team
36## Team
35
37
36−*Jared* `~nidsut-tomdun` spent the week on the `@p` debacle and more than once generated all four billion planet names to check for collisions. *Ted* `~rovnys-ricfer` spent much of the week thinking about redesigning the PKI only to realize that the existing design is quite good. *Logan* `~tacryt-socryp` and *Isaac* `~novlud-padtyv` started working on the next major revision to Landscape. *Ben* `~pitmug-roptic` quietly [started working on](https://github.com/urbit/urbit/pull/1221) 64-bit Vere. `~pilfer-pandex` [brought the hammer down](https://github.com/urbit/docs/pull/399#issuecomment-472667240) on the pronunciation debate.
38+_Jared_ `~nidsut-tomdun` spent the week on the `@p` debacle and more than once generated all four billion planet names to check for collisions. _Ted_ `~rovnys-ricfer` spent much of the week thinking about redesigning the PKI only to realize that the existing design is quite good. _Logan_ `~tacryt-socryp` and _Isaac_ `~novlud-padtyv` started working on the next major revision to Landscape. _Ben_ `~pitmug-roptic` quietly [started working on](https://github.com/urbit/urbit/pull/1221) 64-bit Vere. `~pilfer-pandex` [brought the hammer down](https://github.com/urbit/docs/pull/399#issuecomment-472667240) on the pronunciation debate.
37
39
38−Tlon is at the beginning a new batch of work for 2019, so new proposals are popping up almost daily. *Morgan* `~hidrel-fabtel` is working on revamping our proposal (“UP”) system so that the outside world can more easily participate in all of the work that’s going on. *Anthony* `~poldec-tonteg` and *Jared* `~nidsut-tomdun` are also working on standards for our repository documentation and open-source development process.
40+Tlon is at the beginning a new batch of work for 2019, so new proposals are popping up almost daily. _Morgan_ `~hidrel-fabtel` is working on revamping our proposal (“UP”) system so that the outside world can more easily participate in all of the work that’s going on. _Anthony_ `~poldec-tonteg` and _Jared_ `~nidsut-tomdun` are also working on standards for our repository documentation and open-source development process.
39
41
40## Community
42## Community
41
43
@@ -43,4 +45,4 @@ Our Austin meetup and San Francisco AMA were a blast. You can watch [the recordi
43
45
44Out there on the Internet, people are starting to build their own platforms around Urbit and Azimuth. There are now multiple planet stores and at least one active online community. It's exciting to watch the community start to grow all by itself.
46Out there on the Internet, people are starting to build their own platforms around Urbit and Azimuth. There are now multiple planet stores and at least one active online community. It's exciting to watch the community start to grow all by itself.
45
47
46−Until next time.
48+Until next time.
content/updates/2019-4-11-update.md+7−5
@@ -1,20 +1,22 @@
1+++
1+++
2title = "~2019.4.11 Update"
2title = "~2019.4.11 Update"
3−date = 2019-04-11
3+date = "2019-04-10"
4description = "A short update from the Tlon team for the week of ~2019.4.11."
4description = "A short update from the Tlon team for the week of ~2019.4.11."
5−aliases = ["/posts/2019-4-11-update/"]
5+aliases = [ "/posts/2019-4-11-update/" ]
6+
6[extra]
7[extra]
7author = "Morgan"
8author = "Morgan"
8ship = "~hidrel-fabtel"
9ship = "~hidrel-fabtel"
9image = "https://media.urbit.org/site/posts/updates/~2019.4.11-update-1.jpg"
10image = "https://media.urbit.org/site/posts/updates/~2019.4.11-update-1.jpg"
10+++
11+++
12+
11Here’s a short update from the team as of `~2019.4.11`:
13Here’s a short update from the team as of `~2019.4.11`:
12
14
13![](https://media.urbit.org/site/posts/updates/~2019.4.11-update-1.jpg)
15![](https://media.urbit.org/site/posts/updates/~2019.4.11-update-1.jpg)
14
16
15## Team
17## Team
16
18
17−*Philip* `~wicdev-wisryt` made progress on `%aqua`, simulated Arvo instances running in Arvo, and getting individual continuity breaches working, which will enable resetting of sunk ships. *Elliot* `~littel-ponnys` and *Joe* `~master-morzod` have been [readying](https://github.com/urbit/urbit/pull/1232) `cc-release` for release. *Ted* `~rovnys-ricfur` has been [laying the groundwork](https://github.com/urbit/arvo/pull/1135) for future error handling and making progress on new `%ames`. *Ben* `~pitmug-roptec` and `pilfer-pandex` continued work on Hoon's type system. Finally, *Jared* `~nidsut-tomdun` is revamping `%gall`, currently `+mo` and `+ap`.
19+_Philip_ `~wicdev-wisryt` made progress on `%aqua`, simulated Arvo instances running in Arvo, and getting individual continuity breaches working, which will enable resetting of sunk ships. _Elliot_ `~littel-ponnys` and _Joe_ `~master-morzod` have been [readying](https://github.com/urbit/urbit/pull/1232) `cc-release` for release. _Ted_ `~rovnys-ricfur` has been [laying the groundwork](https://github.com/urbit/arvo/pull/1135) for future error handling and making progress on new `%ames`. _Ben_ `~pitmug-roptec` and `pilfer-pandex` continued work on Hoon's type system. Finally, _Jared_ `~nidsut-tomdun` is revamping `%gall`, currently `+mo` and `+ap`.
18
20
19## Community
21## Community
20
22
@@ -22,6 +24,6 @@ We conducted an Azimuth AMA and an "IDEA BLITZ" on Landscape. Excerpts from the
22
24
23## April Fools
25## April Fools
24
26
25−*Ted* `~rovnys-ricfur` shared a [convincing argument](https://github.com/urbit/arvo/pull/1129) for uppercasing Hoon and someone launched [Urbit Classic](http://urbit-classic.org/), running 2016-era Arvo. To be clear, we don't recommend sending them Bitcoin.
27+_Ted_ `~rovnys-ricfur` shared a [convincing argument](https://github.com/urbit/arvo/pull/1129) for uppercasing Hoon and someone launched [Urbit Classic](http://urbit-classic.org/), running 2016-era Arvo. To be clear, we don't recommend sending them Bitcoin.
26
28
27−Until next time.
29+Until next time.
content/updates/2019-5-10-update.md+4−3
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2019.5.10 Update"
2title = "~2019.5.10 Update"
3−date = 2019-05-10
3+date = "2019-05-09"
4description = "A short update from the Tlon team for the week of ~2019.5.10."
4description = "A short update from the Tlon team for the week of ~2019.5.10."
5−aliases = ["/posts/2019-5-10-update/"]
5+aliases = [ "/posts/2019-5-10-update/" ]
6+
6[extra]
7[extra]
7author = "Morgan"
8author = "Morgan"
8ship = "~hidrel-fabtel"
9ship = "~hidrel-fabtel"
@@ -13,4 +14,4 @@ image = "https://media.urbit.org/site/posts/updates/~2019.5.10-update-1.jpg"
13
14
14**Ted** `~rovnys-ricfur` is rewriting `%ames`, Urbit’s encrypted peer-to-peer messaging protocol, in the [“aloe”](https://github.com/urbit/arvo/tree/aloe) branch. **Philip** `~wicdev-wisryt` has been working on a `bind` rune, [monadic pH tests](https://github.com/urbit/arvo/pull/1152), and `%ames` [“aloe”](https://github.com/urbit/arvo/tree/philip/aloe) with **Ted**. **Jared** `~nidsut-tomdun` is reworking `%gall` and has been pushing [Bridge](https://github.com/urbit/bridge/releases) updates with **Mark** `~palfun-foslup`. **Joe** `~master-morzod` has [cc-release](https://github.com/urbit/urbit/tree/cc-release) – the next major version of Urbit – just about ready to go. This bundles a new multi-process architecture, support for running the full bootstrap sequence, new event dispatch and persistence, a new build system, and more. **Elliot** `~littel-ponnys` merged new [event batching](https://github.com/urbit/urbit/pull/1259) (part of cc-release), which [makes Urbit performance less I/O bound](https://github.com/urbit/urbit/pull/1259#issuecomment-487785371). Finally, **Morgan** `~hidrel-fabtel` and **Alex** `~mignyt-mogseb` launched a public mailing list, [urbit-dev](https://groups.google.com/a/urbit.org/forum/#!forum/dev), a [new proposal system](https://github.com/urbit/proposals), and reimplemented [urbit.org](https://github.com/urbit/urbit.org) to enable fast builds and automatic deployment.
15**Ted** `~rovnys-ricfur` is rewriting `%ames`, Urbit’s encrypted peer-to-peer messaging protocol, in the [“aloe”](https://github.com/urbit/arvo/tree/aloe) branch. **Philip** `~wicdev-wisryt` has been working on a `bind` rune, [monadic pH tests](https://github.com/urbit/arvo/pull/1152), and `%ames` [“aloe”](https://github.com/urbit/arvo/tree/philip/aloe) with **Ted**. **Jared** `~nidsut-tomdun` is reworking `%gall` and has been pushing [Bridge](https://github.com/urbit/bridge/releases) updates with **Mark** `~palfun-foslup`. **Joe** `~master-morzod` has [cc-release](https://github.com/urbit/urbit/tree/cc-release) – the next major version of Urbit – just about ready to go. This bundles a new multi-process architecture, support for running the full bootstrap sequence, new event dispatch and persistence, a new build system, and more. **Elliot** `~littel-ponnys` merged new [event batching](https://github.com/urbit/urbit/pull/1259) (part of cc-release), which [makes Urbit performance less I/O bound](https://github.com/urbit/urbit/pull/1259#issuecomment-487785371). Finally, **Morgan** `~hidrel-fabtel` and **Alex** `~mignyt-mogseb` launched a public mailing list, [urbit-dev](https://groups.google.com/a/urbit.org/forum/#!forum/dev), a [new proposal system](https://github.com/urbit/proposals), and reimplemented [urbit.org](https://github.com/urbit/urbit.org) to enable fast builds and automatic deployment.
15
16
16−Until next time.
17+Until next time.
content/updates/2019-5-17-update.md+4−3
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2019.5.17 Update"
2title = "~2019.5.17 Update"
3−date = 2019-05-17
3+date = "2019-05-16"
4description = "A short update from the Tlon team for the week of ~2019.5.17."
4description = "A short update from the Tlon team for the week of ~2019.5.17."
5−aliases = ["/posts/2019-5-17-update/"]
5+aliases = [ "/posts/2019-5-17-update/" ]
6+
6[extra]
7[extra]
7author = "Morgan"
8author = "Morgan"
8ship = "~hidrel-fabtel"
9ship = "~hidrel-fabtel"
@@ -17,4 +18,4 @@ image = "https://media.urbit.org/site/posts/updates/~2019.5.17-update-1.png"
17
18
18In other news, the **Interface Team** started a [Twitter account](https://twitter.com/urbitwip) to share work in progress, there's been lively discussion on [urbit-dev](https://groups.google.com/a/urbit.org/forum/#!forum/dev), and we published [a roadmap](https://urbit.org/posts/2019-5-roadmap/).
19In other news, the **Interface Team** started a [Twitter account](https://twitter.com/urbitwip) to share work in progress, there's been lively discussion on [urbit-dev](https://groups.google.com/a/urbit.org/forum/#!forum/dev), and we published [a roadmap](https://urbit.org/posts/2019-5-roadmap/).
19
20
20−Until next time.
21+Until next time.
content/updates/2019-5-31-update.md+7−6
@@ -1,8 +1,9 @@
1+++
1+++
2title = "~2019.5.31 Update"
2title = "~2019.5.31 Update"
3−date = 2019-05-31
3+date = "2019-05-30"
4description = "A short update from the Tlon team for the week of ~2019.5.31."
4description = "A short update from the Tlon team for the week of ~2019.5.31."
5−aliases = ["/posts/2019-5-31-update/"]
5+aliases = [ "/posts/2019-5-31-update/" ]
6+
6[extra]
7[extra]
7author = "Morgan"
8author = "Morgan"
8ship = "~hidrel-fabtel"
9ship = "~hidrel-fabtel"
@@ -12,7 +13,7 @@ image = "https://media.urbit.org/site/posts/updates/~2019.5.31-update-3.jpg"
12![](https://media.urbit.org/site/posts/updates/~2019.5.31-update-3.jpg)
13![](https://media.urbit.org/site/posts/updates/~2019.5.31-update-3.jpg)
13
14
14**Logan** `~tacryt-socryp` has been working with **Isaac** `~novlud-padtyv` on a new chat interface to replace Landscape and recently finished a chat wrapper API on top of Hall that enables significant performance gains, simplifies the API, and enables fine-grained unread counts per chatroom.
15**Logan** `~tacryt-socryp` has been working with **Isaac** `~novlud-padtyv` on a new chat interface to replace Landscape and recently finished a chat wrapper API on top of Hall that enables significant performance gains, simplifies the API, and enables fine-grained unread counts per chatroom.
15−
16+
16**Ted** `~rovnys-ricfer` published [an initial new Ames proposal](https://groups.google.com/a/urbit.org/forum/#!topic/dev/91oMaUwtVzE) to [urbit-dev](https://groups.google.com/a/urbit.org/forum/#!forum/dev) and abandoned the `aloe` branch for [`alef`](https://github.com/urbit/arvo/tree/alef), where the initial few thousand lines of code have now been checked in.
17**Ted** `~rovnys-ricfer` published [an initial new Ames proposal](https://groups.google.com/a/urbit.org/forum/#!topic/dev/91oMaUwtVzE) to [urbit-dev](https://groups.google.com/a/urbit.org/forum/#!forum/dev) and abandoned the `aloe` branch for [`alef`](https://github.com/urbit/arvo/tree/alef), where the initial few thousand lines of code have now been checked in.
17
18
18**Joe** `~master-morzod` worked on the DNS magic behind `arvo.network`, jet compilers with `~pilfer-pandex`, `cc-release` argument parsing, and rewrites of cue and mug.
19**Joe** `~master-morzod` worked on the DNS magic behind `arvo.network`, jet compilers with `~pilfer-pandex`, `cc-release` argument parsing, and rewrites of cue and mug.
@@ -21,10 +22,10 @@ image = "https://media.urbit.org/site/posts/updates/~2019.5.31-update-3.jpg"
21
22
22**Mark** `~palfun-foslup` [merged](https://github.com/urbit/azimuth/pull/17) support for delegated sending from arbitrary stars in Azimuth.
23**Mark** `~palfun-foslup` [merged](https://github.com/urbit/azimuth/pull/17) support for delegated sending from arbitrary stars in Azimuth.
23
24
24−**Jared** `~nidsut-tomdun` released azimuth-js `v0.14.0`, pushed azimuth-solidity `v1.2.0` to NPM, continued work on `%gall`, and has been readying `cc-release`.
25+**Jared** `~nidsut-tomdun` released azimuth-js `v0.14.0`, pushed azimuth-solidity `v1.2.0` to NPM, continued work on `%gall`, and has been readying `cc-release`.
25
26
26−**Morgan** `~hidrel-fabtel` has been reaching out to community members. If you're interested in talking with us about your experience with Urbit so far and what you'd like to see in the future, please let us know at [support@urbit.org](mailto:support@urbit.org).
27+**Morgan** `~hidrel-fabtel` has been reaching out to community members. If you're interested in talking with us about your experience with Urbit so far and what you'd like to see in the future, please let us know at [support@urbit.org](mailto:support@urbit.org).
27
28
28In other news, the [urbit-dev](https://groups.google.com/a/urbit.org/forum/#!forum/dev) mailing list has been lively, [urbit.org](https://github.com/urbit/urbit.org) now deploys automatically thanks to Netlify, and we're getting ready to breach the network for [cc-release](https://github.com/urbit/urbit/tree/cc-release) next week. Follow [@zodisok](https://twitter.com/zodisok) for updates.
29In other news, the [urbit-dev](https://groups.google.com/a/urbit.org/forum/#!forum/dev) mailing list has been lively, [urbit.org](https://github.com/urbit/urbit.org) now deploys automatically thanks to Netlify, and we're getting ready to breach the network for [cc-release](https://github.com/urbit/urbit/tree/cc-release) next week. Follow [@zodisok](https://twitter.com/zodisok) for updates.
29
30
30−Until next time.
31+Until next time.
content/updates/2019-6-14-update.md+10−7
@@ -1,8 +1,12 @@
1+++
1+++
2title = "~2019.6.14 Update"
2title = "~2019.6.14 Update"
3−date = 2019-06-14
3+date = "2019-06-13"
4description = "Urbit 0.8.0, new %ames, async monad, 64-bit Vere, Haskell Vere, and more."
4description = "Urbit 0.8.0, new %ames, async monad, 64-bit Vere, Haskell Vere, and more."
5+aliases = [
5−aliases = ["/posts/updates/2019-6-14-update", "/posts/2019-6-14-update/"]
6+ "/posts/updates/2019-6-14-update",
7+ "/posts/2019-6-14-update/"
8+]
9+
6[extra]
10[extra]
7author = "Morgan"
11author = "Morgan"
8ship = "~hidrel-fabtel"
12ship = "~hidrel-fabtel"
@@ -15,13 +19,12 @@ image = "https://media.urbit.org/site/posts/updates/~2019.6.14-update-1.jpg"
15
19
16**Philip** `~wicdev-wisryt` improved his new async monad and its example apps. Read more about that [here](https://groups.google.com/a/urbit.org/forum/#!topic/dev/DDG6gHSG1Lc) and in the [original PR](https://github.com/urbit/arvo/pull/1183).
20**Philip** `~wicdev-wisryt` improved his new async monad and its example apps. Read more about that [here](https://groups.google.com/a/urbit.org/forum/#!topic/dev/DDG6gHSG1Lc) and in the [original PR](https://github.com/urbit/arvo/pull/1183).
17
21
18−**Ted** `~rovnys-ricfer`, with **Philip**, made progress on new `%ames` architecture and implementation. Follow along with some of the recent discussion in [this post](https://groups.google.com/a/urbit.org/forum/#!topic/dev/y_gaSpn9mxM).
22+**Ted** `~rovnys-ricfer`, with **Philip**, made progress on new `%ames` architecture and implementation. Follow along with some of the recent discussion in [this post](https://groups.google.com/a/urbit.org/forum/#!topic/dev/y_gaSpn9mxM).
19−
20
23
21**Elliot** `~littel-ponnys` finished an initial implementation of ring signatures in Arvo, including a basic voting app, described in a [post](https://groups.google.com/a/urbit.org/forum/#!topic/dev/IG-FdVpEGX0) to urbit-dev. He also worked on a forthcoming Haskell rewrite of Vere with `~pitmug-roptec` and his multi-process Urbit "Nuevo" design.
24**Elliot** `~littel-ponnys` finished an initial implementation of ring signatures in Arvo, including a basic voting app, described in a [post](https://groups.google.com/a/urbit.org/forum/#!topic/dev/IG-FdVpEGX0) to urbit-dev. He also worked on a forthcoming Haskell rewrite of Vere with `~pitmug-roptec` and his multi-process Urbit "Nuevo" design.
22
25
23−**Joe** `~master-morzod` worked on some Hoon bugs, reviewed the `lighter-than-eyre` branch – which won't be released in 0.8.0 – and has been working to simplify the DNS magic that makes ship.arvo.network work.
26+**Joe** `~master-morzod` worked on some Hoon bugs, reviewed the `lighter-than-eyre` branch – which won't be released in 0.8.0 – and has been working to simplify the DNS magic that makes ship.arvo.network work.
24
27
25−`~rigdyn-sondur` is on the home stretch with [64-bit Vere](https://github.com/BernardoDeLaPlaz/urbit/commits/vere_64).
28+`~rigdyn-sondur` is on the home stretch with [64-bit Vere](https://github.com/BernardoDeLaPlaz/urbit/commits/vere_64).
26
29
27−Until next time.
30+Until next time.
content/updates/2019-7-25-update.md+9−5
@@ -1,8 +1,12 @@
1+++
1+++
2title = "~2019.7.25 Update"
2title = "~2019.7.25 Update"
3−date = 2019-07-25
3+date = "2019-07-24"
4description = "Urbit 0.8.0, new Landscape, %ames, %kale, Vere, Nix builds, and more."
4description = "Urbit 0.8.0, new Landscape, %ames, %kale, Vere, Nix builds, and more."
5+aliases = [
5−aliases = ["/posts/updates/2019-7-25-update", "/posts/2019-7-25-update/"]
6+ "/posts/updates/2019-7-25-update",
7+ "/posts/2019-7-25-update/"
8+]
9+
6[extra]
10[extra]
7author = "Morgan"
11author = "Morgan"
8ship = "~hidrel-fabtel"
12ship = "~hidrel-fabtel"
@@ -17,7 +21,7 @@ Amongst many exciting improvements and overall greater network stability, `v0.8.
17
21
18We ran into a slew of issues with the network after launch, which were fixed in part thanks to a modification to Vere that allows [direct event injection](https://github.com/urbit/urbit/pull/1389), thanks to **Philip** `~wicdev-wisryt`. You can find `~zod.2019.7.23` relase notes [here](https://github.com/urbit/urbit/releases/tag/zod.2019.7.23).
22We ran into a slew of issues with the network after launch, which were fixed in part thanks to a modification to Vere that allows [direct event injection](https://github.com/urbit/urbit/pull/1389), thanks to **Philip** `~wicdev-wisryt`. You can find `~zod.2019.7.23` relase notes [here](https://github.com/urbit/urbit/releases/tag/zod.2019.7.23).
19
23
20−**Jared** `~nidsut-tomdun` now the maintainer and release-manager of [Urbit](https://github.com/urbit/urbit), spent much of the past few weeks testing and then shepherding `v0.8.0` out the door.
24+**Jared** `~nidsut-tomdun` now the maintainer and release-manager of [Urbit](https://github.com/urbit/urbit), spent much of the past few weeks testing and then shepherding `v0.8.0` out the door.
21
25
22**Joe** `~master-morzod` has also been preparing `v0.8.0` for release, fixing numerous bugs, and simplifying Urbit's automagic DNS (`*.arvo.network`). He's also been looking into integrating [Jaque](https://github.com/frodwith/jaque) – a Graal/Truffle Nock interpreter intended to replace much of Vere – and an [`:acme`](https://github.com/urbit/urbit/blob/master/pkg/arvo/app/acme.hoon) rewrite.
26**Joe** `~master-morzod` has also been preparing `v0.8.0` for release, fixing numerous bugs, and simplifying Urbit's automagic DNS (`*.arvo.network`). He's also been looking into integrating [Jaque](https://github.com/frodwith/jaque) – a Graal/Truffle Nock interpreter intended to replace much of Vere – and an [`:acme`](https://github.com/urbit/urbit/blob/master/pkg/arvo/app/acme.hoon) rewrite.
23
27
@@ -25,7 +29,7 @@ We ran into a slew of issues with the network after launch, which were fixed in
25
29
26**Ted** `~rovnys-ricfer` has made great progress integrating new `%ames` ["alef"](https://github.com/urbit/urbit/tree/alef-breach). It can nearly say `|hi` to itself.
30**Ted** `~rovnys-ricfer` has made great progress integrating new `%ames` ["alef"](https://github.com/urbit/urbit/tree/alef-breach). It can nearly say `|hi` to itself.
27
31
28−**Elliot** `~littel-ponnys` has been working on an example social application that makes use of ring signatures in Arvo, called ["Safe"](https://github.com/urbit/urbit/tree/safe-prototype).
32+**Elliot** `~littel-ponnys` has been working on an example social application that makes use of ring signatures in Arvo, called ["Safe"](https://github.com/urbit/urbit/tree/safe-prototype).
29
33
30**Ben** `~pitmug-roptec` has been [rewriting](https://github.com/urbit/urbit/tree/bs/uterm/pkg/hs-urbit/lib) Vere's 'daemon' process – the part that interfaces with the host system – in Haskell toward improved maintainability. He's also working on a new language, called [Conq](https://github.com/urbit/urbit/blob/bs/conq-attila-hoon/pkg/hs-conq/lib/Language/Conq.hs).
34**Ben** `~pitmug-roptec` has been [rewriting](https://github.com/urbit/urbit/tree/bs/uterm/pkg/hs-urbit/lib) Vere's 'daemon' process – the part that interfaces with the host system – in Haskell toward improved maintainability. He's also working on a new language, called [Conq](https://github.com/urbit/urbit/blob/bs/conq-attila-hoon/pkg/hs-conq/lib/Language/Conq.hs).
31
35
@@ -33,4 +37,4 @@ We ran into a slew of issues with the network after launch, which were fixed in
33
37
34**Isaac** `~novlud-padtyv` and **Logan** `~tacryt-socryp` shipped the [new Landscape](https://github.com/urbit/urbit/tree/master/pkg/interface), which features a brand-new interface designed around an OS-like home screen and the ability to integrate new applications. Landscape too [has been merged](https://github.com/urbit/urbit/pull/1367) into the Urbit monorepo.
38**Isaac** `~novlud-padtyv` and **Logan** `~tacryt-socryp` shipped the [new Landscape](https://github.com/urbit/urbit/tree/master/pkg/interface), which features a brand-new interface designed around an OS-like home screen and the ability to integrate new applications. Landscape too [has been merged](https://github.com/urbit/urbit/pull/1367) into the Urbit monorepo.
35
39
36−Until next time.
40+Until next time.
content/updates/2020-02-06-update.md+5−3
@@ -1,10 +1,12 @@
1+++
1+++
2title = "~2020.2.6 Update"
2title = "~2020.2.6 Update"
3−date = 2020-02-06
3+date = "2020-02-05"
4description = "A brief update from the Tlon team for ~2020.2.6."
4description = "A brief update from the Tlon team for ~2020.2.6."
5+
5[taxonomies]
6[taxonomies]
6−grant_type = ["Gift"]
7+grant_type = [ "Gift" ]
7−grant_category = []
8+grant_category = [ ]
9+
8[extra]
10[extra]
9author = "Corrina"
11author = "Corrina"
10ship = "~roslet-tanner"
12ship = "~roslet-tanner"
content/updates/2020-04-04-update.md+2−1
@@ -1,7 +1,8 @@
1+++
1+++
2title = "~2020.4.4 Update"
2title = "~2020.4.4 Update"
3−date = 2020-04-04
3+date = "2020-04-03"
4description = "A brief update from the Tlon team for ~2020.4.4."
4description = "A brief update from the Tlon team for ~2020.4.4."
5+
5[extra]
6[extra]
6author = "Nicholas"
7author = "Nicholas"
7ship = "~simfur-ritwed"
8ship = "~simfur-ritwed"
content/updates/2020-06-15-update.md+2−1
@@ -1,7 +1,8 @@
1+++
1+++
2title = "~2020.6.15 Update"
2title = "~2020.6.15 Update"
3−date = 2020-06-15
3+date = "2020-06-14"
4description = "A brief update from Tlon for ~2020.6.15"
4description = "A brief update from Tlon for ~2020.6.15"
5+
5[extra]
6[extra]
6author = ""
7author = ""
7ship = "~roslet-tanner"
8ship = "~roslet-tanner"
content/updates/2020-07-27-update.md+2−1
@@ -1,7 +1,8 @@
1+++
1+++
2title = "A brief update from Tlon"
2title = "A brief update from Tlon"
3−date = 2020-07-27
3+date = "2020-07-26"
4description = "A brief update from Tlon for ~7.27.2020"
4description = "A brief update from Tlon for ~7.27.2020"
5+
5[extra]
6[extra]
6author = ""
7author = ""
7ship = "~roslet-tanner"
8ship = "~roslet-tanner"
content/updates/2020-09-30-update.md+2−1
@@ -1,7 +1,8 @@
1+++
1+++
2title = "A brief update from Tlon"
2title = "A brief update from Tlon"
3−date = 2020-09-30
3+date = "2020-09-29"
4description = "A brief update from Tlon for ~9.30.2020"
4description = "A brief update from Tlon for ~9.30.2020"
5+
5[extra]
6[extra]
6author = ""
7author = ""
7ship = "~ravmel-ropdyl"
8ship = "~ravmel-ropdyl"
content/updates/2020-10-29-update.md+2−1
@@ -1,7 +1,8 @@
1+++
1+++
2title = "A brief update from Tlon + urbit.org"
2title = "A brief update from Tlon + urbit.org"
3−date = 2020-10-29
3+date = "2020-10-28"
4description = "A brief update from Tlon and urbit.org for ~10.29.2020"
4description = "A brief update from Tlon and urbit.org for ~10.29.2020"
5+
5[extra]
6[extra]
6author = ""
7author = ""
7ship = "~roslet-tanner + ~wolref-podlex"
8ship = "~roslet-tanner + ~wolref-podlex"
content/updates/2020-12-01-update.md+2−1
@@ -1,7 +1,8 @@
1+++
1+++
2title = "A brief update from urbit.org"
2title = "A brief update from urbit.org"
3−date = 2020-10-29
3+date = "2020-10-28"
4description = "A brief update from urbit.org for ~12.1.2020"
4description = "A brief update from urbit.org for ~12.1.2020"
5+
5[extra]
6[extra]
6author = ""
7author = ""
7ship = "~wolref-podlex"
8ship = "~wolref-podlex"
content/updates/2021-01-15-update.md+2−1
@@ -1,7 +1,8 @@
1+++
1+++
2title = "A brief update from urbit.org"
2title = "A brief update from urbit.org"
3−date = 2021-01-15
3+date = "2021-01-14"
4description = "A brief update from urbit.org for ~1.15.2021"
4description = "A brief update from urbit.org for ~1.15.2021"
5+
5[extra]
6[extra]
6author = ""
7author = ""
7ship = "~wolref-podlex"
8ship = "~wolref-podlex"
content/updates/2021-02-19-update.md+2−1
@@ -1,7 +1,8 @@
1+++
1+++
2title = "A brief update from urbit.org"
2title = "A brief update from urbit.org"
3−date = 2021-02-19
3+date = "2021-02-18"
4description = "A brief update from urbit.org for ~2.19.2021"
4description = "A brief update from urbit.org for ~2.19.2021"
5+
5[extra]
6[extra]
6author = ""
7author = ""
7ship = "~wolref-podlex"
8ship = "~wolref-podlex"
content/updates/2021-04-01-update.md+2−1
@@ -1,7 +1,8 @@
1+++
1+++
2title = "A brief update from urbit.org and Tlon"
2title = "A brief update from urbit.org and Tlon"
3−date = 2021-04-01
3+date = "2021-03-31"
4description = "A brief update from urbit.org and Tlon for ~4.1.2021"
4description = "A brief update from urbit.org and Tlon for ~4.1.2021"
5+
5[extra]
6[extra]
6author = ""
7author = ""
7ship = "~wolref-podlex + ~roslet-tanner"
8ship = "~wolref-podlex + ~roslet-tanner"
content/updates/2021-05-05-update.md+2−1
@@ -1,7 +1,8 @@
1+++
1+++
2title = "A brief update from urbit.org"
2title = "A brief update from urbit.org"
3−date = 2021-05-05
3+date = "2021-05-04"
4description = "A brief update from urbit.org for ~5.5.2021"
4description = "A brief update from urbit.org for ~5.5.2021"
5+
5[extra]
6[extra]
6author = ""
7author = ""
7ship = "~wolref-podlex"
8ship = "~wolref-podlex"
content/updates/2021-06-16-update.md+5−3
@@ -1,10 +1,12 @@
1+++
1+++
2title = "A brief update from urbit.org"
2title = "A brief update from urbit.org"
3−date = 2021-06-16
3+date = "2021-06-15"
4description = "A brief update from urbit.org for ~6.16.2021"
4description = "A brief update from urbit.org for ~6.16.2021"
5+
5[taxonomies]
6[taxonomies]
6−grant_type = ["Gift"]
7+grant_type = [ "Gift" ]
7−grant_category = []
8+grant_category = [ ]
9+
8[extra]
10[extra]
9author = ""
11author = ""
10ship = "~tirwyd-sarmes"
12ship = "~tirwyd-sarmes"
lib/lib.js+51−21
@@ -4,6 +4,7 @@ import fs from "fs";
4import { join, parse } from "path";
4import { join, parse } from "path";
5import matter from "gray-matter";
5import matter from "gray-matter";
6import toml from "@iarna/toml";
6import toml from "@iarna/toml";
7+import { DateTime } from "luxon";
7
8
8const directories = (dir) => {
9const directories = (dir) => {
9 switch (dir) {
10 switch (dir) {
@@ -64,9 +65,6 @@ export function getPostBySlug(slug, fields = [], key) {
64 }
65 }
65 });
66 });
66
67
67− // NB Gavin: This could be removed if the TOML engine returned a JSON date (string) instead of a JS Date object. The YAML engine did this parsing by default.
68− items.date = JSON.stringify(items?.date)?.replace(/\"/g, "") || "";
69−
70 return items;
68 return items;
71}
69}
72
70
@@ -77,12 +75,24 @@ export function getAllPosts(fields = [], key, sort = "date") {
77 // sort posts by date in descending order
75 // sort posts by date in descending order
78 .sort((post1, post2) => {
76 .sort((post1, post2) => {
79 if (sort === "date") {
77 if (sort === "date") {
80− return post1.date > post2.date ? -1 : 1;
78+ return DateTime.fromISO(post1.date) > DateTime.fromISO(post2.date)
79+ ? -1
80+ : 1;
81 } else if (sort === "weight") {
81 } else if (sort === "weight") {
82 return post1.weight > post2.weight ? -1 : 1;
82 return post1.weight > post2.weight ? -1 : 1;
83 }
83 }
84 });
84 });
85+ return posts;
86+}
85
87
88+export function getAllEvents(fields = [], key) {
89+ const slugs = getPostSlugs(key);
90+ const posts = slugs
91+ .map((slug) => getPostBySlug(slug, fields, key))
92+ // sort posts by date in descending order
93+ .sort((post1, post2) =>
94+ DateTime.fromISO(post1.starts) > DateTime.fromISO(post2.starts) ? -1 : 1
95+ );
86 return posts;
96 return posts;
87}
97}
88
98
@@ -128,29 +138,49 @@ export function getPreviousPost(slug, fields = [], key, sort = "date") {
128 return resultPost;
138 return resultPost;
129}
139}
130
140
131−export function formatDate(d) {
141+export function formatDateWithTime(d) {
132− // const wk = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
142+ const date = DateTime.fromISO(d, {
133− const mn = [
143+ setZone: true,
134− "January",
144+ }).toLocaleString(DateTime.DATETIME_FULL);
135− "February",
145+ return date;
136− "March",
137− "April",
138− "May",
139− "June",
140− "July",
141− "August",
142− "September",
143− "October",
144− "November",
145− "December",
146− ];
147− return mn[d.getMonth()] + " " + d.getDate() + ", " + d.getFullYear();
148}
146}
149
147
150export function capitalize(str) {
148export function capitalize(str) {
151 return str.charAt(0).toUpperCase() + str.slice(1);
149 return str.charAt(0).toUpperCase() + str.slice(1);
152}
150}
153
151
152+// Takes an ISO 8601 date string
153+// Returns a time relative to the IANA timezone and iso8601 date
154+export function generateDisplayDate(iso8601, zone = "America/Los_Angeles") {
155+ return DateTime.fromISO(iso8601, { zone });
156+}
157+
158+// Takes an ISO 8601 date string
159+// Returns a time relative to user's current timezone
160+export function generateRealtimeDate(iso8601) {
161+ return DateTime.fromISO(iso8601).setZone("system");
162+}
163+
164+// Formats a DateTime object to something like "July 15, 2021, 5:00 PM"
165+export function formatDateAndTime(dateTimeObject) {
166+ return dateTimeObject.toLocaleString(DateTime.DATETIME_HUGE);
167+}
168+
169+// Formats a DateTime object to something like "5:00 PM"
170+export function formatTime(dateTimeObject) {
171+ const dt = dateTimeObject.toLocaleString(DateTime.TIME_SIMPLE);
172+ return dt.replace(/:00/g, "");
173+}
174+
175+export function formatTimeZone(dateTimeObject) {
176+ return dateTimeObject.offsetNameShort;
177+}
178+
179+// Formats a DateTime object to something like "Jul 15, 2021"
180+export function formatDate(dateTimeObject) {
181+ return dateTimeObject.toLocaleString(DateTime.DATE_HUGE);
182+}
183+
154// export function generateCrumbs(path) {
184// export function generateCrumbs(path) {
155// const crumbs = path.split('/')
185// const crumbs = path.split('/')
156// return crumbs
186// return crumbs
lib/rss.js+1−1
@@ -30,7 +30,7 @@ const generateRSSFeed = () => {
30 return {
30 return {
31 title: pageData.title,
31 title: pageData.title,
32 descripton: pageData.description || "",
32 descripton: pageData.description || "",
33− author: pageData.extra.author || "",
33+ author: pageData.extra ? pageData.extra.author || "" : "",
34 date: pageData.date,
34 date: pageData.date,
35 link: `https://urbit.org/${leadingDir}/${name}`,
35 link: `https://urbit.org/${leadingDir}/${name}`,
36 content: pageContent,
36 content: pageContent,
package-lock.json+5
@@ -4033,6 +4033,11 @@
4033 }
4033 }
4034 }
4034 }
4035 },
4035 },
4036+ "luxon": {
4037+ "version": "2.0.2",
4038+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.0.2.tgz",
4039+ "integrity": "sha512-ZRioYLCgRHrtTORaZX1mx+jtxKtKuI5ZDvHNAmqpUzGqSrR+tL4FVLn/CUGMA3h0+AKD1MAxGI5GnCqR5txNqg=="
4040+ },
4036 "make-dir": {
4041 "make-dir": {
4037 "version": "3.1.0",
4042 "version": "3.1.0",
4038 "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
4043 "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
package.json+1
@@ -39,6 +39,7 @@
39 "remark-slug": "^6.0.0",
39 "remark-slug": "^6.0.0",
40 "tailwindcss": "^2.1.4",
40 "tailwindcss": "^2.1.4",
41 "toml": "^3.0.0",
41 "toml": "^3.0.0",
42+ "luxon": "^2.0.2",
42 "unified": "^9.2.1"
43 "unified": "^9.2.1"
43 },
44 },
44 "devDependencies": {
45 "devDependencies": {
pages/blog.js+3−2
@@ -7,7 +7,7 @@ import Header from "../components/Header";
7import SingleColumn from "../components/SingleColumn";
7import SingleColumn from "../components/SingleColumn";
8import BackgroundImage from "../components/BackgroundImage";
8import BackgroundImage from "../components/BackgroundImage";
9import Section from "../components/Section";
9import Section from "../components/Section";
10−import { getAllPosts, formatDate } from "../lib/lib";
10+import { getAllPosts, formatDate, generateDisplayDate } from "../lib/lib";
11import { contact } from "../lib/constants";
11import { contact } from "../lib/constants";
12
12
13export default function Blog({ posts, search }) {
13export default function Blog({ posts, search }) {
@@ -39,6 +39,7 @@ export default function Blog({ posts, search }) {
39 </Section>
39 </Section>
40 <Section narrow>
40 <Section narrow>
41 {posts.map((post) => {
41 {posts.map((post) => {
42+ const date = generateDisplayDate(post.date);
42 return (
43 return (
43 <div key={post.slug} className="mb-20 cursor-pointer">
44 <div key={post.slug} className="mb-20 cursor-pointer">
44 <Link href={`/blog/${post.slug}`}>
45 <Link href={`/blog/${post.slug}`}>
@@ -66,7 +67,7 @@ export default function Blog({ posts, search }) {
66 ) : null}
67 ) : null}
67 </div>
68 </div>
68 <div className="text-wall-500 type-sub">
69 <div className="text-wall-500 type-sub">
69− {formatDate(new Date(post.date))}
70+ {formatDate(date)}
70 </div>
71 </div>
71 </div>
72 </div>
72 </Link>
73 </Link>
pages/blog/[slug].js+3−3
@@ -5,6 +5,7 @@ import {
5 getNextPost,
5 getNextPost,
6 getPreviousPost,
6 getPreviousPost,
7 formatDate,
7 formatDate,
8+ generateDisplayDate,
8} from "../../lib/lib";
9} from "../../lib/lib";
9import Head from "next/head";
10import Head from "next/head";
10import Meta from "../../components/Meta";
11import Meta from "../../components/Meta";
@@ -30,6 +31,7 @@ export default function Post({
30 if (!router.isFallback && !post?.slug) {
31 if (!router.isFallback && !post?.slug) {
31 return <ErrorPage />;
32 return <ErrorPage />;
32 }
33 }
34+ const date = generateDisplayDate(post.date);
33 return (
35 return (
34 <Container>
36 <Container>
35 <Head>
37 <Head>
@@ -51,9 +53,7 @@ export default function Post({
51 </div>
53 </div>
52 ) : null}
54 ) : null}
53 </div>
55 </div>
54− <div className="text-wall-500 type-sub">
56+ <div className="text-wall-500 type-sub">{formatDate(date)}</div>
55− {formatDate(new Date(post.date))}
56− </div>
57 </Section>
57 </Section>
58 <Section short narrow className="markdown">
58 <Section short narrow className="markdown">
59 <article
59 <article
pages/events.js+69−72
@@ -1,74 +1,48 @@
1import Head from "next/head";
1import Head from "next/head";
2−import Meta from "../components/Meta";
3import Link from "next/link";
2import Link from "next/link";
3+import { DateTime } from "luxon";
4+
5+import Meta from "../components/Meta";
4import Container from "../components/Container";
6import Container from "../components/Container";
5import Footer from "../components/Footer";
7import Footer from "../components/Footer";
6import Header from "../components/Header";
8import Header from "../components/Header";
7import SingleColumn from "../components/SingleColumn";
9import SingleColumn from "../components/SingleColumn";
8import Section from "../components/Section";
10import Section from "../components/Section";
9−import { getAllPosts, formatDate } from "../lib/lib";
11+import EventPreview from "../components/EventPreview";
12+import { ShowOrHide } from "../components/Snippets";
10import { contact } from "../lib/constants";
13import { contact } from "../lib/constants";
14+import {
15+ getAllEvents,
16+ generateDisplayDate,
17+ generateRealtimeDate,
18+ formatDate,
19+ formatTime,
20+} from "../lib/lib";
11
21
12−export function EventCard({ event, dir, className }) {
13− // Event tiles have a 'dark mode' used when their background images are dark and white text is needed for legibility.
14− const grayText = event.extra?.dark ? "text-midWhite" : "text-wall-500";
15− const blackText = event.extra?.dark ? "text-white" : "text-wall-600";
16−
17− return (
18− <div
19− key={event.slug}
20− className={`mb-24 cursor-pointer bg-wall-100 rounded-xl h-96 bg-cover bg-center bg-no-repeat ${className}`}
21− style={{
22− backgroundImage:
23− `${
24− event.extra?.overlay
25− ? "linear-gradient(rgba(0,0,0,0.3), rgba(0,0,0,0.3)),"
26− : ""
27− }url(${event.extra?.image})` || "",
28− }}
29− >
30− <Link href={`${dir ? dir : "/events/"}${event.slug}`}>
31− <div className="flex flex-col p-8 justify-between items-between h-full relative">
32− <div className="flex-grow-1 flex flex-col justify-center h-full">
33− <h3 className={`mb-4 ${blackText}`}>{event.title}</h3>
34− <h4 className={grayText}>{event?.type}</h4>
35− </div>
36− <div className="absolute left-8 bottom-8 w-full">
37− <p className={grayText}>{event.extra.host}</p>
38− <p className={grayText}>{event.extra.guests}</p>
39− </div>
40− {event.extra.youtube ? (
41− <a
42− onClick={(e) => e.stopPropagation()}
43− className="absolute w-16 h-16 right-8 bottom-8 bg-white flex items-center justify-center rounded-full"
44− target="_blank"
45− href={`https://www.youtube.com/watch?v=${event.extra.youtube}`}
46− >
47− <svg
48− width="48"
49− height="48"
50− viewBox="0 0 16 16"
51− fill="none"
52− xmlns="http://www.w3.org/2000/svg"
53− >
54− <path
55− d="M11.25 7.56699C11.5833 7.75944 11.5833 8.24056 11.25 8.43301L6.75 11.0311C6.41667 11.2235 6 10.983 6 10.5981L6 5.40192C6 5.01702 6.41667 4.77646 6.75 4.96891L11.25 7.56699Z"
56− fill="black"
57− />
58− </svg>
59− </a>
60− ) : null}
61− </div>
62− </Link>
63− </div>
64− );
65−}
66−
67−export default function Events({ pastEvents, comingSoon, search }) {
22+export default function Events({ events, search }) {
68 const post = {
23 const post = {
69 title: "Events",
24 title: "Events",
70 description: "In-person, remote, and recorded events about Urbit.",
25 description: "In-person, remote, and recorded events about Urbit.",
71 };
26 };
27+
28+ const now = DateTime.now();
29+
30+ const pastEvents = events.filter((event) => {
31+ const ends = generateRealtimeDate(event.ends);
32+ return ends < now;
33+ });
34+
35+ const futureEvents = events.filter((event) => {
36+ const starts = generateRealtimeDate(event.starts);
37+ return starts > now;
38+ });
39+
40+ const happeningNow = events.filter((event) => {
41+ const starts = generateRealtimeDate(event.starts);
42+ const ends = generateRealtimeDate(event.ends);
43+ return starts > DateTime.now() && ends < now;
44+ });
45+
72 return (
46 return (
73 <Container>
47 <Container>
74 <Head>
48 <Head>
@@ -77,7 +51,7 @@ export default function Events({ pastEvents, comingSoon, search }) {
77 </Head>
51 </Head>
78 <SingleColumn>
52 <SingleColumn>
79 <Header search={search} />
53 <Header search={search} />
80− <Section narrow>
54+ <Section short narrow>
81 <div className="measure">
55 <div className="measure">
82 <h1 className="pb-16">Events</h1>
56 <h1 className="pb-16">Events</h1>
83 <p className="pb-6">
57 <p className="pb-6">
@@ -91,21 +65,32 @@ export default function Events({ pastEvents, comingSoon, search }) {
91 </Section>
65 </Section>
92
66
93 <Section narrow>
67 <Section narrow>
94− {comingSoon.length > 0 ? (
68+ {happeningNow.length > 0 ? (
69+ <>
70+ <div className="mb-8 mt-16 table">
71+ <h3 className="text-green-400">Happening Now</h3>
72+ </div>
73+ {happeningNow.map((post) => {
74+ return <EventPreview big event={post} />;
75+ })}
76+ </>
77+ ) : null}
78+ {futureEvents.length > 0 ? (
95 <>
79 <>
96− <div className="mb-8 table">
80+ <div className="mb-8 mt-16 table">
97− <h3 className="text-wall-500">Coming Soon</h3>
81+ <h3 className="text-green-400">Coming Soon</h3>
98 </div>
82 </div>
99− {comingSoon.map((post) => {
83+ {futureEvents.map((post) => {
100− return <EventCard event={post} />;
84+ return <EventPreview big event={post} />;
101 })}
85 })}
102 </>
86 </>
103 ) : null}
87 ) : null}
104− <div className="mb-8 table">
88+ <div className="mb-8 mt-16 table">
105 <h3 className="text-wall-500">Past Events</h3>
89 <h3 className="text-wall-500">Past Events</h3>
106 </div>
90 </div>
91+
107 {pastEvents.map((post) => {
92 {pastEvents.map((post) => {
108− return <EventCard event={post} />;
93+ return <EventPreview big event={post} className="mb-8" />;
109 })}
94 })}
110 </Section>
95 </Section>
111 </SingleColumn>
96 </SingleColumn>
@@ -115,13 +100,25 @@ export default function Events({ pastEvents, comingSoon, search }) {
115}
100}
116
101
117export async function getStaticProps() {
102export async function getStaticProps() {
118− const posts = getAllPosts(["title", "slug", "date", "extra"], "events");
103+ const events = getAllEvents(
119−
104+ [
120− // NB Gavin: This logic can change based on how we want to separate past vs current events
105+ "title",
121− const pastEvents = posts.filter((post) => !post.extra.pinned);
106+ "ends",
122− const comingSoon = posts.filter((post) => post.extra.pinned);
107+ "location",
108+ "image",
109+ "registration_url",
110+ "youtube",
111+ "description",
112+ "starts",
113+ "hosts",
114+ "guests",
115+ "dark",
116+ "slug",
117+ ],
118+ "events"
119+ );
123
120
124 return {
121 return {
125− props: { pastEvents, comingSoon },
122+ props: { events },
126 };
123 };
127}
124}
pages/events/[slug].js+137−55
@@ -1,10 +1,15 @@
1import { useRouter } from "next/router";
1import { useRouter } from "next/router";
2+import { DateTime } from "luxon";
2import {
3import {
3 getPostBySlug,
4 getPostBySlug,
4 getAllPosts,
5 getAllPosts,
5 getNextPost,
6 getNextPost,
6 getPreviousPost,
7 getPreviousPost,
7 formatDate,
8 formatDate,
9+ formatTime,
10+ formatTimeZone,
11+ generateDisplayDate,
12+ generateRealtimeDate,
8} from "../../lib/lib";
13} from "../../lib/lib";
9import Head from "next/head";
14import Head from "next/head";
10import Meta from "../../components/Meta";
15import Meta from "../../components/Meta";
@@ -16,66 +21,102 @@ import SingleColumn from "../../components/SingleColumn";
16import Contact from "../../components/Contact";
21import Contact from "../../components/Contact";
17import EventPreview from "../../components/EventPreview";
22import EventPreview from "../../components/EventPreview";
18import Section from "../../components/Section";
23import Section from "../../components/Section";
19−
24+import { Person, ReadableList, ShowOrHide } from "../../components/Snippets";
20import { decode } from "html-entities";
25import { decode } from "html-entities";
21
26
22export default function Event({
27export default function Event({
23− post,
28+ event,
24− nextPost,
29+ nextEvent,
25− previousPost,
30+ previousEvent,
26 markdown,
31 markdown,
27 search,
32 search,
28}) {
33}) {
34+ const starts = generateDisplayDate(event.starts, event.timezone);
35+ const ends = generateDisplayDate(event.ends, event.timezone);
36+
37+ const inFuture = generateRealtimeDate(starts) > DateTime.now();
38+
39+ const happeningNow =
40+ generateRealtimeDate(event.starts) > DateTime.now() && !inFuture;
41+
29 return (
42 return (
30 <Container>
43 <Container>
31 <Head>
44 <Head>
32− <title>{post.title} • Events • urbit.org</title>
45+ <title>{event.title} • Events • urbit.org</title>
33− {Meta(post)}
46+ {Meta(event)}
34 </Head>
47 </Head>
35 <SingleColumn>
48 <SingleColumn>
36 <Header search={search} />
49 <Header search={search} />
37 <Section narrow short>
50 <Section narrow short>
38− <h1>{post.title}</h1>
51+ <h1>{event.title}</h1>
39−
52+ <h3 className="mt-6">{event.description}</h3>
40− {post.extra.author ? (
41− <div className="type-ui text-wall-500 mt-4 md:mt-8 lg:mt-10">
42− {post.extra.author}
43− </div>
44− ) : null}
45− {post.extra.ship ? (
46− <div className="type-ui text-wall-500 font-mono">
53+ <p className="text-wall-600 mt-6">{formatDate(starts)}</p>
47− {post.extra.ship}
54+ <p className="text-wall-600">
48− </div>
55+ {formatTime(starts)}
49− ) : null}
56+ <ShowOrHide condition={typeof event.ends !== "undefined"}>
50−
57+ {` to ${formatTime(ends)}`}
51− <div className="mt-16">
58+ {" " + formatTimeZone(ends)}
52− <p className="type-ui text-wall-500">
59+ </ShowOrHide>
53− {formatDate(new Date(post.date))} {", " + post.extra.time}
60+ </p>
61+ <div className="mt-6">
62+ <ShowOrHide condition={event.hosts}>
63+ <p>
64+ {"Hosted by "}
65+ <ReadableList>
66+ {event.hosts?.map((host, index) => {
67+ return (
68+ <Person
69+ key={`${host.name}-${host.patp}`}
70+ name={host.name}
71+ patp={host.patp}
72+ />
73+ );
74+ })}
75+ </ReadableList>
54− </p>
76+ </p>
55− {post.extra.registration_url && post.extra.pinned ? (
77+ </ShowOrHide>
78+ <ShowOrHide condition={event.guests}>
79+ <p>
80+ {event.guests?.length > 1 ? "With guest " : "With guest "}
81+ <ReadableList>
82+ {event.guests?.map((guest, index) => (
83+ <Person
84+ key={`${guest.name}-${guest.patp}`}
85+ name={guest.name}
86+ patp={guest.patp}
87+ />
88+ ))}
89+ </ReadableList>
90+ </p>
91+ </ShowOrHide>
92+ </div>
93+ {inFuture && event.registration_url ? (
94+ <div className="table mt-6">
56 <a
95 <a
57− className="button-sm bg-green-400 text-white flex-0 mt-4"
96+ className="button-sm bg-green-400 text-white"
58− href={post.extra.registration_url}
97+ href={event.registration_url}
98+ onClick={(e) => e.stopPropagation()}
99+ target="_blank"
59 >
100 >
60 RSVP
101 RSVP
61 </a>
102 </a>
103+ </div>
62− ) : null}
104+ ) : null}
63− </div>
64 </Section>
105 </Section>
65 <Section short wide>
106 <Section short wide>
66− {post.extra.youtube ? (
107+ {event.youtube ? (
67 <iframe
108 <iframe
68 className="rounded-xl"
109 className="rounded-xl"
69 width="100%"
110 width="100%"
70 height="640px"
111 height="640px"
71− src={`https://www.youtube.com/embed/${post.extra.youtube}`}
112+ src={`https://www.youtube.com/embed/${event.youtube}`}
72 frameBorder="0"
113 frameBorder="0"
73 allow="encrypted-media"
114 allow="encrypted-media"
74− allowfullscreen
115+ allowFullScreen
75 ></iframe>
116 ></iframe>
76 ) : null}
117 ) : null}
77 </Section>
118 </Section>
78− <Section narrow className="markdown">
119+ <Section short narrow className="markdown">
79 <article
120 <article
80 className="pt-12 w-full"
121 className="pt-12 w-full"
81 dangerouslySetInnerHTML={{ __html: decode(markdown) }}
122 dangerouslySetInnerHTML={{ __html: decode(markdown) }}
@@ -85,23 +126,21 @@ export default function Event({
85 <Contact />
126 <Contact />
86 </Section>
127 </Section>
87 <Section wide className="flex">
128 <Section wide className="flex">
88− {previousPost === null ? (
129+ {previousEvent === null ? (
89 <div className={"w-1/2 mr-4"} />
130 <div className={"w-1/2 mr-4"} />
90 ) : (
131 ) : (
91− <EventPreview
92− title="Previous Event"
93− event={previousPost}
94− className="mr-4 w-1/2"
132+ <div className="mr-4 w-1/2">
95− />
133+ <h3 className="mb-2">Next Event</h3>
134+ <EventPreview event={previousEvent} />
135+ </div>
96 )}
136 )}
97− {nextPost === null ? (
137+ {nextEvent === null ? (
98 <div className={"w-1/2 ml-4"} />
138 <div className={"w-1/2 ml-4"} />
99 ) : (
139 ) : (
100− <EventPreview
101− title="Next Event"
102− event={nextPost}
103− className="ml-4 w-1/2"
140+ <div className="mr-4 w-1/2">
104− />
141+ <h3 className="mb-2">Previous Event</h3>
142+ <EventPreview event={nextEvent} />
143+ </div>
105 )}
144 )}
106 </Section>
145 </Section>
107 </SingleColumn>
146 </SingleColumn>
@@ -112,41 +151,84 @@ export default function Event({
112
151
113//
152//
114export async function getStaticProps({ params }) {
153export async function getStaticProps({ params }) {
115− const nextPost =
154+ const nextEvent =
116 getNextPost(
155 getNextPost(
117 params.slug,
156 params.slug,
157+ [
158+ "title",
159+ "slug",
160+ "ends",
161+ "location",
162+ "image",
163+ "registration_url",
164+ "youtube",
118− ["title", "slug", "date", "description", "extra"],
165+ "description",
166+ "starts",
167+ "hosts",
168+ "guests",
169+ "dark",
170+ "timezone",
171+ ],
119 "events"
172 "events"
120 ) || null;
173 ) || null;
121
174
122− const previousPost =
175+ const previousEvent =
123 getPreviousPost(
176 getPreviousPost(
124 params.slug,
177 params.slug,
178+ [
179+ "title",
180+ "slug",
181+ "ends",
182+ "location",
183+ "image",
184+ "registration_url",
185+ "youtube",
125− ["title", "slug", "date", "description", "extra"],
186+ "description",
187+ "starts",
188+ "hosts",
189+ "guests",
190+ "dark",
191+ "timezone",
192+ ],
126 "events"
193 "events"
127 ) || null;
194 ) || null;
128
195
129− const post = getPostBySlug(
196+ const event = getPostBySlug(
130 params.slug,
197 params.slug,
198+ [
199+ "title",
200+ "ends",
201+ "location",
202+ "image",
203+ "registration_url",
204+ "youtube",
131− ["title", "slug", "date", "description", "content", "extra"],
205+ "description",
206+ "starts",
207+ "hosts",
208+ "slug",
209+ "guests",
210+ "content",
211+ "dark",
212+ "timezone",
213+ ],
132 "events"
214 "events"
133 );
215 );
134
216
135− const markdown = await Markdown({ post });
217+ const markdown = await Markdown({ post: event });
136
218
137 return {
219 return {
138− props: { post, markdown, nextPost, previousPost },
220+ props: { event, markdown, nextEvent, previousEvent },
139 };
221 };
140}
222}
141
223
142export async function getStaticPaths() {
224export async function getStaticPaths() {
143− const posts = getAllPosts(["slug", "date"], "events");
225+ const events = getAllPosts(["slug", "date"], "events");
144
226
145 return {
227 return {
146− paths: posts.map((post) => {
228+ paths: events.map((event) => {
147 return {
229 return {
148 params: {
230 params: {
149− slug: post.slug,
231+ slug: event.slug,
150 },
232 },
151 };
233 };
152 }),
234 }),
pages/grants.js+29−12
@@ -381,22 +381,22 @@ export async function getStaticProps() {
381 "grants"
381 "grants"
382 );
382 );
383 // all the gift posts stuff can be removed once we migrate to gifts
383 // all the gift posts stuff can be removed once we migrate to gifts
384− let giftPosts = getAllPosts(
384+ // let giftPosts = getAllPosts(
385− ["title", "slug", "date", "description", "extra", "taxonomies"],
385+ // ["title", "slug", "date", "description", "extra", "taxonomies"],
386− "blog"
386+ // "blog"
387− );
387+ // );
388− giftPosts.map((e) => (e.section = "blog"));
388+ // giftPosts.map((e) => (e.section = "blog"));
389 let updates = getAllPosts(
389 let updates = getAllPosts(
390 ["title", "slug", "date", "description", "extra", "taxonomies"],
390 ["title", "slug", "date", "description", "extra", "taxonomies"],
391 "updates"
391 "updates"
392 );
392 );
393− updates.map((e) => (e.section = "updates"));
393+ // updates.map((e) => (e.section = "updates"));
394− giftPosts.push(...updates);
394+ // giftPosts.push(...updates);
395− giftPosts = giftPosts
395+ // giftPosts = giftPosts
396− .filter((e) => e?.taxonomies?.grant_type?.includes("Gift"))
396+ // .filter((e) => e?.taxonomies?.grant_type?.includes("Gift"))
397− .sort((a, b) => (a.date > b.date ? -1 : 1));
397+ // .sort((a, b) => (a.date > b.date ? -1 : 1));
398
398
399− const gifts = getAllPosts(["name", "planet", "date", "link"], "gifts");
399+ // const gifts = getAllPosts(["name", "planet", "date", "link"], "gifts");
400
400
401 // The layout expects exactly 3
401 // The layout expects exactly 3
402 const featuredGrants = [
402 const featuredGrants = [
@@ -407,6 +407,23 @@ export async function getStaticProps() {
407 getPostBySlug(slug, ["title", "slug", "date", "extra"], "grants")
407 getPostBySlug(slug, ["title", "slug", "date", "extra"], "grants")
408 );
408 );
409
409
410+ // Layout expects exactly 2
411+ // const giftPosts = [
412+ // "2021-06-16-update",
413+ // "gifts-q3-2020",
414+ // ].map((slug) =>
415+ // getPostBySlug(slug, ["title", "slug", "date", "extra"], "blog")
416+ // );
417+
418+ const giftPosts = [
419+ getPostBySlug(
420+ "2021-06-16-update",
421+ ["title", "slug", "date", "extra"],
422+ "updates"
423+ ),
424+ getPostBySlug("gifts-q3-2020", ["title", "slug", "date", "extra"], "blog"),
425+ ];
426+
410 return {
427 return {
411 props: {
428 props: {
412 posts: posts,
429 posts: posts,
@@ -414,7 +431,7 @@ export async function getStaticProps() {
414 types,
431 types,
415 featuredGrants,
432 featuredGrants,
416 giftPosts,
433 giftPosts,
417− gifts,
434+ gifts: [],
418 },
435 },
419 };
436 };
420}
437}
pages/index.js+33−24
@@ -11,7 +11,12 @@ import TabCarousel from "../components/TabCarousel";
11import Contact from "../components/Contact";
11import Contact from "../components/Contact";
12import PostPreview from "../components/PostPreview";
12import PostPreview from "../components/PostPreview";
13import EventPreview from "../components/EventPreview";
13import EventPreview from "../components/EventPreview";
14+import {
15+ getAllPosts,
16+ getAllEvents,
17+ formatDate,
14−import { getAllPosts, formatDate, getOpenGrantsCount } from "../lib/lib";
18+ getOpenGrantsCount,
19+} from "../lib/lib";
15import { contact } from "../lib/constants";
20import { contact } from "../lib/constants";
16
21
17export default function Home({ posts, events, openGrantsCount, search }) {
22export default function Home({ posts, events, openGrantsCount, search }) {
@@ -193,16 +198,12 @@ export default function Home({ posts, events, openGrantsCount, search }) {
193 </div>
198 </div>
194
199
195 <div className="flex flex-wrap">
200 <div className="flex flex-wrap">
196− <PostPreview
197− post={posts[0]}
198− className={`w-full md:w-1/2 pr-0 pb-8 md:pr-4`}
201+ <div className="w-full md:w-1/2 pr-0 pb-8 md:pr-4">
199− key={posts[0].slug}
202+ <PostPreview post={posts[0]} key={posts[0].slug} />
200− />
203+ </div>
201− <PostPreview
202− post={posts[1]}
203− className={`w-full md:w-1/2 pl-0 pb-8 md:pl-4`}
204+ <div className="w-full md:w-1/2 pl-0 pb-8 md:pl-4">
204− key={posts[1].slug}
205+ <PostPreview post={posts[1]} key={posts[1].slug} />
205− />
206+ </div>
206 </div>
207 </div>
207 <Link href="/blog">
208 <Link href="/blog">
208 <button className="button-lg type-ui text-white bg-green-400">
209 <button className="button-lg type-ui text-white bg-green-400">
@@ -220,18 +221,12 @@ export default function Home({ posts, events, openGrantsCount, search }) {
220 </div>
221 </div>
221
222
222 <div className="flex flex-wrap">
223 <div className="flex flex-wrap">
223− <EventPreview
224− rsvp
225− event={events[0]}
226− className={`w-full md:w-1/2 pr-0 pb-8 md:pr-4`}
224+ <div className="w-full md:w-1/2 pr-0 pb-8 md:pr-4">
227− key={events[0].slug}
225+ <EventPreview event={events[0]} key={events[0].slug} />
228− />
226+ </div>
229− <EventPreview
230− rsvp
231− event={events[1]}
232− className={`w-full md:w-1/2 pl-0 pb-8 md:pl-4`}
227+ <div className="w-full md:w-1/2 pl-0 pb-8 md:pl-4">
233− key={events[1].slug}
228+ <EventPreview event={events[1]} key={events[1].slug} />
234− />
229+ </div>
235 </div>
230 </div>
236 <Link href="/events">
231 <Link href="/events">
237 <button className="button-lg type-ui text-white bg-wall-600">
232 <button className="button-lg type-ui text-white bg-wall-600">
@@ -261,7 +256,21 @@ export async function getStaticProps() {
261 "blog"
256 "blog"
262 );
257 );
263
258
264− const events = getAllPosts(["title", "slug", "date", "extra"], "events");
259+ const events = getAllEvents(
260+ [
261+ "title",
262+ "slug",
263+ "starts",
264+ "guests",
265+ "hosts",
266+ "registration_url",
267+ "ends",
268+ "timezone",
269+ "youtube",
270+ "image",
271+ ],
272+ "events"
273+ );
265
274
266 return {
275 return {
267 props: { posts, events, openGrantsCount },
276 props: { posts, events, openGrantsCount },
pages/media.js+57−2
@@ -1,13 +1,68 @@
1import Head from "next/head";
1import Head from "next/head";
2+import Link from "next/link";
2import Meta from "../components/Meta";
3import Meta from "../components/Meta";
3import Container from "../components/Container";
4import Container from "../components/Container";
4import Footer from "../components/Footer";
5import Footer from "../components/Footer";
5import Header from "../components/Header";
6import Header from "../components/Header";
6import SingleColumn from "../components/SingleColumn";
7import SingleColumn from "../components/SingleColumn";
7−import { EventCard } from "./events";
8import Section from "../components/Section";
8import Section from "../components/Section";
9import { getAllPosts } from "../lib/lib";
9import { getAllPosts } from "../lib/lib";
10
10
11+export function MediaPreview({ event, dir, className }) {
12+ // Event tiles have a 'dark mode' used when their background images are dark and white text is needed for legibility.
13+ const grayText = event.extra?.dark ? "text-midWhite" : "text-wall-500";
14+ const blackText = event.extra?.dark ? "text-white" : "text-wall-600";
15+
16+ return (
17+ <div
18+ key={event.slug}
19+ className={`mb-24 cursor-pointer bg-wall-100 rounded-xl h-96 bg-cover bg-center bg-no-repeat ${className}`}
20+ style={{
21+ backgroundImage:
22+ `${
23+ event.extra?.overlay
24+ ? "linear-gradient(rgba(0,0,0,0.3), rgba(0,0,0,0.3)),"
25+ : ""
26+ }url(${event.extra?.image})` || "",
27+ }}
28+ >
29+ <Link href={`${dir ? dir : "/events/"}${event.slug}`}>
30+ <div className="flex flex-col p-8 justify-between items-between h-full relative">
31+ <div className="flex-grow-1 flex flex-col justify-center h-full">
32+ <h3 className={`mb-4 ${blackText}`}>{event.title}</h3>
33+ <h4 className={grayText}>{event?.type}</h4>
34+ </div>
35+ <div className="absolute left-8 bottom-8 w-full">
36+ <p className={grayText}>{event.extra.host}</p>
37+ <p className={grayText}>{event.extra.guests}</p>
38+ </div>
39+ {event.extra.youtube ? (
40+ <a
41+ onClick={(e) => e.stopPropagation()}
42+ className="absolute w-16 h-16 right-8 bottom-8 bg-white flex items-center justify-center rounded-full"
43+ target="_blank"
44+ href={`https://www.youtube.com/watch?v=${event.extra.youtube}`}
45+ >
46+ <svg
47+ width="48"
48+ height="48"
49+ viewBox="0 0 16 16"
50+ fill="none"
51+ xmlns="http://www.w3.org/2000/svg"
52+ >
53+ <path
54+ d="M11.25 7.56699C11.5833 7.75944 11.5833 8.24056 11.25 8.43301L6.75 11.0311C6.41667 11.2235 6 10.983 6 10.5981L6 5.40192C6 5.01702 6.41667 4.77646 6.75 4.96891L11.25 7.56699Z"
55+ fill="black"
56+ />
57+ </svg>
58+ </a>
59+ ) : null}
60+ </div>
61+ </Link>
62+ </div>
63+ );
64+}
65+
11export default function Media({ posts, search }) {
66export default function Media({ posts, search }) {
12 const post = {
67 const post = {
13 title: "Media",
68 title: "Media",
@@ -33,7 +88,7 @@ export default function Media({ posts, search }) {
33 </Section>
88 </Section>
34 <Section narrow>
89 <Section narrow>
35 {posts.map((post) => {
90 {posts.map((post) => {
36− return <EventCard event={post} dir="/media/" />;
91+ return <MediaPreview event={post} dir="/media/" />;
37 })}
92 })}
38 </Section>
93 </Section>
39 </SingleColumn>
94 </SingleColumn>
pages/media/[slug].js+8−4
@@ -1,5 +1,10 @@
1import { useRouter } from "next/router";
1import { useRouter } from "next/router";
2+import {
2−import { getPostBySlug, getAllPosts, formatDate } from "../../lib/lib";
3+ getPostBySlug,
4+ getAllPosts,
5+ formatDate,
6+ generateDisplayDate,
7+} from "../../lib/lib";
3import Head from "next/head";
8import Head from "next/head";
4import Meta from "../../components/Meta";
9import Meta from "../../components/Meta";
5import ErrorPage from "../404";
10import ErrorPage from "../404";
@@ -18,6 +23,7 @@ export default function MediaPage({ post, markdown, search }) {
18 if (!router.isFallback && !post?.slug) {
23 if (!router.isFallback && !post?.slug) {
19 return <ErrorPage />;
24 return <ErrorPage />;
20 }
25 }
26+ const date = generateDisplayDate(post.date);
21 return (
27 return (
22 <Container>
28 <Container>
23 <Head>
29 <Head>
@@ -38,9 +44,7 @@ export default function MediaPage({ post, markdown, search }) {
38 {post.extra.ship}
44 {post.extra.ship}
39 </div>
45 </div>
40 ) : null}
46 ) : null}
41− <div className="type-ui text-wall-500 mt-16">
47+ <div className="type-ui text-wall-500 mt-16">{formatDate(date)}</div>
42− {formatDate(new Date(post.date))}
43− </div>
44 </Section>
48 </Section>
45 <Section narrow>
49 <Section narrow>
46 {post.extra.youtube ? (
50 {post.extra.youtube ? (
pages/updates.js+3−2
@@ -7,7 +7,7 @@ import Header from "../components/Header";
7import SingleColumn from "../components/SingleColumn";
7import SingleColumn from "../components/SingleColumn";
8import BackgroundImage from "../components/BackgroundImage";
8import BackgroundImage from "../components/BackgroundImage";
9import Section from "../components/Section";
9import Section from "../components/Section";
10−import { getAllPosts, formatDate } from "../lib/lib";
10+import { getAllPosts, formatDate, generateDisplayDate } from "../lib/lib";
11import { contact } from "../lib/constants";
11import { contact } from "../lib/constants";
12
12
13export default function Updates({ posts, search }) {
13export default function Updates({ posts, search }) {
@@ -31,6 +31,7 @@ export default function Updates({ posts, search }) {
31 </Section>
31 </Section>
32 <Section narrow>
32 <Section narrow>
33 {posts.map((post) => {
33 {posts.map((post) => {
34+ const date = generateDisplayDate(post.date);
34 return (
35 return (
35 <div key={post.slug} className="mb-24 cursor-pointer">
36 <div key={post.slug} className="mb-24 cursor-pointer">
36 <Link href={`/updates/${post.slug}`}>
37 <Link href={`/updates/${post.slug}`}>
@@ -53,7 +54,7 @@ export default function Updates({ posts, search }) {
53 </div>
54 </div>
54
55
55 <div className="type-ui text-wall-500 mt-2">
56 <div className="type-ui text-wall-500 mt-2">
56− {formatDate(new Date(post.date))}
57+ {formatDate(date)}
57 </div>
58 </div>
58 </div>
59 </div>
59 </Link>
60 </Link>
pages/updates/[slug].js+3−1
@@ -5,6 +5,7 @@ import {
5 getNextPost,
5 getNextPost,
6 getPreviousPost,
6 getPreviousPost,
7 formatDate,
7 formatDate,
8+ generateDisplayDate,
8} from "../../lib/lib";
9} from "../../lib/lib";
9import Head from "next/head";
10import Head from "next/head";
10import Meta from "../../components/Meta";
11import Meta from "../../components/Meta";
@@ -30,6 +31,7 @@ export default function Post({
30 if (!router.isFallback && !post?.slug) {
31 if (!router.isFallback && !post?.slug) {
31 return <ErrorPage />;
32 return <ErrorPage />;
32 }
33 }
34+ const date = generateDisplayDate(post.date);
33 return (
35 return (
34 <Container>
36 <Container>
35 <Head>
37 <Head>
@@ -49,7 +51,7 @@ export default function Post({
49 <div className="type-ui text-wall-500 font-mono">{post.ship}</div>
51 <div className="type-ui text-wall-500 font-mono">{post.ship}</div>
50 ) : null}
52 ) : null}
51 <div className="type-ui text-wall-500 mt-4 md:mt-8 lg:mt-10">
53 <div className="type-ui text-wall-500 mt-4 md:mt-8 lg:mt-10">
52− {formatDate(new Date(post.date))}
54+ {formatDate(date)}
53 </div>
55 </div>
54 </Section>
56 </Section>
55 <Section narrow className="markdown">
57 <Section narrow className="markdown">
scripts/date_to_string_upgrade.jsnew file+43
@@ -0,0 +1,43 @@
1+const fs = require("fs");
2+const matter = require("gray-matter");
3+const toml = require("@iarna/toml");
4+const path = require("path");
5+const { DateTime } = require("luxon");
6+
7+const dir = path.join(process.cwd(), "../content/media");
8+
9+const options = {
10+ engines: {
11+ toml: {
12+ parse: toml.parse.bind(toml),
13+ stringify: toml.stringify.bind(toml),
14+ },
15+ },
16+ language: "toml",
17+ delimiters: "+++",
18+};
19+
20+fs.readdirSync(dir, { withFileTypes: true })
21+ .filter((f) => f.isFile() && f.name !== "_index.md")
22+ .map((f, i) => {
23+ const fileContents = matter(
24+ fs.readFileSync(path.join(dir, f.name)),
25+ options
26+ );
27+
28+ const newDate = DateTime.fromJSDate(
29+ new Date(fileContents.data.date)
30+ ).toFormat("yyyy-MM-dd");
31+
32+ fileContents.data.date = newDate;
33+
34+ const data = matter.stringify(
35+ fileContents.content,
36+ fileContents.data,
37+ options
38+ );
39+
40+ // console.log(fileContents.data.date)
41+
42+ // fs.writeFileSync(path.join(dir, f.name), data);
43+ });
scripts/event_date_upgrade.jsnew file+51
@@ -0,0 +1,51 @@
1+const fs = require("fs");
2+const matter = require("gray-matter");
3+const toml = require("@iarna/toml");
4+const path = require("path");
5+const { DateTime } = require("luxon");
6+
7+const dir = path.join(process.cwd(), "../content/events");
8+
9+const options = {
10+ engines: {
11+ toml: {
12+ parse: toml.parse.bind(toml),
13+ stringify: toml.stringify.bind(toml),
14+ },
15+ },
16+ language: "toml",
17+ delimiters: "+++",
18+};
19+
20+fs.readdirSync(dir, { withFileTypes: true })
21+ .filter((f) => f.isFile() && f.name !== "_index.md")
22+ .map((f, i) => {
23+ const fileContents = matter(
24+ fs.readFileSync(path.join(dir, f.name)),
25+ options
26+ );
27+ // This uses your default system timezone, so if you are not in 'America/Los_Angeles' the output will be incorrect.
28+ // const starts = DateTime.fromSeconds(fileContents.data.starts).toISO();
29+ // const ends = DateTime.fromSeconds(fileContents.data.ends).toISO();
30+ //
31+ // fileContents.data.date = DateTime.fromISO(fileContents.data.date).plus({
32+ // hours: 12,
33+ // });
34+ // fileContents.data.ends = DateTime.fromISO(fileContents.data.ends).plus({
35+ // hours: 12,
36+ // });
37+
38+ // fileContents.data.guests = fileContents.data.contributors;
39+ // delete fileContents.data.contributors;
40+
41+ fileContents.data.starts = `${fileContents.data.date}`;
42+ delete fileContents.data.date;
43+
44+ const data = matter.stringify(
45+ fileContents.content,
46+ fileContents.data,
47+ options
48+ );
49+
50+ // fs.writeFileSync(path.join(dir, f.name), data);
51+ });
styles/globals.css+8−3
@@ -18,6 +18,11 @@ a {
18 cursor: pointer;
18 cursor: pointer;
19}
19}
20
20
21+b,
22+strong {
23+ @apply font-semibold;
24+}
25+
21p a {
26p a {
22 @apply text-green-400 font-semibold;
27 @apply text-green-400 font-semibold;
23}
28}
@@ -100,7 +105,7 @@ code .type-code {
100}
105}
101
106
102.button-sm {
107.button-sm {
103− @apply flex-center px-2 h-6 rounded-lg type-ui;
108+ @apply flex-center px-3 h-10 rounded-lg type-ui;
104}
109}
105
110
106.button-lg {
111.button-lg {
@@ -108,11 +113,11 @@ code .type-code {
108}
113}
109
114
110.badge-sm {
115.badge-sm {
111− @apply flex-center type-ui-small px-2 lg:px-2 h-6 md:h-10 rounded-full;
116+ @apply flex-center type-ui-small px-4 lg:px-4 h-8 md:h-8 rounded-full;
112}
117}
113
118
114.badge-lg {
119.badge-lg {
115− @apply flex-center type-ui px-4 lg:px-6 h-10 md:h-14 rounded-full;
120+ @apply flex-center type-ui px-4 lg:px-8 h-10 md:h-12 rounded-full;
116}
121}
117
122
118.button-sm:hover,
123.button-sm:hover,