Commit Graph
103 Commits
Author SHA1 Message Date
adrianbonpin 5713f5e792 fix(release): brace variable before unicode ellipsis (#4) 2026-08-20 19:38:20 +00:00
adrianbonpin e59aca9562 Migrate GitHub links to Gitea + release plugin via tea (#3) 2026-08-20 19:36:16 +00:00
adrianbonpin a8e189ca84 fix(plugin): add 16px horizontal padding to stats row 2026-07-13 07:07:42 +08:00
adrianbonpin 3b27094973 fix(plugin): inject CSS !important to constrain DialogButtonPrimary width, drop PanelSectionRow wrapper 2026-07-13 07:05:27 +08:00
adrianbonpin 9b38b17eb0 fix(plugin): prevent overflow — shrink stats, constrain button to 110px, hidden overflow 2026-07-13 07:03:28 +08:00
adrianbonpin 2a1943cf35 fix(plugin): constrain View Details button width to 130px 2026-07-13 06:55:44 +08:00
adrianbonpin c02ae28982 fix(plugin): use DialogButtonPrimary for View Details (like HLTB) 2026-07-13 06:54:25 +08:00
adrianbonpin 4f503e373a fix(plugin): use Focusable for compact styled View Details button 2026-07-13 06:47:51 +08:00
adrianbonpin 17d70f175d fix(plugin): use ButtonItem for gamepad-navigable View Details 2026-07-13 06:44:36 +08:00
adrianbonpin a66c13daa0 fix(plugin): single row — stats + View Details inline, space-between 2026-07-13 06:41:15 +08:00
adrianbonpin eedcf9efa6 fix(plugin): show global fallback warning, compact View Details button 2026-07-13 06:39:09 +08:00
adrianbonpin ef96766659 fix(plugin): auto-detect device via DMI, remove selector, fall back to global 2026-07-13 06:37:27 +08:00
adrianbonpin 723885202d fix(plugin): space-between layout, no-shrink dropdown, horizontal padding 2026-07-13 06:33:01 +08:00
adrianbonpin d409e27a95 fix(plugin): game URL by steamAppId, inline dropdown to save vertical space 2026-07-13 06:28:41 +08:00
adrianbonpin c80c1d5775 fix(plugin): centered stats, View Details button with fallback, separate rows 2026-07-13 06:25:55 +08:00
adrianbonpin 7021f4da07 fix(plugin): single row stats + dropdown + button, no filler text 2026-07-13 06:22:13 +08:00
adrianbonpin c974699024 feat: add TDP to quick stats + open-on-DeckyVault button 2026-07-13 06:20:30 +08:00
adrianbonpin b108f0436b fix(plugin): minimal library panel — single stats row, no header 2026-07-13 06:18:21 +08:00
adrianbonpin ed0ed6b089 fix(plugin): guard non-numeric appId, improve 404 error handling 2026-07-13 06:01:08 +08:00
adrianbonpin 7e016bfa50 chore: bump plugin version to 1.1.0 2026-07-13 05:50:24 +08:00
adrianbonpin bfd36ad632 fix: address final review — 404 error field, aggregate estFps, recent entries, panel props 2026-07-13 05:30:17 +08:00
adrianbonpin d63ec4a42e fix(plugin): handle fetch errors, race conditions, and error states in library panel 2026-07-13 05:21:28 +08:00
adrianbonpin 66d16bc25c feat(plugin): inject DeckyVault section into library app-details page 2026-07-13 05:17:35 +08:00
adrianbonpin ed04b87f16 fix(plugin): don't cache error responses, add SSRF guard to plugin_get 2026-07-13 05:13:01 +08:00
adrianbonpin 4dfc23d35f feat(plugin): plugin_get proxy + typed library-panel fetch/cache 2026-07-13 05:10:04 +08:00
adrianbonpin 3d2f1384df fix(plugin): extract _collect_screenshots pure function, add fallback test 2026-07-13 04:59:17 +08:00
adrianbonpin 0018673747 fix(plugin): discover Steam Game Mode screenshots + safe preview fallback 2026-07-13 04:54:17 +08:00
adrianbonpin 5759fdbafd fix(plugin): align _find_mangohud_log with scoped clear, reset lastLogPath on error 2026-07-13 04:51:29 +08:00
adrianbonpin 61154dbda3 fix(plugin): safe recording start — no mid-game config rewrite, scoped log clear 2026-07-13 04:45:37 +08:00
adrianbonpin fd47803127 fix(plugin): guard against NaN fpsAvg bypassing upload check 2026-07-13 04:42:03 +08:00
adrianbonpin a975497c16 fix(plugin): block no-FPS uploads and clamp FPS before submit 2026-07-13 04:38:56 +08:00
adrianbonpin 868faafb4d fix(plugin): screenshot limit, version/build fields, delete button, workspace scripts
- 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)
2026-06-29 00:33:20 +08:00
adrianbonpin 8cff20c13e feat(plugin): thumbnail previews for screenshot picker
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.
2026-06-29 00:17:04 +08:00
adrianbonpin b416f49e3d feat(plugin): attach Steam Deck screenshots to performance submissions
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)
2026-06-29 00:10:01 +08:00
adrianbonpin 48758f4704 chore: add release script + use 16:10 aspect ratio for plugin screenshots
release.sh: build, package ZIP, tag, and create GitHub release in one command.
Screenshot slots now use 16:10 (matches Steam Deck's 1280x800 screen) with
object-contain so full-screen Deck captures fit without cropping.
2026-06-28 23:01:34 +08:00
adrianbonpin 4958220c55 feat: add /plugin docs page + TDP peripheral overhead
Plugin docs page (/plugin):
- Hero, feature grid, numbered install guide, screenshot gallery, install CTA
- Navbar 'Plugin' link added
- Screenshot slots with placeholders for 6 captures (flip HAS_SCREENSHOT
  once PNGs are dropped into /public/plugin/)
- Structured data (SoftwareApplication) + breadcrumbs

TDP fix:
- Add 3W fixed overhead to CPU+GPU power for screen/fan/speakers/peripherals
  so reported TDP is closer to total system power draw
2026-06-28 22:49:13 +08:00
adrianbonpin 383945ca14 build: add scripts/build-zip.sh to package plugin as a Decky-installable ZIP
The ZIP bundles plugin.json, main.py, package.json, dist/index.js (+ map) at
the archive root (no enclosing folder) — the format Decky's 'Install Plugin
from ZIP File' / 'Install Plugin from URL' expects.

Usage:
  bun run build:zip   # build + package → releases/plugin-v<version>.zip
  bun run zip         # package already-built dist only
2026-06-28 22:42:13 +08:00
adrianbonpin 3ed0ee3128 fix: API key test now actually verifies the key against a real auth endpoint
The old test hit /api/games/lookup which is a public endpoint with no auth,
so it never checked the key — any key (or a deleted one) reported as valid.

- Add GET /api/plugin/verify-key endpoint that uses authenticateWithApiKey
  to properly verify the x-api-key header via Better Auth
- Plugin test_api_key now calls /api/plugin/verify-key instead of games-lookup
- Returns the linked user's name + avatar on success for richer feedback
2026-06-28 22:22:47 +08:00
adrianbonpin 02553445b1 refactor: redesign plugin panel layout
Consolidate 7 flat sections into 5 logical groups with clear hierarchy:
1. Recording (primary action)
2. Account (QR pairing + manual key + test, with readiness indicator)
3. MangoHud Setup (merge config write/verify + launch option + numbered guide)
4. System (MangoHud check + game/app info)
5. Advanced (server, paths, hardware, config backup)

Add reusable helpers (SectionHint, StatusRow, InfoRow, CodeBlock, BtnContent)
for consistent styling. Improve recording timer with radial glow, error/success
states with colored backgrounds, and recent recordings as cards.
2026-06-28 22:12:57 +08:00
adrianbonpin 1de08ed4ec feat: QR code phone pairing for Decky plugin + MangoHud guide revision + SteamOS version fix
- 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')
2026-06-28 22:09:39 +08:00
adrianbonpin 4c531beb11 chore(plugin): bump version to 1.0.0 2026-06-28 21:37:07 +08:00
adrianbonpin c67d99ad63 fix(plugin): use currentColor instead of white for icon so it doesn't disappear on hover 2026-06-28 21:36:23 +08:00
adrianbonpin f7c7ed7bbe feat(plugin): show game name and app ID in status section 2026-06-28 21:30:58 +08:00
adrianbonpin 234877cef2 fix(plugin): detect Steam App ID from compatdata, read proper game name from appmanifest 2026-06-28 21:28:56 +08:00
adrianbonpin 9b6b37f8a4 fix(plugin): poll-based game detection via Python backend, remove broken SteamClient events 2026-06-28 21:25:57 +08:00
adrianbonpin 0c44b39e9e fix(plugin): use correct SteamClient.GameSessions.RegisterForAppLifetimeNotifications API for game detection 2026-06-28 21:21:29 +08:00
adrianbonpin 83ab7fa1e6 fix(plugin): browser-like UA for Cloudflare, detect current game, fix proton version, single-line notes 2026-06-28 21:15:17 +08:00
adrianbonpin 7ebb2669a1 fix(plugin): sum cpu_power + gpu_power for TDP, remove in-game settings, single-line notes 2026-06-28 21:03:00 +08:00
adrianbonpin ec1d4a0746 fix(plugin): remove in-game settings, single-line notes, record-while-in-game flow 2026-06-28 21:01:53 +08:00
adrianbonpin e3c3ed54c6 fix(plugin): update copy button to use wrapper script path 2026-06-28 20:56:40 +08:00