refactor(deck): 4-entity model — Archipelago backbone + 3 experiences

Restructure per the new framing: Archipelago is the shared backbone (the
core stack / mycelium), with three experiences on top — SolLunar Punk
Society (city), Pop-up Festivals (travelling; e.g. Solar Punk Summit) and
Chateau du Faune (farm). Adds a 'layer' field + surfaceEntities helper, a
'rose' accent, an 'example' field, remaps the four cost categories 1:1 to
the entities, and sets the umbrella/brand to Archipelago.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Patrick Mulligan 2026-07-31 18:06:44 +02:00
commit 002c121e83
3 changed files with 84 additions and 67 deletions

View file

@ -1,5 +1,5 @@
/** /**
* SOLLUNAR PUNK SOCIETY pitch deck content & figures. * ARCHIPELAGO pitch deck content & figures.
* *
* EVERYTHING IN THIS FILE IS A PLACEHOLDER. * EVERYTHING IN THIS FILE IS A PLACEHOLDER.
* This is the single source of truth for the deck. To turn the deck into * This is the single source of truth for the deck. To turn the deck into
@ -7,11 +7,12 @@
* a tier price, or an entity name. Search for `PLACEHOLDER` for every spot * a tier price, or an entity name. Search for `PLACEHOLDER` for every spot
* that needs your real data. * that needs your real data.
* *
* The pitch is a collaboration between three entities, all running the same * Archipelago is the shared backbone open hardware + sovereign software (the
* core stack + user ecosystem so members get the full experience anywhere: * "mycelium"). Three surface entities run on top of it and share the full core
* Archipelago hardware/software city center (the tech backbone) * stack, so members get the same experience anywhere:
* SolLunar Society pop-up festivals (the ephemeral, travelling node) * SolLunar Punk Society city center (members' hub, built on Archipelago)
* Chateau du Faune regenerative farm center (the rural node) * Pop-up Festivals travelling gatherings (e.g. Solar Punk Summit)
* Chateau du Faune regenerative farm center
* *
* Currency: all figures are USD unless noted. * Currency: all figures are USD unless noted.
*/ */
@ -19,13 +20,13 @@
export const PLACEHOLDER = true export const PLACEHOLDER = true
export const brand = { export const brand = {
name: 'SolLunar Punk Society', name: 'Archipelago',
short: 'SolLunar Punk', short: 'Archipelago',
// solarpunk by day, lunarpunk by night — sovereign tech, regenerative culture. // a connected network of islands — one backbone, many places.
tagline: 'One sovereign network. Three ways to experience it.', tagline: 'One network. Three ways to experience it.',
subtagline: subtagline:
'A collaboration between Archipelago, SolLunar Society and Chateau du Faune — every location runs the full core stack, so the membership, the payments and the experience travel with you.', 'A collaboration between SolLunar Punk Society, Pop-up Festivals and Chateau du Faune — all running on Archipelago, the shared backbone, so the membership, the payments and the experience travel with you.',
contactEmail: 'invest@sollunarpunk.example', // PLACEHOLDER contactEmail: 'invest@archipelago.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
// "contribute" tiers. Left null until wired (see src/features/{lnbits,nostr}). // "contribute" tiers. Left null until wired (see src/features/{lnbits,nostr}).
lnbitsBaseUrl: null as string | null, lnbitsBaseUrl: null as string | null,
@ -41,10 +42,10 @@ export const problem = {
'Every "smart" venue you can name is a walled garden that rents you access.', 'Every "smart" venue you can name is a walled garden that rents you access.',
], ],
thesis: thesis:
'We build sovereign places that own their network, payments and data — a city hub, a travelling festival, and a farm — all on one shared stack, each proving it can pay for itself.', 'We build sovereign places that own their network, payments and data — a city hub, a travelling festival, and a farm — all on one shared backbone, each proving it can pay for itself.',
} }
export type Accent = 'pine' | 'indigo' | 'clay' export type Accent = 'pine' | 'indigo' | 'rose' | 'clay'
export type Entity = { export type Entity = {
id: string id: string
@ -52,6 +53,8 @@ export type Entity = {
role: string // short label, e.g. "City center" role: string // short label, e.g. "City center"
kind: string kind: string
accent: Accent accent: Accent
layer: 'backbone' | 'surface'
example?: string // for the generic festival entity
blurb: string blurb: string
traits: string[] // what makes THIS entity unique traits: string[] // what makes THIS entity unique
spaces: string[] spaces: string[]
@ -59,33 +62,39 @@ export type Entity = {
icon: string icon: string
} }
/** The three collaborating entities. PLACEHOLDER names & details. */ /**
* The entities. Archipelago is the backbone; the other three are the
* experiences that run on it. PLACEHOLDER names & details.
*/
export const entities: Entity[] = [ export const entities: Entity[] = [
{ {
id: 'archipelago', id: 'sollunar',
name: 'Archipelago', name: 'SolLunar Punk Society',
role: 'City center', role: 'City center',
kind: 'Hardware & software hub · urban event space', kind: 'Members hub · city',
accent: 'pine', accent: 'indigo',
layer: 'surface',
blurb: blurb:
'The tech backbone of the collaboration: a downtown flagship where the stack is built, demonstrated and run in front of thousands.', 'The permanent city home: a members society and event space, built on Archipelagos stack, where the community and the technology live year-round.',
traits: [ traits: [
'Builds & maintains the core stack every node runs', 'The permanent, city-based flagship',
'High-footfall public demonstration of the technology', 'Runs on Archipelago tech — public demonstration of the stack',
'Anchors partnerships, brand and the developer community', 'Anchors membership, partnerships and the developer community',
], ],
spaces: ['Event hall', 'Co-working floor', 'Exchange kiosk', 'Café & bar', 'Studio / lab'], spaces: ['Event hall', 'Co-working floor', 'Exchange kiosk', 'Café & bar', 'Studio / lab'],
revenue: ['Venue & desk hire', 'Events & workshops', 'Network & kiosk fees'], revenue: ['Membership', 'Venue & desk hire', 'Events & workshops'],
icon: 'Building2', icon: 'Building2',
}, },
{ {
id: 'solunar', id: 'festivals',
name: 'SolLunar Society', name: 'Pop-up Festivals',
role: 'Pop-up festivals', role: 'Travelling gatherings',
kind: 'Travelling · ephemeral gatherings', kind: 'Travelling · ephemeral',
accent: 'indigo', accent: 'rose',
layer: 'surface',
example: 'Solar Punk Summit',
blurb: blurb:
'The travelling node: solarpunk-by-day, lunarpunk-by-night festivals that deploy the entire stack anywhere for days at a time, then vanish.', 'The travelling node: a repeatable festival format — like Solar Punk Summit — that deploys the entire stack anywhere for a few days, then packs down and moves on.',
traits: [ traits: [
'Deploys the full stack from a mobile kit — anywhere', 'Deploys the full stack from a mobile kit — anywhere',
'Proves the network is portable, not tied to a building', 'Proves the network is portable, not tied to a building',
@ -101,6 +110,7 @@ export const entities: Entity[] = [
role: 'Farm center', role: 'Farm center',
kind: 'Off-grid · regenerative farm', kind: 'Off-grid · regenerative farm',
accent: 'clay', accent: 'clay',
layer: 'surface',
blurb: blurb:
'The rural node: an off-grid regenerative farm hosting retreats, artist & developer residencies, and the networks living lab — home to the alpacas.', 'The rural node: an off-grid regenerative farm hosting retreats, artist & developer residencies, and the networks living lab — home to the alpacas.',
traits: [ traits: [
@ -112,9 +122,29 @@ export const entities: Entity[] = [
revenue: ['Lodging & retreats', 'Residencies', 'Experiences & venue hire'], revenue: ['Lodging & retreats', 'Residencies', 'Experiences & venue hire'],
icon: 'Trees', icon: 'Trees',
}, },
{
id: 'archipelago',
name: 'Archipelago',
role: 'Shared backbone',
kind: 'Open hardware & sovereign software',
accent: 'pine',
layer: 'backbone',
blurb:
'The invisible foundation every entity runs on: open hardware and self-hosted software — the mycelium beneath the whole network. Build it once, and every place plugs in.',
traits: [
'Powers all three entities from one shared stack',
'Open bill of materials — replicable anywhere',
'Forkable and sovereign — no platform lock-in',
],
spaces: ['Edge servers', 'Mesh routers', 'Exchange kiosks', 'NFC / membership', 'Self-hosted apps'],
revenue: ['Network & kiosk fees', 'Payment fees', 'Replication licensing'],
icon: 'Cpu',
},
] ]
export const entityById = (id: string) => entities.find((e) => e.id === id)! export const entityById = (id: string) => entities.find((e) => e.id === id)!
/** The three experiences (everything except the backbone). */
export const surfaceEntities = entities.filter((e) => e.layer === 'surface')
/** /**
* The user ecosystem every location shares the "full experience regardless * The user ecosystem every location shares the "full experience regardless
@ -123,7 +153,7 @@ export const entityById = (id: string) => entities.find((e) => e.id === id)!
export const userEcosystem = [ export const userEcosystem = [
{ {
title: 'One membership card', title: 'One membership card',
body: 'A single NFC card is your identity, access and wallet at every node — city, festival or farm.', body: 'A single NFC card is your identity, access and wallet everywhere — the society, a festival, the farm.',
icon: 'CreditCard', icon: 'CreditCard',
}, },
{ {
@ -137,7 +167,7 @@ export const userEcosystem = [
icon: 'Zap', icon: 'Zap',
}, },
{ {
title: 'The SolLunar app', title: 'The Archipelago 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',
}, },
@ -153,7 +183,7 @@ export const userEcosystem = [
}, },
] ]
/** The underlying technology / core stack (the infrastructure pillars). */ /** The Archipelago backbone / core stack (the infrastructure pillars). */
export const tech = [ export const tech = [
{ {
title: 'Decentralized mesh network', title: 'Decentralized mesh network',
@ -189,11 +219,11 @@ export const tech = [
/** Revenue streams across the collaboration. */ /** Revenue streams across the collaboration. */
export const revenueStreams = [ export const revenueStreams = [
{ title: 'Tickets & festivals', note: 'SolLunar Society gatherings', icon: 'Ticket' }, { title: 'Tickets & festivals', note: 'Pop-up festival gatherings', icon: 'Ticket' },
{ title: 'Room & lodging rentals', note: 'City & farm stays', icon: 'BedDouble' }, { title: 'Room & lodging rentals', note: 'City & farm stays', icon: 'BedDouble' },
{ title: 'Retreats & residencies', note: 'Hosted programs at the farm', icon: 'Mountain' }, { title: 'Retreats & residencies', note: 'Hosted programs at the farm', icon: 'Mountain' },
{ title: 'Experiences & workshops', note: 'Classes, tastings, tours', icon: 'Palette' }, { title: 'Experiences & workshops', note: 'Classes, tastings, tours', icon: 'Palette' },
{ title: 'Venue & event hire', note: 'Weddings, launches, conferences', icon: 'PartyPopper' }, { title: 'Membership & venue hire', note: 'Society dues, event bookings', icon: 'PartyPopper' },
{ title: 'Network services', note: 'Connectivity, kiosk & payment fees', icon: 'Router' }, { title: 'Network services', note: 'Connectivity, kiosk & payment fees', icon: 'Router' },
] ]
@ -203,21 +233,21 @@ export type CostCategory = {
title: string title: string
subtitle: string subtitle: string
icon: string icon: string
accent: Accent | 'amber' accent: Accent
items: CostItem[] items: CostItem[]
} }
/** /**
* Investment cost categories. PLACEHOLDER amounts (USD). * Investment cost categories one per entity. PLACEHOLDER amounts (USD).
* One shared core stack + one build per entity. * The shared Archipelago backbone plus a launch for each experience.
*/ */
export const costCategories: CostCategory[] = [ export const costCategories: CostCategory[] = [
{ {
id: 'core', id: 'archipelago',
title: 'Shared core stack & development', title: 'Archipelago · shared backbone',
subtitle: 'Servers, routers, kiosks, NFC + core dev salaries — powers all three', subtitle: 'Servers, routers, exchange kiosks, NFC + core dev — powers all three',
icon: 'Cpu', icon: 'Cpu',
accent: 'amber', accent: 'pine',
items: [ items: [
{ label: 'Edge servers & compute', amount: 60_000 }, { label: 'Edge servers & compute', amount: 60_000 },
{ label: 'Mesh routers & networking', amount: 45_000 }, { label: 'Mesh routers & networking', amount: 45_000 },
@ -227,11 +257,11 @@ export const costCategories: CostCategory[] = [
], ],
}, },
{ {
id: 'archipelago', id: 'sollunar',
title: 'Archipelago · city center', title: 'SolLunar Punk Society · city',
subtitle: 'Fit-out & launch of the urban hub', subtitle: 'Fit-out & launch of the urban members hub',
icon: 'Building2', icon: 'Building2',
accent: 'pine', accent: 'indigo',
items: [ items: [
{ label: 'Lease deposit & permits', amount: 60_000 }, { label: 'Lease deposit & permits', amount: 60_000 },
{ label: 'Renovation & fit-out', amount: 260_000 }, { label: 'Renovation & fit-out', amount: 260_000 },
@ -241,11 +271,11 @@ export const costCategories: CostCategory[] = [
], ],
}, },
{ {
id: 'solunar', id: 'festivals',
title: 'SolLunar Society · festivals', title: 'Pop-up Festivals',
subtitle: 'Mobile deployment kit + first-season production', subtitle: 'Mobile deployment kit + first-season production',
icon: 'Tent', icon: 'Tent',
accent: 'indigo', accent: 'rose',
items: [ items: [
{ label: 'Mobile mesh & power rig', amount: 60_000 }, { label: 'Mobile mesh & power rig', amount: 60_000 },
{ label: 'Mobile exchange kiosk & POS', amount: 45_000 }, { label: 'Mobile exchange kiosk & POS', amount: 45_000 },
@ -255,7 +285,7 @@ export const costCategories: CostCategory[] = [
}, },
{ {
id: 'chateau', id: 'chateau',
title: 'Chateau du Faune · farm center', title: 'Chateau du Faune · farm',
subtitle: 'Land, structures & off-grid infrastructure', subtitle: 'Land, structures & off-grid infrastructure',
icon: 'Trees', icon: 'Trees',
accent: 'clay', accent: 'clay',
@ -368,7 +398,7 @@ export const roadmap = [
phase: 'Phase 1', phase: 'Phase 1',
title: 'Launch the three entities', title: 'Launch the three entities',
when: '~69 mo', when: '~69 mo',
body: 'Fit out Archipelago and Chateau du Faune; stage the first SolLunar festival.', body: 'Open the SolLunar Punk Society city hub and Chateau du Faune; stage the first pop-up festival.',
}, },
{ {
phase: 'Phase 2', phase: 'Phase 2',
@ -399,15 +429,18 @@ export const fmtUsdFull = (n: number) => `$${n.toLocaleString('en-US')}`
export const accentText: Record<Accent, string> = { export const accentText: Record<Accent, string> = {
pine: 'text-pine-300', pine: 'text-pine-300',
indigo: 'text-indigo-300', indigo: 'text-indigo-300',
rose: 'text-rose-300',
clay: 'text-clay-400', clay: 'text-clay-400',
} }
export const accentDot: Record<Accent, string> = { export const accentDot: Record<Accent, string> = {
pine: 'bg-pine-400', pine: 'bg-pine-400',
indigo: 'bg-indigo-400', indigo: 'bg-indigo-400',
rose: 'bg-rose-400',
clay: 'bg-clay-400', clay: 'bg-clay-400',
} }
export const accentRing: Record<Accent, string> = { export const accentRing: Record<Accent, string> = {
pine: 'border-pine-500/30 bg-pine-500/5', pine: 'border-pine-500/30 bg-pine-500/5',
indigo: 'border-indigo-500/30 bg-indigo-500/5', indigo: 'border-indigo-500/30 bg-indigo-500/5',
rose: 'border-rose-500/30 bg-rose-500/5',
clay: 'border-clay-400/30 bg-clay-400/5', clay: 'border-clay-400/30 bg-clay-400/5',
} }

View file

@ -1,8 +0,0 @@
<script setup lang="ts">
import EntityDetail from '../components/EntityDetail.vue'
import { entityById } from '../data'
</script>
<template>
<EntityDetail :entity="entityById('archipelago')" />
</template>

View file

@ -1,8 +0,0 @@
<script setup lang="ts">
import EntityDetail from '../components/EntityDetail.vue'
import { entityById } from '../data'
</script>
<template>
<EntityDetail :entity="entityById('solunar')" />
</template>