What's Changed
- fix: allow NAT64-wrapped public IPs through SSRF filter by @gantoine in #3675
- Use parsed filename for unmatched ROM titles instead of raw filename by @gantoine in #3681
- docs(claude): add PR linking and template conventions by @gantoine in #3682
- Support markdown manuals and enforce allowed file types by @gantoine in #3683
- fix(v2): surface an error when clipboard copy fails over HTTP by @gantoine in #3684
- fix(v2): wrap 3D box side scan onto all four edges by @gantoine in #3685
- fix(scan): fall back to other providers when ScreenScraper quota is exhausted by @gantoine in #3686
- fix(launchbox): import local media when matching via update_rom by @gantoine in #3687
- i18n: rename "Duplicates" filter to "Versions" in the UI by @gantoine in #3688
- feat: default UI language to browser language when available by @gantoine in #3690
- test(v2): add axe accessibility gate + keyboard nav tests to Storybook by @gantoine in #3691
- Readme badges by @gantoine in #3692
- fix(platforms): stop platform variants from renaming the parent platform by @gantoine in #3693
- fix(v2): gallery focus-ring and tab-order polish by @gantoine in #3696
- fix: generate virtual collections from all metadata sources by @gantoine in #3694
- feat(patcher): always show patcher tab and allow uploading a patch by @gantoine in #3695
- fix(sockets): require TASKS_RUN scope for scan and scan:stop by @gantoine in #3698
- docs(sync): clarify slot pairing behavior in negotiate OpenAPI spec by @gantoine in #3699
- feat(playmatch): move integration to API v2 by @DevYukine in #3689
- feat(player): remember emulator core per-game by @gantoine in #3701
- perf(v2): use static background SVG in Firefox to stop GPU repaint by @gantoine in #3702
- fix(roms): enforce parent ROM visibility on direct file endpoints by @gantoine in #3703
- feat(roms): serve and display media files inline in details tab by @gantoine in #3700
Full Changelog: 5.0.0-beta.1...5.0.0-beta.2