Commit Graph

574 Commits

Author SHA1 Message Date
Jeff Emmett df8d5f79ce fix(rmeets): align MI route handlers with actual API response shapes
- 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>
2026-03-22 18:21:55 -07:00
Jeff Emmett cebad27b38 fix(auth): pass JWT secret to all SDK verify calls + add auth header to rpubs generate
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>
2026-03-22 18:15:17 -07:00
Jeff Emmett cc1f09b565 feat(rmeets): integrate Meeting Intelligence API for recordings, transcripts, and search
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>
2026-03-22 18:00:51 -07:00
Jeff Emmett 7618433498 refactor(auth): replace @encryptid/sdk imports with local auth module
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>
2026-03-22 16:41:59 -07:00
Jeff Emmett 2de61cd7ad feat(rcal): move zoom/legend below calendar, add multi-day event spans
- 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>
2026-03-22 15:10:39 -07:00
Jeff Emmett 4b08a02851 fix(seed): prevent demo data re-seeding after user deletes content
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>
2026-03-22 14:24:51 -07:00
Jeff Emmett 0d8d42c49e fix(rcal): distinguish pinch-zoom from scroll-pan on calendar
Trackpad pinch (ctrlKey wheel) zooms granularity, two-finger scroll
navigates the timeline forward/backward instead of zooming.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 12:44:45 -07:00
Jeff Emmett 15f7e759d1 fix(canvas): map shape interaction + reminder widget dismissal
Map viewer: disable MapLibre interactions when inside a folk-shape
until editing mode (double-click). Prevents map panning when trying
to select/move the shape on canvas.

Reminder widget: dismiss on Escape key and when clicking elsewhere
on canvas (deselecting shapes). Clean up schedule icon when shape
is deleted.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 20:44:28 -07:00
Jeff Emmett fcf4202045 fix(rmaps): remove max-height cap so map fills available space
Map container was capped at 700px, leaving blank space on most screens.
Removed the cap so calc(100vh - 220px) fills properly. Also matched
sidebar max-height to viewport.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 19:26:18 -07:00
Jeff Emmett 8b61203e17 revert: remove standalone domains we don't own
Reverts Traefik rules and removes standaloneDomain from rdesign, rvnb,
rbnb, rdocs, and crowdsurf — we don't have these domains.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 18:31:17 -07:00
Jeff Emmett 524356d233 feat(tours+solo): add tours to remaining modules and solo mode toggle
Add guided tours to 6 modules that were missing them:
- Shadow DOM: rsocials dashboard, crowdsurf, rdata (TourEngine)
- Light DOM: rsplat, rbnb, rvnb (new LightTourEngine class)

Add solo mode toggle to collab overlay — click the presence badge
to hide your cursor/presence from others. Persists via localStorage,
dispatches event to canvas PresenceManager.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 17:26:57 -07:00
Jeff Emmett 2ab620fcc5 feat(rpubs): polish publish flow with teal accents, SVG icons, and card layouts
Visual overhaul of the rpubs editor and publish panel to match rpubs.online/press
design language: circular step indicators with checkmarks, SVG stroke icons on all
buttons, card-based publish panel with teal accent colors, pricing tier cards,
numbered DIY guide steps, group buy progress bar, and format info chips.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 17:04:19 -07:00
Jeff Emmett 9ed39d5cd0 fix(rpubs): adjust editor height to account for sub-nav bar
The editor used calc(100vh - 92px) which only accounted for header+tab
row, but the rpubs sub-nav (~48px) pushed the Generate Preview button
below the fold. Now uses calc(100vh - 140px).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 16:18:43 -07:00
Jeff Emmett 8ba805f3fa fix(rpubs): correct editor height to match shell layout (92px offset)
The editor used calc(100vh - 52px) but the shell has a 56px header +
36px tab row = 92px total. This pushed "Generate Preview" below the
fold. Also adds min-height on flipbook preview container.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 15:27:58 -07:00
Jeff Emmett 7c29ccea41 feat(rinbox): bridge Listmonk newsletter campaigns with multisig approval
Newsletter campaigns now require N-of-M team member approval via rInbox
before Listmonk starts sending. The send-newsletter workflow node creates
a draft campaign and gates it through the team inbox; a manual submit-
approval route is also available. The multisig email UI shows a green
"Newsletter Approval" badge with campaign ID for newsletter approvals.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 15:03:06 -07:00
Jeff Emmett 57e03f3049 feat(rsocials): add Campaign Wizard button to campaigns dashboard
Prominent teal gradient button in header and empty state of the
campaigns tab, linking to the AI-guided wizard.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 14:49:28 -07:00
Jeff Emmett 5ad6c6ff77 feat(rsocials): add Campaign Wizard with 5-step AI-guided creation flow
Progressive approval workflow: paste brief → AI extracts structure →
AI generates per-platform posts → review with per-post regen →
commit (saves campaign, creates threads, drafts newsletters, builds workflow DAG).

Includes MI integration for Cmd+K campaign creation and vite build entry.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 14:41:45 -07:00
Jeff Emmett aca0e6b353 feat(rsocials): connect drafted threads to campaign flows via picker dropdowns
Replace manual thread ID entry with select dropdowns in both campaign planner
and workflow components. Server-side publish-thread handler now resolves
linked threadId from Automerge doc when inline content is empty.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 14:13:31 -07:00
Jeff Emmett d31e8fdca4 feat(spaces): blank canvas init + team inbox provisioning
New spaces start with an empty canvas instead of 25+ template shapes.
Each space gets a {slug}@rspace.online team inbox (multi-sig ready)
via the rinbox onSpaceCreate hook. Fix EncryptID auto-provision passing
raw string instead of SpaceLifecycleContext to module hooks.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 13:59:35 -07:00
Jeff Emmett 97bf2d7987 feat(rwallet): integrate CRDT token flows into wallet visualizations
- Add transferTokens() and getAllTransfers() to token service
- Seed DAO ecosystem: cUSDC + BFT tokens, 3 treasuries, 6 participants,
  ~30 transactions spread over 60 days
- Add /api/crdt-tokens/transfers endpoint for ledger history
- Wire CRDT transfers into loadTransfers() with DID→pseudo-address mapping
- Update data transforms (timeline, sankey, multichain) to support
  _fromLabel/_toLabel for human-readable CRDT participant names
