# 2026.08.29.04 — the file preview becomes a carousel, and zoom starts working again **No schema change and no dependency change.** Verified rather than assumed: ```bash git diff --name-only deploy/2026.08.29.03..deploy/2026.08.29.04 | grep -iE 'schema|/db/|databases' # nothing git diff --name-only deploy/2026.08.29.03..deploy/2026.08.29.04 -- package.json bun.lock # nothing ``` So **no `bun db:push` and no `bun install` step exist in this plan, and neither should be improvised.** Sixteen commits; two of them are notes and one is the previous release's report. ## What is in it - **The file preview is a carousel.** It lists the folder it was opened from, shows thumbnails along the bottom, and steps with the arrow keys or the carets. Escape closes it. - **Zoom works on plugin screens, `/bots` and `/plugins` again.** `useAuthoredLayout` grafts back only what the user owns, and it knew about sizes and not about zoom — so every click was collected by nothing, compared equal, and dropped. The control rendered, took the click, and did nothing. - **An image no longer sticks.** Stepping to a new picture showed the previous one until the new one decoded, and the first fix for that lost a race against cached images and left the spinner up forever. Both are gone: loaded state is derived from which `src` actually loaded. - **A platform event bus**, and thumbnails warmed the moment files arrive. `files:uploaded`, `files:placed` and `archive:extracted` are emitted; a plugin may subscribe through its manifest. No plugin subscribes yet, so the dispatch path is unexercised in production — worth knowing if something odd appears near an upload. - **An embedded file browser can put its folder in a query parameter**, keep its own root crumb, and Back and Forward move between folders. - Shift+Enter renders as a line break in chat. Grid tiles have their gap back and the picture fills the tile. The download card's title stops escaping it. ## Nothing here changes behaviour anyone has to be warned about No route is removed, no permission changes, nothing 404s that did not before. If a host comes back and something is missing, that is a fault rather than an intention — report it. ## Every host — the commands The standard steps in `prompts/deploy-commander.md` are the whole rollout (dirty check, `git fetch origin --tags`, `git merge --ff-only deploy/2026.08.29.04`, `bun run plugins:update`), plus: ```bash pm2 restart officer ``` `officer` only — `plugins:update` has already restarted the plugin sidecars. ### Verify it came back `pm2 jlist`: `officer` online and `restart_time` moved, then `/api/health` on the host's own port (9010 on `macbookpro` and `production-pertento-bridge`, 9000 elsewhere). `200` or `401` are healthy. ### And check the file browser still lists This release touched the file browser and the viewer heavily, so one call per host: ```bash bun -e " const { sign } = await import('./src/servers/jwt'); const t = await sign({ id: 1, email: '' }, '2m'); const r = await fetch('http://127.0.0.1:/api/file-browser/ls?root=home&path=/', { headers: { Authorization: 'Bearer ' + t } }); const b = await r.json(); console.log(r.status, (b.entries ?? []).length + ' entries'); process.exit(0)" ``` A `200` with a plausible count. **A 500 here is a failed host** — report it and move on. ## Per host Surveyed 2026-08-29 while writing this. Every host was clean (`--untracked-files=no`) and six of the seven sit exactly on `deploy/2026.08.29.03` (`03fbb118`). | Host | Note | | --- | --- | | `officer-dev` | **SKIP ENTIRELY.** The rollout runs here and it is already at this code. Name it as skipped. | | `alpha` | On `03fbb118`, clean. Ordinary target. | | `fofos` | **On `2738f799`, not on the tag** — it has been hand-pulled all day while this work was written against it. That commit is an ancestor of the tag, so the fast-forward is ordinary; it simply has fewer commits to travel. It is also the only host with `av-club` and `fofos-admin` installed, so `plugins:update` moves more here than anywhere else. | | `macbookpro` | macOS, port **9010**, a laptop. Unreachable is a SKIP with a note, not a failure. | | `macbruno` | macOS, login `brunoalcadapadezmonteirodaconceicao`. | | `production-pertento-bridge` | Port **9010**. Its `pg_dump` is older than its server — irrelevant here, since this release takes no backup and touches no schema. | | `edge-pertento-bridge` | Answered the survey this time, on `03fbb118` and clean. Ordinary target. | | `deadpool-rezio-bridge` | Login **`br`**, checkout `/home/br/officerdev/platform`. | ## What "done" looks like Per host: HEAD before and after, `plugins:update` result, `officer` back online with a moved `restart_time`, and the `ls` check's output. Nothing in this release needs a database query, a backup or an install. If you find yourself running one, stop — the plan is wrong, and that is worth reporting rather than working around.