> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gumnut.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Detailed changelog

> An itemized changelog of user- and developer-facing changes to Gumnut

This page lists notable user- and developer-facing changes to Gumnut, grouped
by month and category. For a high-level overview, see
[Monthly progress](/changelog/overview).

<Update label="June 2026">
  ## Website

  * Launched a new public marketing site at [gumnut.ai](https://gumnut.ai),
    with Home, Platform, Enterprise, About, and Contact pages.

  ## Apps

  * Applied the Gumnut design system to the web app, including a new dark mode.
  * Added a new Gumnut-hosted `/sign-up` route alongside the branded sign-in
    page.
  * Added album management in the web app: create, rename, edit description, and
    delete.
  * Added people management in the web app: rename, merge, and set a featured
    face.
  * Added single- and multi-asset download.
  * Added a move-to-trash action, a delete-face action, and the ability to draw
    a box in the viewer to create a face.
  * Added "set as album cover" and "remove from album" viewer actions, and
    showed which albums an asset belongs to in the info panel.
  * Parallelized uploads with an ETA and an add-to-album step after upload.
  * Made the web app mobile-friendly: a nav drawer, smaller phone thumbnails, a
    responsive info panel, an icon-collapsing multi-select action bar, and
    touch-swipe navigation in the viewer.
  * Paginated asset counts so the timeline scrolls past 200 months.

  ## Video

  * Added video playback to the web asset viewer, with the video filling the
    column like an image and Space toggling play/pause.
  * Rendered video thumbnails in the timeline, viewer, web grid tiles (with a
    duration badge and hover preview), and the MCP app grid.
  * Tone-mapped HDR (HLG/PQ) video thumbnails to SDR.
  * Extracted make, model, and date-time from Samsung video tags.
  * Fixed black-frame flashes, poster letterbox pop, and duration-badge
    clipping when paging to videos, and stopped a mouse swipe from starting
    playback.

  ## MCP

  * Added a `view_asset` tool that returns a photo's pixels to the model so it
    can read text in or analyze the image.
  * Added a `save_asset` tool for ingesting new photos and videos into a
    library.
  * Rendered video thumbnails in the MCP app grid, added swipe navigation, and
    matched the viewer chrome to the web app on small screens.
  * Fixed MCP tool calls being counted twice against rate limits.

  ## Faces

  * Added a SCRFD face-detection backend and made it the default detector.
  * Added a `create_face` endpoint (and web UI) for manually drawing face
    boxes, and the ability to delete a face.
  * Exposed face confidence and source in the API.
  * Improved RetinaFace recall and backfilled previously missed faces.

  ## Timezones

  * Added user home-timezone handling so photos without embedded timezone
    information get a sensible local time — inferred from device neighbors, a
    timezone hint sent by the app, or a home zone derived from a user's other
    photos.
  * Cleared false UTC offsets from captures that lack offset information.

  ## Immich compatibility

  * Passed ThumbHash placeholders through to Immich clients.
  * Exposed real storage quota to Immich and remapped over-quota responses from
    507 to 400.
  * Implemented `POST /api/faces` (manual face creation) in the adapter.
  * Fixed a 500 on `GET /api/albums` for albums with naive start/end dates.
  * Isolated the refreshed JWT per request as a safeguard against a theoretical
    cross-user leak.

  ## API & SDK

  * Added an `include=variants` token so asset reads return only the requested
    image variants, keeping default responses lean.
  * Added single-asset streaming download via a Content-Disposition attachment.
  * Published TypeScript SDK 0.108.0–0.125.0 and Python SDK 0.103.0–0.119.1
    tracking these API changes.

  ## Documentation

  * Documented manual face boxes, lean asset responses and the `variants`
    token, MCP tool-call rate limits, asset capture-time handling, and
    original-asset download behavior.
  * Pointed Immich setup docs at immich.gumnut.ai and refreshed the docs brand
    mark and favicon.
</Update>

<Update label="May 2026">
  ## Apps

  * Launched the new Gumnut web app at [app.gumnut.ai](https://app.gumnut.ai), a
    Vite + React single-page app that replaces the previous web client.
  * Added a virtualized photo timeline with justified rows, per-month data
    loading, date grouping, and a jump scrubber on both web and mobile.
  * Added an asset viewer with EXIF metadata and prev/next navigation scoped to
    albums and people.
  * Added albums, people, search, uploads (with per-image upload progress
    thumbnails), and API key management.
  * Extended the virtualized timeline to the album and person views and migrated
    search to a justified, virtualized grid — all with infinite scroll, replacing
    the previous "Load more" buttons.
  * Added a dedicated sign-in page for signed-out visitors, an Immich settings
    page linking to the Immich web and mobile apps, and an MCP setup page on the
    Chat tab for connecting Gumnut to Claude or ChatGPT.
  * Retired the legacy Next.js web client, completing the move to the new app.
  * Fixed the home page loading slowly on large libraries by paginating the
    timeline instead of fetching the entire asset list.
  * Fixed asset search on Android.

  ## Video

  * Added basic video support: thumbnail generation, width/height and duration
    extraction at ingest, and a database schema for video metadata.
  * Added streaming video playback through the CDN, including HTTP range request
    support for seeking.
  * Surfaced video thumbnails and duration through the Immich adapter, and
    backfilled thumbnails, dimensions, and duration for existing videos.

  ## Faces

  * Switched face clustering to a graph-based approach (HNSW + Chinese Whispers).
  * Added crowd-face filtering to keep large background crowds from polluting
    clusters.
  * Shipped a self-service face cleanup dashboard for reviewing and triaging
    clusters, including an unassigned-faces tab.
  * Began migrating face embeddings from FaceNet512 to ArcFace, with dual-write
    ingestion and new embedding/centroid storage.

  ## Immich compatibility

  * Added map markers and enabled the map feature flag.
  * Added a read-only "On this day" memories endpoint.
  * Added user edits to asset metadata (description, date/time and timezone, and
    GPS), wired through to single- and bulk-asset edit endpoints.
  * Added Immich-compatible trash (soft-delete) with retention, honored across
    REST, sync stream, timeline, statistics, and WebSocket events.
  * Served a sharper thumbnail size (`small`/720) for wide and panoramic photos
    in Immich clients.

  ## Library management

  * Added library trash/restore with an async purge window and SDK support.

  ## API & SDK

  * Added a `POST /api/assets/bulk-update` endpoint.
  * Added a single-asset `PATCH /api/assets/{asset_id}` endpoint.
  * Added image variant sizing improvements (a new `small=720` rung and larger
    thumbnails) and ThumbHash placeholders for faster perceived loading.
  * Moved the `/api-keys` router under the `/api` prefix and tracked API key
    usage via `last_used_at`.
  * Fixed semantic search returning the same asset multiple times by
    de-duplicating stored embeddings, adding a uniqueness constraint, and making
    embedding writes idempotent.
</Update>

<Update label="April 2026">
  ## Location

  * Added reverse geocoding: selected a provider and added a backfill task that
    populates human-readable place names and location metadata.
  * Added `display_label` and `place_name` to the asset metadata response.
  * Introduced layered asset metadata (file, reverse-geo, and user layers) with
    rename cascade support.

  ## Faces

  * Added density-aware gates that reject loose clusters at creation and during
    per-asset assignment.
  * Added density-aware auto-merge and auto-dissolve of unnamed people on reuse.
  * Added clustering debounce and re-clustering of unnamed people, plus face
    quality filtering.

  ## Immich compatibility

  * Added a People merge endpoint and a `PUT /api/people/{id}/reassign`
    endpoint.
  * Implemented `GET /api/faces` in the Immich adapter.
  * Added the trash (soft-delete) backend, schema, and filtering.
  * Updated for compatibility with Immich 2.6.x and 2.7.5, and made the server
    features endpoint return accurate feature flags.
  * Added an Immich compatibility documentation section.

  ## CDN

  * Completed the CDN migration end-to-end, including Immich adapter asset
    fetching and migration cleanup.

  ## Image descriptions

  * Added a backfill mechanism to generate descriptions for existing assets.
  * Added Google Gemini video descriptions, alongside the image description
    providers.

  ## MCP & ChatGPT app

  * Improved MCP app single-entity and zoom views, added a "Load more" button to
    album and person detail views, and adjusted thumbnail sizing.
  * Audited and rewrote MCP tool descriptions for LLM consumption and added MCP
    tool annotations (`readOnlyHint`, `destructiveHint`, and others).
  * Began the ChatGPT app submission: published the privacy policy, exposed
    `merge_people` as an MCP tool, and set up a demo account with sample data.

  ## API & SDK

  * Added an `include_unverified` parameter to the list people endpoint.
  * Added pagination parameters and response fields to album asset endpoints.

  ## Documentation

  * Documented the authentication architecture.
</Update>

<Update label="March 2026">
  ## Image descriptions

  * Added AI-generated descriptions for uploaded assets, with a
    provider-agnostic inference service and OpenRouter (Qwen) integration.
  * Added the asset description data model and API response, and triggered
    description generation on upload.

  ## CDN

  * Rolled out Cloudflare-based CDN asset delivery: photos-api infrastructure
    with additive `asset_urls` API changes, and migrated the web app, MCP app,
    and SDKs to consume them.

  ## MCP app

  * Added dark/light theme support and configurable CSP via a FastMCP 3.x
    upgrade.
  * Fixed iframe sizing, duplicated headings, and hardened error handling and
    sizing edge cases.

  ## Faces

  * Tightened the face assignment threshold, added post-clustering merge
    detection, improved centroid calculation, and added face quality filtering
    for clustering.

  ## Search & people

  * Added the ability to search and filter people by name.
  * Added an endpoint to merge people.

  ## Immich compatibility

  * Updated to Immich v2.5.0 and added WebP image support.
  * Made OAuth the default login method for the Immich web and mobile apps.

  ## Performance & reliability

  * Cut photos-api deploy time from \~30 minutes to \~5 minutes.
  * Added per-user rate limiting with weighted costs and granular limits for MCP
    tool endpoints.
  * Streamed uploads (single-pass checksum and S3 upload) and added a maximum
    upload file size.
  * Added an `/api/assets/counts` endpoint and date-range filtering to speed up
    timeline thumbnail loading.

  ## Documentation

  * Restructured the public documentation site and refreshed architecture docs.
</Update>

<Update label="February 2026">
  ## Albums

  * Added album cover images (`album_cover_url`) and album thumbnails.

  ## API

  * Added batch ID filtering (`ids`) to list endpoints for bulk viewing.
  * Added `album_assets` list and get endpoints with ID filtering.
  * Added date-range filtering to the assets list endpoint.
  * Returned full URLs directly in API responses instead of requiring
    client-side construction.

  ## MCP

  * Completed the next-generation MCP rollout: client migration, legacy MCP
    deprecation, and Playwright tests for the MCP app.
  * Enabled stateless MCP HTTP mode for multi-instance scaling.

  ## Sync & events

  * Designed and implemented first-class modeling of events and replaced the v1
    events API with a v2 implementation.

  ## Faces

  * Sped up face detection by downscaling images before detection and running
    detection and embedding as a local task.

  ## Performance, reliability & security

  * Added composite-key cursor pagination to prevent duplicate or skipped rows.
  * Scoped cursor subqueries by library to prevent cross-library information
    leaks.
  * Added a ping endpoint for uptime monitoring.
  * Fixed scroll position reset when navigating back from the photo detail view
    in the web app.
</Update>

<Update label="January 2026">
  ## MCP

  * Shipped the next-generation Gumnut Photos MCP: the MCP foundation (Phase 1),
    the full Tier 1 toolset (Phase 2), and complete MCP authentication.
  * Added MCP tool enhancements: `outputSchema`, `structuredContent`, and tool
    titles.
  * Fixed dynamic client registration and the `search_assets` MCP tool.

  ## HEIC support

  * Fixed HEIC metadata extraction (OffsetTime / SubsecTime read from the wrong
    EXIF IFD).
  * Fixed ML services failing to process HEIC images.
  * Pre-generated full-size WebP for HEIC files so they display in the browser,
    and served WebP instead of original HEIC for full-size thumbnails.

  ## Immich compatibility

  * Implemented the `.well-known/immich` endpoint.
  * Added WebSocket infrastructure with authentication and Phase 1 events
    (upload, delete, session).
  * Added sync streaming with cursor-based pagination.
  * Formatted error responses in the Immich-compatible format.
  * Updated to Immich v2.4.1.

  ## Sync & events

  * Added a `starting_after_id` parameter to the events endpoint for pagination.
</Update>

<Update label="December 2025">
  ## Immich compatibility

  * Deployed the Immich adapter to production.
  * Added Immich sessions, checkpoints, and the `/session` endpoints.
  * Added SHA-1 checksum support in both the Gumnut API and the Immich adapter.
  * Added the ability to constrain queries by `device_id` and
    `device_asset_ids`.

  ## Sync & events

  * Implemented an events endpoint for client sync.

  ## Albums

  * Added `startDate` and `endDate` fields to album responses.
</Update>
