Update docker-compose, vite config, Traefik labels, module imports,
and all cross-module references to use the new rflows naming.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix zoom over iframes (transparent overlay captures wheel events),
eliminate black boxes (flex layout replaces calc height), and enable
resize handles (overlay lets pointerdown bubble to shape). Add widget
mode that fetches compact data from each module's API with 60s
auto-refresh, plus mode toggle button in header.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pure computation library (spider-3d.ts) with polar mesh generation,
overlap detection via point-in-polygon sampling, and membrane preset
mapping SpaceConnections to FlowKind axes. FolkShape component
(folk-spider-3d.ts) renders CSS 3D-transformed stacked SVG layers
with interactive orbit, dataset toggling, and demo data fallback.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Save/restore DOM child order when toggling feed view so element
positions revert correctly on exit. Remove unused Feed and Connect
toolbar buttons (connect mode still works via 'A' key). Rename
Memory panel to Recent Changes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tracks last 2 sidebar tools used and shows them at the right end of the
bottom toolbar. [+] button opens a grouped menu to pin up to 4 favorite
tools. Pins and recents persist in localStorage.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove Card, Rich Note, rNotes, rBooks, rPubs, rForum from the Note
toolbar group. Move rNotes/rBooks/rForum to Embed as interactive
embeds (data port-ins). Move rPubs to Creative. Remove Card and
Obsidian Note from MI tool schema.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add conviction component to canvas toolbar, SHAPE_DEFAULTS,
newShapeElement switch, CSS position selectors, and connect-mode
selectors. Complete the wiring for folk-choice-conviction alongside
existing spider/rank/vote drawer enhancements.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add folk-choice-conviction library and register in lib/index
- Refactor rNotes app layout and interaction
- Space visibility normalization in server/spaces
- Minor canvas.html tweaks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Pre-populated 4-node workflow template (trigger→action→condition→output) with blue arrows
- Add folk-choice-vote, folk-choice-rank, folk-choice-spider component libraries
- New rstack-space-settings component
- EncryptID encrypted vault schema and server endpoints
- Space management and community store enhancements
- Shell, landing, and module CSS refinements
- Tab bar, app switcher, identity, and MI component updates
- rNotes app improvements
- rFunds diagram adjustments
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Convert cursor positions to canvas world coordinates (screen→world on
send, world→screen on render) so remote cursors appear at correct
canvas locations regardless of pan/zoom
- Add PresenceManager.setCamera() to reproject cursors on pan/zoom
- Add loading spinner overlay dismissed on first cache hit or sync
- Guard WebSocket open handler with readyState check after async load
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
createRenderRoot() was unconditionally reading x/y/width/height from HTML
attributes, overwriting values already set via JS properties before DOM
insertion. This caused all shapes to stack at (0,0) with auto dimensions
on page reload. Now only reads from attributes when they exist.
Also fixed eraser: hardDeleteShape() was only in the click handler which
never fired because pointerdown already removed the target element.
Moved Automerge deletion into the pointerdown handler.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-in users can now browse the demo space without being
automatically redirected to their personal space.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move pendingTool check before the e.target gate so clicking
anywhere on the canvas places the tool, even over existing elements.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Drawing tools (pencil, rect, circle, line) now auto-clear after one
stroke, returning to the default selector tool. ESC clears any active
whiteboard tool. Switching to another toolbar tool also clears the
active whiteboard tool.
This fixes the resize issue — when a whiteboard tool was stuck active,
canvasContent had pointer-events:none which blocked all shape
interactions including resize handles.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a toggle that switches the 2D spatial canvas into a vertical
scrollable feed layout. Shapes flow as a flex-column list, sortable
by position, creation time, type, or alphabetically. Pan/zoom/drag
gestures are suppressed in feed mode while shape editing stays active.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add POST /:slug/invite email endpoint (nodemailer via Mailcow SMTP)
- Add share badge + panel UI to canvas whiteboard
- Mark task-77 (encrypted VPS backup) as Done with updated references
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Prevents stale WebSocket reconnect loops after sign-out by adding an
intentional-disconnect flag to CommunitySync. Canvas and shell pages
now redirect to homepage when the user signs out.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Right-click shapes (single or multi-selected) to copy them to another
space the user owns or is a member of. Server endpoint handles ID
remapping, arrow reference preservation, and position centering.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reorganize user dropdown into expandable "My Account" submenu containing
account actions (Add Email, Add Device, Recovery) plus Dark Mode and
Encrypted Backup toggle switches. Move theme toggle from toolbar into
account settings, default to dark mode.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Switch ghost tracking from mousemove to pointermove (fires for touch/pen/mouse)
- Add cancel button (✕) on ghost outline for mobile (no ESC key available)
- Center ghost on viewport for touch devices instead of (0,0)
- Add touch-action: manipulation to all toolbar buttons (eliminates 300ms tap delay)
- Bump mobile touch targets to 44px min-height with larger padding
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
On touch devices, both pointer and touch events fire. When a second
finger was added, the pointer handler re-captured the interaction,
fighting the touch-based pan/pinch. Now the touch handler releases
pointer captures and sets a flag that blocks the pointer handler
during two-finger gestures. Also cancels shape drag on multi-touch
and closes the context menu on touchstart for reliable mobile dismiss.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Hovering a forgotten shape now shows a tooltip explaining the state.
A new "Hide Faded" toolbar button lets users hide all forgotten shapes
entirely, with the preference persisted in localStorage. Hidden shapes
reappear automatically when another user remembers them.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shapes now have three states instead of two. "Forgetting" a shape fades
it (35% opacity, greyscale) for all connected clients rather than hiding
it. Other users can then choose to "forget too", "remember" (restore),
or "delete" (hard-remove from DOM). A forgottenBy map tracks who forgot,
enabling social signaling around shared attention.
- folk-shape.ts: :state(forgotten) CSS + forgotten property
- community-sync.ts: forgetShape(id,did), rememberShape, hardDeleteShape,
getShapeVisualState, hasUserForgotten, getFadedShapes, getDeletedShapes
- community-store.ts: forgottenBy map server-side, rememberShape clears map
- canvas.html: right-click context menu, two-section memory panel (Fading/
Deleted), close button fades instead of removes, Delete key escalates
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Tab bar state persists to localStorage per space
- Emergency synchronous localStorage fallback for beforeunload saves
- Merge Automerge full-sync instead of replacing (preserves local changes)
- Validate shape coordinates before applying (prevent NaN/Infinity)
- Save on visibilitychange for mobile browser tab backgrounding
- Add OutputPath type for module browsable content types
- Fix canvas module ID from "canvas" to "rspace" in tab-cache
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Resize and rotation handlers in folk-shape.ts passed raw event.clientX/Y
(screen coordinates) to toLocalSpace/angleFromOrigin, but those methods
expect canvas-parent coordinates. With any zoom/pan, the two coordinate
systems diverge, making resize non-functional and rotation erratic.
Added #screenToParent() to convert viewport coords to the parent's
coordinate space using getBoundingClientRect + parent scale. Applied to:
- Resize handle drag (pointermove → toLocalSpace)
- Rotation start (pointerdown → angleFromOrigin)
- Rotation drag (pointermove → angleFromOrigin)
Also syncs ghost placeholder size with zoom changes so the dotted
preview stays accurate if user zooms while in placement mode.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Resize handles now appear when a shape is highlighted/focused, not just during
active drag. Canvas left-click+drag now pans by default; hold 250ms then drag
for marquee selection.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- newShape() with explicit position now places directly at click point
instead of routing through findFreePosition spiral which could nudge
the shape away from the cursor
- Sticky note converted to setPendingTool so it shows dotted placeholder
before placement instead of instantly spawning at viewport center
- Feed tool converted to setPendingTool with __postCreate for the same
click-to-place UX
- Removed wb-sticky from mobile keepOpen list since it's now a
placement tool that should close the menu
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Canvas page was hardcoded to data-theme="light" while all other pages
default to dark. Also hides the redundant #community-info overlay
(slug/URL box) since the shell header space switcher already shows this.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
WebSocket clients were connecting without auth tokens, causing 401
rejections for authenticated/members_only spaces. Now reads the
encryptid_session from localStorage and appends ?token= to WS URLs.
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>
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>
Replace single-click-to-pan with selector as default tool. Left-click-drag
on canvas background draws a blue marquee rectangle to select multiple shapes.
Shift/Ctrl+click toggles additive selection. Panning now via Space+drag,
middle-click, or wheel/trackpad (unchanged). Delete/Backspace removes all
selected shapes. folk-shape highlighted state shows blue selection outline.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Collision: shapes now slide-off in movement direction by minimum
penetration depth instead of flipping to the opposite side
- Coordinates: use nullish coalescing (??) so x=0/y=0 are preserved
on reload instead of being replaced by falsy-check defaults
- Toolbar: remove overflow:hidden from #toolbar-panel so submenus
render fully visible instead of being clipped/scrolled
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- folk-rapp now auto-derives spaceSlug from the current URL path
(/{space}/canvas → space) so embedded rApps always know their space
- Fixed race condition where createRenderRoot overwrote moduleId
that was already set via JS property setter (showed picker instead
of loading the module directly)
- newShapeElement always passes communitySlug as fallback spaceSlug
when restoring folk-rapp shapes from sync
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add MiCanvasBridge for deep canvas state awareness (shapes, selection, viewport)
- Add MiActionExecutor to create/update/delete/move/connect shapes from MI responses
- Add MI action parsing (create-shape, connect, update-shape, delete-shape, move-shape, transform)
- Add selection transforms (align, distribute, arrange, match-size)
- Add tool suggestion schema for contextual MI hints
- Enhanced MI system prompt with action markers and transform commands
- Richer canvas context in /api/mi/ask (positions, connections, viewport, shape groups)
- Refactored tab-bar I/O chips for cleaner feed port rendering
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Convert canvas toolbar from horizontal (top center) to vertical (left side)
with dropdowns opening to the right
- Add whiteboard "Draw" toolbar group: pencil, sticky note, rectangle, circle,
line, eraser — renders SVG strokes on canvas overlay
- Nest zoom controls (in/out/reset) under a "Zoom" dropdown group
- Enhance rstack-mi to gather page context (open shapes, active tab, page title)
and send to /api/mi/ask for context-aware responses
- Move FeedDefinition to lib/layer-types.ts, add feeds/acceptsFeeds to modules
- Extend rstack-tab-bar with feed compatibility helpers and 3D scene state
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
rProviders (providers.mycofi.earth) is a separate project — removed
module registration, app switcher entry, tab bar badge, canvas embed
button, Traefik router, and standalone config. rSwag domain updated
from swag.mycofi.earth to rswag.online across all references.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
POC for cross-app embedding (TASK-46). New folk-rapp shape type that
embeds any rApp module as a live iframe inside a canvas shape. Features:
- Module picker dropdown when no module selected
- Colored header with module badge/icon
- Open-in-tab action button
- Syncs moduleId + spaceSlug via Automerge CRDT
- Toolbar rApps section now creates folk-rapp (not generic folk-embed)
- Fixed stale "canvas" moduleId refs → "rspace" in canvas.html
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add the missing tab bar to the canvas page so users can switch between
rApp layers (with full CommunitySync persistence). Add an "rApps"
toolbar group that embeds any of the 18 remaining modules as interactive
iframes directly on the canvas. Switch all module page routes to
renderIframeShell, loading standalone domains inside the unified shell.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>