Changes:
- Comment out early return when query is empty
- Allow recoSearch to be called with empty/trimmed query
- Backend returns popular cities/regions when query is empty
- Enables showing suggestions immediately on focus (UX improvement)
Backend test confirms it works:
$ curl "http://localhost:8081/api/suggestions?q="
Returns: 6 popular suggestions (Montreal, Quebec City, Toronto, etc.)
$ curl "http://localhost:8081/api/suggestions?q=to"
Returns: Toronto, Seattle, Boston
Now users will see suggestions as they type + popular items on focus
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implement smart prioritization system to reduce map clutter:
- Create priority scoring based on reco score, category, freshness, distance, engagement
- Cluster nearby posts and show best post as full card, others as simple markers
- Simple markers: circular icons with category colors, hover preview, click to expand
- Max 15 full cards displayed, rest shown as compact markers
- Optimize search debounce: 220ms → 150ms for faster suggestions
New files:
- postPriority.js: Scoring and clustering algorithm
Updated:
- markerManager.js: Add createSimpleMarkerForPost() with hover cards
- usePostsEngine.js: Use prioritizePosts() to separate full cards vs simple markers
- SmartSearchBar.jsx: Faster debounce (150ms), increased limit to 12 suggestions
Result: Less visual clutter, better UX with prioritized content
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add isRunningAsPWA() detection (standalone mode, iOS, Android)
- Add localStorage tracking to remember installation state
- Skip prompt if already running as PWA or previously installed
- Increase auto-prompt delay from 5s to 10s for better UX
- Export canInstall() to check installation availability
- Mark as installed when appinstalled event fires
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Update fetchSmartFeed() to call backend /api/smart-feed
- Update fetchUnifiedSearch() to call backend /api/unified-search
- Replace fetchPosts() with fetchSmartFeed() in usePostsEngine
- Add /api/unified-search as primary search endpoint
- Search now queries posts, profiles, and places together
- Map now shows personalized and trending posts
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Problem: Map position drifted north/higher on each reload because
bounds.getCenter() returns a visually offset center when pitch is applied
Solution:
- Use map.getCenter() for accurate geographic center (not affected by pitch)
- Save and restore bearing (rotation) along with pitch
- Store: lat, lon, zoom, pitch, bearing
Before: bounds.getCenter() → visual center (offset by 3D tilt)
After: map.getCenter() → true geographic center
This ensures the map returns to the exact same position after reload,
regardless of the 3D tilt angle.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Problem: Map pitch was always forced to 45° instead of being restored,
causing the view to appear shifted higher after each reload
- Save current pitch value to localStorage on moveend
- Restore pitch from localStorage on map initialization
- Remove forced pitch=45 on map load event
- Default to 45° only if no saved pitch exists
This prevents the map from drifting north/higher with each page reload
while maintaining the 3D tilt effect.
Auth: Session persistence already implemented via localStorage tokens
- Tokens are saved in localStorage and restored on mount
- Auto-refresh runs every 30s to keep session alive
- If session issues persist, check browser console for specific errors
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Use deterministic hash-based offset calculation for stable marker positions
- Markers now stay in same position across zoom/pan operations
- Check geographic distance instead of pixel distance for clustering
- Reduce image preview from 60px to 40px for compact modal
- Reduce button font size to save space
Fixes: Markers no longer jump around when zooming
Fixes: Modal stays compact with image preview
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add image upload functionality with file picker and URL input
- Display custom uploaded images or category-specific FontAwesome icons
- Add icon styles for all themes (dark, blue, light)
- Map unique icons to each category and subcategory (News, Friends, Events, Market)
- Update card templates to show 72x72px icon/image on the left
- Add image preview and validation (max 5MB, images only)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>