on master help sign in
Merge pull request #1651 from urbit/mp/ecosystem

add ecosystem section

commite7c137d782419193d7ae8374011f7b8230c1bc5e authorGordon <gordon.cieplak@urbit.org> dateThu 28 Jul 2022, 12:13 (4 years ago) parent4f5089f23095b0
106 files changed+2428−673
components/Contact.js+7−27 components/Header.js+23−6 components/MenuTray.js+3−3 components/NewletterSignup.js → components/NewsletterSignup.js components/ecosystem/BasicPage.js+107 components/ecosystem/IndexCard.js+50 components/ecosystem/Post.js+96 components/gateway/GatewayHeader.js+2−2 components/gateway/MetadataLink.js+1−1 content/applications/~dalten/gora.md+14 content/applications/~dister-fabnev-hinmur/escape.md+18 content/applications/~fabnev-hinmur/handshake.md → content/applications/~dister-fabnev-hinmur/handshake.md+4−2 content/applications/~fabnev-hinmur/escape.md−12 content/applications/~finmep-lanteb/chess.md+5−4 content/applications/~haddef-sigwen/transit.md+3 content/applications/~lander-dister-dozzod-dozzod/groups.md+31 content/applications/~lomder-librun/ballot.md+4−1 content/applications/~midlev-mindyr/astrolabe.md+20−1 content/applications/~mister-dister-dozzod-dozzod/terminal.md+14 content/applications/~nocsyx-lassul/silo.md+1 content/applications/~nodmyn-dosrux/houston.md+5−1 content/applications/~norsyr-torryn/canvas.md+18−1 content/applications/~paldev/face.md+4 content/applications/~paldev/fafa.md+5 content/applications/~paldev/pals.md+4 content/applications/~paldev/picture.md+4 content/applications/~paldev/rumors.md+4 content/applications/~paldev/verse.md+4 content/applications/~pocwet/docs.md+7 content/applications/~ribben-donnyl/funes-notes.md+3−1 content/applications/~sitden-sonnet/channel.md+1 content/applications/~tirrel/studio.md+21 content/blog/creating-sigils.md+6−6 content/ecosystem/spotlight/july-2022.md+44 content/events/2022-07-28-urbit-meetup-milano-22.md+1 content/marketplaces/azimuth-shop.md+10 content/marketplaces/lanlyd.md+18 content/marketplaces/mocbel-house.md+18 content/marketplaces/networked-subject.md+13 content/marketplaces/opensea.md+17 content/marketplaces/planet-market.md+25 content/marketplaces/urbit-live.md+12 content/marketplaces/urbitex.md+10 content/marketplaces/urbitme.md+10 content/marketplaces/wexpert-systems.md+12 content/media/blockchannel-episode-19-virtual-land-in-the-clouds-with-urbit.md−14 content/media/blueprint-2017-galen-wolfe-pauly-on-the-distributed-web.md−15 content/media/epicenter-episode-205-urbit-a-digital-republic-reinventing-the-internet.md−15 content/media/governing-the-future-e09-urbit-a-user-owned-internet-on-top-of-the-internet.md−16 content/media/lambdaconf-2016-curtis-yarvin-urbit-a-clean-slate-functional-operating-stack.md−15 content/media/lambdaconf-2018-ted-blackman-ford-urbits-build-system.md−15 content/media/on-the-brink-castle-island.md−14 content/media/the-ether-review-46-curtis-yarvin-and-galen-wolfe-pauly-on-urbit.md−15 content/media/urbit-and-the-not-so-dark-future-of-the-internet.md−11 content/media/what-is-urbit.md−10 content/organizations/holium.md+8 content/organizations/mars-review-of-books.md+17 content/organizations/reciprocal.md+12 content/organizations/third-earth.md+8 content/organizations/tirrel.md+10 content/organizations/tlon.md+10 content/organizations/uqbar.md+8 content/organizations/urbit-foundation.md+10 content/podcasts/2018-11-18_a-digital-republic.md+19 content/podcasts/2019-11-11_urbit.md+9 content/podcasts/2020-03-23_a-new-computing-platform.md+17 content/podcasts/2020-03-23_technology-and-freedom.md+18 content/podcasts/2020-03-23_under-the-hood.md+15 content/podcasts/2020-03-24_urbit-id-and-the-network.md+13 content/podcasts/2020-03-26_built-to-last.md+21 content/podcasts/2020-03-26_urbit-and-bitcoin.md+15 content/podcasts/2020-04-05_tlon-operations.md+15 content/podcasts/2020-11-24_humane-computing.md+11 content/podcasts/2021-02-08_urbit.md+27 content/podcasts/2022-01-21_the-most-beautiful-computer.md+17 content/podcasts/2022-01-26_the-only-dignified-computer.md+17 content/podcasts/2022-02-01_100-year-computer.md+15 content/podcasts/2022-02-15_building-web3-products.md+20 content/podcasts/2022-02-21_most-correct-computer.md+17 content/podcasts/2022-03-02_theory-of-the-egirl.md+17 content/podcasts/2022-03-08_urbit-blockchains.md+16 content/podcasts/2022-03-13_alien-invasions.md+16 content/podcasts/2022-03-18_politics-of-urbit-governance.md+15 content/podcasts/2022-03-23_quantum-computing.md+15 content/podcasts/2022-05-21_diary-of-sam-frank.md+10 content/podcasts/2022-06-22_software-as-soulcraft.md+20 content/podcasts/2022-06-29_josh-lehman.md+30 content/podcasts/2022-07-04_enable-people-to-run-their-own-servers.md+116 package-lock.json+150−179 pages/applications/[[...application]].js+58−28 pages/blog/[slug].js−3 pages/ecosystem/index.js+374 pages/ecosystem/spotlight/[slug].js+118 pages/events/[slug].js−3 pages/groups/[[...group]].js+3−5 pages/ids/[id].js+2−5 pages/index.js+99−7 pages/marketplaces/[slug].js+80 pages/media.js−114 pages/media/[slug].js−117 pages/organizations/[slug].js+168 pages/overview/[[...slug]].js+3−1 pages/podcasts/[slug].js+80 pages/updates/[slug].js+1−3 public/images/sound.svg+5 vercel.json+4
components/Contact.js+7−27
@@ -1,38 +1,18 @@
1−import NewsletterSignup from "./NewletterSignup";
1+import NewsletterSignup from "./NewsletterSignup";
22import { name, contact } from "../lib/constants";
33import Link from "next/link";
44
5−export default function Contact({ emphasize }) {
5+export default function Contact({
6+ emphasize,
7+ ecosystem = false,
8+ className = "",
9+}) {
610 const linkText = emphasize ? "text-green-400" : "text-wall-600";
711 const border = emphasize ? "border-green-400" : "border-wall-600";
812
913 return (
10− <div>
11− <div className="measure">
12− <h4 className="pb-6">
13− If you’d like to follow our progress, we send monthly updates via
14− email:
15− </h4>
16− </div>
14+ <div className={className}>
1715 <NewsletterSignup color={border} />
18− <h4 className="mt-12 text-wall-500">
19− Follow us on{" "}
20− <a className={linkText} href={contact.twitter}>
21− Twitter
22− </a>
23− </h4>
24− <h4 className="mt-6 text-wall-500">
25− Explore code on{" "}
26− <a className={linkText} href={contact.github}>
27− Github
28− </a>
29− </h4>
30− <h4 className="mt-6 text-wall-500 flex-wrap">
31− Boot Urbit and join{" "}
32− <Link href={`/groups/${contact.urbitCommunity}`} passHref>
33− <a className={linkText}>Urbit Community</a>
34− </Link>
35− </h4>
3616 </div>
3717 );
3818}
components/Header.js+23−6
@@ -63,6 +63,14 @@ export default function Header(props) {
6363 Overview
6464 </ActiveLink>
6565
66+ <ActiveLink
67+ currentPath={currentPath}
68+ className="mr-5 type-ui"
69+ href="/ecosystem"
70+ >
71+ Ecosystem
72+ </ActiveLink>
73+
6674 <ActiveLink
6775 currentPath={currentPath}
6876 className="mr-5 type-ui"
@@ -114,7 +122,6 @@ export default function Header(props) {
114122 Get Started
115123 </ActiveLink>
116124
117−
118125 <ActiveLink
119126 currentPath={currentPath}
120127 className="mr-5 mb-4"
@@ -123,9 +130,22 @@ export default function Header(props) {
123130 Overview
124131 </ActiveLink>
125132
126− <ActiveLink currentPath={currentPath} className="mr-5 mb-4" href="/grants">
133+ <ActiveLink
134+ currentPath={currentPath}
135+ className="mr-5 mb-4"
136+ href="/ecosystem"
137+ >
138+ Ecosystem
139+ </ActiveLink>
140+
141+ <ActiveLink
142+ currentPath={currentPath}
143+ className="mr-5 mb-4"
144+ href="/grants"
145+ >
127146 Grants
128147 </ActiveLink>
148+
129149 <ActiveLink
130150 currentPath={currentPath}
131151 className="mr-5 mb-4"
@@ -133,7 +153,7 @@ export default function Header(props) {
133153 >
134154 Events
135155 </ActiveLink>
136−
156+
137157 <ActiveLink
138158 currentPath={currentPath}
139159 className="mr-5 mb-4"
@@ -141,9 +161,6 @@ export default function Header(props) {
141161 >
142162 Blog
143163 </ActiveLink>
144−
145−
146−
147164 </MenuTray>
148165 </header>
149166 );
components/MenuTray.js+3−3
@@ -37,7 +37,7 @@ export default function MenuTray({ isOpen, setTray, search, children }) {
3737 <>
3838 <nav
3939 {...handlers}
40− className={`z-10 w-screen h-screen top-0 left-0 fixed block md:hidden ${menuClasses}`}
40+ className={`z-20 w-screen h-screen top-0 left-0 fixed block md:hidden ${menuClasses}`}
4141 >
4242 <div
4343 onClick={() => setTray(!isOpen)}
@@ -59,7 +59,7 @@ export default function MenuTray({ isOpen, setTray, search, children }) {
5959 e.stopPropagation();
6060 search.toggleSearch(e);
6161 }}
62− className={`z-10 fixed px-4 items-center justify-center type-ui rounded-xl h-16 bg-white text-wall-500 left-4 right-4 bottom-4 mobile-search-button-width ${
62+ className={`z-20 fixed px-4 items-center justify-center type-ui rounded-xl h-16 bg-white text-wall-500 left-4 right-4 bottom-4 mobile-search-button-width ${
6363 isOpen ? "flex" : "hidden"
6464 }`}
6565 >
@@ -68,7 +68,7 @@ export default function MenuTray({ isOpen, setTray, search, children }) {
6868 </nav>
6969 <button
7070 onClick={() => setTray(!isOpen)}
71− className="z-10 fixed bottom-4 right-4 w-16 h-16 bg-wall-600 flex items-center justify-center rounded-full md:hidden"
71+ className="z-20 fixed bottom-4 right-4 w-16 h-16 bg-wall-600 flex items-center justify-center rounded-full md:hidden"
7272 >
7373 {isOpen ? (
7474 <svg
components/NewletterSignup.js → components/NewsletterSignup.jsrenamed

The content is the same.

components/ecosystem/BasicPage.jsnew file+107
@@ -0,0 +1,107 @@
1+import { useRouter } from "next/router";
2+import Link from "next/link";
3+import Head from "next/head";
4+import Meta from "../Meta";
5+import ErrorPage from "../../pages/404";
6+import classnames from "classnames";
7+import {
8+ Container,
9+ SingleColumn,
10+ Section,
11+ Markdown,
12+ IntraNav,
13+} from "foundation-design-system";
14+import Header from "../Header";
15+import Footer from "../Footer";
16+
17+export default function BasicPage({
18+ section,
19+ post,
20+ markdown,
21+ search,
22+ children,
23+}) {
24+ const router = useRouter();
25+ if (!router.isFallback && !post?.slug) {
26+ return <ErrorPage />;
27+ }
28+ return (
29+ <Container>
30+ <Head>
31+ <title>
32+ {post.title} • {section} • Urbit
33+ </title>
34+ {Meta(post)}
35+ </Head>
36+ <IntraNav ourSite="https://urbit.org" search={search} />
37+ <SingleColumn>
38+ <Header />
39+ <Section narrow className="space-y-12">
40+ <div className="flex items-center space-x-4">
41+ <img src={post.image} className="w-36" />
42+ <div className="flex flex-col pl-2">
43+ <h1
44+ className={classnames({ "text-3xl": section === "Podcasts" })}
45+ >
46+ {post.title}
47+ </h1>
48+ <p>{section.slice(0, -1)}</p>
49+ </div>
50+ </div>
51+ {/* General purpose metadata bar -- podcast listen button is special-cased URL, flexed at the end of the row */}
52+ <div className="flex justify-between">
53+ <div className="flex space-x-12">
54+ {post?.podcast && (
55+ <div className="flex flex-col">
56+ <p className="font-bold text-wall-400">Podcast</p>
57+ <p>{post.podcast}</p>
58+ </div>
59+ )}
60+ {post?.date && (
61+ <div className="flex flex-col">
62+ <p className="font-bold text-wall-400">Date</p>
63+ <p className="shrink-0">{post.date}</p>
64+ </div>
65+ )}
66+ {post?.URL && section !== "Podcasts" && (
67+ <div className="flex flex-col">
68+ <p className="font-bold text-wall-400">Website</p>
69+ <a
70+ className="text-green-400 text-sm font-semibold font-mono"
71+ href={post.URL}
72+ >
73+ {post.URL.slice(post.URL.indexOf("://") + 3)}
74+ </a>
75+ </div>
76+ )}
77+ {post?.URL && section === "Marketplaces" && (
78+ <div className="flex flex-col">
79+ <p className="font-bold text-wall-400">Accepts</p>
80+ <p className="text-sm font-semibold font-mono">
81+ {post.payment.join(", ")}
82+ </p>
83+ </div>
84+ )}
85+ </div>
86+ {post?.URL && section === "Podcasts" && (
87+ <a
88+ href={post.URL}
89+ className="button-lg bg-green-400 text-white cursor-pointer flex space-x-2"
90+ >
91+ <img src="/images/sound.svg" />
92+ &nbsp;Listen
93+ </a>
94+ )}
95+ </div>
96+ <div className="flex">
97+ <div className="markdown w-full">
98+ <Markdown.render content={JSON.parse(markdown)} />
99+ {children}
100+ </div>
101+ </div>
102+ </Section>
103+ </SingleColumn>
104+ <Footer />
105+ </Container>
106+ );
107+}
components/ecosystem/IndexCard.jsnew file+50
@@ -0,0 +1,50 @@
1+import Link from "next/link";
2+import classnames from "classnames";
3+export default function IndexCard({ slug, feat }) {
4+ return (
5+ <Link href={slug}>
6+ <div className="cursor-pointer bg-wall-100 rounded-xl min-h-0 flex-1">
7+ <div className="flex flex-col p-4 justify-between items-between h-full relative">
8+ {feat.image ? (
9+ <img
10+ className="rounded-xl w-full flex-1 object-cover"
11+ src={feat.image}
12+ style={{ aspectRatio: "4 / 3" }}
13+ />
14+ ) : (
15+ <div
16+ className="rounded-xl w-full flex-1"
17+ style={{
18+ aspectRatio: "4 / 3",
19+ backgroundColor: feat?.matchedPost?.bgColor || "rgba(0,0,0,0)",
20+ }}
21+ />
22+ )}
23+ <div className="grow-1 shrink-0 flex flex-col h-full min-h-0 pt-4">
24+ <p className="mb-2 font-semibold leading-5">{feat.title}</p>
25+ {badge(feat.type)}
26+ <p className="text-sm leading-5">{feat?.description}</p>
27+ </div>
28+ </div>
29+ </div>
30+ </Link>
31+ );
32+}
33+
34+const badge = (type) => {
35+ return (
36+ <div
37+ className={classnames(
38+ "uppercase font-bold text-white text-xs w-fit rounded-lg mb-5 px-2 py-1",
39+ {
40+ "bg-[#B37ED7]": type === "Organization",
41+ "bg-[#83b2d4]": type === "Application",
42+ "bg-[#333333]": type === "Podcast",
43+ "bg-[#8dd5b1]": type === "Marketplace",
44+ }
45+ )}
46+ >
47+ {type}
48+ </div>
49+ );
50+};
components/ecosystem/Post.jsnew file+96
@@ -0,0 +1,96 @@
1+import { Markdown } from "foundation-design-system";
2+import classnames from "classnames";
3+import Link from "next/link";
4+export default function Post({ post }) {
5+ return ["featured-1", "featured-2", "featured-3"].map((feat) => {
6+ const childPath =
7+ post[feat] && post[feat]?.matchedPost?.type === "Application"
8+ ? `${post[feat]?.matchedPost.ship}/${post[feat].matchedPost.slug}`
9+ : `${post[feat].matchedPost?.slug}`;
10+ const href = post[feat]?.matchedPost
11+ ? `/${post[feat].matchedPost.type.toLowerCase()}s/${childPath}`
12+ : null;
13+ return post?.[feat] ? (
14+ <div
15+ className="mt-8 mb-24"
16+ id={post?.[feat].title.toLowerCase().replace(/ /, "-")}
17+ >
18+ <div className="flex space-x-4 items-center">
19+ <div
20+ className="h-24 w-24 rounded-xl items-center justify-center shrink-0 overflow-hidden"
21+ style={{
22+ backgroundColor:
23+ post[feat]?.matchedPost?.bgColor || "rgba(0,0,0,0)",
24+ }}
25+ >
26+ {post[feat]?.image && (
27+ <img
28+ className="rounded-xl w-24 object-cover"
29+ src={post[feat].image}
30+ />
31+ )}
32+ </div>
33+ <div className="flex flex-col">
34+ <h4 className="text-xl pb-2 leading-6 font-bold">
35+ {post?.[feat].title}
36+ </h4>
37+ {badge(post[feat].type)}
38+ </div>
39+ </div>
40+ <div className="markdown mt-8 mb-8">
41+ <Markdown.render content={JSON.parse(post[feat].content)} />
42+ </div>
43+
44+ {post[feat].type === "Podcast" && (
45+ <Link href={href || "#"} passHref>
46+ <a class="button-sm text-white flex-col bg-green-400 cursor-pointer pr-4 w-fit">
47+ Listen to {post[feat].type}
48+ </a>
49+ </Link>
50+ )}
51+
52+ {post[feat].type === "Application" && (
53+ <Link href={href || "#"} passHref>
54+ <a class="button-sm text-white flex-col bg-green-400 cursor-pointer pr-4 w-fit">
55+ View {post[feat].type}
56+ </a>
57+ </Link>
58+ )}
59+
60+ {post[feat].type === "Organization" && (
61+ <Link href={href || "#"} passHref>
62+ <a class="button-sm text-white flex-col bg-green-400 cursor-pointer pr-4 w-fit">
63+ More about {post[feat].title}
64+ </a>
65+ </Link>
66+ )}
67+
68+ {post[feat].type === "Marketplace" && (
69+ <Link href={href || "#"} passHref>
70+ <a class="button-sm text-white flex-col bg-green-400 cursor-pointer pr-4 w-fit">
71+ More about {post[feat].title}
72+ </a>
73+ </Link>
74+ )}
75+ </div>
76+ ) : null;
77+ });
78+}
79+
80+const badge = (type) => {
81+ return (
82+ <div
83+ className={classnames(
84+ "uppercase font-bold text-white text-xs w-fit rounded-lg mb-2 px-2 py-1",
85+ {
86+ "bg-[#B37ED7]": type === "Organization",
87+ "bg-[#83b2d4]": type === "Application",
88+ "bg-[#333333]": type === "Podcast",
89+ "bg-[#8dd5b1]": type === "Marketplace",
90+ }
91+ )}
92+ >
93+ {type}
94+ </div>
95+ );
96+};
components/gateway/GatewayHeader.js+2−2
@@ -16,11 +16,11 @@ const GatewayHeader = ({
1616 <div className="flex flex-col">
1717 <h2>{title}</h2>
1818 {subtitle && (
19− <p className={(subtitleMono ? "font-mono" : "font-sans") + " pb-1"}>
19+ <p className={(subtitleMono ? "font-mono" : "font-sans") }>
2020 {subtitle}
2121 </p>
2222 )}
23− <p>{item}</p>
23+ <p className="mt-1">{item}</p>
2424 </div>
2525 </div>
2626 );
components/gateway/MetadataLink.js+1−1
@@ -5,7 +5,7 @@ const MetadataLink = ({ title, href, content }) => (
55 <p className="font-bold text-wall-400">{title}</p>
66 <Link href={href}>
77 <div className="flex truncate">
8− <a className="type-ui truncate font-mono text-green-400">{content}</a>
8+ <a className="truncate font-mono text-green-400">{content}</a>
99 </div>
1010 </Link>
1111 </div>
content/applications/~dalten/gora.md+14
@@ -7,3 +7,17 @@ license = "MIT"
77website = "https://dalten.org"
88bgColor = "#FCD977"
99+++
10+
11+### A Proof of Attendance Protocol for Urbit
12+
13+Gora is a proof of presence protocol (POPP) that is
14+intended to be extensible, flexible and educational
15+(at least for new hooners).
16+
17+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/gora.png)
18+
19+
20+Gora has two distros in
21+circulation - these can be found at:
22+~laddys-dozzod-dalten (Vue.js frontend)
23+~mister-dozzod-dalten (sail frontend)
content/applications/~dister-fabnev-hinmur/escape.mdnew file+18
@@ -0,0 +1,18 @@
1++++
2+title = "EScape"
3+shortcode = "~dister-fabnev-hinmur/escape"
4+developer = "Uqbar"
5+description = "EScape from Eternal September. The UI from Uqbar."
6+license = "MIT"
7+website = "https://uqbar.network"
8+bgColor = "#f2f3ef"
9+image = "https://escape-app-dist.s3.us-east-2.amazonaws.com/uqbar-logo.png"
10++++
11+
12+EScape is an alternative interface to Tlon's groups app.
13+
14+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/escape.png)
15+
16+EScape lets you view groups, messages, and apps in collapsible column interface, organize groups by folders, and "like" messages in chats. EScape is also has apps for both iOS and Android that include push notifications for chat mentions and messages.
17+
18+Get EScape on [iOS](https://apps.apple.com/my/app/escape-by-uqbar/id1610194217) and [Android](https://play.google.com/store/apps/details?id=network.uqbar.escape).
content/applications/~fabnev-hinmur/handshake.md → content/applications/~dister-fabnev-hinmur/handshake.mdrenamed+4−2
@@ -1,6 +1,6 @@
11+++
22title = "Handshake"
3−developer = "~fabnev-hinmur"
3+developer = "Uqbar"
44shortcode = "~dister-fabnev-hinmur/handshake"
55description = "Confirm Urbit IDs via QR code."
66license = "MIT"
@@ -9,4 +9,6 @@ bgColor = "#df828b"
99image = "https://static.thenounproject.com/png/2002633-200.png"
1010+++
1111
12−An app for building guestlists of Urbit IDs and verifying their ownership at the door. For best experience, access from [EScape](https://urbit.org/applications/~fabnev-hinmur/escape).
12+An app for building guestlists of Urbit IDs and verifying their ownership at the door. For best experience, access from [EScape](/applications/~fabnev-hinmur/escape).
13+
14+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/handshake.png)
content/applications/~fabnev-hinmur/escape.mddeleted−12
@@ -1,12 +0,0 @@
1−+++
2−title = "EScape"
3−developer = "~fabnev-hinmur"
4−shortcode = "~dister-fabnev-hinmur/escape"
5−description = "EScape from Eternal September. The UI from Uqbar."
6−license = "MIT"
7−website = "https://uqbar.network"
8−bgColor = "#f2f3ef"
9−image = "https://escape-app-dist.s3.us-east-2.amazonaws.com/uqbar-logo.png"
10−+++
11−
12−An alternative interface to Tlon's groups app. Get it on [iOS](https://apps.apple.com/my/app/escape-by-uqbar/id1610194217) and [Android](https://play.google.com/store/apps/details?id=network.uqbar.escape).
content/applications/~finmep-lanteb/chess.md+5−4
@@ -1,11 +1,12 @@
11+++
22title = "Chess"
33shortcode = "~finmep-lanteb/chess"
4−license = "GPL3"
5−image = "https://peekabooo.icu/images/finmep-chess.svg"
6−bgColor = "#FFFFFF"
74developer = "~finmep-lanteb & ~sigryn-habrex"
5+description = "Fully peer-to-peer chess over Urbit"
6+license = "GPL3"
87website = "https://github.com/ashelkovnykov/urbit-chess"
8+bgColor = "#ffffff"
9+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/finmep-chess.svg"
910+++
1011
11−Fully decentralized, peer-to-peer Chess app for Urbit
12+Fully decentralized, peer-to-peer Chess app for Urbit
content/applications/~haddef-sigwen/transit.md+3
@@ -5,7 +5,10 @@ license = "MIT"
55image = "https://haddefsigwen1.s3.us-east-1.amazonaws.com/haddef-sigwen/2022.5.07..20.27.02-image.png"
66bgColor = "#38285c"
77developer = "~haddef-sigwen"
8+description = "Planetary transit occurs once per day."
89website = ""
910+++
1011
1112Planetary transit occurs once per day.
13+
14+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/transit.png)
content/applications/~lander-dister-dozzod-dozzod/groups.mdnew file+31
@@ -0,0 +1,31 @@
1++++
2+title = "Groups"
3+developer = "Tlon"
4+shortcode = "~lander-dister-dozzod-dozzod/landscape"
5+description = "A suite of applications to communicate on Urbit"
6+license = "MIT"
7+website = "https://tlon.io"
8+bgColor = "#DC5F3F"
9++++
10+
11+
12+Groups is Tlon's flagship app: a community center, workspace, gallery, publisher, and messenger. Designed as a tool for collectives and organizations of various sizes on Urbit, Groups can host a company communication suite, a DAO, a blog, a music syndicate, and just about anything that involves collaboration, publication, or communication.
13+
14+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/groups.png)
15+
16+*Messages–send encrypted direct messages to one or many friends:*
17+
18+Reach out to your friends directly via Messages, a simple chat tool that lets you talk one-on-one or with many.
19+
20+*Notebooks–write and publish documents or blog posts:*
21+
22+Write a blog post, create a magazine, draft an announcement or documentation using Notebooks, a short and long form text editor. You can add images, give other ships permission to comment on your posts, and mirror your content on the mainnet with ~tirrel's %studio app.
23+
24+*Collections–maintain a mood board and gather links:*
25+
26+Assemble a feed of images, save links for later, make a mood board, or start a forum on Collections, a repository for day-to-day digital trawling.
27+
28+*Profiles–personalize your Urbit ID:*
29+
30+Make your Urbit ID yours: set a nickname, write a bio, change your avatar, or choose to stay anonymous. You can also pin featured groups on your profile. Hint: It’s a good way to share and discover new groups to join.
31+
content/applications/~lomder-librun/ballot.md+4−1
@@ -6,6 +6,9 @@ image = "https://lomder-librun.sfo3.digitaloceanspaces.com/tiles/ballot-app-tile
66bgColor = "#cebef0"
77developer = "~lomder-librun"
88website = "https://www.holium.com"
9+description = "An app that allows you to vote with other ships."
910+++
1011
11−An app that allows you to vote with other ships.
12+Ballot allows you to create and vote on proposals, delegate votes to other urbit ships, and trigger actions based on results.
13+
14+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/ballot.png)
content/applications/~midlev-mindyr/astrolabe.md+20−1
@@ -6,6 +6,25 @@ image = "https://raw.githubusercontent.com/johnhyde/astrolabe/main/ui/src/assets
66bgColor = ""
77developer = "~midlev-mindyr"
88website = "https://github.com/johnhyde/astrolabe"
9+description = "Astrolabe is a one-stop shop app for exploring Urbit address space."
910+++
1011
11−Astrolabe (%astrolabe) is a one-stop shop %docket app for exploring Urbit address space. Main features: ID Search, Sigil Search, Sky Chart, and Ship View (for viewing a given ship's details). Astrolabe integrates with %pals wherever possible, and contains documentation to explain the many quirks of Urbit address space to a new user.
12+### Astrolabe is a one-stop shop app for exploring Urbit address space.
13+
14+Features:
15+
16+- **ID Search**:
17+When you search a partial @p (or use wildcards), it will show you the spawned/owned ships which match your search.
18+
19+- **Sigil Search**:
20+You can use a visual interface to enter sigils, either just general shapes, or specific shape/pattern combos
21+
22+- **Sky Chart**:
23+ Astrolabe integrates with %pals to highlight your pals on the sky chart. Clicking/tapping on a point opens a small modal with basic info and a button to take you to a Ship View of the point.
24+
25+- **Ship View**:
26+Summary view for any ship. As on urbit.live or urbit.me, it shows the @p, owner, parent, etc. Allows PNG or SVG download of sigils. Displays tags from %pals, and potentially allows you to add pals and/or edit tags from that screen.
27+
28+
29+
30+Astrolabe integrates with pals wherever possible, and contains documentation to explain the many quirks of Urbit address space to a new user.
content/applications/~mister-dister-dozzod-dozzod/terminal.mdnew file+14
@@ -0,0 +1,14 @@
1++++
2+title = "Terminal"
3+developer = "Tlon"
4+shortcode = "~mister-dister-dozzod-dozzod/webterm"
5+description = "A web interface to your Urbit's command line."
6+license = "MIT"
7+website = "https://tlon.io"
8+bgColor = "#324246"
9++++
10+
11+
12+Terminal is a command line interface for your urbit. You can run commands, script, and program your Urbit directly, even if your urbit is located on a remote server. Discover the gratification of programming a computer that is truly yours.
13+
14+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/terminal.png)
content/applications/~nocsyx-lassul/silo.md+1
@@ -5,6 +5,7 @@ license = "MIT"
55image = ""
66bgColor = "#4f46e5"
77developer = "~nocsyx-lassul"
8+description = "An S3 storage manager"
89website = "https://github.com/arthyn/silo"
910+++
1011
content/applications/~nodmyn-dosrux/houston.md+5−1
@@ -6,8 +6,12 @@ image = "https://0x0.st/ojrj.png"
66bgColor = "#FFFFFF"
77developer = "~nodmyn-dosrux"
88website = "https://github.com/assemblycapital/houston"
9+description = "Moon Management Dashboard"
910+++
1011
11−Moon Management Dashboard
12+### Moon Management Dashboard
13+
14+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/houston.png)
1215
1316Keeps track of the moons you've spawned and exposes a poke API for the standard moon utilities: `|moon`, `|moon-breach` and `|moon-cycle`
17+
content/applications/~norsyr-torryn/canvas.md+18−1
@@ -6,7 +6,24 @@ image = "https://yosoyubik.fra1.digitaloceanspaces.com/canvas/tile.svg"
66bgColor = "#3787B9"
77developer = "~norsyr-torryn"
88website = "https://github.com/yosoyubik/canvas"
9+description = "Collaborative Pixel Art"
910+++
1011
11−Collaborative Pixel Art
12+### Collaborative Pixel Art
1213
14+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/canvas.png)
15+
16+#### Features
17+- Each stroke is stored automatically on your Urbit.
18+- Export Canvas Images as SVG.
19+- Image files are stored on S3 Storage, if configured.
20+- Allows creation of public or private canvases.
21+- Others can join a public canvas and work collaboratively in a cool art project.
22+
23+#### Access
24+Search for ~dister-norsyr-torryn in Grid to find the Canvas app, and install it from there
25+
26+A public canvas is hosted at: ~picsel-norsyr-torryn/public
27+
28+
29+Come and join the group to share your creations and see what others are doing: ~norsyr-torryn/canvas
content/applications/~paldev/face.md+4
@@ -7,3 +7,7 @@ license = "MIT"
77website = "https://pal.dev/suite/face"
88bgColor = "#3b5998"
99+++
10+
11+see your friends
12+
13+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/face.png)
content/applications/~paldev/fafa.md+5
@@ -7,3 +7,8 @@ license = "MIT"
77website = "https://pal.dev/suite/fafa"
88bgColor = "#1a1a2a"
99+++
10+
11+
12+2fa otp authenticator app
13+
14+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/fafa.png)
content/applications/~paldev/pals.md+4
@@ -7,3 +7,7 @@ license = "MIT"
77website = "https://pal.dev/suite/pals"
88bgColor = "#99D3BD"
99+++
10+
11+friendlist for peer discovery
12+
13+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/pals.png)
content/applications/~paldev/picture.md+4
@@ -7,3 +7,7 @@ license = "MIT"
77website = "https://pal.dev/suite/picture"
88bgColor = "#DDDDDD"
99+++
10+
11+a picture frame for the garden
12+
13+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/picture.png)
content/applications/~paldev/rumors.md+4
@@ -7,3 +7,7 @@ license = "MIT"
77website = "https://pal.dev/suite/rumors"
88bgColor = "#bb77dd"
99+++
10+
11+anonymous gossip from friends of friends
12+
13+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/rumors.png)
content/applications/~paldev/verse.md+4
@@ -7,3 +7,7 @@ license = "MIT"
77website = "https://pal.dev/suite/verse"
88bgColor = "#EEEEDD"
99+++
10+
11+a random Bible verse, every day
12+
13+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/verse.png)
content/applications/~pocwet/docs.md+7
@@ -8,3 +8,10 @@ website = "https://github.com/tinnus-napbus/docs-app"
88bgColor = "#FBCF44"
99image = "https://m.tinnus-napbus.xyz/pub/books.svg"
1010+++
11+
12+
13+Docs is an Urbit app for documenting other Urbit apps - it finds docs in other desks and displays them for users and deveopers to browse.
14+
15+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/docs.png)
16+
17+The docs folder contains the source of the app, and the docs-dev folder contains the files necessary for including docs in your app. Note that the files in docs-dev are symlinked, so the'll need to be copied with cp -rL or equivalent.
content/applications/~ribben-donnyl/funes-notes.md+3−1
@@ -6,8 +6,10 @@ image = "https://is4-ssl.mzstatic.com/image/thumb/Purple112/v4/64/64/8b/64648bfc
66bgColor = ""
77developer = "~ribben-donnyl"
88website = "https://funes.app"
9+description = "Mobile notetaking application using urbit as a back-end."
910+++
1011
11−Mobile notetaking application [available for iOS](https://apps.apple.com/us/app/funes-notes/id1627315560), using urbit's `%graph-store` as a backend.
12+Funes Notes is a mobile notetaking application [available for iOS](https://apps.apple.com/us/app/funes-notes/id1627315560), using urbit's `%graph-store` as a backend.
13+
1214
1315Initial development funded by the Urbit Foundation via [Urbit Notes](https://urbit.org/grants/urbit-notes) proposal grant.
content/applications/~sitden-sonnet/channel.md+1
@@ -6,6 +6,7 @@ image = "https://s3.us-east-1.amazonaws.com/haddefsigwen1/reciprocal/2022.7.09..
66bgColor = "#000000"
77developer = "Quartus Co., Reciprocal Ltd."
88website = "https://reciprocal.ltd"
9+description = "A distributed imageboard platform, with love"
910+++
1011
1112### An imageboard platform, with love
content/applications/~tirrel/studio.mdnew file+21
@@ -0,0 +1,21 @@
1++++
2+title = "Studio"
3+shortcode = "~tirrel/studio"
4+license = "MIT"
5+image = "https://tirrel.io/assets/stool.svg"
6+bgColor = "rgb(160, 226, 167)"
7+developer = "Tirrel Corp."
8+website = "https://tirrel.io"
9+description = "Tools for making money."
10++++
11+
12+### Studio is a publishing tool for Urbit
13+
14+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/studio.png)
15+
16+Need a personal website, fast? Studio can set one up in under a minute. For writers, Studio connects you with your legacy-web audience, even if they’re not on Urbit yet. With a click, you can share your newsletter or blog via auto-generated blog or email distribution list
17+
18+Studio pulls content from your Groups notebooks. Notebooks from any group you own will appear.
19+
20+If you need any help, we’re always available in our group: ~tirrel/tirrel-support
21+
content/blog/creating-sigils.md+6−6
@@ -33,37 +33,37 @@ What are the basic primitives of a visual language? There aren’t any completel
3333
3434So we started by collecting influences.
3535
36−<iframe class="arena-iframe" width="100%" src="https://www.are.na/tlon/seal-zp3irwad52y/embed"></iframe>
36+{% iframe src="https://www.are.na/tlon/seal-zp3irwad52y/embed" className="arena-iframe" width="100%" /%}
3737
3838The ‘chop’ or [seal](<https://en.wikipedia.org/wiki/Seal_(East_Asia)>) is conceptually pretty close to what we wanted to get to.
3939
4040<br /><br />
4141
42−<iframe class="arena-iframe" width="100%" src="https://www.are.na/tlon/kamon/embed"></iframe>
42+{% iframe className="arena-iframe" src="https://www.are.na/tlon/kamon/embed" width="100%" /%}
4343
4444[Kamon](<https://en.wikipedia.org/wiki/Mon_(emblem)>) are even closer — especially since they have very little visual complexity.
4545
4646<br /><br />
4747
48−<iframe class="arena-iframe" width="100%" src="https://www.are.na/tlon/grids-jd_xbmspxkm/embed"></iframe>
48+{% iframe className="arena-iframe" src="https://www.are.na/tlon/grids-jd_xbmspxkm/embed" width="100%" /%}
4949
5050We also spent a good amount of time with both Anni Albers and Agnes Martin. Both of these painters had an incredible mastery of the grid as a means of creating engaging visual work. These paintings all have a wonderful tension between an underlying system and their specific expression.
5151
5252<br /><br />
5353
54−<iframe class="arena-iframe" width="100%" src="https://www.are.na/tlon/stella-xfroicotm_4/embed"></iframe>
54+{% iframe className="arena-iframe" src="https://www.are.na/tlon/stella-xfroicotm_4/embed" width="100%" /%}
5555
5656Frank Stella is a master at producing incredibly dynamic work from only a few elements. His ability to create a sense of depth from simple overlapping elements is fantastic.
5757
5858<br /><br />
5959
60−<iframe class="arena-iframe" width="100%" src="https://www.are.na/tlon/ledoux-palladio/embed"></iframe>
60+{% iframe className="arena-iframe" src="https://www.are.na/tlon/ledoux-palladio/embed" width="100%" /%}
6161
6262The plans of both Ledoux and Palladio are incredibly dynamic. They’re mostly gridded, use only a few elements, and use lots of symmetry — but they’re at once distinct, engaging, and fresh.
6363
6464<br /><br />
6565
66−<iframe class="arena-iframe" width="100%" src="https://www.are.na/tlon/flags-k9moxiayuvq/embed"></iframe>
66+{% iframe className="arena-iframe" src="https://www.are.na/tlon/flags-k9moxiayuvq/embed" width="100%" /%}
6767
6868Another influence: international maritime signal flags. We like these not only because of their striking visual qualities, but also because they correspond with a letter system, just like our sigils. Each one conveys useful information; for example, “Keep clear of me; I am maneuvering with difficulty,” a flag we all feel like raising from time to time. This influence was key to the idea that pairing symbol to phoneme was a possibility.
6969
content/ecosystem/spotlight/july-2022.mdnew file+44
@@ -0,0 +1,44 @@
1++++
2+title = "July 2022"
3+date = "2022-07-27"
4+
5+[featured-1]
6+title = "Software as Soulcraft and the Metaphysics of Engineering with Neal Davis"
7+description = "Professor Neal Davis Discusses why Urbit computers have souls, Shinto philosophy, and more"
8+image=""
9+content = """
10+Urbit Foundation’s Technical Director Neal Davis discusses the philosophy of development on Urbit in a wide ranging conversation that covers everything from the spirit of objects and why it’s not obvious that nuclear fusion would be of benefit to mankind.
11+
12+{% iframe height="220" src="https://www.youtube.com/embed/8f8vk1BhlDo" title="YouTube video player" width="100%" /%}
13+
14+
15+"""
16+
17+[featured-2]
18+title = "Studio"
19+description = "Need a personal website, fast? Studio can set one up in under a minute."
20+content = """
21+Studio is an application from [Tirrel](/organizations/tirrel) which enables Urbit users to turn a Groups notebook into a public blog with just a few clicks.
22+
23+One can enable comments, multiple templates, and even integrate with Sendgrid to send new posts as email updates.
24+
25+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/applications/studio.png)
26+
27+
28+Tirrel has announced on their blog that Studio’s next release will include USD payments integration, allowing individuals to use Urbit to make a storefront and accept USD.
29+
30+While most Urbit applications are focused on activity within the Urbit universe, Studio is unique in its focus on connecting the fiat and clearweb worlds to Urbit.
31+
32+"""
33+
34+[featured-3]
35+title = "The Mars Review of Books"
36+description = "The Mars Review of Books is a magazine in print and on Urbit covering both contemporary arts and culture as well as global sociopolitical issues."
37+content = """
38+
39+The Mars Review of Books is the first literary publication hosted on Urbit. Its inaugural issue includes an article on nuclear fusion from Urbit Foundation's [Neal Davis](https://urbit.org/ids/~lagrev-nocfep), book reviews from writer and man-about-town [Christian Lorentzen](https://twitter.com/xlorentzen), and reflections on millennial romance from Twitter personality [Default Friend](https://twitter.com/default_friend). The MRB can be purchased in [physical form](https://store.marsreview.org) or [read online](https://marsreview.org).
40+
41+![Mars Review in Print](https://storage.googleapis.com/media.urbit.org/site/ecosystem/spotlight/marsreview-issue1.jpg)
42+
43+"""
44++++
content/events/2022-07-28-urbit-meetup-milano-22.md+1
@@ -8,6 +8,7 @@ image = "https://flawless.life/wp-content/uploads/2020/02/Lubar_milano_07.jpg"
88registration_url = "https://www.meetup.com/urbit-sf/events/287394327/"
99description = "Urbit Meetup Milano"
1010dark = true
11+darken_image = "true"
1112
1213[[hosts]]
1314patp = "~timluc-miptev"
content/marketplaces/azimuth-shop.mdnew file+10
@@ -0,0 +1,10 @@
1++++
2+title = "Azimuth Shop"
3+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/azimuthshop.png"
4+URL = "https://azimuth.shop/"
5+payment = ["ETH"]
6++++
7+
8+Azimuth.shop is a Layer 2 planet marketplace offering planets for sale at extremely competitive prices, accepting ETH for payment.
9+
10+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/azimuth-screenshot.jpg)
content/marketplaces/lanlyd.mdnew file+18
@@ -0,0 +1,18 @@
1++++
2+title = "~lanlyd"
3+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/lanlyd.png"
4+URL = "https://lanlyd.net"
5+payment = ["USD"]
6++++
7+
8+~lanlyd is a star on the Urbit network. Our mission is to bring new users onto the network and provide them with services like packet relays and over-the-air updates. ~lanlyd accepts payment via credit card.
9+
10+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/lanlyd-screenshot.jpg)
11+
12+~lanlyd offers
13+- Planet identities
14+- OTA updates
15+- Packet relays
16+- Bitcoin node
17+- Ship hosting (coming soon)
18+
content/marketplaces/mocbel-house.mdnew file+18
@@ -0,0 +1,18 @@
1++++
2+title = "~mocbel house"
3+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/mocbelhouse.png"
4+URL = "https://mocbel.house/"
5+payment = ["ETH","BTC","ADA"]
6++++
7+
8+~mocbel house is a layer 2 planet marketplace, accepting BTC, ETH, and ADA.
9+
10+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/mocbelhouse-screenshot.jpg)
11+
12+Planets under ~mocbel house come with the following:
13+
14+- Optional set-up support to initialize your planet (via call or messaging)
15+- Direct technical support upon request
16+- 99.9% Star uptime (~mocbel currently runs on a Digital Ocean instance and is monitored regularly; however, some events beyond our control may cause brief downtime)
17+- Good sponsor repuation on the Urbit Network
18+- If you have any questions, hit us up at info@mocbel.house or [~polrel-witter](~polrel-witter) on the network.
content/marketplaces/networked-subject.mdnew file+13
@@ -0,0 +1,13 @@
1++++
2+title = "networked subject_"
3+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/subject.network.png"
4+URL = "https://subject.network/buy/"
5+payment = ["BTC"]
6++++
7+
8+Networked Subject is an independent, boutique Urbit star service, planet market and a collection of Urbit information and tutorials.
9+
10+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/networksubject-screenshot.jpg)
11+
12+
13+Networked subject also has public group on Urbit: [~matwet/networked-subject](https://urbit.org/groups/~matwet/networked-subject).
content/marketplaces/opensea.mdnew file+17
@@ -0,0 +1,17 @@
1++++
2+title = "OpenSea"
3+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/opensea.png"
4+URL = "https://opensea.io/category/urbit-id"
5+payment = ["ETH"]
6++++
7+
8+Opensea is the world's largest market for NFTs.
9+
10+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/opensea-screenshot.jpg)
11+
12+
13+Check out planets for sale: https://opensea.io/collection/urbit-id-planet
14+
15+Check out stars for sale: https://opensea.io/collection/urbit-id-sta
16+
17+Explore galaxies: https://opensea.io/collection/urbit-id-galaxy
content/marketplaces/planet-market.mdnew file+25
@@ -0,0 +1,25 @@
1++++
2+title = "Planet Market"
3+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/planet.market.png"
4+URL = "https://planet.market"
5+payment = ["USD"]
6++++
7+
8+### The easiest way to get on Urbit.
9+
10+First, you get a planet with a unique name and sigil. Then, we give you the support you need to get up and running.
11+
12+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/planetmarket-screenshot.jpg)
13+
14+Every Planet purchase comes with:
15+
16+**Networking keys.**
17+We deliver your Planet’s networking keys via email. Take care to custody these safely! We cannot recover them for you.
18+
19+**Personal Onboarding.**
20+Schedule an onboarding call with us for installation help and a tour of Urbit’s userspace.
21+
22+**Technical support.**
23+Once you’re up and running on the network, you can access our support group where our support team is available to help.
24+
25+Planet Market accepts payment by credit card.
content/marketplaces/urbit-live.mdnew file+12
@@ -0,0 +1,12 @@
1++++
2+title = "Urbit.live"
3+image = "https://urbit.live/static/media/urbit-live-logo-png-400.6ec9a92b.png"
4+URL = "https://urbit.live"
5+payment = ["ETH"]
6++++
7+
8+Urbit.live is Urbit’s largest planet exchange and first network explorer, selling Layer 1 planets and stars for ETH.
9+
10+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/urbitlive-screenshot.jpg)
11+
12+Follow Urbit.live on twitter https://twitter.com/urbitlive
content/marketplaces/urbitex.mdnew file+10
@@ -0,0 +1,10 @@
1++++
2+title = "Urbitex"
3+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/urbitex-logo.png"
4+URL = "https://urbitex.io"
5+payment = ["ETH"]
6++++
7+
8+Urbitex is an automated marketplace and network explorer for Urbit address space. Users can buy and sell planets, stars, and galaxies using a Web3 wallet, and search the network to find information about any Urbit ship.
9+
10+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/urbitex-screenshot.jpg)
content/marketplaces/urbitme.mdnew file+10
@@ -0,0 +1,10 @@
1++++
2+title = "Urbit.me"
3+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/urbitme.png"
4+URL = "https://urbit.me"
5+payment = ["ETH"]
6++++
7+
8+Urbit.me offers planets with rare sigils.
9+
10+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/urbitme-screenshot.jpg)
content/marketplaces/wexpert-systems.mdnew file+12
@@ -0,0 +1,12 @@
1++++
2+title = "Wexpert.systems"
3+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/wexpertsystems.png"
4+URL = "https://wexpert.systems"
5+payment = ["BTC"]
6++++
7+
8+Wexpert Systems is an Urbit software and services company which offers full-service premium Urbit hosting on physical servers, with minimal dependence on Big Tech cloud services.
9+
10+Wexpert Systems sells Urbit planets to the public and offers bespoke hosting for stars and galaxies and their moons.
11+
12+![Screenshot](https://storage.googleapis.com/media.urbit.org/site/ecosystem/marketplaces/wexpert-screenshot.jpg)
content/media/blockchannel-episode-19-virtual-land-in-the-clouds-with-urbit.mddeleted−14
@@ -1,14 +0,0 @@
1−+++
2−title = "Episode 19: Virtual Land in the Clouds, with Urbit"
3−date = "2017-04-15"
4−description = "Galen and Curtis talk Urbit on the BlockChannel podcast."
5−
6−[extra]
7−author = "Galen Wolfe-Pauly + Curtis Yarvin"
8−ship = "~ravmel-ropdyl + ~sorreg-namtyv"
9−soundcloud = "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/318017856&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true"
10−+++
11−
12−{{ soundcloud(url="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/318017856&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true") }}
13−
14−[Episode 19: Virtual Land in the Clouds, with Urbit](https://medium.com/blockchannel/episode-19-virtual-land-in-the-clouds-with-urbit-1428ba98243a)
content/media/blueprint-2017-galen-wolfe-pauly-on-the-distributed-web.mddeleted−15
@@ -1,15 +0,0 @@
1−+++
2−title = "Blueprint 2017 Talks: Galen Wolfe-Pauly on the Distributed Web"
3−date = "2017-11-19"
4−description = "Galen presents to IDEO on Urbit and decentralized systems."
5−aliases = [
6− "/posts/blueprint-2017-galen-wolfe-pauly-on-the-distributed-web/"
7−]
8−
9−[extra]
10−author = "Galen Wolfe-Pauly"
11−ship = "~ravmel-ropdyl"
12−youtube = "9cXTGW9J9a0"
13−+++
14−
15−[Blueprint 2017 Talks: Galen Wolfe-Pauly on the Distributed Web](https://www.youtube.com/watch?v=9cXTGW9J9a0)
content/media/epicenter-episode-205-urbit-a-digital-republic-reinventing-the-internet.mddeleted−15
@@ -1,15 +0,0 @@
1−+++
2−title = "Epicenter #205: Urbit – A Digital Republic Reinventing the Internet"
3−date = "2017-10-17"
4−description = "Galen discusses Urbit with Brian Fabian Crain and Meher Roy on the Epicenter podcast."
5−aliases = [
6− "/posts/epicenter-episode-205-urbit-a-digital-republic-reinventing-the-internet/"
7−]
8−
9−[extra]
10−author = "Galen Wolfe-Pauly"
11−ship = "~ravmel-ropdyl"
12−youtube = "DFeN-TKZor0"
13−+++
14−
15−[\#205 Galen Wolfe-Pauly: Urbit - A Digital Republic Reinventing the Internet](https://epicenter.tv/episode/205/)
content/media/governing-the-future-e09-urbit-a-user-owned-internet-on-top-of-the-internet.mddeleted−16
@@ -1,16 +0,0 @@
1−+++
2−title = "Governing the Future E09: Urbit – A User Owned Internet on top of the Internet"
3−date = "2017-08-09"
4−description = "Galen talks with Hampus Jakobsson about Urbit on the Governing the Future podcast."
5−aliases = [
6− "/posts/governing-the-future-e09-urbit-a-user-owned-internet-on-top-of-the-internet/"
7−]
8−
9−[extra]
10−author = "Galen Wolfe-Pauly"
11−ship = "~ravmel-ropdyl"
12−+++
13−
14−> What happens when users get to control a piece of the internet. What does this browser of servers mean when we can use own client and still communicate? Can we create a new Internet owned by the people, an internet designed like a city by an architect and not only engineers?
15−
16−[E09: Galen Wolfe-Pauly, Urbit - a user owned internet on top of the internet](http://podcast.hajak.se/104117/548011-e09-galen-wolfe-pauly-urbit-a-user-owned-internet-on-top-of-the-internet)
content/media/lambdaconf-2016-curtis-yarvin-urbit-a-clean-slate-functional-operating-stack.mddeleted−15
@@ -1,15 +0,0 @@
1−+++
2−title = "LambdaConf 2016: Curtis Yarvin - Urbit: A Clean Slate Functional Operating Stack"
3−date = "2016-09-27"
4−description = "Curtis presents a comprehensive technical overview of Urbit at LambdaConf 2016."
5−aliases = [
6− "/posts/lambdaconf-2016-curtis-yarvin-urbit-a-clean-slate-functional-operating-stack/"
7−]
8−
9−[extra]
10−author = "Curtis Yarvin"
11−ship = "~sorreg-namtyv"
12−youtube = "bTisf4oxIFo"
13−+++
14−
15−[Curtis Yarvin: Urbit- A Clean Slate Functional Operating Stack - λC 2016](https://www.youtube.com/watch?v=bTisf4oxIFo)
content/media/lambdaconf-2018-ted-blackman-ford-urbits-build-system.mddeleted−15
@@ -1,15 +0,0 @@
1−+++
2−title = "LambdaConf 2018: Ted Blackman - Ford: Urbit's Build System"
3−date = "2018-12-19"
4−description = "Ted presents a technical overview of Ford, Urbit's build system, at LambdaConf 2018."
5−aliases = [
6− "/posts/lambdaconf-2018-ted-blackman-ford-urbits-build-system/"
7−]
8−
9−[extra]
10−author = "Ted Blackman"
11−ship = "~rovnys-ricfer"
12−youtube = "5ZAFEylHdiU"
13−+++
14−
15−[Ted Blackman Ford - Urbit's Build System - λC 2018](https://www.youtube.com/watch?v=5ZAFEylHdiU)
content/media/on-the-brink-castle-island.mddeleted−14
@@ -1,14 +0,0 @@
1−+++
2−title = "On The Brink with Castle Island - Episode 17"
3−description = "Christian Langalis and Logan Allen discuss Urbit with Nic Carter: its mutual benefits with Bitcoin, and why a complete rewrite of Unix and the computing stack is necessary."
4−date = "2019-11-10"
5−
6−[extra]
7−author = "Christian Langalis + Logan Allen"
8−ship = "~pindet-timmut + ~tacryt-socryp"
9−libsyn = "https://html5-player.libsyn.com/embed/episode/id/11959088/height/90/theme/custom/thumbnail/yes/direction/forward/render-playlist/no/custom-color/000000/"
10−+++
11−
12−"Christian Langalis and Logan Allen from Tlon join the show to discuss Urbit, the ambitious and somewhat mysterious computing project that they work on. We discuss how Bitcoin and Urbit could be mutually beneficial, how Urbit might free us from the tyrannical tech oligopolies, and why a from-scratch rewrite of Unix and the computing stack is necessary."
13−
14−<iframe style="border: none" src="//html5-player.libsyn.com/embed/episode/id/11959088/height/90/theme/custom/thumbnail/yes/direction/forward/render-playlist/no/custom-color/000000/" height="90" width="100%" scrolling="no" allowfullscreen webkitallowfullscreen mozallowfullscreen oallowfullscreen msallowfullscreen></iframe>
content/media/the-ether-review-46-curtis-yarvin-and-galen-wolfe-pauly-on-urbit.mddeleted−15
@@ -1,15 +0,0 @@
1−+++
2−title = "The Ether Review #46: Curtis Yarvin & Galen Wolfe-Pauly on Urbit"
3−date = "2016-10-23"
4−description = "Curtis and Galen talk about Urbit on The Ether Review podcast."
5−aliases = [
6− "/posts/the-ether-review-46-curtis-yarvin-and-galen-wolfe-pauly-on-urbit/"
7−]
8−
9−[extra]
10−author = "Curtis Yarvin + Galen Wolfe-Pauly"
11−ship = "~sorreg-namtyv + ~ravmel-ropdyl"
12−soundcloud = "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/289783332&color=%23000000&auto_play=false&hide_related=true&show_comments=false&show_user=true&show_reposts=false&show_teaser=false&visual=true"
13−+++
14−
15−[The Ether Review \#46 - Curtis Yarvin & Galen Wolfe-Pauly on Urbit](https://soundcloud.com/arthurfalls/the-ether-review-46-smoking-dmt-with-mencius-moldbug)
content/media/urbit-and-the-not-so-dark-future-of-the-internet.mddeleted−11
@@ -1,11 +0,0 @@
1−+++
2−title = "Urbit and the Not-So-Dark Future of the Internet"
3−date = "2017-04-11"
4−description = "Isaac Simpson's high-level introduction to Urbit."
5−aliases = [ "/posts/urbit-and-the-not-so-dark-future-of-the-internet/" ]
6−
7−[extra]
8−author = "Isaac Simpson"
9−+++
10−
11−[Urbit and the Not-So-Dark Future of the Internet](https://medium.com/vandal-press/urbit-and-the-not-so-dark-future-of-the-internet-400c9b667e2)
content/media/what-is-urbit.mddeleted−10
@@ -1,10 +0,0 @@
1−+++
2−title = "What is Urbit?"
3−date = "2017-05-14"
4−description = "A quick video explainer of how Urbit works."
5−
6−[extra]
7−youtube = "M04AKTCDavc"
8−+++
9−
10−[What is Urbit?](https://www.youtube.com/watch?v=M04AKTCDavc)
content/organizations/holium.mdnew file+8
@@ -0,0 +1,8 @@
1++++
2+title = "Holium"
3+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/holium.png"
4+URL = "https://holium.com"
5+ships = ["~livdel-binmun-lomder-librun", "~lomder-librun"]
6++++
7+
8+Holium'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/mars-review-of-books.mdnew file+17
@@ -0,0 +1,17 @@
1++++
2+title = "The Mars Review of Books"
3+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/marsreview.jpg"
4+URL = "https://store.marsreview.org"
5+ships = []
6++++
7+
8+
9+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.
10+
11+Inspired by the early New York Review of Books, which was launched in protest against limp and toneless book reviewing in the Times Book Review, the MRB takes as its thesis that many topics and artistic productions which are important and stimulating to know about are ignored by today’s legacy publications. A new magazine that brings these topics to light will also create the conditions for the intellectual milieu that serious people and dedicated artists wish to see thrive.
12+
13+
14+The digital version MRB is hosted on Urbit on the ~bidbel star, which is also the home of The Machine War, a work-in-progress book on Urbit and the history of computing, written by Noah Kumin (~librex-dozryc). The book is being re-published on the legacy internet at machinewar.substack.com.
15+
16+
17+The print edition of the Mars Review of Books, published quarterly, can be purchased at store.marsreview.org. It can also be found at select stores in New York City, including Casa Magazines and the famous Mercer Street Books. Past and future contributors include Christian Lorentzen, William M. Briggs, Katia Dee (Default Friend), Carlos Dengler, Matthew Gasda, N. E. Davis, Anika Jade Levy, Philip Galebach, Matilda Lin Berke, Reid Scoggin, Tess Crain, Justin Murphy, and Tao Lin.
content/organizations/reciprocal.mdnew file+12
@@ -0,0 +1,12 @@
1++++
2+title = "Reciprocal Ltd."
3+image = "https://s3.us-east-1.amazonaws.com/haddefsigwen1/reciprocal/2022.5.20..19.52.50-B137D4AA-DA9E-4B07-98CE-C001C576C7CA_1_201_a.jpeg"
4+URL = "https://reciprocal.ltd"
5+ships = ["~sitden-sonnet", "~haddef-sigwen"]
6++++
7+
8+### Reciprocal Ltd. is an interactive design and development studio.
9+
10+They serve as full-service design and development consultancy for external partners and internally develop experimental applications, artwork, and interactive media.
11+
12+Members include [~haddef-sigwen](https://urbit.org/ids/~haddef-sigwen), [~libbyl-lonsyd](https://urbit.org/ids/~libbyl-lonsyd), and [~wolfer-witryx](https://urbit.org/ids/~wolfer-witryx).
content/organizations/third-earth.mdnew file+8
@@ -0,0 +1,8 @@
1++++
2+title = "Third.Earth"
3+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/thirdearth.png"
4+URL = "https://third.earth"
5+ships = ["~botwet"]
6++++
7+
8+Third.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.mdnew file+10
@@ -0,0 +1,10 @@
1++++
2+title = "Tirrel Corporation"
3+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/Tirrel%20Corp%20Logo.png"
4+URL = "https://tirrel.io"
5+ships = ["~tirrel"]
6++++
7+
8+### Tirrel Corporation is an Urbit product studio.
9+
10+Tirrel's main products are Studio, a website-hosting app, and [Planet Market](https://planet.market), an Urbit onboarding service. Tirrel also offers market services for Urbit address space including OTC, and a trading forum. Additionally, Tirrel collaborates with the Urbit Foundation and Uqbar on a variety of R&D.
content/organizations/tlon.mdnew file+10
@@ -0,0 +1,10 @@
1++++
2+title = "Tlon"
3+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/tlon.png"
4+URL = "https://tlon.io"
5+ships = ["~mister-dister-dozzod-dozzod", "~lander-dister-dozzod-dozzod"]
6++++
7+
8+[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.
9+
10+Your urbit currently comes preloaded with Landscape and several Tlon apps that sustain essential and [meaningful community interaction](https://urbit.org/blog/convivial-networks). These apps include Groups, a communication and publication tool, and Terminal, a command line interface for managing your self-hosted urbit.
content/organizations/uqbar.mdnew file+8
@@ -0,0 +1,8 @@
1++++
2+title = "Uqbar"
3+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/uqbar.png"
4+URL = "https://uqbar.network"
5+ships = ["~dister-fabnev-hinmur", "~hocwyn-tipwex"]
6++++
7+
8+Uqbar is a one-stop coding environment that makes writing and deploying smart contracts simple, efficient, and secure.
content/organizations/urbit-foundation.mdnew file+10
@@ -0,0 +1,10 @@
1++++
2+title = "Urbit Foundation"
3+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/urbit-foundation.png"
4+URL = "https://urbit.org"
5+ships = ["~lapdeg"]
6++++
7+
8+Urbit Foundation is a non-profit organization whose mission is to ensure Urbit's success as a technology.
9+
10+The UF maintains urbit.org, runs software development courses like [Hoon School Live](https://developers.urbit.org/courses), organizes events like [Assembly](https://assembly.urbit.org), and allocates [grants](/grants) to motivated individuals and organizations building on Urbit.
content/podcasts/2018-11-18_a-digital-republic.mdnew file+19
@@ -0,0 +1,19 @@
1++++
2+title = "Urbit – A Digital Republic Reinventing the Internet"
3+podcast = "Epicenter"
4+date = "2018-11-18"
5+URL = "https://epicenter.tv/episodes/205/"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/epicenter.jpg"
7++++
8+
9+Galen Wolfe-Pauly, CEO of Tlon, the company behind Urbit, joined us to discuss one of the most radical and curious projects to come on the podcast. In development for 15 years already, Urbit aims to unravel the cloud computing paradigm that led to the creation of internet monopolies like Google and Facebook. Instead, in Urbit, each person has a personal server, a kind of digital sovereign entity, where applications are run, which leaves control and data in the hands of users.
10+
11+Galen joined us to discuss what the philosophy and ideas driving Urbit, how a radically different internet could look like and what our path is to get there.
12+
13+Topics discussed in this episode:
14+- The 15 year long history and evolution of Urbit
15+- Understanding Urbit through the metaphors of a personal server, a personal blockchain, a republic or an operating function
16+- The main Urbit components Nock, Hoon and Arvo
17+- How Galaxies, Stars and Planets create Urbit's hierarchy
18+- The Urbit namespace and why it has value
19+- How Urbit aims to radically reengineer how the internet works
content/podcasts/2019-11-11_urbit.mdnew file+9
@@ -0,0 +1,9 @@
1++++
2+title = "Urbit (Christian Langalis and Logan Allen) (EP.17)"
3+podcast = "On The Brink with Castle Island"
4+date = "2019-11-11"
5+URL = "https://castleisland.libsyn.com/urbit-christian-lingales-and-logan-allen-ep17"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/onthebrink.jpg"
7++++
8+
9+Christian Langalis and Logan Allen from Tlon join the show to discuss Urbit, the ambitious and somewhat mysterious computing project that they work on. We discuss how Bitcoin and Urbit could be mutually beneficial, how Urbit might free us from the tyrannical tech oligopolies, and why a from-scratch rewrite of Unix and the computing stack is necessary.
content/podcasts/2020-03-23_a-new-computing-platform.mdnew file+17
@@ -0,0 +1,17 @@
1++++
2+title = "A New Computing Platform"
3+podcast = "Understanding Urbit"
4+date = "2020-03-23"
5+URL = "https://podcasts.apple.com/us/podcast/a-new-computing-platform/id1504188804?i=1000469310964"
6+image = "https://media.urbit.org/site/posts/essays/uu-podcast.png"
7++++
8+
9+Few software projects today share either the contemporary relevance or fringe mystique of the Urbit Operating and Identity System. As a highly secure personal server, Urbit aims to deliver on many of the ideas pioneered by the Cypherpunks, and, after nearly 20 years in development the platform has begun a phased launch. Urbit gives us persistent digital identity, a new benchmark for secure computing, and maybe even an open source response to more modern social computing platforms like WeChat and Kakaotalk.
10+
11+In February of this year, Tlon, the main company developing Urbit, invited me to their San Francisco office to interview the team for a podcast series. During the three weeks I was there we recorded many hours of discussion.
12+
13+This series is a collage of excerpts from those discussions. The episodes aim to introduce the philosophy of Urbit, establish the problems it is designed to address, explain the way the platform works, and relate it to the world through the lens of Bitcoin, Software as a Service, and the growth model of Silicon Valley startups.
14+
15+We begin our journey with Urbit veteran Galen Wolfe-Pauley who introduces the project and its design principles while reflecting on the collective Stockholm syndrome we suffer in the grasp of existing computing models.
16+
17+
content/podcasts/2020-03-23_technology-and-freedom.mdnew file+18
@@ -0,0 +1,18 @@
1++++
2+title = "Technology & Freedom"
3+podcast = "Understanding Urbit"
4+date = "2020-03-23"
5+URL = "https://podcasts.apple.com/us/podcast/technology-freedom/id1504188804?i=1000469310961"
6+image = "https://media.urbit.org/site/posts/essays/uu-podcast.png"
7++++
8+
9+The effect technology has on individual freedom is a recurring theme in lunchtime discussions in the Tlon office. Chief Product Officer, Anthony Arroyo has a background in linguistics and the philosophy of technology. This positions him well to explain the nature of this relationship and how Urbit positions itself between the two.
10+
11+Anthony offered the key insight that today computers have evolved from their nature as tools into mechanical colonizers of our lives. More than just absorbing our attention, the online services advertising greater human connection are in reality limiting the way we relate to one another to a centrally defined mode of interaction. This extends to the way we consume news, poisoning the well of information and leading to a toxic mass social environment.
12+
13+He offers Urbit as a solution that allows the user to determine their mode of interaction, and the scale of their social graph, rather than a graph that is global by default.
14+
15+Anthony also introduces three characteristics of a virtual tool that are needed for it to conform to our expectations of physical tools. He describes those characteristics as simple, durable, and yours.
16+
17+Finally, we learn about Urbit’s decrementing versioning system and the benefit of software that evolves toward stability.
18+
content/podcasts/2020-03-23_under-the-hood.mdnew file+15
@@ -0,0 +1,15 @@
1++++
2+title = "Under the Hood of the Urbit OS"
3+podcast = "Understanding Urbit"
4+date = "2020-03-23"
5+URL = "https://podcasts.apple.com/us/podcast/under-the-hood-of-the-urbit-os/id1504188804?i=1000469310962"
6+image = "https://media.urbit.org/site/posts/essays/uu-podcast.png"
7++++
8+
9+Engineer Ted Blackman works on the Urbit OS kernel. Like many Tlon employees, Ted initially came to the project as an open source contributor. In this discussion Ted breaks the operating system down into its components and explains its relationship to Urbit ID which we will cover in-depth in episode 4.
10+
11+Ted begins by helping us establish a foundational understanding of what an operating system is and what roles traditional OSs excel in. Then he explores how Urbit functions as a layer above, creating a unique environment for applications to run within.
12+
13+A major question raised by the first half of this discussion, and which many Urbit enthusiasts will already have in the back of their minds is how can such a minimalist, universal operating system take advantage of the task specific performance benefits some CPUs offer? The answer lies in a unique Urbit innovation called Jets. In understanding Jets we can grasp the inherent performance limitations of an operating system like Urbit, and understand how those limitations can be overcome.
14+
15+Ted has a talent for making the complex understandable, so while this is a very advanced episode, even a non-technical person will find this discussion educational and entertaining.
content/podcasts/2020-03-24_urbit-id-and-the-network.mdnew file+13
@@ -0,0 +1,13 @@
1++++
2+title = "Urbit ID & the Network"
3+podcast = "Understanding Urbit"
4+date = "2020-03-24"
5+URL = "https://podcasts.apple.com/us/podcast/urbit-id-the-network/id1504188804?i=1000469544396"
6+image = "https://media.urbit.org/site/posts/essays/uu-podcast.png"
7++++
8+
9+As Ted indicated in episode 2, The Urbit ID public key infrastructure and the Urbit network are core to the way individual Urbits communicate and maintain self-sovereignty. In this episode we hear from three members of the Tlon team, each explaining the part of the system they are most familiar with. OS lead Ted returns to introduce the subject.
10+
11+Tlon engineer, Logan, Explains the use experience of Urbit ID, The reason for some of the design choices, and the topography of the Urbit Network.
12+
13+Philip is a resident cryptographer at Tlon focussed on Public Key Infrastructure. He rounds this episode out by explaining what a PKI is, the differences between PKIs, and the way the Urbit ID PKI is implemented.
content/podcasts/2020-03-26_built-to-last.mdnew file+21
@@ -0,0 +1,21 @@
1++++
2+title = "Built to Last"
3+podcast = "Understanding Urbit"
4+date = "2020-03-26"
5+URL = "https://podcasts.apple.com/us/podcast/built-to-last/id1504188804?i=1000469641777"
6+image = "https://media.urbit.org/site/posts/essays/uu-podcast.png"
7++++
8+
9+The recurrent theme of calm computing is explored more deeply in this discussion with Logan Allen whose focus is infrastructure and product at Tlon.
10+
11+Logan sees the attention economy, with all it’s popups and news feed clickbait as a result of the way startups are organised and funded. In between rebukes of VC capital and the growth business model, Logan describes a software landscape where the user is king, extending the views of Christian and Anthony.
12+
13+The only way Logan believes this can be achieved is to create a computing platform with different product design incentives.
14+
15+Part of this picture is a unified tech stack that applications share rather than the bespoke, but very similar, internal tooling built individually by major tech companies like uber, facebook, airbnb and others.
16+
17+For Logan, Urbit addresses this by standardizing a large part of the system stack. As an abstract I/O interface it separates the software and hardware layers in a way that allows applications to be developed for an environment that is consistent across hardware.
18+
19+This makes Urbit a much more efficient way of developing software from a corporate perspective by reducing dev-ops and the size of the layer that security concerns can happen in.
20+
21+One of Logan’s most powerful revelations is that today, system software, linux for example, is deeply complex and growing ever more so and the number of people who understand the way it works is shrinking proportionally to the task of maintaining that software. Designing a new platform that evolves toward stability may be the only way to ensure a secure computing landscape in the future.
content/podcasts/2020-03-26_urbit-and-bitcoin.mdnew file+15
@@ -0,0 +1,15 @@
1++++
2+title = "Urbit and Bitcoin"
3+podcast = "Understanding Urbit"
4+date = "2020-03-26"
5+URL = "https://podcasts.apple.com/us/podcast/urbit-bitcoin/id1504188804?i=1000469633746"
6+image = "https://media.urbit.org/site/posts/essays/uu-podcast.png"
7++++
8+
9+Christian Langalis is the resident bitcoin ambassador to the Urbit team. His motto is sound money requires sound computing and this well describes his role is to develop Bitcoin infrastructure for the Urbit ecosystem.
10+
11+Christian’s interest in Urbit derives from a desire for a sound foundation on which Bitcoin can operate. He makes the argument that for all its potential, bitcoin cannot offer the benefits of sound money (sound being a term that requires specific definition in this case) without a sound computing platform on which to operate. Unix sysadmins have access to this today, but that leaves the future unevenly distributed.
12+
13+More than just a piece of Bitcoin infrastructure, Christian sees Urbit as a response to the shift toward unowned software and data caused the popularity of Software as a Service and content streaming platforms. He also sees the platform as an opportunity for individuals to access the full power of server computing, instead having to rent individual functionalities from subscription based services.
14+
15+Christian views data harvesting, and the pursuit of user attention as deep personal abuses in a way that recalls Galen’s reference to Stockholm Syndrome in episode 1
content/podcasts/2020-04-05_tlon-operations.mdnew file+15
@@ -0,0 +1,15 @@
1++++
2+title = "Tlon Operations & Community"
3+podcast = "Understanding Urbit"
4+date = "2020-04-05"
5+URL = "https://podcasts.apple.com/us/podcast/tlon-operations-community/id1504188804?i=1000469641776"
6+image = "https://media.urbit.org/site/posts/essays/uu-podcast.png"
7++++
8+
9+Tlon COO Erik Newton and Community Manager Kenny Rowe join this session to provide some additional background to Tlon and the Urbit Community.
10+
11+Erik Newton begins by explaining the relationship between the Tlon corporation and the Urbit project. We also discuss the reason behind the valuation of the address space, business opportunities, and plans for the launch of Urbit OS 1.
12+
13+Then Kenny describes the cultural reach of the Urbit aesthetic and how he found himself pulled into the project from his prior employer, Maker. In particular the notion of the Kelvin versioning system evolving toward stability as opposed to complexity, and the power of unique terminology to avoid false cognates.
14+
15+Kenny elaborates on the community on-boarding strategy of Urbit and its suitability for the collaboration needs of DAOs and front end requirements of smart contracts.
content/podcasts/2020-11-24_humane-computing.mdnew file+11
@@ -0,0 +1,11 @@
1++++
2+title = "Palladium Podcast 49: Humane Computing with Urbit"
3+podcast = "Palladium Podcast"
4+date = "2020-11-24"
5+URL = "https://palladiummag.podbean.com/e/palladium-podcast-49-humane-computing-with-urbit/"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/palladiumpodcast.jpeg"
7++++
8+
9+Wolf Tivy and Galen Wolfe-Pauly discuss what's wrong with social media and computing as we know it, as well as a new paradigm for humane computing. Galen is the CEO of Tlon, which runs Urbit, a personal computing server that is designed to give users personal control over their data on social networks and other applications.
10+
11+The first half of the show is available to all our listeners. The full discussion is available to Palladium Members. Members also get to participate in the Palladium Community Salons, which the editorial podcasts are based on, as well as other benefits like the community chat.
content/podcasts/2021-02-08_urbit.mdnew file+27
@@ -0,0 +1,27 @@
1++++
2+title = "Galen Wolfe-Pauly (Tlon) on Urbit and the Architecture of the Internet (EP.176)"
3+podcast = "On The Brink with Castle Island"
4+date = "2021-02-08"
5+URL = "https://castleisland.libsyn.com/galen-wolfe-pauly-tlon-on-urbit-and-the-architecture-of-the-internet-ep176"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/onthebrink.jpg"
7++++
8+
9+Galen Wolfe-Pauly, cofounder of Tlon, joins the show to give us an update on Urbit in light of the politicization of internet infrastructure. In this episode:
10+
11+The purpose of Urbit
12+How the power of internet oligopolies has been recently revealed in the last few months
13+Does the internet of today resemble the internet of 1994?
14+The problem with having a single ToS/legal system for major internet platforms
15+What's new with Urbit since our last Urbit episode in 2019
16+How hosting makes Urbit much more user friendly
17+Urbit's governance system and how it contrasts from the feudal model on Twitter
18+Galen's political taxonomy for Urbit - and where galaxies and stars fit in to this
19+How internet platforms are like living in Vegas
20+Whether users literally own their handles on internet platforms
21+The politicization of internet infrastructure
22+How resistant is Urbit itself to deplatforming at the infrastructure level
23+Whether there is any irony in Urbit offering hosting for users
24+Galen's view on data portability legislation
25+The near term roadmap for Urbit
26+The distinction between Tlon and Urbit
27+How to get started with Urbit
content/podcasts/2022-01-21_the-most-beautiful-computer.mdnew file+17
@@ -0,0 +1,17 @@
1++++
2+title = "The Most Beautiful Computer with Édouard Urcades | The Urbit Series"
3+podcast = "Other Life"
4+date = "2022-01-21"
5+URL = "https://podcast.otherlife.co/episodes/quantum-computing-and-anarcho-communist-swarm-intelligence-with-jonathan-paprocki-the-urbit-series"
6+image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
7++++
8+
9+Édouard Urcades is a designer at Tlon. He thinks computers are like flowers; his goal is to design the most beautiful computer.
10+
11+Édouard on Twitter: https://twitter.com/flowerstructure
12+
13+Édouard on Urbit: [~fabled-faster](https://urbit.org/ids/~fabled-faster)
14+
15+✦ Get your own Urbit planet at [imperceptible.computer](https://imperceptible.computer)
16+
17+✦ Subscribe to the Other Life newsletter at OtherLife.Co
content/podcasts/2022-01-26_the-only-dignified-computer.mdnew file+17
@@ -0,0 +1,17 @@
1++++
2+title = "The Only Dignified Computer with Tirrel Corporation | The Urbit Series"
3+podcast = "Other Life"
4+date = "2022-01-26"
5+URL = "https://podcast.otherlife.co/episodes/urbit-blockchains-and-the-next-billion-users-with-ted-blackman-engineer-at-tlon-the-urbit-series"
6+image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
7++++
8+
9+The Tirrel corporation is a startup building payment rails for Urbit. We discuss capitalism on Urbit, Deleuze, Christianity, and the impossibility of human dignity on the current internet.
10+
11+Tirrel Corporation: https://tirrel.io/
12+Christian on Urbit: [~pindet-timmut](https://urbit.org/ids/~pindet-timmut)
13+Logan on Urbit: [~tacryt-socryp](https://urbit.org/ids/~tacryt-socryp)
14+
15+✦ Get your own Urbit planet at [imperceptible.computer](https://imperceptible.computer)
16+
17+✦ Subscribe to the Other Life newsletter at OtherLife.Co
content/podcasts/2022-02-01_100-year-computer.mdnew file+15
@@ -0,0 +1,15 @@
1++++
2+title = "The 100-Year Computer with Galen Wolfe-Pauly | The Urbit Series"
3+podcast = "Other Life"
4+date = "2022-02-01"
5+URL = "https://www.youtube.com/watch?v=YWOsBWBQAnQ"
6+image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
7++++
8+
9+Galen Wolfe-Pauly is the CEO of Tlon. We discuss why Urbit is led by designers rather than engineers, the theories of Christopher Alexander, the longest-running company in the world (Kongo Gumi), and much more.
10+
11+Galen on Urbit: [~ravmel-ropdyl](/ids/~ravmel-ropdyl)
12+
13+✦ Get your own Urbit planet at [imperceptible.computer](https://imperceptible.computer)
14+
15+✦ Subscribe to the Other Life newsletter at OtherLife.Co
content/podcasts/2022-02-15_building-web3-products.mdnew file+20
@@ -0,0 +1,20 @@
1++++
2+title = "Building Web3 Products on Urbit with Nico Arqueros of dcSpark | The Urbit Series"
3+podcast = "Other Life"
4+date = "2022-02-14"
5+URL = "https://podcast.otherlife.co/episodes/building-web3-products-on-urbit-with-nico-arqueros-of-dcspark-the-urbit-series"
6+image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
7++++
8+
9+Nico Arqueros is the CEO of dcSpark, a startup that's recently launched two products built on Urbit. We discuss their unique thesis that the future of Urbit apps is outside of Urbit, with Urbit ID as the universal identity layer for the multi-chain future.
10+
11+✦ Nico on Urbit: [~dovnec-bonder](https://urbit.org/ids/~dovnec-bonder)
12+
13+✦ UrbitVisor is a Chrome plugin that uses your Urbit ID to interact with websites. https://urbitvisor.com/
14+
15+✦ UrbitDashboard lets you explore your ship's activity in a browser-based dashboard. https://urbitdashboard.com
16+
17+
18+✦ Get your own Urbit planet at [imperceptible.computer](https://imperceptible.computer)
19+
20+✦ Subscribe to the Other Life newsletter at OtherLife.Co
content/podcasts/2022-02-21_most-correct-computer.mdnew file+17
@@ -0,0 +1,17 @@
1++++
2+title = "The Most Correct Computer (How Urbit Wins) with Philip Monk, CTO of Tlon | The Urbit Series"
3+podcast = "Other Life"
4+date = "2022-02-21"
5+URL = "https://podcast.otherlife.co/episodes/the-most-correct-computer-how-urbit-wins-with-philip-monk-cto-of-tlon-the-urbit-series"
6+image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
7++++
8+
9+Philip Monk co-authored the Urbit whitepaper with Curtis Yarvin in 2016. He's now one of the lead engineers working on Urbit, and a thoughtful writer as well. We discuss how to find frontiers, the philosophy of "correctness at all costs," how the current internet is captured by gradient descent, and how Urbit will achieve mass adoption.
10+
11+✦ Philip on Urbit: [~wicdev-wisryt](https://urbit.org/ids/~wicdev-wisryt)
12+
13+✦ Philip's blog: pcmonk.me
14+
15+✦ Get your own Urbit planet at [imperceptible.computer](https://imperceptible.computer)
16+
17+✦ Subscribe to the Other Life newsletter at OtherLife.Co
content/podcasts/2022-03-02_theory-of-the-egirl.mdnew file+17
@@ -0,0 +1,17 @@
1++++
2+title = "Materials for a Theory of the E-Girl with Soph and **** of Remilia Collective | The Urbit Series"
3+podcast = "Other Life"
4+date = "2022-03-02"
5+URL = "https://podcast.otherlife.co/episodes/materials-for-a-theory-of-the-e-girl-with-soph-and-of-remilia-collective-the-urbit-series"
6+image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
7++++
8+
9+Soph, aka praxisbaby, is a niche microcelebrity e-girl from the GenZ wing of the Weird Theory twitterverse. Now she's into Urbit, so I interviewed her to learn what's bringing e-girls to Urbit. She is joined by her fellow e-girl friend ****, who has requested to stay anonymous.
10+
11+✦ [Remilia Collective](https://remilia.org/)
12+
13+✦ Soph on Twitter: [@alivegirl001101](https://twitter.com/alivegirl001101)
14+
15+✦ Get your own Urbit planet at [imperceptible.computer](https://imperceptible.computer)
16+
17+✦ Subscribe to the Other Life newsletter at OtherLife.Co
content/podcasts/2022-03-08_urbit-blockchains.mdnew file+16
@@ -0,0 +1,16 @@
1++++
2+title = "Urbit, Blockchains, and the Next Billion Users with Ted Blackman, Engineer at Tlon | The Urbit Series"
3+podcast = "Other Life"
4+date = "2022-03-08"
5+URL = "https://podcast.otherlife.co/episodes/urbit-blockchains-and-the-next-billion-users-with-ted-blackman-engineer-at-tlon-the-urbit-series"
6+image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
7++++
8+
9+Ted Blackman is a senior engineer at Tlon and one of the most advanced Urbit engineers in the world. We discuss how Urbit will get faster, how it will scale to billions of users, and how Urbit fits into the blockchain ecosystem. In some ways Urbit is like a blockchain, in other ways Urbit is the categorical dual of the blockchain, soon there will be a blockchain built on top of Urbit, and more.
10+
11+
12+✦ Ted on Urbit: [~rovnys-ricfer](https://urbit.org/ids/~rovnys-ricfer)
13+
14+✦ Get your own Urbit planet at [imperceptible.computer](https://imperceptible.computer)
15+
16+✦ Subscribe to the Other Life newsletter at OtherLife.Co
content/podcasts/2022-03-13_alien-invasions.mdnew file+16
@@ -0,0 +1,16 @@
1++++
2+title = "Alien Invasions From the Future with Sam Frank, Writer and Galaxy Owner | The Urbit Series"
3+podcast = "Other Life"
4+date = "2022-03-12"
5+URL = "https://podcast.otherlife.co/episodes/alien-invasions-from-the-future-with-sam-frank-writer-and-galaxy-owner-the-urbit-series"
6+image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
7+
8++++
9+
10+Sam Frank has written for Harper's and The New Yorker, but he was also an early buyer of Ethereum because Vitalik "looked like an alien." Sam explains his heuristics for judging technological and cultural projects, how he first met Curtis Yarvin, what he sees in Urbit, and how he eventually became one of 256 senators in Urbit's galactic senate.
11+
12+✦ Sam on Urbit: [~todset-partug](https://urbit.org/ids/~todset-partug)
13+
14+✦ Get your own Urbit planet at [imperceptible.computer](https://imperceptible.computer)
15+
16+✦ Subscribe to the Other Life newsletter at OtherLife.Co
content/podcasts/2022-03-18_politics-of-urbit-governance.mdnew file+15
@@ -0,0 +1,15 @@
1++++
2+title = "Demystifying the Politics of Urbit Governance with Anthony Arroyo of The Combine | The Urbit Series"
3+podcast = "Other Life"
4+date = "2022-03-18"
5+URL = "https://podcast.otherlife.co/episodes/demystifying-the-politics-of-urbit-governance-with-anthony-arroyo-of-the-combine-the-urbit-series"
6+image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
7++++
8+
9+Anthony Arroyo runs The Combine, a startup incubator for startups building on Urbit. We discuss how Urbit governance really works, debunking the many myths, i.e. the meme that Urbit has a "feudal" or even "fascist" governance structure. We also discuss how Urbit competes with Ethereum, what kinds of businesses are starting to appear on Urbit, and many other interesting topics.
10+
11+✦ Anthony on Urbit: [~poldec-tonteg](/ids/~poldec-tonteg)
12+
13+✦ Get your own Urbit planet at [imperceptible.computer](https://imperceptible.computer)
14+
15+✦ Subscribe to the Other Life newsletter at OtherLife.Co
content/podcasts/2022-03-23_quantum-computing.mdnew file+15
@@ -0,0 +1,15 @@
1++++
2+title = "Quantum Computing and Anarcho-Communist Swarm Intelligence with Jonathan Paprocki | The Urbit Series"
3+podcast = "Other Life"
4+date = "2022-03-23"
5+URL = "https://podcast.otherlife.co/episodes/quantum-computing-and-anarcho-communist-swarm-intelligence-with-jonathan-paprocki-the-urbit-series"
6+image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
7++++
8+
9+Dr. Jonathan Paprocki is a specialist in topological quantum compiling and an Urbit engineer interested in swarm intelligence, Internet of Things, and anarcho-communist governance structures.
10+
11+✦ Jonathan on Urbit: [~datnut-pollen](/ids/~datnut-pollen)
12+
13+✦ Get your own Urbit planet at [imperceptible.computer](https://imperceptible.computer)
14+
15+✦ Subscribe to the Other Life newsletter at OtherLife.Co
content/podcasts/2022-05-21_diary-of-sam-frank.mdnew file+10
@@ -0,0 +1,10 @@
1++++
2+title = "The Diary of Sam Frank w/ Sam Frank"
3+podcast = "Red Scare"
4+date = "2022-05-21"
5+URL = "https://redscarepodcast.libsyn.com/the-diary-of-sam-frank-w-sam-frank"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/redscare.jpg"
7++++
8+
9+Writer Sam Frank joins the ladies to talk about Urbit, miladys, crypto, aliens, angels and more.
10+
content/podcasts/2022-06-22_software-as-soulcraft.mdnew file+20
@@ -0,0 +1,20 @@
1++++
2+title = "Software as Soulcraft and the Metaphysics of Engineering with Neal Davis"
3+podcast = "Other Life"
4+date = "2022-03-23"
5+URL = "https://podcast.otherlife.co/episodes/software-as-soulcraft-and-the-metaphysics-of-engineering-with-neal-davis"
6+image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
7++++
8+
9+Neal Davis is a professor of computer science and the director of Urbit's Hoon School. We discuss why solving nuclear fusion might be a disaster, why Urbit computers have souls, Shinto philosophy, why you should read old books, how to select books, and much more. This was really good!
10+
11+Neal Davis
12+✦ Neal on [Twitter](https://twitter.com/sigilante)
13+
14+✦ Neal on Urbit: [~lagrev-nocfep](https://urbit.org/ids/~lagrev-nocfep)
15+
16+✦ [Learn Hoon](https://hooniversity.org/) with Neal:
17+
18+✦ Get your own Urbit planet at [imperceptible.computer](https://imperceptible.computer)
19+
20+✦ Subscribe to the Other Life newsletter at OtherLife.Co
content/podcasts/2022-06-29_josh-lehman.mdnew file+30
@@ -0,0 +1,30 @@
1++++
2+title = "Josh Lehman: Urbit – The Peer-to-Peer Network Re-Decentralizing the Internet"
3+podcast = "Epicenter"
4+date = "2022-06-29"
5+URL = "https://www.youtube.com/watch?v=DqqUM-L_-2s"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/epicenter.jpg"
7++++
8+
9+Urbit is an exciting new operating system and peer-to-peer network that’s simple by design, built to last forever, and 100% owned by its users. Under the hood it's a from-scratch software stack compact enough that individual developers can understand and control it completely. Urbit deconstructs the client-server model in favor of a federated network of personal servers with built-in, cryptographically-owned identity, each of which is capable of distributing and running their own applications that communicate over the Urbit network.
10+
11+We were joined by the Executive Director of the Urbit Foundation, Josh Lehman, who explained in depth how the Urbit ecosystem was built and now runs, the advantages of the network from user and developer perspectives, the bridge with crypto, and how the roadmap for the kernel is looking going forward.
12+
13+Topics discussed in this episode:
14+- Josh's background and how he became involved with Urbit
15+- An overview of Urbit and the current state of the system
16+- What’s changed about Urbit over the last three years
17+- Urbit's address space consisting of galaxies, stars and planets
18+- What Urbit applications are and how they differ from iphone applications or a dApps
19+- The advantages of the Urbit user and developer experiences
20+- The connection between Urbit and crypto
21+- The projects currently being built on Urbit - Holium, Uqbar, Tirrel
22+- What the roadmap for the underlying Urbit kernel looks like
23+- How you can get involved
24+
25+Links mentioned in this episode:
26+- Episode 205 - A Digital Republic Reinventing the Internet: https://bit.ly/3yuvndm
27+- Urbit: https://bit.ly/3OC2uC0
28+- Urbit Grants: https://bit.ly/3QYDyWT
29+- Urbit on Twitter: https://bit.ly/3A9COrX
30+- Josh on Twitter: https://bit.ly/3No2Jz2
content/podcasts/2022-07-04_enable-people-to-run-their-own-servers.mdnew file+116
@@ -0,0 +1,116 @@
1++++
2+title = "How Do We Enable More People to Run Their Own Servers? w/ Stuart Christoph"
3+podcast = "Crazy Wisdom"
4+date = "2022-07-04"
5+URL = "https://podcasts.apple.com/us/podcast/how-do-we-enable-more-people-to-run-their-own-servers/id1354589767?i=1000568724305"
6+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/podcasts/crazywisdom.jpg"
7++++
8+
9+Stuart Christoph
10+
11+Director of the Urbit Foundation Grant Program
12+
13+What is the grant program for Urbit?
14+
15+Is that for technical people?
16+
17+2 years from now we will be able to build businesses.
18+
19+What small businesses have you started?
20+
21+What are the security problems?
22+
23+
24+How does Urbit scale?
25+
26+How much is a Star?
27+
28+How can I set up a Star?
29+
30+How do you enable more people to run their small businesses?
31+
32+What is a system admin?
33+
34+Can we get the instructions of how to set up a star for my show notes?
35+
36+https://operators.urbit.org/
37+
38+To run a star, you don’t need to know any Hoon?
39+
40+To do a youtube video while doing a star..
41+
42+On the deeper technical side, Urbit is not really great at serving large files
43+
44+Discoverability on Urbit for the Youtube videos.
45+
46+What are they tracking with the spaghetti URL’s?
47+
48+UTM parameters
49+
50+What do they absorb it in?
51+
52+How badly did GDPR impact small businesses?
53+
54+What is ownership?
55+
56+How did value generation change for labor to compute?
57+
58+What year did labor change to compute?
59+
60+Late 90’s to early 2000’s
61+
62+How does the equity ownership framework play into that?
63+
64+What type of things should someone be aware of when it comes to exchange of equity and relationships?
65+
66+What are psychopaths doing in terms of Gamestop and Crypto? What is happening behind the scenes?
67+
68+How do we align will and intent?
69+
70+How do you know the right person to go to for the reality check?
71+
72+What is the difference between manipulation and positive influence?
73+
74+Once you define a computer system it can be gamed.
75+
76+What are the first principles of building healthy working relationships? How is that different from love relationships?
77+
78+Are you using smart contracts to hire anonymous employees?
79+
80+What is the Sword of Damocles?
81+
82+What is the Hack-A-Thon that you are creating? Unconference in Miami 22nd-25th
83+
84+This is where they show off stuff
85+
86+1 a week for new Urbit applications
87+
88+Books Bounty, Dalton Collective
89+
90+Hack-A-Thon that culminates at Assembly
91+
92+Hoon school live has 61 new Hoon developers
93+
94+How do I find one of the new Hoon developers?
95+
96+Teams of 2-3 people that cover an array of skill sets for the hackathon
97+
98+Competent Hoon dev, front end (javascript), and vision/user experience/ideation
99+
100+How can you build trust and relationships between the users on the Urbit network?
101+
102+What is TC/IP?
103+
104+What is an apprenticeship for Urbit development?
105+
106+How do I find the devs for the Assembly?
107+
108+Mars Invisible College
109+
110+Who to follow if you liked this episode:
111+
112+@urbitfoundation on Twitter
113+
114+urbit.org/grants
115+
116+DM ~sarlev-sarsen
package-lock.json+150−179
@@ -69,14 +69,14 @@
6969 }
7070 },
7171 "node_modules/@next/env": {
72− "version": "12.2.2",
73− "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.2.tgz",
74− "integrity": "sha512-BqDwE4gDl1F608TpnNxZqrCn6g48MBjvmWFEmeX5wEXDXh3IkAOw6ASKUgjT8H4OUePYFqghDFUss5ZhnbOUjw=="
72+ "version": "12.2.3",
73+ "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.3.tgz",
74+ "integrity": "sha512-2lWKP5Xcvnor70NaaROZXBvU8z9mFReePCG8NhZw6NyNGnPvC+8s+Cre/63LAB1LKzWw/e9bZJnQUg0gYFRb2Q=="
7575 },
7676 "node_modules/@next/swc-android-arm-eabi": {
77− "version": "12.2.2",
78− "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.2.2.tgz",
79− "integrity": "sha512-VHjuCHeq9qCprUZbsRxxM/VqSW8MmsUtqB5nEpGEgUNnQi/BTm/2aK8tl7R4D0twGKRh6g1AAeFuWtXzk9Z/vQ==",
77+ "version": "12.2.3",
78+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.2.3.tgz",
79+ "integrity": "sha512-JxmCW9XB5PYnkGE67BdnBTdqW0SW6oMCiPMHLdjeRi4T3U4JJKJGnjQld99+6TPOfPWigtw3W7Cijp5gc+vJ/w==",
8080 "cpu": [
8181 "arm"
8282 ],
@@ -89,9 +89,9 @@
8989 }
9090 },
9191 "node_modules/@next/swc-android-arm64": {
92− "version": "12.2.2",
93− "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.2.2.tgz",
94− "integrity": "sha512-v5EYzXUOSv0r9mO/2PX6mOcF53k8ndlu9yeFHVAWW1Dhw2jaJcvTRcCAwYYN8Q3tDg0nH3NbEltJDLKmcJOuVA==",
92+ "version": "12.2.3",
93+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.2.3.tgz",
94+ "integrity": "sha512-3l4zXpWnzy0fqoedsFRxzMy/eGlMMqn6IwPEuBmtEQ4h7srmQFHyT+Bk+eVHb0o1RQ7/TloAa+mu8JX5tz/5tA==",
9595 "cpu": [
9696 "arm64"
9797 ],
@@ -104,9 +104,9 @@
104104 }
105105 },
106106 "node_modules/@next/swc-darwin-arm64": {
107− "version": "12.2.2",
108− "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.2.tgz",
109− "integrity": "sha512-JCoGySHKGt+YBk7xRTFGx1QjrnCcwYxIo3yGepcOq64MoiocTM3yllQWeOAJU2/k9MH0+B5E9WUSme4rOCBbpA==",
107+ "version": "12.2.3",
108+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.3.tgz",
109+ "integrity": "sha512-eutDO/RH6pf7+8zHo3i2GKLhF0qaMtxWpY8k3Oa1k+CyrcJ0IxwkfH/x3f75jTMeCrThn6Uu8j3WeZOxvhto1Q==",
110110 "cpu": [
111111 "arm64"
112112 ],
@@ -119,9 +119,9 @@
119119 }
120120 },
121121 "node_modules/@next/swc-darwin-x64": {
122− "version": "12.2.2",
123− "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.2.2.tgz",
124− "integrity": "sha512-dztDtvfkhUqiqpXvrWVccfGhLe44yQ5tQ7B4tBfnsOR6vxzI9DNPHTlEOgRN9qDqTAcFyPxvg86mn4l8bB9Jcw==",
122+ "version": "12.2.3",
123+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.2.3.tgz",
124+ "integrity": "sha512-lve+lnTiddXbcT3Lh2ujOFywQSEycTYQhuf6j6JrPu9oLQGS01kjIqqSj3/KMmSoppEnXo3BxkgYu+g2+ecHkA==",
125125 "cpu": [
126126 "x64"
127127 ],
@@ -134,9 +134,9 @@
134134 }
135135 },
136136 "node_modules/@next/swc-freebsd-x64": {
137− "version": "12.2.2",
138− "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.2.2.tgz",
139− "integrity": "sha512-JUnXB+2xfxqsAvhFLPJpU1NeyDsvJrKoOjpV7g3Dxbno2Riu4tDKn3kKF886yleAuD/1qNTUCpqubTvbbT2VoA==",
137+ "version": "12.2.3",
138+ "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.2.3.tgz",
139+ "integrity": "sha512-V4bZU1qBFkULTPW53phY8ypioh3EERzHu9YKAasm9RxU4dj+8c/4s60y+kbFkFEEpIUgEU6yNuYZRR4lHHbUGA==",
140140 "cpu": [
141141 "x64"
142142 ],
@@ -149,9 +149,9 @@
149149 }
150150 },
151151 "node_modules/@next/swc-linux-arm-gnueabihf": {
152− "version": "12.2.2",
153− "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.2.2.tgz",
154− "integrity": "sha512-XeYC/qqPLz58R4pjkb+x8sUUxuGLnx9QruC7/IGkK68yW4G17PHwKI/1njFYVfXTXUukpWjcfBuauWwxp9ke7Q==",
152+ "version": "12.2.3",
153+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.2.3.tgz",
154+ "integrity": "sha512-MWxS/i+XSEKdQE0ZmdYkPPrWKBi4JwMVaXdOW9J/T/sZJsHsLlSC9ErBcNolKAJEVka+tnw9oPRyRCKOj+q0sw==",
155155 "cpu": [
156156 "arm"
157157 ],
@@ -164,9 +164,9 @@
164164 }
165165 },
166166 "node_modules/@next/swc-linux-arm64-gnu": {
167− "version": "12.2.2",
168− "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.2.2.tgz",
169− "integrity": "sha512-d6jT8xgfKYFkzR7J0OHo2D+kFvY/6W8qEo6/hmdrTt6AKAqxs//rbbcdoyn3YQq1x6FVUUd39zzpezZntg9Naw==",
167+ "version": "12.2.3",
168+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.2.3.tgz",
169+ "integrity": "sha512-ikXkqAmvEcWTzIQFDdmrUHLWzdDAF5s2pVsSpQn9rk/gK1i9webH1GRQd2bSM7JLuPBZSaYrNGvDTyHZdSEYlg==",
170170 "cpu": [
171171 "arm64"
172172 ],
@@ -179,9 +179,9 @@
179179 }
180180 },
181181 "node_modules/@next/swc-linux-arm64-musl": {
182− "version": "12.2.2",
183− "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.2.2.tgz",
184− "integrity": "sha512-rIZRFxI9N/502auJT1i7coas0HTHUM+HaXMyJiCpnY8Rimbo0495ir24tzzHo3nQqJwcflcPTwEh/DV17sdv9A==",
182+ "version": "12.2.3",
183+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.2.3.tgz",
184+ "integrity": "sha512-wE45gGFkeLLLnCoveKaBrdpYkkypl3qwNF2YhnfvfVK7etuu1O679LwClhCWinDVBr+KOkmyHok00Z+0uI1ycg==",
185185 "cpu": [
186186 "arm64"
187187 ],
@@ -194,9 +194,9 @@
194194 }
195195 },
196196 "node_modules/@next/swc-linux-x64-gnu": {
197− "version": "12.2.2",
198− "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.2.2.tgz",
199− "integrity": "sha512-ir1vNadlUDj7eQk15AvfhG5BjVizuCHks9uZwBfUgT5jyeDCeRvaDCo1+Q6+0CLOAnYDR/nqSCvBgzG2UdFh9A==",
197+ "version": "12.2.3",
198+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.2.3.tgz",
199+ "integrity": "sha512-MbFI6413VSXiREzHwYD8YAJLTknBaC+bmjXgdHEEdloeOuBFQGE3NWn3izOCTy8kV+s98VDQO8au7EKKs+bW0g==",
200200 "cpu": [
201201 "x64"
202202 ],
@@ -209,9 +209,9 @@
209209 }
210210 },
211211 "node_modules/@next/swc-linux-x64-musl": {
212− "version": "12.2.2",
213− "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.2.2.tgz",
214− "integrity": "sha512-bte5n2GzLN3O8JdSFYWZzMgEgDHZmRz5wiispiiDssj4ik3l8E7wq/czNi8RmIF+ioj2sYVokUNa/ekLzrESWw==",
212+ "version": "12.2.3",
213+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.2.3.tgz",
214+ "integrity": "sha512-jMBD0Va6fInbPih/dNySlNY2RpjkK6MXS+UGVEvuTswl1MZr+iahvurmshwGKpjaRwVU4DSFMD8+gfWxsTFs1Q==",
215215 "cpu": [
216216 "x64"
217217 ],
@@ -224,9 +224,9 @@
224224 }
225225 },
226226 "node_modules/@next/swc-win32-arm64-msvc": {
227− "version": "12.2.2",
228− "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.2.2.tgz",
229− "integrity": "sha512-ZUGCmcDmdPVSAlwJ/aD+1F9lYW8vttseiv4n2+VCDv5JloxiX9aY32kYZaJJO7hmTLNrprvXkb4OvNuHdN22Jg==",
227+ "version": "12.2.3",
228+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.2.3.tgz",
229+ "integrity": "sha512-Cq8ToPdc0jQP2C7pjChYctAsEe7+lO/B826ZCK5xFzobuHPiCyJ2Mzx/nEQwCY4SpYkeJQtCbwlCz5iyGW5zGg==",
230230 "cpu": [
231231 "arm64"
232232 ],
@@ -239,9 +239,9 @@
239239 }
240240 },
241241 "node_modules/@next/swc-win32-ia32-msvc": {
242− "version": "12.2.2",
243− "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.2.2.tgz",
244− "integrity": "sha512-v7ykeEDbr9eXiblGSZiEYYkWoig6sRhAbLKHUHQtk8vEWWVEqeXFcxmw6LRrKu5rCN1DY357UlYWToCGPQPCRA==",
242+ "version": "12.2.3",
243+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.2.3.tgz",
244+ "integrity": "sha512-BtFq4c8IpeB0sDhJMHJFgm86rPkOvmYI8k3De8Y2kgNVWSeLQ0Q929PWf7e+GqcX1015ei/gEB41ZH8Iw49NzA==",
245245 "cpu": [
246246 "ia32"
247247 ],
@@ -254,9 +254,9 @@
254254 }
255255 },
256256 "node_modules/@next/swc-win32-x64-msvc": {
257− "version": "12.2.2",
258− "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.2.tgz",
259− "integrity": "sha512-2D2iinWUL6xx8D9LYVZ5qi7FP6uLAoWymt8m8aaG2Ld/Ka8/k723fJfiklfuAcwOxfufPJI+nRbT5VcgHGzHAQ==",
257+ "version": "12.2.3",
258+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.3.tgz",
259+ "integrity": "sha512-huSNb98KSG77Kl96CoPgCwom28aamuUsPpRmn/4s9L0RNbbHVSkp9E6HA4yOAykZCEuWcdNsRLbVVuAbt8rtIw==",
260260 "cpu": [
261261 "x64"
262262 ],
@@ -309,9 +309,9 @@
309309 }
310310 },
311311 "node_modules/@swc/helpers": {
312− "version": "0.4.2",
313− "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.2.tgz",
314− "integrity": "sha512-556Az0VX7WR6UdoTn4htt/l3zPQ7bsQWK+HqdG4swV7beUCxo/BqmvbOpUkTIm/9ih86LIf1qsUnywNL3obGHw==",
312+ "version": "0.4.3",
313+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.3.tgz",
314+ "integrity": "sha512-6JrF+fdUK2zbGpJIlN7G3v966PQjyx/dPt1T9km2wj+EUBqgrxCk3uX4Kct16MIm9gGxfKRcfax2hVf5jvlTzA==",
315315 "dependencies": {
316316 "tslib": "^2.4.0"
317317 }
@@ -596,9 +596,9 @@
596596 }
597597 },
598598 "node_modules/caniuse-lite": {
599− "version": "1.0.30001367",
600− "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001367.tgz",
601− "integrity": "sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw==",
599+ "version": "1.0.30001370",
600+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001370.tgz",
601+ "integrity": "sha512-3PDmaP56wz/qz7G508xzjx8C+MC2qEm4SYhSEzC9IBROo+dGXFWRuaXkWti0A9tuI00g+toiriVqxtWMgl350g==",
602602 "funding": [
603603 {
604604 "type": "opencollective",
@@ -856,9 +856,9 @@
856856 }
857857 },
858858 "node_modules/electron-to-chromium": {
859− "version": "1.4.195",
860− "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.195.tgz",
861− "integrity": "sha512-vefjEh0sk871xNmR5whJf9TEngX+KTKS3hOHpjoMpauKkwlGwtMz1H8IaIjAT/GNnX0TbGwAdmVoXCAzXf+PPg=="
859+ "version": "1.4.202",
860+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.202.tgz",
861+ "integrity": "sha512-JYsK2ex9lmQD27kj19fhXYxzFJ/phLAkLKHv49A5UY6kMRV2xED3qMMLg/voW/+0AR6wMiI+VxlmK9NDtdxlPA=="
862862 },
863863 "node_modules/end-of-stream": {
864864 "version": "1.4.4",
@@ -1116,7 +1116,7 @@
11161116 },
11171117 "node_modules/foundation-design-system": {
11181118 "version": "0.0.0",
1119− "resolved": "git+ssh://git@github.com/urbit/foundation-design-system.git#37e2d9122f6ec88ce6cd8758ca0612f13d613f8f",
1119+ "resolved": "git+ssh://git@github.com/urbit/foundation-design-system.git#0e116f7d36733cb7f06d6d71d146b7262c7e97c7",
11201120 "license": "MIT",
11211121 "dependencies": {
11221122 "@markdoc/markdoc": "0.1.3",
@@ -1755,16 +1755,16 @@
17551755 }
17561756 },
17571757 "node_modules/next": {
1758− "version": "12.2.2",
1759− "resolved": "https://registry.npmjs.org/next/-/next-12.2.2.tgz",
1760− "integrity": "sha512-zAYFY45aBry/PlKONqtlloRFqU/We3zWYdn2NoGvDZkoYUYQSJC8WMcalS5C19MxbCZLUVCX7D7a6gTGgl2yLg==",
1758+ "version": "12.2.3",
1759+ "resolved": "https://registry.npmjs.org/next/-/next-12.2.3.tgz",
1760+ "integrity": "sha512-TA0tmSA6Dk6S6kfvCNbF7CWYW8468gZUxr/3/30z4KvAQbXnl2ASYZElVe7q/hBW/1F1ee0tSBlHa4/sn+ZIBw==",
17611761 "dependencies": {
1762− "@next/env": "12.2.2",
1763− "@swc/helpers": "0.4.2",
1762+ "@next/env": "12.2.3",
1763+ "@swc/helpers": "0.4.3",
17641764 "caniuse-lite": "^1.0.30001332",
1765− "postcss": "8.4.5",
1765+ "postcss": "8.4.14",
17661766 "styled-jsx": "5.0.2",
1767− "use-sync-external-store": "1.1.0"
1767+ "use-sync-external-store": "1.2.0"
17681768 },
17691769 "bin": {
17701770 "next": "dist/bin/next"
@@ -1773,19 +1773,19 @@
17731773 "node": ">=12.22.0"
17741774 },
17751775 "optionalDependencies": {
1776− "@next/swc-android-arm-eabi": "12.2.2",
1777− "@next/swc-android-arm64": "12.2.2",
1778− "@next/swc-darwin-arm64": "12.2.2",
1779− "@next/swc-darwin-x64": "12.2.2",
1780− "@next/swc-freebsd-x64": "12.2.2",
1781− "@next/swc-linux-arm-gnueabihf": "12.2.2",
1782− "@next/swc-linux-arm64-gnu": "12.2.2",
1783− "@next/swc-linux-arm64-musl": "12.2.2",
1784− "@next/swc-linux-x64-gnu": "12.2.2",
1785− "@next/swc-linux-x64-musl": "12.2.2",
1786− "@next/swc-win32-arm64-msvc": "12.2.2",
1787− "@next/swc-win32-ia32-msvc": "12.2.2",
1788− "@next/swc-win32-x64-msvc": "12.2.2"
1776+ "@next/swc-android-arm-eabi": "12.2.3",
1777+ "@next/swc-android-arm64": "12.2.3",
1778+ "@next/swc-darwin-arm64": "12.2.3",
1779+ "@next/swc-darwin-x64": "12.2.3",
1780+ "@next/swc-freebsd-x64": "12.2.3",
1781+ "@next/swc-linux-arm-gnueabihf": "12.2.3",
1782+ "@next/swc-linux-arm64-gnu": "12.2.3",
1783+ "@next/swc-linux-arm64-musl": "12.2.3",
1784+ "@next/swc-linux-x64-gnu": "12.2.3",
1785+ "@next/swc-linux-x64-musl": "12.2.3",
1786+ "@next/swc-win32-arm64-msvc": "12.2.3",
1787+ "@next/swc-win32-ia32-msvc": "12.2.3",
1788+ "@next/swc-win32-x64-msvc": "12.2.3"
17891789 },
17901790 "peerDependencies": {
17911791 "fibers": ">= 3.1.0",
@@ -1815,23 +1815,6 @@
18151815 "escalade": "^3.1.1"
18161816 }
18171817 },
1818− "node_modules/next/node_modules/postcss": {
1819− "version": "8.4.5",
1820− "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
1821− "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
1822− "dependencies": {
1823− "nanoid": "^3.1.30",
1824− "picocolors": "^1.0.0",
1825− "source-map-js": "^1.0.1"
1826− },
1827− "engines": {
1828− "node": "^10 || ^12 || >=14"
1829− },
1830− "funding": {
1831− "type": "opencollective",
1832− "url": "https://opencollective.com/postcss/"
1833− }
1834− },
18351818 "node_modules/nice-try": {
18361819 "version": "1.0.5",
18371820 "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
@@ -2883,9 +2866,9 @@
28832866 }
28842867 },
28852868 "node_modules/use-sync-external-store": {
2886− "version": "1.1.0",
2887− "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.1.0.tgz",
2888− "integrity": "sha512-SEnieB2FPKEVne66NpXPd1Np4R1lTNKfjuy3XdIoPQKYBAFdzbzSZlSn1KJZUiihQLQC5Znot4SBz1EOTBwQAQ==",
2869+ "version": "1.2.0",
2870+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
2871+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
28892872 "peerDependencies": {
28902873 "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
28912874 }
@@ -2976,86 +2959,86 @@
29762959 "integrity": "sha512-4n2cobUSeOob+237wZhpNiOEHCSfOydlQnKHTFdRY6ug/DupXGaxkkkszJYQxRftiMs8jmb10XvVO1svEYD43Q=="
29772960 },
29782961 "@next/env": {
2979− "version": "12.2.2",
2980− "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.2.tgz",
2981− "integrity": "sha512-BqDwE4gDl1F608TpnNxZqrCn6g48MBjvmWFEmeX5wEXDXh3IkAOw6ASKUgjT8H4OUePYFqghDFUss5ZhnbOUjw=="
2962+ "version": "12.2.3",
2963+ "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.3.tgz",
2964+ "integrity": "sha512-2lWKP5Xcvnor70NaaROZXBvU8z9mFReePCG8NhZw6NyNGnPvC+8s+Cre/63LAB1LKzWw/e9bZJnQUg0gYFRb2Q=="
29822965 },
29832966 "@next/swc-android-arm-eabi": {
2984− "version": "12.2.2",
2985− "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.2.2.tgz",
2986− "integrity": "sha512-VHjuCHeq9qCprUZbsRxxM/VqSW8MmsUtqB5nEpGEgUNnQi/BTm/2aK8tl7R4D0twGKRh6g1AAeFuWtXzk9Z/vQ==",
2967+ "version": "12.2.3",
2968+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.2.3.tgz",
2969+ "integrity": "sha512-JxmCW9XB5PYnkGE67BdnBTdqW0SW6oMCiPMHLdjeRi4T3U4JJKJGnjQld99+6TPOfPWigtw3W7Cijp5gc+vJ/w==",
29872970 "optional": true
29882971 },
29892972 "@next/swc-android-arm64": {
2990− "version": "12.2.2",
2991− "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.2.2.tgz",
2992− "integrity": "sha512-v5EYzXUOSv0r9mO/2PX6mOcF53k8ndlu9yeFHVAWW1Dhw2jaJcvTRcCAwYYN8Q3tDg0nH3NbEltJDLKmcJOuVA==",
2973+ "version": "12.2.3",
2974+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.2.3.tgz",
2975+ "integrity": "sha512-3l4zXpWnzy0fqoedsFRxzMy/eGlMMqn6IwPEuBmtEQ4h7srmQFHyT+Bk+eVHb0o1RQ7/TloAa+mu8JX5tz/5tA==",
29932976 "optional": true
29942977 },
29952978 "@next/swc-darwin-arm64": {
2996− "version": "12.2.2",
2997− "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.2.tgz",
2998− "integrity": "sha512-JCoGySHKGt+YBk7xRTFGx1QjrnCcwYxIo3yGepcOq64MoiocTM3yllQWeOAJU2/k9MH0+B5E9WUSme4rOCBbpA==",
2979+ "version": "12.2.3",
2980+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.3.tgz",
2981+ "integrity": "sha512-eutDO/RH6pf7+8zHo3i2GKLhF0qaMtxWpY8k3Oa1k+CyrcJ0IxwkfH/x3f75jTMeCrThn6Uu8j3WeZOxvhto1Q==",
29992982 "optional": true
30002983 },
30012984 "@next/swc-darwin-x64": {
3002− "version": "12.2.2",
3003− "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.2.2.tgz",
3004− "integrity": "sha512-dztDtvfkhUqiqpXvrWVccfGhLe44yQ5tQ7B4tBfnsOR6vxzI9DNPHTlEOgRN9qDqTAcFyPxvg86mn4l8bB9Jcw==",
2985+ "version": "12.2.3",
2986+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.2.3.tgz",
2987+ "integrity": "sha512-lve+lnTiddXbcT3Lh2ujOFywQSEycTYQhuf6j6JrPu9oLQGS01kjIqqSj3/KMmSoppEnXo3BxkgYu+g2+ecHkA==",
30052988 "optional": true
30062989 },
30072990 "@next/swc-freebsd-x64": {
3008− "version": "12.2.2",
3009− "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.2.2.tgz",
3010− "integrity": "sha512-JUnXB+2xfxqsAvhFLPJpU1NeyDsvJrKoOjpV7g3Dxbno2Riu4tDKn3kKF886yleAuD/1qNTUCpqubTvbbT2VoA==",
2991+ "version": "12.2.3",
2992+ "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.2.3.tgz",
2993+ "integrity": "sha512-V4bZU1qBFkULTPW53phY8ypioh3EERzHu9YKAasm9RxU4dj+8c/4s60y+kbFkFEEpIUgEU6yNuYZRR4lHHbUGA==",
30112994 "optional": true
30122995 },
30132996 "@next/swc-linux-arm-gnueabihf": {
3014− "version": "12.2.2",
3015− "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.2.2.tgz",
3016− "integrity": "sha512-XeYC/qqPLz58R4pjkb+x8sUUxuGLnx9QruC7/IGkK68yW4G17PHwKI/1njFYVfXTXUukpWjcfBuauWwxp9ke7Q==",
2997+ "version": "12.2.3",
2998+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.2.3.tgz",
2999+ "integrity": "sha512-MWxS/i+XSEKdQE0ZmdYkPPrWKBi4JwMVaXdOW9J/T/sZJsHsLlSC9ErBcNolKAJEVka+tnw9oPRyRCKOj+q0sw==",
30173000 "optional": true
30183001 },
30193002 "@next/swc-linux-arm64-gnu": {
3020− "version": "12.2.2",
3021− "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.2.2.tgz",
3022− "integrity": "sha512-d6jT8xgfKYFkzR7J0OHo2D+kFvY/6W8qEo6/hmdrTt6AKAqxs//rbbcdoyn3YQq1x6FVUUd39zzpezZntg9Naw==",
3003+ "version": "12.2.3",
3004+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.2.3.tgz",
3005+ "integrity": "sha512-ikXkqAmvEcWTzIQFDdmrUHLWzdDAF5s2pVsSpQn9rk/gK1i9webH1GRQd2bSM7JLuPBZSaYrNGvDTyHZdSEYlg==",
30233006 "optional": true
30243007 },
30253008 "@next/swc-linux-arm64-musl": {
3026− "version": "12.2.2",
3027− "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.2.2.tgz",
3028− "integrity": "sha512-rIZRFxI9N/502auJT1i7coas0HTHUM+HaXMyJiCpnY8Rimbo0495ir24tzzHo3nQqJwcflcPTwEh/DV17sdv9A==",
3009+ "version": "12.2.3",
3010+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.2.3.tgz",
3011+ "integrity": "sha512-wE45gGFkeLLLnCoveKaBrdpYkkypl3qwNF2YhnfvfVK7etuu1O679LwClhCWinDVBr+KOkmyHok00Z+0uI1ycg==",
30293012 "optional": true
30303013 },
30313014 "@next/swc-linux-x64-gnu": {
3032− "version": "12.2.2",
3033− "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.2.2.tgz",
3034− "integrity": "sha512-ir1vNadlUDj7eQk15AvfhG5BjVizuCHks9uZwBfUgT5jyeDCeRvaDCo1+Q6+0CLOAnYDR/nqSCvBgzG2UdFh9A==",
3015+ "version": "12.2.3",
3016+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.2.3.tgz",
3017+ "integrity": "sha512-MbFI6413VSXiREzHwYD8YAJLTknBaC+bmjXgdHEEdloeOuBFQGE3NWn3izOCTy8kV+s98VDQO8au7EKKs+bW0g==",
30353018 "optional": true
30363019 },
30373020 "@next/swc-linux-x64-musl": {
3038− "version": "12.2.2",
3039− "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.2.2.tgz",
3040− "integrity": "sha512-bte5n2GzLN3O8JdSFYWZzMgEgDHZmRz5wiispiiDssj4ik3l8E7wq/czNi8RmIF+ioj2sYVokUNa/ekLzrESWw==",
3021+ "version": "12.2.3",
3022+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.2.3.tgz",
3023+ "integrity": "sha512-jMBD0Va6fInbPih/dNySlNY2RpjkK6MXS+UGVEvuTswl1MZr+iahvurmshwGKpjaRwVU4DSFMD8+gfWxsTFs1Q==",
30413024 "optional": true
30423025 },
30433026 "@next/swc-win32-arm64-msvc": {
3044− "version": "12.2.2",
3045− "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.2.2.tgz",
3046− "integrity": "sha512-ZUGCmcDmdPVSAlwJ/aD+1F9lYW8vttseiv4n2+VCDv5JloxiX9aY32kYZaJJO7hmTLNrprvXkb4OvNuHdN22Jg==",
3027+ "version": "12.2.3",
3028+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.2.3.tgz",
3029+ "integrity": "sha512-Cq8ToPdc0jQP2C7pjChYctAsEe7+lO/B826ZCK5xFzobuHPiCyJ2Mzx/nEQwCY4SpYkeJQtCbwlCz5iyGW5zGg==",
30473030 "optional": true
30483031 },
30493032 "@next/swc-win32-ia32-msvc": {
3050− "version": "12.2.2",
3051− "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.2.2.tgz",
3052− "integrity": "sha512-v7ykeEDbr9eXiblGSZiEYYkWoig6sRhAbLKHUHQtk8vEWWVEqeXFcxmw6LRrKu5rCN1DY357UlYWToCGPQPCRA==",
3033+ "version": "12.2.3",
3034+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.2.3.tgz",
3035+ "integrity": "sha512-BtFq4c8IpeB0sDhJMHJFgm86rPkOvmYI8k3De8Y2kgNVWSeLQ0Q929PWf7e+GqcX1015ei/gEB41ZH8Iw49NzA==",
30533036 "optional": true
30543037 },
30553038 "@next/swc-win32-x64-msvc": {
3056− "version": "12.2.2",
3057− "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.2.tgz",
3058− "integrity": "sha512-2D2iinWUL6xx8D9LYVZ5qi7FP6uLAoWymt8m8aaG2Ld/Ka8/k723fJfiklfuAcwOxfufPJI+nRbT5VcgHGzHAQ==",
3039+ "version": "12.2.3",
3040+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.3.tgz",
3041+ "integrity": "sha512-huSNb98KSG77Kl96CoPgCwom28aamuUsPpRmn/4s9L0RNbbHVSkp9E6HA4yOAykZCEuWcdNsRLbVVuAbt8rtIw==",
30593042 "optional": true
30603043 },
30613044 "@nodelib/fs.scandir": {
@@ -3088,9 +3071,9 @@
30883071 "requires": {}
30893072 },
30903073 "@swc/helpers": {
3091− "version": "0.4.2",
3092− "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.2.tgz",
3093− "integrity": "sha512-556Az0VX7WR6UdoTn4htt/l3zPQ7bsQWK+HqdG4swV7beUCxo/BqmvbOpUkTIm/9ih86LIf1qsUnywNL3obGHw==",
3074+ "version": "0.4.3",
3075+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.3.tgz",
3076+ "integrity": "sha512-6JrF+fdUK2zbGpJIlN7G3v966PQjyx/dPt1T9km2wj+EUBqgrxCk3uX4Kct16MIm9gGxfKRcfax2hVf5jvlTzA==",
30943077 "requires": {
30953078 "tslib": "^2.4.0"
30963079 }
@@ -3274,9 +3257,9 @@
32743257 "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="
32753258 },
32763259 "caniuse-lite": {
3277− "version": "1.0.30001367",
3278− "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001367.tgz",
3279− "integrity": "sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw=="
3260+ "version": "1.0.30001370",
3261+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001370.tgz",
3262+ "integrity": "sha512-3PDmaP56wz/qz7G508xzjx8C+MC2qEm4SYhSEzC9IBROo+dGXFWRuaXkWti0A9tuI00g+toiriVqxtWMgl350g=="
32803263 },
32813264 "chalk": {
32823265 "version": "2.4.2",
@@ -3465,9 +3448,9 @@
34653448 }
34663449 },
34673450 "electron-to-chromium": {
3468− "version": "1.4.195",
3469− "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.195.tgz",
3470− "integrity": "sha512-vefjEh0sk871xNmR5whJf9TEngX+KTKS3hOHpjoMpauKkwlGwtMz1H8IaIjAT/GNnX0TbGwAdmVoXCAzXf+PPg=="
3451+ "version": "1.4.202",
3452+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.202.tgz",
3453+ "integrity": "sha512-JYsK2ex9lmQD27kj19fhXYxzFJ/phLAkLKHv49A5UY6kMRV2xED3qMMLg/voW/+0AR6wMiI+VxlmK9NDtdxlPA=="
34713454 },
34723455 "end-of-stream": {
34733456 "version": "1.4.4",
@@ -3650,7 +3633,7 @@
36503633 "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA=="
36513634 },
36523635 "foundation-design-system": {
3653− "version": "git+ssh://git@github.com/urbit/foundation-design-system.git#37e2d9122f6ec88ce6cd8758ca0612f13d613f8f",
3636+ "version": "git+ssh://git@github.com/urbit/foundation-design-system.git#0e116f7d36733cb7f06d6d71d146b7262c7e97c7",
36543637 "from": "foundation-design-system@github:urbit/foundation-design-system",
36553638 "requires": {
36563639 "@markdoc/markdoc": "0.1.3",
@@ -4108,41 +4091,29 @@
41084091 "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
41094092 },
41104093 "next": {
4111− "version": "12.2.2",
4112− "resolved": "https://registry.npmjs.org/next/-/next-12.2.2.tgz",
4113− "integrity": "sha512-zAYFY45aBry/PlKONqtlloRFqU/We3zWYdn2NoGvDZkoYUYQSJC8WMcalS5C19MxbCZLUVCX7D7a6gTGgl2yLg==",
4094+ "version": "12.2.3",
4095+ "resolved": "https://registry.npmjs.org/next/-/next-12.2.3.tgz",
4096+ "integrity": "sha512-TA0tmSA6Dk6S6kfvCNbF7CWYW8468gZUxr/3/30z4KvAQbXnl2ASYZElVe7q/hBW/1F1ee0tSBlHa4/sn+ZIBw==",
41144097 "requires": {
4115− "@next/env": "12.2.2",
4116− "@next/swc-android-arm-eabi": "12.2.2",
4117− "@next/swc-android-arm64": "12.2.2",
4118− "@next/swc-darwin-arm64": "12.2.2",
4119− "@next/swc-darwin-x64": "12.2.2",
4120− "@next/swc-freebsd-x64": "12.2.2",
4121− "@next/swc-linux-arm-gnueabihf": "12.2.2",
4122− "@next/swc-linux-arm64-gnu": "12.2.2",
4123− "@next/swc-linux-arm64-musl": "12.2.2",
4124− "@next/swc-linux-x64-gnu": "12.2.2",
4125− "@next/swc-linux-x64-musl": "12.2.2",
4126− "@next/swc-win32-arm64-msvc": "12.2.2",
4127− "@next/swc-win32-ia32-msvc": "12.2.2",
4128− "@next/swc-win32-x64-msvc": "12.2.2",
4129− "@swc/helpers": "0.4.2",
4098+ "@next/env": "12.2.3",
4099+ "@next/swc-android-arm-eabi": "12.2.3",
4100+ "@next/swc-android-arm64": "12.2.3",
4101+ "@next/swc-darwin-arm64": "12.2.3",
4102+ "@next/swc-darwin-x64": "12.2.3",
4103+ "@next/swc-freebsd-x64": "12.2.3",
4104+ "@next/swc-linux-arm-gnueabihf": "12.2.3",
4105+ "@next/swc-linux-arm64-gnu": "12.2.3",
4106+ "@next/swc-linux-arm64-musl": "12.2.3",
4107+ "@next/swc-linux-x64-gnu": "12.2.3",
4108+ "@next/swc-linux-x64-musl": "12.2.3",
4109+ "@next/swc-win32-arm64-msvc": "12.2.3",
4110+ "@next/swc-win32-ia32-msvc": "12.2.3",
4111+ "@next/swc-win32-x64-msvc": "12.2.3",
4112+ "@swc/helpers": "0.4.3",
41304113 "caniuse-lite": "^1.0.30001332",
4131− "postcss": "8.4.5",
4114+ "postcss": "8.4.14",
41324115 "styled-jsx": "5.0.2",
4133− "use-sync-external-store": "1.1.0"
4134− },
4135− "dependencies": {
4136− "postcss": {
4137− "version": "8.4.5",
4138− "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
4139− "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
4140− "requires": {
4141− "nanoid": "^3.1.30",
4142− "picocolors": "^1.0.0",
4143− "source-map-js": "^1.0.1"
4144− }
4145− }
4116+ "use-sync-external-store": "1.2.0"
41464117 }
41474118 },
41484119 "next-transpile-modules": {
@@ -4866,9 +4837,9 @@
48664837 }
48674838 },
48684839 "use-sync-external-store": {
4869− "version": "1.1.0",
4870− "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.1.0.tgz",
4871− "integrity": "sha512-SEnieB2FPKEVne66NpXPd1Np4R1lTNKfjuy3XdIoPQKYBAFdzbzSZlSn1KJZUiihQLQC5Znot4SBz1EOTBwQAQ==",
4840+ "version": "1.2.0",
4841+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
4842+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
48724843 "requires": {}
48734844 },
48744845 "util-deprecate": {
pages/applications/[[...application]].js+58−28
@@ -1,6 +1,6 @@
11import Head from "next/head";
22import Link from "next/link";
3−import { getPage } from "../../lib/lib";
3+import { getPage, getAllPosts } from "../../lib/lib";
44import { join } from "path";
55import CopyLink from "../../components/CopyLink";
66import {
@@ -8,15 +8,18 @@ import {
88 SingleColumn,
99 Section,
1010 Markdown,
11+ IntraNav,
1112} from "foundation-design-system";
1213import ob from "urbit-ob";
14+import Header from "../../components/Header";
15+import Footer from "../../components/Footer";
1316import GatewayHeader from "../../components/gateway/GatewayHeader";
1417import Gateway404 from "../../components/gateway/Gateway404";
1518import MetadataBlock from "../../components/gateway/MetadataBlock";
1619import MetadataLink from "../../components/gateway/MetadataLink";
1720import Description from "../../components/gateway/Description";
1821
19−const ApplicationPage = ({ data, markdown, params }) => {
22+const ApplicationPage = ({ data, markdown, organisation, search, params }) => {
2023 const { application } = params;
2124 if (!ob.isValidPatp(application[0])) {
2225 return <Gateway404 type="application" />;
@@ -29,6 +32,31 @@ const ApplicationPage = ({ data, markdown, params }) => {
2932 data.title
3033 }.png?${reqParams.join("&")}`;
3134
35+ let devLink;
36+
37+ if (organisation) {
38+ devLink = (
39+ <MetadataLink
40+ title="Developer"
41+ href={`/organizations/${organisation.slug}`}
42+ content={organisation.title}
43+ />
44+ );
45+ } else {
46+ devLink =
47+ ob.isValidPatp(data?.developer || "") && data?.developer.length <= 14 ? (
48+ <MetadataLink
49+ title="Developer"
50+ href={`/ids/${data.developer}`}
51+ content={data.developer}
52+ />
53+ ) : (
54+ <MetadataBlock
55+ title="Developer"
56+ content={data.developer ? data.developer : "Unknown"}
57+ />
58+ );
59+ }
3260 return (
3361 <Container>
3462 <Head>
@@ -54,14 +82,18 @@ const ApplicationPage = ({ data, markdown, params }) => {
5482 />
5583 <meta property="twitter:image" content={image} key="image" />
5684 </Head>
85+ <IntraNav ourSite="https://urbit.org" search={search} />
5786 <SingleColumn>
87+ <Header search={search} />
5888 <Section className="space-y-12" narrow>
89+
5990 <GatewayHeader
6091 title={data.title}
6192 color={data?.bgColor}
6293 image={data?.image || data?.bgColor}
63− item="Urbit Application"
94+ item="Application"
6495 />
96+
6597 <div className="flex flex-wrap md:flex-nowrap justify-between">
6698 <MetadataBlock
6799 title="License"
@@ -76,60 +108,52 @@ const ApplicationPage = ({ data, markdown, params }) => {
76108 }
77109 />
78110 )}
79− {ob.isValidPatp(data?.developer || "") &&
80− data?.developer.length <= 14 ? (
81− <MetadataLink
82− title="Developer"
83− href={`/ids/${data.developer}`}
84− content={data.developer}
85− />
86− ) : (
87− <MetadataBlock
88− title="Developer"
89− content={data.developer ? data.developer : "Unknown"}
90− />
91− )}
111+ {devLink}
92112 <CopyLink
93113 className="basis-1/2 sm:basis-1/4"
94114 content={data.shortcode ? data.shortcode : data.title}
95115 />
96116 </div>
117+
118+
97119 <Description
98120 description={data.description}
99121 fallback="An application on Urbit."
100122 markdown={markdown}
101− />
123+ / >
124+
125+ <hr className="text-white" />
126+
127+ <div class="bg-wall-100 py-4 px-6 border-2 border-wall-200 rounded-xl">
128+ <p class="text-sm text-wall-400"><span class="font-bold">Disclaimer:</span> Applications may not be audited for security and might contain malicious code or vulnerabilities that could lead to unwanted interaction with your ship. Explore at your own risk.</p>
129+ </div>
130+
102131 <hr className="text-wall-200" />
103132 <div className="flex flex-col space-y-6">
104− <h3>
105− Urbit is a clean-slate, peer-to-peer operating system and network.
106− </h3>
107133 <div className="flex flex-col space-y-4">
108− <p className="text-sm font-semibold text-wall-400">
109− Learn how to install an Urbit application
110− </p>
111134 <Link href="/guides/installing-applications" passHref>
112135 <a className="button-lg max-w-xs bg-green-400 text-white">
113− Installing Urbit applications
136+ How to Install an Urbit Application
114137 </a>
115138 </Link>
116139 </div>
117140 </div>
118141 <hr className="text-wall-200" />
142+
119143 <div className="flex flex-col space-y-1">
120144 <p>
121145 Have an application you'd like to share publicly through
122146 urbit.org?
123147 </p>
124148 <Link href="/applications/submit" passHref>
125− <a className="type-ui text-green-400">Submit your application</a>
149+ <a className="font-bold text-green-400">
150+ Submit your application
151+ </a>
126152 </Link>
127153 </div>
128− <Link href="/" passHref>
129− <a className="text-xl pt-8 block font-semibold">Urbit.org</a>
130− </Link>
131154 </Section>
132155 </SingleColumn>
156+ <Footer />
133157 </Container>
134158 );
135159};
@@ -148,6 +172,11 @@ export const getServerSideProps = async ({ params, res }) => {
148172 )
149173 ) || { data: {}, content: "" };
150174
175+ const organisation =
176+ getAllPosts(["title", "slug", "ships"], "organizations").filter((e) =>
177+ e.ships.includes(params.application?.[0])
178+ )[0] || null;
179+
151180 const markdown =
152181 content !== ""
153182 ? JSON.stringify(Markdown.parse({ post: { content } }))
@@ -164,6 +193,7 @@ export const getServerSideProps = async ({ params, res }) => {
164193 props: {
165194 data,
166195 markdown,
196+ organisation,
167197 params,
168198 },
169199 };
pages/blog/[slug].js−3
@@ -66,9 +66,6 @@ export default function Post({
6666 <Section short narrow className="markdown">
6767 <Markdown.render content={JSON.parse(markdown)} />
6868 </Section>
69− <Section narrow>
70− <Contact />
71− </Section>
7269 <Section wide className="flex">
7370 <TwoUp>
7471 {nextPost ? <PostPreview post={nextPost} /> : null}
pages/ecosystem/index.jsnew file+374
@@ -0,0 +1,374 @@
1+import { useRouter } from "next/router";
2+import Head from "next/head";
3+import Meta from "../../components/Meta";
4+import {
5+ Container,
6+ SingleColumn,
7+ Section,
8+ IntraNav,
9+ Markdown,
10+} from "foundation-design-system";
11+import Header from "../../components/Header";
12+import Footer from "../../components/Footer";
13+import Sidebar from "../../components/Sidebar";
14+import Post from "../../components/ecosystem/Post";
15+import classnames from "classnames";
16+import Link from "next/link";
17+import { getAllPosts } from "../../lib/lib";
18+import fs from "fs";
19+import path from "path";
20+import Contact from "../../components/Contact";
21+import { generateDisplayDate, formatDate } from "../../lib/lib";
22+
23+export default function Ecosystem({
24+ search,
25+ post,
26+ posts,
27+ applications,
28+ marketplaces,
29+ organizations,
30+ podcasts,
31+}) {
32+ const router = useRouter();
33+
34+ const { type } = router.query;
35+
36+ if (type === "archive") {
37+ return <SpotlightArchive posts={posts} search={search} />;
38+ }
39+
40+ let title;
41+ if (type) {
42+ switch (type) {
43+ case "applications":
44+ title = "Applications";
45+ break;
46+ case "marketplaces":
47+ title = "Marketplaces";
48+ break;
49+ case "podcasts":
50+ title = "Podcasts";
51+ break;
52+ case "organizations":
53+ title = "Organizations";
54+ break;
55+ default:
56+ title = "Spotlight";
57+ }
58+ } else {
59+ title = "Spotlight";
60+ }
61+
62+ const data = {
63+ title: title,
64+ description: "Explore the Urbit ecosystem.",
65+ };
66+ return (
67+ <Container>
68+ <Head>
69+ <title>{title} • Urbit</title>
70+ {Meta(data)}
71+ </Head>
72+ <IntraNav ourSite="https://urbit.org" search={search} />
73+ <SingleColumn>
74+ <Header />
75+ <Section>
76+ <h1>Ecosystem</h1>
77+ </Section>
78+ <Section className="justify-center">
79+ <div className="flex justify-between sidebar">
80+ <Sidebar search={search}>
81+ <EcosystemSidebar />
82+ </Sidebar>
83+ <div
84+ className={classnames("w-full", {
85+ "max-w-prose": type === undefined,
86+ })}
87+ >
88+ {type === undefined && (
89+ <h3>{`Ecosystem Spotlight - ${post.title}`}</h3>
90+ )}
91+ {type === undefined && (
92+ <>
93+ <Post post={post} />
94+ <Link href="/ecosystem/?type=archive" passHref>
95+ <a className="button-lg bg-wall-600 text-white w-fit">
96+ Spotlight Archive
97+ </a>
98+ </Link>
99+
100+ <div className="pt-36">
101+ <h3 className="pb-2">Urbit Monthly</h3>
102+ <p className="pb-8">
103+ Get the Spotlight in your inbox along with updates on
104+ everything Urbit.
105+ </p>
106+ <Contact emphasize className="w-full" />
107+ </div>
108+ </>
109+ )}
110+
111+ <div
112+ className={classnames("grid gap-12 w-full", {
113+ "grid-cols-2 md:grid-cols-3": type !== "podcasts",
114+ "grid-cols-1": type === "podcasts",
115+ "grid-cols-1 md:grid-cols-1 lg:grid-cols-1 xl:grid-cols-2":
116+ type === "applications",
117+ hidden: type === undefined,
118+ })}
119+ >
120+ {type === "organizations" &&
121+ organizations.map((org) => (
122+ <Link href={`/organizations/${org.slug}`}>
123+ <div className="flex flex-col space-y-4 items-center cursor-pointer hover:opacity-90">
124+ <img className="w-36 rounded-xl" src={org.image} />
125+ <p className="text-center font-bold">{org.title}</p>
126+ </div>
127+ </Link>
128+ ))}
129+
130+ {type === "applications" &&
131+ applications.map((app) => (
132+ <Link href={`/applications/${app.ship}/${app.slug}`}>
133+ <div className="flex space-x-4 items-center cursor-pointer hover:opacity-90">
134+ <div
135+ className="h-36 w-36 rounded-xl items-center justify-center shrink-0 overflow-hidden"
136+ style={{
137+ backgroundColor: app?.bgColor || "rgba(0,0,0,0)",
138+ }}
139+ >
140+ {app?.image && (
141+ <img
142+ className="items-center h-36 w-36"
143+ src={app.image}
144+ />
145+ )}
146+ </div>
147+ <div className="">
148+ <p className="text-left font-bold">{app.title}</p>
149+ <p className="text-left text-wall-400 font-light">
150+ {app.description}
151+ </p>
152+ </div>
153+ </div>
154+ </Link>
155+ ))}
156+ {type === "marketplaces" &&
157+ marketplaces.map((market) => (
158+ <Link href={`/marketplaces/${market.slug}`}>
159+ <div className="flex flex-col space-y-4 justify-center items-center cursor-pointer hover:opacity-90">
160+ <img className="w-36 rounded-xl" src={market.image} />
161+ <p className="text-center font-bold">{market.title}</p>
162+ </div>
163+ </Link>
164+ ))}
165+ {type === "podcasts" &&
166+ podcasts.map((pod) => (
167+ <Link href={`/podcasts/${pod.slug}`}>
168+ <div className="flex cursor-pointer space-x-4 items-center hover:opacity-90">
169+ <img className="w-28" src={pod.image} />
170+ <div className="flex flex-col space-y-2 min-w-0">
171+ <p className="font-bold">{pod.podcast}</p>
172+ <p className="min-w-0 min-h-0 leading-5 ">
173+ {pod.title}
174+ </p>
175+ <p className="text-wall-400">
176+ {formatDate(generateDisplayDate(pod.date))}
177+ </p>
178+ </div>
179+ </div>
180+ </Link>
181+ ))}
182+ </div>
183+ </div>
184+ </div>
185+ </Section>
186+ </SingleColumn>
187+ <Footer />
188+ </Container>
189+ );
190+}
191+
192+function ActiveLink({ children, href, className, currentPath }) {
193+ // special casing this behaviour which overloads one nav
194+ const archive = Boolean(
195+ currentPath === "/ecosystem?type=archive" && href === "/ecosystem"
196+ );
197+ const activeClassName = classnames({
198+ "text-wall-800": currentPath === href || archive,
199+ "text-wall-400": currentPath !== href && !archive,
200+ });
201+
202+ return (
203+ <Link href={href} passHref>
204+ <a className={`${className} ${activeClassName}`}>{children}</a>
205+ </Link>
206+ );
207+}
208+
209+function EcosystemSidebar() {
210+ const router = useRouter();
211+ let currentPath = router.asPath;
212+ return (
213+ <div className="flex flex-col space-y-4 pr-24">
214+ <ActiveLink
215+ currentPath={currentPath}
216+ className="type-ui"
217+ href="/ecosystem"
218+ >
219+ Spotlight
220+ </ActiveLink>
221+ <ActiveLink
222+ currentPath={currentPath}
223+ className="type-ui"
224+ href="/ecosystem?type=organizations"
225+ >
226+ Organizations
227+ </ActiveLink>
228+ <ActiveLink
229+ currentPath={currentPath}
230+ className="type-ui"
231+ href="/ecosystem?type=applications"
232+ >
233+ Applications
234+ </ActiveLink>
235+ <ActiveLink
236+ currentPath={currentPath}
237+ className="type-ui"
238+ href="/ecosystem?type=marketplaces"
239+ >
240+ Marketplaces
241+ </ActiveLink>
242+ <ActiveLink
243+ currentPath={currentPath}
244+ className="mr-5 type-ui"
245+ href="/ecosystem?type=podcasts"
246+ >
247+ Podcasts
248+ </ActiveLink>
249+ </div>
250+ );
251+}
252+
253+function SpotlightArchive({ posts, search }) {
254+ const post = {
255+ title: "Spotlight Archive",
256+ description: "The archive of ecosystem spotlights.",
257+ };
258+ return (
259+ <Container>
260+ <Head>
261+ <title>Archive • Spotlight • Urbit</title>
262+ {Meta(post)}
263+ </Head>
264+ <IntraNav ourSite="https://urbit.org" search={search} />
265+ <SingleColumn>
266+ <Header />
267+ <Section>
268+ <div className="measure">
269+ <h1>Ecosystem</h1>
270+ </div>
271+ </Section>
272+ <Section className="flex">
273+ <Sidebar>
274+ <EcosystemSidebar />
275+ </Sidebar>
276+ <div>
277+ <h3 className="mb-12">Spotlight Archive</h3>
278+ {posts.map((post) => {
279+ return (
280+ <div key={post.slug} className="mb-24 cursor-pointer">
281+ <Link href={`/ecosystem/spotlight/${post.slug}`}>
282+ <div>
283+ <h3 className="text-green-400">{post.title}</h3>
284+ <div className="type-ui mt-2">
285+ {["featured-1", "featured-2", "featured-3"].map(
286+ (feat, i) => {
287+ if (post?.[feat]) {
288+ return (
289+ <>
290+ {i ? ", " : ""}
291+ <span>{post[feat].title}</span>
292+ </>
293+ );
294+ }
295+ }
296+ )}
297+ </div>
298+ </div>
299+ </Link>
300+ </div>
301+ );
302+ })}
303+ </div>
304+ </Section>
305+ </SingleColumn>
306+ <Footer />
307+ </Container>
308+ );
309+}
310+
311+export async function getStaticProps({}) {
312+ const posts = getAllPosts(
313+ ["title", "date", "slug", "featured-1", "featured-2", "featured-3"],
314+ "ecosystem/spotlight",
315+ "date"
316+ );
317+ let post = getAllPosts(
318+ ["title", "date", "featured-1", "featured-2", "featured-3"],
319+ "ecosystem/spotlight",
320+ "date"
321+ )[0];
322+ const marketplaces = getAllPosts(["title", "image", "slug"], "marketplaces");
323+ const podcasts = getAllPosts(
324+ ["title", "image", "date", "podcast", "slug"],
325+ "podcasts",
326+ "date"
327+ );
328+ const organizations = getAllPosts(
329+ ["title", "image", "slug"],
330+ "organizations"
331+ );
332+ const applications = fs
333+ .readdirSync(path.join(process.cwd(), "content/applications"), {
334+ withFileTypes: true,
335+ })
336+ .filter((f) => f.isDirectory())
337+ .map((dir) =>
338+ getAllPosts(
339+ ["title", "bgColor", "image", "slug", "description"],
340+ `applications/${dir.name}`
341+ )
342+ .map((e) => ({ ...e, ship: dir.name }))
343+ .flat()
344+ )
345+ .flat()
346+ .sort((a, b) => {
347+ const nameA = a.title.toLowerCase();
348+ const nameB = b.title.toLowerCase();
349+ return nameA < nameB ? -1 : 1;
350+ });
351+
352+ ["featured-1", "featured-2", "featured-3"].forEach((feat) => {
353+ if (post?.[feat]) {
354+ const matchedPost = [
355+ ...applications.map((e) => ({ ...e, type: "Application" })),
356+ ...organizations.map((e) => ({ ...e, type: "Organization" })),
357+ ...podcasts.map((e) => ({ ...e, type: "Podcast" })),
358+ ...marketplaces.map((e) => ({ ...e, type: "Marketplace" })),
359+ ].filter((e) => e.title === post[feat].title)?.[0];
360+ post[feat].image = post[feat]?.image || matchedPost?.image || null;
361+ post[feat].type = matchedPost?.type || "Podcast";
362+ post[feat].matchedPost = matchedPost || null;
363+ post[feat].content = JSON.stringify(
364+ Markdown.parse({
365+ post: { content: post[feat].content },
366+ })
367+ );
368+ }
369+ });
370+
371+ return {
372+ props: { posts, post, applications, marketplaces, podcasts, organizations },
373+ };
374+}
pages/ecosystem/spotlight/[slug].jsnew file+118
@@ -0,0 +1,118 @@
1+import { useRouter } from "next/router";
2+import Head from "next/head";
3+import Meta from "../../../components/Meta";
4+import ErrorPage from "../../../pages/404";
5+import {
6+ Container,
7+ SingleColumn,
8+ Section,
9+ Markdown,
10+ IntraNav,
11+} from "foundation-design-system";
12+import Header from "../../../components/Header";
13+import Footer from "../../../components/Footer";
14+import Post from "../../../components/ecosystem/Post";
15+import { getAllPosts, getPostBySlug } from "../../../lib/lib";
16+import fs from "fs";
17+import path from "path";
18+
19+export default function BasicPage({ post, markdown, search, index = false }) {
20+ const router = useRouter();
21+ if (!router.isFallback && !post?.slug) {
22+ return <ErrorPage />;
23+ }
24+ return (
25+ <Container>
26+ <Head>
27+ <title>Urbit • {post.title}</title>
28+ {Meta(post)}
29+ </Head>
30+ <IntraNav ourSite="https://urbit.org" search={search} />
31+ <SingleColumn>
32+ <Header />
33+ <Section narrow>
34+ <h1>Ecosystem Spotlight - {post.title}</h1>
35+ </Section>
36+ <Section narrow>
37+ <Post post={post} />
38+ </Section>
39+ </SingleColumn>
40+ <Footer />
41+ </Container>
42+ );
43+}
44+
45+export async function getStaticProps({ params }) {
46+ const post = getPostBySlug(
47+ params.slug,
48+ ["title", "slug", "date", "featured-1", "featured-2", "featured-3"],
49+ "ecosystem/spotlight"
50+ );
51+ const marketplaces = getAllPosts(["title", "image", "slug"], "marketplaces");
52+ const podcasts = getAllPosts(
53+ ["title", "image", "date", "podcast", "slug"],
54+ "podcasts",
55+ "date"
56+ );
57+ const organizations = getAllPosts(
58+ ["title", "image", "slug"],
59+ "organizations"
60+ );
61+ const applications = fs
62+ .readdirSync(path.join(process.cwd(), "content/applications"), {
63+ withFileTypes: true,
64+ })
65+ .filter((f) => f.isDirectory())
66+ .map((dir) =>
67+ getAllPosts(
68+ ["title", "bgColor", "image", "slug", "description"],
69+ `applications/${dir.name}`
70+ )
71+ .map((e) => ({ ...e, ship: dir.name }))
72+ .flat()
73+ )
74+ .flat()
75+ .sort((a, b) => {
76+ const nameA = a.title.toLowerCase();
77+ const nameB = b.title.toLowerCase();
78+ return nameA < nameB ? -1 : 1;
79+ });
80+
81+ ["featured-1", "featured-2", "featured-3"].forEach((feat) => {
82+ if (post?.[feat]) {
83+ const matchedPost = [
84+ ...applications.map((e) => ({ ...e, type: "Application" })),
85+ ...organizations.map((e) => ({ ...e, type: "Organization" })),
86+ ...podcasts.map((e) => ({ ...e, type: "Podcast" })),
87+ ...marketplaces.map((e) => ({ ...e, type: "Marketplace" })),
88+ ].filter((e) => e.title === post[feat].title)?.[0];
89+ post[feat].image = post[feat]?.image || matchedPost?.image || null;
90+ post[feat].type = matchedPost?.type || "Podcast";
91+ post[feat].matchedPost = matchedPost || null;
92+ post[feat].content = JSON.stringify(
93+ Markdown.parse({
94+ post: { content: post[feat].content },
95+ })
96+ );
97+ }
98+ });
99+
100+ return {
101+ props: { post },
102+ };
103+}
104+
105+export async function getStaticPaths() {
106+ const posts = getAllPosts(["slug", "date"], "ecosystem/spotlight", "date");
107+
108+ return {
109+ paths: posts.map((post) => {
110+ return {
111+ params: {
112+ slug: post.slug,
113+ },
114+ };
115+ }),
116+ fallback: false,
117+ };
118+}
pages/events/[slug].js−3
@@ -122,9 +122,6 @@ export default function Event({
122122 <Section short narrow className="markdown">
123123 <Markdown.render content={JSON.parse(markdown)} />
124124 </Section>
125− <Section narrow>
126− <Contact />
127− </Section>
128125 <Section wide className="flex">
129126 <TwoUp>
130127 {previousEvent ? (
pages/groups/[[...group]].js+3−5
@@ -99,12 +99,10 @@ const GroupPage = ({ data, markdown, params }) => {
9999 Urbit is a clean-slate, peer-to-peer operating system and network.
100100 </h3>
101101 <div className="flex flex-col space-y-4">
102− <p className="text-sm font-semibold text-wall-400">
103− Get on the network and join this group.
104− </p>
102+
105103 <Link href="/guides/joining-groups" passHref>
106104 <a className="button-lg max-w-xs bg-green-400 text-white">
107− How to join a group
105+ How to Join an Urbit Group
108106 </a>
109107 </Link>
110108 </div>
@@ -113,7 +111,7 @@ const GroupPage = ({ data, markdown, params }) => {
113111 <div className="flex flex-col space-y-1">
114112 <p>Have a group you'd like to share publicly through urbit.org?</p>
115113 <Link href="/groups/submit" passHref>
116− <a className="type-ui text-green-400">Submit your group</a>
114+ <a className="font-bold text-green-400">Submit your group</a>
117115 </Link>
118116 </div>
119117 <Link href="/" passHref>
pages/ids/[id].js+2−5
@@ -145,12 +145,9 @@ const IdPage = ({ data, markdown, applications, groups, network, params }) => {
145145 Urbit is a clean-slate, peer-to-peer operating system and network.
146146 </h3>
147147 <div className="flex flex-col space-y-4">
148− <p className="text-md font-semibold text-wall-400">
149− Learn how get your own Urbit ID.
150− </p>
151148 <Link href="/guides/getting-an-urbit-id">
152149 <button className="button-lg max-w-xs bg-green-400 text-white">
153− Get an Urbit ID
150+ Learn how to get an Urbit ID
154151 </button>
155152 </Link>
156153 </div>
@@ -159,7 +156,7 @@ const IdPage = ({ data, markdown, applications, groups, network, params }) => {
159156 <div className="flex flex-col space-y-1">
160157 <p>Have an Urbit ID?</p>
161158 <Link href="/ids/submit" passHref>
162− <a className="type-ui text-green-400">
159+ <a className="font-bold text-green-400">
163160 Claim and customize your Urbit ID page
164161 </a>
165162 </Link>
pages/index.js+99−7
@@ -16,8 +16,17 @@ import EventPreview from "../components/EventPreview";
1616import TwoUp from "../components/TwoUp";
1717import { getAllPosts, getAllEvents, generateRealtimeDate } from "../lib/lib";
1818import { eventKeys } from "../lib/constants";
19+import IndexCard from "../components/ecosystem/IndexCard";
20+import fs from "fs";
21+import path from "path";
1922
20−export default function Home({ posts, events, grantNumbers, search }) {
23+export default function Home({
24+ posts,
25+ ecosystem,
26+ events,
27+ grantNumbers,
28+ search,
29+}) {
2130 return (
2231 <Container>
2332 <Head>
@@ -79,7 +88,36 @@ export default function Home({ posts, events, grantNumbers, search }) {
7988 </a>
8089 </Link>
8190 </Section>
82−
91+ {/* Ecosystem */}
92+ <Section>
93+ <div className="flex flex-col space-y-8 pb-12">
94+ <h2 className="m-0 p-0 mr-4">Ecosystem</h2>
95+ <p>
96+ The Urbit ecosystem is comprised of a wide variety of individuals
97+ and organizations, including developers, DAOs, podcasters, and
98+ more.
99+ </p>
100+ <div className="flex flex-col space-y-4 md:space-y-0 md:flex-row md:space-x-4">
101+ {["featured-1", "featured-2", "featured-3"].map((feat) => {
102+ if (ecosystem?.[feat]) {
103+ return (
104+ <IndexCard
105+ slug={`/ecosystem/#${ecosystem[feat]?.title
106+ .toLowerCase()
107+ .replace(/ /, "-")}`}
108+ feat={ecosystem[feat]}
109+ />
110+ );
111+ }
112+ })}
113+ </div>
114+ <Link href="/ecosystem" passHref>
115+ <a className="z-50 button-lg bg-green-400 text-white w-fit">
116+ Explore Ecosystem
117+ </a>
118+ </Link>
119+ </div>
120+ </Section>
83121 {
84122 // Grants
85123 }
@@ -215,28 +253,79 @@ export default function Home({ posts, events, grantNumbers, search }) {
215253 </Link>
216254 </Section>
217255
218− {
219− // Newsletter and social media
220− }
221256 <Section narrow>
257+ <h3 className="pb-2">Urbit Monthly</h3>
258+ <p className="pb-8">Get monthly email updates on all things Urbit.</p>
259+
222260 <Contact emphasize />
223261 </Section>
224262 </SingleColumn>
225−
226263 <Footer />
227264 </Container>
228265 );
229266}
230267
231268export async function getStaticProps() {
269+ // Latest blog posts
232270 const posts = getAllPosts(
233271 ["title", "slug", "date", "description", "extra"],
234272 "blog",
235273 "date"
236274 );
237275
238− const events = getAllEvents(eventKeys, "events");
276+ // Pull all latest ecosystem information
277+ const ecosystem = getAllPosts(
278+ ["featured-1", "featured-2", "featured-3"],
279+ "ecosystem/spotlight",
280+ "date"
281+ )[0];
282+
283+ const marketplaces = getAllPosts(["title", "image", "slug"], "marketplaces");
284+ const podcasts = getAllPosts(
285+ ["title", "image", "date", "podcast", "slug"],
286+ "podcasts",
287+ "date"
288+ );
289+ const organizations = getAllPosts(
290+ ["title", "image", "slug"],
291+ "organizations"
292+ );
293+ const applications = fs
294+ .readdirSync(path.join(process.cwd(), "content/applications"), {
295+ withFileTypes: true,
296+ })
297+ .filter((f) => f.isDirectory())
298+ .map((dir) =>
299+ getAllPosts(
300+ ["title", "bgColor", "image", "slug", "description"],
301+ `applications/${dir.name}`
302+ )
303+ .map((e) => ({ ...e, ship: dir.name }))
304+ .flat()
305+ )
306+ .flat()
307+ .sort((a, b) => {
308+ const nameA = a.title.toLowerCase();
309+ const nameB = b.title.toLowerCase();
310+ return nameA < nameB ? -1 : 1;
311+ });
239312
313+ ["featured-1", "featured-2", "featured-3"].forEach((feat) => {
314+ if (ecosystem?.[feat]) {
315+ const matchedPost = [
316+ ...applications.map((e) => ({ ...e, type: "Application" })),
317+ ...organizations.map((e) => ({ ...e, type: "Organization" })),
318+ ...podcasts.map((e) => ({ ...e, type: "Podcast" })),
319+ ...marketplaces.map((e) => ({ ...e, type: "Marketplace" })),
320+ ].filter((e) => e.title === ecosystem[feat].title)?.[0];
321+ ecosystem[feat].image =
322+ ecosystem[feat].image || matchedPost?.image || null;
323+ ecosystem[feat].type = matchedPost?.type || "Podcast";
324+ ecosystem[feat].matchedPost = matchedPost || null;
325+ }
326+ });
327+
328+ // Latest grants
240329 const grants = getAllPosts(["extra", "taxonomies"], "grants", "date");
241330
242331 const grantNumbers = {
@@ -259,6 +348,8 @@ export async function getStaticProps() {
259348 ).length,
260349 };
261350
351+ // Latest events
352+ const events = getAllEvents(eventKeys, "events");
262353 const now = DateTime.now();
263354
264355 const pastEvents = events.filter((event) => {
@@ -291,6 +382,7 @@ export async function getStaticProps() {
291382 return {
292383 props: {
293384 posts,
385+ ecosystem,
294386 grantNumbers,
295387 events: happeningNow.concat(futureEvents).concat(pastEvents),
296388 },
pages/marketplaces/[slug].jsnew file+80
@@ -0,0 +1,80 @@
1+import { getAllPosts, getPostBySlug, getPostSlugs } from "../../lib/lib";
2+import BasicPage from "../../components/ecosystem/BasicPage";
3+import { Markdown } from "foundation-design-system";
4+import Link from "next/link";
5+
6+export default function Marketplace({
7+ post,
8+ markdown,
9+ search,
10+ index,
11+ spotlights = [],
12+}) {
13+ return (
14+ <BasicPage
15+ section="Marketplaces"
16+ post={post}
17+ markdown={markdown}
18+ search={search}
19+ index={index}
20+ >
21+ {spotlights.length > 0 && (
22+ <p>
23+ Featured in{" "}
24+ {spotlights.map((e, i) => (
25+ <>
26+ {i ? ", " : ""}
27+ <Link href={`/ecosystem/spotlight/${e.slug}`}>{e.title}</Link>
28+ </>
29+ ))}
30+ </p>
31+ )}
32+ </BasicPage>
33+ );
34+}
35+
36+export async function getStaticProps({ params }) {
37+ const post = getPostBySlug(
38+ params.slug,
39+ ["title", "slug", "URL", "image", "payment", "content"],
40+ "marketplaces"
41+ );
42+
43+ const spotlights = getAllPosts(
44+ ["title", "slug", "featured-1", "featured-2", "featured-3"],
45+ "ecosystem/spotlight"
46+ ).filter(
47+ (e) =>
48+ e?.["featured-1"]?.title === post.title ||
49+ e?.["featured-2"]?.title === post.title ||
50+ e?.["featured-3"]?.title === post.title
51+ );
52+
53+ let { index } = post?.extra || { index: null };
54+
55+ if (index === undefined) {
56+ index = null;
57+ }
58+
59+ const markdown = JSON.stringify(Markdown.parse({ post }));
60+ return {
61+ props: { post, markdown, spotlights, index },
62+ };
63+}
64+
65+export async function getStaticPaths() {
66+ const posts = getPostSlugs("marketplaces");
67+
68+ const slugs = posts.map((e) => e.slice(0, -3));
69+
70+ return {
71+ paths: slugs.map((post) => {
72+ return {
73+ params: {
74+ slug: post,
75+ },
76+ };
77+ }),
78+ fallback: false,
79+ };
80+}
pages/media.jsdeleted−114
@@ -1,114 +0,0 @@
1−import Head from "next/head";
2−import Link from "next/link";
3−import Meta from "../components/Meta";
4−import {
5− Container,
6− SingleColumn,
7− Section,
8− IntraNav,
9−} from "foundation-design-system";
10−import Footer from "../components/Footer";
11−import Header from "../components/Header";
12−import { getAllPosts } from "../lib/lib";
13−
14−export function MediaPreview({ event, dir, className }) {
15− // Event tiles have a 'dark mode' used when their background images are dark and white text is needed for legibility.
16− const grayText = event.extra?.dark ? "text-midWhite" : "text-wall-500";
17− const blackText = event.extra?.dark ? "text-white" : "text-wall-600";
18−
19− return (
20− <div
21− key={event.slug}
22− className={`mb-24 cursor-pointer bg-wall-100 rounded-xl h-96 bg-cover bg-center bg-no-repeat ${className}`}
23− style={{
24− backgroundImage:
25− `${
26− event.extra?.overlay
27− ? "linear-gradient(rgba(0,0,0,0.3), rgba(0,0,0,0.3)),"
28− : ""
29− }url(${event.extra?.image})` || "",
30− }}
31− >
32− <Link href={`${dir ? dir : "/events/"}${event.slug}`}>
33− <div className="flex flex-col p-8 justify-between items-between h-full relative">
34− <div className="grow-1 flex flex-col justify-center h-full">
35− <h3 className={`mb-4 ${blackText}`}>{event.title}</h3>
36− <h4 className={grayText}>{event?.type}</h4>
37− </div>
38− <div className="absolute left-8 bottom-8 w-full">
39− <p className={grayText}>{event.extra.host}</p>
40− <p className={grayText}>{event.extra.guests}</p>
41− </div>
42− {event.extra.youtube ? (
43− <a
44− onClick={(e) => e.stopPropagation()}
45− className="absolute w-16 h-16 right-8 bottom-8 bg-white flex items-center justify-center rounded-full"
46− target="_blank"
47− href={`https://www.youtube.com/watch?v=${event.extra.youtube}`}
48− >
49− <svg
50− width="48"
51− height="48"
52− viewBox="0 0 16 16"
53− fill="none"
54− xmlns="http://www.w3.org/2000/svg"
55− >
56− <path
57− d="M11.25 7.56699C11.5833 7.75944 11.5833 8.24056 11.25 8.43301L6.75 11.0311C6.41667 11.2235 6 10.983 6 10.5981L6 5.40192C6 5.01702 6.41667 4.77646 6.75 4.96891L11.25 7.56699Z"
58− fill="black"
59− />
60− </svg>
61− </a>
62− ) : null}
63− </div>
64− </Link>
65− </div>
66− );
67−}
68−
69−export default function Media({ posts, search }) {
70− const post = {
71− title: "Media",
72− description:
73− "A selection of external appearances by the Tlon Corporation and the Urbit Foundation.",
74− };
75− return (
76− <Container>
77− <Head>
78− <title>Media • urbit.org</title>
79− {Meta(post)}
80− </Head>
81− <IntraNav ourSite="https://urbit.org" search={search} />
82− <SingleColumn>
83− <Header />
84− <Section narrow>
85− <div className="measure">
86− <h1 className="pb-16">Media</h1>
87− <p className="pb-6">
88− Selected external media appearances from Tlon and the Urbit
89− Foundation.
90− </p>
91− </div>
92− </Section>
93− <Section narrow>
94− {posts.map((post) => {
95− return <MediaPreview event={post} dir="/media/" />;
96− })}
97− </Section>
98− </SingleColumn>
99− <Footer />
100− </Container>
101− );
102−}
103−
104−export async function getStaticProps() {
105− const posts = getAllPosts(
106− ["title", "slug", "date", "description", "extra"],
107− "media",
108− "date"
109− );
110−
111− return {
112− props: { posts },
113− };
114−}
pages/media/[slug].jsdeleted−117
@@ -1,117 +0,0 @@
1−import { useRouter } from "next/router";
2−import {
3− getPostBySlug,
4− getAllPosts,
5− formatDate,
6− generateDisplayDate,
7−} from "../../lib/lib";
8−import Head from "next/head";
9−import Link from "next/link";
10−import Meta from "../../components/Meta";
11−import ErrorPage from "../404";
12−import {
13− Container,
14− Markdown,
15− SingleColumn,
16− Section,
17− IntraNav,
18−} from "foundation-design-system";
19−import Header from "../../components/Header";
20−import Footer from "../../components/Footer";
21−import Contact from "../../components/Contact";
22−
23−export default function MediaPage({ post, markdown, search }) {
24− const router = useRouter();
25− if (!router.isFallback && !post?.slug) {
26− return <ErrorPage />;
27− }
28− const date = generateDisplayDate(post.date);
29− return (
30− <Container>
31− <Head>
32− <title>{post.title} • Media • urbit.org</title>
33− {Meta(post)}
34− </Head>
35− <IntraNav ourSite="https://urbit.org" search={search} />
36− <SingleColumn>
37− <Header />
38− <Section narrow short>
39− <h1>{post.title}</h1>
40− {post.extra.author ? (
41− <div className="type-ui text-wall-500 mt-4 md:mt-8 lg:mt-10">
42− {post.extra.author}
43− </div>
44− ) : null}
45− {post.extra.ship ? (
46− <Link href={`/ids/${post.extra.ship}`} passHref>
47− <a className="type-sub-bold text-wall-500 font-mono">
48− {post.extra.ship}
49− </a>
50− </Link>
51− ) : null}
52− <div className="type-ui text-wall-500 mt-16">{formatDate(date)}</div>
53− </Section>
54− <Section narrow>
55− {post.extra.youtube ? (
56− <iframe
57− className="rounded-xl"
58− width="100%"
59− height="640px"
60− src={`https://www.youtube.com/embed/${post.extra.youtube}`}
61− frameborder="0"
62− allow="encrypted-media"
63− allowfullscreen
64− ></iframe>
65− ) : null}
66− {post.extra.soundcloud ? (
67− <iframe
68− width="100%"
69− height="300"
70− scrolling="no"
71− frameborder="no"
72− allow="autoplay"
73− src={post.extra.soundcloud}
74− ></iframe>
75− ) : null}
76− </Section>
77− <Section narrow className="markdown">
78− <Markdown.render content={JSON.parse(markdown)} />
79− </Section>
80− <Section narrow>
81− <Contact />
82− </Section>
83− </SingleColumn>
84− <Footer />
85− </Container>
86− );
87−}
88−
89−//
90−export async function getStaticProps({ params }) {
91− const post = getPostBySlug(
92− params.slug,
93− ["title", "slug", "date", "description", "content", "extra"],
94− "media"
95− );
96−
97− const markdown = JSON.stringify(Markdown.parse({ post }));
98−
99− return {
100− props: { post, markdown },
101− };
102−}
103−
104−export async function getStaticPaths() {
105− const posts = getAllPosts(["slug", "date"], "media", "date");
106−
107− return {
108− paths: posts.map((post) => {
109− return {
110− params: {
111− slug: post.slug,
112− },
113− };
114− }),
115− fallback: false,
116− };
117−}
pages/organizations/[slug].jsnew file+168
@@ -0,0 +1,168 @@
1+// Single page per organisation
2+// Needs to have *associated ships* by which it polls content/applications for applications it "owns"
3+// Needs to look for its title in ecosystem/spotlight
4+import { getAllPosts, getPostBySlug, getPostSlugs } from "../../lib/lib";
5+import BasicPage from "../../components/ecosystem/BasicPage";
6+import { Markdown } from "foundation-design-system";
7+import Link from "next/link";
8+import fs from "fs";
9+import path from "path";
10+
11+export default function Organization({
12+ post,
13+ markdown,
14+ search,
15+ index,
16+ groups,
17+ applications = [],
18+ spotlights = [],
19+}) {
20+ return (
21+ <BasicPage
22+ section="Organizations"
23+ post={post}
24+ markdown={markdown}
25+ search={search}
26+ index={index}
27+ >
28+ {spotlights.length > 0 && (
29+ <p>
30+ Featured in{" "}
31+ {spotlights.map((e, i) => (
32+ <>
33+ {i ? ", " : ""}
34+ <Link href={`/ecosystem/spotlight/${e.slug}`}>{e.title}</Link>
35+ </>
36+ ))}
37+ </p>
38+ )}
39+ {applications.length > 0 && (
40+ <>
41+ <h3>Applications</h3>
42+ <div className="grid grid-cols-2 md:grid-cols-4 gap-8 h-full w-full">
43+ {applications.map((app) => (
44+ <Link href={`/applications/${app.ship}/${app.slug}`}>
45+ <div className="flex flex-col h-full w-full space-y-4 cursor-pointer">
46+ <div
47+ className="overflow-hidden rounded-xl w-full"
48+ style={{
49+ backgroundColor: app.bgColor || "rgba(0,0,0,0)",
50+ aspectRatio: "1",
51+ }}
52+ >
53+ {app.image && (
54+ <img src={app.image} className="h-full w-full" />
55+ )}
56+ </div>
57+ <p className="text-center font-bold font-xl">{app.title}</p>
58+ </div>
59+ </Link>
60+ ))}
61+ </div>
62+ </>
63+ )}
64+ {groups.length > 0 && (
65+ <>
66+ <h3>Groups</h3>
67+ <div className="grid grid-cols-2 md:grid-cols-4 gap-4">
68+ {groups.map((group) => (
69+ <Link href={`/groups/${group.ship}/${group.slug}`}>
70+ <div className="flex flex-col space-y-4 cursor-pointer">
71+ {group?.tile?.startsWith("#") ? (
72+ <div
73+ className="rounded-xl"
74+ style={{
75+ backgroundColor: group.tile,
76+ height: 164,
77+ width: 164,
78+ }}
79+ />
80+ ) : (
81+ <img
82+ src={group.tile}
83+ className="h-full w-full rounded-xl"
84+ />
85+ )}
86+ <p className="text-center font-bold font-xl">{group.title}</p>
87+ </div>
88+ </Link>
89+ ))}
90+ </div>
91+ </>
92+ )}
93+ </BasicPage>
94+ );
95+}
96+
97+export async function getStaticProps({ params }) {
98+ const post = getPostBySlug(
99+ params.slug,
100+ ["title", "slug", "URL", "image", "ships", "group", "content"],
101+ "organizations"
102+ );
103+
104+ const spotlights = getAllPosts(
105+ ["title", "slug", "featured-1", "featured-2", "featured-3"],
106+ "ecosystem/spotlight"
107+ ).filter(
108+ (e) =>
109+ e?.["featured-1"]?.title === post.title ||
110+ e?.["featured-2"]?.title === post.title ||
111+ e?.["featured-3"]?.title === post.title
112+ );
113+
114+ const applications = post.ships
115+ .map((ship) => {
116+ let apps = [];
117+ if (
118+ fs.existsSync(path.join(process.cwd(), "content/applications", ship))
119+ ) {
120+ apps = getAllPosts(
121+ ["title", "image", "bgColor", "slug"],
122+ `applications/${ship}`
123+ ).map((e) => ({ ...e, ship }));
124+ }
125+ return apps;
126+ })
127+ .flat();
128+
129+ const groups = post.ships
130+ .map((ship) => {
131+ let groups = [];
132+ if (fs.existsSync(path.join(process.cwd(), "content/groups", ship))) {
133+ groups = getAllPosts(["title", "tile", "slug"], `groups/${ship}`).map(
134+ (e) => ({ ...e, ship })
135+ );
136+ }
137+ return groups;
138+ })
139+ .flat();
140+
141+ let { index } = post?.extra || { index: null };
142+
143+ if (index === undefined) {
144+ index = null;
145+ }
146+
147+ const markdown = JSON.stringify(Markdown.parse({ post }));
148+ return {
149+ props: { post, markdown, spotlights, applications, groups, index },
150+ };
151+}
152+
153+export async function getStaticPaths() {
154+ const posts = getPostSlugs("organizations");
155+
156+ const slugs = posts.map((e) => e.slice(0, -3));
157+
158+ return {
159+ paths: slugs.map((post) => {
160+ return {
161+ params: {
162+ slug: post,
163+ },
164+ };
165+ }),
166+ fallback: false,
167+ };
168+}
pages/overview/[[...slug]].js+3−1
@@ -32,7 +32,9 @@ export default function Overview({ posts, data, markdown, search }) {
3232 </Section>
3333 <Section>
3434 <div className="flex justify-between sidebar">
35− <Sidebar>{childPages("/overview", posts.pages)}</Sidebar>
35+ <Sidebar search={search}>
36+ {childPages("/overview", posts.pages)}
37+ </Sidebar>
3638 <div className="markdown max-w-prose">
3739 <h3>{data.title}</h3>
3840 <Markdown.render content={JSON.parse(markdown)} />
pages/podcasts/[slug].jsnew file+80
@@ -0,0 +1,80 @@
1+import { getAllPosts, getPostBySlug, getPostSlugs } from "../../lib/lib";
2+import BasicPage from "../../components/ecosystem/BasicPage";
3+import { Markdown } from "foundation-design-system";
4+import Link from "next/link";
5+
6+export default function Podcast({
7+ post,
8+ markdown,
9+ search,
10+ index,
11+ spotlights = [],
12+}) {
13+ return (
14+ <BasicPage
15+ section="Podcasts"
16+ post={post}
17+ markdown={markdown}
18+ search={search}
19+ index={index}
20+ >
21+ {spotlights.length > 0 && (
22+ <p>
23+ Featured in{" "}
24+ {spotlights.map((e, i) => (
25+ <>
26+ {i ? ", " : ""}
27+ <Link href={`/ecosystem/spotlight/${e.slug}`}>{e.title}</Link>
28+ </>
29+ ))}
30+ </p>
31+ )}
32+ </BasicPage>
33+ );
34+}
35+
36+export async function getStaticProps({ params }) {
37+ const post = getPostBySlug(
38+ params.slug,
39+ ["title", "slug", "URL", "podcast", "date", "image", "content"],
40+ "podcasts"
41+ );
42+
43+ const spotlights = getAllPosts(
44+ ["title", "slug", "featured-1", "featured-2", "featured-3"],
45+ "ecosystem/spotlight"
46+ ).filter(
47+ (e) =>
48+ e?.["featured-1"]?.title === post.title ||
49+ e?.["featured-2"]?.title === post.title ||
50+ e?.["featured-3"]?.title === post.title
51+ );
52+
53+ let { index } = post?.extra || { index: null };
54+
55+ if (index === undefined) {
56+ index = null;
57+ }
58+
59+ const markdown = JSON.stringify(Markdown.parse({ post }));
60+ return {
61+ props: { post, markdown, spotlights, index },
62+ };
63+}
64+
65+export async function getStaticPaths() {
66+ const posts = getPostSlugs("podcasts");
67+
68+ const slugs = posts.map((e) => e.slice(0, -3));
69+
70+ return {
71+ paths: slugs.map((post) => {
72+ return {
73+ params: {
74+ slug: post,
75+ },
76+ };
77+ }),
78+ fallback: false,
79+ };
80+}
pages/updates/[slug].js+1−3
@@ -57,9 +57,7 @@ export default function Post({ post, markdown, search }) {
5757 <Section narrow className="markdown">
5858 <Markdown.render content={JSON.parse(markdown)} />
5959 </Section>
60− <Section narrow>
61− <Contact />
62− </Section>
60+ <Section narrow>/></Section>
6361 <Section wide className="flex">
6462 {
6563 // {previousPost === null ? (
public/images/sound.svgnew file+5
@@ -0,0 +1,5 @@
1+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2+<path d="M16.0445 16.6848C15.6226 16.862 15.137 16.6642 14.9589 16.2423C14.7817 15.8204 14.9795 15.3348 15.4014 15.1567C15.6001 15.0723 15.797 14.9635 15.9883 14.8351C16.1729 14.7104 16.3464 14.567 16.5067 14.4067C16.667 14.2454 16.8114 14.072 16.9352 13.8882C17.0645 13.697 17.1723 13.5001 17.2567 13.3014C17.3467 13.0885 17.4161 12.8673 17.462 12.6385C17.5051 12.4239 17.5276 12.1923 17.5276 11.9429C17.5276 11.6935 17.5042 11.4601 17.462 11.2464C17.4161 11.0176 17.3467 10.7964 17.2567 10.5836C17.1723 10.3848 17.0645 10.188 16.9352 9.9967C16.8105 9.81201 16.667 9.63857 16.5067 9.47825C16.187 9.15857 15.812 8.90263 15.4014 8.72825C14.9795 8.55106 14.7808 8.0645 14.9589 7.64263C15.137 7.22076 15.6226 7.02295 16.0445 7.20012C16.666 7.46357 17.222 7.83951 17.6832 8.30167C17.9148 8.53323 18.1267 8.79012 18.3132 9.06761C18.4923 9.33386 18.6507 9.62542 18.7839 9.94042C18.9151 10.2517 19.0182 10.5798 19.0867 10.922C19.1551 11.2632 19.1917 11.6045 19.1917 11.9438C19.1917 12.2823 19.156 12.6245 19.0867 12.9657C19.0182 13.3079 18.9151 13.6351 18.7839 13.9463C18.6507 14.2613 18.4923 14.5538 18.3132 14.8201C18.1267 15.0976 17.9148 15.3545 17.6832 15.586C17.4517 15.8176 17.1948 16.0295 16.9173 16.2169C16.652 16.3932 16.3595 16.5507 16.0445 16.6848V16.6848Z" fill="white"/>
3+<path d="M17.5533 19.4897C17.1314 19.6669 16.6458 19.469 16.4677 19.0472C16.2905 18.6253 16.4883 18.1397 16.9102 17.9615C17.2908 17.8003 17.6592 17.5987 18.0117 17.3615C18.3586 17.1272 18.6849 16.8581 18.9839 16.559C19.283 16.26 19.5521 15.9346 19.7864 15.5868C20.0236 15.2343 20.2252 14.865 20.3864 14.4853C20.5542 14.0887 20.6836 13.6725 20.7708 13.2431C20.8533 12.8334 20.8964 12.3984 20.8964 11.9409C20.8964 11.4834 20.8524 11.0484 20.7708 10.6387C20.6846 10.2103 20.5543 9.79403 20.3864 9.39745C20.2252 9.01684 20.0236 8.64839 19.7864 8.2959C19.5521 7.94903 19.283 7.62277 18.9839 7.32371C18.6849 7.02464 18.3586 6.75558 18.0117 6.5212C17.6592 6.28401 17.2899 6.08245 16.9102 5.9212C16.4883 5.74307 16.2896 5.25652 16.4677 4.83558C16.6458 4.41371 17.1323 4.2159 17.5533 4.39307C18.0492 4.60307 18.5142 4.85432 18.9417 5.14307C19.3823 5.44026 19.7902 5.77681 20.1605 6.14713C20.5308 6.51745 20.8673 6.92526 21.1645 7.36588C21.4523 7.79336 21.7045 8.25839 21.9145 8.75432C22.1245 9.24932 22.2867 9.77152 22.3964 10.3143C22.5042 10.8515 22.5605 11.3953 22.5605 11.9418C22.5605 12.4874 22.5042 13.0321 22.3955 13.5693C22.2858 14.1121 22.1236 14.6343 21.9136 15.1293C21.7036 15.6252 21.4514 16.0902 21.1636 16.5168C20.8664 16.9574 20.5299 17.3652 20.1595 17.7355C19.7892 18.1049 19.3814 18.4415 18.9408 18.7396C18.5133 19.0274 18.0492 19.2796 17.5533 19.4896L17.5533 19.4897Z" fill="white"/>
4+<path d="M11.0694 4.12871C9.41287 5.37559 7.75526 6.62351 6.09878 7.87127L2.87198 7.87034C2.08543 7.87034 1.44043 8.51534 1.44043 9.30189V14.698C1.44043 15.4855 2.08543 16.1296 2.87198 16.1296H6.09782C7.75437 17.3765 9.41198 18.6244 11.0685 19.8722C11.8241 20.4403 12.6988 20.3494 12.6988 19.3631V4.6379C12.6997 3.65164 11.825 3.55977 11.0694 4.12883L11.0694 4.12871Z" fill="white"/>
5+</svg>
vercel.json+4
@@ -3,6 +3,10 @@
33 "silent": true
44 },
55 "redirects": [
6+ {
7+ "source": "/applications",
8+ "destination": "/ecosystem?type=applications"
9+ },
610 {
711 "source": "/understanding-urbit/:path*",
812 "destination": "/overview/:path*"