Skip to content

Releases: bjoernch/immich-companion

v0.8.1 — Favorites filter for new-tab background

Choose a tag to compare

@github-actions github-actions released this 11 May 05:46

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: true on /search/random and /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.read scope; 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.local survives the in-place update from every store.
  • The new newtabFavoritesOnly default is false, 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.js changed; 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.zip below; 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

Choose a tag to compare

@github-actions github-actions released this 05 May 18:28

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.local survives the in-place update from every store.
  • The redundant v0.7.0 onInstalled migration that wrote featureNewtab: true for 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.zip below; 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

Choose a tag to compare

@github-actions github-actions released this 04 May 06:40

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 to about: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 Referer and 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: unset carry-over.
  • New SECURITY.md documenting 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.md on every push to main via 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.zip below; follow SAFARI.md for the Xcode build steps.

Or download the matching Chrome / Firefox zip below and load it manually (chrome://extensionsLoad unpacked / about:debuggingLoad Temporary Add-on…).

Full Changelog: v0.6.1...v0.7.0

v0.6.1 — Web Store fixes + new features

Choose a tag to compare

@github-actions github-actions released this 29 Apr 11:19

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

  • scripting permission removed. The codebase never called chrome.scripting.* — we use chrome.tabs.sendMessage against 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 · Videos pills 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 recentCount badge 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 / Braveimmich-companion-chrome-0.6.1.zip, unzip, then chrome://extensionsLoad unpacked.
  • Firefoximmich-companion-firefox-0.6.1.zip as a Temporary Add-on via about:debugging.

Full Changelog: v0.6.0...v0.6.1

v0.6.0 — Video preview + popup UI refresh

Choose a tag to compare

@github-actions github-actions released this 27 Apr 07:16

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, then chrome://extensionsLoad unpacked.
  • Firefox — download immich-companion-firefox-0.6.0.zip and load it as a Temporary Add-on via about:debugging. AMO release follows separately.

Full Changelog: v0.5.1...v0.6.0

v0.5.1 — Resubmission build (Firefox AMO version bump)

Choose a tag to compare

@github-actions github-actions released this 26 Apr 15:00

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:debuggingThis FirefoxLoad Temporary Add-on → pick the zip.

v0.5.0 — Phone-gallery timeline + Firefox support

Choose a tag to compare

@github-actions github-actions released this 26 Apr 14:53

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 thumbnail instead of preview) — 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/random returns 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.zip build attached. Build script rewrites background.service_workerbackground.scripts so Firefox 121+ accepts the bundle. Manifest declares data_collection_permissions: ["none"] for AMO. All innerHTML assignments 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 use var(--bg).
  • Gallery layout: leftover column-count: 2 on .popup .results was 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:debuggingThis FirefoxLoad Temporary Add-on → pick the zip.

v0.4.0 — Popup polish + clipboard image copy

Choose a tag to compare

@github-actions github-actions released this 26 Apr 08:10

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:

  1. Download immich-companion-0.4.0.zip below and unzip.
  2. chrome://extensions → enable Developer mode → Load unpacked → pick the unzipped folder.
  3. The welcome page opens automatically — paste your Immich server URL and API key.

v0.3.0 — Chrome Web Store-ready

Choose a tag to compare

@github-actions github-actions released this 25 Apr 20:22

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:

  1. Download the zip below and unzip.
  2. chrome://extensions → enable Developer mode → Load unpacked → pick the unzipped folder.
  3. Paste your Immich server URL and API key on the welcome page that opens.