New src/map.c (unity-build part) adds a map screen reached from the search
bar's map button:
- Fetches geotag markers (GET /api/map/markers), projects with Web Mercator.
- Clusters markers into count "bubbles" in map space (anchored to the world,
so panning translates them instead of reshuffling); pan (d-pad/touch),
zoom (L/R/pinch). X or tap zooms into a cluster, or opens a lone/co-located
photo — fetching that asset on demand if it isn't paged into the grid —
and returns to the map on back.
- Base map: a Web-Mercator LOD tile pyramid generated offline from a MapChart
PNG (tools/png_to_tiles.py -> assets/maptiles.pak); the level matching the
on-screen scale is drawn from 256px JPEG tiles decoded into pooled textures
(the crash-safe path), with a coarse overview underneath so there are no
gaps while tiles stream in. Georeferencing (full longitude, lat band) was
fit from isolated-island centroids so markers land on land.
main.c uses a larger vita2d vertex pool; app.c wires the mode in.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 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>
main.c was a single 6018-line translation unit. Cut it at the existing
section banners into ordered part files (state, draw, config, net, jpeg,
api, thumbs, display, ui, video, sync, app) that main.c #includes in
dependency order.
The parts form one translation unit and share all file-scope state, so
there are no headers, no extern decls, and no de-static-ing of the ~100
shared globals coupling the three threads. Only src/main.c is compiled
(CMakeLists unchanged). The slices are byte-exact: the preprocessed TU is
identical to the old main.c, so the binary is unchanged. Verified by a
clean build plus a Vita3K run (login, paging, grid, detail view, back nav,
no crash).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- New CLAUDE.md documenting the build -> install -> launch -> drive -> logs loop.
- session_start must force SDL_VIDEODRIVER=wayland + empty DISPLAY, else Vita3K
renders to the host X display (blank frames, dropped input).
- Native build now targets build/ instead of build-native/.
- Capture frames into agent-run/frames/ (wiped each session) and clear the
/tmp/kwin-mcp-screenshots-* folder afterwards instead of leaving them in /tmp.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>