Extract Web Speech API logic from folk-transcription into a reusable
SpeechDictation utility, then wire mic buttons into all 4 text input
surfaces. Dictation fills inputs in real-time without auto-submitting.
Hidden gracefully in unsupported browsers.
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>
Synced event was firing 100+ times during initial Automerge sync negotiation.
Debounce with 300ms timer so it fires once after the burst settles.
folk-rapp iframes built URLs as /{space}/{moduleId} which on subdomain
URLs (jeff.rspace.online) got double-prefixed to /{space}/{space}/{moduleId}
causing 404s. Now detects subdomains and uses /{moduleId} directly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Introduces bilateral typed inter-space connections (economic, trust,
data, governance, resource) stored in both spaces' Automerge docs.
Includes connection policy, approval flow, membrane permeability
endpoint, and full CRUD API. Also changes default space visibility
from public to private for all user-facing creation paths.
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>
SVG chart plots each option's conviction growth over time with colored
lines and area fills. Options now sort by conviction score (highest
first) and reorder every 10s as conviction accumulates.
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>
Shapes are now grabbable/draggable/resizable on first click (body or
handles), editable on double-click, but clicking directly on a text
input (textarea, contenteditable, text input) immediately enters edit
mode and focuses the input — no double-click required.
Works by hit-testing text inputs at pointer coordinates before
initiating drag, checking both light DOM and shadow DOM of slotted
content.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Break Automerge proxy chain in #shapeToData() and #updateShapeInDoc()
to fix "Cannot create a reference to an existing document object" on
canvas load and WS sync.
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>
- folk-wrapper: createRenderRoot crashed because innerHTML="" removed the
slot from DOM, making parentElement null on the next line. Save parent
ref before clearing.
- sw.ts: module API paths (/space/module/api/...) weren't excluded from
caching. Changed startsWith("/api/") to includes("/api/"). Also fixed
catch handler returning undefined instead of a Response.
- image-gen: changed queue.fal.run to fal.run for synchronous responses.
The queue endpoint returns request_id, not the actual image data.
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>
gemini-2.0-flash-exp was removed from the API. Updated to:
- gemini-2.5-flash for text generation
- gemini-2.5-pro for outline/reasoning
- gemini-2.5-flash-image for image generation with responseModalities
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>
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>
folk-rapp used class "rapp-header" but the drag detection in
folk-shape checks for ".header" or "[data-drag]". Added both so
the rapp header works as a drag handle like every other shape type.
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>
The overlap resolver now moves siblings in the drag direction rather
than snapping the dragged shape away from them. Supports chain-pushing
(A pushes B into C) with a recursion depth of 3.
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>
- Sync #attrWidth/#attrHeight during resize so CSS reflects new dimensions
- Call #dispatchTransformEvent() directly for immediate visual update
- Fix TransformEvent to fire "folk-transform" matching CommunitySync listeners
- Reduce min-width/min-height on folk-markdown and folk-wrapper to 80x40px
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>
Sessions now last 30 days instead of 15 minutes. Both the rstack-identity
component and legacy header auto-refresh the token when < 7 days remain,
so users who visit at least once every ~23 days stay logged in indefinitely.
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>
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>
- Shape drag now accounts for canvas CSS transform scale so elements
track the cursor correctly at all zoom levels
- Collision resolution uses minimum penetration depth algorithm instead
of movement-direction bias, preventing elements from flipping sides
- Replaced all \uD83D surrogate pair escapes and \u00D7/\u276E/\u276F/
\u2022 escapes with actual Unicode characters across 60+ files
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>
- Scope pointer-events:none to .slot-container instead of all divs,
so buttons/textareas/inputs inside shapes are clickable again
- Replace unicode escapes (\u{xxxx}) in html`` tagged templates with
actual emoji characters — String.raw doesn't process escapes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Change inner div overflow from scroll to hidden, removing browser
scrollbar arrows that appeared on every canvas shape
- Add shape collision detection: shapes now slide off each other with
an 8px gap instead of overlapping when dragged (pointer + touch)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Handles now only appear during active move/resize, not on hover or focus.
Removes blue outline borders that cluttered the canvas.
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>
Enhance the folk-rapp canvas shape with three improvements:
1. PostMessage bridge: parent sends context to iframe on load,
listens for shape-updated events from CommunitySync. Green
status dot indicates active connection.
2. Module switcher: header dropdown (⇄ button) lets users change
which rApp is embedded without recreating the shape.
3. Open-in-tab: ↗ button navigates to the module page (adds a tab)
instead of opening a new browser window.
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>
Introduces the full layer/tab architecture for rSpace — each rApp becomes
a layer in a vertical stack with typed flows (economic, trust, data,
attention, governance, resource) connecting them.
New components:
- rstack-tab-bar: tab bar with flat/stack view toggle, drag reorder,
drag-to-connect flow creation with kind/label/strength dialog
- folk-feed: canvas shape that pulls live data from other layers with
bidirectional write-back (edit items inline, push changes to source API)
- layer-types: Layer, LayerFlow, FlowKind types and color palette
Automerge schema extended with layers, flows, activeLayerId, layerViewMode.
CommunitySync gains 11 new methods for layer/flow CRUD.
Feed definitions added to 10 modules (funds, notes, vote, choices, wallet,
data, work, network, trips, canvas) with typed feeds and acceptsFeeds.
RSpaceModule interface extended with FeedDefinition and acceptsFeeds.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>