- Show viz tabs (Timeline, Flow Map, Sankey) when CRDT tokens exist
- Add "local"/"CRDT" chain to color and name maps

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 13:47:14 -07:00
Jeff Emmett ac9bd302d1 fix(rsocials): replace hardcoded dark-mode colors with CSS variables for light/dark theme support
Buttons, badges, focus states, avatars, links, inputs, and surfaces across
all rSocials components now use --rs-primary, --rs-error, --rs-success,
--rs-accent, --rs-bg-surface, --rs-input-bg, etc. with dark-mode fallbacks.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 13:18:13 -07:00
Jeff Emmett e879f5e2f0 fix(rwallet): remove My Wallets / Wallet Visualizer top tab bar
Show the visualizer view directly without the top-level tab switcher,
keeping the sub-tab header (Balances, Yield, Timeline, etc.) intact.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 12:27:03 -07:00
Jeff Emmett 031ffbbbfa feat(rpubs): replace sidebar with 3-step wizard flow (Create → Preview → Publish)
Restructures the editor from a cramped sidebar layout to a full-width stepped wizard,
matching the rpubs.online/press UX. Format and drafts moved to toolbar dropdowns,
auto-advances to preview after PDF generation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 12:26:38 -07:00
Jeff Emmett 4793f9c117 feat(crowdsurf): restore module and add Elo pairwise ranking layer
Restore CrowdSurf as standalone module with full integration (server,
app-switcher, shell favicon, rchoices tab, vite build). Add sortition-
based pairwise Elo ranking: users compare two activities head-to-head,
updating Elo ratings. Includes API endpoints (/api/crowdsurf/pair,
/api/crowdsurf/compare), Rank tab with leaderboard, and Elo badges.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 23:51:24 -07:00
Jeff Emmett d99b85046c feat(rswag): full feature parity — POD clients, dithering, AI gen, fulfillment
8-phase implementation bringing rSwag module to parity with standalone rswag.online:
- Printful v2 + Prodigi v4 API clients with sandbox mode
- 11 dithering algorithms + screen-print color separations
- Gemini AI design generation + user artwork upload
- ~15 new API routes (designs, mockups, storefront, fulfillment, admin)
- 4-tab frontend UI (Browse, Create, HitherDither, Orders)
- Interactive revenue Sankey diagram on landing page
- Fulfillment bridge routing orders to nearest POD provider

Also includes: rChats module scaffold, rVote enhancements, crowdsurf removal,
rchoices cleanup, rwallet tweaks, app-switcher updates.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 23:21:53 -07:00
Jeff Emmett e09ae1d8d2 fix(rnetwork): prevent TubeGeometry NaN errors in 3D graph
Links with curved curvature create TubeGeometry that crashes with NaN
positions when force simulation hasn't converged yet. Add linkVisibility
guard to hide links until both endpoints have valid coordinates, and
bump warmupTicks from 50 to 100 for more settling time.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 23:16:45 -07:00
Jeff Emmett 31fe552755 feat(rflows): add organic/mycorrhizal view mode toggle
Adds a toggleable alternative rendering mode for the rFlows canvas.
Sources become sporangia, funnels become mycorrhizal junctions,
outcomes become fruiting bodies, and edges become branching hyphae
with earth-tone aesthetics. Same data, same interactions, same ports.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 23:01:20 -07:00
Jeff Emmett f5b455f83c feat(rpubs): port full feature parity from rpubs-online
Flipbook preview (pdf.js + StPageFlip), saddle-stitch imposition
(pdf-lib), DIY print guides, email PDF, printer discovery (curated
+ OSM Overpass), rCart order/batch integration, publish panel with
Share/DIY/Order tabs. 5 new API routes, 6 new files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 22:55:10 -07:00
Jeff Emmett 77f2e9ae56 fix(rpubs): allow public PDF generation + fix zine auto-spawn
- Add publicWrite to rpubs module (PDF gen is computational, not a write)
- Fix zine auto-spawn: wait for community-sync-ready event instead of
  fragile 800ms timeout

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 22:20:08 -07:00
Jeff Emmett d39c24c61b fix(rpubs): fix shadow root double-attach and PDF generate route
- Guard attachShadow with existing check to prevent crash on reconnect
- Fix API path: /pubs/api/generate → /rpubs/api/generate (module ID is rpubs)
- The "Unexpected non-whitespace character" error was HTML 404 parsed as JSON

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 22:14:16 -07:00
Jeff Emmett ae73e20c28 fix(rcal): fix Invalid Date crash + add reminder button to day detail
- folk-calendar: fix data-date format for prev/next month padding days
  (month=0 produced "2026--1-28" which split into NaN month → Invalid Date)
- folk-calendar: guard toJSON against invalid dates to prevent toISOString crash
- folk-calendar-view: add "+" button to expanded day detail panel
  with inline title input + time picker for creating reminders
