Jellyfin Client YAML Configuration Format
This configuration file is used by the Markdown generator to produce the Clients list.
1. clients Section
The clients section lists all Jellyfin-compatible client applications, each with a set of fields describing its details.
Client Fields
| Field | Type | Required | Description |
|---|---|---|---|
name |
String | Yes | The human-readable name of the client. |
targets |
List of strings | Yes | One or more environment/platform keys (e.g., Windows, Android, iOS). These must match target definitions in targets. |
official |
Boolean | No | Indicates whether the client is an official Jellyfin project. Used to display a special badge. Defaults to true if its oss URL is within the jellyfin org. |
beta |
Boolean | No | Whether the client is currently in beta. Used to display a special badge if set. |
website |
String | No | An alternative or official website URL for the client. If not provided, the generator uses the oss URL in tables. |
oss (yaml key: oss) |
String | No | The open-source repository URL for the client, if applicable (e.g., GitHub, GitLab, etc.). |
price |
Price (see below) | No | Indicates cost details (free, paid). Defaults to free if oss is present. |
downloads |
List of Download items | Yes | A list describing where or how to download the client. Each item has a type to determine the resulting Markdown link or badge. |
types |
List of strings | No | A list of additional categories or features that apply to this client (e.g., Music, Reader, etc.). |
1.1 price Structure
The price object describes whether the client is free, paid, or both:
price:
free: true
paid: true
| Field | Type | Required | Description |
|---|---|---|---|
free |
Boolean | No | Whether the client is free. Defaults to true if oss is present. |
paid |
Boolean | No | Whether there is a paid version of the client. Setting both free and paid to true indicates a freemium or optional purchase model. |
1.2 downloads List
Each item in downloads describes a button/badge/link for where to get the client. The generator has multiple type handlers, each producing a specific style of link or shield badge.
Each Download object has a type key (required) to determine which of the generator’s “renderer” structs to use:
type Value |
Additional Fields | Purpose / Example Output |
|---|---|---|
icon |
icon, url |
Renders an icon from assets/clients/icons/<icon>.png linked to url. Not typically used if you want dynamic badges like shield.io, but can embed a static icon. |
text |
text, url |
Renders a simple text link with [text](url) format. |
github |
owner, repo, optional url |
Renders a GitHub total downloads badge (). Defaults the link to GitHub releases unless url is provided. |
flathub |
package, optional url |
Renders a Flathub downloads badge for a specific Flatpak package. |
docker |
user, repo, optional url |
Renders a Docker Hub pulls badge. |
shield |
label, content, icon, color, url |
Builds a custom shield.io badge. All fields except url are optional, letting you control label text, icon, color, etc. |
gitlab |
owner, repo, optional url |
Renders a GitLab badge that reuses the shield logic under the hood, with a default GitLab logo. |
demo |
url |
Renders a “Demo” button shield linking to the url. |
app-store |
id, optional url |
Renders an App Store shield linking to https://apps.apple.com/app/id<id> by default. |
google-play |
id, optional url |
Renders a Google Play shield linking to https://play.google.com/store/apps/details?id=<id> by default. |
Important
If a particular
typekey is unknown, the generator will fail with an error (“unknown download type”).
Below is an example downloads list for a single client:
downloads:
- type: github
owner: jellyfin
repo: jellyfin-media-player
- type: flathub
package: com.github.iwalton3.jellyfin-media-player
Example Client
Below is a real-world example from the clients.yaml:
- name: "Swiftfin"
targets: [ iOS, AppleTV ]
oss: https://github.com/jellyfin/swiftfin
official: true
beta: true
downloads:
- type: app-store
id: "1604098728"
Here:
- It’s official, in beta, open-sourced on GitHub.
- It supports
iOSandAppleTV. - There’s a single download link, an App Store badge, referencing the app ID
1604098728.
2. targets Section
The targets section defines logical groupings (e.g. Desktop, Mobile, TV, Browser) and the individual “sub-targets” that belong within each group.
Goal: Let the generator know how to categorize your clients by environment. When it outputs the final Markdown, it will list clients under these group headings.
targets:
- key: Browser
display: "🌎 Browser-Based"
has:
- name: Browser
mapped: Browser
- key: Desktop
display: "💻 Desktop"
has:
- name: Windows
mapped: Windows
- name: macOS
mapped: "macOS"
- name: Linux
mapped: "Linux"
...
Target Group Fields
| Field | Type | Required | Description |
|---|---|---|---|
key |
String | Yes | The internal, high-level identifier (e.g., Desktop, Mobile). |
display |
String | Yes | The heading text shown in the output (can include emoji). |
has |
List of Target |
Yes | The specific target environment entries inside this group. |
Target Definition
Each item in has:
| Field | Type | Required | Description |
|---|---|---|---|
name |
String | Yes | The exact name used under a client’s targets array (e.g. Windows). |
mapped |
String | Yes | A human-friendly name used in the rendered Markdown heading. |
Example
If a client has"targets: [ Windows ]", the generator will place that client in the table under theDesktopgroup →Windowssubheading, if you have:
- key: Desktop
display: "💻 Desktop"
has:
- name: Windows
mapped: "Windows"
3. types Section
The types section describes extra categories (like Music, Reader, etc.) that you can assign to clients.
Each type can optionally be displayed in a separate “By Type” section. If section: true, the generator will build an additional heading and table for all clients matching that types key.
Each type can also define a badge—the generator uses this to add a mini badge next to the client name or in a type legend.
types:
- key: Official
badge: "🔹"
- key: Beta
badge: "⚒️"
- key: Music
badge: "🎵"
display: "Music Client"
section: true
- key: Reader
badge: "📖"
display: "Reader"
section: true
ClientType Fields
| Field | Type | Required | Description |
|---|---|---|---|
key |
String | Yes | A unique identifier for this type (must match anything placed in a client’s types list). |
badge |
String | No | An emoji or short text snippet for the generated badge. |
display |
String | No | A custom heading to display. Falls back to key if not provided. |
section |
Bool | No | If true, the generator creates a “By Type” section for this category. |
Note
OfficialandBetaare special keys in the code. They are used to produce extra badges if a client hasofficial: trueorbeta: true. They also appear in the final “legend” of recognized badges.
4. How the Generator Uses the YAML
-
Read Clients
The generator loads each client’s data, determining defaults forofficial(ifossis under GitHub’sjellyfin/) andprice.free(true ifossis set). -
Group by Environment
The generator builds a table for each environment (thetargetsgroups).- A top-level heading for the group (e.g., “🌎 Browser-Based”).
- Subheadings for each item in
has. - Lists the clients that match
target: [subheading name]in a table.
-
Sort Clients by Name
Each environment’s table is sorted alphabetically by client name. -
Generate Type Sections
For eachClientTypewithsection: true, the generator creates a new table grouping. Again, it sorts by name and places those matching clients. -
Add a Badge Legend
Finally, the generator includes a list of recognized badges from alltypes—displaying thekey(ordisplay) plus thebadgein a simple list.
5. Adding or Modifying Entries
To add a new client:
- Add a YAML object under
clients. - Specify at least
name,targets, anddownloads. - (Optionally) Set
oss,website,official,beta,price, ortypesas needed. - If the client’s
targetsincludes a new platform not intargets, you must also define it undertargets→ a new or existing group.
To add new categories:
- Add an entry to
typeswith akeymatching the desired category name in a client’stypeslist. - (Optionally) add a
badgeor setsection: trueto generate a new “By Type” section in the Markdown.
To add new downloads:
- In the
downloadsarray for the client, add another item with a supportedtype. - Provide the necessary fields for that
type(e.g.,owner,repoforgithub).
6. Full Example
Below is a trimmed excerpt from the actual clients.yaml to illustrate the structure. Notice how multiple clients are listed, each with a variety of download entries:
clients:
- name: "Jellyfin Media Player"
targets: [ Windows, Linux, macOS ]
oss: https://github.com/jellyfin/jellyfin-media-player
official: true
downloads:
- type: github
owner: jellyfin
repo: jellyfin-media-player
- type: flathub
package: com.github.iwalton3.jellyfin-media-player
- name: "Swiftfin"
targets: [ iOS, AppleTV ]
oss: https://github.com/jellyfin/swiftfin
official: true
beta: true
downloads:
- type: app-store
id: "1604098728"
targets:
- key: Browser
display: "🌎 Browser-Based"
has:
- name: Browser
mapped: Browser
- key: Desktop
display: "💻 Desktop"
has:
- name: Windows
mapped: Windows
- name: Linux
mapped: Linux
- name: macOS
mapped: macOS
types:
- key: Official
badge: "🔹"
- key: Beta
badge: "⚒️"
- key: Music
badge: "🎵"
display: "Music Client"
section: true
When run through the Markdown generator, the result includes sections by environment (Desktop, Browser, etc.), and a “By Type” section for “Music Client” if any client sets types: [ Music ].