Fotos · Sprig
Immich Photos
Explora fotos recientes, favoritos y álbumes de tu servidor Immich, luego agrega una copia privada o un enlace para compartir a tu borrador.
- Versión
- 0.1.4
- Tipo de ejecución
- Panel de redacción
- Grove API
- 1
- Actualizado
- 2026-09-18
Permisos solicitados
4 permisos
Acceso a la red
Hosts declarados
Grove bloquea todos los destinos de red excepto estos orígenes declarados:
https://*
Desde la extensión
README · Inglés
Immich Photos
This composer Sprig signs in directly to a user-selected Immich instance, browses recent photos, and inserts either an Immich share link or a FILEHOST/upload-provider copy into Mango’s message draft. The user remains in control of the final IRC message.
It requires Mango 3.1 or newer and an Immich server with OAuth login enabled. The OAuth or OpenID Connect client configured at the identity provider used by Immich must allow mango://grove/oauth as an additional exact redirect URI. Keep Immich’s existing browser and mobile redirect URIs. This requirement applies to Authentik, Keycloak, Authelia, and any other provider that validates redirect URIs; the extension itself remains provider agnostic.
Sign-in flow
Immich brokers its configured login provider, so the extension needs no provider-specific code or configuration in Mango:
- Mango creates a one-time state and S256 PKCE transaction through
grove.oauth.prepare(). - The extension sends the callback, state, and challenge to the selected Immich server’s
/api/oauth/authorizeendpoint. - Mango opens the authorization URL returned by Immich in an isolated system authentication session and validates the callback. The isolated session prevents an identity provider’s unrelated browser login from silently selecting the wrong Immich account.
- The extension sends that callback and Mango’s verifier to
/api/oauth/callback. - Immich returns its own access token, which is stored in
grove.secrets.application(Keychain), never Web storage.
The extension does not know or configure any identity provider behind Immich. It receives no password.
Permissions
oauth.authorizeopens the user-visible system sign-in session.network.requestmakes bounded native HTTPS requests to Immich instances that do not permit browser CORS.storage.securestores the Immich session in Mango’s Keychain namespace.uploads.usehands one bounded display-quality rendition to Mango’s configured native uploader without exposing its credentials to the extension.https://*lets users enter any self-hosted Immich origin and lets Mango open whatever HTTPS identity-provider URL that instance returns. This broad destination grant is visible in the installation consent sheet.
Native requests never follow redirects automatically and reject unsafe headers, non-HTTPS destinations, oversized request/response bodies, and destinations outside the accepted host permissions. Immich thumbnail redirects are accepted only when they stay on the selected instance and within the same asset path, then requested as a separately validated hop. Thumbnail requests are limited to four at a time.
Sharing behavior
The picker browses recent photos, favorites, and albums. Photo collections start with the newest 60 images and fetch older pages as the user scrolls; the Albums source shows cover art and drills into each album. Immich link creates one Immich INDIVIDUAL shared link with downloads enabled and metadata hidden; the user chooses a one-day, seven-day, 30-day, or non-expiring link. Uploaded copy downloads Immich’s display-quality preview and hands it to Mango’s configured native uploader, which avoids placing the Immich instance hostname in the draft. Mango inserts either resulting URL into the composer and never sends it automatically.
Test
node Examples/grove-immich-composer/immich-client.test.cjs
manifest.jsonchat.mangoirc.grove.immich
{
"grove": 1,
"id": "chat.mangoirc.grove.immich",
"name": "Immich Photos",
"version": "0.1.4",
"description": "Browse recent photos, favorites, and albums from your Immich server, then add a private copy or share link to your draft.",
"author": {
"name": "Mango",
"url": "https://mangoirc.chat"
},
"readme": "README.md",
"entry": "index.html",
"presentation": {
"surfaces": [
"composer"
],
"defaultSurface": "composer",
"minSize": {
"width": 340,
"height": 300
},
"defaultSize": {
"width": 560,
"height": 580
}
},
"capabilities": [
"oauth.authorize",
"network.request",
"storage.secure",
"uploads.use"
],
"hostPermissions": [
"https://*"
]
}