- Styles for the add-reminder form matching existing dark theme

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 19:28:12 -07:00
Jeff Emmett 8ff3e83a12 feat(rcal): full-width spectrum bars + draggable map resize
Move temporal/spatial zoom bars to always-visible full-width position
above the calendar+map area. Replace fixed 400px map panel with
draggable resize handle (200-800px range). Responsive: handle hidden
and layout collapses to single column at ≤900px.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 17:45:33 -07:00
Jeff Emmett 02b9feb760 feat(rflows): overhaul river view with tap/faucet sources and trapezoid vessel funnels
Replace plain rectangles with tap/faucet SVG graphics for source nodes
(draggable valve handle, metallic gradients, animated water stream) and
trapezoid vessel shapes for funnel nodes (water fill, wave surface,
threshold markers, overflow lips with pour animations). Overflow pipes
now render as 3-layer bezier connections from vessel lips. Add amount
popover with date scheduling, event delegation for interactivity, and
rAF-throttled valve dragging.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 17:23:33 -07:00
Jeff Emmett befd70c72b feat(rdata): add content tree view with search, tags, and sort
Adds a new Content Tree tab (default) to rData that indexes all Automerge
docs in a space. Includes /api/content-tree endpoint, folk-content-tree
web component with search, tag filtering, sort modes, expand/collapse,
and demo data fallback. Analytics moves to second tab.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 17:19:16 -07:00
Jeff Emmett 1827b34f6b fix(rcal): seed sample data for all spaces, not just demo
Auto-seed calendar sources and events on first visit to any space's
rcal page, and during space creation via seedTemplate hooks.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 17:14:17 -07:00
Jeff Emmett 93b7251054 fix(rvote): remove /demo route, use subdomain links consistently
Spaces are always subdomains — no path-based space routing or redirects.
Landing page demo links now point to demo.rspace.online/rvote.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 16:31:34 -07:00
Jeff Emmett 8d8ae7e351 fix(rvote): serve demo at demo.rspace.online/rvote instead of /rvote/demo
Extract demo body into renderDemoBody(), serve it from the / route when
space=demo (which is what demo.rspace.online/rvote resolves to via
subdomain routing). Legacy /demo path now 301-redirects to the canonical
demo.rspace.online/rvote URL.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 16:29:26 -07:00
Jeff Emmett 05459ec8a9 feat(rwallet): pagination, transaction tables, and reset view buttons
Paginated transfers endpoint (up to 3000 txs with exponential backoff),
collapsible incoming/outgoing transaction tables below visualizations,
and Reset View buttons on all three D3 charts (Timeline, Flow, Sankey).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 16:27:06 -07:00
Jeff Emmett f9fc0ca6ec feat(rvote): add QPR explanations and conviction voting simulator to demo
Add ELI5 cards (quadratic, reddit-style ranking, vote decay) and an
interactive conviction voting simulator with credit budget, quadratic
costs, proposal ranking, and promotion threshold progress bars.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 16:21:50 -07:00
Jeff Emmett 34ece96927 feat(rnotes): import converters for Evernote, Roam, file upload & sync
New converters: Evernote (.enex), Roam Research (JSON), generic file
import, and sync service. Enhanced existing Obsidian, Logseq, Google
Docs, and Notion converters. Updated import-export dialog, schemas,
and server routes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 15:53:57 -07:00
Jeff Emmett df489d698c feat(rsocials): newsletter editor with Listmonk integration
Full campaign editor with HTML body textarea, live iframe preview,
list selector with subscriber counts, save draft, send now, and
schedule send. Added edit/delete actions on draft campaigns and
GET/PUT/DELETE single-campaign proxy routes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 15:53:35 -07:00
Jeff Emmett 16b975cf5a fix(rvote): align demo page content with rvote.online
Match the standalone site's demo page: badge, title, description, loading
text, and CTA card for feature parity.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 15:38:13 -07:00
Jeff Emmett 0c9b07525f feat(rsocials): merge Posts & Threads nav + Postiz API integration
Rename "Threads" to "Posts & Threads" in hub nav, route title, and subPageInfos.
Thread gallery now shows draft/scheduled posts from campaigns alongside threads.
Add Postiz API client (postiz-client.ts) with settings schema for URL + API key.
Proxy routes: /api/postiz/status, integrations, posts, threads.
Wire workflow executor to call real Postiz API for post/thread/cross-post nodes.
Add "Send to Postiz" button in thread builder (editor + readonly views).
Add approval queue: PendingApproval schema (v5), GET/POST /api/approvals routes,
wait-approval workflow node creates pending approvals and pauses execution.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 14:28:22 -07:00
Jeff Emmett ed8274961e chore(rsocials): rename Threads to Posts & Threads
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 14:19:41 -07:00
Jeff Emmett d4972453a3 feat(onboarding): add module-specific connect/import/create CTAs
Declarative onboardingActions on RSpaceModule lets each rApp define its
own onboarding cards (import, upload, link, create). renderOnboarding()
renders them as a responsive card grid with upload handling. Adds ICS
import endpoint to rCal (POST /api/import-ics). 15 modules wired up.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 14:17:19 -07:00
Jeff Emmett 8741f5dbd5 feat(rnotes): add presence indicators on notebook cards and note items
Show colored dots on notebook cards and note list items indicating which
peers are currently viewing/editing. Uses existing presence message relay
with zero server changes — heartbeat every 10s, stale peer GC at 20s.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 12:43:04 -07:00
Jeff Emmett ad9e54dbe9 refactor(rinbox): replace forwarding banner with popup modal
Convert inline forwarding banner to a click-triggered modal overlay.
Fix API field name bug (data.target → data.forwardsTo). Add email
input for no-email state with sovereignty messaging. Remove dismiss
logic in favor of modal open/close.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 12:15:53 -07:00
Jeff Emmett 42a84cb72e refactor(rsocials): consolidate threads + thread editor into single nav item
The thread gallery already has a "New Thread" button linking to the editor,
so a separate hub button and subnav pill for the editor is redundant.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 12:11:24 -07:00
Jeff Emmett 88c6c70f9e fix(rmaps): add cache-busting version to JS/CSS script tags
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 11:56:35 -07:00
Jeff Emmett db61e54d7b feat(rmaps): mobile UX overhaul — floating FAB menu, self-marker, bottom sheet, privacy consolidation
- Fix QR code (replace broken Node.js import with api.qrserver.com API)
- Rename "Share Room" → "Share rMap" across UI
- Add "hidden" precision level replacing ghost mode toggle
- Unified 5-level privacy panel (Exact → Hidden/Ghost) as button list
- Pulsing blue dot self-marker (replaces emoji circle for own position)
- Locate-me FAB (bottom-left, both mobile and desktop)
- Mobile: edge-to-edge map, floating FAB menu with staggered animations
- Mobile: bottom sheet for participants (peek/expand with touch drag)
- Mobile: hide sidebar/controls/privacy panel, overlay compact nav bar
- Extract shared participant list helpers for desktop sidebar + mobile sheet

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 11:23:41 -07:00
Jeff Emmett 1c93e3bb67 feat(rinbox): add email forwarding prompt banner and fix auth token reading
Replace broken encryptid-token localStorage reads with getAccessToken/getUsername
from rspace-header. Add forwarding status check against EncryptID API with
enable/disable/dismiss banner on mailboxes view.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 11:23:01 -07:00
Jeff Emmett 15c118923b fix(spaces): match owner DID format in space list + resolve all TS errors
Space dropdown showed "Request Access" for the owner's own space because
the /api/spaces endpoint only checked claims.sub against ownerDID, missing
the did🔑 format used by auto-provisioned spaces. Now uses dual-check
matching the resolveRole helper pattern.

Also fixes 15 pre-existing TypeScript errors:
- server/index.ts: add Hono AppEnv type for context variables
- modules/rnetwork/mod.ts: cast tuple index to number for arithmetic
- modules/rsplat/folk-splat-viewer.ts: type CDN-loaded three.js as any
- modules/rtube/mod.ts: cast Uint8Array to BlobPart for FormData

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 11:11:32 -07:00
Jeff Emmett 73ad020812 fix(spaces): fix space creation routing and use /rspace URLs
Space creation was broken because the canvas module has id "rspace" but
all navigation URLs used "/canvas". On production subdomain routing this
resulted in 404s after creating a space.

- Switch create-space form from deprecated /api/communities to /api/spaces
- Replace all /canvas navigation URLs with /rspace to match module ID
- Fix DID matching in space listing to check both sub and did:key formats
- Add proper client DID support in EncryptID registration flow

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 11:07:01 -07:00
Jeff Emmett 8bd6e61ffc feat(rsocials): add campaigns dashboard with workflow thumbnail grid
New gallery landing page at /campaigns showing all campaign workflows as
cards with miniature SVG previews. Click a card to open the editor at
?workflow=<id>. Editor gains back-link to dashboard and workflow attribute
for deep-linking.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 10:47:03 -07:00
Jeff Emmett 39ec09bb3b fix(compat): improve cross-browser support for Firefox, Safari, and older browsers
Add global polyfills for AbortSignal.timeout() (Safari <17, Firefox <122)
and crypto.randomUUID() (Safari <15.4, Firefox <95) in shell HTML templates.
Add -webkit-backdrop-filter prefix across 13 files for older Safari support.
Add Firefox scrollbar (scrollbar-width/scrollbar-color), range input
(::-moz-range-thumb/track), and color-mix() rgba fallbacks. Create shared
compat.ts utility module. Lowers browser floor from Safari 17/Firefox 122
to Safari 15.4/Firefox 95.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 10:43:38 -07:00
Jeff Emmett a736321189 feat(rnotes): add real-time Yjs collaboration, comments, and suggestions
Replace whole-content Automerge sync with character-level Yjs CRDT for
NOTE-type notes. Adds cursor presence, inline comments with threaded
replies, and track-changes suggesting mode.

