Library syncs can lock the web app. Syncs now occur async by offloading a message to be consumed by sync-library-processor (formerly game-assets-processor). E2E sync tests are now against the processor, to be removed from playnite-web-app. New snapshot mechanism used for local dev and e2e tests; allows a database to be snapshotted and restored.
next/image is used to optimze cover art and platform images.
BREAKING CHANGE: game-assets-processor renamed to sync-library-processor to reflect its new responsibilities; refer to new docker-compose sample for deployment. This will require users to sync their libraries again after updating.
BREAKING CHANGES:
- Retired MQTT messaging in favor of GraphQL API with WebSocket subscriptions
- MQTT messages are used solely to handle cover art
- Requires Postgres database via DATABASE_URL environment variable
- Requires SECRET environment variable for JWT-based authentication
- Playnite plugin now uses GraphQL for all communication with web app
Major Features:
Database & Multi-Tenancy:
- Implemented Prisma/Postgres relational schema with User, Library, Release, Platform, Feature, Tag, CompletionStatus, Playlist, Asset, SiteSettings, and UserSetting models
- Enabled multi-tenant support allowing multiple users with multiple Playnite libraries per application instance
- Added database migrations support for schema evolution
GraphQL API & Real-time Subscriptions:
- Replaced MQTT with GraphQL as primary programmatic interface
- Implemented WebSocket-based GraphQL subscriptions for real-time updates
- Playnite plugin now authenticates via GraphQL, publishes library updates, and subscribes to web app changes
- Added mutations for remote control: start, restart, and stop releases
Authentication & Authorization:
- Implemented JWT-based authentication with secure cookie and header support
- Added protected routes middleware for auth-gated pages
- Improved sign-in/out flows with proper navigation handling
- Added CSRF protection with Helmet CSP and configurable allowed origins
- Site admin and user settings pages with role-based access
UI/UX Improvements:
- Restored and enhanced game filtering and navigation
- Fixed layout issues including double scrollbars and grid sizing
- Improved SSR error handling with better error UI components
- Reduced layout shift and initial API calls for better performance
- Updated help page styles and minor UI tweaks throughout
- Automatic game cover art retrieval from IGN (requires matching game names)
Library Sync & Real-time Updates:
- Improved library sync reliability with proper ordering and conditional publishing
- Immediate reflection of changes between Playnite desktop app and web interface
- Better handling of entity collection changes and updates
- Fixed game asset path resolution and image slug generation
Testing & CI Infrastructure:
- Comprehensive Cypress test suite updates (e2e, component, visual regression)
- Added code coverage reporting with GitHub Actions integration
- Dockerized e2e test flow with proper sharp/vips dependencies
- Fixed flaky test timing and removed obsolete tests
- Enabled SWC for faster builds and test execution
- Added Lighthouse audits for performance monitoring
Docker & Deployment:
- Optimized multi-stage Dockerfile for web app with alpine base
- Improved Docker build times for development
- Packaged Prisma client with correct binary targets
- Proper asset copying and environment variable handling
Performance & SSR:
- Fixed server-side rendering errors across multiple routes
- Proper use of compression middleware
- Optimized MUI component rendering and interaction timing
- Reduced unnecessary data fetching on initial page load
- Improved database connection management in development
Developer Experience:
- Updated Nx workspace configuration and cleanup
- Better Prisma connection handling in dev environment
- Fixed linting errors and removed dead code
- Improved CI workflow reliability
This release represents a fundamental architectural shift from MQTT-based messaging to a modern GraphQL API with PostgreSQL persistence, enabling multi-tenant support, improved real-time synchronization, and a more maintainable codebase.
Closes#715Closes#765Closes#772Closes#761Closes#768Closes#763Closes#762Closes#760Closes#769Closes#716Closes#766Closes#764Closes#767Closes#770Closes#775Closes#776
Clsoes #682Closes#588Closes#682Closes#709
BREAKING CHANGES
Games can be remotely started, installed, and uninstalled. Starting a game that is not installed will simply install it.
- refactor of data access layer; allowing interchangeable data sources
- implemented mongo data source
- implemented in-memory data source; note that the updater does not update the in-memory data source at the moment
- conditional and aggregate data sources
- game state tracking includes release information and new state
- data is no longer stored as deeply nested documents; this allows for easier updating of data across various relations
\#573
\#580
BREAKING CHANGE: data is no longer stored as deeply nested documents. Please ensure you drop your data and re-sync Playnite Web after upgrading.