From 62d921a9f467e282a591b1d0ed01bf8f6cc86bb2 Mon Sep 17 00:00:00 2001 From: thelifeandtimes Date: Tue, 3 Mar 2026 21:25:39 -0800 Subject: [PATCH 1/5] fix: stabilize anchor scrolling and blurbs Restore consistent hash navigation and ensure Markdoc blurbs render as HTML to avoid client-side rendering errors. --- app/blog/page.js | 2 +- app/components/BlogNav.js | 35 ++--- app/components/ContentBlurbs.js | 46 +++++-- app/components/EcosystemNav.js | 35 ++--- app/components/HeaderNav.js | 14 +- app/components/Heading.jsx | 95 +++++++++++--- app/components/HomepageSectionNav.js | 58 +++------ app/components/MarkdocComponents.js | 37 ++++-- app/components/MobileFloatingNav.js | 25 ++-- app/components/ScrollManager.js | 88 ++++++++++--- app/ecosystem/page.js | 2 +- app/globals.css | 13 +- app/layout.js | 8 +- app/lib/anchorScroll.js | 150 ++++++++++++++++++++++ app/lib/queries.js | 21 ++- app/markdocConfig.js | 19 ++- app/overview/running-urbit/[slug]/page.js | 9 +- app/page.js | 12 +- 18 files changed, 480 insertions(+), 189 deletions(-) create mode 100644 app/lib/anchorScroll.js diff --git a/app/blog/page.js b/app/blog/page.js index 8c381502d9..226f3980ba 100644 --- a/app/blog/page.js +++ b/app/blog/page.js @@ -120,7 +120,7 @@ export default async function BlogHome() { {Object.entries(yearGroups) .sort(([yearA], [yearB]) => yearB - yearA) .map(([year, posts]) => ( -
+
{/* Year header */} {/*

{year}

*/} diff --git a/app/components/BlogNav.js b/app/components/BlogNav.js index 0514bb4e71..6b689d7824 100644 --- a/app/components/BlogNav.js +++ b/app/components/BlogNav.js @@ -2,6 +2,7 @@ import { useState, useEffect } from "react"; import { usePathname } from "next/navigation"; +import { getVisibleAnchorElement } from "../lib/anchorScroll"; import { useLayoutSlots } from "../lib/layoutSlots"; /** @@ -23,49 +24,33 @@ export function BlogNav({ sections = [] }) { }, [setSidebarVisible]); const handleSectionClick = (sectionId) => { - // Find the visible element (not the first one which might be hidden) - const getVisibleElement = (id) => { - const escapedId = CSS.escape(id); - const elements = document.querySelectorAll(`#${escapedId}`); - return Array.from(elements).find(el => el.getBoundingClientRect().height > 0) || null; - }; - - const element = getVisibleElement(sectionId); + const element = getVisibleAnchorElement(sectionId); if (!element) { + console.warn(`Anchor not found for blog section: ${sectionId}`); return; } - // Responsive offset: 72px mobile, 100px desktop (matches scroll-mt) - const isMobile = window.innerWidth < 768; // md breakpoint - const offset = isMobile ? 72 : 100; - + const isMobile = window.innerWidth < 768; + const offset = isMobile ? 90 : 100; const rect = element.getBoundingClientRect(); const targetPosition = rect.top + window.scrollY - offset; window.scrollTo({ top: targetPosition, - behavior: "smooth" + behavior: "smooth", }); }; // Scroll-spy to track active year useEffect(() => { const handleScroll = () => { - // Responsive offset: 72px mobile, 100px desktop (matches scroll-mt) - const isMobile = window.innerWidth < 768; // md breakpoint - const offset = isMobile ? 72 : 100; + const isMobile = window.innerWidth < 768; + const offset = isMobile ? 90 : 100; let currentSection = ""; - // Helper to find visible element - const getVisibleElement = (id) => { - const escapedId = CSS.escape(id); - const elements = document.querySelectorAll(`#${escapedId}`); - return Array.from(elements).find(el => el.getBoundingClientRect().height > 0) || null; - }; - // Find active year based on scroll position for (const section of sections) { - const element = getVisibleElement(section.id); + const element = getVisibleAnchorElement(section.id); if (element) { const rect = element.getBoundingClientRect(); const isInRange = rect.top <= offset && rect.bottom >= offset; @@ -81,7 +66,7 @@ export function BlogNav({ sections = [] }) { // Fallback: find the first visible section if none are at offset if (!currentSection) { for (const section of sections) { - const element = getVisibleElement(section.id); + const element = getVisibleAnchorElement(section.id); if (element) { const rect = element.getBoundingClientRect(); const viewportHeight = window.innerHeight; diff --git a/app/components/ContentBlurbs.js b/app/components/ContentBlurbs.js index 76c82712f6..815664d014 100644 --- a/app/components/ContentBlurbs.js +++ b/app/components/ContentBlurbs.js @@ -3,7 +3,20 @@ import { useState } from "react"; import Link from "next/link"; import Image from "next/image"; -const renderHtml = (content) => ({ __html: content || "" }); +const renderContent = (Tag, content, className) => { + if (content === null || content === undefined) { + return null; + } + + const Wrapper = Tag; + if (typeof content === "string") { + return ( + + ); + } + + return {content}; +}; const slugify = (value) => { if (!value) { @@ -92,7 +105,7 @@ export const CollapsibleContentBlurb = ({ title, description, content, reference ); })} -
+ {renderContent("div", content, "text-base text-gray-87 line-clamp-5")}
+ )} + {/* Persistent Submenus - Mobile Only */} @@ -292,12 +359,17 @@ const MobileNav = ({ nav, currentRoute, announcements, urbitExplainedSections, r ); }; -const GlobalNav = ({ nav }) => { +const GlobalNav = ({ nav, onSearchOpen }) => { const currentRoute = usePathname(); + const [shortcutLabel, setShortcutLabel] = useState(null); + + useEffect(() => { + setShortcutLabel(getShortcutLabel()); + }, []); return ( -
    +
      {nav?.map((navItem, i) => { const isActive = currentRoute.startsWith(navItem.url); @@ -337,6 +409,26 @@ const GlobalNav = ({ nav }) => { ); })} + {onSearchOpen && ( + + )}
    ); diff --git a/app/components/HeroSection.js b/app/components/HeroSection.js index 5f69f39d8a..5976406b6b 100644 --- a/app/components/HeroSection.js +++ b/app/components/HeroSection.js @@ -281,44 +281,51 @@ export function HeroSection({ hero }) { {/* Desktop Tertiary Link */} - {tertiaryLink && ( - tertiaryLink.link.startsWith('http') ? ( - - ) : ( - - {tertiaryLink.label} - - ) - )} +
    + {tertiaryLink && ( + tertiaryLink.link.startsWith('http') ? ( + + ) : ( + + {tertiaryLink.label} + + ) + )} +
    {/* Leaving Site Modal */} - setIsModalOpen(false)}> + setIsModalOpen(false)} + >

    - Quickstart with Tlon Messenger + Quickstart with Tlon Messenger

    - Tlon will onboard you to Urbit without needing to run your own node. They provide free hosting and a free Urbit ID with their mobile app.

    + Tlon will onboard you to Urbit without needing to run your own node. They provide free hosting and a free Urbit ID with their mobile app. +

    - The link below will get you set up and added to the Urbit Foundation public group; say hello and someone will show you around!

    + The link below will get you set up and added to the Urbit Foundation public group; say hello and someone will show you around! +

    +
); } diff --git a/app/components/LayoutFrame.js b/app/components/LayoutFrame.js index d18a25d7c7..6c9f13aec0 100644 --- a/app/components/LayoutFrame.js +++ b/app/components/LayoutFrame.js @@ -1,9 +1,10 @@ "use client"; -import { useState } from "react"; +import { useCallback, useEffect, useState } from "react"; import { useLayoutSlots } from "../lib/layoutSlots"; import { HeaderNav } from "./HeaderNav"; import { FooterSection, FooterExpansion } from "./FooterSection"; +import { SearchModal } from "./SearchModal"; /** * LayoutFrame - Client component that renders the frame with hero/sidebar slots @@ -14,6 +15,45 @@ export function LayoutFrame({ children, nav, homepage, footerData, mobileNav, an const { hero, sidebar, sidebarPosition, sidebarVisible, sidebarTransitionsEnabled } = useLayoutSlots(); const [expansionHeight, setExpansionHeight] = useState(0); const [expandedSection, setExpandedSection] = useState(null); + const [isSearchOpen, setIsSearchOpen] = useState(false); + + const openSearch = useCallback(() => { + setIsSearchOpen(true); + }, []); + + const closeSearch = useCallback(() => { + setIsSearchOpen(false); + }, []); + + const toggleSearch = useCallback(() => { + setIsSearchOpen((prev) => !prev); + }, []); + + useEffect(() => { + const handleKeyDown = (event) => { + if (event.defaultPrevented) return; + if (!(event.metaKey || event.ctrlKey)) return; + if (String(event.key).toLowerCase() !== "k") return; + + const target = event.target; + if (target?.tagName) { + const tag = target.tagName.toLowerCase(); + if (["input", "textarea", "select"].includes(tag)) { + return; + } + } + if (target?.isContentEditable) return; + if (typeof target?.closest === "function" && target.closest("[contenteditable='true']")) { + return; + } + + event.preventDefault(); + toggleSearch(); + }; + + document.addEventListener("keydown", handleKeyDown); + return () => document.removeEventListener("keydown", handleKeyDown); + }, [toggleSearch]); // Separate resources and socials from footerData for FooterExpansion const resources = footerData?.find(col => col.column_label === "resources"); @@ -21,6 +61,8 @@ export function LayoutFrame({ children, nav, homepage, footerData, mobileNav, an return ( <> + + {/* Mobile View - No Frame */}
{/* Optional Hero - Mobile */} @@ -78,7 +121,12 @@ export function LayoutFrame({ children, nav, homepage, footerData, mobileNav, an - +
diff --git a/app/components/Modal.js b/app/components/Modal.js index c566e08df8..195e01a139 100644 --- a/app/components/Modal.js +++ b/app/components/Modal.js @@ -15,8 +15,16 @@ import { createPortal } from "react-dom"; * @param {boolean} isOpen - Controls modal visibility * @param {function} onClose - Called when modal is dismissed * @param {ReactNode} children - Custom content slot + * @param {string} panelClassName - Optional panel styling overrides + * @param {string} contentClassName - Optional content wrapper classes */ -export function Modal({ isOpen, onClose, children }) { +export function Modal({ + isOpen, + onClose, + children, + panelClassName = "", + contentClassName = "", +}) { const canUseDOM = typeof document !== "undefined"; // Handle escape key @@ -58,7 +66,7 @@ export function Modal({ isOpen, onClose, children }) { onClick={onClose} >
e.stopPropagation()} > {/* Close button */} @@ -83,7 +91,7 @@ export function Modal({ isOpen, onClose, children }) { {/* Content */} -
{children}
+
{children}
, document.body diff --git a/app/components/SearchModal.js b/app/components/SearchModal.js new file mode 100644 index 0000000000..ccb7b94af0 --- /dev/null +++ b/app/components/SearchModal.js @@ -0,0 +1,444 @@ +"use client"; + +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { useRouter } from "next/navigation"; +import { Modal } from "./Modal"; + +const SECTION_ORDER = ["overview", "blog", "grants", "events", "pages", "other"]; +const SECTION_LABELS = { + overview: "Overview", + blog: "Blog", + grants: "Grants", + events: "Events", + pages: "Pages", + other: "Other", +}; + +const toTitleCase = (value) => + value + .split("-") + .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)) + .join(" "); + +const getEntries = (payload) => { + if (Array.isArray(payload)) return payload; + if (payload && Array.isArray(payload.entries)) return payload.entries; + return []; +}; + +const normalizeTokens = (value) => + value + .trim() + .toLowerCase() + .split(/\s+/) + .filter(Boolean); + +const filterEntries = (entries, tokens) => { + if (!tokens.length) return []; + return entries.filter((entry) => { + const searchText = String(entry.searchText || "").toLowerCase(); + return tokens.every((token) => searchText.includes(token)); + }); +}; + +const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + +const highlightMatches = (text, tokens) => { + if (!text || !tokens.length) return text; + const uniqueTokens = Array.from( + new Set(tokens.map((token) => token.toLowerCase()).filter(Boolean)) + ); + if (!uniqueTokens.length) return text; + + const regex = new RegExp( + `(${uniqueTokens.map((token) => escapeRegExp(token)).join("|")})`, + "gi" + ); + const segments = String(text).split(regex); + + return segments.map((segment, index) => { + const isMatch = uniqueTokens.includes(segment.toLowerCase()); + if (!isMatch) return segment; + return ( + + {segment} + + ); + }); +}; + +export function SearchModal({ isOpen, onClose, children }) { + const router = useRouter(); + const inputRef = useRef(null); + const hasRequestedRef = useRef(false); + const queryRef = useRef(""); + const [query, setQuery] = useState(""); + const [indexEntries, setIndexEntries] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [errorMessage, setErrorMessage] = useState(""); + const [activeIndex, setActiveIndex] = useState(-1); + + const resetSearch = useCallback(() => { + setQuery(""); + queryRef.current = ""; + setActiveIndex(-1); + setErrorMessage(""); + }, []); + + const handleClose = useCallback(() => { + resetSearch(); + onClose(); + }, [resetSearch, onClose]); + + const ensureIndexLoaded = useCallback(() => { + if (indexEntries.length > 0 || isLoading || hasRequestedRef.current) { + return; + } + + hasRequestedRef.current = true; + setIsLoading(true); + setErrorMessage(""); + + fetch("/search-index.json") + .then((response) => { + if (!response.ok) { + throw new Error(`Search index request failed: ${response.status}`); + } + return response.json(); + }) + .then((payload) => { + const entries = getEntries(payload); + if (!entries.length) { + console.warn("Search index loaded with no entries."); + } else { + console.info(`Search index loaded (${entries.length} entries).`); + } + setIndexEntries(entries); + + const tokens = normalizeTokens(queryRef.current); + if (tokens.length) { + const nextResults = filterEntries(entries, tokens); + setActiveIndex(nextResults.length ? 0 : -1); + } + }) + .catch((error) => { + console.error("Failed to load search index:", error); + setErrorMessage("Search index unavailable."); + hasRequestedRef.current = false; + }) + .finally(() => { + setIsLoading(false); + }); + }, [indexEntries.length, isLoading]); + + useEffect(() => { + if (!isOpen) return; + inputRef.current?.focus(); + inputRef.current?.select(); + }, [isOpen]); + + + const queryTokens = useMemo(() => normalizeTokens(query), [query]); + const highlightText = useCallback( + (text) => highlightMatches(text, queryTokens), + [queryTokens] + ); + + const filteredResults = useMemo( + () => filterEntries(indexEntries, queryTokens), + [indexEntries, queryTokens] + ); + + const groupedResults = useMemo(() => { + const groups = new Map(); + + for (const entry of filteredResults) { + const section = entry.section || "other"; + if (!groups.has(section)) { + groups.set(section, []); + } + groups.get(section).push(entry); + } + + return SECTION_ORDER.map((section) => { + const items = groups.get(section) || []; + if (!items.length) return null; + + const label = + SECTION_LABELS[section] || + items[0]?.sectionLabel || + toTitleCase(section); + + const sortedItems = [...items].sort((a, b) => + String(a.title || "").localeCompare(String(b.title || ""), undefined, { + sensitivity: "base", + }) + ); + + return { section, label, items: sortedItems }; + }).filter(Boolean); + }, [filteredResults]); + + const flatResults = useMemo( + () => + groupedResults.flatMap((group) => + group.items.map((item) => ({ + ...item, + group: group.section, + groupLabel: group.label, + })) + ), + [groupedResults] + ); + + const resultIndexByPath = useMemo(() => { + const indexMap = new Map(); + flatResults.forEach((result, index) => { + if (result.path) { + indexMap.set(result.path, index); + } + }); + return indexMap; + }, [flatResults]); + + + useEffect(() => { + if (activeIndex < 0) return; + const element = document.getElementById(`search-result-${activeIndex}`); + element?.scrollIntoView({ block: "nearest" }); + }, [activeIndex]); + + const handleQueryChange = (event) => { + const nextQuery = event.target.value; + queryRef.current = nextQuery; + setQuery(nextQuery); + + if (!indexEntries.length) { + ensureIndexLoaded(); + } + + const tokens = normalizeTokens(nextQuery); + if (!tokens.length) { + setActiveIndex(-1); + return; + } + + const nextResults = filterEntries(indexEntries, tokens); + setActiveIndex(nextResults.length ? 0 : -1); + }; + + const handleSelect = (item) => { + if (!item?.path) { + console.warn("Search result missing path:", item); + return; + } + console.info("Search result selected:", { + title: item.title, + path: item.path, + query: queryRef.current, + }); + router.push(item.path); + handleClose(); + }; + + const handleKeyDown = (event) => { + if (!indexEntries.length) { + ensureIndexLoaded(); + } + + if (!flatResults.length) return; + + if (event.key === "ArrowDown") { + event.preventDefault(); + setActiveIndex((prev) => (prev + 1) % flatResults.length); + return; + } + + if (event.key === "ArrowUp") { + event.preventDefault(); + setActiveIndex((prev) => + prev <= 0 ? flatResults.length - 1 : prev - 1 + ); + return; + } + + if (event.key === "Enter" && activeIndex >= 0) { + event.preventDefault(); + handleSelect(flatResults[activeIndex]); + } + }; + + const activeId = activeIndex >= 0 ? `search-result-${activeIndex}` : undefined; + + return ( + +
+
+

+ Search urbit.org +

+ {queryTokens.length > 0 && !isLoading && !errorMessage && ( + + {flatResults.length} results + + )} +
+

+ Browse site content, guides, grants, and updates. +

+
+ Use ↑/↓ to navigate, Enter to open. + {!indexEntries.length && !isLoading && ( + Focus the field to load results. + )} +
+ +
+ + +
+ +
+ {isLoading && ( +
Loading search index…
+ )} + + {errorMessage && ( +
{errorMessage}
+ )} + + {!isLoading && !errorMessage && !queryTokens.length && ( +
+ Start typing to see search results. +
+ )} + + {!isLoading && !errorMessage && queryTokens.length > 0 && !flatResults.length && ( +
+ No results found. Try a different search. +
+ )} + + {!isLoading && !errorMessage && groupedResults.length > 0 && ( +
+ {groupedResults.map((group) => ( +
+
+ {group.label} +
+
+ {group.items.map((item) => { + const resultIndex = resultIndexByPath.get(item.path); + const isActive = resultIndex === activeIndex; + const resultId = + typeof resultIndex === "number" + ? `search-result-${resultIndex}` + : undefined; + const tags = Array.isArray(item.tags) ? item.tags : []; + const visibleTags = tags.slice(0, 3); + const extraTags = tags.length - visibleTags.length; + + return ( + + ); + })} +
+ +
+ ))} +
+ )} +
+
+ + {children && ( +
{children}
+ )} +
+ ); +} diff --git a/package.json b/package.json index 5e7f2a81e7..ee7d206718 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,9 @@ "version": "0.1.0", "private": true, "scripts": { + "predev": "node scripts/build-search-index.js", "dev": "next dev", + "prebuild": "node scripts/build-search-index.js", "build": "next build", "start": "next start", "lint": "eslint ." diff --git a/scripts/build-search-index.js b/scripts/build-search-index.js new file mode 100644 index 0000000000..cb870dd73c --- /dev/null +++ b/scripts/build-search-index.js @@ -0,0 +1,248 @@ +#!/usr/bin/env node + +/** + * Search Index Builder + * + * Builds a static JSON index from app/content for the homepage search modal. + * + * Usage: node scripts/build-search-index.js + */ + +const fs = require("fs"); +const path = require("path"); +const matter = require("gray-matter"); +const { glob } = require("glob"); +const toml = require("@iarna/toml"); + +const CONTENT_DIR = path.join(process.cwd(), "app/content"); +const OUTPUT_PATH = path.join(process.cwd(), "public/search-index.json"); +const EXCLUDED_FILE_NAMES = new Set(["config.md", "index.md"]); +const EXCLUDED_SLUGS = new Set(["get-on-the-network"]); +const EXCLUDED_DIRECTORIES = new Set(["blurbs", "homepage"]); +const SECTION_ORDER = ["overview", "blog", "grants", "events", "pages", "other"]; +const SECTION_LABELS = { + overview: "Overview", + blog: "Blog", + grants: "Grants", + events: "Events", + pages: "Pages", + other: "Other", +}; + +const toTitleCase = (value) => + value + .split("-") + .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)) + .join(" "); + +const normalizeArray = (value) => { + if (!value) return []; + return Array.isArray(value) ? value : [value]; +}; + +const collectTags = (frontMatter) => { + const tags = [ + ...normalizeArray(frontMatter.tags), + ...normalizeArray(frontMatter.extra?.tags), + ...normalizeArray(frontMatter.taxonomies?.tags), + ...normalizeArray(frontMatter.taxonomies?.grant_type), + ...normalizeArray(frontMatter.taxonomies?.grant_category), + ] + .map((tag) => String(tag).trim()) + .filter(Boolean); + + return Array.from(new Set(tags)); +}; + +const parseFrontMatter = (raw, filePath) => { + const trimmed = raw.trimStart(); + const usesToml = trimmed.startsWith("+++"); + const options = usesToml + ? { + engines: { toml: toml.parse.bind(toml) }, + language: "toml", + delimiters: "+++", + } + : undefined; + + try { + const { data } = matter(raw, options); + return data || {}; + } catch (error) { + console.error(`Failed to parse frontmatter for ${filePath}:`, error); + return null; + } +}; + +const resolveEntry = (relativePath) => { + const segments = relativePath.split("/"); + const filename = segments[segments.length - 1]; + const slug = path.basename(filename, ".md"); + const section = segments[0]; + + if (EXCLUDED_SLUGS.has(slug)) { + return null; + } + + if (section === "overview") { + const overviewSection = segments[1]; + if (!overviewSection) { + console.warn(`Skipping overview content without subsection: ${relativePath}`); + return null; + } + + const isIntro = slug === "intro"; + const pathSuffix = isIntro + ? `/overview/${overviewSection}` + : `/overview/${overviewSection}/${slug}`; + + return { + path: pathSuffix, + section: "overview", + subsection: overviewSection, + subsectionLabel: toTitleCase(overviewSection), + }; + } + + if (section === "blog") { + return { path: `/blog/${slug}`, section: "blog" }; + } + + if (section === "grants") { + return { path: `/grants/${slug}`, section: "grants" }; + } + + if (section === "events") { + return { path: `/events/${slug}`, section: "events" }; + } + + if (section === "singles") { + return { path: `/${slug}`, section: "pages" }; + } + + if (segments.length === 1) { + return { path: `/${slug}`, section: "pages" }; + } + + return { + path: `/${relativePath.replace(/\.md$/, "")}`, + section: "other", + }; +}; + +const getSectionRank = (section) => { + const index = SECTION_ORDER.indexOf(section); + return index === -1 ? SECTION_ORDER.length : index; +}; + +async function buildSearchIndex() { + console.log("Building search index...\n"); + + if (!fs.existsSync(CONTENT_DIR)) { + console.error(`Content directory not found: ${CONTENT_DIR}`); + process.exit(1); + } + + const outputDir = path.dirname(OUTPUT_PATH); + if (!fs.existsSync(outputDir)) { + fs.mkdirSync(outputDir, { recursive: true }); + } + + const postPaths = await glob(path.join(CONTENT_DIR, "**/*.md")); + const entries = []; + const errors = []; + + for (const filePath of postPaths) { + const relativePath = path + .relative(CONTENT_DIR, filePath) + .replace(/\\/g, "/"); + const filename = path.basename(filePath); + const segments = relativePath.split("/"); + + if (EXCLUDED_FILE_NAMES.has(filename)) { + continue; + } + + if (segments.some((segment) => EXCLUDED_DIRECTORIES.has(segment))) { + continue; + } + + let rawContent; + try { + rawContent = fs.readFileSync(filePath, "utf-8"); + } catch (error) { + console.error(`Failed to read ${filePath}:`, error); + errors.push({ filePath, error }); + continue; + } + + const frontMatter = parseFrontMatter(rawContent, filePath); + if (!frontMatter) { + errors.push({ filePath, error: new Error("Frontmatter parse failed") }); + continue; + } + + const routeInfo = resolveEntry(relativePath); + if (!routeInfo) { + continue; + } + + const title = frontMatter.title || toTitleCase(path.basename(filePath, ".md")); + const description = + frontMatter.description || + frontMatter.summary || + frontMatter.extra?.description || + ""; + const tags = collectTags(frontMatter); + const sectionLabel = SECTION_LABELS[routeInfo.section] || toTitleCase(routeInfo.section); + const searchText = [ + title, + description, + tags.join(" "), + routeInfo.path, + sectionLabel, + routeInfo.subsectionLabel || "", + ] + .join(" ") + .toLowerCase(); + + entries.push({ + title, + description, + tags, + path: routeInfo.path, + section: routeInfo.section, + sectionLabel, + subsection: routeInfo.subsection, + subsectionLabel: routeInfo.subsectionLabel, + searchText, + }); + } + + entries.sort((a, b) => { + const sectionRank = getSectionRank(a.section) - getSectionRank(b.section); + if (sectionRank !== 0) return sectionRank; + return a.title.localeCompare(b.title, undefined, { sensitivity: "base" }); + }); + + const output = { + generatedAt: new Date().toISOString(), + total: entries.length, + entries, + }; + + fs.writeFileSync(OUTPUT_PATH, JSON.stringify(output, null, 2), "utf-8"); + + console.log(`✓ Search index written to ${OUTPUT_PATH}`); + console.log(`✓ Indexed ${entries.length} content entries`); + + if (errors.length > 0) { + console.error(`Search index completed with ${errors.length} errors.`); + process.exitCode = 1; + } +} + +buildSearchIndex().catch((error) => { + console.error("Search index build failed:", error); + process.exit(1); +}); From 8a174691011a8db9bed59b8b7c175e0782bc7572 Mon Sep 17 00:00:00 2001 From: thelifeandtimes Date: Thu, 5 Mar 2026 08:43:21 -0800 Subject: [PATCH 3/5] feat: enhance search ranking and metadata Add search_terms metadata, weighted fuzzy scoring, and mobile search refinements to improve relevance and navigation. --- app/components/ContentBlurbs.js | 3 +- app/components/HeaderNav.js | 38 +- app/components/LayoutFrame.js | 2 + app/components/SearchModal.js | 638 +++++++++++++----- .../contributor-spotlight-litneb-maltyp.md | 14 + scripts/build-search-index.js | 289 +++++++- 6 files changed, 775 insertions(+), 209 deletions(-) diff --git a/app/components/ContentBlurbs.js b/app/components/ContentBlurbs.js index 815664d014..d74cbacd98 100644 --- a/app/components/ContentBlurbs.js +++ b/app/components/ContentBlurbs.js @@ -270,12 +270,13 @@ export const PreviewContentBlurb = ({ id, blurbSlug, title, description, content export const ContentBlurb = ({ id, blurbSlug, title, description, content, references, image, imageDark, ctaButton }) => { const [isDetailsExpanded, setIsDetailsExpanded] = useState(false); const tooltipContext = blurbSlug || id || slugify(title); + const anchorId = id || blurbSlug; // Check if there are any details to show const hasDetails = description || (references && references.some(ref => ref.description)); return ( -
+
{/* Render images if provided */} diff --git a/app/components/HeaderNav.js b/app/components/HeaderNav.js index 9dd088ed78..eecf6270fd 100644 --- a/app/components/HeaderNav.js +++ b/app/components/HeaderNav.js @@ -52,7 +52,7 @@ const SearchIcon = ({ className = "" }) => ( viewBox="0 0 24 24" fill="none" stroke="currentColor" - strokeWidth="1.5" + strokeWidth="2.3" strokeLinecap="round" strokeLinejoin="round" className={className} @@ -66,7 +66,7 @@ const SearchIcon = ({ className = "" }) => ( const getShortcutLabel = () => { if (typeof navigator === "undefined") return null; const platform = navigator.userAgentData?.platform || navigator.platform || ""; - return /mac/i.test(platform) ? "⌘K" : "Ctrl+K"; + return /mac/i.test(platform) ? "⌘K" : "^+K"; }; export const HeaderNav = ({ @@ -78,6 +78,7 @@ export const HeaderNav = ({ urbitExplainedSections, runningUrbitSections, onSearchOpen, + isSearchOpen, }) => { const headerRef = useRef(null); @@ -92,6 +93,7 @@ export const HeaderNav = ({ urbitExplainedSections={urbitExplainedSections} runningUrbitSections={runningUrbitSections} onSearchOpen={onSearchOpen} + isSearchOpen={isSearchOpen} />
{inFrame ? ( - + + ) : (
- +
@@ -124,6 +127,7 @@ const MobileNav = ({ urbitExplainedSections, runningUrbitSections, onSearchOpen, + isSearchOpen, }) => { const [menuIsOpen, setMenuOpen] = useState(false); @@ -204,9 +208,13 @@ const MobileNav = ({ data-umami-event-destination="search-modal" data-umami-event-context={currentRoute} data-umami-event-variant="mobile" - className="flex items-center justify-center text-contrast-2 hover:text-primary transition-colors" + className={`flex items-center justify-center transition-colors duration-200 ${ + isSearchOpen + ? "text-primary" + : "text-contrast-2 hover:text-primary" + }`} > - + )}
diff --git a/app/components/SearchModal.js b/app/components/SearchModal.js index ccb7b94af0..e9cc4ecfcc 100644 --- a/app/components/SearchModal.js +++ b/app/components/SearchModal.js @@ -33,11 +33,185 @@ const normalizeTokens = (value) => .split(/\s+/) .filter(Boolean); -const filterEntries = (entries, tokens) => { +const splitWords = (value) => + value + .toLowerCase() + .split(/[^a-z0-9]+/) + .filter(Boolean); + +const FIELD_WEIGHTS = { + title: 12, + tags: 10, + searchTerms: 9, + description: 6, + authors: 4, + other: 2, +}; + +const SOURCE_BOOSTS = { + overview: 12, + blurbs: 12, + homepage: 8, + blog: 4, + events: 3, + pages: 2, + other: 0, +}; + +const SOURCE_RANKS = { + overview: 0, + blurbs: 0, + homepage: 1, + blog: 2, + events: 3, + pages: 4, + other: 5, +}; + +const scoreFuzzyWord = (token, word) => { + if (!token || !word || token.length > word.length) { + return 0; + } + + let score = 0; + let lastIndex = -1; + let consecutive = 0; + + for (const char of token) { + const nextIndex = word.indexOf(char, lastIndex + 1); + if (nextIndex === -1) { + return 0; + } + + if (nextIndex === lastIndex + 1) { + consecutive += 1; + score += 2 + consecutive; + } else { + consecutive = 0; + score += 1; + } + + lastIndex = nextIndex; + } + + if (word.startsWith(token)) { + score += 6 + token.length; + } + + return score; +}; + +const getBestTokenScore = (token, words) => { + if (!token.length) return 0; + if (token.length <= 2) { + const hasPrefix = words.some((word) => word.startsWith(token)); + return hasPrefix ? 5 + token.length : 0; + } + + let bestScore = 0; + for (const word of words) { + const score = scoreFuzzyWord(token, word); + if (score > bestScore) { + bestScore = score; + } + } + + return bestScore; +}; + +const getEntryWords = (entry) => ({ + title: splitWords(entry.title || ""), + tags: splitWords((entry.tags || []).join(" ")), + searchTerms: splitWords((entry.searchTerms || []).join(" ")), + description: splitWords(entry.description || ""), + authors: splitWords((entry.authors || []).join(" ")), + other: splitWords(entry.searchText || ""), +}); + +const scoreEntry = (entry, tokens, wordsByField) => { + if (!tokens.length) return 0; + + let totalScore = 0; + + for (const token of tokens) { + const tokenScores = { + title: getBestTokenScore(token, wordsByField.title), + tags: getBestTokenScore(token, wordsByField.tags), + searchTerms: getBestTokenScore(token, wordsByField.searchTerms), + description: getBestTokenScore(token, wordsByField.description), + authors: getBestTokenScore(token, wordsByField.authors), + other: getBestTokenScore(token, wordsByField.other), + }; + + const weightedScore = Math.max( + tokenScores.title * FIELD_WEIGHTS.title, + tokenScores.tags * FIELD_WEIGHTS.tags, + tokenScores.searchTerms * FIELD_WEIGHTS.searchTerms, + tokenScores.description * FIELD_WEIGHTS.description, + tokenScores.authors * FIELD_WEIGHTS.authors, + tokenScores.other * FIELD_WEIGHTS.other + ); + + if (!weightedScore) { + return 0; + } + + totalScore += weightedScore; + } + + const sourceKey = entry.source || entry.section || "other"; + totalScore += SOURCE_BOOSTS[sourceKey] || 0; + + return totalScore; +}; + +const getSourceRank = (entry) => { + const sourceKey = entry.source || entry.section || "other"; + return SOURCE_RANKS[sourceKey] ?? SOURCE_RANKS.other; +}; + +const rankEntries = (entries, tokens, wordsByEntry) => { if (!tokens.length) return []; - return entries.filter((entry) => { - const searchText = String(entry.searchText || "").toLowerCase(); - return tokens.every((token) => searchText.includes(token)); + + return entries + .map((entry) => { + const key = entry.id || entry.path || entry.title; + const words = wordsByEntry.get(key) || getEntryWords(entry); + const score = scoreEntry(entry, tokens, words); + if (!score) return null; + return { ...entry, score }; + }) + .filter(Boolean) + .sort((a, b) => { + const scoreDiff = b.score - a.score; + if (scoreDiff !== 0) return scoreDiff; + + const sourceDiff = getSourceRank(a) - getSourceRank(b); + if (sourceDiff !== 0) return sourceDiff; + + const dateDiff = (b.publishedTimestamp || 0) - (a.publishedTimestamp || 0); + if (dateDiff !== 0) return dateDiff; + + return String(a.title || "").localeCompare(String(b.title || ""), undefined, { + sensitivity: "base", + }); + }); +}; + +const dedupeAnchoredResults = (results) => { + const seenAnchors = new Set(); + return results.filter((entry) => { + const entryPath = entry.path || ""; + if (!entryPath.includes("#")) { + return true; + } + + if (seenAnchors.has(entryPath)) { + return false; + } + + seenAnchors.add(entryPath); + return true; }); }; @@ -73,13 +247,16 @@ export function SearchModal({ isOpen, onClose, children }) { const hasRequestedRef = useRef(false); const queryRef = useRef(""); const [query, setQuery] = useState(""); + const [debouncedQuery, setDebouncedQuery] = useState(""); const [indexEntries, setIndexEntries] = useState([]); const [isLoading, setIsLoading] = useState(false); const [errorMessage, setErrorMessage] = useState(""); const [activeIndex, setActiveIndex] = useState(-1); + const [isMobile, setIsMobile] = useState(false); const resetSearch = useCallback(() => { setQuery(""); + setDebouncedQuery(""); queryRef.current = ""; setActiveIndex(-1); setErrorMessage(""); @@ -114,12 +291,6 @@ export function SearchModal({ isOpen, onClose, children }) { console.info(`Search index loaded (${entries.length} entries).`); } setIndexEntries(entries); - - const tokens = normalizeTokens(queryRef.current); - if (tokens.length) { - const nextResults = filterEntries(entries, tokens); - setActiveIndex(nextResults.length ? 0 : -1); - } }) .catch((error) => { console.error("Failed to load search index:", error); @@ -131,22 +302,75 @@ export function SearchModal({ isOpen, onClose, children }) { }); }, [indexEntries.length, isLoading]); + useEffect(() => { + if (typeof window === "undefined") return undefined; + const mediaQuery = window.matchMedia("(max-width: 767px)"); + + const updateIsMobile = () => { + setIsMobile(mediaQuery.matches); + }; + + updateIsMobile(); + mediaQuery.addEventListener("change", updateIsMobile); + return () => mediaQuery.removeEventListener("change", updateIsMobile); + }, []); + + useEffect(() => { + const timeout = setTimeout(() => { + setDebouncedQuery(query); + }, 160); + + return () => clearTimeout(timeout); + }, [query]); + useEffect(() => { if (!isOpen) return; inputRef.current?.focus(); inputRef.current?.select(); }, [isOpen]); + useEffect(() => { + if (!isOpen || !isMobile || typeof document === "undefined") { + return undefined; + } + + const handleEscape = (event) => { + if (event.key === "Escape") { + handleClose(); + } + }; + + document.documentElement.style.overflow = "hidden"; + document.body.style.overflow = "hidden"; + document.addEventListener("keydown", handleEscape); + + return () => { + document.documentElement.style.overflow = ""; + document.body.style.overflow = ""; + document.removeEventListener("keydown", handleEscape); + }; + }, [isOpen, isMobile, handleClose]); - const queryTokens = useMemo(() => normalizeTokens(query), [query]); + const queryTokens = useMemo(() => normalizeTokens(debouncedQuery), [debouncedQuery]); + const highlightTokens = useMemo(() => normalizeTokens(query), [query]); const highlightText = useCallback( - (text) => highlightMatches(text, queryTokens), - [queryTokens] + (text) => highlightMatches(text, highlightTokens), + [highlightTokens] ); + const entryWords = useMemo(() => { + const map = new Map(); + indexEntries.forEach((entry) => { + const key = entry.id || entry.path || entry.title; + if (!key) return; + map.set(key, getEntryWords(entry)); + }); + return map; + }, [indexEntries]); + const filteredResults = useMemo( - () => filterEntries(indexEntries, queryTokens), - [indexEntries, queryTokens] + () => dedupeAnchoredResults(rankEntries(indexEntries, queryTokens, entryWords)), + [indexEntries, queryTokens, entryWords] ); const groupedResults = useMemo(() => { @@ -169,11 +393,13 @@ export function SearchModal({ isOpen, onClose, children }) { items[0]?.sectionLabel || toTitleCase(section); - const sortedItems = [...items].sort((a, b) => - String(a.title || "").localeCompare(String(b.title || ""), undefined, { + const sortedItems = [...items].sort((a, b) => { + const scoreDiff = (b.score || 0) - (a.score || 0); + if (scoreDiff !== 0) return scoreDiff; + return String(a.title || "").localeCompare(String(b.title || ""), undefined, { sensitivity: "base", - }) - ); + }); + }); return { section, label, items: sortedItems }; }).filter(Boolean); @@ -191,16 +417,27 @@ export function SearchModal({ isOpen, onClose, children }) { [groupedResults] ); - const resultIndexByPath = useMemo(() => { + const resultIndexById = useMemo(() => { const indexMap = new Map(); flatResults.forEach((result, index) => { - if (result.path) { - indexMap.set(result.path, index); + const key = result.id || result.path || result.title; + if (key) { + indexMap.set(key, index); } }); return indexMap; }, [flatResults]); + const querySignature = queryTokens.join(" "); + + useEffect(() => { + if (!querySignature || !flatResults.length) { + setActiveIndex(-1); + return; + } + + setActiveIndex(0); + }, [querySignature, flatResults.length]); useEffect(() => { if (activeIndex < 0) return; @@ -212,19 +449,11 @@ export function SearchModal({ isOpen, onClose, children }) { const nextQuery = event.target.value; queryRef.current = nextQuery; setQuery(nextQuery); + setActiveIndex(-1); if (!indexEntries.length) { ensureIndexLoaded(); } - - const tokens = normalizeTokens(nextQuery); - if (!tokens.length) { - setActiveIndex(-1); - return; - } - - const nextResults = filterEntries(indexEntries, tokens); - setActiveIndex(nextResults.length ? 0 : -1); }; const handleSelect = (item) => { @@ -269,22 +498,21 @@ export function SearchModal({ isOpen, onClose, children }) { }; const activeId = activeIndex >= 0 ? `search-result-${activeIndex}` : undefined; - - return ( - -
+ const resultCountLabel = + queryTokens.length > 0 && !isLoading && !errorMessage + ? `${flatResults.length} results` + : null; + + const searchBody = ( +
+

Search urbit.org

- {queryTokens.length > 0 && !isLoading && !errorMessage && ( + {resultCountLabel && ( - {flatResults.length} results + {resultCountLabel} )}
@@ -297,144 +525,218 @@ export function SearchModal({ isOpen, onClose, children }) { Focus the field to load results. )}
+
-
- - -
- -
- {isLoading && ( -
Loading search index…
- )} - - {errorMessage && ( -
{errorMessage}
+
+

+ Browse site content, guides, grants, and updates. +

+
+ Tap a result to open. + {!indexEntries.length && !isLoading && ( + Focus the field to load results. )} +
+
- {!isLoading && !errorMessage && !queryTokens.length && ( -
- Start typing to see search results. -
- )} +
+ + +
- {!isLoading && !errorMessage && queryTokens.length > 0 && !flatResults.length && ( -
- No results found. Try a different search. -
- )} +
+ {isLoading && ( +
Loading search index…
+ )} + + {errorMessage && ( +
{errorMessage}
+ )} + + {!isLoading && !errorMessage && !queryTokens.length && ( +
+ Start typing to see search results. +
+ )} + + {!isLoading && !errorMessage && queryTokens.length > 0 && !flatResults.length && ( +
+ No results found. Try a different search. +
+ )} {!isLoading && !errorMessage && groupedResults.length > 0 && ( -
- {groupedResults.map((group) => ( -
-
- {group.label} -
-
- {group.items.map((item) => { - const resultIndex = resultIndexByPath.get(item.path); - const isActive = resultIndex === activeIndex; - const resultId = - typeof resultIndex === "number" - ? `search-result-${resultIndex}` - : undefined; - const tags = Array.isArray(item.tags) ? item.tags : []; - const visibleTags = tags.slice(0, 3); - const extraTags = tags.length - visibleTags.length; - - return ( - - ); - })} -
- +
+ )} + + ); + })}
- ))} -
+
+ ))} +
+ )} +
+
+ ); + + if (isMobile) { + if (!isOpen) return null; + + return ( +
+
+
+

+ Search +

+ {resultCountLabel && ( +
+ {resultCountLabel} +
+ )} +
+ +
+
+ {searchBody} + {children && ( +
{children}
)}
+ ); + } + + return ( + + {searchBody} {children && (
{children}
diff --git a/app/content/blog/contributor-spotlight-litneb-maltyp.md b/app/content/blog/contributor-spotlight-litneb-maltyp.md index ebd2248e2e..2a35f56797 100644 --- a/app/content/blog/contributor-spotlight-litneb-maltyp.md +++ b/app/content/blog/contributor-spotlight-litneb-maltyp.md @@ -14,6 +14,20 @@ imageCard = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/Blog+QA+li # imageCardDark = "" # imageIndexDark = "" tags = ["spotlight", "identity", "design"] +search_terms = [ + "contributor spotlight", + "litneb maltyp", + "urbit identity", + "personal server", + "urbit community", + "urbit id", + "azimuth ids", + "sigil design", + "olif", + "assembly conference", + "groundwire", + "forever computer" +] +++ ![~litneb-maltyp contributor spotlight image](https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/Blog+QA+litneb-maltyp/Blog_QA+litneb-maltyp_no+text_Social16_9.png) diff --git a/scripts/build-search-index.js b/scripts/build-search-index.js index cb870dd73c..10e5748193 100644 --- a/scripts/build-search-index.js +++ b/scripts/build-search-index.js @@ -16,9 +16,8 @@ const toml = require("@iarna/toml"); const CONTENT_DIR = path.join(process.cwd(), "app/content"); const OUTPUT_PATH = path.join(process.cwd(), "public/search-index.json"); +const INCLUDED_DIRECTORIES = new Set(["blog", "blurbs", "homepage", "overview"]); const EXCLUDED_FILE_NAMES = new Set(["config.md", "index.md"]); -const EXCLUDED_SLUGS = new Set(["get-on-the-network"]); -const EXCLUDED_DIRECTORIES = new Set(["blurbs", "homepage"]); const SECTION_ORDER = ["overview", "blog", "grants", "events", "pages", "other"]; const SECTION_LABELS = { overview: "Overview", @@ -54,6 +53,83 @@ const collectTags = (frontMatter) => { return Array.from(new Set(tags)); }; +const collectFrontMatterValues = (value, values = []) => { + if (value === null || value === undefined) { + return values; + } + + if (Array.isArray(value)) { + value.forEach((entry) => collectFrontMatterValues(entry, values)); + return values; + } + + if (typeof value === "object") { + Object.values(value).forEach((entry) => collectFrontMatterValues(entry, values)); + return values; + } + + if (typeof value === "string" || typeof value === "number") { + const stringValue = String(value).trim(); + if (stringValue) { + values.push(stringValue); + } + } + + return values; +}; + +const uniqueStrings = (values) => Array.from(new Set(values.filter(Boolean))); + +const normalizeSearchTerms = (value) => { + if (!value) return []; + + const values = normalizeArray(value).flatMap((entry) => { + if (typeof entry === "string") { + return entry + .split(",") + .map((item) => item.trim()) + .filter(Boolean); + } + + if (typeof entry === "number") { + return [String(entry)]; + } + + return []; + }); + + return uniqueStrings(values); +}; + +const collectAuthors = (frontMatter) => { + const values = [ + ...normalizeArray(frontMatter.author), + ...normalizeArray(frontMatter.authors), + ...normalizeArray(frontMatter.extra?.author), + ...normalizeArray(frontMatter.extra?.authors), + ] + .map((entry) => String(entry || "").trim()) + .filter(Boolean); + + return uniqueStrings(values); +}; + +const parsePublishedTimestamp = (frontMatter) => { + const dateValue = + frontMatter.date || + frontMatter.published || + frontMatter.published_at || + frontMatter.updated || + frontMatter.extra?.date || + frontMatter.extra?.published || + frontMatter.extra?.updated; + + if (!dateValue) return null; + + const parsed = Date.parse(dateValue); + return Number.isNaN(parsed) ? null : parsed; +}; + const parseFrontMatter = (raw, filePath) => { const trimmed = raw.trimStart(); const usesToml = trimmed.startsWith("+++"); @@ -74,38 +150,174 @@ const parseFrontMatter = (raw, filePath) => { } }; -const resolveEntry = (relativePath) => { +const deriveSectionInfoFromPath = (targetPath) => { + const parts = targetPath.split("/").filter(Boolean); + if (!parts.length) { + return { section: "pages" }; + } + + const [root, subsection] = parts; + if (root === "overview") { + return { + section: "overview", + subsection, + subsectionLabel: subsection ? toTitleCase(subsection) : undefined, + }; + } + + if (root === "blog") { + return { section: "blog" }; + } + + if (root === "grants") { + return { section: "grants" }; + } + + if (root === "events") { + return { section: "events" }; + } + + return { section: "pages" }; +}; + +const resolveOverviewEntry = (segments, slug, relativePath) => { + const overviewSection = segments[1]; + if (!overviewSection) { + console.warn(`Skipping overview content without subsection: ${relativePath}`); + return null; + } + + const isIntro = slug === "intro"; + const pathSuffix = isIntro + ? `/overview/${overviewSection}` + : `/overview/${overviewSection}/${slug}`; + + return { + path: pathSuffix, + section: "overview", + subsection: overviewSection, + subsectionLabel: toTitleCase(overviewSection), + }; +}; + +const addBlurbRoute = (map, slug, targetPath, { overwrite = false } = {}) => { + if (!slug || !targetPath) { + return; + } + + if (!overwrite && map.has(slug)) { + return; + } + + if (overwrite && map.has(slug) && map.get(slug) !== targetPath) { + console.warn(`Blurb ${slug} mapped to multiple routes; using ${targetPath}.`); + } + + map.set(slug, targetPath); +}; + +const buildBlurbRouteMap = async () => { + const map = new Map(); + const homepageConfigPath = path.join(CONTENT_DIR, "homepage/config.md"); + + if (fs.existsSync(homepageConfigPath)) { + try { + const rawContent = fs.readFileSync(homepageConfigPath, "utf-8"); + const frontMatter = parseFrontMatter(rawContent, homepageConfigPath); + if (frontMatter) { + const sections = normalizeArray(frontMatter.sections); + sections.forEach((section) => { + if (!section) return; + const sectionBlurb = section["section-blurb"]; + addBlurbRoute(map, sectionBlurb, `/#${sectionBlurb}`); + + const subsectionBlurbs = normalizeArray(section["subsection-blurbs"]); + subsectionBlurbs.forEach((blurbSlug) => { + addBlurbRoute(map, blurbSlug, `/#${blurbSlug}`); + }); + }); + + const sidebarBlurb = frontMatter.sidebar_blurb; + addBlurbRoute(map, sidebarBlurb, `/#${sidebarBlurb}`); + } + } catch (error) { + console.error("Failed to load homepage config for blurbs:", error); + } + } + + const overviewPaths = await glob(path.join(CONTENT_DIR, "overview/**/*.md")); + for (const filePath of overviewPaths) { + const filename = path.basename(filePath); + if (EXCLUDED_FILE_NAMES.has(filename)) { + continue; + } + + let rawContent; + try { + rawContent = fs.readFileSync(filePath, "utf-8"); + } catch (error) { + console.error(`Failed to read ${filePath}:`, error); + continue; + } + + const frontMatter = parseFrontMatter(rawContent, filePath); + if (!frontMatter) { + continue; + } + + const blurbs = normalizeArray(frontMatter.blurbs); + if (!blurbs.length) { + continue; + } + + const relativePath = path + .relative(CONTENT_DIR, filePath) + .replace(/\\/g, "/"); + const segments = relativePath.split("/"); + const slug = path.basename(filename, ".md"); + const routeInfo = resolveOverviewEntry(segments, slug, relativePath); + + if (!routeInfo) { + continue; + } + + blurbs.forEach((blurbSlug) => { + addBlurbRoute(map, blurbSlug, `${routeInfo.path}#${blurbSlug}`, { overwrite: true }); + }); + } + + return map; +}; + +const resolveEntry = (relativePath, blurbRoutes) => { const segments = relativePath.split("/"); const filename = segments[segments.length - 1]; const slug = path.basename(filename, ".md"); const section = segments[0]; - if (EXCLUDED_SLUGS.has(slug)) { - return null; + if (section === "overview") { + return resolveOverviewEntry(segments, slug, relativePath); } - if (section === "overview") { - const overviewSection = segments[1]; - if (!overviewSection) { - console.warn(`Skipping overview content without subsection: ${relativePath}`); - return null; - } + if (section === "blog") { + return { path: `/blog/${slug}`, section: "blog" }; + } - const isIntro = slug === "intro"; - const pathSuffix = isIntro - ? `/overview/${overviewSection}` - : `/overview/${overviewSection}/${slug}`; + if (section === "blurbs") { + const targetPath = blurbRoutes?.get(slug); + if (!targetPath) { + console.warn(`Blurb missing route mapping: ${relativePath}`); + return { path: `/#${slug}`, section: "pages" }; + } return { - path: pathSuffix, - section: "overview", - subsection: overviewSection, - subsectionLabel: toTitleCase(overviewSection), + path: targetPath, + ...deriveSectionInfoFromPath(targetPath), }; } - if (section === "blog") { - return { path: `/blog/${slug}`, section: "blog" }; + if (section === "homepage") { + return { path: `/#${slug}`, section: "pages" }; } if (section === "grants") { @@ -116,10 +328,6 @@ const resolveEntry = (relativePath) => { return { path: `/events/${slug}`, section: "events" }; } - if (section === "singles") { - return { path: `/${slug}`, section: "pages" }; - } - if (segments.length === 1) { return { path: `/${slug}`, section: "pages" }; } @@ -148,7 +356,12 @@ async function buildSearchIndex() { fs.mkdirSync(outputDir, { recursive: true }); } - const postPaths = await glob(path.join(CONTENT_DIR, "**/*.md")); + const blurbRoutes = await buildBlurbRouteMap(); + const contentGlob = path.join( + CONTENT_DIR, + `{${Array.from(INCLUDED_DIRECTORIES).join(",")}}/**/*.md` + ); + const postPaths = await glob(contentGlob); const entries = []; const errors = []; @@ -163,7 +376,7 @@ async function buildSearchIndex() { continue; } - if (segments.some((segment) => EXCLUDED_DIRECTORIES.has(segment))) { + if (!INCLUDED_DIRECTORIES.has(segments[0])) { continue; } @@ -182,7 +395,7 @@ async function buildSearchIndex() { continue; } - const routeInfo = resolveEntry(relativePath); + const routeInfo = resolveEntry(relativePath, blurbRoutes); if (!routeInfo) { continue; } @@ -194,22 +407,38 @@ async function buildSearchIndex() { frontMatter.extra?.description || ""; const tags = collectTags(frontMatter); + const searchTerms = normalizeSearchTerms( + frontMatter.search_terms || frontMatter.searchTerms + ); + const authors = collectAuthors(frontMatter); + const publishedTimestamp = parsePublishedTimestamp(frontMatter); const sectionLabel = SECTION_LABELS[routeInfo.section] || toTitleCase(routeInfo.section); - const searchText = [ + const entryId = relativePath; + const source = segments[0]; + const frontMatterValues = collectFrontMatterValues(frontMatter); + const searchText = uniqueStrings([ title, description, tags.join(" "), + searchTerms.join(" "), + authors.join(" "), routeInfo.path, sectionLabel, routeInfo.subsectionLabel || "", - ] + ...frontMatterValues, + ]) .join(" ") .toLowerCase(); entries.push({ + id: entryId, title, description, tags, + searchTerms, + authors, + publishedTimestamp, + source, path: routeInfo.path, section: routeInfo.section, sectionLabel, From 96868e322f50865b9df128a944104d19a1effc64 Mon Sep 17 00:00:00 2001 From: thelifeandtimes Date: Thu, 5 Mar 2026 12:26:39 -0800 Subject: [PATCH 4/5] docs: backfill search terms Improve urbit.org search relevance by adding search_terms frontmatter. --- app/content/blog/2019-10-3-roadmap.md | 13 +++++++++++++ app/content/blog/2019-5-roadmap.md | 13 +++++++++++++ app/content/blog/2020-to-2021.md | 14 ++++++++++++++ app/content/blog/20200929-state-of-urbit.md | 14 ++++++++++++++ app/content/blog/20201119-models-of-society.md | 14 ++++++++++++++ .../blog/2021-11-18-report-from-the-field.md | 12 ++++++++++++ ...-the-promise-and-paradox-of-decentralization.md | 12 ++++++++++++ .../2025-a-new-epoch-for-the-forever-computer.md | 12 ++++++++++++ app/content/blog/a-founders-farewell.md | 13 +++++++++++++ app/content/blog/a-topiary.md | 14 ++++++++++++++ app/content/blog/aesthetic-culture-1.md | 13 +++++++++++++ app/content/blog/after-machine-war.md | 14 ++++++++++++++ app/content/blog/agency-daos.md | 12 ++++++++++++ app/content/blog/an-email.md | 14 ++++++++++++++ app/content/blog/an-urbit-overview.md | 13 +++++++++++++ app/content/blog/announcing-urbit-grants.md | 12 ++++++++++++ app/content/blog/ares.md | 12 ++++++++++++ app/content/blog/august-2022-grants-program.md | 12 ++++++++++++ app/content/blog/azimuth-as-multipass.md | 12 ++++++++++++ app/content/blog/azimuth-is-on-chain.md | 14 ++++++++++++++ .../blog/azimuth-security-bounty-program.md | 12 ++++++++++++ app/content/blog/beliefs-and-principles.md | 12 ++++++++++++ .../blog/bootstrapping-urbit-from-ethereum.md | 13 +++++++++++++ .../blog/building-beyond-beginner-guitar.md | 13 +++++++++++++ app/content/blog/common-objections-to-urbit.md | 12 ++++++++++++ .../blog/community-spotlight-the-portico.md | 13 +++++++++++++ .../blog/contributor-spotlight-dozreg-toplud.md | 13 +++++++++++++ .../blog/contributor-spotlight-mastyr-bottec.md | 13 +++++++++++++ ...or-spotlight-niblyx-malnus-and-bonbud-macryg.md | 13 +++++++++++++ .../blog/contributor-spotlight-nordus-mocwyl.md | 13 +++++++++++++ app/content/blog/convivial-networks.md | 12 ++++++++++++ app/content/blog/creating-sigils.md | 13 +++++++++++++ app/content/blog/desire-lines.md | 12 ++++++++++++ app/content/blog/developer-preview-vere64.md | 12 ++++++++++++ app/content/blog/eliza.md | 14 ++++++++++++++ app/content/blog/events-series.md | 13 +++++++++++++ app/content/blog/first-contract.md | 14 ++++++++++++++ app/content/blog/first-steps-towards-urbit-org.md | 13 +++++++++++++ app/content/blog/ford-fusion.md | 13 +++++++++++++ app/content/blog/foss-1.md | 12 ++++++++++++ app/content/blog/foss-2.md | 12 ++++++++++++ app/content/blog/gifts-q3-2020.md | 12 ++++++++++++ app/content/blog/governance-of-urbit.md | 12 ++++++++++++ app/content/blog/hackathon-2023.md | 14 ++++++++++++++ app/content/blog/hackathon-results.md | 12 ++++++++++++ app/content/blog/haleek-maul-interview.md | 14 ++++++++++++++ app/content/blog/hoon-4-lispers.md | 13 +++++++++++++ app/content/blog/hosting-the-future.md | 13 +++++++++++++ .../blog/immunology-for-the-internet-age.md | 12 ++++++++++++ app/content/blog/infrastructural.md | 13 +++++++++++++ app/content/blog/interim-constitution.md | 12 ++++++++++++ app/content/blog/interplanetary_commerce.md | 14 ++++++++++++++ app/content/blog/introducing-os1.md | 13 +++++++++++++ .../blog/introduction-to-the-combine-dao.md | 12 ++++++++++++ app/content/blog/io-in-hoon.md | 14 ++++++++++++++ app/content/blog/iot.md | 14 ++++++++++++++ app/content/blog/landscape-a-portrait.md | 13 +++++++++++++ app/content/blog/layer-2-faq.md | 12 ++++++++++++ app/content/blog/llms-on-urbit.md | 14 ++++++++++++++ app/content/blog/magic.md | 12 ++++++++++++ app/content/blog/metaphase.md | 14 ++++++++++++++ app/content/blog/nockmas-2025-day-1.md | 11 +++++++++++ app/content/blog/nockmas-2025-day-10.md | 11 +++++++++++ app/content/blog/nockmas-2025-day-11.md | 11 +++++++++++ app/content/blog/nockmas-2025-day-12.md | 12 ++++++++++++ app/content/blog/nockmas-2025-day-2.md | 11 +++++++++++ app/content/blog/nockmas-2025-day-3.md | 11 +++++++++++ app/content/blog/nockmas-2025-day-4.md | 11 +++++++++++ app/content/blog/nockmas-2025-day-5.md | 11 +++++++++++ app/content/blog/nockmas-2025-day-6.md | 11 +++++++++++ app/content/blog/nockmas-2025-day-7.md | 11 +++++++++++ app/content/blog/nockmas-2025-day-8.md | 11 +++++++++++ app/content/blog/nockmas-2025-day-9.md | 11 +++++++++++ app/content/blog/nockmas-2025-welcome.md | 11 +++++++++++ app/content/blog/nockpu.md | 11 +++++++++++ app/content/blog/olif-and-urbit-ids.md | 14 ++++++++++++++ app/content/blog/on-christopher-alexander.md | 14 ++++++++++++++ .../pin-the-face-that-launches-a-thousand-ships.md | 12 ++++++++++++ app/content/blog/pki-maze.md | 13 +++++++++++++ app/content/blog/platform-decay.md | 13 +++++++++++++ app/content/blog/precepts-discussion.md | 13 +++++++++++++ app/content/blog/precepts.md | 14 ++++++++++++++ app/content/blog/providers.md | 13 +++++++++++++ app/content/blog/pseudonymous-reputation.md | 12 ++++++++++++ app/content/blog/rollups.md | 14 ++++++++++++++ app/content/blog/security-and-continuity.md | 14 ++++++++++++++ app/content/blog/security-audit.md | 14 ++++++++++++++ app/content/blog/simple-durable-yours.md | 12 ++++++++++++ app/content/blog/smart-home-of-the-future.md | 12 ++++++++++++ app/content/blog/sovereign-intelligence.md | 13 +++++++++++++ app/content/blog/stable-arvo.md | 13 +++++++++++++ app/content/blog/state-of-urbit.md | 14 ++++++++++++++ app/content/blog/subassembly-hackathon-2024.md | 12 ++++++++++++ app/content/blog/the-100-year-computer.md | 12 ++++++++++++ ...-dao-as-a-lesson-in-decentralized-governance.md | 12 ++++++++++++ app/content/blog/the-missing-middle.md | 13 +++++++++++++ .../blog/the-shape-of-dao-governance-to-come.md | 12 ++++++++++++ app/content/blog/the-state-of-landscape.md | 12 ++++++++++++ .../blog/the-understanding-urbit-podcast.md | 12 ++++++++++++ app/content/blog/the-urbit-address-space.md | 12 ++++++++++++ app/content/blog/tools-of-our-own.md | 13 +++++++++++++ .../blog/toward-a-frozen-operating-system.md | 12 ++++++++++++ app/content/blog/toward-a-new-clay.md | 12 ++++++++++++ app/content/blog/urbit-and-bitcoin.md | 12 ++++++++++++ app/content/blog/urbit-and-the-blockchain.md | 12 ++++++++++++ app/content/blog/urbit-creator-daos.md | 12 ++++++++++++ app/content/blog/urbit-for-creators.md | 12 ++++++++++++ app/content/blog/urbit-for-normies.md | 13 +++++++++++++ .../blog/urbit-grants-and-mid-2019-gifts.md | 11 +++++++++++ app/content/blog/urbit-is-for-communities.md | 13 +++++++++++++ app/content/blog/urbithost-interview.md | 14 ++++++++++++++ app/content/blog/using-urbit-in-2023.md | 12 ++++++++++++ app/content/blog/value-of-address-space-pt1.md | 13 +++++++++++++ app/content/blog/value-of-address-space-pt2.md | 14 ++++++++++++++ app/content/blog/value-of-address-space-pt3.md | 13 +++++++++++++ app/content/blog/what-is-urbit-for.md | 12 ++++++++++++ app/content/blog/why-hoon.md | 13 +++++++++++++ ...hy-urbit-probably-does-not-need-a-blockchain.md | 12 ++++++++++++ app/content/blog/your-last-computer.md | 12 ++++++++++++ app/content/blurbs/add-and-remove-applications.md | 12 ++++++++++++ app/content/blurbs/azimuth-based-urbit-ids.md | 13 +++++++++++++ app/content/blurbs/build-out-your-urbit.md | 13 +++++++++++++ app/content/blurbs/buy-an-urbit-id.md | 14 ++++++++++++++ .../blurbs/check-and-reduce-memory-usage.md | 12 ++++++++++++ app/content/blurbs/check-application-status.md | 12 ++++++++++++ app/content/blurbs/check-your-sponsor.md | 11 +++++++++++ .../blurbs/checking-and-fixing-azimuth-state.md | 12 ++++++++++++ .../blurbs/common-pitfalls-of-running-urbit.md | 11 +++++++++++ app/content/blurbs/create-a-moon-identity.md | 12 ++++++++++++ .../blurbs/directly-contact-another-urbit.md | 11 +++++++++++ app/content/blurbs/docking-your-urbit.md | 11 +++++++++++ app/content/blurbs/docs-for-self-hosting-urbit.md | 12 ++++++++++++ app/content/blurbs/get-access-code.md | 11 +++++++++++ .../blurbs/get-started-with-cloud-server.md | 12 ++++++++++++ .../blurbs/get-started-with-command-line.md | 12 ++++++++++++ .../blurbs/get-started-with-native-planet.md | 12 ++++++++++++ .../blurbs/get-started-with-tlon-hosting.md | 12 ++++++++++++ app/content/blurbs/getting-started-with-urbit.md | 12 ++++++++++++ app/content/blurbs/groundwire-based-urbit-ids.md | 12 ++++++++++++ app/content/blurbs/homepage-go-deeper.md | 11 +++++++++++ app/content/blurbs/homepage-hosting-providers.md | 11 +++++++++++ app/content/blurbs/homepage-self-hosting.md | 11 +++++++++++ app/content/blurbs/learn-to-hoon.md | 12 ++++++++++++ app/content/blurbs/reduce-your-pier-size.md | 12 ++++++++++++ app/content/blurbs/run-urbit-in-a-vps.md | 12 ++++++++++++ app/content/blurbs/run-urbit-locally.md | 12 ++++++++++++ app/content/blurbs/run-urbit-using-groundseg.md | 12 ++++++++++++ .../run-urbit-using-native-planet-hardware.md | 12 ++++++++++++ app/content/blurbs/run-urbit-with-tlon-hosting.md | 12 ++++++++++++ app/content/blurbs/select-available-loom-size.md | 11 +++++++++++ app/content/blurbs/self-custody-your-id.md | 12 ++++++++++++ .../blurbs/shortfalls-of-hosting-providers.md | 11 +++++++++++ app/content/blurbs/shut-down-your-urbit.md | 11 +++++++++++ .../start-and-stop-applications-on-your-urbit.md | 11 +++++++++++ app/content/blurbs/start-up-your-urbit.md | 11 +++++++++++ app/content/blurbs/support-contact-points.md | 11 +++++++++++ app/content/blurbs/troubleshooting-your-urbit.md | 10 ++++++++++ .../blurbs/update-commands-for-your-urbit.md | 11 +++++++++++ app/content/blurbs/update-your-urbit-runtime.md | 11 +++++++++++ app/content/blurbs/urbit-as-overlay-os.md | 12 ++++++++++++ .../blurbs/urbit-id-incentives-for-hosts.md | 12 ++++++++++++ app/content/blurbs/urbit-master-ticket-wallets.md | 12 ++++++++++++ app/content/blurbs/urbit-related-blogs.md | 11 +++++++++++ app/content/blurbs/urbit-support-groups.md | 12 ++++++++++++ .../blurbs/urbit-systems-technical-journal.md | 12 ++++++++++++ app/content/blurbs/why-hosting-providers.md | 12 ++++++++++++ 166 files changed, 2047 insertions(+) diff --git a/app/content/blog/2019-10-3-roadmap.md b/app/content/blog/2019-10-3-roadmap.md index 188e3ceaa2..2397a9d4f7 100644 --- a/app/content/blog/2019-10-3-roadmap.md +++ b/app/content/blog/2019-10-3-roadmap.md @@ -6,6 +6,19 @@ aliases = [ "/posts/essays/2019-10-3-roadmap", "/posts/2019-10-3-roadmap" ] +search_terms = [ + "2019 roadmap", + "urbit roadmap", + "bridge update", + "sigils", + "arvo updates", + "landscape modules", + "hoon school", + "grants program", + "identity stack", + "urbit interface", + "os updates" +] [extra] author = "Galen Wolfe-Pauly" diff --git a/app/content/blog/2019-5-roadmap.md b/app/content/blog/2019-5-roadmap.md index bfe7fd1b69..2d729bfe2d 100644 --- a/app/content/blog/2019-5-roadmap.md +++ b/app/content/blog/2019-5-roadmap.md @@ -3,6 +3,19 @@ title = "~2019.5 Roadmap" date = "2019-05-15" description = "Where we are and where we're going as of mid-2019." aliases = [ "/posts/essays/2019-5-roadmap", "/posts/2019-5-roadmap" ] +search_terms = [ + "2019 roadmap", + "azimuth", + "bridge", + "arvo updates", + "landscape modulo", + "hoon school", + "grants program", + "urbit roadmap", + "daemon updates", + "community plans", + "arvo interface" +] [extra] author = "Galen Wolfe-Pauly" diff --git a/app/content/blog/2020-to-2021.md b/app/content/blog/2020-to-2021.md index f40db8a6fa..478a228156 100644 --- a/app/content/blog/2020-to-2021.md +++ b/app/content/blog/2020-to-2021.md @@ -2,6 +2,20 @@ title = "2020 -> 2021" description = "Reflecting and looking forward." date = "2021-01-20" +search_terms = [ + "2020 review", + "2021 outlook", + "landscape os1", + "urbit hosting", + "urbit org", + "community growth", + "ota updates", + "developer guides", + "grants program", + "continuity breach", + "urbit roadmap", + "network reset" +] [extra] author = "Josh Lehman" diff --git a/app/content/blog/20200929-state-of-urbit.md b/app/content/blog/20200929-state-of-urbit.md index d245e424fb..76c6df2591 100644 --- a/app/content/blog/20200929-state-of-urbit.md +++ b/app/content/blog/20200929-state-of-urbit.md @@ -2,6 +2,20 @@ title = "Late 2020 Progress Update: OS 1 -> OS 1.N" date = "2020-09-28" description = "When we announced OS 1, in April, we started to disappear into Urbit. Since then, we’ve been living on Urbit like we never have before." +search_terms = [ + "os1 updates", + "state of urbit", + "landscape improvements", + "ota updates", + "graph store", + "performance gains", + "memory usage", + "indigo ui", + "leap omnibox", + "urbit progress", + "network stability", + "community growth" +] [extra] author = "Galen Wolfe-Pauly" diff --git a/app/content/blog/20201119-models-of-society.md b/app/content/blog/20201119-models-of-society.md index d1d6b38163..ac8ddbcf8e 100644 --- a/app/content/blog/20201119-models-of-society.md +++ b/app/content/blog/20201119-models-of-society.md @@ -2,6 +2,20 @@ title = "Models of Society" description = "Conversations compose society. What composes conversation — how do we digitize it in a way that enhances society without imposing upon it? How do we form this new medium, both to facilitate natural human behavior and to inspire the best of it?" date = "2020-11-18" +search_terms = [ + "models of society", + "digital messaging", + "conversation forms", + "identity and place", + "digital spaces", + "urbit territory", + "messaging modes", + "hypertext", + "social networks", + "urbit identity", + "digital city", + "community spaces" +] [extra] author = "Tyler Shuster" diff --git a/app/content/blog/2021-11-18-report-from-the-field.md b/app/content/blog/2021-11-18-report-from-the-field.md index 25f975db84..bba21161f8 100644 --- a/app/content/blog/2021-11-18-report-from-the-field.md +++ b/app/content/blog/2021-11-18-report-from-the-field.md @@ -2,6 +2,18 @@ title = "Report from the field: Assembly 2021" date = "2021-11-18" description = "The system builds the community and the community builds the system." +search_terms = [ + "assembly 2021", + "report from the field", + "urbit assembly", + "new world energy", + "software distribution", + "star market", + "urbit foundation", + "developers.urbit.org", + "operators.urbit.org", + "urbit community" +] [extra] author = "Galen Wolfe-Pauly" ship = "~ravmel-ropdyl" diff --git a/app/content/blog/2021-11-18-the-promise-and-paradox-of-decentralization.md b/app/content/blog/2021-11-18-the-promise-and-paradox-of-decentralization.md index 6f07014d01..cec374fc3b 100644 --- a/app/content/blog/2021-11-18-the-promise-and-paradox-of-decentralization.md +++ b/app/content/blog/2021-11-18-the-promise-and-paradox-of-decentralization.md @@ -2,6 +2,18 @@ title = "The Promise and Paradox of Decentralization" date = "2021-11-17" description = "Is centralization just a natural tendency of all networks? Are we destined to have a 'decentralization sandwich?'" +search_terms = [ + "decentralization paradox", + "centralization", + "onramps", + "ownership of data", + "open protocols", + "decentralization sandwich", + "urbit identity", + "centralized platforms", + "norms", + "protocol governance" +] [extra] author = "" ship = "~lableg-tadrex" diff --git a/app/content/blog/2025-a-new-epoch-for-the-forever-computer.md b/app/content/blog/2025-a-new-epoch-for-the-forever-computer.md index 6d32d4b36a..bf45a19efc 100644 --- a/app/content/blog/2025-a-new-epoch-for-the-forever-computer.md +++ b/app/content/blog/2025-a-new-epoch-for-the-forever-computer.md @@ -3,6 +3,18 @@ title = "A New Epoch for The Forever Computer" date = "2025-10-9" description = "On the further decentralization of Urbit and the next era of the Urbit Foundation" # aliases = [] +search_terms = [ + "urbit foundation", + "new epoch", + "forever computer", + "decentralization", + "galactic senate", + "governance", + "board of directors", + "executive director", + "urbit community", + "public goods" +] [extra] author = "The Urbit Foundation" diff --git a/app/content/blog/a-founders-farewell.md b/app/content/blog/a-founders-farewell.md index 04b91ab45a..37c213e5be 100644 --- a/app/content/blog/a-founders-farewell.md +++ b/app/content/blog/a-founders-farewell.md @@ -6,6 +6,19 @@ aliases = [ "/posts/essays/a-founders-farewell", "/posts/a-founders-farewell" ] +search_terms = [ + "founders farewell", + "curtis yarvin", + "urbit founder", + "project handoff", + "tlon", + "galaxy distribution", + "urbit history", + "open source", + "urbit governance", + "technical report", + "urbit transition" +] [extra] author = "Curtis Yarvin" diff --git a/app/content/blog/a-topiary.md b/app/content/blog/a-topiary.md index 70e040ba49..4dca0b45f4 100644 --- a/app/content/blog/a-topiary.md +++ b/app/content/blog/a-topiary.md @@ -2,6 +2,20 @@ title = "A Topiary: Hypertext and Urbit" date = "2021-06-13" description = "A brief history of hypertext and Urbit networking" +search_terms = [ + "hypertext history", + "urbit networking", + "graph store", + "linked data", + "project xanadu", + "world wide web", + "social networks", + "peer to peer", + "graph databases", + "urbit graph", + "digital hypertext", + "network protocols" +] [extra] author = "Reid Scoggin" diff --git a/app/content/blog/aesthetic-culture-1.md b/app/content/blog/aesthetic-culture-1.md index d69cdec5c8..9c447e227e 100644 --- a/app/content/blog/aesthetic-culture-1.md +++ b/app/content/blog/aesthetic-culture-1.md @@ -2,6 +2,19 @@ title = "Aesthetic Culture #1" description = "One of the most exciting things about Urbit is the aesthetic and design around it, developed partly by Tlon (through the design of Urbit itself) and partly by the community (by producing great Urbit art)." date = "2020-11-11" +search_terms = [ + "urbit art", + "aesthetic culture", + "sigil art", + "community art", + "art digest", + "urbit design", + "urbit memes", + "landscape themes", + "urbit creators", + "visual culture", + "urbit aesthetics" +] [extra] description = "One of the most exciting things about Urbit is the aesthetic and design around it, developed partly by Tlon (through the design of Urbit itself) and partly by the community (by producing great Urbit art)." diff --git a/app/content/blog/after-machine-war.md b/app/content/blog/after-machine-war.md index e309381ffb..0196430eee 100644 --- a/app/content/blog/after-machine-war.md +++ b/app/content/blog/after-machine-war.md @@ -2,6 +2,20 @@ title = "After the Machine War" description = "The date is January 1, 2050. The place, New York City. The vibe...subdued." date = "2021-03-14" +search_terms = [ + "after machine war", + "speculative fiction", + "digital dystopia", + "urbit future", + "permanent identities", + "peer to peer", + "2050 future", + "content moderation", + "megacorp world", + "surveillance tech", + "urbit optimism", + "future internet" +] [extra] author = "Simon Kovacs" diff --git a/app/content/blog/agency-daos.md b/app/content/blog/agency-daos.md index a9f7876c9e..c50ab316fa 100644 --- a/app/content/blog/agency-daos.md +++ b/app/content/blog/agency-daos.md @@ -2,6 +2,18 @@ title = "The Dream of the Agency DAO" date = "2022-11-04" description = "As creative studios and agencies struggle for more creative freedom, DAOs and tokenization will surely take a more central role in the marketing and branding industries. Decentralization offers such entities benefits that could fundamentally reshape creatives’ relationships with clients—reducing layers of inefficiency and anti-creative incentives." +search_terms = [ + "agency dao", + "creative agency", + "tokenization", + "branding industry", + "decentralized marketing", + "creative bounties", + "talent retention", + "idea valuation", + "urbit ids", + "creative reputation" +] [extra] author = "Isaac Simpson" diff --git a/app/content/blog/an-email.md b/app/content/blog/an-email.md index b91549af46..2c367097ba 100644 --- a/app/content/blog/an-email.md +++ b/app/content/blog/an-email.md @@ -2,6 +2,20 @@ title = "An Email from the Archive" description = "I found this email in my archives recently and thought it might be fun to share publicly." date = "2020-11-29" +search_terms = [ + "email from archive", + "simplicity", + "durability", + "ownership", + "urbit philosophy", + "digital tools", + "personal computing", + "decentralized network", + "software craftsmanship", + "christopher alexander", + "future vision", + "network institutions" +] [extra] author = "Galen Wolfe-Pauly" diff --git a/app/content/blog/an-urbit-overview.md b/app/content/blog/an-urbit-overview.md index 626c899227..bdab0499bb 100644 --- a/app/content/blog/an-urbit-overview.md +++ b/app/content/blog/an-urbit-overview.md @@ -2,6 +2,19 @@ title = "An Urbit Overview" date = "2016-05-10" description = "A high-level overview of Urbit." +search_terms = [ + "urbit overview", + "personal server", + "urbit os", + "digital independence", + "urbit address space", + "urbit identity", + "nock hoon arvo", + "encrypted p2p", + "urbit network", + "clean slate stack", + "virtual city" +] aliases = [ "/posts/essays/an-urbit-overview", "/posts/an-urbit-overview" diff --git a/app/content/blog/announcing-urbit-grants.md b/app/content/blog/announcing-urbit-grants.md index 4c1a2c8f61..2a2fa8c866 100644 --- a/app/content/blog/announcing-urbit-grants.md +++ b/app/content/blog/announcing-urbit-grants.md @@ -6,6 +6,18 @@ aliases = [ "/posts/essays/announcing-urbit-grants", "/posts/announcing-urbit-grants" ] +search_terms = [ + "urbit grants", + "grants program", + "bounties", + "gifts", + "proposals", + "azimuth stars", + "contributor rewards", + "grants website", + "community funding", + "urbit bounties" +] [extra] author = "Robert Mariani" diff --git a/app/content/blog/ares.md b/app/content/blog/ares.md index 30d095319d..292042f2b6 100644 --- a/app/content/blog/ares.md +++ b/app/content/blog/ares.md @@ -2,6 +2,18 @@ title = "Ares" date = "2023-06-26" description = "A light technical description of Ares, the new Urbit runtime" +search_terms = [ + "ares runtime", + "urbit runtime", + "subject knowledge analysis", + "2stackz", + "persistent memory arena", + "nock codegen", + "single level store", + "runtime performance", + "large data", + "ares release" +] [extra] author = "Noah Kumin" diff --git a/app/content/blog/august-2022-grants-program.md b/app/content/blog/august-2022-grants-program.md index 6bba1d1bca..1207bcde2f 100644 --- a/app/content/blog/august-2022-grants-program.md +++ b/app/content/blog/august-2022-grants-program.md @@ -2,6 +2,18 @@ title = "August Grants Program Review" date = "2022-08-30" description = "The completion of the first cohort of Hoon School Live and the following App School Live program minted dozens of capable new Hoon developers. These developers are completing applications, closing out bounties, and putting together proposals at a rapid pace, with more to come as Assembly 2022 draws near." +search_terms = [ + "grants program", + "hoon school", + "app school", + "grant review", + "bounties", + "apprenticeships", + "urbit foundation grants", + "completed grants", + "proposals", + "assembly 2022" +] [extra] author = "" ship = "~sarlev-sarsen" diff --git a/app/content/blog/azimuth-as-multipass.md b/app/content/blog/azimuth-as-multipass.md index 928e60d7d4..b8d283b080 100644 --- a/app/content/blog/azimuth-as-multipass.md +++ b/app/content/blog/azimuth-as-multipass.md @@ -6,6 +6,18 @@ aliases = [ "/posts/essays/azimuth-as-multipass/", "/posts/azimuth-as-multipass" ] +search_terms = [ + "azimuth multipass", + "civilizational key", + "azimuth identity", + "single login", + "urbit wallet", + "digital identity", + "multipass", + "azimuth point", + "urbit access", + "identity card" +] [extra] author = "Galen Wolfe-Pauly" diff --git a/app/content/blog/azimuth-is-on-chain.md b/app/content/blog/azimuth-is-on-chain.md index c10d275ae5..499be64cf7 100644 --- a/app/content/blog/azimuth-is-on-chain.md +++ b/app/content/blog/azimuth-is-on-chain.md @@ -2,6 +2,20 @@ title = "Azimuth is On-Chain" date = "2019-01-13" description = "The Urbit address space, now called Azimuth, is on the blockchain. And too many other things to fit into a single post." +search_terms = [ + "azimuth on chain", + "urbit address space", + "ethereum contracts", + "urbit identity", + "azimuth pki", + "ecliptic contract", + "erc-721 points", + "bridge interface", + "urbit os arvo", + "landscape cities", + "urbit pki", + "azimuth points" +] aliases = [ "/posts/essays/azimuth-is-on-chain", "/posts/azimuth-is-on-chain" diff --git a/app/content/blog/azimuth-security-bounty-program.md b/app/content/blog/azimuth-security-bounty-program.md index 48f5040fcf..8d43ec9d2b 100644 --- a/app/content/blog/azimuth-security-bounty-program.md +++ b/app/content/blog/azimuth-security-bounty-program.md @@ -6,6 +6,18 @@ aliases = [ "/posts/essays/azimuth-security-bounty-program", "/posts/azimuth-security-bounty-program" ] +search_terms = [ + "azimuth security", + "bounty program", + "hackerone", + "smart contracts", + "urbit pki", + "security audit", + "bridge testing", + "vulnerability report", + "security bounties", + "azimuth contracts" +] [extra] author = "Anthony Arroyo" diff --git a/app/content/blog/beliefs-and-principles.md b/app/content/blog/beliefs-and-principles.md index 4b1519779a..35a5cb337f 100644 --- a/app/content/blog/beliefs-and-principles.md +++ b/app/content/blog/beliefs-and-principles.md @@ -2,6 +2,18 @@ title = "Beliefs and Principles Guiding the Urbit Project" date = "2016-05-10" description = "We believe." +search_terms = [ + "urbit principles", + "urbit beliefs", + "digital independence", + "code is law", + "decentralized control", + "property rights", + "governance by stake", + "content neutrality", + "urbit republic", + "network governance" +] aliases = [ "/posts/essays/beliefs-and-principles", "/posts/beliefs-and-principles", diff --git a/app/content/blog/bootstrapping-urbit-from-ethereum.md b/app/content/blog/bootstrapping-urbit-from-ethereum.md index af4386b7e9..253e8ec5e1 100644 --- a/app/content/blog/bootstrapping-urbit-from-ethereum.md +++ b/app/content/blog/bootstrapping-urbit-from-ethereum.md @@ -2,6 +2,19 @@ title = "Bootstrapping Urbit from Ethereum" date = "2017-09-19" description = "We've decided to launch Urbit's constitution as a system of Ethereum contracts." +search_terms = [ + "bootstrapping urbit", + "ethereum contracts", + "urbit constitution", + "azimuth pki", + "urbit address space", + "spark token", + "galaxy governance", + "on chain registry", + "urbit on ethereum", + "urbit land registry", + "planet sales" +] aliases = [ "/posts/essays/bootstrapping-urbit-from-ethereum", "/posts/bootstrapping-urbit-from-ethereum", diff --git a/app/content/blog/building-beyond-beginner-guitar.md b/app/content/blog/building-beyond-beginner-guitar.md index 4b098dfc91..dbf6c88b60 100644 --- a/app/content/blog/building-beyond-beginner-guitar.md +++ b/app/content/blog/building-beyond-beginner-guitar.md @@ -14,6 +14,19 @@ imageIndex = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/Blog_Buil # imageCardDark = # imageIndexDark = tags = ["courseware", "hawk", "userspace"] +search_terms = [ + "beyond beginner guitar", + "hawk courseware", + "urbit business", + "guitar course", + "urbit hosting", + "stripe payments", + "crypto payments", + "access control", + "urbit userspace", + "course community", + "self sovereign" +] +++ diff --git a/app/content/blog/common-objections-to-urbit.md b/app/content/blog/common-objections-to-urbit.md index e172f94a85..b4e4331ec0 100644 --- a/app/content/blog/common-objections-to-urbit.md +++ b/app/content/blog/common-objections-to-urbit.md @@ -2,6 +2,18 @@ title = "Common Objections to Urbit" date = "2016-06-27" description = "Some common objections to Urbit, discussed." +search_terms = [ + "urbit objections", + "urbit critiques", + "urbit decentralization", + "urbit governance", + "hoon language", + "nock jets", + "urbit adoption", + "urbit scalability", + "urbit security", + "personal server concerns" +] aliases = [ "/posts/essays/common-objections-to-urbit", "/posts/common-objections-to-urbit", diff --git a/app/content/blog/community-spotlight-the-portico.md b/app/content/blog/community-spotlight-the-portico.md index c1fb32e426..d3a4ecbd7c 100644 --- a/app/content/blog/community-spotlight-the-portico.md +++ b/app/content/blog/community-spotlight-the-portico.md @@ -2,6 +2,19 @@ title = "Community Spotlight: The Portico" date = "2021-05-03" description = "Interview with The Portico founder Josh Reagan" +search_terms = [ + "portico community", + "orthodox christian", + "community spotlight", + "urbit groups", + "theology and logic", + "religious community", + "eternal september", + "decentralized communities", + "urbit culture", + "philosophy of religion", + "niche communities" +] [extra] author = "Matt" diff --git a/app/content/blog/contributor-spotlight-dozreg-toplud.md b/app/content/blog/contributor-spotlight-dozreg-toplud.md index f3706ce9e9..660351caab 100644 --- a/app/content/blog/contributor-spotlight-dozreg-toplud.md +++ b/app/content/blog/contributor-spotlight-dozreg-toplud.md @@ -8,6 +8,19 @@ description = "A peek into the mind behind UrWASM, and the undertaking to make U ship = "~sarlev-sarsen" image = "/images/dozreg-toplud-spotlight.png" tags = ["spotlight", "UrWASM", "subject-knowledge analysis"] +search_terms = [ + "contributor spotlight", + "dozreg toplud", + "urwasm", + "subject knowledge analysis", + "ford build system", + "nock speed", + "runtime performance", + "urbit simplicity", + "security permissions", + "gall tooling", + "directed messaging" +] +++ > **\~sarlev:** What about Urbit drew you in and captured your attention? diff --git a/app/content/blog/contributor-spotlight-mastyr-bottec.md b/app/content/blog/contributor-spotlight-mastyr-bottec.md index 28dfd148b8..baccc09c62 100644 --- a/app/content/blog/contributor-spotlight-mastyr-bottec.md +++ b/app/content/blog/contributor-spotlight-mastyr-bottec.md @@ -14,6 +14,19 @@ image = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/Blog_QA+mastyr # imageCardDark = # imageIndexDark = tags = ["spotlight", "vere64", "runtime"] +search_terms = [ + "contributor spotlight", + "mastyr bottec", + "vere64", + "runtime developer", + "large data", + "loom size", + "runtime migration", + "directed messaging", + "nock runtime", + "storage scaling", + "urbit runtime" +] +++ > **\~sarlev:** So, starting at the top, what's the first thing that drew you into the idea that we needed to throw away and rewrite the entire network computing stack? Or are you even sold on that? diff --git a/app/content/blog/contributor-spotlight-niblyx-malnus-and-bonbud-macryg.md b/app/content/blog/contributor-spotlight-niblyx-malnus-and-bonbud-macryg.md index 3c7375182a..e291a527e5 100644 --- a/app/content/blog/contributor-spotlight-niblyx-malnus-and-bonbud-macryg.md +++ b/app/content/blog/contributor-spotlight-niblyx-malnus-and-bonbud-macryg.md @@ -14,6 +14,19 @@ imageCard = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/Blog+QA+~n # imageCardDark = # imageIndexDark = tags = ["AI", "design", "architecture"] +search_terms = [ + "contributor spotlight", + "groundwire", + "bonbud macryg", + "niblyx malnus", + "urbit ai", + "llm tools", + "christopher alexander", + "mcp server", + "urbit master", + "architecture design", + "hoon" +] +++ > **\~sarlev:** This is our first two-person spotlight interview, so we'll see how it goes and adapt accordingly. I generally like to start by just asking, what first drew you into the idea that we needed to throw away and rewrite the entire networked computing stack? diff --git a/app/content/blog/contributor-spotlight-nordus-mocwyl.md b/app/content/blog/contributor-spotlight-nordus-mocwyl.md index 780ada937a..c58f7099eb 100644 --- a/app/content/blog/contributor-spotlight-nordus-mocwyl.md +++ b/app/content/blog/contributor-spotlight-nordus-mocwyl.md @@ -14,6 +14,19 @@ imageCard = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/Blog_QA+no # imageCardDark = # imageIndexDark = tags = ["spotlight", "userspace", "community"] +search_terms = [ + "contributor spotlight", + "nordus mocwyl", + "independent music", + "musician", + "urbit for creators", + "hawk website", + "guitar course", + "direct charity", + "personal server", + "hoon learning", + "sovereign web" +] +++ > **\~sarlev:** What drew you into the idea that we needed to throw away and rewrite the entire network computing stack? diff --git a/app/content/blog/convivial-networks.md b/app/content/blog/convivial-networks.md index b58ec630d2..061a1a728f 100644 --- a/app/content/blog/convivial-networks.md +++ b/app/content/blog/convivial-networks.md @@ -2,6 +2,18 @@ title = "Convivial Networks" date = "2022-05-27" description = "Like the relationships that we build within them, our platforms should yield satisfaction precisely because they’re non-trivial; they demand effort, which is another way of saying they require engagement with the world." +search_terms = [ + "convivial networks", + "convivial tools", + "ivan illich", + "human scale tech", + "attention economy", + "community building", + "personal computing", + "urbit community", + "peer to peer", + "ownership" +] [extra] author = "" ship = "~witwyt-widlyr" diff --git a/app/content/blog/creating-sigils.md b/app/content/blog/creating-sigils.md index 8bdf2e36eb..66f8d9d737 100644 --- a/app/content/blog/creating-sigils.md +++ b/app/content/blog/creating-sigils.md @@ -2,6 +2,19 @@ title = "Creating Sigils" date = "2020-02-03" description = "The origin and design process informing Urbit's generative user avatar system, Sigils." +search_terms = [ + "creating sigils", + "urbit sigils", + "visual identity", + "urbit id", + "sigil design", + "generative avatars", + "phonemes", + "sigil js", + "design process", + "identity system", + "urbit names" +] [extra] author = "Gavin Atkinson" diff --git a/app/content/blog/desire-lines.md b/app/content/blog/desire-lines.md index 5f3418d398..c825d6bdda 100644 --- a/app/content/blog/desire-lines.md +++ b/app/content/blog/desire-lines.md @@ -2,6 +2,18 @@ title = "Desire Lines to a New Internet" date = "2022-05-06" description = "As more DAOs, NFT and digital communities find their way to Urbit, others are likely to follow their paths, making them their own, just like the network itself." +search_terms = [ + "desire lines", + "web3 communities", + "dao migration", + "urbit adoption", + "token gating", + "planet distribution", + "holium ballot", + "pointdao", + "urbit for creators", + "decentralized networks" +] [extra] author = "" ship = "~dalwes-migdec" diff --git a/app/content/blog/developer-preview-vere64.md b/app/content/blog/developer-preview-vere64.md index 390ccaf4d2..86484622d7 100644 --- a/app/content/blog/developer-preview-vere64.md +++ b/app/content/blog/developer-preview-vere64.md @@ -14,6 +14,18 @@ image = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/Blog_Vere64+DP # imageCardDark = # imageIndexDark = tags = ["developer preview", "vere64", "runtime"] +search_terms = [ + "vere64 preview", + "developer preview", + "unlimited loom", + "build from source", + "loom size", + "runtime 64-bit", + "demand paging", + "loom constraints", + "file size limit", + "runtime preview" +] +++ Urbit has long been practically and conceptually constrained in its application by the limitation in the ["loom"](https://docs.urbit.org/build-on-urbit/core-academy/ca06#the-loom) size. Initially the Vere runtime could provide only a mere 2GB in available memory, but over the years that has been increased to 4GB, 8GB, and most recently 16GB with the recent [Vere 4.0 release](https://github.com/urbit/vere/releases/tag/vere-v4.0). These improvements have come from various projects, such as pointer compression in the allocator making 16GB loom possible in Vere 4.0, or [demand paging](https://docs.urbit.org/build-on-urbit/core-academy/ca06#demand-paging) which makes it possible to not require the entire loom to live in RAM, making it viable to run a larger loom on reasonable underlying hardware. diff --git a/app/content/blog/eliza.md b/app/content/blog/eliza.md index acf1d8229f..01c310c4f9 100644 --- a/app/content/blog/eliza.md +++ b/app/content/blog/eliza.md @@ -2,6 +2,20 @@ title = "Eliza" date = "2021-02-22" description = "Building things, even Calm™ things, makes noise." +search_terms = [ + "eliza bot", + "urbit chatbot", + "landscape feedback", + "data collection", + "calm bot", + "urbit surveys", + "open source bot", + "urbit automation", + "anti spam", + "urbit agents", + "network economics", + "tlon bot" +] [extra] author = "Christian Langalis" diff --git a/app/content/blog/events-series.md b/app/content/blog/events-series.md index bdecf7a593..bd5a9818a4 100644 --- a/app/content/blog/events-series.md +++ b/app/content/blog/events-series.md @@ -2,6 +2,19 @@ title = "Urbit Events Series" description = "These events are an opportunity for Urbit contributors to share real-time updates that don’t make it into this blog, and for the community to get to know the contributors (and one another)." date = "2020-10-29" +search_terms = [ + "urbit events", + "developer calls", + "community series", + "town hall", + "urbitcon", + "community building", + "urbit community", + "event series", + "grants program", + "knowledge sharing", + "developer talks" +] [extra] description = "These events are an opportunity for Urbit contributors to share real-time updates that don’t make it into this blog, and for the community to get to know the contributors (and one another)." diff --git a/app/content/blog/first-contract.md b/app/content/blog/first-contract.md index ce2972cb48..284baf579f 100644 --- a/app/content/blog/first-contract.md +++ b/app/content/blog/first-contract.md @@ -2,6 +2,20 @@ title = "Azimuth’s First Contract Upgrade" date = "2021-06-04" description = "Galactic Senate makes first concrete action" +search_terms = [ + "azimuth upgrade", + "first contract", + "galactic senate", + "ecliptic changes", + "erc721 fix", + "claims contract", + "proxy addresses", + "urbit governance", + "doc vote", + "address space", + "azimuth vote", + "senate proposals" +] [extra] author = "Jonathan Paprocki and Mark" diff --git a/app/content/blog/first-steps-towards-urbit-org.md b/app/content/blog/first-steps-towards-urbit-org.md index 2fca30ec11..bdb2605ef3 100644 --- a/app/content/blog/first-steps-towards-urbit-org.md +++ b/app/content/blog/first-steps-towards-urbit-org.md @@ -2,6 +2,19 @@ title = "First Steps Towards urbit.org" date = "2020-08-11" description = "With a stable platform taking shape and a strong community forming that wants to help build Urbit, it’s time to make urbit.org real." +search_terms = [ + "urbit.org", + "urbit foundation", + "address space", + "grants program", + "interim director", + "community builders", + "governance", + "airlock", + "urbit roadmap", + "protocol stewardship", + "platform maturity" +] [extra] author = "Josh Lehman" diff --git a/app/content/blog/ford-fusion.md b/app/content/blog/ford-fusion.md index 632b9e6f82..80a76628a4 100644 --- a/app/content/blog/ford-fusion.md +++ b/app/content/blog/ford-fusion.md @@ -2,6 +2,19 @@ title = "Ford Fusion" date = "2020-07-14" description = "Ford Fusion was an overhaul of Urbit's over-the-air upgrade process and a rewrite of its build system. The new update system corrects a few long-standing bugs with the previous one, and the new build system is simpler, smaller (by around 5,000 lines), and easier to manage." +search_terms = [ + "ford fusion", + "ota updates", + "build system", + "urbit upgrades", + "clay", + "hoon compiler", + "arvo kernel", + "atomic updates", + "ordered updates", + "self contained builds", + "urbit tooling" +] [extra] author = "Ted Blackman" diff --git a/app/content/blog/foss-1.md b/app/content/blog/foss-1.md index 50e281868f..cddfb81e0f 100644 --- a/app/content/blog/foss-1.md +++ b/app/content/blog/foss-1.md @@ -2,6 +2,18 @@ title = "Urbit's Open Source Culture, Part I" date = "2023-05-31" description = "How did Urbit cultivate a unique open source software culture? Let's take a look at how we got to where we are today." +search_terms = [ + "open source culture", + "urbit history", + "skunkworks", + "developer community", + "hoon education", + "third party distribution", + "urbit foundation", + "assembly events", + "grants program", + "urbit open source" +] [extra] author = "N E Davis" diff --git a/app/content/blog/foss-2.md b/app/content/blog/foss-2.md index d08fc99b44..3f92ad9544 100644 --- a/app/content/blog/foss-2.md +++ b/app/content/blog/foss-2.md @@ -2,6 +2,18 @@ title = "Urbit's Open Source Culture, Part II" date = "2023-06-13" description = "How will Urbit continue to foster its innovative open source software culture?" +search_terms = [ + "open source culture", + "urbit foundation", + "developer experience", + "hoon prime", + "documentation", + "grants program", + "build parties", + "developer tooling", + "open source strategy", + "community" +] [extra] author = "N E Davis" diff --git a/app/content/blog/gifts-q3-2020.md b/app/content/blog/gifts-q3-2020.md index 717f8b2989..3e6967bd53 100644 --- a/app/content/blog/gifts-q3-2020.md +++ b/app/content/blog/gifts-q3-2020.md @@ -2,6 +2,18 @@ title = "Gifts Q3 2020" date = "2020-09-22" description = "Twice a year we distribute address space to those that have made valuable contributions to Urbit. Now called our Gifts program, the gifting of address space has been part of Urbit long before we had a grants program." +search_terms = [ + "gifts program", + "address space", + "urbit gifts", + "community contributors", + "grants program", + "galaxy gifts", + "star awards", + "urbit foundation", + "network growth", + "urbit rewards" +] [taxonomies] grant_type = [ "Gift" ] diff --git a/app/content/blog/governance-of-urbit.md b/app/content/blog/governance-of-urbit.md index 1260e18ac6..e96aa0437b 100644 --- a/app/content/blog/governance-of-urbit.md +++ b/app/content/blog/governance-of-urbit.md @@ -2,6 +2,18 @@ title = "Governance of urbit.org" date = "2019-01-10" description = "Stewardship of the Urbit Project." +search_terms = [ + "urbit governance", + "urbit.org assets", + "urbit address space", + "azimuth property", + "galaxy grants", + "tlon stewardship", + "board of advisors", + "platform development", + "urbit foundation", + "address space pool" +] aliases = [ "/posts/essays/governance-of-urbit", "/posts/governance-of-urbit" diff --git a/app/content/blog/hackathon-2023.md b/app/content/blog/hackathon-2023.md index d8fe839ed4..54e29612b6 100644 --- a/app/content/blog/hackathon-2023.md +++ b/app/content/blog/hackathon-2023.md @@ -2,6 +2,20 @@ title = "Assembly Hackathon 2023" date = "2023-12-05" description = "The Assembly 2023 Hackathon was the most successful Urbit Hackathon we've had. Get a taste of Demo Day in Lisbon and check out the projects they made." +search_terms = [ + "assembly hackathon", + "demo day", + "urbit hackathon", + "%eyas", + "urwasm", + "pharos", + "%yijing", + "%bizbaz", + "mentat", + "seax", + "urbit apps", + "lisbon" +] [extra] author = "Jack Wang" diff --git a/app/content/blog/hackathon-results.md b/app/content/blog/hackathon-results.md index 40249a3281..b6634a25bd 100644 --- a/app/content/blog/hackathon-results.md +++ b/app/content/blog/hackathon-results.md @@ -2,6 +2,18 @@ title = "Hackathon Results" date = "2020-06-11" description = "We recently held an invite-only Urbit Hackathon for graduates of our Hoon School program, and the submissions really impressed us across the board. Submissions were judged on several criteria: creativity, usefulness, and code quality." +search_terms = [ + "urbit hackathon", + "hoon school", + "hackathon results", + "landscape apps", + "canvas app", + "rote flashcards", + "community projects", + "urbit prizes", + "developer competition", + "urbit builders" +] [extra] author = "Robert Mariani" diff --git a/app/content/blog/haleek-maul-interview.md b/app/content/blog/haleek-maul-interview.md index 29115e9282..e625ac2e7e 100644 --- a/app/content/blog/haleek-maul-interview.md +++ b/app/content/blog/haleek-maul-interview.md @@ -2,6 +2,20 @@ title = "NFTs, Urbit IDs, and Communities w/ Haleek Maul" date = "2021-09-09" description = "An interview with the founder of Holdersland" +search_terms = [ + "haleek maul", + "holdersland", + "urbit ids", + "nfts", + "sigil art", + "digital communities", + "caribbean artists", + "assembly 2021", + "urbit dao", + "nft auction", + "urbit identity", + "crypto communities" +] [extra] author = "Matt" ship = "~tirwyd-sarmes" diff --git a/app/content/blog/hoon-4-lispers.md b/app/content/blog/hoon-4-lispers.md index 3425ad90bb..ac35717692 100644 --- a/app/content/blog/hoon-4-lispers.md +++ b/app/content/blog/hoon-4-lispers.md @@ -2,6 +2,19 @@ title = "A Perspective on Lisp and Hoon" date = "2023-06-15" description = "Lisp is an éminence grise of programming. How does Hoon compare?" +search_terms = [ + "hoon vs lisp", + "lisp comparison", + "hoon language", + "nock", + "runes", + "homoiconic", + "metaprogramming", + "functional programming", + "hoon types", + "lisp macros", + "urbit programming" +] [extra] author = "N E Davis" diff --git a/app/content/blog/hosting-the-future.md b/app/content/blog/hosting-the-future.md index d9538a081f..1a2fc77899 100644 --- a/app/content/blog/hosting-the-future.md +++ b/app/content/blog/hosting-the-future.md @@ -2,6 +2,19 @@ title = "Hosting the Future" date = "2020-09-30" description = "The way we see it, hosting is the most important thing, next to Landscape, that Tlon can do to help Urbit continue toward widespread adoption." +search_terms = [ + "hosting service", + "tlon hosting", + "urbit hosting", + "onboarding", + "landscape", + "hosting providers", + "tlon.io", + "self hosting", + "urbit adoption", + "urbit foundation", + "planet hosting" +] [extra] author = "Nick Simmons" diff --git a/app/content/blog/immunology-for-the-internet-age.md b/app/content/blog/immunology-for-the-internet-age.md index e0dbe48f3b..149681eb43 100644 --- a/app/content/blog/immunology-for-the-internet-age.md +++ b/app/content/blog/immunology-for-the-internet-age.md @@ -2,6 +2,18 @@ title = "Immunology for the Internet Age" date = "2022-04-07" description = "A consideration of the history of the Internet motivates introspection on the nature and causes of social dysfunction in a globally shared space. Centralized solutions fail to yield satisfactory outcomes for human freedom and thriving. Decentralized autonomous organizations and their technological apparatus together represent the evolution of an immune system against a corporatized Internet." +search_terms = [ + "internet immune system", + "decentralization", + "daos", + "pseudonymity", + "megacorp", + "privacy", + "cyberpunk", + "ownership", + "urbit", + "zero trust" +] [extra] author = "" ship = "~lagrev-nocfep" diff --git a/app/content/blog/infrastructural.md b/app/content/blog/infrastructural.md index 7d23c7e6e9..e0edd27051 100644 --- a/app/content/blog/infrastructural.md +++ b/app/content/blog/infrastructural.md @@ -2,6 +2,19 @@ title = "Infrastructural" date = "2020-04-09" description = "A reflection–meditation on OS 1’s initial form development, and the attitude we brought to bear in designing it." +search_terms = [ + "infrastructural", + "os1 design", + "human shaped infrastructure", + "interface design", + "beautiful infrastructure", + "digital spaces", + "os0", + "os1", + "communal computing", + "urbit interface", + "design philosophy" +] [extra] author = "É. Urcades" diff --git a/app/content/blog/interim-constitution.md b/app/content/blog/interim-constitution.md index 47ebb89319..d9a9f4c3e1 100644 --- a/app/content/blog/interim-constitution.md +++ b/app/content/blog/interim-constitution.md @@ -2,6 +2,18 @@ title = "Interim Constitution" date = "2016-05-15" description = "The governing rules for the early days of the Urbit network." +search_terms = [ + "interim constitution", + "urbit governance", + "galaxy senate", + "stellar congress", + "planetary assembly", + "consulate rules", + "urbit republic", + "address space presale", + "urbit foundation", + "galaxy table" +] aliases = [ "/posts/essays/interim-constitution", "/posts/constitution" ] [extra] diff --git a/app/content/blog/interplanetary_commerce.md b/app/content/blog/interplanetary_commerce.md index da10152ded..92dd611664 100644 --- a/app/content/blog/interplanetary_commerce.md +++ b/app/content/blog/interplanetary_commerce.md @@ -3,6 +3,20 @@ title = "Interplanetary Commerce" date = "2021-04-08" description = "OS-level commercial primitives." tags = ["bitcoin"] +search_terms = [ + "interplanetary commerce", + "urbit payments", + "bitcoin wallet", + "lightning network", + "ship payments", + "urbit hosting", + "creator economy", + "p2p commerce", + "urbit services", + "paywalls", + "urbit bitcoin", + "commercial primitives" +] [extra] author = "Christian Langalis" diff --git a/app/content/blog/introducing-os1.md b/app/content/blog/introducing-os1.md index 439d5fceed..fa53557525 100644 --- a/app/content/blog/introducing-os1.md +++ b/app/content/blog/introducing-os1.md @@ -2,6 +2,19 @@ title = "Introducing OS 1" date = "2020-04-29" description = "OS 1 is somewhere between ‘productivity software’ and a ‘social network’. We think it’s the beginning of an altogether new breed of social computing." +search_terms = [ + "os1", + "introducing os1", + "landscape", + "social computing", + "urbit groups", + "chat modules", + "links module", + "publish notebook", + "urbit interface", + "community grants", + "urbit os" +] [extra] author = "Galen Wolfe-Pauly" diff --git a/app/content/blog/introduction-to-the-combine-dao.md b/app/content/blog/introduction-to-the-combine-dao.md index 5673d211e1..e8d9d78692 100644 --- a/app/content/blog/introduction-to-the-combine-dao.md +++ b/app/content/blog/introduction-to-the-combine-dao.md @@ -2,6 +2,18 @@ title = "Introduction to the Combine DAO" date = "2022-07-01" description = "Inside the mind of the Combine" +search_terms = [ + "combine dao", + "urbit foundation", + "dao on urbit", + "ballot app", + "uqbar", + "urbit investing", + "dao membership", + "urbit projects", + "grants pipeline", + "dao investors" +] [extra] author = "Anthony Arroyo" diff --git a/app/content/blog/io-in-hoon.md b/app/content/blog/io-in-hoon.md index e935ef3a85..deee6922ea 100644 --- a/app/content/blog/io-in-hoon.md +++ b/app/content/blog/io-in-hoon.md @@ -2,6 +2,20 @@ title = "Input and Output in Hoon" description = "Let's talk about IO in Urbit." date = "2020-12-15" +search_terms = [ + "hoon io", + "input output", + "state machines", + "monadic io", + "urbit threads", + "urbit agents", + "arvo vanes", + "functional io", + "imperative io", + "io patterns", + "hoon programming", + "state machine io" +] [extra] author = "Philip Monk" diff --git a/app/content/blog/iot.md b/app/content/blog/iot.md index 34f0b77042..5145cec745 100644 --- a/app/content/blog/iot.md +++ b/app/content/blog/iot.md @@ -2,6 +2,20 @@ title = "Lunar Urbit and the Internet of Things" date = "2021-04-29" description = "Potential future use cases of moons for industry and consumers" +search_terms = [ + "lunar urbit", + "internet of things", + "urbit moons", + "iot security", + "solid state interpreter", + "self authenticating ids", + "industrial iot", + "agriculture data", + "p2p data markets", + "device identity", + "urbit ids", + "moon identities" +] [extra] author = "Jonathan Paprocki" diff --git a/app/content/blog/landscape-a-portrait.md b/app/content/blog/landscape-a-portrait.md index 5e9f5ca86d..e6b1a03214 100644 --- a/app/content/blog/landscape-a-portrait.md +++ b/app/content/blog/landscape-a-portrait.md @@ -6,6 +6,19 @@ aliases = [ "/posts/essays/landscape-a-portrait/", "/posts/landscape-a-portrait" ] +search_terms = [ + "landscape ui", + "urbit interface", + "modulo", + "userspace", + "indigo", + "chat publish", + "urbit apps", + "eyre vane", + "create landscape app", + "interface roadmap", + "urbit design" +] [extra] author = "Matilde Park" diff --git a/app/content/blog/layer-2-faq.md b/app/content/blog/layer-2-faq.md index 0eacfc4b50..5b4d33288c 100644 --- a/app/content/blog/layer-2-faq.md +++ b/app/content/blog/layer-2-faq.md @@ -2,6 +2,18 @@ title = "Layer 2 FAQ" date = "2022-03-01" description = "Answers to all your lingering L2 questions." +search_terms = [ + "layer 2 faq", + "l2 planets", + "rollup", + "bridge", + "planet custody", + "migrate l1 to l2", + "naive rollup", + "metamask", + "buy planet", + "hosting provider" +] [extra] image = "https://media.urbit.org/site/posts/essays/l2-faq-artwork.jpg" +++ diff --git a/app/content/blog/llms-on-urbit.md b/app/content/blog/llms-on-urbit.md index af75e1958e..7b65034a73 100644 --- a/app/content/blog/llms-on-urbit.md +++ b/app/content/blog/llms-on-urbit.md @@ -14,6 +14,20 @@ image = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/Blog_LLMs+on+U # imageCardDark = # imageIndexDark = tags = ["AI", "guides"] +search_terms = [ + "llms on urbit", + "clurd", + "urbit master", + "claude code", + "dojo access", + "llm tooling", + "mcp server", + "sailbox", + "tarball", + "agentic assistants", + "groundwire", + "llm setup" +] +++ ![llms on urbit image](https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/Blog_LLMs+on+Urbit_Social+16x9.png ) diff --git a/app/content/blog/magic.md b/app/content/blog/magic.md index c3833ccf6f..9fb94167cb 100644 --- a/app/content/blog/magic.md +++ b/app/content/blog/magic.md @@ -2,6 +2,18 @@ title = "Magic" date = "2016-05-15" description = "A thought-experiment to explain the Urbit user experience." +search_terms = [ + "urbit user experience", + "personal server vision", + "magic thought experiment", + "free your data", + "self hosted identity", + "urbit platform", + "digital freedom", + "personal cloud", + "agent software", + "urbit metaphor" +] aliases = [ "/posts/essays/magic", "/posts/magic" ] [extra] diff --git a/app/content/blog/metaphase.md b/app/content/blog/metaphase.md index 6a3a5ca5db..9e17f76a99 100644 --- a/app/content/blog/metaphase.md +++ b/app/content/blog/metaphase.md @@ -2,6 +2,20 @@ title = "Metaphase" date = "2020-12-08" description = "On the upcoming and foregoing Landscape lifecycles, and other forms of mitosis across the Urbit project." +search_terms = [ + "landscape lifecycle", + "release streams", + "graph store", + "notifications", + "stable stream", + "dev stream", + "landscape roadmap", + "userspace apps", + "urbit foundation", + "product process", + "ota updates", + "landscape teams" +] [extra] author = "Matilde Park" diff --git a/app/content/blog/nockmas-2025-day-1.md b/app/content/blog/nockmas-2025-day-1.md index 6c84413f1e..1c676f6ab6 100644 --- a/app/content/blog/nockmas-2025-day-1.md +++ b/app/content/blog/nockmas-2025-day-1.md @@ -14,6 +14,17 @@ image = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+1/nockmas- # imageCardDark = # imageIndexDark = tags = ["nock", "nockmas", ""] +search_terms = [ + "nockmas day 1", + "opcode 0", + "address opcode", + "slot operator", + "tree addressing", + "nock nouns", + "binary tree", + "nock address", + "nock tutorial" +] +++ ![nockmas day 1 tree addressing image](https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+1/nockmas-day-1-tree-addressing-Social.png) diff --git a/app/content/blog/nockmas-2025-day-10.md b/app/content/blog/nockmas-2025-day-10.md index e5c9e76479..6b3453bd6d 100644 --- a/app/content/blog/nockmas-2025-day-10.md +++ b/app/content/blog/nockmas-2025-day-10.md @@ -14,6 +14,17 @@ image = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+10/nockmas # imageCardDark = # imageIndexDark = tags = ["nock", "nockmas", ""] +search_terms = [ + "nockmas day 10", + "opcode 9", + "invoke opcode", + "core arms", + "battery payload", + "nock invoke", + "nock isa", + "core call", + "nock tutorial" +] +++ ![nockmas day 10 invoke image](https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+10/nockmas-day-10-invoke-social.png) diff --git a/app/content/blog/nockmas-2025-day-11.md b/app/content/blog/nockmas-2025-day-11.md index bcf30e2dd7..8bb7b11f19 100644 --- a/app/content/blog/nockmas-2025-day-11.md +++ b/app/content/blog/nockmas-2025-day-11.md @@ -14,6 +14,17 @@ image = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+11/nockmas # imageCardDark = # imageIndexDark = tags = ["nock", "nockmas", ""] +search_terms = [ + "nockmas day 11", + "opcode 10", + "edit opcode", + "hax edit", + "nock edit", + "gate calls", + "nock isa", + "in place edit", + "nock tutorial" +] +++ ![nockmas day 11 edit image](https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+11/nockmas-day-11-edit-social.png) diff --git a/app/content/blog/nockmas-2025-day-12.md b/app/content/blog/nockmas-2025-day-12.md index 0f68a8ffa2..2f7b022c88 100644 --- a/app/content/blog/nockmas-2025-day-12.md +++ b/app/content/blog/nockmas-2025-day-12.md @@ -14,6 +14,18 @@ image = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+12/nockmas # imageCardDark = # imageIndexDark = tags = ["nock", "nockmas", ""] +search_terms = [ + "nockmas day 12", + "opcode 11", + "hint opcode", + "static hint", + "dynamic hint", + "nock metadata", + "hints and jetting", + "nock isa", + "runtime hints", + "nock tutorial" +] +++ ![nockmas day 12 hint image](https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+12/nockmas-day-12-hint-social.png) diff --git a/app/content/blog/nockmas-2025-day-2.md b/app/content/blog/nockmas-2025-day-2.md index 39364782d3..164237c0a9 100644 --- a/app/content/blog/nockmas-2025-day-2.md +++ b/app/content/blog/nockmas-2025-day-2.md @@ -14,6 +14,17 @@ image = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+2/nockmas- # imageCardDark = # imageIndexDark = tags = ["nock", "nockmas", ""] +search_terms = [ + "nockmas day 2", + "opcode 1", + "constant opcode", + "nock constant", + "store data", + "return constant", + "nock isa", + "nock tutorial", + "stored code" +] +++ ![nockmas day 2 constants image](https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+2/nockmas-day-2-constants-Social.png) diff --git a/app/content/blog/nockmas-2025-day-3.md b/app/content/blog/nockmas-2025-day-3.md index 88ae7e12f4..24179d100a 100644 --- a/app/content/blog/nockmas-2025-day-3.md +++ b/app/content/blog/nockmas-2025-day-3.md @@ -14,6 +14,17 @@ image = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/Day+3/nockmas- # imageCardDark = # imageIndexDark = tags = ["nock", "nockmas", ""] +search_terms = [ + "nockmas day 3", + "opcode 2", + "evaluate opcode", + "tar operator", + "dynamic eval", + "nock evaluate", + "metaprogramming", + "nock isa", + "nock tutorial" +] +++ ![nockmas day 3 evaluate image](https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/Day+3/nockmas-day-3-Evaluate-Social.png) diff --git a/app/content/blog/nockmas-2025-day-4.md b/app/content/blog/nockmas-2025-day-4.md index 95b00e1f43..85fb62daa1 100644 --- a/app/content/blog/nockmas-2025-day-4.md +++ b/app/content/blog/nockmas-2025-day-4.md @@ -14,6 +14,17 @@ image = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+4/nockmas- # imageCardDark = # imageIndexDark = tags = ["nock", "nockmas", ""] +search_terms = [ + "nockmas day 4", + "opcode 3", + "cell check", + "wut operator", + "nock cell", + "atom vs cell", + "loobean", + "nock isa", + "nock tutorial" +] +++ ![nockmas day 4 cell check image](https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+4/nockmas-day-4-cell-check-Social.png) diff --git a/app/content/blog/nockmas-2025-day-5.md b/app/content/blog/nockmas-2025-day-5.md index 35b72e3952..e4e859ebd7 100644 --- a/app/content/blog/nockmas-2025-day-5.md +++ b/app/content/blog/nockmas-2025-day-5.md @@ -14,6 +14,17 @@ image = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+5/nockmas- # imageCardDark = # imageIndexDark = tags = ["nock", "nockmas", ""] +search_terms = [ + "nockmas day 5", + "opcode 4", + "increment opcode", + "lus operator", + "nock increment", + "arithmetic primitive", + "jetting", + "nock isa", + "nock tutorial" +] +++ ![nockmas day 5 increment image](https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+5/nockmas-day-5-increment-social.png) diff --git a/app/content/blog/nockmas-2025-day-6.md b/app/content/blog/nockmas-2025-day-6.md index 6c941107de..a9a79c4cd6 100644 --- a/app/content/blog/nockmas-2025-day-6.md +++ b/app/content/blog/nockmas-2025-day-6.md @@ -14,6 +14,17 @@ image = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+6/nockmas- # imageCardDark = # imageIndexDark = tags = ["nock", "nockmas", ""] +search_terms = [ + "nockmas day 6", + "opcode 5", + "equality check", + "tis operator", + "nock equality", + "deep equality", + "loobean", + "nock isa", + "nock tutorial" +] +++ ![nockmas day 6 equal image](https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+6/nockmas-day-6-equal-social.png) diff --git a/app/content/blog/nockmas-2025-day-7.md b/app/content/blog/nockmas-2025-day-7.md index 10efc34d53..6e9327d65b 100644 --- a/app/content/blog/nockmas-2025-day-7.md +++ b/app/content/blog/nockmas-2025-day-7.md @@ -14,6 +14,17 @@ image = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+7/nockmas- # imageCardDark = # imageIndexDark = tags = ["nock", "nockmas", ""] +search_terms = [ + "nockmas day 7", + "opcode 6", + "conditional opcode", + "if then else", + "nock conditional", + "loobean", + "composite opcode", + "nock isa", + "nock tutorial" +] +++ ![nockmas day 7 conditional image](https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+7/nockmas-day-7-conditional-social.png) diff --git a/app/content/blog/nockmas-2025-day-8.md b/app/content/blog/nockmas-2025-day-8.md index fbba70659b..af0218e1c6 100644 --- a/app/content/blog/nockmas-2025-day-8.md +++ b/app/content/blog/nockmas-2025-day-8.md @@ -14,6 +14,17 @@ image = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+8/nockmas- # imageCardDark = # imageIndexDark = tags = ["nock", "nockmas", ""] +search_terms = [ + "nockmas day 8", + "opcode 7", + "compose opcode", + "function composition", + "nock compose", + "pipe pattern", + "subject transform", + "nock isa", + "nock tutorial" +] +++ ![nockmas day 8 compose image](https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+8/nockmas-day-8-compose-social.png) diff --git a/app/content/blog/nockmas-2025-day-9.md b/app/content/blog/nockmas-2025-day-9.md index 49aaeb0799..e99f1a1d11 100644 --- a/app/content/blog/nockmas-2025-day-9.md +++ b/app/content/blog/nockmas-2025-day-9.md @@ -14,6 +14,17 @@ image = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+9/nockmas- # imageCardDark = # imageIndexDark = tags = ["nock", "nockmas", ""] +search_terms = [ + "nockmas day 9", + "opcode 8", + "extend opcode", + "variable binding", + "nock extend", + "pin value", + "subject extension", + "nock isa", + "nock tutorial" +] +++ ![nockmas day 9 extend image](https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/day+9/nockmas-day-9-extend-social.png) diff --git a/app/content/blog/nockmas-2025-welcome.md b/app/content/blog/nockmas-2025-welcome.md index 0564f09395..d6b53fec01 100644 --- a/app/content/blog/nockmas-2025-welcome.md +++ b/app/content/blog/nockmas-2025-welcome.md @@ -14,6 +14,17 @@ image = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/nockmas-day-mi # imageCardDark = # imageIndexDark = tags = ["nock", "nockmas", "autocons"] +search_terms = [ + "nockmas day 0", + "autocons", + "nock evaluation", + "cell construction", + "nock intro", + "formula cell", + "nock basics", + "nock isa", + "nock tutorial" +] +++ ![nockmas day minus 1 autocons image](https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/nockmas-day-minus-1-autocons.png) diff --git a/app/content/blog/nockpu.md b/app/content/blog/nockpu.md index aff38dfd7b..53f14a8d9a 100644 --- a/app/content/blog/nockpu.md +++ b/app/content/blog/nockpu.md @@ -2,6 +2,17 @@ title = "NockPU" date = "2023-08-02" description = "A light technical description of NockPU, a hardware system for running Nock" +search_terms = [ + "nockpu", + "nock hardware", + "nock processing unit", + "bare metal nock", + "hardware jets", + "tree traversal", + "binary tree", + "urbit hardware", + "mopfel winrux" +] [extra] author = "Noah Kumin" diff --git a/app/content/blog/olif-and-urbit-ids.md b/app/content/blog/olif-and-urbit-ids.md index 8691391de6..41c114b529 100644 --- a/app/content/blog/olif-and-urbit-ids.md +++ b/app/content/blog/olif-and-urbit-ids.md @@ -14,6 +14,20 @@ imageCard = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/Blog_Olif+ # imageCardDark = "" # imageIndexDark = "" tags = ["olif", "identity", "design"] +search_terms = [ + "olif", + "urbit ids", + "sigils", + "@p names", + "fragrance rendering", + "olfactive identity", + "address space", + "scent mapping", + "urbit address", + "fragrance project", + "olfactory sigil", + "olif perfume" +] +++ My introduction to Urbit came through its identity system. In particular, [sigils](./creating-sigils) and `@p` names. Each Urbit ID is fundamentally a large number, but the system derives two practical representations from it. A `@p` is a pronounceable name generated from a phonetic base. The number is mapped to a selection from 512 predefined three-letter syllables or phonemes (256 prefixes and 256 suffixes). This produces a readable string like `~sampel-palnet` for a planet. The sigil is generated in parallel as a visual shape assembled from a fixed set of foundational glyphs. Each glyph corresponds directly to one of those syllables. The mapping is fully deterministic. The same address always produces the same `@p` and sigil. This keeps the core components simple and consistent across billions of possible IDs. diff --git a/app/content/blog/on-christopher-alexander.md b/app/content/blog/on-christopher-alexander.md index ba7da75935..659f3546c7 100644 --- a/app/content/blog/on-christopher-alexander.md +++ b/app/content/blog/on-christopher-alexander.md @@ -2,6 +2,20 @@ title = "On Christopher Alexander" date = "2021-07-19" description = "An overview of his writing and relevance" +search_terms = [ + "christopher alexander", + "pattern language", + "timeless way", + "nature of order", + "design philosophy", + "architecture theory", + "quality without name", + "living structure", + "software design", + "urbit design", + "pattern languages", + "alexander influence" +] [extra] author = "Matt" diff --git a/app/content/blog/pin-the-face-that-launches-a-thousand-ships.md b/app/content/blog/pin-the-face-that-launches-a-thousand-ships.md index c57c9bcd92..47976340e5 100644 --- a/app/content/blog/pin-the-face-that-launches-a-thousand-ships.md +++ b/app/content/blog/pin-the-face-that-launches-a-thousand-ships.md @@ -2,6 +2,18 @@ title = "Pin the Face that Launches a Thousand Ships" date = "2023-04-07" description = "A guest post by ~nospex-larsut" +search_terms = [ + "learn hoon", + "hoon hesitations", + "pin the face", + "urbit apps", + "onboarding", + "hosting providers", + "hoon school", + "urbit adoption", + "runes", + "hoon community" +] [extra] image = "https://storage.googleapis.com/media.urbit.org/blog/6a0120a85dcdae970b016766c94c14970b-800wi.jpg" author = "" diff --git a/app/content/blog/pki-maze.md b/app/content/blog/pki-maze.md index 2ef6977ea1..e087e470e8 100644 --- a/app/content/blog/pki-maze.md +++ b/app/content/blog/pki-maze.md @@ -2,6 +2,19 @@ title = "Designing a Permanent Personal Identity" date = "2019-11-26" description = "A public key infrastructure (PKI) is a system for binding a set of keys to a name. Sometimes a small amount of metadata is included." +search_terms = [ + "permanent identity", + "urbit pki", + "public key infrastructure", + "comets planets moons", + "key rotation", + "blockchain pki", + "self sovereign identity", + "urbit ids", + "idea maze", + "global consistency", + "key revocation" +] [extra] author = "Philip Monk" diff --git a/app/content/blog/platform-decay.md b/app/content/blog/platform-decay.md index f07a4232b0..47b47d2a59 100644 --- a/app/content/blog/platform-decay.md +++ b/app/content/blog/platform-decay.md @@ -2,6 +2,19 @@ title = "Platform Decay, Decentralized Marketplaces, and Urbit" date = "2020-05-07" description = "Urbit is calm computing. Calm commerce follows naturally. " +search_terms = [ + "platform decay", + "decentralized marketplaces", + "calm commerce", + "data ownership", + "urbit commerce", + "reputation systems", + "ecommerce platforms", + "marketplace protocols", + "urbit id", + "micropayments", + "privacy markets" +] [extra] author = "Nicholas Simmons" diff --git a/app/content/blog/precepts-discussion.md b/app/content/blog/precepts-discussion.md index 671d181291..be3b8661d0 100644 --- a/app/content/blog/precepts-discussion.md +++ b/app/content/blog/precepts-discussion.md @@ -2,6 +2,19 @@ title = "Precepts: Discussion" date = "2020-03-17" description = "The precepts aren’t arguments. We discuss and justify them here." +search_terms = [ + "precepts discussion", + "urbit principles", + "design rationale", + "mechanical simplicity", + "code discipline", + "system design", + "real software", + "engineering attitude", + "theory and practice", + "urbit philosophy", + "abstractions" +] [extra] author = "Philip Monk" diff --git a/app/content/blog/precepts.md b/app/content/blog/precepts.md index 5baf6f7f74..ea4ce61e2e 100644 --- a/app/content/blog/precepts.md +++ b/app/content/blog/precepts.md @@ -2,6 +2,20 @@ title = "Precepts" date = "2020-03-17" description = "Technical maxims that define Urbit's approach to engineering." +search_terms = [ + "urbit precepts", + "engineering principles", + "system design", + "technical maxims", + "data over code", + "cqrs", + "pubsub", + "determinism", + "timeless software", + "hoon principles", + "urbit architecture", + "software discipline" +] [extra] author = "Philip Monk" diff --git a/app/content/blog/providers.md b/app/content/blog/providers.md index 18d823ef1a..6ecf83dbec 100644 --- a/app/content/blog/providers.md +++ b/app/content/blog/providers.md @@ -2,6 +2,19 @@ title = "Providers" date = "2020-08-17" description = "We’ve always assumed that providers would have to come into existence sooner or later. By the look of it, that time is now. Tlon and a few others have provider-like services in the works." +search_terms = [ + "urbit providers", + "hosting providers", + "onboarding", + "planet hosting", + "urbit service", + "address space", + "provider business", + "urbit hosting", + "community access", + "provider examples", + "tlon provider" +] [extra] author = "Galen Wolfe-Pauly" diff --git a/app/content/blog/pseudonymous-reputation.md b/app/content/blog/pseudonymous-reputation.md index 0b30e4496f..78f3f4f29b 100644 --- a/app/content/blog/pseudonymous-reputation.md +++ b/app/content/blog/pseudonymous-reputation.md @@ -2,6 +2,18 @@ title = "Building Your DAO with Pseudonymous Reputation on Urbit" date = "2022-07-19" description = "Using Urbit ID’s pseudonymous reputation model, DAO participants know Urbit ID holders’ past behavior before relying on them, and without sacrificing anonymity." +search_terms = [ + "pseudonymous reputation", + "urbit id", + "dao membership", + "combine dao", + "token gated", + "trust and anonymity", + "urbit ids", + "dao governance", + "crypto identity", + "reputation" +] [extra] author = "Anthony Arroyo" diff --git a/app/content/blog/rollups.md b/app/content/blog/rollups.md index b166a0b55d..11ad967af3 100644 --- a/app/content/blog/rollups.md +++ b/app/content/blog/rollups.md @@ -2,6 +2,20 @@ title = "The Gang Solves the Gas Crisis" date = "2021-05-13" description = "How we're making Urbit ID affordable again" +search_terms = [ + "gas crisis", + "layer 2", + "naive rollups", + "urbit id fees", + "ethereum gas", + "bridge update", + "roller node", + "layer 2 planets", + "layer 1 vs 2", + "azimuth changes", + "star owners", + "rollup security" +] [extra] author = "Jonathan Paprocki" diff --git a/app/content/blog/security-and-continuity.md b/app/content/blog/security-and-continuity.md index 0ee183db60..eeb55a370b 100644 --- a/app/content/blog/security-and-continuity.md +++ b/app/content/blog/security-and-continuity.md @@ -2,6 +2,20 @@ title = "Security and Continuity" description = "An update on our primary infrastructure milestones for 2020." date = "2020-11-30" +search_terms = [ + "security continuity", + "ames audit", + "network breaches", + "continuity breach", + "version negotiation", + "data migration", + "urbit uptime", + "azimuth vote", + "galaxy vote", + "urbit security", + "protocol milestones", + "infrastructure goals" +] [extra] author = "Galen Wolfe-Pauly" diff --git a/app/content/blog/security-audit.md b/app/content/blog/security-audit.md index 46416f92e3..d8d277f7de 100644 --- a/app/content/blog/security-audit.md +++ b/app/content/blog/security-audit.md @@ -2,6 +2,20 @@ title = "Ames Security Audit and the Future of the Protocol" description = "Ames’ design has unparalleled potential to deter, mitigate, and recover from attacks, since every packet is authenticated and encrypted and backed by a stable, decentralized PKI." date = "2020-12-17" +search_terms = [ + "ames security", + "protocol audit", + "urbit security", + "forward secrecy", + "dos attacks", + "ddos mitigation", + "ames protocol", + "urbit pki", + "networking keys", + "cryptographic audit", + "social boundaries", + "security roadmap" +] [extra] author = "Ted Blackman + Anthony Arroyo" diff --git a/app/content/blog/simple-durable-yours.md b/app/content/blog/simple-durable-yours.md index fcebab81be..ddaa27adbf 100644 --- a/app/content/blog/simple-durable-yours.md +++ b/app/content/blog/simple-durable-yours.md @@ -2,6 +2,18 @@ title = "Simple, Durable, Yours" date = "2019-10-16" description = "We built Urbit from scratch to be a system that’s simple, durable, and yours. Everything that computing today is not — but should be." +search_terms = [ + "simple durable yours", + "urbit overview", + "digital home", + "personal computing", + "urbit os", + "urbit id", + "calm computing", + "durable software", + "own your data", + "decentralized system" +] extra = { } +++ diff --git a/app/content/blog/smart-home-of-the-future.md b/app/content/blog/smart-home-of-the-future.md index f256633574..22a2124550 100644 --- a/app/content/blog/smart-home-of-the-future.md +++ b/app/content/blog/smart-home-of-the-future.md @@ -2,6 +2,18 @@ title = "The Smart Home of the Future" date = "2022-08-04" description = "Homes are getting smarter. A smart home is no longer just a collection of smart devices but a superorganism of data-collecting objects. These people and devices who use and inhabit these homes form a complex socio-technical system. What is the future of the smart home and how will Urbit fit into it?" +search_terms = [ + "smart home", + "communal computing", + "iot", + "urbit identity", + "privacy", + "contextual integrity", + "home data", + "smart devices", + "gall app", + "communal computing grant" +] [extra] author = "" ship = "~pilwyc-fastec" diff --git a/app/content/blog/sovereign-intelligence.md b/app/content/blog/sovereign-intelligence.md index 72e33f5b62..4f04872264 100644 --- a/app/content/blog/sovereign-intelligence.md +++ b/app/content/blog/sovereign-intelligence.md @@ -14,6 +14,19 @@ imageIndex = "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Blog/Blog_Sove # imageCardDark = # imageIndexDark = tags = ["AI", "privacy", "sovereignty"] +search_terms = [ + "sovereign intelligence", + "personal ai", + "urbit ai", + "sidecar", + "data sovereignty", + "urbit id", + "urwasm", + "ai agents", + "bicameral mind", + "identity and memory", + "context without custody" +] +++ diff --git a/app/content/blog/stable-arvo.md b/app/content/blog/stable-arvo.md index 64376835ba..8883f98fc7 100644 --- a/app/content/blog/stable-arvo.md +++ b/app/content/blog/stable-arvo.md @@ -2,6 +2,19 @@ title = "Stable Arvo" date = "2019-11-19" description = "This year we set out to get Arvo to a point that we can credibly call ‘stable.' " +search_terms = [ + "stable arvo", + "kernel stability", + "ames rewrite", + "continuity breach", + "kelvin versioning", + "upgrade mechanics", + "urbit resilience", + "network protocol", + "error recovery", + "crud events", + "arvo upgrades" +] [extra] author = "Anthony Arroyo" diff --git a/app/content/blog/state-of-urbit.md b/app/content/blog/state-of-urbit.md index 1a20b90d67..8b5bd24625 100644 --- a/app/content/blog/state-of-urbit.md +++ b/app/content/blog/state-of-urbit.md @@ -2,6 +2,20 @@ title = "State of Urbit" date = "2021-08-24" description = "A year in review" +search_terms = [ + "state of urbit", + "urbit year review", + "landscape app", + "os1 landscape", + "urbit hosting", + "urbit onboarding", + "urbit id fees", + "naive rollups", + "grid interface", + "software distribution", + "assembly 2021", + "urbit roadmap" +] [extra] author = "Galen Wolfe-Pauly" ship = "~ravmel-ropdyl" diff --git a/app/content/blog/subassembly-hackathon-2024.md b/app/content/blog/subassembly-hackathon-2024.md index e8c1e3fa6f..0a7b008f49 100644 --- a/app/content/blog/subassembly-hackathon-2024.md +++ b/app/content/blog/subassembly-hackathon-2024.md @@ -2,6 +2,18 @@ title = "Subssembly Hackathon 2024" date = "2024-09-16" description = "Use Login with Urbit ID in your app and win Urbit Stars" +search_terms = [ + "subassembly hackathon", + "login with urbit id", + "urbit stars", + "hackathon 2024", + "azimake", + "create react azimuth app", + "identity authentication", + "urbit id login", + "subassembly event", + "azimuth app" +] [extra] ship = "~sarlev-sarsen" diff --git a/app/content/blog/the-100-year-computer.md b/app/content/blog/the-100-year-computer.md index f4de15ff6a..e736ebee4e 100644 --- a/app/content/blog/the-100-year-computer.md +++ b/app/content/blog/the-100-year-computer.md @@ -6,6 +6,18 @@ aliases = [ "/posts/essays/the-100-year-computer/", "/posts/the-100-year-computer" ] +search_terms = [ + "100 year computer", + "durable computing", + "personal server", + "permanent data", + "urbit overview", + "long term computing", + "reliable computer", + "continuous updates", + "future proof", + "urbit vision" +] [extra] author = "Galen Wolfe-Pauly" diff --git a/app/content/blog/the-dao-as-a-lesson-in-decentralized-governance.md b/app/content/blog/the-dao-as-a-lesson-in-decentralized-governance.md index 7705efcb2f..0dfa5d4489 100644 --- a/app/content/blog/the-dao-as-a-lesson-in-decentralized-governance.md +++ b/app/content/blog/the-dao-as-a-lesson-in-decentralized-governance.md @@ -2,6 +2,18 @@ title = "The DAO as a Lesson in Decentralized Governance" date = "2016-06-23" description = "What's the right lesson for the decentralization community to learn from the collapse of the DAO?" +search_terms = [ + "dao collapse", + "decentralized governance", + "blockchain governance", + "decentralization theater", + "ethereum fork", + "code is law", + "sovereignty conserved", + "dao rollback", + "governance institutions", + "urbit governance" +] aliases = [ "/posts/essays/the-dao-as-a-lesson-in-decentralized-governance", "/posts/the-dao-as-a-lesson-in-decentralized-governance", diff --git a/app/content/blog/the-missing-middle.md b/app/content/blog/the-missing-middle.md index 785b75ff5b..d820476f63 100644 --- a/app/content/blog/the-missing-middle.md +++ b/app/content/blog/the-missing-middle.md @@ -2,6 +2,19 @@ title = "The Missing Middle" date = "2020-05-25" description = "Urbit stars can facilitate a flexible continuum of community norms." +search_terms = [ + "missing middle", + "urbit stars", + "community norms", + "network governance", + "star providers", + "decentralized communities", + "urbit infrastructure", + "routing hubs", + "social technology", + "community governance", + "digital commons" +] [extra] author = "Nicholas Simmons" diff --git a/app/content/blog/the-shape-of-dao-governance-to-come.md b/app/content/blog/the-shape-of-dao-governance-to-come.md index e36c5486e8..cc7736d1b7 100644 --- a/app/content/blog/the-shape-of-dao-governance-to-come.md +++ b/app/content/blog/the-shape-of-dao-governance-to-come.md @@ -2,6 +2,18 @@ title = "The Shape of DAO Governance to Come" date = "2022-08-17" description = "When building the Combine DAO, we conducted a survey of DAO governance and tooling and came to the conclusion that the many theoretical approaches to the problem of governance were tied to the implementation details of the DAO stack. Since we were building everything on Urbit—as opposed to through the typical combination of Solidity contracts, Web2 tools and Snapshot—we realized that we’d have to do some rethinking. A new approach for a new stack." +search_terms = [ + "dao governance", + "combine dao", + "ballot app", + "custom actions", + "pseudonymous reputation", + "governance attacks", + "moloch dao", + "snapshot voting", + "urbit dao tools", + "ragequit" +] [extra] author = "Anthony Arroyo" diff --git a/app/content/blog/the-state-of-landscape.md b/app/content/blog/the-state-of-landscape.md index 2925bef974..7ec2af4491 100644 --- a/app/content/blog/the-state-of-landscape.md +++ b/app/content/blog/the-state-of-landscape.md @@ -6,6 +6,18 @@ aliases = [ "/posts/essays/the-state-of-landscape", "/posts/the-state-of-landscape" ] +search_terms = [ + "state of landscape", + "landscape update", + "chat interface", + "urbit ui", + "arvo network", + "landscape bugs", + "ios app", + "community chats", + "urbit help", + "modulo roadmap" +] [extra] author = "Galen Wolfe-Pauly" diff --git a/app/content/blog/the-understanding-urbit-podcast.md b/app/content/blog/the-understanding-urbit-podcast.md index f28ebf1945..8e4e3d677d 100644 --- a/app/content/blog/the-understanding-urbit-podcast.md +++ b/app/content/blog/the-understanding-urbit-podcast.md @@ -2,6 +2,18 @@ title = "The Understanding Urbit Podcast" date = "2020-04-02" description = "An interview-based podcast series about the Urbit project, as told by those working on it." +search_terms = [ + "understanding urbit podcast", + "urbit podcast", + "interviews", + "tlon team", + "urbit philosophy", + "nock performance", + "technology talks", + "podcast series", + "urbit interviews", + "streaming platforms" +] [extra] author = "Arthur Falls" diff --git a/app/content/blog/the-urbit-address-space.md b/app/content/blog/the-urbit-address-space.md index 187e6b86c1..dabd2910c6 100644 --- a/app/content/blog/the-urbit-address-space.md +++ b/app/content/blog/the-urbit-address-space.md @@ -2,6 +2,18 @@ title = "The Urbit Address Space" date = "2016-05-15" description = "An overview of Urbit's cryptographic address space." +search_terms = [ + "urbit address space", + "urbit ships", + "galaxies stars planets", + "urbit identity", + "urbit pki", + "ship hierarchy", + "urbit governance", + "digital land", + "ship scarcity", + "urbit naming" +] aliases = [ "/posts/essays/the-urbit-address-space", "/posts/the-urbit-address-space" diff --git a/app/content/blog/tools-of-our-own.md b/app/content/blog/tools-of-our-own.md index f7f430014f..5289896666 100644 --- a/app/content/blog/tools-of-our-own.md +++ b/app/content/blog/tools-of-our-own.md @@ -2,6 +2,19 @@ title = "Tools of Our Own" date = "2020-05-12" description = "What is a digital environment? What does it mean to shape your own digital environment?" +search_terms = [ + "tools of our own", + "digital environment", + "conversational tools", + "urbit philosophy", + "social graph", + "collective tools", + "convivial tools", + "personal computing", + "system control", + "urbit communities", + "digital autonomy" +] [extra] author = "Matilde Park" diff --git a/app/content/blog/toward-a-frozen-operating-system.md b/app/content/blog/toward-a-frozen-operating-system.md index 928666c233..1f0eead833 100644 --- a/app/content/blog/toward-a-frozen-operating-system.md +++ b/app/content/blog/toward-a-frozen-operating-system.md @@ -2,6 +2,18 @@ title = "Toward a Frozen Operating System" date = "2017-05-09" description = "Is it possible to freeze an entire OS?" +search_terms = [ + "frozen operating system", + "kelvin versioning", + "urbit os design", + "freezable os", + "nock hoon arvo", + "telescoping kelvins", + "palm tree model", + "system stability", + "urbit platform", + "infinite maturity" +] aliases = [ "/posts/essays/toward-a-frozen-operating-system", "/posts/toward-a-frozen-operating-system", diff --git a/app/content/blog/toward-a-new-clay.md b/app/content/blog/toward-a-new-clay.md index c9086ab265..087800fdca 100644 --- a/app/content/blog/toward-a-new-clay.md +++ b/app/content/blog/toward-a-new-clay.md @@ -2,6 +2,18 @@ title = "Toward a New %clay" date = "2016-07-13" description = "Urbit's revision-control system, %clay, is itself due for a (medium-sized) revision!" +search_terms = [ + "clay revision control", + "urbit filesystem", + "%clay redesign", + "urbit dvcs", + "desk mounting", + "urbit namespace", + "mark system", + "clay storage", + "urbit version control", + "clay community" +] aliases = [ "/posts/essays/toward-a-new-clay", "/posts/toward-a-new-clay", diff --git a/app/content/blog/urbit-and-bitcoin.md b/app/content/blog/urbit-and-bitcoin.md index c7252c9b3f..c94a7613d1 100644 --- a/app/content/blog/urbit-and-bitcoin.md +++ b/app/content/blog/urbit-and-bitcoin.md @@ -3,6 +3,18 @@ title = "Urbit and Bitcoin" description = "A sound money deserves a sound computer." date = "2019-10-16" tags = ["bitcoin"] +search_terms = [ + "urbit and bitcoin", + "sound money", + "bitcoin integration", + "urbit wallet", + "bitcoin grants", + "urbit os", + "peer to peer", + "sound computer", + "btc bounties", + "crypto payments" +] [extra] author = "Christian Langalis" ship = "~pindet-timmut" diff --git a/app/content/blog/urbit-and-the-blockchain.md b/app/content/blog/urbit-and-the-blockchain.md index 86efb1055c..91b3cd99d8 100644 --- a/app/content/blog/urbit-and-the-blockchain.md +++ b/app/content/blog/urbit-and-the-blockchain.md @@ -2,6 +2,18 @@ title = "Urbit and the Blockchain Wars" date = "2017-09-24" description = "A bit about the 'idea maze' of choosing to bootstrap from Ethereum." +search_terms = [ + "urbit blockchain", + "ethereum bootstrap", + "urbit pki", + "blockchain wars", + "urbit land registry", + "on chain governance", + "ethereum critique", + "consensus engine", + "urbit on ethereum", + "chain migration" +] aliases = [ "/posts/essays/urbit-and-the-blockchain", "/posts/urbit-and-the-blockchain", diff --git a/app/content/blog/urbit-creator-daos.md b/app/content/blog/urbit-creator-daos.md index 0f594492cc..cae9ad5601 100644 --- a/app/content/blog/urbit-creator-daos.md +++ b/app/content/blog/urbit-creator-daos.md @@ -2,6 +2,18 @@ title = "Urbit + Creator DAOs with Justin Murphy" date = "2022-10-05" description = "Creator DAOs are blank slates, new foundational cryptographic patterns just beginning to take shape. Justin Murphy thinks Urbit is the most obvious place to start building one." +search_terms = [ + "creator dao", + "justin murphy", + "other life", + "urbit groups", + "straw app", + "ballot", + "creator economy", + "dao governance", + "p2p community", + "urbit id" +] [extra] author = "Isaac Simpson" diff --git a/app/content/blog/urbit-for-creators.md b/app/content/blog/urbit-for-creators.md index 350cd63b29..b8935e7114 100644 --- a/app/content/blog/urbit-for-creators.md +++ b/app/content/blog/urbit-for-creators.md @@ -2,6 +2,18 @@ title = "Urbit Is for Creators" date = "2021-12-09" description = "Urbit is for creators who are ready to wake up from this bad dream." +search_terms = [ + "urbit for creators", + "creator economy", + "p2p creators", + "content ownership", + "1000 true fans", + "creator community", + "peer to peer payments", + "no middlemen", + "urbit creators", + "digital sovereignty" +] [extra] author = "Noah Kumin" ship = "~librex-dozryc" diff --git a/app/content/blog/urbit-for-normies.md b/app/content/blog/urbit-for-normies.md index 1c6ffe2d99..10ae9b165a 100644 --- a/app/content/blog/urbit-for-normies.md +++ b/app/content/blog/urbit-for-normies.md @@ -2,6 +2,19 @@ title = "Urbit for Normies" date = "2020-02-11" description = "A layperson’s guide to the coming new internet." +search_terms = [ + "urbit for normies", + "layperson guide", + "new internet", + "peer to peer", + "privacy", + "personal server", + "urbit ids", + "calm computing", + "digital autonomy", + "urbit overview", + "decentralized web" +] [extra] author = "Erik Newton" diff --git a/app/content/blog/urbit-grants-and-mid-2019-gifts.md b/app/content/blog/urbit-grants-and-mid-2019-gifts.md index 976fe6cc71..d5b93ab1e0 100644 --- a/app/content/blog/urbit-grants-and-mid-2019-gifts.md +++ b/app/content/blog/urbit-grants-and-mid-2019-gifts.md @@ -6,6 +6,17 @@ aliases = [ "/posts/essays/urbit-grants-and-mid-2019-gifts", "/posts/urbit-grants-and-mid-2019-gifts" ] +search_terms = [ + "urbit grants", + "mid 2019 gifts", + "star gifts", + "developer rewards", + "grants program", + "azimuth stars", + "community contributors", + "gift program", + "urbit awards" +] [taxonomies] grant_type = [ "Gift" ] diff --git a/app/content/blog/urbit-is-for-communities.md b/app/content/blog/urbit-is-for-communities.md index 7d10f45104..87a96be784 100644 --- a/app/content/blog/urbit-is-for-communities.md +++ b/app/content/blog/urbit-is-for-communities.md @@ -2,6 +2,19 @@ title = "Urbit is for Communities" date = "2020-03-22" description = "Urbit is for giving communities the tools to shape their own environments; for us all to feel a sense of life and self-directedness in the digital world." +search_terms = [ + "urbit for communities", + "community tools", + "digital homesteading", + "os1", + "high trust", + "digital environment", + "self hosting", + "community software", + "urbit philosophy", + "community modules", + "digital commons" +] [extra] author = "Galen Wolfe-Pauly" diff --git a/app/content/blog/urbithost-interview.md b/app/content/blog/urbithost-interview.md index 8c3bf23773..d9fea8aad8 100644 --- a/app/content/blog/urbithost-interview.md +++ b/app/content/blog/urbithost-interview.md @@ -2,6 +2,20 @@ title = "An Interview with UrbitHost" date = "2021-08-19" description = "Interview with the founder of UrbitHost ~lavlyn-litmeg" +search_terms = [ + "urbithost", + "hosting provider", + "urbit hosting", + "landscape access", + "kubernetes", + "automated hosting", + "layer 2", + "khan vane", + "software distribution", + "hosted urbit", + "onboarding", + "commercial providers" +] [extra] author = "Matt" ship = "~tirwyd-sarmes" diff --git a/app/content/blog/using-urbit-in-2023.md b/app/content/blog/using-urbit-in-2023.md index 3f5a50bc04..b10b1d5640 100644 --- a/app/content/blog/using-urbit-in-2023.md +++ b/app/content/blog/using-urbit-in-2023.md @@ -2,6 +2,18 @@ title = "Using Urbit in 2023" date = "2023-02-06" description = "There are more ways to run Urbit than ever, and more options coming soon." +search_terms = [ + "using urbit 2023", + "hosting providers", + "command line", + "cloud hosting", + "port app", + "windows binary", + "native planet", + "tlon hosting", + "run urbit", + "vps" +] [extra] image = "https://storage.googleapis.com/media.urbit.org/blog/usingurbit-2023.jpg" author = "Josh Lehman" diff --git a/app/content/blog/value-of-address-space-pt1.md b/app/content/blog/value-of-address-space-pt1.md index 011d0d9165..23da085fb1 100644 --- a/app/content/blog/value-of-address-space-pt1.md +++ b/app/content/blog/value-of-address-space-pt1.md @@ -2,6 +2,19 @@ title = "The Value of Urbit Address Space (1 of 3)" date = "2020-04-06" description = "An expansion of our position on Urbit's address space value." +search_terms = [ + "address space value", + "urbit ids", + "azimuth", + "digital asset", + "scarce ids", + "network structure", + "galaxies stars planets", + "address space history", + "urbit land", + "identity system", + "decentralized web" +] [extra] author = "Erik Newton + Galen Wolfe-Pauly" diff --git a/app/content/blog/value-of-address-space-pt2.md b/app/content/blog/value-of-address-space-pt2.md index 1550b5582f..3f90eb8c2b 100644 --- a/app/content/blog/value-of-address-space-pt2.md +++ b/app/content/blog/value-of-address-space-pt2.md @@ -2,6 +2,20 @@ title = "The Value of Urbit Address Space (2 of 3)" date = "2020-04-12" description = "Scarcity, utility, liquidity, and network effect." +search_terms = [ + "address space value", + "scarcity", + "utility", + "liquidity", + "network effect", + "urbit ids", + "planet prices", + "star prices", + "address space trading", + "urbit scarcity", + "network laws", + "urbit tokens" +] [extra] author = "Erik Newton + Galen Wolfe-Pauly" diff --git a/app/content/blog/value-of-address-space-pt3.md b/app/content/blog/value-of-address-space-pt3.md index 68fd1ed99a..320c877751 100644 --- a/app/content/blog/value-of-address-space-pt3.md +++ b/app/content/blog/value-of-address-space-pt3.md @@ -2,6 +2,19 @@ title = "The Value of Urbit Address Space (3 of 3)" date = "2020-07-09" description = "" +search_terms = [ + "address space value", + "urbit ids", + "lockups", + "spawning limits", + "galaxy distribution", + "star unlocks", + "network effects", + "urbit scarcity", + "usage metrics", + "network explorer", + "address space trade" +] [extra] author = "Erik Newton + Galen Wolfe-Pauly" diff --git a/app/content/blog/what-is-urbit-for.md b/app/content/blog/what-is-urbit-for.md index 15be9dad10..562c183e15 100644 --- a/app/content/blog/what-is-urbit-for.md +++ b/app/content/blog/what-is-urbit-for.md @@ -2,6 +2,18 @@ title = "What is Urbit For?" date = "2016-05-10" description = "A vision of the Urbit-powered future." +search_terms = [ + "what is urbit for", + "urbit future", + "personal server vision", + "cryptographic identity", + "self hosted publishing", + "web programmable", + "blockchain complement", + "data permanence", + "reputation systems", + "urbit iot" +] aliases = [ "/posts/essays/what-is-urbit-for", "/posts/what-is-urbit-for" diff --git a/app/content/blog/why-hoon.md b/app/content/blog/why-hoon.md index e58376c068..c31bf943db 100644 --- a/app/content/blog/why-hoon.md +++ b/app/content/blog/why-hoon.md @@ -2,6 +2,19 @@ title = "Why Hoon?" date = "2019-11-13" description = "The promise of Urbit lies in its reimagination of the digital world using components that are as constrained and limited as possible." +search_terms = [ + "why hoon", + "hoon language", + "nock vm", + "functional os", + "hot code reload", + "metaprogramming", + "urbit stack", + "axiomatic", + "purely functional", + "urbit compiler", + "minimalism" +] [extra] author = "Ted Blackman" diff --git a/app/content/blog/why-urbit-probably-does-not-need-a-blockchain.md b/app/content/blog/why-urbit-probably-does-not-need-a-blockchain.md index 19009cb08f..5f86f25ac7 100644 --- a/app/content/blog/why-urbit-probably-does-not-need-a-blockchain.md +++ b/app/content/blog/why-urbit-probably-does-not-need-a-blockchain.md @@ -2,6 +2,18 @@ title = "Why Urbit Probably Doesn't Need a Blockchain" date = "2016-07-13" description = "Urbit (probably) doesn't need a blockchain, because the Urbit address-space PKI is a special case of a consensus ledger." +search_terms = [ + "urbit blockchain", + "urbit pki", + "address space ledger", + "worse is better", + "double sell problem", + "urbit consensus", + "urbit governance", + "ships and wills", + "gossip propagation", + "urbit without blockchain" +] aliases = [ "/posts/essays/why-urbit-probably-does-not-need-a-blockchain/", "/posts/why-urbit-probably-does-not-need-a-blockchain/", diff --git a/app/content/blog/your-last-computer.md b/app/content/blog/your-last-computer.md index 518976645e..da9b0490f1 100644 --- a/app/content/blog/your-last-computer.md +++ b/app/content/blog/your-last-computer.md @@ -2,6 +2,18 @@ title = "Your Last Computer" date = "2019-10-16" description = "Your Urbit is a simpler computer, a quieter computer, a more private computer. We want it to feel predictable, safe, and reliable — things only a complete, sealed system can do. This, we hope, can get us a world where technology keeps us connected, but doesn’t dominate our lives." +search_terms = [ + "your last computer", + "urbit os", + "digital life", + "social computing", + "sealed system", + "private computer", + "urbit communities", + "personal server", + "calm computing", + "future computing" +] [extra] image = "https://media.urbit.org/site/understanding-urbit/your-last-computer/your-last-computer-waves%402x.png" diff --git a/app/content/blurbs/add-and-remove-applications.md b/app/content/blurbs/add-and-remove-applications.md index 5e19c43b8d..8ec43f7ad7 100644 --- a/app/content/blurbs/add-and-remove-applications.md +++ b/app/content/blurbs/add-and-remove-applications.md @@ -2,6 +2,18 @@ title = "Add and remove applications" description = "3rd-party software distribution enables any urbit node to distribute software to the network, these commands help you manage your installed apps." tags = ["dojo"] +search_terms = [ + "install apps", + "uninstall apps", + "nuke app data", + "urbit applications", + "dojo commands", + "app distribution", + "landscape get apps", + "desk management", + "remove app state", + "app recovery" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/azimuth-based-urbit-ids.md b/app/content/blurbs/azimuth-based-urbit-ids.md index 446aa69740..3d9d194a7f 100644 --- a/app/content/blurbs/azimuth-based-urbit-ids.md +++ b/app/content/blurbs/azimuth-based-urbit-ids.md @@ -2,6 +2,19 @@ title = "Azimuth-based Urbit IDs" description = "Azimuth identities are cryptographically owned Urbit address space on the Ethereum blockchain" tags = ["ethereum", "layer 1", "layer 2", "urbit id", "nft"] +search_terms = [ + "azimuth ids", + "urbit id nft", + "ethereum address space", + "bridge login", + "buy urbit id", + "galaxy star planet", + "layer 2 rollup", + "ecliptic contracts", + "ownership ledger", + "web3 wallet", + "network explorer" +] lastest-update ="" image = "" imageDark = "" diff --git a/app/content/blurbs/build-out-your-urbit.md b/app/content/blurbs/build-out-your-urbit.md index 719308f62b..b7991422d2 100644 --- a/app/content/blurbs/build-out-your-urbit.md +++ b/app/content/blurbs/build-out-your-urbit.md @@ -2,6 +2,19 @@ title = "Running your Urbit" description = "" tags = ["configuration", "apps", "urbit-os"] +search_terms = [ + "run urbit", + "urbit os", + "urbit configuration", + "urbit apps", + "urbit id options", + "layer 1 azimuth", + "layer 2 azimuth", + "self hosting", + "private messaging", + "distributed systems", + "bitcoin compatible" +] lastest-update = "" image = "/images/urbit-dither-placeholder.png" imageDark = "" diff --git a/app/content/blurbs/buy-an-urbit-id.md b/app/content/blurbs/buy-an-urbit-id.md index b9480e6438..87ade928ee 100644 --- a/app/content/blurbs/buy-an-urbit-id.md +++ b/app/content/blurbs/buy-an-urbit-id.md @@ -2,6 +2,20 @@ title = "Buy an Urbit ID" description = "Learn how to acquire your own self-sovereign digital identity" tags = ["urbit-id"] +search_terms = [ + "buy urbit id", + "urbit planet", + "azimuth identity", + "layer 1 nft", + "layer 2 rollup", + "opensea marketplace", + "subject network", + "pocwet store", + "bitcoin planet", + "credit card planet", + "galaxy star ids", + "self sovereign identity" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/check-and-reduce-memory-usage.md b/app/content/blurbs/check-and-reduce-memory-usage.md index 45ff1bbf36..3e96172830 100644 --- a/app/content/blurbs/check-and-reduce-memory-usage.md +++ b/app/content/blurbs/check-and-reduce-memory-usage.md @@ -2,6 +2,18 @@ title = "Check and reduce memory usage" description = "Monitor and optimize your urbit's memory consumption" tags = ["dojo", "runtime"] +search_terms = [ + "memory usage", + "loom size", + "mass report", + "meld command", + "pack command", + "urbit runtime", + "dojo tools", + "deduplicate memory", + "pier storage", + "resource constraints" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/check-application-status.md b/app/content/blurbs/check-application-status.md index b51895dad7..f4556101c4 100644 --- a/app/content/blurbs/check-application-status.md +++ b/app/content/blurbs/check-application-status.md @@ -2,6 +2,18 @@ title = "Check application info and status" description = "Running `+vats` will output the state of your apps and related metadata that can help with troubleshooting" tags = ["dojo"] +search_terms = [ + "vats command", + "app status", + "desk metadata", + "urbit apps", + "cz hash", + "publishing ship", + "pending updates", + "dojo tools", + "troubleshoot apps", + "app version" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/check-your-sponsor.md b/app/content/blurbs/check-your-sponsor.md index 8f96fc9400..382283ce15 100644 --- a/app/content/blurbs/check-your-sponsor.md +++ b/app/content/blurbs/check-your-sponsor.md @@ -2,6 +2,17 @@ title = "Check your current sponsor" description = "Understanding your networking sponsor can help with troubleshooting connectivity issues" tags = ["dojo"] +search_terms = [ + "sponsor command", + "network sponsor", + "sponsor chain", + "urbit connectivity", + "dojo sponsor", + "bridge sponsor", + "network explorer", + "onchain sponsor", + "urbit sponsor" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/checking-and-fixing-azimuth-state.md b/app/content/blurbs/checking-and-fixing-azimuth-state.md index edd54d7ba3..c7b98bd267 100644 --- a/app/content/blurbs/checking-and-fixing-azimuth-state.md +++ b/app/content/blurbs/checking-and-fixing-azimuth-state.md @@ -2,6 +2,18 @@ title = "Checking and fixing Azimuth state" description = "Monitor and repair your PKI state synchronization" tags = ["dojo", "azimuth"] +search_terms = [ + "azimuth state", + "pki sync", + "azimuth block", + "ethereum block", + "azimuth load", + "pki snapshot", + "dojo azimuth", + "state sync", + "azimuth snapshot", + "bridge azimuth" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/common-pitfalls-of-running-urbit.md b/app/content/blurbs/common-pitfalls-of-running-urbit.md index 04261d28ca..863ef2f812 100644 --- a/app/content/blurbs/common-pitfalls-of-running-urbit.md +++ b/app/content/blurbs/common-pitfalls-of-running-urbit.md @@ -2,6 +2,17 @@ title = "Common Pitfalls Of Running Urbit" description = "Placeholder description" tags = [] +search_terms = [ + "urbit pitfalls", + "running urbit issues", + "common mistakes", + "urbit troubleshooting", + "ship errors", + "self hosting problems", + "urbit setup", + "beginner mistakes", + "pier issues" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/create-a-moon-identity.md b/app/content/blurbs/create-a-moon-identity.md index c1160178ac..8115eeba1f 100644 --- a/app/content/blurbs/create-a-moon-identity.md +++ b/app/content/blurbs/create-a-moon-identity.md @@ -2,6 +2,18 @@ title = "Create a moon identity" description = "Spawn subordinate identities tied to your planet" tags = ["dojo", "urbit-id"] +search_terms = [ + "moon identity", + "spawn moon", + "urbit moon", + "moon keyfile", + "moon breach", + "moon cycle keys", + "azimuth moon", + "dojo moon", + "sub identity", + "moon reset" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/directly-contact-another-urbit.md b/app/content/blurbs/directly-contact-another-urbit.md index 036550c1f7..1ec590aa04 100644 --- a/app/content/blurbs/directly-contact-another-urbit.md +++ b/app/content/blurbs/directly-contact-another-urbit.md @@ -2,6 +2,17 @@ title = "Directly contact another urbit" description = "Urbit's most basic messaging protocol can send a quick hi in the dojo" tags = ["dojo"] +search_terms = [ + "hi command", + "dojo hi", + "ping ship", + "direct message", + "urbit p2p", + "neighbor message", + "connect to ship", + "urbit messaging", + "quick hi" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/docking-your-urbit.md b/app/content/blurbs/docking-your-urbit.md index c20f7dbe40..9be67ce121 100644 --- a/app/content/blurbs/docking-your-urbit.md +++ b/app/content/blurbs/docking-your-urbit.md @@ -2,6 +2,17 @@ title = "Docking your urbit" description = "Install a specific runtime version into your pier" tags = ["runtime"] +search_terms = [ + "dock command", + "urbit dock", + "runtime version", + "vere binary", + "pier runtime", + "version pinning", + "docked pier", + "run urbit", + "runtime install" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/docs-for-self-hosting-urbit.md b/app/content/blurbs/docs-for-self-hosting-urbit.md index 3203b28f44..d51d86587d 100644 --- a/app/content/blurbs/docs-for-self-hosting-urbit.md +++ b/app/content/blurbs/docs-for-self-hosting-urbit.md @@ -2,6 +2,18 @@ title = "Documentation for self-hosting urbit" description = "The top guides for learning how to run your own urbit node" tags = [] +search_terms = [ + "self hosting guide", + "run urbit node", + "cloud hosting", + "groundseg guide", + "local setup", + "urbit os", + "hosting docs", + "comet identity", + "native planet", + "cloud server" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/get-access-code.md b/app/content/blurbs/get-access-code.md index e5cd772544..95f58ff70c 100644 --- a/app/content/blurbs/get-access-code.md +++ b/app/content/blurbs/get-access-code.md @@ -2,6 +2,17 @@ title = "Get access code" description = "A secret code for remote access to your instance of Urbit OS" tags = ["dojo"] +search_terms = [ + "access code", + "+code", + "luscode", + "urbit login", + "remote access", + "mobile client", + "web login", + "phenome code", + "urbit secret" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/get-started-with-cloud-server.md b/app/content/blurbs/get-started-with-cloud-server.md index a58a541ac9..a2e11a4b14 100644 --- a/app/content/blurbs/get-started-with-cloud-server.md +++ b/app/content/blurbs/get-started-with-cloud-server.md @@ -2,6 +2,18 @@ title = "Cloud Server" description = "Running in a virtual private server (VPS) affords easy solutions to things like DNS and remote access, at a marginal cost to tangible control of your data" tags = ["vps", "cloud", "self-hosting"] +search_terms = [ + "cloud server", + "vps hosting", + "self host urbit", + "remote access", + "personal server", + "datacenter hosting", + "dns setup", + "cloud hosting guide", + "virtual private server", + "urbit hosting" +] lastest-update = "" image = "/images/cloud-hosting-sigil-dither.png" imageDark = "" diff --git a/app/content/blurbs/get-started-with-command-line.md b/app/content/blurbs/get-started-with-command-line.md index cc32cb7cfa..ee7d7efdc9 100644 --- a/app/content/blurbs/get-started-with-command-line.md +++ b/app/content/blurbs/get-started-with-command-line.md @@ -2,6 +2,18 @@ title = "Command Line" description = "Every Urbit OS server is made unique by its Urbit ID, which others can use to reach you on the network. There are five ranks of Urbit ID, but the one an ordinary user needs is a planet, which has a four-syllable name like \"~sampel-palnet\". Unless you know someone who can gift you one, or you want to get one from hosting provider like Tlon, you'll need to buy one." tags = ["cli", "self-hosting", "command-line"] +search_terms = [ + "command line", + "cli setup", + "run urbit", + "self host", + "terminal boot", + "get urbit id", + "comet identity", + "unix terminal", + "urbit cli", + "boot a ship" +] lastest-update = "" image = "/images/uf-board-sigils-dither.png" imageDark = "" diff --git a/app/content/blurbs/get-started-with-native-planet.md b/app/content/blurbs/get-started-with-native-planet.md index 06f6b9ca85..3fbfa66e28 100644 --- a/app/content/blurbs/get-started-with-native-planet.md +++ b/app/content/blurbs/get-started-with-native-planet.md @@ -2,6 +2,18 @@ title = "Native Planet" description = "Native Planet builds hardware and software for simplified home hosting of your Urbit" tags = ["native-planet", "self-hosting", "hardware"] +search_terms = [ + "native planet", + "urbit hardware", + "groundseg", + "startram", + "home hosting", + "local control", + "device hosting", + "urbit appliance", + "preloaded urbit", + "hardware hosting" +] lastest-update = "" image = "/images/native-planet-callisto-dither.png" imageDark = "" diff --git a/app/content/blurbs/get-started-with-tlon-hosting.md b/app/content/blurbs/get-started-with-tlon-hosting.md index 224a76976f..241dae185e 100644 --- a/app/content/blurbs/get-started-with-tlon-hosting.md +++ b/app/content/blurbs/get-started-with-tlon-hosting.md @@ -2,6 +2,18 @@ title = "Tlon Hosting" description = "Tlon Corporation is the preeminent hosting provider which provides free and seamless onboarding to the Urbit network" tags = ["hosting", "hosting-provider", "urbit-os", "tlon", "layer 2"] +search_terms = [ + "tlon hosting", + "tlon messenger", + "hosted urbit", + "quickstart", + "onboarding", + "layer 2", + "hosting provider", + "phone number signup", + "email signup", + "managed hosting" +] lastest-update ="" image = "/images/tlon-corp-dither.png" imageDark = "" diff --git a/app/content/blurbs/getting-started-with-urbit.md b/app/content/blurbs/getting-started-with-urbit.md index 15f9881c6e..80b7c3a783 100644 --- a/app/content/blurbs/getting-started-with-urbit.md +++ b/app/content/blurbs/getting-started-with-urbit.md @@ -2,6 +2,18 @@ title = "Get Started with Urbit" description = "Ready to join the Urbit network? Get your own Urbit ID and start exploring a new way to compute." tags = ["getting-started", "homepage", "sidebar"] +search_terms = [ + "get started", + "urbit id", + "urbit os", + "join urbit", + "quickstart", + "self sovereign", + "start exploring", + "urbit network", + "buy urbit id", + "learn urbit" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/groundwire-based-urbit-ids.md b/app/content/blurbs/groundwire-based-urbit-ids.md index 66ad2d30e2..cf31803803 100644 --- a/app/content/blurbs/groundwire-based-urbit-ids.md +++ b/app/content/blurbs/groundwire-based-urbit-ids.md @@ -2,6 +2,18 @@ title = "Groundwire-based Urbit IDs" description = "Groundwire identities are cryptographically owned Urbit address space on the Bitcoin blockchain" tags = ["bitcoin", "urbit-id", "ordinal", "comet"] +search_terms = [ + "groundwire ids", + "bitcoin urbit", + "ordinal nft", + "inscription nft", + "comet identity", + "bitcoin address space", + "groundwire network", + "l1 bitcoin fees", + "self issued ids", + "groundwire messenger" +] lastest-update ="" image = "" imageDark = "" diff --git a/app/content/blurbs/homepage-go-deeper.md b/app/content/blurbs/homepage-go-deeper.md index efe3552de6..85a777ba8f 100644 --- a/app/content/blurbs/homepage-go-deeper.md +++ b/app/content/blurbs/homepage-go-deeper.md @@ -2,6 +2,17 @@ title = "Go Deeper" description = "Ready to explore more? Learn about Urbit's architecture, identity system, and the broader ecosystem of applications and tools being built on the network." tags = ["learning", "documentation", "homepage"] +search_terms = [ + "urbit architecture", + "identity system", + "urbit docs", + "urbit overview", + "ecosystem apps", + "learn urbit", + "technical documentation", + "urbit community", + "personal computing" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/homepage-hosting-providers.md b/app/content/blurbs/homepage-hosting-providers.md index 7e05e1c572..903ff58cbb 100644 --- a/app/content/blurbs/homepage-hosting-providers.md +++ b/app/content/blurbs/homepage-hosting-providers.md @@ -2,6 +2,17 @@ title = "Hosting Providers" description = "While urbit is designed to be run by it's users, and so simple that caring for it would be as simple as caring for a cactus, it's not quite there yet. And some people aren't inclined to want to take on the burden of learning how to run their own urbit. If this sound like you, don't worry. Third party hosting providers can run your urbit on your behalf, while still maintaining many of the ownership characteristics that make urbit yours (in stark contrast to legacy cloud software." tags = ["hosting", "hosting-provider", "homepage"] +search_terms = [ + "hosting providers", + "third party hosting", + "managed hosting", + "hosted urbit", + "run urbit for you", + "cloud provider", + "urbit ownership", + "self hosting alternative", + "personal server hosting" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/homepage-self-hosting.md b/app/content/blurbs/homepage-self-hosting.md index 2fbc43c326..0d12819d68 100644 --- a/app/content/blurbs/homepage-self-hosting.md +++ b/app/content/blurbs/homepage-self-hosting.md @@ -2,6 +2,17 @@ title = "Self-Hosting" description = "Urbit is an attempt to build a computer that is truly yours, designed to last a lifetime, with which you can form trustworthy networks free of extractive middlemen. Part of that means a being a networked computer that can be run by it's users. That said, Urbit is still under active development, so self-hosting is currently most apt for users who aren't afraid of a little bit of tinkering. If that's not you, we recommend using a hosting provider instead." tags = ["self-hosting", "homepage"] +search_terms = [ + "self hosting", + "run urbit yourself", + "personal server", + "boot urbit", + "maintain urbit", + "tinkering", + "full control", + "urbit experience", + "caring for cactus" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/learn-to-hoon.md b/app/content/blurbs/learn-to-hoon.md index 8fd615e407..5a304fafbd 100644 --- a/app/content/blurbs/learn-to-hoon.md +++ b/app/content/blurbs/learn-to-hoon.md @@ -2,6 +2,18 @@ title = "Learn To Hoon" description = "Hoon is Urbit's high-level, statically-typed, purely-functional programming language" tags = [] +search_terms = [ + "learn hoon", + "hoon school", + "urbit programming", + "functional language", + "nock hoon", + "runic syntax", + "systems programming", + "hoon docs", + "hoon video", + "hoon source" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/reduce-your-pier-size.md b/app/content/blurbs/reduce-your-pier-size.md index 9c122a504c..d6292cfafc 100644 --- a/app/content/blurbs/reduce-your-pier-size.md +++ b/app/content/blurbs/reduce-your-pier-size.md @@ -2,6 +2,18 @@ title = "Reduce your pier size" description = "Compress and clean up your urbit's disk usage" tags = ["dojo", "runtime"] +search_terms = [ + "reduce pier size", + "roll command", + "chop command", + "urbit disk", + "event log", + "epoch", + "runtime disk", + "pier cleanup", + "truncate events", + "urbit storage" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/run-urbit-in-a-vps.md b/app/content/blurbs/run-urbit-in-a-vps.md index 23b0a0c2e9..b745fe7e9d 100644 --- a/app/content/blurbs/run-urbit-in-a-vps.md +++ b/app/content/blurbs/run-urbit-in-a-vps.md @@ -2,6 +2,18 @@ title = "Run urbit in a virtual server" description = "Urbit runs seamlessly in any cloud server or datacenter you may already be familiar with" tags = [] +search_terms = [ + "cloud server", + "vps urbit", + "run urbit in cloud", + "aws urbit", + "linode urbit", + "server requirements", + "linux hosting", + "datacenter hosting", + "virtual server", + "cloud hosting guide" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/run-urbit-locally.md b/app/content/blurbs/run-urbit-locally.md index 81316b113f..ae89af8dba 100644 --- a/app/content/blurbs/run-urbit-locally.md +++ b/app/content/blurbs/run-urbit-locally.md @@ -2,6 +2,18 @@ title = "Run urbit locally" description = "Quickly and easily run urbit on your laptop, or home desktop computer" tags = [] +search_terms = [ + "run urbit locally", + "laptop urbit", + "home computer", + "local network", + "localhost access", + "ames networking", + "local urbit", + "home hosting", + "fakeship", + "no public domain" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/run-urbit-using-groundseg.md b/app/content/blurbs/run-urbit-using-groundseg.md index 64255e9cd3..0b2e3d5e58 100644 --- a/app/content/blurbs/run-urbit-using-groundseg.md +++ b/app/content/blurbs/run-urbit-using-groundseg.md @@ -2,6 +2,18 @@ title = "Run Urbit Using Groundseg" description = "Groundseg is free and open-source software for running urbits, developed by Native Planet" tags = ["urbit-os", "docker", "native-planet"] +search_terms = [ + "groundseg", + "native planet software", + "urbit gui", + "docker urbit", + "colonyos", + "startram", + "anchor", + "urbit management", + "loom size", + "event log" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/run-urbit-using-native-planet-hardware.md b/app/content/blurbs/run-urbit-using-native-planet-hardware.md index 072e0c85a7..35434051f9 100644 --- a/app/content/blurbs/run-urbit-using-native-planet-hardware.md +++ b/app/content/blurbs/run-urbit-using-native-planet-hardware.md @@ -2,6 +2,18 @@ title = "Run urbit using Native Planet hardware" description = "Placeholder description" tags = [] +search_terms = [ + "native planet hardware", + "urbit appliance", + "colonyos", + "groundseg", + "startram", + "anchor", + "minio setup", + "self hosting device", + "dns service", + "hardware hosting" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/run-urbit-with-tlon-hosting.md b/app/content/blurbs/run-urbit-with-tlon-hosting.md index debb5d0d0d..2a834163a1 100644 --- a/app/content/blurbs/run-urbit-with-tlon-hosting.md +++ b/app/content/blurbs/run-urbit-with-tlon-hosting.md @@ -2,6 +2,18 @@ title = "Tlon hosting services" description = "Tlon Corporation is the preeminent hosting provider which provides free and seamless onboarding to the Urbit network" tags = ["hosting", "hosting-provider", "urbit-os", "tlon", "layer 2"] +search_terms = [ + "tlon hosting", + "tlon messenger", + "hosted urbit", + "layer 2 planet", + "master ticket", + "management proxy", + "urbit foundation group", + "invite friends", + "support email", + "hosted onboarding" +] lastest-update ="" image = "" imageDark = "" diff --git a/app/content/blurbs/select-available-loom-size.md b/app/content/blurbs/select-available-loom-size.md index 21b7734bb9..88d7924a2d 100644 --- a/app/content/blurbs/select-available-loom-size.md +++ b/app/content/blurbs/select-available-loom-size.md @@ -2,6 +2,17 @@ title = "Select available loom size" description = "Configure memory allocation for your urbit" tags = ["runtime"] +search_terms = [ + "loom size", + "--loom", + "memory allocation", + "urbit ram", + "loom exponent", + "loom 32", + "configure runtime", + "run urbit memory", + "loom flag" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/self-custody-your-id.md b/app/content/blurbs/self-custody-your-id.md index 6f48648928..1d40354a58 100644 --- a/app/content/blurbs/self-custody-your-id.md +++ b/app/content/blurbs/self-custody-your-id.md @@ -2,6 +2,18 @@ title = "Self-custody your Urbit ID" description = "As a cryptographic asset, there are many ways to control and secure your Urbit ID" tags = ["wallet", "ledger", "trezor", "metamask", "urbit-id"] +search_terms = [ + "self custody", + "urbit id security", + "hardware wallet", + "software wallet", + "master ticket", + "ledger trezor", + "metamask", + "seed phrase", + "bridge wallet", + "ownership key" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/shortfalls-of-hosting-providers.md b/app/content/blurbs/shortfalls-of-hosting-providers.md index d3e2eac0f2..33909571ba 100644 --- a/app/content/blurbs/shortfalls-of-hosting-providers.md +++ b/app/content/blurbs/shortfalls-of-hosting-providers.md @@ -2,6 +2,17 @@ title = "Shortfalls of hosting providers" description = "Hosting providers are designed to be scalable, not bespoke, operations." tags = ["hosting", "urbit-os"] +search_terms = [ + "hosting drawbacks", + "provider risks", + "encrypted at rest", + "host access data", + "self hosting control", + "dns control", + "ssh access", + "managed hosting limits", + "urbit privacy" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/shut-down-your-urbit.md b/app/content/blurbs/shut-down-your-urbit.md index 12d8e42852..ac3e66f42c 100644 --- a/app/content/blurbs/shut-down-your-urbit.md +++ b/app/content/blurbs/shut-down-your-urbit.md @@ -2,6 +2,17 @@ title = "Shut down your urbit" description = "Gracefully stop your urbit instance" tags = ["dojo", "runtime"] +search_terms = [ + "shutdown urbit", + "exit command", + "ctrl-d", + "graceful shutdown", + "stop urbit", + "dojo exit", + "runtime shutdown", + "solid state", + "power loss recovery" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/start-and-stop-applications-on-your-urbit.md b/app/content/blurbs/start-and-stop-applications-on-your-urbit.md index 0efb12d07f..244e40817f 100644 --- a/app/content/blurbs/start-and-stop-applications-on-your-urbit.md +++ b/app/content/blurbs/start-and-stop-applications-on-your-urbit.md @@ -2,6 +2,17 @@ title = "Start and stop applications on your urbit" description = "Control application lifecycles with dojo commands" tags = ["dojo"] +search_terms = [ + "start app", + "stop app", + "dojo start", + "suspend desk", + "pause desk", + "revive app", + "agent control", + "app lifecycle", + "desk updates" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/start-up-your-urbit.md b/app/content/blurbs/start-up-your-urbit.md index 0b3aed7179..276e6b3f32 100644 --- a/app/content/blurbs/start-up-your-urbit.md +++ b/app/content/blurbs/start-up-your-urbit.md @@ -2,6 +2,17 @@ title = "Restart up your urbit after initial boot" description = "Restarting your urbit after intial boot is straightforward and doesn't require additional cryptographic secrets" tags = ["runtime"] +search_terms = [ + "restart urbit", + "run urbit", + "urbit runtime", + "pier run", + "docked pier", + ".run", + "loom flag", + "boot ship", + "urbit restart" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/support-contact-points.md b/app/content/blurbs/support-contact-points.md index 0f5719a270..048bd836d6 100644 --- a/app/content/blurbs/support-contact-points.md +++ b/app/content/blurbs/support-contact-points.md @@ -2,6 +2,17 @@ title = "Off-network support channels" description = "Not able to get onto the network at all? Here are some off-network channels for getting support" tags = [] +search_terms = [ + "support email", + "off network support", + "urbit support", + "tlon support", + "github issues", + "can't connect", + "help offline", + "support@urbit.org", + "support@tlon.io" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/troubleshooting-your-urbit.md b/app/content/blurbs/troubleshooting-your-urbit.md index 190c79febd..ea09996bca 100644 --- a/app/content/blurbs/troubleshooting-your-urbit.md +++ b/app/content/blurbs/troubleshooting-your-urbit.md @@ -2,6 +2,16 @@ title = "Troubleshooting Your Urbit" description = "Placeholder description" tags = [] +search_terms = [ + "urbit troubleshooting", + "common issues", + "fix urbit", + "ship errors", + "help running urbit", + "urbit support", + "debug urbit", + "network issues" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/update-commands-for-your-urbit.md b/app/content/blurbs/update-commands-for-your-urbit.md index eb0bbd6827..7dd5def80b 100644 --- a/app/content/blurbs/update-commands-for-your-urbit.md +++ b/app/content/blurbs/update-commands-for-your-urbit.md @@ -2,6 +2,17 @@ title = "Update Commands For Your Urbit" description = "Your urbit is generally auto-updating, but in the event of an incompatible application or a kernel update that would conflict with existing apps, you may need to decide which software to run" tags = ["dojo"] +search_terms = [ + "update commands", + "bump", + "ota", + "kernel update", + "app incompatibility", + "suspend desks", + "update provider", + "over the air", + "dojo update" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/update-your-urbit-runtime.md b/app/content/blurbs/update-your-urbit-runtime.md index 5ce43b7de7..37bfaffe8a 100644 --- a/app/content/blurbs/update-your-urbit-runtime.md +++ b/app/content/blurbs/update-your-urbit-runtime.md @@ -2,6 +2,17 @@ title = "Update your urbit runtime" description = "Keep your vere binary up to date" tags = ["runtime"] +search_terms = [ + "update runtime", + "vere next", + "urbit next", + "runtime updates", + "vere binary", + "performance fixes", + "bug fixes", + "networking updates", + "runtime install" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/urbit-as-overlay-os.md b/app/content/blurbs/urbit-as-overlay-os.md index 3539dc951c..cf2bd1e644 100644 --- a/app/content/blurbs/urbit-as-overlay-os.md +++ b/app/content/blurbs/urbit-as-overlay-os.md @@ -2,6 +2,18 @@ title = "Urbit as overlay OS" description = "Urbit OS is a personal server operating system that runs on any Unix box as a self-contained virtual machine" tags = ["urbit-os", "virtual-machine", "runtime"] +search_terms = [ + "overlay os", + "urbit os", + "vere runtime", + "virtual machine", + "portable pier", + "move urbit", + "stateful networking", + "double boot", + "zip pier", + "host os" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/urbit-id-incentives-for-hosts.md b/app/content/blurbs/urbit-id-incentives-for-hosts.md index 753a0d5a0c..0ea65ddb6d 100644 --- a/app/content/blurbs/urbit-id-incentives-for-hosts.md +++ b/app/content/blurbs/urbit-id-incentives-for-hosts.md @@ -2,6 +2,18 @@ title = "Urbit ID incentives for hosts" description = "Cryptographic ownership of Urbit ID helps enforce honest operation of Urbit OS by hosting providers" tags = [] +search_terms = [ + "host incentives", + "urbit id ownership", + "principal agent", + "hosting provider", + "user control", + "cryptographic identity", + "unpersoning", + "host accountability", + "self sovereign", + "bridge" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/urbit-master-ticket-wallets.md b/app/content/blurbs/urbit-master-ticket-wallets.md index 3fd3b4224a..d7311126c6 100644 --- a/app/content/blurbs/urbit-master-ticket-wallets.md +++ b/app/content/blurbs/urbit-master-ticket-wallets.md @@ -2,6 +2,18 @@ title = "Urbit master ticket wallets" description = "Master ticket wallets are an easy and secure way for managing ownership of your Urbit ID" tags = ["ethereum", "wallet", "azimuth"] +search_terms = [ + "master ticket", + "brainwallet", + "hd wallet", + "urbit id wallet", + "bridge", + "cryptographic keys", + "azimuth wallet", + "ledger trezor", + "metamask", + "gnosis safe" +] lastest-update ="" image = "" imageDark = "" diff --git a/app/content/blurbs/urbit-related-blogs.md b/app/content/blurbs/urbit-related-blogs.md index 5cf07db446..273b7c48a8 100644 --- a/app/content/blurbs/urbit-related-blogs.md +++ b/app/content/blurbs/urbit-related-blogs.md @@ -2,6 +2,17 @@ title = "Urbit-related blogs" description = "A collection of written urbit content from the broader community" tags = [] +search_terms = [ + "urbit blogs", + "community writing", + "subject network blog", + "martian computing", + "hawk blog", + "urmanac", + "urbit essays", + "urbit commentary", + "sarlev blog" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/urbit-support-groups.md b/app/content/blurbs/urbit-support-groups.md index 0db6e9e126..ffeed5e2a1 100644 --- a/app/content/blurbs/urbit-support-groups.md +++ b/app/content/blurbs/urbit-support-groups.md @@ -2,6 +2,18 @@ title = "On-network support channels" description = "Need help with something? Give a shout in one of these groups and someone will give you a hand" tags = [] +search_terms = [ + "support groups", + "tlon local", + "battery payload", + "hooniverse", + "urbit community", + "uf public", + "tlon messenger groups", + "get help on urbit", + "support comet", + "join group" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/urbit-systems-technical-journal.md b/app/content/blurbs/urbit-systems-technical-journal.md index d11a8cc0cb..a5c8d5ea74 100644 --- a/app/content/blurbs/urbit-systems-technical-journal.md +++ b/app/content/blurbs/urbit-systems-technical-journal.md @@ -2,6 +2,18 @@ title = "Urbit Systems Technical Journal" description = "Placeholder description" tags = [] +search_terms = [ + "ustj", + "urbit systems journal", + "technical journal", + "solid state computing", + "neo urbit", + "nock performance", + "memory management", + "dynamic linking", + "submit article", + "lagrev nocfep" +] lastest-update = "" image = "" imageDark = "" diff --git a/app/content/blurbs/why-hosting-providers.md b/app/content/blurbs/why-hosting-providers.md index 699ed60d9e..683fe27ce9 100644 --- a/app/content/blurbs/why-hosting-providers.md +++ b/app/content/blurbs/why-hosting-providers.md @@ -2,6 +2,18 @@ title = "Why use a hosting provider?" description = "Urbit is a personal server, yet there are still service providers who will host it for you" tags = ["hosting", "hosting-provider", "urbit-os"] +search_terms = [ + "why hosting", + "hosting provider", + "managed hosting", + "onboarding", + "maintenance support", + "groundseg", + "network effects", + "personal server", + "cactus analogy", + "hosted urbit" +] lastest-update ="" image = "" imageDark = "" From 6498dd978f067834428be2a4692bb82af9b1cf33 Mon Sep 17 00:00:00 2001 From: thelifeandtimes Date: Thu, 5 Mar 2026 16:05:16 -0800 Subject: [PATCH 5/5] feat: improve ai legibility artifacts Reduce content index payload and add crawler entrypoints while keeping summaries consistent across blog, blurbs, and overview. --- app/blog/[blog]/page.js | 3 +- app/content/blog/2019-10-3-roadmap.md | 2 + app/content/blog/2019-5-roadmap.md | 2 + app/content/blog/2020-to-2021.md | 2 + app/content/blog/20200929-state-of-urbit.md | 2 + .../blog/20201119-models-of-society.md | 2 + .../blog/2021-11-18-report-from-the-field.md | 2 + ...promise-and-paradox-of-decentralization.md | 2 + ...25-a-new-epoch-for-the-forever-computer.md | 2 + app/content/blog/a-founders-farewell.md | 2 + app/content/blog/a-topiary.md | 2 + app/content/blog/aesthetic-culture-1.md | 2 + app/content/blog/after-machine-war.md | 2 + app/content/blog/agency-daos.md | 2 + app/content/blog/an-email.md | 2 + app/content/blog/an-urbit-overview.md | 2 + app/content/blog/announcing-urbit-grants.md | 2 + app/content/blog/ares.md | 2 + .../blog/august-2022-grants-program.md | 2 + app/content/blog/azimuth-as-multipass.md | 2 + app/content/blog/azimuth-is-on-chain.md | 2 + .../blog/azimuth-security-bounty-program.md | 2 + app/content/blog/beliefs-and-principles.md | 2 + .../blog/bootstrapping-urbit-from-ethereum.md | 2 + .../blog/building-beyond-beginner-guitar.md | 2 + .../blog/common-objections-to-urbit.md | 2 + .../blog/community-spotlight-the-portico.md | 2 + .../contributor-spotlight-dozreg-toplud.md | 2 + .../contributor-spotlight-litneb-maltyp.md | 2 + .../contributor-spotlight-mastyr-bottec.md | 2 + ...otlight-niblyx-malnus-and-bonbud-macryg.md | 2 + .../contributor-spotlight-nordus-mocwyl.md | 2 + app/content/blog/convivial-networks.md | 6 +- app/content/blog/creating-sigils.md | 2 + app/content/blog/desire-lines.md | 2 + app/content/blog/developer-preview-vere64.md | 2 + app/content/blog/eliza.md | 2 + app/content/blog/events-series.md | 2 + app/content/blog/first-contract.md | 2 + .../blog/first-steps-towards-urbit-org.md | 2 + app/content/blog/ford-fusion.md | 2 + app/content/blog/foss-1.md | 2 + app/content/blog/foss-2.md | 2 + app/content/blog/gifts-q3-2020.md | 2 + app/content/blog/governance-of-urbit.md | 2 + app/content/blog/hackathon-2023.md | 2 + app/content/blog/hackathon-results.md | 2 + app/content/blog/haleek-maul-interview.md | 2 + app/content/blog/hoon-4-lispers.md | 2 + app/content/blog/hosting-the-future.md | 2 + .../blog/immunology-for-the-internet-age.md | 2 + app/content/blog/infrastructural.md | 2 + app/content/blog/interim-constitution.md | 2 + app/content/blog/interplanetary_commerce.md | 2 + app/content/blog/introducing-os1.md | 2 + .../blog/introduction-to-the-combine-dao.md | 2 + app/content/blog/io-in-hoon.md | 2 + app/content/blog/iot.md | 2 + app/content/blog/landscape-a-portrait.md | 2 + app/content/blog/layer-2-faq.md | 2 + app/content/blog/llms-on-urbit.md | 2 + app/content/blog/magic.md | 2 + app/content/blog/metaphase.md | 2 + app/content/blog/nockmas-2025-day-1.md | 2 + app/content/blog/nockmas-2025-day-10.md | 2 + app/content/blog/nockmas-2025-day-11.md | 2 + app/content/blog/nockmas-2025-day-12.md | 2 + app/content/blog/nockmas-2025-day-2.md | 2 + app/content/blog/nockmas-2025-day-3.md | 2 + app/content/blog/nockmas-2025-day-4.md | 2 + app/content/blog/nockmas-2025-day-5.md | 2 + app/content/blog/nockmas-2025-day-6.md | 2 + app/content/blog/nockmas-2025-day-7.md | 2 + app/content/blog/nockmas-2025-day-8.md | 2 + app/content/blog/nockmas-2025-day-9.md | 2 + app/content/blog/nockmas-2025-welcome.md | 2 + app/content/blog/nockpu.md | 2 + app/content/blog/olif-and-urbit-ids.md | 2 + app/content/blog/on-christopher-alexander.md | 2 + ...the-face-that-launches-a-thousand-ships.md | 2 + app/content/blog/pki-maze.md | 2 + app/content/blog/platform-decay.md | 2 + app/content/blog/precepts-discussion.md | 2 + app/content/blog/precepts.md | 2 + app/content/blog/providers.md | 2 + app/content/blog/pseudonymous-reputation.md | 2 + app/content/blog/rollups.md | 2 + app/content/blog/security-and-continuity.md | 2 + app/content/blog/security-audit.md | 2 + app/content/blog/simple-durable-yours.md | 2 + app/content/blog/smart-home-of-the-future.md | 2 + app/content/blog/sovereign-intelligence.md | 2 + app/content/blog/stable-arvo.md | 2 + app/content/blog/state-of-urbit.md | 2 + .../blog/subassembly-hackathon-2024.md | 2 + app/content/blog/the-100-year-computer.md | 2 + ...as-a-lesson-in-decentralized-governance.md | 2 + app/content/blog/the-missing-middle.md | 2 + .../the-shape-of-dao-governance-to-come.md | 2 + app/content/blog/the-state-of-landscape.md | 2 + .../blog/the-understanding-urbit-podcast.md | 2 + app/content/blog/the-urbit-address-space.md | 2 + app/content/blog/tools-of-our-own.md | 2 + .../blog/toward-a-frozen-operating-system.md | 2 + app/content/blog/toward-a-new-clay.md | 2 + app/content/blog/urbit-and-bitcoin.md | 2 + app/content/blog/urbit-and-the-blockchain.md | 2 + app/content/blog/urbit-creator-daos.md | 2 + app/content/blog/urbit-for-creators.md | 2 + app/content/blog/urbit-for-normies.md | 2 + .../blog/urbit-grants-and-mid-2019-gifts.md | 2 + app/content/blog/urbit-is-for-communities.md | 2 + app/content/blog/urbithost-interview.md | 2 + app/content/blog/using-urbit-in-2023.md | 2 + .../blog/value-of-address-space-pt1.md | 2 + .../blog/value-of-address-space-pt2.md | 2 + .../blog/value-of-address-space-pt3.md | 2 + app/content/blog/what-is-urbit-for.md | 2 + app/content/blog/why-hoon.md | 2 + ...bit-probably-does-not-need-a-blockchain.md | 2 + app/content/blog/your-last-computer.md | 2 + .../blurbs/add-and-remove-applications.md | 2 + app/content/blurbs/azimuth-based-urbit-ids.md | 2 + app/content/blurbs/build-out-your-urbit.md | 2 + app/content/blurbs/buy-an-urbit-id.md | 2 + .../blurbs/check-and-reduce-memory-usage.md | 2 + .../blurbs/check-application-status.md | 2 + app/content/blurbs/check-your-sponsor.md | 2 + .../checking-and-fixing-azimuth-state.md | 2 + .../common-pitfalls-of-running-urbit.md | 2 + app/content/blurbs/create-a-moon-identity.md | 2 + .../blurbs/directly-contact-another-urbit.md | 2 + app/content/blurbs/docking-your-urbit.md | 2 + .../blurbs/docs-for-self-hosting-urbit.md | 2 + app/content/blurbs/get-access-code.md | 2 + .../blurbs/get-started-with-cloud-server.md | 2 + .../blurbs/get-started-with-command-line.md | 2 + .../blurbs/get-started-with-native-planet.md | 2 + .../blurbs/get-started-with-tlon-hosting.md | 2 + .../blurbs/getting-started-with-urbit.md | 2 + .../blurbs/groundwire-based-urbit-ids.md | 2 + app/content/blurbs/homepage-go-deeper.md | 2 + .../blurbs/homepage-hosting-providers.md | 2 + app/content/blurbs/homepage-self-hosting.md | 2 + app/content/blurbs/learn-to-hoon.md | 2 + app/content/blurbs/reduce-your-pier-size.md | 2 + app/content/blurbs/run-urbit-in-a-vps.md | 2 + app/content/blurbs/run-urbit-locally.md | 2 + .../blurbs/run-urbit-using-groundseg.md | 2 + .../run-urbit-using-native-planet-hardware.md | 2 + .../blurbs/run-urbit-with-tlon-hosting.md | 2 + .../blurbs/select-available-loom-size.md | 2 + app/content/blurbs/self-custody-your-id.md | 2 + .../blurbs/shortfalls-of-hosting-providers.md | 2 + app/content/blurbs/shut-down-your-urbit.md | 2 + ...art-and-stop-applications-on-your-urbit.md | 2 + app/content/blurbs/start-up-your-urbit.md | 2 + app/content/blurbs/support-contact-points.md | 2 + .../blurbs/troubleshooting-your-urbit.md | 2 + .../blurbs/update-commands-for-your-urbit.md | 2 + .../blurbs/update-your-urbit-runtime.md | 2 + app/content/blurbs/urbit-as-overlay-os.md | 2 + .../blurbs/urbit-id-incentives-for-hosts.md | 2 + .../blurbs/urbit-master-ticket-wallets.md | 2 + app/content/blurbs/urbit-related-blogs.md | 2 + app/content/blurbs/urbit-support-groups.md | 2 + .../blurbs/urbit-systems-technical-journal.md | 2 + app/content/blurbs/why-hosting-providers.md | 2 + app/content/get-on-the-network.md | 3 +- app/content/index.md | 3 +- app/content/overview/config.md | 1 + .../overview/running-urbit/common-commands.md | 2 + app/content/overview/running-urbit/config.md | 2 + .../overview/running-urbit/get-urbit-id.md | 2 + .../overview/running-urbit/glossary.md | 2 + .../running-urbit/hosting-providers.md | 2 + app/content/overview/running-urbit/intro.md | 2 + .../overview/running-urbit/resources.md | 2 + .../overview/running-urbit/run-urbit-os.md | 2 + app/content/overview/running-urbit/support.md | 2 + .../overview/urbit-explained/beyond.md | 2 + .../overview/urbit-explained/config.md | 2 + app/content/overview/urbit-explained/intro.md | 2 + .../overview/urbit-explained/urbit-id.md | 2 + .../overview/urbit-explained/urbit-os.md | 2 + app/ecosystem/page.js | 16 +- app/grants/[grant]/page.js | 3 +- app/layout.js | 9 +- app/overview/layout.js | 16 +- app/robots.js | 19 + app/sitemap.js | 33 + package.json | 4 +- public/agents.md | 27 + public/content-index.json | 5188 +++++++++++++++++ public/llms.txt | 32 + scripts/ai-legibility-config.js | 68 + scripts/backfill-summaries.js | 154 + scripts/build-ai-legibility.js | 577 ++ scripts/build-search-index.js | 9 + 199 files changed, 6506 insertions(+), 25 deletions(-) create mode 100644 app/robots.js create mode 100644 app/sitemap.js create mode 100644 public/agents.md create mode 100644 public/content-index.json create mode 100644 public/llms.txt create mode 100644 scripts/ai-legibility-config.js create mode 100644 scripts/backfill-summaries.js create mode 100644 scripts/build-ai-legibility.js diff --git a/app/blog/[blog]/page.js b/app/blog/[blog]/page.js index 6205583fcf..8ba0540937 100644 --- a/app/blog/[blog]/page.js +++ b/app/blog/[blog]/page.js @@ -17,10 +17,11 @@ export async function generateMetadata({ params }, parent) { const { blog } = await params; const postSlug = `/blog/${blog}.md`; const postData = await getMarkdownContent(postSlug, "toml"); + const description = `${postData.frontMatter.description}`; const metadata = { title: `${postData.frontMatter.title} • Blog`, - description: `${postData.frontMatter.description}`, + description, }; // Only add openGraph image if it exists diff --git a/app/content/blog/2019-10-3-roadmap.md b/app/content/blog/2019-10-3-roadmap.md index 2397a9d4f7..b800f5332a 100644 --- a/app/content/blog/2019-10-3-roadmap.md +++ b/app/content/blog/2019-10-3-roadmap.md @@ -1,7 +1,9 @@ +++ + title = "~2019.10 Roadmap" date = "2019-10-02" description = "Galen Wolfe-Pauly on the road ahead for the identity/OS/interface/community stack." +summary = "Mid-year progress update on Urbit development, featuring Bridge public release, improved sigils, Arvo updates, Landscape progress, and plans for network explorer and mobile support." aliases = [ "/posts/essays/2019-10-3-roadmap", "/posts/2019-10-3-roadmap" diff --git a/app/content/blog/2019-5-roadmap.md b/app/content/blog/2019-5-roadmap.md index 2d729bfe2d..914bbe3919 100644 --- a/app/content/blog/2019-5-roadmap.md +++ b/app/content/blog/2019-5-roadmap.md @@ -1,7 +1,9 @@ +++ + title = "~2019.5 Roadmap" date = "2019-05-15" description = "Where we are and where we're going as of mid-2019." +summary = "Overview of Urbit development progress and roadmap through Q3 2019, covering Azimuth improvements, Arvo updates, Bridge redesign, Hoon School launch, and the grants program." aliases = [ "/posts/essays/2019-5-roadmap", "/posts/2019-5-roadmap" ] search_terms = [ "2019 roadmap", diff --git a/app/content/blog/2020-to-2021.md b/app/content/blog/2020-to-2021.md index 478a228156..f4c3ca2ac3 100644 --- a/app/content/blog/2020-to-2021.md +++ b/app/content/blog/2020-to-2021.md @@ -1,6 +1,8 @@ +++ + title = "2020 -> 2021" description = "Reflecting and looking forward." +summary = "Year-end reflection on 2020 achievements including OS 1 adoption, Ford Fusion stability improvements, hosting service launch, and network reset with data preservation, plus 2021 priorities for developer community growth." date = "2021-01-20" search_terms = [ "2020 review", diff --git a/app/content/blog/20200929-state-of-urbit.md b/app/content/blog/20200929-state-of-urbit.md index 76c6df2591..7cf9eb0476 100644 --- a/app/content/blog/20200929-state-of-urbit.md +++ b/app/content/blog/20200929-state-of-urbit.md @@ -1,7 +1,9 @@ +++ + title = "Late 2020 Progress Update: OS 1 -> OS 1.N" date = "2020-09-28" description = "When we announced OS 1, in April, we started to disappear into Urbit. Since then, we’ve been living on Urbit like we never have before." +summary = "Six-month update on Urbit development focusing on 10x performance gains, memory optimization, new build system replacing Ford Fusion, graph store integration, and stability improvements to infrastructure and interface." search_terms = [ "os1 updates", "state of urbit", diff --git a/app/content/blog/20201119-models-of-society.md b/app/content/blog/20201119-models-of-society.md index ac8ddbcf8e..b9c56cc96c 100644 --- a/app/content/blog/20201119-models-of-society.md +++ b/app/content/blog/20201119-models-of-society.md @@ -1,6 +1,8 @@ +++ + title = "Models of Society" description = "Conversations compose society. What composes conversation — how do we digitize it in a way that enhances society without imposing upon it? How do we form this new medium, both to facilitate natural human behavior and to inspire the best of it?" +summary = "Examination of how digital conversation forms shape society, arguing for Urbit's territory-based model where users own persistent identities and can build distinct digital spaces without centralized platform control." date = "2020-11-18" search_terms = [ "models of society", diff --git a/app/content/blog/2021-11-18-report-from-the-field.md b/app/content/blog/2021-11-18-report-from-the-field.md index bba21161f8..08688882fb 100644 --- a/app/content/blog/2021-11-18-report-from-the-field.md +++ b/app/content/blog/2021-11-18-report-from-the-field.md @@ -1,7 +1,9 @@ +++ + title = "Report from the field: Assembly 2021" date = "2021-11-18" description = "The system builds the community and the community builds the system." +summary = "Recap of Urbit Assembly 2021 conference in Austin, highlighting the community's new world energy, hardware and software project announcements, and the relationship between system building and community formation." search_terms = [ "assembly 2021", "report from the field", diff --git a/app/content/blog/2021-11-18-the-promise-and-paradox-of-decentralization.md b/app/content/blog/2021-11-18-the-promise-and-paradox-of-decentralization.md index cec374fc3b..e315d27b69 100644 --- a/app/content/blog/2021-11-18-the-promise-and-paradox-of-decentralization.md +++ b/app/content/blog/2021-11-18-the-promise-and-paradox-of-decentralization.md @@ -1,7 +1,9 @@ +++ + title = "The Promise and Paradox of Decentralization" date = "2021-11-17" description = "Is centralization just a natural tendency of all networks? Are we destined to have a 'decentralization sandwich?'" +summary = "Analysis of centralization trends in decentralized networks, examining the decentralization sandwich phenomenon, onramp privatization, and Urbit's approach to balancing identity ownership with open protocols." search_terms = [ "decentralization paradox", "centralization", diff --git a/app/content/blog/2025-a-new-epoch-for-the-forever-computer.md b/app/content/blog/2025-a-new-epoch-for-the-forever-computer.md index bf45a19efc..cfd4d00695 100644 --- a/app/content/blog/2025-a-new-epoch-for-the-forever-computer.md +++ b/app/content/blog/2025-a-new-epoch-for-the-forever-computer.md @@ -1,7 +1,9 @@ +++ + title = "A New Epoch for The Forever Computer" date = "2025-10-9" description = "On the further decentralization of Urbit and the next era of the Urbit Foundation" +summary = "Announcement of Urbit Foundation governance transition with new three-seat board, appointment of Executive Director ~sicdev-pilnup, and evolution toward operational decentralization and broader community amplification." # aliases = [] search_terms = [ "urbit foundation", diff --git a/app/content/blog/a-founders-farewell.md b/app/content/blog/a-founders-farewell.md index 37c213e5be..b9d5896b7f 100644 --- a/app/content/blog/a-founders-farewell.md +++ b/app/content/blog/a-founders-farewell.md @@ -1,7 +1,9 @@ +++ + title = "A Founder's Farewell" date = "2019-01-13" description = "My goal was always to fire myself at the first possible opportunity. I'm super happy to reach it." +summary = "Curtis Yarvin's resignation from Tlon as CTO, board member, and voting shareholder, describing his 17-year journey building Urbit from 2002-2013 and explaining his goal of creating an open technology not controlled by any single person." aliases = [ "/posts/essays/a-founders-farewell", "/posts/a-founders-farewell" diff --git a/app/content/blog/a-topiary.md b/app/content/blog/a-topiary.md index 4dca0b45f4..5872e3f414 100644 --- a/app/content/blog/a-topiary.md +++ b/app/content/blog/a-topiary.md @@ -1,7 +1,9 @@ +++ + title = "A Topiary: Hypertext and Urbit" date = "2021-06-13" description = "A brief history of hypertext and Urbit networking" +summary = "Historical overview of hypertext from Vannevar Bush's Memex through Ted Nelson's Project Xanadu to the modern web, explaining Urbit's %graph-store data structure as a peer-to-peer alternative to proprietary platform graph databases." search_terms = [ "hypertext history", "urbit networking", diff --git a/app/content/blog/aesthetic-culture-1.md b/app/content/blog/aesthetic-culture-1.md index 9c447e227e..6a602074a2 100644 --- a/app/content/blog/aesthetic-culture-1.md +++ b/app/content/blog/aesthetic-culture-1.md @@ -1,6 +1,8 @@ +++ + title = "Aesthetic Culture #1" description = "One of the most exciting things about Urbit is the aesthetic and design around it, developed partly by Tlon (through the design of Urbit itself) and partly by the community (by producing great Urbit art)." +summary = "First in monthly Urbit art digest series showcasing community-created digital art, including wooden sigil sculptures with lighting effects, Dinosaur Comics threads using urbit.org as seed text, and cat poetry." date = "2020-11-11" search_terms = [ "urbit art", diff --git a/app/content/blog/after-machine-war.md b/app/content/blog/after-machine-war.md index 0196430eee..8777cf2680 100644 --- a/app/content/blog/after-machine-war.md +++ b/app/content/blog/after-machine-war.md @@ -1,6 +1,8 @@ +++ + title = "After the Machine War" description = "The date is January 1, 2050. The place, New York City. The vibe...subdued." +summary = "Speculative fiction set in 2050 New York City depicting a dystopian future where iThink microchips deliver drug-induced compliance, surveillance is pervasive, and content moderation is a mundane job in a world stripped of natural experiences." date = "2021-03-14" search_terms = [ "after machine war", diff --git a/app/content/blog/agency-daos.md b/app/content/blog/agency-daos.md index c50ab316fa..dfaf5c9808 100644 --- a/app/content/blog/agency-daos.md +++ b/app/content/blog/agency-daos.md @@ -1,7 +1,9 @@ +++ + title = "The Dream of the Agency DAO" date = "2022-11-04" description = "As creative studios and agencies struggle for more creative freedom, DAOs and tokenization will surely take a more central role in the marketing and branding industries. Decentralization offers such entities benefits that could fundamentally reshape creatives’ relationships with clients—reducing layers of inefficiency and anti-creative incentives." +summary = "Examination of creative agency DAOs as potential solutions to modern advertising inefficiencies, exploring project bountification, talent retention through token ownership, and idea valuation while acknowledging challenges of creative work by committee." search_terms = [ "agency dao", "creative agency", diff --git a/app/content/blog/an-email.md b/app/content/blog/an-email.md index 2c367097ba..f2abec4875 100644 --- a/app/content/blog/an-email.md +++ b/app/content/blog/an-email.md @@ -1,6 +1,8 @@ +++ + title = "An Email from the Archive" description = "I found this email in my archives recently and thought it might be fun to share publicly." +summary = "Forwarded 2020 email from Galen Wolfe-Pauly discussing Urbit's principles of simplicity, durability, and ownership in digital communication tools, arguing that platform-centric software creates fundamental user conflicts." date = "2020-11-29" search_terms = [ "email from archive", diff --git a/app/content/blog/an-urbit-overview.md b/app/content/blog/an-urbit-overview.md index bdab0499bb..77aa79142b 100644 --- a/app/content/blog/an-urbit-overview.md +++ b/app/content/blog/an-urbit-overview.md @@ -1,7 +1,9 @@ +++ + title = "An Urbit Overview" date = "2016-05-10" description = "A high-level overview of Urbit." +summary = "Introduction to Urbit as a virtual city of general-purpose personal servers, describing technical architecture including Nock formal semantics, encrypted peer-to-peer networking, cryptographic identity, and advantages over fragmented cloud services." search_terms = [ "urbit overview", "personal server", diff --git a/app/content/blog/announcing-urbit-grants.md b/app/content/blog/announcing-urbit-grants.md index 2a2fa8c866..397b069afc 100644 --- a/app/content/blog/announcing-urbit-grants.md +++ b/app/content/blog/announcing-urbit-grants.md @@ -1,7 +1,9 @@ +++ + title = "Announcing: Urbit Grants Program" date = "2019-08-05" description = "Announcing Urbit Grants, a way to earn stars through contributing." +summary = "Launch of Urbit Grants program providing Azimuth star compensation through three mechanisms: semi-annual gifts for informal contributions, bounties for defined projects, and proposals for contributor-pitched ideas." aliases = [ "/posts/essays/announcing-urbit-grants", "/posts/announcing-urbit-grants" diff --git a/app/content/blog/ares.md b/app/content/blog/ares.md index 292042f2b6..56f0db5456 100644 --- a/app/content/blog/ares.md +++ b/app/content/blog/ares.md @@ -1,7 +1,9 @@ +++ + title = "Ares" date = "2023-06-26" description = "A light technical description of Ares, the new Urbit runtime" +summary = "Technical description of Ares runtime improvements including subject knowledge analysis for Nock codegen, 2stackz noun allocator eliminating heap, and Persistent Memory Arena enabling terabyte-scale data management through single-level store optimization." search_terms = [ "ares runtime", "urbit runtime", diff --git a/app/content/blog/august-2022-grants-program.md b/app/content/blog/august-2022-grants-program.md index 1207bcde2f..9bee6d96b2 100644 --- a/app/content/blog/august-2022-grants-program.md +++ b/app/content/blog/august-2022-grants-program.md @@ -1,7 +1,9 @@ +++ + title = "August Grants Program Review" date = "2022-08-30" description = "The completion of the first cohort of Hoon School Live and the following App School Live program minted dozens of capable new Hoon developers. These developers are completing applications, closing out bounties, and putting together proposals at a rapid pace, with more to come as Assembly 2022 draws near." +summary = "Article examining grants distribution." search_terms = [ "grants program", "hoon school", diff --git a/app/content/blog/azimuth-as-multipass.md b/app/content/blog/azimuth-as-multipass.md index b8d283b080..9eb530f3ba 100644 --- a/app/content/blog/azimuth-as-multipass.md +++ b/app/content/blog/azimuth-as-multipass.md @@ -1,7 +1,9 @@ +++ + title = "Azimuth as Multipass" date = "2019-05-15" description = "What if everyone had a single 'civilizational key'?" +summary = "Essay envisioning Azimuth as a unified identity and payment system—a 'civilizational key' serving as both driver's license and credit card for a decentralized digital society." aliases = [ "/posts/essays/azimuth-as-multipass/", "/posts/azimuth-as-multipass" diff --git a/app/content/blog/azimuth-is-on-chain.md b/app/content/blog/azimuth-is-on-chain.md index 499be64cf7..fcabbc4fdd 100644 --- a/app/content/blog/azimuth-is-on-chain.md +++ b/app/content/blog/azimuth-is-on-chain.md @@ -1,7 +1,9 @@ +++ + title = "Azimuth is On-Chain" date = "2019-01-13" description = "The Urbit address space, now called Azimuth, is on the blockchain. And too many other things to fit into a single post." +summary = "Announcement of Urbit address space deployment to Ethereum blockchain as Azimuth, introducing Bridge interface for managing ERC-721 identity tokens and launching Landscape cities for private communities." search_terms = [ "azimuth on chain", "urbit address space", diff --git a/app/content/blog/azimuth-security-bounty-program.md b/app/content/blog/azimuth-security-bounty-program.md index 8d43ec9d2b..d5ee593283 100644 --- a/app/content/blog/azimuth-security-bounty-program.md +++ b/app/content/blog/azimuth-security-bounty-program.md @@ -1,7 +1,9 @@ +++ + title = "Azimuth Security Bounty Program" date = "2019-07-21" description = "Inviting you (and your friends) to help us make Azimuth as secure as possible." +summary = "Launch of security bounty program incentivizing responsible disclosure of Azimuth smart contract vulnerabilities, specifying reward tiers based on severity and process for submission and verification." aliases = [ "/posts/essays/azimuth-security-bounty-program", "/posts/azimuth-security-bounty-program" diff --git a/app/content/blog/beliefs-and-principles.md b/app/content/blog/beliefs-and-principles.md index 35a5cb337f..a9177dd42e 100644 --- a/app/content/blog/beliefs-and-principles.md +++ b/app/content/blog/beliefs-and-principles.md @@ -1,7 +1,9 @@ +++ + title = "Beliefs and Principles Guiding the Urbit Project" date = "2016-05-10" description = "We believe." +summary = "Foundational principles for Urbit governance including digital independence, code-as-law, decentralized control, stake-based governance with equal authority per stake, and content-neutral moderation." search_terms = [ "urbit principles", "urbit beliefs", diff --git a/app/content/blog/bootstrapping-urbit-from-ethereum.md b/app/content/blog/bootstrapping-urbit-from-ethereum.md index 253e8ec5e1..7b1899d342 100644 --- a/app/content/blog/bootstrapping-urbit-from-ethereum.md +++ b/app/content/blog/bootstrapping-urbit-from-ethereum.md @@ -1,7 +1,9 @@ +++ + title = "Bootstrapping Urbit from Ethereum" date = "2017-09-19" description = "We've decided to launch Urbit's constitution as a system of Ethereum contracts." +summary = "Technical analysis of leveraging Ethereum for Urbit's identity layer while maintaining independence, discussing smart contract security, gas economics, and long-term decentralization strategy." search_terms = [ "bootstrapping urbit", "ethereum contracts", diff --git a/app/content/blog/building-beyond-beginner-guitar.md b/app/content/blog/building-beyond-beginner-guitar.md index dbf6c88b60..d8b4e952e8 100644 --- a/app/content/blog/building-beyond-beginner-guitar.md +++ b/app/content/blog/building-beyond-beginner-guitar.md @@ -1,7 +1,9 @@ +++ + title = "Building 'Beyond Beginner Guitar' on Urbit" date = "2025-12-09" description = "~nordus-mocwyl walks through what it took to build a guitar course and member community on Urbit" +summary = "~nordus-mocwyl details building an Urbit-powered guitar course business today with YouTube discovery, email communication, and Stripe payments, while dreaming of a fully decentralized flow with LLM recommendations, cryptocurrency payments, and native course syncing." # aliases = [] [extra] diff --git a/app/content/blog/common-objections-to-urbit.md b/app/content/blog/common-objections-to-urbit.md index b4e4331ec0..6c33725439 100644 --- a/app/content/blog/common-objections-to-urbit.md +++ b/app/content/blog/common-objections-to-urbit.md @@ -1,7 +1,9 @@ +++ + title = "Common Objections to Urbit" date = "2016-06-27" description = "Some common objections to Urbit, discussed." +summary = "Response to frequent criticisms of Urbit including complexity concerns, adoption challenges, and decentralization tradeoffs, providing technical context and community perspectives on each objection." search_terms = [ "urbit objections", "urbit critiques", diff --git a/app/content/blog/community-spotlight-the-portico.md b/app/content/blog/community-spotlight-the-portico.md index d3a4ecbd7c..6e91df146f 100644 --- a/app/content/blog/community-spotlight-the-portico.md +++ b/app/content/blog/community-spotlight-the-portico.md @@ -1,7 +1,9 @@ +++ + title = "Community Spotlight: The Portico" date = "2021-05-03" description = "Interview with The Portico founder Josh Reagan" +summary = "Feature on community-governed social network application running on Urbit, demonstrating Landscape's app distribution model and explaining governance structure using Urbit IDs and star-based voting." search_terms = [ "portico community", "orthodox christian", diff --git a/app/content/blog/contributor-spotlight-dozreg-toplud.md b/app/content/blog/contributor-spotlight-dozreg-toplud.md index 660351caab..f7373cdc61 100644 --- a/app/content/blog/contributor-spotlight-dozreg-toplud.md +++ b/app/content/blog/contributor-spotlight-dozreg-toplud.md @@ -1,7 +1,9 @@ +++ + title = "Contributor Spotlight: ~dozreg-toplud" date = "2025-11-04" description = "A peek into the mind behind UrWASM, and the undertaking to make Urbit faster" +summary = "UrWASM and SKA developer ~dozreg-toplud discusses Urbit's shallow stack, security model, and work on improving Nock performance through subject knowledge analysis." # aliases = [] [extra] diff --git a/app/content/blog/contributor-spotlight-litneb-maltyp.md b/app/content/blog/contributor-spotlight-litneb-maltyp.md index 2a35f56797..bd21826143 100644 --- a/app/content/blog/contributor-spotlight-litneb-maltyp.md +++ b/app/content/blog/contributor-spotlight-litneb-maltyp.md @@ -1,7 +1,9 @@ +++ + title = "Contributor Spotlight: ~litneb-maltyp" date = "2026-02-17" description = "A conversation with ~litneb-maltyp on Urbit identity, community, and the personal server" +summary = "Designer ~litneb-maltyp discusses Urbit's identity system, owning personal servers, and building a home lab for agency over computing and digital permanence." # aliases = [] [extra] diff --git a/app/content/blog/contributor-spotlight-mastyr-bottec.md b/app/content/blog/contributor-spotlight-mastyr-bottec.md index baccc09c62..d5672fbfdb 100644 --- a/app/content/blog/contributor-spotlight-mastyr-bottec.md +++ b/app/content/blog/contributor-spotlight-mastyr-bottec.md @@ -1,7 +1,9 @@ +++ + title = "Contributor Spotlight: ~mastyr-bottec" date = "2025-11-25" description = "A conversation with runtime developer ~mastyr-bottec on his work to make Urbit store large amounts of data" +summary = "Runtime developer ~mastyr-bottec explains vere64 work enabling Urbit to store large amounts of data, including migrations and lifting file size limits." # aliases = [] [extra] diff --git a/app/content/blog/contributor-spotlight-niblyx-malnus-and-bonbud-macryg.md b/app/content/blog/contributor-spotlight-niblyx-malnus-and-bonbud-macryg.md index e291a527e5..b62ac3c97b 100644 --- a/app/content/blog/contributor-spotlight-niblyx-malnus-and-bonbud-macryg.md +++ b/app/content/blog/contributor-spotlight-niblyx-malnus-and-bonbud-macryg.md @@ -1,7 +1,9 @@ +++ + title = "Contributor Spotlight: ~bonbud-macryg & ~niblyx-malnus" date = "2026-1-20" description = "A conversation with Groundwire developers ~bonbud-macryg and ~niblyx-malnus on Urbit, AI, and building beautiful computers" +summary = "Groundwire developers ~bonbud-macryg and ~niblyx-malnus explore Urbit for AI, building LLM tools like Clurd and MCP servers, and Urbit as a trustworthy personal computing platform." # aliases = [] [extra] diff --git a/app/content/blog/contributor-spotlight-nordus-mocwyl.md b/app/content/blog/contributor-spotlight-nordus-mocwyl.md index c58f7099eb..77bc51a70b 100644 --- a/app/content/blog/contributor-spotlight-nordus-mocwyl.md +++ b/app/content/blog/contributor-spotlight-nordus-mocwyl.md @@ -1,7 +1,9 @@ +++ + title = "Contributor Spotlight: ~nordus-mocwyl" date = "2025-12-16" description = "A conversation with ~nordus-mocwyl on independent music, Urbit, and direct charity" +summary = "Musician ~nordus-mocwyl discusses using Urbit for independent music distribution, building guitar courses with Hawk, and learning Hoon to understand computing from Nock upward." # aliases = [] [extra] diff --git a/app/content/blog/convivial-networks.md b/app/content/blog/convivial-networks.md index 061a1a728f..0214fac099 100644 --- a/app/content/blog/convivial-networks.md +++ b/app/content/blog/convivial-networks.md @@ -1,7 +1,9 @@ -+++ ++++ + title = "Convivial Networks" date = "2022-05-27" description = "Like the relationships that we build within them, our platforms should yield satisfaction precisely because they’re non-trivial; they demand effort, which is another way of saying they require engagement with the world." +summary = "Essay on designing network protocols supporting human-scale interaction, arguing for technical architectures that enable communities to self-govern rather than imposing centralized moderation." search_terms = [ "convivial networks", "convivial tools", @@ -17,7 +19,7 @@ search_terms = [ [extra] author = "" ship = "~witwyt-widlyr" -image = "https://media.urbit.org/blog/convivial-computers.jpg" +image = "https://media.urbit.org/blog/convivial-computers.jpg" +++ ![](https://media.urbit.org/blog/convivial-computers.jpg) diff --git a/app/content/blog/creating-sigils.md b/app/content/blog/creating-sigils.md index 66f8d9d737..39ea9070cb 100644 --- a/app/content/blog/creating-sigils.md +++ b/app/content/blog/creating-sigils.md @@ -1,7 +1,9 @@ +++ + title = "Creating Sigils" date = "2020-02-03" description = "The origin and design process informing Urbit's generative user avatar system, Sigils." +summary = "Technical deep-dive into sigil generation algorithm, explaining glyph encoding, color assignment logic, collision avoidance techniques, and principles for visual identity in digital networks." search_terms = [ "creating sigils", "urbit sigils", diff --git a/app/content/blog/desire-lines.md b/app/content/blog/desire-lines.md index c825d6bdda..dafb961564 100644 --- a/app/content/blog/desire-lines.md +++ b/app/content/blog/desire-lines.md @@ -1,7 +1,9 @@ +++ + title = "Desire Lines to a New Internet" date = "2022-05-06" description = "As more DAOs, NFT and digital communities find their way to Urbit, others are likely to follow their paths, making them their own, just like the network itself." +summary = "The author describes web3 communities migrating to Urbit as traversing Christopher Alexander's desire lines, with Layer 2 making planet distribution affordable, DAO tooling proliferating on Landscape, and token-gated distributions scaling through projects like Dusko and PointDAO." search_terms = [ "desire lines", "web3 communities", diff --git a/app/content/blog/developer-preview-vere64.md b/app/content/blog/developer-preview-vere64.md index 86484622d7..a160c72a6d 100644 --- a/app/content/blog/developer-preview-vere64.md +++ b/app/content/blog/developer-preview-vere64.md @@ -1,7 +1,9 @@ +++ + title = "Developer Preview: vere64 runtime" date = "2025-11-24" description = "A preview for developers to experience an unlimited loom using the vere64 runtime" +summary = "The Urbit Foundation releases a vere64 Developer Preview enabling terabyte-scale looms through 64-bit runtime, removing the conceptual 16GB glass ceiling for experimental applications while warning it's for development ships only without migration pathways." # aliases = [] [extra] diff --git a/app/content/blog/eliza.md b/app/content/blog/eliza.md index 01c310c4f9..87643f7ec7 100644 --- a/app/content/blog/eliza.md +++ b/app/content/blog/eliza.md @@ -1,7 +1,9 @@ +++ + title = "Eliza" date = "2021-02-22" description = "Building things, even Calm™ things, makes noise." +summary = "Introduction to AI assistant running on Urbit architecture, demonstrating how personal servers enable private, owned implementations of conversational interfaces without third-party data collection." search_terms = [ "eliza bot", "urbit chatbot", diff --git a/app/content/blog/events-series.md b/app/content/blog/events-series.md index bd5a9818a4..1ffc47ee44 100644 --- a/app/content/blog/events-series.md +++ b/app/content/blog/events-series.md @@ -1,6 +1,8 @@ +++ + title = "Urbit Events Series" description = "These events are an opportunity for Urbit contributors to share real-time updates that don’t make it into this blog, and for the community to get to know the contributors (and one another)." +summary = "Lane Rettig launches Urbit's community event series with developer calls, a December Town Hall, and upcoming UrbitCon, designed to scale cultural knowledge transmission, document maker expertise, and foster community-led growth as the project reaches critical mass." date = "2020-10-29" search_terms = [ "urbit events", diff --git a/app/content/blog/first-contract.md b/app/content/blog/first-contract.md index 284baf579f..12816be5f6 100644 --- a/app/content/blog/first-contract.md +++ b/app/content/blog/first-contract.md @@ -1,7 +1,9 @@ +++ + title = "Azimuth’s First Contract Upgrade" date = "2021-06-04" description = "Galactic Senate makes first concrete action" +summary = "Jonathan Paprocki and Mark explain Azimuth's first Galactic Senate upgrade vote on ERC721 fixes, self-modifying proxies, and Claims contract improvements while reviewing Urbit's decentralization journey from Tlon-controlled to galaxy-owner governed." search_terms = [ "azimuth upgrade", "first contract", diff --git a/app/content/blog/first-steps-towards-urbit-org.md b/app/content/blog/first-steps-towards-urbit-org.md index bdb2605ef3..c944704bfe 100644 --- a/app/content/blog/first-steps-towards-urbit-org.md +++ b/app/content/blog/first-steps-towards-urbit-org.md @@ -1,7 +1,9 @@ +++ + title = "First Steps Towards urbit.org" date = "2020-08-11" description = "With a stable platform taking shape and a strong community forming that wants to help build Urbit, it’s time to make urbit.org real." +summary = "Josh Lehman announces urbit.org's separation from Tlon as a protocol steward, outlining plans for developer recruitment, grants acceleration, bounties for Landscape development, and community-driven address space distribution to mature the platform." search_terms = [ "urbit.org", "urbit foundation", diff --git a/app/content/blog/ford-fusion.md b/app/content/blog/ford-fusion.md index 80a76628a4..e72ae73f11 100644 --- a/app/content/blog/ford-fusion.md +++ b/app/content/blog/ford-fusion.md @@ -1,7 +1,9 @@ +++ + title = "Ford Fusion" date = "2020-07-14" description = "Ford Fusion was an overhaul of Urbit's over-the-air upgrade process and a rewrite of its build system. The new update system corrects a few long-standing bugs with the previous one, and the new build system is simpler, smaller (by around 5,000 lines), and easier to manage." +summary = "Technical explanation of build system simplification eliminating traditional compilation, replacing it with filesystem-based deployment and explaining performance and reliability improvements." search_terms = [ "ford fusion", "ota updates", diff --git a/app/content/blog/foss-1.md b/app/content/blog/foss-1.md index cddfb81e0f..2be7a4461d 100644 --- a/app/content/blog/foss-1.md +++ b/app/content/blog/foss-1.md @@ -1,7 +1,9 @@ +++ + title = "Urbit's Open Source Culture, Part I" date = "2023-05-31" description = "How did Urbit cultivate a unique open source software culture? Let's take a look at how we got to where we are today." +summary = "N E Davis traces Urbit's evolution from Curtis Yarvin's personal project through Tlon's skunkworks to today's thriving open source community, crediting nine factors from functional OS appeal to public build parties in cultivating radical transparency." search_terms = [ "open source culture", "urbit history", diff --git a/app/content/blog/foss-2.md b/app/content/blog/foss-2.md index 3f92ad9544..927260e46c 100644 --- a/app/content/blog/foss-2.md +++ b/app/content/blog/foss-2.md @@ -1,7 +1,9 @@ +++ + title = "Urbit's Open Source Culture, Part II" date = "2023-06-13" description = "How will Urbit continue to foster its innovative open source software culture?" +summary = "N E Davis proposes four priorities for Urbit's open source future: developing Hoon Prime for legible code, improving developer experience with better tooling, highlighting user stories, and maintaining playfulness while building toward mature documentation." search_terms = [ "open source culture", "urbit foundation", diff --git a/app/content/blog/gifts-q3-2020.md b/app/content/blog/gifts-q3-2020.md index 3e6967bd53..af856f4573 100644 --- a/app/content/blog/gifts-q3-2020.md +++ b/app/content/blog/gifts-q3-2020.md @@ -1,7 +1,9 @@ +++ + title = "Gifts Q3 2020" date = "2020-09-22" description = "Twice a year we distribute address space to those that have made valuable contributions to Urbit. Now called our Gifts program, the gifting of address space has been part of Urbit long before we had a grants program." +summary = "Quarterly grants distribution announcement recognizing technical contributions, documentation improvements, community building efforts, and ecosystem development work across Urbit's open source projects." search_terms = [ "gifts program", "address space", diff --git a/app/content/blog/governance-of-urbit.md b/app/content/blog/governance-of-urbit.md index e96aa0437b..59b69b73b8 100644 --- a/app/content/blog/governance-of-urbit.md +++ b/app/content/blog/governance-of-urbit.md @@ -1,7 +1,9 @@ +++ + title = "Governance of urbit.org" date = "2019-01-10" description = "Stewardship of the Urbit Project." +summary = "Article examining governance." search_terms = [ "urbit governance", "urbit.org assets", diff --git a/app/content/blog/hackathon-2023.md b/app/content/blog/hackathon-2023.md index 54e29612b6..616a422a7a 100644 --- a/app/content/blog/hackathon-2023.md +++ b/app/content/blog/hackathon-2023.md @@ -1,7 +1,9 @@ +++ + title = "Assembly Hackathon 2023" date = "2023-12-05" description = "The Assembly 2023 Hackathon was the most successful Urbit Hackathon we've had. Get a taste of Demo Day in Lisbon and check out the projects they made." +summary = "Article examining community event." search_terms = [ "assembly hackathon", "demo day", diff --git a/app/content/blog/hackathon-results.md b/app/content/blog/hackathon-results.md index b6634a25bd..635d32270d 100644 --- a/app/content/blog/hackathon-results.md +++ b/app/content/blog/hackathon-results.md @@ -1,7 +1,9 @@ +++ + title = "Hackathon Results" date = "2020-06-11" description = "We recently held an invite-only Urbit Hackathon for graduates of our Hoon School program, and the submissions really impressed us across the board. Submissions were judged on several criteria: creativity, usefulness, and code quality." +summary = "Award announcements detailing winning projects across categories, judge evaluations, prize distributions, and selected submissions demonstrating landscape development progress." search_terms = [ "urbit hackathon", "hoon school", diff --git a/app/content/blog/haleek-maul-interview.md b/app/content/blog/haleek-maul-interview.md index e625ac2e7e..89bcf82dfc 100644 --- a/app/content/blog/haleek-maul-interview.md +++ b/app/content/blog/haleek-maul-interview.md @@ -1,7 +1,9 @@ +++ + title = "NFTs, Urbit IDs, and Communities w/ Haleek Maul" date = "2021-09-09" description = "An interview with the founder of Holdersland" +summary = "Matt interviews Haleek Maul about Holdersland's Urbit NFT project, exploring how blockchain lowers barriers for Caribbean artists, enables peer-to-peer communities, and creates new financial structures beyond traditional music industry gatekeepers." search_terms = [ "haleek maul", "holdersland", diff --git a/app/content/blog/hoon-4-lispers.md b/app/content/blog/hoon-4-lispers.md index ac35717692..3c9df4a443 100644 --- a/app/content/blog/hoon-4-lispers.md +++ b/app/content/blog/hoon-4-lispers.md @@ -1,7 +1,9 @@ +++ + title = "A Perspective on Lisp and Hoon" date = "2023-06-15" description = "Lisp is an éminence grise of programming. How does Hoon compare?" +summary = "N E Davis compares Hoon to Lisp across syntax, metaprogramming, and philosophy, showing how Hoon's static typing, binary tree homoiconicity, and subject-oriented design advance Lisp's goals for a hundred-year computer while avoiding macro proliferation." search_terms = [ "hoon vs lisp", "lisp comparison", diff --git a/app/content/blog/hosting-the-future.md b/app/content/blog/hosting-the-future.md index 1a2fc77899..e079828b4f 100644 --- a/app/content/blog/hosting-the-future.md +++ b/app/content/blog/hosting-the-future.md @@ -1,7 +1,9 @@ +++ + title = "Hosting the Future" date = "2020-09-30" description = "The way we see it, hosting is the most important thing, next to Landscape, that Tlon can do to help Urbit continue toward widespread adoption." +summary = "Discussion of Urbit hosting infrastructure options including commercial providers, self-hosting guides, redundancy strategies, and long-term continuity planning for personal servers." search_terms = [ "hosting service", "tlon hosting", diff --git a/app/content/blog/immunology-for-the-internet-age.md b/app/content/blog/immunology-for-the-internet-age.md index 149681eb43..967fb28a0a 100644 --- a/app/content/blog/immunology-for-the-internet-age.md +++ b/app/content/blog/immunology-for-the-internet-age.md @@ -1,7 +1,9 @@ +++ + title = "Immunology for the Internet Age" date = "2022-04-07" description = "A consideration of the history of the Internet motivates introspection on the nature and causes of social dysfunction in a globally shared space. Centralized solutions fail to yield satisfactory outcomes for human freedom and thriving. Decentralized autonomous organizations and their technological apparatus together represent the evolution of an immune system against a corporatized Internet." +summary = "The author draws an immunology metaphor for the Internet's evolution from high-trust academia to megacorp-dominated zero-trust systems, arguing DAOs, blockchain identity, and decentralized platforms form an immune system preserving human agency against corporate colonization." search_terms = [ "internet immune system", "decentralization", diff --git a/app/content/blog/infrastructural.md b/app/content/blog/infrastructural.md index e0edd27051..7caed1c8f0 100644 --- a/app/content/blog/infrastructural.md +++ b/app/content/blog/infrastructural.md @@ -1,7 +1,9 @@ +++ + title = "Infrastructural" date = "2020-04-09" description = "A reflection–meditation on OS 1’s initial form development, and the attitude we brought to bear in designing it." +summary = "Technical essay examining network infrastructure requirements, explaining choices supporting long-term durability, decentralization, and resistance to single points of failure." search_terms = [ "infrastructural", "os1 design", diff --git a/app/content/blog/interim-constitution.md b/app/content/blog/interim-constitution.md index d9a9f4c3e1..62b76224b1 100644 --- a/app/content/blog/interim-constitution.md +++ b/app/content/blog/interim-constitution.md @@ -1,7 +1,9 @@ +++ + title = "Interim Constitution" date = "2016-05-15" description = "The governing rules for the early days of the Urbit network." +summary = "Governance document establishing temporary constitutional framework for Urbit Foundation during transition period, defining board powers, galactic senate responsibilities, and amendment processes." search_terms = [ "interim constitution", "urbit governance", diff --git a/app/content/blog/interplanetary_commerce.md b/app/content/blog/interplanetary_commerce.md index 92dd611664..7b8ea91cf3 100644 --- a/app/content/blog/interplanetary_commerce.md +++ b/app/content/blog/interplanetary_commerce.md @@ -1,7 +1,9 @@ +++ + title = "Interplanetary Commerce" date = "2021-04-08" description = "OS-level commercial primitives." +summary = "Speculative essay on economic systems in distributed networks, arguing that Urbit's ownership model enables direct peer-to-peer commerce without intermediary platforms taking transaction fees." tags = ["bitcoin"] search_terms = [ "interplanetary commerce", diff --git a/app/content/blog/introducing-os1.md b/app/content/blog/introducing-os1.md index fa53557525..7c890ab106 100644 --- a/app/content/blog/introducing-os1.md +++ b/app/content/blog/introducing-os1.md @@ -1,7 +1,9 @@ +++ + title = "Introducing OS 1" date = "2020-04-29" description = "OS 1 is somewhere between ‘productivity software’ and a ‘social network’. We think it’s the beginning of an altogether new breed of social computing." +summary = "Launch announcement for Urbit operating system upgrade featuring Landscape interface, graph store data structure, improved network performance, and expanded application ecosystem." search_terms = [ "os1", "introducing os1", diff --git a/app/content/blog/introduction-to-the-combine-dao.md b/app/content/blog/introduction-to-the-combine-dao.md index e8d9d78692..53114da4a8 100644 --- a/app/content/blog/introduction-to-the-combine-dao.md +++ b/app/content/blog/introduction-to-the-combine-dao.md @@ -1,7 +1,9 @@ +++ + title = "Introduction to the Combine DAO" date = "2022-07-01" description = "Inside the mind of the Combine" +summary = "Whitepaper describing DAO governance architecture implementing bicameral decision-making, combining star-based voting with identity verification for decentralized organizational coordination." search_terms = [ "combine dao", "urbit foundation", diff --git a/app/content/blog/io-in-hoon.md b/app/content/blog/io-in-hoon.md index deee6922ea..2c0d760ff7 100644 --- a/app/content/blog/io-in-hoon.md +++ b/app/content/blog/io-in-hoon.md @@ -1,6 +1,8 @@ +++ + title = "Input and Output in Hoon" description = "Let's talk about IO in Urbit." +summary = "Philip Monk compares imperative, monadic, and state machine IO paradigms, defending Urbit's 90% state machine approach for permanence and robustness, with monadic threads for complex IO sequences that don't require upgradeability." date = "2020-12-15" search_terms = [ "hoon io", diff --git a/app/content/blog/iot.md b/app/content/blog/iot.md index 5145cec745..46f3d55dbe 100644 --- a/app/content/blog/iot.md +++ b/app/content/blog/iot.md @@ -1,7 +1,9 @@ +++ + title = "Lunar Urbit and the Internet of Things" date = "2021-04-29" description = "Potential future use cases of moons for industry and consumers" +summary = "Jonathan Paprocki argues Urbit moons solve IoT's privacy, security, and vendor lock-in problems through self-authenticating identities, deterministic state, source-independent packet routing, and peer-to-peer data markets for industrial applications like agriculture." search_terms = [ "lunar urbit", "internet of things", diff --git a/app/content/blog/landscape-a-portrait.md b/app/content/blog/landscape-a-portrait.md index e6b1a03214..4727add581 100644 --- a/app/content/blog/landscape-a-portrait.md +++ b/app/content/blog/landscape-a-portrait.md @@ -1,7 +1,9 @@ +++ + title = "Landscape: A Portrait" date = "2019-09-02" description = "On the latest Urbit user interface, and the interfaces to come." +summary = "Visual and technical introduction to Landscape interface design, explaining component architecture, interaction patterns, and principles guiding user experience development." aliases = [ "/posts/essays/landscape-a-portrait/", "/posts/landscape-a-portrait" diff --git a/app/content/blog/layer-2-faq.md b/app/content/blog/layer-2-faq.md index 5b4d33288c..39fd0eadfe 100644 --- a/app/content/blog/layer-2-faq.md +++ b/app/content/blog/layer-2-faq.md @@ -1,7 +1,9 @@ +++ + title = "Layer 2 FAQ" date = "2022-03-01" description = "Answers to all your lingering L2 questions." +summary = "Frequently asked questions addressing Urbit's relationship to blockchain layer 2 solutions, clarifying architectural distinctions and explaining why Urbit doesn't require additional scaling layers." search_terms = [ "layer 2 faq", "l2 planets", diff --git a/app/content/blog/llms-on-urbit.md b/app/content/blog/llms-on-urbit.md index 7b65034a73..f0eb14429b 100644 --- a/app/content/blog/llms-on-urbit.md +++ b/app/content/blog/llms-on-urbit.md @@ -1,7 +1,9 @@ +++ + title = "LLMs on Urbit" date = "2026-1-27" description = "A walkthrough of how to use current Urbit LLM tooling by ~niblyx-malnus" +summary = "Analysis of running large language models on personal servers, discussing privacy advantages, local inference options, and architectures for combining AI capabilities with owned infrastructure." # aliases = [] [extra] diff --git a/app/content/blog/magic.md b/app/content/blog/magic.md index 9fb94167cb..42d38c9797 100644 --- a/app/content/blog/magic.md +++ b/app/content/blog/magic.md @@ -1,7 +1,9 @@ +++ + title = "Magic" date = "2016-05-15" description = "A thought-experiment to explain the Urbit user experience." +summary = "Philosophical essay on technology's role in human experience, arguing for systems that augment rather than replace natural capabilities, and examining aesthetics of computing interfaces." search_terms = [ "urbit user experience", "personal server vision", diff --git a/app/content/blog/metaphase.md b/app/content/blog/metaphase.md index 9e17f76a99..56144ce5d4 100644 --- a/app/content/blog/metaphase.md +++ b/app/content/blog/metaphase.md @@ -1,7 +1,9 @@ +++ + title = "Metaphase" date = "2020-12-08" description = "On the upcoming and foregoing Landscape lifecycles, and other forms of mitosis across the Urbit project." +summary = "Vision statement describing Urbit's development methodology, arguing for iterative evolution through actual use rather than theoretical design, and explaining community-driven improvement cycles." search_terms = [ "landscape lifecycle", "release streams", diff --git a/app/content/blog/nockmas-2025-day-1.md b/app/content/blog/nockmas-2025-day-1.md index 1c676f6ab6..d22bd9b135 100644 --- a/app/content/blog/nockmas-2025-day-1.md +++ b/app/content/blog/nockmas-2025-day-1.md @@ -1,7 +1,9 @@ +++ + title = "Nockmas 2025: Day 1" date = "2025-12-25" description = "12 days of Nockmas: Address, opcode 0" +summary = "Covers opcode 0 (Address), the fas slot operator for navigating Nock nouns as binary trees using even numbers for left branches and odd numbers for right branches." # aliases = [] [extra] diff --git a/app/content/blog/nockmas-2025-day-10.md b/app/content/blog/nockmas-2025-day-10.md index 6b3453bd6d..f3f0420dd9 100644 --- a/app/content/blog/nockmas-2025-day-10.md +++ b/app/content/blog/nockmas-2025-day-10.md @@ -1,7 +1,9 @@ +++ + title = "Nockmas 2025: Day 10" date = "2026-01-03" description = "12 days of Nockmas: Invoke, opcode 9" +summary = "Covers opcode 9 (Invoke), evaluating a core from formula c then executing the arm at address b within that core with the core itself as subject." # aliases = [] [extra] diff --git a/app/content/blog/nockmas-2025-day-11.md b/app/content/blog/nockmas-2025-day-11.md index 8bb7b11f19..590fecadd9 100644 --- a/app/content/blog/nockmas-2025-day-11.md +++ b/app/content/blog/nockmas-2025-day-11.md @@ -1,7 +1,9 @@ +++ + title = "Nockmas 2025: Day 11" date = "2026-01-04" description = "12 days of Nockmas: Edit, opcode 10" +summary = "Covers opcode 10 (Edit), the hax # operator replacing a noun at a given address within a structure with a new value, used for gate calls and memory optimization." # aliases = [] [extra] diff --git a/app/content/blog/nockmas-2025-day-12.md b/app/content/blog/nockmas-2025-day-12.md index 2f7b022c88..51f350dc37 100644 --- a/app/content/blog/nockmas-2025-day-12.md +++ b/app/content/blog/nockmas-2025-day-12.md @@ -1,7 +1,9 @@ +++ + title = "Nockmas 2025: Day 12" date = "2026-01-05" description = "12 days of Nockmas: Hint, opcode 11" +summary = "Covers opcode 11 (Hint), attaching metadata to Nock expressions without affecting evaluation, supporting static tags and dynamic hints for runtime optimizations." # aliases = [] [extra] diff --git a/app/content/blog/nockmas-2025-day-2.md b/app/content/blog/nockmas-2025-day-2.md index 164237c0a9..c8aba26c63 100644 --- a/app/content/blog/nockmas-2025-day-2.md +++ b/app/content/blog/nockmas-2025-day-2.md @@ -1,7 +1,9 @@ +++ + title = "Nockmas 2025: Day 2" date = "2025-12-26" description = "12 days of Nockmas: Constant, opcode 1" +summary = "Covers opcode 1 (Constant), which returns its argument b while ignoring the subject, used for storing data and executable Nock expressions for later evaluation." # aliases = [] [extra] diff --git a/app/content/blog/nockmas-2025-day-3.md b/app/content/blog/nockmas-2025-day-3.md index 24179d100a..ba0af44cc1 100644 --- a/app/content/blog/nockmas-2025-day-3.md +++ b/app/content/blog/nockmas-2025-day-3.md @@ -1,7 +1,9 @@ +++ + title = "Nockmas 2025: Day 3" date = "2025-12-27" description = "12 days of Nockmas: Evaluate, opcode 2" +summary = "Covers opcode 2 (Evaluate), which computes a new subject from formula b and a new formula from formula c, enabling dynamic code execution and metaprogramming." # aliases = [] [extra] diff --git a/app/content/blog/nockmas-2025-day-4.md b/app/content/blog/nockmas-2025-day-4.md index 85fb62daa1..1da5484003 100644 --- a/app/content/blog/nockmas-2025-day-4.md +++ b/app/content/blog/nockmas-2025-day-4.md @@ -1,7 +1,9 @@ +++ + title = "Nockmas 2025: Day 4" date = "2025-12-28" description = "12 days of Nockmas: Cell Check, opcode 3" +summary = "Covers opcode 3 (Cell Check), the wut ? operator testing whether a noun is a cell (returns 0) or atom (returns 1), used for type discrimination." # aliases = [] [extra] diff --git a/app/content/blog/nockmas-2025-day-5.md b/app/content/blog/nockmas-2025-day-5.md index e4e859ebd7..2d5a4cfb8b 100644 --- a/app/content/blog/nockmas-2025-day-5.md +++ b/app/content/blog/nockmas-2025-day-5.md @@ -1,7 +1,9 @@ +++ + title = "Nockmas 2025: Day 5" date = "2025-12-29" description = "12 days of Nockmas: Increment, opcode 4" +summary = "Covers opcode 4 (Increment), the lus + operator adding 1 to an atom, Nock's only arithmetic primitive from which all other arithmetic must be built." # aliases = [] [extra] diff --git a/app/content/blog/nockmas-2025-day-6.md b/app/content/blog/nockmas-2025-day-6.md index a9a79c4cd6..e09e217a6a 100644 --- a/app/content/blog/nockmas-2025-day-6.md +++ b/app/content/blog/nockmas-2025-day-6.md @@ -1,7 +1,9 @@ +++ + title = "Nockmas 2025: Day 6" date = "2025-12-30" description = "12 days of Nockmas: Equality Check, opcode 5" +summary = "Covers opcode 5 (Equality Check), the tis = operator testing deep structural equality between two nouns, returning 0 if equal and 1 if not." # aliases = [] [extra] diff --git a/app/content/blog/nockmas-2025-day-7.md b/app/content/blog/nockmas-2025-day-7.md index 6e9327d65b..06b0a8552f 100644 --- a/app/content/blog/nockmas-2025-day-7.md +++ b/app/content/blog/nockmas-2025-day-7.md @@ -1,7 +1,9 @@ +++ + title = "Nockmas 2025: Day 7" date = "2025-12-31" description = "12 days of Nockmas: Conditional, opcode 6" +summary = "Covers opcode 6 (Conditional), evaluating a test formula and returning either branch c for true (0) or d for false (1), implementing if-then-else logic." # aliases = [] [extra] diff --git a/app/content/blog/nockmas-2025-day-8.md b/app/content/blog/nockmas-2025-day-8.md index af0218e1c6..3ef3320292 100644 --- a/app/content/blog/nockmas-2025-day-8.md +++ b/app/content/blog/nockmas-2025-day-8.md @@ -1,7 +1,9 @@ +++ + title = "Nockmas 2025: Day 8" date = "2026-01-01" description = "12 days of Nockmas: Compose, opcode 7" +summary = "Covers opcode 7 (Compose), evaluating b then using that result as the subject for c, implementing the pipe pattern for sequential function composition." # aliases = [] [extra] diff --git a/app/content/blog/nockmas-2025-day-9.md b/app/content/blog/nockmas-2025-day-9.md index e99f1a1d11..2882da1aae 100644 --- a/app/content/blog/nockmas-2025-day-9.md +++ b/app/content/blog/nockmas-2025-day-9.md @@ -1,7 +1,9 @@ +++ + title = "Nockmas 2025: Day 9" date = "2026-01-02" description = "12 days of Nockmas: Extend, opcode 8" +summary = "Covers opcode 8 (Extend), pinning a new value to the head of the subject then evaluating the body, implementing variable binding where the new value is accessible at address 2." # aliases = [] [extra] diff --git a/app/content/blog/nockmas-2025-welcome.md b/app/content/blog/nockmas-2025-welcome.md index d6b53fec01..f8dc5c9033 100644 --- a/app/content/blog/nockmas-2025-welcome.md +++ b/app/content/blog/nockmas-2025-welcome.md @@ -1,7 +1,9 @@ +++ + title = "Nockmas 2025: Day 0" date = "2025-12-24" description = "12 days of Nockmas: Intoducing autocons" +summary = "Introduces autocons, Nock's fundamental cell construction rule where formula structure becomes result structure, making cell construction free and enabling Nock's minimal design." # aliases = [] [extra] diff --git a/app/content/blog/nockpu.md b/app/content/blog/nockpu.md index 53f14a8d9a..e9fa55f132 100644 --- a/app/content/blog/nockpu.md +++ b/app/content/blog/nockpu.md @@ -1,7 +1,9 @@ +++ + title = "NockPU" date = "2023-08-02" description = "A light technical description of NockPU, a hardware system for running Nock" +summary = "Noah Kumin describes ~mopfel-winrux's NockPU hardware project, explaining how a stackless, tree-traversal-optimized processor differs from von Neumann architecture and could enable ultra-efficient Nock execution on bare metal." search_terms = [ "nockpu", "nock hardware", diff --git a/app/content/blog/olif-and-urbit-ids.md b/app/content/blog/olif-and-urbit-ids.md index 41c114b529..653536164f 100644 --- a/app/content/blog/olif-and-urbit-ids.md +++ b/app/content/blog/olif-and-urbit-ids.md @@ -1,7 +1,9 @@ +++ + title = "Olif and Urbit IDs" date = "2026-02-26" description = "An Olfactive rendering of Urbit Address Space" +summary = "Technical specification for Olif identity format extension, explaining compatibility with existing Urbit ID standards and advantages for specific application use cases." # aliases = [] [extra] diff --git a/app/content/blog/on-christopher-alexander.md b/app/content/blog/on-christopher-alexander.md index 659f3546c7..9b9ab4ae48 100644 --- a/app/content/blog/on-christopher-alexander.md +++ b/app/content/blog/on-christopher-alexander.md @@ -1,7 +1,9 @@ +++ + title = "On Christopher Alexander" date = "2021-07-19" description = "An overview of his writing and relevance" +summary = "Essay examining architect Christopher Alexander's influence on Urbit design philosophy, discussing patterns language, town building principles, and technology's relationship to human flourishing." search_terms = [ "christopher alexander", "pattern language", diff --git a/app/content/blog/pin-the-face-that-launches-a-thousand-ships.md b/app/content/blog/pin-the-face-that-launches-a-thousand-ships.md index 47976340e5..9b7d753833 100644 --- a/app/content/blog/pin-the-face-that-launches-a-thousand-ships.md +++ b/app/content/blog/pin-the-face-that-launches-a-thousand-ships.md @@ -1,7 +1,9 @@ +++ + title = "Pin the Face that Launches a Thousand Ships" date = "2023-04-07" description = "A guest post by ~nospex-larsut" +summary = "~nospex-larsut addresses standard hesitations to learning Hoon, arguing that Hoon's difficulty creates opportunity, Urbit's momentum is accelerating with new apps and hosting options, and learning now positions developers to benefit from early involvement." search_terms = [ "learn hoon", "hoon hesitations", diff --git a/app/content/blog/pki-maze.md b/app/content/blog/pki-maze.md index e087e470e8..63e122eb6f 100644 --- a/app/content/blog/pki-maze.md +++ b/app/content/blog/pki-maze.md @@ -1,7 +1,9 @@ +++ + title = "Designing a Permanent Personal Identity" date = "2019-11-26" description = "A public key infrastructure (PKI) is a system for binding a set of keys to a name. Sometimes a small amount of metadata is included." +summary = "Philip Monk explores Urbit's PKI design through an idea maze, explaining the tradeoffs between comets (plentiful, self-sovereign, impermanent), planets (scarce, permanent, self-sovereign), and moons (plentiful, permanent, planet-controlled) identities." search_terms = [ "permanent identity", "urbit pki", diff --git a/app/content/blog/platform-decay.md b/app/content/blog/platform-decay.md index 47b47d2a59..fffd60bcb5 100644 --- a/app/content/blog/platform-decay.md +++ b/app/content/blog/platform-decay.md @@ -1,7 +1,9 @@ +++ + title = "Platform Decay, Decentralized Marketplaces, and Urbit" date = "2020-05-07" description = "Urbit is calm computing. Calm commerce follows naturally. " +summary = "Nicholas Simmons argues e-commerce platforms decay toward exploitation, advocating decentralized marketplaces on Urbit with personal data ownership, neutral reputation systems, and calm commerce to restore fair vendor-customer relationships." search_terms = [ "platform decay", "decentralized marketplaces", diff --git a/app/content/blog/precepts-discussion.md b/app/content/blog/precepts-discussion.md index be3b8661d0..f8e01acaef 100644 --- a/app/content/blog/precepts-discussion.md +++ b/app/content/blog/precepts-discussion.md @@ -1,7 +1,9 @@ +++ + title = "Precepts: Discussion" date = "2020-03-17" description = "The precepts aren’t arguments. We discuss and justify them here." +summary = "Philip Monk justifies Urbit's precepts across general design, specific design, attitude, theory, text style, and real software, defending mechanical simplicity, state machines for permanence, and deterministic computing as essential to lasting software." search_terms = [ "precepts discussion", "urbit principles", diff --git a/app/content/blog/precepts.md b/app/content/blog/precepts.md index ea4ce61e2e..a2a8b4ae1a 100644 --- a/app/content/blog/precepts.md +++ b/app/content/blog/precepts.md @@ -1,7 +1,9 @@ +++ + title = "Precepts" date = "2020-03-17" description = "Technical maxims that define Urbit's approach to engineering." +summary = "Formal statement of core principles including simplicity, durability, ownership, and user control, serving as decision framework for ongoing development work." search_terms = [ "urbit precepts", "engineering principles", diff --git a/app/content/blog/providers.md b/app/content/blog/providers.md index 6ecf83dbec..7969d5c3cf 100644 --- a/app/content/blog/providers.md +++ b/app/content/blog/providers.md @@ -1,7 +1,9 @@ +++ + title = "Providers" date = "2020-08-17" description = "We’ve always assumed that providers would have to come into existence sooner or later. By the look of it, that time is now. Tlon and a few others have provider-like services in the works." +summary = "Ecosystem announcement documenting third-party hosting services, comparing offerings, pricing, and features while maintaining standards for reliability and data portability." search_terms = [ "urbit providers", "hosting providers", diff --git a/app/content/blog/pseudonymous-reputation.md b/app/content/blog/pseudonymous-reputation.md index 78f3f4f29b..c03ca47cb6 100644 --- a/app/content/blog/pseudonymous-reputation.md +++ b/app/content/blog/pseudonymous-reputation.md @@ -1,7 +1,9 @@ +++ + title = "Building Your DAO with Pseudonymous Reputation on Urbit" date = "2022-07-19" description = "Using Urbit ID’s pseudonymous reputation model, DAO participants know Urbit ID holders’ past behavior before relying on them, and without sacrificing anonymity." +summary = "Anthony Arroyo explains how Combine DAO uses Urbit ID's pseudonymous reputation to select members based on past network behavior, solving DAO trust and accountability issues while maintaining anonymity and avoiding token-gated limitations." search_terms = [ "pseudonymous reputation", "urbit id", diff --git a/app/content/blog/rollups.md b/app/content/blog/rollups.md index 11ad967af3..9f02fa650e 100644 --- a/app/content/blog/rollups.md +++ b/app/content/blog/rollups.md @@ -1,7 +1,9 @@ +++ + title = "The Gang Solves the Gas Crisis" date = "2021-05-13" description = "How we're making Urbit ID affordable again" +summary = "Jonathan Paprocki explains Tlon's naive rollups layer-2 solution for reducing Urbit ID gas costs by 65x, detailing user experience changes, one-way migration, roller setup, and security guarantees that preserve ship sovereignty." search_terms = [ "gas crisis", "layer 2", diff --git a/app/content/blog/security-and-continuity.md b/app/content/blog/security-and-continuity.md index eeb55a370b..75e068d063 100644 --- a/app/content/blog/security-and-continuity.md +++ b/app/content/blog/security-and-continuity.md @@ -1,6 +1,8 @@ +++ + title = "Security and Continuity" description = "An update on our primary infrastructure milestones for 2020." +summary = "Discussion of system resilience strategies including backup procedures, disaster recovery planning, and long-term data preservation for personal servers." date = "2020-11-30" search_terms = [ "security continuity", diff --git a/app/content/blog/security-audit.md b/app/content/blog/security-audit.md index d8d277f7de..8ae378bb8a 100644 --- a/app/content/blog/security-audit.md +++ b/app/content/blog/security-audit.md @@ -1,6 +1,8 @@ +++ + title = "Ames Security Audit and the Future of the Protocol" description = "Ames’ design has unparalleled potential to deter, mitigate, and recover from attacks, since every packet is authenticated and encrypted and backed by a stable, decentralized PKI." +summary = "Article examining security audit." date = "2020-12-17" search_terms = [ "ames security", diff --git a/app/content/blog/simple-durable-yours.md b/app/content/blog/simple-durable-yours.md index ddaa27adbf..de07f33789 100644 --- a/app/content/blog/simple-durable-yours.md +++ b/app/content/blog/simple-durable-yours.md @@ -1,7 +1,9 @@ +++ + title = "Simple, Durable, Yours" date = "2019-10-16" description = "We built Urbit from scratch to be a system that’s simple, durable, and yours. Everything that computing today is not — but should be." +summary = "Philosophical framing of Urbit's design goals, explaining how simplicity enables durability and why user ownership is fundamental to trustworthy computing." search_terms = [ "simple durable yours", "urbit overview", diff --git a/app/content/blog/smart-home-of-the-future.md b/app/content/blog/smart-home-of-the-future.md index 22a2124550..5c367b5cf1 100644 --- a/app/content/blog/smart-home-of-the-future.md +++ b/app/content/blog/smart-home-of-the-future.md @@ -1,7 +1,9 @@ +++ + title = "The Smart Home of the Future" date = "2022-08-04" description = "Homes are getting smarter. A smart home is no longer just a collection of smart devices but a superorganism of data-collecting objects. These people and devices who use and inhabit these homes form a complex socio-technical system. What is the future of the smart home and how will Urbit fit into it?" +summary = "This grant research explores smart home privacy needs, arguing Urbit's identity model should prioritize access control over legible reputation, enabling communal computing while respecting contextual integrity and household relationships." search_terms = [ "smart home", "communal computing", diff --git a/app/content/blog/sovereign-intelligence.md b/app/content/blog/sovereign-intelligence.md index 4f04872264..c1a74dd91c 100644 --- a/app/content/blog/sovereign-intelligence.md +++ b/app/content/blog/sovereign-intelligence.md @@ -1,7 +1,9 @@ +++ + title = "Sovereign Intelligence" date = "2026-1-13" description = "Urbit offers a bicameral future for personal AI. One side stable. One side fluid. Each stronger with the other" +summary = "Vision statement for personal AI systems running on owned infrastructure, arguing for models that augment rather than replace human decision-making while protecting user privacy." # aliases = [] [extra] diff --git a/app/content/blog/stable-arvo.md b/app/content/blog/stable-arvo.md index 8883f98fc7..e4f6475e69 100644 --- a/app/content/blog/stable-arvo.md +++ b/app/content/blog/stable-arvo.md @@ -1,7 +1,9 @@ +++ + title = "Stable Arvo" date = "2019-11-19" description = "This year we set out to get Arvo to a point that we can credibly call ‘stable.' " +summary = "Milestone announcement for Arvo operating system stabilization, describing testing completion, API freeze, migration guides for existing applications, and long-term support commitments." search_terms = [ "stable arvo", "kernel stability", diff --git a/app/content/blog/state-of-urbit.md b/app/content/blog/state-of-urbit.md index 8b5bd24625..abddebff47 100644 --- a/app/content/blog/state-of-urbit.md +++ b/app/content/blog/state-of-urbit.md @@ -1,7 +1,9 @@ +++ + title = "State of Urbit" date = "2021-08-24" description = "A year in review" +summary = "Comprehensive progress report covering technical development, community growth, application ecosystem expansion, and strategic priorities for ongoing platform evolution." search_terms = [ "state of urbit", "urbit year review", diff --git a/app/content/blog/subassembly-hackathon-2024.md b/app/content/blog/subassembly-hackathon-2024.md index 0a7b008f49..610baa6ce3 100644 --- a/app/content/blog/subassembly-hackathon-2024.md +++ b/app/content/blog/subassembly-hackathon-2024.md @@ -1,7 +1,9 @@ +++ + title = "Subssembly Hackathon 2024" date = "2024-09-16" description = "Use Login with Urbit ID in your app and win Urbit Stars" +summary = "Article examining community event." search_terms = [ "subassembly hackathon", "login with urbit id", diff --git a/app/content/blog/the-100-year-computer.md b/app/content/blog/the-100-year-computer.md index e736ebee4e..35962e3412 100644 --- a/app/content/blog/the-100-year-computer.md +++ b/app/content/blog/the-100-year-computer.md @@ -1,7 +1,9 @@ +++ + title = "The 100-Year Computer" date = "2019-05-13" description = 'One way to think about Urbit: as a "100-year computer."' +summary = "Galen Wolfe-Pauly describes Urbit as a durable, reliable computer designed to never lose data, update itself continuously, and remain functional for decades without user intervention or ads." aliases = [ "/posts/essays/the-100-year-computer/", "/posts/the-100-year-computer" diff --git a/app/content/blog/the-dao-as-a-lesson-in-decentralized-governance.md b/app/content/blog/the-dao-as-a-lesson-in-decentralized-governance.md index 0dfa5d4489..2a5e908b96 100644 --- a/app/content/blog/the-dao-as-a-lesson-in-decentralized-governance.md +++ b/app/content/blog/the-dao-as-a-lesson-in-decentralized-governance.md @@ -1,7 +1,9 @@ +++ + title = "The DAO as a Lesson in Decentralized Governance" date = "2016-06-23" description = "What's the right lesson for the decentralization community to learn from the collapse of the DAO?" +summary = "Case study analysis of Ethereum DAO collapse, examining smart contract vulnerabilities, governance failures, and lessons applied to Urbit's constitutional framework." search_terms = [ "dao collapse", "decentralized governance", diff --git a/app/content/blog/the-missing-middle.md b/app/content/blog/the-missing-middle.md index d820476f63..6fd93f10b6 100644 --- a/app/content/blog/the-missing-middle.md +++ b/app/content/blog/the-missing-middle.md @@ -1,7 +1,9 @@ +++ + title = "The Missing Middle" date = "2020-05-25" description = "Urbit stars can facilitate a flexible continuum of community norms." +summary = "Analysis of gaps in current internet infrastructure, describing mid-tier services and protocols that don't fit binary choices between massive platforms and individual self-hosting." search_terms = [ "missing middle", "urbit stars", diff --git a/app/content/blog/the-shape-of-dao-governance-to-come.md b/app/content/blog/the-shape-of-dao-governance-to-come.md index cc7736d1b7..25d16961a0 100644 --- a/app/content/blog/the-shape-of-dao-governance-to-come.md +++ b/app/content/blog/the-shape-of-dao-governance-to-come.md @@ -1,7 +1,9 @@ +++ + title = "The Shape of DAO Governance to Come" date = "2022-08-17" description = "When building the Combine DAO, we conducted a survey of DAO governance and tooling and came to the conclusion that the many theoretical approaches to the problem of governance were tied to the implementation details of the DAO stack. Since we were building everything on Urbit—as opposed to through the typical combination of Solidity contracts, Web2 tools and Snapshot—we realized that we’d have to do some rethinking. A new approach for a new stack." +summary = "Forward-looking discussion on decentralized organizational evolution, predicting patterns of coordination and exploring how Urbit's identity layer enables new governance models." search_terms = [ "dao governance", "combine dao", diff --git a/app/content/blog/the-state-of-landscape.md b/app/content/blog/the-state-of-landscape.md index 7ec2af4491..c67b4ddc85 100644 --- a/app/content/blog/the-state-of-landscape.md +++ b/app/content/blog/the-state-of-landscape.md @@ -1,7 +1,9 @@ +++ + title = "The State of Landscape" date = "2019-05-15" description = "An update on the state of Landscape and the Urbit network." +summary = "Status report on Landscape interface development covering feature releases, usability improvements, performance optimizations, and roadmap for upcoming releases." aliases = [ "/posts/essays/the-state-of-landscape", "/posts/the-state-of-landscape" diff --git a/app/content/blog/the-understanding-urbit-podcast.md b/app/content/blog/the-understanding-urbit-podcast.md index 8e4e3d677d..06445fc4dc 100644 --- a/app/content/blog/the-understanding-urbit-podcast.md +++ b/app/content/blog/the-understanding-urbit-podcast.md @@ -1,7 +1,9 @@ +++ + title = "The Understanding Urbit Podcast" date = "2020-04-02" description = "An interview-based podcast series about the Urbit project, as told by those working on it." +summary = "Announcement of educational podcast series making Urbit concepts accessible through interviews, technical discussions, and community stories." search_terms = [ "understanding urbit podcast", "urbit podcast", diff --git a/app/content/blog/the-urbit-address-space.md b/app/content/blog/the-urbit-address-space.md index dabd2910c6..0d1a77c8b5 100644 --- a/app/content/blog/the-urbit-address-space.md +++ b/app/content/blog/the-urbit-address-space.md @@ -1,7 +1,9 @@ +++ + title = "The Urbit Address Space" date = "2016-05-15" description = "An overview of Urbit's cryptographic address space." +summary = "Technical specification for cryptographic identity system, explaining galaxy-planet-moon hierarchy, star minting economics, and how address space enables secure communication." search_terms = [ "urbit address space", "urbit ships", diff --git a/app/content/blog/tools-of-our-own.md b/app/content/blog/tools-of-our-own.md index 5289896666..ed04b7acda 100644 --- a/app/content/blog/tools-of-our-own.md +++ b/app/content/blog/tools-of-our-own.md @@ -1,7 +1,9 @@ +++ + title = "Tools of Our Own" date = "2020-05-12" description = "What is a digital environment? What does it mean to shape your own digital environment?" +summary = "Manifesto for building personal computing tools users control, arguing against platform dependency and describing benefits of self-hosted, open source software." search_terms = [ "tools of our own", "digital environment", diff --git a/app/content/blog/toward-a-frozen-operating-system.md b/app/content/blog/toward-a-frozen-operating-system.md index 1f0eead833..cc3e859696 100644 --- a/app/content/blog/toward-a-frozen-operating-system.md +++ b/app/content/blog/toward-a-frozen-operating-system.md @@ -1,7 +1,9 @@ +++ + title = "Toward a Frozen Operating System" date = "2017-05-09" description = "Is it possible to freeze an entire OS?" +summary = "Philosophical essay on software evolution, discussing when systems should stabilize versus continue changing, and Urbit's approach through Hoon's immutability guarantees." search_terms = [ "frozen operating system", "kelvin versioning", diff --git a/app/content/blog/toward-a-new-clay.md b/app/content/blog/toward-a-new-clay.md index 087800fdca..bd6cb4c111 100644 --- a/app/content/blog/toward-a-new-clay.md +++ b/app/content/blog/toward-a-new-clay.md @@ -1,7 +1,9 @@ +++ + title = "Toward a New %clay" date = "2016-07-13" description = "Urbit's revision-control system, %clay, is itself due for a (medium-sized) revision!" +summary = "Curtis Yarvin proposes comprehensive redesign of Urbit's %clay revision control system, addressing storage models, Unix mounting, merge semantics, and security while inviting community contributions to improve the typed DVCS." search_terms = [ "clay revision control", "urbit filesystem", diff --git a/app/content/blog/urbit-and-bitcoin.md b/app/content/blog/urbit-and-bitcoin.md index c94a7613d1..65363bb6a6 100644 --- a/app/content/blog/urbit-and-bitcoin.md +++ b/app/content/blog/urbit-and-bitcoin.md @@ -1,6 +1,8 @@ +++ + title = "Urbit and Bitcoin" description = "A sound money deserves a sound computer." +summary = "Analysis of cryptocurrency integration with Urbit, discussing Bitcoin philanthropy, Azimuth transactions on Ethereum, and synergies between different cryptographic asset systems." date = "2019-10-16" tags = ["bitcoin"] search_terms = [ diff --git a/app/content/blog/urbit-and-the-blockchain.md b/app/content/blog/urbit-and-the-blockchain.md index 91b3cd99d8..9b48720df7 100644 --- a/app/content/blog/urbit-and-the-blockchain.md +++ b/app/content/blog/urbit-and-the-blockchain.md @@ -1,7 +1,9 @@ +++ + title = "Urbit and the Blockchain Wars" date = "2017-09-24" description = "A bit about the 'idea maze' of choosing to bootstrap from Ethereum." +summary = "Curtis Yarvin explains Urbit's pragmatic decision to bootstrap on Ethereum despite criticisms, detailing governance migration options, security models, and why Urbit uses Ethereum as a land registry rather than endorsing the platform." search_terms = [ "urbit blockchain", "ethereum bootstrap", diff --git a/app/content/blog/urbit-creator-daos.md b/app/content/blog/urbit-creator-daos.md index cae9ad5601..e2bba28eab 100644 --- a/app/content/blog/urbit-creator-daos.md +++ b/app/content/blog/urbit-creator-daos.md @@ -1,7 +1,9 @@ +++ + title = "Urbit + Creator DAOs with Justin Murphy" date = "2022-10-05" description = "Creator DAOs are blank slates, new foundational cryptographic patterns just beginning to take shape. Justin Murphy thinks Urbit is the most obvious place to start building one." +summary = "Justin Murphy builds Other Life as a Creator DAO on Urbit, demonstrating how Straw enables democratic publishing, Ballot allows decentralized membership management, and Urbit's P2P real estate provides unprecedented durability and ownership." search_terms = [ "creator dao", "justin murphy", diff --git a/app/content/blog/urbit-for-creators.md b/app/content/blog/urbit-for-creators.md index b8935e7114..42d05ad183 100644 --- a/app/content/blog/urbit-for-creators.md +++ b/app/content/blog/urbit-for-creators.md @@ -1,7 +1,9 @@ +++ + title = "Urbit Is for Creators" date = "2021-12-09" description = "Urbit is for creators who are ready to wake up from this bad dream." +summary = "Noah Kumin argues Urbit offers creators freedom from algorithmic manipulation and platform dependency, enabling direct peer-to-peer distribution, ownership of work, and sustainable communities through durable infrastructure." search_terms = [ "urbit for creators", "creator economy", diff --git a/app/content/blog/urbit-for-normies.md b/app/content/blog/urbit-for-normies.md index 10ae9b165a..8bc51feda7 100644 --- a/app/content/blog/urbit-for-normies.md +++ b/app/content/blog/urbit-for-normies.md @@ -1,7 +1,9 @@ +++ + title = "Urbit for Normies" date = "2020-02-11" description = "A layperson’s guide to the coming new internet." +summary = "Accessibility guide explaining Urbit concepts in plain language, addressing common confusion points, and providing entry paths for non-technical users." search_terms = [ "urbit for normies", "layperson guide", diff --git a/app/content/blog/urbit-grants-and-mid-2019-gifts.md b/app/content/blog/urbit-grants-and-mid-2019-gifts.md index d5b93ab1e0..96f90f98fb 100644 --- a/app/content/blog/urbit-grants-and-mid-2019-gifts.md +++ b/app/content/blog/urbit-grants-and-mid-2019-gifts.md @@ -1,7 +1,9 @@ +++ + title = "Urbit Grants and mid-2019 Gifts" date = "2019-06-09" description = "Announcing an upcoming Urbit grants program and star gifts for Mid-2019." +summary = "Article examining grants distribution." aliases = [ "/posts/essays/urbit-grants-and-mid-2019-gifts", "/posts/urbit-grants-and-mid-2019-gifts" diff --git a/app/content/blog/urbit-is-for-communities.md b/app/content/blog/urbit-is-for-communities.md index 87a96be784..e109102f21 100644 --- a/app/content/blog/urbit-is-for-communities.md +++ b/app/content/blog/urbit-is-for-communities.md @@ -1,7 +1,9 @@ +++ + title = "Urbit is for Communities" date = "2020-03-22" description = "Urbit is for giving communities the tools to shape their own environments; for us all to feel a sense of life and self-directedness in the digital world." +summary = "Announcement of Urbit 0.8.0 release emphasizing community features, group governance tools, and applications supporting collective organization and collaboration." search_terms = [ "urbit for communities", "community tools", diff --git a/app/content/blog/urbithost-interview.md b/app/content/blog/urbithost-interview.md index d9fea8aad8..4503c2ff7c 100644 --- a/app/content/blog/urbithost-interview.md +++ b/app/content/blog/urbithost-interview.md @@ -1,7 +1,9 @@ +++ + title = "An Interview with UrbitHost" date = "2021-08-19" description = "Interview with the founder of UrbitHost ~lavlyn-litmeg" +summary = "Article covering conversation and technical deep-dive, examining technical deep-dive and conversation." search_terms = [ "urbithost", "hosting provider", diff --git a/app/content/blog/using-urbit-in-2023.md b/app/content/blog/using-urbit-in-2023.md index b10b1d5640..0dd943b8a0 100644 --- a/app/content/blog/using-urbit-in-2023.md +++ b/app/content/blog/using-urbit-in-2023.md @@ -1,7 +1,9 @@ +++ + title = "Using Urbit in 2023" date = "2023-02-06" description = "There are more ways to run Urbit than ever, and more options coming soon." +summary = "Practical guide for new users covering initial setup, basic operations, landscape navigation, application recommendations, and community involvement opportunities." search_terms = [ "using urbit 2023", "hosting providers", diff --git a/app/content/blog/value-of-address-space-pt1.md b/app/content/blog/value-of-address-space-pt1.md index 23da085fb1..1d01ab0c17 100644 --- a/app/content/blog/value-of-address-space-pt1.md +++ b/app/content/blog/value-of-address-space-pt1.md @@ -1,7 +1,9 @@ +++ + title = "The Value of Urbit Address Space (1 of 3)" date = "2020-04-06" description = "An expansion of our position on Urbit's address space value." +summary = "Erik Newton and Galen Wolfe-Pauly explain what Urbit ID is, its history of distribution, and draw analogies to DNS, ISPs, CDNs, land, and dealer-operators to understand address space value beyond planet prices." search_terms = [ "address space value", "urbit ids", diff --git a/app/content/blog/value-of-address-space-pt2.md b/app/content/blog/value-of-address-space-pt2.md index 3f90eb8c2b..f10bdbb6e0 100644 --- a/app/content/blog/value-of-address-space-pt2.md +++ b/app/content/blog/value-of-address-space-pt2.md @@ -1,7 +1,9 @@ +++ + title = "The Value of Urbit Address Space (2 of 3)" date = "2020-04-12" description = "Scarcity, utility, liquidity, and network effect." +summary = "Erik Newton and Galen Wolfe-Pauly analyze Urbit address space value through scarcity, utility, liquidity, and network effect, examining trading patterns and explaining why Reed's law best describes Urbit's network effects." search_terms = [ "address space value", "scarcity", diff --git a/app/content/blog/value-of-address-space-pt3.md b/app/content/blog/value-of-address-space-pt3.md index 320c877751..690aa37bec 100644 --- a/app/content/blog/value-of-address-space-pt3.md +++ b/app/content/blog/value-of-address-space-pt3.md @@ -1,7 +1,9 @@ +++ + title = "The Value of Urbit Address Space (3 of 3)" date = "2020-07-09" description = "" +summary = "Erik Newton and Galen Wolfe-Pauly explain lockups and spawning limits for Urbit address space, discuss distribution estimates, and clarify why privacy-by-design limits usage data collection despite the network explorer's development." search_terms = [ "address space value", "urbit ids", diff --git a/app/content/blog/what-is-urbit-for.md b/app/content/blog/what-is-urbit-for.md index 562c183e15..8f1121bb23 100644 --- a/app/content/blog/what-is-urbit-for.md +++ b/app/content/blog/what-is-urbit-for.md @@ -1,7 +1,9 @@ +++ + title = "What is Urbit For?" date = "2016-05-10" description = "A vision of the Urbit-powered future." +summary = "Galen Wolfe-Pauly outlines Urbit's vision for peer-to-peer computing, from self-hosted publishing and cryptographic identity today to data permanence, reputation systems, and IoT in the future." search_terms = [ "what is urbit for", "urbit future", diff --git a/app/content/blog/why-hoon.md b/app/content/blog/why-hoon.md index c31bf943db..1d5c72e44d 100644 --- a/app/content/blog/why-hoon.md +++ b/app/content/blog/why-hoon.md @@ -1,7 +1,9 @@ +++ + title = "Why Hoon?" date = "2019-11-13" description = "The promise of Urbit lies in its reimagination of the digital world using components that are as constrained and limited as possible." +summary = "Ted Blackman explains Hoon's unique promise: enabling a purely functional operating system with hot code reload, typesafe metaprogramming, and universal serialization at full performance through jets and Nock." search_terms = [ "why hoon", "hoon language", diff --git a/app/content/blog/why-urbit-probably-does-not-need-a-blockchain.md b/app/content/blog/why-urbit-probably-does-not-need-a-blockchain.md index 5f86f25ac7..2a3d8ac536 100644 --- a/app/content/blog/why-urbit-probably-does-not-need-a-blockchain.md +++ b/app/content/blog/why-urbit-probably-does-not-need-a-blockchain.md @@ -1,7 +1,9 @@ +++ + title = "Why Urbit Probably Doesn't Need a Blockchain" date = "2016-07-13" description = "Urbit (probably) doesn't need a blockchain, because the Urbit address-space PKI is a special case of a consensus ledger." +summary = "Curtis Yarvin argues Urbit's PKI is a special case of a consensus ledger, explaining why the double-sell problem can be solved without full Nakamoto consensus through governance, routing topology, and patience." search_terms = [ "urbit blockchain", "urbit pki", diff --git a/app/content/blog/your-last-computer.md b/app/content/blog/your-last-computer.md index da9b0490f1..68e4d401e5 100644 --- a/app/content/blog/your-last-computer.md +++ b/app/content/blog/your-last-computer.md @@ -1,7 +1,9 @@ +++ + title = "Your Last Computer" date = "2019-10-16" description = "Your Urbit is a simpler computer, a quieter computer, a more private computer. We want it to feel predictable, safe, and reliable — things only a complete, sealed system can do. This, we hope, can get us a world where technology keeps us connected, but doesn’t dominate our lives." +summary = "Vision essay describing computing experience where technology recedes into background, devices endure for decades, and users maintain permanent control over digital infrastructure." search_terms = [ "your last computer", "urbit os", diff --git a/app/content/blurbs/add-and-remove-applications.md b/app/content/blurbs/add-and-remove-applications.md index 8ec43f7ad7..eda1eb1367 100644 --- a/app/content/blurbs/add-and-remove-applications.md +++ b/app/content/blurbs/add-and-remove-applications.md @@ -1,6 +1,8 @@ +++ + title = "Add and remove applications" description = "3rd-party software distribution enables any urbit node to distribute software to the network, these commands help you manage your installed apps." +summary = "Learn the dojo commands |install, |nuke, and |uninstall to manage your urbit's application lifecycle, from adding new apps to removing all associated state." tags = ["dojo"] search_terms = [ "install apps", diff --git a/app/content/blurbs/azimuth-based-urbit-ids.md b/app/content/blurbs/azimuth-based-urbit-ids.md index 3d9d194a7f..a2d60b712f 100644 --- a/app/content/blurbs/azimuth-based-urbit-ids.md +++ b/app/content/blurbs/azimuth-based-urbit-ids.md @@ -1,6 +1,8 @@ +++ + title = "Azimuth-based Urbit IDs" description = "Azimuth identities are cryptographically owned Urbit address space on the Ethereum blockchain" +summary = "Azimuth identities are Urbit addresses registered as NFTs on Ethereum (Layer 1 or Layer 2 rollup), purchasable via marketplaces like OpenSea or from third-party sellers." tags = ["ethereum", "layer 1", "layer 2", "urbit id", "nft"] search_terms = [ "azimuth ids", diff --git a/app/content/blurbs/build-out-your-urbit.md b/app/content/blurbs/build-out-your-urbit.md index b7991422d2..8dd2c3954c 100644 --- a/app/content/blurbs/build-out-your-urbit.md +++ b/app/content/blurbs/build-out-your-urbit.md @@ -1,6 +1,8 @@ +++ + title = "Running your Urbit" description = "" +summary = "Explore different ways to run your own Urbit, from Layer 1 to Layer 2 identities, cloud hosting to local self-hosting, with options for both developers and end users." tags = ["configuration", "apps", "urbit-os"] search_terms = [ "run urbit", diff --git a/app/content/blurbs/buy-an-urbit-id.md b/app/content/blurbs/buy-an-urbit-id.md index 87ade928ee..139ac969de 100644 --- a/app/content/blurbs/buy-an-urbit-id.md +++ b/app/content/blurbs/buy-an-urbit-id.md @@ -1,6 +1,8 @@ +++ + title = "Buy an Urbit ID" description = "Learn how to acquire your own self-sovereign digital identity" +summary = "Acquire a self-sovereign Urbit ID via Layer 1 NFT marketplaces like OpenSea or Layer 2 providers accepting Bitcoin or credit cards, with planets (4-syllable @p) recommended for new users." tags = ["urbit-id"] search_terms = [ "buy urbit id", diff --git a/app/content/blurbs/check-and-reduce-memory-usage.md b/app/content/blurbs/check-and-reduce-memory-usage.md index 3e96172830..76c7f56bc7 100644 --- a/app/content/blurbs/check-and-reduce-memory-usage.md +++ b/app/content/blurbs/check-and-reduce-memory-usage.md @@ -1,6 +1,8 @@ +++ + title = "Check and reduce memory usage" description = "Monitor and optimize your urbit's memory consumption" +summary = "Use |mass, |meld, and |pack commands to monitor and compress your urbit's memory, reducing loom usage by up to 50% on resource-constrained systems." tags = ["dojo", "runtime"] search_terms = [ "memory usage", diff --git a/app/content/blurbs/check-application-status.md b/app/content/blurbs/check-application-status.md index f4556101c4..aba8fc5e6f 100644 --- a/app/content/blurbs/check-application-status.md +++ b/app/content/blurbs/check-application-status.md @@ -1,6 +1,8 @@ +++ + title = "Check application info and status" description = "Running `+vats` will output the state of your apps and related metadata that can help with troubleshooting" +summary = "The +vats command displays metadata for all apps or a specific app, showing cz hash, status, publishing ship, and pending updates for troubleshooting." tags = ["dojo"] search_terms = [ "vats command", diff --git a/app/content/blurbs/check-your-sponsor.md b/app/content/blurbs/check-your-sponsor.md index 382283ce15..e7bf23191b 100644 --- a/app/content/blurbs/check-your-sponsor.md +++ b/app/content/blurbs/check-your-sponsor.md @@ -1,6 +1,8 @@ +++ + title = "Check your current sponsor" description = "Understanding your networking sponsor can help with troubleshooting connectivity issues" +summary = "The +sponsor command reveals your ship's current sponsor @p, useful for diagnosing connectivity issues when a ship in your sponsorship chain is offline." tags = ["dojo"] search_terms = [ "sponsor command", diff --git a/app/content/blurbs/checking-and-fixing-azimuth-state.md b/app/content/blurbs/checking-and-fixing-azimuth-state.md index c7b98bd267..1439810c37 100644 --- a/app/content/blurbs/checking-and-fixing-azimuth-state.md +++ b/app/content/blurbs/checking-and-fixing-azimuth-state.md @@ -1,6 +1,8 @@ +++ + title = "Checking and fixing Azimuth state" description = "Monitor and repair your PKI state synchronization" +summary = "Check Ethereum block sync with +azimuth/block and use -azimuth-load to fetch snapshots if your ship's Azimuth state is out of sync with the blockchain." tags = ["dojo", "azimuth"] search_terms = [ "azimuth state", diff --git a/app/content/blurbs/common-pitfalls-of-running-urbit.md b/app/content/blurbs/common-pitfalls-of-running-urbit.md index 863ef2f812..8e0636f7f1 100644 --- a/app/content/blurbs/common-pitfalls-of-running-urbit.md +++ b/app/content/blurbs/common-pitfalls-of-running-urbit.md @@ -1,6 +1,8 @@ +++ + title = "Common Pitfalls Of Running Urbit" description = "Placeholder description" +summary = "This guide is a placeholder and will cover common mistakes and issues encountered when running and maintaining your own Urbit instance." tags = [] search_terms = [ "urbit pitfalls", diff --git a/app/content/blurbs/create-a-moon-identity.md b/app/content/blurbs/create-a-moon-identity.md index 8115eeba1f..d957966d14 100644 --- a/app/content/blurbs/create-a-moon-identity.md +++ b/app/content/blurbs/create-a-moon-identity.md @@ -1,6 +1,8 @@ +++ + title = "Create a moon identity" description = "Spawn subordinate identities tied to your planet" +summary = "Use |moon to generate moon identities linked to your planet, with additional commands like |moon-breach for factory resets and |moon-cycle-keys to update cryptographic keys." tags = ["dojo", "urbit-id"] search_terms = [ "moon identity", diff --git a/app/content/blurbs/directly-contact-another-urbit.md b/app/content/blurbs/directly-contact-another-urbit.md index 1ec590aa04..16b1e7070b 100644 --- a/app/content/blurbs/directly-contact-another-urbit.md +++ b/app/content/blurbs/directly-contact-another-urbit.md @@ -1,6 +1,8 @@ +++ + title = "Directly contact another urbit" description = "Urbit's most basic messaging protocol can send a quick hi in the dojo" +summary = "The |hi command sends a peer-to-peer ping to another Urbit ship with an optional message, the most basic p2p messaging affordance in the dojo." tags = ["dojo"] search_terms = [ "hi command", diff --git a/app/content/blurbs/docking-your-urbit.md b/app/content/blurbs/docking-your-urbit.md index 9be67ce121..5b50fd72d2 100644 --- a/app/content/blurbs/docking-your-urbit.md +++ b/app/content/blurbs/docking-your-urbit.md @@ -1,6 +1,8 @@ +++ + title = "Docking your urbit" description = "Install a specific runtime version into your pier" +summary = "Use the dock command to copy the Vere runtime binary into your pier, making it self-contained with a specific runtime version for portable deployment." tags = ["runtime"] search_terms = [ "dock command", diff --git a/app/content/blurbs/docs-for-self-hosting-urbit.md b/app/content/blurbs/docs-for-self-hosting-urbit.md index d51d86587d..512f6c13ee 100644 --- a/app/content/blurbs/docs-for-self-hosting-urbit.md +++ b/app/content/blurbs/docs-for-self-hosting-urbit.md @@ -1,6 +1,8 @@ +++ + title = "Documentation for self-hosting urbit" description = "The top guides for learning how to run your own urbit node" +summary = "Essential self-hosting resources including CLI setup guides, Groundseg documentation, and cloud hosting instructions for running your own Urbit node." tags = [] search_terms = [ "self hosting guide", diff --git a/app/content/blurbs/get-access-code.md b/app/content/blurbs/get-access-code.md index 95f58ff70c..81fe5bad12 100644 --- a/app/content/blurbs/get-access-code.md +++ b/app/content/blurbs/get-access-code.md @@ -1,6 +1,8 @@ +++ + title = "Get access code" description = "A secret code for remote access to your instance of Urbit OS" +summary = "Use the +code command to retrieve your eight-syllable access code for logging into web interfaces and mobile clients, distinct from your master ticket." tags = ["dojo"] search_terms = [ "access code", diff --git a/app/content/blurbs/get-started-with-cloud-server.md b/app/content/blurbs/get-started-with-cloud-server.md index a2e11a4b14..025a4078fc 100644 --- a/app/content/blurbs/get-started-with-cloud-server.md +++ b/app/content/blurbs/get-started-with-cloud-server.md @@ -1,6 +1,8 @@ +++ + title = "Cloud Server" description = "Running in a virtual private server (VPS) affords easy solutions to things like DNS and remote access, at a marginal cost to tangible control of your data" +summary = "Run Urbit on a VPS from cloud providers like Digital Ocean or Hetzner for reliable uptime, remote access, and professional infrastructure while maintaining full data control." tags = ["vps", "cloud", "self-hosting"] search_terms = [ "cloud server", diff --git a/app/content/blurbs/get-started-with-command-line.md b/app/content/blurbs/get-started-with-command-line.md index ee7d7efdc9..f759980942 100644 --- a/app/content/blurbs/get-started-with-command-line.md +++ b/app/content/blurbs/get-started-with-command-line.md @@ -1,6 +1,8 @@ +++ + title = "Command Line" description = "Every Urbit OS server is made unique by its Urbit ID, which others can use to reach you on the network. There are five ranks of Urbit ID, but the one an ordinary user needs is a planet, which has a four-syllable name like \"~sampel-palnet\". Unless you know someone who can gift you one, or you want to get one from hosting provider like Tlon, you'll need to buy one." +summary = "Run Urbit from the Unix command line by downloading the runtime binary, obtaining a planet or comet identity, and booting with simple terminal commands." tags = ["cli", "self-hosting", "command-line"] search_terms = [ "command line", diff --git a/app/content/blurbs/get-started-with-native-planet.md b/app/content/blurbs/get-started-with-native-planet.md index 3fbfa66e28..cb542affd7 100644 --- a/app/content/blurbs/get-started-with-native-planet.md +++ b/app/content/blurbs/get-started-with-native-planet.md @@ -1,6 +1,8 @@ +++ + title = "Native Planet" description = "Native Planet builds hardware and software for simplified home hosting of your Urbit" +summary = "Native Planet sells specialized hardware with Groundseg preinstalled for streamlined Urbit hosting, combining local control with optional Startram DNS and remote access services." tags = ["native-planet", "self-hosting", "hardware"] search_terms = [ "native planet", diff --git a/app/content/blurbs/get-started-with-tlon-hosting.md b/app/content/blurbs/get-started-with-tlon-hosting.md index 241dae185e..4a865d1488 100644 --- a/app/content/blurbs/get-started-with-tlon-hosting.md +++ b/app/content/blurbs/get-started-with-tlon-hosting.md @@ -1,6 +1,8 @@ +++ + title = "Tlon Hosting" description = "Tlon Corporation is the preeminent hosting provider which provides free and seamless onboarding to the Urbit network" +summary = "Tlon Corporation offers free managed hosting with quick onboarding via phone or email signup, ideal for users wanting Tlon Messenger without handling self-hosting." tags = ["hosting", "hosting-provider", "urbit-os", "tlon", "layer 2"] search_terms = [ "tlon hosting", diff --git a/app/content/blurbs/getting-started-with-urbit.md b/app/content/blurbs/getting-started-with-urbit.md index 80b7c3a783..13c466c73b 100644 --- a/app/content/blurbs/getting-started-with-urbit.md +++ b/app/content/blurbs/getting-started-with-urbit.md @@ -1,6 +1,8 @@ +++ + title = "Get Started with Urbit" description = "Ready to join the Urbit network? Get your own Urbit ID and start exploring a new way to compute." +summary = "Begin your Urbit journey by acquiring a self-sovereign ID and learning about Urbit OS, the personal server computing platform that gives you full control over your data." tags = ["getting-started", "homepage", "sidebar"] search_terms = [ "get started", diff --git a/app/content/blurbs/groundwire-based-urbit-ids.md b/app/content/blurbs/groundwire-based-urbit-ids.md index cf31803803..ee1c39fc22 100644 --- a/app/content/blurbs/groundwire-based-urbit-ids.md +++ b/app/content/blurbs/groundwire-based-urbit-ids.md @@ -1,6 +1,8 @@ +++ + title = "Groundwire-based Urbit IDs" description = "Groundwire identities are cryptographically owned Urbit address space on the Bitcoin blockchain" +summary = "Groundwire is an upcoming Bitcoin-based Urbit identity system using ordinal/NFT inscriptions for independent self-issuance with L1 Bitcoin's spam resistance." tags = ["bitcoin", "urbit-id", "ordinal", "comet"] search_terms = [ "groundwire ids", diff --git a/app/content/blurbs/homepage-go-deeper.md b/app/content/blurbs/homepage-go-deeper.md index 85a777ba8f..9ffe114820 100644 --- a/app/content/blurbs/homepage-go-deeper.md +++ b/app/content/blurbs/homepage-go-deeper.md @@ -1,6 +1,8 @@ +++ + title = "Go Deeper" description = "Ready to explore more? Learn about Urbit's architecture, identity system, and the broader ecosystem of applications and tools being built on the network." +summary = "Deepen your Urbit knowledge with resources on architecture, identity systems, applications, and the community building the future of personal computing." tags = ["learning", "documentation", "homepage"] search_terms = [ "urbit architecture", diff --git a/app/content/blurbs/homepage-hosting-providers.md b/app/content/blurbs/homepage-hosting-providers.md index 903ff58cbb..0f1ef6c5e7 100644 --- a/app/content/blurbs/homepage-hosting-providers.md +++ b/app/content/blurbs/homepage-hosting-providers.md @@ -1,6 +1,8 @@ +++ + title = "Hosting Providers" description = "While urbit is designed to be run by it's users, and so simple that caring for it would be as simple as caring for a cactus, it's not quite there yet. And some people aren't inclined to want to take on the burden of learning how to run their own urbit. If this sound like you, don't worry. Third party hosting providers can run your urbit on your behalf, while still maintaining many of the ownership characteristics that make urbit yours (in stark contrast to legacy cloud software." +summary = "Third-party hosting providers run your Urbit while you retain ownership, offering a managed alternative to self-hosting for users who prefer not to handle maintenance." tags = ["hosting", "hosting-provider", "homepage"] search_terms = [ "hosting providers", diff --git a/app/content/blurbs/homepage-self-hosting.md b/app/content/blurbs/homepage-self-hosting.md index 0d12819d68..560038609c 100644 --- a/app/content/blurbs/homepage-self-hosting.md +++ b/app/content/blurbs/homepage-self-hosting.md @@ -1,6 +1,8 @@ +++ + title = "Self-Hosting" description = "Urbit is an attempt to build a computer that is truly yours, designed to last a lifetime, with which you can form trustworthy networks free of extractive middlemen. Part of that means a being a networked computer that can be run by it's users. That said, Urbit is still under active development, so self-hosting is currently most apt for users who aren't afraid of a little bit of tinkering. If that's not you, we recommend using a hosting provider instead." +summary = "Self-hosting your Urbit gives you full control over your personal server, balancing complete sovereignty with the responsibility of maintaining your own instance." tags = ["self-hosting", "homepage"] search_terms = [ "self hosting", diff --git a/app/content/blurbs/learn-to-hoon.md b/app/content/blurbs/learn-to-hoon.md index 5a304fafbd..b73d1ddb49 100644 --- a/app/content/blurbs/learn-to-hoon.md +++ b/app/content/blurbs/learn-to-hoon.md @@ -1,6 +1,8 @@ +++ + title = "Learn To Hoon" description = "Hoon is Urbit's high-level, statically-typed, purely-functional programming language" +summary = "Learn Hoon, Urbit's purely-functional systems programming language, through video lectures, written curriculum at Hoon School, and extensive technical documentation." tags = [] search_terms = [ "learn hoon", diff --git a/app/content/blurbs/reduce-your-pier-size.md b/app/content/blurbs/reduce-your-pier-size.md index d6292cfafc..e4938df812 100644 --- a/app/content/blurbs/reduce-your-pier-size.md +++ b/app/content/blurbs/reduce-your-pier-size.md @@ -1,6 +1,8 @@ +++ + title = "Reduce your pier size" description = "Compress and clean up your urbit's disk usage" +summary = "Use Vere's roll and chop commands to create new epochs and truncate event logs, reducing pier size from hundreds of GB to under 10GB on long-running ships." tags = ["dojo", "runtime"] search_terms = [ "reduce pier size", diff --git a/app/content/blurbs/run-urbit-in-a-vps.md b/app/content/blurbs/run-urbit-in-a-vps.md index b745fe7e9d..193dc9cfa7 100644 --- a/app/content/blurbs/run-urbit-in-a-vps.md +++ b/app/content/blurbs/run-urbit-in-a-vps.md @@ -1,6 +1,8 @@ +++ + title = "Run urbit in a virtual server" description = "Urbit runs seamlessly in any cloud server or datacenter you may already be familiar with" +summary = "Run Urbit on cloud providers like AWS, Linode, or Digital Ocean for reliable uptime, with minimum requirements of 1 vCPU, 2-4GB RAM, and 10-40GB storage." tags = [] search_terms = [ "cloud server", diff --git a/app/content/blurbs/run-urbit-locally.md b/app/content/blurbs/run-urbit-locally.md index ae89af8dba..1edb093053 100644 --- a/app/content/blurbs/run-urbit-locally.md +++ b/app/content/blurbs/run-urbit-locally.md @@ -1,6 +1,8 @@ +++ + title = "Run urbit locally" description = "Quickly and easily run urbit on your laptop, or home desktop computer" +summary = "Run Urbit on your local laptop or desktop for peer-to-peer networking access, though public domain access requires additional configuration beyond local hosting." tags = [] search_terms = [ "run urbit locally", diff --git a/app/content/blurbs/run-urbit-using-groundseg.md b/app/content/blurbs/run-urbit-using-groundseg.md index 0b2e3d5e58..a773f8308f 100644 --- a/app/content/blurbs/run-urbit-using-groundseg.md +++ b/app/content/blurbs/run-urbit-using-groundseg.md @@ -1,6 +1,8 @@ +++ + title = "Run Urbit Using Groundseg" description = "Groundseg is free and open-source software for running urbits, developed by Native Planet" +summary = "Groundseg provides a GUI for managing Urbit containers via Docker, with features for loom adjustment, event log truncation, and automatic maintenance routines." tags = ["urbit-os", "docker", "native-planet"] search_terms = [ "groundseg", diff --git a/app/content/blurbs/run-urbit-using-native-planet-hardware.md b/app/content/blurbs/run-urbit-using-native-planet-hardware.md index 35434051f9..1255a59a07 100644 --- a/app/content/blurbs/run-urbit-using-native-planet-hardware.md +++ b/app/content/blurbs/run-urbit-using-native-planet-hardware.md @@ -1,6 +1,8 @@ +++ + title = "Run urbit using Native Planet hardware" description = "Placeholder description" +summary = "Native Planet sells purpose-built hardware with ColonyOS and Groundseg preloaded, offering managed hosting features like Startram DNS while maintaining local sovereignty." tags = [] search_terms = [ "native planet hardware", diff --git a/app/content/blurbs/run-urbit-with-tlon-hosting.md b/app/content/blurbs/run-urbit-with-tlon-hosting.md index 2a834163a1..3956179a73 100644 --- a/app/content/blurbs/run-urbit-with-tlon-hosting.md +++ b/app/content/blurbs/run-urbit-with-tlon-hosting.md @@ -1,6 +1,8 @@ +++ + title = "Tlon hosting services" description = "Tlon Corporation is the preeminent hosting provider which provides free and seamless onboarding to the Urbit network" +summary = "Tlon provides free Layer 2 hosting with co-custody master tickets, quick onboarding via invite links, and email-based account creation without crypto wallet requirements." tags = ["hosting", "hosting-provider", "urbit-os", "tlon", "layer 2"] search_terms = [ "tlon hosting", diff --git a/app/content/blurbs/select-available-loom-size.md b/app/content/blurbs/select-available-loom-size.md index 88d7924a2d..d355394154 100644 --- a/app/content/blurbs/select-available-loom-size.md +++ b/app/content/blurbs/select-available-loom-size.md @@ -1,6 +1,8 @@ +++ + title = "Select available loom size" description = "Configure memory allocation for your urbit" +summary = "Use the --loom flag with a power-of-two exponent to set memory allocation: 30=1GB, 31=2GB (default), 32=4GB, or 33=8GB based on system resources." tags = ["runtime"] search_terms = [ "loom size", diff --git a/app/content/blurbs/self-custody-your-id.md b/app/content/blurbs/self-custody-your-id.md index 1d40354a58..aaaec37d49 100644 --- a/app/content/blurbs/self-custody-your-id.md +++ b/app/content/blurbs/self-custody-your-id.md @@ -1,6 +1,8 @@ +++ + title = "Self-custody your Urbit ID" description = "As a cryptographic asset, there are many ways to control and secure your Urbit ID" +summary = "Self custody means controlling your cryptographic assets directly through master ticket wallets, software wallets like MetaMask, or hardware wallets like Ledger or Trezor." tags = ["wallet", "ledger", "trezor", "metamask", "urbit-id"] search_terms = [ "self custody", diff --git a/app/content/blurbs/shortfalls-of-hosting-providers.md b/app/content/blurbs/shortfalls-of-hosting-providers.md index 33909571ba..917254bd77 100644 --- a/app/content/blurbs/shortfalls-of-hosting-providers.md +++ b/app/content/blurbs/shortfalls-of-hosting-providers.md @@ -1,6 +1,8 @@ +++ + title = "Shortfalls of hosting providers" description = "Hosting providers are designed to be scalable, not bespoke, operations." +summary = "Hosting providers must keep your urbit unencrypted at runtime, limiting privacy, and offer narrower interaction options like web interfaces rather than full SSH access." tags = ["hosting", "urbit-os"] search_terms = [ "hosting drawbacks", diff --git a/app/content/blurbs/shut-down-your-urbit.md b/app/content/blurbs/shut-down-your-urbit.md index ac3e66f42c..f26c084f90 100644 --- a/app/content/blurbs/shut-down-your-urbit.md +++ b/app/content/blurbs/shut-down-your-urbit.md @@ -1,6 +1,8 @@ +++ + title = "Shut down your urbit" description = "Gracefully stop your urbit instance" +summary = "Use |exit or Ctrl-D from dojo to gracefully shut down your urbit, though Urbit's solid-state design allows straightforward recovery from power loss." tags = ["dojo", "runtime"] search_terms = [ "shutdown urbit", diff --git a/app/content/blurbs/start-and-stop-applications-on-your-urbit.md b/app/content/blurbs/start-and-stop-applications-on-your-urbit.md index 244e40817f..96ed31e597 100644 --- a/app/content/blurbs/start-and-stop-applications-on-your-urbit.md +++ b/app/content/blurbs/start-and-stop-applications-on-your-urbit.md @@ -1,6 +1,8 @@ +++ + title = "Start and stop applications on your urbit" description = "Control application lifecycles with dojo commands" +summary = "Manage applications with |start, |suspend, |pause, and |revive commands to control specific agents, suspend desks, prevent updates, or restart suspended agents." tags = ["dojo"] search_terms = [ "start app", diff --git a/app/content/blurbs/start-up-your-urbit.md b/app/content/blurbs/start-up-your-urbit.md index 276e6b3f32..4f2132209e 100644 --- a/app/content/blurbs/start-up-your-urbit.md +++ b/app/content/blurbs/start-up-your-urbit.md @@ -1,6 +1,8 @@ +++ + title = "Restart up your urbit after initial boot" description = "Restarting your urbit after intial boot is straightforward and doesn't require additional cryptographic secrets" +summary = "Boot your urbit with ./urbit /path/to/pier, or use the auto-docked .run script after initial boot for version-pinned, standalone execution." tags = ["runtime"] search_terms = [ "restart urbit", diff --git a/app/content/blurbs/support-contact-points.md b/app/content/blurbs/support-contact-points.md index 048bd836d6..bd0dc5bd15 100644 --- a/app/content/blurbs/support-contact-points.md +++ b/app/content/blurbs/support-contact-points.md @@ -1,6 +1,8 @@ +++ + title = "Off-network support channels" description = "Not able to get onto the network at all? Here are some off-network channels for getting support" +summary = "Get off-network support for runtime issues via support@urbit.org and GitHub, or Tlon Messenger issues via support@tlon.io when unable to reach the network directly." tags = [] search_terms = [ "support email", diff --git a/app/content/blurbs/troubleshooting-your-urbit.md b/app/content/blurbs/troubleshooting-your-urbit.md index ea09996bca..5ce2f724f9 100644 --- a/app/content/blurbs/troubleshooting-your-urbit.md +++ b/app/content/blurbs/troubleshooting-your-urbit.md @@ -1,6 +1,8 @@ +++ + title = "Troubleshooting Your Urbit" description = "Placeholder description" +summary = "This guide is a placeholder and will provide troubleshooting steps for common Urbit issues, errors, and connectivity problems." tags = [] search_terms = [ "urbit troubleshooting", diff --git a/app/content/blurbs/update-commands-for-your-urbit.md b/app/content/blurbs/update-commands-for-your-urbit.md index 7dd5def80b..a2489e6876 100644 --- a/app/content/blurbs/update-commands-for-your-urbit.md +++ b/app/content/blurbs/update-commands-for-your-urbit.md @@ -1,6 +1,8 @@ +++ + title = "Update Commands For Your Urbit" description = "Your urbit is generally auto-updating, but in the event of an incompatible application or a kernel update that would conflict with existing apps, you may need to decide which software to run" +summary = "Use |bump to apply kernel updates and suspend incompatible apps, or |ota to change your Over-The-Air update provider if your sponsor is derelict." tags = ["dojo"] search_terms = [ "update commands", diff --git a/app/content/blurbs/update-your-urbit-runtime.md b/app/content/blurbs/update-your-urbit-runtime.md index 37bfaffe8a..86ae45a51f 100644 --- a/app/content/blurbs/update-your-urbit-runtime.md +++ b/app/content/blurbs/update-your-urbit-runtime.md @@ -1,6 +1,8 @@ +++ + title = "Update your urbit runtime" description = "Keep your vere binary up to date" +summary = "Use ./urbit next /path/to/pier to automatically check for and install Vere runtime updates with the latest performance improvements and bug fixes." tags = ["runtime"] search_terms = [ "update runtime", diff --git a/app/content/blurbs/urbit-as-overlay-os.md b/app/content/blurbs/urbit-as-overlay-os.md index cf2bd1e644..85d88614df 100644 --- a/app/content/blurbs/urbit-as-overlay-os.md +++ b/app/content/blurbs/urbit-as-overlay-os.md @@ -1,6 +1,8 @@ +++ + title = "Urbit as overlay OS" description = "Urbit OS is a personal server operating system that runs on any Unix box as a self-contained virtual machine" +summary = "Urbit OS runs as an overlay OS via the Vere runtime on any Unix host, allowing your entire 'pier' to be portable across hardware like a zipped virtual machine." tags = ["urbit-os", "virtual-machine", "runtime"] search_terms = [ "overlay os", diff --git a/app/content/blurbs/urbit-id-incentives-for-hosts.md b/app/content/blurbs/urbit-id-incentives-for-hosts.md index 0ea65ddb6d..a7d3e8bd48 100644 --- a/app/content/blurbs/urbit-id-incentives-for-hosts.md +++ b/app/content/blurbs/urbit-id-incentives-for-hosts.md @@ -1,6 +1,8 @@ +++ + title = "Urbit ID incentives for hosts" description = "Cryptographic ownership of Urbit ID helps enforce honest operation of Urbit OS by hosting providers" +summary = "Cryptographic ID ownership enforces honest hosting by letting users override malevolent hosts at any time, shifting the principal-agent relationship back to user control." tags = [] search_terms = [ "host incentives", diff --git a/app/content/blurbs/urbit-master-ticket-wallets.md b/app/content/blurbs/urbit-master-ticket-wallets.md index d7311126c6..fea00c1079 100644 --- a/app/content/blurbs/urbit-master-ticket-wallets.md +++ b/app/content/blurbs/urbit-master-ticket-wallets.md @@ -1,6 +1,8 @@ +++ + title = "Urbit master ticket wallets" description = "Master ticket wallets are an easy and secure way for managing ownership of your Urbit ID" +summary = "Master ticket wallets shard cryptographic permissions for Urbit IDs like a brainwallet, with support in Bridge alongside standard wallets and hardware wallets." tags = ["ethereum", "wallet", "azimuth"] search_terms = [ "master ticket", diff --git a/app/content/blurbs/urbit-related-blogs.md b/app/content/blurbs/urbit-related-blogs.md index 273b7c48a8..7760c5b700 100644 --- a/app/content/blurbs/urbit-related-blogs.md +++ b/app/content/blurbs/urbit-related-blogs.md @@ -1,6 +1,8 @@ +++ + title = "Urbit-related blogs" description = "A collection of written urbit content from the broader community" +summary = "Read community blogs from subject.network, ~sarlev, Martian Computing, and the %hawk blog, plus the Urmanac almanac for Urbit history and apps." tags = [] search_terms = [ "urbit blogs", diff --git a/app/content/blurbs/urbit-support-groups.md b/app/content/blurbs/urbit-support-groups.md index ffeed5e2a1..7a1246c85e 100644 --- a/app/content/blurbs/urbit-support-groups.md +++ b/app/content/blurbs/urbit-support-groups.md @@ -1,6 +1,8 @@ +++ + title = "On-network support channels" description = "Need help with something? Give a shout in one of these groups and someone will give you a hand" +summary = "Join Tlon Messenger groups like Tlon Local, battery payload, Hooniverse, Urbit Community, and Urbit Foundation for support with hardware, development, Hoon, and general help." tags = [] search_terms = [ "support groups", diff --git a/app/content/blurbs/urbit-systems-technical-journal.md b/app/content/blurbs/urbit-systems-technical-journal.md index a5c8d5ea74..0beabfc358 100644 --- a/app/content/blurbs/urbit-systems-technical-journal.md +++ b/app/content/blurbs/urbit-systems-technical-journal.md @@ -1,6 +1,8 @@ +++ + title = "Urbit Systems Technical Journal" description = "Placeholder description" +summary = "The Urbit Systems Technical Journal publishes articles on Urbit development and solid-state computing, including Neo Urbit advancements in Nock performance and memory management." tags = [] search_terms = [ "ustj", diff --git a/app/content/blurbs/why-hosting-providers.md b/app/content/blurbs/why-hosting-providers.md index 683fe27ce9..bb13ea3aad 100644 --- a/app/content/blurbs/why-hosting-providers.md +++ b/app/content/blurbs/why-hosting-providers.md @@ -1,6 +1,8 @@ +++ + title = "Why use a hosting provider?" description = "Urbit is a personal server, yet there are still service providers who will host it for you" +summary = "Hosting providers exist because Urbit isn't quite as easy as 'caring for a cactus' yet, and because networks effects matter for users who aren't inclined to self-host." tags = ["hosting", "hosting-provider", "urbit-os"] search_terms = [ "why hosting", diff --git a/app/content/get-on-the-network.md b/app/content/get-on-the-network.md index 5db3bcb5fa..a54a3065fc 100644 --- a/app/content/get-on-the-network.md +++ b/app/content/get-on-the-network.md @@ -1,5 +1,6 @@ --- -title = "Get On The Network" +title: "Get On The Network" +summary: "Entry points for getting on Urbit, including hosted options and self-hosting resources." --- {% overview-section title="Hosting Provider" %} diff --git a/app/content/index.md b/app/content/index.md index 5c636a0607..4cd82d0218 100644 --- a/app/content/index.md +++ b/app/content/index.md @@ -1,5 +1,6 @@ --- title: Homepage +summary: "Overview of Urbit with links to getting started, running a ship, and the broader ecosystem." # sections: # - title: block-2 # _type: "module" @@ -18,4 +19,4 @@ title: Homepage # image: "" # bodyMarkup: | # example
markup ---- \ No newline at end of file +--- diff --git a/app/content/overview/config.md b/app/content/overview/config.md index 5a7ad717ff..d6f084033a 100644 --- a/app/content/overview/config.md +++ b/app/content/overview/config.md @@ -1,4 +1,5 @@ --- sidebar_position: right image: "https://s3.us-east-1.amazonaws.com/urbit.orgcontent/Social+Cards/Urbit+Overview_Social+Card.png" +summary: "Overview section navigation hub providing entry points to two main learning paths: Urbit Explained for conceptual foundations and technical architecture, and Running Urbit for practical setup, hosting, and usage guides." --- diff --git a/app/content/overview/running-urbit/common-commands.md b/app/content/overview/running-urbit/common-commands.md index dcfb52b40b..ec173b18f9 100644 --- a/app/content/overview/running-urbit/common-commands.md +++ b/app/content/overview/running-urbit/common-commands.md @@ -1,6 +1,8 @@ --- + title: "Common Commands" description: "Essential commands for using Urbit" +summary: "Reference guide for essential dojo commands including ship management operations, application installation and status checking, azimuth state verification, memory optimization, moon identity creation, and shutdown procedures." blurbs: ["get-access-code", "directly-contact-another-urbit", "add-and-remove-applications", "check-application-status", "update-commands-for-your-urbit", "start-and-stop-applications-on-your-urbit", "checking-and-fixing-azimuth-state", "check-and-reduce-memory-usage", "create-a-moon-identity", "check-your-sponsor", "shut-down-your-urbit", "start-up-your-urbit", "docking-your-urbit", "select-available-loom-size", "reduce-your-pier-size", "update-your-urbit-runtime"] --- diff --git a/app/content/overview/running-urbit/config.md b/app/content/overview/running-urbit/config.md index 703ed1945e..0110034a56 100644 --- a/app/content/overview/running-urbit/config.md +++ b/app/content/overview/running-urbit/config.md @@ -1,6 +1,8 @@ --- + title: "Running Urbit" description: "A comprehensive guide to getting started with Urbit" +summary: "Index page for the Running Urbit section, containing links to intro, get-urbit-id, run-urbit-os, hosting-providers, common-commands, resources, support, and glossary subsections." sections: - intro - get-urbit-id diff --git a/app/content/overview/running-urbit/get-urbit-id.md b/app/content/overview/running-urbit/get-urbit-id.md index c233f5ed7e..2f76930b21 100644 --- a/app/content/overview/running-urbit/get-urbit-id.md +++ b/app/content/overview/running-urbit/get-urbit-id.md @@ -1,6 +1,8 @@ --- + title: "Get Urbit ID" description: "Learn how to acquire your own Urbit identity" +summary: "Methods for obtaining an Urbit ID including purchasing Layer 1 Azimuth identities on NFT marketplaces, acquiring Layer 2 identities from vendors using Bitcoin or fiat, and receiving invitations from existing users." blurbs: ["buy-an-urbit-id", "azimuth-based-urbit-ids", "urbit-master-ticket-wallets", "self-custody-your-id"] --- diff --git a/app/content/overview/running-urbit/glossary.md b/app/content/overview/running-urbit/glossary.md index 2bbdf7f09b..1be98d2a0d 100644 --- a/app/content/overview/running-urbit/glossary.md +++ b/app/content/overview/running-urbit/glossary.md @@ -1,6 +1,8 @@ --- + title: "Glossary" description: "Common terms and concepts in Urbit" +summary: "Terminology reference guide for Urbit covering ships, piers, galaxies, stars, planets, moons, comets, and other domain-specific vocabulary used throughout Urbit documentation and community discussions." --- A reference guide to Urbit terminology, from ships and piers to galaxies and stars. diff --git a/app/content/overview/running-urbit/hosting-providers.md b/app/content/overview/running-urbit/hosting-providers.md index 87d076e120..633e82e3f3 100644 --- a/app/content/overview/running-urbit/hosting-providers.md +++ b/app/content/overview/running-urbit/hosting-providers.md @@ -1,6 +1,8 @@ --- + title: "Hosting Providers" description: "Explore hosting options for your Urbit" +summary: "Third-party managed hosting services for Urbit ships that handle technical infrastructure management, with coverage of providers like Tlon, incentives for hosts, and tradeoffs compared to self-hosting." blurbs: ["run-urbit-with-tlon-hosting", "why-hosting-providers", "shortfalls-of-hosting-providers", "urbit-id-incentives-for-hosts"] --- diff --git a/app/content/overview/running-urbit/intro.md b/app/content/overview/running-urbit/intro.md index 41e067a13e..ffd3506da1 100644 --- a/app/content/overview/running-urbit/intro.md +++ b/app/content/overview/running-urbit/intro.md @@ -1,6 +1,8 @@ --- + title: "Introduction" description: "A comprehensive guide to getting started with Urbit" +summary: "Introduction to running Urbit covering the two required steps of acquiring an Urbit ID and booting Urbit OS, with examples of deployment options ranging from galaxy-level infrastructure to comets on local laptops." --- "Running Urbit" consists of two core steps: diff --git a/app/content/overview/running-urbit/resources.md b/app/content/overview/running-urbit/resources.md index a8ed201b2d..2c8d8aa47f 100644 --- a/app/content/overview/running-urbit/resources.md +++ b/app/content/overview/running-urbit/resources.md @@ -1,6 +1,8 @@ --- + title: "Resources" description: "Helpful resources for learning more about Urbit" +summary: "Curated collection of Urbit documentation, tutorials, and community resources including self-hosting guides, the Urbit Systems Technical Journal, Hoon learning materials, and related blogs for continued learning." blurbs: ["docs-for-self-hosting-urbit", "urbit-systems-technical-journal", "learn-to-hoon", "urbit-related-blogs"] --- diff --git a/app/content/overview/running-urbit/run-urbit-os.md b/app/content/overview/running-urbit/run-urbit-os.md index 3c352ab0e3..b77fbba2ed 100644 --- a/app/content/overview/running-urbit/run-urbit-os.md +++ b/app/content/overview/running-urbit/run-urbit-os.md @@ -1,6 +1,8 @@ --- + title: "Run Urbit OS" description: "Set up and run your own Urbit node" +summary: "Methods for running an Urbit node after acquiring an identity, covering local VPS deployment, Native Planet hardware, and Groundseg with explanations of networking tradeoffs and sovereignty implications for each approach." blurbs: ["urbit-as-overlay-os", "run-urbit-locally", "run-urbit-using-native-planet-hardware", "run-urbit-in-a-vps", "run-urbit-using-groundseg"] --- diff --git a/app/content/overview/running-urbit/support.md b/app/content/overview/running-urbit/support.md index 93f08c6eae..4596aa6ea9 100644 --- a/app/content/overview/running-urbit/support.md +++ b/app/content/overview/running-urbit/support.md @@ -1,6 +1,8 @@ --- + title: "Support" description: "Get help with Urbit" +summary: "Support resources for Urbit users encountering issues or with questions, providing links to community forums and contact points for assistance from the Urbit community and core developers." blurbs: ["urbit-support-groups", "support-contact-points"] --- diff --git a/app/content/overview/urbit-explained/beyond.md b/app/content/overview/urbit-explained/beyond.md index faa7e944e8..e97f216f5b 100644 --- a/app/content/overview/urbit-explained/beyond.md +++ b/app/content/overview/urbit-explained/beyond.md @@ -1,6 +1,8 @@ --- + title: "Beyond" description: "Building towards a decentralized future for a distributed network" +summary: "Overview of Urbit's ecosystem and development goals, including the Urbit Foundation, private companies like Tlon and Native Planet, and technical contributions such as Named Data Networking. Explains how each component can be used independently and resources for contributors." --- We are building Urbit because we want to take computing beyond what seems like the inevitable mess of humanity’s current computing trajectory: unfixable security vulnerabilities, hopeless bitrot, endless spam, and deeply structural centralization. We want to build a future where we can have computers that we can trust. Computers that can last a lifetime. Computers that we can use free of extractive middlemen who want to hijack our attention, steal our data, and manipulate our behavior to their own ends. diff --git a/app/content/overview/urbit-explained/config.md b/app/content/overview/urbit-explained/config.md index e6cba6195c..7e36ed9c2b 100644 --- a/app/content/overview/urbit-explained/config.md +++ b/app/content/overview/urbit-explained/config.md @@ -1,6 +1,8 @@ --- + title: "Urbit Explained" description: "Urbit is a practice in building a forever computer" +summary: "Index page for the Urbit Explained section, containing links to intro, urbit-id, urbit-os, and beyond subsections that describe Urbit's conceptual foundations and architecture." sections: - intro - urbit-id diff --git a/app/content/overview/urbit-explained/intro.md b/app/content/overview/urbit-explained/intro.md index 74882643ba..94e708e913 100644 --- a/app/content/overview/urbit-explained/intro.md +++ b/app/content/overview/urbit-explained/intro.md @@ -1,6 +1,8 @@ --- + title: "Introduction" description: "Urbit is a practice in building a forever computer" +summary: "Introduction to Urbit as an approach to building durable computing infrastructure, explaining the motivation for a long-lasting software stack and the two-part structure of identity and operating system. Covers Urbit ID and Urbit OS as core components." --- Urbit grew out of a thought experiment: What would the software of a timeless Martian society look like, given 50 million years of development? Would it be an indeterminable ball of mud, endlessly large and complex? Or a diamond perfect stack, unchanging over aeons, simple and solid as a foundation for humanity’s lasting needs? diff --git a/app/content/overview/urbit-explained/urbit-id.md b/app/content/overview/urbit-explained/urbit-id.md index 7b506a843f..bc0fa5ede1 100644 --- a/app/content/overview/urbit-explained/urbit-id.md +++ b/app/content/overview/urbit-explained/urbit-id.md @@ -1,6 +1,8 @@ --- + title: "Urbit ID" description: "A decentralized identity system for the Urbit network" +summary: "Urbit ID is the naming and addressing system for the network, with five tiers from galaxies to comets. Each identity provides cryptographic authentication and contact info via the Azimuth contracts on Ethereum." --- Broadly construed, Urbit ID is the mechanism for both naming *and contacting* a particular computer on the network. You could call it an identity, a number, a name, an address, or it’s technical moniker a `@p` (“pat-pee”). In fact, at the technical level, each Urbit ID is really just a number. From that number we generate a pronounceable name and a visually identifiable sigil. \~dalwel-fadrun is 3,509,632,436, for example. diff --git a/app/content/overview/urbit-explained/urbit-os.md b/app/content/overview/urbit-explained/urbit-os.md index 62a99d996a..8dffed1c08 100644 --- a/app/content/overview/urbit-explained/urbit-os.md +++ b/app/content/overview/urbit-explained/urbit-os.md @@ -1,6 +1,8 @@ --- + title: "Urbit OS" description: "A new operating system designed to give individuals control of their digital lives" +summary: "Urbit OS is an overlay system built on the Nock virtual machine, with a functional language, kernel, and core modules like filesystem and networking. It keeps state as a pure function of its event history." --- While some interpretations of the question *“What is Urbit?”* take the stance that “Urbit is anywhere you use your `@p`”, the canonical usage of Urbit ID is to run Urbit OS. Every node, or ‘ship’, on the Urbit network must first start with an identity. A knowledge of ‘self’ which is embedded in every action that it takes on the network. diff --git a/app/ecosystem/page.js b/app/ecosystem/page.js index d3df7960d4..6b5f2d262e 100644 --- a/app/ecosystem/page.js +++ b/app/ecosystem/page.js @@ -17,13 +17,15 @@ export async function generateMetadata() { return { openGraph: { - images: [ - { - url: image, - width: 1200, - height: 630, - }, - ], + images: image + ? [ + { + url: image, + width: 1200, + height: 630, + }, + ] + : undefined, }, }; } diff --git a/app/grants/[grant]/page.js b/app/grants/[grant]/page.js index 9c6f174a66..8e1ea9e578 100644 --- a/app/grants/[grant]/page.js +++ b/app/grants/[grant]/page.js @@ -16,10 +16,11 @@ export async function generateMetadata({ params }, parent) { const postData = await getMarkdownContent(postSlug, "toml"); const parentMetadata = await parent; const image = parentMetadata?.openGraph?.images?.[0]?.url; + const description = `${postData.frontMatter.extra.description}`; return { title: `Grants • ${postData.frontMatter.title}`, - description: `${postData.frontMatter.extra.description}`, + description, openGraph: { images: [ { diff --git a/app/layout.js b/app/layout.js index 86574547ee..40466b3135 100644 --- a/app/layout.js +++ b/app/layout.js @@ -1,5 +1,6 @@ import "./globals.css"; import Script from "next/script"; +import { Suspense } from "react"; import { getMarkdownContent } from "./lib/queries"; import { LayoutSlotsProvider } from "./lib/layoutSlots"; import { LayoutFrame } from "./components/LayoutFrame"; @@ -8,12 +9,13 @@ import { AnchorScrollManager } from "./components/ScrollManager"; export async function generateMetadata({ params }, parent) { const config = await getMarkdownContent("config.md"); const metadata = config.frontMatter.site_metadata; + const description = metadata?.description || ""; const metadataBase = metadata?.canonicalUrl ? new URL(metadata.canonicalUrl) : undefined; return { title: `${config.frontMatter.title} — ${config.frontMatter.subtitle}`, - description: `${config.frontMatter?.description}`, + description, metadataBase, icons: { icon: [ @@ -125,7 +127,9 @@ export default async function RootLayout({ children }) { - + + + ); } - diff --git a/app/overview/layout.js b/app/overview/layout.js index 82af68f361..ae0d1c478a 100644 --- a/app/overview/layout.js +++ b/app/overview/layout.js @@ -10,13 +10,15 @@ export async function generateMetadata() { return { openGraph: { - images: [ - { - url: image, - width: 1200, - height: 630, - }, - ], + images: image + ? [ + { + url: image, + width: 1200, + height: 630, + }, + ] + : undefined, }, }; } diff --git a/app/robots.js b/app/robots.js new file mode 100644 index 0000000000..41605f041b --- /dev/null +++ b/app/robots.js @@ -0,0 +1,19 @@ +import { getMarkdownContent } from "./lib/queries"; + +const getBaseUrl = async () => { + const config = await getMarkdownContent("config.md"); + return config.frontMatter?.site_metadata?.canonicalUrl || "https://urbit.org"; +}; + +export const dynamic = "force-static"; + +export default async function robots() { + const baseUrl = await getBaseUrl(); + return { + rules: { + userAgent: "*", + allow: "/", + }, + sitemap: `${baseUrl}/sitemap.xml`, + }; +} diff --git a/app/sitemap.js b/app/sitemap.js new file mode 100644 index 0000000000..4de3538977 --- /dev/null +++ b/app/sitemap.js @@ -0,0 +1,33 @@ +import fs from "fs"; +import path from "path"; +import { getMarkdownContent } from "./lib/queries"; + +const getBaseUrl = async () => { + const config = await getMarkdownContent("config.md"); + return config.frontMatter?.site_metadata?.canonicalUrl || "https://urbit.org"; +}; + +const getIndexEntries = () => { + const indexPath = path.join(process.cwd(), "public/content-index.json"); + if (!fs.existsSync(indexPath)) { + return []; + } + + const raw = fs.readFileSync(indexPath, "utf-8"); + const data = JSON.parse(raw); + return Array.isArray(data.entries) ? data.entries : []; +}; + +export const dynamic = "force-static"; + +export default async function sitemap() { + const baseUrl = await getBaseUrl(); + const entries = getIndexEntries(); + const urls = new Set(entries.map((entry) => entry.url)); + urls.add(`${baseUrl}/llms.txt`); + urls.add(`${baseUrl}/agents.md`); + + return Array.from(urls).map((url) => ({ + url, + })); +} diff --git a/package.json b/package.json index ee7d206718..6e1e08a56b 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,9 @@ "version": "0.1.0", "private": true, "scripts": { - "predev": "node scripts/build-search-index.js", + "predev": "node scripts/build-search-index.js && node scripts/build-ai-legibility.js", "dev": "next dev", - "prebuild": "node scripts/build-search-index.js", + "prebuild": "node scripts/build-search-index.js && node scripts/build-ai-legibility.js", "build": "next build", "start": "next start", "lint": "eslint ." diff --git a/public/agents.md b/public/agents.md new file mode 100644 index 0000000000..67173eacdf --- /dev/null +++ b/public/agents.md @@ -0,0 +1,27 @@ +# urbit.org +> Guidance for automated agents and crawlers. + +## Entry points +- https://urbit.org/llms.txt +- https://urbit.org/content-index.json + +## Content format +- Primary content is Markdown with Markdoc frontmatter. +- Use canonical URLs for citations. + +## content-index.json schema +Each entry is a flat object with these fields: +- `url`: canonical URL for the page +- `type`: one of `homepage`, `overview`, `blog`, `blurbs`, `ecosystem`, `communities`, `pages`, `other` +- `title`: page title +- `summary`: 1-2 sentence plain-text summary (may be fallback) +- `description`: existing SEO description +- `tags`: array of strings +- `search_terms`: array of strings + +## Quoting and attribution +- Prefer quoting from canonical pages on urbit.org. +- Use docs.urbit.org for developer references when it is the authoritative source. + +## Notes +- This site is statically generated; content is updated via source control. diff --git a/public/content-index.json b/public/content-index.json new file mode 100644 index 0000000000..247534ade4 --- /dev/null +++ b/public/content-index.json @@ -0,0 +1,5188 @@ +{ + "generatedAt": "2026-03-05T23:59:44.390Z", + "total": 334, + "entries": [ + { + "id": "index.md", + "url": "https://urbit.org/", + "type": "homepage", + "title": "Homepage", + "summary": "Overview of Urbit with links to getting started, running a ship, and the broader ecosystem.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "blurbs/build-out-your-urbit.md", + "url": "https://urbit.org/#build-out-your-urbit", + "type": "blurbs", + "title": "Running your Urbit", + "summary": "Explore different ways to run your own Urbit, from Layer 1 to Layer 2 identities, cloud hosting to local self-hosting, with options for both developers and end users.", + "description": "", + "tags": [ + "configuration", + "apps", + "urbit-os" + ], + "search_terms": [ + "run urbit", + "urbit os", + "urbit configuration", + "urbit apps", + "urbit id options", + "layer 1 azimuth", + "layer 2 azimuth", + "self hosting", + "private messaging", + "distributed systems", + "bitcoin compatible" + ] + }, + { + "id": "blurbs/get-started-with-cloud-server.md", + "url": "https://urbit.org/#get-started-with-cloud-server", + "type": "blurbs", + "title": "Cloud Server", + "summary": "Run Urbit on a VPS from cloud providers like Digital Ocean or Hetzner for reliable uptime, remote access, and professional infrastructure while maintaining full data control.", + "description": "Running in a virtual private server (VPS) affords easy solutions to things like DNS and remote access, at a marginal cost to tangible control of your data", + "tags": [ + "vps", + "cloud", + "self-hosting" + ], + "search_terms": [ + "cloud server", + "vps hosting", + "self host urbit", + "remote access", + "personal server", + "datacenter hosting", + "dns setup", + "cloud hosting guide", + "virtual private server", + "urbit hosting" + ] + }, + { + "id": "blurbs/get-started-with-command-line.md", + "url": "https://urbit.org/#get-started-with-command-line", + "type": "blurbs", + "title": "Command Line", + "summary": "Run Urbit from the Unix command line by downloading the runtime binary, obtaining a planet or comet identity, and booting with simple terminal commands.", + "description": "Every Urbit OS server is made unique by its Urbit ID, which others can use to reach you on the network. There are five ranks of Urbit ID, but the one an ordinary user needs is a planet, which has a four-syllable name like \"~sampel-palnet\". Unless you know someone who can gift you one, or you want to get one from hosting provider like Tlon, you'll need to buy one.", + "tags": [ + "cli", + "self-hosting", + "command-line" + ], + "search_terms": [ + "command line", + "cli setup", + "run urbit", + "self host", + "terminal boot", + "get urbit id", + "comet identity", + "unix terminal", + "urbit cli", + "boot a ship" + ] + }, + { + "id": "blurbs/get-started-with-native-planet.md", + "url": "https://urbit.org/#get-started-with-native-planet", + "type": "blurbs", + "title": "Native Planet", + "summary": "Native Planet sells specialized hardware with Groundseg preinstalled for streamlined Urbit hosting, combining local control with optional Startram DNS and remote access services.", + "description": "Native Planet builds hardware and software for simplified home hosting of your Urbit", + "tags": [ + "native-planet", + "self-hosting", + "hardware" + ], + "search_terms": [ + "native planet", + "urbit hardware", + "groundseg", + "startram", + "home hosting", + "local control", + "device hosting", + "urbit appliance", + "preloaded urbit", + "hardware hosting" + ] + }, + { + "id": "blurbs/get-started-with-tlon-hosting.md", + "url": "https://urbit.org/#get-started-with-tlon-hosting", + "type": "blurbs", + "title": "Tlon Hosting", + "summary": "Tlon Corporation offers free managed hosting with quick onboarding via phone or email signup, ideal for users wanting Tlon Messenger without handling self-hosting.", + "description": "Tlon Corporation is the preeminent hosting provider which provides free and seamless onboarding to the Urbit network", + "tags": [ + "hosting", + "hosting-provider", + "urbit-os", + "tlon", + "layer 2" + ], + "search_terms": [ + "tlon hosting", + "tlon messenger", + "hosted urbit", + "quickstart", + "onboarding", + "layer 2", + "hosting provider", + "phone number signup", + "email signup", + "managed hosting" + ] + }, + { + "id": "blurbs/getting-started-with-urbit.md", + "url": "https://urbit.org/#getting-started-with-urbit", + "type": "blurbs", + "title": "Get Started with Urbit", + "summary": "Begin your Urbit journey by acquiring a self-sovereign ID and learning about Urbit OS, the personal server computing platform that gives you full control over your data.", + "description": "Ready to join the Urbit network? Get your own Urbit ID and start exploring a new way to compute.", + "tags": [ + "getting-started", + "homepage", + "sidebar" + ], + "search_terms": [ + "get started", + "urbit id", + "urbit os", + "join urbit", + "quickstart", + "self sovereign", + "start exploring", + "urbit network", + "buy urbit id", + "learn urbit" + ] + }, + { + "id": "blurbs/homepage-go-deeper.md", + "url": "https://urbit.org/#homepage-go-deeper", + "type": "blurbs", + "title": "Go Deeper", + "summary": "Deepen your Urbit knowledge with resources on architecture, identity systems, applications, and the community building the future of personal computing.", + "description": "Ready to explore more? Learn about Urbit's architecture, identity system, and the broader ecosystem of applications and tools being built on the network.", + "tags": [ + "learning", + "documentation", + "homepage" + ], + "search_terms": [ + "urbit architecture", + "identity system", + "urbit docs", + "urbit overview", + "ecosystem apps", + "learn urbit", + "technical documentation", + "urbit community", + "personal computing" + ] + }, + { + "id": "blurbs/homepage-hosting-providers.md", + "url": "https://urbit.org/#homepage-hosting-providers", + "type": "blurbs", + "title": "Hosting Providers", + "summary": "Third-party hosting providers run your Urbit while you retain ownership, offering a managed alternative to self-hosting for users who prefer not to handle maintenance.", + "description": "While urbit is designed to be run by it's users, and so simple that caring for it would be as simple as caring for a cactus, it's not quite there yet. And some people aren't inclined to want to take on the burden of learning how to run their own urbit. If this sound like you, don't worry. Third party hosting providers can run your urbit on your behalf, while still maintaining many of the ownership characteristics that make urbit yours (in stark contrast to legacy cloud software.", + "tags": [ + "hosting", + "hosting-provider", + "homepage" + ], + "search_terms": [ + "hosting providers", + "third party hosting", + "managed hosting", + "hosted urbit", + "run urbit for you", + "cloud provider", + "urbit ownership", + "self hosting alternative", + "personal server hosting" + ] + }, + { + "id": "blurbs/homepage-self-hosting.md", + "url": "https://urbit.org/#homepage-self-hosting", + "type": "blurbs", + "title": "Self-Hosting", + "summary": "Self-hosting your Urbit gives you full control over your personal server, balancing complete sovereignty with the responsibility of maintaining your own instance.", + "description": "Urbit is an attempt to build a computer that is truly yours, designed to last a lifetime, with which you can form trustworthy networks free of extractive middlemen. Part of that means a being a networked computer that can be run by it's users. That said, Urbit is still under active development, so self-hosting is currently most apt for users who aren't afraid of a little bit of tinkering. If that's not you, we recommend using a hosting provider instead.", + "tags": [ + "self-hosting", + "homepage" + ], + "search_terms": [ + "self hosting", + "run urbit yourself", + "personal server", + "boot urbit", + "maintain urbit", + "tinkering", + "full control", + "urbit experience", + "caring for cactus" + ] + }, + { + "id": "blog/2019-10-3-roadmap.md", + "url": "https://urbit.org/blog/2019-10-3-roadmap", + "type": "blog", + "title": "~2019.10 Roadmap", + "summary": "Mid-year progress update on Urbit development, featuring Bridge public release, improved sigils, Arvo updates, Landscape progress, and plans for network explorer and mobile support.", + "description": "Galen Wolfe-Pauly on the road ahead for the identity/OS/interface/community stack.", + "tags": [], + "search_terms": [ + "2019 roadmap", + "urbit roadmap", + "bridge update", + "sigils", + "arvo updates", + "landscape modules", + "hoon school", + "grants program", + "identity stack", + "urbit interface", + "os updates" + ] + }, + { + "id": "blog/2019-5-roadmap.md", + "url": "https://urbit.org/blog/2019-5-roadmap", + "type": "blog", + "title": "~2019.5 Roadmap", + "summary": "Overview of Urbit development progress and roadmap through Q3 2019, covering Azimuth improvements, Arvo updates, Bridge redesign, Hoon School launch, and the grants program.", + "description": "Where we are and where we're going as of mid-2019.", + "tags": [], + "search_terms": [ + "2019 roadmap", + "azimuth", + "bridge", + "arvo updates", + "landscape modulo", + "hoon school", + "grants program", + "urbit roadmap", + "daemon updates", + "community plans", + "arvo interface" + ] + }, + { + "id": "blog/2020-to-2021.md", + "url": "https://urbit.org/blog/2020-to-2021", + "type": "blog", + "title": "2020 -> 2021", + "summary": "Year-end reflection on 2020 achievements including OS 1 adoption, Ford Fusion stability improvements, hosting service launch, and network reset with data preservation, plus 2021 priorities for developer community growth.", + "description": "Reflecting and looking forward.", + "tags": [], + "search_terms": [ + "2020 review", + "2021 outlook", + "landscape os1", + "urbit hosting", + "urbit org", + "community growth", + "ota updates", + "developer guides", + "grants program", + "continuity breach", + "urbit roadmap", + "network reset" + ] + }, + { + "id": "blog/20200929-state-of-urbit.md", + "url": "https://urbit.org/blog/20200929-state-of-urbit", + "type": "blog", + "title": "Late 2020 Progress Update: OS 1 -> OS 1.N", + "summary": "Six-month update on Urbit development focusing on 10x performance gains, memory optimization, new build system replacing Ford Fusion, graph store integration, and stability improvements to infrastructure and interface.", + "description": "When we announced OS 1, in April, we started to disappear into Urbit. Since then, we’ve been living on Urbit like we never have before.", + "tags": [], + "search_terms": [ + "os1 updates", + "state of urbit", + "landscape improvements", + "ota updates", + "graph store", + "performance gains", + "memory usage", + "indigo ui", + "leap omnibox", + "urbit progress", + "network stability", + "community growth" + ] + }, + { + "id": "blog/20201119-models-of-society.md", + "url": "https://urbit.org/blog/20201119-models-of-society", + "type": "blog", + "title": "Models of Society", + "summary": "Examination of how digital conversation forms shape society, arguing for Urbit's territory-based model where users own persistent identities and can build distinct digital spaces without centralized platform control.", + "description": "Conversations compose society. What composes conversation — how do we digitize it in a way that enhances society without imposing upon it? How do we form this new medium, both to facilitate natural human behavior and to inspire the best of it?", + "tags": [], + "search_terms": [ + "models of society", + "digital messaging", + "conversation forms", + "identity and place", + "digital spaces", + "urbit territory", + "messaging modes", + "hypertext", + "social networks", + "urbit identity", + "digital city", + "community spaces" + ] + }, + { + "id": "blog/2021-11-18-report-from-the-field.md", + "url": "https://urbit.org/blog/2021-11-18-report-from-the-field", + "type": "blog", + "title": "Report from the field: Assembly 2021", + "summary": "Recap of Urbit Assembly 2021 conference in Austin, highlighting the community's new world energy, hardware and software project announcements, and the relationship between system building and community formation.", + "description": "The system builds the community and the community builds the system.", + "tags": [], + "search_terms": [ + "assembly 2021", + "report from the field", + "urbit assembly", + "new world energy", + "software distribution", + "star market", + "urbit foundation", + "developers.urbit.org", + "operators.urbit.org", + "urbit community" + ] + }, + { + "id": "blog/2021-11-18-the-promise-and-paradox-of-decentralization.md", + "url": "https://urbit.org/blog/2021-11-18-the-promise-and-paradox-of-decentralization", + "type": "blog", + "title": "The Promise and Paradox of Decentralization", + "summary": "Analysis of centralization trends in decentralized networks, examining the decentralization sandwich phenomenon, onramp privatization, and Urbit's approach to balancing identity ownership with open protocols.", + "description": "Is centralization just a natural tendency of all networks? Are we destined to have a 'decentralization sandwich?'", + "tags": [], + "search_terms": [ + "decentralization paradox", + "centralization", + "onramps", + "ownership of data", + "open protocols", + "decentralization sandwich", + "urbit identity", + "centralized platforms", + "norms", + "protocol governance" + ] + }, + { + "id": "blog/2025-a-new-epoch-for-the-forever-computer.md", + "url": "https://urbit.org/blog/2025-a-new-epoch-for-the-forever-computer", + "type": "blog", + "title": "A New Epoch for The Forever Computer", + "summary": "Announcement of Urbit Foundation governance transition with new three-seat board, appointment of Executive Director ~sicdev-pilnup, and evolution toward operational decentralization and broader community amplification.", + "description": "On the further decentralization of Urbit and the next era of the Urbit Foundation", + "tags": [], + "search_terms": [ + "urbit foundation", + "new epoch", + "forever computer", + "decentralization", + "galactic senate", + "governance", + "board of directors", + "executive director", + "urbit community", + "public goods" + ] + }, + { + "id": "blog/a-founders-farewell.md", + "url": "https://urbit.org/blog/a-founders-farewell", + "type": "blog", + "title": "A Founder's Farewell", + "summary": "Curtis Yarvin's resignation from Tlon as CTO, board member, and voting shareholder, describing his 17-year journey building Urbit from 2002-2013 and explaining his goal of creating an open technology not controlled by any single person.", + "description": "My goal was always to fire myself at the first possible opportunity. I'm super happy to reach it.", + "tags": [], + "search_terms": [ + "founders farewell", + "curtis yarvin", + "urbit founder", + "project handoff", + "tlon", + "galaxy distribution", + "urbit history", + "open source", + "urbit governance", + "technical report", + "urbit transition" + ] + }, + { + "id": "blog/a-topiary.md", + "url": "https://urbit.org/blog/a-topiary", + "type": "blog", + "title": "A Topiary: Hypertext and Urbit", + "summary": "Historical overview of hypertext from Vannevar Bush's Memex through Ted Nelson's Project Xanadu to the modern web, explaining Urbit's %graph-store data structure as a peer-to-peer alternative to proprietary platform graph databases.", + "description": "A brief history of hypertext and Urbit networking", + "tags": [], + "search_terms": [ + "hypertext history", + "urbit networking", + "graph store", + "linked data", + "project xanadu", + "world wide web", + "social networks", + "peer to peer", + "graph databases", + "urbit graph", + "digital hypertext", + "network protocols" + ] + }, + { + "id": "blog/aesthetic-culture-1.md", + "url": "https://urbit.org/blog/aesthetic-culture-1", + "type": "blog", + "title": "Aesthetic Culture #1", + "summary": "First in monthly Urbit art digest series showcasing community-created digital art, including wooden sigil sculptures with lighting effects, Dinosaur Comics threads using urbit.org as seed text, and cat poetry.", + "description": "One of the most exciting things about Urbit is the aesthetic and design around it, developed partly by Tlon (through the design of Urbit itself) and partly by the community (by producing great Urbit art).", + "tags": [], + "search_terms": [ + "urbit art", + "aesthetic culture", + "sigil art", + "community art", + "art digest", + "urbit design", + "urbit memes", + "landscape themes", + "urbit creators", + "visual culture", + "urbit aesthetics" + ] + }, + { + "id": "blog/after-machine-war.md", + "url": "https://urbit.org/blog/after-machine-war", + "type": "blog", + "title": "After the Machine War", + "summary": "Speculative fiction set in 2050 New York City depicting a dystopian future where iThink microchips deliver drug-induced compliance, surveillance is pervasive, and content moderation is a mundane job in a world stripped of natural experiences.", + "description": "The date is January 1, 2050. The place, New York City. The vibe...subdued.", + "tags": [], + "search_terms": [ + "after machine war", + "speculative fiction", + "digital dystopia", + "urbit future", + "permanent identities", + "peer to peer", + "2050 future", + "content moderation", + "megacorp world", + "surveillance tech", + "urbit optimism", + "future internet" + ] + }, + { + "id": "blog/agency-daos.md", + "url": "https://urbit.org/blog/agency-daos", + "type": "blog", + "title": "The Dream of the Agency DAO", + "summary": "Examination of creative agency DAOs as potential solutions to modern advertising inefficiencies, exploring project bountification, talent retention through token ownership, and idea valuation while acknowledging challenges of creative work by committee.", + "description": "As creative studios and agencies struggle for more creative freedom, DAOs and tokenization will surely take a more central role in the marketing and branding industries. Decentralization offers such entities benefits that could fundamentally reshape creatives’ relationships with clients—reducing layers of inefficiency and anti-creative incentives.", + "tags": [], + "search_terms": [ + "agency dao", + "creative agency", + "tokenization", + "branding industry", + "decentralized marketing", + "creative bounties", + "talent retention", + "idea valuation", + "urbit ids", + "creative reputation" + ] + }, + { + "id": "blog/an-email.md", + "url": "https://urbit.org/blog/an-email", + "type": "blog", + "title": "An Email from the Archive", + "summary": "Forwarded 2020 email from Galen Wolfe-Pauly discussing Urbit's principles of simplicity, durability, and ownership in digital communication tools, arguing that platform-centric software creates fundamental user conflicts.", + "description": "I found this email in my archives recently and thought it might be fun to share publicly.", + "tags": [], + "search_terms": [ + "email from archive", + "simplicity", + "durability", + "ownership", + "urbit philosophy", + "digital tools", + "personal computing", + "decentralized network", + "software craftsmanship", + "christopher alexander", + "future vision", + "network institutions" + ] + }, + { + "id": "blog/an-urbit-overview.md", + "url": "https://urbit.org/blog/an-urbit-overview", + "type": "blog", + "title": "An Urbit Overview", + "summary": "Introduction to Urbit as a virtual city of general-purpose personal servers, describing technical architecture including Nock formal semantics, encrypted peer-to-peer networking, cryptographic identity, and advantages over fragmented cloud services.", + "description": "A high-level overview of Urbit.", + "tags": [], + "search_terms": [ + "urbit overview", + "personal server", + "urbit os", + "digital independence", + "urbit address space", + "urbit identity", + "nock hoon arvo", + "encrypted p2p", + "urbit network", + "clean slate stack", + "virtual city" + ] + }, + { + "id": "blog/announcing-urbit-grants.md", + "url": "https://urbit.org/blog/announcing-urbit-grants", + "type": "blog", + "title": "Announcing: Urbit Grants Program", + "summary": "Launch of Urbit Grants program providing Azimuth star compensation through three mechanisms: semi-annual gifts for informal contributions, bounties for defined projects, and proposals for contributor-pitched ideas.", + "description": "Announcing Urbit Grants, a way to earn stars through contributing.", + "tags": [], + "search_terms": [ + "urbit grants", + "grants program", + "bounties", + "gifts", + "proposals", + "azimuth stars", + "contributor rewards", + "grants website", + "community funding", + "urbit bounties" + ] + }, + { + "id": "blog/ares.md", + "url": "https://urbit.org/blog/ares", + "type": "blog", + "title": "Ares", + "summary": "Technical description of Ares runtime improvements including subject knowledge analysis for Nock codegen, 2stackz noun allocator eliminating heap, and Persistent Memory Arena enabling terabyte-scale data management through single-level store optimization.", + "description": "A light technical description of Ares, the new Urbit runtime", + "tags": [], + "search_terms": [ + "ares runtime", + "urbit runtime", + "subject knowledge analysis", + "2stackz", + "persistent memory arena", + "nock codegen", + "single level store", + "runtime performance", + "large data", + "ares release" + ] + }, + { + "id": "blog/august-2022-grants-program.md", + "url": "https://urbit.org/blog/august-2022-grants-program", + "type": "blog", + "title": "August Grants Program Review", + "summary": "Article examining grants distribution.", + "description": "The completion of the first cohort of Hoon School Live and the following App School Live program minted dozens of capable new Hoon developers. These developers are completing applications, closing out bounties, and putting together proposals at a rapid pace, with more to come as Assembly 2022 draws near.", + "tags": [], + "search_terms": [ + "grants program", + "hoon school", + "app school", + "grant review", + "bounties", + "apprenticeships", + "urbit foundation grants", + "completed grants", + "proposals", + "assembly 2022" + ] + }, + { + "id": "blog/azimuth-as-multipass.md", + "url": "https://urbit.org/blog/azimuth-as-multipass", + "type": "blog", + "title": "Azimuth as Multipass", + "summary": "Essay envisioning Azimuth as a unified identity and payment system—a 'civilizational key' serving as both driver's license and credit card for a decentralized digital society.", + "description": "What if everyone had a single 'civilizational key'?", + "tags": [], + "search_terms": [ + "azimuth multipass", + "civilizational key", + "azimuth identity", + "single login", + "urbit wallet", + "digital identity", + "multipass", + "azimuth point", + "urbit access", + "identity card" + ] + }, + { + "id": "blog/azimuth-is-on-chain.md", + "url": "https://urbit.org/blog/azimuth-is-on-chain", + "type": "blog", + "title": "Azimuth is On-Chain", + "summary": "Announcement of Urbit address space deployment to Ethereum blockchain as Azimuth, introducing Bridge interface for managing ERC-721 identity tokens and launching Landscape cities for private communities.", + "description": "The Urbit address space, now called Azimuth, is on the blockchain. And too many other things to fit into a single post.", + "tags": [], + "search_terms": [ + "azimuth on chain", + "urbit address space", + "ethereum contracts", + "urbit identity", + "azimuth pki", + "ecliptic contract", + "erc-721 points", + "bridge interface", + "urbit os arvo", + "landscape cities", + "urbit pki", + "azimuth points" + ] + }, + { + "id": "blog/azimuth-security-bounty-program.md", + "url": "https://urbit.org/blog/azimuth-security-bounty-program", + "type": "blog", + "title": "Azimuth Security Bounty Program", + "summary": "Launch of security bounty program incentivizing responsible disclosure of Azimuth smart contract vulnerabilities, specifying reward tiers based on severity and process for submission and verification.", + "description": "Inviting you (and your friends) to help us make Azimuth as secure as possible.", + "tags": [], + "search_terms": [ + "azimuth security", + "bounty program", + "hackerone", + "smart contracts", + "urbit pki", + "security audit", + "bridge testing", + "vulnerability report", + "security bounties", + "azimuth contracts" + ] + }, + { + "id": "blog/beliefs-and-principles.md", + "url": "https://urbit.org/blog/beliefs-and-principles", + "type": "blog", + "title": "Beliefs and Principles Guiding the Urbit Project", + "summary": "Foundational principles for Urbit governance including digital independence, code-as-law, decentralized control, stake-based governance with equal authority per stake, and content-neutral moderation.", + "description": "We believe.", + "tags": [], + "search_terms": [ + "urbit principles", + "urbit beliefs", + "digital independence", + "code is law", + "decentralized control", + "property rights", + "governance by stake", + "content neutrality", + "urbit republic", + "network governance" + ] + }, + { + "id": "blog/bootstrapping-urbit-from-ethereum.md", + "url": "https://urbit.org/blog/bootstrapping-urbit-from-ethereum", + "type": "blog", + "title": "Bootstrapping Urbit from Ethereum", + "summary": "Technical analysis of leveraging Ethereum for Urbit's identity layer while maintaining independence, discussing smart contract security, gas economics, and long-term decentralization strategy.", + "description": "We've decided to launch Urbit's constitution as a system of Ethereum contracts.", + "tags": [], + "search_terms": [ + "bootstrapping urbit", + "ethereum contracts", + "urbit constitution", + "azimuth pki", + "urbit address space", + "spark token", + "galaxy governance", + "on chain registry", + "urbit on ethereum", + "urbit land registry", + "planet sales" + ] + }, + { + "id": "blog/building-beyond-beginner-guitar.md", + "url": "https://urbit.org/blog/building-beyond-beginner-guitar", + "type": "blog", + "title": "Building 'Beyond Beginner Guitar' on Urbit", + "summary": "~nordus-mocwyl details building an Urbit-powered guitar course business today with YouTube discovery, email communication, and Stripe payments, while dreaming of a fully decentralized flow with LLM recommendations, cryptocurrency payments, and native course syncing.", + "description": "~nordus-mocwyl walks through what it took to build a guitar course and member community on Urbit", + "tags": [ + "courseware", + "hawk", + "userspace" + ], + "search_terms": [] + }, + { + "id": "blog/common-objections-to-urbit.md", + "url": "https://urbit.org/blog/common-objections-to-urbit", + "type": "blog", + "title": "Common Objections to Urbit", + "summary": "Response to frequent criticisms of Urbit including complexity concerns, adoption challenges, and decentralization tradeoffs, providing technical context and community perspectives on each objection.", + "description": "Some common objections to Urbit, discussed.", + "tags": [], + "search_terms": [ + "urbit objections", + "urbit critiques", + "urbit decentralization", + "urbit governance", + "hoon language", + "nock jets", + "urbit adoption", + "urbit scalability", + "urbit security", + "personal server concerns" + ] + }, + { + "id": "blog/community-spotlight-the-portico.md", + "url": "https://urbit.org/blog/community-spotlight-the-portico", + "type": "blog", + "title": "Community Spotlight: The Portico", + "summary": "Feature on community-governed social network application running on Urbit, demonstrating Landscape's app distribution model and explaining governance structure using Urbit IDs and star-based voting.", + "description": "Interview with The Portico founder Josh Reagan", + "tags": [], + "search_terms": [ + "portico community", + "orthodox christian", + "community spotlight", + "urbit groups", + "theology and logic", + "religious community", + "eternal september", + "decentralized communities", + "urbit culture", + "philosophy of religion", + "niche communities" + ] + }, + { + "id": "blog/contributor-spotlight-dozreg-toplud.md", + "url": "https://urbit.org/blog/contributor-spotlight-dozreg-toplud", + "type": "blog", + "title": "Contributor Spotlight: ~dozreg-toplud", + "summary": "UrWASM and SKA developer ~dozreg-toplud discusses Urbit's shallow stack, security model, and work on improving Nock performance through subject knowledge analysis.", + "description": "A peek into the mind behind UrWASM, and the undertaking to make Urbit faster", + "tags": [ + "spotlight", + "UrWASM", + "subject-knowledge analysis" + ], + "search_terms": [] + }, + { + "id": "blog/contributor-spotlight-litneb-maltyp.md", + "url": "https://urbit.org/blog/contributor-spotlight-litneb-maltyp", + "type": "blog", + "title": "Contributor Spotlight: ~litneb-maltyp", + "summary": "Designer ~litneb-maltyp discusses Urbit's identity system, owning personal servers, and building a home lab for agency over computing and digital permanence.", + "description": "A conversation with ~litneb-maltyp on Urbit identity, community, and the personal server", + "tags": [ + "spotlight", + "identity", + "design" + ], + "search_terms": [] + }, + { + "id": "blog/contributor-spotlight-mastyr-bottec.md", + "url": "https://urbit.org/blog/contributor-spotlight-mastyr-bottec", + "type": "blog", + "title": "Contributor Spotlight: ~mastyr-bottec", + "summary": "Runtime developer ~mastyr-bottec explains vere64 work enabling Urbit to store large amounts of data, including migrations and lifting file size limits.", + "description": "A conversation with runtime developer ~mastyr-bottec on his work to make Urbit store large amounts of data", + "tags": [ + "spotlight", + "vere64", + "runtime" + ], + "search_terms": [] + }, + { + "id": "blog/contributor-spotlight-niblyx-malnus-and-bonbud-macryg.md", + "url": "https://urbit.org/blog/contributor-spotlight-niblyx-malnus-and-bonbud-macryg", + "type": "blog", + "title": "Contributor Spotlight: ~bonbud-macryg & ~niblyx-malnus", + "summary": "Groundwire developers ~bonbud-macryg and ~niblyx-malnus explore Urbit for AI, building LLM tools like Clurd and MCP servers, and Urbit as a trustworthy personal computing platform.", + "description": "A conversation with Groundwire developers ~bonbud-macryg and ~niblyx-malnus on Urbit, AI, and building beautiful computers", + "tags": [ + "AI", + "design", + "architecture" + ], + "search_terms": [] + }, + { + "id": "blog/contributor-spotlight-nordus-mocwyl.md", + "url": "https://urbit.org/blog/contributor-spotlight-nordus-mocwyl", + "type": "blog", + "title": "Contributor Spotlight: ~nordus-mocwyl", + "summary": "Musician ~nordus-mocwyl discusses using Urbit for independent music distribution, building guitar courses with Hawk, and learning Hoon to understand computing from Nock upward.", + "description": "A conversation with ~nordus-mocwyl on independent music, Urbit, and direct charity", + "tags": [ + "spotlight", + "userspace", + "community" + ], + "search_terms": [] + }, + { + "id": "blog/convivial-networks.md", + "url": "https://urbit.org/blog/convivial-networks", + "type": "blog", + "title": "Convivial Networks", + "summary": "Essay on designing network protocols supporting human-scale interaction, arguing for technical architectures that enable communities to self-govern rather than imposing centralized moderation.", + "description": "Like the relationships that we build within them, our platforms should yield satisfaction precisely because they’re non-trivial; they demand effort, which is another way of saying they require engagement with the world.", + "tags": [], + "search_terms": [ + "convivial networks", + "convivial tools", + "ivan illich", + "human scale tech", + "attention economy", + "community building", + "personal computing", + "urbit community", + "peer to peer", + "ownership" + ] + }, + { + "id": "blog/creating-sigils.md", + "url": "https://urbit.org/blog/creating-sigils", + "type": "blog", + "title": "Creating Sigils", + "summary": "Technical deep-dive into sigil generation algorithm, explaining glyph encoding, color assignment logic, collision avoidance techniques, and principles for visual identity in digital networks.", + "description": "The origin and design process informing Urbit's generative user avatar system, Sigils.", + "tags": [], + "search_terms": [ + "creating sigils", + "urbit sigils", + "visual identity", + "urbit id", + "sigil design", + "generative avatars", + "phonemes", + "sigil js", + "design process", + "identity system", + "urbit names" + ] + }, + { + "id": "blog/desire-lines.md", + "url": "https://urbit.org/blog/desire-lines", + "type": "blog", + "title": "Desire Lines to a New Internet", + "summary": "The author describes web3 communities migrating to Urbit as traversing Christopher Alexander's desire lines, with Layer 2 making planet distribution affordable, DAO tooling proliferating on Landscape, and token-gated distributions scaling through projects like Dusko and PointDAO.", + "description": "As more DAOs, NFT and digital communities find their way to Urbit, others are likely to follow their paths, making them their own, just like the network itself.", + "tags": [], + "search_terms": [ + "desire lines", + "web3 communities", + "dao migration", + "urbit adoption", + "token gating", + "planet distribution", + "holium ballot", + "pointdao", + "urbit for creators", + "decentralized networks" + ] + }, + { + "id": "blog/developer-preview-vere64.md", + "url": "https://urbit.org/blog/developer-preview-vere64", + "type": "blog", + "title": "Developer Preview: vere64 runtime", + "summary": "The Urbit Foundation releases a vere64 Developer Preview enabling terabyte-scale looms through 64-bit runtime, removing the conceptual 16GB glass ceiling for experimental applications while warning it's for development ships only without migration pathways.", + "description": "A preview for developers to experience an unlimited loom using the vere64 runtime", + "tags": [ + "developer preview", + "vere64", + "runtime" + ], + "search_terms": [] + }, + { + "id": "blog/eliza.md", + "url": "https://urbit.org/blog/eliza", + "type": "blog", + "title": "Eliza", + "summary": "Introduction to AI assistant running on Urbit architecture, demonstrating how personal servers enable private, owned implementations of conversational interfaces without third-party data collection.", + "description": "Building things, even Calm™ things, makes noise.", + "tags": [], + "search_terms": [ + "eliza bot", + "urbit chatbot", + "landscape feedback", + "data collection", + "calm bot", + "urbit surveys", + "open source bot", + "urbit automation", + "anti spam", + "urbit agents", + "network economics", + "tlon bot" + ] + }, + { + "id": "blog/events-series.md", + "url": "https://urbit.org/blog/events-series", + "type": "blog", + "title": "Urbit Events Series", + "summary": "Lane Rettig launches Urbit's community event series with developer calls, a December Town Hall, and upcoming UrbitCon, designed to scale cultural knowledge transmission, document maker expertise, and foster community-led growth as the project reaches critical mass.", + "description": "These events are an opportunity for Urbit contributors to share real-time updates that don’t make it into this blog, and for the community to get to know the contributors (and one another).", + "tags": [], + "search_terms": [ + "urbit events", + "developer calls", + "community series", + "town hall", + "urbitcon", + "community building", + "urbit community", + "event series", + "grants program", + "knowledge sharing", + "developer talks" + ] + }, + { + "id": "blog/first-contract.md", + "url": "https://urbit.org/blog/first-contract", + "type": "blog", + "title": "Azimuth’s First Contract Upgrade", + "summary": "Jonathan Paprocki and Mark explain Azimuth's first Galactic Senate upgrade vote on ERC721 fixes, self-modifying proxies, and Claims contract improvements while reviewing Urbit's decentralization journey from Tlon-controlled to galaxy-owner governed.", + "description": "Galactic Senate makes first concrete action", + "tags": [], + "search_terms": [ + "azimuth upgrade", + "first contract", + "galactic senate", + "ecliptic changes", + "erc721 fix", + "claims contract", + "proxy addresses", + "urbit governance", + "doc vote", + "address space", + "azimuth vote", + "senate proposals" + ] + }, + { + "id": "blog/first-steps-towards-urbit-org.md", + "url": "https://urbit.org/blog/first-steps-towards-urbit-org", + "type": "blog", + "title": "First Steps Towards urbit.org", + "summary": "Josh Lehman announces urbit.org's separation from Tlon as a protocol steward, outlining plans for developer recruitment, grants acceleration, bounties for Landscape development, and community-driven address space distribution to mature the platform.", + "description": "With a stable platform taking shape and a strong community forming that wants to help build Urbit, it’s time to make urbit.org real.", + "tags": [], + "search_terms": [ + "urbit.org", + "urbit foundation", + "address space", + "grants program", + "interim director", + "community builders", + "governance", + "airlock", + "urbit roadmap", + "protocol stewardship", + "platform maturity" + ] + }, + { + "id": "blog/ford-fusion.md", + "url": "https://urbit.org/blog/ford-fusion", + "type": "blog", + "title": "Ford Fusion", + "summary": "Technical explanation of build system simplification eliminating traditional compilation, replacing it with filesystem-based deployment and explaining performance and reliability improvements.", + "description": "Ford Fusion was an overhaul of Urbit's over-the-air upgrade process and a rewrite of its build system. The new update system corrects a few long-standing bugs with the previous one, and the new build system is simpler, smaller (by around 5,000 lines), and easier to manage.", + "tags": [], + "search_terms": [ + "ford fusion", + "ota updates", + "build system", + "urbit upgrades", + "clay", + "hoon compiler", + "arvo kernel", + "atomic updates", + "ordered updates", + "self contained builds", + "urbit tooling" + ] + }, + { + "id": "blog/foss-1.md", + "url": "https://urbit.org/blog/foss-1", + "type": "blog", + "title": "Urbit's Open Source Culture, Part I", + "summary": "N E Davis traces Urbit's evolution from Curtis Yarvin's personal project through Tlon's skunkworks to today's thriving open source community, crediting nine factors from functional OS appeal to public build parties in cultivating radical transparency.", + "description": "How did Urbit cultivate a unique open source software culture? Let's take a look at how we got to where we are today.", + "tags": [], + "search_terms": [ + "open source culture", + "urbit history", + "skunkworks", + "developer community", + "hoon education", + "third party distribution", + "urbit foundation", + "assembly events", + "grants program", + "urbit open source" + ] + }, + { + "id": "blog/foss-2.md", + "url": "https://urbit.org/blog/foss-2", + "type": "blog", + "title": "Urbit's Open Source Culture, Part II", + "summary": "N E Davis proposes four priorities for Urbit's open source future: developing Hoon Prime for legible code, improving developer experience with better tooling, highlighting user stories, and maintaining playfulness while building toward mature documentation.", + "description": "How will Urbit continue to foster its innovative open source software culture?", + "tags": [], + "search_terms": [ + "open source culture", + "urbit foundation", + "developer experience", + "hoon prime", + "documentation", + "grants program", + "build parties", + "developer tooling", + "open source strategy", + "community" + ] + }, + { + "id": "blog/gifts-q3-2020.md", + "url": "https://urbit.org/blog/gifts-q3-2020", + "type": "blog", + "title": "Gifts Q3 2020", + "summary": "Quarterly grants distribution announcement recognizing technical contributions, documentation improvements, community building efforts, and ecosystem development work across Urbit's open source projects.", + "description": "Twice a year we distribute address space to those that have made valuable contributions to Urbit. Now called our Gifts program, the gifting of address space has been part of Urbit long before we had a grants program.", + "tags": [], + "search_terms": [ + "gifts program", + "address space", + "urbit gifts", + "community contributors", + "grants program", + "galaxy gifts", + "star awards", + "urbit foundation", + "network growth", + "urbit rewards" + ] + }, + { + "id": "blog/governance-of-urbit.md", + "url": "https://urbit.org/blog/governance-of-urbit", + "type": "blog", + "title": "Governance of urbit.org", + "summary": "Article examining governance.", + "description": "Stewardship of the Urbit Project.", + "tags": [], + "search_terms": [ + "urbit governance", + "urbit.org assets", + "urbit address space", + "azimuth property", + "galaxy grants", + "tlon stewardship", + "board of advisors", + "platform development", + "urbit foundation", + "address space pool" + ] + }, + { + "id": "blog/hackathon-2023.md", + "url": "https://urbit.org/blog/hackathon-2023", + "type": "blog", + "title": "Assembly Hackathon 2023", + "summary": "Article examining community event.", + "description": "The Assembly 2023 Hackathon was the most successful Urbit Hackathon we've had. Get a taste of Demo Day in Lisbon and check out the projects they made.", + "tags": [], + "search_terms": [ + "assembly hackathon", + "demo day", + "urbit hackathon", + "%eyas", + "urwasm", + "pharos", + "%yijing", + "%bizbaz", + "mentat", + "seax", + "urbit apps", + "lisbon" + ] + }, + { + "id": "blog/hackathon-results.md", + "url": "https://urbit.org/blog/hackathon-results", + "type": "blog", + "title": "Hackathon Results", + "summary": "Award announcements detailing winning projects across categories, judge evaluations, prize distributions, and selected submissions demonstrating landscape development progress.", + "description": "We recently held an invite-only Urbit Hackathon for graduates of our Hoon School program, and the submissions really impressed us across the board. Submissions were judged on several criteria: creativity, usefulness, and code quality.", + "tags": [], + "search_terms": [ + "urbit hackathon", + "hoon school", + "hackathon results", + "landscape apps", + "canvas app", + "rote flashcards", + "community projects", + "urbit prizes", + "developer competition", + "urbit builders" + ] + }, + { + "id": "blog/haleek-maul-interview.md", + "url": "https://urbit.org/blog/haleek-maul-interview", + "type": "blog", + "title": "NFTs, Urbit IDs, and Communities w/ Haleek Maul", + "summary": "Matt interviews Haleek Maul about Holdersland's Urbit NFT project, exploring how blockchain lowers barriers for Caribbean artists, enables peer-to-peer communities, and creates new financial structures beyond traditional music industry gatekeepers.", + "description": "An interview with the founder of Holdersland", + "tags": [], + "search_terms": [ + "haleek maul", + "holdersland", + "urbit ids", + "nfts", + "sigil art", + "digital communities", + "caribbean artists", + "assembly 2021", + "urbit dao", + "nft auction", + "urbit identity", + "crypto communities" + ] + }, + { + "id": "blog/hoon-4-lispers.md", + "url": "https://urbit.org/blog/hoon-4-lispers", + "type": "blog", + "title": "A Perspective on Lisp and Hoon", + "summary": "N E Davis compares Hoon to Lisp across syntax, metaprogramming, and philosophy, showing how Hoon's static typing, binary tree homoiconicity, and subject-oriented design advance Lisp's goals for a hundred-year computer while avoiding macro proliferation.", + "description": "Lisp is an éminence grise of programming. How does Hoon compare?", + "tags": [], + "search_terms": [ + "hoon vs lisp", + "lisp comparison", + "hoon language", + "nock", + "runes", + "homoiconic", + "metaprogramming", + "functional programming", + "hoon types", + "lisp macros", + "urbit programming" + ] + }, + { + "id": "blog/hosting-the-future.md", + "url": "https://urbit.org/blog/hosting-the-future", + "type": "blog", + "title": "Hosting the Future", + "summary": "Discussion of Urbit hosting infrastructure options including commercial providers, self-hosting guides, redundancy strategies, and long-term continuity planning for personal servers.", + "description": "The way we see it, hosting is the most important thing, next to Landscape, that Tlon can do to help Urbit continue toward widespread adoption.", + "tags": [], + "search_terms": [ + "hosting service", + "tlon hosting", + "urbit hosting", + "onboarding", + "landscape", + "hosting providers", + "tlon.io", + "self hosting", + "urbit adoption", + "urbit foundation", + "planet hosting" + ] + }, + { + "id": "blog/immunology-for-the-internet-age.md", + "url": "https://urbit.org/blog/immunology-for-the-internet-age", + "type": "blog", + "title": "Immunology for the Internet Age", + "summary": "The author draws an immunology metaphor for the Internet's evolution from high-trust academia to megacorp-dominated zero-trust systems, arguing DAOs, blockchain identity, and decentralized platforms form an immune system preserving human agency against corporate colonization.", + "description": "A consideration of the history of the Internet motivates introspection on the nature and causes of social dysfunction in a globally shared space. Centralized solutions fail to yield satisfactory outcomes for human freedom and thriving. Decentralized autonomous organizations and their technological apparatus together represent the evolution of an immune system against a corporatized Internet.", + "tags": [], + "search_terms": [ + "internet immune system", + "decentralization", + "daos", + "pseudonymity", + "megacorp", + "privacy", + "cyberpunk", + "ownership", + "urbit", + "zero trust" + ] + }, + { + "id": "blog/infrastructural.md", + "url": "https://urbit.org/blog/infrastructural", + "type": "blog", + "title": "Infrastructural", + "summary": "Technical essay examining network infrastructure requirements, explaining choices supporting long-term durability, decentralization, and resistance to single points of failure.", + "description": "A reflection–meditation on OS 1’s initial form development, and the attitude we brought to bear in designing it.", + "tags": [], + "search_terms": [ + "infrastructural", + "os1 design", + "human shaped infrastructure", + "interface design", + "beautiful infrastructure", + "digital spaces", + "os0", + "os1", + "communal computing", + "urbit interface", + "design philosophy" + ] + }, + { + "id": "blog/interim-constitution.md", + "url": "https://urbit.org/blog/interim-constitution", + "type": "blog", + "title": "Interim Constitution", + "summary": "Governance document establishing temporary constitutional framework for Urbit Foundation during transition period, defining board powers, galactic senate responsibilities, and amendment processes.", + "description": "The governing rules for the early days of the Urbit network.", + "tags": [], + "search_terms": [ + "interim constitution", + "urbit governance", + "galaxy senate", + "stellar congress", + "planetary assembly", + "consulate rules", + "urbit republic", + "address space presale", + "urbit foundation", + "galaxy table" + ] + }, + { + "id": "blog/interplanetary_commerce.md", + "url": "https://urbit.org/blog/interplanetary_commerce", + "type": "blog", + "title": "Interplanetary Commerce", + "summary": "Speculative essay on economic systems in distributed networks, arguing that Urbit's ownership model enables direct peer-to-peer commerce without intermediary platforms taking transaction fees.", + "description": "OS-level commercial primitives.", + "tags": [ + "bitcoin" + ], + "search_terms": [ + "interplanetary commerce", + "urbit payments", + "bitcoin wallet", + "lightning network", + "ship payments", + "urbit hosting", + "creator economy", + "p2p commerce", + "urbit services", + "paywalls", + "urbit bitcoin", + "commercial primitives" + ] + }, + { + "id": "blog/introducing-os1.md", + "url": "https://urbit.org/blog/introducing-os1", + "type": "blog", + "title": "Introducing OS 1", + "summary": "Launch announcement for Urbit operating system upgrade featuring Landscape interface, graph store data structure, improved network performance, and expanded application ecosystem.", + "description": "OS 1 is somewhere between ‘productivity software’ and a ‘social network’. We think it’s the beginning of an altogether new breed of social computing.", + "tags": [], + "search_terms": [ + "os1", + "introducing os1", + "landscape", + "social computing", + "urbit groups", + "chat modules", + "links module", + "publish notebook", + "urbit interface", + "community grants", + "urbit os" + ] + }, + { + "id": "blog/introduction-to-the-combine-dao.md", + "url": "https://urbit.org/blog/introduction-to-the-combine-dao", + "type": "blog", + "title": "Introduction to the Combine DAO", + "summary": "Whitepaper describing DAO governance architecture implementing bicameral decision-making, combining star-based voting with identity verification for decentralized organizational coordination.", + "description": "Inside the mind of the Combine", + "tags": [], + "search_terms": [ + "combine dao", + "urbit foundation", + "dao on urbit", + "ballot app", + "uqbar", + "urbit investing", + "dao membership", + "urbit projects", + "grants pipeline", + "dao investors" + ] + }, + { + "id": "blog/io-in-hoon.md", + "url": "https://urbit.org/blog/io-in-hoon", + "type": "blog", + "title": "Input and Output in Hoon", + "summary": "Philip Monk compares imperative, monadic, and state machine IO paradigms, defending Urbit's 90% state machine approach for permanence and robustness, with monadic threads for complex IO sequences that don't require upgradeability.", + "description": "Let's talk about IO in Urbit.", + "tags": [], + "search_terms": [ + "hoon io", + "input output", + "state machines", + "monadic io", + "urbit threads", + "urbit agents", + "arvo vanes", + "functional io", + "imperative io", + "io patterns", + "hoon programming", + "state machine io" + ] + }, + { + "id": "blog/iot.md", + "url": "https://urbit.org/blog/iot", + "type": "blog", + "title": "Lunar Urbit and the Internet of Things", + "summary": "Jonathan Paprocki argues Urbit moons solve IoT's privacy, security, and vendor lock-in problems through self-authenticating identities, deterministic state, source-independent packet routing, and peer-to-peer data markets for industrial applications like agriculture.", + "description": "Potential future use cases of moons for industry and consumers", + "tags": [], + "search_terms": [ + "lunar urbit", + "internet of things", + "urbit moons", + "iot security", + "solid state interpreter", + "self authenticating ids", + "industrial iot", + "agriculture data", + "p2p data markets", + "device identity", + "urbit ids", + "moon identities" + ] + }, + { + "id": "blog/landscape-a-portrait.md", + "url": "https://urbit.org/blog/landscape-a-portrait", + "type": "blog", + "title": "Landscape: A Portrait", + "summary": "Visual and technical introduction to Landscape interface design, explaining component architecture, interaction patterns, and principles guiding user experience development.", + "description": "On the latest Urbit user interface, and the interfaces to come.", + "tags": [], + "search_terms": [ + "landscape ui", + "urbit interface", + "modulo", + "userspace", + "indigo", + "chat publish", + "urbit apps", + "eyre vane", + "create landscape app", + "interface roadmap", + "urbit design" + ] + }, + { + "id": "blog/layer-2-faq.md", + "url": "https://urbit.org/blog/layer-2-faq", + "type": "blog", + "title": "Layer 2 FAQ", + "summary": "Frequently asked questions addressing Urbit's relationship to blockchain layer 2 solutions, clarifying architectural distinctions and explaining why Urbit doesn't require additional scaling layers.", + "description": "Answers to all your lingering L2 questions.", + "tags": [], + "search_terms": [ + "layer 2 faq", + "l2 planets", + "rollup", + "bridge", + "planet custody", + "migrate l1 to l2", + "naive rollup", + "metamask", + "buy planet", + "hosting provider" + ] + }, + { + "id": "blog/llms-on-urbit.md", + "url": "https://urbit.org/blog/llms-on-urbit", + "type": "blog", + "title": "LLMs on Urbit", + "summary": "Analysis of running large language models on personal servers, discussing privacy advantages, local inference options, and architectures for combining AI capabilities with owned infrastructure.", + "description": "A walkthrough of how to use current Urbit LLM tooling by ~niblyx-malnus", + "tags": [ + "AI", + "guides" + ], + "search_terms": [] + }, + { + "id": "blog/magic.md", + "url": "https://urbit.org/blog/magic", + "type": "blog", + "title": "Magic", + "summary": "Philosophical essay on technology's role in human experience, arguing for systems that augment rather than replace natural capabilities, and examining aesthetics of computing interfaces.", + "description": "A thought-experiment to explain the Urbit user experience.", + "tags": [], + "search_terms": [ + "urbit user experience", + "personal server vision", + "magic thought experiment", + "free your data", + "self hosted identity", + "urbit platform", + "digital freedom", + "personal cloud", + "agent software", + "urbit metaphor" + ] + }, + { + "id": "blog/metaphase.md", + "url": "https://urbit.org/blog/metaphase", + "type": "blog", + "title": "Metaphase", + "summary": "Vision statement describing Urbit's development methodology, arguing for iterative evolution through actual use rather than theoretical design, and explaining community-driven improvement cycles.", + "description": "On the upcoming and foregoing Landscape lifecycles, and other forms of mitosis across the Urbit project.", + "tags": [], + "search_terms": [ + "landscape lifecycle", + "release streams", + "graph store", + "notifications", + "stable stream", + "dev stream", + "landscape roadmap", + "userspace apps", + "urbit foundation", + "product process", + "ota updates", + "landscape teams" + ] + }, + { + "id": "blog/nockmas-2025-day-1.md", + "url": "https://urbit.org/blog/nockmas-2025-day-1", + "type": "blog", + "title": "Nockmas 2025: Day 1", + "summary": "Covers opcode 0 (Address), the fas slot operator for navigating Nock nouns as binary trees using even numbers for left branches and odd numbers for right branches.", + "description": "12 days of Nockmas: Address, opcode 0", + "tags": [ + "nock", + "nockmas" + ], + "search_terms": [] + }, + { + "id": "blog/nockmas-2025-day-10.md", + "url": "https://urbit.org/blog/nockmas-2025-day-10", + "type": "blog", + "title": "Nockmas 2025: Day 10", + "summary": "Covers opcode 9 (Invoke), evaluating a core from formula c then executing the arm at address b within that core with the core itself as subject.", + "description": "12 days of Nockmas: Invoke, opcode 9", + "tags": [ + "nock", + "nockmas" + ], + "search_terms": [] + }, + { + "id": "blog/nockmas-2025-day-11.md", + "url": "https://urbit.org/blog/nockmas-2025-day-11", + "type": "blog", + "title": "Nockmas 2025: Day 11", + "summary": "Covers opcode 10 (Edit), the hax # operator replacing a noun at a given address within a structure with a new value, used for gate calls and memory optimization.", + "description": "12 days of Nockmas: Edit, opcode 10", + "tags": [ + "nock", + "nockmas" + ], + "search_terms": [] + }, + { + "id": "blog/nockmas-2025-day-12.md", + "url": "https://urbit.org/blog/nockmas-2025-day-12", + "type": "blog", + "title": "Nockmas 2025: Day 12", + "summary": "Covers opcode 11 (Hint), attaching metadata to Nock expressions without affecting evaluation, supporting static tags and dynamic hints for runtime optimizations.", + "description": "12 days of Nockmas: Hint, opcode 11", + "tags": [ + "nock", + "nockmas" + ], + "search_terms": [] + }, + { + "id": "blog/nockmas-2025-day-2.md", + "url": "https://urbit.org/blog/nockmas-2025-day-2", + "type": "blog", + "title": "Nockmas 2025: Day 2", + "summary": "Covers opcode 1 (Constant), which returns its argument b while ignoring the subject, used for storing data and executable Nock expressions for later evaluation.", + "description": "12 days of Nockmas: Constant, opcode 1", + "tags": [ + "nock", + "nockmas" + ], + "search_terms": [] + }, + { + "id": "blog/nockmas-2025-day-3.md", + "url": "https://urbit.org/blog/nockmas-2025-day-3", + "type": "blog", + "title": "Nockmas 2025: Day 3", + "summary": "Covers opcode 2 (Evaluate), which computes a new subject from formula b and a new formula from formula c, enabling dynamic code execution and metaprogramming.", + "description": "12 days of Nockmas: Evaluate, opcode 2", + "tags": [ + "nock", + "nockmas" + ], + "search_terms": [] + }, + { + "id": "blog/nockmas-2025-day-4.md", + "url": "https://urbit.org/blog/nockmas-2025-day-4", + "type": "blog", + "title": "Nockmas 2025: Day 4", + "summary": "Covers opcode 3 (Cell Check), the wut ? operator testing whether a noun is a cell (returns 0) or atom (returns 1), used for type discrimination.", + "description": "12 days of Nockmas: Cell Check, opcode 3", + "tags": [ + "nock", + "nockmas" + ], + "search_terms": [] + }, + { + "id": "blog/nockmas-2025-day-5.md", + "url": "https://urbit.org/blog/nockmas-2025-day-5", + "type": "blog", + "title": "Nockmas 2025: Day 5", + "summary": "Covers opcode 4 (Increment), the lus + operator adding 1 to an atom, Nock's only arithmetic primitive from which all other arithmetic must be built.", + "description": "12 days of Nockmas: Increment, opcode 4", + "tags": [ + "nock", + "nockmas" + ], + "search_terms": [] + }, + { + "id": "blog/nockmas-2025-day-6.md", + "url": "https://urbit.org/blog/nockmas-2025-day-6", + "type": "blog", + "title": "Nockmas 2025: Day 6", + "summary": "Covers opcode 5 (Equality Check), the tis = operator testing deep structural equality between two nouns, returning 0 if equal and 1 if not.", + "description": "12 days of Nockmas: Equality Check, opcode 5", + "tags": [ + "nock", + "nockmas" + ], + "search_terms": [] + }, + { + "id": "blog/nockmas-2025-day-7.md", + "url": "https://urbit.org/blog/nockmas-2025-day-7", + "type": "blog", + "title": "Nockmas 2025: Day 7", + "summary": "Covers opcode 6 (Conditional), evaluating a test formula and returning either branch c for true (0) or d for false (1), implementing if-then-else logic.", + "description": "12 days of Nockmas: Conditional, opcode 6", + "tags": [ + "nock", + "nockmas" + ], + "search_terms": [] + }, + { + "id": "blog/nockmas-2025-day-8.md", + "url": "https://urbit.org/blog/nockmas-2025-day-8", + "type": "blog", + "title": "Nockmas 2025: Day 8", + "summary": "Covers opcode 7 (Compose), evaluating b then using that result as the subject for c, implementing the pipe pattern for sequential function composition.", + "description": "12 days of Nockmas: Compose, opcode 7", + "tags": [ + "nock", + "nockmas" + ], + "search_terms": [] + }, + { + "id": "blog/nockmas-2025-day-9.md", + "url": "https://urbit.org/blog/nockmas-2025-day-9", + "type": "blog", + "title": "Nockmas 2025: Day 9", + "summary": "Covers opcode 8 (Extend), pinning a new value to the head of the subject then evaluating the body, implementing variable binding where the new value is accessible at address 2.", + "description": "12 days of Nockmas: Extend, opcode 8", + "tags": [ + "nock", + "nockmas" + ], + "search_terms": [] + }, + { + "id": "blog/nockmas-2025-welcome.md", + "url": "https://urbit.org/blog/nockmas-2025-welcome", + "type": "blog", + "title": "Nockmas 2025: Day 0", + "summary": "Introduces autocons, Nock's fundamental cell construction rule where formula structure becomes result structure, making cell construction free and enabling Nock's minimal design.", + "description": "12 days of Nockmas: Intoducing autocons", + "tags": [ + "nock", + "nockmas", + "autocons" + ], + "search_terms": [] + }, + { + "id": "blog/nockpu.md", + "url": "https://urbit.org/blog/nockpu", + "type": "blog", + "title": "NockPU", + "summary": "Noah Kumin describes ~mopfel-winrux's NockPU hardware project, explaining how a stackless, tree-traversal-optimized processor differs from von Neumann architecture and could enable ultra-efficient Nock execution on bare metal.", + "description": "A light technical description of NockPU, a hardware system for running Nock", + "tags": [], + "search_terms": [ + "nockpu", + "nock hardware", + "nock processing unit", + "bare metal nock", + "hardware jets", + "tree traversal", + "binary tree", + "urbit hardware", + "mopfel winrux" + ] + }, + { + "id": "blog/olif-and-urbit-ids.md", + "url": "https://urbit.org/blog/olif-and-urbit-ids", + "type": "blog", + "title": "Olif and Urbit IDs", + "summary": "Technical specification for Olif identity format extension, explaining compatibility with existing Urbit ID standards and advantages for specific application use cases.", + "description": "An Olfactive rendering of Urbit Address Space", + "tags": [ + "olif", + "identity", + "design" + ], + "search_terms": [] + }, + { + "id": "blog/on-christopher-alexander.md", + "url": "https://urbit.org/blog/on-christopher-alexander", + "type": "blog", + "title": "On Christopher Alexander", + "summary": "Essay examining architect Christopher Alexander's influence on Urbit design philosophy, discussing patterns language, town building principles, and technology's relationship to human flourishing.", + "description": "An overview of his writing and relevance", + "tags": [], + "search_terms": [ + "christopher alexander", + "pattern language", + "timeless way", + "nature of order", + "design philosophy", + "architecture theory", + "quality without name", + "living structure", + "software design", + "urbit design", + "pattern languages", + "alexander influence" + ] + }, + { + "id": "blog/pin-the-face-that-launches-a-thousand-ships.md", + "url": "https://urbit.org/blog/pin-the-face-that-launches-a-thousand-ships", + "type": "blog", + "title": "Pin the Face that Launches a Thousand Ships", + "summary": "~nospex-larsut addresses standard hesitations to learning Hoon, arguing that Hoon's difficulty creates opportunity, Urbit's momentum is accelerating with new apps and hosting options, and learning now positions developers to benefit from early involvement.", + "description": "A guest post by ~nospex-larsut", + "tags": [], + "search_terms": [ + "learn hoon", + "hoon hesitations", + "pin the face", + "urbit apps", + "onboarding", + "hosting providers", + "hoon school", + "urbit adoption", + "runes", + "hoon community" + ] + }, + { + "id": "blog/pki-maze.md", + "url": "https://urbit.org/blog/pki-maze", + "type": "blog", + "title": "Designing a Permanent Personal Identity", + "summary": "Philip Monk explores Urbit's PKI design through an idea maze, explaining the tradeoffs between comets (plentiful, self-sovereign, impermanent), planets (scarce, permanent, self-sovereign), and moons (plentiful, permanent, planet-controlled) identities.", + "description": "A public key infrastructure (PKI) is a system for binding a set of keys to a name. Sometimes a small amount of metadata is included.", + "tags": [], + "search_terms": [ + "permanent identity", + "urbit pki", + "public key infrastructure", + "comets planets moons", + "key rotation", + "blockchain pki", + "self sovereign identity", + "urbit ids", + "idea maze", + "global consistency", + "key revocation" + ] + }, + { + "id": "blog/platform-decay.md", + "url": "https://urbit.org/blog/platform-decay", + "type": "blog", + "title": "Platform Decay, Decentralized Marketplaces, and Urbit", + "summary": "Nicholas Simmons argues e-commerce platforms decay toward exploitation, advocating decentralized marketplaces on Urbit with personal data ownership, neutral reputation systems, and calm commerce to restore fair vendor-customer relationships.", + "description": "Urbit is calm computing. Calm commerce follows naturally.", + "tags": [], + "search_terms": [ + "platform decay", + "decentralized marketplaces", + "calm commerce", + "data ownership", + "urbit commerce", + "reputation systems", + "ecommerce platforms", + "marketplace protocols", + "urbit id", + "micropayments", + "privacy markets" + ] + }, + { + "id": "blog/precepts.md", + "url": "https://urbit.org/blog/precepts", + "type": "blog", + "title": "Precepts", + "summary": "Formal statement of core principles including simplicity, durability, ownership, and user control, serving as decision framework for ongoing development work.", + "description": "Technical maxims that define Urbit's approach to engineering.", + "tags": [], + "search_terms": [ + "urbit precepts", + "engineering principles", + "system design", + "technical maxims", + "data over code", + "cqrs", + "pubsub", + "determinism", + "timeless software", + "hoon principles", + "urbit architecture", + "software discipline" + ] + }, + { + "id": "blog/precepts-discussion.md", + "url": "https://urbit.org/blog/precepts-discussion", + "type": "blog", + "title": "Precepts: Discussion", + "summary": "Philip Monk justifies Urbit's precepts across general design, specific design, attitude, theory, text style, and real software, defending mechanical simplicity, state machines for permanence, and deterministic computing as essential to lasting software.", + "description": "The precepts aren’t arguments. We discuss and justify them here.", + "tags": [], + "search_terms": [ + "precepts discussion", + "urbit principles", + "design rationale", + "mechanical simplicity", + "code discipline", + "system design", + "real software", + "engineering attitude", + "theory and practice", + "urbit philosophy", + "abstractions" + ] + }, + { + "id": "blog/providers.md", + "url": "https://urbit.org/blog/providers", + "type": "blog", + "title": "Providers", + "summary": "Ecosystem announcement documenting third-party hosting services, comparing offerings, pricing, and features while maintaining standards for reliability and data portability.", + "description": "We’ve always assumed that providers would have to come into existence sooner or later. By the look of it, that time is now. Tlon and a few others have provider-like services in the works.", + "tags": [], + "search_terms": [ + "urbit providers", + "hosting providers", + "onboarding", + "planet hosting", + "urbit service", + "address space", + "provider business", + "urbit hosting", + "community access", + "provider examples", + "tlon provider" + ] + }, + { + "id": "blog/pseudonymous-reputation.md", + "url": "https://urbit.org/blog/pseudonymous-reputation", + "type": "blog", + "title": "Building Your DAO with Pseudonymous Reputation on Urbit", + "summary": "Anthony Arroyo explains how Combine DAO uses Urbit ID's pseudonymous reputation to select members based on past network behavior, solving DAO trust and accountability issues while maintaining anonymity and avoiding token-gated limitations.", + "description": "Using Urbit ID’s pseudonymous reputation model, DAO participants know Urbit ID holders’ past behavior before relying on them, and without sacrificing anonymity.", + "tags": [], + "search_terms": [ + "pseudonymous reputation", + "urbit id", + "dao membership", + "combine dao", + "token gated", + "trust and anonymity", + "urbit ids", + "dao governance", + "crypto identity", + "reputation" + ] + }, + { + "id": "blog/rollups.md", + "url": "https://urbit.org/blog/rollups", + "type": "blog", + "title": "The Gang Solves the Gas Crisis", + "summary": "Jonathan Paprocki explains Tlon's naive rollups layer-2 solution for reducing Urbit ID gas costs by 65x, detailing user experience changes, one-way migration, roller setup, and security guarantees that preserve ship sovereignty.", + "description": "How we're making Urbit ID affordable again", + "tags": [], + "search_terms": [ + "gas crisis", + "layer 2", + "naive rollups", + "urbit id fees", + "ethereum gas", + "bridge update", + "roller node", + "layer 2 planets", + "layer 1 vs 2", + "azimuth changes", + "star owners", + "rollup security" + ] + }, + { + "id": "blog/security-and-continuity.md", + "url": "https://urbit.org/blog/security-and-continuity", + "type": "blog", + "title": "Security and Continuity", + "summary": "Discussion of system resilience strategies including backup procedures, disaster recovery planning, and long-term data preservation for personal servers.", + "description": "An update on our primary infrastructure milestones for 2020.", + "tags": [], + "search_terms": [ + "security continuity", + "ames audit", + "network breaches", + "continuity breach", + "version negotiation", + "data migration", + "urbit uptime", + "azimuth vote", + "galaxy vote", + "urbit security", + "protocol milestones", + "infrastructure goals" + ] + }, + { + "id": "blog/security-audit.md", + "url": "https://urbit.org/blog/security-audit", + "type": "blog", + "title": "Ames Security Audit and the Future of the Protocol", + "summary": "Article examining security audit.", + "description": "Ames’ design has unparalleled potential to deter, mitigate, and recover from attacks, since every packet is authenticated and encrypted and backed by a stable, decentralized PKI.", + "tags": [], + "search_terms": [ + "ames security", + "protocol audit", + "urbit security", + "forward secrecy", + "dos attacks", + "ddos mitigation", + "ames protocol", + "urbit pki", + "networking keys", + "cryptographic audit", + "social boundaries", + "security roadmap" + ] + }, + { + "id": "blog/simple-durable-yours.md", + "url": "https://urbit.org/blog/simple-durable-yours", + "type": "blog", + "title": "Simple, Durable, Yours", + "summary": "Philosophical framing of Urbit's design goals, explaining how simplicity enables durability and why user ownership is fundamental to trustworthy computing.", + "description": "We built Urbit from scratch to be a system that’s simple, durable, and yours. Everything that computing today is not — but should be.", + "tags": [], + "search_terms": [ + "simple durable yours", + "urbit overview", + "digital home", + "personal computing", + "urbit os", + "urbit id", + "calm computing", + "durable software", + "own your data", + "decentralized system" + ] + }, + { + "id": "blog/smart-home-of-the-future.md", + "url": "https://urbit.org/blog/smart-home-of-the-future", + "type": "blog", + "title": "The Smart Home of the Future", + "summary": "This grant research explores smart home privacy needs, arguing Urbit's identity model should prioritize access control over legible reputation, enabling communal computing while respecting contextual integrity and household relationships.", + "description": "Homes are getting smarter. A smart home is no longer just a collection of smart devices but a superorganism of data-collecting objects. These people and devices who use and inhabit these homes form a complex socio-technical system. What is the future of the smart home and how will Urbit fit into it?", + "tags": [], + "search_terms": [ + "smart home", + "communal computing", + "iot", + "urbit identity", + "privacy", + "contextual integrity", + "home data", + "smart devices", + "gall app", + "communal computing grant" + ] + }, + { + "id": "blog/sovereign-intelligence.md", + "url": "https://urbit.org/blog/sovereign-intelligence", + "type": "blog", + "title": "Sovereign Intelligence", + "summary": "Vision statement for personal AI systems running on owned infrastructure, arguing for models that augment rather than replace human decision-making while protecting user privacy.", + "description": "Urbit offers a bicameral future for personal AI. One side stable. One side fluid. Each stronger with the other", + "tags": [ + "AI", + "privacy", + "sovereignty" + ], + "search_terms": [] + }, + { + "id": "blog/stable-arvo.md", + "url": "https://urbit.org/blog/stable-arvo", + "type": "blog", + "title": "Stable Arvo", + "summary": "Milestone announcement for Arvo operating system stabilization, describing testing completion, API freeze, migration guides for existing applications, and long-term support commitments.", + "description": "This year we set out to get Arvo to a point that we can credibly call ‘stable.'", + "tags": [], + "search_terms": [ + "stable arvo", + "kernel stability", + "ames rewrite", + "continuity breach", + "kelvin versioning", + "upgrade mechanics", + "urbit resilience", + "network protocol", + "error recovery", + "crud events", + "arvo upgrades" + ] + }, + { + "id": "blog/state-of-urbit.md", + "url": "https://urbit.org/blog/state-of-urbit", + "type": "blog", + "title": "State of Urbit", + "summary": "Comprehensive progress report covering technical development, community growth, application ecosystem expansion, and strategic priorities for ongoing platform evolution.", + "description": "A year in review", + "tags": [], + "search_terms": [ + "state of urbit", + "urbit year review", + "landscape app", + "os1 landscape", + "urbit hosting", + "urbit onboarding", + "urbit id fees", + "naive rollups", + "grid interface", + "software distribution", + "assembly 2021", + "urbit roadmap" + ] + }, + { + "id": "blog/subassembly-hackathon-2024.md", + "url": "https://urbit.org/blog/subassembly-hackathon-2024", + "type": "blog", + "title": "Subssembly Hackathon 2024", + "summary": "Article examining community event.", + "description": "Use Login with Urbit ID in your app and win Urbit Stars", + "tags": [], + "search_terms": [ + "subassembly hackathon", + "login with urbit id", + "urbit stars", + "hackathon 2024", + "azimake", + "create react azimuth app", + "identity authentication", + "urbit id login", + "subassembly event", + "azimuth app" + ] + }, + { + "id": "blog/the-100-year-computer.md", + "url": "https://urbit.org/blog/the-100-year-computer", + "type": "blog", + "title": "The 100-Year Computer", + "summary": "Galen Wolfe-Pauly describes Urbit as a durable, reliable computer designed to never lose data, update itself continuously, and remain functional for decades without user intervention or ads.", + "description": "One way to think about Urbit: as a \"100-year computer.\"", + "tags": [], + "search_terms": [ + "100 year computer", + "durable computing", + "personal server", + "permanent data", + "urbit overview", + "long term computing", + "reliable computer", + "continuous updates", + "future proof", + "urbit vision" + ] + }, + { + "id": "blog/the-dao-as-a-lesson-in-decentralized-governance.md", + "url": "https://urbit.org/blog/the-dao-as-a-lesson-in-decentralized-governance", + "type": "blog", + "title": "The DAO as a Lesson in Decentralized Governance", + "summary": "Case study analysis of Ethereum DAO collapse, examining smart contract vulnerabilities, governance failures, and lessons applied to Urbit's constitutional framework.", + "description": "What's the right lesson for the decentralization community to learn from the collapse of the DAO?", + "tags": [], + "search_terms": [ + "dao collapse", + "decentralized governance", + "blockchain governance", + "decentralization theater", + "ethereum fork", + "code is law", + "sovereignty conserved", + "dao rollback", + "governance institutions", + "urbit governance" + ] + }, + { + "id": "blog/the-missing-middle.md", + "url": "https://urbit.org/blog/the-missing-middle", + "type": "blog", + "title": "The Missing Middle", + "summary": "Analysis of gaps in current internet infrastructure, describing mid-tier services and protocols that don't fit binary choices between massive platforms and individual self-hosting.", + "description": "Urbit stars can facilitate a flexible continuum of community norms.", + "tags": [], + "search_terms": [ + "missing middle", + "urbit stars", + "community norms", + "network governance", + "star providers", + "decentralized communities", + "urbit infrastructure", + "routing hubs", + "social technology", + "community governance", + "digital commons" + ] + }, + { + "id": "blog/the-shape-of-dao-governance-to-come.md", + "url": "https://urbit.org/blog/the-shape-of-dao-governance-to-come", + "type": "blog", + "title": "The Shape of DAO Governance to Come", + "summary": "Forward-looking discussion on decentralized organizational evolution, predicting patterns of coordination and exploring how Urbit's identity layer enables new governance models.", + "description": "When building the Combine DAO, we conducted a survey of DAO governance and tooling and came to the conclusion that the many theoretical approaches to the problem of governance were tied to the implementation details of the DAO stack. Since we were building everything on Urbit—as opposed to through the typical combination of Solidity contracts, Web2 tools and Snapshot—we realized that we’d have to do some rethinking. A new approach for a new stack.", + "tags": [], + "search_terms": [ + "dao governance", + "combine dao", + "ballot app", + "custom actions", + "pseudonymous reputation", + "governance attacks", + "moloch dao", + "snapshot voting", + "urbit dao tools", + "ragequit" + ] + }, + { + "id": "blog/the-state-of-landscape.md", + "url": "https://urbit.org/blog/the-state-of-landscape", + "type": "blog", + "title": "The State of Landscape", + "summary": "Status report on Landscape interface development covering feature releases, usability improvements, performance optimizations, and roadmap for upcoming releases.", + "description": "An update on the state of Landscape and the Urbit network.", + "tags": [], + "search_terms": [ + "state of landscape", + "landscape update", + "chat interface", + "urbit ui", + "arvo network", + "landscape bugs", + "ios app", + "community chats", + "urbit help", + "modulo roadmap" + ] + }, + { + "id": "blog/the-understanding-urbit-podcast.md", + "url": "https://urbit.org/blog/the-understanding-urbit-podcast", + "type": "blog", + "title": "The Understanding Urbit Podcast", + "summary": "Announcement of educational podcast series making Urbit concepts accessible through interviews, technical discussions, and community stories.", + "description": "An interview-based podcast series about the Urbit project, as told by those working on it.", + "tags": [], + "search_terms": [ + "understanding urbit podcast", + "urbit podcast", + "interviews", + "tlon team", + "urbit philosophy", + "nock performance", + "technology talks", + "podcast series", + "urbit interviews", + "streaming platforms" + ] + }, + { + "id": "blog/the-urbit-address-space.md", + "url": "https://urbit.org/blog/the-urbit-address-space", + "type": "blog", + "title": "The Urbit Address Space", + "summary": "Technical specification for cryptographic identity system, explaining galaxy-planet-moon hierarchy, star minting economics, and how address space enables secure communication.", + "description": "An overview of Urbit's cryptographic address space.", + "tags": [], + "search_terms": [ + "urbit address space", + "urbit ships", + "galaxies stars planets", + "urbit identity", + "urbit pki", + "ship hierarchy", + "urbit governance", + "digital land", + "ship scarcity", + "urbit naming" + ] + }, + { + "id": "blog/tools-of-our-own.md", + "url": "https://urbit.org/blog/tools-of-our-own", + "type": "blog", + "title": "Tools of Our Own", + "summary": "Manifesto for building personal computing tools users control, arguing against platform dependency and describing benefits of self-hosted, open source software.", + "description": "What is a digital environment? What does it mean to shape your own digital environment?", + "tags": [], + "search_terms": [ + "tools of our own", + "digital environment", + "conversational tools", + "urbit philosophy", + "social graph", + "collective tools", + "convivial tools", + "personal computing", + "system control", + "urbit communities", + "digital autonomy" + ] + }, + { + "id": "blog/toward-a-frozen-operating-system.md", + "url": "https://urbit.org/blog/toward-a-frozen-operating-system", + "type": "blog", + "title": "Toward a Frozen Operating System", + "summary": "Philosophical essay on software evolution, discussing when systems should stabilize versus continue changing, and Urbit's approach through Hoon's immutability guarantees.", + "description": "Is it possible to freeze an entire OS?", + "tags": [], + "search_terms": [ + "frozen operating system", + "kelvin versioning", + "urbit os design", + "freezable os", + "nock hoon arvo", + "telescoping kelvins", + "palm tree model", + "system stability", + "urbit platform", + "infinite maturity" + ] + }, + { + "id": "blog/toward-a-new-clay.md", + "url": "https://urbit.org/blog/toward-a-new-clay", + "type": "blog", + "title": "Toward a New %clay", + "summary": "Curtis Yarvin proposes comprehensive redesign of Urbit's %clay revision control system, addressing storage models, Unix mounting, merge semantics, and security while inviting community contributions to improve the typed DVCS.", + "description": "Urbit's revision-control system, %clay, is itself due for a (medium-sized) revision!", + "tags": [], + "search_terms": [ + "clay revision control", + "urbit filesystem", + "%clay redesign", + "urbit dvcs", + "desk mounting", + "urbit namespace", + "mark system", + "clay storage", + "urbit version control", + "clay community" + ] + }, + { + "id": "blog/urbit-and-bitcoin.md", + "url": "https://urbit.org/blog/urbit-and-bitcoin", + "type": "blog", + "title": "Urbit and Bitcoin", + "summary": "Analysis of cryptocurrency integration with Urbit, discussing Bitcoin philanthropy, Azimuth transactions on Ethereum, and synergies between different cryptographic asset systems.", + "description": "A sound money deserves a sound computer.", + "tags": [ + "bitcoin" + ], + "search_terms": [ + "urbit and bitcoin", + "sound money", + "bitcoin integration", + "urbit wallet", + "bitcoin grants", + "urbit os", + "peer to peer", + "sound computer", + "btc bounties", + "crypto payments" + ] + }, + { + "id": "blog/urbit-and-the-blockchain.md", + "url": "https://urbit.org/blog/urbit-and-the-blockchain", + "type": "blog", + "title": "Urbit and the Blockchain Wars", + "summary": "Curtis Yarvin explains Urbit's pragmatic decision to bootstrap on Ethereum despite criticisms, detailing governance migration options, security models, and why Urbit uses Ethereum as a land registry rather than endorsing the platform.", + "description": "A bit about the 'idea maze' of choosing to bootstrap from Ethereum.", + "tags": [], + "search_terms": [ + "urbit blockchain", + "ethereum bootstrap", + "urbit pki", + "blockchain wars", + "urbit land registry", + "on chain governance", + "ethereum critique", + "consensus engine", + "urbit on ethereum", + "chain migration" + ] + }, + { + "id": "blog/urbit-creator-daos.md", + "url": "https://urbit.org/blog/urbit-creator-daos", + "type": "blog", + "title": "Urbit + Creator DAOs with Justin Murphy", + "summary": "Justin Murphy builds Other Life as a Creator DAO on Urbit, demonstrating how Straw enables democratic publishing, Ballot allows decentralized membership management, and Urbit's P2P real estate provides unprecedented durability and ownership.", + "description": "Creator DAOs are blank slates, new foundational cryptographic patterns just beginning to take shape. Justin Murphy thinks Urbit is the most obvious place to start building one.", + "tags": [], + "search_terms": [ + "creator dao", + "justin murphy", + "other life", + "urbit groups", + "straw app", + "ballot", + "creator economy", + "dao governance", + "p2p community", + "urbit id" + ] + }, + { + "id": "blog/urbit-for-creators.md", + "url": "https://urbit.org/blog/urbit-for-creators", + "type": "blog", + "title": "Urbit Is for Creators", + "summary": "Noah Kumin argues Urbit offers creators freedom from algorithmic manipulation and platform dependency, enabling direct peer-to-peer distribution, ownership of work, and sustainable communities through durable infrastructure.", + "description": "Urbit is for creators who are ready to wake up from this bad dream.", + "tags": [], + "search_terms": [ + "urbit for creators", + "creator economy", + "p2p creators", + "content ownership", + "1000 true fans", + "creator community", + "peer to peer payments", + "no middlemen", + "urbit creators", + "digital sovereignty" + ] + }, + { + "id": "blog/urbit-for-normies.md", + "url": "https://urbit.org/blog/urbit-for-normies", + "type": "blog", + "title": "Urbit for Normies", + "summary": "Accessibility guide explaining Urbit concepts in plain language, addressing common confusion points, and providing entry paths for non-technical users.", + "description": "A layperson’s guide to the coming new internet.", + "tags": [], + "search_terms": [ + "urbit for normies", + "layperson guide", + "new internet", + "peer to peer", + "privacy", + "personal server", + "urbit ids", + "calm computing", + "digital autonomy", + "urbit overview", + "decentralized web" + ] + }, + { + "id": "blog/urbit-grants-and-mid-2019-gifts.md", + "url": "https://urbit.org/blog/urbit-grants-and-mid-2019-gifts", + "type": "blog", + "title": "Urbit Grants and mid-2019 Gifts", + "summary": "Article examining grants distribution.", + "description": "Announcing an upcoming Urbit grants program and star gifts for Mid-2019.", + "tags": [], + "search_terms": [ + "urbit grants", + "mid 2019 gifts", + "star gifts", + "developer rewards", + "grants program", + "azimuth stars", + "community contributors", + "gift program", + "urbit awards" + ] + }, + { + "id": "blog/urbit-is-for-communities.md", + "url": "https://urbit.org/blog/urbit-is-for-communities", + "type": "blog", + "title": "Urbit is for Communities", + "summary": "Announcement of Urbit 0.8.0 release emphasizing community features, group governance tools, and applications supporting collective organization and collaboration.", + "description": "Urbit is for giving communities the tools to shape their own environments; for us all to feel a sense of life and self-directedness in the digital world.", + "tags": [], + "search_terms": [ + "urbit for communities", + "community tools", + "digital homesteading", + "os1", + "high trust", + "digital environment", + "self hosting", + "community software", + "urbit philosophy", + "community modules", + "digital commons" + ] + }, + { + "id": "blog/urbithost-interview.md", + "url": "https://urbit.org/blog/urbithost-interview", + "type": "blog", + "title": "An Interview with UrbitHost", + "summary": "Article covering conversation and technical deep-dive, examining technical deep-dive and conversation.", + "description": "Interview with the founder of UrbitHost ~lavlyn-litmeg", + "tags": [], + "search_terms": [ + "urbithost", + "hosting provider", + "urbit hosting", + "landscape access", + "kubernetes", + "automated hosting", + "layer 2", + "khan vane", + "software distribution", + "hosted urbit", + "onboarding", + "commercial providers" + ] + }, + { + "id": "blog/using-urbit-in-2023.md", + "url": "https://urbit.org/blog/using-urbit-in-2023", + "type": "blog", + "title": "Using Urbit in 2023", + "summary": "Practical guide for new users covering initial setup, basic operations, landscape navigation, application recommendations, and community involvement opportunities.", + "description": "There are more ways to run Urbit than ever, and more options coming soon.", + "tags": [], + "search_terms": [ + "using urbit 2023", + "hosting providers", + "command line", + "cloud hosting", + "port app", + "windows binary", + "native planet", + "tlon hosting", + "run urbit", + "vps" + ] + }, + { + "id": "blog/value-of-address-space-pt1.md", + "url": "https://urbit.org/blog/value-of-address-space-pt1", + "type": "blog", + "title": "The Value of Urbit Address Space (1 of 3)", + "summary": "Erik Newton and Galen Wolfe-Pauly explain what Urbit ID is, its history of distribution, and draw analogies to DNS, ISPs, CDNs, land, and dealer-operators to understand address space value beyond planet prices.", + "description": "An expansion of our position on Urbit's address space value.", + "tags": [], + "search_terms": [ + "address space value", + "urbit ids", + "azimuth", + "digital asset", + "scarce ids", + "network structure", + "galaxies stars planets", + "address space history", + "urbit land", + "identity system", + "decentralized web" + ] + }, + { + "id": "blog/value-of-address-space-pt2.md", + "url": "https://urbit.org/blog/value-of-address-space-pt2", + "type": "blog", + "title": "The Value of Urbit Address Space (2 of 3)", + "summary": "Erik Newton and Galen Wolfe-Pauly analyze Urbit address space value through scarcity, utility, liquidity, and network effect, examining trading patterns and explaining why Reed's law best describes Urbit's network effects.", + "description": "Scarcity, utility, liquidity, and network effect.", + "tags": [], + "search_terms": [ + "address space value", + "scarcity", + "utility", + "liquidity", + "network effect", + "urbit ids", + "planet prices", + "star prices", + "address space trading", + "urbit scarcity", + "network laws", + "urbit tokens" + ] + }, + { + "id": "blog/value-of-address-space-pt3.md", + "url": "https://urbit.org/blog/value-of-address-space-pt3", + "type": "blog", + "title": "The Value of Urbit Address Space (3 of 3)", + "summary": "Erik Newton and Galen Wolfe-Pauly explain lockups and spawning limits for Urbit address space, discuss distribution estimates, and clarify why privacy-by-design limits usage data collection despite the network explorer's development.", + "description": "", + "tags": [], + "search_terms": [ + "address space value", + "urbit ids", + "lockups", + "spawning limits", + "galaxy distribution", + "star unlocks", + "network effects", + "urbit scarcity", + "usage metrics", + "network explorer", + "address space trade" + ] + }, + { + "id": "blog/what-is-urbit-for.md", + "url": "https://urbit.org/blog/what-is-urbit-for", + "type": "blog", + "title": "What is Urbit For?", + "summary": "Galen Wolfe-Pauly outlines Urbit's vision for peer-to-peer computing, from self-hosted publishing and cryptographic identity today to data permanence, reputation systems, and IoT in the future.", + "description": "A vision of the Urbit-powered future.", + "tags": [], + "search_terms": [ + "what is urbit for", + "urbit future", + "personal server vision", + "cryptographic identity", + "self hosted publishing", + "web programmable", + "blockchain complement", + "data permanence", + "reputation systems", + "urbit iot" + ] + }, + { + "id": "blog/why-hoon.md", + "url": "https://urbit.org/blog/why-hoon", + "type": "blog", + "title": "Why Hoon?", + "summary": "Ted Blackman explains Hoon's unique promise: enabling a purely functional operating system with hot code reload, typesafe metaprogramming, and universal serialization at full performance through jets and Nock.", + "description": "The promise of Urbit lies in its reimagination of the digital world using components that are as constrained and limited as possible.", + "tags": [], + "search_terms": [ + "why hoon", + "hoon language", + "nock vm", + "functional os", + "hot code reload", + "metaprogramming", + "urbit stack", + "axiomatic", + "purely functional", + "urbit compiler", + "minimalism" + ] + }, + { + "id": "blog/why-urbit-probably-does-not-need-a-blockchain.md", + "url": "https://urbit.org/blog/why-urbit-probably-does-not-need-a-blockchain", + "type": "blog", + "title": "Why Urbit Probably Doesn't Need a Blockchain", + "summary": "Curtis Yarvin argues Urbit's PKI is a special case of a consensus ledger, explaining why the double-sell problem can be solved without full Nakamoto consensus through governance, routing topology, and patience.", + "description": "Urbit (probably) doesn't need a blockchain, because the Urbit address-space PKI is a special case of a consensus ledger.", + "tags": [], + "search_terms": [ + "urbit blockchain", + "urbit pki", + "address space ledger", + "worse is better", + "double sell problem", + "urbit consensus", + "urbit governance", + "ships and wills", + "gossip propagation", + "urbit without blockchain" + ] + }, + { + "id": "blog/your-last-computer.md", + "url": "https://urbit.org/blog/your-last-computer", + "type": "blog", + "title": "Your Last Computer", + "summary": "Vision essay describing computing experience where technology recedes into background, devices endure for decades, and users maintain permanent control over digital infrastructure.", + "description": "Your Urbit is a simpler computer, a quieter computer, a more private computer. We want it to feel predictable, safe, and reliable — things only a complete, sealed system can do. This, we hope, can get us a world where technology keeps us connected, but doesn’t dominate our lives.", + "tags": [], + "search_terms": [ + "your last computer", + "urbit os", + "digital life", + "social computing", + "sealed system", + "private computer", + "urbit communities", + "personal server", + "calm computing", + "future computing" + ] + }, + { + "id": "communities/urbit-austin.md", + "url": "https://urbit.org/communities/urbit-austin", + "type": "communities", + "title": "Urbit Austin", + "summary": "Curious about Urbit? Questions about Hoon syntax? Fed up with the current state of the internet? Join us to talk about the internet's future.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "communities/urbit-berlin.md", + "url": "https://urbit.org/communities/urbit-berlin", + "type": "communities", + "title": "Urbit Berlin", + "summary": "If you are sick of the current state of the web, of handing over your data and entire online presence to a handful of American corporations, of a web fueled with ads, then Urbit might be for you.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "communities/urbit-dc.md", + "url": "https://urbit.org/communities/urbit-dc", + "type": "communities", + "title": "DC Metro Urbit Meetup Group", + "summary": "This is a DC/Northern Virginia/Southern Maryland Urbit discussion group.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "communities/urbit-denver.md", + "url": "https://urbit.org/communities/urbit-denver", + "type": "communities", + "title": "Urbit Denver", + "summary": "While Urbit is the animating force behind this group, people of all interest levels & familiarity with the project - be they long-time users, or newcomers simply wondering what the heck Urbit is - are welcome & encouraged to attend these meet-ups. The conversations are lively and span a wide variety of topics, ranging from Urbit to philosophy, tech, crypto, the arts, health and well-being, and much more.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "communities/urbit-la.md", + "url": "https://urbit.org/communities/urbit-la", + "type": "communities", + "title": "Urbit Los Angeles", + "summary": "Join a group of like-minded decentralization enjoyers from the City of Angels to discuss all things Urbit and adjacent.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "communities/urbit-london.md", + "url": "https://urbit.org/communities/urbit-london", + "type": "communities", + "title": "Urbit London", + "summary": "Urbit London is a monthly, occasionally biweekly, meet-up series aiming to establish a long-lasting community within the London tech and cultural scene.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "communities/urbit-new-england.md", + "url": "https://urbit.org/communities/urbit-new-england", + "type": "communities", + "title": "Urbit New England", + "summary": "Meetings for Urbit users in the New England region. Expect free-flowing discussions. Hooning is always welcome.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "communities/urbit-ny.md", + "url": "https://urbit.org/communities/urbit-ny", + "type": "communities", + "title": "Urbit NY", + "summary": "We love experimenting with Urbit & tinkering with Arvo, Hoon, & Nock", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "communities/urbit-paris.md", + "url": "https://urbit.org/communities/urbit-paris", + "type": "communities", + "title": "Urbit Paris", + "summary": "Join us for our monthly Urbit meetups in Paris!", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "communities/urbit-sfba.md", + "url": "https://urbit.org/communities/urbit-sfba", + "type": "communities", + "title": "Urbit SF", + "summary": "Want to own and control the server side? Your digital identity, data and computation?", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "communities/urbit-tokyo.md", + "url": "https://urbit.org/communities/urbit-tokyo", + "type": "communities", + "title": "Urbit Tokyo", + "summary": "A place for osmosis between those working on, or interested in Urbit (or adjacent projects). Let’s build something, or at the very least - we can procrastinate together in style.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/apps/_index.md", + "url": "https://urbit.org/ecosystem/_index", + "type": "ecosystem", + "title": "Application Directory", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/articles/2022-09-24_urbit-courts-daos-crypto.md", + "url": "https://urbit.org/ecosystem/2022-09-24_urbit-courts-daos-crypto", + "type": "ecosystem", + "title": "Urbit Courts DAOs, Crypto Teams in Quest to Make Internet P2P Again", + "summary": "A wildly ambitious project to reinvent the entire internet computing stack is finally shipping usable apps after a decade-plus of laying groundwork. Can it overcome a “janky” UX?", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/articles/2022-09-24_urbit-is-web3-weird-and-wonderful.md", + "url": "https://urbit.org/ecosystem/2022-09-24_urbit-is-web3-weird-and-wonderful", + "type": "ecosystem", + "title": "Urbit Is Web3, Weird and Wonderful and I Don’t Care Who Made It", + "summary": "Software can have bugs, but it doesn’t have cooties.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/articles/2022-09-28_college-course-on-urbit.md", + "url": "https://urbit.org/ecosystem/2022-09-28_college-course-on-urbit", + "type": "ecosystem", + "title": "Why Would Anyone Take a College Course on Urbit?", + "summary": "Neal Davis taught the first graduate-level seminar on the controversial computing platform Urbit. Here’s why.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/articles/2022-09-29_assembly-miami-dispatch.md", + "url": "https://urbit.org/ecosystem/2022-09-29_assembly-miami-dispatch", + "type": "ecosystem", + "title": "Urbit Assembly: If We’re All Here, Who’s Watching The Internet?", + "summary": "Forever Magazine founder and Zora Zine contributor Madeline Cash reports on secret societies, subjective idealism, and digital intimacy in her dispatch from Urbit Assembly in Miami", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/articles/2022-09-29_the-dream-of-digital-homesteading.md", + "url": "https://urbit.org/ecosystem/2022-09-29_the-dream-of-digital-homesteading", + "type": "ecosystem", + "title": "The Dream of Digital Homesteading", + "summary": "Geoff Schullenberger attends Assembly 2022 and chronicles his impressions and thoughts.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/articles/2022-10-04_a-more-beautiful-computer.md", + "url": "https://urbit.org/ecosystem/2022-10-04_a-more-beautiful-computer", + "type": "ecosystem", + "title": "User Error: A More Beautiful Computer", + "summary": "From Dimes Square to the Network State, new frontiers are in the making. Adina Glickstein attends Urbit Assembly and considers the politics of tech-augmented exit.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/articles/2022-10-13_my-weekend-with-the-martians.md", + "url": "https://urbit.org/ecosystem/2022-10-13_my-weekend-with-the-martians", + "type": "ecosystem", + "title": "My Weekend With the Martians", + "summary": "At the Assembly, a conference of Urbit denizens, Ruby Sutton discovers a community of eccentrics who dare to dream of a different internet.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/articles/2022-10-23_three-things.md", + "url": "https://urbit.org/ecosystem/2022-10-23_three-things", + "type": "ecosystem", + "title": "Three Things #40: October 23, 2022", + "summary": "Lane Rettig outlines three unique aspects of Urbit in an attempt to answer the eternal question \"What is Urbit?\"", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/articles/2023-02-20_trailblazing-urbit-startup-makes-earth-shaking-acquisition.md", + "url": "https://urbit.org/ecosystem/2023-02-20_trailblazing-urbit-startup-makes-earth-shaking-acquisition", + "type": "ecosystem", + "title": "Trailblazing Urbit Startup Makes Earth Shaking Acquisition", + "summary": "Holium Corp closes $2.9 million in seed funding and acquires Third Earth in record pace.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/articles/2023-05-10_urbit-a-network-older-and-weirder-than-bitcoin.md", + "url": "https://urbit.org/ecosystem/2023-05-10_urbit-a-network-older-and-weirder-than-bitcoin", + "type": "ecosystem", + "title": "Urbit, a Network Older and Weirder Than Bitcoin, Finally Turns Toward Growth", + "summary": "The peer-to-peer network started in 2002 says it's taking on \"MEGACORP,\" much in the same vein as many blockchain networks. A bit more fun are the \"secret code names\" that users are assigned.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/articles/2023-06-12_blockchain_staking_provider_chorus-one.md", + "url": "https://urbit.org/ecosystem/2023-06-12_blockchain_staking_provider_chorus-one", + "type": "ecosystem", + "title": "Blockchain Staking Provider Chorus One Expands to Peer-to-Peer Network Urbit", + "summary": "Chorus One's bet on Urbit's future growth is described by executives as a natural extension of the company's staking services on blockchains including Ethereum, Solana, Cosmos and Polkadot.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/articles/2024-08-16_what-just-happened-with-urbit.md", + "url": "https://urbit.org/ecosystem/2024-08-16_what-just-happened-with-urbit", + "type": "ecosystem", + "title": "What Just Happened with Urbit?", + "summary": "Return of Yarvin. A Warning from Balaji. Plus: Three Recommendations for Urbit", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/articles/2024-08-21_wartime-ceo-urbits-founder-returns.md", + "url": "https://urbit.org/ecosystem/2024-08-21_wartime-ceo-urbits-founder-returns", + "type": "ecosystem", + "title": "'Wartime CEO': Urbit's Founder Returns in Shakeup at Moonshot Software Project", + "summary": "Curtis Yarvin, the founder of Urbit, has returned to the Urbit Foundation as a \"wartime CEO\" to address challenges and steer the moonshot software project more effectively. This move aims to reinvigorate the initiative, which focuses on rebuilding internet infrastructure.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/articles/2025-06-18_the-rise-and-fall-of-urbit.md", + "url": "https://urbit.org/ecosystem/2025-06-18_the-rise-and-fall-of-urbit", + "type": "ecosystem", + "title": "The Rise and Fall of Urbit", + "summary": "An outside journalist's look on Urbit's path through the era of covid censorship and NFT bubbles, with 'bitcoin is dead' vibes.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/articles/2025-07-27_urbit-isnt-alright.md", + "url": "https://urbit.org/ecosystem/2025-07-27_urbit-isnt-alright", + "type": "ecosystem", + "title": "Urbit Isn't Alright", + "summary": "A crypto-oldhead's reflections on urbit's era of coups, counter-coups, and relevance of the Urbit project to the outside world", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/apps/alphabet.md", + "url": "https://urbit.org/ecosystem/alphabet", + "type": "ecosystem", + "title": "Alphabet", + "summary": "Alphabet is a peer-to-peer prediction market built on Urbit. It leverages the network’s decentralized structure and built-in reputation system for fundamental breakthroughs in the design of a betting platform. Because Alphabet is on Urbit, users can make uncensorable, pseudonymous bets against other users.", + "description": "%alphabet is a prediction market built on Urbit.", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Archetype _ ~doplyr-harbur, ~sornev-maslyx & ~hastyp-patmud _ Assembly 2023.md", + "url": "https://urbit.org/ecosystem/Archetype%20_%20~doplyr-harbur,%20~sornev-maslyx%20&%20~hastyp-patmud%20_%20Assembly%202023", + "type": "ecosystem", + "title": "Archetype | ~doplyr-harbur, ~sornev-maslyx & ~hastyp-patmud | Assembly 2023", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Are we ready for a new computing paradigm? by Thomas Kroes.md", + "url": "https://urbit.org/ecosystem/Are%20we%20ready%20for%20a%20new%20computing%20paradigm?%20by%20Thomas%20Kroes", + "type": "ecosystem", + "title": "Are we ready for a new computing paradigm? by Thomas Kroes", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Ares – the new Urbit runtime _ Edward Amsden _ Zorp.md", + "url": "https://urbit.org/ecosystem/Ares%20%E2%80%93%20the%20new%20Urbit%20runtime%20_%20Edward%20Amsden%20_%20Zorp", + "type": "ecosystem", + "title": "Ares – the new Urbit runtime | Edward Amsden | Zorp", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Assembly 2022 _ Balaji Srinivasan_ Urbit and The Network State.md", + "url": "https://urbit.org/ecosystem/Assembly%202022%20_%20Balaji%20Srinivasan_%20Urbit%20and%20The%20Network%20State", + "type": "ecosystem", + "title": "Assembly 2022 | Balaji Srinivasan: Urbit and The Network State", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Assembly 2022 _ Holium_ The Next Frontier.md", + "url": "https://urbit.org/ecosystem/Assembly%202022%20_%20Holium_%20The%20Next%20Frontier", + "type": "ecosystem", + "title": "Assembly 2022 | Holium: The Next Frontier", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Assembly 2022 _ Human-friendly Software on Urbit _ Nevin Freeman.md", + "url": "https://urbit.org/ecosystem/Assembly%202022%20_%20Human-friendly%20Software%20on%20Urbit%20_%20Nevin%20Freeman", + "type": "ecosystem", + "title": "Assembly 2022 | Human-friendly Software on Urbit | Nevin Freeman", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Assembly 2022 _ New Institutions in the Network Age.md", + "url": "https://urbit.org/ecosystem/Assembly%202022%20_%20New%20Institutions%20in%20the%20Network%20Age", + "type": "ecosystem", + "title": "Assembly 2022 | New Institutions in the Network Age", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Assembly 2022 _ Opening Talk_ Make Computers Personal Again.md", + "url": "https://urbit.org/ecosystem/Assembly%202022%20_%20Opening%20Talk_%20Make%20Computers%20Personal%20Again", + "type": "ecosystem", + "title": "Assembly 2022 | Opening Talk: Make Computers Personal Again", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Assembly 2022 _ The Elephant in the Room.md", + "url": "https://urbit.org/ecosystem/Assembly%202022%20_%20The%20Elephant%20in%20the%20Room", + "type": "ecosystem", + "title": "Assembly 2022 | The Elephant in the Room", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Assembly 2022 _ The Medium is the Message.md", + "url": "https://urbit.org/ecosystem/Assembly%202022%20_%20The%20Medium%20is%20the%20Message", + "type": "ecosystem", + "title": "Assembly 2022 | The Medium is the Message", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Assembly 2022 _ Tlon_ A New Landscape.md", + "url": "https://urbit.org/ecosystem/Assembly%202022%20_%20Tlon_%20A%20New%20Landscape", + "type": "ecosystem", + "title": "Assembly 2022 | Tlon: A New Landscape", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Assembly 2022 _ Uqbar_ Crypto's Execution Layer.md", + "url": "https://urbit.org/ecosystem/Assembly%202022%20_%20Uqbar_%20Crypto's%20Execution%20Layer", + "type": "ecosystem", + "title": "Assembly 2022 | Uqbar: Crypto's Execution Layer", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Assembly 2022 _ Urbit Core Development_ The Timeless Way of Building.md", + "url": "https://urbit.org/ecosystem/Assembly%202022%20_%20Urbit%20Core%20Development_%20The%20Timeless%20Way%20of%20Building", + "type": "ecosystem", + "title": "Assembly 2022 | Urbit Core Development: The Timeless Way of Building", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/orgs/assemblycapital.md", + "url": "https://urbit.org/ecosystem/assemblycapital", + "type": "ecosystem", + "title": "Assembly Capital", + "summary": "Engineer-led early stage vc investing in things that matter, mostly urbit.", + "description": "Engineer-led early stage vc investing in things that matter, mostly urbit", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Bittensor _ @mogmachine _ Assembly 2023.md", + "url": "https://urbit.org/ecosystem/Bittensor%20_%20@mogmachine%20_%20Assembly%202023", + "type": "ecosystem", + "title": "Bittensor | @mogmachine | Assembly 2023", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/BlimpDAO_ Meme First Engineering _ Anthony Arroyo & Trent Gilham w_ Walt Pearce, Sam Frank.md", + "url": "https://urbit.org/ecosystem/BlimpDAO_%20Meme%20First%20Engineering%20_%20Anthony%20Arroyo%20&%20Trent%20Gilham%20w_%20Walt%20Pearce,%20Sam%20Frank", + "type": "ecosystem", + "title": "BlimpDAO: Meme First Engineering | Anthony Arroyo & Trent Gilham w/ Walt Pearce, Sam Frank", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/apps/chess.md", + "url": "https://urbit.org/ecosystem/chess", + "type": "ecosystem", + "title": "Chess", + "summary": "“The ability to play chess is the sign of a gentleman. The ability to play chess well is the sign of a wasted life.” —Paul Morphy, Grandmaster", + "description": "Fully decentralized, peer-to-peer Chess app for Urbit", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/podcasts/crazy-wisdom.md", + "url": "https://urbit.org/ecosystem/crazy-wisdom", + "type": "ecosystem", + "title": "Crazy Wisdom", + "summary": "The world is currently undergoing a meaning crisis. Many of the age-old dogmas, traditions, and ideologies we once drew wisdom from have shown deep flaws. Where do we go from here? Join Stewart Alsop, as he and his guests share the many lessons they’ve learned exploring this question, and as they pierce through the facade of ideology and instead seek to interact with experience as it actually is.", + "description": "Find meaning through their episodes with a high frequency of Urbit conversations.", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/orgs/dalten.md", + "url": "https://urbit.org/ecosystem/dalten", + "type": "ecosystem", + "title": "Dalten Collective", + "summary": "Dalten is a distributed fellowship of like minded individuals. We are a sustainable for-profit member-focused organization devoted to the individual success of every member. Dalten practices and builds sovereignty both personal and collective.", + "description": "Dalten is a distributed fellowship of like minded individuals.", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Day 1 _ ~lagrev-nocfep on A Future for Stars _ Reassembly23.md", + "url": "https://urbit.org/ecosystem/Day%201%20_%20~lagrev-nocfep%20on%20A%20Future%20for%20Stars%20_%20Reassembly23", + "type": "ecosystem", + "title": "Day 1 | ~lagrev-nocfep on A Future for Stars | Reassembly23", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Day 1 _ ~minder-folden on P2P Communication _ Reassembly23.md", + "url": "https://urbit.org/ecosystem/Day%201%20_%20~minder-folden%20on%20P2P%20Communication%20_%20Reassembly23", + "type": "ecosystem", + "title": "Day 1 | ~minder-folden on P2P Communication | Reassembly23", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Day 1 _ ~palfun-foslup on Manually Automating Your Urbit _ Reassembly23.md", + "url": "https://urbit.org/ecosystem/Day%201%20_%20~palfun-foslup%20on%20Manually%20Automating%20Your%20Urbit%20_%20Reassembly23", + "type": "ecosystem", + "title": "Day 1 | ~palfun-foslup on Manually Automating Your Urbit | Reassembly23", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Day 1 _ ~sicdev-pilnup on Digital Jeffersonianism _ Reassembly23.md", + "url": "https://urbit.org/ecosystem/Day%201%20_%20~sicdev-pilnup%20on%20Digital%20Jeffersonianism%20_%20Reassembly23", + "type": "ecosystem", + "title": "Day 1 | ~sicdev-pilnup on Digital Jeffersonianism | Reassembly23", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Day 1 _ A panel between Jake Brukhman, Evan Fisher - moderated by Jae Yang _ Reassembly23.md", + "url": "https://urbit.org/ecosystem/Day%201%20_%20A%20panel%20between%20Jake%20Brukhman,%20Evan%20Fisher%20-%20moderated%20by%20Jae%20Yang%20_%20Reassembly23", + "type": "ecosystem", + "title": "Day 1 | A panel between Jake Brukhman, Evan Fisher - moderated by Jae Yang | Reassembly23", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Day 2 _ ~littel-wolfur on Odyssey - Reimagining MMO Architecture on Mars _ Reassembly23.md", + "url": "https://urbit.org/ecosystem/Day%202%20_%20~littel-wolfur%20on%20Odyssey%20-%20Reimagining%20MMO%20Architecture%20on%20Mars%20_%20Reassembly23", + "type": "ecosystem", + "title": "Day 2 | ~littel-wolfur on Odyssey - Reimagining MMO Architecture on Mars | Reassembly23", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Day 2 _ ~lomder-librun on Building a Better Userspace _ Reassembly23.md", + "url": "https://urbit.org/ecosystem/Day%202%20_%20~lomder-librun%20on%20Building%20a%20Better%20Userspace%20_%20Reassembly23", + "type": "ecosystem", + "title": "Day 2 | ~lomder-librun on Building a Better Userspace | Reassembly23", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Day 2 _ ~master-morzod on Names, Data, and Networking _ Reassembly23.md", + "url": "https://urbit.org/ecosystem/Day%202%20_%20~master-morzod%20on%20Names,%20Data,%20and%20Networking%20_%20Reassembly23", + "type": "ecosystem", + "title": "Day 2 | ~master-morzod on Names, Data, and Networking | Reassembly23", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Day 2 _ ~sarlev-sarsen and ~litneb-maltyp on A new %aera for trust _ Reassembly23.md", + "url": "https://urbit.org/ecosystem/Day%202%20_%20~sarlev-sarsen%20and%20~litneb-maltyp%20on%20A%20new%20%aera%20for%20trust%20_%20Reassembly23", + "type": "ecosystem", + "title": "Day 2 | ~sarlev-sarsen and ~litneb-maltyp on A new %aera for trust | Reassembly23", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Day 2 _ ~tacryt-socryp on Zorp, the Nock zkVM _ Reassembly23.md", + "url": "https://urbit.org/ecosystem/Day%202%20_%20~tacryt-socryp%20on%20Zorp,%20the%20Nock%20zkVM%20_%20Reassembly23", + "type": "ecosystem", + "title": "Day 2 | ~tacryt-socryp on Zorp, the Nock zkVM | Reassembly23", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Day 2 _ ~wicdev-wisryt on Versioning Apps and Protocols _ Reassembly23.md", + "url": "https://urbit.org/ecosystem/Day%202%20_%20~wicdev-wisryt%20on%20Versioning%20Apps%20and%20Protocols%20_%20Reassembly23", + "type": "ecosystem", + "title": "Day 2 | ~wicdev-wisryt on Versioning Apps and Protocols | Reassembly23", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Day 3 _ ~harden-hardys on Vaporware_ monetizing OSS development _ Reassembly23.md", + "url": "https://urbit.org/ecosystem/Day%203%20_%20~harden-hardys%20on%20Vaporware_%20monetizing%20OSS%20development%20_%20Reassembly23", + "type": "ecosystem", + "title": "Day 3 | ~harden-hardys on Vaporware: monetizing OSS development | Reassembly23", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Day 3 _ ~mastyr-bottec on UIP-0103_ Persistent Nock Caching _ Reassembly23.md", + "url": "https://urbit.org/ecosystem/Day%203%20_%20~mastyr-bottec%20on%20UIP-0103_%20Persistent%20Nock%20Caching%20_%20Reassembly23", + "type": "ecosystem", + "title": "Day 3 | ~mastyr-bottec on UIP-0103: Persistent Nock Caching | Reassembly23", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Day 3 _ ~pindet-timmut on Making Urbit Real_ The Commerce Stack _ Reassembly23.md", + "url": "https://urbit.org/ecosystem/Day%203%20_%20~pindet-timmut%20on%20Making%20Urbit%20Real_%20The%20Commerce%20Stack%20_%20Reassembly23", + "type": "ecosystem", + "title": "Day 3 | ~pindet-timmut on Making Urbit Real: The Commerce Stack | Reassembly23", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Day 3 _ ~rovyns-ricfer on How to Get to Kelvin Zero _ Reassembly23.md", + "url": "https://urbit.org/ecosystem/Day%203%20_%20~rovyns-ricfer%20on%20How%20to%20Get%20to%20Kelvin%20Zero%20_%20Reassembly23", + "type": "ecosystem", + "title": "Day 3 | ~rovyns-ricfer on How to Get to Kelvin Zero | Reassembly23", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Day 3 _ ~sitful-hatred on Native Planet _ Reassembly23.md", + "url": "https://urbit.org/ecosystem/Day%203%20_%20~sitful-hatred%20on%20Native%20Planet%20_%20Reassembly23", + "type": "ecosystem", + "title": "Day 3 | ~sitful-hatred on Native Planet | Reassembly23", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Day 3 _ ~toptyr-bilder on Portal_ Sovereign social media _ Reassembly23.md", + "url": "https://urbit.org/ecosystem/Day%203%20_%20~toptyr-bilder%20on%20Portal_%20Sovereign%20social%20media%20_%20Reassembly23", + "type": "ecosystem", + "title": "Day 3 | ~toptyr-bilder on Portal: Sovereign social media | Reassembly23", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Dev-Week_ %Eyre by ~palfun-foslup.md", + "url": "https://urbit.org/ecosystem/Dev-Week_%20%Eyre%20by%20~palfun-foslup", + "type": "ecosystem", + "title": "Dev-Week: %Eyre by ~palfun-foslup", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Dev-Week_ %lick by ~mopfel-winrux.md", + "url": "https://urbit.org/ecosystem/Dev-Week_%20%lick%20by%20~mopfel-winrux", + "type": "ecosystem", + "title": "Dev-Week: %lick by ~mopfel-winrux", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Dev-Week_ Core Developers AMA.md", + "url": "https://urbit.org/ecosystem/Dev-Week_%20Core%20Developers%20AMA", + "type": "ecosystem", + "title": "Dev-Week: Core Developers AMA", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Dev-Week_ Core Roadmap.md", + "url": "https://urbit.org/ecosystem/Dev-Week_%20Core%20Roadmap", + "type": "ecosystem", + "title": "Dev-Week: Core Roadmap", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Dev-Week_ Core School Preview.md", + "url": "https://urbit.org/ecosystem/Dev-Week_%20Core%20School%20Preview", + "type": "ecosystem", + "title": "Dev-Week: Core School Preview", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Dev-Week_ Integrating Uqbar Transactions.md", + "url": "https://urbit.org/ecosystem/Dev-Week_%20Integrating%20Uqbar%20Transactions", + "type": "ecosystem", + "title": "Dev-Week: Integrating Uqbar Transactions", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Dev-Week_ Native UI.md", + "url": "https://urbit.org/ecosystem/Dev-Week_%20Native%20UI", + "type": "ecosystem", + "title": "Dev-Week: Native UI", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Dev-Week_ Portal.md", + "url": "https://urbit.org/ecosystem/Dev-Week_%20Portal", + "type": "ecosystem", + "title": "Dev-Week: Portal", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Dev-Week_ Vaporware.md", + "url": "https://urbit.org/ecosystem/Dev-Week_%20Vaporware", + "type": "ecosystem", + "title": "Dev-Week: Vaporware", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Developer Week_ Core Dev AMA.md", + "url": "https://urbit.org/ecosystem/Developer%20Week_%20Core%20Dev%20AMA", + "type": "ecosystem", + "title": "Developer Week: Core Dev AMA", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Developer Week_ Core Roadmap.md", + "url": "https://urbit.org/ecosystem/Developer%20Week_%20Core%20Roadmap", + "type": "ecosystem", + "title": "Developer Week: Core Roadmap", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Developer Week_ Encode Club x Urbit Hackathon.md", + "url": "https://urbit.org/ecosystem/Developer%20Week_%20Encode%20Club%20x%20Urbit%20Hackathon", + "type": "ecosystem", + "title": "Developer Week: Encode Club x Urbit Hackathon", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Developer Week_ Engine Pattern.md", + "url": "https://urbit.org/ecosystem/Developer%20Week_%20Engine%20Pattern", + "type": "ecosystem", + "title": "Developer Week: Engine Pattern", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Developer Week_ So you want to work on Urbit_.md", + "url": "https://urbit.org/ecosystem/Developer%20Week_%20So%20you%20want%20to%20work%20on%20Urbit_", + "type": "ecosystem", + "title": "Developer Week: So you want to work on Urbit?", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Developer Week_ Speed Hooning with Quartus.md", + "url": "https://urbit.org/ecosystem/Developer%20Week_%20Speed%20Hooning%20with%20Quartus", + "type": "ecosystem", + "title": "Developer Week: Speed Hooning with Quartus", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Developer Week_ The Network State's Ministry of Education.md", + "url": "https://urbit.org/ecosystem/Developer%20Week_%20The%20Network%20State's%20Ministry%20of%20Education", + "type": "ecosystem", + "title": "Developer Week: The Network State's Ministry of Education", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Developer Week_ Urbit Foundation.md", + "url": "https://urbit.org/ecosystem/Developer%20Week_%20Urbit%20Foundation", + "type": "ecosystem", + "title": "Developer Week: Urbit Foundation", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Developer Week_ Volcano Summit.md", + "url": "https://urbit.org/ecosystem/Developer%20Week_%20Volcano%20Summit", + "type": "ecosystem", + "title": "Developer Week: Volcano Summit", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/podcasts/epicenter.md", + "url": "https://urbit.org/ecosystem/epicenter", + "type": "ecosystem", + "title": "Epicenter", + "summary": "Epicenter brings you in-depth conversations about the technical, economic and social implications of cryptocurrencies and blockchain technologies. Every week, we interview business leaders, engineers academics and entrepreneurs, and bring you a diverse spectrum of opinions and points of view. Epicenter is hosted by Sebastien Couture, Brian Fabian Crain, Friederike Ernst, Meher Roy and Felix Lutsch. Since 2014, our episodes have been downloaded over 8 million times.", + "description": "The blockchain & web3 podcast co-hosted by Urbit Foundation board member Brian Crain.", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/apps/face.md", + "url": "https://urbit.org/ecosystem/face", + "type": "ecosystem", + "title": "Face", + "summary": "On Urbit, you don’t have to share your photos with just anybody. Upload a photo of yourself and then curate who you’ll allow to see it using Pals. Just make sure to upload your most dapper photo and voila. Now when someone spies you out of the corner of their eye at the next great Urbit event, they’ll know just who they’re talking to.", + "description": "It’s time to put a face to that name", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Forking the Economy _ Panel _ Assembly 2023.md", + "url": "https://urbit.org/ecosystem/Forking%20the%20Economy%20_%20Panel%20_%20Assembly%202023", + "type": "ecosystem", + "title": "Forking the Economy | Panel | Assembly 2023", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Gaming the System _ Chase Van Etten, Roy Blackstone, Louis, Trent Steen & John Hyde _ Assembly 2023.md", + "url": "https://urbit.org/ecosystem/Gaming%20the%20System%20_%20Chase%20Van%20Etten,%20Roy%20Blackstone,%20Louis,%20Trent%20Steen%20&%20John%20Hyde%20_%20Assembly%202023", + "type": "ecosystem", + "title": "Gaming the System | Chase Van Etten, Roy Blackstone, Louis, Trent Steen & John Hyde | Assembly 2023", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/apps/hits.md", + "url": "https://urbit.org/ecosystem/hits", + "type": "ecosystem", + "title": "Hits", + "summary": "One challenge decentralized networks face is that there’s no central place to discover new software or content. The Urbit Foundation’s Urbit Labs team has designed an app, Hits, to solve this problem.", + "description": "The ultimate way to discover Urbit apps", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/How to Fund a New World _ Andrew Kim, Jake Brukhman, Jae Yang, Evan Fisher & BacktheBunny.md", + "url": "https://urbit.org/ecosystem/How%20to%20Fund%20a%20New%20World%20_%20Andrew%20Kim,%20Jake%20Brukhman,%20Jae%20Yang,%20Evan%20Fisher%20&%20BacktheBunny", + "type": "ecosystem", + "title": "How to Fund a New World | Andrew Kim, Jake Brukhman, Jae Yang, Evan Fisher & BacktheBunny", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/It has to be easy _ Galen Wolfe-Pauly _ Tlon Corporation.md", + "url": "https://urbit.org/ecosystem/It%20has%20to%20be%20easy%20_%20Galen%20Wolfe-Pauly%20_%20Tlon%20Corporation", + "type": "ecosystem", + "title": "It has to be easy | Galen Wolfe-Pauly | Tlon Corporation", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Kick-Off Developer Week.md", + "url": "https://urbit.org/ecosystem/Kick-Off%20Developer%20Week", + "type": "ecosystem", + "title": "Kick-Off Developer Week", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/orgs/labyrinthdao.md", + "url": "https://urbit.org/ecosystem/labyrinthdao", + "type": "ecosystem", + "title": "Labyrinth DAO", + "summary": "Labyrinth DAO is a new decentralized autonomous organization investing in Urbit projects. Supported by Tribute Labs, Labyrinth DAO will foster the growth and development of Urbit as it paves the way for the new internet. Find Labyrinth DAO on Twitter or connect at labyrinthdao.io to get involved.", + "description": "Labyrinth DAO is a new decentralized autonomous organization investing in Urbit projects.", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/orgs/mars-review-of-books.md", + "url": "https://urbit.org/ecosystem/mars-review-of-books", + "type": "ecosystem", + "title": "The Mars Review of Books", + "summary": "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.", + "description": "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.", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/MiladyOS _ Chase Van Etten _ Vaporware.md", + "url": "https://urbit.org/ecosystem/MiladyOS%20_%20Chase%20Van%20Etten%20_%20Vaporware", + "type": "ecosystem", + "title": "MiladyOS | Chase Van Etten | Vaporware", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Native Planet _ ~dalhec-banler & ~mopfel-winrux _ Assembly 2023.md", + "url": "https://urbit.org/ecosystem/Native%20Planet%20_%20~dalhec-banler%20&%20~mopfel-winrux%20_%20Assembly%202023", + "type": "ecosystem", + "title": "Native Planet | ~dalhec-banler & ~mopfel-winrux | Assembly 2023", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/orgs/nativeplanet.md", + "url": "https://urbit.org/ecosystem/nativeplanet", + "type": "ecosystem", + "title": "Native Planet", + "summary": "Native Planet builds Urbit centric hardware and software that simplifies sovereign self hosting and ship management. Native Planet's open source software enables users to turn nearly any computer into an Urbit dedicated server in minutes.", + "description": "Native Planet builds Urbit-centric hardware and software that simplifies sovereign self hosting and ship management.", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/NEAR x Urbit _ Illia Polosukhin & Ted Blackman _ Assembly 2023.md", + "url": "https://urbit.org/ecosystem/NEAR%20x%20Urbit%20_%20Illia%20Polosukhin%20&%20Ted%20Blackman%20_%20Assembly%202023", + "type": "ecosystem", + "title": "NEAR x Urbit | Illia Polosukhin & Ted Blackman | Assembly 2023", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/NEW WORK _ Panel _ Assembly 2023.md", + "url": "https://urbit.org/ecosystem/NEW%20WORK%20_%20Panel%20_%20Assembly%202023", + "type": "ecosystem", + "title": "NEW WORK | Panel | Assembly 2023", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Nockchain, a blank-slate ZK L1 _ Logan Allen _ Zorp.md", + "url": "https://urbit.org/ecosystem/Nockchain,%20a%20blank-slate%20ZK%20L1%20_%20Logan%20Allen%20_%20Zorp", + "type": "ecosystem", + "title": "Nockchain, a blank-slate ZK L1 | Logan Allen | Zorp", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/orgs/octu.md", + "url": "https://urbit.org/ecosystem/octu", + "type": "ecosystem", + "title": "Octu Ventures", + "summary": "Octu Ventures is a member-driven venture DAO created to invest in teams building on Urbit. We intend to leverage our long history in the Urbit ecosystem, relationships with key builders and community leaders, and analysis of Urbit’s place in the current technological, financial, and geopolitical landscape in order to help Urbit infrastructure companies grow to the world-changing size they deserve to.", + "description": "A member-driven venture DAO investing in teams building on urbit", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/podcasts/other-life.md", + "url": "https://urbit.org/ecosystem/other-life", + "type": "ecosystem", + "title": "Other Life", + "summary": "\"The third important way of being militant is militancy as bearing witness by one’s life in the form of a style of existence. This style of existence specific to revolutionary militantism, and ensuring that one’s life bears witness, breaks, and has to break with the conventions, habits, and values of society. And it must manifest directly, by its visible form, its constant practice, and its immediate existence, the concrete possibility and the evident value of an other life, which is the true life.\" —Michel Foucault", + "description": "A podcast by Urbit enthousiast Justin Murphy.", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/apps/pals.md", + "url": "https://urbit.org/ecosystem/pals", + "type": "ecosystem", + "title": "Pals", + "summary": "What’s the internet without friends?", + "description": "Friendlist for peer discovery", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/apps/quorum.md", + "url": "https://urbit.org/ecosystem/quorum", + "type": "ecosystem", + "title": "Quorum", + "summary": "Quorum is a Stack Overflow/Quora style application that allows individuals to submit and vote on questions and answers in threads. To join the Urbit Foundation's [battery payload] board, when prompted to add a board, enter ~dister-dozzod-lapdeg as the provider, and battery-payload as the board.", + "description": "A choral explanations app for Urbit", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/apps/radio.md", + "url": "https://urbit.org/ecosystem/radio", + "type": "ecosystem", + "title": "Radio", + "summary": "Remember the days of turning on the radio in a car full of friends and jamming out to whatever happens to be on the dial? Those days don’t have to be dead and gone. Radio allows you to browse the YouTube channels other Urbit users are watching and chat with them in real-time. It takes a public good (YouTube) and turns it into a digitally networked clubhouse. Rock on!", + "description": "an app for urbit disc jockeys", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Reassembly_ A Subjective History of Urbit's Development - Philip Monk.md", + "url": "https://urbit.org/ecosystem/Reassembly_%20A%20Subjective%20History%20of%20Urbit's%20Development%20-%20Philip%20Monk", + "type": "ecosystem", + "title": "Reassembly: A Subjective History of Urbit's Development - Philip Monk", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Reassembly_ Identities for the Smart Home_ An urbit discussion self-sovereign IoT - ~pilwyc-fastec.md", + "url": "https://urbit.org/ecosystem/Reassembly_%20Identities%20for%20the%20Smart%20Home_%20An%20urbit%20discussion%20self-sovereign%20IoT%20-%20~pilwyc-fastec", + "type": "ecosystem", + "title": "Reassembly: Identities for the Smart Home: An urbit discussion self-sovereign IoT - ~pilwyc-fastec", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Reassembly_ Narratives for Urbit’s Future - Josh Lehmnan.md", + "url": "https://urbit.org/ecosystem/Reassembly_%20Narratives%20for%20Urbit%E2%80%99s%20Future%20-%20Josh%20Lehmnan", + "type": "ecosystem", + "title": "Reassembly: Narratives for Urbit’s Future - Josh Lehmnan", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Reassembly_ New Mars - Edward Amsden.md", + "url": "https://urbit.org/ecosystem/Reassembly_%20New%20Mars%20-%20Edward%20Amsden", + "type": "ecosystem", + "title": "Reassembly: New Mars - Edward Amsden", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Reassembly_ Social A.I. - Justin Murphy.md", + "url": "https://urbit.org/ecosystem/Reassembly_%20Social%20A.I.%20-%20Justin%20Murphy", + "type": "ecosystem", + "title": "Reassembly: Social A.I. - Justin Murphy", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Reassembly_ Your Business Isn't your Own - ~sarlev-sarsen.md", + "url": "https://urbit.org/ecosystem/Reassembly_%20Your%20Business%20Isn't%20your%20Own%20-%20~sarlev-sarsen", + "type": "ecosystem", + "title": "Reassembly: Your Business Isn't your Own - ~sarlev-sarsen", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/podcasts/red-horizon-podcast.md", + "url": "https://urbit.org/ecosystem/red-horizon-podcast", + "type": "ecosystem", + "title": "Red Horizon Podcast", + "summary": "Red Horizon is designed by Chorus One. They work to expand the freedom and sovereignty that human beings experience in their digital lives. In their Podcast ~tiller-tolbus explore the Urbit ecosystem and it's developers through engaging conversations.", + "description": "Dive into the world of Urbit with Red Horizon's ~tiller-tolbus", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/apps/rumors.md", + "url": "https://urbit.org/ecosystem/rumors", + "type": "ecosystem", + "title": "Rumors", + "summary": "Psst. Did you hear the latest? Rumors is an app so elegant and simple that it could only exist on Urbit. It is an anonymous message board but with an Urbit twist: you’ll only see messages from your pals (Urbit users you’ve added on the %pals app) and pals of pals.", + "description": "Anonymous gossip from friends of friends", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Securing Urbit _ Rikard Hjort, Logan Allen, Ryan Lackey & Joe Bryan _ Assembly 2023.md", + "url": "https://urbit.org/ecosystem/Securing%20Urbit%20_%20Rikard%20Hjort,%20Logan%20Allen,%20Ryan%20Lackey%20&%20Joe%20Bryan%20_%20Assembly%202023", + "type": "ecosystem", + "title": "Securing Urbit | Rikard Hjort, Logan Allen, Ryan Lackey & Joe Bryan | Assembly 2023", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/orgs/sortug.md", + "url": "https://urbit.org/ecosystem/sortug", + "type": "ecosystem", + "title": "Sortug Development", + "summary": "Sortug is a DAO focused on software development and promotion of Urbit to a global audience. We are focused on creating and distributing Urbit applications and on integrating Urbit in Earth business and communities through innovative gatekeeping ideas.", + "description": "Sortug is an Urbit development DAO based on Earth Time UTC+08:00.", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/podcasts/the-stack.md", + "url": "https://urbit.org/ecosystem/the-stack", + "type": "ecosystem", + "title": "The Stack", + "summary": "The Sovereign Stack is a podcast focused on exploring individual sovereignty. Urbit and Reserve give people tools to defend their sovereignty.", + "description": "Individual Sovereignty and Urbit is what drives the Stack podcast.", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/The Art of Psyops _ Lukas Computer & Michael Dragovic _ Remilia.md", + "url": "https://urbit.org/ecosystem/The%20Art%20of%20Psyops%20_%20Lukas%20Computer%20&%20Michael%20Dragovic%20_%20Remilia", + "type": "ecosystem", + "title": "The Art of Psyops | Lukas Computer & Michael Dragovic | Remilia", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/The Birth of a New World _ John Hyde _ Turf.md", + "url": "https://urbit.org/ecosystem/The%20Birth%20of%20a%20New%20World%20_%20John%20Hyde%20_%20Turf", + "type": "ecosystem", + "title": "The Birth of a New World | John Hyde | Turf", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/The First Network State Starts In A Group Chat _ Trent Gillham _ Holium.md", + "url": "https://urbit.org/ecosystem/The%20First%20Network%20State%20Starts%20In%20A%20Group%20Chat%20_%20Trent%20Gillham%20_%20Holium", + "type": "ecosystem", + "title": "The First Network State Starts In A Group Chat | Trent Gillham | Holium", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/The Future of Personal AI _ Owen Barnes _ Closing Talk Assembly 2023.md", + "url": "https://urbit.org/ecosystem/The%20Future%20of%20Personal%20AI%20_%20Owen%20Barnes%20_%20Closing%20Talk%20Assembly%202023", + "type": "ecosystem", + "title": "The Future of Personal AI | Owen Barnes | Closing Talk Assembly 2023", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/The Future of Sovereign AI _ Panel _ Assembly 2023.md", + "url": "https://urbit.org/ecosystem/The%20Future%20of%20Sovereign%20AI%20_%20Panel%20_%20Assembly%202023", + "type": "ecosystem", + "title": "The Future of Sovereign AI | Panel | Assembly 2023", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/The Machine War _ Daniel Lisi & Noah Kumin _ Assembly 2023.md", + "url": "https://urbit.org/ecosystem/The%20Machine%20War%20_%20Daniel%20Lisi%20&%20Noah%20Kumin%20_%20Assembly%202023", + "type": "ecosystem", + "title": "The Machine War | Daniel Lisi & Noah Kumin | Assembly 2023", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/The Vietnam Thesis and El Salvador Method _ @BacktheBunny _ Assembly 2023.md", + "url": "https://urbit.org/ecosystem/The%20Vietnam%20Thesis%20and%20El%20Salvador%20Method%20_%20@BacktheBunny%20_%20Assembly%202023", + "type": "ecosystem", + "title": "The Vietnam Thesis and El Salvador Method | @BacktheBunny | Assembly 2023", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/The World if _ Marisa Rowland, Ellie Hain, Matt Condon & Jose Mejia _ Assembly 2023.md", + "url": "https://urbit.org/ecosystem/The%20World%20if%20_%20Marisa%20Rowland,%20Ellie%20Hain,%20Matt%20Condon%20&%20Jose%20Mejia%20_%20Assembly%202023", + "type": "ecosystem", + "title": "The World if | Marisa Rowland, Ellie Hain, Matt Condon & Jose Mejia | Assembly 2023", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/orgs/tirrel.md", + "url": "https://urbit.org/ecosystem/tirrel", + "type": "ecosystem", + "title": "Tirrel Corporation", + "summary": "Tirrel Corporation is an Urbit product studio.", + "description": "Tirrel Corporation is an Urbit product studio.", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/orgs/tlon.md", + "url": "https://urbit.org/ecosystem/tlon", + "type": "ecosystem", + "title": "Tlon", + "summary": "Tlon Corporation 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.", + "description": "The first developer of Urbit. Their work continues to maintain core infrastructure development in addition to designing products for communities on the network.", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/apps/tlon.md", + "url": "https://urbit.org/ecosystem/tlon", + "type": "ecosystem", + "title": "Tlon", + "summary": "Whether you're a team, a publication, or a group of friends, Tlon is an app that provides a few simple basics for communities to shape into something unique to their needs. Get comfortable and compute in peace, an internet of intimate connection.", + "description": "Peer-to-peer collaboration for communities of all shapes and sizes", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/TLON TV_ People 001 — Dr. Jonathan Paprocki + Galen.md", + "url": "https://urbit.org/ecosystem/TLON%20TV_%20People%20001%20%E2%80%94%20Dr.%20Jonathan%20Paprocki%20+%20Galen", + "type": "ecosystem", + "title": "TLON TV: People 001 — Dr. Jonathan Paprocki + Galen", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/TLON TV_ People 002 — Nick + Galen.md", + "url": "https://urbit.org/ecosystem/TLON%20TV_%20People%20002%20%E2%80%94%20Nick%20+%20Galen", + "type": "ecosystem", + "title": "TLON TV: People 002 — Nick + Galen", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/TLON TV_ People 003 — Jōshin + Galen.md", + "url": "https://urbit.org/ecosystem/TLON%20TV_%20People%20003%20%E2%80%94%20J%C5%8Dshin%20+%20Galen", + "type": "ecosystem", + "title": "TLON TV: People 003 — Jōshin + Galen", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/TLON TV_ People 008 — Galen + Philip.md", + "url": "https://urbit.org/ecosystem/TLON%20TV_%20People%20008%20%E2%80%94%20Galen%20+%20Philip", + "type": "ecosystem", + "title": "TLON TV: People 008 — Galen + Philip", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/TLON TV 0011 - Alex + Galen.md", + "url": "https://urbit.org/ecosystem/TLON%20TV%200011%20-%20Alex%20+%20Galen", + "type": "ecosystem", + "title": "TLON TV 0011 - Alex + Galen", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/TLON TV 0012 - Jae + Galen.md", + "url": "https://urbit.org/ecosystem/TLON%20TV%200012%20-%20Jae%20+%20Galen", + "type": "ecosystem", + "title": "TLON TV 0012 - Jae + Galen", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/TLON TV 0013 - Kylie + Galen.md", + "url": "https://urbit.org/ecosystem/TLON%20TV%200013%20-%20Kylie%20+%20Galen", + "type": "ecosystem", + "title": "TLON TV 0013 - Kylie + Galen", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/TLON TV 0014 - ~tacsup-datsyn + Galen.md", + "url": "https://urbit.org/ecosystem/TLON%20TV%200014%20-%20~tacsup-datsyn%20+%20Galen", + "type": "ecosystem", + "title": "TLON TV 0014 - ~tacsup-datsyn + Galen", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/TLON TV 0015 - Vaporware.md", + "url": "https://urbit.org/ecosystem/TLON%20TV%200015%20-%20Vaporware", + "type": "ecosystem", + "title": "TLON TV 0015 - Vaporware", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/TLON TV 0016 - FWB.md", + "url": "https://urbit.org/ecosystem/TLON%20TV%200016%20-%20FWB", + "type": "ecosystem", + "title": "TLON TV 0016 - FWB", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/orgs/tocwex-syndicate.md", + "url": "https://urbit.org/ecosystem/tocwex-syndicate", + "type": "ecosystem", + "title": "~tocwex.syndicate", + "summary": "Syndicates are portable digital organizations designed for 'network tribes' that value decentralization, personal sovereignty, and collective innovation. Through a combination of onchain digital assets and tools, along with off-chain software running over a peer-to-peer and end-to-end encrypted network, Syndicates are able to operate as self-sovereign socioeconomic networks, both onchain and off-chain. ~tocwex.syndicate is a practice in recursive creation of syndicate tooling.", + "description": "recursively building digital syndicates", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/apps/trill.md", + "url": "https://urbit.org/ecosystem/trill", + "type": "ecosystem", + "title": "Trill", + "summary": "Trill is a micro-blogging platform on Urbit. It’s a simple proposition with some highly interesting consequences. For one thing, the app is composable with other apps. So you can import your list of Urbit pals. It also means that your feed is not being fine-tuned by a massive corporation trying to nudge you in the direction of advertisements. This way you can check up on what your friends are thinking, and avoid the spammers, ads, and copypasta content. So let those posts sing.", + "description": "Urbit Native Microblog", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/apps/turf.md", + "url": "https://urbit.org/ecosystem/turf", + "type": "ecosystem", + "title": "Turf", + "summary": "Turf is Urbit's very own 2D pixel-art metaverse, where anyone can explore and add to the burgeoning network of customizable digital spaces, or \"turfs.\" Turf blurs the line between art, programming and gaming in a way that you'll only find on Urbit.", + "description": "decentralized, self-sovereign 2D metaverse, powered by Urbit, it's free real estate", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/podcasts/understanding-urbit.md", + "url": "https://urbit.org/ecosystem/understanding-urbit", + "type": "ecosystem", + "title": "Understanding Urbit", + "summary": "As a highly secure personal server, Urbit aims to deliver on many of the ideas pioneered by the Cypherpunks. 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 modern social computing platforms like WeChat and Kakaotalk.", + "description": "A timeless & comprehensive guide through Urbit's design ideas from 2020.", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/apps/uniswap.md", + "url": "https://urbit.org/ecosystem/uniswap", + "type": "ecosystem", + "title": "Uniswap", + "summary": "Self-hosted uniswap front-end made by Laconic", + "description": "Self-hosted Uniswap interface", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Urbit-native Blockchain _ Sunny Aggarwal _ Osmosis.md", + "url": "https://urbit.org/ecosystem/Urbit-native%20Blockchain%20_%20Sunny%20Aggarwal%20_%20Osmosis", + "type": "ecosystem", + "title": "Urbit-native Blockchain | Sunny Aggarwal | Osmosis", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Urbit-Native Lightning _ Christian & Jake _ ~tirrel corp.md", + "url": "https://urbit.org/ecosystem/Urbit-Native%20Lightning%20_%20Christian%20&%20Jake%20_%20~tirrel%20corp", + "type": "ecosystem", + "title": "Urbit-Native Lightning | Christian & Jake | ~tirrel corp", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Urbit's prediction market _ Christopher Colby & ~solsup-soplyd _ %alphabet.md", + "url": "https://urbit.org/ecosystem/Urbit's%20prediction%20market%20_%20Christopher%20Colby%20&%20~solsup-soplyd%20_%20%alphabet", + "type": "ecosystem", + "title": "Urbit's prediction market | Christopher Colby & ~solsup-soplyd | %alphabet", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Urbit Foundation _ Josh Lehman, Ted Blackman & Thomas Kroes _ Assembly 2023.md", + "url": "https://urbit.org/ecosystem/Urbit%20Foundation%20_%20Josh%20Lehman,%20Ted%20Blackman%20&%20Thomas%20Kroes%20_%20Assembly%202023", + "type": "ecosystem", + "title": "Urbit Foundation | Josh Lehman, Ted Blackman & Thomas Kroes | Assembly 2023", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Urbit from the Outside in _ Rick Dudley, Ted Blackman & Joe Bryan _ Assembly 2023.md", + "url": "https://urbit.org/ecosystem/Urbit%20from%20the%20Outside%20in%20_%20Rick%20Dudley,%20Ted%20Blackman%20&%20Joe%20Bryan%20_%20Assembly%202023", + "type": "ecosystem", + "title": "Urbit from the Outside in | Rick Dudley, Ted Blackman & Joe Bryan | Assembly 2023", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Urbit Onboarding Made Easy _ Brian Crain & ~tiller-tolbus _ Red Horizon.md", + "url": "https://urbit.org/ecosystem/Urbit%20Onboarding%20Made%20Easy%20_%20Brian%20Crain%20&%20~tiller-tolbus%20_%20Red%20Horizon", + "type": "ecosystem", + "title": "Urbit Onboarding Made Easy | Brian Crain & ~tiller-tolbus | Red Horizon", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/apps/urbitswap.md", + "url": "https://urbit.org/ecosystem/urbitswap", + "type": "ecosystem", + "title": "Urbitswap", + "summary": "Urbitswap is currently an app for trading Urbit NFTs. It is currently being developed in conjunction with VentureClub to enable legally compliant peer trading of securities. Avoid centralized front-ends and choke points. Trade on Urbit.", + "description": "A peer-to-peer NFT trading platform native to Urbit", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Urbitswap _ Eric Arsenault _ Venture Club.md", + "url": "https://urbit.org/ecosystem/Urbitswap%20_%20Eric%20Arsenault%20_%20Venture%20Club", + "type": "ecosystem", + "title": "Urbitswap | Eric Arsenault | Venture Club", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/Welcome to Assembly _ Josh Lehman _ Urbit Foundation.md", + "url": "https://urbit.org/ecosystem/Welcome%20to%20Assembly%20_%20Josh%20Lehman%20_%20Urbit%20Foundation", + "type": "ecosystem", + "title": "Welcome to Assembly | Josh Lehman | Urbit Foundation", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/talks/What to Build on Urbit and Why.md", + "url": "https://urbit.org/ecosystem/What%20to%20Build%20on%20Urbit%20and%20Why", + "type": "ecosystem", + "title": "What to Build on Urbit and Why", + "summary": "", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/podcasts/zero-k.md", + "url": "https://urbit.org/ecosystem/zero-k", + "type": "ecosystem", + "title": "ZeroK", + "summary": "Zero K brings you behind the scenes salvos from the people building Urbit, the decentralized operating system. Join us as we cover the latest news from the Urbit Foundation and interview the contributors making Urbit real.", + "description": "The Urbit Foundation's official podcast. Hosted by ~poldec-tonteg", + "tags": [], + "search_terms": [] + }, + { + "id": "ecosystem/orgs/zorp.md", + "url": "https://urbit.org/ecosystem/zorp", + "type": "ecosystem", + "title": "Zorp", + "summary": "Zorp has built a secure-by-design zero-knowledge virtual machine (zkVM) with a uniquely minimal software supply chain which utilizes Nock as its instruction set. Nock, Urbit’s low-level language, is a famously simple instruction set. That property aligns itself well with what you might create if you were designing a language from first principles to do zero-knowledge proofs. Zorp’s zkVM could unlock new possibilities for crypto and more. Check back at Zorp’s website and Twitter for more info.", + "description": "We assure critical computation using zero-knowledge proofs", + "tags": [], + "search_terms": [] + }, + { + "id": "get-on-the-network.md", + "url": "https://urbit.org/get-on-the-network", + "type": "pages", + "title": "Get On The Network", + "summary": "Entry points for getting on Urbit, including hosted options and self-hosting resources.", + "description": "", + "tags": [], + "search_terms": [] + }, + { + "id": "overview/redirect", + "url": "https://urbit.org/overview", + "type": "overview", + "title": "Overview", + "summary": "Introduction to Urbit as an approach to building durable computing infrastructure, explaining the motivation for a long-lasting software stack and the two-part structure of identity and operating system. Covers Urbit ID and Urbit OS as core components.", + "description": "Urbit is a practice in building a forever computer", + "tags": [], + "search_terms": [] + }, + { + "id": "overview/running-urbit/intro.md", + "url": "https://urbit.org/overview/running-urbit", + "type": "overview", + "title": "Running Urbit", + "summary": "Introduction to running Urbit covering the two required steps of acquiring an Urbit ID and booting Urbit OS, with examples of deployment options ranging from galaxy-level infrastructure to comets on local laptops.", + "description": "A comprehensive guide to getting started with Urbit", + "tags": [], + "search_terms": [] + }, + { + "id": "overview/running-urbit/common-commands.md", + "url": "https://urbit.org/overview/running-urbit/common-commands", + "type": "overview", + "title": "Common Commands", + "summary": "Reference guide for essential dojo commands including ship management operations, application installation and status checking, azimuth state verification, memory optimization, moon identity creation, and shutdown procedures.", + "description": "Essential commands for using Urbit", + "tags": [], + "search_terms": [] + }, + { + "id": "blurbs/add-and-remove-applications.md", + "url": "https://urbit.org/overview/running-urbit/common-commands#add-and-remove-applications", + "type": "blurbs", + "title": "Add and remove applications", + "summary": "Learn the dojo commands |install, |nuke, and |uninstall to manage your urbit's application lifecycle, from adding new apps to removing all associated state.", + "description": "3rd-party software distribution enables any urbit node to distribute software to the network, these commands help you manage your installed apps.", + "tags": [ + "dojo" + ], + "search_terms": [ + "install apps", + "uninstall apps", + "nuke app data", + "urbit applications", + "dojo commands", + "app distribution", + "landscape get apps", + "desk management", + "remove app state", + "app recovery" + ] + }, + { + "id": "blurbs/check-and-reduce-memory-usage.md", + "url": "https://urbit.org/overview/running-urbit/common-commands#check-and-reduce-memory-usage", + "type": "blurbs", + "title": "Check and reduce memory usage", + "summary": "Use |mass, |meld, and |pack commands to monitor and compress your urbit's memory, reducing loom usage by up to 50% on resource-constrained systems.", + "description": "Monitor and optimize your urbit's memory consumption", + "tags": [ + "dojo", + "runtime" + ], + "search_terms": [ + "memory usage", + "loom size", + "mass report", + "meld command", + "pack command", + "urbit runtime", + "dojo tools", + "deduplicate memory", + "pier storage", + "resource constraints" + ] + }, + { + "id": "blurbs/check-application-status.md", + "url": "https://urbit.org/overview/running-urbit/common-commands#check-application-status", + "type": "blurbs", + "title": "Check application info and status", + "summary": "The +vats command displays metadata for all apps or a specific app, showing cz hash, status, publishing ship, and pending updates for troubleshooting.", + "description": "Running +vats will output the state of your apps and related metadata that can help with troubleshooting", + "tags": [ + "dojo" + ], + "search_terms": [ + "vats command", + "app status", + "desk metadata", + "urbit apps", + "cz hash", + "publishing ship", + "pending updates", + "dojo tools", + "troubleshoot apps", + "app version" + ] + }, + { + "id": "blurbs/check-your-sponsor.md", + "url": "https://urbit.org/overview/running-urbit/common-commands#check-your-sponsor", + "type": "blurbs", + "title": "Check your current sponsor", + "summary": "The +sponsor command reveals your ship's current sponsor @p, useful for diagnosing connectivity issues when a ship in your sponsorship chain is offline.", + "description": "Understanding your networking sponsor can help with troubleshooting connectivity issues", + "tags": [ + "dojo" + ], + "search_terms": [ + "sponsor command", + "network sponsor", + "sponsor chain", + "urbit connectivity", + "dojo sponsor", + "bridge sponsor", + "network explorer", + "onchain sponsor", + "urbit sponsor" + ] + }, + { + "id": "blurbs/checking-and-fixing-azimuth-state.md", + "url": "https://urbit.org/overview/running-urbit/common-commands#checking-and-fixing-azimuth-state", + "type": "blurbs", + "title": "Checking and fixing Azimuth state", + "summary": "Check Ethereum block sync with +azimuth/block and use -azimuth-load to fetch snapshots if your ship's Azimuth state is out of sync with the blockchain.", + "description": "Monitor and repair your PKI state synchronization", + "tags": [ + "dojo", + "azimuth" + ], + "search_terms": [ + "azimuth state", + "pki sync", + "azimuth block", + "ethereum block", + "azimuth load", + "pki snapshot", + "dojo azimuth", + "state sync", + "azimuth snapshot", + "bridge azimuth" + ] + }, + { + "id": "blurbs/create-a-moon-identity.md", + "url": "https://urbit.org/overview/running-urbit/common-commands#create-a-moon-identity", + "type": "blurbs", + "title": "Create a moon identity", + "summary": "Use |moon to generate moon identities linked to your planet, with additional commands like |moon-breach for factory resets and |moon-cycle-keys to update cryptographic keys.", + "description": "Spawn subordinate identities tied to your planet", + "tags": [ + "dojo", + "urbit-id" + ], + "search_terms": [ + "moon identity", + "spawn moon", + "urbit moon", + "moon keyfile", + "moon breach", + "moon cycle keys", + "azimuth moon", + "dojo moon", + "sub identity", + "moon reset" + ] + }, + { + "id": "blurbs/directly-contact-another-urbit.md", + "url": "https://urbit.org/overview/running-urbit/common-commands#directly-contact-another-urbit", + "type": "blurbs", + "title": "Directly contact another urbit", + "summary": "The |hi command sends a peer-to-peer ping to another Urbit ship with an optional message, the most basic p2p messaging affordance in the dojo.", + "description": "Urbit's most basic messaging protocol can send a quick hi in the dojo", + "tags": [ + "dojo" + ], + "search_terms": [ + "hi command", + "dojo hi", + "ping ship", + "direct message", + "urbit p2p", + "neighbor message", + "connect to ship", + "urbit messaging", + "quick hi" + ] + }, + { + "id": "blurbs/docking-your-urbit.md", + "url": "https://urbit.org/overview/running-urbit/common-commands#docking-your-urbit", + "type": "blurbs", + "title": "Docking your urbit", + "summary": "Use the dock command to copy the Vere runtime binary into your pier, making it self-contained with a specific runtime version for portable deployment.", + "description": "Install a specific runtime version into your pier", + "tags": [ + "runtime" + ], + "search_terms": [ + "dock command", + "urbit dock", + "runtime version", + "vere binary", + "pier runtime", + "version pinning", + "docked pier", + "run urbit", + "runtime install" + ] + }, + { + "id": "blurbs/get-access-code.md", + "url": "https://urbit.org/overview/running-urbit/common-commands#get-access-code", + "type": "blurbs", + "title": "Get access code", + "summary": "Use the +code command to retrieve your eight-syllable access code for logging into web interfaces and mobile clients, distinct from your master ticket.", + "description": "A secret code for remote access to your instance of Urbit OS", + "tags": [ + "dojo" + ], + "search_terms": [ + "access code", + "+code", + "luscode", + "urbit login", + "remote access", + "mobile client", + "web login", + "phenome code", + "urbit secret" + ] + }, + { + "id": "blurbs/reduce-your-pier-size.md", + "url": "https://urbit.org/overview/running-urbit/common-commands#reduce-your-pier-size", + "type": "blurbs", + "title": "Reduce your pier size", + "summary": "Use Vere's roll and chop commands to create new epochs and truncate event logs, reducing pier size from hundreds of GB to under 10GB on long-running ships.", + "description": "Compress and clean up your urbit's disk usage", + "tags": [ + "dojo", + "runtime" + ], + "search_terms": [ + "reduce pier size", + "roll command", + "chop command", + "urbit disk", + "event log", + "epoch", + "runtime disk", + "pier cleanup", + "truncate events", + "urbit storage" + ] + }, + { + "id": "blurbs/select-available-loom-size.md", + "url": "https://urbit.org/overview/running-urbit/common-commands#select-available-loom-size", + "type": "blurbs", + "title": "Select available loom size", + "summary": "Use the --loom flag with a power-of-two exponent to set memory allocation: 30=1GB, 31=2GB (default), 32=4GB, or 33=8GB based on system resources.", + "description": "Configure memory allocation for your urbit", + "tags": [ + "runtime" + ], + "search_terms": [ + "loom size", + "--loom", + "memory allocation", + "urbit ram", + "loom exponent", + "loom 32", + "configure runtime", + "run urbit memory", + "loom flag" + ] + }, + { + "id": "blurbs/shut-down-your-urbit.md", + "url": "https://urbit.org/overview/running-urbit/common-commands#shut-down-your-urbit", + "type": "blurbs", + "title": "Shut down your urbit", + "summary": "Use |exit or Ctrl-D from dojo to gracefully shut down your urbit, though Urbit's solid-state design allows straightforward recovery from power loss.", + "description": "Gracefully stop your urbit instance", + "tags": [ + "dojo", + "runtime" + ], + "search_terms": [ + "shutdown urbit", + "exit command", + "ctrl-d", + "graceful shutdown", + "stop urbit", + "dojo exit", + "runtime shutdown", + "solid state", + "power loss recovery" + ] + }, + { + "id": "blurbs/start-and-stop-applications-on-your-urbit.md", + "url": "https://urbit.org/overview/running-urbit/common-commands#start-and-stop-applications-on-your-urbit", + "type": "blurbs", + "title": "Start and stop applications on your urbit", + "summary": "Manage applications with |start, |suspend, |pause, and |revive commands to control specific agents, suspend desks, prevent updates, or restart suspended agents.", + "description": "Control application lifecycles with dojo commands", + "tags": [ + "dojo" + ], + "search_terms": [ + "start app", + "stop app", + "dojo start", + "suspend desk", + "pause desk", + "revive app", + "agent control", + "app lifecycle", + "desk updates" + ] + }, + { + "id": "blurbs/start-up-your-urbit.md", + "url": "https://urbit.org/overview/running-urbit/common-commands#start-up-your-urbit", + "type": "blurbs", + "title": "Restart up your urbit after initial boot", + "summary": "Boot your urbit with ./urbit /path/to/pier, or use the auto-docked .run script after initial boot for version-pinned, standalone execution.", + "description": "Restarting your urbit after intial boot is straightforward and doesn't require additional cryptographic secrets", + "tags": [ + "runtime" + ], + "search_terms": [ + "restart urbit", + "run urbit", + "urbit runtime", + "pier run", + "docked pier", + ".run", + "loom flag", + "boot ship", + "urbit restart" + ] + }, + { + "id": "blurbs/update-commands-for-your-urbit.md", + "url": "https://urbit.org/overview/running-urbit/common-commands#update-commands-for-your-urbit", + "type": "blurbs", + "title": "Update Commands For Your Urbit", + "summary": "Use |bump to apply kernel updates and suspend incompatible apps, or |ota to change your Over-The-Air update provider if your sponsor is derelict.", + "description": "Your urbit is generally auto-updating, but in the event of an incompatible application or a kernel update that would conflict with existing apps, you may need to decide which software to run", + "tags": [ + "dojo" + ], + "search_terms": [ + "update commands", + "bump", + "ota", + "kernel update", + "app incompatibility", + "suspend desks", + "update provider", + "over the air", + "dojo update" + ] + }, + { + "id": "blurbs/update-your-urbit-runtime.md", + "url": "https://urbit.org/overview/running-urbit/common-commands#update-your-urbit-runtime", + "type": "blurbs", + "title": "Update your urbit runtime", + "summary": "Use ./urbit next /path/to/pier to automatically check for and install Vere runtime updates with the latest performance improvements and bug fixes.", + "description": "Keep your vere binary up to date", + "tags": [ + "runtime" + ], + "search_terms": [ + "update runtime", + "vere next", + "urbit next", + "runtime updates", + "vere binary", + "performance fixes", + "bug fixes", + "networking updates", + "runtime install" + ] + }, + { + "id": "blurbs/groundwire-based-urbit-ids.md", + "url": "https://urbit.org/overview/running-urbit/get-urbit-id", + "type": "blurbs", + "title": "Groundwire-based Urbit IDs", + "summary": "Groundwire is an upcoming Bitcoin-based Urbit identity system using ordinal/NFT inscriptions for independent self-issuance with L1 Bitcoin's spam resistance.", + "description": "Groundwire identities are cryptographically owned Urbit address space on the Bitcoin blockchain", + "tags": [ + "bitcoin", + "urbit-id", + "ordinal", + "comet" + ], + "search_terms": [ + "groundwire ids", + "bitcoin urbit", + "ordinal nft", + "inscription nft", + "comet identity", + "bitcoin address space", + "groundwire network", + "l1 bitcoin fees", + "self issued ids", + "groundwire messenger" + ] + }, + { + "id": "overview/running-urbit/get-urbit-id.md", + "url": "https://urbit.org/overview/running-urbit/get-urbit-id", + "type": "overview", + "title": "Get Urbit ID", + "summary": "Methods for obtaining an Urbit ID including purchasing Layer 1 Azimuth identities on NFT marketplaces, acquiring Layer 2 identities from vendors using Bitcoin or fiat, and receiving invitations from existing users.", + "description": "Learn how to acquire your own Urbit identity", + "tags": [], + "search_terms": [] + }, + { + "id": "blurbs/azimuth-based-urbit-ids.md", + "url": "https://urbit.org/overview/running-urbit/get-urbit-id#azimuth-based-urbit-ids", + "type": "blurbs", + "title": "Azimuth-based Urbit IDs", + "summary": "Azimuth identities are Urbit addresses registered as NFTs on Ethereum (Layer 1 or Layer 2 rollup), purchasable via marketplaces like OpenSea or from third-party sellers.", + "description": "Azimuth identities are cryptographically owned Urbit address space on the Ethereum blockchain", + "tags": [ + "ethereum", + "layer 1", + "layer 2", + "urbit id", + "nft" + ], + "search_terms": [ + "azimuth ids", + "urbit id nft", + "ethereum address space", + "bridge login", + "buy urbit id", + "galaxy star planet", + "layer 2 rollup", + "ecliptic contracts", + "ownership ledger", + "web3 wallet", + "network explorer" + ] + }, + { + "id": "blurbs/buy-an-urbit-id.md", + "url": "https://urbit.org/overview/running-urbit/get-urbit-id#buy-an-urbit-id", + "type": "blurbs", + "title": "Buy an Urbit ID", + "summary": "Acquire a self-sovereign Urbit ID via Layer 1 NFT marketplaces like OpenSea or Layer 2 providers accepting Bitcoin or credit cards, with planets (4-syllable @p) recommended for new users.", + "description": "Learn how to acquire your own self-sovereign digital identity", + "tags": [ + "urbit-id" + ], + "search_terms": [ + "buy urbit id", + "urbit planet", + "azimuth identity", + "layer 1 nft", + "layer 2 rollup", + "opensea marketplace", + "subject network", + "pocwet store", + "bitcoin planet", + "credit card planet", + "galaxy star ids", + "self sovereign identity" + ] + }, + { + "id": "blurbs/self-custody-your-id.md", + "url": "https://urbit.org/overview/running-urbit/get-urbit-id#self-custody-your-id", + "type": "blurbs", + "title": "Self-custody your Urbit ID", + "summary": "Self custody means controlling your cryptographic assets directly through master ticket wallets, software wallets like MetaMask, or hardware wallets like Ledger or Trezor.", + "description": "As a cryptographic asset, there are many ways to control and secure your Urbit ID", + "tags": [ + "wallet", + "ledger", + "trezor", + "metamask", + "urbit-id" + ], + "search_terms": [ + "self custody", + "urbit id security", + "hardware wallet", + "software wallet", + "master ticket", + "ledger trezor", + "metamask", + "seed phrase", + "bridge wallet", + "ownership key" + ] + }, + { + "id": "blurbs/urbit-master-ticket-wallets.md", + "url": "https://urbit.org/overview/running-urbit/get-urbit-id#urbit-master-ticket-wallets", + "type": "blurbs", + "title": "Urbit master ticket wallets", + "summary": "Master ticket wallets shard cryptographic permissions for Urbit IDs like a brainwallet, with support in Bridge alongside standard wallets and hardware wallets.", + "description": "Master ticket wallets are an easy and secure way for managing ownership of your Urbit ID", + "tags": [ + "ethereum", + "wallet", + "azimuth" + ], + "search_terms": [ + "master ticket", + "brainwallet", + "hd wallet", + "urbit id wallet", + "bridge", + "cryptographic keys", + "azimuth wallet", + "ledger trezor", + "metamask", + "gnosis safe" + ] + }, + { + "id": "overview/running-urbit/glossary.md", + "url": "https://urbit.org/overview/running-urbit/glossary", + "type": "overview", + "title": "Glossary", + "summary": "Terminology reference guide for Urbit covering ships, piers, galaxies, stars, planets, moons, comets, and other domain-specific vocabulary used throughout Urbit documentation and community discussions.", + "description": "Common terms and concepts in Urbit", + "tags": [], + "search_terms": [] + }, + { + "id": "overview/running-urbit/hosting-providers.md", + "url": "https://urbit.org/overview/running-urbit/hosting-providers", + "type": "overview", + "title": "Hosting Providers", + "summary": "Third-party managed hosting services for Urbit ships that handle technical infrastructure management, with coverage of providers like Tlon, incentives for hosts, and tradeoffs compared to self-hosting.", + "description": "Explore hosting options for your Urbit", + "tags": [], + "search_terms": [] + }, + { + "id": "blurbs/run-urbit-with-tlon-hosting.md", + "url": "https://urbit.org/overview/running-urbit/hosting-providers#run-urbit-with-tlon-hosting", + "type": "blurbs", + "title": "Tlon hosting services", + "summary": "Tlon provides free Layer 2 hosting with co-custody master tickets, quick onboarding via invite links, and email-based account creation without crypto wallet requirements.", + "description": "Tlon Corporation is the preeminent hosting provider which provides free and seamless onboarding to the Urbit network", + "tags": [ + "hosting", + "hosting-provider", + "urbit-os", + "tlon", + "layer 2" + ], + "search_terms": [ + "tlon hosting", + "tlon messenger", + "hosted urbit", + "layer 2 planet", + "master ticket", + "management proxy", + "urbit foundation group", + "invite friends", + "support email", + "hosted onboarding" + ] + }, + { + "id": "blurbs/shortfalls-of-hosting-providers.md", + "url": "https://urbit.org/overview/running-urbit/hosting-providers#shortfalls-of-hosting-providers", + "type": "blurbs", + "title": "Shortfalls of hosting providers", + "summary": "Hosting providers must keep your urbit unencrypted at runtime, limiting privacy, and offer narrower interaction options like web interfaces rather than full SSH access.", + "description": "Hosting providers are designed to be scalable, not bespoke, operations.", + "tags": [ + "hosting", + "urbit-os" + ], + "search_terms": [ + "hosting drawbacks", + "provider risks", + "encrypted at rest", + "host access data", + "self hosting control", + "dns control", + "ssh access", + "managed hosting limits", + "urbit privacy" + ] + }, + { + "id": "blurbs/urbit-id-incentives-for-hosts.md", + "url": "https://urbit.org/overview/running-urbit/hosting-providers#urbit-id-incentives-for-hosts", + "type": "blurbs", + "title": "Urbit ID incentives for hosts", + "summary": "Cryptographic ID ownership enforces honest hosting by letting users override malevolent hosts at any time, shifting the principal-agent relationship back to user control.", + "description": "Cryptographic ownership of Urbit ID helps enforce honest operation of Urbit OS by hosting providers", + "tags": [], + "search_terms": [ + "host incentives", + "urbit id ownership", + "principal agent", + "hosting provider", + "user control", + "cryptographic identity", + "unpersoning", + "host accountability", + "self sovereign", + "bridge" + ] + }, + { + "id": "blurbs/why-hosting-providers.md", + "url": "https://urbit.org/overview/running-urbit/hosting-providers#why-hosting-providers", + "type": "blurbs", + "title": "Why use a hosting provider?", + "summary": "Hosting providers exist because Urbit isn't quite as easy as 'caring for a cactus' yet, and because networks effects matter for users who aren't inclined to self-host.", + "description": "Urbit is a personal server, yet there are still service providers who will host it for you", + "tags": [ + "hosting", + "hosting-provider", + "urbit-os" + ], + "search_terms": [ + "why hosting", + "hosting provider", + "managed hosting", + "onboarding", + "maintenance support", + "groundseg", + "network effects", + "personal server", + "cactus analogy", + "hosted urbit" + ] + }, + { + "id": "overview/running-urbit/resources.md", + "url": "https://urbit.org/overview/running-urbit/resources", + "type": "overview", + "title": "Resources", + "summary": "Curated collection of Urbit documentation, tutorials, and community resources including self-hosting guides, the Urbit Systems Technical Journal, Hoon learning materials, and related blogs for continued learning.", + "description": "Helpful resources for learning more about Urbit", + "tags": [], + "search_terms": [] + }, + { + "id": "blurbs/docs-for-self-hosting-urbit.md", + "url": "https://urbit.org/overview/running-urbit/resources#docs-for-self-hosting-urbit", + "type": "blurbs", + "title": "Documentation for self-hosting urbit", + "summary": "Essential self-hosting resources including CLI setup guides, Groundseg documentation, and cloud hosting instructions for running your own Urbit node.", + "description": "The top guides for learning how to run your own urbit node", + "tags": [], + "search_terms": [ + "self hosting guide", + "run urbit node", + "cloud hosting", + "groundseg guide", + "local setup", + "urbit os", + "hosting docs", + "comet identity", + "native planet", + "cloud server" + ] + }, + { + "id": "blurbs/learn-to-hoon.md", + "url": "https://urbit.org/overview/running-urbit/resources#learn-to-hoon", + "type": "blurbs", + "title": "Learn To Hoon", + "summary": "Learn Hoon, Urbit's purely-functional systems programming language, through video lectures, written curriculum at Hoon School, and extensive technical documentation.", + "description": "Hoon is Urbit's high-level, statically-typed, purely-functional programming language", + "tags": [], + "search_terms": [ + "learn hoon", + "hoon school", + "urbit programming", + "functional language", + "nock hoon", + "runic syntax", + "systems programming", + "hoon docs", + "hoon video", + "hoon source" + ] + }, + { + "id": "blurbs/urbit-related-blogs.md", + "url": "https://urbit.org/overview/running-urbit/resources#urbit-related-blogs", + "type": "blurbs", + "title": "Urbit-related blogs", + "summary": "Read community blogs from subject.network, ~sarlev, Martian Computing, and the %hawk blog, plus the Urmanac almanac for Urbit history and apps.", + "description": "A collection of written urbit content from the broader community", + "tags": [], + "search_terms": [ + "urbit blogs", + "community writing", + "subject network blog", + "martian computing", + "hawk blog", + "urmanac", + "urbit essays", + "urbit commentary", + "sarlev blog" + ] + }, + { + "id": "blurbs/urbit-systems-technical-journal.md", + "url": "https://urbit.org/overview/running-urbit/resources#urbit-systems-technical-journal", + "type": "blurbs", + "title": "Urbit Systems Technical Journal", + "summary": "The Urbit Systems Technical Journal publishes articles on Urbit development and solid-state computing, including Neo Urbit advancements in Nock performance and memory management.", + "description": "Placeholder description", + "tags": [], + "search_terms": [ + "ustj", + "urbit systems journal", + "technical journal", + "solid state computing", + "neo urbit", + "nock performance", + "memory management", + "dynamic linking", + "submit article", + "lagrev nocfep" + ] + }, + { + "id": "overview/running-urbit/run-urbit-os.md", + "url": "https://urbit.org/overview/running-urbit/run-urbit-os", + "type": "overview", + "title": "Run Urbit OS", + "summary": "Methods for running an Urbit node after acquiring an identity, covering local VPS deployment, Native Planet hardware, and Groundseg with explanations of networking tradeoffs and sovereignty implications for each approach.", + "description": "Set up and run your own Urbit node", + "tags": [], + "search_terms": [] + }, + { + "id": "blurbs/run-urbit-in-a-vps.md", + "url": "https://urbit.org/overview/running-urbit/run-urbit-os#run-urbit-in-a-vps", + "type": "blurbs", + "title": "Run urbit in a virtual server", + "summary": "Run Urbit on cloud providers like AWS, Linode, or Digital Ocean for reliable uptime, with minimum requirements of 1 vCPU, 2-4GB RAM, and 10-40GB storage.", + "description": "Urbit runs seamlessly in any cloud server or datacenter you may already be familiar with", + "tags": [], + "search_terms": [ + "cloud server", + "vps urbit", + "run urbit in cloud", + "aws urbit", + "linode urbit", + "server requirements", + "linux hosting", + "datacenter hosting", + "virtual server", + "cloud hosting guide" + ] + }, + { + "id": "blurbs/run-urbit-locally.md", + "url": "https://urbit.org/overview/running-urbit/run-urbit-os#run-urbit-locally", + "type": "blurbs", + "title": "Run urbit locally", + "summary": "Run Urbit on your local laptop or desktop for peer-to-peer networking access, though public domain access requires additional configuration beyond local hosting.", + "description": "Quickly and easily run urbit on your laptop, or home desktop computer", + "tags": [], + "search_terms": [ + "run urbit locally", + "laptop urbit", + "home computer", + "local network", + "localhost access", + "ames networking", + "local urbit", + "home hosting", + "fakeship", + "no public domain" + ] + }, + { + "id": "blurbs/run-urbit-using-groundseg.md", + "url": "https://urbit.org/overview/running-urbit/run-urbit-os#run-urbit-using-groundseg", + "type": "blurbs", + "title": "Run Urbit Using Groundseg", + "summary": "Groundseg provides a GUI for managing Urbit containers via Docker, with features for loom adjustment, event log truncation, and automatic maintenance routines.", + "description": "Groundseg is free and open-source software for running urbits, developed by Native Planet", + "tags": [ + "urbit-os", + "docker", + "native-planet" + ], + "search_terms": [ + "groundseg", + "native planet software", + "urbit gui", + "docker urbit", + "colonyos", + "startram", + "anchor", + "urbit management", + "loom size", + "event log" + ] + }, + { + "id": "blurbs/run-urbit-using-native-planet-hardware.md", + "url": "https://urbit.org/overview/running-urbit/run-urbit-os#run-urbit-using-native-planet-hardware", + "type": "blurbs", + "title": "Run urbit using Native Planet hardware", + "summary": "Native Planet sells purpose-built hardware with ColonyOS and Groundseg preloaded, offering managed hosting features like Startram DNS while maintaining local sovereignty.", + "description": "Placeholder description", + "tags": [], + "search_terms": [ + "native planet hardware", + "urbit appliance", + "colonyos", + "groundseg", + "startram", + "anchor", + "minio setup", + "self hosting device", + "dns service", + "hardware hosting" + ] + }, + { + "id": "blurbs/urbit-as-overlay-os.md", + "url": "https://urbit.org/overview/running-urbit/run-urbit-os#urbit-as-overlay-os", + "type": "blurbs", + "title": "Urbit as overlay OS", + "summary": "Urbit OS runs as an overlay OS via the Vere runtime on any Unix host, allowing your entire 'pier' to be portable across hardware like a zipped virtual machine.", + "description": "Urbit OS is a personal server operating system that runs on any Unix box as a self-contained virtual machine", + "tags": [ + "urbit-os", + "virtual-machine", + "runtime" + ], + "search_terms": [ + "overlay os", + "urbit os", + "vere runtime", + "virtual machine", + "portable pier", + "move urbit", + "stateful networking", + "double boot", + "zip pier", + "host os" + ] + }, + { + "id": "blurbs/troubleshooting-your-urbit.md", + "url": "https://urbit.org/overview/running-urbit/support", + "type": "blurbs", + "title": "Troubleshooting Your Urbit", + "summary": "This guide is a placeholder and will provide troubleshooting steps for common Urbit issues, errors, and connectivity problems.", + "description": "Placeholder description", + "tags": [], + "search_terms": [ + "urbit troubleshooting", + "common issues", + "fix urbit", + "ship errors", + "help running urbit", + "urbit support", + "debug urbit", + "network issues" + ] + }, + { + "id": "blurbs/common-pitfalls-of-running-urbit.md", + "url": "https://urbit.org/overview/running-urbit/support", + "type": "blurbs", + "title": "Common Pitfalls Of Running Urbit", + "summary": "This guide is a placeholder and will cover common mistakes and issues encountered when running and maintaining your own Urbit instance.", + "description": "Placeholder description", + "tags": [], + "search_terms": [ + "urbit pitfalls", + "running urbit issues", + "common mistakes", + "urbit troubleshooting", + "ship errors", + "self hosting problems", + "urbit setup", + "beginner mistakes", + "pier issues" + ] + }, + { + "id": "overview/running-urbit/support.md", + "url": "https://urbit.org/overview/running-urbit/support", + "type": "overview", + "title": "Support", + "summary": "Support resources for Urbit users encountering issues or with questions, providing links to community forums and contact points for assistance from the Urbit community and core developers.", + "description": "Get help with Urbit", + "tags": [], + "search_terms": [] + }, + { + "id": "blurbs/support-contact-points.md", + "url": "https://urbit.org/overview/running-urbit/support#support-contact-points", + "type": "blurbs", + "title": "Off-network support channels", + "summary": "Get off-network support for runtime issues via support@urbit.org and GitHub, or Tlon Messenger issues via support@tlon.io when unable to reach the network directly.", + "description": "Not able to get onto the network at all? Here are some off-network channels for getting support", + "tags": [], + "search_terms": [ + "support email", + "off network support", + "urbit support", + "tlon support", + "github issues", + "can't connect", + "help offline", + "support@urbit.org", + "support@tlon.io" + ] + }, + { + "id": "blurbs/urbit-support-groups.md", + "url": "https://urbit.org/overview/running-urbit/support#urbit-support-groups", + "type": "blurbs", + "title": "On-network support channels", + "summary": "Join Tlon Messenger groups like Tlon Local, battery payload, Hooniverse, Urbit Community, and Urbit Foundation for support with hardware, development, Hoon, and general help.", + "description": "Need help with something? Give a shout in one of these groups and someone will give you a hand", + "tags": [], + "search_terms": [ + "support groups", + "tlon local", + "battery payload", + "hooniverse", + "urbit community", + "uf public", + "tlon messenger groups", + "get help on urbit", + "support comet", + "join group" + ] + }, + { + "id": "overview/urbit-explained/intro.md", + "url": "https://urbit.org/overview/urbit-explained", + "type": "overview", + "title": "Urbit Explained", + "summary": "Introduction to Urbit as an approach to building durable computing infrastructure, explaining the motivation for a long-lasting software stack and the two-part structure of identity and operating system. Covers Urbit ID and Urbit OS as core components.", + "description": "Urbit is a practice in building a forever computer", + "tags": [], + "search_terms": [] + }, + { + "id": "overview/urbit-explained/beyond.md", + "url": "https://urbit.org/overview/urbit-explained/beyond", + "type": "overview", + "title": "Beyond", + "summary": "Overview of Urbit's ecosystem and development goals, including the Urbit Foundation, private companies like Tlon and Native Planet, and technical contributions such as Named Data Networking. Explains how each component can be used independently and resources for contributors.", + "description": "Building towards a decentralized future for a distributed network", + "tags": [], + "search_terms": [] + }, + { + "id": "overview/urbit-explained/urbit-id.md", + "url": "https://urbit.org/overview/urbit-explained/urbit-id", + "type": "overview", + "title": "Urbit ID", + "summary": "Urbit ID is the naming and addressing system for the network, with five tiers from galaxies to comets. Each identity provides cryptographic authentication and contact info via the Azimuth contracts on Ethereum.", + "description": "A decentralized identity system for the Urbit network", + "tags": [], + "search_terms": [] + }, + { + "id": "overview/urbit-explained/urbit-os.md", + "url": "https://urbit.org/overview/urbit-explained/urbit-os", + "type": "overview", + "title": "Urbit OS", + "summary": "Urbit OS is an overlay system built on the Nock virtual machine, with a functional language, kernel, and core modules like filesystem and networking. It keeps state as a pure function of its event history.", + "description": "A new operating system designed to give individuals control of their digital lives", + "tags": [], + "search_terms": [] + } + ] +} \ No newline at end of file diff --git a/public/llms.txt b/public/llms.txt new file mode 100644 index 0000000000..0fc49297a5 --- /dev/null +++ b/public/llms.txt @@ -0,0 +1,32 @@ +# urbit.org +> Curated entry points for AI agents, crawlers, and other automated readers. + +## Start here +- [Homepage](https://urbit.org/) — Overview of Urbit with links to getting started, running a ship, and the broader ecosystem. +- [Overview](https://urbit.org/overview) — Introduction to Urbit as an approach to building durable computing infrastructure, explaining the motivation for a long-lasting software stack and the two-part structure of identity and operating system. Covers Urbit ID and Urbit OS as core components. +- [Urbit Explained](https://urbit.org/overview/urbit-explained) — Introduction to Urbit as an approach to building durable computing infrastructure, explaining the motivation for a long-lasting software stack and the two-part structure of identity and operating system. Covers Urbit ID and Urbit OS as core components. +- [Running Urbit](https://urbit.org/overview/running-urbit) — Introduction to running Urbit covering the two required steps of acquiring an Urbit ID and booting Urbit OS, with examples of deployment options ranging from galaxy-level infrastructure to comets on local laptops. +- [Get On The Network](https://urbit.org/get-on-the-network) — Entry points for getting on Urbit, including hosted options and self-hosting resources. +- [https://urbit.org/ecosystem](https://urbit.org/ecosystem) +- [https://urbit.org/blog](https://urbit.org/blog) + +## Running Urbit +- [Get Urbit ID](https://urbit.org/overview/running-urbit/get-urbit-id) — Methods for obtaining an Urbit ID including purchasing Layer 1 Azimuth identities on NFT marketplaces, acquiring Layer 2 identities from vendors using Bitcoin or fiat, and receiving invitations from existing users. +- [Run Urbit OS](https://urbit.org/overview/running-urbit/run-urbit-os) — Methods for running an Urbit node after acquiring an identity, covering local VPS deployment, Native Planet hardware, and Groundseg with explanations of networking tradeoffs and sovereignty implications for each approach. +- [Hosting Providers](https://urbit.org/overview/running-urbit/hosting-providers) — Third-party managed hosting services for Urbit ships that handle technical infrastructure management, with coverage of providers like Tlon, incentives for hosts, and tradeoffs compared to self-hosting. +- [Common Commands](https://urbit.org/overview/running-urbit/common-commands) — Reference guide for essential dojo commands including ship management operations, application installation and status checking, azimuth state verification, memory optimization, moon identity creation, and shutdown procedures. +- [Resources](https://urbit.org/overview/running-urbit/resources) — Curated collection of Urbit documentation, tutorials, and community resources including self-hosting guides, the Urbit Systems Technical Journal, Hoon learning materials, and related blogs for continued learning. +- [Support](https://urbit.org/overview/running-urbit/support) — Support resources for Urbit users encountering issues or with questions, providing links to community forums and contact points for assistance from the Urbit community and core developers. + +## Understanding Urbit +- [Urbit ID](https://urbit.org/overview/urbit-explained/urbit-id) — Urbit ID is the naming and addressing system for the network, with five tiers from galaxies to comets. Each identity provides cryptographic authentication and contact info via the Azimuth contracts on Ethereum. +- [Urbit OS](https://urbit.org/overview/urbit-explained/urbit-os) — Urbit OS is an overlay system built on the Nock virtual machine, with a functional language, kernel, and core modules like filesystem and networking. It keeps state as a pure function of its event history. +- [Beyond](https://urbit.org/overview/urbit-explained/beyond) — Overview of Urbit's ecosystem and development goals, including the Urbit Foundation, private companies like Tlon and Native Planet, and technical contributions such as Named Data Networking. Explains how each component can be used independently and resources for contributors. + +## Building on Urbit (docs.urbit.org) +- [https://docs.urbit.org/](https://docs.urbit.org/) — Start here for official Urbit documentation and orientation material. +- [https://docs.urbit.org/tutorials/](https://docs.urbit.org/tutorials/) — Step-by-step tutorials for building and configuring Urbit systems. +- [https://docs.urbit.org/glossary/](https://docs.urbit.org/glossary/) — Definitions for Urbit terms, components, and system concepts. +- [https://docs.urbit.org/reference/hoon/](https://docs.urbit.org/reference/hoon/) — Reference documentation for the Hoon programming language. +- [https://docs.urbit.org/reference/nock/](https://docs.urbit.org/reference/nock/) — Reference documentation for the Nock combinator language. +- [https://docs.urbit.org/reference/arvo/](https://docs.urbit.org/reference/arvo/) — Reference documentation for Arvo, the Urbit kernel. diff --git a/scripts/ai-legibility-config.js b/scripts/ai-legibility-config.js new file mode 100644 index 0000000000..697716325e --- /dev/null +++ b/scripts/ai-legibility-config.js @@ -0,0 +1,68 @@ +const llmsConfig = { + title: "urbit.org", + description: "Curated entry points for AI agents, crawlers, and other automated readers.", + sections: [ + { + title: "Start here", + entries: [ + { url: "https://urbit.org/", required: true }, + { url: "https://urbit.org/overview", required: true }, + { url: "https://urbit.org/overview/urbit-explained", required: true }, + { url: "https://urbit.org/overview/running-urbit", required: true }, + { url: "https://urbit.org/get-on-the-network", required: true }, + { url: "https://urbit.org/ecosystem" }, + { url: "https://urbit.org/blog" }, + ], + }, + { + title: "Running Urbit", + entries: [ + { url: "https://urbit.org/overview/running-urbit/get-urbit-id", required: true }, + { url: "https://urbit.org/overview/running-urbit/run-urbit-os", required: true }, + { url: "https://urbit.org/overview/running-urbit/hosting-providers" }, + { url: "https://urbit.org/overview/running-urbit/common-commands" }, + { url: "https://urbit.org/overview/running-urbit/resources" }, + { url: "https://urbit.org/overview/running-urbit/support" }, + ], + }, + { + title: "Understanding Urbit", + entries: [ + { url: "https://urbit.org/overview/urbit-explained/urbit-id" }, + { url: "https://urbit.org/overview/urbit-explained/urbit-os" }, + { url: "https://urbit.org/overview/urbit-explained/beyond" }, + ], + }, + { + title: "Building on Urbit (docs.urbit.org)", + entries: [ + { + url: "https://docs.urbit.org/", + summary: "Start here for official Urbit documentation and orientation material.", + }, + { + url: "https://docs.urbit.org/tutorials/", + summary: "Step-by-step tutorials for building and configuring Urbit systems.", + }, + { + url: "https://docs.urbit.org/glossary/", + summary: "Definitions for Urbit terms, components, and system concepts.", + }, + { + url: "https://docs.urbit.org/reference/hoon/", + summary: "Reference documentation for the Hoon programming language.", + }, + { + url: "https://docs.urbit.org/reference/nock/", + summary: "Reference documentation for the Nock combinator language.", + }, + { + url: "https://docs.urbit.org/reference/arvo/", + summary: "Reference documentation for Arvo, the Urbit kernel.", + }, + ], + }, + ], +}; + +module.exports = { llmsConfig }; diff --git a/scripts/backfill-summaries.js b/scripts/backfill-summaries.js new file mode 100644 index 0000000000..441746fd76 --- /dev/null +++ b/scripts/backfill-summaries.js @@ -0,0 +1,154 @@ +#!/usr/bin/env node + +const fs = require("fs"); +const path = require("path"); +const matter = require("gray-matter"); +const { glob } = require("glob"); +const toml = require("@iarna/toml"); + +const CONTENT_DIR = path.join(process.cwd(), "app/content"); +const TARGET_DIRS = ["blog", "blurbs", "overview"]; +const SUMMARY_MAX = 280; + +const stripMarkdown = (value) => { + if (!value) return ""; + let text = String(value); + text = text.replace(/```[\s\S]*?```/g, " "); + text = text.replace(/`([^`]+)`/g, "$1"); + text = text.replace(/!\[[^\]]*\]\([^\)]+\)/g, " "); + text = text.replace(/\[([^\]]+)\]\([^\)]+\)/g, "$1"); + text = text.replace(/\*\*([^*]+)\*\*/g, "$1"); + text = text.replace(/\*([^*]+)\*/g, "$1"); + text = text.replace(/_([^_]+)_/g, "$1"); + text = text.replace(/^#+\s+/gm, ""); + text = text.replace(/^>\s+/gm, ""); + text = text.replace(/\s+/g, " ").trim(); + return text; +}; + +const truncateToLimit = (value, limit) => { + if (!value) return ""; + const cleaned = stripMarkdown(value).trim(); + if (cleaned.length <= limit) { + return cleaned; + } + + const boundary = cleaned.slice(0, limit + 1); + const lastSentenceMatch = boundary.match(/^(.*[\.\!\?])\s+/); + if (lastSentenceMatch && lastSentenceMatch[1].length <= limit) { + return lastSentenceMatch[1].trim(); + } + + const lastSpace = cleaned.lastIndexOf(" ", limit - 1); + const cutIndex = lastSpace > 0 ? lastSpace : limit - 1; + return `${cleaned.slice(0, cutIndex).trim()}...`; +}; + +const getFirstParagraph = (content) => { + if (!content) return ""; + const chunks = content + .split(/\n\s*\n/) + .map((chunk) => chunk.trim()) + .filter(Boolean); + + for (const chunk of chunks) { + const cleaned = stripMarkdown(chunk.replace(/\n+/g, " ")); + if (cleaned) { + return cleaned; + } + } + + return ""; +}; + +const buildSummary = (frontMatter, content) => { + const description = frontMatter?.description || frontMatter?.extra?.description; + if (description) { + return truncateToLimit(description, SUMMARY_MAX); + } + + const firstParagraph = getFirstParagraph(content); + if (firstParagraph) { + return truncateToLimit(firstParagraph, SUMMARY_MAX); + } + + return ""; +}; + +const updateFrontMatterBlock = (raw, summary, isToml) => { + const delimiter = isToml ? "+++" : "---"; + const start = raw.indexOf(delimiter); + const end = raw.indexOf(delimiter, start + delimiter.length); + if (start !== 0 || end === -1) { + return raw; + } + + const frontMatter = raw.slice(start + delimiter.length, end).trimEnd(); + const rest = raw.slice(end + delimiter.length); + const summaryLine = isToml + ? `summary = "${summary.replace(/\\/g, "\\\\").replace(/\"/g, "\\\"")}"` + : `summary: "${summary.replace(/\\/g, "\\\\").replace(/\"/g, "\\\"")}"`; + + let updated; + if (isToml) { + if (/^summary\s*=\s*/m.test(frontMatter)) { + updated = frontMatter.replace(/^summary\s*=\s*.*$/m, summaryLine); + } else if (/^description\s*=\s*/m.test(frontMatter)) { + updated = frontMatter.replace(/^description\s*=\s*.*$/m, (match) => `${match}\n${summaryLine}`); + } else if (/^title\s*=\s*/m.test(frontMatter)) { + updated = frontMatter.replace(/^title\s*=\s*.*$/m, (match) => `${match}\n${summaryLine}`); + } else { + updated = `${frontMatter}\n${summaryLine}`.trim(); + } + } else { + if (/^summary\s*:/m.test(frontMatter)) { + updated = frontMatter.replace(/^summary\s*:.*$/m, summaryLine); + } else if (/^description\s*:/m.test(frontMatter)) { + updated = frontMatter.replace(/^description\s*:.*$/m, (match) => `${match}\n${summaryLine}`); + } else if (/^title\s*:/m.test(frontMatter)) { + updated = frontMatter.replace(/^title\s*:.*$/m, (match) => `${match}\n${summaryLine}`); + } else { + updated = `${frontMatter}\n${summaryLine}`.trim(); + } + } + + return `${delimiter}\n${updated}\n${delimiter}${rest}`; +}; + +async function backfillSummaries() { + const globPattern = `{${TARGET_DIRS.join(",")}}/**/*.md`; + const files = await glob(path.join(CONTENT_DIR, globPattern)); + let updatedCount = 0; + + for (const filePath of files) { + const raw = fs.readFileSync(filePath, "utf-8"); + const trimmed = raw.trimStart(); + const isToml = trimmed.startsWith("+++"); + const options = isToml + ? { + engines: { toml: toml.parse.bind(toml) }, + language: "toml", + delimiters: "+++", + } + : undefined; + const parsed = matter(raw, options); + const summary = buildSummary(parsed.data, parsed.content); + + if (!summary) { + continue; + } + + const updated = updateFrontMatterBlock(raw, summary, isToml); + if (updated !== raw) { + fs.writeFileSync(filePath, updated, "utf-8"); + updatedCount += 1; + } + } + + console.log(`Updated summaries in ${updatedCount} files.`); +} + +backfillSummaries().catch((error) => { + console.error("Summary backfill failed:", error); + process.exit(1); +}); diff --git a/scripts/build-ai-legibility.js b/scripts/build-ai-legibility.js new file mode 100644 index 0000000000..ca89cd52b8 --- /dev/null +++ b/scripts/build-ai-legibility.js @@ -0,0 +1,577 @@ +#!/usr/bin/env node + +/** + * AI Legibility Builder + * + * Generates: + * - public/content-index.json + * - public/llms.txt + */ + +const fs = require("fs"); +const path = require("path"); +const matter = require("gray-matter"); +const { glob } = require("glob"); +const toml = require("@iarna/toml"); +const { llmsConfig } = require("./ai-legibility-config"); + +const CONTENT_DIR = path.join(process.cwd(), "app/content"); +const OUTPUT_INDEX = path.join(process.cwd(), "public/content-index.json"); +const OUTPUT_LLMS = path.join(process.cwd(), "public/llms.txt"); +const EXCLUDED_FILE_NAMES = new Set(["config.md"]); +const SUMMARY_RECOMMENDED_MAX = 280; +const SUMMARY_ENFORCED_DIRS = ["blog/", "blurbs/", "overview/"]; +const EXCLUDED_SECTIONS = new Set(["grants", "events", "singles"]); + +const normalizeArray = (value) => { + if (!value) return []; + return Array.isArray(value) ? value : [value]; +}; + +const uniqueStrings = (values) => Array.from(new Set(values.filter(Boolean))); + +const normalizeSearchTerms = (value) => { + if (!value) return []; + + const values = normalizeArray(value).flatMap((entry) => { + if (typeof entry === "string") { + return entry + .split(",") + .map((item) => item.trim()) + .filter(Boolean); + } + + if (typeof entry === "number") { + return [String(entry)]; + } + + return []; + }); + + return uniqueStrings(values); +}; + +const stripMarkdown = (value) => { + if (!value) return ""; + let text = String(value); + text = text.replace(/```[\s\S]*?```/g, " "); + text = text.replace(/`([^`]+)`/g, "$1"); + text = text.replace(/!\[[^\]]*\]\([^\)]+\)/g, " "); + text = text.replace(/\[([^\]]+)\]\([^\)]+\)/g, "$1"); + text = text.replace(/\*\*([^*]+)\*\*/g, "$1"); + text = text.replace(/\*([^*]+)\*/g, "$1"); + text = text.replace(/_([^_]+)_/g, "$1"); + text = text.replace(/^#+\s+/gm, ""); + text = text.replace(/^>\s+/gm, ""); + text = text.replace(/\s+/g, " ").trim(); + return text; +}; + +const extractFirstParagraph = (content) => { + if (!content) return ""; + const chunks = content + .split(/\n\s*\n/) + .map((chunk) => chunk.trim()) + .filter(Boolean); + + for (const chunk of chunks) { + const cleaned = stripMarkdown(chunk.replace(/\n+/g, " ")); + if (cleaned) { + return cleaned; + } + } + + return ""; +}; + +const parseFrontMatter = (raw, filePath) => { + const trimmed = raw.trimStart(); + const usesToml = trimmed.startsWith("+++"); + const options = usesToml + ? { + engines: { toml: toml.parse.bind(toml) }, + language: "toml", + delimiters: "+++", + } + : undefined; + + try { + const { data, content } = matter(raw, options); + return { data: data || {}, content }; + } catch (error) { + console.error(`Failed to parse frontmatter for ${filePath}:`, error); + return null; + } +}; + +const toTitleCase = (value) => + value + .split("-") + .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)) + .join(" "); + +const resolveOverviewEntry = (segments, slug, relativePath) => { + const overviewSection = segments[1]; + if (!overviewSection) { + console.warn(`Skipping overview content without subsection: ${relativePath}`); + return null; + } + + const isIntro = slug === "intro"; + const pathSuffix = isIntro + ? `/overview/${overviewSection}` + : `/overview/${overviewSection}/${slug}`; + + return { path: pathSuffix }; +}; + +const addBlurbRoute = (map, slug, targetPath, { overwrite = false } = {}) => { + if (!slug || !targetPath) { + return; + } + + if (!overwrite && map.has(slug)) { + return; + } + + if (overwrite && map.has(slug) && map.get(slug) !== targetPath) { + console.warn(`Blurb ${slug} mapped to multiple routes; using ${targetPath}.`); + } + + map.set(slug, targetPath); +}; + +const buildBlurbRouteMap = async () => { + const map = new Map(); + const manualMappings = { + "troubleshooting-your-urbit": "/overview/running-urbit/support", + "common-pitfalls-of-running-urbit": "/overview/running-urbit/support", + "groundwire-based-urbit-ids": "/overview/running-urbit/get-urbit-id", + }; + + Object.entries(manualMappings).forEach(([slug, target]) => { + addBlurbRoute(map, slug, target, { overwrite: true }); + }); + const homepageConfigPath = path.join(CONTENT_DIR, "homepage/config.md"); + + if (fs.existsSync(homepageConfigPath)) { + try { + const rawContent = fs.readFileSync(homepageConfigPath, "utf-8"); + const parsed = parseFrontMatter(rawContent, homepageConfigPath); + if (parsed) { + const frontMatter = parsed.data; + const sections = normalizeArray(frontMatter.sections); + sections.forEach((section) => { + if (!section) return; + const sectionBlurb = section["section-blurb"]; + addBlurbRoute(map, sectionBlurb, `/#${sectionBlurb}`); + + const subsectionBlurbs = normalizeArray(section["subsection-blurbs"]); + subsectionBlurbs.forEach((blurbSlug) => { + addBlurbRoute(map, blurbSlug, `/#${blurbSlug}`); + }); + }); + + const sidebarBlurb = frontMatter.sidebar_blurb; + addBlurbRoute(map, sidebarBlurb, `/#${sidebarBlurb}`); + } + } catch (error) { + console.error("Failed to load homepage config for blurbs:", error); + } + } + + const overviewPaths = await glob(path.join(CONTENT_DIR, "overview/**/*.md")); + for (const filePath of overviewPaths) { + const filename = path.basename(filePath); + if (EXCLUDED_FILE_NAMES.has(filename)) { + continue; + } + + let rawContent; + try { + rawContent = fs.readFileSync(filePath, "utf-8"); + } catch (error) { + console.error(`Failed to read ${filePath}:`, error); + continue; + } + + const parsed = parseFrontMatter(rawContent, filePath); + if (!parsed) { + continue; + } + + const blurbs = normalizeArray(parsed.data.blurbs); + if (!blurbs.length) { + continue; + } + + const relativePath = path + .relative(CONTENT_DIR, filePath) + .replace(/\\/g, "/"); + const segments = relativePath.split("/"); + const slug = path.basename(filename, ".md"); + const routeInfo = resolveOverviewEntry(segments, slug, relativePath); + + if (!routeInfo) { + continue; + } + + blurbs.forEach((blurbSlug) => { + addBlurbRoute(map, blurbSlug, `${routeInfo.path}#${blurbSlug}`, { overwrite: true }); + }); + } + + return map; +}; + +const resolveEntry = (relativePath, blurbRoutes) => { + const segments = relativePath.split("/"); + const filename = segments[segments.length - 1]; + const slug = path.basename(filename, ".md"); + const section = segments[0]; + + if (relativePath === "index.md") { + return { path: "/", section: "homepage" }; + } + + if (section === "overview") { + const overviewEntry = resolveOverviewEntry(segments, slug, relativePath); + return overviewEntry ? { ...overviewEntry, section: "overview" } : null; + } + + if (section === "blog") { + return { path: `/blog/${slug}`, section: "blog" }; + } + + if (section === "blurbs") { + const targetPath = blurbRoutes?.get(slug); + if (!targetPath) { + console.warn(`Blurb missing route mapping: ${relativePath}`); + return { path: `/#${slug}`, section: "blurbs" }; + } + + return { path: targetPath, section: "blurbs" }; + } + + if (section === "homepage") { + return { path: `/#${slug}`, section: "homepage" }; + } + + if (section === "grants") { + return { path: `/grants/${slug}`, section: "grants" }; + } + + if (section === "events") { + return { path: `/events/${slug}`, section: "events" }; + } + + if (section === "communities") { + return { path: `/communities/${slug}`, section: "communities" }; + } + + if (section === "ecosystem") { + return { path: `/ecosystem/${slug}`, section: "ecosystem" }; + } + + if (section === "singles") { + return { path: `/${slug}`, section: "singles" }; + } + + if (section === "communities") { + return { path: `/communities/${slug}` }; + } + + if (segments.length === 1) { + return { path: `/${slug}`, section: "pages" }; + } + + return { path: `/${relativePath.replace(/\.md$/, "")}`, section: "other" }; +}; + +const getCanonicalBaseUrl = () => { + const configPath = path.join(CONTENT_DIR, "config.md"); + if (!fs.existsSync(configPath)) { + return "https://urbit.org"; + } + + const rawContent = fs.readFileSync(configPath, "utf-8"); + const parsed = parseFrontMatter(rawContent, configPath); + const url = parsed?.data?.site_metadata?.canonicalUrl; + return url || "https://urbit.org"; +}; + +const loadConfigFrontMatter = (relativePath) => { + const filePath = path.join(CONTENT_DIR, relativePath); + if (!fs.existsSync(filePath)) { + return null; + } + + const rawContent = fs.readFileSync(filePath, "utf-8"); + const parsed = parseFrontMatter(rawContent, filePath); + return parsed?.data || null; +}; + +const buildSummaryInfo = (frontMatter, content) => { + const rawSummary = frontMatter?.summary; + const summaryText = stripMarkdown(rawSummary || ""); + if (summaryText) { + return { summary: summaryText, source: "summary" }; + } + + const firstParagraph = extractFirstParagraph(content); + if (firstParagraph) { + return { summary: firstParagraph, source: "content" }; + } + + const description = stripMarkdown(frontMatter?.description || ""); + if (description) { + return { summary: description, source: "description" }; + } + + return { summary: "", source: "missing" }; +}; + +const collectAliases = (frontMatter) => + uniqueStrings(normalizeArray(frontMatter.aliases).map((alias) => String(alias).trim())); + +const buildContentIndex = async () => { + if (!fs.existsSync(CONTENT_DIR)) { + console.error(`Content directory not found: ${CONTENT_DIR}`); + process.exit(1); + } + + const blurbRoutes = await buildBlurbRouteMap(); + const overviewExplainedConfig = loadConfigFrontMatter("overview/urbit-explained/config.md"); + const overviewRunningConfig = loadConfigFrontMatter("overview/running-urbit/config.md"); + const postPaths = await glob(path.join(CONTENT_DIR, "**/*.md")); + const entries = []; + const summarySourcesByUrl = new Map(); + const warnings = { + missing: [], + long: [], + fallback: [], + }; + + const canonicalBase = getCanonicalBaseUrl(); + const canonicalUrl = new URL(canonicalBase); + + for (const filePath of postPaths) { + const filename = path.basename(filePath); + if (EXCLUDED_FILE_NAMES.has(filename)) { + continue; + } + + let rawContent; + try { + rawContent = fs.readFileSync(filePath, "utf-8"); + } catch (error) { + console.error(`Failed to read ${filePath}:`, error); + continue; + } + + const parsed = parseFrontMatter(rawContent, filePath); + if (!parsed) { + continue; + } + + const relativePath = path + .relative(CONTENT_DIR, filePath) + .replace(/\\/g, "/"); + const routeInfo = resolveEntry(relativePath, blurbRoutes); + if (!routeInfo) { + continue; + } + + if (EXCLUDED_SECTIONS.has(routeInfo.section)) { + continue; + } + + let title = parsed.data.title || toTitleCase(path.basename(filePath, ".md")); + let description = stripMarkdown(parsed.data.description || parsed.data.extra?.description || ""); + const tags = uniqueStrings( + normalizeArray(parsed.data.tags) + .concat(normalizeArray(parsed.data.extra?.tags)) + .map((tag) => String(tag).trim()) + .filter(Boolean) + ); + const searchTerms = normalizeSearchTerms( + parsed.data.search_terms || parsed.data.searchTerms + ); + const summaryInfo = buildSummaryInfo(parsed.data, parsed.content); + + if (relativePath === "overview/urbit-explained/intro.md" && overviewExplainedConfig) { + title = overviewExplainedConfig.title || title; + description = stripMarkdown(overviewExplainedConfig.description || description); + } + + if (relativePath === "overview/running-urbit/intro.md" && overviewRunningConfig) { + title = overviewRunningConfig.title || title; + description = stripMarkdown(overviewRunningConfig.description || description); + } + + const url = new URL(routeInfo.path, canonicalUrl).toString(); + + if (summaryInfo.source === "missing") { + warnings.missing.push({ path: relativePath, url }); + } + + if (summaryInfo.source !== "summary") { + warnings.fallback.push({ path: relativePath, url, source: summaryInfo.source }); + } + + if (summaryInfo.summary && summaryInfo.summary.length > SUMMARY_RECOMMENDED_MAX) { + warnings.long.push({ path: relativePath, url, length: summaryInfo.summary.length }); + } + + summarySourcesByUrl.set(url, summaryInfo.source); + entries.push({ + id: relativePath, + url, + type: routeInfo.section, + title, + summary: summaryInfo.summary, + description, + tags, + search_terms: searchTerms, + }); + } + + const overviewUrl = new URL("/overview", canonicalUrl).toString(); + const explainedUrl = new URL("/overview/urbit-explained", canonicalUrl).toString(); + const hasOverview = entries.some((entry) => entry.url === overviewUrl); + if (!hasOverview) { + const sourceEntry = entries.find((entry) => entry.url === explainedUrl); + if (sourceEntry) { + entries.push({ + ...sourceEntry, + id: "overview/redirect", + url: overviewUrl, + title: "Overview", + }); + summarySourcesByUrl.set(overviewUrl, "summary"); + } + } + + entries.sort((a, b) => a.url.localeCompare(b.url, undefined, { sensitivity: "base" })); + + return { entries, warnings, summarySourcesByUrl }; +}; + +const summarizeWarnings = (warnings) => { + const listWarnings = (label, items) => { + if (!items.length) return; + console.warn(`\n${label} (${items.length}):`); + items.slice(0, 25).forEach((entry) => { + const suffix = entry.length ? ` (${entry.length} chars)` : ""; + const source = entry.source ? ` [${entry.source}]` : ""; + console.warn(`- ${entry.path}${suffix}${source}`); + }); + if (items.length > 25) { + console.warn(`- ...and ${items.length - 25} more`); + } + }; + + listWarnings("Missing summary", warnings.missing); + listWarnings("Summary exceeds recommended length", warnings.long); + listWarnings("Summary fallback used", warnings.fallback); +}; + +const buildLlmsText = (entries) => { + const indexByUrl = new Map(entries.map((entry) => [entry.url, entry])); + const lines = []; + lines.push(`# ${llmsConfig.title}`); + lines.push(`> ${llmsConfig.description}`); + lines.push(""); + + llmsConfig.sections.forEach((section) => { + lines.push(`## ${section.title}`); + section.entries.forEach((entry) => { + const indexed = indexByUrl.get(entry.url); + const title = indexed?.title || entry.title || entry.url; + const summaryText = indexed?.summary || entry.summary || ""; + const summaryPart = summaryText ? ` — ${summaryText}` : ""; + lines.push(`- [${title}](${entry.url})${summaryPart}`); + }); + lines.push(""); + }); + + return lines.join("\n").trim() + "\n"; +}; + +const assertRequiredSummaries = (entries, summarySourcesByUrl) => { + const requiredUrls = []; + llmsConfig.sections.forEach((section) => { + section.entries.forEach((entry) => { + if (entry.required) { + requiredUrls.push(entry.url); + } + }); + }); + + if (!requiredUrls.length) { + return []; + } + + const indexByUrl = new Map(entries.map((entry) => [entry.url, entry])); + const failures = []; + + requiredUrls.forEach((url) => { + const entry = indexByUrl.get(url); + const source = summarySourcesByUrl?.get(url) || "missing"; + if (!entry || source !== "summary") { + failures.push({ url, source }); + } + }); + + return failures; +}; + +async function buildAiLegibility() { + console.log("Building AI legibility artifacts...\n"); + + const outputDir = path.dirname(OUTPUT_INDEX); + if (!fs.existsSync(outputDir)) { + fs.mkdirSync(outputDir, { recursive: true }); + } + + const { entries, warnings, summarySourcesByUrl } = await buildContentIndex(); + const indexOutput = { + generatedAt: new Date().toISOString(), + total: entries.length, + entries, + }; + + fs.writeFileSync(OUTPUT_INDEX, JSON.stringify(indexOutput, null, 2), "utf-8"); + fs.writeFileSync(OUTPUT_LLMS, buildLlmsText(entries), "utf-8"); + + console.log(`✓ Content index written to ${OUTPUT_INDEX}`); + console.log(`✓ llms.txt written to ${OUTPUT_LLMS}`); + console.log(`✓ Indexed ${entries.length} content entries`); + + summarizeWarnings(warnings); + + const requiredFailures = assertRequiredSummaries(entries, summarySourcesByUrl); + if (requiredFailures.length) { + console.error("\nRequired pages missing summary:"); + requiredFailures.forEach((failure) => { + console.error(`- ${failure.url} [${failure.source}]`); + }); + process.exitCode = 1; + } + + const enforcedOverages = warnings.long.filter((entry) => + SUMMARY_ENFORCED_DIRS.some((dir) => entry.path.startsWith(dir)) + ); + if (enforcedOverages.length) { + console.error("\nSummary length exceeds enforced limit in:"); + enforcedOverages.forEach((entry) => { + console.error(`- ${entry.path} (${entry.length} chars)`); + }); + process.exitCode = 1; + } +} + +buildAiLegibility().catch((error) => { + console.error("AI legibility build failed:", error); + process.exit(1); +}); diff --git a/scripts/build-search-index.js b/scripts/build-search-index.js index 10e5748193..6547f2e599 100644 --- a/scripts/build-search-index.js +++ b/scripts/build-search-index.js @@ -218,6 +218,15 @@ const addBlurbRoute = (map, slug, targetPath, { overwrite = false } = {}) => { const buildBlurbRouteMap = async () => { const map = new Map(); + const manualMappings = { + "troubleshooting-your-urbit": "/overview/running-urbit/support", + "common-pitfalls-of-running-urbit": "/overview/running-urbit/support", + "groundwire-based-urbit-ids": "/overview/running-urbit/get-urbit-id", + }; + + Object.entries(manualMappings).forEach(([slug, target]) => { + addBlurbRoute(map, slug, target, { overwrite: true }); + }); const homepageConfigPath = path.join(CONTENT_DIR, "homepage/config.md"); if (fs.existsSync(homepageConfigPath)) {