- Custom Yjs WebSocket provider bridging over existing rSpace WS
- Server-side yjs-sync/yjs-awareness message relay (pure broadcast)
- y-indexeddb for offline persistence, periodic plaintext sync to Automerge
- Comment mark + panel with resolve/reply/delete
- Suggestion insert/delete marks with accept/reject support
- Schema v3→v4 (collabEnabled, comments fields)
- Collab toolbar: comment button, suggesting toggle, peer indicators

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 10:36:09 -07:00
Jeff Emmett 1f97a2ceba fix(smtp): use noreply@rmail.online as sender across all modules
Mailcow rejects noreply@rspace.online because the authenticated user
is noreply@rmail.online. Updated all SMTP_FROM and SMTP_USER defaults
to use rmail.online consistently: spaces invites, rSplat notifications,
EncryptID auth emails, and rCart payment receipts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 21:00:41 -07:00
Jeff Emmett d5d3f09b28 feat(rvnb): add (you)rVnB — community RV & camper rental module
Peer-to-peer RV/camper rentals within community trust networks.
Forked from rBnb with vehicle-specific concepts: specs, mileage
policies, pickup/dropoff locations, and dry humor throughout.

4 seed vehicles, full CRUD API, Leaflet map with pickup/dropoff
markers, rental request flow, endorsement tags including
"suspiciously_clean" and "smells_like_adventure".

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 19:26:59 -07:00
Jeff Emmett 362bdd5857 fix(rchoices): move CrowdSurf under rChoices sub-nav, fix header overlap
- Hide CrowdSurf from app switcher (hidden: true) since it's now a
  sub-tab of rChoices
- Replace dead outputPaths (Polls/Results with no routes) with actual
  tabs: Spider Chart, Ranking, Voting, CrowdSurf
- Add /:tab route handler so sub-nav pills link to working URLs
- Component reads tab attribute for initial tab selection
- Remove internal .demo-tabs (shell sub-nav replaces them)
- Bump JS cache version to v=6

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 17:43:18 -07:00
Jeff Emmett 383441edf7 feat(rchoices): inline CrowdSurf swipe cards with sortition
Replace CrowdSurf tab placeholder with working swipe-card interface
populated from rChoices session data (or demo fallback). Uses seeded
PRNG (mulberry32 + djb2 hash) for deterministic daily sortition per
user, preventing position bias. Right-swipe = approve (casts vote via
local-first client), left-swipe = skip. Swipe state persists in
localStorage across page reloads. Includes summary view with
session-grouped approvals and reset functionality.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 17:29:50 -07:00
Jeff Emmett 1811f5e7b4 fix(rchoices): bump JS cache version to v=5 for tab CSS fix
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 17:14:04 -07:00
Jeff Emmett 352ad33fff fix(rchoices): responsive tabs — icon-only on mobile to prevent overflow
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 17:11:49 -07:00
Jeff Emmett d4c0fdf7eb fix(rsplat): stop polling on 404 when job lost after server restart
In-memory gen3dJobs are lost on container restart. The poll was silently
swallowing 404s and looping forever. Now stops after 3 consecutive 404s
with a clear "server restarted" message.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 16:51:34 -07:00
Jeff Emmett b80275abcb fix(rchoices): fix tab overlap + show icons-only on mobile
Adds margin-top to demo-tabs to prevent overlap with shell nav.
Hides tab labels on narrow screens (<=480px), showing only icons
so all 4 tabs fit. Bumps JS cache to v=4.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 16:47:10 -07:00
Jeff Emmett 2eb9ca2d8f fix(rsplat): use queue API for Hunyuan3D + fix controls z-index
Also fix canvas.html null reference crash when share-badge is stripped
by extractCanvasContent() header removal.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 16:37:36 -07:00
Jeff Emmett 077bcf260a feat(rchoices): add CrowdSurf tab to choices dashboard
Adds a fourth sub-tab linking to the CrowdSurf module with teaser content.
Bumps JS cache version to v=3.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 16:37:31 -07:00
Jeff Emmett dae8f72acb fix(rsplat): importmap must precede model-viewer module script
Browser ignores importmap when a <script type="module"> appears before it,
breaking Three.js imports and causing the 3D gen UI to hang at staging.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 16:33:48 -07:00
Jeff Emmett 6b3fbd36b0 feat(rsplat): gallery thumbnails via model-viewer + fix 3D gen error handling
GLB models now render inline 3D previews using Google's <model-viewer> web
component with auto-rotate. AI-generated models show source image thumbnails.
Fixed fal.ai result fetch with retry logic and detailed logging for diagnosis.
Save flow now uses save-generated API with thumbnail_url passthrough.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 16:22:31 -07:00
Jeff Emmett 7da90088c4 fix(rsplat): fix GLB viewer not rendering on mobile
Defer initThreeViewer to next animation frame so the DOM has laid out
before reading container dimensions. Fall back to viewport size instead
of hardcoded 800x600 when container reports zero dimensions. Add proper
MIME types for GLB/GLTF file serving.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 23:15:24 +00:00
Jeff Emmett 2ea6fee951 feat: add CrowdSurf module — swipe-based community activity coordination
Implements the Crowdsurfing protocol (gospelofchange/Crowdsurfing) as an
rSpace module with full local-first Automerge CRDT sync. Users propose
activities with commitment thresholds, others swipe to join and declare
contributions, and activities trigger when enough people commit.

Module includes schemas, local-first client, swipe UI dashboard with
pointer gesture detection, landing page, seed template data, and
Vite build integration.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 23:12:19 +00:00
Jeff Emmett 51da13ac46 feat(rbnb): add community hospitality module — trust-based space sharing
New rSpace module for couch surfing and space sharing within community networks.
Gift economy as first-class option, rNetwork trust graph for auto-accept,
messages embedded in CRDTs, endorsements feed back into trust graph.

- schemas.ts: Listing, StayRequest, Endorsement, AvailabilityWindow, SpaceConfig types
- mod.ts: 18 API endpoints (listings, availability, stays, endorsements, search, stats, config)
- landing.ts: Marketing page with warm amber/red/pink palette
- local-first-client.ts: Automerge sync wrapper (BnbLocalFirstClient)
- components: folk-bnb-view (grid+map), folk-listing (card shape), folk-stay-request (detail)
- bnb.css: Economy badges, status indicators, message thread styles
- Registered in server/index.ts, added r🏠 badge to app switcher under "Sharing"
- 6 demo listings (gift couch, exchange farm, suggested tent, sliding loft, gift hub, fixed cabin)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 16:01:50 -07:00
Jeff Emmett de828c4247 fix(rsplat): bump JS cache version to v=9
Force browsers to fetch updated folk-splat-viewer.js with
error handling fixes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 15:57:13 -07:00
Jeff Emmett f1de3b654e fix(rsplat): handle formData parse errors in image-stage endpoint
Wrap formData() in try/catch with logging to diagnose Content-Type
issues through Cloudflare tunnel. Also fix client-side error handling
to clear progress timer and show actual error message on failure.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 15:53:59 -07:00
Jeff Emmett d950354dfd feat(rsplat): default to image upload tab + clickable drop area
- Default upload mode is now "Generate from Image" instead of splat upload
- Clicking anywhere in the dotted drop area opens the file browser
  (not just the "browse" link)
- Add cursor: pointer to upload mode areas

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 15:47:39 -07:00
Jeff Emmett 84c3c318d8 feat: async 3D gen, calendar reminder widget, cross-module drag, subdomain URL fixes
- Make /api/3d-gen async with job queue + email notification on completion
- Add reminder mini-calendar widget to canvas (top-right on shape select)
- Make items draggable across 6 modules (rNotes, rTasks, rFiles, rSplat, rPhotos, rBooks)
- Upgrade rCal drop handler with time-picker popover instead of confirm()
- Show reminder indicators (dots + badges) on calendar days
- Fix subdomain routing: remove space slug from server-rendered sub-nav,
  tab bar, and module links in production (/{moduleId} not /{space}/{moduleId})
