rspace-online/server/seed-demo.ts

594 lines
19 KiB
TypeScript

/**
* Demo community seeder for the r* ecosystem
*
* Creates/ensures a "demo" community with visibility: "public" (anon read+write)
* and populates it with a welcome card + feature cards for each rApp.
*
* Shape IDs are deterministic so re-running is idempotent.
*/
import {
addShapes,
communityExists,
createCommunity,
getDocumentData,
loadCommunity,
markShapesSeeded,
updateSpaceMeta,
} from "./community-store";
// ── Demo Space — Welcome + Feature Showcase ───────────────────────
// Grid layout: cards are 280px wide with 20px gap
const COL_W = 300; // card width + gap
const ROW_H = 260; // card height + gap
const CARD_W = 280;
const CARD_H = 240;
const START_X = 50;
const START_Y = 380; // below welcome card
/** Helper: grid position from col/row index */
function pos(col: number, row: number) {
return { x: START_X + col * COL_W, y: START_Y + row * ROW_H };
}
const DEMO_SHAPES: Record<string, unknown>[] = [
// ─── Welcome Card ───────────────────────────────────────────
{
id: "demo-welcome",
type: "folk-markdown",
x: 50, y: 50, width: 620, height: 300, rotation: 0,
content: `# Welcome to rSpace
A **local-first operating system** for communities. Every tool syncs in real-time, works offline, and keeps your data under your control.
## How it works
- **Create a Space** — your community's home base
- **Add rApps** — modular tools that share data on the canvas
- **Invite members** — passkey login, no passwords or seed phrases
- **Everything syncs** — Automerge CRDTs, end-to-end encrypted
Drag shapes around, connect them with arrows, and build your community's workspace. Each card below is a tool you can use.`,
},
// ─── Category: Communicate ──────────────────────────────────
{
id: "demo-cat-communicate",
type: "folk-markdown",
x: START_X, y: START_Y - 40, width: 200, height: 30, rotation: 0,
content: "## Communicate",
},
{
id: "demo-tool-rchats",
type: "folk-markdown",
...pos(0, 0), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rChats
Real-time messaging for your space.
- **Channels** — topic-based group conversations
- **Direct messages** — private 1:1 threads
- **Reactions & threads** — keep discussions organized
- **File sharing** — drag-and-drop attachments`,
},
{
id: "demo-tool-rforum",
type: "folk-markdown",
...pos(1, 0), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rForum
Threaded discussions for deeper topics.
- **Categories** — organize threads by topic
- **Rich text** — markdown formatting in posts
- **Threaded replies** — nested conversations
- **Search** — find past discussions`,
},
{
id: "demo-tool-rinbox",
type: "folk-markdown",
...pos(2, 0), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rInbox
Shared email for your community.
- **Shared mailboxes** — team-readable inboxes
- **Multisig approval** — require sign-off before sending
- **Internal comments** — discuss emails before replying
- **Connect accounts** — link existing email`,
},
{
id: "demo-tool-rmeets",
type: "folk-markdown",
...pos(3, 0), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rMeets
Video calls with built-in intelligence.
- **Instant meetings** — one-click video calls
- **Recordings** — auto-saved with transcripts
- **AI summaries** — key points from each meeting
- **Screen sharing** — present to your group`,
},
// ─── Category: Organize ─────────────────────────────────────
{
id: "demo-cat-organize",
type: "folk-markdown",
x: START_X, y: START_Y + ROW_H - 40, width: 200, height: 30, rotation: 0,
content: "## Organize",
},
{
id: "demo-tool-rtasks",
type: "folk-markdown",
...pos(0, 1), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rTasks
Kanban boards for project management.
- **Drag-and-drop** — move tasks across columns
- **Assignees & priority** — track who's doing what
- **Multiple boards** — separate projects per board
- **ClickUp sync** — import from external tools`,
},
{
id: "demo-tool-rcal",
type: "folk-markdown",
...pos(1, 1), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rCal
Shared calendar with external sync.
- **Google Calendar sync** — two-way sync
- **ICS import** — upload from any calendar app
- **iCal subscriptions** — read-only feeds
- **Event creation** — shared community events`,
},
{
id: "demo-tool-rschedule",
type: "folk-markdown",
...pos(2, 1), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rSchedule
Automations and scheduled jobs.
- **Cron jobs** — recurring tasks on a schedule
- **Reminders** — email notifications
- **Visual workflows** — trigger-condition-action chains
- **Execution log** — full history of runs`,
},
{
id: "demo-tool-rtime",
type: "folk-markdown",
...pos(3, 1), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rTime
Time banking for communities.
- **Pledge hours** — commit time to the pool
- **Track contributions** — log hours worked
- **Balance sheets** — see give/receive ratios
- **Community currency** — time as value exchange`,
},
// ─── Category: Create ───────────────────────────────────────
{
id: "demo-cat-create",
type: "folk-markdown",
x: START_X, y: START_Y + 2 * ROW_H - 40, width: 200, height: 30, rotation: 0,
content: "## Create",
},
{
id: "demo-tool-rdocs",
type: "folk-markdown",
...pos(0, 2), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rDocs
Rich-text collaborative notebooks.
- **Real-time editing** — multiple cursors, live sync
- **Import** — from Obsidian, Logseq, Notion, Google
- **Voice transcription** — dictate and auto-transcribe
- **AI assist** — writing help built in`,
},
{
id: "demo-tool-rnotes",
type: "folk-markdown",
...pos(1, 2), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rNotes
Vault sync for Obsidian & Logseq.
- **ZIP upload** — import your entire vault
- **Browse & search** — explore notes by folder
- **Metadata sync** — tags, links, frontmatter
- **On-demand content** — files served from vault ZIP`,
},
{
id: "demo-tool-rphotos",
type: "folk-markdown",
...pos(2, 2), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rPhotos
Photo albums and galleries.
- **Lightbox viewer** — full-screen with EXIF data
- **Albums** — organize by event or theme
- **Public galleries** — shareable links
- **Smart tags** — AI-powered face & object tagging`,
},
{
id: "demo-tool-rtube",
type: "folk-markdown",
...pos(3, 2), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rTube
Video hosting for your community.
- **Upload & stream** — host your own videos
- **Playlists** — curate video collections
- **Channels** — organize by creator or topic
- **Embedded player** — share anywhere`,
},
// ─── Category: Govern ───────────────────────────────────────
{
id: "demo-cat-govern",
type: "folk-markdown",
x: START_X, y: START_Y + 3 * ROW_H - 40, width: 200, height: 30, rotation: 0,
content: "## Govern",
},
{
id: "demo-tool-rvote",
type: "folk-markdown",
...pos(0, 3), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rVote
Conviction voting and governance.
- **Proposals** — submit ideas for community vote
- **Conviction voting** — signal strength over time
- **Pairwise ranking** — Elo-style sortition
- **Results dashboard** — transparent outcomes`,
},
{
id: "demo-tool-rgov",
type: "folk-markdown",
...pos(1, 3), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rGov
Governance decision circuits.
- **Visual circuits** — drag-and-drop governance flows
- **Multisig** — require multiple approvals
- **Quadratic voting** — diminishing returns voting
- **Amendment tracking** — version proposals`,
},
{
id: "demo-tool-rchoices",
type: "folk-markdown",
...pos(2, 3), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rChoices
Group decision-making tools.
- **Spider charts** — multi-criteria radar visualization
- **Drag rankings** — drag-and-drop prioritization
- **Live polls** — real-time voting
- **CrowdSurf** — Tinder-style option swiping`,
},
{
id: "demo-tool-rnetwork",
type: "folk-markdown",
...pos(3, 3), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rNetwork
CRM and relationship graphs.
- **Contact management** — people and organizations
- **Relationship graph** — visualize connections
- **Pipeline tracking** — manage opportunities
- **Delegations** — liquid democracy trust flows`,
},
// ─── Category: Finance ──────────────────────────────────────
{
id: "demo-cat-finance",
type: "folk-markdown",
x: START_X, y: START_Y + 4 * ROW_H - 40, width: 200, height: 30, rotation: 0,
content: "## Finance",
},
{
id: "demo-tool-rwallet",
type: "folk-markdown",
...pos(0, 4), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rWallet
Multi-chain crypto wallet.
- **Gnosis Safe** — multisig wallet abstraction
- **Token balances** — view across chains
- **DeFi positions** — Aave, Uniswap, etc.
- **Sankey flows** — transaction visualization`,
},
{
id: "demo-tool-rflows",
type: "folk-markdown",
...pos(1, 4), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rFlows
Community funding and budgets.
- **Collective budgets** — participatory pie charts
- **Personal sliders** — auto-normalizing allocation
- **Community lending** — trust-backed pools
- **Yield projection** — compound interest calculator`,
},
{
id: "demo-tool-rcart",
type: "folk-markdown",
...pos(2, 4), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rCart
Community storefront.
- **Group shopping** — shared carts
- **Print-on-demand** — catalog with production
- **Group buys** — volume discount campaigns
- **Order tracking** — fulfillment & invoices`,
},
{
id: "demo-tool-rauctions",
type: "folk-markdown",
...pos(3, 4), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rAuctions
Live auction platform.
- **Create auctions** — list items for bidding
- **Real-time bids** — live bidding updates
- **Auction history** — completed results
- **Community trust** — reputation-backed bidding`,
},
// ─── Category: Travel & Share ───────────────────────────────
{
id: "demo-cat-travel",
type: "folk-markdown",
x: START_X, y: START_Y + 5 * ROW_H - 40, width: 200, height: 30, rotation: 0,
content: "## Travel & Share",
},
{
id: "demo-tool-rtrips",
type: "folk-markdown",
...pos(0, 5), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rTrips
Collaborative trip planning.
- **Itineraries** — day-by-day activity plans
- **Destinations** — multi-stop with map pins
- **Route planner** — optimal waypoint ordering
- **Expense splitting** — track who paid what`,
},
{
id: "demo-tool-rmaps",
type: "folk-markdown",
...pos(1, 5), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rMaps
Location sharing and routing.
- **Live locations** — real-time participant map
- **Privacy controls** — precision fuzzing, ghost mode
- **Turn-by-turn routing** — OSRM + indoor nav
- **Meeting points** — coordinate group meetups`,
},
{
id: "demo-tool-rbnb",
type: "folk-markdown",
...pos(2, 5), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rBnb
Community hospitality exchange.
- **List spaces** — share your home with members
- **Stay requests** — book within your community
- **Trust endorsements** — reputation from stays
- **No fees** — peer-to-peer, no platform cut`,
},
{
id: "demo-tool-rvnb",
type: "folk-markdown",
...pos(3, 5), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rVnb
Community vehicle sharing.
- **List vehicles** — share cars, bikes, vans
- **Rental requests** — book within community
- **Trust endorsements** — reputation from trips
- **Usage tracking** — mileage and availability`,
},
// ─── Category: Publish ──────────────────────────────────────
{
id: "demo-cat-publish",
type: "folk-markdown",
x: START_X, y: START_Y + 6 * ROW_H - 40, width: 200, height: 30, rotation: 0,
content: "## Publish",
},
{
id: "demo-tool-rpubs",
type: "folk-markdown",
...pos(0, 6), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rPubs
Zine and book publishing.
- **MycroZines** — 8-page auto-generated zines
- **PDF output** — print-ready publications
- **Drafts** — work-in-progress documents
- **Community library** — share publications`,
},
{
id: "demo-tool-rdesign",
type: "folk-markdown",
...pos(1, 6), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rDesign
Design tools and templates.
- **Layout editor** — visual design canvas
- **Templates** — reusable design patterns
- **Asset library** — shared design resources
- **Export** — PNG, SVG, PDF output`,
},
{
id: "demo-tool-rswag",
type: "folk-markdown",
...pos(2, 6), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rSwag
Merchandise design.
- **Product designer** — t-shirts, stickers, prints
- **Print-on-demand** — connect to production
- **Sell in rCart** — list directly in your store
- **Size variants** — manage product options`,
},
{
id: "demo-tool-rsocials",
type: "folk-markdown",
...pos(3, 6), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rSocials
Social media management.
- **Campaign builder** — multi-platform scheduling
- **Thread composer** — Twitter/X thread drafting
- **Newsletter editor** — email campaign drafts
- **Analytics** — track engagement metrics`,
},
// ─── Category: Data & AI ────────────────────────────────────
{
id: "demo-cat-data",
type: "folk-markdown",
x: START_X, y: START_Y + 7 * ROW_H - 40, width: 200, height: 30, rotation: 0,
content: "## Data & AI",
},
{
id: "demo-tool-rdata",
type: "folk-markdown",
...pos(0, 7), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rData
Space data explorer.
- **Content tree** — hierarchical CRDT document view
- **Data cloud** — 3D force-directed graph
- **Analytics** — usage metrics and engagement
- **Search** — find any object in your space`,
},
{
id: "demo-tool-rbooks",
type: "folk-markdown",
...pos(1, 7), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rBooks
Shared PDF library.
- **Flipbook reader** — page-turning animations
- **Bookmarks & notes** — annotations that sync
- **Collections** — curated reading lists
- **Community library** — upload and share PDFs`,
},
{
id: "demo-tool-rsplat",
type: "folk-markdown",
...pos(2, 7), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rSplat
3D Gaussian splatting.
- **Interactive 3D** — orbit, pan, zoom in browser
- **Upload .ply/.splat** — share 3D captures
- **Multi-angle** — photorealistic reconstructions
- **Drawing mode** — 3D freehand sketching`,
},
{
id: "demo-tool-ragents",
type: "folk-markdown",
...pos(3, 7), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rAgents
AI assistants for your space.
- **Canvas AI** — chat with context of your space
- **Image generation** — fal.ai Flux Pro
- **Video generation** — text-to-video
- **Multi-model** — Gemini, Ollama, Claude`,
},
// ─── Category: Infrastructure ───────────────────────────────
{
id: "demo-cat-infra",
type: "folk-markdown",
x: START_X, y: START_Y + 8 * ROW_H - 40, width: 200, height: 30, rotation: 0,
content: "## Infrastructure",
},
{
id: "demo-tool-rspace",
type: "folk-markdown",
...pos(0, 8), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rSpace Canvas
The infinite collaborative canvas.
- **Drag & drop** — place any shape on the canvas
- **Arrows** — connect shapes to show relationships
- **Real-time sync** — see collaborators' cursors
- **Nested canvases** — embed spaces within spaces`,
},
{
id: "demo-tool-rfiles",
type: "folk-markdown",
...pos(1, 8), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rFiles
File storage for your space.
- **Upload anything** — drag-and-drop file uploads
- **Public shares** — shareable download links
- **IPFS pinning** — decentralized backup
- **Version history** — track file changes`,
},
{
id: "demo-tool-rsheets",
type: "folk-markdown",
...pos(2, 8), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rSheets
Collaborative spreadsheets.
- **Real-time editing** — multi-user spreadsheets
- **Formulas** — standard spreadsheet functions
- **Import/export** — CSV and Excel support
- **Embed** — use spreadsheet data in other rApps`,
},
{
id: "demo-tool-rexchange",
type: "folk-markdown",
...pos(3, 8), width: CARD_W, height: CARD_H, rotation: 0,
content: `### rExchange
Peer-to-peer exchange.
- **Post intents** — buy or sell anything
- **Add liquidity** — provide exchange liquidity
- **Order matching** — automated intent matching
- **Community trust** — reputation-backed trades`,
},
];
/**
* Ensure the demo community exists and is seeded with data.
* Called on server startup and after demo reset.
*/
export async function ensureDemoCommunity(): Promise<void> {
const exists = await communityExists("demo");
if (!exists) {
await createCommunity("r* Ecosystem Demo", "demo", null, "public", {
description: "Public demo space — explore all rSpace tools on the canvas",
});
console.log("[Demo] Created demo community with visibility: public");
} else {
await loadCommunity("demo");
// Ensure visibility stays "public" (older docs may have been created as "private")
const doc = getDocumentData("demo");
if (doc?.meta?.visibility !== "public") {
updateSpaceMeta("demo", { visibility: "public" });
console.log("[Demo] Fixed demo visibility → public");
}
}
// Check if already seeded (has shapes or was previously seeded then cleared)
const data = getDocumentData("demo");
const shapeCount = data ? Object.keys(data.shapes || {}).length : 0;
const alreadySeeded = (data?.meta as any)?.shapesSeeded === true;
if (shapeCount === 0 && !alreadySeeded) {
addShapes("demo", DEMO_SHAPES);
markShapesSeeded("demo");
console.log(`[Demo] Seeded ${DEMO_SHAPES.length} shapes into demo community`);
} else {
console.log(`[Demo] Demo community already has ${shapeCount} shapes (seeded=${alreadySeeded})`);
}
}