Compare commits
No commits in common. "9f71d346e9a4c9daaaeead732f6d1c2f2b4e3690" and "5cdbb76ab7f2f9a410ddf09f18e0c6613263a749" have entirely different histories.
9f71d346e9
...
5cdbb76ab7
|
|
@ -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 Summit Gatherings (travelling) — ephemeral cluster
|
||||
* • Pop-up Festivals (travelling) — ephemeral cluster
|
||||
* • Château du Faune (farm center) — a permanent bloom
|
||||
* Ghost flowers→ once the mycelium runs, new locations & summit gatherings sprout
|
||||
* Ghost flowers→ once the mycelium runs, new locations & festivals 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 summit gathering, a farm.
|
||||
Plug into a rich substrate of decentralized tech and grow your own flower — a city hub, a travelling festival, a farm.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* Summit Gatherings and Château du Faune are narrative/vision only and have no
|
||||
* Festivals 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 Summit Gatherings — travelling gatherings (e.g. Solarpunk Summit)
|
||||
* • Pop-up Festivals — 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 summit gathering 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',
|
||||
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 summit-gathering entity
|
||||
example?: string // for the generic festival 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 Summit Gatherings',
|
||||
name: 'Pop-up Festivals',
|
||||
role: 'Travelling gatherings',
|
||||
kind: 'Travelling · ephemeral',
|
||||
accent: 'rose',
|
||||
layer: 'surface',
|
||||
example: 'Solar Punk Summit',
|
||||
blurb:
|
||||
'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.',
|
||||
'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: [
|
||||
'Deploys the full stack from a mobile kit — anywhere',
|
||||
'Proves the network is portable, not tied to a building',
|
||||
'Turns every summit gathering into a member-onboarding event',
|
||||
'Turns every festival 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 summit gathering, the farm.',
|
||||
body: 'A single NFC card is your identity, access and wallet everywhere — the society, a festival, 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, Summit Gatherings and Château have no
|
||||
only; Lab 484, Festivals 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 summit gathering',
|
||||
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.',
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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/ → Summit Gathering (Pop-up Summit Gatherings)
|
||||
* src/deck/gallery/festival/ → Festival (Pop-up Festivals)
|
||||
*
|
||||
* 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: 'Summit Gathering',
|
||||
label: 'Festival',
|
||||
entityName: entityById('festivals').name,
|
||||
accent: 'rose',
|
||||
folder: 'src/deck/gallery/festival/',
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ they appear automatically** — no code to touch.
|
|||
| ----------- | -------- | --------------------- |
|
||||
| `city/` | City | SolLunar Punk Society |
|
||||
| `farm/` | Farm | Château du Faune |
|
||||
| `festival/` | Summit Gathering | Pop-up Summit Gatherings |
|
||||
| `festival/` | Festival | Pop-up Festivals |
|
||||
|
||||
- Supported formats: `jpg` `jpeg` `png` `webp` `avif` `gif` `svg`.
|
||||
- Images display **sorted by filename** — prefix `01-`, `02-`, … to order them.
|
||||
|
|
|
|||
|
|
@ -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">Summit Gathering</text>
|
||||
<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="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: 1,000 B After Width: | Height: | Size: 992 B |
|
|
@ -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">Summit Gathering</text>
|
||||
<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="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: 1,000 B After Width: | Height: | Size: 992 B |
|
|
@ -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">Summit Gathering</text>
|
||||
<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="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: 1,005 B After Width: | Height: | Size: 997 B |
|
|
@ -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">Summit Gathering</text>
|
||||
<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="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: 1,000 B After Width: | Height: | Size: 992 B |
|
|
@ -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">Summit Gathering</text>
|
||||
<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="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: 1,000 B After Width: | Height: | Size: 992 B |
|
|
@ -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 summit gathering and the farm are next.
|
||||
Prove the model in Austin, then replicate it on Lab 484 — the festival and the farm are next.
|
||||
</p>
|
||||
</SlideFrame>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -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, summit gathering or farm — the ecosystem is identical. Your card, your money, your identity travel with you."
|
||||
subtitle="Wherever you are in the network — city, festival 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
|
||||
|
|
|
|||
|
|
@ -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 summit gathering and the farm follow, on the same Lab 484 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
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
<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> = {
|
||||
|
|
@ -24,9 +25,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 founding partners."
|
||||
subtitle="SolLunar Society is a joint venture. Investors buy in alongside the two operating partners."
|
||||
>
|
||||
<!-- equity split bar -->
|
||||
<!-- equity bar -->
|
||||
<div class="flex h-5 w-full overflow-hidden rounded-full">
|
||||
<div
|
||||
v-for="p in partnership.partners"
|
||||
|
|
@ -39,20 +40,33 @@ const pct = (e: number) => Math.round(e * 100)
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<!-- the three entities -->
|
||||
<div class="mt-8 grid gap-5 sm:grid-cols-3">
|
||||
<div class="mt-6 grid gap-4 md:grid-cols-3">
|
||||
<div
|
||||
v-for="p in partnership.partners"
|
||||
:key="p.name"
|
||||
class="flex flex-col items-center rounded-2xl border px-6 py-8 text-center"
|
||||
class="flex flex-col rounded-2xl border p-5"
|
||||
:class="ring[p.accent]"
|
||||
>
|
||||
<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 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>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-8 flex flex-wrap items-center justify-center gap-x-6 gap-y-1 text-sm text-fg-muted">
|
||||
<div class="mt-5 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) }}%
|
||||
|
|
|
|||