- Add buildSpaceUrl() helper for correct external URL generation
- Fix rcart payment URLs for subdomain routing
- Fix rSchedule email links to use subdomain format

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 22:18:51 +00:00
Jeff Emmett 3e4c070fea fix(rsplat): use queue API for Hunyuan3D + fix controls z-index
- Switch to fal.ai queue API (submit/poll/result) with 5-min deadline
  to avoid synchronous timeout on long-running textured mesh generation
- Bump controls z-index to 100 so buttons aren't obscured by the
  GaussianSplats3D canvas overlay
- Update progress phases for Hunyuan3D timing (60-180s)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 14:49:24 -07:00
Jeff Emmett 55b47901ab fix(rsplat): use fal.ai queue API to avoid timeout on Hunyuan3D
Synchronous fal.run endpoint times out for textured mesh generation.
Switch to queue.fal.run submit/poll/result pattern with 5-minute
deadline. Update client progress phases for longer generation time.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 14:46:30 -07:00
Jeff Emmett ef60e29da3 feat(rflows): richer 4-layer demo with overflow cascading down and back up
Redesign both demo presets with deeper multi-layer funnel networks:
- demoNodes: 3 sources → treasury → 3 domains → 5 teams → 11 outcomes
- simDemoNodes: 2 sources → treasury → 4 domains → 4 sub-teams → 10 outcomes
- Overflow paths create visible bidirectional flow (down and back up)
- Wider spacing between nodes for breathing room
- River view: larger layout constants (layer height, gaps, segment length)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 14:42:48 -07:00
Jeff Emmett 26c1e72bb1 feat(rsplat): switch to Hunyuan3D v2.1 for reliable image-to-3D
SAM 3D was designed for object segmentation, not full-scene
reconstruction — failed on arbitrary images. Hunyuan3D v2.1 produces
high-quality textured GLB meshes from any single image reliably.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 14:37:57 -07:00
Jeff Emmett 8ea2bb871b feat(rtube,rmeets): live 360° stream splitting + Jitsi External API
- rtube: 4 live-split proxy routes (start/status/stop/hls), new "360 Live"
  mode in folk-video-player with HLS.js multi-view grid player
- rmeets: ?api=1 route for Jitsi External API mode, new folk-jitsi-room
  web component with 360° Director panel (canvas captureStream)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 14:28:13 -07:00
Jeff Emmett 0f1090db44 feat(rsplat): switch AI generation from Trellis 2 to SAM 3D
SAM 3D outputs native Gaussian splat .ply files (rendered via existing
initSplatViewer) instead of GLB meshes, with full-scene support including
people and backgrounds. Faster generation (5-30s vs 45-75s), $0.02/gen.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 14:03:39 -07:00
Jeff Emmett d270e7c03a feat(rtube): integrate 360split for splitting 360° videos into flat perspectives
Server-side proxy routes (POST /api/360split, GET status, POST import) fetch
video from R2, submit to video360-splitter, and import results back. Frontend
adds Split 360° button with settings modal, progress polling, and library import.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 13:55:31 -07:00
Jeff Emmett d62a5e9b15 feat(rtasks): add list view with checkmarks, drag-drop reordering with drop indicators
Board/List view toggle in nav bar. List view shows tasks grouped by status
with checkboxes (check → DONE, uncheck → TODO), priority left-border accent,
and strikethrough for completed items. Board view now shows a blue pulsing
drop indicator line during drag, supports in-column reordering via sort_order,
and cross-column drops land at the cursor position. Cache version bumped.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 13:48:28 -07:00
Jeff Emmett 0afde7547c Deep-link "Open in rTasks" to backlog task with banner
- "Open in rTasks" button passes ?backlog=TASK-ID query param
- Kanban component reads param and shows indigo banner with task ID
- Dismiss button removes banner and cleans URL

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 13:41:34 -07:00
Jeff Emmett cf296a3bb3 Add toggle (check/uncheck) to checklist items + "Open in rTasks" button
- checkAC → toggleAC: clicking a checked item unchecks it
- Tokens generated for all items (checked and unchecked)
- Checked items now clickable with green checkmark links
- Uncheck shows amber banner; check shows green banner
- "Open in rTasks" button links to kanban board

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 13:31:55 -07:00
Jeff Emmett 0728c9e516 chore(rsplat): bump JS/CSS cache versions for Cloudflare
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 13:28:44 -07:00
Jeff Emmett cf93b33c8b feat(rsplat): add % progress bar for 3D generation, fix auth token lookup
Replace indeterminate sliding animation with a realistic percentage fill
bar using logarithmic curve (asymptotes at 95%, based on ~60s typical
Trellis 2 timing). Jumps to 100% on completion.

Fix "sign in to save" showing for authenticated users by checking both
localStorage and cookie for auth token, and improving the 401 message
to "Session expired" when a token exists locally.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 13:02:38 -07:00
Jeff Emmett 21b1e8fa0a feat(rsplat): image staging endpoint, viewer improvements, SW updates
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 12:24:40 -07:00
Jeff Emmett 9ecffff692 fix: use internal Docker SMTP hostname and fix noreply@rmail.online creds
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 12:17:05 -07:00
Jeff Emmett d0fbbd2ee5 fix(rtasks): mount checklist routes at top level to bypass space auth
The checklist check/send endpoints don't need space context — the HMAC
token and API key provide their own auth. Routes are now:
  GET  /rtasks/check/:token
  POST /api/rtasks/send

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 12:09:37 -07:00
Jeff Emmett 0ad67c54a6 feat(rtasks): add email checklist with HMAC-signed click-to-check links
POST /checklist/send builds and emails a styled checklist from backlog AC items.
GET /checklist/:token verifies the HMAC signature, toggles the AC in the
markdown file, and re-renders the page with fresh links for remaining items.

Adds dev-ops volume mount and RTASKS_HMAC_SECRET/RTASKS_API_KEY env vars.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 12:02:14 -07:00
Jeff Emmett d008b78727 fix(rsplat): save-to-gallery, remove broken media upload, fix leaks
- Add POST /api/splats/save-generated so AI-generated 3D models persist
- Add "Save to Gallery" button in viewer after AI generation
- Remove non-functional "Upload Photos/Video" tab (no processing worker)
- Add 120s server-side timeout on fal.ai Trellis 2 fetch
- Fix GLB viewer memory leak (animation loop + resize listener on disconnect)
- Show elapsed time + phase messages during generation progress
- Bump CSS v3, JS v4 cache versions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 00:56:33 -07:00
Jeff Emmett 8a82223b6f fix: remove deprecated PWA meta tag, add 3D gen timeout, quiet WS errors
Remove apple-mobile-web-app-capable (redundant with manifest.json display),
add AbortController timeout + 524 handling for /api/3d-gen fetch, and
downgrade CommunitySync WS error to console.warn since reconnect is automatic.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 22:23:00 -07:00
Jeff Emmett 9008640f79 perf(rnetwork): optimize 3D graph rendering + fix cross-platform mobile PWA
Graph performance: seed node positions to prevent NaN geometry warnings,
cache sprite textures, reduce simulation ticks (120→50 warmup, 300→150
cooldown), cap particles at 2, lower sphere segments, halve label canvas
size, add sessionStorage graph data cache with 60s TTL.

