Email forwarding (EncryptID):
- New mailcow.ts API client for alias CRUD via Mailcow REST API
- Schema: email_forward_enabled + email_forward_mailcow_id columns
- API endpoints: GET/POST email-forward status, enable, disable
- Profile email change hook updates/disables alias automatically
- Docker: rmail-mailcow network + MAILCOW_API_URL/KEY env vars
Private spaces:
- Access gate overlay blocks members_only spaces for unauthenticated users
- Space visibility injected into HTML via middleware
- Auto-provision creates spaces as members_only by default
- Personalized "Create {username}'s Space" CTA in space switcher
- Removed unused /notifications endpoint
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All 22 module directories under modules/ now match their module IDs
(e.g. modules/cart → modules/rcart, modules/canvas → modules/rspace).
Updated all import paths, vite build config, HTML template asset refs,
docker-compose standalone commands, and .gitignore accordingly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Tab close (×) buttons now visible at 35% opacity instead of hidden,
brightening on hover so users can see they're clickable
- [+] dropdown now shows all rApps including already-open ones
- Already-open rApps shown dimmed with a cyan dot indicator
- Clicking an open rApp surfaces it (switches tab) instead of duplicating
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Tab close (×) buttons now visible at 35% opacity instead of hidden,
brightening on hover so users can see they're clickable
- [+] dropdown now shows all rApps including already-open ones
- Already-open rApps shown dimmed with a cyan dot indicator
- Clicking an open rApp surfaces it (switches tab) instead of duplicating
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Browsers were serving stale JS from cache. Added ?v=3 to all four
updated module component scripts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
rCal: keyboard navigation (←→ nav, 1/2/3 views, T today, L lunar) and
clickable source badges for event filtering.
rWork: inline create form with priority/description, inline title editing,
and priority badge cycling (replaces prompt() dialogs).
rNetwork: force-directed layout (80-iteration simulation), node detail
panel with trust scores, and purple trust badges on person nodes.
rMaps: provider search with dimming, enhanced detail with OSM directions
link, and browser geolocation pin display.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Previously loaded tabs stay in the DOM and are shown/hidden via CSS.
New tabs are fetched via fetch() + DOMParser on first visit, then
cached. Switching back is instant with no network request.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Dropdown menus in app-switcher and space-switcher were clipped by
overflow:hidden on .rstack-header__left (mobile). Changed from
position:absolute to position:fixed with dynamic getBoundingClientRect
positioning. Bumped shell asset versions to v=5 to bypass CF cache.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
On demo.rspace.online, the dropdown was linking to landing pages
(rspace.online/moduleId) instead of navigating between demo pages.
Changed condition to only use landing-page links on the bare domain.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Dashboard card hrefs were /{space}/{moduleId}, causing double-prefix
(/demo/demo/rbooks) when accessed via demo.rspace.online subdomain
routing. Now renders /{moduleId} and resolves via __rspaceNavUrl on
the client for cross-context compatibility.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add ?view=app iframe integration for 4 existing modules (rNetwork→Twenty CRM,
rSocials→Postiz, rForum→Discourse, rFiles→Seafile) and 2 new modules
(rDocs→Docmost, rDesign→Affine). Each module shows its demo view by default
with an "Open Full App" button to switch to the iframe-embedded external app.
Also includes: splat demo data seeding, MI search bar mobile layout fix.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
On screens <= 640px, the header wraps to two rows: logo/app-switcher
and identity on top, "Ask Mi Anything" search bar full-width below.
Header and tab row switch from fixed to sticky positioning on mobile,
eliminating the need for magic padding-top values on #app.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shell CSS: add body background (#0f172a) so all module pages have the
dark theme instead of transparent/white on mobile. Add mobile media
queries for #app padding and nav wrapping.
Calendar: add day-detail panel that opens on tap (crucial for mobile
where event labels are hidden). Improve touch targets, add source
badges in event modal, shorter weekday headers for narrow screens.
Cache-bust shell.css, cal JS, and swag JS via ?v=2 query params to
bypass Cloudflare edge cache.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Step 2 (design mockup + "Use Sample Design" button) was gated behind
demoStep >= 2, but the only way to reach step 2 was clicking a button
inside the hidden section. Now mockup is always visible alongside
product selection.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Improve interactive demos for notes, maps, network, vote, calendar,
choices, trips, work, books, wallet, and inbox modules with richer
mock data and better mobile responsiveness. Update server routing
and landing page. Add sharp, imapflow, mailparser, and x402 dependencies.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
rCal: add mobile responsive breakpoints, event times with colored
borders, and Today button. rTube: auto-select first video, hide Live
Stream tab in demo, show duration/date metadata. rPubs: fix mobile
layout height calc and toolbar stacking.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Each folk-* web component detects space === "demo" and renders a
self-contained interactive demo with hardcoded data — no API calls or
WebSocket connections. Accessible at demo.rspace.online/{rApp}.
Includes: spider charts, drag-to-rank, live voting sim, kanban board,
video library, calendar with lunar phases, forum provisioner, email
client, conviction voting, trip planner, book shelf, pub editor,
wallet viewer, world map, analytics dashboard, cart shop, file browser,
swag designer, photo gallery, graph viewer, social feed, and funds river.
Also adds @media responsive CSS for mobile rendering across all modules.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
rTrips, rFunds, rVote etc. now resolve correctly — normalizes module
ID to lowercase in subdomain routing, bare-domain routing, and 404
fallback checks.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the 177KB static Next.js landing with a server-rendered page using
the same shell, theme, and rl-* CSS utilities as all module landings. Fixes
the 354KB logo.png → 1.6KB favicon.png glitch across all pages. Dynamic
ecosystem grid is always in sync with registered modules.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the 177KB static Next.js landing with a server-rendered page using
the same shell, theme, and rl-* CSS utilities as all module landings. Fixes
the 354KB logo.png → 1.6KB favicon.png glitch across all pages. Dynamic
ecosystem grid is always in sync with registered modules.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The panel had a hardcoded left offset (88px) that didn't account for
the toolbar's actual width, causing the submenu to overlap the toolbar.
Now uses getBoundingClientRect() to position 8px right of the toolbar
edge. Skipped on mobile where the panel uses its own bottom-sheet layout.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The auto-provision redirect was hardcoding /${slug}/canvas which is a
404 (canvas module id is "rspace"). Now uses rspaceNavUrl() for correct
subdomain/path routing. Also passes onSuccess to showAuthModal so
auto-provision runs even when signing in from a non-demo space.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace internal rewrites with 301 redirects for all standalone
domains. Handles bare domains, subdomains, paths, and query strings:
- rnotes.online/ → rspace.online/rnotes
- rnotes.online/alice/path → alice.rspace.online/rnotes/path
- alice.rnotes.online/path → alice.rspace.online/rnotes/path
- rnotes.online/api/... → rspace.online/rnotes/api/...
Traefik labels updated to also match *.r*.online subdomains.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Restyled website/index.html to use the standard rl-* rich landing CSS
utilities matching all rApp module landing pages: rl-hero, rl-section,
rl-card, rl-grid-3, rl-icon-box, rl-cta-primary/secondary. All original
content preserved (EncryptID, Offline-First, Interoperable, Newsletter).
Added (you)rSpace CTA button in the space switcher dropdown — shows
"Sign in to create" or "Create (you)rSpace" when user has no owned space,
with auto-provision flow on click.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Backend: deleteCommunity(), updateSpaceMeta(), DELETE/PATCH space endpoints,
member CRUD, per-space access-requests GET. UI: gear icon on owned spaces,
3-tab Edit Space modal (Settings, Members, Invitations) in space switcher.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reverted shell.css import on landing.html (its global `*` reset destroys
Tailwind layout). Instead: shell.js for component registration + inline
rstack-header CSS only. The standard header with logo, app-switcher,
MI bar, identity, and Try Demo now renders without breaking the page.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Canvas.html now has full parity with the shell header used by all other rApps:
- Register RStackMi so the MI bar actually works on canvas
- Add "Try Demo" button, welcome overlay for first-time demo visitors
- Add iframe detection (rspace-embedded), auth-change listener, auto-space resolution
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Serve the original Next.js rSpace-website (MySpace / (ou)rSpace
messaging) as the landing page at rspace.online/. Static export
copied into website/public/ so Vite includes it in dist/. Server
updated to serve landing.html at root with index.html fallback.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>