From 751a2c8e7bc77462b8fb0e6d04a0ac780254471f Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Wed, 11 Mar 2026 19:12:51 -0700 Subject: [PATCH] fix(infra): consolidate external service URLs to rspace.online (TASK-51.1) - Replace rdata.online/collect.js with /collect.js proxy route (7 files) - Update MAPS_SYNC_URL to wss://maps-sync.rspace.online - Fix legacy TWENTY_API_URL to crm.rspace.online - Add Traefik host exclusions for maps-sync, crm, analytics, newsletter - Close TASK-23 (feature parity audit) and TASK-51.2 (301 redirects) Co-Authored-By: Claude Opus 4.6 --- ...ture-parity-audit-13-overlapping-shapes.md | 41 +++++++++++++++++-- ...ice-URLs-analytics-maps-sync-Twenty-CRM.md | 28 +++++++++++-- ...ndalone-domain-rewrite-to-301-redirects.md | 14 ++++--- docker-compose.standalone.yml | 2 +- docker-compose.yml | 4 +- modules/rmaps/mod.ts | 2 +- server/index.ts | 17 ++++++++ server/landing-proxy.ts | 2 +- server/landing.ts | 4 +- server/shell.ts | 4 +- website/create-space.html | 2 +- website/index.html | 2 +- website/public/landing.html | 4 +- 13 files changed, 100 insertions(+), 26 deletions(-) diff --git a/backlog/tasks/task-23 - Feature-parity-audit-13-overlapping-shapes.md b/backlog/tasks/task-23 - Feature-parity-audit-13-overlapping-shapes.md index 947941f..28d4253 100644 --- a/backlog/tasks/task-23 - Feature-parity-audit-13-overlapping-shapes.md +++ b/backlog/tasks/task-23 - Feature-parity-audit-13-overlapping-shapes.md @@ -1,7 +1,7 @@ --- id: TASK-23 title: 'Feature parity audit: 13 overlapping shapes' -status: To Do +status: Done assignee: [] created_date: '2026-02-18 19:49' labels: @@ -37,7 +37,40 @@ For each pair: read both implementations, note feature gaps, classify as critica ## Acceptance Criteria -- [ ] #1 All 13 shape pairs compared side-by-side -- [ ] #2 Feature gaps documented with severity (critical/nice-to-have) -- [ ] #3 Critical gaps identified for immediate fix +- [x] #1 All 13 shape pairs compared side-by-side +- [x] #2 Feature gaps documented with severity (critical/nice-to-have) +- [x] #3 Critical gaps identified for immediate fix + +## Implementation Notes + +### Audit Findings Summary + +Completed feature-parity audit across all 13 shape pairs. Identified critical gaps in 7 shapes requiring backend/architecture work: + +**Critical Gaps by Shape:** + +1. **folk-chat**: No real-time backend sync (local-only messages). Messages only persist in client-side Automerge store; no server broadcast or presence system. + +2. **folk-video-chat**: No peer-to-peer video infrastructure. Missing Jitsi integration; only local camera preview available. + +3. **folk-markdown**: Plain textarea implementation vs canvas-website's MDXEditor. No table support, syntax highlighting, or rich markdown features. + +4. **folk-slide**: No slide navigation or presentation system. Currently a decorative container only; lacks deck traversal and full-screen mode. + +5. **folk-prompt**: No streaming response support. No arrow-binding template substitution for dynamic prompt construction from shape references. + +6. **folk-obs-note**: No vault sync mechanism (Quartz/GitHub integration). Plain textarea editor without multi-format obsidian compatibility. + +7. **folk-map**: No collaborative presence indicators, pin annotations, routing/directions, or multi-style layer support (satellite, terrain). + +**Pervasive Gap (All 13 Shapes)**: +StandardizedToolWrapper features missing across all implementations: pin/minimize/maximize/tags. These foundational window-management features need framework-level integration. + +**Best Parity Shapes** (closest feature coverage): +- folk-google-item: Good feature alignment with canvas-website GoogleItem +- folk-embed: Functional iframe/external content support +- folk-transcription: Core audio-to-text parity achieved + +**Recommendation**: +Prioritize real-time sync infrastructure (folk-chat, folk-video-chat) and StandardizedToolWrapper integration as foundational for improving parity across all shapes. Markdown and slide features require moderate lift; map and obs-note features are lower priority for MVP. diff --git a/backlog/tasks/task-51.1 - Phase-2-Fix-external-service-URLs-analytics-maps-sync-Twenty-CRM.md b/backlog/tasks/task-51.1 - Phase-2-Fix-external-service-URLs-analytics-maps-sync-Twenty-CRM.md index 82ec462..f5615a3 100644 --- a/backlog/tasks/task-51.1 - Phase-2-Fix-external-service-URLs-analytics-maps-sync-Twenty-CRM.md +++ b/backlog/tasks/task-51.1 - Phase-2-Fix-external-service-URLs-analytics-maps-sync-Twenty-CRM.md @@ -1,7 +1,7 @@ --- id: TASK-51.1 title: 'Phase 2: Fix external service URLs (analytics, maps sync, Twenty CRM)' -status: To Do +status: Done assignee: [] created_date: '2026-02-25 07:47' labels: @@ -25,7 +25,27 @@ DECISION NEEDED: Is Twenty CRM (rnetwork.online) a separate container or proxied ## Acceptance Criteria -- [ ] #1 Analytics collect.js loads from relative path on rspace.online -- [ ] #2 Maps sync WebSocket connects via new URL -- [ ] #3 Network module reaches Twenty CRM without depending on rnetwork.online domain +- [x] #1 Analytics collect.js loads from relative path on rspace.online +- [x] #2 Maps sync WebSocket connects via new URL +- [x] #3 Network module reaches Twenty CRM without depending on rnetwork.online domain + +## Implementation Notes + + +### AC#1 — collect.js +- Added root-level `/collect.js` proxy route in `server/index.ts` (proxies from Umami at `analytics.rspace.online`) +- Replaced `https://rdata.online/collect.js` → `/collect.js` in: server/landing-proxy.ts, server/shell.ts (2x), server/landing.ts (2x), website/create-space.html, website/index.html, website/public/landing.html + +### AC#2 — Maps sync +- Changed `MAPS_SYNC_URL` in docker-compose.yml: `wss://sync.rmaps.online` → `wss://maps-sync.rspace.online` +- Changed fallback in `modules/rmaps/mod.ts` to `wss://maps-sync.rspace.online` +- Added `Host(maps-sync.rspace.online)` to rmaps-sync Traefik labels on Netcup +- Added `maps-sync.rspace.online` CNAME in Cloudflare DNS +- Added `!Host(maps-sync.rspace.online)` exclusion to rspace-canvas wildcard Traefik rule + +### AC#3 — Twenty CRM +- Already resolved: main docker-compose uses `TWENTY_API_URL=http://twenty-ch-server:3000` (internal Docker DNS) +- Fallback in rnetwork module already points to `crm.rspace.online` +- Fixed legacy docker-compose.standalone.yml: `https://rnetwork.online` → `https://crm.rspace.online` + diff --git a/backlog/tasks/task-51.2 - Phase-1-Convert-standalone-domain-rewrite-to-301-redirects.md b/backlog/tasks/task-51.2 - Phase-1-Convert-standalone-domain-rewrite-to-301-redirects.md index 0617bd8..77cdc51 100644 --- a/backlog/tasks/task-51.2 - Phase-1-Convert-standalone-domain-rewrite-to-301-redirects.md +++ b/backlog/tasks/task-51.2 - Phase-1-Convert-standalone-domain-rewrite-to-301-redirects.md @@ -1,7 +1,7 @@ --- id: TASK-51.2 title: 'Phase 1: Convert standalone domain rewrite to 301 redirects' -status: To Do +status: Done assignee: [] created_date: '2026-02-25 07:47' labels: @@ -24,8 +24,12 @@ Target: server/index.ts lines 482-521. Redirect HTML page loads, continue proxyi ## Acceptance Criteria -- [ ] #1 rmaps.online/some-room returns 301 to rspace.online/demo/maps/some-room -- [ ] #2 rbooks.online/ returns 301 to rspace.online/demo/books -- [ ] #3 API and WebSocket requests still proxied without redirect -- [ ] #4 keepStandalone domains unaffected +- [x] #1 rmaps.online/some-room returns 301 to rspace.online/demo/maps/some-room +- [x] #2 rbooks.online/ returns 301 to rspace.online/demo/books +- [x] #3 API and WebSocket requests still proxied without redirect +- [x] #4 keepStandalone domains unaffected + +## Implementation Notes + +301 redirect logic fully implemented in server/index.ts lines 2028-2098. domainToModule map built from mod.standaloneDomain, proper 301 Response.redirect issued, API/WS paths excluded. Traefik labels route all 20 standalone domains. diff --git a/docker-compose.standalone.yml b/docker-compose.standalone.yml index 5c89f27..e91870e 100644 --- a/docker-compose.standalone.yml +++ b/docker-compose.standalone.yml @@ -240,7 +240,7 @@ services: command: ["bun", "run", "modules/rnetwork/standalone.ts"] environment: <<: *base-env - TWENTY_API_URL: https://rnetwork.online + TWENTY_API_URL: https://crm.rspace.online TWENTY_API_TOKEN: ${TWENTY_API_TOKEN} labels: <<: *traefik-enabled diff --git a/docker-compose.yml b/docker-compose.yml index 1dc8a70..730526e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -34,7 +34,7 @@ services: - FUNNEL_ID=0ff6a9ac-1667-4fc7-9a01-b1620810509f - UMAMI_URL=https://analytics.rspace.online - UMAMI_WEBSITE_ID=292f6ac6-79f8-497b-ba6a-7a51e3b87b9f - - MAPS_SYNC_URL=wss://sync.rmaps.online + - MAPS_SYNC_URL=wss://maps-sync.rspace.online - IMAP_HOST=mail.rmail.online - IMAP_PORT=993 - IMAP_TLS_REJECT_UNAUTHORIZED=false @@ -61,7 +61,7 @@ services: - "traefik.http.routers.rspace-main.entrypoints=web" - "traefik.http.routers.rspace-main.priority=110" # Subdomains — backward compat for *.rspace.online canvas - - "traefik.http.routers.rspace-canvas.rule=HostRegexp(`{subdomain:[a-z0-9-]+}.rspace.online`) && !Host(`rspace.online`) && !Host(`www.rspace.online`) && !Host(`auth.rspace.online`)" + - "traefik.http.routers.rspace-canvas.rule=HostRegexp(`{subdomain:[a-z0-9-]+}.rspace.online`) && !Host(`rspace.online`) && !Host(`www.rspace.online`) && !Host(`auth.rspace.online`) && !Host(`maps-sync.rspace.online`) && !Host(`crm.rspace.online`) && !Host(`analytics.rspace.online`) && !Host(`newsletter.rspace.online`)" - "traefik.http.routers.rspace-canvas.entrypoints=web" - "traefik.http.routers.rspace-canvas.priority=100" # ── Standalone domain routing (priority 120) — redirect to rspace.online ── diff --git a/modules/rmaps/mod.ts b/modules/rmaps/mod.ts index ea7a2c0..de0c5fe 100644 --- a/modules/rmaps/mod.ts +++ b/modules/rmaps/mod.ts @@ -18,7 +18,7 @@ const SYNC_SERVER = process.env.MAPS_SYNC_URL || "http://localhost:3001"; // ── Sync URL for client-side WebSocket connection ── routes.get("/api/sync-url", (c) => { - const wsUrl = process.env.MAPS_SYNC_URL || "wss://sync.rmaps.online"; + const wsUrl = process.env.MAPS_SYNC_URL || "wss://maps-sync.rspace.online"; return c.json({ syncUrl: wsUrl }); }); diff --git a/server/index.ts b/server/index.ts index 033451c..8a73c19 100644 --- a/server/index.ts +++ b/server/index.ts @@ -153,6 +153,23 @@ app.get("/.well-known/webauthn", (c) => { ); }); +// ── Analytics tracker (proxied from Umami — replaces rdata.online/collect.js) ── +const UMAMI_URL = process.env.UMAMI_URL || "https://analytics.rspace.online"; +app.get("/collect.js", async (c) => { + try { + const res = await fetch(`${UMAMI_URL}/script.js`, { signal: AbortSignal.timeout(5000) }); + if (res.ok) { + const script = await res.text(); + return new Response(script, { + headers: { "Content-Type": "application/javascript", "Cache-Control": "public, max-age=3600" }, + }); + } + } catch {} + return new Response("/* umami unavailable */", { + headers: { "Content-Type": "application/javascript" }, + }); +}); + // ── Serve generated files from /data/files/generated/ ── app.get("/data/files/generated/:filename", async (c) => { const filename = c.req.param("filename"); diff --git a/server/landing-proxy.ts b/server/landing-proxy.ts index e8f403d..8d0d160 100644 --- a/server/landing-proxy.ts +++ b/server/landing-proxy.ts @@ -163,7 +163,7 @@ async function transformWithRewriter( element(el) { el.append( ` -`, +`, { html: true }, ); }, diff --git a/server/landing.ts b/server/landing.ts index a3ebd7c..4cb7908 100644 --- a/server/landing.ts +++ b/server/landing.ts @@ -57,7 +57,7 @@ export function renderMainLanding(modules: ModuleInfo[]): string { - +
@@ -297,7 +297,7 @@ export function renderSpaceDashboard(space: string, modules: ModuleInfo[]): stri - +
diff --git a/server/shell.ts b/server/shell.ts index 45aa6c9..bdffdf4 100644 --- a/server/shell.ts +++ b/server/shell.ts @@ -1195,7 +1195,7 @@ export function renderModuleLanding(opts: ModuleLandingOptions): string { ${cssBlock} - +
@@ -1539,7 +1539,7 @@ export function renderSubPageInfo(opts: SubPageInfoOptions): string { - +
diff --git a/website/create-space.html b/website/create-space.html index 3e2c63b..cdcd666 100644 --- a/website/create-space.html +++ b/website/create-space.html @@ -219,7 +219,7 @@ color: var(--rs-text-muted); } - +
diff --git a/website/index.html b/website/index.html index a2ea94c..d8bbb1d 100644 --- a/website/index.html +++ b/website/index.html @@ -262,7 +262,7 @@ } - +
diff --git a/website/public/landing.html b/website/public/landing.html index eb1e81c..c5c6633 100644 --- a/website/public/landing.html +++ b/website/public/landing.html @@ -1,4 +1,4 @@ -rSpace.online - Reclaim Your Space on the New Web
rSpace logo
Welcome to

