on master help sign in
206 files changed+5786−428
since splitsnapshots
unifiedsplit
.nova/Configuration.json−3 components/CopyLink.js+1−1 components/GrantPreview.js+2−1 components/HighlightCard.js+22 components/ecosystem/BasicPage.js+14 content/applications/~bacwyl-samweg/templeochess.md+1 content/applications/~disreb-winner-mittec/urbit-go.md+1 content/applications/~fabnev-hinmur/escape.md+1−1 content/applications/~finmep-lanteb/chess.md+1−1 content/applications/~hanfel-dovned/board.md+14 content/applications/~hanfel-dovned/pony.md+12 content/applications/~hanfel-dovned/slam.md+1 content/applications/~hanrut-sillet-dachus-tiprel/blog.md+16 content/applications/~larryx-woldyr/osmosis.md+12 content/applications/~larryx-woldyr/safe.md+12 content/applications/~maptyl-lapsyl/uniswap.md → content/applications/~larryx-woldyr/uniswap.md+3−2 content/applications/~larryx-woldyr/urbhue.md+1 content/applications/~lomder-librun/realm.md+18 content/applications/~mister-dister-dozzod-dozzod/bitcoin.md−11 content/applications/~nocsyx-lassul/sphinx.md+1 content/applications/~nodmyn-dosrux/basket.md+34 content/applications/~nodmyn-dosrux/vita.md+20 content/applications/~paldev/scooore.md+14 content/applications/~sogryp-dister-dozzod-dozzod/groups.md+40 content/applications/~sogryp-dister-dozzod-dozzod/talk.md+21 content/applications/~sogryp-dister-dozzod-marzod/groups.md−14 content/applications/~sogryp-dister-dozzod-marzod/talk.md−14 content/applications/~tirrel/scene.md+1−1 content/applications/~tirrel/studio.md+1−1 content/applications/~worpet-bildet/portal.md+16 content/articles/2023-02-20_trailblazing-urbit-startup-makes-earth-shaking-acquisition.md+10 content/articles/2023-05-10_urbit-a-network-older-and-weirder-than-bitcoin.md+10 content/blog/aesthetic-culture-1.md+1−1 content/blog/ares.md+51 content/blog/foss-1.md+64 content/blog/foss-2.md+59 content/blog/hoon-4-lispers.md+764 content/blog/pin-the-face-that-launches-a-thousand-ships.md+146 content/blog/using-urbit-in-2023.md+55 content/campus/_index.md+37 content/campus/blockchain-enthusiasts.md+35 content/campus/creatives.md+21 content/communities/urbit-christchurch.md+1−1 content/communities/urbit-london.md+1−1 content/communities/urbit-mst.md+13 content/communities/urbit-paris.md+23 content/ecosystem/spotlight/2023-february.md+48 content/ecosystem/spotlight/2023-june.md+40 content/ecosystem/spotlight/2023-may.md+50 content/events/2023-02-23-urbit-meetup-berlin.md+27 content/events/2023-03-25-urbit-meetup-christchurch.md+21 content/events/2023-04-18-urbit-lisbon.md+19 content/events/2023-04-27-urbit-meetup-berlin.md+27 content/events/2023-04-27_urbit-austin-meetup-consensus.md+16 content/events/2023-05-10_urbit-meetup-berlin.md+25 content/events/2023-05-14_urbit-meetup-london.md+23 content/events/2023-05-18_urbit-denver-meetup.md+19 content/events/2023-05-18_urbit-miami-meetup.md+20 content/events/2023-05-27_urbit-meetup-london.md+21 content/events/2023-05-27_urbit-meetup-mst.md+20 content/events/2023-06-03-urbit-meetup-christchurch.md+24 content/events/2023-06-08_urbit-meetup-berlin.md+25 content/events/2023-06-08_urbit-meetup-prague.md+39 content/events/2023-06-12-developer-week.md+95 content/events/2023-06-15_urbit-denver-meetup.md+19 content/events/2023-06-24-urbit-meetup-christchurch.md+24 content/events/2023-06-29-Urbit-Paris-Meetup-1.md+30 content/events/2023-07-01_urbit-meetup-mst.md+23 content/events/2023-07-20-Urbit-Paris-Meetup-ethcc.md+53 content/events/2023-08-16_reassembly.md+22 content/events/2023-10-28_urbit-assembly-lisboa.md+24 content/getting-started/cloud-hosting.md+2−2 content/getting-started/getting-around.md+4−4 content/getting-started/hosting-providers.md+7−9 content/getting-started/installing-applications.md+3−3 content/getting-started/interfaces.md+2−2 content/getting-started/joining-groups.md+2−2 content/grants/2021/clojure-urbit-client.md+1−1 content/grants/2021/ra-debugging-tools.md+3−3 content/grants/2022/abacus.md+1−1 content/grants/2022/app-engram.md+1−1 content/grants/2022/calendar-holium.md+1 content/grants/2022/chess-bounty.md+3−1 content/grants/2022/community-meetups.md−43 content/grants/2022/cue.md+1−1 content/grants/2022/desk-import-export.md+1−1 content/grants/2022/digital-storefront.md+2−2 content/grants/2022/eth-wallet.md+1 content/grants/2022/hoon-eval.md+1−1 content/grants/2022/lexicon.md+1−1 content/grants/2022/loom-pointer-compression.md+1−1 content/grants/2022/membrane.md+1−1 content/grants/2022/middleware-apprentice.md+1−1 content/grants/2022/pony-bounty.md+1−1 content/grants/2022/regex-library.md+1−1 content/grants/2022/seguro-phase-2.md+1−1 content/grants/2022/smart-lightbulb-controller.md+1−1 content/grants/2022/trove.md+1−1 content/grants/2022/urbit-interface-framework.md+69−60 content/grants/2022/whom.md+3−5 content/grants/2023/aera.md+50 content/grants/2023/app-metrics.md+74 content/grants/2023/blog-updates.md+64 content/grants/2023/bridge-grab-bag.md+35 content/grants/2023/community-meetups.md+37 content/grants/2023/did-rfp.md+26 content/grants/2023/elm.md+68 content/grants/2023/email-stella-fixa-rfp.md+29 content/grants/2023/eyre-noun-channels.md+2−2 content/grants/2023/generator-doccords.md+1−1 content/grants/2023/gh-concierge.md+42 content/grants/2023/git-on-clay.md+42 content/grants/2023/goals-2.md+64 content/grants/2023/hoon-linter.md+30 content/grants/2023/hoon-replit.md+45 content/grants/2023/issue-grab-bag.md+36 content/grants/2023/json-parser-suite.md+170 content/grants/2023/kNock-property-testing.md+71 content/grants/2023/lick.md+82 content/grants/2023/mapping-ids.md+106 content/grants/2023/network-weather.md+24 content/grants/2023/oauth2-stella-fixa-rfp.md+31 content/grants/2023/osmosis-client.md+48 content/grants/2023/pastebin-RFP.md+28 content/grants/2023/pastebin-proposal.md+33 content/grants/2023/portal-features-1.md+82 content/grants/2023/privacy-msg.md+89 content/grants/2023/quorum-2.md+84 content/grants/2023/replit.md+52 content/grants/2023/school-support-23q1.md+4−1 content/grants/2023/splitwise-rfp.md+26 content/grants/2023/splitwise.md+129 content/grants/2023/text-search.md+24 content/grants/2023/tinygrad.md+24 content/grants/2023/treesitter.md+71 content/grants/2023/turf.md+205 content/grants/2023/uc-concierge.md+42 content/grants/2023/update-mass.md+26 content/grants/2023/urbit-ninja-strike-team.md+38 content/grants/2023/urbit-react-docs.md+124 content/grants/2023/vere-eyre-cache.md+38 content/grants/2023/wiki-stella-fixa-rfp.md+26 content/groups/~dibref-labter/arbit.md+9 content/highlights/highlight-1.md+6 content/highlights/highlight-2.md+6 content/highlights/highlight-3.md+6 content/ids/bintud-bitnev.md+8 content/ids/botbyn-dolrum.md+7 content/ids/datsyr-radser.md+12 content/ids/dopbet-larped.md+7 content/ids/finmep-lanteb.md+8−5 content/ids/hocmed-lidrev.md+8 content/ids/monnys-riphet.md+7 content/ids/tobrun-tomnet.md+8 content/organizations/assemblycapital.md+1 content/organizations/dalten.md+1 content/organizations/holium.md+3−2 content/organizations/labyrinthdao.md+10 content/organizations/mars-review-of-books.md+1 content/organizations/nativeplanet.md+4−3 content/organizations/quartus.md+1 content/organizations/sortug.md+1 content/organizations/third-earth.md+1 content/organizations/tirrel.md+1 content/organizations/tlon.md+2−1 content/organizations/uqbar.md+1 content/organizations/urbit-foundation.md+1 content/organizations/zorp.md+10 content/overview/people-history.md+36−31 content/podcasts/2022-10-06_urbit-maxi-episode.md → content/podcasts/2022-10-06_urbit-maxi-episode copy.md content/podcasts/2022-12-22_epicenter-ted-blackman-gary-lieberman.md+11 content/podcasts/2023-01-05_lets-get-personal.md+9 content/podcasts/2023-01-19_crypto-metaphysics.md+9 content/podcasts/2023-01-24_reject-triviality.md+13 content/podcasts/2023-01-26_building-future-states-with-nation3.md+9 content/podcasts/2023-01-29_urbit-for-idiots.md+11 content/podcasts/2023-02-09_crypto-narratives-new-and-old.md+9 content/podcasts/2023-02-13_distributed-networked-computing.md+17 content/podcasts/2023-02-23_the-urbit-episode.md+9 content/podcasts/2023-03-09_reclaiming-web-1.md+9 content/podcasts/2023-03-23_how-to-invest-in-web3-like-a-cool-kid.md+9 content/podcasts/2023-03-28_pupusas-volcanoes-and-databases.md+9 content/podcasts/2023-04-03_legacy-internet-new-internet.md+15 content/podcasts/2023-04-06_the-ai-episode.md+9 content/podcasts/2023-04-11_its-urbits-all-the-way-down-with-dachus-tiprel.md+9 content/podcasts/2023-04-14_epicenter-tim-galebach.md+11 content/podcasts/2023-04-20_artificial-qintelligence.md+9 content/podcasts/2023-04-27_hoon-only-legal-ui-with-hastuc-dibtux.md+11 content/podcasts/2023-05-11_full-metal-urbit-with-mopfel-winrux.md+15 content/podcasts/2023-05-18_crypto-takes-flight.md+11 content/privacy.md+1−1 content/rfps.md+40 content/updates/2018-7-30-update.md+1−1 content/updates/2019-2-11-update.md+1−1 package-lock.json+7−7 package.json+3−2 pages/campus/[[...slug]].js+312 pages/grants.js+70−52 pages/grants/[slug].js+67−50 pages/grants/apprenticeships.js+1−1 pages/grants/rfps.js+29 pages/groups/[[...group]].js+1−1 pages/ids/[id].js+1−1 pages/index.js+92−59 pages/organizations/[slug].js+2−1 vercel.json+14−1
.nova/Configuration.jsondeleted−3
@@ -1,3 +0,0 @@
1−{
2− "workspace.name": "urbit.org"
3−}
components/CopyLink.js+1−1
@@ -53,7 +53,7 @@ export default function CopyLink({ content, className }) {
5353 onClick={() => copy()}
5454 >
5555 <p className="leading-5">
56− {copyStatus === "copied" ? "Copied" : "Copy Link"}
56+ {copyStatus === "copied" ? "Copied" : "Shortcode"}
5757 </p>
5858 {buttonIcon}
5959 </button>
components/GrantPreview.js+2−1
@@ -8,7 +8,7 @@ export default function GrantPreview({ grant }) {
88
99 const className = classnames({
1010 "bg-lightBlue": type.includes("Proposal") && isOpen,
11− "bg-green-200": type.includes("Apprenticeship") && isOpen,
11+ "bg-purple-200": type.includes("RFP") && isOpen,
1212 "bg-yellow-100": type.includes("Bounty") && isOpen,
1313 });
1414
@@ -38,6 +38,7 @@ export default function GrantPreview({ grant }) {
3838 {grant.taxonomies.grant_type.map((category) => {
3939 const className = classnames({
4040 "bg-blue-400 text-white": category === "Proposal",
41+ "bg-purple text-white": category === "RFP",
4142 "bg-green-400 text-white": category === "Apprenticeship",
4243 "bg-yellow-300": category === "Bounty",
4344 });
components/HighlightCard.jsnew file+22
@@ -0,0 +1,22 @@
1+import Link from "next/link";
2+export default function HighlightCard({ slug, highlight }) {
3+ return (
4+ <Link href={highlight.url}>
5+ <div className="cursor-pointer bg-wall-100 rounded-xl min-h-0 flex-1">
6+ <div className="flex flex-col p-4 h-full relative">
7+ {highlight.image ? (
8+ <div className="w-64 md:w-full rounded-xl object-cover overflow-hidden basis-3/5">
9+ <img className="h-full w-64 md:w-full object-cover" src={highlight.image} />
10+ </div>
11+ ) : (
12+ <div className="rounded-xl w-full"/>
13+ )}
14+ <div className="pt-4">
15+ <p className="mb-2 font-semibold leading-5">{highlight.title}</p>
16+ <p className="text-sm leading-5">{highlight?.description}</p>
17+ </div>
18+ </div>
19+ </div>
20+ </Link>
21+ );
22+}
components/ecosystem/BasicPage.js+14
@@ -1,5 +1,6 @@
11import { useRouter } from "next/router";
22import Head from "next/head";
3+import Link from "next/link";
34import Meta from "../Meta";
45import ErrorPage from "../../pages/404";
56import classnames from "classnames";
@@ -79,6 +80,16 @@ export default function BasicPage({
7980 />
8081 )}
8182
83+ {post?.twitter && (
84+ <div className="flex flex-col">
85+ <p className="font-bold text-wall-400">Twitter</p>
86+ <Link href={"http://twitter.com/" + post.twitter}>
87+ <a className="text-green-400 text-sm font-semibold font-mono">@{post.twitter}</a>
88+ </Link>
89+ </div>
90+ )}
91+
92+
8293 {post?.URL && section !== "Podcast" && section !== "Article" && (
8394 <div className="flex flex-col">
8495 <p className="font-bold text-wall-400">Website</p>
@@ -100,6 +111,9 @@ export default function BasicPage({
100111 </div>
101112 )}
102113 </div>
114+
115+
116+
103117 {post?.URL && section === "Podcast" && (
104118 <a
105119 href={post.URL}
content/applications/~bacwyl-samweg/templeochess.md+1
@@ -6,6 +6,7 @@ image = "https://0x0.st/oFuT.png"
66bgColor = "#FFFF55"
77developer = "~bacwyl-samweg"
88website = "https://youtu.be/Raej8C2yIEc"
9+description = "chess game from Temple OS"
910+++
1011
1112### Chess from Temple OS
content/applications/~disreb-winner-mittec/urbit-go.md+1
@@ -6,6 +6,7 @@ image = "https://winnermittec.space/icon.svg"
66bgColor = "#D37504"
77developer = "~winner-mittec"
88website = "https://winnermittec.space/"
9+description = "Go on Urbit"
910+++
1011
1112The classic board-game Go, now on Urbit!
content/applications/~fabnev-hinmur/escape.md+1−1
@@ -6,7 +6,7 @@ description = "EScape from Eternal September. The UI from Uqbar."
66license = "MIT"
77website = "https://uqbar.network"
88bgColor = "#f2f3ef"
9−image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/uqbar.png"
9+image = "https://escape-app-dist.s3.us-east-2.amazonaws.com/escape-logo.png"
1010+++
1111
1212EScape is a fully-integrated social management and DAO Tooling system. EScape provides a simple, intuitive, and unified interface for managing groups, messaging ships, receiving notifications, and interacting with other Urbit apps.
content/applications/~finmep-lanteb/chess.md+1−1
@@ -11,4 +11,4 @@ image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/applicati
1111
1212Fully decentralized, peer-to-peer Chess app for Urbit
1313
14−![chess example](https://raw.githubusercontent.com/ashelkovnykov/urbit-chess/master/images/urbit-chess-demo.png)
14+![chess example](https://raw.githubusercontent.com/thecommons-urbit/chess/master/images/urbit-chess-demo.png)
content/applications/~hanfel-dovned/board.mdnew file+14
@@ -0,0 +1,14 @@
1++++
2+title = "Board"
3+shortcode = "~dister-hanfel-dovned/board"
4+license = "MIT"
5+image = ""
6+bgColor = "#9E34EB"
7+developer = "~hanfel-dovned"
8+website = "https://github.com/hanfel-dovned/Board"
9+description = "A digital bulletin-board"
10++++
11+
12+An implementation of [Robin Sloan’s Spring ‘83](https://www.robinsloan.com/lab/specifying-spring-83/) concept as an Urbit app called %board. Imagine a digital bulletin-board where each item is a person’s miniature homepage, and the pages you see are based on who you know.
13+
14+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/board.png)
content/applications/~hanfel-dovned/pony.mdnew file+12
@@ -0,0 +1,12 @@
1++++
2+title = "Pony"
3+shortcode = "~dister-hanfel-dovned/pony"
4+license = "MIT"
5+image = ""
6+bgColor = "#232323"
7+developer = "~hanfel-dovned"
8+website = "https://github.com/hanfel-dovned/Pony"
9+description = "Pony is an app for longform threaded conversations"
10++++
11+
12+Pony is an app for longform threaded conversations, like a blend of email and message boards. Create private threads with arbitrary sets of ships, fork threads to new sets of participants, schedule messages to be sent later, and much more.
content/applications/~hanfel-dovned/slam.md+1
@@ -6,6 +6,7 @@ image = "https://hanfel-dovned.sfo3.digitaloceanspaces.com/slam-tile.png"
66bgColor = "#100032"
77developer = "~hanfel-dovned"
88website = "https://github.com/hanfel-dovned/Slam"
9+description = "A social arcade game"
910+++
1011
1112Slam is a social arcade game where you battle waves of enemies that are generated from your pals' gorae.
content/applications/~hanrut-sillet-dachus-tiprel/blog.mdnew file+16
@@ -0,0 +1,16 @@
1++++
2+title = "%blog"
3+shortcode = "~hanrut-sillet-dachus-tiprel/blog"
4+license = "MIT"
5+image = ""
6+bgColor = "#533E78"
7+developer = "~dachus-tiprel"
8+website = "https://dachus-tiprel.tlon.network/blog/introducing-blog"
9+description = "The easiest and most versatile publishing app on Urbit"
10++++
11+
12+A publishing tool for creating a basic blog with markdown and css.
13+
14+Blog is just what it sounds like. A new tool from Uqbar, the app lets anyone on Urbit spin up and customize a blog that displays to the net at an auto-generated URL. Nothing could be breezier. Plus it’s got payments through Uqbar and group-blogging settings on the roadmap. Find out more about it on it's [creator's blog](https://dachus-tiprel.tlon.network/blog/introducing-blog).
15+
16+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/blog.png)
content/applications/~larryx-woldyr/osmosis.mdnew file+12
@@ -0,0 +1,12 @@
1++++
2+title = "Osmosis"
3+shortcode = "~larryx-woldyr/osmosis"
4+license = "MIT"
5+image = "https://holium-app-globs.nyc3.cdn.digitaloceanspaces.com/osmosis/osmosis-logo-wc.png"
6+bgColor = "#180D39"
7+developer = "~larryx-woldyr"
8+website = "https://https://osmosis.zone/"
9+description = "Interchain liquidity lab."
10++++
11+
12+A fully self-hosted Osmosis frontend, deployed via Urbit.
content/applications/~larryx-woldyr/safe.mdnew file+12
@@ -0,0 +1,12 @@
1++++
2+title = "Safe"
3+shortcode = "~larryx-woldyr/safe"
4+license = "MIT"
5+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/safe.jpeg"
6+bgColor = "#180D39"
7+developer = "~larryx-woldyr"
8+website = "https://safe.global/"
9+description = "Safe front-end"
10++++
11+
12+A fully self-hosted Safe frontend, deployed via Urbit.
content/applications/~maptyl-lapsyl/uniswap.md → content/applications/~larryx-woldyr/uniswap.mdrenamed+3−2
@@ -1,11 +1,12 @@
11+++
22title = "Uniswap"
3−shortcode = "~maptyl-lapsyl/uniswap"
3+shortcode = "~larryx-woldyr/uniswap-v3"
44license = "MIT"
55image = "https://cryptologos.cc/logos/uniswap-uni-logo.png"
66bgColor = "0xffffff"
7−developer = "~maptyl-lapsyl"
7+developer = "~larryx-woldyr"
88website = "http://uniswap.org"
9+description = "Self-hosted Uniswap interface"
910+++
1011
1112A self-hosted Uniswap interface for swapping assets on Ethereum.
content/applications/~larryx-woldyr/urbhue.md+1
@@ -6,6 +6,7 @@ image = "https://i.imgur.com/czmkmoK.png"
66bgColor = "#F0B43D"
77developer = "~larryx-woldyr"
88website = "https://ajlamarc.com"
9+description = "Controlling Philips Hue"
910+++
1011
1112In this prototype, Philips Hue Lightbulbs and groups can be controlled from a standard Urbit application by using the Hue Remote API.
content/applications/~lomder-librun/realm.mdnew file+18
@@ -0,0 +1,18 @@
1++++
2+title = "Realm"
3+shortcode = "~lomdyr-librun/realm"
4+license = ""
5+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/realm-icon.png"
6+bgColor = ""
7+developer = "Holium"
8+website = "https://www.holium.com/"
9+description = "A desktop interface for Urbit"
10++++
11+
12+Realm is a desktop app for Urbit communities (currently in private alpha).
13+
14+[Sign up for the alpha.](https://www.holium.com/)
15+
16+<iframe width="560" height="315" src="https://www.youtube.com/embed/gdu4QtFR-Bs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
17+
18+Note that the shortcode will not install this application.
content/applications/~mister-dister-dozzod-dozzod/bitcoin.mddeleted−11
@@ -1,11 +0,0 @@
1−+++
2−title = "Bitcoin"
3−shortcode = "~mister-dister-dozzod-dozzod"
4−license = "MIT"
5−image = "https://urbit.ewr1.vultrobjects.com/hastuc-dibtux/2021.8.24..02.57.38-bitcoin.svg"
6−bgColor = "#EB9452"
7−developer = "~zod"
8−website = "https://tlon.io"
9−+++
10−
11−Urbit's Bitcoin wallet enables your ship to connect to a `%btc-provider` for easier selection of a trusted full node and then helps construct a bitcoin transaction to an urbit ship without needing to deal with remembering or directly exchanging public addresses.
content/applications/~nocsyx-lassul/sphinx.md+1
@@ -6,6 +6,7 @@ image = "https://nyc3.digitaloceanspaces.com/hmillerdev/nocsyx-lassul/2022.7.16.
66bgColor = "#b25068"
77developer = "~nocsyx-lassul"
88website = "https://github.com/arthyn/sphinx"
9+description = "Community powered search"
910+++
1011
1112### Community powered search
content/applications/~nodmyn-dosrux/basket.mdnew file+34
@@ -0,0 +1,34 @@
1++++
2+title = "basket"
3+shortcode = "~nodmyn-dosrux/basket"
4+license = "MIT"
5+image = "https://0x0.st/oFHB.png"
6+bgColor = "#F2F2F2"
7+developer = "Assembly Capital"
8+website = "https://github.com/bacwyls/basket"
9+description = "show off your meme collection"
10++++
11+
12+
13+### Basket is a simple db of tagged images
14+
15+The frontend displays the most recent image in the full window,
16+so it can be used to add some personal style to an urbit desktop environment.
17+
18+In addition to being a personal db, basket is an experimental app on top of the 'rooms' primitive in [Realm](https://twitter.com/HoliumCorp).
19+
20+Members of a room have temporary write-access to each others basket db.
21+The frontend makes it ergonomic and fun to share / collaboritively create this data.
22+
23+In theory (at scale), this creates a kind of decentralized giphy.
24+
25+The images you know about are the images your friends have shared with you.
26+It gamifies the creation of rich, human curated image metadata.
27+One obvious use case for this is keeping track of memes.
28+
29+To export the full dataset you can GET `http://yoururbitship.com/~/scry/basket/images.json`
30+Then you might want to use a python script to actually download the images to local storage.
31+
32+Eventually, it would be nice to have a simple way to export and share the dataset.
33+
34+Read full documentation on the [Github repository](https://github.com/bacwyls/basket).
content/applications/~nodmyn-dosrux/vita.mdnew file+20
@@ -0,0 +1,20 @@
1++++
2+title = "vita"
3+shortcode = "~nodmyn-dosrux/vita"
4+license = "MIT"
5+image = "https://bwyl.nyc3.digitaloceanspaces.com/vita%2Fvita.png"
6+bgColor = "#F2F2F2"
7+developer = "Assembly Capital"
8+website = "https://github.com/assemblycapital/vita"
9+description = "monitor your app distributions"
10++++
11+
12+### Keep track of your app distributions
13+
14+To get downloads, `:vita` periodically scrys %cs /subs for each desk and caches the results.
15+
16+`:vita` accepts foreign pokes attesting to activity on a desk.
17+`/lib/vita-client.hoon` helps any agent send vita activity pokes.
18+It sends a maximum of one poke per day, and allows users to opt-in / opt-out depending on developer preference.
19+
20+Read full documentation on the [Github repository](https://github.com/assemblycapital/vita).
content/applications/~paldev/scooore.mdnew file+14
@@ -0,0 +1,14 @@
1++++
2+title = "sc'o're"
3+developer = "~paldev"
4+shortcode = "~paldev/scooore"
5+description = "leaderboard for groups' ['o']s, as seen on tv!"
6+license = "MIT"
7+image ="https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/scooore.svg"
8+website = "https://pal.dev/suite/scooore"
9+bgColor = "#FDFF54"
10++++
11+
12+A leaderboard of your peers' emoji reactions in Groups.
13+
14+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/scooore.png)
content/applications/~sogryp-dister-dozzod-dozzod/groups.mdnew file+40
@@ -0,0 +1,40 @@
1++++
2+title = "Groups"
3+shortcode = "~sogryp-dister-dozzod-dozzod/groups"
4+license = "MIT"
5+image = "https://bootstrap.urbit.org/icon-groups.svg"
6+bgColor = "#EFF0F4"
7+developer = "Tlon"
8+website = "https://github.com/tloncorp/landscape-apps"
9+description = "Groups is a decentralized platform that integrates with Talk, Notebook, and Gallery for a full, communal suite of tools."
10++++
11+
12+Start, host, and cultivate communities. Own your communications, organize your resources, and share documents. Groups is a decentralized platform that integrates with Talk, Notebook, and Gallery for a full, communal suite of tools.
13+
14+ <video autoPlay muted loop playsInline>
15+ <source
16+ src="https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/groups-create-a-group.webm"
17+ type="video/webm"
18+ />
19+ </video>
20+
21+Teams, clubs, DAOs, and secret societies use Groups to digitally congregate, using channel integrations to extend their capabilities.
22+
23+ <video autoPlay muted loop playsInline>
24+ <source
25+ src="https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/groups-create-a-channel.webm"
26+ type="video/webm"
27+ />
28+ </video>
29+
30+Write, edit, and publish longform or shorter documents with Notebook, a basic text editor for announcements, internal meeting minutes, blogs, and everything in between.
31+
32+ <video autoPlay muted loop playsInline>
33+ <source
34+ src="https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/notebooks.webm"
35+ type="video/webm"
36+ />
37+ </video>
38+
39+
40+Gather links to images, articles, and web pages to maintain a collection of references with Gallery, a versatile and interoperable repository for day-to-day digital trawling.
content/applications/~sogryp-dister-dozzod-dozzod/talk.mdnew file+21
@@ -0,0 +1,21 @@
1++++
2+title = "Talk"
3+shortcode = "~sogryp-dister-dozzod-dozzod/talk"
4+license = "MIT"
5+image = "https://bootstrap.urbit.org/icon-talk.svg"
6+bgColor = "#2B5DC0"
7+developer = "Tlon"
8+website = "https://github.com/tloncorp/landscape-apps"
9+description = "Talk is a decentralized chat app that integrates with Groups, Notebook, and Gallery for a full, communal suite of tools."
10++++
11+
12+Send peer-to-peer direct messages to one or many friends. Talk is a simple chat tool for catching up, getting work done, and everything in between.
13+
14+ <video autoPlay muted loop playsInline>
15+ <source
16+ src="https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/talk.webm"
17+ type="video/webm"
18+ />
19+ </video>
20+
21+Start threads. React with emojis. Respond to your Groups chat channels from Talk. When integrated with Groups, both direct messages and team chats appear in Talk. Two apps in one place.
content/applications/~sogryp-dister-dozzod-marzod/groups.mddeleted−14
@@ -1,14 +0,0 @@
1−+++
2−title = "Groups"
3−shortcode = "~sogryp-dister-dozzod-dozzod/groups"
4−license = "MIT"
5−image = "https://bootstrap.urbit.org/icon-groups.svg"
6−bgColor = "#EFF0F4"
7−developer = "Tlon"
8−website = "https://github.com/tloncorp/landscape-apps"
9−description = "Groups is a decentralized platform that integrates with Talk, Notebook, and Gallery for a full, communal suite of tools."
10−+++
11−
12−Start, host, and cultivate communities. Own your communications, organize your resources, and share documents. Groups is a decentralized platform that integrates with Talk, Notebook, and Gallery for a full, communal suite of tools.
13−
14−![](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/groups-screenshot.png)
content/applications/~sogryp-dister-dozzod-marzod/talk.mddeleted−14
@@ -1,14 +0,0 @@
1−+++
2−title = "Talk"
3−shortcode = "~sogryp-dister-dozzod-dozzod/talk"
4−license = "MIT"
5−image = "https://bootstrap.urbit.org/icon-talk.svg"
6−bgColor = "#2B5DC0"
7−developer = "Tlon"
8−website = "https://github.com/tloncorp/landscape-apps"
9−description = "Talk is a decentralized chat app that integrates with Groups, Notebook, and Gallery for a full, communal suite of tools."
10−+++
11−
12−Send encrypted direct messages to one or many friends. Talk is a simple chat tool for catching up, getting work done, and everything in between.
13−
14−![](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/talk-screenshot.png)
content/applications/~tirrel/scene.md+1−1
@@ -1,7 +1,7 @@
11+++
22title = "Scene"
33shortcode = ""
4−license = "MIT"
4+license = ""
55image = "https://tirrel.io/assets/scene-logo-stroke.svg"
66bgColor = "rgb(0, 0, 0)"
77developer = "Tirrel Corp."
content/applications/~tirrel/studio.md+1−1
@@ -1,7 +1,7 @@
11+++
22title = "Studio"
33shortcode = "~tirrel/studio"
4−license = "MIT"
4+license = ""
55image = "https://tirrel.io/assets/stool.svg"
66bgColor = "rgb(160, 226, 167)"
77developer = "Tirrel Corp."
content/applications/~worpet-bildet/portal.mdnew file+16
@@ -0,0 +1,16 @@
1++++
2+title = "Portal"
3+shortcode = "~worpet-bildet/portal"
4+license = ""
5+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/portal.svg"
6+bgColor = "rgb(0,0,0)"
7+developer = ""
8+website = ""
9+description = "Portal is the front page"
10++++
11+
12+### Portal is the front page for urbit
13+
14+Portal made its debut as the solution to decentralized discovery on Urbit. Portal enables anyone on Urbit to curate content, apps, and groups for other ships to discover
15+
16+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/portal-screenshot.png)
content/articles/2023-02-20_trailblazing-urbit-startup-makes-earth-shaking-acquisition.mdnew file+10
@@ -0,0 +1,10 @@
1++++
2+title = "Trailblazing Urbit Startup Makes Earth Shaking Acquisition"
3+publication = "Globe Newswire"
4+author = "Globe Newswire"
5+date = "2023-02-20"
6+URL = "https://www.globenewswire.com/en/news-release/2023/02/20/2611391/0/en/Trailblazing-Urbit-Startup-Makes-Earth-Shaking-Acquisition.html"
7+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/articles/globe-newswire.jpeg"
8++++
9+
10+Holium Corp closes $2.9 million in seed funding and acquires Third Earth in record pace.
content/articles/2023-05-10_urbit-a-network-older-and-weirder-than-bitcoin.mdnew file+10
@@ -0,0 +1,10 @@
1++++
2+title = "Urbit, a Network Older and Weirder Than Bitcoin, Finally Turns Toward Growth"
3+publication = "Coindesk"
4+author = "Bradley Keoun"
5+date = "2023-05-10"
6+URL = "https://www.coindesk.com/tech/2023/05/10/urbit-a-network-older-and-weirder-than-bitcoin-finally-turns-toward-growth/"
7+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/articles/coindesk.jpg"
8++++
9+
10+The peer-to-peer network started in 2002 says it's taking on "MEGACORP," much in the same vein as many blockchain networks. A bit more fun are the "secret code names" that users are assigned.
content/blog/aesthetic-culture-1.md+1−1
@@ -5,7 +5,7 @@ date = "2020-11-11"
55
66[extra]
77description = "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)."
8−author = "Nikolai Mallett"
8+author = "~nartes-fasrum"
99ship = "~nartes-fasrum"
1010image = "https://media.urbit.org/site/posts/essays/help-the-environment.jpg"
1111+++
content/blog/ares.mdnew file+51
@@ -0,0 +1,51 @@
1++++
2+title = "Ares"
3+date = "2023-06-26"
4+description = "A light technical description of Ares, the new Urbit runtime"
5+
6+[extra]
7+author = "Noah Kumin"
8+ship = "~librex-dozryc"
9+image = "https://storage.googleapis.com/media.urbit.org/blog/ares-header.png"
10++++
11+
12+![Image](https://storage.googleapis.com/media.urbit.org/blog/ares-header.png)
13+
14+## What is Ares?
15+
16+Ares is a new Urbit runtime that will be much faster and manage a much larger amount of data than previous versions of the runtime. Those new to Urbit commonly ask if they will be able to host photos and videos on their Urbit ships. Ares—a joint project from the Urbit Foundation, Tlon, and Zorp—sets the stage for us to be able to answer, simply, “Yes.” Ares is still a work in progress, but we expect to see the new binaries rolled out later this year. There are three components to the project. Let’s talk about them one by one.
17+
18+## 1. Code Generation
19+
20+Modern CPUs are extraordinarily fast. But until now your Urbit hasn’t been able to take full advantage of this fact. One way to conceptualize the problem is to imagine a train that is only able to go as fast as a track-worker can lay down track for it. In this analogy, your CPU is the train, and the track-worker is the Urbit runtime. The aim is to have large sections of track laid down ahead of time. Ares includes a codegen system that compiles Nock, Urbit’s assembly language, to machine code that the CPU can predict well.
21+
22+This system addresses what has until now been a problem: Nock is meant to invoke other code in a given Urbit computer’s “subject.” Or, in more common parlance, in the computer’s “state.” Your state changes with every new message your Urbit computer sends and receives, or with any new event in any app. That makes it hard to make the resulting machine code run fast, since the CPU needs to read from the subject while it’s running in order to figure out what machine code will be run next.
23+
24+The new code generation process in Ares solves this problem by using a system which the developers have called “subject knowledge analysis.” What does this mean? By analyzing how an Urbit subject might change over the course of a Nock computation, Ares will learn about the subject's tree shape and about its data dependencies (*i.e.*, the way that later parts of the computation depend on earlier parts of the computation). This allows those parts of the subject which are known at the time of compiling Nock to machine code to remain known at later points in the computation.
25+
26+To go back to our metaphor of train tracks, this is what allows the “track” to be laid down ahead of time. This set of known parts of the subject typically includes Nock formulas stored in [cores](https://developers.urbit.org/guides/core/hoon-school/F-cores#cores). This allows the resulting machine code to use direct jumps to perform Nock function calls. Without this “subject knowledge analysis,” the CPU would have had to perform an “indirect jump” by calculating the location to which a later instruction would jump. Now your computer’s CPU can jump directly to where it’s supposed to go.
27+
28+## 2. 2stackz Noun Allocator
29+
30+Ares will make use of what we’re calling the *2stackz noun allocator*. With the advent of Ares, your Urbit will be a virtual machine with two stacks and no heap. What does this mean? Traditionally, a program has a *stack* and a *heap*. The stack is a linear data structure within a program used for the program’s execution. The heap is a less structured region of memory that is used for storing large pieces of data or data that you want to keep around for a while without taking up space in the stack. However, the heap is slower, because its system for allocating memory is less orderly. (Imagine, say, trying to find a specific pair of socks in a heap of clothing.)
31+
32+Ares recognizes that because Nock is much more constrained than most languages, the Urbit runtime doesn’t actually need a heap. Instead you can take the function call stack and split it in two. The top of either stack can then be used as a little temporary heap. Whenever a function executes, you copy the data that gets returned from one stack to the other. And all the intermediate products that get created when running that function (*i.e.*, other functions that got called by the initial function) sit there as *garbage* (unwanted or unused data) in between the two stacks. But you don’t have to do the same sort of bookkeeping—tracking and updating these values—that you would have to do with a heap.
33+
34+Every piece of data in your Urbit computer is a noun. A noun is an atom (a positive integer or zero) or a cell (a pair of nouns). Before Ares, both allocating and freeing a noun in the Urbit runtime were processes that took a lot of time. (To *allocate* a noun is to put that noun in memory and to *free* it is to tell your urbit that you don’t need it any more.) Ares should make both of these processes much faster. This is good news because the Urbit runtime allocates nouns (particularly pairs of nouns, known as cells) like nobody’s business.
35+
36+## 3. Persistent Memory Arena
37+
38+Ares’s Persistent Memory Arena is for managing large amounts of data within your urbit in such a way that your urbit does not get slow. If you have terabytes of data within your Urbit, you can only have a very small subset of that within your hardware’s RAM at a given time. The rest of that data is going to have to live on disk—the section of your hardware that is more capacious but takes more time to access.
39+
40+To deal with this fact, your motherboard moves data back and forth between RAM and disk depending on what data needs to be accessed at a given time. This is known as *paging*, because it does so one *page* (usually four kilobytes) at a time. Traditionally operating systems will handle paging for you, but they do it in a generic way. The Persistent Memory Arena is designed specifically for managing Urbit's single-level store.
41+
42+A *single-level store* means that there’s no distinction in the operating system between data that lives in RAM and data that lives on disk. Instead of having two levels from which you can access data, you only have one, and the system itself manages which parts of the data are in RAM and which are in disk. The Persistent Memory Arena is an optimization for handling a large amount of data in a single level store. It is for nouns that persist between computations. Using the PMA, your urbit’s state can grow large without being hemmed in by the limitations of your hardware’s RAM.
43+
44+
45+## Updates and Links
46+
47+You can find the Ares GitHub repository [here](https://github.com/urbit/ares). The technical proposal is [here](https://github.com/urbit/ares/blob/status/docs/proposal/proposal-nock-performance.md). Check back at the Urbit Google Groups [listserv](https://groups.google.com/a/urbit.org/g/dev/), the [@zodisok](https://twitter.com/zodisok) Twitter account, and the Urbit Foundation [group](https://tlon.network/lure/~halbex-palheb/uf-public) for updates about the upcoming release.
48+
49+–
50+
51+*Noah Kumin is the founder and editor in chief of the [Mars Review of Books](https://marsreview.org/).*
content/blog/foss-1.mdnew file+64
@@ -0,0 +1,64 @@
1++++
2+title = "Urbit's Open Source Culture, Part I"
3+date = "2023-05-31"
4+description = "How did Urbit cultivate a unique open source software culture? Let's take a look at how we got to where we are today."
5+
6+[extra]
7+author = "N E Davis"
8+ship = "~lagrev-nocfep"
9+image = "https://upload.wikimedia.org/wikipedia/commons/a/a9/SR71_factoryfloor_SkunkWorks.jpg"
10++++
11+
12+![](https://upload.wikimedia.org/wikipedia/commons/a/a9/SR71_factoryfloor_SkunkWorks.jpg)
13+
14+> “Open source is an intellectual property destroyer. I can't imagine something that could be worse than this for the software business and the intellectual-property business.” (Jim Allchin, Microsoft executive)
15+
16+A founder's personal enquiry into the foundations of practical computing grew into a skunkworks startup to build an alternative basis for principled computing, and has now evolved into a burgeoning open source platform and community.
17+
18+- [Moron Lab, “Maxwell's equations of software (Nock)” (~2010.1.9)](https://moronlab.blogspot.com/2010/01/nock-maxwells-equations-of-software.html)
19+- [Moron Lab, “Urbit: functional programming from scratch” (~2010.1.13)](https://moronlab.blogspot.com/2010/01/urbit-functional-programming-from.html)
20+
21+How did Urbit cultivate a unique open source software culture? Let's take a look at how we got to where we are today.
22+
23+Open source culture really got going in the 1980s with the restrictive Unix licensing scheme and the consequent publication of the GNU software tools. With the marriage of GNU to Linux ([“I'd like to interject for a moment”](https://copypastatext.com/id-just-like-to-interject-for-a-moment/)), a full stack, from the bare metal to the end user, was possible. Usenet and early Internet forums furthermore encouraged interested developers to start contributing actively.
24+
25+The ethos of open source software drew on a number of sources, from William Gibson's _Neuromancer_ trilogy to “A Cypherpunk's Manifesto.” Those involved were often motivated by a healthy distrust of proprietary software. The big break for open source software (OSS) came with the [Unix ownership lawsuits](https://en.wikipedia.org/wiki/Unix_wars), which gave GNU/Linux a chance to break into the bigtime for systems software. The [2001 case against Microsoft](https://en.wikipedia.org/wiki/United_States_v._Microsoft_Corp.) as a monopoly lent further credence to the open source mandate.
26+
27+During this time, Urbit began life as a personal dissertation, in a sense, to derive a minimalist practical set of computing expressions as a combinator calculus. The early concepts that became part of Urbit, such as kelvin versioning and Maxwellian code, show up during its first decade. Nock was not open source for two reasons: the founder's conviction that as software it was already public domain, and the fact that there was no one yet to collaborate with.
28+
29+It was about a decade before Tlon was started as a small bespoke programming house to work on the esoteric project of defining something usable on top of the minimalist Nock specification. No one knew about Urbit besides some blog readers, and unless you worked in or next to Tlon you had basically zero chance of following the project via software alone.
30+
31+Early Tlon did a fairly good job of putting their software out there, but the documentation and nomenclature were considered obscurantist and the project was described as performance art or a deliberate wild goose chase. These combined to make Urbit appear fairly opaque, despite open development using GitHub and the liberal MIT license. System components like Nock and Arvo were declared public domain or liberally licensed.
32+
33+To this point (let's say 2019), Urbit was by license and by code an open source project, but had a reputation for being basically impossible for an outsider, even one with a fair amount of coding experience, to really figure out what's going on without serious handholding from the core devs. (Nor is this inappropriate for a small startup at this stage—it simply is the way most nominally OSS projects function.) However, the mystery engaged others beyond Tlon to brave the wilds and figure out what this Urbit project was all about.
34+
35+Urbit’s goal has always been to produce a stable kernel for all time, referred to by a metaphor of losing heat energy and entropy. As Urbit gradually cooled from red hot slag to what we'll call a developer alpha, Tlon began a project of greater outreach to the developer community. In particular, crypto software developers saw attractive aspects in Nock's concision and apparent provability and in Urbit's functional-as-in-math approach to operating system and application state. Tlon started a Discord for onboarding and troubleshooting, including community concierges who were tasked with engaging anyone with ship troubles. This tapped into and fostered a culture of Urbiters aggressively helping others debug and troubleshoot their ships, which continues to this day. Tlon also began Hoon 101 to teach outsiders how to actually build things on Urbit.
36+
37+As Urbit slowly grew into a larger developer community, some hard strategic questions about project scope and direction came into focus. There had always been a provision for Urbit to have some sort of foundation with stewardship over the project—either the Urbit Educational Foundation or something similar. Like the Linux Foundation, this organization would serve to coordinate activity between various companies and individuals contributing to the Urbit project. The foundation would receive an endowment of galaxies earmarked to fund Urbit's development.
38+
39+Urbit's use of address space to fund development means that the builders, even those who have discovered Urbit relatively recently, are able to acquire a significant stake in the project and its success.
40+
41+In practical terms, Tlon started the Urbit Foundation internally first as `urbit.org`, then rolled it out as a standalone company with a mandate to first build itself into a viable cultivator of Urbit, then to take over Urbit core development. By early 2023, the Urbit Foundation was in a position to take over core development for the platform.
42+
43+There have been several aspects of this journey that have led Urbit to have a thriving and promising open source software culture:
44+
45+1. Urbit's nature as a functional operating system has a deep appeal to software developers and others who find appeal in a mathematically elegant system, including the guarantees made by innovations such as the scry namespace bindings and the public key infrastructure.
46+2. Hoon is a mood. What I mean by that is that Hoon's unique aesthetics, subject-oriented paradigm, and the utility of cores give coders a unique experience, like systems programming in APL would feel like.
47+3. The developer docs are finally prioritized and made publicly legible. Large swaths of the operating system and standard library are finally documented.
48+4. Third-party software distribution is made trivial. Decentralized peer-to-peer open source software distribution without having to go through a GitHub intermediary changes the game.
49+5. Urbit's educational program expands from Tlon's initial offerings to a community program (Hooniverse/Hooniversity), then to a dedicated program with specific course milestones under the auspices of the Urbit Foundation.
50+6. Urbiters start meeting in person at Assembly and other events. After the 2020 efflorescence of the Urbit community, this is the first time most of the newer people were able to meet in real life. (This is a substantially different situation than the pre-2019 Urbit environment—most people didn't know Tlonners first, they knew Urbit first and mainly online.)
51+7. Three major active groups form dedicated to all-purpose coding on Urbit:
52+ A. Hooniverse, ~hiddev-dannut/new-hooniverse, originally strictly for the community Hoon School but now for all of the UF's educational efforts.
53+ B. The Forge, ~middev/the-forge, for advanced technical discussion.
54+ C. `[battery payload]`, ~dister-dozzod-lapdeg/battery-payload, the UF's developer community group.
55+8. The Urbit Foundation begins an active grants program. At first focusing on userspace and cultural grants, this eventually leans back into kernel work.
56+9. As the Urbit Foundation takes over core development, this necessitates changing that process from being a one-company project to requiring coordination, said coordination being much easier in the open than in closed meetings. (This also enables Tlon to focus on product delivery over core development.)
57+10. The Urbit Foundation begins using a `gather.town` “Urbit Hacker House,” which puts people together for synchronous interrupts. Any community member can wander in and be a fly on the wall or an active interlocutor.
58+ A. This enables the UF to start hosting daily pull request triage and a rapid assignment of tasks in the open.
59+ B. Communications strategy meetings are also public.
60+ C. Build parties (originally conceived as app-in-a-day) demonstrate pair programming, achieve inter-programmer communication of information akin to IRL programming, and allow anyone to participate.
61+
62+We find ourselves, as Urbit developers, having grown together a strong and unique culture of open source software development verging on radical transparency. It's not just code and license being open—it's the entire ensemble of programmer culture and on-platform dogfooding (to the extent possible). The greybeards and the noobs encounter each other directly and openly all the time, in `gather.town` and in Urbit groups.
63+
64+From modest beginnings, Urbit has achieved some small traction in the world and grown an exemplary open source culture. What will it take for Urbit to succeed in the future? That's the next entry.
content/blog/foss-2.mdnew file+59
@@ -0,0 +1,59 @@
1++++
2+title = "Urbit's Open Source Culture, Part II"
3+date = "2023-06-13"
4+description = "How will Urbit continue to foster its innovative open source software culture?"
5+
6+[extra]
7+author = "N E Davis"
8+ship = "~lagrev-nocfep"
9+image = "https://spacecenter.org/wp-content/uploads/2023/02/img-apollo-mission-control-3.jpg"
10++++
11+
12+![](https://spacecenter.org/wp-content/uploads/2023/02/img-apollo-mission-control-3.jpg)
13+
14+> God watches over fools, drunks, and the United States of America. (Otto von Bismarck, apocryphal)
15+
16+In our last installment, we considered how Urbit has grown its own robust open source culture. Now we look to the future: what will it take for Urbit to succeed, not only as an exemplary open source project but as a computing platform that delivers on its promise?
17+
18+Part of what makes an open source culture vibe is remix culture, the ability to rework the source material to produce novel components or manifestations. Urbit has the raw materials for this in spades, memetically and technically. It is up to us to keep these tools in our developers’ and enthusiasts’ hands.
19+
20+The default answer, which isn't terrible, is that Urbit should keep doing what it's done to get this far:
21+
22+1. Urbit should continue to prioritize decentralized development.
23+2. Urbit should lean into ownership-based incentives. Indeed, this is the most effective lever that the Urbit Foundation has.
24+3. Urbit should maintain the developer's republic. Core developers should rub shoulders with first-time Hooners.
25+4. Urbit should continue to ship source with code, since that is how code is actually distributed. The means of open source software are _necessarily in the user's hands_ with Martian software.
26+
27+There are some areas in which we hope to improve. Our documentation continues to expand, as do our educational offerings. We have a mandate to use the Urbit Foundation’s endowment of stars to produce the mature Urbit.
28+
29+What else should we have an eye to in the near future? There’s always more to do, but by prioritizing the items on this short list we would continue to elaborate our open source bona fides as a community and a steering foundation.
30+
31+1. **Code accessibility should be a priority.** Any computer language falls on the spectrum between machine legibility (the pole of machine code and assembly language) and human legibility (the pole of [Scratch](https://scratch.mit.edu/). All code must walk this line.
32+
33+ Hoon has had a reputation for being a language of dense expressions, which we believe is now being cleared by sunshine. However, Hoon's extensive sugar syntax and irregular expressiveness can make it challenging for those relatively new to Hoon to decipher programs. We can support their learning and entry into the ecosystem by defining a subset of Hoon syntax that we adhere to in all of the docs and some of the userspace code. Even if there is a "better" way to write it, we should prefer this restricted discipline in those cases. Let's call this subset "Hoon Prime." Hoon Prime will not always be the most concise Hoon code, and it will likely fail to maintain certain well-established preferences, like heavier expressions going to the bottom, but it should encourage developers to produce generators and agents from `%base`-distributed models as quickly as possible.
34+
35+ Hoon Prime should also adopt a standard of literate programming. Several example files already display such a self-documenting nature:
36+
37+ - [`simple.hoon` for solid-state subscriptions](https://github.com/wicrum-wicrun/sss/blob/master/urbit/app/simple.hoon)
38+ - [`deco.hoon` for doccords](https://github.com/urbit/urbit/blob/develop/pkg/arvo/lib/deco.hoon)
39+ - [`pals.hoon`](https://github.com/Fang-/suite/blob/master/app/pals.hoon)
40+ - [`rudder.hoon` for serving websites](https://github.com/Fang-/suite/blob/master/lib/rudder.hoon)
41+
42+ Our userspace code accessibility model should allow contributors from widely different skill levels to interact. We need to surface and document code patterns as cleanly as possible in the code we distribute. We need to include comments and unit tests so people can see how and why code works like it does.
43+
44+ Code accessibility cannot be an afterthought. We need to upgrade as much code as possible to A standards [per the style guide](https://developers.urbit.org/reference/hoon/style#grading).
45+
46+2. We need to improve the developer experience. Part of this involves better coding support, and part of this involves better debugging support.
47+
48+ To promote better coding, we should continue to develop IDE integrations like the Hoon Language Server. We've had some significant wins here, but rust never sleeps. We should also continue to produce userspace and middleware support libraries. We need to pay attention to how developer preferences are manifesting in their workflows and tooling.
49+
50+ Better error messaging and debugging support, perhaps even a framework for line-by-line code execution, would be invaluable. Upgrading Dojo and generator support is an easy win. Any tool friction is a sin and we need to track this and think about how to improve use.
51+
52+3. We need our open source culture to continue to develop in the sunlight. We need to highlight and communicate user stories for developer tools, new and old. We need to share these from inside of companies in the ecosystem. I'm not going to call for “best practices”—it's too early and that's too corporate—but tacit knowledge and horizontal skill transfer need to be encouraged through active pair programming and utilization of build parties and the like.
53+
54+ We need to expose how bugs occur, propagate, and are corrected. The core development team has committed to public [postmortems](https://github.com/urbit/urbit/issues/6583) when things go wrong.
55+
56+4. Ultimately, Urbit has to stay playful. Urbit makes programming, even systems programming, a lot of fun. Fun is open-ended and surprising. It allows for whimsy in code and product.
57+
58+Our developer onboarding and open source culture should be a model for the entire open source world. This is neither impossible nor impractical—we've made huge strides in legibility, and we're sailing with the wind.
59+
content/blog/hoon-4-lispers.mdnew file+764
@@ -0,0 +1,764 @@
1++++
2+title = "A Perspective on Lisp and Hoon"
3+date = "2023-06-15"
4+description = "Lisp is an éminence grise of programming. How does Hoon compare?"
5+
6+[extra]
7+author = "N E Davis"
8+ship = "~lagrev-nocfep"
9+image = "https://engineering.stanford.edu/sites/default/files/styles/card_1900x950/public/images/news/john_mccarthy.jpeg?h=3751da6c&itok=6tPSih53"
10++++
11+
12+![John McCarthy, inventor of Lisp, at Stanford.](https://engineering.stanford.edu/sites/default/files/styles/card_1900x950/public/images/news/john_mccarthy.jpeg?h=3751da6c&itok=6tPSih53)
13+
14+> In the beginning, von Neumann created the machine. And the machine was with rigorous form and code, and no compiler yet moved upon the face of the tubes. And the evening and the morning were the first day.
15+>
16+> And John Backus said, Let there be FORTRAN, and there was Fortran. And Fortran ruled over the assembly.
17+>
18+> And John McCarthy saw the lambda calculus, that it was very good. And McCarthy made the LISP and divided the programmers who were for the array from the programmers who were for the list.
19+>
20+> And the Fortran and the Lisp were the second day. And God set them in the firmament to give light upon the earth.
21+
22+Two great temperaments of programming language design span these poles: Fortran as the engineer of assembler-first hard-nosed array coding and Lisp as the math professor running down to the machine room waving papers. While they have ceded some to the practicalities of the other over time, each is a trope of a particular computing paradigm. In this article, we will examine the Lisp pole in light of Urbit's development language, Hoon.
23+
24+Hoon is a statically typed functional programming language that is designed to be safe, efficient, and expressive. Hoon has a unique syntax relying heavily on symbolic expressions (using “runes”) rather than traditional keywords and operators. Hoon's underlying execution language, Nock, has been described as a “pico-Lisp“, making reference to its nature as a cell-based combinator calculus. Both languages (Nock and Hoon) follow very much in the philosophical steps of Lisp but seek to improve the genre.
25+
26+Lisp is known for its powerful macro system, which allows developers to write code that generates more code at compile time, and for its powerful `eval` function; while Hoon provides a flexible metaprogramming system that allows developers to manipulate code at compile time and hot-swap code at runtime.
27+
28+This article will contrast classical Lisp syntax and assumptions with Hoon's design. As Lisp is a family of languages rather than a single implementation, I will strive to make generally applicable statements or qualify the discussion—I welcome nuance in your responses about the different major Lisp dialects.
29+
30+Hoon's characteristic structure has arisen from these overarching design principles:
31+
32+1. Hoon must compile to Nock, and benefits from reflecting Nock's calculational worldview.
33+2. Hoon must be capable of live upgrades; that is, conscious brain surgery on itself.
34+3. Hoon should grow organically based on actual developer usage patterns.
35+
36+Our investigation of Lisp and Hoon will compare their syntax, their metaprogramming affordances, and their underlying philosophies.
37+
38+
39+## Syntax
40+
41+Hoon has many commonalities with Lisp and its most common calling convention is sugared to appear like Lisp. The conventions of Nock differ—e.g. using `[]` brackets instead of `()` parentheses—and Nock does not have non-numeric tokens or names. Hoon serves as a more human-friendly syntax which mediates common expressions and structures much as C overlays assembly language. For practical purposes, we never need to write Nock code by hand, and so while Nock informs Hoon's design choices, we don't need to understand any Nock to talk about Hoon.
42+
43+Both Lisp and Hoon are homoiconic, meaning that code and data are directly represented the same way: Lisp code is represented as Lisp data structures, and Hoon code is represented as Hoon data structures. Homoiconicity means that code can be manipulated and transformed as data at runtime. While the most compelling investigation in this article focuses on metaprogramming, we need to start with a comparative syntax and grammar so we understand how code and data are represented.
44+
45+Before all of that, let us compare a simple program implemented in both Lisp and Hoon. Both programming languages are species of functional languages for which expressions result in values, but they handle side effects differently: in Hoon side effects are strictly impossible (although a runtime workaround permits I/O and necessary effects), while in Lisp side effects are permitted (although opinions on their use vary). We will therefore not use a trivial “Hello World” example. Instead we will calculate the arithmetic mean of a set of numbers of known size.
46+
47+```scheme
48+(define (mean a)
49+ (if (null? a)
50+ 0
51+ (/ (apply + a) (length a))))
52+```
53+
54+```hoon
55+:: Common (sugared) form
56+++ mean
57+ |= a=(list @ud)
58+ ?~ a 0
59+ (div (roll a add) (lent a))
60+
61+:: Rune (unsugared) form
62+++ mean
63+ |= a=(list @ud)
64+ ?~ a 0
65+ %+ div
66+ %- roll [a add]
67+ %- lent a
68+```
69+
70+The Scheme code has the advantage that it reads almost English-like as one works through the logic, but implicitly relies on familiarity with the `if`/`then`/`else` structure and function application using `()` (on which more soon).
71+
72+The Hoon code uses the `%` function application runes (differentiated by number of arguments) to apply the function calls. With syntactic sugar, this looks similar to the Lisp call, with `++roll` instead of `apply` and `++lent` instead of `length`.
73+
74+Throughout I will use code examples for Lisp taken from [Rosetta Code](https://rosettacode.org/wiki/Category:Scheme). I will select or compose Hoon examples to be structurally similar to the Lisp code in order to facilitate comparison. I will also avoid sugar syntax that would obscure the structure of the Hoon code; in some cases this will make it slightly less readable than its equivalent in practice.
75+
76+### Syntax in Lisp
77+
78+#### Types
79+
80+Lisp types are dynamic, checked at runtime rather than on compilation. Since everything is an object, some assumptions can be made about manipulation and behavior. Most Lisp dialects share these types:
81+
82+- Numbers, including integers and floating-point numbers.
83+- Characters.
84+- Strings, as a sequence of characters.
85+- Lists, as a sequence of objects (including lists).
86+- Symbols, names used to refer to a function, variable, or other object.
87+- Arrays, a fixed-size multidimensional indexed object collection.
88+
89+Lisp code, being dynamically typed, is inclined to try a value and see if it works in a given context. However, some restrictions can be made, such as an argument type declaration on a function:
90+
91+```lisp
92+(defun add-two-integers (x y)
93+ (declare (type integer x y))
94+ (+ x y))
95+```
96+
97+Lisp types are to some extent (justly) influenced by the underlying platform architecture: Lisp is generally compiled directly to machine code (like a C program), with the notable exception of [Clojure](https://clojure.org/reference/lisps) which runs on the Java Virtual Machine.
98+
99+#### Operators, Functions, Macros, and Thunks
100+
101+Lisp syntax is characterized by its use of nested lists, called S-expressions (symbolic expressions), which consist of parentheses enclosing atoms or other S-expressions. The basic structure of an S-expression is an operator (or function) followed by its arguments, all enclosed in parentheses. For example, the following S-expression performs a simple arithmetic operation:
102+
103+```lisp
104+(+ 1 2 3)
105+```
106+
107+Lisp uses prefix notation, where the operator comes before the operands, and parentheses are used to group expressions. The S-expression is evaluated from left to right (in most Lisps save Scheme), with the operator being applied to its arguments.
108+
109+Operators in Lisp operate on values of different basic types. Lisp dialects vary in their particular base types, but typically include numbers, strings, booleans, and so forth. The core data type is the list, of course (LISP is for LISt Processing). Since Lisp biases towards list processing, many operators are comfortable receiving an arbitrary number of values as inputs, as in the code sample above.
110+
111+In Lisp, [`cons`](https://en.wikipedia.org/wiki/Cons) describes the procedure to construct a pair of objects. This seemingly modest capability is fundamental to how Lisp builds lists—and since everything is a list, `cons` has consequences. One fundamental convention is the `cons` cell, which consists of two other Lisp objects and is how lists are actually constructed.
112+
113+![](https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Cons-cells.svg/450px-Cons-cells.svg.png)
114+
115+Lisp operations are built either as functions or as macros. Functions produce results directly from their inputs. Macros by contrast are basically function-building functions, and produce expressions that can be evaluated with inputs to get a result.
116+
117+A Lisp function is created using `defun`:
118+
119+```lisp
120+> (defun square (x) (* x x))
121+SQUARE
122+
123+> (square 2)
124+4
125+```
126+
127+(Lisp dialects tend to not be case-sensitive.)
128+
129+Lisp functions are first-class objects and can be manipulated and passed like values of basic types as well.
130+
131+Before we can look at macros, we need to consider Lisp's notion of evaluation and in particular deferred evaluation. For Lisp, an expression can be marked as a literal value rather than evaluated to produce a result. The quote `'` symbol is used to mark expressions for prevented evaluation:
132+
133+```lisp
134+'(1 2 3) ; evaluates to the list (1 2 3)
135+'foo ; evaluates to the symbol FOO
136+(1 5) ; evaluates to the list (1 5)
137+'(1 (+ 2 3)) ; evaluates to the list (1 (+ 2 3))
138+```
139+
140+Backtic or backquote `` ` `` allows you to switch an expression in and out of evaluation mode, along with `,` to mark evaluated components for splicing back into the unevaluated expression.
141+
142+```lisp
143+`(1 2 3) ; evaluates to the list (1 2 3)
144+`foo ; evaluates to the symbol FOO
145+`(1 ,(+ 2 3)) ; evaluates to the list (1 5)
146+```
147+
148+A Lisp macro is essentially a compile-time function.
149+
150+```lisp
151+> (defmacro square (x)
152+ "Returns the square of the input value."
153+ `(* ,x ,x))
154+
155+> (square 2)
156+4
157+```
158+
159+(The `` ` `` notation constructs the expression with values spliced in by `,`.)
160+
161+A deferred evaluation, called a thunk, is a closure that inherits its lexical environment but is deferred for later computation. Thunks enable lazy code evaluation and separate the computation’s definition from its execution.
162+
163+```lisp
164+(defun create-thunk (function &rest arguments)
165+ (lambda () (apply function arguments)))
166+
167+(defun invoke-thunk (thunk)
168+ (funcall thunk))
169+
170+;; Creating a thunk that calculates the factorial of a number
171+(defvar factorial-thunk (create-thunk #'(lambda () (factorial 5))))
172+
173+;; Invoking the thunk to get the result
174+(print (invoke-thunk factorial-thunk)) ; Output: 120
175+```
176+
177+In this code example, `create-thunk` accepts a function and returns a thunk created using a lambda function to encapsulate the computation. `invoke-thunk` is used to invoke the thunk to get the actual result. The actual application creates a deferred factorial implementation and then finally invokes it. Without the last line, the actual calculation would never be executed.
178+
179+As Paul Graham wrote, “The unusual thing about Lisp-- in fact, the defining quality of Lisp-- is that it can be written in itself.” A Lisp program is an S-expression, and in principle we can run the equation the other way: certain S-expressions are valid Lisp programs. Although uncommon in practice due to code safety issues, the `eval` function is illustrative of Lisps’ ability to evaluate a Lisp expression that is represented as a data structure. It takes a single argument, which is a Lisp expression, and returns the value of that expression. Lisp programs can in principle generate new code—or modify existing code—and evaluate it on the fly, since code is data.
180+
181+```lisp
182+(defvar x 10)
183+(defvar y 20)
184+(defvar z '(+ x y))
185+
186+(eval z)
187+```
188+
189+Besides explicitly named functions and macros, Lisp frequently employs lambda expressions to produce functions on demand at the point of use.
190+
191+```lisp
192+> ((lambda (x y) (+ x y)) 5 10)
193+15
194+```
195+
196+Naturally, we have not covered all of Lisp, but the above should motivate how Hoon differs from Lisp. Furthermore, Lisp is really a family of languages, so there is a fair amount of variation in specifics.
197+
198+- [Paul Graham, _On Lisp_](http://www.paulgraham.com/onlisptext.html)
199+
200+### Syntax in Hoon
201+
202+#### Types
203+
204+Hoon compiles to Nock and runs on a Nock virtual machine interpreter. Nock knows only about nouns, that is to say either simple unsigned integers or pairs of other nouns.
205+
206+> To be exact, a noun is an S-expression, except that classic S-expressions have multiple atom types ("S" is for "symbol"). Since Nock is designed to be used with a higher-level type system (such as Hoon's), it does not need low-level types. An atom is just an unsigned integer of any size.
207+
208+
209+One of the biggest differences between Hoon and Lisp lies in their respective type systems: Hoon is statically typed while Lisp is dynamically typed. Furthermore, since Hoon compiles to Nock, ultimately every value, expression, and program in Hoon results in a noun (an atom or unsigned integer, or a cell or pair of nouns). (The compiler may make this process slightly opaque, but it is deterministic.) Types, if values are known, must match or nest properly at compile time.
210+
211+Hoon implements types as a metadata layer over bare Nock numbers and atoms. (The implementation details do not concern us but can be seen using the `!,` zapcom rune, which produces the abstract syntax tree of an expression.) Hoon atom types include various numeric types (signed and unsigned, hexadecimal, binary, etc.); address space identifiers (such as ~zod); IP addresses; UTF-8 text; and floating-point values, [among many others](https://developers.urbit.org/blog/literals). As these are interpretations laid over the bare integer, it is trivial to convert among them, a convenience like C affords.
212+
213+```hoon
214+:: raw unsigned decimal integer
215+> 123
216+123
217+
218+:: hexadecimal integer
219+> `@ux`123
220+0x7b
221+
222+:: UTF-8 text
223+> `@t`123
224+'{'
225+
226+:: relative datetime (a small fraction of a second)
227+> `@dr`123
228+~s0..0000.0000.0000.007b
229+
230+:: address mnemonic (ship name)
231+> `@p`123
232+~rux
233+
234+:: IPv4 address
235+> `@if`123
236+.0.0.0.123
237+
238+:: IPv6 address
239+> `@is`123
240+.0.0.0.0.0.0.0.7b
241+```
242+
243+A cell is a pair of two nouns, and of course many compound types exist, including lists (a null-terminated series of cells). A file path in Urbit is, for instance, a list of resource names (a `path`). A manipulable text string is a list of single bytes for characters (a `tape`). Maps (associative arrays), sets, and other containers round out the basic data structure types, but more complex types such as HTTP headers and app metadata are available. Even app actions have an associated type so that the set of actions is enumerable and validated. Here, for instance, are some cryptographic types from the standard library:
244+
245+```hoon
246++$ jacobian [x=@ y=@ z=@] :: jacobian point
247++$ point [x=@ y=@] :: curve point
248++$ domain
249+ $: p=@ :: prime modulo
250+ a=@ :: y^2=x^3+ax+b
251+ b=@ ::
252+ g=point :: base point
253+ n=@ :: prime order of g
254+ ==
255+```
256+
257+Hoon expressions are ultimately binary trees of cells and atoms—Hoon is homoiconic and so code is directly represented as a data structure which can be interpreted as a value as well. This facilitates Hoon's ability to upgrade itself in place, as we will see.
258+
259+Hoon commonly implements types structurally via _molds_, or functions which coerce to type or crash. A mold is a way of asserting known type information over a value, typically at compile time, in a way that allows for data transformation and data validation. This leads to some interesting cases such as the difference between a null-terminated tuple and a true list, which some functions require.
260+
261+```hoon
262+> ~[1 2 3]
263+[1 2 3 ~]
264+
265+> `(list @)`~[1 2 3]
266+~[1 2 3]
267+
268+> (snag 2 ~[1 2 3])
269+mull-grow
270+-need.[i=@ud t=%~]
271+-have.%~
272+nest-fail
273+dojo: hoon expression failed
274+
275+> (snag 2 `(list @)`~[1 2 3])
276+3
277+```
278+
279+Hoon implements a unique character literal syntax for every single atom type, allowing any value to be unambiguously interpreted by the parser per the developer's intent. You can see this somewhat in evidence in this comparison chart:
280+
281+| Type | Lisp Type | Hoon Type |
282+| --- | --- | --- |
283+| (Unsigned) integer | `1` | `1` |
284+| Signed integer | `-1`, `1` | `-1`, `--1` |
285+| Symbol | `x` | `%x` |
286+| Real/FP | `1.5` | `.1.5` |
287+| Character | `#\c` | `'c'` |
288+| Text | `"Hello"` | `'Hello'` (as atom); `"Hello"` (as list) |
289+| Rational | `2/3` | (no Hoon equivalent) |
290+| Address | (no Lisp equivalent) | `~sampel-palnet` |
291+
292+Much of Hoon's practical power derives from how it represents and manipulates nouns as data and as code.
293+
294+> The type of type is just a normal datatype in Hoon, and a lot of the system manipulates types. In particular, the `!>` rune, when applied to a piece of data, uses compile-time type reflection to produce something called a "vase": a pair of type and data, similar to a `Data.Dynamic` in Haskell, or a limited form of a dependent pair. Since the Arvo kernel does a lot of dynamic compilation, it uses vases to implement something akin to a dynamically typed language using Hoon. This allows for type-safe dynamic program loading, program execution, and data migration. (Ted Blackman ~rovnys-ricfer, [“Why Hoon”](https://urbit.org/blog/why-hoon))
295+
296+A `vase` in Hoon is a cell of type and value. Typically `vase`s are produced with the `!>` zapgar rune. We use `vase`s to carry type information where otherwise it may be lost, such as in transmission over the wire to another Urbit instance.
297+
298+```hoon
299+> !>('hello')
300+[#t/@t q=478.560.413.032]
301+
302+> !>([5 10])
303+[#t/[@ud @ud] q=[5 10]]
304+
305+> !>(`(list @)`~[1 2 3])
306+[#t/it(@) q=[1 2 3 0]]
307+
308+> !>(`(list @)`~)
309+[#t/it(@) q=0]
310+```
311+
312+A `vase` can be used at runtime to resolve a value from a dynamic context into an executable Hoon expression, and this is commonly done with web-based input, for instance, where insufficient information will be available at compile time to resolve the type correctly.
313+
314+#### Expressions
315+
316+Nock explicitly consists of binary trees, since any Nock structure or program consists entirely of atoms (bare values) and cells (pairs of nouns).
317+
318+![](https://storage.googleapis.com/media.urbit.org/docs/userspace/hoon-school/binary-tree.png)
319+
320+Expressions are oriented around runes, which act as operators to join or manipulate expressions. To construct a cell of two values like `1` and `2`, one uses the `:-` cencol rune. (Hoon cells implement what we call an “implicit `cons`”, meaning that two nouns composed together are simply unified in a shared binary tree.)
321+
322+```
323+ :-
324+ / \
325+1 2
326+```
327+
328+To invoke a function named `add`, one can provide a `%-` cenhep rune with the function name and the arguments.
329+
330+```
331+ %-
332+ / \
333+add :-
334+ / \
335+ 1 2
336+```
337+
338+We write this Hoon expression one of two ways, either separated by whitespace or using parentheses:
339+
340+```
341+> %- add :- 1 2
342+3
343+
344+> %-(add :-(1 2))
345+3
346+```
347+
348+Hoon employs “sugar syntax” for many common code patterns to make them easier to write and (sometimes) to read. Since Hoon had the advantage of knowing about Lisp's syntax beforehand, the standard invocation syntax in Hoon (formally a `%` rune) uses the irregular `()`-based syntax like Lisp. In this case, we could instead write the Lisp-like expression:
349+
350+```hoon
351+> (add 1 2)
352+3
353+```
354+
355+which results in basically the same expression once the parser is done.
356+
357+(Although Hoon ultimately compiles to Nock, it is more natural in some ways to approach the syntax of a program as an array of $n$-ary trees, where each “slot” in an expression can have zero, one, or many children. Zero children refers to a tree address containing a terminal value like a symbol or an integer.)
358+
359+Rune syntax is Hoon's answer to the Lisp proliferation of parentheses—by restricting expressions to a definite number of children, Hoon avoids needing to explicitly terminate most expressions. In some ways, runes are an ASCII-based equivalent of APL's symbolic character operators.
360+
361+```apl
362+life ← {⊃1 ⍵ ∨.∧ 3 4 = +/ +⌿ ¯1 0 1 ∘.⊖ ¯1 0 1 ⌽¨ ⊂⍵}
363+```
364+
365+Rather than permit polymorphic language statements, Hoon requires each rune to be extremely tightly defined. While many statements may be functionally equivalent to an `if` or a `cond` statement, for instance, Hoon allows the developer to select a particular expressive rune if desired.
366+
367+- `?:` typical `if`/`then`/`else` branch
368+- `?=` branch on type
369+- `?@` branch if atom
370+- `?^` branch if cell
371+- `?+` switch on type with default
372+- `?-` switch on type without default
373+- `?~` branch if null
374+
375+The next examples explore an interesting difference between Lisp `cond` and Hoon `?+` wutlus swtich statements: Hoon switches over _types_ not _values_, and `term` symbols as constants are instances of self-matching types.)
376+
377+```scheme
378+(define (weather f)
379+ (cond ((> f 80) 'too-hot)
380+ ((> f 60) 'nice)
381+ ((< f 35) 'too-cold)
382+ (else 'typical-midwest)))
383+```
384+
385+```hoon
386+|%
387+++ weather
388+ |= f=@ud
389+ ?: (gth f 80) %too-hot
390+ ?: (gth f 60) %nice
391+ ?: (lth f 35) %too-cold
392+ %typical-midwest
393+++ symbol-to-message
394+ |= msg=term
395+ ?+ msg 'Typical Midwest'
396+ %too-hot
397+ 'Too hot outside'
398+ %nice
399+ 'Nice outside'
400+ %too-cold
401+ 'Too cold here'
402+ ==
403+--
404+```
405+
406+Lisp expects a program to be a running series of expressions, naturally composed together as a list. Hoon, in contrast, expects everything to be an evaluable expression (no implicit `progn`, for instance): thus, series of expressions must be composed together, e.g. using `=>` tisgar to concatenate two expressions.
407+
408+This code example defines an expression and immediately evaluates another expression against it:
409+
410+```hoon
411+=> [a=1 b=2 c=3]
412+::
413+b
414+```
415+
416+Hoon code is compiled to Nock, but it is not a simple macro over Nock—multiple Hoon expressions could result in an identical Nock expression, and the same Hoon expression evaluated against different subjects could result in different Nock expressions. Hoon code is parsed to an abstract syntax tree first, which includes type metadata, then compiled into the appropriate Nock statement. Here we use the `!,` zapcom rune to turn a Hoon expression into its AST, then `!=` zaptis to compile a Hoon expression to Nock.
417+
418+```hoon
419+> !,(*hoon `@ux`+(1))
420+[ %ktls
421+ p=[%sand p=%ux q=0]
422+ q=[%ktls p=[%sand p=%$ q=0] q=[%dtls p=[%sand p=%ud q=1]]]
423+]
424+
425+> !=(`@ux`+(1))
426+[4 1 1]
427+```
428+
429+Hoon has much more syntactic sugar than Lisp. Not only is the Lisp-like `()` execution convention sugar for `%:` cencol to invoke a function, there are in fact many ways to evaluate code expressions. Consider, for instance:
430+
431+| Rune | Usage |
432+|---|---|
433+| `%-` | Evaluate a function against a single noun. |
434+| `%+` | Evaluate a function against a cell (pair of nouns). |
435+| `%^` | Evaluate a function against a trio of nouns. |
436+| `%:` | Evaluate a function with many arguments ($n$-ary, unspecified number of nouns). |
437+| `%~` | Evaluate a higher-order function to produce a function. |
438+
439+This gives a Hoon developer an extreme amount of flexibility in constructing and laying out code expressions. In fact, many Hoon programs read as a hybrid of imperative code and functional code, since the ability to lay out intent line-by-line feels rather like C.
440+
441+Hoon conventions and sugar syntax have evolved organically as core developers discovered or invented useful design patterns and appropriately concise syntax.
442+
443+#### Functions (Gates) and Cores
444+
445+The most important structural concept in Hoon is the core, which organizes code into a binary tree of `[code data]`, or as we call it in Hoon, `[battery payload]`. Since cores have a standard structure, this means that many kinds of direct manipulations (metaprogramming) are possible, such as altering the input arguments to a function or manipulating the code variance model. Cores play a role in Hoon similar to that of objects in many other languages.
446+
447+Any function (“gate” in Hoon parlance) is a core, whose `battery` is the compiled Nock code and whose `payload` includes its view of the system, including the standard library, and its input arguments. The `|=` bartis rune is most commonly used to make a gate:
448+
449+```hoon
450+:: Select the larger of two values ("max").
451+|= [a=@ b=@]
452+?: (gth a b)
453+ a
454+b
455+```
456+
457+The gate definition rune `|=` bartis has two children, a specification of the expected input and the expression. When invoked, the values of the specification (or "sample") are provided to the expression, which then evaluates to return a noun.
458+
459+One quirk of Hoon is that since everything is an address (or “axis”) in a binary tree, you can access anything in your scope (“subject”) through its axis. Most commonly you attach a face to a value (like a gate), but you don't have to. At any point, to refer to the previous statement, you can invoke the head of the tree, `-`; to wit,
460+
461+```hoon
462+> =/ a 5
463+ -
464+a=5
465+```
466+
467+The name `a` is also attached to the value and can be used to identify the value. (To the Hoon parser there is no real difference; this is a programmer quality-of-life affordance.)
468+
469+```hoon
470+> =/ a 5
471+ a
472+5
473+```
474+
475+Thus faces (names) are attached to gates (functions) within a particular scope or context, such as a `|%` core. Each core defines a collection of values and gates (collectively termed “arms”) which occupy a shared scope. For example, the following library demonstrates a few floating-point operations in Hoon. Each function can see the parent subject (including `hoon.hoon` and some other cores) as well as its neighboring arms (such as `++pow-n` called by `++exp`).
476+
477+```hoon
478+|%
479+:: Factorial, x!
480+++ factorial
481+ |= x=@rs
482+ =/ t=@rs .1
483+ |- ^- @rs
484+ ?: =(x .1) t
485+ $(x (sub:rs x .1), t (mul:rs t x))
486+:: Absolute value, |x|
487+++ absolute
488+ |= x=@rs
489+ ?: (gth:rs x .0) x
490+ (sub:rs .0 x)
491+:: Exponential function, exp(x)
492+++ exp
493+ |= x=@rs
494+ =/ rtol .1e-5
495+ =/ p .1
496+ =/ po .-1
497+ =/ i .1
498+ |- ^- @rs
499+ ?: (lth:rs (absolute (sub:rs po p)) rtol) p
500+ $(i (add:rs i .1), p (add:rs p (div:rs (pow-n x i) (factorial i))), po p)
501+:: Power, restricted to integeres only, x**n
502+++ pow-n
503+ |= [x=@rs n=@rs]
504+ ?: =(n .0) .1
505+ =/ p x
506+ |- ^- @rs
507+ ?: (lth:rs n .2) p
508+ $(n (sub:rs n .1), p (mul:rs p x))
509+--
510+```
511+
512+Ultimately, however, the faces resolve back to an axis and the code is composed by the compiler into a Hoon syntax tree and thence to Nock for the runtime interpreter.
513+
514+The nature of cores derives from Nock and is key to understanding how Hoon works. All nontrivial structures in Hoon are cores. For instance, even a gate is a regular `|%` core, with `|=` expanding to `|%`. The following code snippets are identical to the Hoon compiler after parsing.
515+
516+```hoon
517+:: increment a number by two
518+|= p=@ud
519++(+(p))
520+```
521+
522+```hoon
523+:: increment a number by two
524+=+ ^~(*p=@ud)
525+|%
526+++ $
527+ +(+(p))
528+--
529+```
530+
531+Although Lisp's `'` quoting has no direct equivalent in Hoon, there are a couple of structures that can provide a similar effect. The most important of these is the `|.` trap, which defines an expression to be evaluated at a later time—Hoon’s equivalent of Lisp’s thunk. For instance, traps are used when testing code that _should_ fail, as the expression can be defined and deferred until the test framework is ready to process it.
532+
533+```hoon
534+> =foo |.((add 1 41))
535+
536+> -:foo
537+[8 [9 36 0 2.047] 9 2 10 [6 [7 [0 3] 1 1] 7 [0 3] 1 41] 0 2]
538+
539+> (foo)
540+42
541+```
542+
543+(To understand the second entry, recall that code is the in head of the core—here, we see the Nock code for the operation defined in the `|.` trap.)
544+
545+[Wet gates](https://developers.urbit.org/guides/core/hoon-school/R-metals) present the most macro-like feature in Hoon. A regular function, or “dry gate” (as above), receives an argument (the sample); the type system tries to cast the sample to the type specified by the gate, and fails if not possible. Wet gates instead defer type evaluation and instead attempt to use the sample (or arguments) directly in the expression. This produces a parametric polymorphism. (This comes close to dynamic typing, but type is still checked at compile time.) Wet gates are commonly used as gate-building gates, such as mold-producing gates like `++list`.
546+
547+Consider a function like `++turn` which transforms each element of a list.
548+
549+```hoon
550+> `tape`(turn ~[77 97 114 115] @t)
551+"Mars"
552+```
553+
554+To use `++turn`, we need a list and a transformation function. The type of the list we produce depends on the type of the list and the type of the transformation function. The actual gate `++turn` should work to transform each element of the list for on any function and any list, so long as the function's argument is the list item.
555+
556+Wet gates are therefore used when incoming type information is not well known and needs to be preserved. This includes parsing, building, and structuring arbitrary nouns. (Beyond Lisp analogues, you can think of C++'s templates and operator overloading, and Haskell's typeclasses.)
557+
558+This example compares the Lisp deferred factorial thunk with an equivalent Hoon trap. (Hoon includes `++factorial` since it is not part of the standard library.)
559+
560+```scheme
561+(defun create-thunk (function &rest arguments)
562+ (lambda () (apply function arguments)))
563+
564+(defun invoke-thunk (thunk)
565+ (funcall thunk))
566+
567+;; Creating a thunk that calculates the factorial of a number
568+(defvar factorial-thunk (create-thunk #'(lambda () (factorial 5))))
569+
570+;; Invoking the thunk to get the result
571+(print (invoke-thunk factorial-thunk)) ; Output: 120
572+```
573+
574+```hoon
575+=>
576+|%
577+++ factorial
578+ |= n=@ud
579+ |-
580+ ?: =(n 1) 1
581+ %+ mul n
582+ %= $
583+ n (dec n)
584+ ==
585+++ factorial-5
586+ |. (factorial 5)
587+--
588+(factorial-5)
589+```
590+
591+### Subject-Oriented Programming
592+
593+Urbit programming employs a paradigm deriving from the nature of Nock (_a fortiori_ Hoon), subject-oriented programming. Every expression of Hoon is evaluated relative to its subject, a piece of data that represents the environment, or the context, of an expression.
594+
595+The subject refers to the parent binary tree of an expression, more or less, and serves as state, lexical scope, environment, and function argument. (We can be precise about the definition in all cases—e.g. the subject of a gate in a core is the core itself—but don't need to for this essay.) Lisp supports variable scope and global variables, such that any part of the program can access a particular binding. Hoon's subject-oriented programming model naturally provides its equivalent of scope: all code is evaluated against a subject and name bindings proceed by depth-first match (with permitted skips to prevent unwanted masking).
596+
597+> Subject orientation in Nock and Hoon stems partly from minimalism (there's just one subject, which serves as state, lexical scope, environment, and function argument), partly from a desire to simplify compilation (the type of the subject is a full specification of the compile-time environment for a source file), and partly in order to give the language a more imperative feel.
598+>
599+> Everything about a scope, including name bindings, aliases, and docstrings, is stored in the subject's type. This allows Hoon's compilation discipline to be similarly minimal: the compiler is a function from subject type and Hoon source to product type and compiled Nock. Running this Nock against a value of the subject type produces a vase of the result. It's hard to imagine a more streamlined formalism for compilation. (Ted Blackman ~rovnys-ricfer, [“Why Hoon”](https://urbit.org/blog/why-hoon))
600+
601+The subject is typically the core in which an expression is evaluated, but can be more narrowly defined; consider, for instance, our example from above:
602+
603+```hoon
604+=> [a=1 b=2 c=3]
605+::
606+b
607+```
608+
609+A slightly different program fails:
610+
611+```hoon
612+=> [a=1 b=2 c=3]
613+::
614+(add a b)
615+```
616+
617+because the `++add` gate is not defined in the subject against which the expression is evaluated, the first statement.
618+
619+### Comparative Examples
620+
621+#### Find in List
622+
623+```scheme
624+(define index-of
625+ (lambda (needle haystack)
626+ (let ((tail (member needle haystack)))
627+ (if tail
628+ (- (length haystack) (length tail))
629+ (throw 'needle-missing)))))
630+```
631+
632+```hoon
633+:: Produces the index of the first occurrence of nedl in hstk
634+:: as the unit of an atom.
635+++ find
636+ |= [nedl=(list) hstk=(list)]
637+ =| i=@ud
638+ |- ^- (unit @ud)
639+ =+ [n=nedl h=hstk]
640+ |-
641+ ?: |(?=(~ n) ?=(~ h))
642+ ~
643+ ?: =(i.n i.h)
644+ ?~ t.n
645+ `i
646+ $(n t.n, h t.h)
647+ ^$(i +(i), hstk +.hstk)
648+```
649+
650+#### Filter a List
651+
652+```scheme
653+(define filter
654+ (lambda (fn lst)
655+ (let iter ((lst lst) (result '()))
656+ (if (null? lst)
657+ (reverse result)
658+ (let ((item (car lst))
659+ (rest (cdr lst)))
660+ (if (fn item)
661+ (iter rest (cons item result))
662+ (iter rest result)))))))
663+```
664+
665+```hoon
666+:: Cycle through the members of a list a, passing them to a gate b
667+:: and produce a list of all of the members that produce TRUE.
668+++ skim
669+ |* [a=(list) b=$-(* ?)]
670+ |-
671+ ^+ a
672+ ?~ a ~
673+ ?:((b i.a) [i.a $(a t.a)] $(a t.a))
674+```
675+
676+- Several examples in the above section were drawn from [UW's CSE 341 course notes](https://courses.cs.washington.edu/courses/cse341/03wi/scheme/basics.html) and from [Rosetta Code](https://rosettacode.org/).
677+
678+
679+## Metaprogramming
680+
681+A Lisp program is really a list, or a list of lists (nested as much as necessary). While this can be interpreted as an $n$-ary tree, tree structure is not the preferred structural metaphor. A Hoon program is a noun, or equivalently a binary tree. Every component of it is directly addressable and thus in principle reflective. Both languages are homoiconic, with code and data representations being the same. What are the consequences of homoiconicity?
682+
683+### Metaprogramming in Lisp
684+
685+Metaprogramming is the practice of writing code that manipulates other code at either compile-time or runtime. In Lisp, metaprogramming is a core feature of the language, and it allows developers to create programs that are incredibly powerful and flexible. Lisp's metaprogramming capabilities are primarily built on two features: macros and syntax manipulation.
686+
687+Macros in Lisp are a way to define new language constructs that are more expressive and more powerful than those provided by the language itself. When a Lisp program is compiled or interpreted, macros are expanded into regular Lisp code, allowing the macro to generate new code based on its input arguments. Since Lisp code is represented as data, it can be manipulated using the same functions and operators used to manipulate other data structures.
688+
689+For instance, Lisp macros could allow you flexibility in expressing a common operation. Imagine you're working on a project that requires a lot of complex math calculations. Rather than writing out each calculation manually, you could define a macro that takes an expression in infix notation (e.g. `2 + 3 * 4`), and transforms it into a Lisp expression that can be evaluated directly. Thus you could compose math expressions in a more human-natural way without having to worry about details of Lisp syntax.
690+
691+Lisp can also manipulate its own syntax. This is sometimes done through the use of reader macros, which operate at the level of the Lisp reader, which is responsible for converting textual input into Lisp expressions. Reader macros can be used to extend the syntax of Lisp, allowing developers to define new conventions or domain-specific languages for specific types of data or operations. Beyond reader macros, Lisp can permit the developer to change the parser (and as long as the result is a Lisp expression, the interpreter or compiler will be fine with this). Top-level functions can be replaced or modified (“advised”). Symbol macros can change source code.
692+
693+Lisp's `'` quote and the `eval` statement allow single expressions to be inhibited or evaluated at will, which is incredibly useful when dealing with symbols that may not be defined yet or in the composition of macros.
694+
695+In addition to macros and syntax manipulation, Lisp dialects typically provide a number of other features that make metaprogramming easier, such as the ability to inspect and modify the runtime environment, and the ability to create or redefine functions and classes at runtime.
696+
697+### Metaprogramming in Hoon
698+
699+While Hoon explicitly avoids macros and domain-specific language specializations, there are many aspects of Hoon which allow or exploit code reflection and manipulation.
700+
701+In practice, Hoon is intended as a systems programming language for the Urbit Nock VM. Hoon's metaprogramming has as a consequence mainly focused on aspects of core manipulation (such as code building and wet gates) and on live code upgrades (what I'll call hot-swapping code). Hoon eschews macros and in particular has a philosophical stance against domain-specific languages (DSLs). (There are some exceptions, notably Sail, Hoon's XML/HTML syntax; and JSON reparsing.)
702+
703+Hoon has the ability to parse arbitrary text strings (typically files) into executable ASTs and Nock. Symbols can be directly converted to and from regular text strings.
704+
705+As the programming language for a “hundred-year computer”, Hoon needs the ability to hot-swap code at runtime. Elements of cores can be removed or replaced. (Really, Hoon code is immutable: the system is actually making a copy with a specified change.) Every app and even the OS itself can define a state transition function and upgrade along a deterministic pathway.
706+
707+Hoon is in principle extremely reflective as it simply compiles to a Nock noun. Since everything is a stationary tree, it is straightforward to manipulate any object. There are no magic binary blobs or opaque data types: if you have a file handle or an Ethereum block or a websocket connection object, it is a tree and you can work with it directly. (Cf. [“Why Hoon”](https://urbit.org/blog/why-hoon).) Obtaining—or changing—details about gate sample or core behavior becomes a routine part of the Hoon developer’s toolkit. Given such regularity, it would be desirable to expose further capabilities of code reflection and introspection explicitly for the interpreter and IDE.
708+
709+One of the most common design patterns in Hoon is that of the higher-order function, or what Hoon calls “gate-building gates”. These are gates (functions) that produce gates (functions). For instance, as Hoon is statically typed a list must have an associated element type at compile time. `++list` is a gate builder that produces a type gate, which can then be applied to the actual values:
710+
711+```hoon
712+list :: gate builder
713+(list cord) :: gate for list of cords (strings)
714+`(list cord)`~['a' 'b' 'c'] :: list type applied to value
715+```
716+
717+Hoon represents a “hyperlambda” with respect to anonymous function creation: one very often defines gates at their point of use, particularly when operating on each member of a list or set. Similar to Lisp's frequent use of `lambda`, the one-time-use function is available at the point of call as an anonymous gate. (More generally, every gate is anonymous and we have to attach a name to it as a search path, but that's a bit out of scope here.)
718+
719+```scheme
720+((lambda (x1 x2)
721+ (* (- x1 x2) (- x1 x2)))
722+ 2 -5)
723+```
724+
725+```hoon
726+%- |= [x1=@ x2=@]
727+ (pro:si (dif:si x1 x2) (dif:si x1 x2))
728+[--2 -5]
729+```
730+
731+Like Lisp, Hoon yields a lot of power to the user–developer. One could implement a fairly regular Lisp on top of Hoon with very few changes—and perhaps even implement a pure-Hoon discipline yielding a statically-typed Lisp à la TypeScript from JavaScript.
732+
733+- [~tacryt-socryp, “Hick, a more traditional Lisp than Hoon”](https://gist.github.com/tacryt-socryp/b08dc66b7bcc760e914c4db5c9fd7ba7)
734+
735+
736+## Philosophy
737+
738+Hoon's focus on atoms, static typing, and symbolic expressions make it a highly expressive and efficient language for building applications on the Urbit platform, while Lisp's flexible syntax and macro system make it a popular choice for a wide range of programming tasks.
739+
740+Lisp has evolved greatly since John McCarthy's founding. Like Unix, a complicated family tree has finally settled down into a few strong contenders: Scheme, Common Lisp, Clojure, Racket.
741+
742+Lisp has tended to be fractious: as many have noted, and [Mark Tarver eloquently expressed](http://web.archive.org/web/20080803193859/http://www.lambdassociates.org/blog/bipolar.htm), the Lisp platform appeals to idiosyncratic visions for completist platforms. There's a looseness in the community's coherence as a result.
743+
744+For a few reasons, the Urbit community has managed to avoid such splintering (the [Urbit Classic joke](http://urbit-classic.org/) aside). With a single sponsoring organization, first Tlon Corporation and since 2022 the Urbit Foundation, to steward the ecosystem and a philosophical commitment to protocol-as-platform, Urbit should avoid partition into competing bazaars.
745+
746+Urbit's governing philosophy as a technical program is laid out in the [Precepts](https://urbit.org/blog/precepts). A sampling:
747+
748+> A.13. If you don't completely understand your code and the semantics of all the code it depends on, your code is wrong.
749+
750+> A.16. Explicit state is better than implicit state.
751+
752+> A.20. One hundred lines of simplicity is better than twenty lines of complexity.
753+
754+> D.3. Not being qualified to solve a problem is no reason not to solve it.
755+
756+There is significant overlap here with the ideals of the Lisp developer community present. Scheme like Hoon aims at minimalism and ample use of lambda expressions. [Clojure](https://www.clojure.org/about/rationale) aims at strengthening Lisp by building it on a modern platform (the JVM); it would agree with Urbit's disdain for nondeterminism: “pervasive, unmoderated mutation simply has to go”. Racket was designed for production systems and to some extent with a hope to unify parts of the developer stack.
757+
758+In many ways, Hoon is more Lisp-y than Lisp: that is, it represents a point more polar towards the telos of Lisp than any extant Lisp. By shedding the skin of lists and focusing on binary trees, Urbit achieves a deeper conceptual unification within itself. Hoon doesn't properly supersede Lisp—it requires running on a particular VM architecture, for instance—but Hoon's focus on typing, the nature of Hoon's binary-tree homoiconicity, and its employment of pure functional concepts make it a strong new tool for those to whom Lisp already appeals.
759+
760+Hoon goes farther than Lisp, however. Hoon is an accessible and practical, if unconventional, tool for simplifying the developer stack, ultimately to a single language. Ultimately, Urbit is a technical project to encode human digital freedom into the very protocol we use—with Hoon its nose-to-tail _lingua franca_. Hoon carries the torch that Lisp kindled into a new user-oriented future.
761+
762+To close, I quote Urbit Foundation CTO Ted Blackman on why Urbit follows its particular design discipline:
763+
764+> The promise of Urbit lies in its reimagination of the digital world using components that are as constrained and limited as possible. By adhering firmly to principle and doubling down on minimalism at every turn, we get an OS that provides far stronger guarantees than Unix with a thousand times less code. Given the complexity of modern software, this is what's required to put personal computing back into the hands of people. (Ted Blackman ~rovnys-ricfer, [“Why Hoon”](https://urbit.org/blog/why-hoon))
content/blog/pin-the-face-that-launches-a-thousand-ships.mdnew file+146
@@ -0,0 +1,146 @@
1++++
2+title = "Pin the Face that Launches a Thousand Ships"
3+date = "2023-04-07"
4+description = "A guest post by ~nospex-larsut"
5+[extra]
6+image = "https://storage.googleapis.com/media.urbit.org/blog/6a0120a85dcdae970b016766c94c14970b-800wi.jpg"
7+author = ""
8+ship = "~nospex-larsut"
9++++
10+_The original article can be found [here](https://nospex-larsut.arvo.network/blog/whyhoon) using [%blog](https://urbit.org/applications/~hanrut-sillet-dachus-tiprel/blog)._
11+
12+![](https://storage.googleapis.com/media.urbit.org/blog/6a0120a85dcdae970b016766c94c14970b-800wi.jpg)
13+
14+## Pin the Face that Launches a Thousand Ships[^1] ##
15+_A short piece addressing some of the standard hesitations to learning Hoon, considered in light of all of the recent exciting network activity._
16+
17+### Setting The Table ###
18+One can draw many distinctions between the Urbit apps that were available this time last year and those released thus far in 2023, but the most important of these may be that the former were apps noticed and used almost exclusively by users already on Urbit, where the latter - notably Pongo, Realm, Tirell Studio, Groups 2, Portal, etc - are apps that are _creating Urbit users_.
19+
20+Prior to the start of 2023, the superficial, yet incomplete, take was something to the effect that much of Urbit’s appeal was largely an affinity with the ideas and principles surrounding the project.
21+
22+People who found their way to Urbit latched on to philosophical entry points, among them values such as calm computing, decentralized/privacy/data-ownership maximalism, or aspirations of replacing a generations-deep legacy computing system that entrenched an ethos of doing things fundamentally inefficiently & incorrectly, in ways that not only hobbled the potential of the internet, but resulted in outright harm to its users through establishing platform models and incentives that consciously sought to manipulate the behavior of those users in countless subtle and not-so-subtle ways.
23+
24+Urbit was a nexus, collecting people from disparate backgrounds & disciplines to something like a spiritual oasis, yes, though one seemingly situated a million miles from anywhere familiar to the outside world; its appeal was more a function of the shared ethos of the community and a shared sense of its potential rather than the existence of new & immediately useful alternatives for day-to-day compute tasks.
25+
26+The energy of Assembly '22 was palpaple; it almost seemed that widespread adoption was around the corner. Inevitably, some of the post-Assembly ‘22 buzz seemed to fizzle as the ensuing months went by; many ships launched during that time went dormant, wondering if the potential hinted at would materialize; the shallow criticisn/meme for getting on to Urbit became, “I’m here… um, now what.”
27+
28+This whole time though, the project was simultaneously also an incredibly busy construction site.
29+
30+Remarkably short-lived, “I’m here… um, now what?’ is unraveling with the realization that this universe has always been accelerating, and this new wave of apps establishes a very visible & powerful reference point for truly appreciating that acceleration and the distance traveled; after what seemed like a brief post-Assembly fizzle, the network is again kinetic and crackling with energy, but in reality it was never slowing down.
31+
32+The latest generation of apps marks an important shift in the trajectory of Urbit adoption. Much of this is possible thanks to the proliferation of hosting options - whether [Native Planet’s](https://nativeplanet.io/) self-hosted solutions or through turnkey models - which collectively have vastly streamlined the Urbit onboarding process such that getting on the network is no longer the equivalent of scaling a forbidding & remote mountain peak, arriving at the threshold of a silent monastery, heaving its heavy door ajar to find it seemingly abandoned only a thin sliver of light to illuminate your path, nobody there to acknowledge your arrival much less offer a tour. The thrill of having finally gotten there dampened by the increasing sense that all of its life is subterranean and the real journey is just beginning.[^2]
33+
34+Single-click onboarding and preloaded apps & groups may not seem like a lot for newcomers, but these things have increased tremendously the ability to get on Urbit compared to just six months ago.
35+
36+And just as a selection of competing hosting providers expanded the number of possible onramps, this new crop of Urbit apps likewise provides a complimentary function as entry points - hidden doors to Urbit embedded in the Apple/Android app stores - in ways that Urbit apps never enjoyed previously, all helping to further reduce the friction of onboarding by orders of magnitude. A user searching for a Telegram alternative stumbles across Pongo; new eyes find Urbit without ever intentionally seeking it out.
37+
38+The animating ideas behind the project, I think, remain as alive as ever - Urbit does not need to jockey to become the ‘current thing’ if it can much more efficiently become the undercurrent thing; without having to waste a single breath converting users at the margin on the necessity or virtue of recreating the web in a decentralized & privacy-oriented manner, new users are able to become advocates for apps that provide practical utility for day-to-day compute, creative, and communication needs - but that also happen to be built on such infrastructure. The yew tree doesn’t propagate itself by trying to convince the bird that it is desirable that there be more yew trees in the world, it just wraps its seed in a tasty & nutritious berry and lets the bird carry it off.
39+
40+Compelling apps, built on continually-improving and innovative infrastructure & development tooling is one piece of the adoption curve. These things bring users, who bring perspectives, feedback, ideas, wants, and needs. It brings their attention to earn it. If they are spending time on Urbit apps, they will also be exposed to whatever else is being shared on Urbit through those apps – what will catch their attention that maybe they are not seeing elsewhere? Suffice to say this is all basically network effects 101, so on to the question of learning Hoon.
41+
42+### Some Grains of Salt ###
43+Perhaps that was a lot of table-setting to get to the original inspiration of this piece, in which I wish to present some arguments to the standard objections or concerns that seem to arise for people thinking of learning Hoon. My aim is not to twist any arms or legs, but only to offer some considerations for those on the fence. Hopefully the preceding bit of history at least reveals some shred of the potential opportunities for Hooners (and other creatives - we absolutely need those as well).
44+
45+But first the grain of salt with which you should take the following:
46+I currently Hoon at something approximating a tenth-grade level. I am by no means a natural born developer, nor am I moving towards a dynamic career switch to full-time Urbit dev. Not by any stretch of the imagination. While I am interested in continuing to learn Hoon for a variety of reasons, none are likely to reverberate very far beyond my own ship.
47+
48+My Hoon education began in the summer/fall ’22 cohort of Hoon School Live. In my early 40’s, I walked into it slightly intimidated by its reputation, and with a personal technical background not much deeper than writing Excel formulas, a little Python, and building simple websites (like, 20 years ago). At the moment, I am much better at reading it than writing it, but thanks to HSL & ASL (and everyone involved with those efforts), it does make sense to me.
49+
50+So despite not exactly practicing what all I am about to preach, the foregoing, combined with having talked to enough people on the fence about learning Hoon, I feel somewhat qualified to at least offer some perspective for those considering the question.
51+
52+### The Standard Hesitations ###
53+The following hesitancies seem to be the recurring ones, and we’ll take them one at a time, although they share a significant degree of overlap.
54+<ol>
55+<li> But I already know languages x, y, z, etc and can build things with them now.</li>
56+<li> I hear Hoon is very difficult / weird / etc.</li>
57+<li> Urbit’s future is uncertain; investing in learning Hoon seems risky.</li>
58+<li> I don’t see many immediate jobs for Hoon devs.</li>
59+</ol>
60+
61+__Hesitancy 1: But I _already know_ languages x, y, z, etc and can build things with them _now_.__
62+
63+A valid contention in that one has invested in skills they are eager to put to use or continue to use. But can you build what you want to build - and where you want to build it? And what is the cost in terms of personal satisfaction to working on something which doesn’t truly excite you?
64+
65+There is something of the sunk-cost fallacy is at work here. It is not always a bad impulse, and opportunity costs are very real. But if there is something compelling about Urbit - and the fact that one is at least seriously considering learning Hoon suggests this is the case - and one is willing to view their existing proficiency in some other language as a demonstration of their capability to learn any programming language, then existing knowledge should not act as a barrier to pursuing new knowledge, particularly if there is a suspicion that working on Urbit may afford more intellectually stimulating and enjoyable opportunities.
66+
67+Consider also that a person working on things that truly animate them, despite maybe being relatively less experienced in the language, nonetheless has much more room to grow in a smaller pool where they may create closer connections, have more access to the perspectives of experienced devs, and get noticed for their contributions faster than those that may exist for a person working on things they are decidedly less passionate about amidst a pool of thousands.
68+
69+Yet another upside of working in Urbit is the sheer amount of projects yet to be built (not all require Hoon, btw); projects that may be intriguing to a developer but which already exist in some other language/product have yet to be built on here, and there is a need for them. The amount of still low-hanging fruit and infrastructure work remaining to be done, let alone potential app and utilities, is substantial, and this is a community that generally speaking, respects anybody who can come in and start contributing with minimal direction or permission.
70+
71+And is time spent learning Hoon really time spent not building things? Are you not building skills, reputation, friendships, problem-solving skills, camaraderie - building a better self - throughout the learning process? One can easily present the argument that the cost in this regard is much less than it may seem at first glance.
72+
73+Since one can only try to subjectively weigh the opportunities open to them with their current skills against the nebulous costs of _not_ pursuing something that has piqued their interest, the dilemma often cannot but remain unanswered until one takes the steps to find out; until then, it remains a persistent, nagging 'what if'?. It may take several months to feel really comfortable writing Hoon, but there is a relatively low cost to spending a few weeks to dive in and see if one has an aptitude or affinity for it.
74+
75+__Hesitancy 2: Hoon is difficult and/or weird.__
76+
77+Recognizing that there are a lot of runes, and that Hoon is odd compared to other languages,
78+
79+- learning just a handful[^3] of them along with the basic families (create cores with | runes, call functions with % runes, conditionals statements are built with ? runes, etc) will get one well on their way. </li>
80+- if Hoon is not your first language, you have already demonstrated a capacity for becoming comfortable working within a framework of structure and syntax that was, relative to your previous inexperience, alien and weird. And while there are additional wrinkles in dealing with a functional language, the majority of CS concepts remain relevant and are transferable.
81+
82+And if Hoon is your first language, it is all uncharted territory anyway and not having anything to compare it to means one is essentially in the same situation as in learning any new language, and in that respect it mirrors almost any endeavor to grasp new modes of problem-solving under a unique set of conditions and constraints. Even if you do not stick with Hoon, the new perspectives in problem-solving experience are valuable, and most of the fundamental concepts will be transferable to other languages.
83+
84+You might also consider how to use Hoon’s reputation for difficulty to your advantage from the standpoint that, if you are firmly convinced that it is or will be unduly difficult, then that should yield a much deeper satisfaction after proving you are in fact capable of learning it.
85+
86+And from a more opportunistic standpoint, realize that others who allow this reputation to dissuade them create outsized opportunities for those who are willing to learn it. One can very usefully calibrate expectations here to use the reputation to provide some cover - if it really is that hard, iit is ok to not get it at first, and you can succeed where others gave up or failed to even try.
87+
88+Speaking from my own experience, the sheer amount of terminology was somewhat overwhelming at first, and this was true of both HSL & ASL (more so the latter, IMO). Many of the names seem arbitrary, but like anything, making it familiar is largely a function of effort.
89+
90+Recognize that Hoon's unique syntax and functional paradigm are integral to its design and purpose. Instead of trying to force parallels between Hoon and other languages or concepts you already know, just immerse yourself in it with an open mind and willingness to grasp its distinct features and the reasoning behind them.
91+
92+<div class="polaroid">
93+ <img src="https://storage.googleapis.com/media.urbit.org/docs/userspace/hoon-school/binary-tree-bottom-row-full.png" alt="Tree">
94+ <div class="container">
95+
96+ <p>See - it's easy!</p>
97+ </div>
98+</div>
99+
100+__Hesitancy 3: Urbit’s future is uncertain; investing in learning Hoon seems risky.__
101+
102+Much of the table-setting for this piece was an attempt to frame the potential opportunity for devs of any level. Keeping things in perspective, Urbit is just about to hit [3,000 active ships](https://twitter.com/urbitfoundation/status/1637931937351491584). There are several reasons why recent activity may be much more indicative of even greater future growth than one might assume from looking at the chart:
103+<ul>
104+<li>a. Maybe very obviously, the growth of the last three months is not simply a 1:1 reflection of the work of the last three months, but of the many preceding years of core development that made a significant increase in percentage terms within a very short interval possible. The stage is set for much faster growth.</li>
105+<li>b. Previously mentioned, but all these threads are interconnected in that, the more eyes on Urbit, the more ideas, talent and additional users will be introduced to, and recognize the depth, of the opportunity here. A steadily stabilizing building environment (thanks to a)) that attracts and can support more users should continue to build momentum. </li>
106+</ul>
107+
108+Remaining sober about reality, 3,000 users is not exactly a ton in web 2 terms; for Urbit, it is simultaneously very many and very little. But with better apps providing more reasons to be on Urbit, working in unison with better UX and onboarding, those users have more reason to stay engaged with Urbit once they are on, which means anything an aspiring Hooner or creator can think of to give them compelling reasons to make them even more engaged is an opportunity.
109+
110+Deliberately twisting the fomo screws a little, it is as true for learning Hoon as it is of anything else that the more widely adopted a platform or language becomes, the safer a bet it will be in terms of stability and longevity. With the accretion of that stability however, the window for realizing the benefits of gaining early experience and exposure in a less-crowded space diminishes accordingly as the sense of perceived riskiness in staking ground there decreases. Like any investment, uncertaintly about the future carries the gift of a difficult to quantity but very real species of camaraderie, credibility, and respect that is only available to those willing to get involved at early stages, and which is lost as the project starts to look increasingly like a 'sure thing.' Hard to value, but weigh that aspect when considering if one should begin learning now or wait until things look ‘slightly more certain’ - what is the bar for this certainty? What is ‘certain enough’?
111+
112+Urbit, by (beautiful) design, is a very low-time preference project in some respects, but it is growing quickly. And the longer you’ve been watching Urbit grow, the more perspective you have of how much can happen in a very short time.
113+
114+When there are 10,000, 100,000 active ships it will be a trip in itself to remember that you started learning Hoon back when there were "only" 3,000, and contributed in maybe some non-trivial way to attract some quantity of new ones by building something you were excited about building.
115+
116+__Hesitancy 4: I don’t see many immediate jobs for Hoon devs.__
117+
118+_Not yet you don’t_. Much of the response to Objection 3 is also relevant here.
119+
120+The pool of Urbit companies is not fixed. It is not an insurmountable obstacle to start up a small-scale dev shop with a handful of talented devs.
121+Money flowing into Urbit is being reported with increasing frequency, and this is only the incoming money that you _hear about_. As Urbit grows, money will chase money, bringing more jobs and more opportunities. For better, or worse, of course, money changes things - more money will necessarily mean more discipline, more focus on shipping product, etc. But not having money changes things too. Money comes here in no small part because it sees the energy and intensity with which this community has been building out Urbit - regardless of whether money was flowing in or out of it - it attracted devs because the project itself was an ambitious worthwhile good in itself.
122+
123+There is much opportunity here for bright, motivated developers willing to make the effort to learn. One only has to bump the total current dev headcounts up against the growing momentum of the project to see the opportunity, whether it be in core projects, apps, or novel pairings with creators to determine ways to distribute and produce content on Urbit. The speed of deployment on Urbit compared to other projects and relative exposure to other platforms affords a significant advantage to motivated, talented people in terms of visibility - when an app gets published on Urbit, everyone sees it.
124+
125+### Wrapping Up ###
126+Hopefully the above provides some perspetive on reframing some of the standard hesitancies. None of them are irrational. However, if none of the above sways you, ask what projects or features might materialize on Urbit that would make you wish you started learning Hoon a year ago (which, in the grand scheme, would make you a reasonably well-experienced Hooner) and then consider that you could wait for that thing to materialize, or play an active part in making it a reality that will attract many other users to the network, along with making others feel like they should have started learning Hoon a year ago.
127+
128+And if the Hoon question is indeed a recurrent & nagging one, attempt to replace it with the question, “two months from now (approximately the duration of an HSL cohort), would I rather have tried learning Hoon and discovered that I don’t like it and be done with the question, or still be sitting here wondering if I should learn Hoon?”
129+
130+The resources for learning Hoon are growing:<br>
131+● [Hoon School Live](https://developers.urbit.org/courses/hsl)<br>
132+● [App School Live](https://developers.urbit.org/courses/asl) <br>
133+● [App Workshop Live](https://developers.urbit.org/courses/awl) <br>
134+● An upcoming [Core Dev course](https://developers.urbit.org/courses/csl)<br>
135+● The growing corpus of [documentation](https://developers.urbit.org/reference/hoon/overview)<br>
136+● And of course the most valuable resource of all is all the people on the network who are willing to answer questions and help one learn. Find them in the Hacker House.
137+<p>
138+
139+If something about Urbit is drawing you toward it, if the project resonates with you in a way that other things in tech do not - if you are truly intrigued by it and want to be here - it is reasonable to assert that the process of learning Hoon is not simply a tax with questionable upside, but a productive process in and of itself; that the very process of learning it will embed you deeper into a space you want to be in.
140+
141+So learn Hoon. Not only is it fun, but as an Urbiter, it is something of a cultural heritage, and the conduit between reality and whatever your endless imagination conceives Urbit’s potential to be - space here is wide open, and any of today’s aspiring Hooners has the potential to pin the face that launches a thousand ships.
142+
143+----------------
144+[^1]: To 'pin a face' is to declare a variable in Hoon.
145+[^2]: Maybe some slight dramatization; this aspect also made it fun for those not in need of immediate gratification.
146+[^3]: [See 'Rune Utilization in Hoon'](https://developers.urbit.org/blog/rune-frequency-202212)
content/blog/using-urbit-in-2023.mdnew file+55
@@ -0,0 +1,55 @@
1++++
2+title = "Using Urbit in 2023"
3+date = "2023-02-06"
4+description = "There are more ways to run Urbit than ever, and more options coming soon."
5+[extra]
6+image = "https://storage.googleapis.com/media.urbit.org/blog/usingurbit-2023.jpg"
7+author = "Josh Lehman"
8+ship = "~wolref-podlex"
9++++
10+
11+![](https://storage.googleapis.com/media.urbit.org/blog/usingurbit-2023.jpg)
12+
13+Recent years have seen several iterations on ways to run an Urbit node and join the network. [Port](https://github.com/latterbolden/port) and support for running Urbit from Windows were added a couple of years ago and have previously been recommended ways of running Urbit. We no longer recommend these options for the vast majority of users in favor of better options that are now available.
14+
15+Read on to learn about the background underpinning these decisions and your options for joining the network going forward.
16+
17+
18+
19+# Background
20+
21+With the introduction of Landscape in 2020 the demand for being on the network rose substantially from what it had been, yet the only way of running Urbit was through the command line, which was a significant barrier for entry.
22+
23+In 2021 Port and a native Windows binary were both introduced via contributions from the open source community: Port was built via our [grants](https://urbit.org/grants/cross-platform-desktop-urbit-app) [program](https://urbit.org/grants), and the Windows binary was contributed via a [pull request](https://github.com/urbit/urbit/pull/4675). Together, these two projects enabled users to run Urbit locally without requiring command-line knowledge. Port was summarily added as an officially recommended way to run Urbit.
24+
25+Over the course of 2022 it became clear that, while often useful for trying Urbit out, the experience of running Urbit locally via Port was fundamentally limited: Urbit runs best as a server, and laptops provide neither a stable running environment nor consistent web-based access from other devices.
26+
27+Windows presented further challenges, particularly around maintenance: our team of runtime engineers has had their progress stymied by the need to support Windows, which has substantially different requirements from macOS and Linux. It’s ultimately much more important to our team that we make progress on the versions of the runtime that run well in a server environment, which is the best way to use Urbit, than for local installations.
28+
29+Going forward we no longer recommend Port as an officially supported option for joining the network, and have dropped support for the native Windows binary as of version [1.16](https://groups.google.com/a/urbit.org/g/dev/c/3S6A8Qf8Qzg) of the runtime. That said, it’s worth noting that Port *is not deprecated*! It is still actively [maintained here](https://github.com/latterbolden/port) by the same people that have been maintaining it since the beginning.
30+
31+Let’s move on and talk about your options for getting on the network going forward.
32+
33+
34+# Joining the Network Today
35+
36+Over the course of 2022 many companies emerged and built products that will get you on Urbit, and their teams are constantly working to provide you with a great experience.
37+
38+If you’re not comfortable at the command line you should use a [hosting provider](https://urbit.org/getting-started/hosted). Hosting providers run your Urbit for you and take care of any ongoing maintenance required. If you eventually want to transition to running Urbit yourself, they’ll let you pack up your node and run it however you want: whether that’s at a different hosting provider or your own infrastructure. Learn about [recommended hosting providers in our getting started guide.](https://urbit.org/getting-started/hosting-providers)
39+
40+For more technical users the [command line](https://urbit.org/getting-started/cli) is still a reliable option. For casual testing you can boot a planet or comet on your local macOS or Linux-based machine, and for more serious usage you should refer to our [cloud hosting guide](https://urbit.org/getting-started/cloud-hosting) to get set up on a VPS. A newer option for self-hosting is [Native Planet’s](https://nativeplanet.io) suite of [software](https://www.nativeplanet.io/software) for turning a local computer into an Urbit server complete with DNS.
41+
42+
43+# Coming soon
44+
45+New options for joining Urbit are just around the corner.
46+
47+Word has it that [Tlon](https://tlon.io/hosting) will soon allow you to invite your friends to groups directly from within their [suite of applications](https://tlon.io/landscape), with onboarding handled seamlessly through their hosting service.
48+
49+[Holium’s Realm app](https://www.youtube.com/watch?v=gdu4QtFR-Bs), a collaborative desktop computing environment available on macOS (for now), allows users to sign up with an existing Urbit or brand new hosted one — all seamlessly surfaced through Realm’s signup flow. You can sign up for the private alpha [here](https://holium.com).
50+
51+Tirrel’s [Scene](https://planet.one/scene) is a desktop application with built-in hosting, like Realm, that works on macOS, Windows and Linux, and it’s available now. Hosting is powered by their [Planet One](https://planet.one) service.
52+
53+For the self-hosting enthusiasts out there Native Planet has created [purpose-built Urbit home servers](https://www.nativeplanet.io/hardware) that [make self-hosting easy](https://twitter.com/jmrphy/status/1616196970384887808) and look great doing it.
54+
55+Joining Urbit has never been easier, and it’s constantly getting easier. See you on the network!
content/campus/_index.mdnew file+37
@@ -0,0 +1,37 @@
1++++
2+title = "Software Developers"
3+slug = "software-developers"
4+description = "Getting started as a software developer on Urbit"
5+sort_by = "weight"
6++++
7+
8+
9+Urbit offers foundational primitives that make it easy to build decentralized applications. This means developers can focus on creativity and application logic instead of operations to make sure the server or database doesn't go down.
10+
11+
12+Here are a few links to resources for developers:
13+
14+
15+### [Urbit Developers Overview](https://developers.urbit.org/)
16+An overview of using Urbit for development.
17+
18+### [Lightning Tutorials](https://developers.urbit.org/guides/quickstart/intro)
19+Get a feel for the process of making and deploying an Urbit app in half an hour, no previous experience required.
20+
21+### [Core Curriculum](https://developers.urbit.org/guides/core)
22+Learn the Urbit stack at your own pace.
23+
24+The Foundation also regularly runs a series of cohort-based live courses that go over the core curriculum, free and open to all. One lesson per week over the course of about eight weeks.
25+
26+### [Live Courses](https://developers.urbit.org/courses)
27+Learn the Urbit stack as part of a group.
28+
29+### [New Hooniverse](https://urbit.org/groups/~hiddev-dannut/new-hooniverse)
30+Discussion group for learning the Urbit stack. Open to beginner, intermediate, and advanced developers.
31+
32+
33+### [TomeDB](https://holium.gitbook.io/tomedb/)
34+A framework for building Urbit apps solely with Javascript.
35+
36+### [Grants](https://urbit.org/grants)
37+Build on Urbit and take ownership of the network in the process.
content/campus/blockchain-enthusiasts.mdnew file+35
@@ -0,0 +1,35 @@
1++++
2+title = "Blockchain Enthusiasts"
3+slug = "blockchain-enthusiasts"
4+description = "Learn how sound computing and sound money fit together"
5+weight = 4
6+[extra]
7+flatten_pagination = "true"
8+hide_next_title = "true"
9+hide_previous_title = "true"
10+image = "https://media.urbit.org/site/understanding-urbit/urbit-id/urbit-id-cards%402x.png"
11++++
12+
13+We have yet to see the promised Cambrian explosion of general-purpose decentralized applications promised by blockchains. What happened?
14+
15+While blockchains are good for some problems, there remain others where a more general purpose computing solution is more useful. This is precisely what Urbit is for. Urbit’s vision of sound, easy-to-use, decentralized computing dovetails neatly with that of sound, easy-to-use, decentralized money.
16+
17+Learn more on how Urbit and blockchains work together:
18+
19+### [Bitcoin on Urbit: The Sovereign Stack](https://urbit.org/bitcoin)
20+How Urbit and Bitcoin fit together
21+
22+### [Azimuth](https://developers.urbit.org/reference/azimuth/azimuth)
23+Urbit’s PKI system on Ethereum
24+
25+### [Uqbar](https://uqbar.network)
26+The Urbit-native blockchain
27+
28+The leader in this space is Uqbar, an Urbit-native layer 2 blockchain that settles on Ethereum.
29+
30+From their [clearpaper](https://uqbar-network.gitbook.io/uqbar-clearpaper/uqbar-clearpaper/uqbar-clearpaper):
31+
32+>Leveraging Urbit’s peer-to-peer infrastructure, Uqbar provides a blockchain-native decentralized operating system uniquely positioned to deliver the composable primitives necessary to build a rich, functional distributed application layer. It fuses the trusted settlement of Ethereum with the decentralization, security, and interoperability benefits of full-scale peer-to-peer networking, unlocking the latent power of programmable blockchains.
33+
34+
35+
content/campus/creatives.mdnew file+21
@@ -0,0 +1,21 @@
1++++
2+title = "Creatives"
3+slug = "creatives"
4+description = "Urbit for everyone"
5+weight = 5
6+[extra]
7++++
8+
9+Urbit offers creatives the means to truly own the distribution of their work. An application becomes a tool you own rather than a service whose terms can change overnight. And with digital ownership on a decentralized network, the incentives of advertising based centralized services and an attention economy no longer apply.
10+
11+What would the world look like with more decentralized digital ownership? Check out the links below for a preview.
12+
13+### [Tirrel Studio](https://urbit.studio)
14+
15+Host, publish, and earn on Urbit. See the [Mars Review of Books.](https://marsreview.org/)
16+
17+
18+### [Meetup Grant](https://urbit.org/grants/community-meetups)
19+
20+Through our Grants program, the foundation rewards community-builders who
21+host regular meetups and help people learn about the project.
content/communities/urbit-christchurch.md+1−1
@@ -1,7 +1,7 @@
11+++
22title = "Urbit Christchurch"
33description = ""
4−image = "https://silo.sgp1.digitaloceanspaces.com/silo/dinnul-namrud/2023.1.20..04.11.42-Group%20Photo.jpg"
4+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-christchurch.jpg"
55+++
66
77Curious about Urbit? Questions about Hoon syntax? Fed up with the current state of the internet? Join us to talk about the internet's future.
content/communities/urbit-london.md+1−1
@@ -1,7 +1,7 @@
11+++
22title = "Urbit London"
33description = ""
4−image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-london.png"
4+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-london.jpg"
55+++
66
77Urbit London is a monthly, occasionally biweekly, meet-up series aiming to establish a long-lasting community within the London tech and cultural scene.
content/communities/urbit-mst.mdnew file+13
@@ -0,0 +1,13 @@
1++++
2+title = "Urbit MST (Utah)"
3+description = ""
4+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-utah.png"
5++++
6+
7+Are you looking for more than the options presented to you?
8+
9+Come to our Urbit (MST) meetup. All are welcome. Bring a computer and we can onboard you with a planet and hosting for free on site. Whether you are new to Urbit or fluent in Hoon, come and meet others in Utah interested in Urbit.
10+
11+––
12+
13+[Website](https://urbitmst.org/)
content/communities/urbit-paris.mdnew file+23
@@ -0,0 +1,23 @@
1++++
2+title = "Urbit Paris"
3+description = ""
4+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbitparis.png"
5++++
6+
7+Join us for our monthly Urbit meetups in Paris!
8+
9+Whether you're a tech enthusiast, an established Urbit aficionado, or a newcomer to the scene, our community is meant to welcome and engage everyone.
10+
11+If you're confused about what Urbit is, no worries, most people are at first. Drop by and we'll give you our best explanations of what Urbit is and how it's going to change the internet as we know it.
12+
13+We'll introduce Urbit, help you boot your own ship, and make sure you go back home all set!
14+
15+See you there!
16+
17+––
18+
19+~solsup-soplyd/urbit-paris
20+
21+[Twitter](https://twitter.com/urbitparis)
22+
23+[Meetup](https://www.meetup.com/urbit-paris/)
content/ecosystem/spotlight/2023-february.mdnew file+48
@@ -0,0 +1,48 @@
1++++
2+title = "February 2023"
3+date = "2023-02-01"
4+
5+[featured-1]
6+title = "Realm"
7+description = "Realm is a desktop Urbit interface from that offers a variety of integrated features."
8+image="https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/realm-hero.png"
9+content = """
10+
11+Realm proposes an Urbit experience that is outside the browser, running as a full-screen cross-platform native application. It offers features like shared application suites, built-in audio chatrooms, an integrated crypto wallet, as well as its own web browser.
12+
13+![](https://media.urbit.org/site/featured/realm-screenshot.jpg)
14+
15+Realm is the flagship product of Holium, who are also building out several collaboration tools akin to a cloud productivity suite for Urbit and Realm. These applications can be bundled together into unique spaces – desktop environments that have been configured for communities and teams.
16+
17+![](https:///media.urbit.org/site/ecosystem/applications/app-suite.png)
18+
19+Realm is currently in private alpha. Visit [holium.com](https://holium.com) to sign up for the invitation waitlist. In the meantime, you can also enjoy an [entertaining podcast](/podcasts/2023-01-24_reject-triviality) in which Holium founder `~lomder-librun` talks about his vision for Realm, amongst many other interesting topics.
20+
21+"""
22+
23+[featured-2]
24+title = "Native Planet"
25+description = "Native Planet is building Urbit-native hardware as well software which enables standalone Urbit home servers."
26+image="https://storage.googleapis.com/media.urbit.org/site/ecosystem/spotlight/native-planet-thumb.jpg"
27+content = """
28+
29+Native Planet is Urbit's first dedicated hardware company. Their first product, the [Tellurian](https://www.nativeplanet.io/hardware), is a turnkey Urbit computer that you can run at home and access anywhere thanks to Native Planet's open-source [software](https://www.nativeplanet.io/software).
30+
31+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/getting-started/native-planet.jpg)
32+
33+What's the point of having a physical Urbit computer, besides the fact that they look very cool?
34+
35+You get the best of both worlds: the accessibility of cloud hosting, with the ownership of running Urbit locally. Groundseg and Startram make your Urbit accessible to any networked device without the need to trust any cloud service provider.
36+
37+
38+"""
39+
40+[featured-3]
41+title = "Urbit for Idiots | Galen Wolfe-Pauly, Tlon Corporation"
42+description = "Tlon CEO Galen Wolfe-Pauly talks to the Boys Club ladies and expounds on the fundamentals of Urbit."
43+image=""
44+content = """
45+
46+Is Urbit a computer? Is owning 'space' on the internet valuable? What is Urbit? How is it different from the the existing internet? Galen and Boys Club get to the bottom of these evergreen topics.
47+"""
48++++
content/ecosystem/spotlight/2023-june.mdnew file+40
@@ -0,0 +1,40 @@
1++++
2+title = "June 2023"
3+date = "2023-06-05"
4+
5+[featured-1]
6+title = "Labyrinth DAO"
7+description = ""
8+image=""
9+content = """
10+
11+Labyrinth DAO is a new decentralized autonomous organization for investing in Urbit projects. Supported by [Tribute Labs](https://tributelabs.xyz/), Labyrinth DAO will foster the growth and development of Urbit as it paves the way for the new internet. Find Labyrinth DAO on [Twitter](https://twitter.com/labyrinth_dao) or connect at labyrinthdao.io to get involved.
12+
13+
14+"""
15+
16+[featured-2]
17+title = "Osmosis"
18+description = ""
19+image=""
20+content = """
21+
22+Holium’s AJ LaMarc (~larryx-woldyr) has built Urbit front-ends for Uniswap, Osmosis, and Safe. This means that you can now swap or hold tokens and access your multi-sig from the comfort of your Urbit. You don’t have to rely on centralized services to provide interfaces for your favorite web3 platforms. You can download these apps on your Urbit today.
23+
24+Get
25+[Osmosis](/applications/~larryx-woldyr/osmosis) |
26+[Uniswap](/applications/~larryx-woldyr/uniswap) |
27+[Safe](/applications/~larryx-woldyr/safe)
28+
29+"""
30+
31+[featured-3]
32+title = "Zorp"
33+description = ""
34+image=""
35+content = """
36+
37+Zorp has built a secure-by-design zero-knowledge virtual machine (zkVM) with a uniquely minimal software supply chain which utilizes Nock as its instruction set. Nock, Urbit’s low-level language, is a famously simple instruction set. That property aligns itself well with what you might create if you were designing a language from first principles to do zero-knowledge proofs. Zorp’s zkVM could unlock new possibilities for crypto and more. Check back at Zorp’s [website](https://zorp.io/) and [Twitter](https://twitter.com/ZorpZK) for more info.
38+
39+"""
40++++
content/ecosystem/spotlight/2023-may.mdnew file+50
@@ -0,0 +1,50 @@
1++++
2+title = "May 2023"
3+date = "2023-05-01"
4+
5+[featured-1]
6+title = "The Mars Review of Books"
7+description = "The Mars Review of Books is a magazine in print and on Urbit. The third issue is now available in print and on online."
8+image="https://storage.googleapis.com/media.urbit.org/site/ecosystem/spotlight/mrb3-thumb.png"
9+content = """
10+
11+The *Mars Review of Books*, a magazine in print and on Urbit, recently put out its third issue — with pieces from Sean Thor Conroe, Marc Hochstein, Miles Routledge, Peter Nimitz and more. And now for the first time, the *MRB* is selling digital and print subscriptions exclusively through Urbit.
12+
13+![Mars Review in Print](https://storage.googleapis.com/media.urbit.org/site/ecosystem/spotlight/mrb3.png)
14+
15+Using payment rails from [Studio](http://localhost:3000/applications/~tirrel/studio) by [Tirrel](https://tirrel.io/), you can now plug in your credit card and subscribe directly to content hosted on an Urbit owned and operated by the people producing the content (in this case, the ~bidbel star).
16+
17+Visit marsreview.org to subscribe to the magazine, buy a print copy of Issue 3, or read selected unpaywalled pieces online.
18+
19+
20+"""
21+
22+[featured-2]
23+title = "Portal"
24+description = "Find and curate Urbit apps, groups, and media from fellow Urbit users"
25+image="https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/portal.svg"
26+content = """
27+
28+Portal is a lot like this ecosystem section of the Urbit website, except *on Urbit*. It’s a great place to find Urbit apps, Urbit groups, and recent media about your favorite Urbit developers and community members.
29+
30+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/portal-screenshot.png)
31+
32+Because Portal is on Urbit, networking among peers is built in. Anyone using Portal can curate their own list of apps and groups, and display that to other Portal users. It’s a great proof of concept for the way decentralized curation can work, a lot of fun to use, and the perfect place to start for anyone trying out Urbit for the first time.
33+
34+You’ll have to check it out on Urbit at ~worpet-bildet/portal
35+
36+"""
37+
38+[featured-3]
39+title = "%blog"
40+description = "Host a blog on your urbit with this application from ~dachus-tiprel."
41+image="https://storage.googleapis.com/media.urbit.org/site/ecosystem/spotlight/blog-thumb.png"
42+content = """
43+
44+Blog is just what it sounds like. A new tool from Uqbar, the app lets anyone on Urbit spin up and customize a blog that displays to the net at an auto-generated URL. Nothing could be breezier. Plus it’s got payments through Uqbar and group-blogging settings on the roadmap. Find out more about it on its [creator's blog](https://dachus-tiprel.tlon.network/blog/introducing-blog).
45+
46+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/blog.png)
47+
48+Download it at ~hanrut-sillet-dachus-tiprel/blog and let the world know what’s on your mind. Bonus feature: a simple command allows you to automatically publish the URL of your latest blog entry to the notorious [Rumors](applications/~paldev/rumors) app.
49+"""
50++++
content/events/2023-02-23-urbit-meetup-berlin.mdnew file+27
@@ -0,0 +1,27 @@
1++++
2+title = "Urbit Meetup - Berlin"
3+starts = "2023-02-23T20:00:00"
4+ends = "2023-02-23T23:00:00"
5+timezone = "Europe/Amsterdam"
6+location = "c-base - Rungestraße 20 · Berlin, Deutschland"
7+image = "https://upload.wikimedia.org/wikipedia/commons/6/60/Dr._MeTaMiNd_robolab_c-base_spacestation_hackerspace_Berlin_%2812933669604%29.jpg"
8+registration_url = "https://www.meetup.com/urbit-berlin/events/291660889/"
9+description = ""
10+dark = true
11+darken_image = "true"
12+youtube = ""
13+
14+[[hosts]]
15+patp = "~bithex-topnym"
16+
17++++
18+
19+The first Urbit Berlin meetup at our new location: c-base!
20+
21+If you are new to Urbit, this is a great time and place to learn more.
22+
23+For this first meetup we will simply meet, mingle and discuss new and exciting things happening on the network, like: App School Live, Uqbar, Scene, Native Planet, and the upcoming Volcano Summit in El Salvador.
24+
25+The vibe at c-base is great and retro-technological, there is an bar and we have a table booked just for us. There will be other Meetups on various technological and futuristic topics happening at the same time if you like to mingle around.
26+
27+Please RSVP to the Meetup.
content/events/2023-03-25-urbit-meetup-christchurch.mdnew file+21
@@ -0,0 +1,21 @@
1++++
2+title = "Urbit Meetup - Christchurch"
3+starts = "2023-03-25T10:30:00"
4+ends = "2023-03-25T12:00:00"
5+timezone = "Pacific/Auckland"
6+location = "363 St Asaph Street, Christchurch"
7+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-christchurch.jpg"
8+registration_url = "https://chchurbit.eventbrite.com"
9+description = ""
10+dark = true
11+darken_image = "true"
12+youtube = ""
13+
14+[[hosts]]
15+patp = "~dinnul-namrud"
16+
17++++
18+
19+The next meetup in Christchurch is at The Lotus Heart on the 25th March at 10:30am. Stick around afterwards for a drink and bite to eat if you desire.
20+
21+Please RSVP to the Meetup. Friends are most welcome!
content/events/2023-04-18-urbit-lisbon.mdnew file+19
@@ -0,0 +1,19 @@
1++++
2+title = "Urbit Meetup - Lisbon"
3+starts = "2023-04-20T19:00:00"
4+ends = "2023-04-20T22:00:00"
5+timezone = "Europe/Lisbon"
6+location = "Quiosque São Paulo – Praça São Paulo, 1200-194 Lisboa"
7+image = "https://storage.googleapis.com/media.urbit.org/site/events/lisbon.jpeg"
8+registration_url = "https://www.meetup.com/urbit-sf/events/292978187"
9+description = ""
10+dark = true
11+darken_image = "true"
12+youtube = ""
13+
14+[[hosts]]
15+patp = "~dalweb-donfun"
16+
17++++
18+
19+Around in Lisbon this Thursday? ~dalweb-donfun will be hosting a meetup at 7pm. Come by for a drink with other urbiters. RSVP to the meetup event or send ~dalweb-donfun a message on the network. See you on Thursday!
content/events/2023-04-27-urbit-meetup-berlin.mdnew file+27
@@ -0,0 +1,27 @@
1++++
2+title = "Urbit Meetup - Berlin"
3+starts = "2023-04-27T20:00:00"
4+ends = "2023-04-27T22:00:00"
5+timezone = "Europe/Amsterdam"
6+location = "MUTED HORN – Flughafenstraße 49, 12053 Berlin"
7+image = "https://storage.googleapis.com/media.urbit.org/site/events/DSCF1208_09_10.jpg"
8+registration_url = "https://www.meetup.com/urbit-berlin/events/293050078/"
9+description = ""
10+dark = true
11+darken_image = "true"
12+youtube = ""
13+
14+[[hosts]]
15+patp = "~bithex-topnym"
16+
17++++
18+
19+If you are new to Urbit, this is a great time and place to learn more.
20+
21+Topic: open grants – what do they say about the future of Urbit and what kind of knowledge do you need to start building on them?
22+
23+As always, we are also helping new people get on Urbit to try it out, answer technical questions and discuss philosophical questions around Urbit.
24+
25+We have temporarily changed locations to Muted Horn, one of the best craft beer pubs in Northern Europe. It is also possible to order food from nearby restaurants and eat there. If the weather is great we will be sitting outside.
26+
27+Please RSVP to the Meetup.
content/events/2023-04-27_urbit-austin-meetup-consensus.mdnew file+16
@@ -0,0 +1,16 @@
1++++
2+title = "Urbit Austin – Consensus 2023"
3+starts = "2023-04-27T18:30:00"
4+ends = "2023-04-27T20:00:00"
5+timezone = "America/Chicago"
6+location = "Garage – 503 Colorado St · Austin, TX"
7+image = "https://storage.googleapis.com/media.urbit.org/site/events/garage-austin.jpg"
8+registration_url = "https://www.meetup.com/urbit-austin/events/293135783"
9+description = "Urbit Austin meetup @ Consensus 2023 presented by the Urbit Foundation"
10+dark = true
11+
12++++
13+
14+Come hangout, drink cocktails at our open bar and talk Urbit during Consensus 2023. We will most likely have a short presentation or two from leaders of the top projects being built. We expect attendance from the Urbit Foundation, Tlon, Zorp, Uqbar, Holium, Assembly Capital and more. Rumor has it there might be free Urbit hats too.
15+
16+If you haven't joined the network yet, bring a computer and we will help you get set up. Other than that we'll have some food and good tunes as well. See you there!
content/events/2023-05-10_urbit-meetup-berlin.mdnew file+25
@@ -0,0 +1,25 @@
1++++
2+title = "Urbit Meetup - Berlin"
3+starts = "2023-05-10T20:00:00"
4+ends = "2023-05-10T22:00:00"
5+timezone = "Europe/Amsterdam"
6+location = "MUTED HORN – Flughafenstraße 49, 12053 Berlin"
7+image = "https://storage.googleapis.com/media.urbit.org/site/events/DSCF1208_09_10.jpg"
8+registration_url = "https://www.meetup.com/urbit-berlin/events/293192363/"
9+description = ""
10+dark = true
11+darken_image = "true"
12+youtube = ""
13+
14+[[hosts]]
15+patp = "~bithex-topnym"
16+
17++++
18+
19+We didn't get to cover all we wanted last time and there were lots of outstanding questions, so let's do another extra meetup, rather than wait another month!
20+
21+Tentative topic: Urbit identity, art, and culture. What kind of expression is Urbit uniquely suited for? What would be some cool grants we could apply for?
22+
23+We have temporarily changed locations to Muted Horn, one of the best craft beer pubs in Northern Europe with a cozy vibe. It is also possible to order food from nearby restaurants and eat there. If the weather is great we will be sitting outside.
24+
25+Please RSVP to the Meetup.
content/events/2023-05-14_urbit-meetup-london.mdnew file+23
@@ -0,0 +1,23 @@
1++++
2+title = "Urbit Meetup - London"
3+starts = "2023-05-14T18:00:00"
4+ends = "2023-05-14T20:00:00"
5+timezone = "Europe/London"
6+location = "Cleopatra's Needle – London"
7+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-london.jpg"
8+registration_url = ""
9+description = ""
10+dark = true
11+darken_image = "true"
12+youtube = ""
13+
14+[[hosts]]
15+patp = "~tichus-holnet"
16+[[hosts]]
17+patp = "~dalweb-donfun"
18+
19++++
20+
21+This Sunday we'll be doing a meeting up at cleopatra's needle. You'll recognise us by Urbit caps and citing Hoon outloud. See you all on Sunday, byob. Rach out to us on Urbit in case you can't find us.
22+
23+![Picture](https://storage.googleapis.com/media.urbit.org/site/events/2023-05-11%2011.45.27.jpg)
content/events/2023-05-18_urbit-denver-meetup.mdnew file+19
@@ -0,0 +1,19 @@
1++++
2+title = "Urbit Meetup - Denver"
3+starts = "2023-05-18T18:30:00"
4+ends = "2023-05-18T20:30:00"
5+timezone = "US/Mountain"
6+location = "Avanti Food & Beverage - 3200 N. Pecos St, Denver, CO"
7+image = "https://urbits3bucket.fra1.digitaloceanspaces.com/UrbMeet6.jpg"
8+registration_url = "https://www.meetup.com/mile-high-mars-denver-urbit-group/events/293433336/"
9+description = ""
10+dark = true
11+darken_image = "true"
12+youtube = ""
13+
14+[[hosts]]
15+patp = "~nospex-larsut"
16+
17++++
18+Group will meet at the upstairs tables towards the rear of the venue - just take a left when you get to the top of the stairs. Message on the meetup app or through Urbit/Pongo (~nospex-larsut) if unsure.
19+Please RSVP to the Meetup.
content/events/2023-05-18_urbit-miami-meetup.mdnew file+20
@@ -0,0 +1,20 @@
1++++
2+title = "Urbit Meetup - Miami"
3+starts = "2023-05-18T21:00:00"
4+ends = "2023-05-19T03:00:00"
5+timezone = "America/New_York"
6+location = "Eagle Room @ The Broken Shaker 9PM - 3AM"
7+image = "https://i.imgur.com/8x7hpNv.jpg"
8+registration_url = "https://www.meetup.com/urbit-miami/events/293537002/"
9+description = "Miamese Martian congregation parties all night long. Drinks, Food, DJ. Semi-formal attire."
10+dark = true
11+darken_image = "true"
12+youtube = ""
13+
14+[[hosts]]
15+patp = "~wolfun-batrex"
16+
17++++
18+Group will meet in the Eagle Room. Ask the hostess for directions. Event Space Aesthetic is Spectral South-Beach. DJ comes at 10PM. Bring proof of planet for Miamese Martians.
19+
20+Please RSVP to the Meetup page by clicking the RSVP button above.
content/events/2023-05-27_urbit-meetup-london.mdnew file+21
@@ -0,0 +1,21 @@
1++++
2+title = "Urbit London x Giga"
3+starts = "2023-05-27T19:00:00"
4+ends = "2023-05-27T00:00:00"
5+timezone = "Europe/London"
6+location = "HAMPTON TOWER - CANARY WHARF"
7+image = "https://storage.googleapis.com/media.urbit.org/site/events/Screenshot%202023-05-26%20at%2007.14.48.png"
8+registration_url = "https://lu.ma/a2ksogr8"
9+description = "urbLon × giga present: Water Wellness Retreat"
10+dark = true
11+darken_image = "true"
12+
13+
14+[[hosts]]
15+patp = "~tichus-holnet"
16+[[hosts]]
17+patp = "~narpel-machul"
18+
19++++
20+
21+Next Saturday, make your way to Hampton Tower in Canary Wharf. You will be escorted to the Giga Corp premises, in which the 7th Urbit London meet-up will take place. Expect drinks, discussion, and much more. https://t.me/urblon
content/events/2023-05-27_urbit-meetup-mst.mdnew file+20
@@ -0,0 +1,20 @@
1++++
2+title = "Urbit Meetup - Utah MST"
3+starts = "2023-05-28T17:00:00"
4+ends = "2023-05-28T19:00:00"
5+timezone = "America/Phoenix"
6+location = "LION'S PARK – 950 W 1280 N ST, PROVO, UTAH"
7+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-utah.png"
8+registration_url = "https://urbitmst.org/"
9+description = ""
10+dark = true
11+darken_image = "true"
12+
13+[[hosts]]
14+patp = "~sonmeg-tomdex"
15+
16++++
17+
18+Are you looking for more than the options presented to you?
19+
20+Come to our Urbit (MST) meetup. All are welcome. Bring a computer and we can onboard you with a planet and hosting for free on site. Whether you are new to Urbit or fluent in Hoon, come and meet others in Utah interested in Urbit.
content/events/2023-06-03-urbit-meetup-christchurch.mdnew file+24
@@ -0,0 +1,24 @@
1++++
2+title = "Urbit Meetup - Christchurch"
3+starts = "2023-06-03T10:30:00"
4+ends = "2023-06-03T12:00:00"
5+timezone = "Pacific/Auckland"
6+location = "363 St Asaph Street, Christchurch"
7+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-christchurch.jpg"
8+registration_url = "https://www.meetup.com/urbit-christchurch/events/293265373"
9+description = ""
10+dark = true
11+darken_image = "true"
12+
13+[[hosts]]
14+patp = "~dinnul-namrud"
15+
16++++
17+
18+The next meetup in Christchurch is at The Lotus Heart on the 3rd June at 10:30am. Stick around afterwards for a drink and bite to eat if you desire.
19+
20+Please [RSVP](https://www.meetup.com/urbit-christchurch/events/293265373) to the Meetup. Friends are most welcome!
21+
22+
23+
24+
content/events/2023-06-08_urbit-meetup-berlin.mdnew file+25
@@ -0,0 +1,25 @@
1++++
2+title = "Urbit Meetup - Berlin"
3+starts = "2023-06-08T20:00:00"
4+ends = "2023-06-08T22:00:00"
5+timezone = "Europe/Amsterdam"
6+location = "MUTED HORN – Flughafenstraße 49, 12053 Berlin"
7+image = "https://storage.googleapis.com/media.urbit.org/site/events/DSCF1208_09_10.jpg"
8+registration_url = "https://www.meetup.com/urbit-berlin/events/293860274/"
9+description = ""
10+dark = true
11+darken_image = "true"
12+youtube = ""
13+
14+[[hosts]]
15+patp = "~bithex-topnym"
16+
17++++
18+
19+If you are new to Urbit, this is a great time and place to learn more.
20+
21+Topic: App building
22+
23+We are at Muted Horn, one of the best craft beer pubs in Northern Europe with a cozy vibe. It is also possible to order food from nearby restaurants and eat there. If the weather is great we will be sitting outside.
24+
25+Please RSVP to the Meetup.
content/events/2023-06-08_urbit-meetup-prague.mdnew file+39
@@ -0,0 +1,39 @@
1++++
2+title = "Urbit Meetup Prague"
3+starts = "2023-06-08T14:00:00"
4+ends = "2023-06-08T18:00:00"
5+timezone = "Europe/Amsterdam"
6+location = "loftbubny – U Papírny, 170 00 Praha 7-Holešovice, Czechia"
7+image = "https://storage.googleapis.com/media.urbit.org/site/events/59f4fabd-ac53-4c0d-b578-04d2fe6d4b09.webp"
8+registration_url = "https://lu.ma/urbitprague"
9+description = "Urbit Meetup during Prague Blockchain Week at L2Loft"
10+dark = true
11+darken_image = "true"
12+
13+[[hosts]]
14+name = "Owen Barnes"
15+patp = "~locruc-fonmec"
16+
17++++
18+Urbit - A clean-slate OS and network for the 21st century.
19+
20+​The meetup takes place as part of the [L2Loft](https://lu.ma/l2loft) initiative.
21+
22+​Date: Thursday 8 June, 2023
23+Expected time: 14:00 - 16:00 (it may change!)
24+
25+**​Schedule:**
26+
27+[​Owen Barnes ](https://twitter.com/temporalwave) (~locruc-fonmec) - The Future of Apps
28+
29+​*More TBA*
30+
31+​Register for the event and stay tuned for more information! You can also join the L2Loft [Telegram group](https://t.me/l2loft) or follow [@L2Loft on Twitter](https://twitter.com/L2Loft).
32+
33+​---
34+
35+Urbit is a new kind of computer that you can own completely in ways that matter: networking, identity, & data.
36+
37+​We realized that in order to fix the internet, we had to build a new computer from scratch. Good thing we started over a decade ago.
38+
39+​Today, Urbit is a real system with thousands of users that are building all kinds of communities, software, DAOs, and more. And it’s getting better every day.
content/events/2023-06-12-developer-week.mdnew file+95
@@ -0,0 +1,95 @@
1++++
2+title = "Urbit Developer Week"
3+starts = "2023-06-12T09:00:00"
4+ends = "2023-06-16T17:00:00"
5+timezone = "America/Los_Angeles"
6+location = "Online Event"
7+image = "https://storage.googleapis.com/media.urbit.org/site/events/dev-week-gif.gif"
8+registration_url = "https://www.meetup.com/urbit-sf/"
9+description = "2nd Dev-Week – full of talks, blogs and announcements"
10+dark = true
11+
12++++
13+
14+After the success of our last developer week, we’re hosting another one this year from June 12th to June 16th. This will be a week of online only conversations, build parties, AMAs, blog posts, and other content.
15+
16+There will be watch parties for all streams in the Hacker House on gather.town. Instructions for joining can be found in the [Urbit Foundation group](/groups/~halbex-palheb/uf-public).
17+
18+## Schedule
19+### Kicking Off Developer Week
20+*Time:* Monday June 12th – 9am Pacifc | 6pm CEST
21+
22+We will kick off Urbit developer week with an introduction by ~wolref-podlex, ~lagrev-nocfep & ~dalweb-donfun. They will give you a sneak peek into what's awaiting you at Assembly this year, give you an update about the Foundation and tell you all about how to get involved with Urbit right now. Some very exciting announcements are waiting for you here.
23+
24+[Meetup](https://www.meetup.com/urbit-sf/events/293888554/) | [Youtube](https://www.youtube.com/watch?v=38K2RfaScL8)
25+
26+### %Lick by ~mopfel-winrux
27+*Time:* Monday June 12th – noon Pacifc | 9pm CEST
28+
29+~mopfel-winrux, lead developer at [Native Planet](/organizations/nativeplanet), has taken it upon himself to build a hardware vane that lets your Urbit directly communicate with the machine it's running on. This opens up an array of new possibilities. In this talk ~lagrev-nocfep will interview ~mopfel-winrux about his progress, and we might even see a demo.
30+
31+[Meetup](https://www.meetup.com/urbit-sf/events/294013274/) | [Youtube](https://www.youtube.com/watch?v=TDROdmVW7_0)
32+
33+### Core Roadmap
34+*Time:* Tuesday June 13th – 9am Pacifc | 6pm CEST
35+
36+In this talk our CTO ~rovnys-ricfer, together with ~master-morzod & ~wolref-podlex, will give an update on the Roadmap and talk about other news concerning Urbit’s core development. There are some exciting announcements coming up.
37+
38+[Meetup](https://www.meetup.com/urbit-sf/events/293893446/) | [Youtube](https://www.youtube.com/watch?v=vmqn36RtnBk)
39+
40+### Core Developers AMA
41+*Time:* Tuesday June 13th – 10am Pacifc | 7pm CEST
42+
43+Always wanted to ask the core developers something? In this AMA they will be available to answer any questions you have. Join ~rovnys-ricfer, ~wicdev-wisryt, ~palfun-foslup & ~master-morzod on Tuesday right after the Roadmap presentation.
44+
45+[Meetup](https://www.meetup.com/urbit-sf/events/293893486/) | [Youtube](https://www.youtube.com/watch?v=BolurhVR6N4)
46+
47+### Portal
48+*Time:* Tuesday June 13th – noon Pacifc | 9pm CEST
49+
50+In this talk ~foddur-hodler and ~dilryd-mopreg from [Portal](/applications/~worpet-bildet/portal) will update you on their latest developments. They are excited to share their experiences using solid state subscriptions, to present their ideas on what they're calling *the everything graph*, and to explain why they're "composability-maxxing."
51+
52+[Meetup](https://www.meetup.com/urbit-sf/events/294013283/) | [Youtube](https://www.youtube.com/watch?v=6J8-jlqz2r4)
53+
54+### Core School Preview: Jetting
55+*Time:* Wednesday June 14th – 9am Pacifc | 6pm CEST
56+
57+Core School approacheth. To whet your appetite for the inner mysteries of the kernel, we will discuss how jet-accelerated code works and how to write jets for arms. Join ~lagrev-nocfep & ~rovnys-ricfer at a preview of Core School content. And make sure to check out our [CSL page](https://developers.urbit.org/courses/csl) for more details.
58+
59+[Meetup](https://www.meetup.com/urbit-sf/events/294013289/) | [Youtube](https://www.youtube.com/watch?v=i1GRoY3QDdU)
60+
61+### %Eyre by ~palfun-foslup
62+*Time:* Wednesday June 14th – noon Pacifc | 9pm CEST
63+
64+Urbit solves a lot of problems with digital identity. But its HTTP server, Eyre, hasn't gotten the memo yet. Two new Eyre features will make identifying incoming HTTP requests much nicer, letting developers deliver richer experiences, even on publicly accessible web pages. Join ~palfun-foslup at this session about %Eyre.
65+
66+[Meetup](https://www.meetup.com/urbit-sf/events/294013295/) | [Youtube](https://www.youtube.com/watch?v=eN_oh_orCcg)
67+
68+### Native UI
69+*Time:* Thursday June 15th – 9am Pacifc | 6pm CEST
70+
71+Using JavaScript on Urbit has always felt a bit off. ~hastuc-dibtux is going to change this with his Urbit Native UI project. Rendering Hoon as a frontend? Piece of cake.
72+In this talk ~palfun-foslup will interview ~hastuc-dibtux about his project. Don’t miss the future of UIs.
73+
74+[Meetup](https://www.meetup.com/urbit-sf/events/293893568/) | [Youtube](https://www.youtube.com/watch?v=1l9dnppQO1U)
75+
76+### Integrating Uqbar Transactions
77+*Time:* Thursday June 15th – noon Pacifc | 9pm CEST
78+
79+Want to know how to integrate Uqbar smart contracts with your app? In this presentation Uqbar's lead developer ~hodzod-walrus will walk you through what it takes to integrate your app with Uqbar's smart contracts. It's easier than you think.
80+
81+[Meetup](https://www.meetup.com/urbit-sf/events/294013302/) | [Youtube](https://www.youtube.com/watch?v=Q-aZZabT6_M)
82+
83+### Vaporware
84+*Time:* Friday June 16th – 9am Pacifc | 6pm CEST
85+
86+In this talk ~harden-hardys will prove that [Vaporware](https://vaporware.network) is not actually vaporware. Get to know what he and his team are up to and you might even see a glimpse or more of their first public project, *Tharsis*.
87+
88+[Meetup](https://www.meetup.com/urbit-sf/events/294013311/) | [Youtube](https://www.youtube.com/watch?v=bh5U5q9Qp_k)
89+
90+### What to Build on Urbit and Why
91+*Time:* Friday June 16th – noon Pacifc | 9pm CEST
92+
93+AJ or ~larryx-woldyr recently launched a suite of Urbit-hosted front-ends for [Osmosis](/applications/~larryx-woldyr/osmosis), [Uniswap](/applications/~larryx-woldyr/uniswap) and [Safe](/applications/~larryx-woldyr/safe). In this talk he'll dive into why he thinks you should build on Urbit and what you should build on it. Tune in to his closing talk of Developer Week on Friday.
94+
95+[Meetup](https://www.meetup.com/urbit-sf/events/294013323/) | [Youtube](https://www.youtube.com/watch?v=AARwK5cGavw)
content/events/2023-06-15_urbit-denver-meetup.mdnew file+19
@@ -0,0 +1,19 @@
1++++
2+title = "Urbit Meetup - Denver"
3+starts = "2023-06-15T18:30:00"
4+ends = "2023-06-15T20:30:00"
5+timezone = "US/Mountain"
6+location = "Federal Bar & Grill - 2544 Federal Blvd, Denver, CO"
7+image = "https://urbits3bucket.fra1.digitaloceanspaces.com/UrbMeet7.jpg"
8+registration_url = "https://www.meetup.com/mile-high-mars-denver-urbit-group/events/293937089/"
9+description = ""
10+dark = true
11+darken_image = "true"
12+youtube = ""
13+
14+[[hosts]]
15+patp = "~nospex-larsut"
16+
17++++
18+Will have a table reseerved to accommodate number of RSVPs; just ask for Adam.
19+Please RSVP to the Meetup.
content/events/2023-06-24-urbit-meetup-christchurch.mdnew file+24
@@ -0,0 +1,24 @@
1++++
2+title = "Urbit Meetup - Christchurch"
3+starts = "2023-06-24T10:30:00"
4+ends = "2023-06-24T12:00:00"
5+timezone = "Pacific/Auckland"
6+location = "363 St Asaph Street, Christchurch"
7+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-christchurch.jpg"
8+registration_url = "https://www.meetup.com/urbit-christchurch/events/294172584/"
9+description = ""
10+dark = true
11+darken_image = "true"
12+
13+[[hosts]]
14+patp = "~dinnul-namrud"
15+
16++++
17+
18+The next meetup in Christchurch is at The Lotus Heart on the 24th June at 10:30am. Stick around afterwards for a drink and bite to eat if you desire.
19+
20+Please [RSVP](https://www.meetup.com/urbit-christchurch/events/294172584/) to the Meetup. Friends are most welcome!
21+
22+
23+
24+
content/events/2023-06-29-Urbit-Paris-Meetup-1.mdnew file+30
@@ -0,0 +1,30 @@
1++++
2+title = "Urbit Meetup in Paris"
3+starts = "2023-06-29T18:30:00"
4+ends = "2023-06-29T21:30:00"
5+timezone = "Europe/Amsterdam"
6+location = "La Fièvre, 108 Rue Oberkampf, 75011 Paris"
7+image = "https://storage.googleapis.com/media.urbit.org/site/events/urbitParis-meetup-1.png"
8+registration_url = "https://www.meetup.com/urbit-paris/events/293962806/"
9+description = "Urbit Paris - Meetup #1"
10+dark = true
11+darken_image = "true"
12+
13+[[hosts]]
14+name = ""
15+patp = "~solsup-soplyd"
16+
17++++
18+Curious what the future of the Internet looks like?
19+
20+Join us on June 29th in Paris!
21+
22+Whether you're a tech enthusiast, an established Urbit aficionado, or a newcomer to the scene, our community is meant to welcome and engage everyone.
23+
24+If you're confused about what Urbit is, no worries, most people are at first. Drop by and we'll give you our best explanations of what Urbit is and how it's going to change the internet as we know it.
25+
26+We'll introduce Urbit, help you boot your own ship and make sure you go back home all set!
27+
28+In the meantime, you can join us on [Twitter](https://wwww.twitter.com/urbitparis)!
29+
30+See you there!
content/events/2023-07-01_urbit-meetup-mst.mdnew file+23
@@ -0,0 +1,23 @@
1++++
2+title = "Urbit Meetup - Utah MST"
3+starts = "2023-07-01T10:00:00"
4+ends = "2023-07-01T11:00:00"
5+timezone = "America/Phoenix"
6+location = "Maeser Park – 451 E 600 S, Provo, UT 84606"
7+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-utah.png"
8+registration_url = "https://urbitmst.org/"
9+description = "Our third meetup in Utah"
10+dark = true
11+darken_image = "true"
12+
13+[[hosts]]
14+name = "Lyman"
15+patp = "~sonmeg-tomdex"
16+
17++++
18+
19+Are you looking for more than the options presented to you?
20+
21+Come to our Urbit (MST) meetup. All are welcome. Bring a computer and we can onboard you with a planet and hosting for free on site. Whether you are new to Urbit or fluent in Hoon, come and meet others in Utah interested in Urbit.
22+
23+This will be our first morning meetup, we will have donuts. Bring your friends. You are invited.
content/events/2023-07-20-Urbit-Paris-Meetup-ethcc.mdnew file+53
@@ -0,0 +1,53 @@
1++++
2+title = "𝓣𝓱𝓮 𝓢𝓾𝓶𝓶𝓮𝓻 𝓢𝓸𝓲𝓻𝓮𝓮 - Paris ETHCC"
3+starts = "2023-07-20T19:00:00"
4+ends = "2023-07-21T1:00:00"
5+timezone = "Europe/Amsterdam"
6+location = "Le Comptoir Général"
7+image = "https://storage.googleapis.com/media.urbit.org/site/events/parisian-tweet-v2.gif"
8+registration_url = "https://lu.ma/parissoiree"
9+description = "Urbit Summer Soiree Paris @ETHCC"
10+dark = true
11+darken_image = "false"
12+
13+[[hosts]]
14+name = "Thomas"
15+patp = "~dalweb-donfun"
16+
17+[[hosts]]
18+name = "Ted"
19+patp = "~rovnys-ricfer"
20+
21+[[hosts]]
22+name = "Sam"
23+patp = "~tidren-nosryg"
24+
25+[[hosts]]
26+name = "Shad (giga)"
27+
28+[[guests]]
29+name = "Illia (co-founder Near)"
30+
31++++
32+Presented by Urbit | giga | NEAR
33+​An evening of salacious chatter and good friends under the night sky and the peering eye of the tower.
34+
35+​Join us on July 20th with other like minds as we manifest the reality around us, drinking and eating till we can no more.
36+
37+​At 19:30 we will record a live episode of the [ZeroK podcast](https://www.youtube.com/@zero-k-podcast/videos) between [Ted Blackman](https://twitter.com/rovnys) (CTO Urbit Foundation) & [Illia Polosukhin](https://twitter.com/ilblackdragon) (CEO Near).
38+
39+​RSVP necessary.
40+
41+*​NB. Due to high demand, please [signup](https://lu.ma/parissoiree) early and consider coming before 19:45 to avoid any disappointment.*
42+
43+![Foto](https://storage.googleapis.com/media.urbit.org/site/events/luma-parisian-event.jpg)
44+
45+​“In the parties which she gave, since I could not imagine the guests as having any bodies, any moustaches, any boots, as making any utterances that were commonplace, or even original in a human and rational way, this whirlpool of names, introducing less material substance than would a phantom banquet or a spectral ball, round that statuette in Dresden china which was Madame de Guermantes, kept for her palace of glass the transparence of a showcase.
46+
47+​Then, after Saint-Loup had told me various anecdotes about his cousin’s chaplain, her gardener, and the rest, the Hôtel de Guermantes had become—as the Louvre might have been in days gone by—a kind of castle, surrounded, in the very heart of Paris, by its own domains, acquired by inheritance, by virtue of an ancient right that had quaintly survived, over which she still enjoyed feudal privileges.”
48+
49+[​Urbit](https://urbit.org/) is a new kind of computer that you can own completely in ways that matter: networking, identity, & data. It's a clean-slate operating system, p2p network and persistent identity.
50+
51+[​giga](https://gigaver.se/) is a hardcore marketing and ecosystem firm bringing projects and networks to the spotlight. Email us today to learn how we take projects from the deep dark depths and put them on a pedestal.
52+
53+[​NEAR](https://near.org/) allows you to effortlessly create and distribute innovative decentralized apps across any blockchain, while helping build a more open web, with the NEAR Blockchain Operating System (BOS).
content/events/2023-08-16_reassembly.mdnew file+22
@@ -0,0 +1,22 @@
1++++
2+title = "Reassembly 2023"
3+starts = "2023-08-16T09:00:00"
4+ends = "2023-08-18T19:00:00"
5+timezone = "America/Phoenix"
6+location = "The Colony Building 211 West 19th Street Cheyenne, WY 82001 United States"
7+image = "https://storage.googleapis.com/media.urbit.org/site/events/https___cdn.evbuc.com_images_517157329_547708747059_1_original.jpeg"
8+registration_url = "https://www.eventbrite.com/e/reassembly-2023-tickets-637686015037"
9+description = "Reassembly 2023, hosted by Tacen, features focused discussions on clean-slate OS, next-generation networks, and the future of computing."
10+dark = true
11+darken_image = "true"
12+
13++++
14+Tacen is proud to host Reassembly 2023 in Cheyenne, WY! Join us August 16-18 for focused discussions and exciting presentations on clean-slate OS, next-generation networks, and the future of modern computing.
15+
16+We will be bringing world-class experts to present their big ideas and new breakthroughs regarding all things related to the Urbit universe. Don’t miss this one-of-a-kind chance to see everyone gathered all in one place.
17+
18+Breakfast, lunch and refreshments provided for attendees. Details on accommodations group rates, schedules, and online viewership to follow.
19+
20+Confirmed speakers: [~hodzod-walrus](https://urbit.org/ids/~hodzod-walrus), [~harden-hardys](https://urbit.org/ids/~harden-hardys), [~littel-wolfur](https://urbit.org/ids/~littel-wolfur), [~dachus-tiprel](https://urbit.org/ids/~dachus-tiprel), [~nomryg-nilref](https://urbit.org/ids/~nomryg-nilref) and more to come!
21+
22+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/events/FwSOS1vXsAIgmZc.jpeg)
content/events/2023-10-28_urbit-assembly-lisboa.mdnew file+24
@@ -0,0 +1,24 @@
1++++
2+title = "Urbit Assembly Lisboa 2023"
3+starts = "2023-10-28T10:00:00"
4+ends = "2023-10-29T20:00:00"
5+timezone = "Europe/Lisbon"
6+location = "Lisbon – Portugal"
7+image = "https://storage.googleapis.com/media.urbit.org/site/events/urb01_assembly23_std_1-1.png"
8+registration_url = ""
9+description = "The third Urbit Assembly & first one outside of the US"
10+dark = true
11+darken_image = "true"
12+
13++++
14+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/events/urb01_assembly23_std_16-9.png)
15+
16+Urbit is coming to Europe! Save the date for Urbit Assembly 2023 & Urbit Week in Lisbon this year.
17+
18+Early-bird tickets are going live by the end of may in the [UF Public Group](/groups/~halbex-palheb/uf-public).
19+
20+We’re changing up the format this year: the first two days will be more “conference-like” with launches, presentations and panels from the Urbit ecosystem.
21+
22+Afterwards we’ll have a week of side events hosted by the community throughout Lisbon.
23+
24+Don't miss it.
content/getting-started/cloud-hosting.md+2−2
@@ -72,7 +72,7 @@ key content" field on Digital Ocean. In the "Name" field, enter your ship name.
7272
7373#### Additional options
7474
75−Click "User data" and paste the script below into the field provided. This
75+Click "+Advanced Options" check the box for "Add Initialization scripts (free)" and paste the script below into the field provided. This
7676will automatically configure the server and install necessary software.
7777
7878```bash {% copy=true %}
@@ -465,4 +465,4 @@ your pier lying around.
465465- Kep your Urbit runtime up-to-date to take advantage of the latest Landscape and Application over-the-air updates. See [Step #5 in the CLI guide](/getting-started/cli#5-runtime-upgrades) to update your runtime.
466466
467467- Learn how to [get around your
468−urbit](/getting-started/getting-around).
468+urbit](/getting-started/getting-around).
content/getting-started/getting-around.md+4−4
@@ -7,7 +7,7 @@ weight = 0
77
88### 1. Get oriented
99
10−After you've logged into your Urbit for the first time, you'll an interface called Landscape – a way interact with the network and applications. You'll also see a few pre-installed applications: Terminal, Groups, and Talk. More on them in a moment.
10+After you've logged into your Urbit for the first time, you'll have an interface called Landscape – a way interact with the network and applications. You'll also see a few pre-installed applications: Terminal, Groups, and Talk. More on them in a moment.
1111
1212![](https://storage.googleapis.com/media.urbit.org/site/getting-started/get-oriented.png)
1313
@@ -19,13 +19,13 @@ You'll likely want to focus on finding and joining new communities, which you ca
1919
2020### 2. Join a few groups
2121
22−Joining public groups is simple – just search for the group host's Urbit ID, and click join. Check out a walk-through of this process in the [Joining groups](/getting-around/joining-groups) guide.
22+Joining public groups is simple – just search for the group host's Urbit ID, and click join. Check out a walk-through of this process in the [Joining groups](/getting-started/joining-groups) guide.
2323
2424### 3. Install some applications
2525
2626Groups are great, but Urbit goes way deeper with apps that are developed specifically for Urbit and use P2P networking for everything.
2727
28−Check out the [Installing apps](/getting-around/installing-applications) guide for a walk-through on the process of installing Urbit applications.
28+Check out the [Installing apps](/getting-started/installing-applications) guide for a walk-through on the process of installing Urbit applications.
2929
3030
3131### 4. Explore interfaces
@@ -52,4 +52,4 @@ If you're having trouble with your planet or the hosting provider that's running
5252
5353**Meet up**: Many of the organizations and people behind Urbit host virtual and in-person events on a regular basis — check out the latest on our [Events feed](/events/), or a local [Meetup group](/ecosystem?type=communities).
5454
55−**Build**: If you're the kind of person who wants to build applications directly for discerning communities with built-in identity and networking primitives, or even jump into the Urbit kernel's core, visit [Urbit Developers](https://developers.urbit.org/) to learn more.
55+**Build**: If you're the kind of person who wants to build applications directly for discerning communities with built-in identity and networking primitives, or even jump into the Urbit kernel's core, visit [Urbit Developers](https://developers.urbit.org/) to learn more.
content/getting-started/hosting-providers.md+7−9
@@ -7,20 +7,18 @@ tag = "hostprov"
77
88
99## Tlon
10−[Tlon](https://tlon.io) is the company responsible for creating Urbit, Landscape, Groups and Talk. They also offer hosting services that seamlessly integrate with the rest of their products. [Tlon Hosting](https://tlon.network/) offers Urbit hosting for $20/month.
10+[Tlon](https://tlon.io) is the company responsible for creating Urbit, Landscape, Groups and Talk. [Tlon](https://tlon.io) offers Urbit hosting for free, which includes a planet of your choice.
1111
12−[![Tlon Hosting](https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/tlon-hosting-provider.png)](https://tlon.network/)
12+[![Tlon](https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/tlon-hosting-provider.png)](https://tlon.io/)
1313
14+## Planet One
15+
16+[Planet One](https://planet.one), a [Tirrel](https://urbit.org/organizations/tirrel) service, offers Urbit hosting for $15/month. You can also obtain hosting through their native Desktop application, [Scene](https://planet.one/scene).
17+
18+[![Planet One Hosting](https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/planetone-hosting.png)](https://planet.one/)
1419
1520## Third Earth
1621
1722[ThirdEarth](https://third.earth) offers hosting for $11.99/month. Third Earth is the only hosting provider that allows you to join with an existing Urbit ID and pier, i.e. a planet that you have already booted elsewhere. If you don't have a planet yet, they can also provide you with one.
1823
1924[![Third Earth Hosting](https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/thirdearth-hosting.png)](https://third.earth/)
20−
21−
22−## Planet One
23−
24−[Planet One](https://planet.one), a [Tirrel](https://urbit.org/organizations/tirrel) service, offers Urbit hosting for $15/month. You can also obtain hosting through their native Desktop application, [Scene](https://planet.one/scene).
25−
26−[![Planet One Hosting](https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/planetone-hosting.png)](https://planet.one/)
content/getting-started/installing-applications.md+3−3
@@ -14,7 +14,7 @@ You can find a [public directory of applications](/ecosystem?type=applications)
1414
1515Not all applications are listed on urbit.org, so you’ll discover more by actively using Urbit and meeting people.
1616
17−However, we can get started a simple app from Urbit developer [`~paldev`](/ids/~paldev).
17+However, we can get started by using a simple app from Urbit developer [`~paldev`](/ids/~paldev).
1818
1919### 2. Search for a Developer
2020
@@ -32,8 +32,8 @@ For example, to install the pals application, search for `~paldev` and then clic
3232
3333Select the pals app, and a modal window will open that shows some information about the application. Go ahead and click the “Get App” button, and confirm the following modal window to begin the installation process.
3434
35−Soon you’ll have a new application tile on your home screen. Now you can add people you know on the network as your pals just by entering their Urbit ID.
36−
3735![](https://media.urbit.org/site/getting-started/install-apps-3.png)
3836
37+Soon you’ll have a new application tile on your home screen. Now you can add people you know on the network as your pals just by entering their Urbit ID.
38+
3939![](https://media.urbit.org/site/getting-started/install-apps-4.png)
content/getting-started/interfaces.md+2−2
@@ -5,6 +5,6 @@ description = "Ways to interact with Urbit"
55tag = "around"
66+++
77
8−Urbit ships by default with [Landscape](https://tlon.io/landscape), a web-based interface for managing your ship and the software installed on it, and launching other web-based applications. However, there are many ways to interact with your Urbit.
8+Urbit ships by default with Landscape by [Tlon](https://tlon.io), a web-based interface for managing your ship and the software installed on it, and launching other web-based applications. However, there are many ways to interact with your Urbit.
99
10−There's [EScape](https://urbit.org/applications/~fabnev-hinmur/escape), a fork of Groups that is also has an accompanying mobile application. [Scene](https://tirrel.io/scene/index.html) and the (soon to be released) [Realm](https://www.holium.com/) offer native desktop window managers for your urbit. Lastly, there's the [Dojo](https://developers.urbit.org/overview/dojo) CLI interface for developers
10+There's [EScape](https://urbit.org/applications/~fabnev-hinmur/escape), a fork of Groups that also has an accompanying mobile application. [Scene](https://tirrel.io/scene/index.html) and the (soon to be released) [Realm](https://www.holium.com/) offer native desktop window managers for your urbit. Lastly, there's the [Dojo](https://developers.urbit.org/overview/dojo) CLI interface for developers
content/getting-started/joining-groups.md+2−2
@@ -19,11 +19,11 @@ Once you’re on the network, you’ll see Landscape, which is filled with large
1919
2020### 2. Enter the group shortcode
2121
22−To join a group, you'll need to know its host Urbit ID (e.g. ~bitbet-bolbel) or its full Urbit address, also called a shortcode.
22+To join a group, you'll need to know its host Urbit ID (e.g. `~bitbet-bolbel`) or its full Urbit address, also called a shortcode (e.g. `~bitbet-bolbel/urbit-community`) .
2323
2424Check out some public groups in the [urbit.org groups directory](/ecosystem?type=groups)
2525
26−As an example, we’ll start by joining UF, the Urbit Foundation's official group.
26+As an example, we’ll start by joining [UF Public](/groups/~halbex-palheb/uf-public), the Urbit Foundation's official group.
2727
2828In the Groups app, click on "Find Groups" in the left column and enter `~halbex-palheb/uf-public`
2929
content/grants/2021/clojure-urbit-client.md+1−1
@@ -12,7 +12,7 @@ champion = ["~littel-wolfur"]
1212assignee = ["~sorted-falnyd"]
1313grant_id = "P0072"
1414completed = false
15−canceled = false
15+canceled = true
1616link = ""
1717+++
1818
content/grants/2021/ra-debugging-tools.md+3−3
@@ -9,9 +9,9 @@ image = ""
99description = "Debugging Tools"
1010reward = "2 stars"
1111mentor = ["~master-morzod"]
12−assignee = ["~nosmes-sibwyx", "~topfet-parmed"]
13−completed = false
14−canceled = true
12+assignee = ["~topfet-parmed"]
13+completed = true
14+canceled = false
1515work_request_link = ""
1616+++
1717
content/grants/2022/abacus.md+1−1
@@ -13,7 +13,7 @@ reward = "1 star ($1k bonus if done by Assembly)"
1313assignee = ["~sorpes-ranrep"]
1414grant_id = "B0160"
1515champion = ["Holium"]
16−completed = false
16+completed = true
1717work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0160&prefill_Grant+Name=Abacus"
1818+++
1919
content/grants/2022/app-engram.md+1−1
@@ -13,7 +13,7 @@ reward = "7 stars"
1313assignee = ["~nolteg-tobtyc", "~dalsyr-diglyn"]
1414grant_id = "B0128"
1515champion = ["Holium"]
16−completed = false
16+completed = true
1717work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0155&prefill_Grant+Name=Engram"
1818+++
1919
content/grants/2022/calendar-holium.md+1
@@ -14,6 +14,7 @@ assignee = [""]
1414champion = ["Holium"]
1515grant_id = "B0190"
1616completed = false
17+canceled = true
1718work_request_link="https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0190&prefill_Grant+Name=Calendar%20Feature%20Completion"
1819+++
1920
content/grants/2022/chess-bounty.md+3−1
@@ -20,7 +20,7 @@ work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B01
2020+++
2121
2222# Rationale
23−~finmep-lanteb is sponsoring the improvement of the Chess app to create an Urbit Chess experience comparable to that of any modern Chess website. The current Chess app meets the basic requirements to play a game with a friend, but lacks various quality of life features: move notifications, undo requests, %pals integration, etc. In addition, only unrated, correspondence games are currently possible. These missing features & improvements offer a great opportunity for a team of 3 novice Urbit developers (preferably three Hoon School Live and App School Live graduates) to work together to complete this bounty, each earning a star in the process.
23+[Omitted long matching line]
2424
2525The goals of this bounty are to resolve the quality of life issues present in the Chess app, as well as enable timed and rated games.
2626
@@ -49,4 +49,6 @@ Never say never, but there is a strong preference for 3 novice developers to wor
4949# Milestones and Compensation
5050Each of the three Deliverables above is a milestone. However, since the reward is 3 stars and designed to be completed by a 3-person team, it seems likely that the compensation schedule would be "1 star per person upon full completion". Specific details will be agreed upon with the contributor team prior to starting work.
5151
52+**Bonus** 3 additional stars will be paid to the contributors (1 each) if work is completed before October 2023
53+
5254
content/grants/2022/community-meetups.mddeleted−43
@@ -1,43 +0,0 @@
1−+++
2−title = "Community Meetup"
3−date = "2022-07-22"
4−
5−[taxonomies]
6−grant_type = [ "Bounty" ]
7−grant_category = [ "Community" ]
8−
9−[extra]
10−image = ""
11−description = "Earn stars by building culture through local, recurring, and in-person urbit events"
12−reward = "1 star"
13−assignee = [""]
14−grant_id = "B0165"
15−champion = ["~dalweb-donfun"]
16−completed = false
17−work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0165&prefill_Grant+Name=Meetup%20Bounty"
18−+++
19−
20−# Requirements
21−- Meetups should be geographically based; if you have distributed, interest-based communities of which you are a part, check out Urbit Embassies for a way to build digital communities on Mars.
22−- Meetups must be publicized and include a public web line with event details (time, date, location), and should be actively promoted via social media, in-person recruitment, flyers, a website, etc. If you need a signal boost, email support@urbit.org.
23−- You must host a total of six meetups, with a targeted cadence of once a month.
24−- Creation and admin of an Urbit group for your locality to which all meetup attendees will be invited or a fully public group. This group should be actively maintained with info about upcoming events, copies of past presentation materials, and any other related meetup content.
25−- Sharing of materials generated in service of your meetup; similarly, things like presentation materials, flyers, and FAQs from other meetups will be made available for utilization, forking, or inspiration. For more info, contact ~sarlev-sarsen or ask for help in ~siddef/uf-meetups
26−- Completion of a pull request to the urbit.org github repo to add your meetup's information to the urbit.org/community/meetups page. If you have never submitted a pull request on github before, let us know and we will teach you how. You will need to provide the following:
27− - Location (City, State, GEO)
28− - `@p` of host(s)
29− - A link to your urbit group
30− - A link to your clearweb presence (i.e. Meetup.com)
31− - a short description of your meetup and typical events (<50 words)
32−- Regular and timely completion of the meetup report form, including:
33− - Number of attendees
34− - Email address for attendees who, in your judgement, have earned a planet
35− - Submission of presentation materials or notes on topics discussed, including presentation recordings if available.
36− - top 3-5 questions asked and the technical prowess of the questioner
37−# Encouraged Features
38−- Semi-regular presentations that introduce Urbit to newcomers, help members boot a comet, or introduce the more technical side of urbit are strongly suggested. Depending on the makeup of your meetup attendees, these presentations may be highly technical or they may be more philosophical--your call! Materials to get you started are available at ~wolref-podlex/foundation or by reaching out to ~sarlev-sarsen
39−- Having a collection of 'recommended groups' to which you can direct meetup attendees, such that they can begin to explore the Urbit network.
40−- As one of the main goals of meetups is to get people building on Urbit, once your meetup gains some traction, consider looking into proposal development for a grant on which members of your meetup can collaborate!
41−- While the specific requirements of the meetup bounty listed below can be summarized as "run a regular meetup", the overarching goal is to build a local community and onboard people to Urbit. Successful meetups will be judged by metrics like how many proposals have attendees submitted and completed and how many people have been onboarded who go on to positively contribute to the culture, technology, or creativity of the network. This does not mean that every meetup is expected to be full of developers or that a meetup that does not have a huge and ever-growing attendee list would be considered a failure. What it does mean is that community organizers and participants should become true champions for Urbit who can't help but share with everyone around them how Urbit can offer solutions to many of the pains of modern networked computing.
42−# Compensation
43−- Upon the completion of six meetup events and the associated meetup reports, one star will be paid out to the organizer.
content/grants/2022/cue.md+1−1
@@ -15,7 +15,7 @@ assignee = ["~mallus-fabres"]
1515champion = ["~fabled-faster"]
1616grant_id = "P0146"
1717completed = false
18−canceled = false
18+canceled = true
1919link = ""
2020
2121+++
content/grants/2022/desk-import-export.md+1−1
@@ -13,7 +13,7 @@ reward = "2 stars"
1313champion = ["~tinnus-napbus"]
1414assignee = ["~niblyx-malnus"]
1515grant_id = "B0187"
16−completed = false
16+completed = true
1717work_request_link="https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0187&prefill_Grant+Name=Desk%20jamfile%20import%2Fexport"
1818+++
1919
content/grants/2022/digital-storefront.md+2−2
@@ -63,9 +63,9 @@ Shop:
6363 ==
6464```
6565## User Stories
66−- John Murphy is a social media influencer who wants to sell his jazz album on the web. He looked at selling it using Shopify, but was turned off at the idea that he'd be dependent on Shopify and wouldn't be able to export his data if he ever wanted to move to a different webstore provider. John wants an online store solution that allows him to run the webstore himself on the server at his house without having to fiddle with it. John decides to download Tirrel Studio, because he heard they just added online store functionality. He sets up his website, adds his product details, decides how much it should cost, and then requests to be a merchant through their payment processor. John feels good knowing that he owns all of his shop's data and software, and that his only external dependency is on a payment processor that he could switch out for a different one.
66+[Omitted long matching line]
6767
68−- Timothy Gunn is an online conspiracy theorist who writes articles about the new world order. He has an avid online following, but sometimes his posts get too juicy for conventional platforms. He doesn't trust Substack and wants to host his newsletter himself but still get paid. His audience is a little too normie to use Bitcoin, and Bitcoin isn't that convenient for payments these days anyway. Timothy sets up his newsletter site via Studio, imports his mailing list from his old Mailchimp newsletter, requests to be a merchant, and then adds pay-walls in front of his best posts. Now he's ready to make money on his own terms.
68+[Omitted long matching line]
6969
7070- Jimmy Takeria is a big calisthenics guy who teaches other guys how to get jacked. He makes informational videos and posts them to YouTube as well as running a Discord community about calisthenics. Jimmy doesn't like YouTube and Discord's new misinformation policies because he has unconventional ideas about nutrition. Jimmy decides to move his community off of Discord and into Groups on Urbit, and sets up a Studio webstore where he sells access to his latest workout videos and cutting edge nutritional info on a subscription basis. He's satisfied that he can manage his entire online business using Urbit.
7171
content/grants/2022/eth-wallet.md+1
@@ -13,6 +13,7 @@ reward = "3 stars + $15k USD"
1313assignee = [""]
1414grant_id = "B0158"
1515completed = false
16+canceled = true
1617work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0158&prefill_Grant+Name=Urbit%20Native%20Ethereum%20Wallet"
1718+++
1819# Overview
content/grants/2022/hoon-eval.md+1−1
@@ -12,7 +12,7 @@ description = "Build an eval command and a stateless REPL mode in vere"
1212reward = "1 star"
1313mentor = ["~master-morzod"]
1414assignee = ["~mopfel-winrux"]
15−completed = false
15+completed = true
1616canceled = false
1717work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=A0161&prefill_Grant+Name=Hoon%20Eval%20and%20REPL"
1818+++
content/grants/2022/lexicon.md+1−1
@@ -13,7 +13,7 @@ reward = "1 star ($3k bonus if done by Assembly)"
1313assignee = ["~bitful-pannul"]
1414grant_id = "B0162"
1515champion = ["Holium"]
16−completed = false
16+completed = true
1717work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0162&prefill_Grant+Name=Lexicon"
1818+++
1919
content/grants/2022/loom-pointer-compression.md+1−1
@@ -13,7 +13,7 @@ reward = "1 star"
1313mentor = ["~fanfun-mocbud"]
1414assignee = ["~barter-simsum"]
1515grant_id = "A0173"
16−completed = false
16+completed = true
1717canceled = false
1818work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=A0173&prefill_Grant+Name=Loom%20Pointer%20Compression"
1919+++
content/grants/2022/membrane.md+1−1
@@ -54,7 +54,7 @@ Payment: 2 stars
5454
5555## Milestone 2
5656
57−Expected Completion: November 2022
57+Expected Completion: May 2023
5858
5959Payment: 3 stars
6060
content/grants/2022/middleware-apprentice.md+1−1
@@ -13,7 +13,7 @@ reward = "1 star"
1313mentor = ["~wicrum-wicrun"]
1414assignee = ["~litlep-nibbyt"]
1515grant_id = "A0193"
16−completed = false
16+completed = true
1717canceled = false
1818work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=A0193&prefill_Grant+Name=Middleware%20Apprenticeship"
1919+++
content/grants/2022/pony-bounty.md+1−1
@@ -13,7 +13,7 @@ reward = "4 stars"
1313assignee = ["~hanfel-dovned"]
1414champion = ["~sarlev-sarsen"]
1515grant_id = "B0191"
16−completed = false
16+completed = true
1717work_request_link="https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0191&prefill_Grant+Name=Pony"
1818+++
1919
content/grants/2022/regex-library.md+1−1
@@ -13,7 +13,7 @@ reward = "3 stars"
1313mentor = ["~lagrev-nocfep"]
1414assignee = ["~macrep-racdec"]
1515grant_id = "B0149"
16−completed = false
16+completed = true
1717canceled = false
1818work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0177&prefill_Grant+Name=Regular%20Expressions%20Library"
1919+++
content/grants/2022/seguro-phase-2.md+1−1
@@ -14,7 +14,7 @@ reward = "5 stars"
1414assignee = ["~mastyr-bottec"]
1515champion = ["~master-morzod"]
1616grant_id = "P0168"
17−completed = false
17+completed = true
1818canceled = false
1919link = ""
2020
content/grants/2022/smart-lightbulb-controller.md+1−1
@@ -14,7 +14,7 @@ reward = "4 stars"
1414assignee = ["~pilwyc-fastec", "~larryx-woldyr"]
1515champion = ["~simfur-ritwed"]
1616grant_id = "P0199"
17−completed = false
17+completed = true
1818canceled = false
1919link = ""
2020
content/grants/2022/trove.md+1−1
@@ -13,7 +13,7 @@ reward = "4 stars ($8k bonus if done by December 12, 2022)"
1313assignee = ["Quartus"]
1414grant_id = "B0164"
1515champion = ["Holium"]
16−completed = false
16+completed = true
1717work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0164&prefill_Grant+Name=Trove"
1818+++
1919
content/grants/2022/urbit-interface-framework.md+69−60
@@ -17,63 +17,72 @@ completed = false
1717canceled = false
1818+++
1919
20−# Rationale
21−
22−I'm proposing to write code for what could become an alternative urbit web browser interface alongside Landscape, Escape, Holium and maybe others I've yet to see.
23−This interface basically functions like website builder [Wix](https://www.wix.com/) but puts more emphasis on
24−1. Enabling creation of custom components as easy as using pre-fabricated ones - Wix has an option to create custom components with javascript but it's limited and impractical.
25−2. Implementing collaborative composing as an integral feature rather than an "add-on".
26−
27−The interface would be composed together from components in similar way Wix does. The components are draggable around the screen and it will be possible to align a component into a grid with automatic alignment. In practice this enables composing (live) "dashboards" for reasoning about various data.
28−The interface will be accessed from browser and mobile browser. Future work includes a native iOS app and a desktop Electron app. Though it's the same codebase for web browser interface, the mobile browser interface components will be auto-aligned for mobile screen. iOS app will have support for native notifications and widgets.
29−The components will be written in Sail, an Urbit markup language. A trivial example of a component could be `;smiley` which renders on the screen as `:-)`.
30−The `;smiley` definition might look something like `;span: ":-)"`. It must be in valid HTML namespace, but can be written in Sail syntax or alternatively, defined in pure HTML itself.
31−If you try to add this `;smiley` component to your screen but it doesn't exist on your urbit yet, a prompt appears telling to either define this component or download component with this name from other urbit. By default, downloads happen from your parent star but can be configured to download from other indexers as well.
32−Alternatively, if you know that this `;smiley` component exists on some particular urbit, you can also download directly by just appending the name of urbit, e.g. if ~nortex-ramnyd has this component, you could `;smiley~nortex-ramnyd` and after that, this component is available on your ship as well (so next time you want to use this component, you can just `;smiley` without asking it from ~nortex-ramnyd).
33−For this project, I will implement an additional CSS abstraction layer into Sail. This makes styling components a little bit easier. So instead of `;smiley(style "color:blue")`, it would be `;smiley(color "blue")`. Or to make custom fonts easier `;p(font "custom-font"): Hello` or `;p(font "https://url-of/custom-font.woff2"): Hello`. To bypass CORS restrictions, I'll host a CORS relay (or can be configured to use a different host).
34−"Pages" of composed components are linked together like web pages and can be either pages composed by only you (only available on your urbit), e.g. your "home screen"/"dashboard", or group pages - pages that are composed together by group members.
35−Both types can have specified view and edit permissions.
36−The first time when the interface is installed (an Electron app), the "welcome" screen appears and this is also the "home screen" that appears when later reopening the application. The welcome screen walks through the functionality of the interface and subsequently prepares the user to start composing their home screen.
37−Some code I have already written, the repository is stored on github: https://github.com/h5gq3/wix.com
38−# Milestones and Compenstation
39−## Milestone 1: finish core features and polish UI
40−### 2 stars
41−The first milestone is to get the current functionality polished and usable with minimal bugs. It should be clear to the user how to edit and add blocks as well as how to switch back to rendering. The user should be able to install the freeform editor as an app and see the basic demo where state is only seen through the app itself.
42−- Implement basic fixed freeform positioning
43−- Implement component resizing logic
44−- Implement page routing
45−- Add some UI for showing editing vs rendered state
46−- Add UI helpers for rendering editor
47−- Add docket file and editor html + js so that it can be rendered as an app for ease of showing off
48−## Milestone 2: usability and component enhancements
49−### 1 star
50−In this milestone we're mostly just improving the usability of the editor and adding nice-to-have features like being able to make and use components.
51−- Implement component creation logic using React 18
52−- Download components from other ships
53−- Install and use React components straight from markup
54−- CSS abstraction
55−- Some "convenience" functions library in style of jQuery
56−## Milestone 3: collaborative editing
57−### 1 star
58−In this milestone we implement push and pull hooks similar to how groups works to allow for syncing of state between multiple editors and implement custom permissioning logic.
59−## Milestone 4: proof of concept custom component/app - DeepSpace meditation app
60−### 1 star
61−In this milestone we create an application on top of the interface builder. The design considerations for this application are as follows:
62−### Design - The DeepSpaceApp
63−- three slightly different 2-3 min guided basic meditation where the user sees written text + hears audio with some simple animation like a dot that is going bigger when you breathe in and smaller when you breathe out
64− - one where the user focuses on breathing
65− - one where the user focuses on counting
66− - one where the user focuses on “feeling”
67−- built-in timer to set up a time of how long users that already knows techniques of meditation want to meditate with a bell sound at the start and end of the session
68−- a small journal that the user can write a few words after each meditation to store the ideas, and feelings that emerge during the session, it is also good practice to write short journals for a benefit of daily focus and mental health, by storing it all on Urbit user will have a feeling that he really own it personally and no one have access to it
69−- quote of some zen master, budda, Krishna, or from Hermetic books to inspire users after each meditation, all taken from some pre-created database
70−- way to evaluate each user’s meditation session, emotional/mental state of each day with "triangle" "circle" "square" (not “:)” , “:|” , “:(“ -> like in every other meditation app)
71−- **MOST IMPORTANT**: Group sessions so like there will be pre-define and pre-announced three hours daily in UTC when users will know that if they want to meditate with other people they can join and see how many people meditate with them at the same time (they don't need to hear each other or anything, just a visible number of people, maybe Urbit names, some levitations dots representing users, that now are currently login and potentially meditate at the same time). This builds a strong connection between people and lets them feel “not alone” in the process or even in the whole world/space/time.
72−# Future Work
73−Future work involves expanding the functionality and writing custom components, aka "apps".
74−Potential expansions:
75−- Dragging various media onto the page and automatically storing it in your data store (possibly IPFS or S3)
76−- Sail and udon improvement - try improving syntax for more ergonomic use
77−- "Convenience" functions library expansion
78−- Codemirror integrations like indentation, syntax highlighting, and json previewing
79−- Component discovery from other ships
20+Proposal to develop web application creation tooling and framework in hoon following [thick stateful server single-page application architecture](https://en.wikipedia.org/wiki/Single-page_application#Thick_stateful_server_architecture).
21+
22+The framework is abstracted into a library that is used by a gall agent. The gall agent defines the application's data model and state controller. View model is defined separately from the agent. This ensures that agent api remains as is and, if needed, agent could implement multiple different view/UI models, e.g some other UI framework that is targeting different kind of device instead of web browser. It also means existing agents can plug in the view model defined with this framework without making changes to agent data and controller model.
23+
24+Being a SPA, in-app links and navigation is intercepted: DOM patching and history api is used instead. In-app navigation is handled by a router in which URL paths are mapped to UI states, either strucutred as separate pages but could also be more granular (i.e. some UI state might only change part of current document not the whole document).
25+
26+The view model should be defined using sail components. Sail components abstract view model into splitted subviews, which store their own internal state and controller. Component's controller is conceptually similar to agent's controller (on-poke arm), it receives [mark vase] and produces list of card:agent:gall and the component with possible internal state modification. `+on-init` in called when component is going to be mounted to DOM. At this arm, a card needs to be sent that declares which browser events this component expects to receive.
27+
28+```
29+++ sail-component
30+ $_ ^|
31+ |_ [props children bowl:sail]
32+ ++ on-poke |~([mark vase] *(quip card:agent:gall _^|(..on-poke)))
33+ ++ on-init *(quip card:agent:gall _^|(..on-poke))
34+ ++ manx *^manx
35+ --
36+```
37+
38+Component's on-poke arm receives from browser user interaction events (DOM events) and handles these accordingly, by emitting cards and/or modifying state.
39+
40+In case agent's state or component's internal state gets modified at on-poke call, a view patch is sent to browser. The view patch is an html string representing the component(s) whose state (and thus their sail template at `+manx` which interpolates state) got modified.
41+
42+The patch is then applied in the application's javascript context with diffHTML.
43+
44+The view model declares component tree in sail syntax:
45+
46+```
47+:: component1, component2 are imported from some path ::
48+:: foo, boo are passed in from agent
49+;div#root
50+ ;component1(prop1 (p foo));
51+ ;component2
52+ =prop1 (p foo)
53+ =prop2 (p boo)
54+ ==
55+==
56+```
57+
58+gate `+p` produces jammed atom that is encoded to tape since manx properites must be tapes. decoding is handled by the library and components receive nouns that they have to normalize to their own needed structures (using `;;(mold noun)`)
59+
60+---
61+
62+**milestones**
63+
64+_sail component abstraction layer and framework base logic_
65+
66+2 stars
67+
68+the base of the framework is written in scope of this milestone. this is the base functionality of writing sail components and attaching the resulting UI logic to agent.
69+
70+_routing and navigation layer_
71+
72+1 star
73+
74+- implementing url mapping to view states.
75+
76+- implementing history api.
77+
78+_hot reloading_
79+
80+1 star
81+
82+implementing transition logic when components source code changes
83+
84+_documentation and example agent_
85+
86+1 star
87+
88+documentation about using this framework and example usage in form of a todo app
content/grants/2022/whom.md+3−5
@@ -14,7 +14,7 @@ reward = "3 stars"
1414assignee = ["~rivmud-fabwen"]
1515champion = ["~palfun-foslup"]
1616grant_id = "P0171"
17−completed = false
17+completed = true
1818canceled = false
1919link = ""
2020
@@ -42,9 +42,8 @@ If a contact is another Urbit user with `%whom` installed, the contact will also
42426. As a user, when one of my non-Urbit contacts gets a planet, I want to be able to convert them to an Urbit contact.
43437. As a user with `%pals`, I want my pals to be added to my contacts list automatically.
44448. As a user with `%pals`, I want to be able to add my contact as a %pal with a button click.
45−9. As a user with `%pals`, I can filter my contacts by tags.
46−10. As a user with `%pals`, I want some info on my profile to be public, but I only want to share more personal info with users I trust (pals).
47−11. As a developer of another app, I want to be able to programmatically access specific fields from contacts.
45+9. As a user with `%pals`, I want some info on my profile to be public, but I only want to share more personal info with users I trust (pals).
46+10. As a developer of another app, I want to be able to programmatically access specific fields from contacts.
4847# My background
4948I'm a professional fullstack software engineer and I've been active on Urbit since 2019. I operate the star ~holnes and have onboarded a few of my friends. I graduated Hoon School in 2020, attended Assembly and a few local meetups, and completed the Studio email apprenticeship with Tirrel earlier this year. I've had a great experience working with Hoon and Gall so far, and am eager to build more apps.
5049# Milestones / Estimates / Compensation
@@ -67,6 +66,5 @@ Completed by: Sep. 1
6766- Goals:
6867 - Pals are automatically added as contacts
6968 - The frontend shows which contacts are pals
70− - Contacts can be filtered by %pals tags
7169 - Users can click a button to send a contact a pal request
7270 - Users can restrict visibility on their profile, so only pals can see certain fields
content/grants/2023/aera.mdnew file+50
@@ -0,0 +1,50 @@
1++++
2+
3+title = "Aera"
4+date = "2023-06-08"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["Other"]
9+
10+[extra]
11+image = ""
12+description = "A decentralized, subjective reputation graph protocol."
13+reward = "8 Stars + Bonus"
14+assignee = ["~talwet"]
15+champion = ["~dalten"]
16+grant_id = "P0276"
17+completed = false
18+canceled = false
19+
20++++
21+
22+# A new Aera of reputation
23+
24+Aera is an essential missing piece of Urbit infrastructure which will bring self-sovereign trust to the platform. This will enable application developers to manage, filter, curate, and otherwise manage context dependent trust parameters within their products. Additionally, the fully formed version of Aera will include an interface for users to view and understand the shape of their trust graph. Aera makes it possible to build applications that can’t be built using the current web stack. For a more detailed view of the Aera value prop and future product updates, please visit https://quartus.co/aera
25+
26+# Team
27+Aera is a project consisting of many Urbit community members. It is the brainchild of ~rabsef-bicrym, but will also include the following key contributors:
28+- ~litlep-nibbyt, working on hoon agents
29+- ~normul-postem, writing frontend interfaces
30+- ~litneb-maltyp, designing graphical user interface & visual content
31+
32+Additionally, the project has a variety of other advisors and participants, including ~sarlev-sarsen, ~sicdev-pilnup, ~sogrum-savluc, and ~datnut-pollen. For anyone interested in participating, download the %aera desk to learn more: /1/desk/~dister-dozzod-dalten/aera
33+
34+# Milestones & Compensation
35+This proposal is going to be partially funded by the Urbit Foundation, both by a $10,000 direct commitment, as well as a grant of 8 stars to be released along the below milestones. Additionally, Aera will also grow to include a crowdfunding campaign using %fund to support ongoing development efforts from the Urbit community. Contributors will recieve early reputation scores within the resulting reputatation graph, as well as early access to developer resources and integration support. Funds will be held in escrow by the ~dalten collective, to be paid out to contributors upon milestone completion as determined by the members of the collective.
36+
37+## Milestone 1: Initial Research and Mathematical Modelling - $10,000
38+Quartus will conduct initial research efforts to understand implementation hurdles and ideal mathematical models for the shape of the aera agents and ‘trust-reduction algorithm’. This work will be released on an ongoing basis to the Aera group, hosted by ~dalten. Bi-weekly meetings will also be held and made accessible to campaign funders.
39+
40+## Milestone 2: Agent and Library Concept Creation - 2 stars
41+Quartus will begin development of the %aera agents and library and will release them to donors for feedback. Participants will receive a chance to provide feedback on agent architecture and use case requirements.
42+
43+## Milestone 3: Release Candidate Available to Developers for Feedback - 2 stars
44+Whitelisting of select developers, including all donors, for downloading of the %aera desk, including fully functioning agents and a working library. Participants will receive a chance to provide feedback on specific implementation details.
45+
46+## Milestone 4: Final Library and General Availability to Urbit Network - 2 stars
47+Developer feedback integrated into Milestone 3 release candidate and final library released to developers along with documentation. Quartus will work with donors through onboarding sessions that will guide developers through the integration of Aera with an urbit application. Additionally, the application will be made available to the network such that end users will be able to experience the product functionality via an example integration in %fund.
48+
49+## Milestone 5: Full Release to the network with End User GUI - 2 stars
50+Quartus will develop a frontend experience for users to explore their own view of the Aera graph. This GUI will include views of the users own ship, as well as their understanding of the nodes to which they are connected.
content/grants/2023/app-metrics.mdnew file+74
@@ -0,0 +1,74 @@
1++++
2+
3+title = "Success Metrics for Urbit Apps"
4+date = "2023-02-09"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["App Dev"]
9+
10+[extra]
11+image = ""
12+description = "Success Metrics for Urbit Apps"
13+reward = "5 Stars"
14+assignee = ["~bacwyl-samweg"]
15+champion = [""]
16+grant_id = "P0235"
17+completed = false
18+canceled = false
19+
20++++
21+
22+# Description
23+
24+The current absence of success metrics for Urbit apps makes it challenging for developers to determine the reach and impact of their software. Without a central app store, it is difficult to obtain information on the number of downloads or daily active users for a given application. This proposal aims to address this problem by providing developers with low-level access to the number of downloads and higher-level tools to facilitate the privacy-compliant collection of daily active user metrics. This will provide valuable insights for developers and support informed decision making for urbit app development.
25+
26+# Milestones and Compensation
27+
28+## Milestone 1 - Surface App Downloads Data
29+
30+Create access to the total set of users who are synced to a local desk. This currently represents the total userbase of an app, since almost all apps on urbit are distributed from a single source. It could also be useful for other purposes, such as the ability to anticipate congestion when shipping an OTA.
31+
32+There is already [an open PR](https://github.com/urbit/urbit/pull/6136) for this milestone.
33+
34+Reward: 1 Star
35+
36+## Milestone 2 - Collect App Downloads/Time
37+
38+Create an agent that periodically records the data from milestone 1 for locally published apps. This represents growth data, or how many ships-per-day are downloading an app. It’s helpful to visualize this as a multiple line graph. For example, a developer can see the point in time when App A surpasses App B in downloads.
39+
40+The state of the agent would be something like `(map app-desk=term [users=(set ship) growth-data=(map time number-of-users=@ud)])`
41+
42+The agent should expose a local scry endpoint for this data that is available as CSV so that developers can easily export and analyze.
43+
44+Reward: 1 Star
45+
46+## Milestone 3
47+
48+### Package and Distribute
49+
50+When milestone 2 is completed, it can immediately be published as an urbit app that developers can |install to their distributor ships. Further milestones can be incremental improvements to this app. The app must be stable for initial release and available for at least the following few months. The codebase will be open sourced with sufficient documentation for developers to install manually. The app will be fully workable from the dojo, and will not depend on a javascript frontend.
51+
52+### Collect Daily Active Users
53+
54+This milestone can be considered complete when app developers can optionally collect ‘daily active users’ without having to intrude on privacy, and without having to reimplement code specifically for this purpose. For this milestone to be complete, some solution to this problem has to be made available to app developers. This code will also need to be open sourced and sufficiently documented. The exact nature of this solution has not yet been determined, but it will most likely conform to the following architecture.
55+
56+### Architecture
57+
58+A central, developer-hosted poke endpoint where logs can be sent from user agents.
59+
60+1. Bob installs :app-metrics on ~dister
61+
62+2. He can use this agent to access milestone 1, 2 data for his apps
63+
64+3. He can optionally add a wrapper agent to his apps to send some logs to ~dister:app-metrics
65+
66+ a. This requires some self-poke to be added to the inner-agent which will be ignored by the inner-agent but caught by the wrapper agent. The wrapper will then send a poke to the central :app-metrics agent, indicating user activity. This poke should be added in a place that indicates real user interaction, such as opening a frontend subscription or sending a DM.
67+
68+ b. To avoid creating too much network activity, the wrapper agent will send a maximum of one poke per day, just to indicate that the user used the agent that day.
69+
70+4. Users can opt-out by setting a boolean in the wrapper agent.
71+
72+5. Daily-active-users data can now be scry’d as a csv file from the central agent.
73+
74+Reward: 3 Stars
content/grants/2023/blog-updates.mdnew file+64
@@ -0,0 +1,64 @@
1++++
2+title = "%blog Quality of Life Improvements"
3+date = "2023-03-17"
4+
5+[taxonomies]
6+grant_type = [ "Apprenticeship" ]
7+grant_category = [ "App Dev" ]
8+
9+[extra]
10+image = ""
11+description = "%blog Quality of Life Improvements"
12+reward = "1 star"
13+mentor = ["~dachus-tiprel"]
14+assignee = ["~foddur-hodler"]
15+completed = false
16+canceled = false
17+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=A0250&prefill_Grant+Name=%25blog%20Quality%20of%20Life%20Improvements"
18++++
19+
20+## Blog QOL Upgrades
21+
22+%blog Apprenticeship is a userspace application apprenticeship focused on experiential learning in publishing on Urbit. The three main quality of life upgrades `~dachus-tiprel` would like are:
23+- Subscribe to someone’s ship to see when they have published a new post
24+- Password protected posts
25+- Export-Files / Import-from-Backup pokes
26+
27+
28+## Apprentice Expectations
29+
30+Apprentice is familiar with %blog, has gone through hoon school, has a worked with a gall app before (both frontend and backend).
31+
32+
33+## Team
34+
35+The apprentice will work with `~dachus-tiprel` directly. They will participate in an initial "kick-off" call to talk through the user stories and the expected implementation, and will proceed with weekly or biweekly (at the apprentice's preference or need) meetings with `~dachus-tiprel` thereafter.
36+
37+
38+## Deliverable
39+
40+3 separate production-ready pull requests to the %blog hoon repo and %blog-ui repo each of the requested features.
41+
42+
43+## User Stories
44+
45+As someone integrating with %blog I want to
46+- Subscribe to a %blogger and be notified whenever they publish a new post
47+As a %blogger I want to
48+- Password protect my posts to limit access
49+As a %blogger about to breach I want to
50+- Export all my my blogs into a file
51+- Breach my ship
52+- Reload all of my blogs/themes/drafts exactly as they were
53+
54+
55+## Implementation Notes
56+
57+`~dachus-tiprel` is amenable to suggestions of strategies from his apprentice as to the nature of the implementation of this feature, particularly in the Front-End presentation. We have a suggestion for the general implementation details on the backend, but are nonetheless open to input:
58+- Subscriptions should be done using the new sss.hoon library
59+- Password protection will likely be done using some sort of sail page that redirects to the post upon a correct POST to %blog
60+
61+
62+## Schedule and Compensation
63+
64+The %blog apprenticeship should take no longer than 3 months, but is likely executable within a month. The apprentice will recieve 1 star upon successful completion of the apprenticeship.
content/grants/2023/bridge-grab-bag.mdnew file+35
@@ -0,0 +1,35 @@
1++++
2+
3+title = "Bridge Issue Grab Bag"
4+date = "2023-04-17"
5+
6+[taxonomies]
7+grant_type = ["Bounty"]
8+grant_category = ["Other"]
9+
10+[extra]
11+image = ""
12+description = "Close three issues from the Bridge github repo."
13+reward = "2 stars"
14+assignee = ["~sicrep-docrem"]
15+champion = ["~poldec-tonteg"]
16+grant_id = "B0260"
17+completed = false
18+canceled = false
19+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0260&prefill_Grant+Name=Bridge%20Issue%20Grab%20Bag"
20+
21++++
22+
23+## Overview
24+
25+The Urbit Foundation monitors existing and new issues in the Bridge codebase to identify issues that can be addressed by community contributors. Issues are selected to require minimal organizational context so that contributors can jump right in.
26+
27+This bounty will be awarded to someone who closes any three of the issues labeled community contribution in the [Bridge](https://github.com/urbit/bridge/issues?q=is%3Aissue+is%3Aopen+label%3A%22community+contribution%22) github repo.
28+
29+The ideal contributor will have a command of JavaScript (specifically React) as well as experience with Web3/ETH front end development. The latter includes setting up a local ETH testnet and deploying test contracts. Familiarity with the Urbit stack, specfically the [Azimuth PKI](https://github.com/urbit/azimuth) and the [L2 roller system](https://developers.urbit.org/reference/azimuth/l2/layer2) will also come in handy.
30+
31+For clarification on any of the issues, please mention [@vvisigoth](https://github.com/vvisigoth) or the issue filer in the issue comments.
32+
33+## Compensation
34+
35+2 Stars
content/grants/2023/community-meetups.mdnew file+37
@@ -0,0 +1,37 @@
1++++
2+title = "Community Meetup"
3+date = "2023-04-06"
4+
5+[taxonomies]
6+grant_type = [ "Bounty" ]
7+grant_category = [ "Community" ]
8+
9+[extra]
10+image = ""
11+description = "Earn stars by building a local urbit community"
12+reward = "1 star"
13+assignee = [""]
14+grant_id = "B0165"
15+champion = ["~dalweb-donfun"]
16+completed = false
17+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0165&prefill_Grant+Name=Meetup%20Bounty"
18++++
19+
20+# Requirements
21+- Meetups should be geographically based.
22+- You must host a total of six meetups, with a targeted cadence of once a month.
23+- Meetups must be publicized and include a web presence like meetup.com, and should be actively promoted via social media, in-person recruitment, flyers, a website, etc. If you need a signal boost, email thomas@urbit.org.
24+- Create and admin an Urbit group for your community to which all meetup attendees will be invited. This group should be actively maintained with info about upcoming events, copies of past presentation materials, and any other related meetup content.
25+- Share all the materials you generate in service of your meetups like, presentations, flyers, FAQs or anything else in ~siddef/uf-meetups.
26+- Every meetup must be publicized on the [Events](https://urbit.org/events) section on urbit.org via a commit to the urbit.org [github repo](https://github.com/urbit/urbit.org).
27+- Your community should have a home on the [community section](https://urbit.org/ecosystem?type=communities) of our ecosystem page. You can add this to the website with a commit to the urbit.org [github repo](https://github.com/urbit/urbit.org). If you have never submitted a pull request on github before, let us know and we will teach you how.
28+- Write a short paragraph about every meetup including: pictures of the meetup, 50-200 words description of every meetup and the attendee statistics of the meetup. At the end of your grant you can send this as one report to thomas@urbit.org for completion of your grant.
29+# Encouraged Features
30+- Semi-regular presentations that introduce Urbit to newcomers, help members boot a planet, or introduce the more technical side of urbit are strongly suggested.
31+- Having a collection of recommended groups & apps to which you can direct meetup attendees, such that they can begin to explore the Urbit network.
32+- As one of the main goals of meetups is to get people building on Urbit, once your meetup gains some traction, consider looking into writing a proposal for a grant on which members of your meetup can collaborate.
33+- While the specific requirements of the meetup bounty can be summarized as "run a regular meetup", the overarching goal is to build a local community and onboard people to Urbit. You should become a true champion of your local urbit community who helps people find their own path on urbit, whether it is signing up for a course, a grant or even working for a company in the ecosystem. It's up to you to find the potential of the attendees.
34+# Application process
35+After applying to this bounty, set-up a call with ~dalweb-donfun who will assess the soundness of your strategy and run you through the requirements of this bounty. If everything checks-out you are good to go.
36+# Compensation
37+- Upon the completion of six meetup events and the associated meetup report, one star will be paid out to the organizer.
content/grants/2023/did-rfp.mdnew file+26
@@ -0,0 +1,26 @@
1++++
2+
3+title = "Build a DID Resolver for Urbit"
4+date = "2023-04-12"
5+
6+[taxonomies]
7+grant_type = ["RFP"]
8+grant_category = ["App Dev"]
9+
10+[extra]
11+image = ""
12+description = "Design and implement a DID resolver to let Urbit interoperate with protocols like AT/BlueSky"
13+reward = "TBD"
14+assignee = [""]
15+champion = [""]
16+grant_id = "P1001"
17+completed = false
18+canceled = false
19+
20++++
21+
22+The launch of [BlueSky](https://blueskyweb.xyz/) and the [AT protocol](https://atproto.com/guides/identity) has brought renewed attention to a W3C standard called [DIDs](https://www.w3.org/TR/did-core/#introduction) or Decentralized Identifiers
23+
24+Decentralized identifiers (DIDs) are a type of identifier that enables verifiable, decentralized digital identity. A DID refers to any subject as determined by the controller of the DID. In contrast to typical, federated identifiers, DIDs have been designed so that they may be decoupled from centralized registries, identity providers, and certificate authorities. Urbit ID is a good fit with this standard, since the Urbit namespace already conforms with many aspects of the specification.
25+
26+Included in the standard is a specification for a [resolver](https://www.w3.org/TR/did-core/#dfn-did-resolvers), a function that maps a READ from an identifier to its accompanying document. Build an application layer in Urbit that uses a ship to resolve a DID to a document either on the Urbit network or outside it.
content/grants/2023/elm.mdnew file+68
@@ -0,0 +1,68 @@
1++++
2+
3+title = "Elm"
4+date = "2023-06-08"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["Other"]
9+
10+[extra]
11+image = ""
12+description = "Making Elm the frontend technology for Urbit"
13+reward = "5 Stars + Bonus"
14+assignee = ["~racfer-hattes"]
15+champion = ["~rovnys-ricfer"]
16+grant_id = "P0275"
17+completed = false
18+canceled = false
19+
20++++
21+
22+# Description
23+
24+I think Elm is a great language for developing frontends. The Elm architecture is conceptually very similar to how %gall agents are structured.
25+
26+Goals:
27+
28+1. Remove the need to convert to and from JSON to interact with Urbit from Elm
29+2. Make interacting with Urbit from Elm as painless as possible
30+
31+To eliminate the need to convert through JSON Elm needs to support serializing and deserializing jammed nouns.
32+
33+For potential portability reasons Elm libraries are not allowed to have JS FFI. This means that we need to implement as much as possible in pure Elm.
34+
35+# Milestones and Compensation
36+
37+## Milestone 1: Jam and Nouns
38+
39+Reward: 2 Stars
40+
41+Deliverables:
42+ - An Elm library that implements `++jam` and `++cue` in Elm.
43+ - An Elm library for manipulating Nock Nouns and converting Elm data structures and type to and from Nock Nouns.
44+
45+## Milestone 2: Noun Channels
46+
47+Reward: 1 Star
48+
49+Deliverables: An Elm airlock library that supports subscriptions and pokes encoded as jammed Nouns. The library should be designed to be as ergonomic as possible.
50+
51+## Milestone 3: Documentation and Project Template
52+
53+Reward: 1 Star
54+
55+Deliverables:
56+ - Good documentation for resulting the package + a set of tutorials that cover some tricky bits.
57+ - A git repo with all of the boilerplate required to communicate with Urbit. This repo is intended to be used by ASL students to bootstrap their project frontend.
58+
59+## Milestone 4: SSS
60+
61+Reward: 1 star
62+
63+Deliverables: An Elm airlock library that supports Solid-state subscriptions.
64+
65+## Bonus
66+
67+Upon successful completion of project, the contributor will also receive a 6K USDC bonus funded by Vaporware
68+
content/grants/2023/email-stella-fixa-rfp.mdnew file+29
@@ -0,0 +1,29 @@
1++++
2+title = "Build an Email Toolchain for Urbit"
3+date = "2023-05-11"
4+
5+[taxonomies]
6+grant_type = ["RFP"]
7+grant_category = ["App Dev"]
8+
9+[extra]
10+image = ""
11+description = "Produce an Urbit-side client for sending E2EE email"
12+reward = "TBD"
13+assignee = [""]
14+champion = [""]
15+grant_id = "P1001"
16+completed = false
17+canceled = false
18++++
19+
20+Email is the glue for much of the legacy web. While many of us share an aversion to the proliferation of email, the ability to tie email to Urbit identity will enable users to unify their control over their digital life more than is currently possible.
21+
22+There are a lot of ways such a project could shake out.
23+
24+- The gold standard would basically be run-your-own-ProtonMail from Urbit.
25+- One could also build a CLI email agent, like [Mutt](http://www.mutt.org/). This would be a good start.
26+- Implementing [JMAP](https://en.wikipedia.org/wiki/JSON_Meta_Application_Protocol) should be feasible as well, and simpler than IMAP/SMTP.
27+- The minimum viable product would be a front-end on Mars for a connected email server process on Earth, including a full user story on how to operate this without too much tetchy sysadmin work required.
28+
29+Anything in between would also be acceptable. There are some interesting crossovers possible as well, such as sending email to `@p` or via the `user@sampel-palnet.arvo.network`.
content/grants/2023/eyre-noun-channels.md+2−2
@@ -1,6 +1,6 @@
11+++
22title = "Finishing Touches to Eyre Noun-Based Channels"
3−date = "2022-01-26"
3+date = "2023-01-26"
44
55[taxonomies]
66grant_type = ["Proposal"]
@@ -13,7 +13,7 @@ reward = "2 stars"
1313assignee = ["~polwex"]
1414grant_id = "P0229"
1515champion = ["~palfun-folsup"]
16−completed = false
16+completed = true
1717canceled = false
1818+++
1919
content/grants/2023/generator-doccords.md+1−1
@@ -8,7 +8,7 @@ grant_category = ["Core Dev"]
88
99[extra]
1010image = ""
11−assignee = [""]
11+assignee = ["~napnyl-nortuc"]
1212description = "Adapt the comments in the default generators to take advantage of the new doccord features."
1313reward = "1 star"
1414grant_id = "B0231"
content/grants/2023/gh-concierge.mdnew file+42
@@ -0,0 +1,42 @@
1++++
2+
3+title = "Github Support Concierge"
4+date = "2023-02-03"
5+
6+[taxonomies]
7+grant_type = ["Bounty"]
8+grant_category = ["Other"]
9+
10+[extra]
11+image = ""
12+description = "The Github concierge will triage Urbit support issues that come in through Github."
13+reward = "2 Stars"
14+assignee = ["~larryx-woldyr"]
15+champion = ["~poldec-tonteg"]
16+grant_id = "B0233"
17+completed = false
18+canceled = false
19+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0233&prefill_Grant+Name=Github%20Support%20Concierge"
20+
21++++
22+
23+## Overview
24+
25+The Github concierge will triage Urbit support issues that come in through github. Some of these issues are routine and can be handled in the thread, whereas occasionally complex issues arise that need to be escalated to the right people. Ideal candidates will also help synthesize support data to inform product feature work and documentation.
26+
27+## Responsibilities
28+
29+- Triage support issues in github
30+- Write a weekly digest of issues addressed
31+- Attend a recurring meeting with Foundation staff
32+
33+## Qualifications
34+
35+- Helpfulness
36+- Familiarity with running urbit in a variety of environments (cloud server, laptop)
37+- Ability/interest in synthesizing support data and recommending new features or documentation
38+- Dilligence
39+
40+## Compensation
41+
42+2 Stars for 3 months of work, at which time the agreement can be renewed.
content/grants/2023/git-on-clay.mdnew file+42
@@ -0,0 +1,42 @@
1++++
2+
3+title = "Implement a Git server on Urbit"
4+date = "2023-06-01"
5+
6+[taxonomies]
7+grant_type = ["RFP"]
8+grant_category = ["App Dev"]
9+
10+[extra]
11+image = ""
12+description = "Implement a Git server capable of hosting desks as repos"
13+reward = "TBD"
14+assignee = [""]
15+champion = [""]
16+grant_id = "P1001"
17+completed = false
18+canceled = false
19+
20++++
21+
22+A Git server backend would open up the use of Urbit ships to interface with remote developers and resources.
23+An Urbit implementation of Git would not have to implement all of the features that a Git server typically
24+expects, merely the ability to interface through clone, fetch, and merge operations and through the https and git
25+protocols. (Obviously sufficient internal representations of Git objects, diffs, and so forth are necessary as well.)
26+
27+Having an Urbit-native Git server-side representation has the potential to revolutionize the Urbit developer
28+experience. Not only would it become possible to synchronize Clay and host OS files through `git`, but Urbit would
29+also have direct access to the wealth of Git-based resources on the broader web. More than this, **Urbit would
30+immediately become capable of being a fully decentralized Git repository system.**
31+
32+A solution could be built directly in userspace or on top of Clay. If Clay is used, then there would need to be a
33+way for an unvalidated desk (no mark validation) to store data prior to use in Urbit, e.g. fed up to a functioning
34+regular desk or read out (via remote scry or otherwise) to the Git-based world. In this case, Git operations would
35+be done at a Unix command line regularly and Urbit would serve as a central repo or distribution point. (This could
36+ease development through the appropriate use of scripts, CI and testing, and hooks.)
37+
38+A fully userspace solution would be viable, as long as it was able to export a Git-compatible representation via the
39+API, and as long as it spoke `https` and `git` at a minimum.
40+
41+(Note particularly that this is not an implementation of `git` on Urbit, but an implementation of a Git repository
42+server. The `git` CLI would encompass a complementary set of concerns and operations.)
content/grants/2023/goals-2.mdnew file+64
@@ -0,0 +1,64 @@
1++++
2+title = "Goals 2"
3+date = "2023-03-20"
4+
5+[taxonomies]
6+grant_type = ["Proposal"]
7+grant_category = ["App Dev"]
8+
9+[extra]
10+image = ""
11+description = "Goals 2"
12+reward = "5 stars"
13+assignee = ["~niblyx-malnus", "~sidlup-havwen"]
14+grant_id = "P0227"
15+champion = ["~datder-sonnet"]
16+completed = false
17+canceled = false
18++++
19+
20+# Main Objectives
21+
22+## Groups Integration (Reward: 2 Stars)
23+- Full association of a pool with a group.
24+ - The pool is public or private in correspondence with the group.
25+ - The pool has the same set of banned/allowed ships as the group.
26+ - All group admins are automatically admins on the pool.
27+ - Members who leave or are kicked from the group are automatically removed from the pool.
28+ - Members who join the group are automatically added to the pool.
29+- Each pool and goal will have an associated note. A note is a piece of markdown used to flesh out the pool or goal in greater detail.
30+- Each pool and goal will have an associated comment section where pool members can comment on the specific details of the goal.
31+- Both notes and comments will be able to link to existing nodes in Groups which will render appropriately. This includes chats, notes, channels, comments, entire groups, and applications.
32+- Both notes and comments will be able to link to existing pools and goals which will render similarly to Groups nodes.
33+- Significant events trigger notifications to be sent via %hark. These include:
34+ - Being assigned to be chief of a goal.
35+ - Being assigned to be in the spawn set of a goal.
36+ - New goals spawned under goals you own.
37+ - Non-actionable goals with no subgoals being left childless for an extended period of time.
38+ - Other events as they emerge and are deemed appropriate.
39+
40+
41+## Sorting/Filtering and Tags/Fields (Reward: 2 Stars)
42+
43+- Tags
44+ - Each goal within a pool can be tagged.
45+ - Everyone can maintain private tags associated with a goal which only they can view.
46+ - Harvested goals can be sorted by tags.
47+ - Tags can be viewed so that all goals associated with them can be seen and explored.
48+- Sorting/Context-based Ordering
49+ - Goals can be sorted by the date of their deadline or kickoff.
50+ - Goals can be re-ordered in the context of their subgoals with a simple dragging mechanism.
51+
52+
53+## Improved UX (Reward: 1 Star)
54+
55+- Shortcuts and quick actions using ctrl
56+- Improved mobile experience
57+- Working poke relays on the frontend
58+- Ability to re-order subgoals with a drag and drop action
59+- Dark mode
60+
61+
62+# Compensation
63+
64+Reward: 5 stars
content/grants/2023/hoon-linter.mdnew file+30
@@ -0,0 +1,30 @@
1++++
2+
3+title = "Hoon Linter"
4+date = "2023-03-21"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["Core Dev"]
9+
10+[extra]
11+image = ""
12+description = ""
13+reward = "2 Stars"
14+assignee = ["~watter-parter"]
15+champion = ["~rovnys-ricfer"]
16+grant_id = "P0224"
17+completed = false
18+canceled = false
19+
20++++
21+
22+# Description #
23+
24+Most languages have some form of "linter" available that reports potentially-problematic code. Typically, such code will successfully compile, but will fail at runtime or produce otherwise undesirable results. Because the code is technically valid, it cannot be rejected by the compiler (at least, not without changing the language spec, which risks breaking existing programs), but we can still warn the programmer that what they are doing is likely to cause problems.
25+
26+I have started work on a "Hoon linter" that serves this purpose. The linter is integrated with %language-server, and can thus report warnings directly in any editor that supports the Language Server Protocol. The linter can also be invoked as a standalone generator. Currently, the linter only checks for duplicate union tags. I would like to add more checks to the linter, such as detecting when a noun is pinned to the subject but never used. There are also a few warts that I would like to eliminate, with guidance from someone more experienced.
27+
28+# Compensation #
29+
30+Reward: 2 Stars
content/grants/2023/hoon-replit.mdnew file+45
@@ -0,0 +1,45 @@
1++++
2+
3+title = "Hoon Grammar and Language Mode for Replit"
4+date = "2023-02-15"
5+
6+[taxonomies]
7+grant_type = ["Bounty"]
8+grant_category = ["Core Dev"]
9+
10+[extra]
11+image = ""
12+description = "Hoon CodeMirror grammar and language mode for Replit"
13+reward = "1 stars"
14+assignee = ["~ransud-wannus-malbex-lacnyr"]
15+champion = ["Replit"]
16+grant_id = "B0238"
17+completed = true
18+canceled = false
19+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0238&prefill_Grant+Name=Hoon%20CodeMirror%20grammar%20and%20language%20mode%20for%20Replit"
20+
21++++
22+
23+# Hoon CodeMirror grammar and language mode for Replit
24+
25+_Note: This is a mirror of [a bounty](https://replit.com/bounties/@masfrost/hoon-codemirror-gram) on the Replit site. Acceptance by the Replit team qualifies you for a bonus Star, to be claimed from the Urbit Foundation._
26+
27+## Project Description
28+
29+Hoon is a programming language used in the Urbit operating system. You can find the grammar specification for Hoon in the official Hoon documentation. You can use the Hoon mode for Emacs and the Vim package for reference: hoon-mode.el and hoon.vim.
30+
31+Replit uses CodeMirror as the editor and we want to add first-class support for Hoon, including syntax highlighting. We have a language mode template available on Replit (please read the README for guidance).
32+
33+We'll publish it as an open source package and credit you.
34+
35+## Acceptance Criteria
36+
37+- Syntax highlighting should match the modes for Hoon in the Emacs and Vim packages
38+- Folding ranges should be added to improve code folding
39+- Should use lezer instead of custom tokenization
40+
41+## Compensation
42+
43+- $162.00 from Replit
44+- 1 Star
45+
content/grants/2023/issue-grab-bag.mdnew file+36
@@ -0,0 +1,36 @@
1++++
2+
3+title = "Urbit Issue Grab Bag"
4+date = "2023-02-15"
5+
6+[taxonomies]
7+grant_type = ["Bounty"]
8+grant_category = ["Core Dev"]
9+
10+[extra]
11+image = ""
12+description = "Close three issues from the Urbit github repo."
13+reward = "2 stars"
14+assignee = [""]
15+champion = [""]
16+grant_id = "B0239"
17+completed = false
18+canceled = false
19+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0239&prefill_Grant+Name=Urbit%20Issue%20Grab%20Bag"
20+
21++++
22+
23+## Overview
24+
25+
26+The Urbit Foundation monitors existing and new issues in the codebase to identify issues that can be addressed by community contributors.
27+
28+This bounty will be awarded to someone who closes any three of the issues labeled community contribution in the [urbit](https://github.com/urbit/urbit/labels/community%20contribution) or [vere](https://github.com/urbit/vere/labels/community%20contribution) github repo.
29+
30+The ideal contributor will have a decent command of hoon and an understanding of the Urbit stack. Some, but not all, issues will require experience with the [Vere runtime](https://github.com/urbit/vere). Issues are selected to require minimal organizational context, making them amenable to open source contributors.
31+
32+For clarification on any of the issues, please mention [@vvisigoth](https://github.com/vvisigoth) or the issue filer in the issue comments.
33+
34+## Compensation
35+
36+2 Stars
content/grants/2023/json-parser-suite.mdnew file+170
@@ -0,0 +1,170 @@
1++++
2+
3+title = "JSON re/parser building suite"
4+date = "2023-02-23"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["Other"]
9+
10+[extra]
11+image = ""
12+description = "JSON re/parser building suite"
13+reward = "2 Stars"
14+assignee = ["~litlep-nibbyt"]
15+champion = ["~lagrev-nocfep"]
16+grant_id = "P0245"
17+completed = true
18+canceled = false
19+
20++++
21+
22+# Overview
23+
24+A set of three generators which will automate a majority of the work involved in writing parsers to and from JSON. One generator will convert a noun directly to its JSON representation, one generator will produce an example hoon parser given an example input JSON, and one generator that will produce an example hoon parser given a JSON schema.
25+
26+
27+
28+# Motivation
29+
30+JSON is the most widely used format for HTTP payloads. Urbit apps which talk to existing web services must send and receive requests formatted in JSON. Additionally, apps with Javascript frontends use the Urbit HTTP API to facilitate communication between the frontend and Urbit.
31+
32+
33+
34+A set of generators which can automate a majority of the work involved in writing parsers to and from JSON would accelerate the pace of app development.
35+
36+
37+
38+# Implementation
39+
40+For the noun to JSON direction, the conversion would be direct: given any input noun, the generator would produce the corresponding JSON. `~rovnys-ricfer` has completed most of a noun to json encoder. The code can be found [here](https://gist.github.com/belisarius222/d22b39ac0fece6e0680db5d60c6595c6). When complete, it will be able to take a noun and its AST and convert it to a json representation. We have identified missing encodings inside of en-dime for the following auras: `%s, %rq, %rh, %rd, %rs, %ub, %uc, %ux, %uv, %uw`. Part of this bounty will involve implementing the json encoding for the missing auras.
41+
42+
43+
44+For the JSON to noun direction, we will implement two generators, one which accepts an example JSON and another which accepts a JSON schema. Both generators will output a cord containing an example hoon parser for the input JSON. The expectation is that the user will use this parser as a starting point for their own. The generators will produce a structurally correct parser for the target JSON. The user may have to modify the parsing rules inside each entry to get their desired result, but the structure of the parser must be correct.
45+
46+
47+
48+To illustrate how we expect these generators to be used, we provide an example below:
49+
50+
51+
52+Given an example json:
53+
54+```
55+
56+[ ~[ %o
57+
58+ p
59+
60+ { [p='id' q=[%s p='1234']]
61+
62+ [p='name' q=[%s p='James']]
63+
64+ [p='contact_number' q=[%n p='4132549899']]
65+
66+ }
67+
68+ ]
69+
70+]
71+
72+```
73+
74+
75+
76+Or a schema:
77+
78+
79+
80+```
81+
82+{
83+
84+ "$schema":"http://json-schema.org/draft-04/schema#",
85+
86+ "title":"User",
87+
88+ "description":"A user request json",
89+
90+ "type":"object",
91+
92+ "properties":{
93+
94+ "id":{
95+
96+ "description":"The unique identifier for a user",
97+
98+ "type":"integer"
99+
100+ },
101+
102+ "name":{
103+
104+ "description":"Name of the user",
105+
106+ "type":"string"
107+
108+ },
109+
110+ "contact_number":{
111+
112+ "type":"number"
113+
114+ }
115+
116+ },
117+
118+ "required":[
119+
120+ "id",
121+
122+ "name",
123+
124+ "contact_number"
125+
126+ ]
127+
128+}
129+
130+```
131+
132+
133+
134+The generator will produce this piece of hoon code as a cord:
135+
136+
137+
138+```
139+
140+++ req-parser-ot
141+
142+%- ot:dejs-soft:format
143+
144+:~ [%id so:dejs:format]
145+
146+[%name so:dejs:format]
147+
148+[%contact_number no:dejs:format]
149+
150+==
151+
152+```
153+
154+
155+
156+
157+
158+# Deliverable(s)
159+
160+1 Generator which can directly convert from noun to JSON.
161+
162+1 Generator that can produce an example hoon parser given an example input JSON.
163+
164+1 Generator that can produce an example hoon parser given a JSON schema.
165+
166+
167+
168+# Compensation
169+
170+2 Stars upon completion of the grant.
content/grants/2023/kNock-property-testing.mdnew file+71
@@ -0,0 +1,71 @@
1++++
2+
3+title = "kNock and Property Tests"
4+date = "2023-04-11"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["Core Dev"]
9+
10+[extra]
11+image = ""
12+description = "Executable Semantics of Nock in the K Framework, universal testing and verification"
13+reward = "7 Stars"
14+assignee = ["Runtime Verification, Inc."]
15+champion = ["~rovnys-ricfer"]
16+grant_id = "P0255"
17+completed = false
18+canceled = false
19+
20++++
21+
22+# Property Testing for Hoon
23+
24+Hoon currently supports pure unit tests. The tests have no entropy and no inputs. This is of course useful. But functional languages have a history of using QuickCheck and similar frameworks for even more powerful tests. Property testing allows testing across a large input space. It relies on writing more general tests, where the programmer specifies properties of their program which should always hold, regardless of input. A typical example is, after writing a sort function, that the resulting list has the same length as the input list, that it is in fact sorted, and that sorting it again causes no changes. This should hold for any input list, and a QuickCheck-like framework will feed many, many different types of lists to the test to find ways it could break.
25+
26+Apart from a test runner, QuickCheck-like frameworks also require an intelligent and modular input builder. For simple and common inputs – atoms, lists of atoms, and other simple data structures – the input builder should a) be able to generate inputs without any programmer effort, b) try progressively more interesting inputs, such as [], [0], [0 0], [1 0], [0 0 1] etc: starting small and going higher, and c) be able to shrink inputs from a failure: if the list [0 2 2 4 3] fails to sort correctly due to the algorithm picking the middle element as pivot in odd length list and discarding elements identical to the pivot, the shrinking should be able to try progressively smaller inputs until it finds something like [2 2 2] as an example.
27+
28+## Future uses
29+
30+The combination of kNock (https://github.com/runtimeverification/knock) and a property testing library means it's possible to move directly from testing to formal verification. This concept is even mentioned in the original QuickCheck paper (https://www.cs.tufts.edu/~nr/cs257/archive/john-hughes/quick.pdf) (Section 5.2). Runtime Verification has also developed a similar tool for Ethereum smart contracts, using the combination of an existing property testing library and a formal verification framework.
31+
32+In 2022, Runtime Verification developed KEVM-Foundry. Foundry is a testing framework for Solidity: property tests are written in Solidity, compiled to EVM and executed in a fast implementation of the EVM written in Rust. This setup, with property tests written in the same language as the program being tested, allows us to leverage our K semantics (https://kframework.org/) of that language for proving. Property tests – which take randomized inputs and assert properties of programs using those inputs – can be seen as formal program specifications with symbolic inputs. In the case of KEVM-Foundry, we can run the tests directly in K with symbolic inputs.
33+
34+Anecdotally, this has lead to higher quality code – formally specifying your code tends to have that effect – while also making formal verification a more tractable proportion: the human verifier can write correct specifications faster – working in Solidity is easier than writing K specifications directly and being able to fuzz the specifications means trivial specification errors are caught much faster. The same framework can also be used to quickly create execution traces built with the summarizer: simply assert something impossible and set the prover off trying to prove it, exploring all possible branches.
35+
36+More info and demos: https://www.youtube.com/live/staXNgpBjEI?feature=share&t=10820
37+
38+# Deliverables
39+
40+We build, in Hoon, a property testing library. This could be added to the existing -test thread, by inspecting whether a test is a gate, and if so, generate a random sample for it; or the library could be added as a new thread. Reusing the existing thread and having the types of tests co-exist likely makes for the best user experience, compared to having different types of files for different types of tests. The suggested invocation (assuming it is baked into the -test thread) is:
41+
42+`> -test <path> <entropy> ~`
43+
44+For example:
45+
46+`> -test /=landscape=/tests eny ~`
47+
48+The explicit passing of entropy means a failing test is easy to replay with the exact same command (the printout of results will contain the entropy used). If no entropy is passed, 0 is used as entropy.
49+
50+A property test is nothing more than a regular test which is a gate. Running it means generating a sample to the gate. Optionally, a test can have a generator which is responsible for generating its sample: this is necessary, for example, in order to generate arbitrarily large data structures such as trees. It's also useful in order to generate random values more intelligently than the default generator, which can help exercise edge cases. For example, Mitgaard found a 20 year old bug in the data structure Patricia trees by tweaking QuickCheck inputs to hit on otherwise extremely unlikely edge cases (https://janmidtgaard.dk/papers/Midtgaard%3aTFP17.pdf). There are several possible designs for generating arbitrary data -- using arms in the test with names starting in "gen-", specifying them along with the gate for the tests, etc. Which implementation is both easy to use in the default case and powerful in the hands of a power user is something that will require some interaction and community discussion.
51+
52+## Deliverables for property testing in Hoon
53+
54+Implement basic property testing: the user should be able to write a test arm as a gate using the existing test primitives (such as expect-eq, expect-fail), and the test runner should create random samples and repeatedly slam the gate.
55+Implement custom sample generation: the user should be able to specify a gate which produces custom inputs based on given entropy.
56+Implement sample re-generation, allowing the test to put restricting assumptions on the input. For example, an [@ud @ud] sample testing (sub a b) might require (lte b a), and the user should be able to specify this, rejecting any samples which don’t conform, reporting that inputs were discarded without the test failing.
57+Implement sample shrinking, trying to create the smallest possible failure example.
58+Write documentation for the urbit.org website.
59+Write an example property test suite, showing off the various capabilities of the test framework, for some relevant core functionality from the Hoon standard library.
60+
61+# Timeline and Compensation
62+
63+Timeline: 1-2 Months
64+
65+Reward: 7 Stars
66+
67+# Who we are
68+
69+Runtime Verification, Inc. is a specialist in formal verification, auditing and security products for smart contracts and blockchains. We are the main developers and supporters of the K Framework which we are constantly optimizing and extending.
70+
71+Rikard Hjort (~bithex-topnym) is an auditor and verification engineer at Runtime Verification. He’s an MSc in Computer Science from Chalmers University of Technology, the creator of kNock, a Hoon School finisher, and the host of the Urbit Berlin meetups.
content/grants/2023/lick.mdnew file+82
@@ -0,0 +1,82 @@
1++++
2+
3+title = "%lick"
4+date = "2023-02-23"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["Core Dev"]
9+
10+[extra]
11+image = ""
12+description = "An Earth Communication Vane"
13+reward = "7 Stars"
14+assignee = ["~mopfel-winrux"]
15+champion = ["~lagrev-nocfep, ~rovnys-ricfer"]
16+grant_id = "P0244"
17+completed = false
18+canceled = false
19+
20++++
21+
22+# Introduction
23+This is a grant for a new vane called %lick. This will act as a way for `Gall` agents to open and close a communication port to Earth processes; enabling communication with various devices and processes ranging from cryptographic hardware keys and dongles, embedded devices speaking on common communication interfaces (UART, SPI, I2C, etc), and IoT connected devices.
24+
25+How %lick will work is best explained with the following usecase:
26+
27+I have a receipt printer that communicates through UART communication. I want it to print out any %rumors I recieve.
28+
29+This usecase will act as an end to end test of the entire system (described below) and allow incremental experimentation until the final product.
30+
31+This grant is split into 4 parts
32+
33+1. Creation of the vane (%lick and lick.c)
34+2. Gall agent (%receipt)
35+3. Earth process which communicates with lick's port and the receipt printer
36+4. Documentation and Tutorial
37+
38+# Vane
39+The Arvo vane exposes an interface for opening and communicating with a host device through Unix IPC ports. `%lick` extends `%galls` pokes to Earth based processes.
40+
41+An agent will be able to `%spin` up a port (type `path`) and `vere` will create it in the piers `.urb/dev` folder. An agent will also be able to `%shut` this port. When an Earth process connects to the IPC port `vere` will send a `%soak` to the `duct` that opened the port. The soak will have the `mark` `%connect`. When the Earth process disconnects `vere` will send a `%soak` with a `%disconnect` `mark`. Whenever an earth process is connected the `gall` agent will be able to `%spit` a noun with the structure `[=mark =noun]`. The `gall` agent should also be able to receive a `%soak` with a similar noun structure.
42+
43+Data being transfered along the IPC port will be `jam`med nouns.
44+
45+
46+# Gall Agent
47+Once the vane and library is tested work will begin on implementing a gall agent that subscribes to the %rumors app by ~paldev. The app will begin by `%spin`ing a port. When an earth process connects to the port it will subscribe to %rumors and on recieving one it will send the correct command for the printer to output it.
48+
49+# Earth Process
50+
51+The Earth process will connect to a given IPC port and wait for a `%print` mark with a `@ta`. It will use `vere`'s eval function to `cue` the noun from the port and parse the hoon pretty printer to correctly print the message.
52+
53+This will be fine for a receipt printer but future work will have to be done to implement a noun library in a given language.
54+
55+# Documentation and Tutorial
56+Documentation of how the vane works is vital to the succuss of it. The benefit of having a working app alongside the vane is to show users how to use the vane. The resulting gall agent and earth process will be written into a tutorial that should allow anyone to replicate this work.
57+
58+
59+# Milestones
60+
61+## Milestone 1: Vane
62+Payment: 3 Stars
63+
64+This milestone includes a working vane that we can send nouns back and forth too.
65+
66+
67+## Milestone 2: Gall Agent
68+Payment: 2 stars
69+
70+This milestone is complete when a user can install `%receipt` and have it print rumors.
71+
72+## Milestone 3: Earth Process
73+Payment: 1 star
74+
75+This milestone is complete when a user can install the app and have the printer print its rumors
76+
77+
78+## Milestone 4: Documentation and Tutorial
79+Payment: 1 star
80+
81+This milestone is complete with the delivery of a documentation and tutorial package.
82+
content/grants/2023/mapping-ids.mdnew file+106
@@ -0,0 +1,106 @@
1++++
2+
3+title = "Mapping Urbit IDs to Web 2 Domains"
4+date = "2023-06-13"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["Other"]
9+
10+[extra]
11+image = ""
12+description = ""
13+reward = "5 Stars"
14+assignee = ["Web23"]
15+champion = ["~rovnys-ricfer"]
16+grant_id = "P0262"
17+completed = false
18+canceled = false
19+
20++++
21+
22+# Overview
23+
24+Urbit has a striking design that makes Urbit IDs scarce, full of utilities and many more new use cases would evolve around them.
25+
26+Urbit IDs also have an analogy with the Unix file systems where hostname resolves to the loopback address of the localhost. Further, an address will be reachable via network packets as well as be accessible via a local naming system.
27+
28+This structure of hostnames mapped with the IP addresses evolved to DNS at large. Urbit is perfectly aligned to evolve Urbit IDs into a true decentralized DNS structure.
29+
30+Domain names run over Web2 stack & current technological stack is in a transition state. For example, Web3 domains, let’s say john.eth or john.crypto are not recognized by the existing DNS and hence the resolvers & browsers. Typing john.eth in Chrome will not take a user to john.eth even if a dAPP is running over john.eth
31+
32+Additionally, with the Decentralized Identifiers (DIDs) evolving as the perfect way to identify the assets over the chain, it becomes imperative to look-up for DIDs and resolve them for multiple use cases.
33+
34+To fill the technical discontinuity amongst Web2 domainers & Web3 domainers, we propose a hinge between Urbit IDs & Web2 domains and also propose to build the DID resolver.
35+
36+# Why?
37+ - Web2 domains still serve as the starting points for most of the things on the Internet. (Even when Web3 products start their journey, maybe one of the first steps is to register a Web2 domain.)
38+ - People across the world know, understand & value Web2 domains more than any other thing (for example, a dot com)
39+ - There are millions of Web2 domainers who have no idea of Web3 landscape & considering them the long tail it is far more easier to use Web2 domains and nudge them towards Web3
40+
41+# The Proposal
42+
43+1. Chain agnostic Web23 domain centric wallet, first of it’s kind with the capabilities of Ethereum, Solana, Hedera Hashgraph to allow:
44+1
45+ - Existing Web2 domainers (likes of .com, .link) to explore, mint new Urbit IDs (from within the wallet) - pulled via GoDaddy, Tucows etc.
46+ - Existing Web3 domainers (likes of .eth, .sol, .hbar) to explore, mint new Urbit IDs (from within the wallet)
47+2. Decentralized application with the web interface to allow minting of new Urbit IDs via:
48+ - Web2 domains pulled over GoDaddy & Web3 domains pulled via Metamask (for Ethereum) or Phantom (for Solana) or Blade (for Hedera Hashgraph)
49+3. Integrated DID resolver:
50+ - To be accessed within the entire galaxy/ships of Urbit - an application layer in the form of NPM based libraries - could be used by all the calls/requests
51+ - To be accessed within the Web23 wallet as eventually DIDs would be the best fit & initial hook for the wallet - allowing end users to map multiple assets along with their DIDs
52+
53+# Timeline and Compensation
54+
55+This proposal will be completed in multiple phases, beginning with:
56+
57+Web23 wallet in the form of Chrome Extension for the Urbit community with the capabilities to map Web2 domains + Web3 domains of Ethereum, Solana, Hedera Hashgraph, Concordium along with the Urbit IDs:
58+ - Option to buy new Urbit IDs
59+ - Option to configure existing Urbit IDs
60+ - Access to Urbit IDs via sub-domains of the existing Web2 domains in question. For example, john.com may have ~Urbit ID.john.com
61+ - Option to exchange DMs (Direct Messages) within the wallet amongst each other
62+
63+Timeline: 8 weeks from start of project
64+
65+Reward: 5 Stars
66+
67+# Future Work
68+
69+The next two phases of work will consist of:
70+
71+1. Web based decentralized application to allow Web2 domain holders + Web3 domain holders of Ethereum, Solana, Hedera Hashgraph & Concordium to:
72+ - Map their existing Urbit IDs with the Web2 or Web3 domains (as indicated above)
73+ - Buy new Urbit IDs
74+ - Configure Urbit IDs
75+ - Decentralized application to allow connectivity for the respective wallets of the chains (one wallet each chain)
76+ - Exchange DMs using the Urbit IDs as hook and accessible over decentralized application
77+
78+
79+2. Integration of DID Resolver for Urbit allowing:
80+ - Ships to resolve to DIDs
81+ - Web23 wallet to resolve DIDs since Urbit IDs would be mapped to the
82+wallet
83+ - Decentralied apps to resolve DIDs
84+
85+# Overall Benefits
86+
87+ - Web2 domains get coupled with Urbit IDs for future sign-ups over dApps - for enhanced utilities of Urbit IDs
88+ - Insertion of Urbit IDs into the zone files of Web2 domains - for future readiness when DNS resolvers may have to query about the Urbit IDs
89+ - Easy access of Urbit IDs or dApp running web pages via integrated hosting services. For example, ravmel-ropdyl.john.com if Urbit ID ~ravmel-ropdyl creates a hinge with john.com
90+ - Integration of DID resolving part from within the proposed Web23 wallet- allowing users to keep & manage Urbit IDs, DIDs, Web2 domains and even Web3 domains -lying over Ethereum, Solana & Hedera Hashgraph
91+ - Push of Urbit IDs to all the Web2 domainers
92+
93+# Why Us?
94+
95+ - Our core expertise & experience run in decades of man hours in the Unix/Linux & domains, DNS at large
96+ - [Web23](https://web23.io/) is one of the grantees of Hedera Hashgraph - we have developed complete naming system for .hbar and various project TLDs over Hedera
97+ - Web23 has collaborated with many ICANN registrars & registries to bring in the Web2 domainers to the evolving webspace of Web3
98+ - Web23 is working to transform any Web2 domain to a Web3 domain
99+
100+# Specific Deliverables
101+
102+ - Web23 domain centric wallet
103+ - DID resolver as NPM based library
104+ - Integrated DID resolver within the Web23 wallet as well as the application layer for the ships
105+ - A decentralized web application with integrations of Metamask, Phantom & Blade to allow buying, mapping of Urbit IDs to Web2 domains
106+
content/grants/2023/network-weather.mdnew file+24
@@ -0,0 +1,24 @@
1++++
2+
3+title = "Network Weather Simulator for %pyro/%aqua"
4+date = "2023-03-02"
5+
6+[taxonomies]
7+grant_type = ["RFP"]
8+grant_category = ["Core Dev"]
9+
10+[extra]
11+image = ""
12+description = "Network Weather Simulator for `%pyro`/`%aqua"
13+reward = "TBD"
14+assignee = [""]
15+champion = [""]
16+grant_id = "P1004"
17+completed = false
18+canceled = false
19++++
20+
21+`%pyro` and `%aqua` are virtualization tools that allow developers to run one or many virtual ships within their ship. This opens up many testing possibilities, since it's possible to spin up an entire fleet of virtual ships with state and orchestrate them within your ship. But since all of hte ships run one one computer, the network conditions are unrealistically good. In the real world, network connections fail, time out and generally perform in unexpected ways.
22+
23+Write a library that allows developers to easily add realistic "network weather" to fleet testing in `%pyro`/`%aqua`
24+
content/grants/2023/oauth2-stella-fixa-rfp.mdnew file+31
@@ -0,0 +1,31 @@
1++++
2+title = "Build a Single-Sign-On App for Urbit"
3+date = "2023-05-11"
4+
5+[taxonomies]
6+grant_type = ["RFP"]
7+grant_category = ["App Dev"]
8+
9+[extra]
10+image = ""
11+description = "Produce an OAuth-compatible token issuer and login manager."
12+reward = "TBD"
13+assignee = [""]
14+champion = [""]
15+grant_id = "P1001"
16+completed = false
17+canceled = false
18+
19++++
20+
21+OAuth has widespread support in Web 2.0 circles. OAuth issues permissioned tokens for service providers to manage sessions. There are burgeoning tools for Web3 integration.
22+
23+OAuth focuses on access delegation, meaning that one can authenticate into a third-party session using a primary identity but without giving one’s password to the third-party service provider. “OpenID is a way to use a single set of user credentials to access multiple sites, while OAuth facilitates the authorization of one site to access and use information related to the user's account on another site.”
24+
25+By providing Urbit with OAuth support, the ability to use Urbit to log into a variety of Web 2.0 services will be unlocked.
26+
27+Some resources that may be helpful in scoping such a project:
28+
29+- https://oauth.net/getting-started/
30+- https://www.oauth.com/oauth2-servers/getting-ready/
31+- https://www.pmail.com/devnews.htm
content/grants/2023/osmosis-client.mdnew file+48
@@ -0,0 +1,48 @@
1++++
2+
3+title = "Osmosis Client on Urbit"
4+date = "2023-03-26"
5+
6+[taxonomies]
7+grant_type = ["Bounty"]
8+grant_category = ["App Dev"]
9+
10+[extra]
11+image = ""
12+description = "The Urbit client for the Osmosis multi-chain DEX."
13+reward = "3 Stars + Bonus"
14+assignee = ["~larryx-woldyr"]
15+champion = [""]
16+grant_id = "B0234"
17+completed = true
18+canceled = false
19+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0234&prefill_Grant+Name=Osmosis%20Client%20for%20Urbit"
20+deliverable = "~larryx-woldyr/osmosis"
21+
22++++
23+
24+
25+## Overview
26+
27+An Urbit app that serves a personal client for the [Osmosis](https://app.osmosis.zone) multi-chain DEX.
28+
29+## Rationale
30+
31+Osmosis is the leading decentralized exchange for the Cosmos ecosystem. Most users access this DEX through [the front end developed](https://github.com/osmosis-labs/osmosis-frontend) by the Osmosis team and deployed at [app.osmosis.zone](https://app.osmosis.zone).
32+
33+Like many Dapps, the most used Osmosis front end is hosted on a central server. This falls short of the promise of decentralization and makes the application less resilient. On Urbit, it is easy for users to host their own front ends, making the system truly decentralized.
34+
35+Osmosis uses local browser storage for user configuration. This is not portable across browsers on the same machine or on different devices. The storage of this metadata on a user's urbit allows the data to remain private to the user and will survive swapping browsers and devices. At a later date, this configuration can be used by other apps and expand the scope of interoperability, eg. displaying which ships in a chat have a Cosmos wallet.
36+
37+## Scope / Implementation
38+
39+The first phase of this project is to bundle the [existing Osmosis front end](https://github.com/osmosis-labs/osmosis-frontend) and make it possible to serve from an Urbit.
40+
41+Once this is accomplished, a simple gall back end will be developed to replace the Osmosis client's use of browser `localStorage`. It may be necessary to fork the `osmosis-labs` code in order to replace API calls to localStorage with calls to the Urbit back end.
42+
43+Developer can assume that users will access this client through a browser that can install the Keplr wallet extension. There are currently projects in process to create an in-Urbit Cosmos wallet, but that integration is out of scope for this bounty.
44+
45+## Compensation
46+
47+3 Stars with a 1500 USDC bonus to be provided by the Osmosis foundation.
48+
content/grants/2023/pastebin-RFP.mdnew file+28
@@ -0,0 +1,28 @@
1++++
2+
3+title = "Pastebin on Urbit"
4+date = "2023-03-02"
5+
6+[taxonomies]
7+grant_type = ["RFP"]
8+grant_category = ["App Dev"]
9+
10+[extra]
11+image = ""
12+description = "Share plaintext snippets on Urbit"
13+reward = "TBD"
14+assignee = [""]
15+champion = [""]
16+grant_id = "P1000"
17+completed = true
18+canceled = false
19+
20++++
21+
22+# Description
23+Tools like pastebin and Github gists allow users to easily share plain text snippets. This is useful for sharing code or simple writeups.
24+
25+Implement minimal plaintext snippet sharing for Urbit, with support for both public (anyone with the path can read the snippet) and private (only invited individuals can read snippets).
26+
27+# Link to Proposal
28+[Pastebin on Urbit](https://urbit.org/grants/pastebin-proposal)
content/grants/2023/pastebin-proposal.mdnew file+33
@@ -0,0 +1,33 @@
1++++
2+
3+title = "Pastebin on Urbit"
4+date = "2023-06-05"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["App Dev"]
9+
10+[extra]
11+image = ""
12+description = ""
13+reward = "1 Star"
14+assignee = ["~polwex"]
15+champion = ["~poldec-tonteg"]
16+grant_id = "P0271"
17+completed = false
18+canceled = false
19+
20++++
21+
22+# Description #
23+
24+One of the promises of Urbit, perhaps the biggest one, is making the Internet peer-to-peer again. That's what it's designed to do. If I want to share data with other people I should be able to share it directly. I should not need to use other people's computers (the "cloud") to share a file, or a text snippet.
25+
26+While Dropbox-like functionality will take some time to arrive to Urbit, one thing we can do right now is more simple data sharing. Pastebin is a very useful website, but again it boggles the mind that you need to use an external service to share a simple piece of text with your friends. It should be easier. We will make it so.
27+
28+This proposal will create an Urbit application to share arbitrary text. You will be able to produce a link that will display a piece of text that you saved. You will be able to expose that document to the clearweb, only inside Urbit, or to selected Urbit ships of your choice.
29+
30+# Compensation #
31+Reward: 1 star
32+#
33+Note: This proposal was modified from the [Pastebin on Urbit RFP](https://urbit.org/grants/pastebin-RFP).
content/grants/2023/portal-features-1.mdnew file+82
@@ -0,0 +1,82 @@
1++++
2+
3+title = "Advanced Portal Features Phase 1"
4+date = "2023-04-13"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["App Dev"]
9+
10+[extra]
11+image = ""
12+description = ""
13+reward = "3 Stars"
14+assignee = ["~toptyr-bilder", "~dilryd-mopreg", "~foddur-hodler"]
15+champion = ["~poldec-tonteg"]
16+grant_id = "P0251"
17+completed = false
18+canceled = false
19+
20++++
21+
22+# Rationale
23+
24+Portal currently allows for simple discovery of groups and apps, but there are still outstanding problems in user onboarding and advanced curation and discovery. In particular, first-time users would benefit from an onboarding flow that provides personalized recommendations and an overview of Portal’s functionality. Further, curators should have the flexibility to make their posts and collections high-quality and personalized, and to create recurring relationships with users via follow and notification features. By solving these problems we further improve Urbit user activation and retention, and we aim to increase Portal’s weekly active user (WAU) count.
25+
26+For context on previous work, see our [previous grant](https://urbit.org/grants/app-store) and its [M4 redefinition](https://docs.google.com/document/d/10tZgF8ZA9KQbRYD7MDZ7v-iuIeO2nPNppj9CMRBVg7g/edit#).
27+
28+# Milestones Overview
29+
30+The grant will consist of many small features per milestone. We expect to be flexible on the actual grouping and focus rather on shipping features that will increase WAU. (Phase 1 will consist of Milestones 1 -3.)
31+
32+## Milestone 1
33+ - Build a real-time global feed
34+ - Build an indexer to accomplish the above
35+ - Build out unified data model and schemas for different types of items
36+## Milestone 2
37+ - %blogs and %groups notebooks integration
38+ - Basic custom feeds
39+ - Replace react with Svelte
40+## Milestone 3
41+ - Support comments on all items
42+ - Re-share posts
43+ - Pre-populate posts to share desks and groups that the user hosts
44+ - Publish content to web2
45+
46+# Future Work
47+## Milestone 4
48+ - Follow other users
49+ - Implement paywalls
50+ - Fully-featured posts
51+ - Markdown support for items
52+ - Groups and apps can only be posted by their host
53+## Milestone 5
54+ - %pals integration
55+ - Tags can be applied to all items (lists, curators, etc)
56+ - Richer post metadata like number of app downloads/app versioning/poster info
57+ - Fully-featured profiles
58+ - Richer profile metadata
59+ - Markdown support for profile descriptions
60+
61+# User Stories
62+## Milestone 1
63+1. I’m a first-time Urbit user and I want good suggestions for content so that I can find my people on Urbit
64+2. I’m a return user and I want personalized curation integrated into my experience so that I can find relevant content without trying
65+## Milestone 2
66+3. I’m a user and I want to be able to make my content discoverable quickly and easily so that I can get distribution
67+4. I’m a user and I want a synopsis of the content being shared in a group so that I can quickly pick out the most interesting parts of the conversation
68+## Milestone 3
69+5. I’m a user and I want to be able to reference and comment on other people’s items so that I can build on others’ content
70+6. I’m a user and I want to be able to make my content discoverable quickly and easily so that I can get distribution
71+7. I’m a user and I want to be able to make my content discoverable on web2 so that I can share my Urbit content more broadly
72+## Milestone 4
73+8. I’m a user and I want to know which developers and content creators are notable and trustworthy so that I can find good content
74+9. I’m a content creator and I want to be able to leverage markdown in my posts so that I can create more attractive + organized content
75+## Milestone 5
76+10. I’m a curator/developer/content creator and I want to have a fully-featured, professional-looking profile page so that I can create a good reputation
77+11. I’m a user and I want to know that the app I’m downloading is trusted and safe so that I don’t get malware
78+
79+# Timeline and Compensation
80+Each milestone is expected to be completed over the course of roughly 1 month. Along with the prescribed features (which may be subject to slight reprioritization), completion of each milestone is dependent upon increasing Portal’s WAUs by 10% over baseline, as measured before any of the current milestone’s features have been introduced. Meeting these criteria will yield compensation of 1 star per milestone.
81+
82+
content/grants/2023/privacy-msg.mdnew file+89
@@ -0,0 +1,89 @@
1++++
2+
3+title = "Privacy Messaging"
4+date = "2023-04-07"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["Other"]
9+
10+[extra]
11+image = ""
12+description = "Communicating Urbit's unique privacy potential"
13+reward = "4 Stars"
14+assignee = ["~dibnyt-wisfyn"]
15+champion = ["~poldec-tonteg"]
16+grant_id = "P0257"
17+completed = false
18+canceled = false
19+
20++++
21+
22+# Overview #
23+
24+The goal of this work is to improve Urbit’s appeal to potential developers by highlighting and communicating its unique privacy potential.
25+
26+## Initial Insights
27+
28+ - Urbit is currently focused on attracting developers who will build the apps that bring users to the platform
29+ - Even some currently active developers don’t fully understand the full offering of Urbit
30+ - Urbit isn’t inherently private - it’s “privacy prone”
31+ - Urbit OS does so much for developers that they can add in features for almost nothing - privacy is one of those features
32+
33+# Work Summary #
34+
35+## Research
36+
37+ - Interviews to examine and understand current state of Urbit’s offering
38+ - Explore where Urbit wants to go in the future
39+ - Interviews to examine what developers are creating and motivations for coming to the platform
40+ - Determine what related offerings are being missed by existing developers
41+
42+## Development
43+
44+ - New messaging strategy and copywriting based on research
45+ - Incorporate growth strategy to target the ideal developers and grow our developer base in sync with Urbit’s theory of change
46+ - Exploration of ideal implementation - comms channels, structure, media formats
47+ - Rounds of feedback internally and externally (developers) to improve messaging
48+
49+## Implementation
50+
51+ - Messaging strategy presented internally to guide thinking for Urbit Foundation, Tlon, and other established developers
52+ - Messaging incorporated to assets presented to new and potential developers - (website and videos)
53+ - Potentially guidance verging on curricula - opportunity to incorporate into Hoon School
54+
55+# Guiding Principles #
56+
57+ - Overall - Develop a shared language around Urbit’s privacy features that both supports Urbit Foundation’s vision for the future and speaks to the practical implications for developers
58+ - Research - Ensure project success by making sure all stakeholder viewpoints are heard and considered from the earliest stages in the process
59+ - Development - Strive to approach communications in a way that feels interactive and engaging
60+ - Implementation - Identify and collaborate with the individuals within Urbit Foundation that need to greenlight any actions early on in the process
61+
62+# Growth Framework #
63+Through attracting new developers, deepening understanding, or a combination of both we can see three general types of growth:
64+
65+ - Attract new developers with a basic understanding of Urbit features
66+ - Expand capabilities of existing developers
67+ - Attract new developers interested in novel implementations of Urbit OS
68+
69+# How This Can Support Future Work #
70+
71+Privacy is one of many features that Urbit offers. This means that this project can model and test an approach to messaging replicable across all aspects of Urbit. The goal is to create something that is not solely top-down (led by Urbit Foundation) or bottom-up (led by 3rd party developers). Rather we want to support both the vision of Urbit and the motivations of developers and meet somewhere in the middle.
72+
73+# Timeline and Compensation #
74+
75+Timeline: Approximately 10 weeks
76+
77+ - Stakeholder Identification ~ .75 wks
78+ - Interview Prep + Scheduling ~ .75 wks
79+ - Internal + External Interviews ~ 2 wks
80+ - Analysis & Reframing ~ 1 wks
81+ - Ideation & Feedback ~ 2.5 wks
82+ - Development & Implementation ~ 3 wks
83+
84+Reward: 4 Stars
85+
86+# Summary #
87+
88+While the underlying technology behind Urbit is incredible, the current messaging strategy is not focused enough on the value that tech brings to our core audience. This hinders conversion of new developers to the platform and limits the capabilities of existing developers.
89+By addressing this issue (starting with the topic of privacy), this work will be invaluable in helping Urbit grow. Additionally, it will model a systematic yet flexible process of working with stakeholders—both internally and externally—that can be used to improve messaging across any number of topics.
content/grants/2023/quorum-2.mdnew file+84
@@ -0,0 +1,84 @@
1++++
2+title = "Quorum 2"
3+date = "2023-03-20"
4+
5+[taxonomies]
6+grant_type = ["Proposal"]
7+grant_category = ["App Dev"]
8+
9+[extra]
10+image = ""
11+description = "Improve the usability and accessibility of Quorum in the Urbit ecosystem"
12+reward = "6 stars"
13+assignee = ["~tamlut-modnys", "~litlep-nibbyt", "~sidnym-ladrut"]
14+grant_id = "P0254"
15+champion = ["~lagrev-nocfep"]
16+completed = false
17+canceled = false
18++++
19+
20+# Purpose #
21+
22+Quorum needs many usability and accessibility improvements to make it an impactful part of the Urbit ecosystem. Its latent utility to capture and retain domain knowledge across the ecosystem has been hindered by its “minimum viable product” feature set and its existence as disjoint to Tlon’s more central Groups product (with which it overlaps on many organizational features).
23+
24+The work proposed for this grant will address these issues by:
25+1) Extending Quorum into a custom Q&A channel type in Tlon’s Groups with the added goal of becoming a blueprint for future third-party Groups integrations.
26+2) Adding essential Q&A board functionalities to Quorum such as post editing, content moderation tools, and enhanced search.
27+3) Implementing quality of life improvements to the Quorum frontend which will make the UI more user friendly.
28+
29+# User Stories #
30+
31+## `%groups` User Stories ##
32+
33+- As a %groups admin with %quorum installed, I can create Q&A channels in my groups, which have a name, host ship, and permissions options identical to the existing channel types (i.e. open to all, members only, or admins only).
34+- As a %groups admin with %quorum installed, I can modify my Q&A channels like other channel types, e.g. by renaming the channel, deleting the channel, and so forth.
35+- As a %groups user with %quorum installed, I can see and join Q&A channels in my groups.
36+- As a %groups user with %quorum installed, I can browse and manipulate the content of Q&A channels in the %groups interface.
37+
38+## `%quorum` User Stories ##
39+
40+- As a %quorum admin, I can remove posts from my Q&A channels.
41+- As a %quorum admin, I can edit the content (i.e. title, text, and tags) of any post made to my Q&A channels.
42+- As a %quorum admin, I can create and edit a set of allowed tags for posts made within my Q&A channels.
43+- As a %quorum admin, I can run a `dojo` command in order to import a legacy %quorum board into the new interface.
44+- As a %quorum user, I can browse through the paginated archive of posts on my Q&A channels.
45+- As a %quorum user, I can perform a string or tag-based query and view the paginated results on my Q&A channels.
46+- As a %quorum user, I can edit the posts I’ve authored.
47+- As a %quorum user, I can delete the posts I’ve authored.
48+- As a %quorum user, I can view the history of a post that has been edited.
49+- As a %quorum user, I can paste a %groups reference into a question or answer submission to copy its content from %groups.
50+
51+# Timeline #
52+
53+## Milestone #1 - Permissions Refactor & QoL Improvements ##
54+
55+- **Reward**: 3 stars
56+- **Tasks**:
57+ - Refactor %quorum to gate board entry based on %groups permissions.
58+ - Add front-end subscription support for reliable post-poke page updates.
59+ - Enable authors and board admins to edit post content.
60+ - Enable authors and board admins to delete posts.
61+ - Update the post voting indicator to display the personal vote cast rather than the aggregate score direction.
62+
63+## Milestone #2 - New Features & Groups Integration ##
64+
65+- **Reward**: 2 stars
66+- **Tasks**:
67+ - Enable users to browse each post’s edit history.
68+ - Allow users to view the different edited versions of a post in the thread view (i.e. as different standalone versions without diffs).
69+ - Display all authors involved in constructing a post (original author & editors).
70+ - Add result pagination for board and question listings, including search results.
71+ - Implement tag-based search via (1) the search bar and (2) clicking on a post tag.
72+ - Allow admins to optionally create a set of eligible tags for their boards.
73+ - Enable %groups “refs” submissions for posts, which will be replaced on publication with the original %groups content.
74+
75+## Milestone #3 - Groups Plugin Support ##
76+
77+- **Reward**: 1 star
78+- **Tasks**:
79+ - Revamp the %quorum user interface to improve the UX for %groups embedding.
80+ - Replace the navigation bar actions with in-form buttons.
81+ - Replace the search bar with a form of floating/toggled search menu.
82+ - Integrate %quorum as a %groups channel type plugin.
83+ - Create scry endpoint(s) for %groups channel type metadata and coordination.
84+ - Add poke endpoint(s) for any necessary %groups join and leave behaviors.
content/grants/2023/replit.mdnew file+52
@@ -0,0 +1,52 @@
1++++
2+
3+title = "Replit & Replit Integration for Site"
4+date = "2023-06-21"
5+
6+[taxonomies]
7+grant_type = ["Bounty"]
8+grant_category = ["Other"]
9+
10+[extra]
11+image = ""
12+description = "Produce a Replit-compatible binary and instance."
13+reward = "4 stars"
14+assignee = [""]
15+champion = ["~mastyr-bottec"]
16+grant_id = "B0282"
17+completed = false
18+canceled = false
19+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0282&prefill_Grant+Name=Replit%20%26%20Replit%20Integration%20for%20Site"
20+
21++++
22+
23+# Replit & Replit Integration for Urbit Developer Site
24+
25+A Replit instance lets you specify the running status of a ship and associated files. In practice, this means a fakezod which is automatically logged in, has `%base` `|mount`ed, and has `|autocommit` set for ease of use. The instance should connect to the file in some cases, the Dojo terminal in others.
26+
27+We anticipate that the biggest part of this bounty will focus not on designing the Replit environment but instead on building a Prybar binary for full REPL compatibility.
28+
29+By forking from your base instance, you should be able to prepare a base instance which meets the above basic setup criteria. Then from that, build forks which automatically inject the correct code when a generator or other specified expression has been supplied to the student.
30+
31+## Milestones
32+
33+### Milestone 1 (3 stars)
34+
35+Build a working Replit-compatible binary and base instance. This Replit instance should be [Prybar](https://github.com/replit/prybar)-compatible so that the Replit console can directly run the Dojo instance. (That is, no `screen` or `tmux` screen management is necessary for the user.)
36+
37+This may require using `%khan` and other affordances to interact with Dojo or a primary agent.
38+
39+The final deliverable should include the Prybar binary, a base Replit instance, and a Docker image suitable for use with Replit.
40+
41+### Milestone 2 (1 star)
42+
43+The Hoon School docs will benefit from direct integration of executable code blocks. To claim this bounty, you will need to prepare and include customized Replit instances at every appropriate explanation, exercise, and challenge in [the Hoon School docs](https://developers.urbit.org/guides/core/hoon-school). (This does not mean everywhere there are code blocks now; you will work with your grant champion to identify all of these.)
44+
45+(This can be split into a separate bounty based on temperament of the grantee completing Milestone 1.)
46+
47+## Resources
48+
49+- https://docs.replit.com/programming-ide/configuring-repl
50+- https://github.com/replit/prybar
51+- https://replit.com/@matthew-levan/Urbit-1#README.md
52+- https://docs.replit.com/hosting/embedding-repls
content/grants/2023/school-support-23q1.md+4−1
@@ -14,7 +14,7 @@ reward = "2 stars"
1414assignee = ["~tamlut-modnys"]
1515champion = ["~lagrev-nocfep"]
1616grant_id = "B0225"
17−completed = false
17+completed = true
1818canceled = false
1919link = ""
2020
@@ -38,3 +38,6 @@ The basic spec for this proposal:
3838- maybe Urbit Forms upgrade/update (postponing)
3939
4040(So about three agents/threads.)
41+
42+# Compensation
43+Reward: 2 Stars
content/grants/2023/splitwise-rfp.mdnew file+26
@@ -0,0 +1,26 @@
1++++
2+
3+title = "Expense Sharing App for Urbit"
4+date = "2023-04-03"
5+
6+[taxonomies]
7+grant_type = ["RFP"]
8+grant_category = ["App Dev"]
9+
10+[extra]
11+image = ""
12+description = "Create a crypto and fiat expense sharing app for Urbit "
13+reward = "1 Star"
14+assignee = ["~talfus-laddus"]
15+champion = [""]
16+grant_id = "P0279"
17+completed = true
18+canceled = false
19+
20++++
21+
22+The Urbit community hosts many IRL events and, inevitably, this means splitting tabs with other Urbiters. Urbit needs its own expense sharing app that seamlessly keeps track of all expenses and IOUs in one place and works with both crypto and fiat.
23+
24+The Urbit version can be loosely modeled on the expense sharing app [Splitwise](https://www.splitwise.com). Splitwise uses centralized cloud infrastructure, but an Urbit version could be architected so that accounts payable and receivable are kept on your ship. The Urbit version should also be mobile-first, so it's easy to use on the go.
25+
26+See the full proposal [here](https://urbit.org/grants/splitwise)
content/grants/2023/splitwise.mdnew file+129
@@ -0,0 +1,129 @@
1++++
2+
3+title = "Expense Sharing App"
4+date = "2023-06-22"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["App Dev"]
9+
10+[extra]
11+image = ""
12+description = ""
13+reward = "1 Star"
14+assignee = ["~talfus-laddus"]
15+champion = [""]
16+grant_id = "P0279"
17+completed = false
18+canceled = false
19+
20++++
21+
22+# Motivation
23+The Urbit community hosts many IRL events and, inevitably, this means splitting tabs with other Urbiters. Urbit needs its own expense sharing app that seamlessly keeps track of all expenses and IOUs in one place and works with both crypto and fiat [RFP](https://urbit.org/grants/splitwise-rfp).
24+
25+Urbit is for small communities. And those need a way to keep track of and to split shared expenses.
26+
27+# Basic User Story
28+A member of a group wants to keep track of all expenses in order to eventually settle debts with a minimal number of transactions.
29+
30+# Basic User Tasks
31+ - Create or select a group
32+ - Invite other people to the group
33+ - Add an expense involving other group members
34+ - View all expenses
35+ - Edit an expense
36+ - Delete an expense
37+ - Retrieve a suggestion on how to balance debts with minimal number of transactions
38+
39+# Basic User Flow
40+1. Select a group
41+2. Add an expense
42+3. Check balance
43+ - Who is owed, and who owes money to the group and how much?
44+4. Settle debts
45+ - The app suggests an efficient way to settle debts in the group
46+ - Mark outstanding expenses as paid
47+
48+# Architecture
49+The architecture will be loosely modeled on existing expense sharing apps such as [Splitwise](https://www.splitwise.com/) and [Tricount](https://www.tricount.com/en/).
50+
51+An expense can involve only a subset of all group members. It has the following attributes:
52+
53+- title (For what reasons?)
54+ - payer (Who paid?)
55+ - involves (For whom?)
56+ - date (When?)
57+ - amount (How much?)
58+ - currency
59+ - note
60+
61+All group members are ships (`@p`). A list of group members and all expenses of the group will be stored on the ship of the group initiator. Other group members will read and write from/to there.
62+
63+In order to find a minimum number of transaction to settle debts in the group ("simplified debts"), shared expenses will be modeled as a flow network. Money flows from the participants who owe money to the group (debitors) to the participants who are owed money by the group (creditors). Using [Edmonds–Karp algorithm](https://en.wikipedia.org/wiki/Edmonds%E2%80%93Karp_algorithm), the [maximum flow](https://en.wikipedia.org/wiki/Maximum_flow_problem) of this network will be computed. From the resulting residual network transactions to balance out shared expenses will be derived. A Python reference implementation can already be found [here](https://git.sr.ht/~talfus-laddus/splt-exps-py).
64+
65+*Note: The trivial case of settling debts among two person (group size of two) is of course supported.*
66+
67+# Backend
68+The backend will be a gall agent with a basic set of operations addressing the user's needs listed above. Alongside the gall agent, a couple of libraries will be created: A library implementing the Edmonds-Karp algorithm and a library handling currency exchange rates and conversions.
69+
70+# Frontend
71+[Keep it simple, stupid!](https://en.wikipedia.org/wiki/KISS_principle)
72+The frontend will be a mobile-first website.
73+
74+It is an open question whether the frontend will in the initial phase be served from Mars or Earth. The website should eventually be served from the ship.
75+
76+# Milestones
77+Documentation and tests throughout the code base will be present. The source code will be available in a public git repository and licensed under MIT.
78+
79+## Milestone 1 - Proof of Concept
80+Completion: Beginning of App School Live (August 2023)
81+
82+Payment: None
83+
84+Deliverables: Edmonds-Karp Library
85+
86+The Proof of Concept (POC) demonstrates how to model shared expenses as a flow network and how to derive from it the minimum number of transactions needed to settle debts. The POC implements the Edmonds-Karp algorithm as well as the logic of how to construct the flow network from a list of expenses and how to derive a list of transactions from the residual network.
87+
88+## Milestone 2 - Minimal Viable Product
89+Completion: End of App School Live before Assembly (October 2023)
90+
91+Payment: 1 Star
92+
93+Deliverables : Gall Agent: Website
94+
95+The Minimal Viable Product (MVP) consists of a gall agent as backend and a website as frontend.
96+
97+Iterations
98+1. Create a gall agent containing a basic set of operations to manage groups and to add, store, delete and retrieve group expenses.
99+2. Create a simple, stupid and mobile-first website as an interface to the gall agent.
100+3. Add a feature to “simplify debts” by integrating the Edmonds-Karp library into the gall agent. The agent can suggest a way to balance out shared expenses with a minimal number of transactions.
101+4. Synchronize expenses among the group members.
102+5. Handle different currencies. Retrieve the current exchange rate and do conversions between currencies.
103+6. Make the app available through Software Distribution.
104+
105+# Limitations
106+Since the list of expenses is stored on the group initiator's ship, when it is down other people can not synchronize their state of the application.
107+
108+# Additional Future Work
109+The future of the app could entail:
110+
111+ - A robust decentralization/synchronization mechanism which addresses the limitation raised above
112+ - A more polished interface
113+ - An integration into Groups
114+ - Apps for Android and iOS
115+ - A new feature to categorize expenses and derive statistics
116+ - Yet unforeseen improvements
117+
118+# About Me
119+I am in search of something worthwhile to contribute my time and effort to.
120+
121+My name is Matthias Schaub (`~talfus-laddus`). Even though I work part-time as a software developer for a non-profit corporation dedicated to better society and environment, I feel the need to spend my time on projects of which I am more confident that they provide sustained value to society (or at least have the potential to). That is why I am invested to contribute to the Urbit ecosystem by learning Hoon and how to build applications on Urbit. A more basic motivation is to have my flat mates on Urbit. Beside a chat, we need a way to handle shared expenses.
122+
123+I attended Hoon School and registered for App School. Alongside the App School curriculum, I want to foster my learning by building this application. On Earth side I have solid Python and basic HTML, CSS, and JavaScript skills. I am proficient in git, and I am used to working with a terminal on a Linux machine. In the past, I wanted to read the reference of a Hoon rune without leaving Vim. So I wrote a Python script to convert Hoon rune references from Markdown to Vimdoc. The result is a Vim helpfile in disguise of a plugin ([hoon-runes.vim](https://git.sr.ht/~talfus-laddus/hoon-runes.vim)). Shortly after, I did the same for the documentation of the Hoon standard library ([hoon-stdlib.vim](https://git.sr.ht/~talfus-laddus/hoon-stdlib.vim)).
124+
125+In order to find out more about my previous works:
126+ - [Personal website](https://talfus-laddus.de/)
127+ - [Sourcehut](https://git.sr.ht/~talfus-laddus)
128+ - [GitHub](https://github.com/matthiasschaub)
129+
content/grants/2023/text-search.mdnew file+24
@@ -0,0 +1,24 @@
1++++
2+
3+title = "Generic Text Search Tool for Urbit"
4+date = "2023-03-02"
5+
6+[taxonomies]
7+grant_type = ["RFP"]
8+grant_category = ["Core Dev"]
9+
10+[extra]
11+image = ""
12+description = "Build Urbit's answer to grep."
13+reward = "TBD"
14+assignee = [""]
15+champion = [""]
16+grant_id = "P1002"
17+completed = false
18+canceled = false
19+
20++++
21+
22+Text search is a key part of many different use cases, but Urbit currently has no equivalent to `grep`, the general purpose GNU search tool.
23+
24+Build Urbit's answer to `grep`.
content/grants/2023/tinygrad.mdnew file+24
@@ -0,0 +1,24 @@
1++++
2+
3+title = "Tinygrad ML Library in Hoon"
4+date = "2023-03-02"
5+
6+[taxonomies]
7+grant_type = ["RFP"]
8+grant_category = ["Core Dev"]
9+
10+[extra]
11+image = ""
12+description = "Implement a small machine learning library (and jets!) in hoon."
13+reward = "TBD"
14+assignee = [""]
15+champion = [""]
16+grant_id = "P1003"
17+completed = false
18+canceled = false
19+
20++++
21+
22+Geohot has published the [Tinygrad library](https://github.com/geohot/tinygrad) for doing basic machine learning. This library is small and simple which makes it a potentially good target for jetting. Doing so would give basic ML functionality in Urbit.
23+
24+Implement Tinygrad (with jets) in Urbit
content/grants/2023/treesitter.mdnew file+71
@@ -0,0 +1,71 @@
1++++
2+
3+title = "Treesitter Hoon Parser"
4+date = "2023-05-11"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["Core Dev"]
9+
10+[extra]
11+image = ""
12+description = "Create a better hoon parser with Treesitter"
13+reward = "2 Stars"
14+assignee = ["~hosweg-silpur"]
15+champion = [""]
16+grant_id = "P0263"
17+completed = false
18+canceled = false
19+
20++++
21+
22+# Summary
23+
24+Tree-sitter is a fast parser that supports smarter syntax highlighting that makes use of the syntax tree.
25+
26+# Background
27+
28+Current syntax-highlighters are based off complicated regex that are overly complicated and inaccurate. Tree-sitter parses the whole document and creates an abstract syntax tree (AST) which can then be used to correctly highlight syntax.
29+
30+The current syntax highlighters available for hoon are:
31+
32+- **Hoon-lsp**: Decent, but due to being a semantic highlighter it naively highlights using regex matches. As an example it does not know the difference between `!=(a)` and `!=(a 1)`. (The first is the `zaptis` rune taking `a` as a sample, the second is `!` applied to an equality check between `a` and `1`)
33+
34+- **Hoon.vim/hoon-mode.el**(emacs package): This is also a regex matcher and suffers from the same problems above.
35+
36+In conclusion, creating a tree-sitter parser will allow for superior Hoon highlighting to be used in more code-editors.
37+
38+
39+# Milestones and Compensation
40+## Milestone 1: Writing the grammar
41+
42+**Estimated Completion**: Completed
43+
44+**Payment**: 1 star
45+
46+ - Write a tree-sitter grammar that parses Hoon
47+ - Create unit tests for each syntax component (runes, irregular syntax, mold, strings...)
48+
49+
50+## Milestone 2: Code editor Integration
51+
52+**Estimated Completion**: May 2023
53+
54+**Payment**: 1 star
55+
56+Integrate the tree-sitter parser with various code-editors.
57+
58+Desktop editors:
59+ - VScode
60+ - Emacs
61+ - Neovim
62+ - Atom
63+Online editors:
64+ - Monaco
65+ - Codemirror
66+
67+# Future Work
68+
69+- GitHub Gist alternative on Urbit
70+- Online IDE with `%pyro` sandbox
71+- Collaborative Hoon code-editing with CRDTs
content/grants/2023/turf.mdnew file+205
@@ -0,0 +1,205 @@
1++++
2+
3+title = "Turf"
4+date = "2023-05-17"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["App Dev"]
9+
10+[extra]
11+image = ""
12+description = "Build a thriving and customizable virtual world on Urbit"
13+reward = "9 Stars"
14+assignee = ["~midlev-mindyr"]
15+champion = ["~reb"]
16+grant_id = "P0265"
17+completed = false
18+canceled = false
19+
20++++
21+
22+## Summary
23+
24+Turf is like if [gather.town](http://gather.town/) were fully customizable, interconnected, and lived on Urbit. However, to start out with, it will have a lot less content and features. Turf will be good for Urbit for the following reasons:
25+
26+- it will be fun / it will give people another reason to use Urbit day-to-day
27+- it will enable spontaneous and casual social interactions
28+- it will be a space that people can mold and construct freely, which means it can naturally develop into a vibrant, complex virtual world
29+- it will cause people to crave app interoperability like never before, which will mean I can later build a plugins system (Monkey) and actually convince people to use it
30+
31+Each turf is made up of pixelated tiles which can be customized with a variety of items, and people can run around in them and chat with voice and text. Everyone can make their own turfs, and (with consent) make portals to other turfs. At the end of the final milestone, we hope to have a thriving, organically self-organizing web of connected turfs, where people know how to get where they’re going and have lots of new things to discover all around them.
32+
33+## Why me
34+
35+I have some amateur gamedev experience, some hoon experience, plenty of frontend experience (see Astrolabe). I have been thinking about something like Turf for a while, but I’m actually proposing it now because it seems like a necessary step to generate interest in a plugin system I want to build (plus it sounds fun!). So, I want to be the one to build Turf so that I can use it to demonstrate and promote Monkey (the plugin system).
36+
37+## User Stories
38+
39+After each user story is the short code for the milestone which will implement it:
40+
41+SP - Single-Player MVP
42+
43+MP - Multiplayer
44+
45+HT - Hometowns
46+
47+AI - Advanced Items
48+
49+SS - Super Speed with WebRTC
50+
51+TP - Advanced Turfs & Permissions
52+
53+?? - Some Future Grant??
54+
55+**My Avatar**
56+
57+- I can customize my avatar’s appearance somewhat (SP)
58+
59+**My Turf**
60+
61+- I can have a turf (SP)
62+- I can have multiple turfs (TP)
63+- I can resize my turf(s) (SP)
64+- I can customize my turf’s appearance by placing items (floor, walls, furniture, decor, objects, portals) (SP)
65+- I can move around in a turf (SP)
66+- I can explicitly specify who can and can’t enter my turf (SP)
67+- I can specify advanced permissions for my turf(s) (TP)
68+- I can grant write access to part of a turf (even if I'm not a star) (TP)
69+- I can transfer ownership of my turf to someone else (TP)
70+
71+**Items**
72+
73+- I can create my own items (wearable, wall, floor, furniture, etc) (AI)
74+- I can add items I find in the wild to my library (AI)
75+- I can make my custom items do cool custom things (??)
76+
77+**Multiplayer**
78+
79+- I can see other people moving around (MP)
80+- I can see other people moving around in realtime (SS)
81+- I can chat with other people over text (MP)
82+- I can chat with other people over voice (SS)
83+- I can create portals to other turfs (MP)
84+- I can walk through portals to travel between turfs (MP)
85+- I can summon people when I’m in a turf I admin (MP)
86+- I can teleport home to my turf from anywhere (MP)
87+- I can place my turf in a hometown (HT)
88+- As a star, I can grant plots of turf to planets for embedding (HT)
89+
90+**Misc**
91+
92+- I can integrate other apps with my turf (using %monkey) (??)
93+
94+# Milestones
95+
96+I’m asking for 9 stars for 6 milestones, which I plan to complete in 46 weeks, working part-time with a couple built-in vacations. These milestones may be accelerated if I’m able to spend fewer days on my day job. The Due Dates assume a contract is signed before May 20th, 2023. Milestones 4-6 may be reordered based on user feedback.
97+
98+## Milestone #1 - Single-Player MVP
99+
100+Reward: 1 star
101+
102+Time: 6 weeks (plus a bit of time I’ve already put in)
103+
104+Due Date: June 25th, 2023
105+
106+- You have a little pixel-art character which you can customize with basic wearable items (facial features, skin color, hats, hair, shirts, pants)
107+- You have a turf associated with your ship, composed of tiles
108+ - Each tile has a square image 32x32px image
109+ - You can place a limited set of basic items (e.g. walls, floor, grass, tables, chairs)
110+ - You can resize your turf
111+- You can move around on the grid
112+
113+## Milestone #2 - Multiplayer
114+
115+Reward: 2 stars
116+
117+Time: 9 weeks (I’d say 6, but I will have less time to work on Turf during this period)
118+
119+Due Date: August 27th, 2023
120+
121+- Through mutual agreement, two players can link their turfs with a 2-way portal. Players can visit each other by traveling through those portals.
122+- When in a turf with other players, you can see them move around (with some ames lag)
123+- You can send ephemeral, turf-scoped text chats which appear in a bubble overhead and in a chatbox sidebar
124+- Very basic permissions: I can choose to blacklist or whitelist @ps to gate visitors to my turf (prevent unwanted neighbors of neighbors)
125+- You can summon people to your turf
126+- You can teleport yourself home from anywhere
127+
128+## Milestone #3 - Hometowns
129+
130+Reward: 1 star
131+
132+Time: 5 weeks
133+
134+Due Date: October 1st, 2023
135+
136+- When I walk off my turf, I appear in my hometown, which is a star’s turf
137+- I can choose what star I want as my hometown and place my house in it, although some may require manual approval
138+- My turf/house has some little house avatar in the hometown which is customizable in some way
139+- Basic permissions for allowing people to claim (or request to claim) write access for a plot of land
140+
141+## Milestone #4 - Advanced Items
142+
143+Reward: 2 stars
144+
145+Time: 9 weeks
146+
147+Due Date: December 3rd, 2023
148+
149+- You can create custom items w/ custom art (tile, furniture, decor, wearable)
150+ - Enable png import
151+ - In-app pixel art canvas
152+- Items can have basic interactions like:
153+ - portal: teleport the activator to a particular turf (with or without coordinates)
154+ - sign: display some text, markdown, or html in a popup
155+- Items can have a foreground and/or a background image
156+- Items can have simple animations
157+- Items can be oversized (e.g. a tree which is taller than 1 tile)
158+ - Items turn partially transparent when a person walks behind them
159+- Sharing items: when you see a cool item in someone else’s turf, you can add it to your personal item library
160+
161+## Milestone #5 - Advanced Turfs & Permissions
162+
163+Reward: 1 star
164+
165+Time: 10 weeks (would be 7 or 8, but for Christmas-time)
166+
167+Due Date: Feb 11th, 2024
168+
169+- You can create multiple turfs (and link them together, of course)
170+- You can transfer your turf to someone else
171+- You can ban all comets and/or moons from your turf
172+- You can grant people/lists of people permission to do the following wrt your turf
173+ - Join, move around, and chat (whole turf)
174+ - Redecorate tiles, add/remove items, create custom items (for sections or whole turf)
175+ - Claim sections of turf (with limits, of course)
176+ - Full admin (for sections or whole turf)
177+- Permission lists
178+ - You can assemble lists of people to more easily whitelist or blacklist the same people over and over. E.g. if you want to make the same 5 people and some of your moons admins in multiple of your turfs
179+ - You can sync a list to a group so that only members of the group have access to the land
180+ - There’s a “pals” list
181+
182+## Milestone #6 - Super Speed with WebRTC
183+
184+Reward: 2 stars
185+
186+Time: 7 weeks (hard to estimate, because I’ve never done anything with WebRTC)
187+
188+Due Date: March 31st, 2024
189+
190+- Use WebRTC for low latency movement and chat
191+- Use WebRTC for proximity voice chat
192+- Enable private voice chat areas
193+
194+## Some other time
195+
196+- Use a plugin system (Monkey) to enable other apps to embed content, e.g. shared whiteboards; %radio streams; interacting with an item automatically requests a gora; link the text chat to a groups channel
197+- Item animations? (or include in Advanced Items milestone)
198+- Item inventories (allow some items to be picked up, carried, and set down elsewhere by visitors with no write access)
199+- Custom items with custom code so you can turn your turf into a full game or an economy or whatever
200+- Decentralized turfs
201+ - When you want to visit a galaxy turf that’s not turf-enabled, you instead ask one of its turf-enabled stars (if any) for its opinion on the layout of that galaxy-turf
202+ - Stars can coordinate to maintain agreement about what the fictional galaxy-turf looks like
203+ - When in a galaxy-turf, you can interact with any other people who have the same idea of what it looks like, even if they got it from a different star
204+ - The same can be done between galaxies for the notional “root turf”
205+ - The same can perhaps be done between any group of ships for some arbitrary unrooted turf
content/grants/2023/uc-concierge.mdnew file+42
@@ -0,0 +1,42 @@
1++++
2+
3+title = "Urbit Community Support Concierge"
4+date = "2023-02-03"
5+
6+[taxonomies]
7+grant_type = ["Bounty"]
8+grant_category = ["Other"]
9+
10+[extra]
11+image = ""
12+description = "The Urbit Community concierge will triage Urbit support issues that come in through the Urbit Community Group."
13+reward = "1 Star"
14+assignee = ["~sarlev-sarsen", "~ripnyt-ripnyt", "~doppeg-tonwel"]
15+champion = ["~poldec-tonteg"]
16+grant_id = "B0232"
17+completed = false
18+canceled = false
19+
20++++
21+
22+## Overview
23+
24+The Urbit Community concierge will triage Urbit support issues that come in through the Urbit Community Group. Some of these issues are routine, whereas occasionally complex issues arise that need to be escalated to the right people. Ideal candidates will also help synthesize support data to inform product feature work and documentation.
25+
26+## Responsibilities
27+
28+- Triage support issues in Urbit Community
29+- Write a weekly digest of issues addressed
30+- Attend a recurring meeting with Foundation staff
31+
32+## Qualifications
33+
34+- Helpfulness
35+- Familiarity with running urbit in a variety of environments (cloud server, laptop)
36+- Ability/interest in synthesizing support data and recommending new features or documentation
37+- Dilligence
38+- **Considering applications from contributors in Asia time zones UTC (GMT) +4 to UTC (GMT) +10 only.**
39+
40+## Compensation and Timeline
41+
42+1 Star for 3 months of work, at which time the agreement may be renewed.
content/grants/2023/update-mass.mdnew file+26
@@ -0,0 +1,26 @@
1++++
2+
3+title = "Modernize |mass"
4+date = "2023-03-02"
5+
6+[taxonomies]
7+grant_type = ["RFP"]
8+grant_category = ["Core Dev"]
9+
10+[extra]
11+image = ""
12+description = "Update the |mass utility to reinject the output into arvo from the runtime."
13+reward = "TBD"
14+assignee = [""]
15+champion = [""]
16+grant_id = "P1001"
17+completed = false
18+canceled = false
19+
20++++
21+
22+`|mass` is a utility for measuring a pier's resource usage. It is used for debugging and development. Currently, the output of this utility is a mixture of data from within arvo and from the runtime. This heterogeneity means that what is produced is not a noun but interleaved print statements to the terminal.
23+
24+Once `|mass` produces a noun, it can be sent to other ships over `%ames` for bug reports, collected in a central location or analyzed for further action by arvo.
25+
26+Update the `|mass` utility to reinject the output into arvo from the runtime.
content/grants/2023/urbit-ninja-strike-team.mdnew file+38
@@ -0,0 +1,38 @@
1++++
2+
3+title = "Urbit Ninja Strike Team"
4+date = "2023-05-16"
5+
6+[taxonomies]
7+grant_type = ["Bounty"]
8+grant_category = ["Other"]
9+
10+[extra]
11+image = ""
12+description = "Win a hackathon using Urbit."
13+reward = "1 star"
14+assignee = [""]
15+champion = ["~lagrev-nocfep"]
16+grant_id = "B0270"
17+completed = false
18+canceled = false
19+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0270&prefill_Grant+Name=Urbit%20Ninja%20Strike%20Team%20Bounty"
20+
21++++
22+
23+## Overview
24+
25+Urbit is a superior development platform. Show this to the world. A team using Urbit’s ability to immediately deploy a server, identity system, and peer-to-peer communications will have an edge in programming competitions.
26+
27+To obtain this bounty, you must:
28+
29+1. Participate in a hackathon and write your submission using Urbit.
30+2. If you receive an award in the hackathon, we will award you a star for highlighting Urbit.
31+
32+Not every hackathon will qualify, so please clear it with us first at `grants@urbit.org` or in office hours. (Most competitions will qualify; we just want to avoid e.g. high school competitions or the like.)
33+
34+This bounty may be claimed multiple times by multiple teams.
35+
36+## Compensation
37+
38+1 Star
content/grants/2023/urbit-react-docs.mdnew file+124
@@ -0,0 +1,124 @@
1++++
2+
3+title = "Modernize Urbit React Developer Documentation"
4+date = "2023-02-23"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["Documentation"]
9+
10+[extra]
11+image = ""
12+description = "Modernize Urbit React Developer Documentation"
13+reward = "1 Star"
14+assignee = ["~sidnym-ladrut"]
15+champion = ["~lagrev-nocfep"]
16+grant_id = "P0242"
17+completed = true
18+canceled = false
19+
20++++
21+
22+## Rationale ##
23+
24+
25+
26+The front-end React examples provided in Urbit's developer documentation (i.e. the ["Chat Lightning Tutorial"][ex-1] and ["App School II: Full-Stack"][ex-2] pages) use legacy, class-based React patterns that have largely been phased out over the past few years in favor of [modern, hook-based React style][re-hook]. These examples should be refactored to use this modern style to improve the developer onboarding experience (as increasing amounts of [React learning materials use hooks][re-tut]) and future-proof the material presented (as the official React documentation eventually migrates to [primarily present the modern style][re-docs]).
27+
28+
29+
30+## Overview ##
31+
32+
33+
34+The content for the Urbit React examples is split across two repositories:
35+
36+
37+
38+1. [urbit/doc-examples][git-ex]: Contains the source code for the React examples.
39+
40+2. [urbit/developers.urbit.org][git-org]: Contains the web-hosted documentation for the React examples, which can be viewed at [developers.urbit.org](developers.urbit.org).
41+
42+
43+
44+Within these repositories, the content associated with the following examples needs to be updated to the modern React style:
45+
46+
47+
48+1. ["Chat Lightning Tutorial"][ex-1]: Will require edits primarily in the source references, particularly those in the ["Additional commentary" section][ex-1-edit].
49+
50+2. ["App School II: Full-Stack"][ex-2]: Will require nearly a full rewrite, though many source references will look similar.
51+
52+
53+
54+## Features in scope ##
55+
56+
57+
58+- Refactor the ["Chat" example][git-chat-src] to replace React classes with React hooks wherever possible.
59+
60+- Refactor the ["Journal" example][git-jour-src] to replace React classes with React hooks wherever possible.
61+
62+- Revise the ["Chat Lightning Tutorial"][git-chat-doc] documentation to update source references and add commentary to any new and nontrivial references.
63+
64+- Rework the ["App School II: Full-Stack"][git-jour-doc] documentation to explain the flow and key operations (i.e. peeks, pokes, and subscriptions) of the refactored React "Journal" code.
65+
66+
67+
68+## Implementation Notes ##
69+
70+
71+
72+The refactored React examples will take architectural inspiration and library
73+
74+cues from popular React applications in the Urbit ecosystem (e.g. [`%landscape`][git-landscape] and [`%sphinx`][git-sphinx]) to further improve their utility for learning developers.
75+
76+
77+
78+## Milestones and Compensation ##
79+
80+
81+
82+The grantee will receive 1 star upon fulfillment of this grant.
83+
84+
85+
86+
87+
88+[git-ex]: https://github.com/urbit/docs-examples
89+
90+[git-org]: https://github.com/urbit/developers.urbit.org
91+
92+[git-chat-src]: https://github.com/urbit/docs-examples/blob/main/chat-app/react-frontend/src/App.jsx
93+
94+[git-chat-doc]: https://github.com/urbit/developers.urbit.org/blob/main/content/guides/quickstart/chat-guide.md
95+
96+[git-jour-src]: https://github.com/urbit/docs-examples/blob/main/journal-app/ui/src/App.js
97+
98+[git-jour-doc]: https://github.com/urbit/developers.urbit.org/blob/main/content/guides/core/app-school-full-stack/7-app-logic.md
99+
100+[git-landscape]: https://github.com/tloncorp/landscape-apps
101+
102+[git-sphinx]: https://github.com/arthyn/sphinx
103+
104+
105+
106+[re-hook]: https://reactjs.org/blog/2019/02/06/react-v16.8.0.html
107+
108+[re-tut]: https://beta.reactjs.org/learn/tutorial-tic-tac-toe
109+
110+[re-docs]: https://beta.reactjs.org/
111+
112+
113+
114+[ex-1]: https://developers.urbit.org/guides/quickstart/chat-guide
115+
116+[ex-1-edit]: https://developers.urbit.org/guides/quickstart/chat-guide#additional-commentary
117+
118+[ex-2]: https://developers.urbit.org/guides/core/app-school-full-stack/7-app-logic
119+
120+[ex-2-get]: https://developers.urbit.org/guides/core/app-school-full-stack/7-app-logic#getting-entries
121+
122+[ex-2-sub]: https://developers.urbit.org/guides/core/app-school-full-stack/7-app-logic#subscription
123+
124+[ex-2-add]: https://developers.urbit.org/guides/core/app-school-full-stack/7-app-logic#add-edit-delete
content/grants/2023/vere-eyre-cache.mdnew file+38
@@ -0,0 +1,38 @@
1++++
2+
3+title = "Vere Support for Eyre Cache"
4+date = "2023-02-23"
5+
6+[taxonomies]
7+grant_type = ["Bounty"]
8+grant_category = ["Core Dev"]
9+
10+[extra]
11+image = ""
12+description = "The second of a two-part bounty to add a cache to eyre."
13+reward = "3 stars"
14+assignee = ["~watter-parter"]
15+champion = ["~rovnys-ricfer"]
16+grant_id = "B0246"
17+completed = true
18+canceled = false
19+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefillGrant+ID=&prefillGrant+Name=Vere%20Support%20for%20Eyre%20Cache"
20+
21++++
22+
23+## Rationale
24+
25+Urbit's performance as a webserver is suboptimal, partially because the runtime does not expose a cache for GET requests. We will add a cache for GET requests that will allow inbound GET requests to avoid the Arvo event loop. This will drastically speed up the most common requests.
26+
27+This is the second of a two-part bounty. The first part, [successfully completed by ~watter-parter](https://github.com/urbit/urbit/pull/5927), added the necessary support for this feature in the Eyre vane. This part will update the Vere runtime to make use of this new affordance in Eyre. Once this bounty is completed, both PRs can be merged into the codebase and be tested for release.
28+
29+## Implementation
30+
31+The implementation of the runtime portion of this work will involve changes to the runtime to mirror the change made to Eyre in the first section. ~rovnys-ricfer will meet periodically with ~watter-parter to discuss the best course of action.
32+
33+The bounty will be successful when a cache has been successfully added and is being hit under normal usage. The test use case will be the serving of a blog or static page.
34+
35+## Compensation
36+
37+3 Stars
38+
content/grants/2023/wiki-stella-fixa-rfp.mdnew file+26
@@ -0,0 +1,26 @@
1++++
2+
3+title = "Implement a wiki on Urbit"
4+date = "2023-05-11"
5+
6+[taxonomies]
7+grant_type = ["RFP"]
8+grant_category = ["App Dev"]
9+
10+[extra]
11+image = ""
12+description = "Design and implement a wiki-like service on Urbit"
13+reward = "TBD"
14+assignee = [""]
15+champion = [""]
16+grant_id = "P1001"
17+completed = false
18+canceled = false
19+
20++++
21+
22+Urbit is a personal server, and it's a natural fit for a personal knowledge management system. It can even serve as a community knowledge management system—apps like Quorum gesture in this direction.
23+
24+A wiki-like system (but likely based on Markdown with internal references instead of Wikitext) would be a straightforward extension from existing capabilities in serving and storing pages.
25+
26+You could even imagine doing this in sync with an external interface like [Obsidian](https://obsidian.md/).
content/groups/~dibref-labter/arbit.mdnew file+9
@@ -0,0 +1,9 @@
1++++
2+title = "arbit"
3+shortcode = "~dibref-labter/arbit"
4+type = "Public"
5+tile = "https://upload.wikimedia.org/wikipedia/commons/9/92/Johann_Melchior_Dinglinger_-_Sun_mask_with_facial_features_of_August_II_%28the_Strong%29_as_Apollo%2C_the_Sun_God_-_Google_Art_Project.jpg"
6+participant_range = "32"
7++++
8+
9+urbit argentina
content/highlights/highlight-1.mdnew file+6
@@ -0,0 +1,6 @@
1++++
2+title = "Using Urbit in 2023"
3+url ="https://urbit.org/blog/using-urbit-in-2023"
4+image = "https://storage.googleapis.com/media.urbit.org/blog/usingurbit-2023.jpg"
5+description = "There are more ways to run Urbit than ever, and more options coming soon."
6++++
content/highlights/highlight-2.mdnew file+6
@@ -0,0 +1,6 @@
1++++
2+title = "The Roadmap"
3+image = "https://storage.googleapis.com/media.urbit.org/site/featured/roadmap-icon.jpg"
4+url="https://roadmap.urbit.org/"
5+description = "Explore the technical plan for making Urbit ready for mass adoption."
6++++
content/highlights/highlight-3.mdnew file+6
@@ -0,0 +1,6 @@
1++++
2+title = "Hoon School Live Summer '23"
3+image = "https://storage.googleapis.com/media.urbit.org/site/featured/hsl-june-2023.png"
4+url="https://developers.urbit.org/courses/hsl"
5+description = "Sign up now to learn the foundations of Urbit development."
6++++
content/ids/bintud-bitnev.mdnew file+8
@@ -0,0 +1,8 @@
1++++
2+ship = "~bintud-bitnev"
3+nickname = ""
4+bgColor = "#008080"
5+image = ""
6++++
7+
8+feelsgood.jpg
content/ids/botbyn-dolrum.mdnew file+7
@@ -0,0 +1,7 @@
1++++
2+ship = "~botbyn-dolrum"
3+nickname = ""
4+bgColor = "#000000"
5+image = ""
6++++
7+
content/ids/datsyr-radser.mdnew file+12
@@ -0,0 +1,12 @@
1++++
2+ship = "~datsyr-radser"
3+nickname = "Urbit Guide"
4+bgColor = "#000000"
5+image = "https://urbitguide.com/wp-content/uploads/2023/03/Urbit-Guide-website.jpg"
6++++
7+
8+Urbit Guide offers clear explanations of what Urbit is and how it works, without any technical jargon that might confuse or overwhelm newcomers. Whether you're interested in exploring the decentralized web or just want to learn more about this innovative platform, Urbit Guide has everything you need to get started. Check out today and start your Urbit journey with confidence.
9+
10+Website: https://urbitguide.com/
11+
12+Twitter: https://twitter.com/urbitguide
content/ids/dopbet-larped.mdnew file+7
@@ -0,0 +1,7 @@
1++++
2+ship = "~dopbet-larped"
3+nickname = ""
4+bgColor = "#000000"
5+image = ""
6++++
7+
content/ids/finmep-lanteb.md+8−5
@@ -9,18 +9,21 @@ image = ""
99
1010General Manager of the Urbit hockey team
1111
12−Urbit Chess Ecosystem:
12+Tlön employee
13+
14+Urbit Chess Ecosystem:
1315https://github.com/thecommons-urbit/chess
1416
15−Hoon Language Plugin for IntelliJ IDEA:
17+Hoon Language Plugin for IntelliJ IDEA:
1618https://plugins.jetbrains.com/plugin/19294-hoon-language
19+https://github.com/ashelkovnykov/idea-hoon-plugin
1720
18−Urbit FAQ:
21+Urbit FAQ:
1922https://github.com/ashelkovnykov/urbit-faq
2023
21−Urbit Hosting:
24+Urbit Hosting:
2225https://github.com/ashelkovnykov/urbit-hosting
2326
24−Urbit Wordlists (used by Gonetia):
27+Urbit Wordlists (used by Gonetia):
2528https://github.com/ashelkovnykov/urbit-wordlists
2629https://github.com/tomholford/gonetia
content/ids/hocmed-lidrev.mdnew file+8
@@ -0,0 +1,8 @@
1++++
2+ship = "~hocmed-lidrev"
3+nickname = ""
4+bgColor = "#4E9EFD"
5+image = ""
6++++
7+
8+Software Developer
content/ids/monnys-riphet.mdnew file+7
@@ -0,0 +1,7 @@
1++++
2+ship = "~monnys-riphet"
3+nickname = "yy"
4+bgColor = "#000000"
5+image = ""
6++++
7+
content/ids/tobrun-tomnet.mdnew file+8
@@ -0,0 +1,8 @@
1++++
2+ship = "~tobrun-tomnet"
3+nickname = "somkirann"
4+bgColor = "#000000"
5+image = ""
6++++
7+
8+1st page being set-up
content/organizations/assemblycapital.md+1
@@ -3,6 +3,7 @@ title = "Assembly Capital"
33description = "engineer-led early stage vc investing in things that matter, mostly urbit"
44image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/assemblycapital.jpg"
55URL = "https://assembly.capital"
6+twitter = "assemblycap"
67ships = ["~nodmyn-dosrux"]
78+++
89
content/organizations/dalten.md+1
@@ -3,6 +3,7 @@ title = "Dalten Collective"
33description = "Dalten is a distributed fellowship of like minded individuals."
44image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/dalten.jpg"
55URL = "https://dalten.org"
6+twitter = "_dalten"
67ships = ["~dalten", "~mirler-dozzod-talwet"]
78+++
89
content/organizations/holium.md+3−2
@@ -1,9 +1,10 @@
11+++
22title = "Holium"
33description = "Holium's mission is to enable the networked state."
4−image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/holium.png"
4+image = "https://media.urbit.org/site/ecosystem/organizations/holium-logo.jpg"
55URL = "https://holium.com"
6−ships = ["~livdel-binmun-lomder-librun", "~lomder-librun"]
6+twitter = "HoliumCorp"
7+ships = ["~livdel-binmun-lomder-librun", "~lomder-librun", "~hostyv"]
78+++
89
910Holium's mission is to enable the networked state, starting by enabling DAOs, building digitally sovereign colonies, and then making them physically sovereign. Are you ready to build your world?
content/organizations/labyrinthdao.mdnew file+10
@@ -0,0 +1,10 @@
1++++
2+title = "Labyrinth DAO"
3+description = "Labyrinth DAO is a new decentralized autonomous organization investing in Urbit projects."
4+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/labyrinth.jpeg"
5+URL = "https://labyrinthdao.io/"
6+ships = []
7+twitter = "labyrinth_dao"
8++++
9+
10+Labyrinth DAO is a new decentralized autonomous organization investing in Urbit projects. Supported by [Tribute Labs](https://tributelabs.xyz/), Labyrinth DAO will foster the growth and development of Urbit as it paves the way for the new internet. Find Labyrinth DAO on Twitter or connect at labyrinthdao.io to get involved.
content/organizations/mars-review-of-books.md+1
@@ -3,6 +3,7 @@ title = "The Mars Review of Books"
33description = "The Mars Review of Books is a magazine in print and on Urbit which combines ruthlessly intelligent and fearless sense-making on subjects of global importance with today’s most stylish belletristic writing on contemporary arts and culture."
44image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/marsreview.jpg"
55URL = "https://store.marsreview.org"
6+twitter = "marsreviewer"
67ships = []
78+++
89
content/organizations/nativeplanet.md+4−3
@@ -1,9 +1,10 @@
11+++
22title = "Native Planet"
3−description = "Holium's mission is to enable the networked state."
4−image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/nativeplanet.png"
3+description = "Native Planet builds Urbit-centric hardware and software that simplifies sovereign self hosting and ship management."
4+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/nativeplanet2.png"
55URL = "https://www.nativeplanet.io/"
6+twitter = "NativePlanetIO"
67ships = []
78+++
89
9−Native Planet builds Urbit centric hardware and software that simplifies sovereign self hosting and ship management. Native Planet's open source software enables users to turn nearly any computer into an Urbit dedicated server in minutes
10+Native Planet builds Urbit centric hardware and software that simplifies sovereign self hosting and ship management. Native Planet's open source software enables users to turn nearly any computer into an Urbit dedicated server in minutes.
content/organizations/quartus.md+1
@@ -4,6 +4,7 @@ description = "We build software using the novel affordances of Urbit."
44image = "https://freedom-club.sfo2.digitaloceanspaces.com/ab_Quartus-03.jpg"
55URL = "https://www.quartus.co/"
66ships = ["~mister-hilper-dozzod-dalten", "~dister-dozzod-dalten"]
7+twitter = "QuartusCo"
78+++
89
910### Quartus is Fulfilling Urbit's Covenant with Users
content/organizations/sortug.md+1
@@ -4,6 +4,7 @@ description = "Sortug is an Urbit development DAO based on Earth Time UTC+08:00.
44image = "https://s3.urbit.cloud/sortug/logo.png"
55URL = "https://sortug.com"
66ships = ["~sortug", "~polwex", "~sonwet", "~dovwex", "~sovwex", "~ticrel", "~nodwet"]
7+twitter = "SortugDev"
78+++
89
910Sortug is a DAO focused on software development and promotion of Urbit to a global audience. We are focused on creating and distributing Urbit applications and on integrating Urbit in Earth business and communities through innovative gatekeeping ideas.
content/organizations/third-earth.md+1
@@ -4,6 +4,7 @@ description = "Third.Earth is an Urbit hosting and development company focused o
44image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/thirdearth.png"
55URL = "https://third.earth"
66ships = ["~botwet"]
7+twitter = "ThirdEarth3"
78+++
89
910Third.Earth is an Urbit hosting and development company focused on bridging Web2 capabilities to the Urbit ecosystem. We currently assist Urbit startups with their hosting needs with our fully automated platform integrated seamlessly with their current UI/UX and workflow. By utilizing the latest in cloud technology, we help bring Urbit to the masses.
content/organizations/tirrel.md+1
@@ -4,6 +4,7 @@ description = "Tirrel Corporation is an Urbit product studio."
44image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/Tirrel%20Corp%20Logo.png"
55URL = "https://tirrel.io"
66ships = ["~tirrel"]
7+twitter = "tirrelcorp"
78+++
89
910### Tirrel Corporation is an Urbit product studio.
content/organizations/tlon.md+2−1
@@ -3,7 +3,8 @@ title = "Tlon"
33description = "The first developer of Urbit. Their work continues to maintain core infrastructure development in addition to designing products for communities on the network."
44image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/tlon.png"
55URL = "https://tlon.io"
6−ships = ["~mister-dister-dozzod-dozzod", "~lander-dister-dozzod-dozzod"]
6+ships = ["~mister-dister-dozzod-dozzod", "~lander-dister-dozzod-dozzod", "~sogryp-dister-dozzod-dozzod"]
7+twitter = "tloncorporation"
78+++
89
910[Tlon Corporation](https://tlon.io) is the first developer of Urbit, and their work continues to maintain core infrastructure development in addition to designing products for communities on the network. Tlon’s primary products are Hosting, cloud storage for your urbit, Landscape, an operating system and interface, and Groups, a communication suite.
content/organizations/uqbar.md+1
@@ -4,6 +4,7 @@ description = "Uqbar is a one-stop coding environment that makes writing and dep
44image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/uqbar.png"
55URL = "https://uqbar.network"
66ships = ["~fabnev-hinmur", "~dister-dozzod-bacdun", "~hocwyn-tipwex"]
7+twitter = "uqbarnetwork"
78+++
89
910Uqbar is a one-stop coding environment that makes writing and deploying smart contracts simple, efficient, and secure.
content/organizations/urbit-foundation.md+1
@@ -4,6 +4,7 @@ description = "Urbit Foundation is a non-profit organization whose mission is to
44image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/urbit-foundation.png"
55URL = "https://urbit.org"
66ships = ["~lapdeg"]
7+twitter = "urbitfoundation"
78+++
89
910Urbit Foundation is a non-profit organization whose mission is to ensure Urbit's success as a technology.
content/organizations/zorp.mdnew file+10
@@ -0,0 +1,10 @@
1++++
2+title = "Zorp"
3+description = "We assure critical computation using zero-knowledge proofs"
4+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/zorp.jpeg"
5+URL = "https://zorp.io/"
6+twitter = "ZorpZK"
7+ships = []
8++++
9+
10+Zorp has built a secure-by-design zero-knowledge virtual machine (zkVM) with a uniquely minimal software supply chain which utilizes Nock as its instruction set. Nock, Urbit’s low-level language, is a famously simple instruction set. That property aligns itself well with what you might create if you were designing a language from first principles to do zero-knowledge proofs. Zorp’s zkVM could unlock new possibilities for crypto and more. Check back at Zorp’s website and Twitter for more info.
content/overview/people-history.md+36−31
@@ -8,61 +8,66 @@ image = "https://media.urbit.org/site/understanding-urbit/project-history/projec
88
99So who builds this thing? Where does it come from? What’s the history?
1010
11−Today, Urbit is built and maintained by three organizations, a community of contributors and core developers, infrastructure (star) operators, and governance (galaxy) node owners.
11+Urbit is an open-source project that anyone can work on. The Urbit Foundation, a non-profit organization, is charged with shepherding the network toward a successful future. [Tlon](https://tlon.io/) was the first private company founded for the purposes of working on Urbit, back in 2013. Now there are several more.
12+
13+These include [Uqbar](https://uqbar.network/), [Holium](https://www.holium.com/), [Tirrel](https://tirrel.io/), [Native Planet](https://nativeplanet.io/), and others. Beyond that, an ecosystem has sprung up around Urbit that includes [funds](https://assembly.capital/), [DAOs](https://labyrinthdao.io/), and [publications](https://marsreview.org/). And of course there are many community contributors, many of whom have received [grants](https://urbit.org/grants) from the Urbit Foundation.
1214
1315Let’s talk first about these individual groups within the Urbit community, then about the history of the project and how it came to be.
1416
1517Organizations {% .font-bold .subpixel-antialiased .pt-8 %}
1618
17−There are currently three principal organizations involved in Urbit’s development and maintenance: Tlon, Urbit.live and the Urbit Foundation.
19+The Urbit Foundation was formally established in 2021 when it split off from Tlon. The Foundation runs the grants program, maintains [urbit.org](https://urbit.org/), the [network explorer](https://network.urbit.org/), [education](https://developers.urbit.org/courses/hsl), and it organizes Urbit events like [Assembly](https://assembly.urbit.org/). Recently, the Urbit Foundation has also taken the lead on Urbit's [core development](https://roadmap.urbit.org/).
1820
19−Tlon has been around since 2013 or so, and is primarily focussed on the development of Urbit OS and its user experience. Urbit.live was started in 2018 to make the on ramp into Urbit as easy as possible. Both companies contribute regularly to the code base.
21+[Tlon Corporation](https://tlon.io/) was founded in 2013 to bootstrap Urbit. Currently it is building a hosting service and a suite of Urbit applications, including [Groups](/applications/~sogryp-dister-dozzod-dozzod/groups), [Talk](/applications/~sogryp-dister-dozzod-dozzod/talk), and Small Talk.
2022
21−Tlon was originally granted about half of the Urbit ID address space, and has used that to fund its operations so far. Over time, Tlon plans to offer hosting and services to make using Urbit as easy as possible.
23+[Tirrel Corporation](https://tirrel.io/) was founded in 2021, it creates tools for creators to build their communities, share content, and make money. most notably the subscription application [Studio](https://urbit.studio/). They also produce the Urbit desktop environment Scene.
2224
23−Urbit.live started selling Urbit IDs very early once that became possible, and also plans to offer services within the Urbit ecosystem.
25+[Uqbar](http://uqbar.network), founded in 2022, is working on an L2 blockchain on Urbit. Uqbar uses Urbit’s native language, Hoon, for its smart contracts, enabling developers to write smart contracts and decentralized off-chain applications that utilize them all in one language and stack. They have also produced the Urbit apps Pongo, Pokur, and [Blog](/applications/~hanrut-sillet-dachus-tiprel/blog). 
2426
25−The Urbit Foundation was formally established in 2021. The Foundation runs the grants program, maintains urbit.org, the network explorer, and organizes Urbit events like Assembly.
27+[Holium](http://holium.com), founded in 2022, builds Realm. An Urbit-backed desktop (and soon mobile) environment focused on collaborative computing. Realm allows you to create Spaces in which a group of people interact with the same applications, e.g. shared dictionary, meme library, group chat, voice chats, shared cursors, code editors, web browser.
2628
27−The community of contributors and core developers has been steadily contributing to the code base since before Tlon existed, and they’re still going strong. They can primarily be found on Urbit itself, in the Urbit Community ([~bitbet-bolbel/urbit-community](/groups/~bitbet-bolbel/urbit-community)), the urbit-dev mailing list and on GitHub.
29+[Quartus](http://quartus.co/), founded in 2022, provides custom tooling stacks for Urbit companies. They produce applications such as [Keep](/applications/~dister-dozzod-dalten/keep), a recovery tool for Urbit computers and Urdl, an Urbit version of the popular Wordl game. 
2830
29−Timeline {% .font-bold .subpixel-antialiased .pt-8 %}
31+[Zorp](http://zorp.io), founded in 2022, works on Zero Knowledge proofs of Nock.
3032
31−At the beginning, Urbit was just a few people with the right combination of imagination and discipline to try to rebuild computing.
33+The community of contributors and core developers has been steadily contributing to the code base since before the Urbit Foundation existed, and they're still going strong. They can primarily be found on Urbit itself, in the Urbit Community group [~bitbet-bolbel/urbit-community](/groups/~bitbet-bolbel/urbit-community), the [urbit-dev](https://groups.google.com/a/urbit.org/g/dev?pli=1) mailing list and on [GitHub](https://github.com/urbit). See also The Urbit Foundation's public group at [~halbex-palheb/uf-public](/groups/~halbex-palheb/uf-public).
3234
33−**2002**
34−Urbit starts as an open-ended personal project. An “independent study PhD” to reinvent computing for a network-centric world.
35+Timeline {% .font-bold .subpixel-antialiased .pt-8 %}
3536
36−**2008**
37−Nock, the foundation of Urbit, works. Coming in at 32 lines of code, that’s 1 line of code every two months.
37+In the beginning, Urbit was just a few people with the right combination of imagination and discipline to try to rebuild computing.
3838
39−**2012**
40−Hoon, Urbit’s programming language, compiles itself to Nock. Writing Hoon is much easier than writing Nock.
39+**2022**
40+The Urbit Foundation's split from Tlon becomes complete, and the Foundation organizes [Urbit NYC](https://urbit.org/groups/~ladtem-filmyr/urbit-ny-week) and [Assembly 2022](https://assembly.urbit.org/) in Miami while launching a highly successful education project, new developer documentation and many other things. Read the Foundation's full annual report [here](https://storage.googleapis.com/media.urbit.org/site/overview/~2023%20Retrospective%20%26%20Plan%20PUBLIC.pdf). New Urbit companies Uqbar, Holium, Quartus, and Zorp are formed.
4141
42−**2013**
43−Arvo, Urbit’s OS kernel, boots and the first live Urbit network is started with a command-line chat.
42+**2021**
43+Tlon hosts the first Urbit Assembly and the Urbit Foundation is formally organized.
4444
45−**2014**
46−Tlon is founded to help support Urbit development (and is < 8 people for the next four years).
45+**2019**
46+Tlon spends the year stabilizing Arvo and building Landscape.
4747
48−**2015**
49−Urbit has its first web interface and serves its own website.
48+**2018**
49+Tlon sells about 8% of its stake in the network to accelerate Urbit development.
50+
51+**2017**
52+Urbit’s test network runs for ten months without a reboot. Tlon's private sale of address space, shared only with its mailing list, sells out in six hours — limit two per person.
5053
5154**2016**
5255The first sale of Urbit address space sells out in four hours.
5356
54−**2017**
55−Our test network runs for ten months without a reboot.
57+**2015**
58+Urbit has its first web interface and serves its own website.
5659
57−Our private sale, shared only with our mailing list, sells out in six hours — limit two per person.
60+**2014**
61+Tlon is founded to help support Urbit development (and is < 8 people for the next four years).
5862
59−**2018**
60−Tlon sells about 8% of its stake in the network to accelerate Urbit development. urbit.live gets going and starts selling Urbit IDs to the public.
63+**2013**
64+Arvo, Urbit’s OS kernel, boots and the first live Urbit network is started with a command-line chat.
6165
62−**2019**
63−Tlon spends the year stabilizing Arvo and building Landscape.
66+**2012**
67+Hoon, Urbit’s programming language, compiles itself to Nock. Writing Hoon is much easier than writing Nock.
6468
65−**2021**
66−Tlon hosts the first Urbit Assembly and the Urbit Foundation is formally organized.
69+**2008**
70+Nock, the foundation of Urbit, works. Coming in at 32 lines of code, that’s 1 line of code every two months.
6771
68−Building Urbit is about building a future where technology doesn’t control us. Instead, we look forward to a future where technology is simpler, more reliable and less invasive.
72+**2002**
73+Urbit starts as an open-ended personal project. An “independent study PhD” to reinvent computing for a network-centric world.
content/podcasts/2022-10-06_urbit-maxi-episode.md → content/podcasts/2022-10-06_urbit-maxi-episode copy.mdrenamed

The content is the same.

content/podcasts/2022-12-22_epicenter-ted-blackman-gary-lieberman.mdnew file+11
@@ -0,0 +1,11 @@
1++++
2+title = "Gary Lieberman & Ted Blackman: Urbit – Decentralized Computing Platforms"
3+podcast = "Epicenter"
4+date = "2022-12-22"
5+URL = "https://www.youtube.com/watch?v=Jd1qxbNHAmE&t=1s"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/epicenter.jpg"
7++++
8+
9+When discussing the widespread adoption of true, peer-to-peer decentralization, one could easily identify various social and political obstacles. However, there is also an often overlooked technological impairment as the underlying architecture of computer networks was not designed to achieve global-scale decentralization. Ideally a complete restructuring would be necessary, from applications and programming language, to as profound as rewriting operating system kernels. This is what Urbit is trying to achieve; a decentralized network where users have full control over their computer, running a unified operating system, where applications function seamlessly, without centralized chokepoints.
10+
11+We were joined by Ted Blackman, CTO of Urbit Foundation, and Gary Lieberman, the Chorus One Team Lead for Urbit, to discuss how Urbit reshapes the way we interact with computers, its current development stage, and what challenges it has to overcome.
content/podcasts/2023-01-05_lets-get-personal.mdnew file+9
@@ -0,0 +1,9 @@
1++++
2+title = "E21 - Let's Get Personal...AI feat. (Owen Barnes)"
3+podcast = "The Network Age"
4+date = "2023-01-05"
5+URL = "https://rss.com/podcasts/thenetworkage/767653/"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/networkage.jpg"
7++++
8+
9+On this extra special episode, the boys are joined by blockchain entrepreneur and decentralization advocate Owen Barnes (~locruc-fonmec) to discuss the rise of personal artificial intelligence tools, the importance of user interface, and how to design a new internet from the ground up. Then, they explore how new AI platforms (such as Chat GPT and Codex) can empower programmers, whether AI will protect (or exploit) personal data, and the role of crypto in curation of AI content. All this plus digital reincarnation of departed loved ones, algorithmic broadway musicals, and sign placement on the London Underground.
content/podcasts/2023-01-19_crypto-metaphysics.mdnew file+9
@@ -0,0 +1,9 @@
1++++
2+title = "E22 - Crypto Metaphysics feat. Grant Hummer and Matt Liston"
3+podcast = "The Network Age"
4+date = "2023-01-19"
5+URL = "https://rss.com/podcasts/thenetworkage/786206/"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/networkage.jpg"
7++++
8+
9+In this extra special episode, the boys are joined by Grant Hummer and Matt Liston, two of Ethereum's most original gangsters, to discuss the blockchain's complicated past, its mistakes and pitfalls, and what the future might hold for our favorite L1. Matt, a cofounder of Augur and Gnosis, previously worked for the Ethereum foundation, while Grant founded San Francisco's oldest Ethereum developer meetup. Assisted by your handsome co-hosts, our guests also explore the future of blockchain on Urbit, the pitfalls of inadequate leadership, startup pessimism, how to found a crypto religion, and the metaphysical ecstasy of blockchain contemplation. This is an episode you won't want to miss.
content/podcasts/2023-01-24_reject-triviality.mdnew file+13
@@ -0,0 +1,13 @@
1++++
2+title = "What does it mean to reject and transcend triviality?"
3+podcast = "Crazy Wisdom"
4+date = "2023-01-24"
5+URL = "https://podcasts.apple.com/us/podcast/what-does-it-mean-to-reject-and-transcend-triviality/id1354589767?i=1000597317474"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/crazywisdom.jpg"
7++++
8+
9+An interview with Trent Gillham, Founder of Holium.
10+
11+Urbit: [~lomder-librun](/ids/~lomder-librun)
12+
13+Twitter: [@AidenSolaran](https://twitter.com/AidenSolaran)
content/podcasts/2023-01-26_building-future-states-with-nation3.mdnew file+9
@@ -0,0 +1,9 @@
1++++
2+title = "E23 - Building Future States with Nation3 (feat. Luis Cuende and Anastasiya Belyaeva)"
3+podcast = "The Network Age"
4+date = "2023-01-26"
5+URL = "https://rss.com/podcasts/thenetworkage/795280/"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/networkage.jpg"
7++++
8+
9+On this extra special episode, the boys are joined by Luis Cuende and Anastasiya Belyaeva of Nation3, the world's first internet-native jurisdiction and "cloud nation." Luis (cofounder of Aragon) and Anastasiya discuss their network state optimism, how DAOs and smart contracts will shape a digital court system, and the benefits of becoming a Nation3 citizen. Then, they dive into capital formation in special economic zones, how digital states can support values-driven community, and the relative value of patriotism.
content/podcasts/2023-01-29_urbit-for-idiots.mdnew file+11
@@ -0,0 +1,11 @@
1++++
2+title = "Urbit for Idiots | Galen Wolfe-Pauly, Tlon Corporation"
3+podcast = "Boys Club"
4+date = "2023-01-29"
5+URL = "https://podcasts.apple.com/us/podcast/urbit-for-idiots-galen-wolfe-pauly-tlon-corporation/id1616327892?i=1000597057523"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/boysclub.jpg"
7++++
8+
9+Galen Wolfe-Pauly joins the pod to talk about Urbit, a decentralized personal server platform. They talk about what Urbit is, and why owning your own 'space' on the internet is valuable. Galen answers a bunch of questions like, is Urbit a computer? Can you send an email on Urbit? How will Urbit ever get users? This podcast is perfect for Urbit beginners.
10+
11+Draft tweets close out the episode. Feelings check-in to return on the next pod.
content/podcasts/2023-02-09_crypto-narratives-new-and-old.mdnew file+9
@@ -0,0 +1,9 @@
1++++
2+title = "E24 - Crypto Narratives, New and Old (feat. CoinDesk Reporters Marc Hochstein and Tracy Wang)"
3+podcast = "The Network Age"
4+date = "2023-02-09"
5+URL = "https://rss.com/podcasts/thenetworkage/818546/"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/networkage.jpg"
7++++
8+
9+On this extra special episode, the boys are joined by esteemed CoinDesk reporters Marc Hochstein (~fodrex-malmev) and Tracy Wang to discuss the major crypto narratives of 2022. In particular, they dive into FTX (covered in-depth by Tracy for CoinDesk) and its implications for the coming year, as well as the general craziness of crypto reporting and the importance of being "long volatility." Then, the crew looks to 2023 to consider federal crypto regulation, the rise of zero-knowledge rollups, and protocol-level advances for Ethereum. All this plus polycules, Urbit, and buying Bitcoin in person from a man in the park.
content/podcasts/2023-02-13_distributed-networked-computing.mdnew file+17
@@ -0,0 +1,17 @@
1++++
2+title = "What are the use cases for distributed networked computing instead of centralized systems?"
3+podcast = "Crazy Wisdom"
4+date = "2023-02-13"
5+URL = "https://crazywisdom.libsyn.com/what-are-the-use-cases-for-distributed-networked-computing-instead-of-centralized-systems-eric-helal"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/crazywisdom.jpg"
7++++
8+
9+Eric Helal Founder of Quartus a Dev shop for Urbit Apps
10+
11+~rabsef-bicrym on Urbit
12+
13+https://twitter.com/SafePen
14+
15+~dalten/new-aera
16+
17+https://twitter.com/_dalten
content/podcasts/2023-02-23_the-urbit-episode.mdnew file+9
@@ -0,0 +1,9 @@
1++++
2+title = "E25 - The Urbit Episode (feat. Sam Frank)"
3+podcast = "The Network Age"
4+date = "2023-02-23"
5+URL = "https://rss.com/podcasts/thenetworkage/837778/"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/networkage.jpg"
7++++
8+
9+On this extra special episode, the boys (sans ~timluc) are joined by Sam Frank (~todset-partug) of the Urbit Foundation to discuss his defection from the New York literary scene to the frontiers of distributed technology. As an early investor to both Ethereum and Urbit, Sam has witnessed how digital-first communities can organize around shared values and the pursuit of knowledge. Together, Sam and our hosts dive into the future of Urbit, the wild world of Miladies, and Sam's own journey as a writer and esoteric explorer. All this plus Urbit marriages, psychic abilities, and the importance of throwing a really good party.
content/podcasts/2023-03-09_reclaiming-web-1.mdnew file+9
@@ -0,0 +1,9 @@
1++++
2+title = "E26 - Reclaiming Web 1 (feat. ~dachus-tiprel)"
3+podcast = "The Network Age"
4+date = "2023-03-09"
5+URL = "https://rss.com/podcasts/thenetworkage/858056/"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/networkage.jpg"
7++++
8+
9+On this extra special episode, the boys are joined by Uqbar developer, Urbit explorer, and Network Age frontiersman ~dachus-tiprel to discuss the joys of peer-to-peer programming with a Web 1 aesthetic. We also touch on a few of ~dachus' recent projects, including %blog, a p2p publishing platform you can host from your own server, and %pyro, a testing script that has transformed into one of Urbit's most promising methods for low-cost hosting. All this plus "exiting", the instantiation of an IRL Party DAO, and whether programmers are more like artists or plumbers. Don't miss it.
content/podcasts/2023-03-23_how-to-invest-in-web3-like-a-cool-kid.mdnew file+9
@@ -0,0 +1,9 @@
1++++
2+title = "E27 - How to Invest in Web3 Like a Cool Kid (feat. Shad)"
3+podcast = "The Network Age"
4+date = "2023-03-23"
5+URL = "https://rss.com/podcasts/thenetworkage/878369/"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/networkage.jpg"
7++++
8+
9+On this extra special episode, the boys are joined by Shad (~narpel-machul), the GP of Giga Corp, a crypto marketing and investment firm, to discuss liquid lobbying (using capital allocation to direct the positive development of public goods in Web3), blockchain conferences, and how to tell a real DAO from a fake one. The squad also dives deep on Urbit culture, the untapped potential of being cool in crypto, and the accelerating fusion of lifestyle with technology. All this plus diarrhea, fighting on a volcano, crypto breakfasts in Kyiv, and frontier favelas. Don't miss it.
content/podcasts/2023-03-28_pupusas-volcanoes-and-databases.mdnew file+9
@@ -0,0 +1,9 @@
1++++
2+title = "Pupusas, Volcanoes and Databases with ~hodzod-walrus"
3+podcast = "ZeroK - UF"
4+date = "2023-03-28"
5+URL = "https://www.youtube.com/watch?v=W7oMxY39tl8"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/ZeroK-logo.png"
7++++
8+
9+In this inaugural episode, ~poldec-tonteg and ~roslet-tanner recap the Urbit Volcano Summit, new Hoon School and App School classes, growth metrics for Urbit and the news that, finally, you can fit at least one movie from the Shrek franchise in your Urbit. Enjoy!
content/podcasts/2023-04-03_legacy-internet-new-internet.mdnew file+15
@@ -0,0 +1,15 @@
1++++
2+title = "Legacy internet vs New Internet?"
3+podcast = "Crazy Wisdom"
4+date = "2023-04-03"
5+URL = "https://crazywisdom.libsyn.com/legacy-internet-vs-new-internet-aj-lamarc"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/crazywisdom.jpg"
7++++
8+
9+AJ is a software engineer interested in Urbit and data composability.
10+
11+Twitter: https://twitter.com/ajlamarc
12+
13+https://www.ajlamarc.com/
14+
15+Keep an eye out on Holium, and making it easier to code in Javascript for Urbit
content/podcasts/2023-04-06_the-ai-episode.mdnew file+9
@@ -0,0 +1,9 @@
1++++
2+title = "E28 - The AI Episode (feat. Jake Brukhman)"
3+podcast = "The Network Age"
4+date = "2023-04-06"
5+URL = "https://rss.com/podcasts/thenetworkage/896645/"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/networkage.jpg"
7++++
8+
9+On this extra special episode, the boys (including OG host ~timluc-miptev) are joined by Jake Brukhman (~ranter-tapper), the founder and CEO of Coinfund, as well as an engineer, technologist, investor, and cosmonaut exploring the frontiers of AI. The crew discusses the creation of Jargon, a Chat GPT pseudolanguage, which Jake used to build a personal AI Spanish teacher, and the implications of recent AI development. In particular, they focus on AI's implications for privacy, the intersection of AI and Web3 (including crypto as a force of decentralization), and the many types of doom that could be facing us. All this, plus how to use Chat GPT to optimize your personal life, the role of AI in education, the coming marriage between Urbit and AI, and whether interacting with AI is a religious experience. Don't miss it.
content/podcasts/2023-04-11_its-urbits-all-the-way-down-with-dachus-tiprel.mdnew file+9
@@ -0,0 +1,9 @@
1++++
2+title = "It's Urbits All the Way Down with ~dachus-tiprel"
3+podcast = "ZeroK - UF"
4+date = "2023-04-11"
5+URL = "https://www.youtube.com/watch?v=hgVE_EZiyms"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/ZeroK-logo.png"
7++++
8+
9+On the newest episode of Zero K, ~poldect-tonteg interviews ~dachus-tiprel of Uqbar network about his virtualization system, Pyro. Also discussed: Exiting college, how he got linked up with Uqbar through the grants program and the ultimate Urbit hosting solution.
content/podcasts/2023-04-14_epicenter-tim-galebach.mdnew file+11
@@ -0,0 +1,11 @@
1++++
2+title = "Tim Galebach: Uqbar – Smart Contracts on Urbit"
3+podcast = "Epicenter"
4+date = "2023-04-14"
5+URL = "https://www.youtube.com/watch?v=stEn6RacXtY"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/epicenter.jpg"
7++++
8+
9+Building a truly decentralised, peer-to-peer network, based on a built-in identity system, limits the ecosystem’s interoperability with the outside world. Onboarding developers and users to Urbit was only the first hurdle. On-ramping crypto was a whole different & daunting task. Uqbar set out to build an execution layer on top of Urbit, enabling smart contracts, which would ultimately settle, via a ZK rollup, on Starknet.
10+
11+We were joined by Tim Galebach, founder of Uqbar, to discuss the different design choices involved, from Hoon programming DevEx to a hybrid ZK-optimistic rollup.
content/podcasts/2023-04-20_artificial-qintelligence.mdnew file+9
@@ -0,0 +1,9 @@
1++++
2+title = "E29 - Artificial Qintelligence (feat. Xianyang)"
3+podcast = "The Network Age"
4+date = "2023-04-20"
5+URL = "https://rss.com/podcasts/thenetworkage/914980/"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/networkage.jpg"
7++++
8+
9+On this extra special episode, the boys welcome a new cohost, ~habsul-rignyr of the OG Urbit podcast, The Stack (Rest in Power). More importantly, our trio of idiots is joined by famed translator, scholar, technologist, and sinophile Xianyang (~forlyt-novmep) to discuss AI-enhanced gaming, Taoist philosophy, and the creation of DAObi, a token-based simulation game of an ancient Chinese state. Then, we dive into Lexicat, Xianyang's natural language processing platform, and dissect her attempts to create GPT Burmese. All this plus: economic incentives to instantiate the AI apocalypse, the startling Confucian-Taoist rivalry, a scandalous battle for DAObi Chancellor, digital wife swapping, and how to murder a cat.
content/podcasts/2023-04-27_hoon-only-legal-ui-with-hastuc-dibtux.mdnew file+11
@@ -0,0 +1,11 @@
1++++
2+title = "Hoon Only Legal UI with ~hastuc-dibtux"
3+podcast = "ZeroK - UF"
4+date = "2023-04-27"
5+URL = "https://www.youtube.com/watch?v=jF5hY-CduTI"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/ZeroK-logo.png"
7++++
8+
9+In new episode of Zero K, ~poldec-tonteg interviews the mysterious hooner/aesthetic crusader known as ~hastuc-dibtux
10+
11+Witness a discussion of immorality of javascript, the importance of a sovereign UI and much more
content/podcasts/2023-05-11_full-metal-urbit-with-mopfel-winrux.mdnew file+15
@@ -0,0 +1,15 @@
1++++
2+title = "Full Metal Urbit with ~mopfel-winrux"
3+podcast = "ZeroK - UF"
4+date = "2023-05-11"
5+URL = "https://www.youtube.com/watch?v=tW2FlJmUy8w"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/ZeroK-logo.png"
7++++
8+
9+Live from my heartland headquarters, another exciting episode of Zero K, an interview with ~mopfel-winrux, hardware extraordinaire.
10+
11+~mopfel has a deep background in hardware: chips, robots, wiring harnesses. Today he talks about the interaction between your Urbit and the metal that it runs on.
12+
13+He also touches on a project that has since been named %lick which lets your Urbit directly control hardware like peripherals and GPUs.
14+
15+You might also get a glimpse or two at the hardware plans of his company Native Planet, leading many to ask: When Urbit phone?
content/podcasts/2023-05-18_crypto-takes-flight.mdnew file+11
@@ -0,0 +1,11 @@
1++++
2+title = "E31 - Crypto Takes Flight (feat. Brian Crain)"
3+podcast = "The Network Age"
4+date = "2023-05-18"
5+URL = "https://rss.com/podcasts/thenetworkage/955387/"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/networkage.jpg"
7++++
8+
9+On this extra special episode, the boys are joined by technologist and investor Brian Crain (~minwyc-dablen), CEO and co-founder of Chorus One and host of crypto's longest running podcast, Epicenter. They discuss his work building Web3 infrastructure, the evolution of Urbit (Brian just joined the Urbit Foundation board), and the next five years of crypto narratives. Then, they dive into Brian's work on Epicenter, his favorite guests, and what he has learned from spending so many years in the space. All this plus government regulation, AI-crypto integrations, and tips from a master podcaster on how we can improve The Network Age. Don't miss it.
10+
11+Our thoughts go out to Brian, who is currently in the hospital recovering from his experience on this podcast.x3
content/privacy.md+1−1
@@ -76,7 +76,7 @@ We do not knowingly collect, maintain, or use personal information from children
7676
7777### International visitors
7878
79−The Services are hosted in the United States and are intended for visitors located within the United States. If you choose to use the Services from the European Union or other regions of the world with laws governing data collection and use that may differ from U.S. law, then please note that you are transferring your personal information outside of those regions to the United States for storage and processing. Also, we may transfer your data from the U.S. to other countries or regions in connection with storage and processing of data, fulfilling your requests, and operating the Services. By providing any information, including personal information, on or to the Services, you consent to such transfer, storage, and processing.
79+[Omitted long matching line]
8080
8181### Changes to this Privacy Policy
8282
content/rfps.mdnew file+40
@@ -0,0 +1,40 @@
1++++
2+title = "Requests for Proposals"
3+date = "2023-03-02"
4+weight = 1
5+description = "Everything you need to know about fulfilling a request for proposal or RFP"
6++++
7+
8+The imagination of people building on Urbit often outpaces the available development hours. For this case, we have Requests for Proposals (RFPs).
9+
10+These are ideas that the community would like to see come to fruition, but whose details haven't been completely ironed out. Since they're not fully fleshed out, they're a great opportunity for contributors to add their own ideas and creative approaches, while learning about developing and shipping on Urbit.
11+
12+If any of these RFPs sound compelling, we encourage you to come by the [Urbit Grants office hours](https://app.gather.town/app/xAYeiPI2XDYhRM9t/urbit-hacker-house?spawnToken=ufV1APwWTGmYVTgzyx0z) or DM [~poldec-tonteg](https://urbit.org/ids/~poldec-tonteg) to discuss drafting and submitting a proposal.
13+
14+# Jump in
15+
16+The Hacker House is a UF-hosted gather.town instance where contributors hang out, pair program and discuss all things Urbit. At the Office Hours, members from the UF team can help refine the Request idea and give you context about what needs to be built, potential use cases and architectural precedents in the codebase.
17+
18+Once you've got your mind around this, the next step is to draft the Proposal
19+
20+# Drafting a proposal
21+
22+All of the best practices outlined on the [Proposals](https://urbit.org/grants/proposals) section of the website apply equally to Proposals that respond to a Request.
23+
24+Good proposals all include the following:
25+
26+- A **detailed and clear description of the proposal**. If you're proposing something technical, user stories are a good idea.
27+- An overview of **why you are the right person for the job**. A description of your background, familiarity with the project, and professional/education experience are all good starts.
28+- Your estimate for **date of completion**.
29+- The **amount of funding** you'd like for the project, denominated in stars.
30+- What **specific deliverables** will look like.
31+
32+It's recommended to break your project into _milestones_, each of which must have its own completion dates, funding amounts and deliverables. In general, proposals should target a first deliverable within two months of the start of the project. Proposals should have a maximum of five milestones as scoping a project beyond that is impractical, and each milestone should constitute significant enough work to warrant the reward of a full star.
33+
34+Feel free to come to multiple office hours or connect on network to develop the proposal further. Once it's in a good state, submit it through [this form](https://airtable.com/shrCi54rEDxgSZr3z). Submitted proposals are then reviewed internall twice a week by the full grants team.
35+
36+The main distinction between a self-originating Proposal and one that responds to a Request is that the latter doesn't need to go through the further step of getting a champion, as the originator of the Request will fulfill that role.
37+
38+# Getting paid
39+
40+A good proposal will have clear success criteria for each milestone. At the completion of each milestone, submit an invoice to the UF for that milestones star compensation and your champion will have the opportunity to review work.
content/updates/2018-7-30-update.md+1−1
@@ -53,7 +53,7 @@ latest backend Landscape API's that _Isaac_ `~davtyr-nimren` has been improving.
5353Urbit is becoming more usable by the day.
5454
5555Last but not least, the Documentation team continued doing `~zod`'s work helping
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+[Omitted long matching line]
5757
5858Also: 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/)
5959
content/updates/2019-2-11-update.md+1−1
@@ -26,7 +26,7 @@ To stay up to date on network status, follow [@zodisok](https://twitter.com/zodi
2626
2727## Team
2828
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!
29+[Omitted long matching line]
3030
3131Shout-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).
3232
package-lock.json+7−7
@@ -12,7 +12,7 @@
1212 "@socialgouv/matomo-next": "^1.3.0",
1313 "@tailwindcss/aspect-ratio": "^0.4.0",
1414 "@tlon/sigil-js": "^1.4.5",
15− "@urbit/foundation-design-system": "0.7.1",
15+ "@urbit/foundation-design-system": "0.7.3",
1616 "@urbit/markdoc": "^0.1.4",
1717 "axios": "^0.26.1",
1818 "buffer": "^6.0.3",
@@ -358,9 +358,9 @@
358358 "dev": true
359359 },
360360 "node_modules/@urbit/foundation-design-system": {
361− "version": "0.7.1",
362− "resolved": "https://registry.npmjs.org/@urbit/foundation-design-system/-/foundation-design-system-0.7.1.tgz",
363− "integrity": "sha512-yQl+bf2TLv+ytlvo6Qq68D39OM18nzRfGTPTz8XukwtfoeThVJy35t5ZFAr4hyrADb4309mNIDCd6Pd7TQGImw==",
361+ "version": "0.7.3",
362+ "resolved": "https://registry.npmjs.org/@urbit/foundation-design-system/-/foundation-design-system-0.7.3.tgz",
363+ "integrity": "sha512-txg6G2Gv7thd04YqStVilX2CJrkkwrLrWEZx7DaclB+tq1q7Eh9Uud51J2QIytIE/SvWak/innapLL0bUNZI0Q==",
364364 "dependencies": {
365365 "@iarna/toml": "^2.2.5",
366366 "@tlon/sigil-js": "^1.4.5",
@@ -3342,9 +3342,9 @@
33423342 "dev": true
33433343 },
33443344 "@urbit/foundation-design-system": {
3345− "version": "0.7.1",
3346− "resolved": "https://registry.npmjs.org/@urbit/foundation-design-system/-/foundation-design-system-0.7.1.tgz",
3347− "integrity": "sha512-yQl+bf2TLv+ytlvo6Qq68D39OM18nzRfGTPTz8XukwtfoeThVJy35t5ZFAr4hyrADb4309mNIDCd6Pd7TQGImw==",
3345+ "version": "0.7.3",
3346+ "resolved": "https://registry.npmjs.org/@urbit/foundation-design-system/-/foundation-design-system-0.7.3.tgz",
3347+ "integrity": "sha512-txg6G2Gv7thd04YqStVilX2CJrkkwrLrWEZx7DaclB+tq1q7Eh9Uud51J2QIytIE/SvWak/innapLL0bUNZI0Q==",
33483348 "requires": {
33493349 "@iarna/toml": "^2.2.5",
33503350 "@tlon/sigil-js": "^1.4.5",
package.json+3−2
@@ -7,9 +7,10 @@
77 "build": "next build",
88 "export": "npm run prebuild && next build && next export",
99 "start": "next start",
10− "prebuild": "npm run cache-posts && npm run rss && npm run glossary && npm run getting-started-tree && npm run overview-tree",
10+ "prebuild": "npm run cache-posts && npm run rss && npm run glossary && npm run getting-started-tree && npm run overview-tree && npm run campus-tree",
1111 "getting-started-tree": "node lib/buildPageTree getting-started weight",
1212 "overview-tree": "node lib/buildPageTree overview weight",
13+ "campus-tree": "node lib/buildPageTree campus weight",
1314 "cache-posts": "node lib/cache.js",
1415 "glossary": "node lib/buildGlossary.js",
1516 "rss": "node lib/rss.js",
@@ -20,7 +21,7 @@
2021 "@socialgouv/matomo-next": "^1.3.0",
2122 "@tailwindcss/aspect-ratio": "^0.4.0",
2223 "@tlon/sigil-js": "^1.4.5",
23− "@urbit/foundation-design-system": "0.7.1",
24+ "@urbit/foundation-design-system": "0.7.3",
2425 "@urbit/markdoc": "^0.1.4",
2526 "axios": "^0.26.1",
2627 "buffer": "^6.0.3",
pages/campus/[[...slug]].jsnew file+312
@@ -0,0 +1,312 @@
1+import Head from "next/head";
2+import Link from "next/link";
3+import { useRouter } from "next/router";
4+import classnames from "classnames";
5+import React from "react";
6+import { DateTime } from "luxon";
7+import {
8+ Container,
9+ Section,
10+ SingleColumn,
11+ TwoUp,
12+ IntraNav,
13+ getAllPosts,
14+ generateRealtimeDate,
15+ getPage,
16+ Markdown,
17+ getPreviousPost,
18+ getNextPost,
19+} from "@urbit/foundation-design-system";
20+import { getAllEvents } from "../../lib/lib";
21+import { join } from 'path';
22+import Header from "../../components/Header";
23+import Footer from "../../components/Footer";
24+import Contact from "../../components/Contact";
25+import PostPreview from "../../components/PostPreview";
26+import EventPreview from "../../components/EventPreview";
27+import Sidebar from "../../components/Sidebar";
28+import { eventKeys } from "../../lib/constants";
29+import IndexCard from "../../components/ecosystem/IndexCard";
30+import HighlightCard from "../../components/HighlightCard";
31+import fs from "fs";
32+import path from "path";
33+import Meta from "../../components/Meta";
34+import campusTree from "../../cache/campus.json";
35+import { matchEcosystemPost } from "../../lib/lib";
36+
37+export default function Home({
38+ posts,
39+ highlights,
40+ ecosystem,
41+ events,
42+ grantNumbers,
43+ search,
44+ data,
45+ markdown,
46+}) {
47+ const post = {
48+ title: "Urbit",
49+ description: "A clean-slate OS and network for the 21st century.",
50+ image: "https://storage.googleapis.com/media.urbit.org/site/opengraph/urbit.png"
51+ };
52+ return (
53+ <Container>
54+ <Head>
55+ <title>Urbit</title>
56+ {Meta(post, false, true)}
57+ </Head>
58+ <IntraNav ourSite="https://urbit.org" search={search} />
59+
60+ <SingleColumn>
61+ <Header search={search} />
62+
63+ {/* Hero statement */}
64+ <Section className="pb-6">
65+ <div className="flex flex-col space-y-4">
66+ <h1 className="max-w-prose">
67+ Campus Outreach Program
68+ </h1>
69+ <h3 className="max-w-prose">
70+ Leave your mark on the future. Build on Urbit.
71+ </h3>
72+ </div>
73+ </Section>
74+
75+
76+
77+ {/* Brief explanatory paragraph */}
78+ <Section className="sm:flex sm:space-x-8 space-y-8 sm:space-y-0">
79+
80+ <div className="space-y-8">
81+ <div className="space-y-4">
82+ <p className="type-ui max-w-prose">
83+ The Urbit Foundation’s Campus Outreach Program aims to find ambitious students interested in reimagining the possibilities of decentralized systems and networked computing.
84+ </p>
85+
86+ <p className="type-ui max-w-prose">
87+ Do you fit that description and want us to come to your university?{" "}
88+ <Link href="/campus#contact" passHref>
89+ <a>Get in touch.</a>
90+ </Link>{" "}
91+ </p>
92+ </div>
93+
94+
95+ <Link href="https://airtable.com/shrmfUVpMskWw145u" passHref>
96+ <a className="button-lg bg-green-400 text-white type-ui max-w-fit">
97+ Get on Urbit
98+ </a>
99+ </Link>
100+
101+
102+ </div>
103+ </Section>
104+
105+ {/*
106+ how to make an in-page link (href to hashtag element id)
107+ <a href="#events"> cheebo </a>
108+ */}
109+
110+
111+
112+ {
113+ //funnel, repurposed from /overview page:
114+ }
115+ <div id="learn"></div>
116+
117+ <Section>
118+
119+ <h2 className="pb-16">Why use Urbit?</h2>
120+
121+ <div className="flex justify-between sidebar md:space-x-8">
122+ <Sidebar search={search}>
123+ {childPages("/campus", posts.pages)}
124+ </Sidebar>
125+ <div className={'markdown max-w-prose ' + data.slug }>
126+
127+ <h2>{ data.title }</h2>
128+ <Markdown.render content={JSON.parse(markdown)} />
129+ </div>
130+ </div>
131+ </Section>
132+
133+
134+
135+ {
136+ //Events
137+ }
138+
139+ <Section className="pb-1">
140+
141+ <br></br>
142+ <div className="mt-6">
143+ <h2 className="mb-8" id="events">Events</h2>
144+ {events.length > 0 ? (
145+ <TwoUp>
146+ <EventPreview event={events[0]} className="mb-8" />
147+ {events[1] ? <EventPreview event={events[1]} className="mb-8" /> : <div />}
148+ </TwoUp>
149+ ) : (
150+ <p className="pb-8">No events yet — check back later.</p>
151+ )}
152+ <Link href="/events?tag=campus">
153+ <a className="bg-wall-600 text-white button-lg w-fit">
154+ View All
155+ </a>
156+ </Link>
157+ </div>
158+ </Section>
159+
160+ <div id="contact"></div>
161+
162+ <Section className="pb-12">
163+
164+ <div className="bg-wall-100 w-full p-4 md:p-8 rounded-3xl flex flex-wrap items-center">
165+
166+ <div className="sm:pl-2 align-middle">
167+ <h2 className=" text-2xl pb-2" >Get in touch</h2 >
168+ <p className="max-w-prose type-ui pb-4">
169+ Not sure how to get started after attending an event? Want to schedule one at your university?
170+ Don't be a stranger. Reach out at the email below, or{" "}
171+ <Link href="https://urbit.org/groups/~tidren-nosryg/campus-outreach" passHref>
172+ <a>find us on Urbit.</a>
173+ </Link>{" "}
174+ </p>
175+ <Link href="mailto:campus@urbit.org">
176+ <a className="button-sm border-2 border-wall-600 text-wall-600 type-sm max-w-fit">
177+ campus@urbit.org
178+ </a>
179+ </Link>
180+ </div>
181+ </div>
182+ </Section>
183+
184+
185+
186+
187+ </SingleColumn>
188+
189+
190+
191+ <Footer />
192+ </Container>
193+ );
194+}
195+
196+const childPages = (thisLink, children, level = 0) => {
197+ const router = useRouter();
198+
199+ const isThisPage = router.asPath === thisLink || router.asPath === `${thisLink}#learn`;
200+
201+ const pageItemClasses = classnames({
202+ "text-base type-ui": level === 0,
203+ "text-wall-400": !isThisPage,
204+ "text-black": isThisPage,
205+ });
206+ return (
207+ <ul className="">
208+ <li className="pb-2">
209+ <Link href="/campus#learn">
210+ <a className={`${pageItemClasses} cursor-pointer`}>Software Developers</a>
211+ </Link>
212+ </li>
213+ {children?.map((child) => (
214+ <li className="pb-2">
215+ {pageTree(join(thisLink, child.slug), child, level)}
216+ </li>
217+ ))}
218+ </ul>
219+ );
220+};
221+
222+const pageTree = (thisLink, tree, level = 0) => {
223+ const router = useRouter();
224+
225+
226+ const isThisPage = router.asPath.includes(thisLink);
227+
228+ const pageItemClasses = classnames({
229+ "text-base type-ui": level === 0,
230+ "text-wall-400": !isThisPage,
231+ "text-black": isThisPage,
232+ });
233+
234+ return (
235+ <>
236+ <Link href={thisLink + "#learn"}>
237+ <a className={`${pageItemClasses} cursor-pointer`}>{tree.title}</a>
238+ </Link>
239+ </>
240+ );
241+};
242+
243+export async function getStaticPaths() {
244+ const posts = campusTree;
245+
246+ const slugs = [];
247+
248+ const allHrefs = (thisLink, tree) => {
249+ slugs.push(thisLink, ...tree.pages.map((e) => join(thisLink, e.slug)));
250+ allHrefsChildren(thisLink, tree.children);
251+ };
252+
253+ const allHrefsChildren = (thisLink, children) => {
254+ Object.entries(children).map(([childSlug, child]) => {
255+ allHrefs(join(thisLink, childSlug), child);
256+ });
257+ };
258+
259+ allHrefs("/campus", posts);
260+
261+ return {
262+ paths: slugs,
263+ fallback: false,
264+ };
265+}
266+
267+export async function getStaticProps({ params }) {
268+ const posts = campusTree;
269+
270+ const { data, content } = getPage(
271+ join(process.cwd(), "content/campus", params.slug?.join("/") || "/")
272+ );
273+ const markdown = JSON.stringify(Markdown.parse({ post: { content } }));
274+
275+ const previousPost =
276+ getPreviousPost(
277+ params.slug?.slice(-1).join("") || "campus",
278+ ["title", "slug", "weight"],
279+ join("campus", params.slug?.slice(0, -1).join("/") || "/"),
280+ "weight"
281+ ) || null;
282+
283+ const nextPost =
284+ getNextPost(
285+ params.slug?.slice(-1).join("") || "campus",
286+ ["title", "slug", "weight"],
287+ join("campus", params.slug?.slice(0, -1).join("/") || "/"),
288+ "weight"
289+ ) || null;
290+
291+ const allEvents = getAllEvents(eventKeys, "events");
292+ const events = allEvents.filter((e) => e?.tags?.includes("campus")) || [];
293+
294+ return { props: { posts, data, markdown, params, previousPost, nextPost, events } };
295+}
296+
297+
298+
299+/* export async function getStaticProps() {
300+
301+
302+ const events = getAllEvents(eventKeys, "events").filter((e) => e?.tags?.includes("campus"));
303+
304+ // const { data, content } = getPage(join(process.cwd(), 'content', 'bitcoin'));
305+
306+ return {
307+ props: {
308+ events
309+ }
310+ }
311+}
312+ */
pages/grants.js+70−52
@@ -33,7 +33,7 @@ export default function Grants({ posts, categories, types, search }) {
3333 const router = useRouter();
3434 let { status, type, category } = router.query;
3535 if (status === undefined) {
36− status = "open";
36+ status = ["open", "wip"];
3737 }
3838
3939 function push(toQuery) {
@@ -82,8 +82,8 @@ export default function Grants({ posts, categories, types, search }) {
8282 const byStatus = (post) => {
8383 return (
8484 (isOrIsIn("open", status) ? post.status === "open" : false) ||
85− (isOrIsIn("complete", status) ? post.status === "completed" : false) ||
86− (isOrIsIn("wip", status) ? post.status === "wip" : false)
85+ (isOrIsIn("complete", status) ? post.status === "completed" : false) ||
86+ (isOrIsIn("wip", status) ? post.status === "wip" : false)
8787 );
8888 };
8989
@@ -91,10 +91,10 @@ export default function Grants({ posts, categories, types, search }) {
9191
9292 const filteredPosts = postsByStatus.filter((post) => {
9393 const hasCategory = category
94− ? isArray(category)
95− ? post.taxonomies.grant_category.some((cat) => category.includes(cat))
96− : post.taxonomies.grant_category.includes(category)
97− : true;
94+ ? isArray(category)
95+ ? post.taxonomies.grant_category.some((cat) => category.includes(cat))
96+ : post.taxonomies.grant_category.includes(category)
97+ : true;
9898
9999 const notCanceled = !post.extra.canceled;
100100 const hasType = type ? post.taxonomies.grant_type.includes(type) : true;
@@ -107,6 +107,9 @@ export default function Grants({ posts, categories, types, search }) {
107107 Bounty: postsByStatus.filter((post) =>
108108 post.taxonomies.grant_type.includes("Bounty")
109109 ).length,
110+ RFP: postsByStatus.filter((post) =>
111+ post.taxonomies.grant_type.includes("RFP")
112+ ).length,
110113 Apprenticeship: postsByStatus.filter((post) =>
111114 post.taxonomies.grant_type.includes("Apprenticeship")
112115 ).length,
@@ -122,7 +125,7 @@ export default function Grants({ posts, categories, types, search }) {
122125 {Meta({
123126 title: "Grants",
124127 description:
125− "Contribute to the Urbit project while earning address space.",
128+ "Contribute to the Urbit project while earning address space.",
126129 })}
127130 </Head>
128131 <IntraNav ourSite="https://urbit.org" search={search} />
@@ -157,11 +160,18 @@ export default function Grants({ posts, categories, types, search }) {
157160 fund all kinds projects, not strictly technical ones, so don't
158161 hesitate to pitch your idea!
159162 </p>
160− <Link href="/grants/proposals" passHref>
161− <a className="button-sm bg-blue-400 text-white mb-8 max-w-fit">
162− Submit a Proposal
163− </a>
164− </Link>
163+ <div className="flex flex-wrap mb-8">
164+ <Link href="/grants/proposals" passHref>
165+ <a className="button-sm bg-blue-400 text-white mb-8 max-w-fit mr-2">
166+ Submit a Proposal
167+ </a>
168+ </Link>
169+ <Link href="/grants?program=rfps&type=RFP#view-grants" passHref>
170+ <a className="button-sm bg-purple text-white mb-8 max-w-fit">
171+ Get Ideas
172+ </a>
173+ </Link>
174+ </div>
165175
166176 {/* Apprenticeships */}
167177 <h3>Apprenticeships</h3>
@@ -197,15 +207,7 @@ export default function Grants({ posts, categories, types, search }) {
197207 </a>
198208 </Link>
199209 </div>
200−
201−
202− {/* Approval */}
203− <h3>Approval</h3>
204− <p className="mb-4">
205− Grant applications and proposals are approved on a bi-weekly basis. The next deadlines are <b>February 7th & 21st</b>.
206− </p>
207− <p>If you any questions regarding grants, feel free to email grants@urbit.org.</p>
208− </div>
210+ </div>
209211 </div>
210212 </div>
211213 </Section>
@@ -235,6 +237,12 @@ export default function Grants({ posts, categories, types, search }) {
235237 by those that post them.
236238 </p>
237239 </li>
240+ <li className="mb-2">
241+ <p>
242+ <Link href="/grants/rfps">RFPs</Link>{" "}
243+ are suitable for people experienced with hoon development but who need some ideas on what to work on.
244+ </p>
245+ </li>
238246 <li className="mb-2">
239247 <p>
240248 <Link href="/grants/apprenticeships">Apprenticeships</Link>{" "}
@@ -248,9 +256,16 @@ export default function Grants({ posts, categories, types, search }) {
248256 <div className="md:basis-1/2">
249257 <p className="mb-8">
250258 Whether you're gearing up to submit your proposal or just
251− thinking about it, the best way to get started is to join the <Link href="/groups/~halbex-palheb/uf-public">Urbit Foundation</Link> group.
259+ thinking about it, the best way to get started is to join the <Link href="/groups/~halbex-palheb/uf-public">Urbit Foundation</Link> group, ask questions there or come find our grants office hours in the group.
260+ </p>
261+ <p className="mb-8">
262+ Feel free to contact <a href="/ids/~poldec-tonteg">~poldec-tonteg</a> with general questions or <a href="/ids/~marfun-pacpet">~marfun-pacpet</a> regarding administrative matters.
263+ </p>
264+ <p className="mb-8">
265+ <h4>Approval</h4>
266+ </p>
267+ <p className="mb-8">Grant applications and proposals are approved on a bi-weekly basis on the second and fourth Wednesday of the month.
252268 </p>
253− <p className="mb-8">Feel free to contact <a href="/ids/~poldec-tonteg">~poldec-tonteg</a> with general questions or <a href="/ids/~marfun-pacpet">~marfun-pacpet</a> regarding administrative matters.</p>
254269 </div>
255270 </div>
256271 </Section>
@@ -272,17 +287,20 @@ export default function Grants({ posts, categories, types, search }) {
272287 {types.map((each) => {
273288 let activeBg;
274289 switch (each) {
275− case "Proposal":
276− activeBg = "bg-blue-400 text-white";
277− break;
278− case "Bounty":
279− activeBg = "bg-yellow-300 text-white";
280− break;
281− case "Apprenticeship":
282− activeBg = "bg-green-400 text-white";
283− break;
284− default:
285− activeBg = "bg-black";
290+ case "Proposal":
291+ activeBg = "bg-blue-400 text-white";
292+ break;
293+ case "Bounty":
294+ activeBg = "bg-yellow-300 text-white";
295+ break;
296+ case "RFP":
297+ activeBg = "bg-purple-400 text-white";
298+ break;
299+ case "Apprenticeship":
300+ activeBg = "bg-green-400 text-white";
301+ break;
302+ default:
303+ activeBg = "bg-black";
286304 }
287305 return (
288306 <a
@@ -302,8 +320,8 @@ export default function Grants({ posts, categories, types, search }) {
302320 <div className="flex flex-wrap mb-12">
303321 {categories.map((each) => {
304322 const active = isOrIsIn(each, category)
305− ? "bg-green-400 text-white"
306− : "bg-wall-100 text-wall-500";
323+ ? "bg-green-400 text-white"
324+ : "bg-wall-100 text-wall-500";
307325 const categoryQuery = pushOrDropQuery("category", category, each);
308326 return (
309327 <button
@@ -319,20 +337,20 @@ export default function Grants({ posts, categories, types, search }) {
319337 {["open", "complete", "wip"].map((each) => {
320338 let title;
321339 switch (each) {
322− case "open":
323− title = isOrIsIn(each, status)
324− ? "Exclude Open"
325− : "Include Open";
326− break;
327− case "complete":
328− title = isOrIsIn(each, status)
329− ? "Exclude Completed"
330− : "Include Completed";
331− break;
332− case "wip":
333− title = isOrIsIn(each, status)
334− ? "Exclude In Progress"
335− : "Include In Progress";
340+ case "open":
341+ title = isOrIsIn(each, status)
342+ ? "Exclude Open"
343+ : "Include Open";
344+ break;
345+ case "complete":
346+ title = isOrIsIn(each, status)
347+ ? "Exclude Completed"
348+ : "Include Completed";
349+ break;
350+ case "wip":
351+ title = isOrIsIn(each, status)
352+ ? "Exclude In Progress"
353+ : "Include In Progress";
336354 }
337355 const statusQuery = pushOrDropQuery("status", status, each);
338356 return (
@@ -371,7 +389,7 @@ export async function getStaticProps() {
371389 "date"
372390 )
373391 }).flat()
374− .sort((a, b) => new Date(b.date) - new Date(a.date));
392+ .sort((a, b) => new Date(b.date) - new Date(a.date));
375393
376394 return {
377395 props: {
pages/grants/[slug].js+67−50
@@ -35,39 +35,39 @@ export default function Grant({ post, markdown, match, search }) {
3535 const assignee = post?.extra?.assignee;
3636 const mentor = post.extra.mentor || post.extra.champion;
3737 const assigneeLink =
38− assignee &&
39− assignee.map((each, index) => {
40− return ob.isValidPatp(each) ? (
41− <>
42− {index ? ", " : ""}
43− <Link href={`/ids/${each}`} passHref>
44− <a className="text-green-400">{each}</a>
45− </Link>
46− </>
47− ) : (
48− <>
49− {index ? ", " : ""}
50− {each}
51− </>
52− );
53− });
38+ assignee &&
39+ assignee.map((each, index) => {
40+ return ob.isValidPatp(each) ? (
41+ <>
42+ {index ? ", " : ""}
43+ <Link href={`/ids/${each}`} passHref>
44+ <a className="text-green-400">{each}</a>
45+ </Link>
46+ </>
47+ ) : (
48+ <>
49+ {index ? ", " : ""}
50+ {each}
51+ </>
52+ );
53+ });
5454 const mentorLink =
55− mentor &&
56− mentor.map((each, index) => {
57− return ob.isValidPatp(each) ? (
58− <>
59− {index ? ", " : ""}
60− <Link href={`/ids/${each}`} passHref>
61− <a className="text-green-400">{each}</a>
62− </Link>
63− </>
64− ) : (
65− <>
66− {index ? ", " : ""}
67− {each}
68− </>
69− );
70− });
55+ mentor &&
56+ mentor.map((each, index) => {
57+ return ob.isValidPatp(each) ? (
58+ <>
59+ {index ? ", " : ""}
60+ <Link href={`/ids/${each}`} passHref>
61+ <a className="text-green-400">{each}</a>
62+ </Link>
63+ </>
64+ ) : (
65+ <>
66+ {index ? ", " : ""}
67+ {each}
68+ </>
69+ );
70+ });
7171
7272 let status = "";
7373 if (isOpen) {
@@ -85,21 +85,21 @@ export default function Grant({ post, markdown, match, search }) {
8585 "bg-green-400 text-white": status === "Completed" || status === "Open",
8686 "bg-wall-300": status === "In Progress",
8787 })}>
88− {status}
89− </div>;
88+ {status}
89+ </div>;
9090
9191 let deliverable = null;
9292 if (post.extra.deliverable) {
9393 if (match) {
9494 deliverable = <ResourceCard
95− title={match.data.title}
96− image={match.data.image}
97− color={match.data.bgColor || "#000000"}
98− description={match.data?.description || ""}
99− type="application"
100− shortcode={post.extra.deliverable}
101− full
102− />
95+ title={match.data.title}
96+ image={match.data.image}
97+ color={match.data.bgColor || "#000000"}
98+ description={match.data?.description || ""}
99+ type="application"
100+ shortcode={post.extra.deliverable}
101+ full
102+/>
103103 }
104104 else if (post.extra.deliverable.startsWith("~")) {
105105 deliverable = <JoinGroup emphasize groupName={post.extra.deliverable} />
@@ -111,6 +111,13 @@ export default function Grant({ post, markdown, match, search }) {
111111 const metaPost = Object.assign({}, post);
112112 metaPost.title = `${post.title} - Grant`;
113113
114+ const isRFP = post.taxonomies.grant_type.filter((category) => {
115+ return category === "RFP";
116+ }).length > 0;
117+
118+ const hasChampion = post.extra.champion && post.extra.champion[0] !== "";
119+ const hasAssignee = post.extra.assignee && post.extra.assignee[0] !== "";
120+
114121 return (
115122 <Container>
116123 <Head>
@@ -126,6 +133,7 @@ export default function Grant({ post, markdown, match, search }) {
126133 {statusBadge}
127134 {post.taxonomies.grant_type.map((category) => {
128135 const className = classnames({
136+ "bg-purple-400 text-white": category === "RFP",
129137 "bg-blue-400 text-white": category === "Proposal",
130138 "bg-green-400 text-white": category === "Apprenticeship",
131139 "bg-yellow-300": category === "Bounty",
@@ -161,13 +169,13 @@ export default function Grant({ post, markdown, match, search }) {
161169 content={mentorLink}
162170 />
163171 ) : null}
164− {post.extra.champion ? (
172+ {hasChampion ? (
165173 <MetadataBlock
166174 title="Champion"
167175 content={mentorLink}
168176 />
169177 ) : null}
170− {post.extra.assignee ? (
178+ {hasAssignee ? (
171179 <MetadataBlock
172180 title="Grantee(s)"
173181 content={assigneeLink}
@@ -175,17 +183,26 @@ export default function Grant({ post, markdown, match, search }) {
175183 ) : null}
176184 </div>
177185 {post?.extra?.link?.startsWith("~") && <div className="flex flex-col my-4 space-y-2">
178− <p className="text-wall-400 font-semibold">Group</p>
179− <JoinGroup emphasize groupName={post.extra.link} />
180− </div>}
186+ <p className="text-wall-400 font-semibold">Group</p>
187+ <JoinGroup emphasize groupName={post.extra.link} />
188+ </div>}
181189 {deliverable && <div className="flex flex-col my-4 space-y-2">
182− <p className="text-wall-400 font-semibold">Deliverable</p>
183− {deliverable}
184− </div>}
190+ <p className="text-wall-400 font-semibold">Deliverable</p>
191+ {deliverable}
192+ </div>}
185193 </Section>
186194 <Section narrow className="markdown">
187195 <Markdown.render content={JSON.parse(markdown)} />
188196 </Section>
197+ {isRFP && (
198+ <a
199+ className="bg-green-400 text-white button-lg"
200+ href="/grants/rfps"
201+ target="_blank"
202+ >
203+ Learn More
204+ </a>
205+ )}
189206 {canApply && (
190207 <a
191208 className="bg-green-400 text-white button-lg"
pages/grants/apprenticeships.js+1−1
@@ -8,7 +8,7 @@ export default function Post({ post, markdown, search }) {
88 post={post}
99 markdown={markdown}
1010 search={search}
11− actionText="View Apprenticeships"
11+ actionText="View Requests"
1212 actionLink="/grants?program=apprenticeship&completed=true#view-grants"
1313 />
1414 );
pages/grants/rfps.jsnew file+29
@@ -0,0 +1,29 @@
1+import GrantProgramOverview from "../../components/GrantProgramOverview";
2+import { Markdown, getPostBySlug } from "@urbit/foundation-design-system";
3+
4+export default function Post({ post, markdown, search }) {
5+ return (
6+ <GrantProgramOverview
7+ program="rfps"
8+ post={post}
9+ markdown={markdown}
10+ search={search}
11+ actionText="View RFPs"
12+ actionLink="/grants?program=rfps#view-grants"
13+ />
14+ );
15+}
16+
17+export async function getStaticProps() {
18+ const post = getPostBySlug(
19+ "/rfps",
20+ ["title", "date", "slug", "content"],
21+ "/"
22+ );
23+
24+ const markdown = JSON.stringify(Markdown.parse({ post }));
25+
26+ return {
27+ props: { post, markdown },
28+ };
29+}
pages/groups/[[...group]].js+1−1
@@ -84,7 +84,7 @@ const GroupPage = ({ data, markdown, params, search }) => {
8484 Urbit is a clean-slate, peer-to-peer operating system and network.
8585 </h3>
8686 <div className="flex flex-col space-y-4">
87− <Link href="/guides/joining-groups" passHref>
87+ <Link href="/getting-started/joining-groups" passHref>
8888 <a className="button-lg max-w-xs bg-green-400 text-white">
8989 How to Join an Urbit Group
9090 </a>
pages/ids/[id].js+1−1
@@ -140,7 +140,7 @@ const IdPage = ({ data, markdown, applications, groups, network, params }) => {
140140 Urbit is a clean-slate, peer-to-peer operating system and network.
141141 </h3>
142142 <div className="flex flex-col space-y-4">
143− <Link href="/guides/getting-an-urbit-id">
143+ <Link href="/getting-started/get-id">
144144 <button className="button-lg max-w-xs bg-green-400 text-white">
145145 Learn how to get an Urbit ID
146146 </button>
pages/index.js+92−59
@@ -19,6 +19,7 @@ import PostPreview from "../components/PostPreview";
1919import EventPreview from "../components/EventPreview";
2020import { eventKeys } from "../lib/constants";
2121import IndexCard from "../components/ecosystem/IndexCard";
22+import HighlightCard from "../components/HighlightCard";
2223import fs from "fs";
2324import path from "path";
2425import Meta from "../components/Meta";
@@ -26,6 +27,7 @@ import { matchEcosystemPost } from "../lib/lib";
2627
2728export default function Home({
2829 posts,
30+ highlights,
2931 ecosystem,
3032 events,
3133 grantNumbers,
@@ -58,27 +60,20 @@ export default function Home({
5860 // Hero
5961 }
6062
63+ {
64+ // Highlights
65+ }
6166 <Section className="pb-12">
62− <div className="bg-wall-100 w-full p-4 md:p-8 rounded-3xl flex flex-wrap items-center">
63−
64− <div className="basis-full sm:basis-1/3 pb-4 sm:pb-0">
65− <img className="rounded-xl w-72" src="https://storage.googleapis.com/media.urbit.org/assembly/assembly-thumb2.jpg" />
66− </div>
67− <div className="sm:basis-2/3 sm:pl-6 align-middle">
68− <h2 className="text-2xl pb-2">Assembly 2022</h2 >
69− <p className="max-w-prose pb-4">
70− Select talks and panels are being released from the second annual Urbit confluence in Miami.
71− </p>
72− <Link href="https://assembly.urbit.org" passHref>
73− <a className="button-sm border-2 border-wall-600 text-wall-600 type-sm max-w-fit">
74− Watch Now
75− </a>
76− </Link>
77− </div>
67+ <div className="flex flex-col space-y-4 md:space-y-0 md:flex-row md:space-x-4">
68+ <HighlightCard highlight={highlights[0]} key={highlights[0].slug} />
69+ <HighlightCard highlight={highlights[1]} key={highlights[1].slug} />
70+ <HighlightCard highlight={highlights[2]} key={highlights[2].slug} />
7871 </div>
7972 </Section>
8073
8174
75+
76+
8277 <Section narrow className="space-y-8">
8378
8479 <div className="w-full space-y-8 max-w-prose">
@@ -139,6 +134,53 @@ export default function Home({
139134 </Link>
140135 </div>
141136 </Section>
137+
138+ {
139+ // Build on Urbit Developer CTA
140+ }
141+ <Section narrow>
142+ <h2 className="pb-8">Build on Urbit</h2>
143+ <h4 className="pb-6">
144+ Urbit is a personal OS designed from scratch to run peer-to-peer
145+ applications.
146+ </h4>
147+ <p className="pb-6">
148+ It solves the hard problems of implementing a peer-to-peer network
149+ (including identity, NAT traversal, and exactly-once delivery) in
150+ the kernel so app developers can focus on business logic.
151+ </p>
152+ <p className="pb-6">
153+ The entire OS is a{" "}
154+ <Link href="https://urbit.org/docs/nock/definition/" passHref>
155+ <a>single pure function</a>
156+ </Link>{" "}
157+ that provides application developers with strong guarantees:
158+ automated persistence and memory management, repeatable builds, and
159+ support for hot code reloading.
160+ </p>
161+ <p className="pb-10">
162+ You can get started learning how to{" "}
163+ <Link href="https://urbit.org/docs/development/develop/" passHref>
164+ <a>contribute to the project</a>
165+ </Link>
166+ , or view a variety of{" "}
167+ <Link
168+ href="https://github.com/urbit/awesome-urbit#http-apis-airlock"
169+ passHref
170+ >
171+ <a>libraries</a>
172+ </Link>{" "}
173+ for building on Urbit using the languages you already know.
174+ </p>
175+ <Link href="https://developers.urbit.org" passHref>
176+ <a className="button-lg type-ui text-white bg-green-400 max-w-fit">
177+ Visit Urbit Developers
178+ </a>
179+ </Link>
180+ </Section>
181+
182+
183+
142184 {
143185 // Grants
144186 }
@@ -188,49 +230,6 @@ export default function Home({
188230 </div>
189231 </Section>
190232
191− {
192− // Build on Urbit Developer CTA
193− }
194− <Section narrow>
195− <h2 className="pb-8">Build on Urbit</h2>
196− <h4 className="pb-6">
197− Urbit is a personal OS designed from scratch to run peer-to-peer
198− applications.
199− </h4>
200− <p className="pb-6">
201− It solves the hard problems of implementing a peer-to-peer network
202− (including identity, NAT traversal, and exactly-once delivery) in
203− the kernel so app developers can focus on business logic.
204− </p>
205− <p className="pb-6">
206− The entire OS is a{" "}
207− <Link href="https://urbit.org/docs/nock/definition/" passHref>
208− <a>single pure function</a>
209− </Link>{" "}
210− that provides application developers with strong guarantees:
211− automated persistence and memory management, repeatable builds, and
212− support for hot code reloading.
213− </p>
214− <p className="pb-10">
215− You can get started learning how to{" "}
216− <Link href="https://urbit.org/docs/development/develop/" passHref>
217− <a>contribute to the project</a>
218− </Link>
219− , or view a variety of{" "}
220− <Link
221− href="https://github.com/urbit/awesome-urbit#http-apis-airlock"
222− passHref
223− >
224− <a>libraries</a>
225− </Link>{" "}
226− for building on Urbit using the languages you already know.
227− </p>
228− <Link href="https://developers.urbit.org" passHref>
229− <a className="button-lg type-ui text-white bg-green-400 max-w-fit">
230− Visit Urbit Developers
231− </a>
232− </Link>
233− </Section>
234233
235234 {
236235 // Blog Posts
@@ -272,6 +271,26 @@ export default function Home({
272271 </Link>
273272 </Section>
274273
274+ <Section className="pb-12">
275+ <div className="bg-wall-100 w-full p-4 md:p-8 rounded-3xl flex flex-wrap items-center">
276+
277+ <div className="basis-full sm:basis-1/3 pb-4 sm:pb-0">
278+ <img className="rounded-xl w-72" src="https://storage.googleapis.com/media.urbit.org/assembly/assembly-thumb2.jpg" />
279+ </div>
280+ <div className="sm:basis-2/3 sm:pl-6 align-middle">
281+ <h2 className="text-2xl pb-2">Assembly 2022</h2 >
282+ <p className="max-w-prose pb-4">
283+ Watch talks and panels from last year's confluence in Miami.
284+ </p>
285+ <Link href="https://assembly.urbit.org" passHref>
286+ <a className="button-sm border-2 border-wall-600 text-wall-600 type-sm max-w-fit">
287+ Watch Now
288+ </a>
289+ </Link>
290+ </div>
291+ </div>
292+ </Section>
293+
275294 <Section narrow>
276295 <h2 className="pb-2">Urbit Monthly</h2>
277296 <p className="pb-8">Get monthly email updates on all things Urbit.</p>
@@ -279,6 +298,9 @@ export default function Home({
279298 <Contact emphasize />
280299 </Section>
281300
301+
302+
303+
282304 <Section narrow>
283305 <h2 className="pb-8">Social Media</h2>
284306 <p className="pb-2">
@@ -310,6 +332,8 @@ export default function Home({
310332 );
311333}
312334
335+
336+
313337export async function getStaticProps() {
314338 // Latest blog posts
315339 const posts = getAllPosts(
@@ -318,6 +342,14 @@ export async function getStaticProps() {
318342 "date"
319343 );
320344
345+
346+ // Highlights
347+ const highlights = getAllPosts(
348+ ["title", "slug", "image", "url", "description"],
349+ "highlights"
350+ );
351+
352+
321353 // Latest ecosystem report with matched post metadata
322354 const ecosystem = matchEcosystemPost(getAllPosts(
323355 ["date", "featured-1", "featured-2", "featured-3"],
@@ -389,6 +421,7 @@ export async function getStaticProps() {
389421 return {
390422 props: {
391423 posts,
424+ highlights,
392425 ecosystem,
393426 grantNumbers,
394427 events: happeningNow.concat(futureEvents).concat(pastEvents),
pages/organizations/[slug].js+2−1
@@ -103,6 +103,7 @@ export async function getStaticProps({ params }) {
103103 "slug",
104104 "description",
105105 "URL",
106+ "twitter",
106107 "image",
107108 "ships",
108109 "group",
@@ -112,7 +113,7 @@ export async function getStaticProps({ params }) {
112113 );
113114
114115 const spotlights = getAllPosts(
115− ["title", "slug", "featured-1", "featured-2", "featured-3"],
116+ ["title", "heading", "slug", "featured-1", "featured-2", "featured-3"],
116117 "ecosystem/spotlight"
117118 ).filter(
118119 (e) =>
vercel.json+14−1
@@ -3,12 +3,25 @@
33 "silent": true
44 },
55 "redirects": [
6+ {
7+ "source": "/sponsordeck",
8+ "destination": "https://tinyurl.com/urbitsponsordeck",
9+ "permanent": true
10+ },
11+ {
12+ "source": "/uf-public",
13+ "destination": "https://tlon.network/lure/~halbex-palheb/uf-public",
14+ "permanent": false
15+ },
616 {
717 "source": "/groups/~wolref-podlex/foundation",
818 "destination": "/groups/~halbex-palheb/uf-public"
919 },
1020 {
11− "source": "/getting-started/get-planet",
21+ "source": "/getting-around",
22+ "destination": "/getting-started/getting-around"
23+ },
24+ {"source": "/getting-started/get-planet",
1225 "destination": "/getting-started/get-id"
1326 },
1427 {