`group` sat on the overlay <Link>. The checkbox is that link's SIBLING, not its child, so `group-hover` could never have matched — and nothing in the file used a `group-*` utility at all, so the class was inert. The checkbox therefore fell back to its own `hover:opacity-100`, which fires only once the pointer is already over an invisible 20px circle. The affordance was there and unfindable, which reads as "there is no way to select a photo". `group` moves to the wrapper, the checkbox reads `group-hover`, and the two dead `group` classes on the overlays are dropped. Touch is still unserved: no hover means no way to begin a selection. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
50 lines
2.0 KiB
TypeScript
50 lines
2.0 KiB
TypeScript
import type { PluginManifest } from '@@/plugins/manifest';
|
|
|
|
/**
|
|
* Photos — your Immich library, reached through Officer.
|
|
*
|
|
* ── What this plugin is, and what it is not ──
|
|
*
|
|
* It does NOT store photographs, and it does not install Immich. You point it at an instance you already
|
|
* run and it forwards to it, holding the API key server-side so no device ever carries one. The library,
|
|
* the originals and every thumbnail stay where they are.
|
|
*
|
|
* The account registry is per-user and already server-side (`photos_config`): a label, a URL and an
|
|
* encrypted API key, with one marked active. Adding and switching instances happens in the app rather
|
|
* than in a shell, which is why nothing here reads `process.env` — an `IMMICH_API_KEY` in `.env` would
|
|
* also sit in the environment of every other pm2 process, including the one with the largest attack
|
|
* surface and no code to use it.
|
|
*
|
|
* ── No `osDependencies` ──
|
|
*
|
|
* Nothing shells out. The sidecar is a Bun HTTP proxy and reaches Immich with `fetch`.
|
|
*/
|
|
export const manifest: PluginManifest = {
|
|
publisher: 'officerdev',
|
|
version: '2026.09.03.02',
|
|
platform: '>=1.0.0',
|
|
|
|
label: 'Photos',
|
|
summary: 'Your Immich library — browse, search, upload from the phone',
|
|
/** Google Photos is the thing it replaces. */
|
|
tags: ['Personal', 'Degoogling'],
|
|
icon: 'Images',
|
|
color: '#10b981',
|
|
|
|
// Immich accounts are created one per Officer account. Declared here so the owner sees it on the install
|
|
// screen beside the permissions — "this plugin will be told who your users are" belongs where a person
|
|
// decides, not in a log afterwards.
|
|
//
|
|
// What it turns on: the sidecar receives `users:list` when it registers and whenever an account is
|
|
// created or removed. See src/servers/plugins/user-provisioning.ts and plugins/USER_PROVISIONING.md.
|
|
userProvisioning: true,
|
|
|
|
permissions: [
|
|
{
|
|
key: 'photos',
|
|
label: 'Photos',
|
|
description: 'Browse the photo library',
|
|
},
|
|
],
|
|
};
|