Commit Graph

15 Commits

Author SHA1 Message Date
Jeff Emmett e450381e2f Add emoji favicon (📝) for browser tab
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 19:13:37 -07:00
Jeff Emmett c701e3245e chore: update TASK-6 web clipper to Done
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 15:17:38 -07:00
Jeff Emmett 32475bdf34 feat: add rNotes Web Clipper browser extension (TASK-6)
Chrome extension (Manifest V3) forked from PKMN Quick Capture:
- Clip pages, text selections, links, and images to rNotes
- Notebook selection dropdown with remembered last-used
- Tags input for organizing clips
- Context menu integration (right-click to save)
- EncryptID auth via token paste flow
- Image upload through /api/uploads then IMAGE note creation
- Amber/orange theme matching rNotes design

Also updates signin page to show extension token when
?extension=true query param is present.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 15:17:19 -07:00
Jeff Emmett 49afc5db6e chore: update TASK-9 canvas sync to Done
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 15:04:18 -07:00
Jeff Emmett d64d8a0d57 feat: add internal API key for rSpace service-to-service auth
pushShapesToCanvas now sends X-Internal-Key header from
RSPACE_INTERNAL_KEY env var for authenticated canvas writes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 15:02:20 -07:00
Jeff Emmett 5575be9290 chore: update backlog task statuses
- TASK-7 (auth): already done
- TASK-9 (canvas sync): in progress, blocked on rSpace shapes API
- TASK-10 (mobile responsive): done

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 14:47:21 -07:00
Jeff Emmett 57c703d253 fix: correct SDK path in Dockerfile for file: dependency resolution
package.json uses file:../encryptid-sdk which resolves relative to
/app, so SDK must be at /encryptid-sdk not /app/encryptid-sdk

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 14:42:19 -07:00
Jeff Emmett cf27a54caa feat: mobile-responsive UI + canvas sync callback
- Responsive navigation: compact buttons with icons on mobile, hidden
  search bar (moved to dedicated row below nav on mobile)
- Responsive typography: hero text scales from 3xl to 5xl
- Responsive grids: sm:grid-cols-2 breakpoint for cards
- Canvas split view: full-screen overlay on mobile with close button
- Breadcrumbs collapse on mobile, truncate long titles
- Buttons show icon-only on small screens (add, delete, pin)
- Wire up onShapeUpdate callback in notebook detail page for
  bidirectional canvas sync (rSpace → rnotes via /api/sync)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 14:39:01 -07:00
Jeff Emmett 2351339241 feat: integrate EncryptID SDK for passkey authentication
Wire up EncryptID SDK for user authentication with WebAuthn passkeys.
All write API routes (POST/PUT/DELETE) now require auth, while reads
remain public. First user auto-claims orphaned notebooks/notes.

New files:
- src/lib/auth.ts: getAuthUser, requireAuth, getNotebookRole helpers
- src/lib/authFetch.ts: client-side fetch wrapper with JWT token
- src/components/AuthProvider.tsx: EncryptIDProvider wrapper
- src/components/UserMenu.tsx: sign in/out UI for nav bar
- src/app/auth/signin/page.tsx: passkey login/register page

Protected routes: notebooks CRUD, notes CRUD, canvas create, uploads.
Ownership checks: notebook collaborator roles, note author verification.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 14:20:00 -07:00
Jeff Emmett c6a8d1f1f2 chore: initialize backlog with completed tasks and future work
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 13:39:55 -07:00
Jeff Emmett f5bec85336 feat: upgrade to TipTap WYSIWYG rich text editor
Replace plain Markdown textarea with TipTap editor featuring:
- Toolbar with bold, italic, strike, code, headings, lists, tasks,
  blockquotes, code blocks, links, images, undo/redo
- Keyboard shortcuts (Ctrl+B, Ctrl+I, etc.)
- Task list with checkboxes
- Inline image embedding
- Code type notes still use plain textarea for monospace editing
- Note detail view now renders HTML content from TipTap

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 13:36:21 -07:00
Jeff Emmett a065388bbf feat: add file/image upload support with drag-and-drop
- Upload API at /api/uploads with 50MB limit, MIME type validation, and
  path traversal protection
- Serve uploaded files at /api/uploads/[filename] with immutable caching
- FileUpload component with drag-and-drop, progress, and preview
- IMAGE notes show uploaded image preview in detail view
- FILE notes show download button in detail view
- Docker volume for persistent upload storage

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 13:33:49 -07:00
Jeff Emmett f7fa7bc7a1 feat: upgrade search to PostgreSQL full-text with GIN index
Replace Prisma contains-based search with raw SQL using ts_vector/ts_query
for ranked results and headline snippets with <mark> highlighting. Falls
back to ILIKE for partial matches. GIN index applied to production DB.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 13:30:30 -07:00
Jeff Emmett 118710999b Add full application: schema, API routes, components, pages
- Prisma schema: User, Notebook, Note (6 types), Tag, SharedAccess
- API: CRUD for notebooks/notes, full-text search, canvas sync
- Components: CanvasEmbed, NoteEditor, NoteCard, NotebookCard, SearchBar, TagBadge
- Pages: landing, notebooks list/new/detail/canvas, notes new/detail
- Canvas integration: bidirectional sync with rSpace (folk-notebook, folk-note shapes)
- Amber/orange theme consistent across all pages

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 13:00:44 -07:00
Jeff Emmett 445a282ef1 Initial scaffold: Next.js 14 + Prisma + Docker
Project structure matching rTrips-online pattern:
- Multi-stage Dockerfile with nextjs user
- Phase 3 hardened docker-compose (cap_drop ALL, read_only)
- Traefik labels for rnotes.online routing
- PostgreSQL 16-alpine on internal network

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