This commit is contained in:
2026-05-21 00:34:12 +03:00
parent 18e864cf9d
commit 422c03a82c
+82 -44
View File
@@ -4,12 +4,12 @@
**A desktop media client for Jellyfin that actually feels good to use.**
Built for people who own their own servers. No accounts, no subscriptions, no telemetry, no gatekeepers between you and your library.
Built for people who run their own servers. No cloud, no accounts, no subscriptions, no gatekeepers between you and your library.
<br>
<img src="https://img.shields.io/badge/version-0.1.0-6B8AFF?style=flat-square&labelColor=282C33" alt="Version">
<img src="https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-6B8AFF?style=flat-square&labelColor=282C33" alt="Platform">
<img src="https://img.shields.io/badge/platform-Windows-6B8AFF?style=flat-square&labelColor=282C33" alt="Platform">
<img src="https://img.shields.io/badge/React-19-61DAFB?style=flat-square&logo=react&logoColor=white" alt="React">
<img src="https://img.shields.io/badge/Tauri-v2-24C8D8?style=flat-square&logo=tauri&logoColor=white" alt="Tauri">
<img src="https://img.shields.io/badge/license-CC0_Public_Domain-6B8AFF?style=flat-square&labelColor=282C33" alt="License">
@@ -18,59 +18,99 @@ Built for people who own their own servers. No accounts, no subscriptions, no te
<br>
## Why Jellybloom?
## 🏴 Why Jellybloom?
You already run a Jellyfin server. You already own the media. So why does using it still feel like navigating a web app designed by committee?
Jellybloom is a complete reimagining of the media client experience. It is not a reskin of jellyfin-web and it is not a fork. It is a ground-up desktop application that talks directly to your Jellyfin server and makes browsing, discovering, and watching actually pleasant. Fast, dense, responsive, and fully under your control.
Jellybloom is a ground-up desktop client for Windows. It talks directly to your Jellyfin server and makes browsing, discovering, and watching actually pleasant. Fast, dense, responsive, and fully under your control.
No cloud dependencies. No data collection. No feature gates. No one profits from your watch history except you.
<br>
## What it does
## What it does
### Browse your library
### 📺 Browse
The home page is built from shelves you can curate yourself, or you can let the app suggest rows based on what you actually watch. The poster grid uses virtualized scrolling so it stays smooth even with thousands of items. A right-click on any poster opens a quick-look modal so you can peek at details without losing your scroll position. A notification bell in the header tracks new episodes and movies, deduplicated by series so a full-season drop does not flood the list.
- **Home shelves** — curate your own rows or let the app suggest based on what you watch
- **Virtualized poster grid** — smooth scrolling with thousands of items
- **Unified fuzzy search** — titles, people, collections. Saved searches stick around
- **Quick look** — right-click any poster for a peek without losing your scroll position
- **Notification bell** — new episodes and movies, deduplicated by series so a full-season drop does not flood you
Search is fuzzy and unified across titles, people, and collections. Saved searches stick around if you find yourself looking for the same things repeatedly.
### 🎬 The player
### Watch in a player that cares
- **Native subtitle rendering** — ASS/SSA via libass-wasm, plus SRT, VTT, and plain text
- **Subtitle search** — find and download from OpenSubtitles without leaving the player
- **Subtitle styling** — size, font, outline, color, background opacity, positioning
- **Bookmarks** — drop a pin with a note, shown as dots on the scrubber
- **A-B loop** — for study, reference, or that one perfect joke
- **Chapters and trickplay thumbnails** — jump around, hover the scrubber to see where you are
- **Speed control** — 0.5x to 3x
- **Picture filter** — brightness, contrast, saturation, hue, gamma for bad encodes
- **Audio graph** — compressor and parametric EQ for quiet or loud mixes
- **Audio passthrough** — let your receiver handle decoding
- **Quality and track menus** — switch streams on the fly
- **Resume prompt** — asks first so you do not spoil the cold open
- **End card** — next episode or related title as the credits roll
- **Mini player** — pop out to a floating window
- **Sleep timer** — fades out after your chosen duration
- **"Still watching?"** — gently checks in after a few episodes
- **Downloads** — save for offline playback
- **Cast** — send to another Jellyfin session on your network
- **SyncPlay** — watch together with friends, playback stays locked
- **Trakt.tv scrobbling** — optional, device-code auth, no redirects
- **Customizable keyboard shortcuts** — rebind everything
The player is built on Vidstack with hls.js, and the entire chrome layer is custom. Subtitles get special attention: ASS and SSA render natively through libass-wasm so styled fansubs look exactly as intended. SRT, WebVTT, and plain text work too. You can search OpenSubtitles from inside the player, adjust size, font, outline, color, background opacity, and positioning.
### 📄 Detail pages
Playback features include bookmarks with notes, A-B looping, chapter navigation, trickplay thumbnails on the scrubber, speed control from 0.5x to 3x, a picture filter for badly-encoded sources, and an audio graph with a compressor and parametric EQ. Audio passthrough lets your receiver handle decoding when it can. A quality menu switches streams on the fly. The resume prompt picks up where you left off but asks first so you do not spoil a cold open.
- **Hero** — backdrop, poster, logo overlay, ratings, action buttons
- **Cast and crew** — clickable filmographies with in-library matches highlighted
- **Composer block** — because the score matters
- **Awards** — from Wikidata
- **Filming locations** — mapped with Leaflet
- **Reception** — aggregates IMDb, TMDB, Rotten Tomatoes, Metacritic, and your own ratings
- **Reviews, trailers, trivia, tech specs** — from TMDB, YouTube, Wikipedia
- **Collection strip** — franchise entries
- **Series status** — air days, next episode, season count, production state
- **Anime filler detection** — flags filler and mixed-canon episodes
- **Versions selector** — pick between multiple files for one title
- **Watch timeline** — your personal history from the diary
- **Personal section** — your ratings, rewatch counts, notes. Stays local
- **Diary** — log watches with date, rating, rewatch flag. Export to Markdown, JSON, or Letterboxd CSV
- **Request button** — ask Radarr or Sonarr for missing titles without leaving the page
The end card shows the next episode or a related title as the credits roll. The mini player pops out to a small floating window. A sleep timer fades out after your chosen duration. A "still watching?" prompt gently checks in after a few episodes so your stats do not run away from you. Downloads save movies and episodes for offline playback via blob URLs. Cast sends playback to another Jellyfin session on your network. SyncPlay lets you watch together with friends by joining or creating a group that locks playback state.
### 🔭 Discover
Trakt.tv scrobbling is optional and uses device-code auth — no browser redirects, no OAuth callbacks. Every keyboard action can be rebound from settings.
Find things you do not already own. Needs a free TMDB API key.
### Rich detail pages
- **Tonight hero** — personalized spotlight based on your top genre
- **Spotlight hero** — trending pick of the day
- **Mood chips** — ten vibes that resolve to a filtered row
- **Roulette** — spin for a random highly-rated title
- **Decade strips** — the 90s, the 80s, etc.
- **Canonical lists** — top rated, cult classics, upcoming
- **On this day** — titles that premiered today
- **Library gap finder** — highest-rated missing titles in genres you already watch
- **Browse grid** — by genre, language, studio, network. Inline expansion
- **Advanced filters** — year range, rating, vote count, sort order
Every title gets a detail page that pulls from multiple sources. The hero shows a backdrop, poster, and logo overlay from Jellyfin or TMDB, plus rating badges and action buttons. Cast and crew are clickable, with in-library matches highlighted in a person's filmography. The composer gets their own block. Awards come from Wikidata. Filming locations are mapped with Leaflet.
### 👤 Profile and stats
Reception aggregates every available rating source: IMDb, TMDB, Rotten Tomatoes, Metacritic, plus your own. Reviews come from TMDB. Videos include trailers and clips from YouTube. Trivia comes from Wikipedia. Tech specs show codec, container, resolution, HDR format, and audio channels, with badge icons for Dolby Vision, Atmos, DTS:X, and others. The collection strip shows franchise entries. Series status shows air days, next episode, season count, and production state.
- Watch streak, genre breakdown, year-in-review
- Personally top-rated titles, recent diary entries
Anime filler detection flags filler and mixed-canon episodes based on a bundled dataset. If you have multiple versions of a file, a selector lets you pick. The watch timeline draws from your diary. The personal section keeps your ratings, rewatch counts, and notes local. The diary lets you log watches with a date, rating, and rewatch flag, and export to Markdown, JSON, or Letterboxd CSV.
### ⚙️ Settings
### Discover what you do not have
The Discover page finds things you do not already own. It needs a free TMDB API key and respects your region and adult-content preference. There is a personalized spotlight based on your top genre, a trending pick, mood chips that resolve to filtered rows, a roulette for random highly-rated titles, decade strips, canonical lists, an "on this day" feature, and a library gap finder that shows the highest-rated missing titles in genres you already watch.
You can browse by genre, language, studio, or network with inline expansion on each tile, or use advanced filters for year range, rating, vote count, and sort order.
### Profile and stats
The profile page tracks your watch streak, genre breakdown, year-in-review summary, personally top-rated titles, and recent diary entries.
### Settings
The settings page covers server connection with support for multiple servers and a live dashboard, playback defaults, audio and subtitle preferences, display options including density, accent color, UI scale, and reduced motion, home page row toggles, detail page section toggles, episode defaults, discovery preferences, TMDB and Fanart.tv keys, Trakt.tv connection, Sonarr and Radarr configuration with multiple instances and override rules, personal data management, privacy controls, and full keyboard shortcut rebinding.
- Multiple Jellyfin servers with live dashboard
- Playback, audio, subtitle, and display preferences
- Home page and detail page section toggles
- TMDB, Fanart.tv, Trakt.tv, Sonarr, Radarr configuration
- Personal data management, privacy controls, full keyboard rebinds
<br>
## Accessibility
## Accessibility
Jellybloom targets WCAG 2.2 AAA conformance because a media client that only works for some people is not really a media client.
@@ -86,13 +126,15 @@ Jellybloom targets WCAG 2.2 AAA conformance because a media client that only wor
<br>
## Getting started
## 📦 Getting started
### Prerequisites
- Windows 10 or later
- WebView2 Runtime (pre-installed on Windows 10/11)
- Node.js 18+
- Rust (latest stable)
- Tauri v2 prerequisites for your platform
- Tauri v2 prerequisites
### Development
@@ -103,19 +145,15 @@ npm install
```
```bash
# Browser dev server
npm run dev
# Desktop dev
npm run tauri:dev
# Production build
npm run tauri:build
npm run dev # browser dev
npm run tauri:dev # desktop dev
npm run build # production web build
npm run tauri:build # production desktop build
```
<br>
## Technology stack
## 🔧 Technology stack
| | Layer | Technology |
|:--|:--|:--|
@@ -134,7 +172,7 @@ npm run tauri:build
<br>
## Project structure
## 🗂️ Project structure
```
jellybloom/
@@ -158,7 +196,7 @@ jellybloom/
<br>
## License
## 📜 License
Dedicated to the public domain under [CC0 1.0 Universal](LICENSE).