diff --git a/backlog/tasks/task-51 - Consolidate-standalone-r-.online-domains-→-rspace.online.md b/backlog/tasks/task-51 - Consolidate-standalone-r-.online-domains-→-rspace.online.md new file mode 100644 index 0000000..5086d71 --- /dev/null +++ b/backlog/tasks/task-51 - Consolidate-standalone-r-.online-domains-→-rspace.online.md @@ -0,0 +1,44 @@ +--- +id: TASK-51 +title: Consolidate standalone r*.online domains → rspace.online +status: To Do +assignee: [] +created_date: '2026-02-25 07:46' +labels: + - infrastructure + - domains + - migration +dependencies: [] +references: + - server/index.ts (lines 457-521 — standalone rewrite logic) + - shared/module.ts (standaloneDomain interface) + - shared/components/rstack-app-switcher.ts (external link arrows) + - docker-compose.yml (lines 44-114 — Traefik labels) + - src/encryptid/server.ts (allowedOrigins list) + - src/encryptid/session.ts (JWT aud claim) +priority: high +--- + +## Description + + +Migrate ~20 standalone domains (rbooks.online, rmaps.online, rfunds.online, etc.) into path-based routing under rspace.online. Currently these domains are silently rewritten to /:space/:moduleId internally — this migration makes rspace.online the canonical URL, adds 301 redirects, removes dead infrastructure, and lets domains expire. + +Execution order: Phase 2 → 1 → 3 → 4 → 5 → 6 (fix external service URLs before enabling redirects). + +Key risks: +- rnetwork.online is dual-purpose (module alias AND TWENTY_API_URL) — must decouple before redirects +- sync.rmaps.online is a separate WebSocket service, not the rmaps module +- PWA/service worker caches on old domains may need self-unregistering workers +- keepStandalone domains (rcart.online, rfiles.online, swag.mycofi.earth, providers.mycofi.earth) need separate evaluation + + +## Acceptance Criteria + +- [ ] #1 All standalone domain hits return 301 → rspace.online/demo/{moduleId}/... +- [ ] #2 No hardcoded references to r*.online domains remain in codebase +- [ ] #3 WebAuthn/EncryptID auth works solely on rspace.online +- [ ] #4 Standalone Traefik labels and docker-compose.standalone.yml removed +- [ ] #5 Standalone .ts entry points deleted +- [ ] #6 Domain registrations allowed to expire + 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 new file mode 100644 index 0000000..82ec462 --- /dev/null +++ b/backlog/tasks/task-51.1 - Phase-2-Fix-external-service-URLs-analytics-maps-sync-Twenty-CRM.md @@ -0,0 +1,31 @@ +--- +id: TASK-51.1 +title: 'Phase 2: Fix external service URLs (analytics, maps sync, Twenty CRM)' +status: To Do +assignee: [] +created_date: '2026-02-25 07:47' +labels: + - infrastructure + - domains + - migration +dependencies: [] +parent_task_id: TASK-51 +priority: high +--- + +## Description + + +Update hardcoded references to standalone domains used as service endpoints. Must be done BEFORE Phase 1 redirects to avoid breaking analytics, maps sync, and network module. + +Files: website/index.html, website/create-space.html (collect.js), docker-compose.yml (MAPS_SYNC_URL, TWENTY_API_URL), modules/maps/mod.ts, modules/network/mod.ts. + +DECISION NEEDED: Is Twenty CRM (rnetwork.online) a separate container or proxied through network module? + + +## 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 + 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 new file mode 100644 index 0000000..0617bd8 --- /dev/null +++ b/backlog/tasks/task-51.2 - Phase-1-Convert-standalone-domain-rewrite-to-301-redirects.md @@ -0,0 +1,31 @@ +--- +id: TASK-51.2 +title: 'Phase 1: Convert standalone domain rewrite to 301 redirects' +status: To Do +assignee: [] +created_date: '2026-02-25 07:47' +labels: + - infrastructure + - domains + - migration +dependencies: + - TASK-51.1 +parent_task_id: TASK-51 +priority: high +--- + +## Description + + +Change server/index.ts standalone domain handling from silent rewrite to 301 redirect for HTML page loads. Keep API/WS rewriting so running apps don't break. Traefik labels stay — domains must still route to the container to serve the 301. + +Target: server/index.ts lines 482-521. Redirect HTML page loads, continue proxying /api/* and /ws/* requests. keepStandalone domains unaffected. + + +## 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 + diff --git a/backlog/tasks/task-51.3 - Phase-3-Update-UI-links-app-switcher-landing-page.md b/backlog/tasks/task-51.3 - Phase-3-Update-UI-links-app-switcher-landing-page.md new file mode 100644 index 0000000..7e43db5 --- /dev/null +++ b/backlog/tasks/task-51.3 - Phase-3-Update-UI-links-app-switcher-landing-page.md @@ -0,0 +1,31 @@ +--- +id: TASK-51.3 +title: 'Phase 3: Update UI links (app switcher, landing page)' +status: To Do +assignee: [] +created_date: '2026-02-25 07:47' +labels: + - infrastructure + - domains + - migration + - ui +dependencies: + - TASK-51.2 +parent_task_id: TASK-51 +priority: medium +--- + +## Description + + +Remove standalone domain references from user-facing UI. Remove external link arrow from app switcher, update landing page ecosystem links to path-based routes, remove standaloneDomain from ModuleInfo interface. + +Files: shared/components/rstack-app-switcher.ts, shared/module.ts, website/index.html, website/create-space.html. + + +## Acceptance Criteria + +- [ ] #1 App switcher shows no external link arrows +- [ ] #2 Landing page ecosystem links use /demo/{moduleId} paths +- [ ] #3 ModuleInfo no longer exposes standaloneDomain to client + diff --git a/backlog/tasks/task-51.4 - Phase-4-Simplify-EncryptID-and-WebAuthn-for-single-domain.md b/backlog/tasks/task-51.4 - Phase-4-Simplify-EncryptID-and-WebAuthn-for-single-domain.md new file mode 100644 index 0000000..d52b90d --- /dev/null +++ b/backlog/tasks/task-51.4 - Phase-4-Simplify-EncryptID-and-WebAuthn-for-single-domain.md @@ -0,0 +1,32 @@ +--- +id: TASK-51.4 +title: 'Phase 4: Simplify EncryptID and WebAuthn for single domain' +status: To Do +assignee: [] +created_date: '2026-02-25 07:47' +labels: + - infrastructure + - domains + - migration + - auth +dependencies: + - TASK-51.3 +parent_task_id: TASK-51 +priority: medium +--- + +## Description + + +Prune WebAuthn Related Origins, JWT audience claims, and CORS allowedOrigins now that all modules are on rspace.online. + +Files: server/index.ts (.well-known/webauthn), public/.well-known/webauthn, src/encryptid/session.ts (JWT aud), src/encryptid/server.ts (allowedOrigins + HTML templates). + + +## Acceptance Criteria + +- [ ] #1 Passkey login works on rspace.online +- [ ] #2 No CORS errors for auth flows +- [ ] #3 JWT aud is rspace.online only +- [ ] #4 .well-known/webauthn no longer lists standalone domains + diff --git a/backlog/tasks/task-51.5 - Phase-5-Remove-standalone-domain-dead-code-and-infrastructure.md b/backlog/tasks/task-51.5 - Phase-5-Remove-standalone-domain-dead-code-and-infrastructure.md new file mode 100644 index 0000000..dcdbec6 --- /dev/null +++ b/backlog/tasks/task-51.5 - Phase-5-Remove-standalone-domain-dead-code-and-infrastructure.md @@ -0,0 +1,32 @@ +--- +id: TASK-51.5 +title: 'Phase 5: Remove standalone domain dead code and infrastructure' +status: To Do +assignee: [] +created_date: '2026-02-25 07:48' +updated_date: '2026-02-25 07:48' +labels: + - infrastructure + - domains + - migration + - cleanup +dependencies: + - TASK-51.4 +parent_task_id: TASK-51 +priority: low +--- + +## Description + + +After 301 redirects have been live 3-6 months, strip all standalone domain machinery. Delete domainToModule map, keepStandalone set, rewrite/redirect block in server/index.ts. Remove standaloneDomain from RSpaceModule interface and all 22 mod.ts files. Delete all 20 standalone.ts entry points. Remove Traefik labels. Delete docker-compose.standalone.yml. + + +## Acceptance Criteria + +- [ ] #1 No references to standaloneDomain remain in codebase +- [ ] #2 No standalone.ts files exist +- [ ] #3 docker-compose.standalone.yml deleted +- [ ] #4 Traefik config only has rspace.online and *.rspace.online routers +- [ ] #5 All modules work via path-based routing + diff --git a/backlog/tasks/task-51.6 - Phase-6-DNS-cleanup-and-domain-expiry.md b/backlog/tasks/task-51.6 - Phase-6-DNS-cleanup-and-domain-expiry.md new file mode 100644 index 0000000..8d9d6e5 --- /dev/null +++ b/backlog/tasks/task-51.6 - Phase-6-DNS-cleanup-and-domain-expiry.md @@ -0,0 +1,31 @@ +--- +id: TASK-51.6 +title: 'Phase 6: DNS cleanup and domain expiry' +status: To Do +assignee: [] +created_date: '2026-02-25 07:48' +updated_date: '2026-02-25 07:48' +labels: + - infrastructure + - domains + - migration + - dns +dependencies: + - TASK-51.5 +parent_task_id: TASK-51 +priority: low +--- + +## Description + + +Operational phase — no code changes. Monitor Cloudflare analytics on old domains for 3-6 months. Remove tunnel hostname entries, DNS zones. Let Porkbun registrations expire. Keep rspace.online, ridentity.online, rstack.online, rmail.online. Evaluate keepStandalone domains separately. + + +## Acceptance Criteria + +- [ ] #1 No Cloudflare tunnel entries for expired domains +- [ ] #2 No DNS zones for expired domains +- [ ] #3 Domain renewals cancelled at Porkbun +- [ ] #4 Core domains retained + diff --git a/backlog/tasks/task-52 - Redesign-canvas-toolbar-with-grouped-dropdowns-and-collapse.md b/backlog/tasks/task-52 - Redesign-canvas-toolbar-with-grouped-dropdowns-and-collapse.md new file mode 100644 index 0000000..c0596d4 --- /dev/null +++ b/backlog/tasks/task-52 - Redesign-canvas-toolbar-with-grouped-dropdowns-and-collapse.md @@ -0,0 +1,32 @@ +--- +id: TASK-52 +title: Redesign canvas toolbar with grouped dropdowns and collapse +status: Done +assignee: + - '@claude' +created_date: '2026-02-25 21:07' +labels: + - ui + - canvas +dependencies: [] +priority: medium +--- + +## Description + + +The canvas toolbar had 28+ flat tool buttons in a single horizontal row that ran off screen on most displays. Redesigned with grouped dropdown menus and a collapse/minimize toggle. + +**Changes:** +- 6 category dropdowns: Create, Media, Embed, AI, Travel, Decide +- Direct-access buttons for Connect, Memory, and Zoom controls +- Collapse toggle (◀/▶) to minimize toolbar to a single button +- Mobile responsive: accordion-style groups instead of floating dropdowns +- Click-outside-to-close and auto-close-on-tool-select behavior + + +## Final Summary + + +Replaced 28 flat toolbar buttons with 6 grouped dropdowns (Create, Media, Embed, AI, Travel, Decide) plus direct-access Connect/Memory/Zoom buttons. Added collapsible toolbar toggle. Mobile-responsive with accordion-style groups. Commit: 5c3db2c on dev branch. +