feat(deck): add central content/data model

Single source of truth for the pitch: brand, cost categories + line
items, angel & contributor tiers, revenue streams, locations, roadmap.
All figures are clearly-marked placeholders to swap for real numbers.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Patrick Mulligan 2026-07-28 18:20:59 +02:00
commit e73072318c

304
src/deck/data.ts Normal file
View file

@ -0,0 +1,304 @@
/**
* ARCHIPELAGO pitch deck content & figures.
*
* EVERYTHING IN THIS FILE IS A PLACEHOLDER.
* This is the single source of truth for the deck. To turn the deck into
* the real pitch, edit values here no slide component hard-codes a number,
* a tier price, or a location name. Search for `PLACEHOLDER` to find every
* spot that needs your real data.
*
* Currency: all figures are USD unless noted.
*/
export const PLACEHOLDER = true
export const brand = {
name: 'ARCHIPELAGO',
fullName: 'The Archipelago Network',
// archipelago = islands that look separate above the water but are joined
// beneath it — the network of self-sustaining locations, connected below.
tagline: 'A replicable network of decentralized, self-sustaining locations.',
subtagline:
'Two proof-of-concept launches. Open hardware, sovereign software, real revenue — a blueprint anyone can deploy anywhere.',
contactEmail: 'invest@archipelago.example', // PLACEHOLDER
// Seam for later: an LNbits instance + the founder's nostr npub power the
// "contribute" tiers. Left null until wired (see src/features/{lnbits,nostr}).
lnbitsBaseUrl: null as string | null,
nostrNpub: null as string | null,
}
/** Big-picture framing for the vision slide. */
export const problem = {
headline: 'Connectivity, community, and ownership are centralizing.',
points: [
'Networks, payments, and platforms are owned by a handful of gatekeepers.',
'Local communities host the value but capture almost none of it.',
'Every "smart" venue you can name is a walled garden that rents you access.',
],
thesis:
'We build physical nodes that own their own network, payments, and data — and prove they can pay for themselves.',
}
/** The technology stack shown on the Tech slide. */
export const tech = [
{
title: 'Decentralized mesh network',
body: 'Community-owned routers and mesh kits blanket each location — connectivity that no single provider can switch off.',
icon: 'Wifi',
},
{
title: 'Open hardware',
body: 'Servers, routers, exchange kiosks and NFC hardware from a documented, replicable bill of materials.',
icon: 'Cpu',
},
{
title: 'Sovereign software',
body: 'Self-hosted services on a stack you control — no platform lock-in, forkable by any future node.',
icon: 'Code',
},
{
title: 'Bitcoin & Lightning payments',
body: 'Instant, low-fee settlement at kiosks and NFC points. Value stays in the network, not the middleman.',
icon: 'Zap',
},
{
title: 'Nostr identity & comms',
body: 'Portable identity, messaging and social layer that travels with members across every node.',
icon: 'KeyRound',
},
{
title: 'Replicable blueprint',
body: 'Every node ships its own build docs. Proven once, the whole stack redeploys anywhere in the world.',
icon: 'Globe',
},
]
export type Location = {
id: string
name: string
kind: string
blurb: string
highlights: string[]
spaces: string[]
icon: string
}
/** The two proof-of-concept launches. PLACEHOLDER names & details. */
export const locations: Record<'city' | 'farm', Location> = {
city: {
id: 'city',
name: 'Isla Ciudad', // PLACEHOLDER — real city-node name
kind: 'Urban node · event space',
blurb:
'A downtown flagship: co-working, exchange kiosk, and a public-facing event venue that puts the technology in front of thousands.',
highlights: [
'High-footfall demonstration of the full stack',
'Exchange kiosk + NFC payments live to the public',
'Anchors the networks brand and partnerships',
],
spaces: ['Event hall', 'Co-working floor', 'Exchange kiosk', 'Café & bar', 'Studio / podcast room'],
icon: 'Building2',
},
farm: {
id: 'farm',
name: 'Isla Granja', // PLACEHOLDER — real farm-node name
kind: 'Rural node · regenerative farm',
blurb:
'An off-grid regenerative farm: retreats, artist & developer residencies, and the networks living lab — home to the alpacas.',
highlights: [
'Off-grid power + mesh proves the stack anywhere',
'Retreats & residencies generate premium revenue',
'Sponsor-an-alpaca connects small backers to the land',
],
spaces: ['Retreat lodging', 'Residency studios', 'Event barn', 'Alpaca paddocks', 'Regenerative gardens'],
icon: 'Trees',
},
}
/** Revenue streams the operational event spaces generate. */
export const revenueStreams = [
{ title: 'Room & lodging rentals', note: 'Nightly stays across both nodes', icon: 'BedDouble' },
{ title: 'Experiences & workshops', note: 'Ticketed classes, tastings, tours', icon: 'Sparkles' },
{ title: 'Retreats', note: 'Multi-day hosted programs', icon: 'Mountain' },
{ title: 'Artist & developer residencies', note: 'Paid & sponsored residencies', icon: 'Palette' },
{ title: 'Event & venue hire', note: 'Weddings, launches, conferences', icon: 'PartyPopper' },
{ title: 'Network services', note: 'Connectivity, payments, kiosk fees', icon: 'Router' },
]
export type CostItem = { label: string; amount: number; note?: string }
export type CostCategory = {
id: string
title: string
subtitle: string
icon: string
items: CostItem[]
}
/**
* The three investment cost categories. PLACEHOLDER amounts (USD).
* `total` is derived from items() below edit line items, not totals.
*/
export const costCategories: CostCategory[] = [
{
id: 'core',
title: 'Base hardware & development',
subtitle: 'Servers, routers, exchange kiosks, NFC hardware + core dev salaries',
icon: 'Cpu',
items: [
{ label: 'Edge servers & compute', amount: 60_000 },
{ label: 'Mesh routers & networking', amount: 45_000 },
{ label: 'Exchange kiosks', amount: 50_000, note: '2 units' },
{ label: 'NFC hardware & POS', amount: 25_000 },
{ label: 'Core development salaries', amount: 300_000, note: '4 engineers · 12 mo' },
],
},
{
id: 'city',
title: 'City location build',
subtitle: 'Fit-out & launch of the urban event node',
icon: 'Building2',
items: [
{ label: 'Lease deposit & permits', amount: 60_000 },
{ label: 'Renovation & fit-out', amount: 260_000 },
{ label: 'AV, furniture & kitchen', amount: 120_000 },
{ label: 'On-site network install', amount: 40_000 },
{ label: 'Launch & working capital', amount: 40_000 },
],
},
{
id: 'farm',
title: 'Farm location build',
subtitle: 'Land, structures & off-grid infrastructure for the rural node',
icon: 'Trees',
items: [
{ label: 'Land improvements & access', amount: 90_000 },
{ label: 'Lodging & studio structures', amount: 300_000 },
{ label: 'Off-grid power & water', amount: 110_000 },
{ label: 'Alpacas & farm infrastructure', amount: 70_000 },
{ label: 'On-site mesh & launch', amount: 60_000 },
],
},
]
export const categoryTotal = (c: CostCategory) => c.items.reduce((s, i) => s + i.amount, 0)
export const raiseTotal = costCategories.reduce((s, c) => s + categoryTotal(c), 0)
export type AngelTier = {
name: string
minAmount: number
equity: string
benefits: string[]
featured?: boolean
}
/** Angel investment — equity + benefits. PLACEHOLDER terms. */
export const angelTiers: AngelTier[] = [
{
name: 'Seed Angel',
minAmount: 50_000,
equity: 'Equity from a common SAFE',
benefits: [
'Pro-rata equity in the network',
'Founding-member access to both nodes',
'Quarterly investor updates',
],
},
{
name: 'Network Angel',
minAmount: 100_000,
equity: 'Priced equity + pro-rata rights',
featured: true,
benefits: [
'Everything in Seed, plus:',
'Advisory input on network direction',
'Complimentary retreat & residency weeks',
'Named node sponsor',
],
},
{
name: 'Founding Angel',
minAmount: 250_000,
equity: 'Priced equity + board observer seat',
benefits: [
'Everything in Network, plus:',
'Board observer seat',
'Naming rights on a flagship space',
'Lifetime network membership',
],
},
]
export type ContributorTier = {
name: string
amount: number
unit?: string
blurb: string
icon: string
featured?: boolean
}
/** Smaller backers — perks, not equity. PLACEHOLDER prices. */
export const contributorTiers: ContributorTier[] = [
{
name: 'Backer',
amount: 25,
blurb: 'Fund a member NFC card and get your name on the founders wall.',
icon: 'CreditCard',
},
{
name: 'Node Router',
amount: 150,
blurb: 'Put a community-owned router on the mesh. Adopt-a-node on the live map.',
icon: 'Router',
},
{
name: 'Mesh Kit',
amount: 250,
blurb: 'Sponsor a full mesh kit that extends coverage across a location.',
icon: 'Wifi',
featured: true,
},
{
name: 'Sponsor an Alpaca',
amount: 500,
unit: '/yr',
blurb: 'Name & sponsor an alpaca at the farm. Photos, updates, and a visit.',
icon: 'Origami',
},
]
/** Roadmap / replication story. */
export const roadmap = [
{
phase: 'Phase 0',
title: 'Raise & finalize',
when: 'Now',
body: 'Close the angel round, lock sites, finalize the open bill of materials.',
},
{
phase: 'Phase 1',
title: 'Build the two nodes',
when: '~69 mo',
body: 'Fit out the city node and the farm node in parallel; deploy the full stack.',
},
{
phase: 'Phase 2',
title: 'Operate & prove revenue',
when: '~918 mo',
body: 'Run events, retreats and residencies; validate the unit economics publicly.',
},
{
phase: 'Phase 3',
title: 'Open the blueprint',
when: '18 mo+',
body: 'Publish the replication kit; onboard new nodes worldwide on shared infrastructure.',
},
]
/** Formatting helpers used across slides. */
export const fmtUsd = (n: number) =>
n >= 1000
? `$${(n / 1000).toLocaleString('en-US', { maximumFractionDigits: n % 1000 === 0 ? 0 : 1 })}k`
: `$${n.toLocaleString('en-US')}`
export const fmtUsdFull = (n: number) => `$${n.toLocaleString('en-US')}`