Commit Graph

71 Commits

Author SHA1 Message Date
Jeff Emmett 5cc17e05e7 feat: add space subdomain routing and ownership support
- Traefik wildcard HostRegexp for <space>.r*.online subdomains
- Middleware subdomain extraction and path rewriting
- Provision endpoint with owner_did acknowledgement
- Registry enforces space ownership via EncryptID JWT

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 13:20:01 -08:00
Jeff Emmett 1fce7c9385 Standardize emojis across header, favicons, and ecosystem links
Canonical emoji set for consistency:
- 🕸️ rNetwork (was 🌐), ⚖️ rChoices (was 🔀), 📋 rWork (was 💼)
- 🔐 rIdentity (was 🔑), 📖 rPubs (was 📰), 💸 rFunds (was 💰)
- 💰 rWallet (was 💼 in footer), 📬 rInbox (was ✉️)
- 💭 rForum (was 💬, differentiates from rChats)
- 📢 rSocials (was 📱), 🔨 rAuctions (was 🏛️ in footer)
- 🎬 rTube (was 📹 in footer)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 12:57:11 -08:00
Jeff Emmett 7306447d8d Add internal seed endpoint for demo data
Creates 3 notebooks (research/meetings/ideas) with 9 notes, tags,
and parent-child note hierarchy showing the memory card system.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 01:02:34 -08:00
Jeff Emmett ea88aa180c Add internal provision endpoint for rSpace Registry
Auth-free POST /api/internal/provision creates default Notebook + system User
+ OWNER collaborator scoped to workspace slug.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:30:11 -08:00
Jeff Emmett 802091a84f refactor: move Header to layout for all sub-routes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:04:49 -08:00
Jeff Emmett 8e6cb7642d fix: space links use subdomain URLs instead of rspace.online path
Space links now go to <space>.<app-domain> (e.g., myspace.rfunds.online)
instead of rspace.online/<space>. Domain derived from window.location
when not explicitly provided.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:18:20 -08:00
Jeff Emmett c5d0527fbf fix: nest Sign Out under username dropdown in UserMenu
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:09:10 -08:00
Jeff Emmett 5672bc1c61 feat: standardize header with AppSwitcher, SpaceSwitcher, and UserMenu
- Replace inline nav/Navbar with shared Header component
- Header pattern: AppSwitcher dropdown / SpaceSwitcher / actions / Sign In
- SpaceSwitcher and UserMenu work without SDK dependency
- Consistent across all r*Apps

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:03:00 -08:00
Jeff Emmett ea0ffda8a9 feat: standardize AppSwitcher and EcosystemFooter across all rApps
- Update AppSwitcher with all 26 r*Apps in 8 categories
- Add EcosystemFooter component with consistent ecosystem links
- Categories: Creating, Planning, Communicating, Deciding,
  Funding & Commerce, Social & Media, Work & Productivity,
  Identity & Infrastructure

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 22:47:55 -08:00
Jeff Emmett 55ceb55aa1 refactor: migrate EncryptID URLs from encryptid.jeffemmett.com to auth.ridentity.online
Part of the ridentity.online branding migration. The EncryptID auth
server is now accessible at auth.ridentity.online (with the legacy
encryptid.jeffemmett.com kept as a backward-compatible alias).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 22:20:09 -08:00
Jeff Emmett d060e99698 feat: add plain Markdown export/import API endpoints
Export notes as .md files with YAML frontmatter (single or ZIP batch).
Import .md files or ZIP archives with frontmatter parsing and dual-write.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 21:29:40 -08:00
Jeff Emmett f4b453183e chore: update TASK-15 backlog status to Done
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 21:13:53 -08:00
Jeff Emmett c27290ee80 feat: add username-based personal subdomains (<username>.rnotes.online)
Implements workspace-scoped data isolation via subdomain routing:

- Schema: add workspaceSlug to Notebook model + migration
- Middleware: extract subdomain → x-workspace-slug header
- API: filter notebooks/notes/search by workspace on subdomains
- AppSwitcher: generate <username>.r*.online links when logged in
- Sessions: SubdomainSession component syncs auth across subdomains
  via .rnotes.online domain-wide cookie
- Auth: auto-migrate unscoped notebooks to user's workspace
- New /api/me endpoint for client-side auth + workspace state

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:46:24 -08:00
Jeff Emmett 4eb24038b6 feat: add Alt+P keyboard shortcut for PiP pop-out
- Alt+P toggles Picture-in-Picture floating recorder on /voice page
- Works from both main window and PiP window
- Footer shows new shortcut hint when PiP is supported
- Browser extension Ctrl+Shift+V now opens PWA /voice page (with PiP)
  instead of extension-local voice.html

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:25:38 -08:00
Jeff Emmett a6ae90fd62 fix: dark background + emoji favicon for rStack design consistency
Standardize to dark background (#0f172a / slate-900) and add emoji
data URI favicon matching the rStack ecosystem.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:19:09 -08:00
Jeff Emmett be06e1f03e feat: add Picture-in-Picture pop-out to rVoice recorder
Adds a "Pop Out" button that opens a compact floating mini-recorder
using the Document Picture-in-Picture API. The floating window stays
on top of all other apps and includes: record/stop button, timer,
live transcript, copy/save/discard actions, and keyboard shortcuts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:16:21 -08:00
Jeff Emmett 1a01d698e0 feat: add install app + offline model download to rVoice page
Adds "Download app for offline use" button that triggers PWA install
prompt, then automatically starts downloading the Parakeet.js offline
transcription model (~634MB, cached in IndexedDB). Shows purple progress
bar during download. Header shows install/offline-mode/checkmark badges
based on current state. Idle screen shows contextual CTAs for install
or model download.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 19:10:53 -08:00
Jeff Emmett e69aad908b feat: swap rWallet/rFunds emojis, tone down self-hosted language
rFunds gets 💸 (flying money), rWallet gets 💰 (money bag). Toned down
"self-hosted" and "community-run" across descriptions — kept where
especially relevant (rNetwork), replaced elsewhere with more descriptive
terms like collaborative, private, group, live.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 18:58:15 -08:00
Jeff Emmett 48325f2ce5 feat: move rMaps to Planning, rename Sharing & Media to Social & Sharing
rMaps now appears under Planning (alongside rCal and rTrips). Category
renamed from "Sharing & Media" to "Social & Sharing" with rNetwork
at the top.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 18:56:14 -08:00
Jeff Emmett f7a04346b3 feat: rebrand AppSwitcher with rStack identity and pastel badges
All apps now use 'r' prefix (rSpace, rNotes, rPubs, etc.), rStack
appears as the top-level header, pastel rainbow favicon badges (rS, rN,
rP...), emoji to the right of each title, and descriptions emphasize
group/collaborative/real-time/self-hosted/community-run.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 18:50:31 -08:00
Jeff Emmett bf8d6d9d07 Merge dev: add rApp/Space switcher dropdowns to all headers
Resolves merge conflicts to keep both new features from main
(bodyJson, cardType, parent notes, OpenNotebookEmbed, attachments)
and the new shared Header with AppSwitcher + SpaceSwitcher dropdowns.
Also excludes scripts/ from tsconfig to fix pre-existing type errors
and regenerates Prisma client.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 18:31:30 -08:00
Jeff Emmett 3232ced90f feat: add rApp and Space switcher dropdowns to all page headers
Replaces per-page inline navbars with a shared Header component that
includes AppSwitcher (18 rApps grouped by category) and SpaceSwitcher
(fetches user spaces from /api/spaces) dropdowns — matching the
rspace.online header pattern. All 9 pages updated.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 18:27:51 -08:00
Jeff Emmett f0d893c53a Merge branch 'dev' 2026-02-24 18:12:00 -08:00
Jeff Emmett 10accc6092 fix: use live transcript directly instead of batch API re-transcription
The batch Whisper API was producing worse results than the live Web
Speech API transcript. Now the live text is used as-is when recording
stops. Audio still uploads for the AUDIO note attachment. Parakeet.js
offline fallback only triggers if no live transcript was captured.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 18:11:51 -08:00
Jeff Emmett 6fc4bd7c17 Merge dev into main: add rVoice PWA + browser extension voice recorder
Resolves merge conflicts between dev (voice/transcription features) and
main (logseq import/export, memory cards, attachments). Both feature
sets coexist cleanly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 17:47:31 -08:00
Jeff Emmett d236b81a11 feat: add /voice PWA route with 3-tier live transcription
Dedicated standalone voice recorder page at /voice that works as an
installable PWA. Records audio with three transcription tiers running
in parallel: WebSocket streaming (live segments), Web Speech API (live
local), and batch Whisper API (high quality). Falls back to offline
Parakeet.js if all network tiers fail. Includes editable transcript,
notebook selection, copy-to-clipboard, and keyboard shortcuts.

PWA manifest updated with Voice Note shortcut for quick access from
taskbar right-click menu.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 17:43:04 -08:00
Jeff Emmett 5ff6c9d832 feat: add rVoice popup recorder with 3-tier transcription to browser extension
Adds a standalone voice recording popup (voice.html) accessible via the
extension popup button or Ctrl+Shift+V hotkey. Records audio, uploads to
rNotes, and transcribes with a 3-tier cascade: server Whisper API, live
Web Speech API (real-time text while recording), and offline Parakeet.js
(NVIDIA 0.6B, ~634MB cached in IndexedDB). Saves as AUDIO notes with
editable transcript and notebook selection.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 16:43:57 -08:00
Jeff Emmett 3d77eae16b feat: add voice note recorder to browser extension
Adds voice recording popup with keyboard shortcut (Alt+Shift+V),
microphone access, and Voice Note button in the extension popup.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:42:34 -08:00
Jeff Emmett 17f2d49f12 feat: add article unlock feature for paywalled content
Multi-strategy approach to find readable versions of paywalled articles:
1. Wayback Machine (check existing + Save Page Now)
2. Google Web Cache
3. archive.ph (read-only check for existing snapshots)

Adds archiveUrl field to Note model, /api/articles/unlock endpoint,
unlock button on note detail page, and browser extension integration.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:32:37 -08:00
Jeff Emmett 4c939bc45e feat: wire rnotes to pull secrets from Infisical at startup
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 19:35:15 -08:00
Jeff Emmett c4141802cc Host Open Notebook at /opennotebook with wildcard subdomain support
Add /opennotebook route embedding Open Notebook via iframe with space-aware
nav breadcrumb. Middleware detects subdomain (e.g. cca.rnotes.online) and sets
rnotes-space cookie. /ai redirects to /opennotebook. Traefik wildcard router
at priority 100 catches *.rnotes.online subdomains.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 09:45:31 +00:00
Jeff Emmett 3a1366f422 Embed OpenNotebook AI in rNotes — tab + standalone /ai route
Adds AI Notebook tab to notebook detail pages and a full-page /ai route,
both embedding the existing OpenNotebook instance via iframe at
opennotebook.rnotes.online. CSP frame-src header added for security.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 05:55:38 +00:00
Jeff Emmett 7a934a8a93 Add Memory Cards section and inclusion credit to landing page
Six feature cards: card types, hierarchy & properties, Logseq interop,
dual format storage, structured attachments, and FUN model.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 23:42:02 +00:00
Jeff Emmett 6da2cee425 Add Traefik priority 130 to ensure standalone routing over rSpace
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 22:53:12 +00:00
Jeff Emmett 2c3e28b8d1 fix: use Array.from for Map iteration (ES5 target compat)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 22:37:45 +00:00
Jeff Emmett 26602e4197 fix: relax ExportNote.children type for Prisma select compatibility
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 22:37:01 +00:00
Jeff Emmett 9735be83ff fix: cast TipTapDoc to InputJsonValue for Prisma compatibility
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 22:36:22 +00:00
Jeff Emmett 94a5c1bccc fix: use Prisma.DbNull for JSON null filter in backfill script
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 22:35:17 +00:00
Jeff Emmett 7b1d120379 feat: implement Memory Card spec — hierarchy, dual-format body, Logseq interop
Evolve rNotes schema and API to support the Memory Card data model:
- Add parentId self-relation for note hierarchy (NoteTree)
- Dual-format body storage (bodyJson + bodyMarkdown) with HTML fallback
- New cardType field (note/link/file/task/person/idea/reference)
- Structured properties (Logseq-compatible key-value JSON)
- Soft-delete via archivedAt (FUN model: Forget, not Delete)
- File + CardAttachment models for structured attachments
- Tag model evolved with spaceId for scoped tags
- Content conversion library (HTML/JSON/Markdown bidirectional)
- Logseq import/export (ZIP with pages/ + assets/)
- NoteEditor emits TipTap JSON as canonical format
- NoteCard shows cardType badges, child count, properties
- Canvas sync enriched with Memory Card fields
- Backfill script for existing notes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 22:33:48 +00:00
Jeff Emmett adc68d06e1 Add .dockerignore for optimized Docker builds
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 17:59:43 -07:00
Jeff Emmett a6293dec40 Add rData analytics tracking and ecosystem footer link
- Inject rdata.online/collect.js tracking script in layout
- Add rData link to ecosystem footer

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 18:57:08 +00:00
Jeff Emmett e3be857703 feat: add live transcription demo to landing page and demo page
Interactive Web Speech API transcription widget on the homepage
("Try Live Transcription") and demo page. Zero-download, no auth
needed — works instantly in Chrome/Edge/Safari. Updated feature
cards to highlight live transcribe, audio/video, and offline privacy.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 10:05:48 +00:00
Jeff Emmett fd51c06304 feat: standardize ecosystem footer with all 16 r-suite apps
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 09:43:01 +00:00
Jeff Emmett fbbe8d38d1 Replace Whisper-tiny offline fallback with Parakeet.js (NVIDIA 0.6B v2)
Swap @xenova/transformers (whisper-tiny, ~45MB) for parakeet.js
(Parakeet TDT 0.6B v2, ~634MB) loaded from CDN at runtime. Much higher
transcription accuracy at the cost of larger initial model download.
Uses indirect dynamic import to avoid Next.js/webpack bundling issues.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 23:48:48 +01:00
Jeff Emmett d1bdb126af chore: backlog TASK-14 SpaceRole bridge (Done)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 15:35:12 -07:00
Jeff Emmett 5e21e0fa5c feat: add SpaceRole bridge for cross-module membership sync
Maps notebook collaborator roles (OWNER/EDITOR/VIEWER) to SpaceRoles
(ADMIN/PARTICIPANT/VIEWER). Falls back to EncryptID server for
cross-space membership when notebook is linked via canvasSlug.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 14:32:17 -07:00
Jeff Emmett 4e8d12f593 docs: add MODULE_SPEC.md with permission model and capabilities
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 12:30:14 -07:00
Jeff Emmett b2b4c11960 chore: add rInbox to r* Ecosystem footer
Add rinbox.online link to the ecosystem footer navigation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 18:31:21 -07:00
Jeff Emmett 0e847a48a8 chore: add backlog task files for TASK-11, TASK-12, TASK-13
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 14:17:00 -07:00
Jeff Emmett 441403fd14 feat: add offline Whisper transcription fallback via Transformers.js
When both WebSocket streaming and server batch API are unavailable,
falls back to in-browser Whisper (Xenova/whisper-tiny, ~45MB, cached).
Shows download progress bar and transcription status during processing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 13:38:15 -07:00