Mobile PWA: add both mobile-web-app-capable (Chrome/Android) and
apple-mobile-web-app-capable (iOS), viewport-fit=cover for notch support,
apple-mobile-web-app-title, safe-area CSS insets on header/body, fix
admin.html missing all mobile meta tags.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 22:08:22 -07:00
Jeff Emmett e498233666 chore: bump JS cache versions for multiplayer updates
rchoices v=2, rswag v=2, rwallet v=13

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 21:10:49 -07:00
Jeff Emmett 7e430490ba feat(rflows): rename progress bar to Repayment Progress, make it minimizable
- Timeline bar now shows "Repayment Progress" label
- Added minimize button (─/▶) to collapse the bar to a compact toggle
- When minimized, hides the track, label, and tick counter

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 01:19:16 +00:00
Jeff Emmett d3a6ad7dda feat: add Automerge schemas + local-first-clients for remaining modules
- rdesign: linked Affine projects per space
- rdocs: linked Docmost documents per space
- rmeets: meeting scheduling and history
- rmaps: persistent annotations, routes, meeting points
- rforum: local-first-client wrapping existing provision schemas

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:49:51 -07:00
Jeff Emmett a504a24a55 feat: add Automerge schemas + local-first-clients for tier-3 modules
- rdata: shared analytics dashboard config
- rphotos: shared album curation and photo annotations
- rtube: shared playlists and watch party sync
- rpubs: local-first-client wrapping existing draft schemas

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:47:37 -07:00
Jeff Emmett b86af45610 feat(rnetwork): add Automerge schemas + local-first-client for CRM sync
Contact metadata, relationships, and graph layout positions sync
via CRDT. Delegations remain server-authoritative in PostgreSQL.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:45:01 -07:00
Jeff Emmett ee54ec219d feat(rnetwork): add Layers mode for multi-rApp 3D visualization
Adds a "Layers" toggle to the graph viewer that lets users select 2-3
rApps and visualize them as labeled planes on user-assignable axes
(XY/XZ/YZ) with hub+feed nodes, cross-layer flow wiring via compatible
FlowKinds, animated particle edges, and unrestricted camera orbit.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:44:50 -07:00
Jeff Emmett c0d2276d46 feat(rschedule): add local-first-client.ts for standalone sync
Wraps existing Automerge schemas with DocumentManager/DocSyncManager
for direct client-side sync. CRUD methods for jobs, reminders,
workflows, and execution log.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:43:26 -07:00
Jeff Emmett c0ae0e9a53 feat(rwallet): add multiplayer shared watchlist via Automerge CRDT
Shared wallet address watchlist syncs across space members. Click
watched address to load it in the visualizer. Transaction annotations
and dashboard config schema ready for future use.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:39:41 -07:00
Jeff Emmett 20c4a19e06 feat(rnetwork): absolute token weights instead of fractional averages
Weight accounting now uses actual base weights per authority (×100 for
integer tokens). Formula: effective = max(0, base - delegatedAway) + received.
If you have 95 Gov tokens and delegate 48, you retain 47; the recipient
gains 48 on top of their own base.

- Detail panel shows breakdown: base − delegated + received = effective
- Badge shows integer token count per authority
- Member list sidebar shows per-authority G/E/T weights (color-coded)
- Sorted by total effective weight (sum across all authorities)
- No more averages — absolute weight of voice

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:39:05 -07:00
Jeff Emmett 0db93695d8 feat(rswag): add multiplayer design sync via Automerge CRDT
Shared design metadata syncs across space members in real-time.
"Space Designs" gallery shows all designs with download links.
Artifact generation auto-publishes design metadata to peers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:34:06 -07:00
Jeff Emmett b67f30ac0a feat(rchoices): add multiplayer voting sessions via Automerge CRDT
Create local-first-client.ts and schemas.ts for real-time collaborative
voting. Dashboard now shows live polls with session cards, vote tallies,
and owner controls (close/delete). Votes sync across tabs via WebSocket.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:28:42 -07:00
Jeff Emmett 7cab8d6187 feat(rnetwork): responsive zoom, larger nodes/labels, member list sidebar
- Zoom: 2x/0.5x steps (was 1.33x/0.75x), 200ms animation, scroll speed 2.5x
- Node sizing: range 6-56px in trust mode (was 4-30px) for dramatic differentiation
- Text labels: 512x96 canvas with 36px font, 14x3.5 sprite scale (was 256x64, 24px, 8x2)
- Member list sidebar: toggled via "List" button, shows admins/members/viewers grouped
  with effective weight, click to fly camera to node, responsive mobile stack layout

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:21:23 -07:00
Jeff Emmett c233f1338b fix(rsplat): use three/addons/ import path to match importmap
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:18:19 -07:00
Jeff Emmett 03de21ddd5 feat(rnetwork): concentric spheres layout with Fibonacci distribution
Replace flat ring layout with 3D sphere distribution using Fibonacci
spiral for even node placement. Wireframe sphere guides replace flat
ring guides — visible from every camera angle.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:05:30 -07:00
Jeff Emmett 246b51b2e0 feat(rbudgets): multiplayer sync, interactive pie chart, flow integration
- Add budget CRUD methods to FlowsLocalFirstClient (saveBudgetAllocation,
  addBudgetSegment, removeBudgetSegment, setBudgetTotalAmount)
- Init local-first client in budget view with real-time onChange sync
- extractBudgetState() recomputes collective averages from Automerge doc
- Debounced auto-save (1s) via scheduleBudgetSave() on slider/pie changes
- Interactive pie chart: click wedges to select, drag boundaries between
  segments to adjust allocation percentages with angle-to-pct geometry
- Selected segment highlighting (scaled wedge, white border, detail panel,
  slider row highlight, legend/table row click-to-select)
- "Apply to Flow" button pushes collective budget into canvas flow as
  funnel node with spending allocations mapped to outcome nodes
