Compare commits

..

No commits in common. "55c2a1a4cf3a3e78f8154fcb5a7d3fafcc431674" and "4095d32d2e8a37090667c9f08ac1be3057e7a047" have entirely different histories.

26 changed files with 133 additions and 370 deletions

View file

@ -1,272 +0,0 @@
# SolLunar — Investment Pitch Deck (full content)
> Plain-text export of every slide's content from the SolLunar pitch deck, in
> presentation order. Intended for a founder to read or feed to an AI.
> Live deck: `aiolabs/sollunar-pitch`. Contact: **team@l484.com**
>
> **Brand note:** *SolLunar* is the cover brand (the venture / the raise).
> *Lab 484* is the shared tech backbone (open hardware + sovereign software)
> **and** a 45% operating partner. *SolLunar Punk Society (SPS)* is the other
> 45% partner (space + community). Tagline: *One network. Three ways to
> experience it.* / *Energy · Intelligence · Harmony.*
---
## 1 · Title
**SolLunar** — Investment prospectus (draft)
**One network. Three ways to experience it.**
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.
- **Three experiences, one backbone:** SolLunar Society · Pop-up Summit Gatherings · Château du Faune
- **Raising now · SolLunar Society · Austin, TX**
---
## 2 · The problem
**Transformation fades without the infrastructure to sustain it.**
- 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:** SolLunar Society is the missing infrastructure — a community hub
where the work began at transformational events continues through membership,
resident businesses (retailers, food co-ops and makers), events and
regenerative living.
---
## 3 · The network — a mycelial network
*What you see are the locations. What makes them work is the network beneath
them — and it grows the same way mycelium does: spread the network once, then
fruit anywhere.*
The diagram: an underground **mycelium = Lab 484**, the shared backbone
("the shared backbone beneath every node"), feeding three surface "flowers"
(the experiences people engage with) — **SolLunar Society** (city), **Pop-up
Summit Gatherings** (travelling), **Château du Faune** (farm) — plus faint
"future" blooms.
- **Lab 484 is the mycelium.** One shared backbone runs unseen beneath every entity — members feel it, they don't see it.
- **Take root anywhere.** Plug into a rich substrate of decentralized tech and grow your own flower — a city hub, a travelling summit gathering, a farm.
---
## 4 · Lab 484 · the shared backbone
**Open hardware, sovereign software.** Lab 484 is the stack under every entity
— owned by the network, documented to be rebuilt anywhere. Build it once; every
place plugs in.
- **Decentralized mesh network** — Community-owned routers and mesh kits blanket each location; connectivity no single provider can switch off.
- **Open hardware** — Servers, routers, exchange kiosks and near-field communication (NFC) hardware from a documented, replicable bill of materials.
- **Sovereign software** — Self-hosted services on a stack the user controls; no platform lock-in, forkable by any future node.
- **Bitcoin & Lightning** — Instant, low-fee settlement at kiosks and NFC points. Value stays in the network, not the middleman.
- **Nostr identity & comms** — Portable identity, messaging and social layer that travels with members across every node.
- **Replicable blueprint** — Every node ships its build docs. Proven once, the whole stack redeploys anywhere in the world.
---
## 5 · Three experiences, one backbone
*One is funded and opening now — SolLunar Society in Austin. The summit
gathering and the farm follow, on the same Lab 484 stack.*
- **SolLunar Society** — City center · the first node (Members' club & community hub · Austin, TX). *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 Lab 484 stack.* — **Live P&L · this raise.**
- **Pop-up Summit Gatherings** — Travelling gatherings (e.g. Solar Punk Summit). *A repeatable summit-gathering format that deploys the entire stack anywhere for a few days, then packs down and moves on.* — Vision · on the roadmap.
- **Château du Faune** — Farm center (off-grid · regenerative farm). *An off-grid regenerative farm hosting retreats, artist & developer residencies, and the network's living lab — home to the alpacas.* — Vision · on the roadmap.
**Beneath all three — Lab 484 · Shared backbone:** 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.
---
## 6 · SolLunar Society (the first node)
**Members' club & community hub · Austin, TX** — the first node and the one
we're raising for.
**What makes it unique**
- Live, financially-modeled first node (real P&L)
- Five founding tenants + a three-tier membership
- Bitcoin terminal, vending & the full member ecosystem on site
**Spaces:** Retail space · Event space · Private lounge · Co-working · Cypherpunk Commons hostel & data center
**How it earns:** Memberships · Tenants · Events & venue buyouts
---
## 7 · Ownership — a three-way partnership
SolLunar Society is a joint venture — investors buy in alongside the two
founding partners.
| Entity | Stake |
| --- | --- |
| **SolLunar Punk Society (SPS)** | **45%** |
| **Lab 484** | **45%** |
| **Investors** | **10%** |
**The ask (base):** $400k for 10% · $4.0MM valuation.
*(Partner responsibilities, per the source plan — not yet solidified, shown for
context only: SPS → space, community, leasing, insurance, SOPs, marketing.
Lab 484 → operations, staff, all IT/infrastructure, inbound payments, bootcamps,
tenant & investor relations; note that Lab 484 is also a tenant + event driver,
contributing ~$16k/mo of the revenue below — don't double-count.)*
---
## 8 · Five founding tenants
The hub is anchored by businesses that are also the community — each one a
reason to become a member.
- **Lab 484** — Research lab & startup cluster building a "second internet": Bitcoin, mesh networks, Nostr, e-cash and P2P. User-owned hardware, software and data.
- **Solarpunk Summit** — Transformational platform & community builder: immersive experiences, educational programming and regenerative culture.
- **Noderunners Shop** — Retail for AI computers, mesh gear, Bitcoin nodes and repair. Open-source, secure laptops, phones and servers.
- **Divine Provisions** — A food co-op for low-cost, organic, local groceries — offered as a member service at the building entrance.
- **Kitchen 484** — Community food truck: organic, seed-oil-free, locally sourced. Runs even when disconnected from the internet.
*Tenants pay rent and drive events, retail and food traffic — the same footfall that fills memberships.*
---
## 9 · Memberships — three ways to belong
Recurring membership is the core of the model — priced right for the Austin market.
| Tier | Price / mo | Target members | Includes |
| --- | --- | --- | --- |
| **Solarpunk Society** | $48 | 150 | Member events; amenities (cold plunge, sauna & gym); vending & Bitcoin terminal; access to tenants |
| **Lunarpunk Locals** | $148 | 100 | Coworking days at SolLunar; amenities (cold plunge, sauna & gym); vending & Bitcoin terminal; access to tenants |
| **Cypherpunk Commons** *(flagship)* | $348 | 50 | Coworking with the Lab 484 team; all locations · tech support; cold plunge, sauna, gym & coworking; vending, coffee, tea & Bitcoin terminal; full tenant & amenity access |
**Austin comparables:** Soho House $350 · Bond Collective $300 · Bathe $200 · Stardust Garage $155 · Submersive $41
---
## 10 · The building — one address, three buildings
A members' society up front, Cypherpunk Commons A & B behind — lodging, coworking
and the data center that runs it all. *The Cypherpunk Commons data center makes
SolLunar self-hosting — the Lab 484 stack runs on-site, not in someone else's cloud.*
- **SolLunar Society** — Retail space · Event space · Private office · Private lounge
- **Cypherpunk Commons A** — Hostel room ($40/night) · Healer room · Coworking · Meeting room · Outdoor (activity space, food truck & café)
- **Cypherpunk Commons B** — Long-term guest housing · Office (coworking with amenities) · Data center · Outdoor (activity space, food truck & café)
---
## 11 · Gallery
Photography from each entity — City (SolLunar Society), Farm (Château du Faune),
Summit Gathering. *(Images live in the deck; drop files into the matching folder
and they appear automatically.)*
---
## 12 · One membership, everywhere
**The same full experience, at every location.** Wherever you are in the network
— city, summit gathering or farm — the ecosystem is identical. Your card, your
money, your identity travel with you.
- **One membership card** — A single NFC card is your identity, access and wallet everywhere.
- **Money exchange kiosk** — On-ramp cash to Bitcoin and back at any location. The same kiosk, everywhere.
- **Pay by Lightning** — Tap to pay for drinks, tickets, rooms and experiences — instant, low-fee settlement.
- **The Lab 484 app** — Book spaces, buy tickets, find events and manage membership from one self-hosted app.
- **Portable identity** — Your nostr identity and social graph travel with you between every node and beyond.
- **Member perks** — Access, discounts and priority booking that follow you across the whole network.
---
## 13 · The numbers — SolLunar Society unit economics
**Estimated monthly** P&L for the Austin node — projections, not audited results.
*(Figures recomputed from the source plan's line items; the source summary table
stated $71.4k rev / $38.5k exp, which didn't reconcile — see the caveat below.)*
**Summary (recomputed):**
| | Monthly | Yearly |
| --- | --- | --- |
| **Revenue** | **$65,000** | $780,000 |
| **Expenses** | **$34,000** | $408,000 |
| **Net profit** | **$31,000** | **~$372,000** |
**Revenue — Memberships ($36,100/mo)**
- Cypherpunk Commons — $17,400 (50 × $348)
- Solarpunk Society — $7,200 (150 × $48)
- Lunarpunk Locals — $1,500 ($148/mo · count TBD)
- Vending machine sales — $5,000
- Promo / B2B network sales — $5,000
**Revenue — Events ($21,900/mo)**
- Lab 484 tech events — $8,000
- Lab 484 bootcamps — $6,000
- Venue buyouts — $6,400 ($400/hr · 4hr min · 4×/mo)
- SolLunar Society events — $1,500 ($50 weekend passes)
**Revenue — Tenants ($7,000/mo)**
- Solarpunk Summit — $2,000
- Lab 484 — $2,000
- Divine Provisions — $1,500
- Noderunners Shop — $1,500
**Expenses ($34,000/mo)**
- Staff — $22,500 (4 staff)
- Rent — $6,500 ($4,500 + triple net)
- Overhead — $3,000
- Utilities — $2,000 (electric, water, trash)
> ⚠️ **These are estimated figures — projections, not audited results.** The
> source doc's summary table stated $71,400 revenue / $38,500 expenses / $32,900
> profit / $394,800/yr, which does **not** match the line items above (line items
> give $65,000 / $34,000 / $31,000 / $372,000). Also, **Lunarpunk Locals** income
> ($1,500) doesn't match its "100 × $148" annotation. Numbers here use the
> line-item recomputation.
---
## 14 · Roadmap — the replication play
**Prove it three ways, then grow it anywhere.** The three entities aren't the
endgame — they're the seed. The blueprint is the business.
- **Phase 0 · Now — Raise & open SolLunar:** Close the $400k round, sign the lease, fit out the space and onboard the founding tenants.
- **Phase 1 · ~0–12 mo — Operate & prove the model:** Run memberships, events and tenants in Austin; validate the P&L publicly on the Lab 484 stack.
- **Phase 2 · ~12–18 mo — Add the summit gathering:** Deploy the same stack to a travelling Solarpunk Summit — proving the network is portable, not tied to a building.
- **Phase 3 · 18 mo+ — Add the farm & replicate:** Open Château du Faune and publish the replication kit — new nodes plug into the same backbone anywhere.
*Once the mycelium runs, every new flower is marginal cost, not a new company.*
---
## 15 · The ask — two ways in
Invest in SolLunar Society — the first node, opening in Austin.
| Option | Amount | Equity | Annual profit share¹ | What it funds |
| --- | --- | --- | --- | --- |
| **Get started** | $400k | 10% | ~$37,200 / yr | Seeds the launch — sign the lease, fit out the space and open the doors. |
| **Full execution** *(full build)* | $900k | 25% | ~$93,000 / yr | Funds the full build-out and the first operating year end to end. |
¹ On SolLunar Society's estimated ~$372,000/yr node profit.
- **Prove the model in Austin. Prove the replicability in France. Achieve decentralization.**
- **Contact:** team@l484.com · Book an investor call
---
*Generated from the deck's single source of truth (`src/deck/data.ts`) plus slide
copy. Figures are the current placeholders/recomputations in the deck — verify
against the latest SolLunar Society business plan before circulating externally.*

View file

@ -2,7 +2,7 @@
import { computed, ref, watch } from 'vue'
import { ChevronLeft, ChevronRight, Sun, Moon } from '@lucide/vue'
import { useDeck } from './useDeck'
import { brand, brandCaseParts } from './data'
import { brand } from './data'
import markUrl from '@/deck/assets/mark.png'
// theme: dark by default, persisted; a single `.dark` class flips every token
@ -79,9 +79,7 @@ function onTouchEnd(e: TouchEvent) {
<span class="font-display text-sm font-semibold tracking-wide text-fg">SolLunar</span>
</span>
<div class="flex items-center gap-3">
<span class="text-xs uppercase tracking-[0.2em]">
<span v-for="p in brandCaseParts(current.label)" :key="p.id" :class="{ 'normal-case': p.keep }">{{ p.text }}</span>
</span>
<span class="text-xs uppercase tracking-[0.2em]">{{ current.label }}</span>
<button
class="pointer-events-auto grid size-8 place-items-center rounded-full border border-line bg-surface-2 text-fg transition hover:bg-surface-3"
:aria-label="dark ? 'Switch to light mode' : 'Switch to dark mode'"

View file

@ -73,21 +73,21 @@ function thread([a, b]: [number, number], i: number) {
}
const sol = entityById('sollunar') // city
const fest = entityById('summit') // travelling
const fest = entityById('festivals') // travelling
const cha = entityById('chateau') // farm
// surface flowers: the three experiences + two faint "future" ones.
// (Lab 484 is the mycelium itself — the network below, not a flower.)
const flowers = [
{ x: 230, kind: 'bloom', color: 'var(--color-indigo)', name: sol.name, tag: sol.role },
{ x: 500, kind: 'summit', color: 'var(--color-rose)', name: fest.name, tag: fest.role },
{ x: 500, kind: 'festival', color: 'var(--color-rose)', name: fest.name, tag: fest.role },
{ x: 770, kind: 'bloom', color: 'var(--color-clay)', name: cha.name, tag: cha.role },
{ x: 100, kind: 'ghost' },
{ x: 900, kind: 'ghost' },
] as const
// small pop-up caps for the ephemeral summit flower
const summitCaps = [
// small pop-up caps for the ephemeral festival flower
const festivalCaps = [
{ dx: -18, dy: -58, r: 15 },
{ dx: 0, dy: -74, r: 20 },
{ dx: 20, dy: -60, r: 14 },
@ -196,8 +196,8 @@ const summitCaps = [
<circle :cx="f.x + 12" :cy="GROUND - 92" r="2.4" fill="hsl(0 0% 100% / 0.45)" />
</template>
<!-- ephemeral summit cluster (SolLunar) -->
<template v-else-if="f.kind === 'summit'">
<!-- ephemeral festival cluster (SolLunar) -->
<template v-else-if="f.kind === 'festival'">
<path
:d="`M ${f.x} ${GROUND} C ${f.x - 6} ${GROUND - 20}, ${f.x + 6} ${GROUND - 34}, ${f.x} ${GROUND - 46}`"
fill="none"
@ -207,8 +207,8 @@ const summitCaps = [
stroke-linecap="round"
stroke-dasharray="3 5"
/>
<g class="myc-summit" :style="{ animationDelay: `${i * 0.3}s` }">
<template v-for="(c, ci) in summitCaps" :key="ci">
<g class="myc-festival" :style="{ animationDelay: `${i * 0.3}s` }">
<template v-for="(c, ci) in festivalCaps" :key="ci">
<path
:d="`M ${f.x + c.dx - c.r} ${GROUND + c.dy} Q ${f.x + c.dx} ${GROUND + c.dy - c.r * 1.1} ${f.x + c.dx + c.r} ${GROUND + c.dy} Q ${f.x + c.dx} ${GROUND + c.dy - c.r * 0.28} ${f.x + c.dx - c.r} ${GROUND + c.dy} Z`"
:fill="f.color"
@ -255,7 +255,7 @@ const summitCaps = [
<template v-if="f.kind !== 'ghost'">
<text
:x="f.x"
:y="f.kind === 'summit' ? GROUND - 122 : GROUND - 132"
:y="f.kind === 'festival' ? GROUND - 122 : GROUND - 132"
text-anchor="middle"
class="myc-label-name"
:fill="f.color"
@ -264,7 +264,7 @@ const summitCaps = [
</text>
<text
:x="f.x"
:y="f.kind === 'summit' ? GROUND - 142 : GROUND - 152"
:y="f.kind === 'festival' ? GROUND - 142 : GROUND - 152"
text-anchor="middle"
class="myc-label-tag"
>
@ -300,22 +300,19 @@ const summitCaps = [
<style scoped>
.myc-label-name {
font-family: var(--font-display);
font-size: 19px;
font-weight: 700;
font-size: 17px;
font-weight: 600;
}
.myc-label-tag {
font-size: 12.5px;
font-weight: 600;
letter-spacing: 0.16em;
fill: var(--color-fg);
opacity: 0.85;
font-size: 10px;
letter-spacing: 0.22em;
fill: var(--color-fg-muted);
}
.myc-zone {
font-size: 13px;
font-weight: 600;
letter-spacing: 0.18em;
fill: var(--color-fg);
opacity: 0.8;
font-size: 11px;
letter-spacing: 0.24em;
fill: var(--color-fg-muted);
opacity: 0.7;
}
.myc-pulse {
@ -363,8 +360,8 @@ const summitCaps = [
}
}
/* summit cluster gently floats + fades — it's ephemeral */
.myc-summit {
/* festival cluster gently floats + fades — it's ephemeral */
.myc-festival {
transform-box: fill-box;
transform-origin: bottom center;
animation: myc-float 4.5s ease-in-out infinite;
@ -400,7 +397,7 @@ const summitCaps = [
.myc-pulse,
.myc-node,
.myc-cap,
.myc-summit,
.myc-festival,
.myc-plus {
animation: none;
}

View file

@ -1,7 +1,5 @@
<script setup lang="ts">
/** Shared slide chrome: consistent padding, kicker, title, subtitle + body slot. */
import { brandCaseParts } from '../data'
defineProps<{
kicker?: string
title?: string
@ -19,7 +17,7 @@ defineProps<{
v-if="kicker"
class="mb-3 text-xs font-semibold uppercase tracking-[0.25em] text-amber"
>
<span v-for="p in brandCaseParts(kicker)" :key="p.id" :class="{ 'normal-case': p.keep }">{{ p.text }}</span>
{{ kicker }}
</p>
<h2
v-if="title"

View file

@ -44,7 +44,7 @@ export const problem = {
'Peak experiences don’t compound without ongoing relationships, education, and a place to practice.',
],
thesis:
'SolLunar Society is the missing infrastructure — a community hub where the work began at transformational events continues through membership, resident businesses (retailers, food co-ops and makers), events and regenerative living.',
'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'
@ -81,14 +81,14 @@ export const entities: Entity[] = [
traits: [
'Live, financially-modeled first node (real P&L)',
'Five founding tenants + a three-tier membership',
'Bitcoin terminal, vending & the full member ecosystem on site',
'Bitcoin ATM, vending & the full member ecosystem on site',
],
spaces: ['Retail space', 'Event space', 'Private lounge', 'Co-working', 'Cypherpunk Commons hostel & data center'],
spaces: ['Retail space', 'Event space', 'Private lounge', 'Co-working', 'Yellow House hostel & data center'],
revenue: ['Memberships', 'Tenants', 'Events & venue buyouts'],
icon: 'Building2',
},
{
id: 'summit',
id: 'festivals',
name: 'Pop-up Summit Gatherings',
role: 'Travelling gatherings',
kind: 'Travelling · ephemeral',
@ -194,12 +194,12 @@ export const tech = [
},
{
title: 'Open hardware',
body: 'Servers, routers, exchange kiosks and near-field communication (NFC) hardware from a documented, replicable bill of materials.',
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 the user controls — no platform lock-in, forkable by any future node.',
body: 'Self-hosted services on a stack we control — no platform lock-in, forkable by any future node.',
icon: 'Code',
},
{
@ -324,41 +324,30 @@ export type Membership = {
export const memberships: Membership[] = [
{
name: 'Solarpunk Society',
price: 48,
price: 50,
target: 150,
blurb: 'Events access.',
perks: [
'Member events',
'Amenities: cold plunge, sauna & gym',
'Vending & Bitcoin terminal',
'Access to tenants',
],
perks: ['Member events', 'Amenities, vending & Bitcoin ATM', 'Access to tenants'],
},
{
name: 'Cypherpunk Commons',
price: 348,
price: 350,
target: 50,
featured: true,
blurb: 'Full access, all locations.',
perks: [
'Coworking with the Lab 484 team',
'All locations · tech support',
'Cold plunge, sauna, gym & coworking',
'Vending, coffee, tea & Bitcoin terminal',
'Bitcoin ATM, vending, coffee & tea',
'Full tenant & amenity access',
],
},
{
name: 'Lunarpunk Locals',
price: 148,
price: 150,
target: 100,
blurb: 'Coworking days.',
perks: [
'Coworking days at SolLunar',
'Amenities: cold plunge, sauna & gym',
'Vending & Bitcoin terminal',
'Access to tenants',
],
perks: ['Coworking days at SolLunar', 'Access to tenants', 'Amenities, vending & Bitcoin ATM'],
},
]
@ -395,9 +384,9 @@ export const pnlGroups: PnlGroup[] = [
accent: 'indigo',
kind: 'revenue',
items: [
{ label: 'Cypherpunk Commons', amount: 17_400, note: '50 × $348' },
{ label: 'Solarpunk Society', amount: 7_200, note: '150 × $48' },
{ label: 'Lunarpunk Locals', amount: 1_500, note: '$148/mo · count TBD' },
{ 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 },
],
@ -464,23 +453,12 @@ export const buildings = [
rooms: ['Retail space', 'Event space', 'Private office', 'Private lounge'],
},
{
name: 'Cypherpunk Commons A',
rooms: [
'Hostel room · $40/night',
'Healer room',
'Coworking',
'Meeting room',
'Outdoor · activity space, food truck & café',
],
name: 'Lab 484 · Yellow House 1',
rooms: ['Hostel room · $40/night', 'Healer room', 'Coworking', 'Meeting room', 'Outdoor'],
},
{
name: 'Cypherpunk Commons B',
rooms: [
'Long-term guest housing',
'Office · coworking with amenities',
'Data center',
'Outdoor · activity space, food truck & café',
],
name: 'Lab 484 · Yellow House 2',
rooms: ['VIP guest room', 'Office', 'Data center', 'Outdoor'],
},
]
@ -542,16 +520,6 @@ export const fmtUsd = (n: number) => {
export const fmtUsdFull = (n: number) => `$${n.toLocaleString('en-US')}`
/**
* Split a label so the "SolLunar" brand keeps its camel-case even inside a
* CSS `uppercase` eyebrow — the `keep` parts get `normal-case`.
*/
export const brandCaseParts = (text: string) =>
text
.split(/(SolLunar)/)
.filter(Boolean)
.map((t, i) => ({ id: i, text: t, keep: t === 'SolLunar' }))
/** Tailwind class helpers keyed by entity accent — keeps slides declarative. */
export const accentText: Record<Accent, string> = {
pine: 'text-pine-300',

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/summit/ → Summit Gathering (Pop-up Summit Gatherings)
* 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
@ -31,7 +31,7 @@ const farm = import.meta.glob('./gallery/farm/*.{jpg,jpeg,png,webp,avif,gif,svg}
query: '?url',
import: 'default',
}) as GlobMap
const summit = import.meta.glob('./gallery/summit/*.{jpg,jpeg,png,webp,avif,gif,svg}', {
const festival = import.meta.glob('./gallery/festival/*.{jpg,jpeg,png,webp,avif,gif,svg}', {
eager: true,
query: '?url',
import: 'default',
@ -46,7 +46,7 @@ function toImages(map: GlobMap): GalleryImage[] {
}
export type GallerySection = {
id: 'city' | 'farm' | 'summit'
id: 'city' | 'farm' | 'festival'
label: string
entityName: string
accent: Accent
@ -72,11 +72,11 @@ export const gallerySections: GallerySection[] = [
images: toImages(farm),
},
{
id: 'summit',
id: 'festival',
label: 'Summit Gathering',
entityName: entityById('summit').name,
entityName: entityById('festivals').name,
accent: 'rose',
folder: 'src/deck/gallery/summit/',
images: toImages(summit),
folder: 'src/deck/gallery/festival/',
images: toImages(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 |
| `summit/` | Summit Gathering | Pop-up Summit Gatherings |
| `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.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 244 KiB

View file

@ -0,0 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800" width="800" height="800" font-family="Georgia, serif">
<defs>
<linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="hsl(256 78% 68%)" stop-opacity="0.40"/>
<stop offset="1" stop-color="hsl(160 28% 6%)" stop-opacity="1"/>
</linearGradient>
</defs>
<rect width="800" height="800" fill="hsl(160 28% 6%)"/>
<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="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>

After

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

View file

@ -0,0 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 560" width="800" height="560" font-family="Georgia, serif">
<defs>
<linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="hsl(256 78% 68%)" stop-opacity="0.40"/>
<stop offset="1" stop-color="hsl(160 28% 6%)" stop-opacity="1"/>
</linearGradient>
</defs>
<rect width="800" height="560" fill="hsl(160 28% 6%)"/>
<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="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>

After

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

View file

@ -0,0 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 1040" width="800" height="1040" font-family="Georgia, serif">
<defs>
<linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="hsl(256 78% 68%)" stop-opacity="0.40"/>
<stop offset="1" stop-color="hsl(160 28% 6%)" stop-opacity="1"/>
</linearGradient>
</defs>
<rect width="800" height="1040" fill="hsl(160 28% 6%)"/>
<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="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>

After

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

View file

@ -0,0 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 700" width="800" height="700" font-family="Georgia, serif">
<defs>
<linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="hsl(256 78% 68%)" stop-opacity="0.40"/>
<stop offset="1" stop-color="hsl(160 28% 6%)" stop-opacity="1"/>
</linearGradient>
</defs>
<rect width="800" height="700" fill="hsl(160 28% 6%)"/>
<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="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>

After

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

View file

@ -0,0 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 600" width="800" height="600" font-family="Georgia, serif">
<defs>
<linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="hsl(256 78% 68%)" stop-opacity="0.40"/>
<stop offset="1" stop-color="hsl(160 28% 6%)" stop-opacity="1"/>
</linearGradient>
</defs>
<rect width="800" height="600" fill="hsl(160 28% 6%)"/>
<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="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>

After

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

View file

@ -67,7 +67,7 @@ const options = investorAsk.options.map((o) => ({ ...o, annual: Math.round(pnl.y
</div>
<p class="mt-8 max-w-xl text-sm text-fg-muted">
Prove the model in Austin. Prove the replicability in France. Achieve decentralization.
Prove the model in Austin, then replicate it on Lab 484 — the summit gathering and the farm are next.
</p>
</SlideFrame>
</template>

View file

@ -38,7 +38,7 @@ const revPct = (id: string) =>
<SlideFrame
kicker="SolLunar Society · unit economics"
title="The numbers"
subtitle="Estimated monthly P&L for the Austin node. Tap any category to break it down."
subtitle="Real monthly P&L for the Austin node. Tap any category to break it down."
>
<!-- headline stats -->
<div class="grid grid-cols-2 gap-3 sm:grid-cols-4">
@ -144,9 +144,8 @@ const revPct = (id: string) =>
</div>
<p class="mt-4 text-[11px] text-fg-muted/70">
<span class="font-semibold text-amber">Estimated figures — projections, not audited results.</span>
Recomputed from the plan's line items; the source summary stated
{{ fmtUsd(pnlDocSummary.revenue) }} rev / {{ fmtUsd(pnlDocSummary.expenses) }} exp and is
Figures recomputed from the plan's line items. The source summary stated
{{ fmtUsd(pnlDocSummary.revenue) }} rev / {{ fmtUsd(pnlDocSummary.expenses) }} exp —
being reconciled. Lunarpunk Locals count is TBD.
</p>
</SlideFrame>

View file

@ -10,7 +10,7 @@ const icons = ['Building2', 'BedDouble', 'Cpu']
<SlideFrame
kicker="SolLunar Society · the building"
title="One address, three buildings"
subtitle="A members' society up front, Cypherpunk Commons A & B behind — lodging, coworking and the data center that runs it all."
subtitle="A members' society up front, two Yellow Houses behind — lodging, coworking and the data center that runs it all."
>
<div class="grid gap-4 md:grid-cols-3">
<div
@ -34,7 +34,7 @@ const icons = ['Building2', 'BedDouble', 'Cpu']
</div>
<p class="mt-6 text-sm text-fg-muted">
The Cypherpunk Commons data center makes SolLunar self-hosting — the Lab 484 stack runs on-site,
The Yellow House data center makes SolLunar self-hosting — the Lab 484 stack runs on-site,
not in someone else's cloud.
</p>
</SlideFrame>