diff --git a/server/index.ts b/server/index.ts index 1ac023ef..c329487a 100644 --- a/server/index.ts +++ b/server/index.ts @@ -3566,7 +3566,11 @@ app.get("/:space", (c) => { if (token) { return c.redirect(`/${space}/rspace`, 302); } - return c.html(renderSpaceDashboard(space, getModuleInfoList())); + // Demo space: show dashboard; all others: redirect to main landing + if (space === "demo") { + return c.html(renderSpaceDashboard(space, getModuleInfoList())); + } + return c.redirect("/", 302); }); // ── WebSocket types ── @@ -3981,9 +3985,13 @@ const server = Bun.serve({ if (token) { return Response.redirect(`${proto}//${url.host}/rspace`, 302); } - return new Response(renderSpaceDashboard(subdomain, getModuleInfoList()), { - headers: { "Content-Type": "text/html" }, - }); + // Demo space: show dashboard; all others: redirect to main landing + if (subdomain === "demo") { + return new Response(renderSpaceDashboard(subdomain, getModuleInfoList()), { + headers: { "Content-Type": "text/html" }, + }); + } + return Response.redirect(`${proto}//rspace.online/`, 302); } // Global routes pass through without subdomain prefix diff --git a/server/landing.ts b/server/landing.ts index f55cb6a2..b52590aa 100644 --- a/server/landing.ts +++ b/server/landing.ts @@ -71,7 +71,6 @@ export function renderMainLanding(modules: ModuleInfo[]): string {
- Try Demo
@@ -79,82 +78,112 @@ export function renderMainLanding(modules: ModuleInfo[]): string {
- Community Platform + The rStack of rApps

(you)rSpace

- Remember back when the internet was cool? -

-

- We may not have MySpace anymore, but we have (you)rSpace. + One platform. Every tool your community needs. All talking to each other.

- Build digital spaces to collaborate on improving your physical world. - Local-first, zero-knowledge privacy, outside the walls of big tech. + Data flows between apps automatically — no import/export rituals. + Local-first, encrypted, and yours.

Local-First - Self-Hosted + Multiplayer + + Encrypted Open Source - - Offline-Ready
- +
-

Everything Your Community Needs

+

One rStack. Every Tool Connected.

- Each tool works on its own, and they all work together. + rApps talk to each other through one shared sync layer. Here’s what that looks like. +

+
+
+
+ 📅 rCal + + 📋 rTasks + + 💬 rChats +
+

Schedule a meeting, auto-generates a task, notifies your space.

+
+
+
+ ☑ rChoices + + 💰 rWallet +
+

Vote passes, budget allocation releases automatically.

+
+
+
+ 🗺 rMaps + + 📝 rDocs +
+

Pin a community location, shared doc created for that place.

+
+
+
+ ⏱ rTime + + 📊 rData +
+

Log commitments, analytics update in real-time.

+
+
+
+
+ + +
+
+

${modules.length} rApps and Growing

+

+ Each app is independent and composable. Use one, use all, mix and match. +

+
+ ${ecosystemCards} +
+
+
+ + +
+
+

Offline-First, Always

+

+ Your data lives on your device. Changes sync when you’re online, + merge automatically when you’re not.

-
-
- -
-

Community Funds

-

Budget rivers, revenue splits, and enoughness thresholds. Transparent finances with quadratic funding built in.

+
+
1
+

Local Persistence

+

Every document is stored in encrypted IndexedDB on your device. Works without internet.

-
-
- -
-

Messaging & Forum

-

Real-time chat, threaded discussions, and async forums. All synced across devices with CRDT magic.

+
+
2
+

Auto-Merge CRDT

+

Automerge CRDTs resolve conflicts automatically. No “someone else is editing” lockouts.

-
-
- -
-

Files & Media

-

Upload, organize, and share with memory cards. Public links, folder trees, and metadata that travels with content.

-
-
-
- -
-

Passkey Identity

-

One passwordless login for the entire ecosystem. EncryptID uses WebAuthn — no passwords to leak, no accounts to hack.

-
-
-
- -
-

Dashboards & Data

-

Community analytics, voting results, spatial canvases. See everything at a glance and drill into what matters.

-
-
-
- -
-

Privacy by Design

-

Your data lives on your device first. End-to-end encrypted sync, per-document keys, zero-knowledge architecture.

+
+
3
+

Incremental Sync

+

Only changed bytes travel over the wire. Reconnect after days offline and catch up in seconds.

@@ -198,75 +227,14 @@ export function renderMainLanding(modules: ModuleInfo[]): string {
- -
-
-

Offline-First, Always

-

- Your data lives on your device. Changes sync when you’re online, - merge automatically when you’re not. -

-
-
-
1
-

Local Persistence

-

Every document is stored in encrypted IndexedDB on your device. Works without internet.

-
-
-
2
-

Auto-Merge CRDT

-

Automerge CRDTs resolve conflicts automatically. No “someone else is editing” lockouts.

-
-
-
3
-

Incremental Sync

-

Only changed bytes travel over the wire. Reconnect after days offline and catch up in seconds.

-
-
-

- Under the hood: Automerge CRDTs model every document as a mergeable data structure. - IndexedDB persists the full state locally so you never lose work. - A Service Worker caches the app shell for instant loads — even without a network connection. -

-
-
- - -
-
-

Interoperable by Design

-

- Every rApp reads and writes to the same sync layer. - No import/export rituals — data flows between tools automatically. -

-
-
  rDocs   rCal   rTasks   rMaps   rWallet  ...
-    |       |       |       |       |
-    v       v       v       v       v
- +--------------------------------------+
- |     Automerge  Sync  Layer           |
- |   (encrypted, per-document keys)     |
- +--------------------------------------+
-    |       |       |       |       |
-    v       v       v       v       v
-  Your    Your    Your    Your    Your
- Device  Phone  Laptop  Server  Backup
-
-
-
-
-

The Internet as It Was Always Meant to Be

+

Built for Communities, Not Corporations

No algorithms deciding what you see. No ads. No data harvesting. Just tools that work for you, run by you, owned by you.

-

- rSpace is infrastructure for communities who refuse to rent their digital commons - from landlords who read the mail, count the footsteps, and sell the maps. -

Your space. Your community. Your rules.

@@ -276,19 +244,6 @@ export function renderMainLanding(modules: ModuleInfo[]): string {
- -
-
-

${modules.length} rApps and Growing

-

- Each app is independent and composable. Use one, use all, mix and match. -

-
- ${ecosystemCards} -
-
-
-