Feishin — a modern self-hosted music player web UI for Jellyfin, Navidrome or any Subsonic-compatible server. Deployed as a single host-networked Nomad service; settings live in the browser so the container is stateless.
Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.
Source ↗ Project ↗ ★ 10.1k ⚑ Report an issue
Save as values.hcl, edit, then run:
# The name of the Nomad job.
job_name = "feishin"
# The Nomad namespace to deploy into.
namespace = "default"
# The datacenters to deploy to.
datacenters = ["*"]
# The Feishin container image. Pin a tag in production.
image = "ghcr.io/jeffvli/feishin:latest"
# Host port for the Feishin web UI.
port = 9180
# Number of instances to run (the app is stateless — settings live in the browser).
count = 1
# Pre-select the backend type: jellyfin, navidrome or subsonic. Leave blank to choose in the UI.
server_type = ""
# Pre-fill the backend server URL (e.g. http://127.0.0.1:4533). Leave blank to set it in the UI.
server_url = ""
# If "true", lock the server settings so users can't change them in the UI.
server_lock = "false"
# Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []
# Resources for the Feishin task.
resources = {
cpu = 200
memory = 128
}
| Name | Type | Default | Description |
|---|---|---|---|
| job_name | string | "feishin" | The name of the Nomad job. |
| namespace | string | "default" | The Nomad namespace to deploy into. |
| datacenters | list | ["*"] | The datacenters to deploy to. |
| image | string | "ghcr.io/jeffvli/feishin:latest" | The Feishin container image. Pin a tag in production. |
| port | number | 9180 | Host port for the Feishin web UI. |
| count | number | 1 | Number of instances to run (the app is stateless — settings live in the browser). |
| server_type | string | "" | Pre-select the backend type: jellyfin, navidrome or subsonic. Leave blank to choose in the UI. |
| server_url | string | "" | Pre-fill the backend server URL (e.g. http://127.0.0.1:4533). Leave blank to set it in the UI. |
| server_lock | string | "false" | If "true", lock the server settings so users can't change them in the UI. |
| constraints | list | [] | Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true". |
| resources | object | {
cpu = 200
memory = 128
} | Resources for the Feishin task. |
No variables match.
Feishin is a modern self-hosted music player web UI for Jellyfin, Navidrome or any Subsonic-compatible server.
This pack runs Feishin as a single host-networked Nomad job. It's a front-end only — it streams from your existing music server; settings (including the server you connect to) are stored in the browser, so the container is stateless (no database, no volumes).
nomad-pack run feishin --registry=nomploy
Then open http://<node-ip>:9180 and add your music server, or pre-fill it with
server_type + server_url.
| Variable | Default | Notes |
|---|---|---|
port |
9180 |
Web UI host port |
server_type |
(blank) | jellyfin, navidrome or subsonic |
server_url |
(blank) | Backend server URL to pre-fill |
server_lock |
false |
true locks the server settings in the UI |
count |
1 |
Instances (stateless — scale freely) |
Since Feishin is just a client, pair it with a music server pack (Navidrome, Jellyfin) and point it at that server.