- Video: probe the MP4 header (range request for moov) before downloading
the whole clip; if the average bitrate overruns the declared H.264 level
the Vita's decoder enforces, show the "too high" message up front instead
of downloading then failing at playback. Verdict validated against the
real demo videos (e.g. e75d495e: Level 3.1 @ 18.8 Mbps -> rejected).
- Error screens: word-wrap title + detail so long messages no longer run
off the edges; the bitrate message now spells out the server-side fix
(Immich transcoding policy / bitrate cap).
- Boot: one continuous spinner. A single boot worker thread does sign-in +
first page + local scan while the main thread animates one logo with a
never-resetting frame counter, instead of three separate static screens.
- Throbbers: the cloud/server-info page and smart search now fetch on a
worker thread and animate a throbber instead of freezing the UI.
- Logo: swap the in-app logo for a clean 200x200 transparent PNG (the old
one was matted from the white-background icon and had fringe); keep the
launcher icon's white background. Linear-filter the logo + cloud badges
so they scale/rotate smoothly.
- Drop AgenticLoop.md (and its CLAUDE.md reference).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replace the grid status dot with the Immich cloud icons (rasterized from the
provided SVGs to white transparent PNGs: cloud = on server, cloud-off = on
device, cloud-done = on both). Drawn white in the cell's bottom-right corner,
no background, with a 1px dark shadow for legibility (red tint on failure).
Icons rendered high-res, thinned, and LANCZOS-downscaled so they stay
anti-aliased at badge size.
Also drop the bottom HUD hint bar on every page (draw_hud is now a no-op).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Login: an interactive sign-in screen (server/email/password via the on-screen
keyboard, touch + d-pad, password masked) shown when there's no usable
credential or a config login fails, plus a "Try the demo server" button. The
bundled Immich logo is now the official transparent PNG (clean edges), drawn
minified on a slow spin for the startup loader.
Logout (cloud menu, top-left) returns to the sign-in screen instead of quitting;
on re-auth, reset_for_account_change() pauses the sync thread, drains the
thumbnail worker, recycles thumbnails, drops the old library/local/search state
and reloads from the new account. The thumbnail worker now builds its auth
header (and resolve list) per request, so a new token takes effect immediately
instead of looping on "invalid user token"; g_serverip is cleared on logout.
Grid: Square now drops focus to the grid AND hides the top bar in one press.
Verified against demo.immich.app (v2.7.5) over TLS 1.2: login, grid/search,
cloud page, logout -> Try demo account switch, all with working thumbnails.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Startup: bundle the Immich logo (app0:logo.png, transparent + AA) and show a
spinning-logo loading screen while the first page loads on a thread.
Search bar: logo to the left of the field; d-pad up from the top row focuses
the bar, left/right move across field/map/cloud (indigo ring), X activates,
down or [] returns to the grid. The selection square stays hidden while focused.
Cloud: "Made by SadsArches with love" credit; the O/Back button lives on the
See-details menu (top-right, tappable). Reverted the back circle from the
image/detail view.
Resume from sleep: an RTC wall-clock jump triggers an append-only camera
re-scan (startup reserves array headroom so it can't realloc under the worker
/sync threads).
Play overlay redrawn with the AA disc + a baked play-triangle glyph.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- all text renders in the bundled Overpass SemiBold (Immich's
typeface) via vita2d's FreeType path, with a per-pixel-size font
instance cache (vita2d's glyph atlas caches glyphs at their first
drawn size, which rendered stray oversized letters when sizes mixed)
and a system-PGF fallback if the TTF fails to load; the OFL license
ships in the vpk next to the font
- freetype's bzip2 references get failing stubs (the SDK ships no
libbz2 and plain TTFs never hit that path)
- icon rebuilt from the official high-res Immich logo: anti-aliased,
flattened onto white so the LiveArea no longer shows it on black
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The "unsupported protocol" failure was never about HTTPS: the Vita
resolved the public domain to the WAN IP, the router (no NAT loopback)
answered with its own admin page, and curl reported the resulting
HTTP/0.9 garbage as CURLE_UNSUPPORTED_PROTOCOL. serverip= pins the
hostname to the LAN IP via CURLOPT_RESOLVE, keeping Host/SNI intact
for the reverse proxy.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>