refactor(deck): rename Archipelago → Lab 484 everywhere

Use the real name: the backbone/brand is Lab 484 (the tech co & 45%
operating partner). Replaces all display text, the internal entity id
('archipelago' → 'lab484'), the page title, and the style.css comment.
Fixes the phrasings the rename made redundant (e.g. "the Lab 484 backbone"
under the Lab 484 wordmark → "shared, open infrastructure"; drops the
"(Lab 484)" qualifier on Lab 484's own responsibilities).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Patrick Mulligan 2026-07-31 23:03:56 +02:00
commit 4eb7e88ea5
10 changed files with 39 additions and 39 deletions

View file

@ -4,7 +4,7 @@
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Archipelago — Investment Prospectus</title> <title>Lab 484 — Investment Prospectus</title>
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>

View file

@ -32,7 +32,7 @@ const slides = [
{ id: 'title', label: 'Title', component: TitleSlide }, { id: 'title', label: 'Title', component: TitleSlide },
{ id: 'vision', label: 'Vision', component: VisionSlide }, { id: 'vision', label: 'Vision', component: VisionSlide },
{ id: 'network', label: 'The network', component: NetworkSlide }, { id: 'network', label: 'The network', component: NetworkSlide },
{ id: 'archipelago', label: 'Archipelago', component: TechSlide }, { id: 'lab484', label: 'Lab 484', component: TechSlide },
{ id: 'entities', label: 'Three experiences', component: EntitiesSlide }, { id: 'entities', label: 'Three experiences', component: EntitiesSlide },
{ id: 'sollunar', label: 'SolLunar Society', component: SolLunarSlide }, { id: 'sollunar', label: 'SolLunar Society', component: SolLunarSlide },
{ id: 'partnership', label: 'Ownership', component: PartnershipSlide }, { id: 'partnership', label: 'Ownership', component: PartnershipSlide },

View file

@ -69,7 +69,7 @@ const a = props.entity.accent
</div> </div>
<div class="flex items-center gap-2 rounded-2xl border border-line bg-surface px-4 py-3 text-xs text-fg-muted"> <div class="flex items-center gap-2 rounded-2xl border border-line bg-surface px-4 py-3 text-xs text-fg-muted">
<Icon name="Layers" class="size-4 text-amber" /> <Icon name="Layers" class="size-4 text-amber" />
Runs on Archipelago same membership, kiosk &amp; app as every node. Runs on Lab 484 same membership, kiosk &amp; app as every node.
</div> </div>
</div> </div>
</div> </div>

View file

@ -2,7 +2,7 @@
/** /**
* The core metaphor, as an animated SVG. * The core metaphor, as an animated SVG.
* *
* Underground Archipelago = the shared backbone / custom software. * Underground Lab 484 = the shared backbone / custom software.
* Unseen, always working, connects every entity (the mycelium). * Unseen, always working, connects every entity (the mycelium).
* Flowers the three experiences people actually engage with: * Flowers the three experiences people actually engage with:
* SolLunar Punk Society (city center) a permanent bloom * SolLunar Punk Society (city center) a permanent bloom
@ -21,7 +21,7 @@ const GROUND = 300
// underground mycelium nodes (below the ground line) // underground mycelium nodes (below the ground line)
const nodes: [number, number][] = [ const nodes: [number, number][] = [
[230, 340], // root · Archipelago [230, 340], // root · Lab 484
[500, 335], // root · SolLunar [500, 335], // root · SolLunar
[770, 340], // root · Chateau [770, 340], // root · Chateau
[100, 340], // root · ghost [100, 340], // root · ghost
@ -77,7 +77,7 @@ const fest = entityById('festivals') // travelling
const cha = entityById('chateau') // farm const cha = entityById('chateau') // farm
// surface flowers: the three experiences + two faint "future" ones. // surface flowers: the three experiences + two faint "future" ones.
// (Archipelago is the mycelium itself the network below, not a flower.) // (Lab 484 is the mycelium itself the network below, not a flower.)
const flowers = [ const flowers = [
{ x: 230, kind: 'bloom', color: 'var(--color-indigo)', name: sol.name, tag: sol.role }, { x: 230, kind: 'bloom', color: 'var(--color-indigo)', name: sol.name, tag: sol.role },
{ x: 500, kind: 'festival', color: 'var(--color-rose)', name: fest.name, tag: fest.role }, { x: 500, kind: 'festival', color: 'var(--color-rose)', name: fest.name, tag: fest.role },
@ -275,14 +275,14 @@ const festivalCaps = [
<!-- captions --> <!-- captions -->
<text x="500" y="34" text-anchor="middle" class="myc-zone">ABOVE GROUND · WHAT PEOPLE EXPERIENCE</text> <text x="500" y="34" text-anchor="middle" class="myc-zone">ABOVE GROUND · WHAT PEOPLE EXPERIENCE</text>
<text x="500" y="588" text-anchor="middle" class="myc-zone">ARCHIPELAGO · THE SHARED BACKBONE BENEATH EVERY NODE</text> <text x="500" y="588" text-anchor="middle" class="myc-zone">LAB 484 · THE SHARED BACKBONE BENEATH EVERY NODE</text>
</svg> </svg>
<div class="mt-6 grid gap-4 text-sm sm:grid-cols-2"> <div class="mt-6 grid gap-4 text-sm sm:grid-cols-2">
<div class="flex items-start gap-3"> <div class="flex items-start gap-3">
<span class="mt-0.5 text-pine"><Icon name="Layers" class="size-5" /></span> <span class="mt-0.5 text-pine"><Icon name="Layers" class="size-5" /></span>
<p class="text-fg-muted"> <p class="text-fg-muted">
<span class="font-medium text-fg">Archipelago is the mycelium.</span> <span class="font-medium text-fg">Lab 484 is the mycelium.</span>
One shared backbone runs unseen beneath every entity members feel it, they dont see it. One shared backbone runs unseen beneath every entity members feel it, they dont see it.
</p> </p>
</div> </div>

View file

@ -1,15 +1,15 @@
/** /**
* ARCHIPELAGO pitch deck content & figures. * LAB 484 pitch deck content & figures.
* *
* Single source of truth for the deck no slide hard-codes a number or name. * Single source of truth for the deck no slide hard-codes a number or name.
* *
* The financials are REAL, from SolLunarSociety.md, and belong exclusively to * The financials are REAL, from SolLunarSociety.md, and belong exclusively to
* the first node SolLunar Society (Austin). Archipelago (Lab 484), Pop-up * the first node SolLunar Society (Austin). Lab 484, Pop-up
* Festivals and Chateau du Faune are narrative/vision only and have no * Festivals and Chateau du Faune are narrative/vision only and have no
* standalone numbers. P&L totals are recomputed from line items; the doc's * standalone numbers. P&L totals are recomputed from line items; the doc's
* own summary totals didn't reconcile (kept in `pnlDocSummary`). * own summary totals didn't reconcile (kept in `pnlDocSummary`).
* *
* Archipelago is the shared backbone open hardware + sovereign software (the * Lab 484 is the shared backbone open hardware + sovereign software (the
* "mycelium"). Three surface entities run on top of it: * "mycelium"). Three surface entities run on top of it:
* SolLunar Society city members' club, Austin (the funded first node) * SolLunar Society city members' club, Austin (the funded first node)
* Pop-up Festivals travelling gatherings (e.g. Solarpunk Summit) * Pop-up Festivals travelling gatherings (e.g. Solarpunk Summit)
@ -21,12 +21,12 @@
export const PLACEHOLDER = true export const PLACEHOLDER = true
export const brand = { export const brand = {
name: 'Archipelago', name: 'Lab 484',
short: 'Archipelago', short: 'Lab 484',
// a connected network of islands — one backbone, many places. // Lab 484 — the tech co / shared backbone (also the 45% operating partner).
tagline: 'One network. Three ways to experience it.', tagline: 'One network. Three ways to experience it.',
subtagline: subtagline:
'A sovereign network on the Archipelago backbone. The first node — SolLunar Society, a members club in Austin — is live, modeled and raising now; the festival and the farm are next.', 'A sovereign network on shared, open infrastructure. The first node — SolLunar Society, a members club in Austin — is live, modeled and raising now; the festival and the farm are next.',
firstNode: 'SolLunar Society · Austin, TX', firstNode: 'SolLunar Society · Austin, TX',
contactEmail: 'invest@sollunar.example', // PLACEHOLDER contactEmail: 'invest@sollunar.example', // PLACEHOLDER
// Seam for later: an LNbits instance + the founder's nostr npub power the // Seam for later: an LNbits instance + the founder's nostr npub power the
@ -65,7 +65,7 @@ export type Entity = {
} }
/** /**
* The entities. Archipelago is the backbone; the other three are the * The entities. Lab 484 is the backbone; the other three are the
* experiences that run on it. PLACEHOLDER names & details. * experiences that run on it. PLACEHOLDER names & details.
*/ */
export const entities: Entity[] = [ export const entities: Entity[] = [
@ -77,7 +77,7 @@ export const entities: Entity[] = [
accent: 'indigo', accent: 'indigo',
layer: 'surface', layer: 'surface',
blurb: blurb:
'The first node and the one were raising for: a members club in Austin where sovereignty-minded community — tenants, events, memberships and regenerative living — comes together year-round on the Archipelago stack.', 'The first node and the one were raising for: a members club in Austin where sovereignty-minded community — tenants, events, memberships and regenerative living — comes together year-round on the Lab 484 stack.',
traits: [ traits: [
'Live, financially-modeled first node (real P&L)', 'Live, financially-modeled first node (real P&L)',
'Five founding tenants + a three-tier membership', 'Five founding tenants + a three-tier membership',
@ -125,8 +125,8 @@ export const entities: Entity[] = [
icon: 'Trees', icon: 'Trees',
}, },
{ {
id: 'archipelago', id: 'lab484',
name: 'Archipelago', name: 'Lab 484',
role: 'Shared backbone', role: 'Shared backbone',
kind: 'Open hardware & sovereign software', kind: 'Open hardware & sovereign software',
accent: 'pine', accent: 'pine',
@ -169,7 +169,7 @@ export const userEcosystem = [
icon: 'Zap', icon: 'Zap',
}, },
{ {
title: 'The Archipelago app', title: 'The Lab 484 app',
body: 'Book spaces, buy tickets, find events and manage membership from one self-hosted app.', body: 'Book spaces, buy tickets, find events and manage membership from one self-hosted app.',
icon: 'Sparkles', icon: 'Sparkles',
}, },
@ -185,7 +185,7 @@ export const userEcosystem = [
}, },
] ]
/** The Archipelago backbone / core stack (the infrastructure pillars). */ /** The Lab 484 backbone / core stack (the infrastructure pillars). */
export const tech = [ export const tech = [
{ {
title: 'Decentralized mesh network', title: 'Decentralized mesh network',
@ -222,7 +222,7 @@ export const tech = [
/* /*
SolLunar Society the first node's REAL business (from SolLunar Society the first node's REAL business (from
SolLunarSociety.md). All figures below are SolLunar Society's SolLunarSociety.md). All figures below are SolLunar Society's
only; Archipelago (Lab 484), Festivals and Chateau have no only; Lab 484, Festivals and Chateau have no
standalone numbers yet. Lab 484's economics appear here as standalone numbers yet. Lab 484's economics appear here as
revenue lines INTO SolLunar (~$16k/mo) don't double-count. revenue lines INTO SolLunar (~$16k/mo) don't double-count.
*/ */
@ -262,11 +262,11 @@ export const partnership = {
role: 'Tech & operations', role: 'Tech & operations',
responsibilities: [ responsibilities: [
'Operate the spaces & staff', 'Operate the spaces & staff',
'All IT / infrastructure (Archipelago)', 'All IT / infrastructure',
'Inbound payments · bootcamps', 'Inbound payments · bootcamps',
'Tenant & investor relations', 'Tenant & investor relations',
], ],
note: 'Builds & operates the Archipelago backbone — and is itself a tenant + event driver (~$16k/mo of the revenue below).', note: 'Builds & operates the shared tech backbone — and is itself a tenant + event driver (~$16k/mo of the revenue below).',
}, },
{ {
name: 'Investors', name: 'Investors',
@ -482,7 +482,7 @@ export const roadmap = [
phase: 'Phase 1', phase: 'Phase 1',
title: 'Operate & prove the model', title: 'Operate & prove the model',
when: '~012 mo', when: '~012 mo',
body: 'Run memberships, events and tenants in Austin; validate the P&L publicly on the Archipelago stack.', body: 'Run memberships, events and tenants in Austin; validate the P&L publicly on the Lab 484 stack.',
}, },
{ {
phase: 'Phase 2', phase: 'Phase 2',

View file

@ -53,7 +53,7 @@ const shares = investorAsk.scenarios.map((s) => ({ equity: s, annual: Math.round
</div> </div>
<p class="mt-9 max-w-xl text-sm text-fg-muted"> <p class="mt-9 max-w-xl text-sm text-fg-muted">
Prove the model in Austin, then replicate it on Archipelago the festival and the farm are next. Prove the model in Austin, then replicate it on Lab 484 the festival and the farm are next.
</p> </p>
</SlideFrame> </SlideFrame>
</template> </template>

View file

@ -3,14 +3,14 @@ import SlideFrame from '../components/SlideFrame.vue'
import Icon from '../components/Icon.vue' import Icon from '../components/Icon.vue'
import { surfaceEntities, entityById, accentText, accentRing } from '../data' import { surfaceEntities, entityById, accentText, accentRing } from '../data'
const archipelago = entityById('archipelago') const backbone = entityById('lab484')
</script> </script>
<template> <template>
<SlideFrame <SlideFrame
kicker="The collaboration" kicker="The collaboration"
title="Three experiences, one backbone" title="Three experiences, one backbone"
subtitle="One is funded and opening now — SolLunar Society in Austin. The festival and the farm follow, on the same Archipelago stack." subtitle="One is funded and opening now — SolLunar Society in Austin. The festival and the farm follow, on the same Lab 484 stack."
> >
<div class="grid gap-5 md:grid-cols-3"> <div class="grid gap-5 md:grid-cols-3">
<div <div
@ -45,18 +45,18 @@ const archipelago = entityById('archipelago')
</div> </div>
<!-- the shared backbone beneath all three --> <!-- the shared backbone beneath all three -->
<div class="mt-5 flex items-center gap-4 rounded-2xl border p-5" :class="accentRing[archipelago.accent]"> <div class="mt-5 flex items-center gap-4 rounded-2xl border p-5" :class="accentRing[backbone.accent]">
<span class="grid size-11 shrink-0 place-items-center rounded-xl bg-surface-2" :class="accentText[archipelago.accent]"> <span class="grid size-11 shrink-0 place-items-center rounded-xl bg-surface-2" :class="accentText[backbone.accent]">
<Icon :name="archipelago.icon" class="size-6" /> <Icon :name="backbone.icon" class="size-6" />
</span> </span>
<div class="min-w-0 flex-1"> <div class="min-w-0 flex-1">
<h3 class="font-display text-lg font-semibold text-fg"> <h3 class="font-display text-lg font-semibold text-fg">
{{ archipelago.name }} {{ backbone.name }}
<span class="ml-1 text-xs font-normal uppercase tracking-wider" :class="accentText[archipelago.accent]"> <span class="ml-1 text-xs font-normal uppercase tracking-wider" :class="accentText[backbone.accent]">
· {{ archipelago.role }} · {{ backbone.role }}
</span> </span>
</h3> </h3>
<p class="text-sm text-fg-muted">{{ archipelago.blurb }}</p> <p class="text-sm text-fg-muted">{{ backbone.blurb }}</p>
</div> </div>
</div> </div>
</SlideFrame> </SlideFrame>

View file

@ -34,7 +34,7 @@ const icons = ['Building2', 'BedDouble', 'Cpu']
</div> </div>
<p class="mt-6 text-sm text-fg-muted"> <p class="mt-6 text-sm text-fg-muted">
The Yellow House data center makes SolLunar self-hosting the Archipelago stack runs on-site, The Yellow House data center makes SolLunar self-hosting the Lab 484 stack runs on-site,
not in someone else's cloud. not in someone else's cloud.
</p> </p>
</SlideFrame> </SlideFrame>

View file

@ -6,9 +6,9 @@ import { tech } from '../data'
<template> <template>
<SlideFrame <SlideFrame
kicker="Archipelago · the shared backbone" kicker="Lab 484 · the shared backbone"
title="Open hardware, sovereign software" title="Open hardware, sovereign software"
subtitle="Archipelago is the stack under every entity — owned by the network, documented to be rebuilt anywhere. Build it once; every place plugs in." subtitle="Lab 484 is the stack under every entity — owned by the network, documented to be rebuilt anywhere. Build it once; every place plugs in."
> >
<div class="grid gap-4 sm:grid-cols-2 lg:grid-cols-3"> <div class="grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
<div <div

View file

@ -143,7 +143,7 @@
} }
/* /*
ARCHIPELAGO pitch-deck brand palette. Numbered accent scales are LAB 484 pitch-deck brand palette. Numbered accent scales are
static SOLID fills (bars, dots, tinted panels) that read on both static SOLID fills (bars, dots, tinted panels) that read on both
light and dark; the flipping `--color-{accent}` above is for TEXT. light and dark; the flipping `--color-{accent}` above is for TEXT.
*/ */