- Server sends silent push notifications every 60s (configurable)
- Only requests from rooms with active participants
- Cleans up stale push subscriptions automatically
- Interval configurable via LOCATION_REQUEST_INTERVAL env var
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Background Sync API support for location sync when coming back online
- Add silent push notifications for requesting location updates
- Add useServiceWorkerMessages hook for handling SW messages
- Connect service worker to location sharing for background updates
This enables:
- Silent location requests via push without showing notifications
- Automatic location sync when device comes back online
- Service worker communication for background location updates
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add 39c3 to all valid event lists
- Change default event ID from 38c3 to 39c3
- Update examples and placeholders throughout codebase
- Maintain backwards compatibility with 38c3 and older events
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add WaypointModal component with delete and navigate actions
- Navigate button opens Google Maps directions to waypoint
- Delete button removes waypoint with confirmation
- Sync server now preserves offline users' last locations
- Users marked as offline instead of removed when disconnecting
- Stale participant cleanup still runs after 1 hour threshold
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remember location sharing preference per room
- Auto-start sharing when returning to a room
- Restore last known location immediately on page load (if < 1 hour old)
- Location updates are saved to localStorage for faster reload
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Move room page from /room/[slug] to /[slug]
- Update all navigation links to use /<slug> format
- Update share URL generation
- Update middleware for subdomain handling
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Location fixes:
- Add coordinate validation to reject invalid (0,0) and out-of-bounds locations
- Clean up stale participants after 15 minutes (was 1 hour)
- Remove invalid locations from localStorage on load
- Use CCH venue center instead of (0,0) for indoor positions without GPS
Session persistence:
- Remember user name and emoji across sessions on home page
- Pre-fill profile form with saved user info
Mobile UI improvements:
- Add floating location share button inside the map
- Visible on all screen sizes with responsive text
- Prominent styling: white when inactive, green when sharing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add /api/routing endpoint for route calculation
- Support OSRM for outdoor walking/driving routes
- Support c3nav API for indoor routes at CCC events
- Add RouteOverlay component for map route visualization
- Add NavigationPanel for participant/waypoint navigation UI
- Integrate route state management into Zustand store
- Display route line on outdoor map with distance/time estimates
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The join() was called before connect(), so the join message was never
sent to the server. Now we store the participant and send the join
message in the WebSocket onopen handler.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add sync-server/ with Node.js WebSocket relay server
- Server handles join/leave/location/waypoint messages
- Auto-cleans stale participants (1hr) and empty rooms (24hr)
- Dockerized with Traefik labels for easy deployment
- Update .env.example with NEXT_PUBLIC_SYNC_URL
- Mark task-5 as Done in backlog
Deployed to https://sync.rmaps.online🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add isValidCoordinate() helper to validate lat/lng ranges
- Validate viewport center on map initialization
- Skip participants and waypoints with invalid coordinates
- Add validation to auto-center and fitToParticipants
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add cleanupStaleParticipants() to remove participants not seen in last hour
- Use persistent participant ID per browser/room to prevent ghost duplicates
- Fixes issue where old versions of yourself appeared on map reload
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add c3nav tile proxy API route with session handling
- Add c3nav data API proxy for locations/bounds
- Create IndoorMapView component with MapLibre GL
- Add floor level selector (Level 0-4)
- Tap-to-set-position on indoor map
- Sync indoor positions between participants
- Easter egg: Triple-click Level 0 for "The Underground of the Underground"
- Fix race condition in useRoom when no user data
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Indoor Map now opens c3nav in new tab (iframe blocked by X-Frame-Options)
- Meeting Point modal now has:
- "Use My Location" button that fetches GPS position on demand
- Address search using OpenStreetMap Nominatim API
- Search results dropdown with clickable options
- Manual coordinates entry (hidden by default)
- Selected location preview with coordinates
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix Indoor Map button being covered by participant panel (z-30)
- Implement Set Meeting Point modal with emoji selection
- Add waypoint markers rendering on the map
- Pass waypoints from room through DualMapView to MapView
- Fix TypeScript types for WaypointType
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove Automerge dependencies (WASM incompatible with Next.js)
- Add lightweight WebSocket-based sync layer
- Works in local-only mode until sync server deployed
- State persisted in localStorage for reconnection
Ready for deployment - sync server can be added later.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Collaborative real-time friend-finding navigation for events:
- Next.js 14 with TypeScript and Tailwind CSS
- MapLibre GL for outdoor OpenStreetMap rendering
- c3nav API client for CCC indoor navigation
- Zustand for state management
- Location sharing hook with privacy controls
- Room system with subdomain routing middleware
- Docker + docker-compose with Traefik labels
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>