Releases: bjoernch/immich-companion
Release list
v0.8.1 — Favorites filter for new-tab background
Highlights
Favorites filter for the new-tab background (closes #10)
Settings → New Tab → Source for new tab photos gains an "Only show favorites" toggle. When on, the new-tab photo, the precache top-up, and the "On this day" memory strip all restrict to assets you've marked as favorites in Immich.
- Combines with the album selector — if you also pick an album, the result is "favorites within that album," not the entire album. The settings page renders a small clarifier under the toggle when both are set.
- Server-side filter via
isFavorite: trueon/search/randomand/search/metadata— much cheaper than fetching everything and filtering client-side, and supported across Immich versions (older servers simply ignore the field). - Uses the existing
asset.readscope; no API key change required for the typical setup. If the key happens to lack the scope, the settings page surfaces the exact error inline. - If you have no favorites yet (or the selected album contains none), the toggle area explains what to do instead of silently rendering nothing.
- Toggling either album or favorites-only now wipes the SW precache queue, so the next new tab immediately reflects the new criteria instead of cycling through 1–3 stale entries.
Pagination always renders a fixed 6-page window
The popup's pagination bar used to grow as you paged forward — 3 numbers on page 1, 4 on page 2, 5 from page 3 onward — which looked broken between transitions. It now always renders 6 page numbers, anchored to the start when you're near page 1 and to the end when you're on the last known page. The window only shows fewer numbers when the result set genuinely has fewer than 6 pages.
Toolbar icon at 16 px restored
The three-card stack used at 48 / 128 px doesn't survive the supersample-then-resize to 16 px: the rotated semi-transparent back/middle cards downsampled into the gradient and the photo silhouette disappeared, leaving the toolbar icon looking like a plain purple chip. The 16 px icon now uses a dedicated render — single white card scaled to ~72 % × 56 % of the canvas, slight tilt, the same sun + mountains landscape inside — so it reads as a photo at toolbar resolution.
Closed issues
- #10 — Allow Favorites to be used as background for new tab. Closed by the new "Only show favorites" toggle in Settings → New Tab.
Compatibility
- Existing settings persist across the update — server URL, API key, default album, theme, all feature toggles, the saved-uploads list.
chrome.storage.localsurvives the in-place update from every store. - The new
newtabFavoritesOnlydefault isfalse, so the new tab keeps behaving exactly as before for everyone who doesn't flip the toggle. - Verified untouched in this release: the save-to-Immich flow, content script, popup search / video preview / filter pills / Maps / update banner / bug-report consent flow, Safari workflow, manifest permissions. Only the pagination renderer in
popup.jschanged; everything else around it is byte-equal to v0.8.0.
Install
- Chrome Web Store — auto-updates within ~1–2 days. Also covers Edge, Brave, Vivaldi, Arc, Opera and other Chromium browsers.
- Firefox Add-ons — auto-updates within ~1 day.
- Safari (macOS, experimental) —
immich-companion-safari-0.8.1.zipbelow; follow SAFARI.md for the Xcode build steps.
Full Changelog: v0.8.0...v0.8.1
v0.8.0 — One-click API key, instant new tab, location state
Highlights
One-click API key creation
The welcome page (step 2) and Settings → Connection both gained a Generate key from my session button that mints a scoped API key against your Immich without asking for a password. Works for OAuth, SSO, and password-based Immich logins — the extension piggybacks on the session cookie your browser already has from when you signed into Immich. The cookie value is never read (it's httpOnly); only the resulting API key is stored.
Why this is worth knowing about:
- OAuth-only users can finally onboard without copy-paste. Click Generate key from my session with an Immich tab signed in, the extension does the rest.
- Same path doubles as a "rotate the key" button in Settings → Connection — useful if you suspect leakage, after a server reset, or when the recommended-scopes list grows.
- The key created has exactly the eight scopes the extension actually uses (
asset.upload,asset.read,asset.download,asset.update,asset.view,album.read,albumAsset.create,sharedLink.create). Frozen at module import time — no path mints a "full access" key by accident.
SECURITY.md has a new section breaking the security guarantees down per surface.
New tab paints instantly (closes #8)
Every new-tab open now paints from a small pre-fetched cache (Cache API for the image bytes, chrome.storage.local for a 3-entry queue) and immediately fires a message to the background service worker to refill the cache for the next open. Two parts to the speedup:
- The cache itself. Cold start is the same speed as before — but every new tab after that opens with the photo already there.
- First-paint snap. The 600 ms opacity fade-in is skipped on first paint (was making cached opens still feel slow). Auto-rotate cycles still get the smooth fade because there it actually transitions between two visible photos.
Storage hygiene:
- Worst case: 3 × ~500 KB previews ≈ 1.5 MB on disk.
- 24-hour staleness window — entries older than that get evicted on the next open.
- FIFO eviction past the 3-entry cap.
- Cache top-up runs in the background service worker, not the new-tab page, so it survives the page unloading the moment you type a URL or click a result. (This was the bug behind "the cache feels slow" — the page was dying mid-fetch and the queue stayed empty.)
State / region in the location overlay (closes #9)
The new-tab corner used to show "Boulder, United States". It now includes the state when Immich has it from EXIF GPS reverse-geocoding: "Boulder, Colorado, United States". Photos without a state value fall through cleanly — the empty field is filtered out.
"Replace new tab" defaults back to ON
The v0.7.0 default-off ("you have to opt in to the photo new tab") turned out to be more confusing than helpful — users were installing the extension and then asking why their new tab wasn't being replaced. New installs again default to on; existing users keep whatever they explicitly chose (the storage value overrides the default).
Closed issues
- #8 — Cache images used as new-tab background. Closed by the cache flow above.
- #9 — Add State to location data when viewing new tab image. Closed by the location-overlay change.
- #4 — Don't want the extension to control my tabs. Already closed; the README's Customising the new tab (or getting out of it) section documents the platform constraint and the in-extension workarounds.
Compatibility
- Existing settings persist across the update — server URL, API key, default album, theme, all feature toggles, the saved-uploads list.
chrome.storage.localsurvives the in-place update from every store. - The redundant v0.7.0 onInstalled migration that wrote
featureNewtab: truefor upgraders is removed; the new default does the same job for everyone (storage values still override). - Verified untouched in this release: the save-to-immich flow, content script, popup search / video preview / filter pills / Maps / update banner / bug-report consent flow, Safari workflow, manifest permissions. The Chrome and Firefox zips are byte-equal to v0.7.0 in those areas.
Install
- Chrome Web Store — auto-updates within ~1–2 days. Also covers Edge, Brave, Vivaldi, Arc, Opera and other Chromium browsers.
- Firefox Add-ons — auto-updates within ~1 day.
- Safari (macOS, experimental) —
immich-companion-safari-0.8.0.zipbelow; follow SAFARI.md for the Xcode build steps.
Full Changelog: v0.7.0...v0.8.0
v0.7.0 — Firefox download fix + archive-on-save
Highlights
Firefox: download finally works
The popup's Download original button used to silently fail on Firefox because the popup loses focus mid-fetch and the synchronous <a download>.click() fires into a popup that's already tearing down. The download flow is now driven from the background script: popup → message → background fetches with x-api-key, wraps the bytes in a blob URL, hands that to chrome.downloads.download(). Background scripts have no focus to lose, so the download manager picks it up reliably.
The downloads permission is added on the Firefox build only (Chrome's popup-side path already worked, so Chrome users won't see a re-permission prompt on update).
Archive after save
A new toggle in Settings → Save to Immich → Archive after save. When on, every successfully saved item is also marked archived in Immich — it disappears from the main timeline, stays in your default album (if you set one), and remains searchable. Works on both old (isArchived: true) and modern (visibility: "archive") Immich; the call sends both fields.
Recommended API-key scopes updated
The welcome page and Settings → Connection now list two more scopes in the click-to-copy "Minimal" set:
asset.download— required by the popup's Download original action on modern Immich.asset.update— required by the new Archive after save toggle.
Both rows are optional in the sense that the corresponding feature degrades gracefully if you don't grant them, but if you ever hit a 403 on download or archive, regenerating the key with these ticked is the fix. Toast messages on archive-failure now name the missing scope explicitly instead of silently swallowing the error.
"Replace new tab page" defaults to off for fresh installs
Multiple users complained that they didn't realise the extension would replace their new tab. Fresh installs now opt out by default; the welcome-page toggle is the explicit opt-in. Existing users keep their current setting via an upgrade migration that writes featureNewtab=true into storage if it was never explicitly stored — so the new default doesn't accidentally turn off the feature for anyone who was happy with it.
The Settings copy now spells out the browser limitation: "Once an extension declares a new-tab override in its manifest, the browser routes every new tab through it — there is no way for the extension to release the new tab back to the browser's default at runtime. To fully restore the browser's own new tab, remove the extension."
Friendlier error messages
- Connection failures now identify the most likely cause (server down, wrong URL, self-signed cert, http/https mixed-content) instead of leaking the raw
NetworkError when attempting to fetch resource. On Firefox, the message also points toabout:addons → Permissions → "Access your data for all websites"if host_permissions weren't granted. - Save-to-Immich failures distinguish blob-URL-only sites (Instagram-style dynamic image embedding), CORS-blocked CDNs, and ordinary network errors with actionable copy.
- The save flow now tries the source page's content script first (page context with the page's
Refererand cookies), falls back to the SW. Recovers many cases where the background-script fetch is rejected by CDNs that accept the page's request.
Safari (macOS) — experimental
Initial Safari support thanks to @Tekkiech (PR #5). The release workflow now also produces an immich-companion-safari-<version>.zip containing an Xcode project generated from the same Chrome zip — no source duplication, regenerated fresh on every release.
To install: download the Safari zip from the assets below, unzip, open Immich Companion.xcodeproj in Xcode, sign with your free Apple ID, click Run. Full step-by-step in SAFARI.md, including the bundle-ID parent-prefix gotcha and the "Allow Unsigned Extensions" dance.
Caveat: a few flows (right-click Save to Immich, share-link toast, periodic ping) likely don't work yet on Safari because Safari doesn't support background.type: "module". The popup search, options page, and inline content-script toasts do work. SAFARI.md lists exactly which manifest keys Safari rejects.
Smaller things
- "Clear history" in the Saved tab is now visibly a button. It used to render as muted text because of an
all: unsetcarry-over. - New
SECURITY.mddocumenting the disclosure flow, threat model, and where the API key is and isn't read across the codebase. - The public privacy-policy gist auto-syncs from
PRIVACY.mdon every push tomainvia a new GitHub Actions workflow. The gist URL is permanent; published store listings keep pointing at it without manual updates.
Install
- Chrome Web Store — auto-updates within ~1–2 days of approval. Also covers Edge, Brave, Vivaldi, Arc, and Opera.
- Firefox Add-ons — auto-updates within ~1 day of approval.
- Safari (macOS, experimental) — download
immich-companion-safari-0.7.0.zipbelow; follow SAFARI.md for the Xcode build steps.
Or download the matching Chrome / Firefox zip below and load it manually (chrome://extensions → Load unpacked / about:debugging → Load Temporary Add-on…).
Full Changelog: v0.6.1...v0.7.0
v0.6.1 — Web Store fixes + new features
Resubmission release for the Chrome Web Store
This release fixes the two violations cited in the v0.6.0 store review (unused permission + single-purpose), and ships everything that was sitting on the local development branch since v0.6.0.
Web Store rejection fixes
scriptingpermission removed. The codebase never calledchrome.scripting.*— we usechrome.tabs.sendMessageagainst the always-loaded content script instead. The unused permission triggered the Purple Potassium "requesting but not using" violation.- Omnibox keyword removed (the
im+ space shortcut). Combined with the new-tab override it triggered the Red Argon single-purpose violation. Smart search lives in the toolbar popup, which is unaffected. - Minimal-mode search bar removed from the new-tab fallback page. With "Replace new tab" turned off, the page is now a clock-only view (or redirects to a fallback URL of your choice). No "search experience" inside the new-tab override anymore.
New features
Inline video preview
- Play overlay + duration badge on every video card.
- Click play to swap the poster for a
<video>element with controls — auto-pauses + tears down on close. - New diagonal-arrows button pops the player out into a dedicated 960×600 window with native fullscreen support.
- Inline cap: 150 MB. Player-window cap: 500 MB. Above the cap or on fetch failure → graceful Open in Immich fallback.
Filter pills
- A row of
All · Photos · Videospills above the gallery filters the popup view by asset type. Applies to both no-query (recent library) and search-result modes.
"Open in Maps" quick action
- A fourth quick-action button next to Share / Download.
- Choose Google Maps or Apple Maps (macOS only) in Settings → Features. Apple Maps option is disabled on non-macOS — the
maps://URL scheme has no handler elsewhere. - Only the photo's latitude and longitude are sent (in the URL). No image, filename, asset id, server URL, or API key is ever transmitted.
Update banner
- A small "Updated to vX.Y.Z" banner appears once at the top of the popup the next time you open it after the browser auto-updates the extension. Links straight to the matching GitHub release notes. Click the link or the × to dismiss it permanently.
Bug-reporting flow
- The About section's "Found a bug?" card now opens a consent modal that previews exactly which four system fields will be added to a prefilled GitHub issue: extension version, browser, OS, and Immich server version. The API key and server URL are explicitly excluded — by structural guarantee in the URL builder, not just by convention.
Required scopes in Settings
- Settings → Connection now mirrors the welcome page's API-key-scopes card (Minimal / All tabs, click-to-copy on each scope row). Users who skipped onboarding now see the same guidance.
Popup polish
- Tab bar redesigned as a segmented pill control with icons.
- "Recent" tab renamed to "Saved" to match what it actually contains.
- Empty
recentCountbadge no longer renders as a tiny nub when there's nothing saved yet.
Defaults
- Show Immich matches on Google now defaults off for new installs. Existing users keep their setting.
Privacy policy
Updated with new "Maps integration" and "Bug reporting (opt-in, per-click)" sections that enumerate exactly which fields go to Google / Apple / GitHub when you click the corresponding buttons. The required-permissions table no longer lists scripting.
Install
- Chrome / Edge / Brave —
immich-companion-chrome-0.6.1.zip, unzip, thenchrome://extensions→ Load unpacked. - Firefox —
immich-companion-firefox-0.6.1.zipas a Temporary Add-on viaabout:debugging.
Full Changelog: v0.6.0...v0.6.1
v0.6.0 — Video preview + popup UI refresh
Highlights
Video preview
Videos in the search/library results now have a real player, not just a static poster.
- Play overlay + duration badge on every video card.
- Inline mini-player — click play to swap the poster for a
<video>element with controls. Auto-pauses and tears down cleanly when you close it. - Expand to a larger window — a new diagonal-arrow button on the inline player pops out a dedicated 960×600 player window with native fullscreen support.
- The Copy quick-action is dropped for videos (clipboard images don't represent videos meaningfully). Share link and Download original remain.
- Memory caps: 150 MB inline, 500 MB in the dedicated window. Above the cap or on fetch failure you get a graceful Open in Immich fallback.
Hidden behind featureVideoPreview (default on); flip in chrome.storage.local if you want to disable it.
Popup UI refresh
- The top tab bar is now a segmented pill control with icons (search / bookmark / upload-tray) instead of plain underline tabs.
- Recent → Saved for clarity. The empty-state copy follows.
- The recent-count badge no longer renders as an empty nub when there's nothing saved yet.
About section
- New "Found a bug or have an idea?" card in Settings → About. Links directly to the GitHub issue picker so users land on the bug-report / feature-request templates.
Defaults
- Show Immich matches on Google is now off by default for new installs. Existing users keep their current setting.
Install
- Chrome / Edge / Brave — download
immich-companion-chrome-0.6.0.zip, unzip, thenchrome://extensions→ Load unpacked. - Firefox — download
immich-companion-firefox-0.6.0.zipand load it as a Temporary Add-on viaabout:debugging. AMO release follows separately.
Full Changelog: v0.5.1...v0.6.0
v0.5.1 — Resubmission build (Firefox AMO version bump)
Identical to v0.5.0 in code and behaviour. Republished under a new version number because Firefox AMO disallows reusing a version once it has been uploaded and deleted (v0.5.0 was pulled during testing).
If you're upgrading from v0.5.0 there is nothing new to read — see v0.5.0 release notes for the changelog.
Install
Chrome / Edge / Brave: download immich-companion-chrome-0.5.1.zip, unzip, then chrome://extensions → enable Developer mode → Load unpacked → pick the unzipped folder.
Firefox: download immich-companion-firefox-0.5.1.zip, then about:debugging → This Firefox → Load Temporary Add-on → pick the zip.
v0.5.0 — Phone-gallery timeline + Firefox support
Big v0.5.0. Both Chrome and Firefox builds attached.
Highlights
- Timeline gallery view in the popup. Items grouped by month with sticky date headers and a thin year scrubber on the right edge. Square thumbnails (like Apple/Google Photos), 2-column grid, scrolls cleanly.
- Numbered pagination under the gallery — 50 items per page, sliding-window page buttons (current ± 2). Pages get cached in memory once loaded and the next page is silently prefetched, so navigation feels instant after the first hop.
- Smaller thumbnail size for the grid (Immich's
thumbnailinstead ofpreview) — about 4-5× less data per cell, noticeably snappier first paint. - Recent library on open — the popup opens straight to the most recent items in your library, no typing required.
- Photo details on the new tab. Optional row under the date showing camera, lens, ISO, aperture, shutter, focal length, dimensions, and file size — pulled from the asset's EXIF (with a defensive fallback fetch of
GET /api/assets/{id}for the cases where/search/randomreturns a thin record). - Reset all data button in Settings → About — wipes server URL, API key, feature toggles, recent uploads, theme, then reopens the welcome page. Your Immich server is not touched.
- Prominent GitHub button in Settings → About and a compact GitHub icon in the popup footer.
- Firefox support. Separate
immich-companion-firefox-0.5.0.zipbuild attached. Build script rewritesbackground.service_worker→background.scriptsso Firefox 121+ accepts the bundle. Manifest declaresdata_collection_permissions: ["none"]for AMO. AllinnerHTMLassignments removed in favour of DOM APIs so the AMO validator runs clean. - Browser-aware UI text. Welcome and options pages now say "Replace Firefox's new tab" / "about:addons" when running in Firefox, and the Chrome equivalents otherwise.
Bug fixes
- Hover quick-action icons rendered as black squares because the SVG strings were missing
xmlns="http://www.w3.org/2000/svg", so DOMParser put them outside the SVG namespace. Added the namespace to every icon. - Light theme actually works now: sidebar background and the options-page sticky footer were both hardcoded dark, leaking through
prefers-color-scheme: light. Now both usevar(--bg). - Gallery layout: leftover
column-count: 2on.popup .resultswas overriding the new 2-column grid. Removed. - Gallery actually scrolls now — the popup's inner scroll container had no constrained height.
- "Clear history" on the Recent uploads tab actually clears the visible list now.
- The popup footer (Settings + GitHub) is pinned and stays visible no matter how many gallery items are loaded.
Privacy
Unchanged. The extension transmits data only to the Immich server you configure. See PRIVACY.md for the full policy.
Install
Chrome / Edge / Brave: download immich-companion-chrome-0.5.0.zip, unzip, then chrome://extensions → enable Developer mode → Load unpacked → pick the unzipped folder.
Firefox: download immich-companion-firefox-0.5.0.zip, then about:debugging → This Firefox → Load Temporary Add-on → pick the zip.
v0.4.0 — Popup polish + clipboard image copy
Small UI / UX release on top of v0.3.0.
Highlights
- Copy image to clipboard from any popup search result. Default copies the medium-size preview JPEG (fast, always works); a new toggle in Settings → Features → "Copy originals to clipboard" switches it to the full-resolution original.
- Share-link button moved to its own icon (chain glyph) on each result card, distinct from the new clipboard icon.
- Three quick actions per result revealed on hover: copy image, copy share link, download original — each with inline spinner / check / x feedback.
- Stable layout during pagination. Result cards now reserve their final size via aspect-ratio derived from each asset's exif width/height, with a shimmer skeleton while the thumbnail fetches. No more reflow when switching pages.
- Pagination UI under the results — previous / next arrows and numbered page buttons (sliding window of 5) so 250 results don't hide behind a scroll.
- Search returns 250 results instead of 60, matching what the Immich web app shows for the same query.
- "Open in Immich" (the button next to the search input, now a clean external-link icon) finally works. Immich's web /search expects a URL-encoded JSON object (
{\"query\":\"cat\"}), not raw text — applied to the popup button, omnibox handler, and the "View all in Immich →" link in the Google card. - Pinned footer. The Settings button stays visible at all times now; the popup is a 580 px flex column with the active panel scrolling internally.
- Cleaner clipboard glyph replaces the picture-frame icon on the Copy action.
Privacy
Unchanged. The extension transmits data only to the Immich server you configure. See PRIVACY.md for the full policy, including the dedicated note on the Google search-page integration.
Install
As an unpacked extension:
- Download immich-companion-0.4.0.zip below and unzip.
- chrome://extensions → enable Developer mode → Load unpacked → pick the unzipped folder.
- The welcome page opens automatically — paste your Immich server URL and API key.
v0.3.0 — Chrome Web Store-ready
First public-ready build.
Highlights
- Save & share — right-click any image / video to upload it and copy a public Immich share link to the clipboard in one step.
- Inline matches on Google — when you Google something, photos in your library that match the query appear in a card at the top of the results. Search runs entirely between your browser and your Immich; nothing is sent to Google. (details)
- Toolbar popup — three tabs: smart search (CLIP, masonry results), recent uploads with one-click Copy link / Open, and an Upload tab with drag-and-drop file uploads.
- New tab — random photo from your library plus an "On this day" memory strip; per-album source, optional auto-rotate, light/dark theme.
- Onboarding — first-run welcome page walks through API-key creation with a clear list of the minimum required Immich permission scopes.
- Connection status badge on the toolbar icon, keyboard shortcut Ctrl+Shift+L / ⌘+Shift+L for the popup, storage on chrome.storage.local (no Chrome-sync dependency).
Privacy
The extension transmits data only to the Immich server URL you configure. No analytics, no third-party services, no tracking. Full policy in PRIVACY.md, including a dedicated section on the Google search-page integration.
Install
As an unpacked extension:
- Download the zip below and unzip.
- chrome://extensions → enable Developer mode → Load unpacked → pick the unzipped folder.
- Paste your Immich server URL and API key on the welcome page that opens.