- LIVE indicator when WebSocket connected
- Falls back to API for demo/unauthenticated users

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:04:02 -07:00
Jeff Emmett 2cce369b7b chore(rsplat): bump JS/CSS cache version to v=2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:03:22 -07:00
Jeff Emmett c5f757d050 fix(rsplat): resize images client-side before 3D generation, pass through fal.ai errors
Mobile photos (12MP+) were causing generation failures due to large base64 payloads.
Now resizes to max 1024px before sending. Server now returns actual fal.ai error
messages instead of generic "3D generation failed".

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 16:56:35 -07:00
Jeff Emmett e5b5c551b1 feat(rnetwork): multi-select delegation with per-node sliders and fuzzy search
- Click any person/member node to add them to delegation selection
- Each selected node gets 3 inline sliders (Gov/Econ/Tech) for weight assignment
- Fuzzy search input in delegation panel to find and add members by name
- Remaining weight display per authority
- "Confirm All Delegations" commits all at once, recomputes weights live
- Replaces old two-step popup with single-panel multi-select UX

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 16:54:45 -07:00
Jeff Emmett 48cbf22492 fix(rnetwork): check URL space slug not effectiveSpace for demo detection
effectiveSpace resolves to 'global' for rnetwork (global-scoped module),
so check the URL space param instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 16:49:55 -07:00
Jeff Emmett 33721819db fix(rnetwork): show demo members in demo space even when CRM token exists
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 16:47:56 -07:00
Jeff Emmett 98cd239418 feat(rnetwork): weight accounting, ring layout, inline delegation UI
- Per-authority effective weight computation (delegated/received/retained)
- Concentric ring layout (admin/member/viewer) with visual guides
- Inline delegation popup with total + domain split sliders
- Authority labels renamed: Gov/Econ/Tech with consistent colors
- Authority-filtered edge view in trust mode
- Demo delegation preview with live graph updates
- Trust API endpoints for delegation CRUD and score queries

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 16:34:54 -07:00
Jeff Emmett af43e98812 feat(rflows): add rBudgets collective budget allocation sub-view
Adds a new "rBudgets" sub-tab to rFlows where participants allocate
budgets across departments via sliders, with a collective SVG pie chart
showing aggregated results. Includes schema v4 migration, budget CRUD
API routes, demo seed data (5 segments, 4 participants, $500k pool),
and slider auto-normalization to 100%. Removes redundant "Flows" and
"Flow Viewer" entries from outputPaths/subPageInfos.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 16:11:32 -07:00
Jeff Emmett cab80f30e7 refactor(rnetwork): move Open CRM to sub-nav header
Remove standalone "Open CRM" button from graph view body and add
"Open Twenty CRM" as an external link in the module sub-nav bar,
next to Community CRM. Dashed border + margin-left:auto pushes it
to the right edge for visual distinction.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 15:52:10 -07:00
Jeff Emmett e6f78a67e8 feat(rflows): Sankey-consistent edge widths, split controls, vessel path fixes
- Add computeFlowWidths() pre-pass for per-node proportional edge widths
  (outgoing edges sum to node pipe width, 8-80px range)
- Replace +/- buttons on edges with draggable split controls on nodes
  (source, funnel spending, funnel overflow — min 5% clamp, 60fps updates)
