Replace the generic "🎨 rSpace — Real-time collaborative canvas" fallback
with a full landing page following the rl-* CSS system used by other rApps.
Sections: hero, principles (local-first/interoperable/AI-native/multiplayer),
canvas features, 16-shape library grid, AI capabilities, how it works steps,
ecosystem integrations, open source stack, data protection, and final CTA.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Move mobile toolbar to right side to avoid zoom bar overlap
- Toolbar panel opens leftward, bottom toolbar offsets flipped
- Add [locked] attribute reflection on folk-shape for external CSS
- Persistent 🔒 badge on locked shapes visible when unselected
- Add Authorization header to calendar reminder POST request
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix elementFromPoint using canvas-relative coords instead of viewport
coords for shape detection during pin placement
- Use shape data from Automerge doc for offset calculation (more reliable)
- Add exitCommentMode() to deactivate pin placement when switching tools
- Integrate comment mode into syncBottomToolbar active state
- Escape key closes popover and exits comment mode
- Mutual exclusion between comment/draw/connect/pending tool modes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pins no longer require a message. Added "Link existing rNote" picker
to attach space notes to pins. Linked notes show as clickable links
in the popover with unlink option.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Overlay markers at canvas or shape-relative coords with threaded
comments, @mention notifications, and rSchedule reminder integration.
Toolbar "Leave Comment" button (/) next to Note tool.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add flex-shrink:0 to flipbook containers to prevent flex layout from
squishing them below pageW*2, which would trigger StPageFlip's
portrait (single-page) mode. Update rpubs page counter to show
spread page range (Pages X–Y of N) for middle pages.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
StPageFlip injects its CSS (.stf__parent, .stf__block, .stf__item, etc.)
into document.head, which doesn't penetrate shadow DOM boundaries.
Pages rendered but were unstyled — collapsed/invisible. Replicate the
required rules inside each component's shadow root styles.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Search: use POST /search with JSON body (was GET with query params)
- Summary: add summary_text field lookup (API's actual field name)
- Speakers: add speaking_time + speaker_label fallbacks
- Transcript: add speaker_label fallback for segment speaker name
- Action items: add task field lookup (API returns {task, assignee})
- Recordings: detect transcript availability from segment_count
- Add CSS for processing status badges (transcribing, diarizing, etc)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
evaluateSpaceAccess and authenticateWSUpgrade were calling the SDK
without the secret option, forcing remote verification. Also adds
auth header to rpubs editor generate fetch (was getting 401 on
private spaces).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Connect the deployed meeting-intelligence stack to the rmeets module:
- Add MI API proxy helper with 8s timeout and graceful fallback
- Add recordings list page with meeting cards showing status/transcript/summary badges
- Add recording detail page with overview/transcript/summary/speakers tabs
- Add full-text transcript search with highlighted results
- Add client-side MI API proxy route to avoid CORS issues
- Add Recordings and Search nav links to the hub page
- Update landing page: remove "Coming Soon" from transcription + rename section
- Update module export: replace recordings outputPath with custom route, add onboardingActions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
folk-prompt can now spawn shapes on the canvas when Tools mode is
enabled. Gemini calls functions (create_map, create_note, create_embed,
create_image, create_bookmark, create_image_gen) and the client
executes them via window.__canvasApi. Multi-turn loop on server (max 5
rounds) with synthetic success responses. Extensible via registerCanvasTool().
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Consolidates token verification into server/auth.ts, removing the
external SDK dependency. All modules now import from the local module.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add Authorization header to fetchTripData, fetchTripDetail, and
fetchNotesData to prevent 401 errors on private spaces
- Add #initialSyncFired flag to CommunitySync so the "synced" event
only fires once per connection cycle instead of on every debounce gap
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Email verification wrote to the `email` column but account status read
from `profile_email` — now setUserEmail writes both. Account modal email
section displays the verified address when collapsed. Tour finale step
triggers identity setup on completion.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
getSpaceConfig() read stored visibility without the demo override,
so the client-side access gate blocked unauthenticated users from
accessing the demo space.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The single quote in "don't" broke the JS string literal inside the
inline script, causing a SyntaxError that killed the entire script
block including tab bar and header initialization.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Reorder layout: nav → calendar → legend → zoom bars → bottom bar
- Add "Calendar Legend" heading above source badges
- Fix getEventsForDate() to support multi-day range checking
- Render colored span bars across day cells for multi-day events
- Make showAccountModal/isSignedIn public on rstack-identity
- Tour final step triggers identity setup flow
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Secrets now fetched from Infisical at container startup instead of
being passed through docker-compose from .env. Reduces .env to only
Infisical auth creds and non-Infisical container secrets.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Added shapesSeeded flag to community doc metadata. Once shapes are
seeded (demo, template, or campaign), deleting all shapes no longer
triggers re-seeding on server restart. The demo reset endpoint clears
the flag so it can re-seed intentionally.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Personal space rename only applies when isPersonal flag is set (not all
private spaces). Demo forced to public visibility. Public spaces no
longer filtered out. Sections: Private → Permissioned → Public →
✦ Discover → Create.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove ambient repulsion loop (shapes drifting apart at 60fps). Add
Figma-style snap alignment guides during drag with magnetic stickiness,
and ghost drop suggestion when shapes overlap after drop.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Added a `seeded` flag to Automerge doc metadata across 6 modules
(rcal, rnotes, rtasks, rvote, rbnb, rvnb). Once demo data is seeded,
deleting all content no longer triggers re-seeding on next page load.
Also removed rcal's per-request seedDemoIfEmpty() call from the route
handler — onInit + seedTemplate already handle initial seeding.
fix(canvas): prevent bulk delete dialog from stacking
The Delete key repeat was creating multiple overlays, making the dialog
appear unclosable. Added a guard to prevent duplicate dialogs, and
Escape key support to dismiss.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Server-side HTML gates can't work because auth tokens are in
localStorage, not cookies. Replaced with:
- Client-side gate checks session, then verifies membership via
new /api/space-access/:slug endpoint
- Shows "Sign In" for unauthenticated users
- Shows "no access + return to your space" for non-members
- Server-side gates remain for API/JSON requests and WebSocket
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Both panels now use position:fixed with JS-computed coordinates from
getBoundingClientRect(), ensuring they open directly below their
respective header buttons and right-aligned to the button edge.
History panel clamps left edge to prevent off-screen overflow.
Also adds missing click handlers for settings-btn and history-btn
in canvas.html (previously only wired in shell.ts module pages).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Non-members of private spaces are now blocked at three layers:
- WebSocket upgrade rejects with 403
- Module middleware shows access denied page (browser) or JSON 403 (API)
- Space root dashboard shows access denied page
Friendly "Private Space" page with link back to user's own space.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Both dropdown-wrap buttons now sit in header-left directly after the
space switcher, keeping space-related controls grouped together.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Destructive operations (forget, delete, remember) now flush to
IndexedDB + localStorage immediately instead of using 2s debounce,
preventing deleted items from reappearing on page reload.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>