Commit Graph

689 Commits

Author SHA1 Message Date
Jeff Emmett 08bea8490d fix: TypeScript errors in sync version state
- Fixed variable scope issue with totalMerged counter
- Added syncVersion to return type declaration

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 18:58:24 +01:00
Jeff Emmett edb386ec3c fix: force React re-render after server sync merges data
Added syncVersion state that increments when server data is merged,
ensuring the UI updates to show the loaded board content.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 18:50:14 +01:00
Jeff Emmett 5eac403211 fix: align vitest version with coverage-v8 to fix CI
Updated vitest from 3.2.4 to 4.0.16 to match @vitest/coverage-v8 4.0.16

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 18:41:41 +01:00
Jeff Emmett 5b2de78677 fix: CORS and IndexedDB sync for canvas.jeffemmett.com
- Add canvas.jeffemmett.com to CORS allowed origins
- Fix IndexedDB sync to prefer server data when local has no shapes
- Handle case where local cache has stale/minimal data but server has full board
- Add console logging for sync debugging

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 18:32:50 +01:00
Jeff Emmett 854ce9aa50 fix: enable canvas panning when VideoChat shape not selected
Add conditional pointer-events to iframe - only enabled when shape is
selected, allowing normal canvas pan/zoom when not interacting with video.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 20:45:30 +01:00
Jeff Emmett 30daf2a8cb feat: Replace Daily.co with Jeffsi Meet for video calls
- Remove Daily.co API dependencies
- Use self-hosted Jeffsi Meet (Jitsi fork) at meet.jeffemmett.com
- Simplify room creation (Jitsi creates rooms on-the-fly)
- Add Copy Link and Pop Out buttons for sharing
- Configure Jitsi embed with custom branding settings
- No recurring per-minute costs with self-hosted solution

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 19:45:50 +01:00
Jeff Emmett ed61902fab feat: add Last Visited canvases and per-board Activity Logger
- Add "Last Visited" section to Dashboard showing recent board visits
- Add per-board activity logging that tracks shape creates/deletes/updates
- Activity panel with collapsible sidebar, grouped by date
- Debounced update logging to skip tiny movements
- Full dark mode support for both features

New files:
- src/lib/visitedBoards.ts - Visit tracking service
- src/lib/activityLogger.ts - Activity logging service
- src/components/ActivityPanel.tsx - Activity panel UI
- src/css/activity-panel.css - Activity panel styles

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 00:36:43 +01:00
Jeff Emmett 4974c0e303 fix: use internal redirect for /board/:slug on staging
Changed RedirectBoardSlug to use React Router's Navigate instead of
window.location.href to a non-existent domain. Now /board/:slug
redirects to /:slug/ within the same domain.