- Fix vessel wall path discontinuities by interpolating at pipe boundaries
- Stabilize overflow pipe sizing (fixed height, CSS opacity transitions)
- Tighten funnel foreignObject bounds to eliminate pointer-events overlap
- Replace foreignObject zone/overflow labels with SVG <text> elements
- Add inflow pipe indicator bars on funnels showing flow fill ratio

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 15:44:14 -07:00
Jeff Emmett 4cdba2e7de fix(rwallet): align yield rates table columns with fixed-width layout
Use table-layout:fixed with colgroup for consistent APY/30d Avg/TVL
column alignment. Dedicated yield-rates-table class with right-aligned
monospace numeric columns. Bump JS cache v=12.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 15:40:59 -07:00
Jeff Emmett a0723e261a fix(rbooks): use imported randomUUID() instead of crypto.randomUUID()
crypto.randomUUID() crashes in the server context during demo space
initialization, causing 502 Bad Gateway on /rbooks.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 14:29:13 -07:00
Jeff Emmett fdf2a429f5 fix(rwallet): populate yield APY stats, hide top tabs on yield view
- Fix DeFi Llama field mapping: use apyMean30d + apyPct7D (apyMean7d
  doesn't exist in their API)
- Add apyBase, apy30d fields to YieldOpportunity type
- Deduplicate rates table (best APY per protocol+chain+asset)
- Hide "My Wallets / Wallet Visualizer" top tab bar on yield page
- Color-code APY values, better TVL formatting (B/M)
- Bump JS cache to v=11

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 12:41:11 -07:00
Jeff Emmett f9d4164f28 chore(rwallet): bump JS cache version to v=10
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 12:35:34 -07:00
Jeff Emmett 6d40904fa7 fix(rwallet): yield page renders standalone without wallet detection
Force topTab=visualizer and skip hero/address/features/examples when
activeView is yield. Works for both authenticated and anonymous users.
Yield rates auto-load on page init without requiring a wallet address.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 12:33:40 -07:00
Jeff Emmett 8da42095c6 fix(rwallet): show yield rates standalone on /yield page
Yield tab now auto-loads rates on page init and renders independently
of wallet detection — no longer gated behind hasData(). Shows rates
comparison table, header with description, and back button.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 11:58:02 -07:00
Jeff Emmett 3436393bfb feat(rwallet): add Aave V3 + Morpho Blue auto-yield for idle treasury
Adds yield-generating capability for idle stablecoins (USDC/USDT/DAI)
on Ethereum and Base via Aave V3 and Morpho Blue vaults, using the
existing Safe multisig proposal flow for governance.

New lib files: yield-protocols (constants/ABIs), yield-rates (DeFi Llama
+ Morpho GraphQL with 5min cache), yield-positions (on-chain queries),
yield-tx-builder (MultiSend calldata for Safe proposals),
yield-strategy (idle detection + allocation suggestions).

5 API routes, "Yield" view tab with rates table, position cards, and
advisory strategy suggestions. Zero new dependencies.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 10:17:54 -07:00
Jeff Emmett 2264267ded feat(rflows): floating play button, auto-start demo, minimizable panels
- Add prominent floating Play/Pause FAB button (bottom center)
  with glow effect and pulse animation while running
- Auto-start simulation for demo and sim-demo flows on load
- Analytics panel now has a minimize button (◀/▶) to collapse
  to a narrow strip, preserving screen space
- Keep existing toolbar Play button for discoverability

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:15:21 +00:00
Jeff Emmett 99131df914 fix(rMortgage): use 5/10/15yr borrower term options
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 02:18:57 -07:00
Jeff Emmett a1f8702988 feat(rMortgage): aggregate pool viz, earnings comparison, fewer tranches
- Pool summary cards clickable → aggregate breakdown vessel showing
  total outstanding/repaid/reinvested with earnings comparison bar
- Lender detail: earnings bar (interest vs reinvestment), advantage
  callout showing % gain from reinvesting returns
- Borrower options reduced from 6 to 3 tranches (10yr, 20yr, 30yr)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 02:14:39 -07:00
Jeff Emmett 600e9080d0 feat(rflows): add rMortgage sub-tab with trust-backed lending & DeFi reinvestment
Social mortgage lending tracker at /mortgage with pool overview, active
positions table, lender detail vessel visualization, borrower options
panel (monthly-budget-constrained with lender fill bars), live Aave v3
rates on Base, reinvestment tracker, and yield projection calculator.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 01:23:14 -07:00
Jeff Emmett d642b856a9 feat(rflows): animated flow effects on waterfalls and connections
- 5-layer animated flow strips inside waterfall paths (denser, more visible)
- Glowing edge lines along waterfall boundaries
- Animated white dashes flowing along center spine of each waterfall
- Pulsing entry glow where flow meets a funnel or outcome node
- Exit glow where flow leaves a source or funnel
- Flow amount labels ($X.Xk/mo) on each waterfall
- Overflow branches now have animated flow strips and entry pulse
- New entryPulse CSS animation for connection point emphasis

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 05:56:30 +00:00
Jeff Emmett 35eadc8a34 feat(rflows): smaller funnels for faster simulation, all outcomes start at $0
- Shrink all funnel thresholds/capacities by ~5x so they fill and drain
  visibly within a few simulation ticks
- Zero out all outcome fundingReceived and reset statuses to not-started
- Same treatment for both BCRG Demo and Simulation Demo presets
- Funnels now cycle through fill/overflow/spend much more dynamically

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 05:17:02 +00:00
Jeff Emmett d7c1aaae9c feat(rflows): pipe size = desiredOutflow, flow = inflowRate
River visualization now shows:
- Pipe width = monthly desiredOutflow (what the funnel needs)
- Inner flow height = inflowRate (what it actually receives)
- Underfunded funnels (<95%) shown in red with funding percentage
- Label shows "$inflow → $outflow/mo" for at-a-glance funding health
- Fully funded funnels get sufficiency sparkle

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 04:52:55 +00:00
Jeff Emmett 3d4d2112dd feat(rflows): add simulation demo preset and dual pipe/flow visualization
- Add simDemoNodes preset: 1 source → treasury → 3 domain funnels → 6 outcomes
  All values start at zero so users can watch flow propagate through the system
- River visualization now shows pipe capacity (outer width) separately from
  active flow (inner fill height), making the two dimensions visually distinct
- Pipe width based on funnel capacity, inner flow based on current fill ratio
- Add "Simulation Demo" as a loadable flow alongside the BCRG Demo

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 04:10:13 +00:00
Jeff Emmett ccca8318a3 feat: payment email notifications, GLB viewer, and EncryptID email lookup
- Add EncryptID internal endpoint for email lookup by userId
- rcart: send "Payment Sent" to payer and "Payment Received" to recipient
- rcart: resolve emails via EncryptID when not provided in request
- rsplat: add GLB/GLTF 3D viewer using Three.js GLTFLoader
- rsplat: enable publicWrite for photo uploads without space membership
- docker-compose: add SITE_URL and SPLAT_NOTIFY_EMAIL env vars

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 04:02:07 +00:00
Jeff Emmett 44e7639124 fix(rnetwork): switch to unpkg CDN with dynamic fallback for 3d-force-graph
jsdelivr was returning 503. Switch primary CDN to unpkg and add a dynamic
fallback loader that tries both CDNs if the initial script tag fails.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 12:24:54 -07:00
Jeff Emmett a1f8103237 fix(rnetwork): remove header and stats bar to maximize canvas space
Remove the "Network Graph" title and People/Organizations/Members/Cross-org
stats bar. Reduce toolbar margin for minimal chrome above the canvas.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 22:45:19 -07:00
Jeff Emmett 40be1c63b3 feat(rmaps): add collaborative room sync to canvas folk-map shape
Integrate RoomSync, participant markers, location sharing, waypoints,
emoji avatars, and participant panel into the canvas map shape. Users
can now create collaborative map rooms directly from the canvas toolbar.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 22:42:34 -07:00
Jeff Emmett 1b2842fc4a fix(rwallet): remove all gap between top tabs and content
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 21:25:53 -07:00
Jeff Emmett 8957dd8ea7 chore(rwallet): bump cache version to v=9
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 21:20:07 -07:00
Jeff Emmett 4d72ba164e feat(rmaps): decompose modals into sub-components + SW offline pinging
Extract meeting point, share, import, and privacy modals from
folk-map-viewer.ts (2504→2147 lines) into standalone web components
that communicate via CustomEvent dispatch. Add OSM tile caching
(cache-first, LRU at 500), IndexedDB room state persistence for
offline location pinging, and auto-persist room state on every sync
update so last-known positions survive tab close.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 21:18:16 -07:00
Jeff Emmett 7c363dbae9 fix(rwallet): reduce gap between top tabs and content
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 21:13:10 -07:00
Jeff Emmett b0d918274d fix(rmaps): commit all pending rmaps changes and missing files
Add map-privacy.ts and updated folk-map-viewer.ts, map-push.ts, mod.ts
that were modified locally but never committed, breaking Docker builds.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 20:38:26 -07:00
Jeff Emmett 21a9a0f7e3 fix(rmaps): add missing map-import.ts to repo
File was created locally but never committed, breaking Docker builds.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 20:37:42 -07:00
Jeff Emmett e37fefe8a4 fix(rnetwork): treat TWENTY_API_TOKEN=disabled as unset
Infisical injects secrets at startup when the env var is empty/falsy,
so setting it to "disabled" blocks injection while this change ensures
the demo data fallback still triggers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 20:36:51 -07:00
Jeff Emmett aa6f04e45e fix: resolve all 127 TypeScript errors with Hono type augmentation
Add types/hono.d.ts declaring effectiveSpace, spaceRole, and isOwner
on Hono's ContextVariableMap. Remove 127 "as any" casts across 18
files. Fix ParticipantStatus type in rmaps SyncMessage union.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 20:25:29 -07:00
Jeff Emmett 2a10277ec8 feat(rcart): add real payment flow for cart contributions
Contribute button now offers "Pay Now" (creates a PaymentRequest linked
to the cart, navigates to the existing payment page) alongside "Record
Manual". When the payment completes, the server auto-records a
contribution on the cart with amount, method, and txHash.

- Add recipientAddress to ShoppingCartDoc, linkedCartId to PaymentRequestMeta
- New POST /api/shopping-carts/:cartId/contribute-pay route
- Payment status handler propagates paid → cart contribution
- Payment page shows "Return to Cart" link for linked payments

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 20:25:17 -07:00
Jeff Emmett e2d26d506c feat(rwallet): add 5 more testnet chains for EVM balance scanning
Adds Arbitrum Sepolia, Optimism Sepolia, Polygon Amoy, Avalanche Fuji,
and BSC Testnet with RPC URLs, native tokens, popular ERC-20s, and
Alchemy slug mappings.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 20:19:56 -07:00
Jeff Emmett fcea37b91b feat(rcart): clickable demo orders with detail view
Enrich 5 demo orders with items, buyer, payment, provider, and timeline.
Order cards show thumbnails and item counts; clicking opens a detail view
with payment info, buyer, provider, and timeline using the existing
catalog-detail 2-column layout. Demo payments expanded to 5 (3 linked).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 20:12:45 -07:00
Jeff Emmett 073a64fe56 feat(rnetwork): expand demo CRM to 48 members with delegation-only flows
Remove Demo DAO and space hub placeholder nodes — members now connect
only via trust delegation edges. Add 24 new members (m25–m48) with
ops-vertical specializations and expand delegation arrays to 141 edges
(47 per authority) with proper hierarchical flow patterns.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 20:08:05 -07:00
Jeff Emmett 058592f5e3 fix(rwallet): fix stuck loading, auth, and add Sepolia ERC20 tokens
- Add /encryptid/ to subdomain routing passthrough (was 404 on demo.rspace.online)
- Replace rwallet's custom JWT verify with SDK's verifyEncryptIDToken (supports
  remote fallback when JWT_SECRET unavailable in rspace container)
- Fix CRDT balance loading stuck spinner (early return skipped crdtLoading=false)
- Add Sepolia testnet ERC20 tokens (USDC, WETH, LINK)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 19:40:02 -07:00