Help us improve
Share bugs, ideas, or general feedback.
From immich-photo-manager
Creates, curates, and publishes Immich albums organized by geography, theme, or custom criteria. Automates album creation from user prompts like 'create an album from my trip to Italy'.
npx claudepluginhub drolosoft/immich-photo-manager --plugin immich-photo-managerHow this skill is triggered — by the user, by Claude, or both
Slash command
/immich-photo-manager:album-managerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
**Before doing ANYTHING else in this skill, call `ping` on the Immich MCP server.**
Searches an Immich photo library by natural language, GPS, dates, people, cameras, and CLIP visual search. Activates on photo-finding requests.
Automates Google Photos tasks (upload media, manage albums, search photos, batch add items) via Rube MCP (Composio). Always searches tools first for current schemas.
Batch downloads original photos from PhotoPlus album links (photoplus.cn/live/). Extracts album ID, confirms with user, and runs a Python script with multi-threading and skip support.
Share bugs, ideas, or general feedback.
Before doing ANYTHING else in this skill, call ping on the Immich MCP server.
ping succeeds → proceed with the skill normally.ping fails or the MCP tools are not available → STOP. Do not continue. Tell the user:❌ Immich is not connected. This plugin needs a running Immich MCP server to work.
Run /setup-immich-photo-manager to configure your Immich connection. You'll need:
- Your Immich server URL (e.g.,
http://192.168.1.100:2283)- An Immich API key (how to create one)
- The MCP server running (
./immich-mcp-server)Nothing in this plugin will work until the connection is configured.
Do NOT skip this check. Do NOT try to run any other tool first. Always ping, always block if it fails.
Intelligent album creation and curation for Immich photo libraries. Organizes photos geographically by default — albums represent places, not dates.
Geography first, chronology second. A user who visited Mexico twice gets one "Mexico" album (or sub-albums by city), not "Mexico 2018" and "Mexico 2023". Dates are metadata shown inside the album, never the organizing principle.
Use the Immich MCP tools for all API interactions:
immich_search_assets — Search by GPS coordinates, date range, city, country, camera, person, or smart/CLIP text queryimmich_create_album — Create a new album with name and descriptionimmich_add_assets_to_album — Add photos/videos to an album by asset IDsimmich_remove_assets_from_album — Remove assets from an albumimmich_list_albums — List all albums with asset countsimmich_get_album — Get album details including all assetsimmich_delete_album — Delete an album (does NOT delete the photos)immich_create_shared_link — Create a public shared link for an album (makes it visible in Gallery)immich_get_asset_info — Get full metadata for a specific asset (GPS, EXIF, dates)immich_get_statistics — Get library statistics (total photos, videos, storage)immich_get_asset_thumbnail — Get base64 thumbnail for an asset (used for gallery HTML generation)Search by GPS bounding box OR by CLIP semantic search OR by date range:
# GPS-based (most accurate)
immich_search_assets(latitude=41.87, longitude=12.49, radius_km=50) # Rome area
# CLIP semantic search (when GPS is missing)
immich_search_assets(query="Colosseum Rome Italy")
# Date-based (supplement)
immich_search_assets(date_from="2023-06-01", date_to="2023-06-15")
# Combined
immich_search_assets(latitude=41.87, longitude=12.49, radius_km=50, date_from="2023-06-01")
From the search results, filter out:
Prefer photos that:
Target: 20-50 photos per album for optimal gallery experience. Can go up to 100 for major destinations.
Naming convention:
[Country emoji] Place, Country
Examples:
🇮🇹 Cinque Terre, Italia
🇪🇬 Cairo & Luxor, Egypt
🇲🇽 Chiapas, México
🏝️ Lanzarote
🌴 La Palma
🏙️ Barcelona
For the description, include:
After creating the album, create a shared link to make it visible in the Gallery frontend:
immich_create_shared_link(album_id="{id}", show_metadata=true, allow_download=false)
Confirm the album appears correctly:
When creating multiple albums at once (e.g., "create albums for all my trips"):
Always err on the side of creating MORE albums — the user can merge or delete later. It's easier to remove an unwanted album than to discover a missing one.
Many photos (especially older ones or screenshots) lack GPS coordinates. Strategy:
When asked to update or refine an existing album:
When the user asks to "show me photos from [album]", "generate a gallery for [album]", "show me [album name]", or any variation of viewing/displaying album contents visually, generate an interactive HTML gallery page.
Use the gallery template at assets/viewer-template.html (from the plugin root). This is a self-contained, single-file HTML gallery with:
The template uses these placeholders that MUST be replaced:
| Placeholder | Description | Example |
|---|---|---|
{{ALBUM_NAME}} | Display name of the album | Lanzarote Verde |
{{ALBUM_TOTAL}} | Total number of photos in the album | 273 |
{{SEARCH_QUERY}} | The query or description used to find photos | “green landscapes in Lanzarote” |
{{IMMICH_URL}} | Immich server base URL | https://your-immich-server.com |
{{PAGE_SIZE}} | Number of photos per lazy-load page | 20 |
{{PHOTO_COUNT}} | Total photos in the gallery (limit ~50 for file size) | 50 |
{{PHOTO_ENTRIES}} | The photo data entries (see format below) | See below |
{{ALBUMS_JSON}} | JSON array of album links | See below |
The Cowork viewer runs in an about: protocol sandbox that blocks ALL external network requests. Thumbnails MUST be embedded as base64 data: URIs.
Each entry in {{PHOTO_ENTRIES}} includes the full thumbnail data:
{src:'data:image/jpeg;base64,/9j/4AAQ...',id:'<asset-id>',name:'<filename>',date:'<ISO-date>'}
src: Base64 data URI of the thumbnail (from get_thumbnails_batch, size=thumbnail, ~250px, ~15-25KB each)id: The Immich asset ID (for linking to Immich web UI)name: Original filename (displayed as label)date: ISO date string from the asset metadataAlways use size="thumbnail" (250px) — never preview (1440px). Thumbnails average ~18KB each, so 50 photos ≈ 0.9MB HTML file.
Entries are comma-separated, one per line.
{{ALBUMS_JSON}} is injected raw into JS. It can be either a JSON array [{...}] or a single object {...} — the template handles both. Use standard JSON with quoted keys:
[{"id":"<album-id>","name":"<Album Name>","total":<count>}]
Each album object needs: id (string), name (string), total (integer).
get_album to get the album ID, name, and full asset list (IDs, filenames, dates)get_thumbnails_batch(asset_ids=[...], size="thumbnail", limit=50) — call in batches of 50 if neededassets/viewer-template.html from the plugin root{{...}} placeholders{{PHOTO_ENTRIES}}: {src:'data:...',id:'...',name:'...',date:'...'} for each asset with base64 thumbnail<album-name-slug>.html (~0.9MB for 50 photos)computer://get_thumbnails_batch is REQUIRED. The Cowork sandbox blocks all external requests — base64 is the only way.
{{PAGE_SIZE}}, {{PHOTO_COUNT}}, {{ALBUM_TOTAL}}: Must be plain integers (e.g. 200, not 200+ or "200"). These are injected directly into JavaScript.{{ALBUM_NAME}}, {{SEARCH_QUERY}}, {{IMMICH_URL}}: Can be any string (they are placed inside HTML or JS string literals).{{PHOTO_ENTRIES}}: Must be valid JS object literals, comma-separated.{{ALBUMS_JSON}}: Must be comma-separated JSON objects (NOT wrapped in array brackets — the template adds [...]). Example: {"id":"abc","name":"My Album","total":50}. If no related albums, use empty string.The {{ALBUMS_JSON}} placeholder must ONLY contain real, user-created albums. Never fabricate album entries. Never create temporary albums to populate this field.
When generating a gallery for an album, find OTHER real albums that are related (e.g., same country, same trip) and list them as Related Albums. If there are no related albums, use [].
get_thumbnails_batch(size="thumbnail") — ~18KB avg eachUser: "Show me photos from Lanzarote Verde"
1. list_albums() -> find "Lanzarote Verde" album (id: abc123, 273 photos)
2. get_album(album_id="abc123") -> get full asset list with IDs, names, dates
3. Read assets/viewer-template.html
4. Replace:
- {{ALBUM_NAME}} -> "Lanzarote Verde"
- {{ALBUM_TOTAL}} -> 273
- {{SEARCH_QUERY}} -> "Lanzarote Verde"
- {{IMMICH_URL}} -> "https://your-immich-server.com"
- {{PAGE_SIZE}} -> 20
- {{PHOTO_COUNT}} -> 50 (first 50 of 273)
- {{PHOTO_ENTRIES}} -> {src:'data:image/jpeg;base64,...',id:"abc",name:"IMG_001",date:"2023-06-15"},{src:'data:...',id:"def",...}
- {{ALBUMS_JSON}} -> {"id":"abc123","name":"Lanzarote Verde","total":273}
5. Save as lanzarote-verde.html (~0.9MB)
6. Present computer:// link
references/geographic-search-patterns.md — GPS bounding boxes of common destinations and search strategiesassets/index-template.html — Dashboard template listing all saved gallery HTML filesassets/viewer-template.html — Self-contained HTML gallery template with dark/light themes, multiple view modes, slideshow, Cowork Actions Panel, and keyboard navigation