rSpace.online

Remember back when the internet was cool?

We may not have Myspace anymore, but we have

(ou)rSpace

(and it's online)

Build digital spaces to collaborate on improving your physical world. Local-first, zero knowledge data privacy, outside the walls of big tech.

Zero-Knowledge Data PrivacySelf-InfrastructuredLocal-First

Shared Digital Spaces for Collaboration

Everything you need to build thriving communities outside big tech's surveillance apparatus

Shared Funds

Allocate and manage community resources through transparent, customizable controls.

Secure Messaging

End-to-end encrypted communication channels for your community. Nobody can read your messages, not even us.

File Sharing

Share files and create collaborative views over data with localized, zero-knowledge storage.

Delegated Authority

Manage group permissions and authority structures democratically. Your space, your rules.

Interactive Dashboards

Multidimensional views of your data powered by folkjs - HTML as a computing substrate.

Data Privacy

Zero-knowledge architecture ensures your data never exists unencrypted outside your control.

EncryptID

One secure, local-first identity across every tool in your community's rSpace. No passwords. No cloud accounts. Your keys never leave your device.

Passkey Login

Hardware-backed biometric auth. Phishing-resistant by design.

Local-First

Cryptographic keys are derived and stored on your device, never uploaded.

One Login, All Apps

Authenticate once and access every r-Ecosystem tool seamlessly.

Secure by default, not by opt-in

EncryptID uses WebAuthn passkeys as the root of trust — the same standard behind Face ID and fingerprint unlock. Your identity is bound to your device's secure hardware, so there are no passwords to leak, phish, or forget. End-to-end encryption keys are derived locally via HKDF, meaning the server never sees your private keys. If you lose your device, social recovery lets trusted guardians help you regain access without seed phrases or centralized reset flows.

A common login for your community's toolkit

Every community rSpace comes with a full suite of interoperable tools — voting, budgets, maps, files, notes, and more — all sharing the same EncryptID session. Sign in once on rSpace and you're already authenticated on rVote, rFlows, rFiles, and every other tool your community uses. No separate accounts, no OAuth redirects, no third-party identity providers. Your community, your identity, your data.

Offline-First, Always Available

rSpace works without an internet connection. Edit your canvas on a plane, in a field, or underground — your changes merge automatically when you're back online. No sync buttons, no conflict dialogs.

Local Persistence

Your canvas is cached in the browser. Refresh the page — it loads instantly, even offline.

Auto-Merge

Automerge CRDTs resolve conflicts automatically. Multiple people can edit the same canvas offline and merge without data loss.

Incremental Sync

Only new changes are transferred on reconnect — not the whole document. Fast even on slow connections.

How it works

Every rSpace canvas is an Automerge CRDT document stored locally in your browser's IndexedDB. When you open a canvas, it renders from the local cache first — no waiting for the server. Edits you make are saved locally and synced to the server via WebSocket when a connection is available. If you go offline, the app keeps working: a Service Worker serves the app shell from cache, and your changes accumulate in the local CRDT document. When connectivity returns, Automerge's incremental sync protocol reconciles your changes with everyone else's — conflict-free, automatically. No manual merge, no "which version do you want to keep?" dialogs.

The Internet as It Was Always Meant to Be

The legacy internet has become a collection of walled gardens controlled by a handful of corporations. Your data is commodified. Your attention is sold. Your privacy is an illusion.

rSpace is built on a simple principle: technology should serve people, not profit margins.

We're bringing back the spirit of the early web - when MySpace let you express yourself, when communities formed around shared purpose, when the internet felt like it belonged to everyone.

Local-First Principles

Your data lives on your devices. Work offline. Sync when connected. No central servers controlling your access or mining your information.

Communities of Purpose

Build spaces around what matters - not what drives engagement metrics. Organize, collaborate, and govern democratically.

Zero Knowledge Privacy

End-to-end encrypted by default. Your data never exists unencrypted outside your control. Surveillance capitalism has no place here.

Built Different

A new substrate for digital collaboration

01

Built on folkjs

HTML as a computing substrate. Interactive, reactive interfaces using familiar web technologies - no complex frameworks required.

02

Local-First Storage

Your data lives on your device. Distributed sync protocols keep your rSpace updated across the mesh without centralized servers.

03

Zero-Knowledge Architecture

All encryption happens on your device. Share selectively through cryptographic proofs. Nobody can access what they shouldn't see.

Powered by folkjs - bringing the internet back to what it was always meant to be

A basic HTML computing substrate for building truly interactive, local-first applications

Interoperable by Design

Data flows between your community's tools because they share a common foundation: the same identity, the same real-time sync layer, and the same local-first architecture.

  EncryptID (identity)
+rSpace.online - Reclaim Your Space on the New Web
rSpace logo
Welcome to

rSpace.online

Remember back when the internet was cool?

We may not have Myspace anymore, but we have

(ou)rSpace

(and it's online)

Build digital spaces to collaborate on improving your physical world. Local-first, zero knowledge data privacy, outside the walls of big tech.

Zero-Knowledge Data PrivacySelf-InfrastructuredLocal-First

Shared Digital Spaces for Collaboration

Everything you need to build thriving communities outside big tech's surveillance apparatus

Shared Funds

Allocate and manage community resources through transparent, customizable controls.

Secure Messaging

End-to-end encrypted communication channels for your community. Nobody can read your messages, not even us.

File Sharing

Share files and create collaborative views over data with localized, zero-knowledge storage.

Delegated Authority

Manage group permissions and authority structures democratically. Your space, your rules.

Interactive Dashboards

Multidimensional views of your data powered by folkjs - HTML as a computing substrate.

Data Privacy

Zero-knowledge architecture ensures your data never exists unencrypted outside your control.

EncryptID

One secure, local-first identity across every tool in your community's rSpace. No passwords. No cloud accounts. Your keys never leave your device.

Passkey Login

Hardware-backed biometric auth. Phishing-resistant by design.

Local-First

Cryptographic keys are derived and stored on your device, never uploaded.

One Login, All Apps

Authenticate once and access every r-Ecosystem tool seamlessly.

Secure by default, not by opt-in

EncryptID uses WebAuthn passkeys as the root of trust — the same standard behind Face ID and fingerprint unlock. Your identity is bound to your device's secure hardware, so there are no passwords to leak, phish, or forget. End-to-end encryption keys are derived locally via HKDF, meaning the server never sees your private keys. If you lose your device, social recovery lets trusted guardians help you regain access without seed phrases or centralized reset flows.

A common login for your community's toolkit

Every community rSpace comes with a full suite of interoperable tools — voting, budgets, maps, files, notes, and more — all sharing the same EncryptID session. Sign in once on rSpace and you're already authenticated on rVote, rFlows, rFiles, and every other tool your community uses. No separate accounts, no OAuth redirects, no third-party identity providers. Your community, your identity, your data.

Offline-First, Always Available

rSpace works without an internet connection. Edit your canvas on a plane, in a field, or underground — your changes merge automatically when you're back online. No sync buttons, no conflict dialogs.

Local Persistence

Your canvas is cached in the browser. Refresh the page — it loads instantly, even offline.

Auto-Merge

Automerge CRDTs resolve conflicts automatically. Multiple people can edit the same canvas offline and merge without data loss.

Incremental Sync

Only new changes are transferred on reconnect — not the whole document. Fast even on slow connections.

How it works

Every rSpace canvas is an Automerge CRDT document stored locally in your browser's IndexedDB. When you open a canvas, it renders from the local cache first — no waiting for the server. Edits you make are saved locally and synced to the server via WebSocket when a connection is available. If you go offline, the app keeps working: a Service Worker serves the app shell from cache, and your changes accumulate in the local CRDT document. When connectivity returns, Automerge's incremental sync protocol reconciles your changes with everyone else's — conflict-free, automatically. No manual merge, no "which version do you want to keep?" dialogs.

The Internet as It Was Always Meant to Be

The legacy internet has become a collection of walled gardens controlled by a handful of corporations. Your data is commodified. Your attention is sold. Your privacy is an illusion.

rSpace is built on a simple principle: technology should serve people, not profit margins.

We're bringing back the spirit of the early web - when MySpace let you express yourself, when communities formed around shared purpose, when the internet felt like it belonged to everyone.

Local-First Principles

Your data lives on your devices. Work offline. Sync when connected. No central servers controlling your access or mining your information.

Communities of Purpose

Build spaces around what matters - not what drives engagement metrics. Organize, collaborate, and govern democratically.

Zero Knowledge Privacy

End-to-end encrypted by default. Your data never exists unencrypted outside your control. Surveillance capitalism has no place here.

Built Different

A new substrate for digital collaboration

01

Built on folkjs

HTML as a computing substrate. Interactive, reactive interfaces using familiar web technologies - no complex frameworks required.

02

Local-First Storage

Your data lives on your device. Distributed sync protocols keep your rSpace updated across the mesh without centralized servers.

03

Zero-Knowledge Architecture

All encryption happens on your device. Share selectively through cryptographic proofs. Nobody can access what they shouldn't see.

Powered by folkjs - bringing the internet back to what it was always meant to be

A basic HTML computing substrate for building truly interactive, local-first applications

Interoperable by Design

Data flows between your community's tools because they share a common foundation: the same identity, the same real-time sync layer, and the same local-first architecture.

  EncryptID (identity)
        |
        v
   ┌─────────── rSpace CRDT Sync Layer ───────────┐
@@ -10,4 +10,4 @@
   └───────────────────────────────────────────────┘
        |
        v
-  Your device (keys & data stay here)

Your data, connected across tools

A budget created in rFlows can reference a vote from rVote. A map pin in rMaps can link to files in rFiles and notes in rNotes. Because all r-Ecosystem tools share the same Automerge CRDT sync layer, data is interoperable without import/export steps or API integrations. Changes propagate in real-time across every tool and every collaborator — conflict-free.

No vendor lock-in, no data silos

Every piece of community data is stored as a local-first CRDT document that your community owns. There's no central server gating access and no proprietary format trapping your data. Export everything. Fork your community. Move between hosts. The r-Ecosystem is designed so that the community — not the platform — controls the data.

Shared Digital Spaces for Real World Impact

rSpaces aren't just for chatting online—they're tools for making your real neighborhood better.

The rSpace Ecosystem

rMaps

rMaps.online

Collaborative spatial mapping. Plot ideas, resources, and relationships on shared canvases.

rCart

rCart.online

Community commerce. Coordinate group purchases and share resources locally.

rCal

rCal.online

Shared calendars for communities. Coordinate events, meetings, and availability together.

rFlows

rFlows.online

Threshold-based flow funding. Design continuous funding flows with overflow routing and outcome tracking.

rFiles

rFiles.online

Shared file workspaces. Organize documents, media, and assets together in real time.

rWallet

rWallet.online

Community treasury management. Track shared resources, contributions, and funding flows.

rNotes

rNotes.online

Collaborative note-taking. Capture and organize ideas together in shared notebooks.

rVote

rVote.online

Democratic backlog prioritization. Quadratic proposal ranking lets communities surface the best ideas.

rTrips

rTrips.online

Plan adventures together. Coordinate group travel, shared itineraries, and trip logistics.

rTube

rTube.online

Community video sharing. Host and curate video content for your community.

rChats

rChats.online

Encrypted group messaging. Real-time channels for your community, end-to-end encrypted.

rForum

rForum.online

Community discussion forums. Threaded conversations for deeper, asynchronous dialogue.

rSwag

rSwag.online

Community merchandise on demand. Design custom stickers, shirts, and more with AI-powered tools.

rNetwork

rNetwork.online

Visualize community connections. Map relationships and networks across your ecosystem.

rInbox

rInbox.online

Community email and notifications. Unified inbox for all your rSpace communications.

rTasks

rTasks.online

Collaborative task management. Kanban boards and project pipelines for community projects.

Your space. Your community. Your rules.

Join the Movement

Part of a growing ecosystem building alternatives to surveillance capitalism

Ready to Reclaim Your Digital Space?

Join communities building the future of the web - one rSpace at a time

Stay Connected with rSpace

Subscribe for updates on real-time collaboration, spatial computing, and building connected futures.

No spam, unsubscribe anytime. We respect your privacy.

\ No newline at end of file + Your device (keys & data stay here)

Your data, connected across tools

A budget created in rFlows can reference a vote from rVote. A map pin in rMaps can link to files in rFiles and notes in rNotes. Because all r-Ecosystem tools share the same Automerge CRDT sync layer, data is interoperable without import/export steps or API integrations. Changes propagate in real-time across every tool and every collaborator — conflict-free.

No vendor lock-in, no data silos

Every piece of community data is stored as a local-first CRDT document that your community owns. There's no central server gating access and no proprietary format trapping your data. Export everything. Fork your community. Move between hosts. The r-Ecosystem is designed so that the community — not the platform — controls the data.

Shared Digital Spaces for Real World Impact

rSpaces aren't just for chatting online—they're tools for making your real neighborhood better.

The rSpace Ecosystem

rMaps

rMaps.online

Collaborative spatial mapping. Plot ideas, resources, and relationships on shared canvases.

rCart

rCart.online

Community commerce. Coordinate group purchases and share resources locally.

rCal

rCal.online

Shared calendars for communities. Coordinate events, meetings, and availability together.

rFlows

rFlows.online

Threshold-based flow funding. Design continuous funding flows with overflow routing and outcome tracking.

rFiles

rFiles.online

Shared file workspaces. Organize documents, media, and assets together in real time.

rWallet

rWallet.online

Community treasury management. Track shared resources, contributions, and funding flows.

rNotes

rNotes.online

Collaborative note-taking. Capture and organize ideas together in shared notebooks.

rVote

rVote.online

Democratic backlog prioritization. Quadratic proposal ranking lets communities surface the best ideas.

rTrips

rTrips.online

Plan adventures together. Coordinate group travel, shared itineraries, and trip logistics.

rTube

rTube.online

Community video sharing. Host and curate video content for your community.

rChats

rChats.online

Encrypted group messaging. Real-time channels for your community, end-to-end encrypted.

rForum

rForum.online

Community discussion forums. Threaded conversations for deeper, asynchronous dialogue.

rSwag

rSwag.online

Community merchandise on demand. Design custom stickers, shirts, and more with AI-powered tools.

rNetwork

rNetwork.online

Visualize community connections. Map relationships and networks across your ecosystem.

rInbox

rInbox.online

Community email and notifications. Unified inbox for all your rSpace communications.

rTasks

rTasks.online

Collaborative task management. Kanban boards and project pipelines for community projects.

Your space. Your community. Your rules.

Join the Movement

Part of a growing ecosystem building alternatives to surveillance capitalism

Ready to Reclaim Your Digital Space?

Join communities building the future of the web - one rSpace at a time

Stay Connected with rSpace

Subscribe for updates on real-time collaboration, spatial computing, and building connected futures.

No spam, unsubscribe anytime. We respect your privacy.

\ No newline at end of file