- list_screenshots: bump limit 12 → 50 so users can scroll further back
- Add versionString + buildId to DeckyVaultImportV1, SessionData, and
buildImportPayload. Import endpoint now saves them on new game versions.
- Screenshot delete button in preset detail modal: owner/admin sees a
trash icon on hover that calls DELETE /api/performance/:id/screenshots/:sid
- Root workspace scripts for plugin workflow:
bun run plugin:build | plugin:zip | plugin:release | plugin:deploy
- Add deploy.sh (SSH scripts to push plugin to Deck)
The screenshot picker now shows a live thumbnail next to each recent
Steam screenshot so users can identify the right one before selecting.
- read_screenshot() Python RPC: returns a base64 data URL for inline
display. Tries Pillow downscale (320px), falls back to raw bytes
(Steam Deck screenshots are ~78KB so this is fine without Pillow).
- Thumbnail component: 56x56 rounded image with loading placeholder.
- Thumbnails load progressively in both the picker list and the
selected-shots rows via a useEffect.
The plugin can now attach up to 2 Steam Deck screenshots (Steam + R1)
to a performance entry, uploaded together in one Submit tap.
Backend:
- Screenshot upload/delete endpoints now accept API key auth via
requireRoleWithApiKeyFallback (was session-only), so the plugin's
x-api-key header works. The 2-screenshot limit was already enforced
server-side (MAX_SCREENSHOTS_PER_ENTRY = 2).
Plugin Python (main.py):
- list_screenshots(): scans ~/Pictures/Screenshots/ + Steam Client/
subfolder, skips the most_recent.jpg duplicate, returns recent shots
- upload_screenshots(): hard-caps at 2, builds multipart/form-data with
urllib, posts to /api/performance/:id/screenshots
Plugin UI (session-form.tsx):
- New Screenshots section (max 2) with a picker listing recent Steam
screenshots (time + size), selected shots as removable rows
- Submit flow: upload entry → get entry ID → upload selected screenshots
→ combined success message (partial-success if screenshots fail)
- Add plugin_pairings table + migration (0028) for short-lived pairing sessions
- Add pairing API: POST /api/plugin/pair/initiate, GET /status/:token, POST /confirm
- Add /pair web page: user scans QR on phone, confirms, API key auto-created
- Plugin: 'Pair with Phone' button renders QR code (qrcode.react), polls for status, saves API key
- Plugin: new initiate_pair + check_pair_status Python RPCs
- Revise MangoHud Setup Guide into clean numbered steps
- Fix SteamOS version detection: read VERSION_ID + BUILD_ID (was just 'SteamOS')