* fix: preserve public request origins behind HTTPS proxies React Router 7.18.4 validates the full request origin. HTTPS termination followed by internal HTTP proxying made valid login submissions appear cross-origin and fail with HTTP 400. Fix request construction rather than requiring a correct FRONTEND_URL or bypassing the origin check. Preserve forwarding metadata from local and private-network proxies in Caddy, with a CADDY_TRUSTED_PROXIES override for other trust boundaries. Replace the stock frontend server with a loopback-bound server that trusts only local forwarding hops and preserves hostnames, IPv6 addresses, ports, and request paths. Keep static asset caching, compression, request logging, and graceful shutdown, using the existing resolved server dependency versions. Exercise the production entry point in integration tests with FRONTEND_URL unset or incorrect. Cover HTTP and forwarded HTTPS login, public hostnames and IP addresses, custom ports, foreign origins, protocol and port mismatches, untrusted forwarding headers, and double-slash request paths. Document the proxy trust defaults and optional override. All 94 integration tests, workspace type checks, relevant lint checks, frontend and documentation builds, release backend build, release Clippy checks, and Caddy configuration validation passed. * ci: Run CI * fix: initialize production mode before loading React Router Static ESM imports run before the server module body. Importing React Router before assigning the default NODE_ENV cached development React, while the later server-build import selected production React DOM. Containers without NODE_ENV therefore failed to render pages with dispatcher.getOwner is not a function even though health checks and login actions worked. Load the React Router request handler dynamically after environment initialization so React and React DOM choose the same runtime. Add page-rendering and login regression coverage with NODE_ENV both absent and explicitly production; the original test environment masked this failure by inheriting NODE_ENV=test. Reproduced HTTP 500 using the published PR Docker image, then tested a derived production image containing only the fixed server entry point with PostgreSQL and an actual HTTPS Caddy proxy. Login-page and authenticated-dashboard rendering, HTTPS document and single-fetch login, direct HTTP/IP login, and CSRF rejection checks passed. All 16 frontend regression tests passed against the container-backed stack, along with affected lint, all workspace type checks, and frontend/docs builds. * ci: Run CI Trigger the opt-in pull-request build after fixing React initialization order. Rebuild and publish the pr-1866 test image so the production rendering fix can be verified without changing the server environment or proxy configuration.
Ryot
A self hosted platform for tracking various facets of your life - media, fitness and more.
Documentation • Live Demo • Discord • Pro Features
Quick Start
Create a docker-compose.yml file:
services:
ryot-db:
restart: unless-stopped
image: postgres:18-alpine
environment:
- POSTGRES_PASSWORD=postgres
volumes:
- postgres_storage:/var/lib/postgresql
ryot:
image: ignisda/ryot:v10
restart: unless-stopped
ports:
- "8000:8000"
environment:
- SERVER_ADMIN_ACCESS_TOKEN=CHANGE_ME_TO_A_LONG_RANDOM_STRING
- DATABASE_URL=postgres://postgres:postgres@ryot-db:5432/postgres
volumes:
postgres_storage:
Then run docker compose up -d and visit http://localhost:8000. For production setups, see the installation guide.
What is Ryot?
Ryot (Roll Your Own Tracker), pronounced "riot", is a self-hosted tracker for your media consumption and fitness activities. Track the books you read, shows you watch, games you play, and workouts you complete - all in one place with a clean interface and insightful statistics.
Demo
Try the live demo to explore the interface. Demo data resets every 24 hours.
Media Tracking
- Track movies, TV shows, anime, manga, books, audiobooks, podcasts, music and video games
- Import from Goodreads, Trakt, MyAnimeList, Audiobookshelf and more
- Automatic tracking via Jellyfin, Plex, Kodi, Emby integrations
Fitness
- Log workouts with a comprehensive exercise database
- Track body measurements over time
- Monitor progress with detailed graphs
Technical
- Self-hosted with full data ownership
- OpenID Connect authentication
- Notifications via Discord, Ntfy, Apprise
- GraphQL API for custom integrations
- PWA support for mobile use
- Written in Rust for performance
Pro Version
Ryot Pro adds profile sharing, personalized recommendations, supercharged collections and more. Learn more about the pro version.
Community
Questions or feedback? Join the Discord server or open a GitHub issue.
Acknowledgements
- Inspired by MediaTracker
- Exercise data from Free Exercise DB
- Thanks to all contributors
Migrating from v9?
If you were using v9.* of Ryot, please read the migration guide for instructions to upgrade to v10.


