From 76252a429341403ee88510f26a7f4c7300a7ec9b Mon Sep 17 00:00:00 2001 From: Erik Thorelli Date: Wed, 7 Oct 2026 14:19:18 -0700 Subject: [PATCH 1/2] Write the name as one word, allthings, on the site, in core's templates and drafts, the CLI and the agent plugin --- .agents/plugins/marketplace.json | 2 +- Makefile | 2 +- README.md | 2 +- brand/all-things.tokens.json | 2 +- cli/README.md | 2 +- cli/package.json | 2 +- cli/src/schemas.ts | 2 +- cli/tests/client.test.ts | 2 +- cli/tests/fixtures.ts | 5 +- core/README.md | 10 +-- core/scripts/luma.ts | 2 +- core/scripts/plan.ts | 2 +- core/src/about.ts | 4 +- core/src/completeness.ts | 2 +- core/src/contract.ts | 2 +- core/src/event-page.ts | 2 +- core/src/home.ts | 2 +- core/src/lockup.ts | 9 +-- core/src/luma/feed.ts | 2 +- core/src/luma/luma.ts | 2 +- core/src/luma/people.ts | 2 +- core/src/luma/sync.ts | 2 +- core/src/people-directory.ts | 2 +- core/src/planning/format.ts | 2 +- core/src/posts/candidates.ts | 10 +-- core/src/promo/drafts.ts | 6 +- core/src/promo/format.ts | 2 +- core/src/promo/launch.ts | 42 ++++++------ core/src/short-slugs.ts | 4 +- .../fixtures/promo/2025-12-02-cafe-night.txt | 60 ++++++++-------- .../promo/2026-08-12-react-at-acme.txt | 60 ++++++++-------- .../fixtures/promo/2026-10-03-hack-day.txt | 60 ++++++++-------- .../fixtures/promo/2026-11-05-upcoming.txt | 60 ++++++++-------- .../fixtures/promo/launch-placeholders.txt | 52 +++++++------- core/tests/fixtures/promo/launch-settled.txt | 68 +++++++++---------- core/tests/home.test.ts | 2 +- core/tests/lockup.test.ts | 5 ++ core/tests/planning.test.ts | 2 +- core/tests/post-candidates.test.ts | 12 ++-- core/tests/promo-launch.test.ts | 10 +-- core/tests/promo.test.ts | 8 +-- core/tests/social-bluesky.test.ts | 2 +- core/tests/social-x.test.ts | 2 +- infra/src/web.ts | 2 +- pages/index.html | 4 +- pages/install.bash | 2 +- plugins/allthings/plugin.json | 8 +-- .../skills/evening-briefing/SKILL.md | 2 +- .../allthings/skills/find-evenings/SKILL.md | 4 +- web/scripts/build.ts | 4 +- web/src/links.ts | 4 +- web/src/mcp/community.ts | 4 +- web/src/mcp/tools.ts | 12 ++-- web/src/pages/about.tsx | 6 +- web/src/pages/brand.tsx | 12 ++-- web/src/pages/calendar.ts | 2 +- web/src/pages/code-of-conduct.tsx | 4 +- web/src/pages/document.tsx | 10 +-- web/src/pages/event.tsx | 12 ++-- web/src/pages/events.tsx | 2 +- web/src/pages/home.tsx | 12 ++-- web/src/pages/metadata.tsx | 16 ++--- web/src/pages/people.tsx | 2 +- web/src/pages/person.tsx | 8 +-- web/src/pages/routes.ts | 2 +- web/src/pages/structured-data.ts | 2 +- web/src/preview/app.ts | 2 +- web/src/styles/site.css | 2 +- web/src/sync/worker.ts | 2 +- web/src/worker.ts | 2 +- web/tests/about-page.test.ts | 4 +- web/tests/event-page.test.ts | 16 +++-- web/tests/event.test.ts | 8 +-- web/tests/home-page.test.ts | 6 +- web/tests/home.test.ts | 4 +- web/tests/pages.test.ts | 5 +- web/tests/parity.test.ts | 2 +- web/tests/people-page.test.ts | 8 +-- web/tests/people.test.ts | 2 +- web/tests/seo-documents.test.tsx | 22 +++--- web/tests/worker.test.ts | 26 ++++--- 81 files changed, 402 insertions(+), 380 deletions(-) diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json index 1da6b2da..d07b89c1 100644 --- a/.agents/plugins/marketplace.json +++ b/.agents/plugins/marketplace.json @@ -1,7 +1,7 @@ { "name": "allthings", "interface": { - "displayName": "all things" + "displayName": "allthings" }, "plugins": [ { diff --git a/Makefile b/Makefile index 6f6c944d..670d8084 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ CLI_DIR := $(CURRENT_DIR)/cli .PHONY: list list: @echo "${YELLOW}***${RED}***${RESTORE}***${YELLOW}***${RED}***${RESTORE}***${YELLOW}***${RED}***${RESTORE}***${YELLOW}***${RED}***${RESTORE}" - @echo "${RED}All Things Web: ${YELLOW}Available targets${RESTORE}:" + @echo "${RED}allthings: ${YELLOW}Available targets${RESTORE}:" @grep -E '^[a-zA-Z-]+:.*?## .*$$' Makefile | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " ${YELLOW}%-15s${RESTORE} > %s\n", $$1, $$2}' @echo "${RED}=================================${RESTORE}" diff --git a/README.md b/README.md index adf907aa..73f2283e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# All Things Web dot Dev +# allthings --- diff --git a/brand/all-things.tokens.json b/brand/all-things.tokens.json index b9b3a785..505cdc5b 100644 --- a/brand/all-things.tokens.json +++ b/brand/all-things.tokens.json @@ -725,7 +725,7 @@ "$extensions": { "dev.allthings": { "fluid": { - "container": 19.5 + "container": 20.3 } } } diff --git a/cli/README.md b/cli/README.md index 6bec4c43..44521fc2 100644 --- a/cli/README.md +++ b/cli/README.md @@ -1,6 +1,6 @@ # allthings -all things from your terminal: what's coming up, who's on stage and how to get in. It reads the same public MCP server agents use, so what you see here is what they see. +allthings from your terminal: what's coming up, who's on stage and how to get in. It reads the same public MCP server agents use, so what you see here is what they see. ```sh curl -fsSL https://allthingsweb-dev.github.io/allthingsweb/install.bash | bash diff --git a/cli/package.json b/cli/package.json index 235e5636..53bfca3f 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,7 +1,7 @@ { "name": "allthings", "version": "2.0.0-alpha.3", - "description": "all things from your terminal and your agents: the evenings, who is on stage and how to get in.", + "description": "allthings from your terminal and your agents: the evenings, who is on stage and how to get in.", "type": "module", "private": true, "bin": { diff --git a/cli/src/schemas.ts b/cli/src/schemas.ts index 2003721d..1577f53f 100644 --- a/cli/src/schemas.ts +++ b/cli/src/schemas.ts @@ -1,7 +1,7 @@ import { z } from "zod"; /** - * The public all things contract, as served by https://allthings.dev/mcp. + * The public allthings contract, as served by https://allthings.dev/mcp. * Mirrors app/src/lib/public-api/schemas.ts; a contract test keeps them equal. */ diff --git a/cli/tests/client.test.ts b/cli/tests/client.test.ts index e1145a0a..e4b7eb3c 100644 --- a/cli/tests/client.test.ts +++ b/cli/tests/client.test.ts @@ -87,7 +87,7 @@ describe("MCP client", () => { content: [ { type: "text", - text: "all things events are temporarily unavailable.", + text: "allthings events are temporarily unavailable.", }, ], }, diff --git a/cli/tests/fixtures.ts b/cli/tests/fixtures.ts index fb5ee9e9..a549153d 100644 --- a/cli/tests/fixtures.ts +++ b/cli/tests/fixtures.ts @@ -61,8 +61,9 @@ export const speaker: Speaker = { }; export const community: Community = { - name: "All Things Web", - oneLiner: "A hacker club for everyone building the web.", + name: "allthings", + oneLiner: + "Evenings for people who build software. In the neighborhoods of San Francisco.", introduction: "Intro.", mission: "Mission.", history: "History.", diff --git a/core/README.md b/core/README.md index 0eb072b6..c02f9cd7 100644 --- a/core/README.md +++ b/core/README.md @@ -120,7 +120,7 @@ Each phase starts nothing new after its budget, and `pending` is the dry run: it ## Who took part -`event_people` holds a person's part in an event as a whole: an all things +`event_people` holds a person's part in an event as a whole: an allthings organizer, a co-host or the MC. Who was on stage, and in what capacity, is on the talks: `talks.format` (a talk, a panel or a fireside chat) and each speaker's `talk_speakers.role` (speaking or moderating), so a panelist is a @@ -364,7 +364,7 @@ DATABASE_URL=… bun run programs # write ## Short links -The lockup is the link (brand/foundations.md, "Name"): all things/effect +The lockup is the link (brand/foundations.md, "Name"): allthings/effect lives at allthings.dev/effect. `src/short-slugs.ts` is the rule, taking evenings in the order they start: @@ -374,7 +374,7 @@ evenings in the order they start: 2. It takes the first of these that no other evening holds and no page is at: the base, then the base with its month in San Francisco (`web-2024-11`), then the day (`web-2024-11-12`), then a count. -3. A shared evening is someone else's, never all things/anything, so its +3. A shared evening is someone else's, never allthings/anything, so its link is under `shared/` (`shared/typescript-ai-demo-day`). The bare root is the lockup's alone, and a shared name can't take a topic ours might want. @@ -419,7 +419,7 @@ discriminated type: `{ kind: "ours" }` or `{ kind: "shared", organizer }`. What follows from it: -- A shared evening is named as written, never all things/ +- A shared evening is named as written, never allthings/ (`eventTopic`), on its page, in lists, in feeds and on its card. - /events and home list it in the same rows, marked "shared · by Mastra". Home's hero is always our next evening, and its photos are of ours. @@ -508,7 +508,7 @@ keyless) and, once the X app has a token, X's search, for posts that link the evening's Luma page or its page on the site, name it, or come from or mention the people on its stage, from two weeks before it to a week after. Each post is scored the same way every time (`scoreCandidate`: a link to -the evening, its name, "all things" with its topic, a host, its people, +the evening, its name, "allthings" with its topic, a host, its people, the night itself), and the ones that score at least 5 are added as `pending`. Nothing is approved here: an organizer approves or hides each. diff --git a/core/scripts/luma.ts b/core/scripts/luma.ts index a420747c..28a28124 100644 --- a/core/scripts/luma.ts +++ b/core/scripts/luma.ts @@ -21,7 +21,7 @@ import { Readiness } from "../src/readiness/readiness.ts"; * An evening's Luma event, from private draft to public (src/luma/publish.ts), * with the calendar's key in LUMA_API_KEY and the database at DATABASE_URL: * - * bun run luma create --name "All Things Effect" --start 2026-11-18T18:00:00-08:00 \ + * bun run luma create --name "allthings/effect" --start 2026-11-18T18:00:00-08:00 \ * --end 2026-11-18T21:00:00-08:00 --venue "CodeRabbit, 201 Spear St" [--idea ] [--dry-run] * bun run luma update --event --description-from-drafts [--cover cover.png] [--dry-run] * bun run luma update --luma evt-… --name "…" before the sync has stored it diff --git a/core/scripts/plan.ts b/core/scripts/plan.ts index 294d5cae..367fb314 100644 --- a/core/scripts/plan.ts +++ b/core/scripts/plan.ts @@ -192,7 +192,7 @@ const ideaAdd = Command.make( program: Flag.Literals("program", EventProgram.literals).pipe( Flag.withDescription("What kind of evening it is."), ), - topic: text("topic", "all things/, as event topics are written."), + topic: text("topic", "allthings/, as event topics are written."), status: literal("status", IdeaStatus.literals, "Where it stands"), event: text("event", "The draft evening it became, by slug."), inspiredBy: text("inspired-by", "A past evening it builds on, by slug."), diff --git a/core/src/about.ts b/core/src/about.ts index 024a69b1..1eaea2df 100644 --- a/core/src/about.ts +++ b/core/src/about.ts @@ -18,7 +18,7 @@ import * as Rows from "./rows.ts"; import { listingJson } from "./sql.ts"; /** - * What the about page says about all things, read as of the `Clock` in one + * What the about page says about allthings, read as of the `Clock` in one * statement: how many evenings it has held and who came, where each of the * names it went by first appeared, and its organizers as their profiles * have them. Every number is counted from the data, at our published @@ -26,7 +26,7 @@ import { listingJson } from "./sql.ts"; */ /** - * The names the evenings went by before they were all things, oldest + * The names the evenings went by before they were allthings, oldest * first: brand/foundations.md keeps "All Things Web" as history, and the * meetups before it are where it began. An evening went by one when its * name starts with it, as Luma has it. diff --git a/core/src/completeness.ts b/core/src/completeness.ts index 013ff71c..daf76f1c 100644 --- a/core/src/completeness.ts +++ b/core/src/completeness.ts @@ -235,7 +235,7 @@ export function eventCompleteness( const address = event.fullAddress ?? event.streetAddress; if (address === null || isBlank(address)) gaps.push(gap("venue")); - // A shared evening is named as written, never all things/. + // A shared evening is named as written, never allthings/. if (event.curation.kind === "ours" && eventTopic(event) === undefined) { gaps.push(gap("topic")); } diff --git a/core/src/contract.ts b/core/src/contract.ts index 5d07dc05..f8f94c6c 100644 --- a/core/src/contract.ts +++ b/core/src/contract.ts @@ -1,7 +1,7 @@ import { Schema } from "effect"; /** - * The public all things contract: the shapes served by the MCP server and the + * The public allthings contract: the shapes served by the MCP server and the * public API, and consumed by the CLI. These Effect schemas will replace the * zod ones in app/src/lib/public-api/schemas.ts; until then a contract test * holds them to the same shapes, the same validation and today's live data. diff --git a/core/src/event-page.ts b/core/src/event-page.ts index 62ea95e2..62e376dd 100644 --- a/core/src/event-page.ts +++ b/core/src/event-page.ts @@ -144,7 +144,7 @@ export interface EventPage { readonly slug: string; /** The name as written, without emoji. */ readonly name: string; - /** all things/: the one the site set, else the name's, if any. */ + /** allthings/: the one the site set, else the name's, if any. */ readonly topic: string | undefined; /** * The evening in one line: the organizers' tagline, or the summary of diff --git a/core/src/home.ts b/core/src/home.ts index b455af0e..210b7c36 100644 --- a/core/src/home.ts +++ b/core/src/home.ts @@ -38,7 +38,7 @@ export interface Evening { readonly slug: string; /** The name as written, without emoji. */ readonly name: string; - /** all things/: the one the site set, else the name's, if any (see lockup.ts). */ + /** allthings/: the one the site set, else the name's, if any (see lockup.ts). */ readonly topic: string | undefined; /** At the `Clock`'s now. */ readonly status: Contract.EventStatus; diff --git a/core/src/lockup.ts b/core/src/lockup.ts index b82c73ff..d5be0c96 100644 --- a/core/src/lockup.ts +++ b/core/src/lockup.ts @@ -1,11 +1,12 @@ /** - * Each event is all things/, and lists write it at/ + * Each event is allthings/, and lists write it at/ * (brand/foundations.md, "Name"). An organizer may set the topic on the site * (`events.topic`); otherwise it is derived from the name, which people write * on Luma, not the brand, by one fixed rule: * * 1. Emoji and other pictographs go, then a trailing "!", "?" or ".". - * 2. A leading "All Things " goes: "All Things Agent Setups" → "Agent Setups". + * 2. A leading name goes, the old way or the new: "All Things Agent Setups" + * → "Agent Setups", "allthings/effect" → "effect". * 3. A trailing venue goes, since the place is said beside the name: * "React Bay Area at Mux" → "React Bay Area", "… @ Vercel HQ" likewise. * 4. A trailing city goes: "Effect San Francisco" → "Effect". @@ -74,7 +75,7 @@ export function displayName(name: string): string { export function topicOf(name: string): string | undefined { const topic = displayName(name) .replace(/[!?.]+$/, "") - .replace(/^all things\s+/i, "") + .replace(/^all\s*things(?:\s*\/\s*|\s+|$)/i, "") .replace(/\s+(?:at|@)\s+.+$/i, "") .replace(/\s+(?:in\s+)?(?:san francisco|sf)$/i, "") .trim() @@ -85,7 +86,7 @@ export function topicOf(name: string): string | undefined { /** * The event's topic: the one the site set (`events.topic`, which the Luma * sync never writes), else the one its name yields. A shared event has - * none: it is someone else's evening, never all things/anything, so it is + * none: it is someone else's evening, never allthings/anything, so it is * named as written. */ export function eventTopic(event: { diff --git a/core/src/luma/feed.ts b/core/src/luma/feed.ts index ce3930e7..bb618073 100644 --- a/core/src/luma/feed.ts +++ b/core/src/luma/feed.ts @@ -12,7 +12,7 @@ import { DateTime, Effect, Option, Schema } from "effect"; * app would reject fails here with a {@link LumaFeedError}. */ -/** The All Things Web calendar; `LUMA_CALENDAR_API_ID` names another. */ +/** The allthings calendar; `LUMA_CALENDAR_API_ID` names another. */ export const allThingsWebCalendarId = "cal-3AAimKnRVQEId4r"; /** Dates, and times without a zone of their own, are read in this zone. */ diff --git a/core/src/luma/luma.ts b/core/src/luma/luma.ts index 786f1364..456991bc 100644 --- a/core/src/luma/luma.ts +++ b/core/src/luma/luma.ts @@ -34,7 +34,7 @@ export const CalendarId = Schema.String.check( Schema.isPattern(/^cal-[A-Za-z0-9]+$/), ); -/** The calendar to read: LUMA_CALENDAR_API_ID, or All Things Web's. */ +/** The calendar to read: LUMA_CALENDAR_API_ID, or allthings' own. */ export const calendarIdConfig: Config.Config = Config.schema( CalendarId, "LUMA_CALENDAR_API_ID", diff --git a/core/src/luma/people.ts b/core/src/luma/people.ts index f1ab7f9b..408b537b 100644 --- a/core/src/luma/people.ts +++ b/core/src/luma/people.ts @@ -23,7 +23,7 @@ import type { LumaEventPeople, LumaHost } from "./api.ts"; * Elizabeth, no accent), so a profile made from every unknown host would be * wrong or a duplicate as often as not. * - * A host whose profile is an all things organizer's is the event's + * A host whose profile is an allthings organizer's is the event's * organizer; everyone else is a co-host. Positions follow Luma's order. */ diff --git a/core/src/luma/sync.ts b/core/src/luma/sync.ts index dea63349..2b2b146b 100644 --- a/core/src/luma/sync.ts +++ b/core/src/luma/sync.ts @@ -27,7 +27,7 @@ import { venueArchive } from "./venue-archive.ts"; * - The site, once the event exists: slug, tagline, attendee limit, and every * other column and related row (talks, hosts, photos, recording, flags). * The sync writes slug, tagline and attendee limit for new events only. - * - The site alone: the topic (all things/, src/lockup.ts) and the + * - The site alone: the topic (allthings/, src/lockup.ts) and the * description. The sync never writes them, for new events either: they * start without them. * - Luma's API, not the feed: Luma's description and its summary, which diff --git a/core/src/people-directory.ts b/core/src/people-directory.ts index c997ada7..201872e7 100644 --- a/core/src/people-directory.ts +++ b/core/src/people-directory.ts @@ -42,7 +42,7 @@ export interface PartEvening { readonly curation: "ours" | "shared"; /** The name as written, without emoji. */ readonly name: string; - /** all things/, by the lockup's rule (see lockup.ts), if any. */ + /** allthings/, by the lockup's rule (see lockup.ts), if any. */ readonly topic: string | undefined; /** At the `Clock`'s now: an evening still ahead carries the cursor. */ readonly status: Contract.EventStatus; diff --git a/core/src/planning/format.ts b/core/src/planning/format.ts index b94ed271..efe75055 100644 --- a/core/src/planning/format.ts +++ b/core/src/planning/format.ts @@ -56,7 +56,7 @@ export function formatWindow(window: Window): string { export function formatIdea(idea: Idea): string { return [ `${idea.title} [${idea.status}] ${idea.id}`, - ` ${idea.program}${idea.topic === null ? "" : ` · all things/${idea.topic}`}`, + ` ${idea.program}${idea.topic === null ? "" : ` · allthings/${idea.topic}`}`, ` ${idea.pitch}`, ...(idea.event === null ? [] : [` event: ${event(idea.event)}`]), ...(idea.inspiredBy === null diff --git a/core/src/posts/candidates.ts b/core/src/posts/candidates.ts index 1887e7b6..cac1eb3c 100644 --- a/core/src/posts/candidates.ts +++ b/core/src/posts/candidates.ts @@ -144,8 +144,8 @@ export function scoreCandidate( const named = name.split(/\s+/).length >= 2 && hasPhrase(words, name); if (named) score += add(4, `names "${name}"`); // The name, as people write it: "All Things Web", "allthings", - // "#allthingsweb", "all things/effect". "All things " alone is - // common English ("all things AI"), so it earns less. + // "#allthingsweb", "allthings/effect", "all things/effect". "All things + // " alone is common English ("all things AI"), so it earns less. const topicLockup = signals.topic === null ? null @@ -156,7 +156,7 @@ export function scoreCandidate( if ( /all\s*things\s*web|allthings|#allthingsweb|all\s*things\s*\//i.test(words) ) { - score += add(3, "says all things"); + score += add(3, "says allthings"); } else if (topicLockup?.test(words) === true) { score += add(2, `says "all things ${signals.topic ?? ""}"`); } else if (signals.topic !== null && hasPhrase(words, signals.topic)) { @@ -412,6 +412,7 @@ export const makeBlueskySearch = Effect.gen(function* () { // one); posts outside it are dropped after. .map((url) => ({ q: "*", url, sort: "latest" })), { q: `"${displayName(signals.name)}"`, ...window }, + { q: `allthings ${topicWords}`, ...window }, { q: `"all things" ${topicWords}`, ...window }, ...signals.blueskyHandles.flatMap((handle) => [ { q: topicWords, author: handle, ...window }, @@ -511,7 +512,7 @@ export function fromXSearch( }); } -/** X's query for `signals`: the evening's links and name, or its people saying all things. */ +/** X's query for `signals`: the evening's links and name, or its people saying allthings. */ export function xQueries(signals: EventSignals): ReadonlyArray { const quoted = (s: string) => `"${s.replace(/"/g, "")}"`; const about = [ @@ -520,6 +521,7 @@ export function xQueries(signals: EventSignals): ReadonlyArray { ].join(" OR "); const people = signals.xFrom.map((who) => `from:${who}`).join(" OR "); const words = [ + quoted("allthings"), quoted("all things"), ...(signals.topic === null ? [] : [quoted(signals.topic)]), ].join(" OR "); diff --git a/core/src/promo/drafts.ts b/core/src/promo/drafts.ts index f7d0588a..9fac770e 100644 --- a/core/src/promo/drafts.ts +++ b/core/src/promo/drafts.ts @@ -128,9 +128,9 @@ export function clockOf(instant: DateTime.Utc): string { return `${twelve}:${String(minute).padStart(2, "0")} ${hour < 12 ? "AM" : "PM"}`; } -/** "all things/effect", or the name as written when it has no topic. */ +/** "allthings/effect", or the name as written when it has no topic. */ export const titleOf = (event: EventPage): string => - event.topic === undefined ? event.name : `all things/${event.topic}`; + event.topic === undefined ? event.name : `allthings/${event.topic}`; /** A stored X handle as X spells it, or null when it isn't one. */ export function xHandle(stored: string | null): string | null { @@ -672,7 +672,7 @@ function descriptionBody( rules.length === 0 ? null : rules.map((rule) => `- ${md(rule.text)}`).join("\n"), - `**[all things](${lumaCalendar})**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](${discordInvite})**.`, + `**[allthings](${lumaCalendar})**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](${discordInvite})**.`, ); } diff --git a/core/src/promo/format.ts b/core/src/promo/format.ts index c1e90e41..b6999e4d 100644 --- a/core/src/promo/format.ts +++ b/core/src/promo/format.ts @@ -169,7 +169,7 @@ export function formatLaunch( : [`## ${title}\n\n${items.map((item) => `${mark}${item}`).join("\n")}`]; return ( [ - "# launch: all things", + "# launch: allthings", ...list("gaps", drafts.gaps, "- "), ...list("before posting", drafts.checklist, "- [ ] "), ...sections, diff --git a/core/src/promo/launch.ts b/core/src/promo/launch.ts index deef8f22..b08ea6d1 100644 --- a/core/src/promo/launch.ts +++ b/core/src/promo/launch.ts @@ -16,7 +16,7 @@ import { fitOn } from "./limits.ts"; /** * The rebrand's launch kit: one set of drafts announcing that All Things - * Web is now all things, for X (a thread), Bluesky, the LinkedIn company + * Web is now allthings, for X (a thread), Bluesky, the LinkedIn company * page, the Discord, the Luma calendar's newsletter, each Meetup group the * evenings are listed in, and a short note for /about's history. Drafts * only: nothing here posts anything. @@ -51,7 +51,7 @@ export const formerName = "All Things Web"; /** The domain the site had, which redirects to the new one. */ export const formerDomain = "allthingsweb.dev"; -/** A Meetup group the evenings are listed in, which continues under all things. */ +/** A Meetup group the evenings are listed in, which continues under allthings. */ export interface MeetupGroup { readonly name: string; readonly url: string; @@ -71,7 +71,7 @@ export const meetupGroups: ReadonlyArray = [ /** The next evening, as the launch names it. */ export interface NextEvening { - /** Its lockup: "all things/trivia". */ + /** Its lockup: "allthings/trivia". */ readonly title: string; /** "Thu Nov 12, 6:00 PM", in San Francisco. */ readonly when: string; @@ -195,11 +195,11 @@ export function launchDrafts(config: LaunchConfig): LaunchDrafts { const discord = bare(discordInvite); const calendar = bare(lumaCalendar); const hack = bare(hackStarter.repository); - const examples = "all things/effect, all things/expo"; + const examples = "allthings/effect, allthings/expo"; const shortLink = `${site}/`; const people = `${site}/people`; - /** "Next: all things/trivia, Thu Nov 12, 6:00 PM, hosted at …." */ + /** "Next: allthings/trivia, Thu Nov 12, 6:00 PM, hosted at …." */ const nextLine = ( withWhere: boolean, text: (part: string) => string = (part) => part, @@ -225,13 +225,13 @@ export function launchDrafts(config: LaunchConfig): LaunchDrafts { `${site} serves the new site and every ${formerDomain} address redirects to it, as every draft says (infra/docs/r2-migration.md, the full cutover). Post nothing before.`, `Every published evening has its short link, as the drafts say: bun run slugs --dry-run (in core/) gives none, or run it without --dry-run first.`, `Post the X thread from @${handle}, each post a reply to the one before.`, - "Display names say all things before the posts do: X, Bluesky, the LinkedIn page, the Discord server and the Luma calendar.", + "Display names say allthings before the posts do: X, Bluesky, the LinkedIn page, the Discord server and the Luma calendar.", "Send each Meetup announcement from its own group, to all its members.", ]; const x = [ - `${formerName} is now all things.\n\nThe same evenings for people who build software, in the neighborhoods of San Francisco, under one name: all things/_. Each evening fills the slot after the slash.\n\nThe site is ${site}. ${formerDomain} redirects there.`, - `Every evening has a short link, its name as an address: all things/effect lives at ${site}/effect.\n\nA link, once given, is that evening's for good, so nothing printed, posted or put in a QR code ever comes to mean another evening.`, + `${formerName} is now allthings.\n\nThe same evenings for people who build software, in the neighborhoods of San Francisco, under one name: allthings/_. Each evening fills the slot after the slash.\n\nThe site is ${site}. ${formerDomain} redirects there.`, + `Every evening has a short link, its name as an address: allthings/effect lives at ${site}/effect.\n\nA link, once given, is that evening's for good, so nothing printed, posted or put in a QR code ever comes to mean another evening.`, `Everyone who has been on stage has a page now, at ${people}: their talks and parts at our evenings, latest first, and the talks they gave elsewhere.`, "Some evenings aren't ours. When someone else runs one we think is good, we share it: it's listed beside ours, marked shared, with who organizes it.", `Hackathons start from at/hack, a template: fork it, build, hand in a public repo. Projects are judged on whether they work before how they look: judges run each one and its tests.\n\n${hack}`, @@ -252,24 +252,24 @@ export function launchDrafts(config: LaunchConfig): LaunchDrafts { const bluesky = fitOn("bluesky", [ paragraphs( - `${formerName} is now all things: the same evenings for people who build software in San Francisco, at ${site}. ${formerDomain} redirects there.`, + `${formerName} is now allthings: the same evenings for people who build software in San Francisco, at ${site}. ${formerDomain} redirects there.`, `New: a short link for every evening (${shortLink}), a page for everyone who's been on stage, evenings we share, and at/hack for hackathons.`, `${nextLine(false)} ${next.url}`, ), paragraphs( - `${formerName} is now all things, at ${site}. ${formerDomain} redirects there.`, + `${formerName} is now allthings, at ${site}. ${formerDomain} redirects there.`, `New: a short link for every evening, a page for everyone who's been on stage, evenings we share, and at/hack.`, `${nextLine(false)} ${next.url}`, ), // However long the next evening's name, the redirect and what's new // stay; the next evening is its link alone, at the least. paragraphs( - `${formerName} is now all things, at ${site}. ${formerDomain} redirects there.`, + `${formerName} is now allthings, at ${site}. ${formerDomain} redirects there.`, "New: short links, person pages, shared evenings and at/hack.", `${nextLine(false)} ${next.url}`, ), paragraphs( - `${formerName} is now all things, at ${site}. ${formerDomain} redirects there.`, + `${formerName} is now allthings, at ${site}. ${formerDomain} redirects there.`, "New: short links, person pages, shared evenings and at/hack.", `Next: ${next.url}`, ), @@ -284,8 +284,8 @@ export function launchDrafts(config: LaunchConfig): LaunchDrafts { const linkedin = fitOn("linkedin", [ paragraphs( - `${formerName} is now all things.`, - `The evenings stay what they were: for people who build software, in the neighborhoods of San Francisco, about who's on stage and what they built. What changes is the name, all things/_, where each evening fills the slot after the slash: ${examples}.`, + `${formerName} is now allthings.`, + `The evenings stay what they were: for people who build software, in the neighborhoods of San Francisco, about who's on stage and what they built. What changes is the name, allthings/_, where each evening fills the slot after the slash: ${examples}.`, `The site is now ${site}, and ${formerDomain} redirects there. With it:`, changes.map((change) => `- ${change}`).join("\n"), `${nextLine(true)} ${next.url}`, @@ -305,8 +305,8 @@ export function launchDrafts(config: LaunchConfig): LaunchDrafts { const discordPost = fitOn("discord", [ paragraphs( - `**${formerName} is now all things.**`, - `Same evenings, same server. The name is all things/\\_, and each evening fills the slot after the slash: ${examples}.`, + `**${formerName} is now allthings.**`, + `Same evenings, same server. The name is allthings/\\_, and each evening fills the slot after the slash: ${examples}.`, `**What changed**\n- The site is **${site}**; ${formerDomain} redirects there.\n${mdChanges.map((change) => `- ${change}`).join("\n")}`, `**${mdNext(true)}** <${next.url}>`, `On X: **@${md(handle)}**`, @@ -314,10 +314,10 @@ export function launchDrafts(config: LaunchConfig): LaunchDrafts { ]); const luma: Announcement = { - subject: "These evenings are now all things", + subject: "These evenings are now allthings", body: fitOn("luma", [ paragraphs( - `${formerName} is now all things: the same evenings for people who build software, in the neighborhoods of San Francisco, under one name, all things/\\_. Each evening fills the slot after the slash: ${examples}.`, + `${formerName} is now allthings: the same evenings for people who build software, in the neighborhoods of San Francisco, under one name, allthings/\\_. Each evening fills the slot after the slash: ${examples}.`, "Nothing changes here: you keep following this calendar, and every evening's seats are still taken here.", `**What changed**\n\n- The site is **[${site}](${config.origin})**, and ${formerDomain} redirects there.\n${mdChanges.map((change) => `- ${change}`).join("\n")}`, `**${mdNext(true)}** [${md(bare(next.url))}](${next.url})`, @@ -329,11 +329,11 @@ export function launchDrafts(config: LaunchConfig): LaunchDrafts { const meetup = meetupGroups.map( (group): MeetupAnnouncement => ({ group, - subject: `${group.name}'s evenings are now all things`, + subject: `${group.name}'s evenings are now allthings`, body: fitOn("meetup", [ paragraphs( - `The evenings ${group.name} lists went by ${formerName}. They're now all things: one name, all things/_, and each evening fills the slot after the slash.`, - `Nothing changes for you here. This group continues under all things, you stay a member, and each evening is still listed here. Seats are on Luma (${calendar}); the list on Meetup is a waitlist.`, + `The evenings ${group.name} lists went by ${formerName}. They're now allthings: one name, allthings/_, and each evening fills the slot after the slash.`, + `Nothing changes for you here. This group continues under allthings, you stay a member, and each evening is still listed here. Seats are on Luma (${calendar}); the list on Meetup is a waitlist.`, `What's new on ${site} (${formerDomain} redirects there): a short link for every evening, ${shortLink}; a page for everyone who has been on stage; evenings others run that we think are good, marked shared; and at/hack, the template hackathons start from.`, `${nextLine(true)} ${next.url}`, `Talk between evenings → ${discord}`, diff --git a/core/src/short-slugs.ts b/core/src/short-slugs.ts index b462887b..692a6888 100644 --- a/core/src/short-slugs.ts +++ b/core/src/short-slugs.ts @@ -4,7 +4,7 @@ import type * as Rows from "./rows.ts"; /** * Each evening's short link: the lockup is the link (brand/foundations.md, - * "Name"), so all things/effect lives at allthings.dev/effect. + * "Name"), so allthings/effect lives at allthings.dev/effect. * * The rule, one evening at a time in the order they start: * @@ -13,7 +13,7 @@ import type * as Rows from "./rows.ts"; * 2. It takes the first of these no other evening holds: the base, then the * base and its month in San Francisco (web-2024-11), then the day * (web-2024-11-12), then a count (web-2024-11-12-2). - * 3. A shared evening is someone else's, never all things/anything, so its + * 3. A shared evening is someone else's, never allthings/anything, so its * link is under shared/ (shared/typescript-ai-demo-day): the bare root * stays the lockup's alone. * diff --git a/core/tests/fixtures/promo/2025-12-02-cafe-night.txt b/core/tests/fixtures/promo/2025-12-02-cafe-night.txt index e27217ce..fc98bed8 100644 --- a/core/tests/fixtures/promo/2025-12-02-cafe-night.txt +++ b/core/tests/fixtures/promo/2025-12-02-cafe-night.txt @@ -1,4 +1,4 @@ -# all things/café night +# allthings/café night ## gaps in the record @@ -6,7 +6,7 @@ - Linus has no Bluesky handle on record, so Bluesky posts name them untagged. - Grace Hopper has no X or Bluesky handle on record, so posts name them untagged. -## luma: description (535 / 5000) +## luma: description (534 / 5000) **On stage** @@ -36,11 +36,11 @@ Why RSC & streaming matter. Writes compilers. -**[all things](https://luma.com/allthingsweb)**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. +**[allthings](https://luma.com/allthingsweb)**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. ## meetup -title: all things/café night +title: allthings/café night venue: 500 Coffee Ave, Oakland, CA @@ -58,7 +58,7 @@ settings to set by hand: - [ ] Cross-post to Remix Bay Area (meetup.com/remix-bay-area): its Discord chat link comes prefilled, so add no second one, and turn its registration form off, which otherwise blocks publishing. - [ ] After publishing: announce it to each group, React San Francisco Bay Area and Remix Bay Area. -description (535 / 5000): +description (534 / 5000): **On stage** @@ -88,89 +88,89 @@ Why RSC & streaming matter. Writes compilers. -**[all things](https://luma.com/allthingsweb)**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. +**[allthings](https://luma.com/allthingsweb)**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. -## x: announce (83 / 280) +## x: announce (82 / 280) -all things/café night: talks by @linus, Grace Hopper and @ada. +allthings/café night: talks by @linus, Grace Hopper and @ada. Tue Dec 2, 6:00 PM. -## x: day-of (98 / 280) +## x: day-of (97 / 280) -Tonight: all things/café night. +Tonight: allthings/café night. On stage: talks by @linus, Grace Hopper and @ada. Doors 6:00 PM. -## x: recap (122 / 280) +## x: recap (121 / 280) -Thank you for coming to all things/café night. +Thank you for coming to allthings/café night. On stage: talks by @linus, Grace Hopper and @ada. https://allthings.example/2025-12-02-caf%C3%A9-night -## bluesky: announce (94 / 300) +## bluesky: announce (93 / 300) -all things/café night: talks by Linus, Grace Hopper and @ada.bsky.social. +allthings/café night: talks by Linus, Grace Hopper and @ada.bsky.social. Tue Dec 2, 6:00 PM. -## bluesky: day-of (109 / 300) +## bluesky: day-of (108 / 300) -Tonight: all things/café night. +Tonight: allthings/café night. On stage: talks by Linus, Grace Hopper and @ada.bsky.social. Doors 6:00 PM. -## bluesky: recap (162 / 300) +## bluesky: recap (161 / 300) -Thank you for coming to all things/café night. +Thank you for coming to allthings/café night. On stage: talks by Linus, Grace Hopper and @ada.bsky.social. https://allthings.example/2025-12-02-caf%C3%A9-night -## linkedin: announce (165 / 3000) +## linkedin: announce (164 / 3000) -all things/café night: talks by Linus, Grace Hopper and Ada Lovelace. +allthings/café night: talks by Linus, Grace Hopper and Ada Lovelace. - Coffee & code: Linus - Server components: Grace Hopper and Ada Lovelace Tue Dec 2, 6:00 PM. -## linkedin: day-of (105 / 3000) +## linkedin: day-of (104 / 3000) -Tonight: all things/café night. +Tonight: allthings/café night. On stage: talks by Linus, Grace Hopper and Ada Lovelace. Doors 6:00 PM. -## linkedin: recap (158 / 3000) +## linkedin: recap (157 / 3000) -Thank you for coming to all things/café night. +Thank you for coming to allthings/café night. On stage: talks by Linus, Grace Hopper and Ada Lovelace. https://allthings.example/2025-12-02-caf%C3%A9-night -## discord: announce (169 / 2000) +## discord: announce (168 / 2000) -**all things/café night**: talks by Linus, Grace Hopper and Ada Lovelace. +**allthings/café night**: talks by Linus, Grace Hopper and Ada Lovelace. - Coffee & code: Linus - Server components: Grace Hopper and Ada Lovelace Tue Dec 2, 6:00 PM. -## discord: day-of (145 / 2000) +## discord: day-of (144 / 2000) -**Tonight: all things/café night** +**Tonight: allthings/café night** If you're in: doors 6:00 PM. @@ -178,9 +178,9 @@ On stage: talks by Linus, Grace Hopper and Ada Lovelace. see you at/café night -## discord: recap (158 / 2000) +## discord: recap (157 / 2000) -Thank you for coming to all things/café night. +Thank you for coming to allthings/café night. On stage: talks by Linus, Grace Hopper and Ada Lovelace. diff --git a/core/tests/fixtures/promo/2026-08-12-react-at-acme.txt b/core/tests/fixtures/promo/2026-08-12-react-at-acme.txt index dbd4bf6d..c0fa91de 100644 --- a/core/tests/fixtures/promo/2026-08-12-react-at-acme.txt +++ b/core/tests/fixtures/promo/2026-08-12-react-at-acme.txt @@ -1,4 +1,4 @@ -# all things/react +# allthings/react ## gaps in the record @@ -8,7 +8,7 @@ - Globex has no X or Bluesky handle on record, so posts name it untagged. - Acme has no Bluesky handle on record, so Bluesky posts name it untagged. -## luma: description (882 / 5000) +## luma: description (881 / 5000) Server components in practice @@ -46,11 +46,11 @@ Co-host: **[Unattached](https://allthings.example/people#p-b0000000-0000-4000-80 MC: **[Linus](https://x.com/linus)**. -**[all things](https://luma.com/allthingsweb)**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. +**[allthings](https://luma.com/allthingsweb)**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. ## meetup -title: all things/react +title: allthings/react venue: Globex @@ -68,7 +68,7 @@ settings to set by hand: - [ ] Cross-post to Remix Bay Area (meetup.com/remix-bay-area): its Discord chat link comes prefilled, so add no second one, and turn its registration form off, which otherwise blocks publishing. - [ ] After publishing: announce it to each group, React San Francisco Bay Area and Remix Bay Area. -description (1006 / 5000): +description (1005 / 5000): **Seats are on Luma: [lu.ma/event/evt-react](https://lu.ma/event/evt-react).** The list here on Meetup is a waitlist only. @@ -108,19 +108,19 @@ Co-host: **[Unattached](https://allthings.example/people#p-b0000000-0000-4000-80 MC: **[Linus](https://x.com/linus)**. -**[all things](https://luma.com/allthingsweb)**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. +**[allthings](https://luma.com/allthingsweb)**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. -## x: announce (132 / 280) +## x: announce (131 / 280) -all things/react: talks by @linus, Grace Hopper and @ada. +allthings/react: talks by @linus, Grace Hopper and @ada. Wed Aug 12, 6:00 PM, hosted at Globex and @acme. https://lu.ma/event/evt-react -## x: day-of (146 / 280) +## x: day-of (145 / 280) -Tonight: all things/react. +Tonight: allthings/react. On stage: talks by @linus, Grace Hopper and @ada. @@ -128,9 +128,9 @@ Doors 6:00 PM, hosted at Globex and @acme. https://lu.ma/event/evt-react -## x: recap (228 / 280) +## x: recap (227 / 280) -Thank you for coming to all things/react at Globex and @acme, all 118 of you. +Thank you for coming to allthings/react at Globex and @acme, all 118 of you. On stage: talks by @linus, Grace Hopper and @ada. @@ -138,17 +138,17 @@ Thanks for posting about it, @ada. 2 photos and 2 posts from the evening: https://allthings.example/2026-08-12-react-at-acme -## bluesky: announce (148 / 300) +## bluesky: announce (147 / 300) -all things/react: talks by Linus, Grace Hopper and @ada.bsky.social. +allthings/react: talks by Linus, Grace Hopper and @ada.bsky.social. Wed Aug 12, 6:00 PM, hosted at Globex and Acme. https://lu.ma/event/evt-react -## bluesky: day-of (162 / 300) +## bluesky: day-of (161 / 300) -Tonight: all things/react. +Tonight: allthings/react. On stage: talks by Linus, Grace Hopper and @ada.bsky.social. @@ -156,9 +156,9 @@ Doors 6:00 PM, hosted at Globex and Acme. https://lu.ma/event/evt-react -## bluesky: recap (275 / 300) +## bluesky: recap (274 / 300) -Thank you for coming to all things/react at Globex and Acme, all 118 of you. +Thank you for coming to allthings/react at Globex and Acme, all 118 of you. On stage: talks by Linus, Grace Hopper and @ada.bsky.social. @@ -166,9 +166,9 @@ Thanks for posting about it, @grace.example. 2 photos and 2 posts from the evening: https://allthings.example/2026-08-12-react-at-acme -## linkedin: announce (257 / 3000) +## linkedin: announce (256 / 3000) -all things/react: talks by Linus, Grace Hopper and Ada Lovelace. +allthings/react: talks by Linus, Grace Hopper and Ada Lovelace. Server components in practice @@ -179,9 +179,9 @@ Wed Aug 12, 6:00 PM, hosted at Globex and Acme. https://lu.ma/event/evt-react -## linkedin: day-of (158 / 3000) +## linkedin: day-of (157 / 3000) -Tonight: all things/react. +Tonight: allthings/react. On stage: talks by Linus, Grace Hopper and Ada Lovelace. @@ -189,17 +189,17 @@ Doors 6:00 PM, hosted at Globex and Acme. https://lu.ma/event/evt-react -## linkedin: recap (225 / 3000) +## linkedin: recap (224 / 3000) -Thank you for coming to all things/react at Globex and Acme, all 118 of you. +Thank you for coming to allthings/react at Globex and Acme, all 118 of you. On stage: talks by Linus, Grace Hopper and Ada Lovelace. 2 photos and 2 posts from the evening: https://allthings.example/2026-08-12-react-at-acme -## discord: announce (261 / 2000) +## discord: announce (260 / 2000) -**all things/react**: talks by Linus, Grace Hopper and Ada Lovelace. +**allthings/react**: talks by Linus, Grace Hopper and Ada Lovelace. Server components in practice @@ -210,9 +210,9 @@ Wed Aug 12, 6:00 PM, hosted at Globex and Acme. https://lu.ma/event/evt-react -## discord: day-of (162 / 2000) +## discord: day-of (161 / 2000) -**Tonight: all things/react** +**Tonight: allthings/react** If you're in: doors 6:00 PM, hosted at Globex and Acme. @@ -220,9 +220,9 @@ On stage: talks by Linus, Grace Hopper and Ada Lovelace. see you at/react -## discord: recap (225 / 2000) +## discord: recap (224 / 2000) -Thank you for coming to all things/react at Globex and Acme, all 118 of you. +Thank you for coming to allthings/react at Globex and Acme, all 118 of you. On stage: talks by Linus, Grace Hopper and Ada Lovelace. diff --git a/core/tests/fixtures/promo/2026-10-03-hack-day.txt b/core/tests/fixtures/promo/2026-10-03-hack-day.txt index 8fd7e2dd..0604a31d 100644 --- a/core/tests/fixtures/promo/2026-10-03-hack-day.txt +++ b/core/tests/fixtures/promo/2026-10-03-hack-day.txt @@ -1,11 +1,11 @@ -# all things/hack day +# allthings/hack day ## gaps in the record - No Luma event is linked, so nothing says where to take a seat. - No host or venue is on record, so nothing says where. -## luma: description (314 / 5000) +## luma: description (313 / 5000) Build something @@ -17,11 +17,11 @@ Build something Writes compilers. -**[all things](https://luma.com/allthingsweb)**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. +**[allthings](https://luma.com/allthingsweb)**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. ## meetup -title: all things/hack day +title: allthings/hack day venue: (none on record) @@ -39,7 +39,7 @@ settings to set by hand: - [ ] Cross-post to Remix Bay Area (meetup.com/remix-bay-area): its Discord chat link comes prefilled, so add no second one, and turn its registration form off, which otherwise blocks publishing. - [ ] After publishing: announce it to each group, React San Francisco Bay Area and Remix Bay Area. -description (314 / 5000): +description (313 / 5000): Build something @@ -51,87 +51,87 @@ Build something Writes compilers. -**[all things](https://luma.com/allthingsweb)**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. +**[allthings](https://luma.com/allthingsweb)**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. -## x: announce (57 / 280) +## x: announce (56 / 280) -all things/hack day: a talk by @ada. +allthings/hack day: a talk by @ada. Sat Oct 3, 9:00 AM. -## x: day-of (70 / 280) +## x: day-of (69 / 280) -Today: all things/hack day. +Today: allthings/hack day. On stage: a talk by @ada. Doors 9:00 AM. -## x: recap (96 / 280) +## x: recap (95 / 280) -Thank you for coming to all things/hack day. +Thank you for coming to allthings/hack day. On stage: a talk by @ada. https://allthings.example/2026-10-03-hack-day -## bluesky: announce (69 / 300) +## bluesky: announce (68 / 300) -all things/hack day: a talk by @ada.bsky.social. +allthings/hack day: a talk by @ada.bsky.social. Sat Oct 3, 9:00 AM. -## bluesky: day-of (82 / 300) +## bluesky: day-of (81 / 300) -Today: all things/hack day. +Today: allthings/hack day. On stage: a talk by @ada.bsky.social. Doors 9:00 AM. -## bluesky: recap (130 / 300) +## bluesky: recap (129 / 300) -Thank you for coming to all things/hack day. +Thank you for coming to allthings/hack day. On stage: a talk by @ada.bsky.social. https://allthings.example/2026-10-03-hack-day -## linkedin: announce (82 / 3000) +## linkedin: announce (81 / 3000) -all things/hack day: a talk by Ada Lovelace. +allthings/hack day: a talk by Ada Lovelace. Build something Sat Oct 3, 9:00 AM. -## linkedin: day-of (78 / 3000) +## linkedin: day-of (77 / 3000) -Today: all things/hack day. +Today: allthings/hack day. On stage: a talk by Ada Lovelace. Doors 9:00 AM. -## linkedin: recap (126 / 3000) +## linkedin: recap (125 / 3000) -Thank you for coming to all things/hack day. +Thank you for coming to allthings/hack day. On stage: a talk by Ada Lovelace. https://allthings.example/2026-10-03-hack-day -## discord: announce (86 / 2000) +## discord: announce (85 / 2000) -**all things/hack day**: a talk by Ada Lovelace. +**allthings/hack day**: a talk by Ada Lovelace. Build something Sat Oct 3, 9:00 AM. -## discord: day-of (116 / 2000) +## discord: day-of (115 / 2000) -**Today: all things/hack day** +**Today: allthings/hack day** If you're in: doors 9:00 AM. @@ -139,9 +139,9 @@ On stage: a talk by Ada Lovelace. see you at/hack day -## discord: recap (126 / 2000) +## discord: recap (125 / 2000) -Thank you for coming to all things/hack day. +Thank you for coming to allthings/hack day. On stage: a talk by Ada Lovelace. diff --git a/core/tests/fixtures/promo/2026-11-05-upcoming.txt b/core/tests/fixtures/promo/2026-11-05-upcoming.txt index fa80923a..cf94fd22 100644 --- a/core/tests/fixtures/promo/2026-11-05-upcoming.txt +++ b/core/tests/fixtures/promo/2026-11-05-upcoming.txt @@ -1,11 +1,11 @@ -# all things/upcoming meetup +# allthings/upcoming meetup ## gaps in the record - No host or venue is on record, so nothing says where. - Future Speaker has no Bluesky handle on record, so Bluesky posts name them untagged. -## luma: description (403 / 5000) +## luma: description (402 / 5000) Soon @@ -23,11 +23,11 @@ Next month. Writes compilers. -**[all things](https://luma.com/allthingsweb)**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. +**[allthings](https://luma.com/allthingsweb)**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. ## meetup -title: all things/upcoming meetup +title: allthings/upcoming meetup venue: (none on record) @@ -45,7 +45,7 @@ settings to set by hand: - [ ] Cross-post to Remix Bay Area (meetup.com/remix-bay-area): its Discord chat link comes prefilled, so add no second one, and turn its registration form off, which otherwise blocks publishing. - [ ] After publishing: announce it to each group, React San Francisco Bay Area and Remix Bay Area. -description (545 / 5000): +description (544 / 5000): **Seats are on Luma: [lu.ma/event/evt%20with%20space](https://lu.ma/event/evt%20with%20space).** The list here on Meetup is a waitlist only. @@ -65,19 +65,19 @@ Next month. Writes compilers. -**[all things](https://luma.com/allthingsweb)**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. +**[allthings](https://luma.com/allthingsweb)**: evenings for people who build software, in the neighborhoods of San Francisco. Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. -## x: announce (122 / 280) +## x: announce (121 / 280) -all things/upcoming meetup: a fireside chat with @future, moderated by @ada. +allthings/upcoming meetup: a fireside chat with @future, moderated by @ada. Thu Nov 5, 6:00 PM. https://lu.ma/event/evt%20with%20space -## x: day-of (137 / 280) +## x: day-of (136 / 280) -Tonight: all things/upcoming meetup. +Tonight: allthings/upcoming meetup. On stage: a fireside chat with @future, moderated by @ada. @@ -85,25 +85,25 @@ Doors 6:00 PM. https://lu.ma/event/evt%20with%20space -## x: recap (136 / 280) +## x: recap (135 / 280) -Thank you for coming to all things/upcoming meetup. +Thank you for coming to allthings/upcoming meetup. On stage: a fireside chat with @future, moderated by @ada. https://allthings.example/2026-11-05-upcoming -## bluesky: announce (156 / 300) +## bluesky: announce (155 / 300) -all things/upcoming meetup: a fireside chat with Future Speaker, moderated by @ada.bsky.social. +allthings/upcoming meetup: a fireside chat with Future Speaker, moderated by @ada.bsky.social. Thu Nov 5, 6:00 PM. https://lu.ma/event/evt%20with%20space -## bluesky: day-of (171 / 300) +## bluesky: day-of (170 / 300) -Tonight: all things/upcoming meetup. +Tonight: allthings/upcoming meetup. On stage: a fireside chat with Future Speaker, moderated by @ada.bsky.social. @@ -111,17 +111,17 @@ Doors 6:00 PM. https://lu.ma/event/evt%20with%20space -## bluesky: recap (177 / 300) +## bluesky: recap (176 / 300) -Thank you for coming to all things/upcoming meetup. +Thank you for coming to allthings/upcoming meetup. On stage: a fireside chat with Future Speaker, moderated by @ada.bsky.social. https://allthings.example/2026-11-05-upcoming -## linkedin: announce (158 / 3000) +## linkedin: announce (157 / 3000) -all things/upcoming meetup: a fireside chat with Future Speaker, moderated by Ada Lovelace. +allthings/upcoming meetup: a fireside chat with Future Speaker, moderated by Ada Lovelace. Soon @@ -129,9 +129,9 @@ Thu Nov 5, 6:00 PM. https://lu.ma/event/evt%20with%20space -## linkedin: day-of (167 / 3000) +## linkedin: day-of (166 / 3000) -Tonight: all things/upcoming meetup. +Tonight: allthings/upcoming meetup. On stage: a fireside chat with Future Speaker, moderated by Ada Lovelace. @@ -139,17 +139,17 @@ Doors 6:00 PM. https://lu.ma/event/evt%20with%20space -## linkedin: recap (173 / 3000) +## linkedin: recap (172 / 3000) -Thank you for coming to all things/upcoming meetup. +Thank you for coming to allthings/upcoming meetup. On stage: a fireside chat with Future Speaker, moderated by Ada Lovelace. https://allthings.example/2026-11-05-upcoming -## discord: announce (162 / 2000) +## discord: announce (161 / 2000) -**all things/upcoming meetup**: a fireside chat with Future Speaker, moderated by Ada Lovelace. +**allthings/upcoming meetup**: a fireside chat with Future Speaker, moderated by Ada Lovelace. Soon @@ -157,9 +157,9 @@ Thu Nov 5, 6:00 PM. https://lu.ma/event/evt%20with%20space -## discord: day-of (172 / 2000) +## discord: day-of (171 / 2000) -**Tonight: all things/upcoming meetup** +**Tonight: allthings/upcoming meetup** If you're in: doors 6:00 PM. @@ -167,9 +167,9 @@ On stage: a fireside chat with Future Speaker, moderated by Ada Lovelace. see you at/upcoming meetup -## discord: recap (173 / 2000) +## discord: recap (172 / 2000) -Thank you for coming to all things/upcoming meetup. +Thank you for coming to allthings/upcoming meetup. On stage: a fireside chat with Future Speaker, moderated by Ada Lovelace. diff --git a/core/tests/fixtures/promo/launch-placeholders.txt b/core/tests/fixtures/promo/launch-placeholders.txt index 1741d68b..f24886c4 100644 --- a/core/tests/fixtures/promo/launch-placeholders.txt +++ b/core/tests/fixtures/promo/launch-placeholders.txt @@ -1,4 +1,4 @@ -# launch: all things +# launch: allthings ## gaps @@ -10,20 +10,20 @@ - [ ] allthings.dev serves the new site and every allthingsweb.dev address redirects to it, as every draft says (infra/docs/r2-migration.md, the full cutover). Post nothing before. - [ ] Every published evening has its short link, as the drafts say: bun run slugs --dry-run (in core/) gives none, or run it without --dry-run first. - [ ] Post the X thread from @[x-handle], each post a reply to the one before. -- [ ] Display names say all things before the posts do: X, Bluesky, the LinkedIn page, the Discord server and the Luma calendar. +- [ ] Display names say allthings before the posts do: X, Bluesky, the LinkedIn page, the Discord server and the Luma calendar. - [ ] Send each Meetup announcement from its own group, to all its members. -## x: thread 1/6 (259 / 280) +## x: thread 1/6 (257 / 280) -All Things Web is now all things. +All Things Web is now allthings. -The same evenings for people who build software, in the neighborhoods of San Francisco, under one name: all things/_. Each evening fills the slot after the slash. +The same evenings for people who build software, in the neighborhoods of San Francisco, under one name: allthings/_. Each evening fills the slot after the slash. The site is allthings.dev. allthingsweb.dev redirects there. -## x: thread 2/6 (236 / 280) +## x: thread 2/6 (235 / 280) -Every evening has a short link, its name as an address: all things/effect lives at allthings.dev/effect. +Every evening has a short link, its name as an address: allthings/effect lives at allthings.dev/effect. A link, once given, is that evening's for good, so nothing printed, posted or put in a QR code ever comes to mean another evening. @@ -49,19 +49,19 @@ https://allthings.dev/[next] Talk between evenings → discord.gg/B3Sm4b5mfD -## bluesky (261 / 300) +## bluesky (260 / 300) -All Things Web is now all things, at allthings.dev. allthingsweb.dev redirects there. +All Things Web is now allthings, at allthings.dev. allthingsweb.dev redirects there. New: a short link for every evening, a page for everyone who's been on stage, evenings we share, and at/hack. Next: [next evening], [day, time]. https://allthings.dev/[next] -## linkedin (1081 / 3000) +## linkedin (1077 / 3000) -All Things Web is now all things. +All Things Web is now allthings. -The evenings stay what they were: for people who build software, in the neighborhoods of San Francisco, about who's on stage and what they built. What changes is the name, all things/_, where each evening fills the slot after the slash: all things/effect, all things/expo. +The evenings stay what they were: for people who build software, in the neighborhoods of San Francisco, about who's on stage and what they built. What changes is the name, allthings/_, where each evening fills the slot after the slash: allthings/effect, allthings/expo. The site is now allthings.dev, and allthingsweb.dev redirects there. With it: @@ -75,11 +75,11 @@ Next: [next evening], [day, time], [hosted at …]. https://allthings.dev/[next] Talk between evenings → discord.gg/B3Sm4b5mfD On X: x.com/[x-handle] -## discord (769 / 2000) +## discord (765 / 2000) -**All Things Web is now all things.** +**All Things Web is now allthings.** -Same evenings, same server. The name is all things/\_, and each evening fills the slot after the slash: all things/effect, all things/expo. +Same evenings, same server. The name is allthings/\_, and each evening fills the slot after the slash: allthings/effect, allthings/expo. **What changed** - The site is **allthings.dev**; allthingsweb.dev redirects there. @@ -92,11 +92,11 @@ Same evenings, same server. The name is all things/\_, and each evening fills th On X: **@\[x-handle\]** -## luma: newsletter (1082 / 5000) +## luma: newsletter (1078 / 5000) -subject: These evenings are now all things +subject: These evenings are now allthings -All Things Web is now all things: the same evenings for people who build software, in the neighborhoods of San Francisco, under one name, all things/\_. Each evening fills the slot after the slash: all things/effect, all things/expo. +All Things Web is now allthings: the same evenings for people who build software, in the neighborhoods of San Francisco, under one name, allthings/\_. Each evening fills the slot after the slash: allthings/effect, allthings/expo. Nothing changes here: you keep following this calendar, and every evening's seats are still taken here. @@ -112,15 +112,15 @@ Nothing changes here: you keep following this calendar, and every evening's seat Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. On X: **[@\[x-handle\]](https://x.com/[x-handle])**. -## meetup: React San Francisco Bay Area (771 / 5000) +## meetup: React San Francisco Bay Area (768 / 5000) group: https://www.meetup.com/reactjs-san-francisco/ -subject: React San Francisco Bay Area's evenings are now all things +subject: React San Francisco Bay Area's evenings are now allthings -The evenings React San Francisco Bay Area lists went by All Things Web. They're now all things: one name, all things/_, and each evening fills the slot after the slash. +The evenings React San Francisco Bay Area lists went by All Things Web. They're now allthings: one name, allthings/_, and each evening fills the slot after the slash. -Nothing changes for you here. This group continues under all things, you stay a member, and each evening is still listed here. Seats are on Luma (luma.com/allthingsweb); the list on Meetup is a waitlist. +Nothing changes for you here. This group continues under allthings, you stay a member, and each evening is still listed here. Seats are on Luma (luma.com/allthingsweb); the list on Meetup is a waitlist. What's new on allthings.dev (allthingsweb.dev redirects there): a short link for every evening, allthings.dev/; a page for everyone who has been on stage; evenings others run that we think are good, marked shared; and at/hack, the template hackathons start from. @@ -128,15 +128,15 @@ Next: [next evening], [day, time], [hosted at …]. https://allthings.dev/[next] Talk between evenings → discord.gg/B3Sm4b5mfD -## meetup: Remix Bay Area (757 / 5000) +## meetup: Remix Bay Area (754 / 5000) group: https://www.meetup.com/remix-bay-area/ -subject: Remix Bay Area's evenings are now all things +subject: Remix Bay Area's evenings are now allthings -The evenings Remix Bay Area lists went by All Things Web. They're now all things: one name, all things/_, and each evening fills the slot after the slash. +The evenings Remix Bay Area lists went by All Things Web. They're now allthings: one name, allthings/_, and each evening fills the slot after the slash. -Nothing changes for you here. This group continues under all things, you stay a member, and each evening is still listed here. Seats are on Luma (luma.com/allthingsweb); the list on Meetup is a waitlist. +Nothing changes for you here. This group continues under allthings, you stay a member, and each evening is still listed here. Seats are on Luma (luma.com/allthingsweb); the list on Meetup is a waitlist. What's new on allthings.dev (allthingsweb.dev redirects there): a short link for every evening, allthings.dev/; a page for everyone who has been on stage; evenings others run that we think are good, marked shared; and at/hack, the template hackathons start from. diff --git a/core/tests/fixtures/promo/launch-settled.txt b/core/tests/fixtures/promo/launch-settled.txt index 044c858e..25f219aa 100644 --- a/core/tests/fixtures/promo/launch-settled.txt +++ b/core/tests/fixtures/promo/launch-settled.txt @@ -1,24 +1,24 @@ -# launch: all things +# launch: allthings ## before posting - [ ] allthings.dev serves the new site and every allthingsweb.dev address redirects to it, as every draft says (infra/docs/r2-migration.md, the full cutover). Post nothing before. - [ ] Every published evening has its short link, as the drafts say: bun run slugs --dry-run (in core/) gives none, or run it without --dry-run first. - [ ] Post the X thread from @allthingsdev, each post a reply to the one before. -- [ ] Display names say all things before the posts do: X, Bluesky, the LinkedIn page, the Discord server and the Luma calendar. +- [ ] Display names say allthings before the posts do: X, Bluesky, the LinkedIn page, the Discord server and the Luma calendar. - [ ] Send each Meetup announcement from its own group, to all its members. -## x: thread 1/6 (259 / 280) +## x: thread 1/6 (257 / 280) -All Things Web is now all things. +All Things Web is now allthings. -The same evenings for people who build software, in the neighborhoods of San Francisco, under one name: all things/_. Each evening fills the slot after the slash. +The same evenings for people who build software, in the neighborhoods of San Francisco, under one name: allthings/_. Each evening fills the slot after the slash. The site is allthings.dev. allthingsweb.dev redirects there. -## x: thread 2/6 (236 / 280) +## x: thread 2/6 (235 / 280) -Every evening has a short link, its name as an address: all things/effect lives at allthings.dev/effect. +Every evening has a short link, its name as an address: allthings/effect lives at allthings.dev/effect. A link, once given, is that evening's for good, so nothing printed, posted or put in a QR code ever comes to mean another evening. @@ -36,27 +36,27 @@ Hackathons start from at/hack, a template: fork it, build, hand in a public repo github.com/allthingsweb-dev/hack -## x: thread 6/6 (126 / 280) +## x: thread 6/6 (125 / 280) -Next: all things/upcoming meetup, Thu Nov 5, 6:00 PM. +Next: allthings/upcoming meetup, Thu Nov 5, 6:00 PM. https://allthings.dev/2026-11-05-upcoming Talk between evenings → discord.gg/B3Sm4b5mfD -## bluesky (293 / 300) +## bluesky (291 / 300) -All Things Web is now all things, at allthings.dev. allthingsweb.dev redirects there. +All Things Web is now allthings, at allthings.dev. allthingsweb.dev redirects there. New: a short link for every evening, a page for everyone who's been on stage, evenings we share, and at/hack. -Next: all things/upcoming meetup, Thu Nov 5, 6:00 PM. https://allthings.dev/2026-11-05-upcoming +Next: allthings/upcoming meetup, Thu Nov 5, 6:00 PM. https://allthings.dev/2026-11-05-upcoming -## linkedin (1100 / 3000) +## linkedin (1095 / 3000) -All Things Web is now all things. +All Things Web is now allthings. -The evenings stay what they were: for people who build software, in the neighborhoods of San Francisco, about who's on stage and what they built. What changes is the name, all things/_, where each evening fills the slot after the slash: all things/effect, all things/expo. +The evenings stay what they were: for people who build software, in the neighborhoods of San Francisco, about who's on stage and what they built. What changes is the name, allthings/_, where each evening fills the slot after the slash: allthings/effect, allthings/expo. The site is now allthings.dev, and allthingsweb.dev redirects there. With it: @@ -65,16 +65,16 @@ The site is now allthings.dev, and allthingsweb.dev redirects there. With it: - Evenings other people run that we think are good are listed beside ours, marked shared, with who organizes them. - Hackathons start from at/hack, a template: fork it, build, hand in a public repo. Projects are judged on whether they work before how they look. github.com/allthingsweb-dev/hack -Next: all things/upcoming meetup, Thu Nov 5, 6:00 PM. https://allthings.dev/2026-11-05-upcoming +Next: allthings/upcoming meetup, Thu Nov 5, 6:00 PM. https://allthings.dev/2026-11-05-upcoming Talk between evenings → discord.gg/B3Sm4b5mfD On X: x.com/allthingsdev -## discord (780 / 2000) +## discord (775 / 2000) -**All Things Web is now all things.** +**All Things Web is now allthings.** -Same evenings, same server. The name is all things/\_, and each evening fills the slot after the slash: all things/effect, all things/expo. +Same evenings, same server. The name is allthings/\_, and each evening fills the slot after the slash: allthings/effect, allthings/expo. **What changed** - The site is **allthings.dev**; allthingsweb.dev redirects there. @@ -83,15 +83,15 @@ Same evenings, same server. The name is all things/\_, and each evening fills th - Evenings other people run that we think are good are listed beside ours, marked shared. - Hackathons start from **at/hack**, a template: fork it, build, hand in a public repo. -**Next: all things/upcoming meetup, Thu Nov 5, 6:00 PM.** +**Next: allthings/upcoming meetup, Thu Nov 5, 6:00 PM.** On X: **@allthingsdev** -## luma: newsletter (1106 / 5000) +## luma: newsletter (1101 / 5000) -subject: These evenings are now all things +subject: These evenings are now allthings -All Things Web is now all things: the same evenings for people who build software, in the neighborhoods of San Francisco, under one name, all things/\_. Each evening fills the slot after the slash: all things/effect, all things/expo. +All Things Web is now allthings: the same evenings for people who build software, in the neighborhoods of San Francisco, under one name, allthings/\_. Each evening fills the slot after the slash: allthings/effect, allthings/expo. Nothing changes here: you keep following this calendar, and every evening's seats are still taken here. @@ -103,39 +103,39 @@ Nothing changes here: you keep following this calendar, and every evening's seat - Evenings other people run that we think are good are listed beside ours, marked shared. - Hackathons start from **at/hack**, a template: fork it, build, hand in a public repo. -**Next: all things/upcoming meetup, Thu Nov 5, 6:00 PM.** [allthings.dev/2026-11-05-upcoming](https://allthings.dev/2026-11-05-upcoming) +**Next: allthings/upcoming meetup, Thu Nov 5, 6:00 PM.** [allthings.dev/2026-11-05-upcoming](https://allthings.dev/2026-11-05-upcoming) Talk between evenings → **[discord](https://discord.gg/B3Sm4b5mfD)**. On X: **[@allthingsdev](https://x.com/allthingsdev)**. -## meetup: React San Francisco Bay Area (788 / 5000) +## meetup: React San Francisco Bay Area (784 / 5000) group: https://www.meetup.com/reactjs-san-francisco/ -subject: React San Francisco Bay Area's evenings are now all things +subject: React San Francisco Bay Area's evenings are now allthings -The evenings React San Francisco Bay Area lists went by All Things Web. They're now all things: one name, all things/_, and each evening fills the slot after the slash. +The evenings React San Francisco Bay Area lists went by All Things Web. They're now allthings: one name, allthings/_, and each evening fills the slot after the slash. -Nothing changes for you here. This group continues under all things, you stay a member, and each evening is still listed here. Seats are on Luma (luma.com/allthingsweb); the list on Meetup is a waitlist. +Nothing changes for you here. This group continues under allthings, you stay a member, and each evening is still listed here. Seats are on Luma (luma.com/allthingsweb); the list on Meetup is a waitlist. What's new on allthings.dev (allthingsweb.dev redirects there): a short link for every evening, allthings.dev/; a page for everyone who has been on stage; evenings others run that we think are good, marked shared; and at/hack, the template hackathons start from. -Next: all things/upcoming meetup, Thu Nov 5, 6:00 PM. https://allthings.dev/2026-11-05-upcoming +Next: allthings/upcoming meetup, Thu Nov 5, 6:00 PM. https://allthings.dev/2026-11-05-upcoming Talk between evenings → discord.gg/B3Sm4b5mfD -## meetup: Remix Bay Area (774 / 5000) +## meetup: Remix Bay Area (770 / 5000) group: https://www.meetup.com/remix-bay-area/ -subject: Remix Bay Area's evenings are now all things +subject: Remix Bay Area's evenings are now allthings -The evenings Remix Bay Area lists went by All Things Web. They're now all things: one name, all things/_, and each evening fills the slot after the slash. +The evenings Remix Bay Area lists went by All Things Web. They're now allthings: one name, allthings/_, and each evening fills the slot after the slash. -Nothing changes for you here. This group continues under all things, you stay a member, and each evening is still listed here. Seats are on Luma (luma.com/allthingsweb); the list on Meetup is a waitlist. +Nothing changes for you here. This group continues under allthings, you stay a member, and each evening is still listed here. Seats are on Luma (luma.com/allthingsweb); the list on Meetup is a waitlist. What's new on allthings.dev (allthingsweb.dev redirects there): a short link for every evening, allthings.dev/; a page for everyone who has been on stage; evenings others run that we think are good, marked shared; and at/hack, the template hackathons start from. -Next: all things/upcoming meetup, Thu Nov 5, 6:00 PM. https://allthings.dev/2026-11-05-upcoming +Next: allthings/upcoming meetup, Thu Nov 5, 6:00 PM. https://allthings.dev/2026-11-05-upcoming Talk between evenings → discord.gg/B3Sm4b5mfD diff --git a/core/tests/home.test.ts b/core/tests/home.test.ts index 72e565fc..063c4596 100644 --- a/core/tests/home.test.ts +++ b/core/tests/home.test.ts @@ -243,7 +243,7 @@ describe("Home", () => { linkedinHandle: null, }, }); - // Shared, it is named as written: no all things/. + // Shared, it is named as written: no allthings/. expect(home.afterThat[0]?.topic).toBeUndefined(); // Photos are of our evenings alone. expect(home.photos.map((photo) => photo.alt)).not.toContain("The stage"); diff --git a/core/tests/lockup.test.ts b/core/tests/lockup.test.ts index cb2475d1..1551c60c 100644 --- a/core/tests/lockup.test.ts +++ b/core/tests/lockup.test.ts @@ -50,6 +50,9 @@ describe("topicOf", () => { test.each([ ["all things effect", "effect"], + ["allthings/effect", "effect"], + ["allthings effect", "effect"], + ["allthings/React Native at Vercel", "react native"], ["ALL THINGS Expo", "expo"], ["Effect SF", "effect"], ["Effect in San Francisco", "effect"], @@ -66,6 +69,8 @@ describe("topicOf", () => { "", "🎉", "All Things", + "allthings", + "allthings/_", "All Things Web: Season 2", "React / Remix", "Kickoff - Day 1", diff --git a/core/tests/planning.test.ts b/core/tests/planning.test.ts index 22a79f2e..1a2ab4ea 100644 --- a/core/tests/planning.test.ts +++ b/core/tests/planning.test.ts @@ -535,7 +535,7 @@ describe("as text", () => { ).toBe( [ "Made-up quiz [idea] f0000000-0000-4000-8000-000000000001", - " social · all things/quiz", + " social · allthings/quiz", " Rounds.", " builds on: 2025-10-07-made-up (2025-10-07)", ].join("\n"), diff --git a/core/tests/post-candidates.test.ts b/core/tests/post-candidates.test.ts index aa4d9cdd..33448d6f 100644 --- a/core/tests/post-candidates.test.ts +++ b/core/tests/post-candidates.test.ts @@ -106,7 +106,7 @@ describe("scoreCandidate", () => { score: 4 + 3 + 1 + 2 + 1 + 2, reasons: [ '+4 names "React at Acme"', - "+3 says all things", + "+3 says allthings", "+1 names Globex", "+2 by @Ada, on its stage", "+1 mentions @ada", @@ -138,6 +138,10 @@ describe("scoreCandidate", () => { scoreCandidate(ai, post({ text: "see you at all things/ai tonight" })) .score, ).toBe(3); + expect( + scoreCandidate(ai, post({ text: "see you at allthings/ai tonight" })) + .score, + ).toBe(3); }); test("a word that only resembles the topic or a host scores nothing", () => { @@ -192,7 +196,7 @@ describe("scoreCandidate", () => { ).toBe(2); // X's from: takes the id where it's known. expect(xQueries(known)[1]).toBe( - '(from:11) ("all things" OR "react") -is:retweet', + '(from:11) ("allthings" OR "all things" OR "react") -is:retweet', ); }); @@ -653,10 +657,10 @@ describe("what platforms answer", () => { }); }); - test("X's queries: the evening's links and name, and its people saying all things", () => { + test("X's queries: the evening's links and name, and its people saying allthings", () => { expect(xQueries(signals)).toEqual([ '(url:"lu.ma/event/evt-react" OR url:"luma.com/react-at-acme" OR url:"allthings.dev/2026-08-12-react-at-acme" OR "React at Acme") -is:retweet', - '(from:ada) ("all things" OR "react") -is:retweet', + '(from:ada) ("allthings" OR "all things" OR "react") -is:retweet', ]); }); }); diff --git a/core/tests/promo-launch.test.ts b/core/tests/promo-launch.test.ts index 71de0eee..ba95d2f8 100644 --- a/core/tests/promo-launch.test.ts +++ b/core/tests/promo-launch.test.ts @@ -61,7 +61,7 @@ const settled: LaunchConfig = { /** A next evening with every part, the longest each is likely to be. */ const hosted: NextEvening = { - title: "all things/react native", + title: "allthings/react native", when: "Wed Sep 30, 5:30 PM", where: "hosted at CodeRabbit and Acme Developer Tools in Potrero Hill", url: `${origin}/react-native-2026-09-30`, @@ -124,8 +124,8 @@ describe("every draft fits its platform", () => { test("however long the next evening's name, Bluesky keeps the redirect and what's new", () => { for (const title of [ - "all things/upcoming meetup and something else", - `all things/${"x".repeat(120)}`, + "allthings/upcoming meetup and something else", + `allthings/${"x".repeat(120)}`, ]) { const { bluesky } = launchDrafts({ ...settled, @@ -199,7 +199,7 @@ describe("diction", () => { const times = text.split(formerName).length - 1; expect({ name, times }).toEqual({ name, times: expected }); } - expect(drafts.x[0]).toStartWith(`${formerName} is now all things.`); + expect(drafts.x[0]).toStartWith(`${formerName} is now allthings.`); }); }); @@ -240,7 +240,7 @@ describe("what isn't settled", () => { describe("the next evening", () => { test("is named by its lockup, its time in San Francisco and its short link", () => { expect(next(upcoming)).toEqual({ - title: "all things/upcoming meetup", + title: "allthings/upcoming meetup", when: "Thu Nov 5, 6:00 PM", where: null, url: `${origin}/${upcoming.slug}`, diff --git a/core/tests/promo.test.ts b/core/tests/promo.test.ts index 8d3f854d..21732735 100644 --- a/core/tests/promo.test.ts +++ b/core/tests/promo.test.ts @@ -231,8 +231,8 @@ describe("diction", () => { test("an evening is named by its lockup, a daytime event says today", async () => { const acme = await read("2026-08-12-react-at-acme"); - expect(acme.title).toBe("all things/react"); - expect(acme.social.x.dayOf).toStartWith("Tonight: all things/react."); + expect(acme.title).toBe("allthings/react"); + expect(acme.social.x.dayOf).toStartWith("Tonight: allthings/react."); expect(acme.social.discord.dayOf).toContain("see you at/react"); const hack = await read("2026-10-03-hack-day"); expect(hack.social.x.dayOf).toStartWith("Today:"); @@ -265,7 +265,7 @@ describe("Meetup", () => { expect(text).toContain( "Hosted at **Globex** and **[Acme](https://acme.example/)**", ); - expect(text).toContain("**[all things](https://luma.com/allthingsweb)**"); + expect(text).toContain("**[allthings](https://luma.com/allthingsweb)**"); } }); @@ -488,7 +488,7 @@ describe("an evening we only share", () => { for (const channel of ["x", "bluesky", "linkedin", "discord"] as const) { for (const moment of ["announce", "dayOf", "recap"] as const) { const text = drafts.social[channel][moment]; - expect(text).not.toContain("all things/"); + expect(text).not.toContain("allthings/"); expect(text).not.toContain("see you"); expect(text).not.toContain("Thank you for coming"); expect(text).not.toContain("If you're in"); diff --git a/core/tests/social-bluesky.test.ts b/core/tests/social-bluesky.test.ts index 6f893fa2..ba31d8a3 100644 --- a/core/tests/social-bluesky.test.ts +++ b/core/tests/social-bluesky.test.ts @@ -19,7 +19,7 @@ afterAll(() => db.close()); const slug = "2026-08-12-react-at-acme"; const text = - "all things/react: talks by Linus, Grace Hopper and @ada.bsky.social.\n\nWed Aug 12, 6:00 PM, hosted at Globex and Acme.\n\nhttps://lu.ma/event/evt-react"; + "allthings/react: talks by Linus, Grace Hopper and @ada.bsky.social.\n\nWed Aug 12, 6:00 PM, hosted at Globex and Acme.\n\nhttps://lu.ma/event/evt-react"; const json = (value: unknown): Reply => ({ body: JSON.stringify(value) }); const feed = ( diff --git a/core/tests/social-x.test.ts b/core/tests/social-x.test.ts index 764fcf3d..65f0d991 100644 --- a/core/tests/social-x.test.ts +++ b/core/tests/social-x.test.ts @@ -156,7 +156,7 @@ describe("the dry run", () => { a.prepare(slug, "announce"), ); const post = value(exit); - expect(post.text).toContain("all things/react"); + expect(post.text).toContain("allthings/react"); expect(post.sent).toBeNull(); expect(post.token).toBe( await Effect.runPromise( diff --git a/infra/src/web.ts b/infra/src/web.ts index f4dba595..fac6f840 100644 --- a/infra/src/web.ts +++ b/infra/src/web.ts @@ -21,7 +21,7 @@ export const SITE_HOST = "allthings.dev"; export const SITE_ORIGIN = `https://${SITE_HOST}`; /** - * The all things Worker (web/): the public API, the MCP server, the home + * The allthings Worker (web/): the public API, the MCP server, the home * page, the evenings index, each event's page, the people and about pages * and /brand. Alchemy bundles ../web/src/worker.ts with web's own * dependencies and uploads ../web/dist/public as its static assets, so first diff --git a/pages/index.html b/pages/index.html index 292bf052..6a801e56 100644 --- a/pages/index.html +++ b/pages/index.html @@ -1,12 +1,12 @@ - All Things Web + allthings
-

