A web application that generates personalized year-in-review statistics for your Jellyfin media server, inspired by Spotify Wrapped.
DO NOT host this application publicly on the internet when using API keys as environment variables. The API key is embedded in the frontend JavaScript bundle and will be visible to anyone who visits your site. This could expose your Jellyfin server to unauthorized access.
Recommended deployment options:
- Host locally on your home network only
- Use behind a VPN or authentication proxy
- Deploy on a private network/intranet
- Consider implementing server-side API key handling for public deployments
- 📊 View your most watched movies and TV shows
- 🎵 See your most played music
- ⏱️ Track your total watching/listening time
- 📈 Get insights into your viewing habits
- 🔒 Secure connection to your Jellyfin server
- 📱 Responsive design for mobile and desktop
- A Jellyfin server (version 10.8.0 or higher) with Jellyfin's official Playback Reporting plugin installed
- Admin access to your Jellyfin server to generate an API key
- Your Jellyfin server URL
- A valid Jellyfin username and password for user authentication
The application requires the following environment variables to be set:
For Development (Vite):
VITE_JELLYFIN_SERVER_URL: The URL of your Jellyfin server (e.g.,http://192.168.1.100:8096)VITE_JELLYFIN_API_KEY: An admin API key for accessing playback reporting data
For Production (Docker/Runtime):
JELLYFIN_SERVER_URL: The URL of your Jellyfin server (e.g.,http://192.168.1.100:8096)JELLYFIN_API_KEY: An admin API key for accessing playback reporting data
You can set these in a .env file in the project root for development:
# Copy the example file
cp .env.example .env
# Edit the .env file with your values
VITE_JELLYFIN_SERVER_URL=http://your-jellyfin-server:8096
VITE_JELLYFIN_API_KEY=your-admin-api-key-here- Log into your Jellyfin server as an administrator
- Go to Dashboard → API Keys
- Click "+" to create a new API key
- Give it a name (e.g., "Jellyfin Wrapped")
- Copy the generated API key and use it as
VITE_JELLYFIN_API_KEY(development) orJELLYFIN_API_KEY(production)
Note: The admin API key is required because recent Jellyfin versions restrict the user_usage_stats/submit_custom_query endpoint to admin users only.
- Set up the required environment variables (see Environment Variables section above)
- Run the application locally or deploy it to your preferred hosting platform
- If server URL is not configured via environment variables, enter your Jellyfin server URL
- Log in with your Jellyfin credentials
- View your personalized media statistics!
This project is built with:
- React 18
- TypeScript
- Vite
- Radix UI
- TailwindCSS
- React Router
# Clone the repository
git clone https://github.com/johnpc/jellyfin-wrapped.git
# Install dependencies
npm install
# Start development server
npm run devnpm run buildnpm run previewTo build with docker, run the following commands
npm run build
docker build -t jellyfin-wrapped .
docker run -p 80:80 \
-e JELLYFIN_SERVER_URL=http://your-jellyfin-server:8096 \
-e JELLYFIN_API_KEY=your-admin-api-key \
jellyfin-wrappedOr, via docker compose:
# Edit docker-compose.yaml to set your environment variables
# Start the service
docker compose up -d
# Stop the service
docker compose down
# Pull latest version
docker compose pullNow the Jellyfin Wrapped ui is available at http://localhost on port 80.
docker build -t jellyfin-wrapped . --no-cache
docker tag jellyfin-wrapped:latest mrorbitman/jellyfin-wrapped:latest
docker push mrorbitman/jellyfin-wrapped:latestContributions are welcome! Please feel free to submit a Pull Request.
This application connects directly to your Jellyfin server and does not store any credentials or personal data on external servers. All data is processed locally in your browser.




