diff --git a/src/deck/Deck.vue b/src/deck/Deck.vue index 1906196..bd36b45 100644 --- a/src/deck/Deck.vue +++ b/src/deck/Deck.vue @@ -10,15 +10,13 @@ import NetworkSlide from './slides/NetworkSlide.vue' import TechSlide from './slides/TechSlide.vue' import EntitiesSlide from './slides/EntitiesSlide.vue' import SolLunarSlide from './slides/SolLunarSlide.vue' -import FestivalsSlide from './slides/FestivalsSlide.vue' -import ChateauSlide from './slides/ChateauSlide.vue' +import PartnershipSlide from './slides/PartnershipSlide.vue' +import TenantsSlide from './slides/TenantsSlide.vue' +import MembershipSlide from './slides/MembershipSlide.vue' +import SpacesSlide from './slides/SpacesSlide.vue' import GallerySlide from './slides/GallerySlide.vue' import EcosystemSlide from './slides/EcosystemSlide.vue' -import RevenueSlide from './slides/RevenueSlide.vue' -import InvestmentOverviewSlide from './slides/InvestmentOverviewSlide.vue' -import CostBreakdownSlide from './slides/CostBreakdownSlide.vue' -import AngelSlide from './slides/AngelSlide.vue' -import ContributorSlide from './slides/ContributorSlide.vue' +import PnlSlide from './slides/PnlSlide.vue' import RoadmapSlide from './slides/RoadmapSlide.vue' import AskSlide from './slides/AskSlide.vue' @@ -28,16 +26,14 @@ const slides = [ { id: 'network', label: 'The network', component: NetworkSlide }, { id: 'archipelago', label: 'Archipelago', component: TechSlide }, { id: 'entities', label: 'Three experiences', component: EntitiesSlide }, - { id: 'sollunar', label: 'SolLunar Punk Society', component: SolLunarSlide }, - { id: 'festivals', label: 'Pop-up Festivals', component: FestivalsSlide }, - { id: 'chateau', label: 'Chateau du Faune', component: ChateauSlide }, + { id: 'sollunar', label: 'SolLunar Society', component: SolLunarSlide }, + { id: 'partnership', label: 'Ownership', component: PartnershipSlide }, + { id: 'tenants', label: 'Tenants', component: TenantsSlide }, + { id: 'membership', label: 'Memberships', component: MembershipSlide }, + { id: 'spaces', label: 'The building', component: SpacesSlide }, { id: 'gallery', label: 'Gallery', component: GallerySlide }, { id: 'ecosystem', label: 'One membership', component: EcosystemSlide }, - { id: 'revenue', label: 'Revenue', component: RevenueSlide }, - { id: 'invest-overview', label: 'The raise', component: InvestmentOverviewSlide }, - { id: 'cost-breakdown', label: 'Cost breakdown', component: CostBreakdownSlide }, - { id: 'angel', label: 'Angel investment', component: AngelSlide }, - { id: 'contribute', label: 'Contribute', component: ContributorSlide }, + { id: 'pnl', label: 'The numbers', component: PnlSlide }, { id: 'roadmap', label: 'Roadmap', component: RoadmapSlide }, { id: 'ask', label: 'The ask', component: AskSlide }, ] diff --git a/src/deck/data.ts b/src/deck/data.ts index 95ef3c7..24c3645 100644 --- a/src/deck/data.ts +++ b/src/deck/data.ts @@ -1,18 +1,19 @@ /** * 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 an entity name. Search for `PLACEHOLDER` for every spot - * that needs your real data. + * 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 first node — SolLunar Society (Austin). Archipelago (Lab 484), Pop-up + * 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 + * own summary totals didn't reconcile (kept in `pnlDocSummary`). * * Archipelago is the shared backbone — open hardware + sovereign software (the - * "mycelium"). Three surface entities run on top of it and share the full core - * stack, so members get the same experience anywhere: - * • SolLunar Punk Society — city center (members' hub, built on Archipelago) - * • Pop-up Festivals — travelling gatherings (e.g. Solar Punk Summit) - * • Chateau du Faune — regenerative farm center + * "mycelium"). Three surface entities run on top of it: + * • SolLunar Society — city members' club, Austin (the funded first node) + * • Pop-up Festivals — travelling gatherings (e.g. Solarpunk Summit) + * • Chateau du Faune — regenerative farm center * * Currency: all figures are USD unless noted. */ @@ -25,24 +26,25 @@ export const brand = { // a connected network of islands — one backbone, many places. tagline: 'One network. Three ways to experience it.', subtagline: - '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@archipelago.example', // PLACEHOLDER + '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.', + firstNode: 'SolLunar Society · Austin, TX', + contactEmail: 'invest@sollunar.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. */ +/** Big-picture framing for the vision slide (from the SolLunar Society plan). */ export const problem = { - headline: 'Connectivity, community, and ownership are centralizing.', + headline: 'Transformation fades without the infrastructure to sustain it.', 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.', + 'People leave transformational events inspired — then return to environments that don’t support the change.', + 'There’s no lasting home for sovereignty-minded community: dreamers, creatives, technologists, regenerative living.', + 'Peak experiences don’t compound without ongoing relationships, education, and a place to practice.', ], 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 backbone, each proving it can pay for itself.', + 'SolLunar Society is the missing infrastructure — a community hub where the work begun at transformational events continues through membership, tenants, events and regenerative living.', } export type Accent = 'pine' | 'indigo' | 'rose' | 'clay' @@ -69,20 +71,20 @@ export type Entity = { export const entities: Entity[] = [ { id: 'sollunar', - name: 'SolLunar Punk Society', - role: 'City center', - kind: 'Members’ hub · city', + name: 'SolLunar Society', + role: 'City center · the first node', + kind: 'Members’ club & community hub · Austin, TX', accent: 'indigo', layer: 'surface', blurb: - 'The permanent city home: a members’ society and event space, built on Archipelago’s stack, where the community and the technology live year-round.', + 'The first node and the one we’re 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.', traits: [ - 'The permanent, city-based flagship', - 'Runs on Archipelago tech — public demonstration of the stack', - 'Anchors membership, partnerships and the developer community', + 'Live, financially-modeled first node (real P&L)', + 'Five founding tenants + a three-tier membership', + 'Bitcoin ATM, vending & the full member ecosystem on site', ], - spaces: ['Event hall', 'Co-working floor', 'Exchange kiosk', 'Café & bar', 'Studio / lab'], - revenue: ['Membership', 'Venue & desk hire', 'Events & workshops'], + spaces: ['Retail space', 'Event space', 'Private lounge', 'Co-working', 'Yellow House hostel & data center'], + revenue: ['Memberships', 'Tenants', 'Events & venue buyouts'], icon: 'Building2', }, { @@ -217,200 +219,282 @@ export const tech = [ }, ] -/** Revenue streams across the collaboration. */ -export const revenueStreams = [ - { title: 'Tickets & festivals', note: 'Pop-up festival gatherings', icon: 'Ticket' }, - { title: 'Room & lodging rentals', note: 'City & farm stays', icon: 'BedDouble' }, - { title: 'Retreats & residencies', note: 'Hosted programs at the farm', icon: 'Mountain' }, - { title: 'Experiences & workshops', note: 'Classes, tastings, tours', icon: 'Palette' }, - { title: 'Membership & venue hire', note: 'Society dues, event bookings', icon: 'PartyPopper' }, - { title: 'Network services', note: 'Connectivity, kiosk & payment fees', icon: 'Router' }, +/* ───────────────────────────────────────────────────────────── + SolLunar Society — the first node's REAL business (from + SolLunarSociety.md). All figures below are SolLunar Society's + only; Archipelago (Lab 484), Festivals and Chateau have no + standalone numbers yet. Lab 484's economics appear here as + revenue lines INTO SolLunar (~$16k/mo) — don't double-count. + ───────────────────────────────────────────────────────────── */ + +/** Ownership & partnership of the SolLunar Society JV. */ +export type Partner = { + name: string + short?: string + equity: number // 0..1 + accent: Accent | 'amber' + role: string + responsibilities: string[] + note?: string +} +export const partnership = { + valuation: 4_000_000, + raiseAmount: 400_000, + equityOffered: 0.1, + partners: [ + { + name: 'SolLunar Punk Society', + short: 'SPS', + equity: 0.45, + accent: 'indigo', + role: 'Space & community', + responsibilities: [ + 'Curate & decorate the space', + 'Lease to tenants · insurance', + 'Outbound payments · SOPs', + 'Marketing & community management', + ], + }, + { + name: 'Lab 484', + equity: 0.45, + accent: 'pine', + role: 'Tech & operations', + responsibilities: [ + 'Operate the spaces & staff', + 'All IT / infrastructure (Archipelago)', + 'Inbound payments · bootcamps', + 'Tenant & investor relations', + ], + note: 'Builds & operates the Archipelago backbone — and is itself a tenant + event driver (~$16k/mo of the revenue below).', + }, + { + name: 'Investors', + equity: 0.1, + accent: 'amber', + role: 'Capital', + responsibilities: ['$400,000 for 10% equity'], + }, + ] as Partner[], +} + +/** The five founding tenants inside SolLunar Society. */ +export const tenants = [ + { + name: 'Lab 484', + icon: 'Cpu', + blurb: + 'Research lab & startup cluster building a “second internet” — Bitcoin, mesh networks, Nostr, e-cash and P2P. User-owned hardware, software and data.', + }, + { + name: 'Solarpunk Summit', + icon: 'Tent', + blurb: + 'Transformational platform & community builder — immersive experiences, educational programming and regenerative culture.', + }, + { + name: 'Noderunners Shop', + icon: 'Router', + blurb: + 'Retail for AI computers, mesh gear, Bitcoin nodes and repair. Open-source, secure laptops, phones and servers.', + }, + { + name: 'Divine Provisions', + icon: 'Coins', + blurb: + 'A food co-op for low-cost, organic, local groceries — offered as a member service at the building entrance.', + }, + { + name: 'Kitchen 484', + icon: 'Sparkles', + blurb: + 'Community food truck — organic, seed-oil-free, locally sourced. Runs even when disconnected from the internet.', + }, ] -export type CostItem = { label: string; amount: number; note?: string } -export type CostCategory = { - id: string - title: string - subtitle: string - icon: string - accent: Accent - items: CostItem[] +/** Membership tiers (customer product / recurring revenue). */ +export type Membership = { + name: string + price: number // monthly + target: number // member-count target + blurb: string + perks: string[] + featured?: boolean } +export const memberships: Membership[] = [ + { + name: 'Solarpunk Society', + price: 50, + target: 150, + blurb: 'Events access.', + perks: ['Member events', 'Amenities, vending & Bitcoin ATM', 'Access to tenants'], + }, + { + name: 'Cypherpunk Commons', + price: 350, + target: 50, + featured: true, + blurb: 'Full access, all locations.', + perks: [ + 'Coworking with the Lab 484 team', + 'All locations · tech support', + 'Bitcoin ATM, vending, coffee & tea', + 'Full tenant & amenity access', + ], + }, + { + name: 'Lunarpunk Locals', + price: 150, + target: 100, + blurb: 'Coworking days.', + perks: ['Coworking days at SolLunar', 'Access to tenants', 'Amenities, vending & Bitcoin ATM'], + }, +] + +/** Comparable Austin memberships, for pricing context. */ +export const membershipComparables = [ + { name: 'Soho House', price: 350 }, + { name: 'Bond Collective', price: 300 }, + { name: 'Bathe', price: 200 }, + { name: 'Stardust Garage', price: 155 }, + { name: 'Submersive', price: 41 }, +] /** - * Investment cost categories — one per entity. PLACEHOLDER amounts (USD). - * The shared Archipelago backbone plus a launch for each experience. + * SolLunar Society monthly P&L. Line items are from the doc; category totals + * are RECOMPUTED from them (the doc's summary totals didn't reconcile — see + * `pnlDocSummary`). Flagged oddity: Lunarpunk Locals income ($1,500) doesn't + * match its "100 × $150" annotation. */ -export const costCategories: CostCategory[] = [ - { - id: 'archipelago', - title: 'Archipelago · shared backbone', - subtitle: 'Servers, routers, exchange kiosks, NFC + core dev — powers all three', - icon: 'Cpu', - accent: 'pine', - 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: 'Membership-card & NFC systems', amount: 25_000 }, - { label: 'Core development salaries', amount: 300_000, note: '4 engineers · 12 mo' }, - ], - }, - { - id: 'sollunar', - title: 'SolLunar Punk Society · city', - subtitle: 'Fit-out & launch of the urban members’ hub', - icon: 'Building2', - accent: 'indigo', - 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: 'festivals', - title: 'Pop-up Festivals', - subtitle: 'Mobile deployment kit + first-season production', - icon: 'Tent', - accent: 'rose', - items: [ - { label: 'Mobile mesh & power rig', amount: 60_000 }, - { label: 'Mobile exchange kiosk & POS', amount: 45_000 }, - { label: 'Stage, structures & staging gear', amount: 70_000 }, - { label: 'First-season production & launch', amount: 45_000 }, - ], - }, - { - id: 'chateau', - title: 'Chateau du Faune · farm', - subtitle: 'Land, structures & off-grid infrastructure', - icon: 'Trees', - accent: 'clay', - 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 across the collaboration. 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 all three entities', - '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', - 'Festival, 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 +export type PnlItem = { label: string; amount: number; note?: string } +export type PnlGroup = { + id: string + title: string icon: string - featured?: boolean + accent: Accent + kind: 'revenue' | 'expense' + items: PnlItem[] } -/** Smaller backers — perks, not equity. PLACEHOLDER prices. */ -export const contributorTiers: ContributorTier[] = [ +export const pnlGroups: PnlGroup[] = [ { - name: 'Backer', - amount: 25, - blurb: 'Fund a member card and get your name on the founders’ wall.', + id: 'memberships', + title: 'Memberships', icon: 'CreditCard', + accent: 'indigo', + kind: 'revenue', + items: [ + { label: 'Cypherpunk Commons', amount: 17_500, note: '50 × $350' }, + { label: 'Solarpunk Society', amount: 7_500, note: '150 × $50' }, + { label: 'Lunarpunk Locals', amount: 1_500, note: '$150/mo · count TBD' }, + { label: 'Vending machine sales', amount: 5_000 }, + { label: 'Promo / B2B network sales', amount: 5_000 }, + ], }, { - name: 'Node Router', - amount: 150, - blurb: 'Put a community-owned router on the mesh. Adopt-a-node on the live map.', - icon: 'Router', + id: 'events', + title: 'Events', + icon: 'PartyPopper', + accent: 'rose', + kind: 'revenue', + items: [ + { label: 'Lab 484 tech events', amount: 8_000 }, + { label: 'Lab 484 bootcamps', amount: 6_000 }, + { label: 'Venue buyouts', amount: 6_400, note: '$400/hr · 4hr min · 4×/mo' }, + { label: 'SolLunar Society events', amount: 1_500, note: '$50 weekend passes' }, + ], }, { - name: 'Mesh Kit', - amount: 250, - blurb: 'Sponsor a full mesh kit that lights up a location — or a festival.', - icon: 'Wifi', - featured: true, + id: 'tenants', + title: 'Tenants', + icon: 'Building2', + accent: 'pine', + kind: 'revenue', + items: [ + { label: 'Solarpunk Summit', amount: 2_000 }, + { label: 'Lab 484', amount: 2_000 }, + { label: 'Divine Provisions', amount: 1_500 }, + { label: 'Noderunners Shop', amount: 1_500 }, + ], }, { - name: 'Sponsor an Alpaca', - amount: 500, - unit: '/yr', - blurb: 'Name & sponsor an alpaca at Chateau du Faune. Photos, updates, and a visit.', - icon: 'Origami', + id: 'expenses', + title: 'Expenses', + icon: 'Coins', + accent: 'clay', + kind: 'expense', + items: [ + { label: 'Staff', amount: 22_500, note: '4 staff' }, + { label: 'Rent', amount: 6_500, note: '$4,500 + triple net' }, + { label: 'Overhead', amount: 3_000 }, + { label: 'Utilities', amount: 2_000, note: 'electric, water, trash' }, + ], }, ] -/** Roadmap / replication story. */ +export const groupTotal = (g: PnlGroup) => g.items.reduce((s, i) => s + i.amount, 0) +const sumKind = (k: 'revenue' | 'expense') => + pnlGroups.filter((g) => g.kind === k).reduce((s, g) => s + groupTotal(g), 0) + +/** Recomputed monthly/yearly economics for SolLunar Society. */ +export const pnl = { + monthlyRevenue: sumKind('revenue'), + monthlyExpenses: sumKind('expense'), + monthlyProfit: sumKind('revenue') - sumKind('expense'), + yearlyProfit: (sumKind('revenue') - sumKind('expense')) * 12, +} +/** What the source doc's summary table stated (did NOT reconcile with line items). */ +export const pnlDocSummary = { revenue: 71_400, expenses: 38_500, profit: 32_900, yearlyProfit: 394_800 } + +/** The building & spaces. */ +export const buildings = [ + { + name: 'SolLunar Society', + rooms: ['Retail space', 'Event space', 'Private office', 'Private lounge'], + }, + { + name: 'Lab 484 · Yellow House 1', + rooms: ['Hostel room · $40/night', 'Healer room', 'Coworking', 'Meeting room', 'Outdoor'], + }, + { + name: 'Lab 484 · Yellow House 2', + rooms: ['VIP guest room', 'Office', 'Data center', 'Outdoor'], + }, +] + +/** The investor ask. */ +export const investorAsk = { + amount: 400_000, + equity: 0.1, + valuation: 4_000_000, + scenarios: [0.1, 0.25], // profit-share scenarios on the recomputed yearly profit +} + +/** Roadmap / replication story. SolLunar Society first, then the network. */ export const roadmap = [ { phase: 'Phase 0', - title: 'Raise & finalize', + title: 'Raise & open SolLunar', when: 'Now', - body: 'Close the angel round, lock sites, finalize the open bill of materials.', + body: 'Close the $400k round, sign the lease, fit out the space and onboard the founding tenants.', }, { phase: 'Phase 1', - title: 'Launch the three entities', - when: '~6–9 mo', - body: 'Open the SolLunar Punk Society city hub and Chateau du Faune; stage the first pop-up festival.', + title: 'Operate & prove the model', + when: '~0–12 mo', + body: 'Run memberships, events and tenants in Austin; validate the P&L publicly on the Archipelago stack.', }, { phase: 'Phase 2', - title: 'Operate & prove revenue', - when: '~9–18 mo', - body: 'Run events, festivals, retreats and residencies; validate the unit economics publicly.', + title: 'Add the festival', + when: '~12–18 mo', + body: 'Deploy the same stack to a travelling Solarpunk Summit — proving the network is portable, not tied to a building.', }, { phase: 'Phase 3', - title: 'Open the blueprint', + title: 'Add the farm & replicate', when: '18 mo+', - body: 'Publish the replication kit; onboard new nodes & festivals worldwide on shared infrastructure.', + body: 'Open Chateau du Faune and publish the replication kit — new nodes plug into the same backbone anywhere.', }, ] diff --git a/src/deck/slides/AngelSlide.vue b/src/deck/slides/AngelSlide.vue deleted file mode 100644 index 8a3c06b..0000000 --- a/src/deck/slides/AngelSlide.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - diff --git a/src/deck/slides/AskSlide.vue b/src/deck/slides/AskSlide.vue index cfb5de6..1a00ade 100644 --- a/src/deck/slides/AskSlide.vue +++ b/src/deck/slides/AskSlide.vue @@ -1,26 +1,42 @@ diff --git a/src/deck/slides/ChateauSlide.vue b/src/deck/slides/ChateauSlide.vue deleted file mode 100644 index f7c1f33..0000000 --- a/src/deck/slides/ChateauSlide.vue +++ /dev/null @@ -1,8 +0,0 @@ - - - diff --git a/src/deck/slides/ContributorSlide.vue b/src/deck/slides/ContributorSlide.vue deleted file mode 100644 index 4043d2d..0000000 --- a/src/deck/slides/ContributorSlide.vue +++ /dev/null @@ -1,49 +0,0 @@ - - - diff --git a/src/deck/slides/CostBreakdownSlide.vue b/src/deck/slides/CostBreakdownSlide.vue deleted file mode 100644 index 7d01e42..0000000 --- a/src/deck/slides/CostBreakdownSlide.vue +++ /dev/null @@ -1,55 +0,0 @@ - - - diff --git a/src/deck/slides/EcosystemSlide.vue b/src/deck/slides/EcosystemSlide.vue index 73b2de8..be2b577 100644 --- a/src/deck/slides/EcosystemSlide.vue +++ b/src/deck/slides/EcosystemSlide.vue @@ -1,7 +1,7 @@