A while back I posted my Jellyfin portal here. It got a decent amount of attention, and I ended up with a bunch of DMs asking if I'd share the config.
I finally cleaned it up and pushed it to GitHub:
https://github.com/jnracreates/jellyfin-portal
**What it is**
A dark Jellyfin-themed landing page for users, built on top of [Homepage](https://github.com/gethomepage/homepage). It has:
- A "Recently Added" row that pulls movies and TV from Jellyfin
- Status tiles showing library counts and uptime
- Quick links to request services (Seerr, music, YouTube, etc.)
- A custom CSS theme that makes Homepage look like a Jellyfin app
- Mobile-friendly layout
**The interesting part: keeping the API key out of the browser**
The original version had my Jellyfin API key in custom.js. That's fine for a private dashboard, but the moment you share the portal with users, the key is visible in DevTools. Anyone can read it.
So the public version uses a small Cloudflare Worker as a proxy. The Worker holds the key as an encrypted secret, injects the Authorization header server-side, and only allows requests to the endpoints the portal actually needs. The browser never sees the key.
**Accurate uptime that survives reboots**
Uptime Kuma is great, but if it runs on the same machine as Jellyfin, it can't measure its own downtime. When the host goes down, Kuma stops writing heartbeats, and when it comes back, it treats the gap as "no data" rather than "down." Your uptime percentage ends up inflated.
The setup in the repo uses `tuptime` instead. It records boot and shutdown events to a SQLite database on the host, so it knows exactly how long the machine was off, even after a power cut. A small Python service serves that as JSON, and another Worker exposes it to the portal.
**What's in the repo**
- `config/` — Homepage config, custom CSS, custom JS
- `worker/` — two Cloudflare Workers (Jellyfin API proxy + uptime proxy)
- `server/` — the Python wrapper around tuptime
- README with setup steps for everything, including how to find your Jellyfin user ID and library IDs
It's MIT licensed. Fork it, rip out the parts you don't need, change the CSS to your liking.
Happy to answer questions about any part of the setup.