All Things Web

+

allthings/_

diff --git a/pages/install.bash b/pages/install.bash index 4e8598bf..412522c1 100644 --- a/pages/install.bash +++ b/pages/install.bash @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Installs the all things CLI, `allthings`, in ~/.allthings/bin, with `atw` +# Installs the allthings CLI, `allthings`, in ~/.allthings/bin, with `atw` # beside it as the old name for now. # # curl -fsSL https://allthingsweb-dev.github.io/allthingsweb/install.bash | bash diff --git a/plugins/allthings/plugin.json b/plugins/allthings/plugin.json index e8017b08..c03414ad 100644 --- a/plugins/allthings/plugin.json +++ b/plugins/allthings/plugin.json @@ -1,10 +1,10 @@ { "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", "name": "allthings", - "version": "0.2.1", - "description": "Find all things evenings in San Francisco, for people who build software: what's coming up, who's on stage and what they built, who's hosting, and where to say you're in.", + "version": "0.2.2", + "description": "Find allthings evenings in San Francisco, for people who build software: what's coming up, who's on stage and what they built, who's hosting, and where to say you're in.", "author": { - "name": "all things", + "name": "allthings", "url": "https://allthings.dev" }, "homepage": "https://allthings.dev", @@ -20,7 +20,7 @@ "extensions": { "com.openai": { "interface": { - "displayName": "all things", + "displayName": "allthings", "shortDescription": "Evenings for people who build software in SF", "category": "Productivity", "composerIcon": "./assets/icon.png", diff --git a/plugins/allthings/skills/evening-briefing/SKILL.md b/plugins/allthings/skills/evening-briefing/SKILL.md index c0eb73f3..90e36596 100644 --- a/plugins/allthings/skills/evening-briefing/SKILL.md +++ b/plugins/allthings/skills/evening-briefing/SKILL.md @@ -1,6 +1,6 @@ --- name: evening-briefing -description: Brief someone before an all things evening in San Francisco: who is on stage and what they built, the schedule, where to go and how to get in. Use when someone is going to, or considering, a specific all things event, meetup or hackathon and wants to prepare. +description: Brief someone before an allthings evening in San Francisco: who is on stage and what they built, the schedule, where to go and how to get in. Use when someone is going to, or considering, a specific allthings event, meetup or hackathon and wants to prepare. --- 1. Identify the evening. If the person names it loosely, call `list_events` (upcoming first, then past) and match on name or date; confirm when more than one fits. diff --git a/plugins/allthings/skills/find-evenings/SKILL.md b/plugins/allthings/skills/find-evenings/SKILL.md index 5ae246ff..f18845f2 100644 --- a/plugins/allthings/skills/find-evenings/SKILL.md +++ b/plugins/allthings/skills/find-evenings/SKILL.md @@ -1,9 +1,9 @@ --- name: find-evenings -description: Find upcoming all things evenings in San Francisco (talks, open floors, socials and hackathons for people who build software) and help someone pick one. Use when someone asks about web development, JavaScript, TypeScript, React or AI engineering meetups, hackathons or tech events in San Francisco or the Bay Area. +description: Find upcoming allthings evenings in San Francisco (talks, open floors, socials and hackathons for people who build software) and help someone pick one. Use when someone asks about web development, JavaScript, TypeScript, React or AI engineering meetups, hackathons or tech events in San Francisco or the Bay Area. --- -all things is an open community for people who build software in San Francisco, from someone a month into their first job to the maintainers of libraries you install every day. Evenings are free; the hosting company gives the space, food and drinks. Each evening is named all things/, always lowercase: use the name the tools return. +allthings is an open community for people who build software in San Francisco, from someone a month into their first job to the maintainers of libraries you install every day. Evenings are free; the hosting company gives the space, food and drinks. Each evening is named allthings/, always lowercase: use the name the tools return. 1. Call `list_events` with `when: "upcoming"`. Evenings come soonest first, and one happening now is included with `status: "live"`. 2. If nothing is upcoming, say so plainly, point to the calendar from `get_community` (`links.events`), and offer recent evenings (`when: "past"`) to show what they are like. diff --git a/web/scripts/build.ts b/web/scripts/build.ts index d21fbee2..c8337714 100644 --- a/web/scripts/build.ts +++ b/web/scripts/build.ts @@ -265,8 +265,8 @@ export const fixedNames: ReadonlyArray = [ export function webManifest(ground: string): string { return `${JSON.stringify( { - name: "all things", - short_name: "all things", + name: "allthings", + short_name: "allthings", description: "Evenings for people who build software. In the neighborhoods of San Francisco.", start_url: "/", diff --git a/web/src/links.ts b/web/src/links.ts index 414a4884..cc3b6139 100644 --- a/web/src/links.ts +++ b/web/src/links.ts @@ -2,7 +2,7 @@ import { eventPathOf } from "allthings-core/src/mappers.ts"; import { ourAccount } from "allthings-core/src/social/account.ts"; /** - * Where all things is besides this site, and who hosts it. Every page's + * Where allthings is besides this site, and who hosts it. Every page's * footer reads them; brand/foundations.md ("People and channels") says how * they are shown. */ @@ -31,7 +31,7 @@ export const eventPath = (slug: string): `/${string}` => eventPathOf(slug); /** Every evening, listed: this site's evenings index (pages/events.tsx). */ export const everyEvening = "/events"; -/** What all things is, where it came from and who organizes it. */ +/** What allthings is, where it came from and who organizes it. */ export const aboutPath = "/about"; /** Where everyone who organized, spoke at or co-hosted an evening is listed. */ diff --git a/web/src/mcp/community.ts b/web/src/mcp/community.ts index cfe14591..712fbae7 100644 --- a/web/src/mcp/community.ts +++ b/web/src/mcp/community.ts @@ -2,7 +2,7 @@ import type * as Contract from "allthings-core/src/contract.ts"; import { siteDescription, siteName } from "../pages/metadata.tsx"; /** - * What get_community says about all things: its name and its two sentences + * What get_community says about allthings: its name and its two sentences * as the site's own pages give them (pages/metadata.tsx), the rest as the * old app (app/src/lib/community.ts) wrote it, under the new name. */ @@ -13,7 +13,7 @@ export function community(origin: string): Contract.Community { introduction: "Just starting out, leading a company, or creating tools the world uses every day? Here, we meet as peers. Come learn, share what you’re building, ask questions, and find your people.", mission: - "all things brings the San Francisco Bay Area tech community together on a level playing field. We make room to listen, learn, collaborate, connect, show off a project, and get support—whatever your experience or job title.", + "allthings brings the San Francisco Bay Area tech community together on a level playing field. We make room to listen, learn, collaborate, connect, show off a project, and get support—whatever your experience or job title.", history: "Erik Thorelli and Andre Landgraf started this community to help rebuild San Francisco’s local tech meetup scene after COVID disrupted it. Our roots are in Remix Bay Area and React meetups: the spirit of an old hacker club, with the tools and ideas of today.", independence: diff --git a/web/src/mcp/tools.ts b/web/src/mcp/tools.ts index e2499ce3..0a1efb02 100644 --- a/web/src/mcp/tools.ts +++ b/web/src/mcp/tools.ts @@ -99,7 +99,7 @@ const withDataSource = Effect.logError(`MCP tool ${tool} failed`, cause).pipe( Effect.as( fail( - `all things ${subject} are temporarily unavailable. Please retry in a minute.`, + `allthings ${subject} are temporarily unavailable. Please retry in a minute.`, ), ), ), @@ -163,7 +163,7 @@ export function registerTools(server: McpServer, run: RunTool): void { { title: "List events", description: - "List all things events in San Francisco. Upcoming (including live) events come soonest first; past events come most recent first. Registration always happens at each event's rsvpUrl.", + "List allthings events in San Francisco. Upcoming (including live) events come soonest first; past events come most recent first. Registration always happens at each event's rsvpUrl.", inputSchema: z.object({ when: z .enum(["upcoming", "past", "all"]) @@ -184,7 +184,7 @@ export function registerTools(server: McpServer, run: RunTool): void { { title: "Get event", description: - "Get one all things event by slug: schedule, venue, talks with speakers, hosting companies and where to register.", + "Get one allthings event by slug: schedule, venue, talks with speakers, hosting companies and where to register.", inputSchema: z.object({ slug: z.string().min(1).describe("Event slug from list_events."), }), @@ -199,7 +199,7 @@ export function registerTools(server: McpServer, run: RunTool): void { { title: "List speakers", description: - "List people who have spoken at past all things events, with their talks. Optionally filter by a case-insensitive name, title or talk search.", + "List people who have spoken at past allthings events, with their talks. Optionally filter by a case-insensitive name, title or talk search.", inputSchema: z.object({ query: z.string().trim().min(1).optional(), limit: z.number().int().min(1).max(200).default(50), @@ -215,9 +215,9 @@ export function registerTools(server: McpServer, run: RunTool): void { server.registerTool( "get_community", { - title: "About all things", + title: "About allthings", description: - "What all things is: mission, history, how hosting works, and links to events, Discord and the code of conduct.", + "What allthings is: mission, history, how hosting works, and links to events, Discord and the code of conduct.", inputSchema: z.object({}), outputSchema: outputSchema(Schema.Struct(Contract.Community.fields)), annotations: readOnly, diff --git a/web/src/pages/about.tsx b/web/src/pages/about.tsx index 70925245..b97f6d49 100644 --- a/web/src/pages/about.tsx +++ b/web/src/pages/about.tsx @@ -20,7 +20,7 @@ import { ogCards } from "../og/cards.ts"; import { fullDate, listDate } from "./time.ts"; /** - * /about: what all things is, in the foundations' words ("Who we are"), + * /about: what allthings is, in the foundations' words ("Who we are"), * what it has done so far, counted from the data, where it came from (the * one place its former names appear, brand/foundations.md, "Name"), who * organizes it, how to host an evening or take the stage, and where else @@ -152,7 +152,7 @@ function History({ about }: { readonly about: AboutView }) { ) : ( <>