Production (main branch) keeps /board/:slug unchanged.
Staging (dev branch) supports both /board/:slug and /:slug patterns.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 19:06:54 +01:00
Jeff Emmett 53d3620cff fix: add index signature to TLStoreSnapshot for Automerge compatibility
TypeScript requires index signature for Automerge.Doc generic constraint.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 13:53:31 +01:00
Jeff Emmett 1dc8f4f1b8 fix: correct TypeScript typing for Automerge.from() optimization
Use double type assertion for TLStoreSnapshot → Record<string, unknown>
to satisfy Automerge.from() type constraints.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 11:56:49 +01:00
Jeff Emmett 06f41e8fec style: change enCryptID security border from green to steel blue/grey
Updated the security visual indicator to use slate/steel colors (#64748b)
instead of green (#22c55e) for a more professional look.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 09:09:36 +01:00
Jeff Emmett 313033d83e fix: correct dev worker name to match frontend URL
The frontend expects jeffemmett-canvas-automerge-dev but wrangler.dev.toml
had jeffemmett-canvas-dev, causing 404 errors for wallet API endpoints.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 08:43:15 +01:00
Jeff Emmett 00aa0828c4 fix: guard Drawfast tool with feature flag in overrides
Drawfast was always included in overrides.tsx but is conditional in
Board.tsx (dev-only). This caused "l is not a function" errors when
users tried to select tools in production since the Drawfast tool
wasn't registered.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 08:32:46 +01:00
Jeff Emmett 486e75d02a fix: Simplify Web3Provider to only use injected connector
- Remove WalletConnect connector to fix TypeScript build error
- Only injected wallets (MetaMask, etc.) are supported for now
- WalletConnect can be re-added when valid project ID is configured

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 03:29:55 +01:00
Jeff Emmett 28ab62f645 fix: guard WorkflowBlock/Calendar tools with feature flags, disable WalletConnect QR modal
- Add ENABLE_WORKFLOW and ENABLE_CALENDAR flags to overrides.tsx
- Conditionally include tool menu entries only in dev mode
- Disable WalletConnect QR modal to fix web3modal initialization errors
- Users can still connect via injected wallets (MetaMask, etc.)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 21:53:08 +01:00
Jeff Emmett 5db25f3ac1 fix: Redirect /board/:slug URLs to clean /:slug/ URLs
- Old links like jeffemmett.com/board/ccc now redirect to /ccc/
- Both /board/:slug and /board/:slug/ redirect to clean URLs
- Boards served directly at /:slug/ without /board prefix

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 21:45:21 +01:00
Jeff Emmett 7debeb598f fix: Only enable WalletConnect when valid project ID is configured
- Skip WalletConnect connector if VITE_WALLETCONNECT_PROJECT_ID is not set
- MetaMask and other injected wallets still work without WalletConnect
- Add helpful console warning in dev mode when WalletConnect is disabled
- Prevents 401 errors from WalletConnect API with placeholder project ID

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 21:40:50 +01:00
Jeff Emmett 156c402169 feat: Add Web3 Wallet to enCryptID menu with security visual indicator
- Add WalletLinkPanel integration to CryptIDDropdown
- Add security header with lock icon and encryption tooltip
- Add green border around menu to indicate secure zone
- Move Web3 Wallet to top of integrations list
- Wallet modal opens from "Manage Wallets" button

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 21:38:44 +01:00
Jeff Emmett 73d186e8e8 feat: rename CryptID to enCryptID, improve Settings Menu styling
- Renamed all user-facing "CryptID" references to "enCryptID"
- Updated emails, error messages, UI text, and onboarding tour
- Enhanced BoardSettingsDropdown with section headers, icons, and
  alternating background colors for better visual hierarchy

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 21:29:48 +01:00
Jeff Emmett b8f179c9c1 fix: serve board directly at /:slug without redirect
Changed catch-all route to render Board component directly instead
of redirecting to /board/:slug/. Now canvas.jeffemmett.com/ccc shows
the board without changing the URL.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 20:00:56 +01:00
Jeff Emmett 80f457f615 feat: add Web3 wallet linking to CryptID accounts
- Add WalletLinkPanel component for connecting and linking wallets
- Add useWallet hooks (useWalletConnection, useWalletLink, useLinkedWallets)
- Add wallet API endpoints in worker (link, list, update, unlink, verify)
- Add proper signature verification with @noble/hashes and @noble/secp256k1
- Add D1 migration for linked_wallets table
- Integrate wallet section into Settings > Integrations tab
- Support for MetaMask, WalletConnect, Coinbase Wallet
- Multi-chain support: Ethereum, Optimism, Arbitrum, Base, Polygon

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 19:29:42 +01:00
Jeff Emmett 9410961486 chore: add Web3/wallet dependencies
Added wagmi, viem, and related packages for wallet integration:
- wagmi: React hooks for Ethereum
- viem: Low-level Ethereum interactions
- @tanstack/react-query: Data fetching for wallet state
- @web3modal/wagmi: WalletConnect modal
- @noble/hashes, @noble/secp256k1: Cryptographic utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 18:25:40 +01:00
Jeff Emmett f15b137686 chore: add missing Web3Provider to git
The providers directory was untracked, causing build failures on the server.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 18:18:25 +01:00
Jeff Emmett 95d7f9631c feat: add catch-all route for direct board slug URLs
Added routes to handle direct slug URLs like canvas.jeffemmett.com/ccc
These now redirect to /board/ccc/ to maintain backward compatibility
with old links from jeffemmett.com/board/ccc

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 18:14:05 +01:00
Jeff Emmett 33fa5c9395 Update task task-007 2026-01-02 18:05:31 +01:00
Jeff Emmett 1d9e58651e Update task task-007 2026-01-02 17:14:51 +01:00
Jeff Emmett 15f19a0450 Update task task-007 2026-01-02 17:08:54 +01:00
Jeff Emmett cfbe900f06 Create task task-062 2026-01-02 17:08:00 +01:00
Jeff Emmett 75384d8612 Create task task-061 2026-01-02 17:08:00 +01:00
Jeff Emmett 8a4cc5dfae Create task task-060 2026-01-02 17:08:00 +01:00
Jeff Emmett 2783def139 backlog: Add document doc-001 2026-01-02 17:07:16 +01:00
Jeff Emmett 7d6d084815 Update task task-007 2026-01-02 16:54:59 +01:00
Jeff Emmett f17d6dea17 feat: enable custom tools in staging, add BlenderGen to context menu
- Changed feature flags to use VITE_WORKER_ENV instead of PROD
- Staging environment now shows experimental tools (Drawfast, Calendar, Workflow)
- Added BlenderGen to context menu "Create Tool" submenu
- Tools now available in both toolbar and right-click menu

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 15:35:44 +01:00
Jeff Emmett a45ad2844d fix: add type assertion for BlenderGen API response
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 14:23:28 +01:00
Jeff Emmett e891f8dd33 fix: video generation API routing and worker URL configuration
- Fix itty-router route patterns: :endpoint(*) -> :endpoint+
  The (*) syntax is invalid; :endpoint+ correctly captures multi-segment paths
- Update getWorkerApiUrl() to use VITE_WORKER_ENV for all environments
- Fix dev/staging worker URLs to use jeffemmett-canvas-automerge-dev
- Update wrangler.toml dev environment to use shared D1 database

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 14:21:10 +01:00
Jeff Emmett 7dd03b6f6f feat: add BlenderGen to toolbar menu
Added Blender 3D tool to the toolbar menu alongside Image and Video generation tools.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 13:05:28 +01:00
Jeff Emmett 0677ad3b5d feat: add BlenderGen shape for 3D Blender rendering
Add custom tldraw shape and tool for generating 3D renders via Blender:
- BlenderGenShapeUtil.tsx: custom shape with preset selector and controls
- BlenderGenTool.ts: toolbar tool for creating Blender render shapes
- Worker routes for /api/blender/render and /api/blender/status/:jobId
- Proxies requests to Netcup-hosted Blender render server

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 07:45:03 +01:00
Jeff Emmett 1b67a2fe7f fix: move Daily.co API key to server-side for security
- Worker now uses DAILY_API_KEY secret instead of client-sent auth header
- Added GET /daily/rooms/:roomName endpoint for room info lookup
- Frontend no longer exposes or sends API key
- All Daily.co API calls now proxied securely through worker

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 19:53:06 +01:00
Jeff Emmett d2101ef1cf fix: prevent onboarding tour tooltip from cutting off at step 4
Increased estimated tooltip height from 200px to 300px so the viewport
clamping function correctly positions the tooltip, keeping the Next
button visible on all steps.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 22:23:59 -05:00
Jeff Emmett 911881054a fix: improve E2E test stability with better canvas wait logic
- Wait for both .tl-container and .tl-canvas before interacting
- Add explicit waitFor in createShape and drawLine helpers
- Increase wait times for sync operations in CI
- Add retries for flaky offline tests
2025-12-26 20:39:37 -05:00
Jeff Emmett 0273133e0a feat: add Drawfast to toolbar (dev only)
Added Drawfast button to toolbar between VideoGen and Map.
Only visible in development mode.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 17:03:44 -05:00
Jeff Emmett bf9c9fad93 feat: enable Drawfast in dev, add Workflow to context menu
- Changed Drawfast from disabled to dev-only (can test in dev mode)
- Added WorkflowBlock to overrides.tsx for context menu support
- Added Workflow to context menu (dev only)

All three features (Drawfast, Calendar, Workflow) now available in dev only.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 16:51:10 -05:00
Jeff Emmett 36e269c55f feat: hide Drawfast and Calendar from context menu in production
Extended feature flags to context menu:
- ENABLE_DRAWFAST = false (disabled everywhere)
- ENABLE_CALENDAR = !IS_PRODUCTION (dev only)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 16:43:58 -05:00
Jeff Emmett 6a20897322 feat: disable Workflow, Calendar in production (dev only)
Added feature flags to conditionally disable experimental features:
- ENABLE_WORKFLOW: Workflow blocks (dev only)
- ENABLE_CALENDAR: Calendar shape/tool (dev only)
- Drawfast was already disabled

These features will only appear in development builds.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 16:38:42 -05:00
Jeff Emmett 57c49096de fix: use WORKER_URL for networking API to fix connections loading
The connectionService was using a relative path '/api/networking' which
caused requests to go to the Pages frontend URL instead of the Worker API.
This resulted in HTML being returned instead of JSON.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 10:49:03 -05:00
Jeff Emmett 101f386f4a feat: switch ImageGen from RunPod to fal.ai, reduce logging, disable Drawfast
- ImageGen now uses fal.ai Flux-Dev model instead of RunPod
  - Faster generation (no cold start delays)
  - More reliable (no timeout issues)
  - Simpler response handling

- Reduced verbose console logging in CloudflareAdapter
  - Removed debug logs for send/receive operations
  - Kept essential error logging

- Disabled Drawfast tool pending debugging (task-059)
  - Commented out imports and registrations in Board.tsx

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 00:33:47 -05:00
Jeff Emmett 4ce5524cfb Create task task-059 2025-12-25 23:37:36 -05:00
Jeff Emmett afc3a4fb7f fix: exclude automerge-repo-react-hooks from automerge chunk to fix React context loading order 2025-12-25 22:00:05 -05:00
Jeff Emmett 7f1315c2a8 refactor: improve unknown shape type handling and filtering
- Move CUSTOM_SHAPE_TYPES to module level for single source of truth
- Filter ALL unknown shape types (not just SharedPiano) to prevent validation errors
- Add detailed error logging for unknown shapes with fix instructions
- Fix MycelialIntelligenceShape comment (was incorrectly marked as deprecated)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 20:35:36 -05:00
Jeff Emmett 0aa74f952e Update task task-058 2025-12-25 20:26:35 -05:00