- Show views, downloads and hearts in the metadata grid (in line with
other metadata items) instead of a separate stats widget
- Report downloads to the API when a Mue photo is downloaded
- Photographer name links to mue.photos/:handle; falls back to
constructing the handle from the credit name for cached backgrounds
- Photo attribution now reads "on Mue" linking to mue.photos, matching
the Unsplash pattern
- Fix hasCoordinates bug where null lat/lng resolved to 0 via Number()
and incorrectly rendered an empty map
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Introduced a crosshair marker feature in the LocationMap component, allowing users to toggle its visibility.
- Updated PhotoInformation component to pass crosshair state to LocationMap.
- Added a checkbox in DisplaySettings for users to enable or disable the crosshair marker.
- Enhanced styling for the crosshair marker in the associated SCSS file.
- Updated various localization files to include translations for the new crosshair marker option.
- Fix field.id → field.key in photoPackHandler so API pack settings
save under the correct keys after install
- Add missing useT() to ItemSettingsModal and remove getTypeTranslationKey
which violated React Rules of Hooks
- Debounce text/password field changes in ItemSettingsModal (500ms) to
avoid flooding API with 5 requests per keystroke
- Fix uninstall.js: capture packId before splice so enabledPacks is
always cleaned up; delete photopack_settings_<id> on uninstall
- Fix getTotalPhotoCount to read api_pack_cache for API-enabled packs
- Fix marketplaceEnabled check to use installed[] instead of photo_packs
- Fix attribution_config forwarding to photoInfo in backgroundLoader
- Spread all optional metadata fields for static pool photos
- Reduce parallel cache refresh requests from 20 to 5
- Reduce SuggestedPacks localStorage cache from 24h to 1h
- Remove debug console.log calls from install.js and photoPackAPI.js
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Increase concurrent fetches from 8 to 20 per cache refresh for
a larger, more varied photo pool
- Deduplicate photos by URL before storing so concurrent random
fetches don't fill the cache with the same image
- On fetch failure, still update timestamps and add pack to
api_packs_ready so checkAndRefreshAPIPacks retries it on the
next cycle instead of leaving it stuck at photos:[] forever
- checkAndRefreshAPIPacks now also picks up packs in api_pack_cache
with 0 photos that were never added to api_packs_ready (covers
packs that failed their initial install-time fetch)
- Raise the low-water refresh threshold from 3 to 5 photos to
match the new queue size
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix 'excludes' -> 'exclude' query param so excluded photos are
actually filtered server-side (was silently ignored by the API)
- Increase prefetch queue from 3 to 5 for both API and photo pack
backgrounds to reduce repeated photos between refreshes
- Cap backgroundExclude list at 50 entries (keeps newest) so the
available pool never shrinks to nothing over time
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Drops the Mapbox API dependency for maps. LocationMap is now a
lazily-loaded component that renders a MapLibre GL canvas using
OpenFreeMap tiles, with interactive: false to preserve the same
static appearance as before.
The /v2/map API proxy remains for older installed mue instances
and will be removed in a follow-up once this ships.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- submit.yml: rewrite with release:[released] trigger, upgrade to BPP v3
(no Puppeteer/Chrome setup needed), chrome-only, environment: production gate
- submit-beta.yml: new workflow, release:[prereleased] trigger, submits to
Chrome trustedTesters channel, environment: beta gate
- both keep workflow_dispatch as manual fallback for re-runs
- hotfix releases automatically trigger submit.yml via the [released] event
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- switch from workflow_dispatch to PR-closed trigger (aligns with main's automation approach)
- fix sed -i '' (macOS syntax) → sed -i (GNU/Linux compatible for Ubuntu runners)
- add stable_version output to strip pre-release suffix before writing to manifests
(Chrome/Firefox/Safari extension manifests reject semver pre-release strings)
- keep token in checkout step for push permissions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- fix version-bump.yml: IS_PRERELEASE was never defined, breaking iterative beta versioning (7.x.x-beta.1 → 7.x.x-beta.2)
- fix hotfix-release.yml: move changelog generation before merge so git log captures commits correctly
- fix dependabot.yml: was empty; now targets dev branch to keep Dependabot PRs in the normal dev→beta→main flow
- fix automerge.yml: remove continue-on-error from lint step so lint failures block Dependabot auto-merge; pin bun-version to 1.3.1
- fix production-release.yml: add automated back-merge of main→beta and main→dev after each production release
- fix manifest/chrome.json and manifest/firefox.json: version was 7.6.0, mismatched package.json 7.6.1
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Replace all querySelector('.reminder-info') calls with EventBus.emit('showReminder')
across 14 files — prevents crashes when the element is not mounted
- Move ReminderInfo from inside the sidebar to the top of the right content column
so it no longer obscures sidebar navigation
- Fix reminder not showing for non-hot-reload settings (Slider hook violation where
useT() was called inside a requestAnimationFrame callback)
- Skip reminder for LocationSearch since it already emits a hot-reload refresh event
- Suppress reminder for settings with hot-reload (no page refresh needed)
- Fix modal content overflowing right edge: replace width:100%!important on
.modalTabContent with flex:1 + min-width:0 + overflow-x:hidden
- Fix ReminderInfo refresh button being too small
- Fix sidebar collapse animation using max-width transition instead of width:0
- Fix PhotoInformation showing 0x0 resolution and Unknown Location before image loads
- Fix Wikipedia disambiguation links for quote authors by returning null from
getAuthorLink (Wikidata links used when available)
- Bail early in useSuggestedPacks when offline mode is enabled
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Added react-router for improved routing and navigation.
- Replaced hash-based navigation with React Router's navigate function.
- Introduced RouterBridge to manage deep linking and legacy navigation.
- Updated components to utilize useNavigate and useLocation hooks.
- Refactored modal handling to integrate with React Router.
- Removed updateHash utility to prevent conflicts with React Router's history management.
- Created routes configuration for application structure and lazy loading.
- Ensured backward compatibility with existing deep link data structure.
- Introduced new SuggestedPacks component to display trending quote and photo packs.
- Implemented useSuggestedPacks hook for fetching and caching suggested packs from the marketplace.
- Updated localization files for multiple languages to include new strings for suggested packs.
- Added explore all button to navigate to the marketplace category page.