Commit Graph

92 Commits

Author SHA1 Message Date
Jeff Emmett 5a1f5a9a6f ci: retrigger pipeline
CI/CD / deploy (push) Failing after 8s Details
2026-04-02 15:11:32 -07:00
Jeff Emmett 45625e4b5f ci: retrigger pipeline
CI/CD / deploy (push) Has been cancelled Details
2026-04-02 15:05:06 -07:00
Jeff Emmett f8f08e6a19 fix(ci): use SSH-based container status check for smoke test
CI/CD / deploy (push) Failing after 15s Details
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 15:06:27 -07:00
Jeff Emmett fdc1387675 ci: use internal registry (bypass Cloudflare upload limit)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 10:46:07 -07:00
Jeff Emmett 3deb400bfa ci: add Gitea Actions CI/CD pipeline
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 10:32:01 -07:00
Jeff Emmett 8bb32a42b9 Fix y-websocket v2 server startup in hardened container
Use node directly instead of npx which fails with
"Permission denied" when cap_drop: ALL is set.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 20:26:45 -07:00
Jeff Emmett a7209f304b Upgrade y-websocket sidecar from v1 to @y/websocket-server (v2)
Replace the inline y-websocket@1 server hack with the official
@y/websocket-server package for proper v2 protocol support.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 20:19:16 -07:00
Jeff Emmett ca5c30c844 Set higher Traefik priority for y-websocket router
Priority 140 ensures collab-ws.rnotes.online routes to the
y-websocket server instead of being caught by the wildcard
HostRegexp at priority 100.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 19:37:30 -07:00
Jeff Emmett f35ed40a63 Fix y-websocket sidecar: use v1 with setupWSConnection
y-websocket v2 removed the server binary. Use v1 which includes
bin/utils.js with setupWSConnection for the WS relay server.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 19:36:26 -07:00
Jeff Emmett b9bf2c8b70 Fix y-websocket sidecar: install package before running server
npx y-websocket doesn't have a binary — need to npm install
then run node_modules/y-websocket/bin/server.cjs directly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 19:34:49 -07:00
Jeff Emmett e7e921665d Add Y.js real-time collaboration to rNotes editor
- Add yjs, y-websocket, @tiptap/extension-collaboration,
  @tiptap/extension-collaboration-caret dependencies
- Create collab-provider.ts: WebsocketProvider wrapper
- Create CollabStatus.tsx: connection/sync state indicator
- NoteEditor.tsx: add collaborative mode with Y.js document,
  awareness cursors, and auto-disable built-in history
- docker-compose.yml: add y-websocket sidecar (rnotes-yws)
  at collab-ws.rnotes.online, add NEXT_PUBLIC_COLLAB_WS_URL

Enable by passing collaborative={true} noteId="..." user={...}
to NoteEditor. Non-collaborative mode unchanged.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 19:22:18 -07:00
Jeff Emmett b55362032d Switch IPFS from standalone kubo to rSpace collab-server endpoints
- Update IPFS_API_URL to ipfs-api.rspace.online (was kubo:5001)
- Update IPFS_GATEWAY_URL to ipfs.rspace.online (was ipfs.jeffemmett.com)
- Enhance image button: file upload via /api/uploads with IPFS encryption
  instead of manual URL prompt, with fallback on failure

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 18:53:27 -07:00
Jeff Emmett f71f9e6303 docs: add TASK-18 for encrypted IPFS file storage integration
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 18:12:07 -07:00
Jeff Emmett 022a99f753 fix: use kubo container name for IPFS API
Renamed from 'ipfs' to 'kubo' to avoid Docker DNS collision with
the collab-server's IPFS service on the same network.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:57:56 -07:00
Jeff Emmett eddfcc7337 fix: skip TypeScript errors during Next.js build
The encryptid-sdk subpath import (@noble/curves/secp256k1) fails type
resolution in the Docker build environment. Code compiles correctly
at runtime — this only affects the build-time type checker.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:53:06 -07:00
Jeff Emmett f475ed0462 feat: integrate encrypted IPFS file storage
- Add src/lib/ipfs.ts: AES-256-GCM encryption + kubo upload/download
- Add /api/ipfs/[cid] proxy route: decrypt + serve with LRU cache
- Upload route: encrypt + pin to IPFS alongside local disk (fallback)
- Prisma: add ipfsCid/ipfsEncKey fields to File model
- FileUpload: prefer IPFS proxy URL when available
- Feature-flagged via IPFS_ENABLED env var

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:21:53 -07:00
Jeff Emmett 77302e1a6e feat: add InfoPopup with landing page content on first visit
Shows an informational popup with rich landing page content on first
visit, re-openable via a fixed info button (bottom-right corner).
Dismissible via X button, overlay click, or Escape key. Uses
localStorage to track first-visit state.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 04:51:34 +00:00
Jeff Emmett ce05a51960 brand: add (you)r* prefix to landing page title
Reinforces the r-suite "your tools" philosophy across all rApp landing pages.
Also normalizes title separators to em-dash for consistency.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 04:24:03 +00:00
Jeff Emmett 75278ef730 feat: update hero title and move feature shortcuts to banner
Update headline to "Capture Everything, Find Anything, and Share your
Insights" with emphasis on Share. Move the three action buttons (Open
Notebook, Unlock Article, Transcribe) from header into the hero banner,
replacing the old Create Notebook / Quick Note buttons.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 16:45:19 -08:00
Jeff Emmett ede11d8568 feat: standardize header, categories, cross-app spaces
- AppSwitcher: rTube/rSwag → Creating, rSocials → Sharing, rData → Observing
- EcosystemFooter: updated link order to match new categories
- UserMenu: 🔑 Sign In button, 🔐 lock when logged in
- SpaceSwitcher: reads EncryptID token, sends Bearer header
- /api/spaces proxy: forwards to rspace.online (canonical spaces)
- /api/me: verifies EncryptID token for auth status
- Header.tsx: standardized bg-slate-900/85 across all apps

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 14:16:56 -08:00
Jeff Emmett cce178671b Add feature shortcuts to header, remove AI branding, reorganize app categories
- Add Open Notebook, Unlock Article, and Transcribe buttons to header
- Move search bar to center of header across all pages
- Rename "AI Notebook" to "Open Notebook" throughout
- Support ?type= query param on /notes/new for deep-linking
- Reorganize AppSwitcher categories (Creating, Sharing, Observing)
- Move rTube and rSwag to Creating category
- Update EcosystemFooter link order to match new categories
- Update header bg to bg-slate-900/85
- Add key emojis to UserMenu sign-in states

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 13:36:28 -08:00
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