- {`Before they were all things, they went by ${series(names)}. Now there is one name, and each evening fills the slot after the slash.`} + {`Before they were allthings, they went by ${series(names)}. Now there is one name, and each evening fills the slot after the slash.`}

    {about.formerNames.map(({ evening }) => ( @@ -268,7 +268,7 @@ export function aboutPage({ An open door and a high bar.

    - all things is an open community for people who build software in + allthings is an open community for people who build software in San Francisco: the person a month into their first job, the maintainer of a library you install every day, the founder, the creator, and everyone between. Everyone is welcome. What goes on diff --git a/web/src/pages/brand.tsx b/web/src/pages/brand.tsx index c7572262..d34d6204 100644 --- a/web/src/pages/brand.tsx +++ b/web/src/pages/brand.tsx @@ -191,14 +191,14 @@ function Specimen({ role }: { readonly role: TypeRole }) { case "wordmark": return (

    - all things/ + allthings/ _

    ); case "eventLockup": return (

    - all things/effect + allthings/effect _

    ); @@ -318,14 +318,14 @@ function Marks() {

    brand · the living style guide

    - all things/brand + allthings/brand

    Palette, type and marks, drawn from the tokens the site is built @@ -428,7 +428,7 @@ export function brandPage({ meta: { title: lockup("brand"), description: - "The all things/_ brand: palette, type, marks and the rules they follow.", + "The allthings/_ brand: palette, type, marks and the rules they follow.", path: "/brand", image: ogCards.brand, }, diff --git a/web/src/pages/calendar.ts b/web/src/pages/calendar.ts index fbb67903..a46de365 100644 --- a/web/src/pages/calendar.ts +++ b/web/src/pages/calendar.ts @@ -14,7 +14,7 @@ export const calendarPath = (slug: string): `/${string}` => `${eventPathOf(slug)}/calendar.ics`; /** Who made the file, as RFC 5545 asks: a name no other product uses. */ -const productId = "-//all things//event page//EN"; +const productId = "-//allthings//event page//EN"; /** Ids are unique to the event, under the site's domain. */ const uidDomain = "allthings.dev"; diff --git a/web/src/pages/code-of-conduct.tsx b/web/src/pages/code-of-conduct.tsx index 7c3bd5bb..560fb195 100644 --- a/web/src/pages/code-of-conduct.tsx +++ b/web/src/pages/code-of-conduct.tsx @@ -33,7 +33,7 @@ export function codeOfConductPage({ meta: { title: gatheringTitle("code of conduct"), description: - "How we keep all things welcoming, respectful, and community first, and how to report a concern.", + "How we keep allthings welcoming, respectful, and community first, and how to report a concern.", path: codeOfConductPath, image: ogCards.codeOfConduct, }, @@ -46,7 +46,7 @@ export function codeOfConductPage({

    code of conduct

    - all things is a place to learn, build, share, and connect on equal + allthings is a place to learn, build, share, and connect on equal footing.

    diff --git a/web/src/pages/document.tsx b/web/src/pages/document.tsx index a71f9bcd..dc3f4501 100644 --- a/web/src/pages/document.tsx +++ b/web/src/pages/document.tsx @@ -19,11 +19,11 @@ import { type Choice, choices, type Theme } from "./theme.ts"; * CSS, and the mode is chosen with links (see theme.ts). */ -/** The master wordmark, all things/_, linking home. */ +/** The master wordmark, allthings/_, linking home. */ export function Wordmark() { return ( - - all things/ + + allthings/ @@ -142,7 +142,7 @@ function ModeSwitch({ theme }: { readonly theme: Theme | undefined }) { * The hosts sign off with their portraits from their speaker profiles, or * the brand's blank avatar where there is none. The originals are large * (684 to 2160 px, megabytes) and shown at 36, so with variants they come - * at 36 and 72 pixels (see picture.tsx). Who they are, and what all things + * at 36 and 72 pixels (see picture.tsx). Who they are, and what allthings * is, is on the about page their names link to. */ function Footer({ @@ -171,7 +171,7 @@ function Footer({

    -