# 2026.08.29.01 — sharp becomes infrastructure **This release changes what a machine must have.** Every other deploy this month was code; this one adds a dependency with a native binary and a system package, so `bun install` is a required step rather than an optional one, and there are two things to verify per host that no previous plan asked for. Read the whole file before starting a host. The per-host section at the bottom is not optional detail — one host needs a command none of the others do. ## What is in it - **File browser thumbnails.** Images and videos draw a picture in both grid and list. New endpoint `GET /api/file-browser/thumb`, cached under each user's `cache/thumbs/`. - **sharp is now a declared dependency** (`^0.35.3`, resolving 0.35.4). It does the images; ffmpeg keeps the video. `package.json` and `bun.lock` both changed. - **ffmpeg is now declared in machine-setup's package list.** It was always a hard dependency of the file browser — subtitles, audio extraction, audio tracks — and was never in the list. Existing hosts were not provisioned by the new script, so this release checks rather than assumes. - Marketplace: install a plugin from a git URL; Marketplace overview section; nav restyle. - Dock and Spotlight clip bare plugin artwork to the tile shape. - The platform-skill generator emits an identifier for `name` again, so `docs:check` is green. ## Schema: UNCHANGED. Do not run `db:push`. Verified, not assumed: ```bash git diff --name-only deploy/2026.08.28.01..deploy/2026.08.29.01 | grep -iE 'schema|/db/|databases' ``` returns nothing. There is no table, no column and no constraint in this release. **No `bun db:push` step exists in this plan and none should be improvised.** If `bun run plugins:update` reports that a plugin moved, say so in the report — do not push a schema to cover it. ## Every host — the commands Run these after the standard steps in `prompts/deploy-commander.md` (dirty check, `git fetch origin --tags`, `git merge --ff-only deploy/2026.08.29.01`, `bun run plugins:update`), in this order, in the checkout from PM2's `pm_cwd`. ### 1. Install — REQUIRED, and it is the point of this release ```bash bun install ``` The lockfile is frozen, so this resolves from `bun.lock` and nothing else. It should report installing around 14 packages — sharp and its platform-specific libvips binaries. **A failure here stops this host.** Do not continue to the restart, and do not reach for `--force` to get past it: if the lockfile and `package.json` disagree, that is the freeze doing its job and it wants a human. ### 2. Prove sharp actually loads — the check that matters ```bash bun -e "import('sharp').then(m => console.log('libvips', m.default.versions.vips)).catch(e => { console.error('SHARP FAILED:', e.message); process.exit(1) })" ``` Expect `libvips 8.18.6`. **This is a separate step from the install on purpose.** sharp does not compile — it downloads a prebuilt binary chosen by platform and architecture. So `bun install` can succeed and the module still be unusable, and the symptom is not an error anywhere: it is a file browser drawing generic icons over a folder of photographs, which nobody reads as "a native module is missing". A host where this fails is a **failed host**. Report it, move on. `bun install --force` is the usual repair and it is a human's to run, not this rollout's. ### 3. ffmpeg must be present ```bash command -v ffmpeg && ffmpeg -version | head -1 ``` Video thumbnails need it, and so do three file-browser features that predate this release. Surveyed 2026-08-29: present on every host **except `macbruno`** — see below. Absent and not covered by a per-host command below → report the host as deployed-with-a-caveat, name ffmpeg, and do not install it yourself. Adding a system package to a machine is not something a rollout improvises. ### 4. Restart ```bash pm2 restart officer ``` **`officer` only.** Nothing else in this release touches a sidecar. Never `pm2 restart ecosystem.config.cjs`. ### 5. Verify it came back `pm2 jlist`: `officer` is `online` and its `restart_time` moved. Then, for this release specifically: ```bash curl -s -o /dev/null -w '%{http_code}\n' --max-time 5 http://127.0.0.1:/api/health ``` `200` or `401` are both healthy — the port is per host, in `docs/servers.md` (9010 on `macbookpro` and `production-pertento-bridge`, 9000 elsewhere). ## Per host | Host | Extra command | Note | | --- | --- | --- | | `officer-dev` | — | **SKIP ENTIRELY.** The rollout runs here. Do not pull, do not restart. Name it as skipped. | | `alpha` | — | x86_64, ffmpeg present. | | `fofos` | — | **Already at this code and verified** — it was the test host on 2026-08-29 before the tag. Bring it to the tag anyway so its HEAD matches the fleet; `bun install` will be a no-op. 1.9GB box: expect the install to be the slowest part. | | `macbookpro` | — | macOS/arm64, port **9010**. A laptop — unreachable is a SKIP with a note, not a failure. | | `macbruno` | `brew install ffmpeg` **before step 4** | macOS/arm64, login `brunoalcadapadezmonteirodaconceicao`. **The only host without ffmpeg.** Without it, image thumbnails still work — sharp does those — and video ones do not, along with subtitles and audio extraction. If brew is missing or the install fails, deploy anyway and report the caveat: nothing in this release regresses without ffmpeg, it simply does not gain the video half. | | `production-pertento-bridge` | — | x86_64, port **9010**. | | `edge-pertento-bridge` | — | x86_64. Node v24 here where the fleet is v22; sharp ships binaries for both and this was not a problem for the install on any other host, but if step 2 fails anywhere it is most likely here. | | `deadpool-rezio-bridge` | — | x86_64, login **`br`**, checkout `/home/br/officerdev/platform`. | ## What "done" looks like Per host: HEAD before and after, `bun install` result, the libvips version step 2 printed, whether ffmpeg was found, and `officer` back online with a moved `restart_time`. The two lines worth having in the summary that no previous report needed: **which hosts print a libvips version**, and **which hosts have ffmpeg**. Those are the two facts this release is actually about.