Compare commits

...

2 commits

Author SHA1 Message Date
Patrick Mulligan
9f71d346e9 copy(deck): rename "festival" → "summit gathering"
Rename every user-visible occurrence (entity name → Pop-up Summit
Gatherings, gallery section, roadmap, ecosystem, mycelium summary,
placeholder art). Code identifiers (kind:'festival', festivalCaps,
.myc-festival, the gallery id/folder/glob) stay as-is.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 00:51:55 +02:00
Patrick Mulligan
0ffbd67d36 copy(deck): slide 7 shows just the entities + equity split
Roles/responsibilities aren't solidified — drop them (and the overlap
note). Keep the 45/45/10 split bar and three clean entity cards
(name + %), plus the ask line.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 00:51:55 +02:00
13 changed files with 32 additions and 46 deletions

View file

@ -6,9 +6,9 @@
* Unseen, always working, connects every entity (the mycelium).
* Flowers → the three experiences people actually engage with:
* • SolLunar Punk Society (city center) — a permanent bloom
* • Pop-up Festivals (travelling) — ephemeral cluster
* • Pop-up Summit Gatherings (travelling) — ephemeral cluster
* • Château du Faune (farm center) — a permanent bloom
* Ghost flowers→ once the mycelium runs, new locations & festivals sprout
* Ghost flowers→ once the mycelium runs, new locations & summit gatherings sprout
* cheaply, anywhere in the world.
*
* Pure SVG + CSS so it scales crisply on a projector and respects
@ -290,7 +290,7 @@ const festivalCaps = [
<span class="mt-0.5 text-amber"><Icon name="Sparkles" class="size-5" /></span>
<p class="text-fg-muted">
<span class="font-medium text-fg">Take root anywhere.</span>
Plug into a rich substrate of decentralized tech and grow your own flower — a city hub, a travelling festival, a farm.
Plug into a rich substrate of decentralized tech and grow your own flower — a city hub, a travelling summit gathering, a farm.
</p>
</div>
</div>

View file

@ -5,14 +5,14 @@
*
* The financials are REAL, from SolLunarSociety.md, and belong exclusively to
* the first node — SolLunar Society (Austin). Lab 484, Pop-up
* Festivals and Château du Faune are narrative/vision only and have no
* Summit Gatherings and Château 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`).
*
* Lab 484 is the shared backbone — open hardware + sovereign software (the
* "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)
* • Pop-up Summit Gatherings — travelling gatherings (e.g. Solarpunk Summit)
* • Château du Faune — regenerative farm center
*
* Currency: all figures are USD unless noted.
@ -26,7 +26,7 @@ export const brand = {
// Lab 484 — the tech co / shared backbone (also the 45% operating partner).
tagline: 'One network. Three ways to experience it.',
subtagline:
'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.',
'A sovereign network on shared, open infrastructure. The first node — SolLunar Society, a members’ club in Austin — is live, modeled and raising now; the summit gathering 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
@ -56,7 +56,7 @@ export type Entity = {
kind: string
accent: Accent
layer: 'backbone' | 'surface'
example?: string // for the generic festival entity
example?: string // for the generic summit-gathering entity
blurb: string
traits: string[] // what makes THIS entity unique
spaces: string[]
@ -89,18 +89,18 @@ export const entities: Entity[] = [
},
{
id: 'festivals',
name: 'Pop-up Festivals',
name: 'Pop-up Summit Gatherings',
role: 'Travelling gatherings',
kind: 'Travelling · ephemeral',
accent: 'rose',
layer: 'surface',
example: 'Solar Punk Summit',
blurb:
'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.',
'The travelling node: a repeatable summit-gathering format — like Solar Punk Summit — that deploys the entire stack anywhere for a few days, then packs down and moves on.',
traits: [
'Deploys the full stack from a mobile kit — anywhere',
'Proves the network is portable, not tied to a building',
'Turns every festival into a member-onboarding event',
'Turns every summit gathering into a member-onboarding event',
],
spaces: ['Main stage', 'Mobile exchange kiosk', 'Mesh & power rig', 'Camp & vendors', 'Workshop tents'],
revenue: ['Ticket sales', 'Vendor & bar revenue', 'Sponsorships'],
@ -155,7 +155,7 @@ export const surfaceEntities = entities.filter((e) => e.layer === 'surface')
export const userEcosystem = [
{
title: 'One membership card',
body: 'A single NFC card is your identity, access and wallet everywhere — the society, a festival, the farm.',
body: 'A single NFC card is your identity, access and wallet everywhere — the society, a summit gathering, the farm.',
icon: 'CreditCard',
},
{
@ -222,7 +222,7 @@ export const tech = [
/* ─────────────────────────────────────────────────────────────
SolLunar Society — the first node's REAL business (from
SolLunarSociety.md). All figures below are SolLunar Society's
only; Lab 484, Festivals and Château have no
only; Lab 484, Summit Gatherings and Château have no
standalone numbers yet. Lab 484's economics appear here as
revenue lines INTO SolLunar (~$16k/mo) — don't double-count.
───────────────────────────────────────────────────────────── */
@ -486,7 +486,7 @@ export const roadmap = [
},
{
phase: 'Phase 2',
title: 'Add the festival',
title: 'Add the summit gathering',
when: '~12–18 mo',
body: 'Deploy the same stack to a travelling Solarpunk Summit — proving the network is portable, not tied to a building.',
},

View file

@ -6,7 +6,7 @@
*
* src/deck/gallery/city/ → City (SolLunar Punk Society)
* src/deck/gallery/farm/ → Farm (Château du Faune)
* src/deck/gallery/festival/ → Festival (Pop-up Festivals)
* src/deck/gallery/festival/ → Summit Gathering (Pop-up Summit Gatherings)
*
* Supported: jpg jpeg png webp avif gif svg. Images show sorted by filename,
* so prefix with 01-, 02-, … to control order. The seeded *-placeholder.svg
@ -73,7 +73,7 @@ export const gallerySections: GallerySection[] = [
},
{
id: 'festival',
label: 'Festival',
label: 'Summit Gathering',
entityName: entityById('festivals').name,
accent: 'rose',
folder: 'src/deck/gallery/festival/',

View file

@ -7,7 +7,7 @@ they appear automatically** — no code to touch.
| ----------- | -------- | --------------------- |
| `city/` | City | SolLunar Punk Society |
| `farm/` | Farm | Château du Faune |
| `festival/` | Festival | Pop-up Festivals |
| `festival/` | Summit Gathering | Pop-up Summit Gatherings |
- Supported formats: `jpg` `jpeg` `png` `webp` `avif` `gif` `svg`.
- Images display **sorted by filename** — prefix `01-`, `02-`, … to order them.

View file

@ -9,7 +9,7 @@
<rect width="800" height="800" fill="url(#g)"/>
<circle cx="740" cy="60" r="120" fill="hsl(256 78% 68%)" opacity="0.12"/>
<circle cx="70" cy="730" r="90" fill="hsl(256 78% 68%)" opacity="0.10"/>
<text x="400" y="360" text-anchor="middle" fill="hsl(256 78% 68%)" font-size="46" font-weight="bold">Festival</text>
<text x="400" y="360" text-anchor="middle" fill="hsl(256 78% 68%)" font-size="46" font-weight="bold">Summit Gathering</text>
<text x="400" y="406" text-anchor="middle" fill="hsl(44 30% 90%)" font-size="26" opacity="0.85">Photo 01</text>
<text x="400" y="444" text-anchor="middle" fill="hsl(150 8% 62%)" font-size="18" letter-spacing="3">PLACEHOLDER · 800×800</text>
</svg>

Before

Width:  |  Height:  |  Size: 992 B

After

Width:  |  Height:  |  Size: 1,000 B

Before After
Before After

View file

@ -9,7 +9,7 @@
<rect width="800" height="560" fill="url(#g)"/>
<circle cx="740" cy="60" r="120" fill="hsl(256 78% 68%)" opacity="0.12"/>
<circle cx="70" cy="490" r="90" fill="hsl(256 78% 68%)" opacity="0.10"/>
<text x="400" y="240" text-anchor="middle" fill="hsl(256 78% 68%)" font-size="46" font-weight="bold">Festival</text>
<text x="400" y="240" text-anchor="middle" fill="hsl(256 78% 68%)" font-size="46" font-weight="bold">Summit Gathering</text>
<text x="400" y="286" text-anchor="middle" fill="hsl(44 30% 90%)" font-size="26" opacity="0.85">Photo 02</text>
<text x="400" y="324" text-anchor="middle" fill="hsl(150 8% 62%)" font-size="18" letter-spacing="3">PLACEHOLDER · 800×560</text>
</svg>

Before

Width:  |  Height:  |  Size: 992 B

After

Width:  |  Height:  |  Size: 1,000 B

Before After
Before After

View file

@ -9,7 +9,7 @@
<rect width="800" height="1040" fill="url(#g)"/>
<circle cx="740" cy="60" r="120" fill="hsl(256 78% 68%)" opacity="0.12"/>
<circle cx="70" cy="970" r="90" fill="hsl(256 78% 68%)" opacity="0.10"/>
<text x="400" y="480" text-anchor="middle" fill="hsl(256 78% 68%)" font-size="46" font-weight="bold">Festival</text>
<text x="400" y="480" text-anchor="middle" fill="hsl(256 78% 68%)" font-size="46" font-weight="bold">Summit Gathering</text>
<text x="400" y="526" text-anchor="middle" fill="hsl(44 30% 90%)" font-size="26" opacity="0.85">Photo 03</text>
<text x="400" y="564" text-anchor="middle" fill="hsl(150 8% 62%)" font-size="18" letter-spacing="3">PLACEHOLDER · 800×1040</text>
</svg>

Before

Width:  |  Height:  |  Size: 997 B

After

Width:  |  Height:  |  Size: 1,005 B

Before After
Before After

View file

@ -9,7 +9,7 @@
<rect width="800" height="700" fill="url(#g)"/>
<circle cx="740" cy="60" r="120" fill="hsl(256 78% 68%)" opacity="0.12"/>
<circle cx="70" cy="630" r="90" fill="hsl(256 78% 68%)" opacity="0.10"/>
<text x="400" y="310" text-anchor="middle" fill="hsl(256 78% 68%)" font-size="46" font-weight="bold">Festival</text>
<text x="400" y="310" text-anchor="middle" fill="hsl(256 78% 68%)" font-size="46" font-weight="bold">Summit Gathering</text>
<text x="400" y="356" text-anchor="middle" fill="hsl(44 30% 90%)" font-size="26" opacity="0.85">Photo 04</text>
<text x="400" y="394" text-anchor="middle" fill="hsl(150 8% 62%)" font-size="18" letter-spacing="3">PLACEHOLDER · 800×700</text>
</svg>

Before

Width:  |  Height:  |  Size: 992 B

After

Width:  |  Height:  |  Size: 1,000 B

Before After
Before After

View file

@ -9,7 +9,7 @@
<rect width="800" height="600" fill="url(#g)"/>
<circle cx="740" cy="60" r="120" fill="hsl(256 78% 68%)" opacity="0.12"/>
<circle cx="70" cy="530" r="90" fill="hsl(256 78% 68%)" opacity="0.10"/>
<text x="400" y="260" text-anchor="middle" fill="hsl(256 78% 68%)" font-size="46" font-weight="bold">Festival</text>
<text x="400" y="260" text-anchor="middle" fill="hsl(256 78% 68%)" font-size="46" font-weight="bold">Summit Gathering</text>
<text x="400" y="306" text-anchor="middle" fill="hsl(44 30% 90%)" font-size="26" opacity="0.85">Photo 05</text>
<text x="400" y="344" text-anchor="middle" fill="hsl(150 8% 62%)" font-size="18" letter-spacing="3">PLACEHOLDER · 800×600</text>
</svg>

Before

Width:  |  Height:  |  Size: 992 B

After

Width:  |  Height:  |  Size: 1,000 B

Before After
Before After

View file

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

View file

@ -8,7 +8,7 @@ import { userEcosystem, surfaceEntities as entities } from '../data'
<SlideFrame
kicker="One membership, everywhere"
title="The same full experience, at every location"
subtitle="Wherever you are in the network — city, festival or farm — the ecosystem is identical. Your card, your money, your identity travel with you."
subtitle="Wherever you are in the network — city, summit gathering or farm — the ecosystem is identical. Your card, your money, your identity travel with you."
>
<div class="grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
<div

View file

@ -10,7 +10,7 @@ const backbone = entityById('lab484')
<SlideFrame
kicker="The collaboration"
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 Lab 484 stack."
subtitle="One is funded and opening now — SolLunar Society in Austin. The summit gathering and the farm follow, on the same Lab 484 stack."
>
<div class="grid gap-5 md:grid-cols-3">
<div

View file

@ -1,6 +1,5 @@
<script setup lang="ts">
import SlideFrame from '../components/SlideFrame.vue'
import Icon from '../components/Icon.vue'
import { partnership, fmtUsd } from '../data'
const barBg: Record<string, string> = {
@ -25,9 +24,9 @@ const pct = (e: number) => Math.round(e * 100)
<SlideFrame
kicker="Ownership"
title="A three-way partnership"
subtitle="SolLunar Society is a joint venture. Investors buy in alongside the two operating partners."
subtitle="SolLunar Society is a joint venture — investors buy in alongside the two founding partners."
>
<!-- equity bar -->
<!-- equity split bar -->
<div class="flex h-5 w-full overflow-hidden rounded-full">
<div
v-for="p in partnership.partners"
@ -40,33 +39,20 @@ const pct = (e: number) => Math.round(e * 100)
</div>
</div>
<div class="mt-6 grid gap-4 md:grid-cols-3">
<!-- the three entities -->
<div class="mt-8 grid gap-5 sm:grid-cols-3">
<div
v-for="p in partnership.partners"
:key="p.name"
class="flex flex-col rounded-2xl border p-5"
class="flex flex-col items-center rounded-2xl border px-6 py-8 text-center"
:class="ring[p.accent]"
>
<div class="flex items-baseline justify-between gap-2">
<h3 class="font-display text-lg font-semibold text-fg">{{ p.name }}</h3>
<span class="font-display text-2xl font-bold" :class="text[p.accent]">{{ pct(p.equity) }}%</span>
</div>
<p class="text-xs uppercase tracking-wider" :class="text[p.accent]">{{ p.role }}</p>
<ul class="mt-4 flex-1 space-y-1.5">
<li v-for="r in p.responsibilities" :key="r" class="flex items-start gap-2 text-sm text-fg-muted">
<Icon name="Check" class="mt-0.5 size-3.5 shrink-0" :class="text[p.accent]" />
{{ r }}
</li>
</ul>
<p v-if="p.note" class="mt-3 border-t border-line pt-3 text-[11px] leading-relaxed text-fg-muted">
{{ p.note }}
</p>
<span class="font-display text-5xl font-bold" :class="text[p.accent]">{{ pct(p.equity) }}%</span>
<h3 class="mt-3 font-display text-lg font-semibold text-fg">{{ p.name }}</h3>
</div>
</div>
<div class="mt-5 flex flex-wrap items-center justify-center gap-x-6 gap-y-1 text-sm text-fg-muted">
<div class="mt-8 flex flex-wrap items-center justify-center gap-x-6 gap-y-1 text-sm text-fg-muted">
<span>The ask:</span>
<span class="font-display text-lg font-semibold text-fg">
{{ fmtUsd(partnership.raiseAmount) }} for {{ pct(partnership.equityOffered) }}%