Repository navigation
Releases: deadfin-org/deadfin
Release list
v0.3.1
Security
- The toolchain is Go 1.26.10. It fixes GO-2026-6809 in
crypto/x509,
which the HTTPS server reaches through certificate verification.
Image
docker pull ghcr.io/deadfin-org/deadfin:v0.3.1
docker pull ghcr.io/deadfin-org/deadfin@sha256:9d80d78be2177073aa7906aa6535411112589588542e4c7848dd6f5895dffb2fPlatforms: linux/amd64, linux/arm64. See docs/alpha to install.
Verify
The image carries a build provenance attestation and an SPDX SBOM attestation for each architecture. The SBOMs are attached to this release.
gh attestation verify oci://ghcr.io/deadfin-org/deadfin@sha256:9d80d78be2177073aa7906aa6535411112589588542e4c7848dd6f5895dffb2f --repo deadfin-org/deadfinv0.3.0
v0.3.0 is the first public alpha of Deadfin.
Highlights
- The image includes deadfin-web. Deadfin serves the bundled web client
(v0.3.0-rc.4) at/web/with no extra download. To use jellyfin-web
instead, put its files in./deadfin/weband mount that directory at
/var/lib/deadfin/web; a<data root>/webwith anindex.htmlreplaces
the bundled client. An existing./deadfin/webmount keeps working and
keeps its own files: remove the mount to use the bundled deadfin-web. - Audio and subtitle choice carries to the next episode (D-36). When you
pick a language or a subtitle track in one episode, the next episode of the
same series starts with the matching tracks. Subtitles off also carries. - Anime search finds every title (D-48). Search matches the English,
romaji, native and alias titles from AniList and AniDB, with a kana/romaji
fold. "Shingeki" and "進撃" both find "Attack on Titan". - PostgreSQL support. SQLite stays the default. Set
DEADFIN_DATABASE_URL(or--database-url) to apostgres://URL to run
on PostgreSQL. See docs/alpha/install.md. - Security fixes from the release-candidate review: sign-out revokes the
token, video attachments are scoped to the user, the image downloader
refuses special-purpose address ranges, and the toolchain is Go 1.26.9.
Added
CHANGELOG.md. Each GitHub Release body comes from its section here.- Release images carry a build provenance attestation and an SPDX SBOM for
each architecture. The SBOMs are attached to the GitHub Release. - The
:alphaimage tag. It follows the newest release or release
candidate. The:latesttag follows the newest release (no-rc.N), so
v0.3.0 publishes it first. - Person pages show a biography, birth date, death date and birthplace from
TMDb. Opening a person without metadata fetches it, and the "Refresh
People" scheduled task fetches it for every person not yet refreshed
(D-74). Cast and crew keep their TMDb person ID. This needs a TMDb API
key (D-11). - The integrations guide: connect Seerr, Sonarr, Radarr and Bazarr beside
Jellyfin and after the cutover, with a script that moves Seerr users to
their Deadfin IDs. See
docs/alpha/integrations.md.
Changed
- The startup log names the web client in use: its directory, the source
(data rootorbundled) and the version from itsbuild.json. - The quick start and the install guide put TMDb API key setup first.
DEADFIN_DATA_DIRsets the data root.JELLYFIN_DATA_DIRstays as the
fallback. The image sets its default,/var/lib/deadfin, inJELLYFIN_DATA_DIR,
so a deployment that sets either variable overrides it. Deadfin
logs a warning for each setJELLYFIN_CONFIG_DIR,JELLYFIN_CACHE_DIR,
JELLYFIN_LOG_DIRorJELLYFIN_WEB_DIR.
Security
POST /Sessions/CapabilitiesandPOST /Sessions/Capabilities/Full
refuse another user's session ID from a non-administrator caller (D-67)./web/responses sendReferrer-Policy: no-referrerand
X-Content-Type-Options: nosniff. When the served client is deadfin-web,
they also send a restrictiveContent-Security-Policywith
frame-ancestors 'none'(D-68).- The one-time setup cookie is
Securewhen aKnownProxiespeer reports
HTTPS inX-Forwarded-Proto. Behind a TLS-terminating proxy, list the
proxy inKnownProxiesbefore first start (D-53).
Fixed
- A MusicBrainz timeout or rate-limit wait no longer fails the whole artist
folder. When a remote metadata provider's own request deadline expires, the
item keeps its stored metadata, the scan logs oneremote metadata provider failedwarning, and the folder staysok. A cancelled scan still stops
(D-107, #749; regression of #367). - A music album carries the artists of its songs, as upstream does:
AlbumArtist,AlbumArtists,ArtistsandArtistItems. The album
artists of most songs come first. Before, no album had an album artist, so
clients showed none on album tiles (#739). An album scanned before this
change gets its artists on the next library scan (D-110). A locked album
keeps its values. - Refresh Metadata saves provider IDs and images for every library root
again. A cast member, studio, or genre whose name differs only in case from
the stored one (StarzandSTARZ) has the same item ID but a different
path, and the refresh failed the whole folder withpath mismatch; for a
library root, nothing was saved. The refresh now keeps the stored person,
studio, or genre path, as upstream does. A stale row of a removed
case-variant folder no longer fails its surviving sibling with
parent mismatch: the refresh moves it under the scanned folder, as an
ordinary scan does (#748). - A music track whose file carries an embedded cover (an attached picture,
as FLAC and MP3 files often do) gets that cover as its Primary image, and
an album without a cover file takes the Primary image of its first track.
Before, the embedded cover was never extracted, so an album without a
folder.jpghad no image (#784, D-108). - A library scan gives a music track that has no Primary image its embedded
cover, also when the file did not change. Before, a track scanned before
#784 got its cover only on a full image refresh, so the album stayed
without a cover after an upgrade (#804, D-117). - A refresh with
ReplaceAllImageskeeps a stored image that no provider
replaces, as upstream does. Before, it removed every stored image, so an
album with a remote cover and no other source lost its cover (#804). GET /Items/{itemId}/RemoteImageslists TheAudioDB for a music album
(Primary, Disc) by its MusicBrainz release-group ID, and for a music
artist (Primary, Logo, Banner, Backdrop) by its MusicBrainz artist ID, as
upstreamAudioDbAlbumImageProviderandAudioDbArtistImageProviderdo.
Before, no remote image provider supported music items, so a cover could
not be picked in the image editor. TheAudioDB needsAUDIODB_API_KEY
(D-11) (#807).- A library scan follows symbolic links, as upstream does. A linked media
file or a linked directory, also one outside the library root, enters the
library under the link path; before, the scan left every link out. A
dangling link is skipped with a warning. A directory link to the directory
that holds it or to one of its ancestors is skipped with a warning (D-86).
A file link's snapshot now carries the facts of its target, so playback and
probing check the target file. - Every artist named in an
ARTISToralbum_artisttag gets a MusicArtist
item after a library scan, as upstreamArtistsValidatordoes. Before,
only artist folders made artists, so/Artistsand/Artists/AlbumArtists
left out featured artists and album artists without a folder (#739). An
artist folder serves its own name. An artist that no track names any more
is deleted on the next scan, unless it is locked. - The library scan logs a folder failure when the folder fails. Before, the
scanner folderlines came only after the whole scan ended, so a scan that
stalled logged no failure at all (#702). - A library scan keeps a folder that holds two names that differ only in
case, such asLiveandliveon a case-sensitive NFS or ZFS share. Both
names gave the same item ID, and the whole folder failed on every scan: an
artist's discography, a season, or at the library root the whole library
stayed missing. The scan now keeps the first name in ordinal order and logs
the other as skipped (D-85). A directory entry whose file status cannot be
read is skipped with a warning; before, one such entry failed the listing
of its whole directory (#702). - A multi-disc album is one album, as in Jellyfin. An album folder whose
tracks are in disc folders (CD 01,Disc 1,Digital Media 01, and the
other Jellyfin disc names) is the MusicAlbum, its parent folder is the
artist, and the disc folders are plain folders. The album lists the tracks
of every disc, its track count includes every disc, and each track shows
the album. Before, each disc folder was an album named after the folder,
with no album artist. A library scan replaces those albums (#703). - The library scan ignores Jellyfin trickplay directories, as Jellyfin does.
With "save trickplay with media" on, Jellyfin writes a
<video>.trickplay/directory next to each video. Deadfin indexed these
directories and their tile directories as Folder items that showed in
browse and search. The next scan removes Folder items that an earlier scan
made for them (#704). - The library scan ignores Synology and QNAP system directories, as
Jellyfin does:@eaDir,eaDir,#recycle,@Recycle,.@__thumb,
$RECYCLE.BIN,System Volume Informationand.grab. On a Synology
share, Deadfin indexed the@eaDirthumbnail directories as items, and an
@eaDirat the root of a Shows library became a series named "@eadir". - HLS copies a Dolby Vision profile 7 (dual-layer) HEVC stream as HDR10 for a
client that listsHDR10but notDOVIWithELin its range types. The copy
removes the RPU and the enhancement layer withhevc_metadata=remove_dovi
(ordovi_rpu=strip) and the master playlist offers anhvc1variant with
VIDEO-RANGE=PQ, as upstream does. Before, such a client got a 4K SDR
H.264 tone-mapped transcode. Startup probes which removal filters ffmpeg
has. The same port strips HDR10+ from a profile 8.1 HDR10+ copy for a
Dolby Vision client, and Dolby Vision from an invalid configuration (#586,
D-84). import-jellyfinreads a Jellyfin database in WAL mode from the read-only
/importmount that the import guide uses. The importer opens the stopped
copy immutable, so SQLite creates nojellyfin.db-shmnext to it. A
non-emptyjellyfin.db-walstops the import with a message to stop
Jellyfin and c...
v0.3.0-rc.20
v0.3.0 is the first public alpha of Deadfin.
Highlights
- The image includes deadfin-web. Deadfin serves the bundled web client
(v0.3.0-rc.4) at/web/with no extra download. To use jellyfin-web
instead, put its files in./deadfin/weband mount that directory at
/var/lib/deadfin/web; a<data root>/webwith anindex.htmlreplaces
the bundled client. An existing./deadfin/webmount keeps working and
keeps its own files: remove the mount to use the bundled deadfin-web. - Audio and subtitle choice carries to the next episode (D-36). When you
pick a language or a subtitle track in one episode, the next episode of the
same series starts with the matching tracks. Subtitles off also carries. - Anime search finds every title (D-48). Search matches the English,
romaji, native and alias titles from AniList and AniDB, with a kana/romaji
fold. "Shingeki" and "進撃" both find "Attack on Titan". - PostgreSQL support. SQLite stays the default. Set
DEADFIN_DATABASE_URL(or--database-url) to apostgres://URL to run
on PostgreSQL. See docs/alpha/install.md. - Security fixes from the release-candidate review: sign-out revokes the
token, video attachments are scoped to the user, the image downloader
refuses special-purpose address ranges, and the toolchain is Go 1.26.9.
Added
CHANGELOG.md. Each GitHub Release body comes from its section here.- Release images carry a build provenance attestation and an SPDX SBOM for
each architecture. The SBOMs are attached to the GitHub Release. - The
:alphaimage tag. It follows the newest release or release
candidate. The:latesttag follows the newest release (no-rc.N), so
v0.3.0 publishes it first. - Person pages show a biography, birth date, death date and birthplace from
TMDb. Opening a person without metadata fetches it, and the "Refresh
People" scheduled task fetches it for every person not yet refreshed
(D-74). Cast and crew keep their TMDb person ID. This needs a TMDb API
key (D-11). - The integrations guide: connect Seerr, Sonarr, Radarr and Bazarr beside
Jellyfin and after the cutover, with a script that moves Seerr users to
their Deadfin IDs. See
docs/alpha/integrations.md.
Changed
- The startup log names the web client in use: its directory, the source
(data rootorbundled) and the version from itsbuild.json. - The quick start and the install guide put TMDb API key setup first.
DEADFIN_DATA_DIRsets the data root.JELLYFIN_DATA_DIRstays as the
fallback. The image sets its default,/var/lib/deadfin, inJELLYFIN_DATA_DIR,
so a deployment that sets either variable overrides it. Deadfin
logs a warning for each setJELLYFIN_CONFIG_DIR,JELLYFIN_CACHE_DIR,
JELLYFIN_LOG_DIRorJELLYFIN_WEB_DIR.
Security
POST /Sessions/CapabilitiesandPOST /Sessions/Capabilities/Full
refuse another user's session ID from a non-administrator caller (D-67)./web/responses sendReferrer-Policy: no-referrerand
X-Content-Type-Options: nosniff. When the served client is deadfin-web,
they also send a restrictiveContent-Security-Policywith
frame-ancestors 'none'(D-68).- The one-time setup cookie is
Securewhen aKnownProxiespeer reports
HTTPS inX-Forwarded-Proto. Behind a TLS-terminating proxy, list the
proxy inKnownProxiesbefore first start (D-53).
Fixed
- A MusicBrainz timeout or rate-limit wait no longer fails the whole artist
folder. When a remote metadata provider's own request deadline expires, the
item keeps its stored metadata, the scan logs oneremote metadata provider failedwarning, and the folder staysok. A cancelled scan still stops
(D-107, #749; regression of #367). - A music album carries the artists of its songs, as upstream does:
AlbumArtist,AlbumArtists,ArtistsandArtistItems. The album
artists of most songs come first. Before, no album had an album artist, so
clients showed none on album tiles (#739). An album scanned before this
change gets its artists on the next library scan (D-110). A locked album
keeps its values. - Refresh Metadata saves provider IDs and images for every library root
again. A cast member, studio, or genre whose name differs only in case from
the stored one (StarzandSTARZ) has the same item ID but a different
path, and the refresh failed the whole folder withpath mismatch; for a
library root, nothing was saved. The refresh now keeps the stored person,
studio, or genre path, as upstream does. A stale row of a removed
case-variant folder no longer fails its surviving sibling with
parent mismatch: the refresh moves it under the scanned folder, as an
ordinary scan does (#748). - A music track whose file carries an embedded cover (an attached picture,
as FLAC and MP3 files often do) gets that cover as its Primary image, and
an album without a cover file takes the Primary image of its first track.
Before, the embedded cover was never extracted, so an album without a
folder.jpghad no image (#784, D-108). - A library scan gives a music track that has no Primary image its embedded
cover, also when the file did not change. Before, a track scanned before
#784 got its cover only on a full image refresh, so the album stayed
without a cover after an upgrade (#804, D-117). - A refresh with
ReplaceAllImageskeeps a stored image that no provider
replaces, as upstream does. Before, it removed every stored image, so an
album with a remote cover and no other source lost its cover (#804). GET /Items/{itemId}/RemoteImageslists TheAudioDB for a music album
(Primary, Disc) by its MusicBrainz release-group ID, and for a music
artist (Primary, Logo, Banner, Backdrop) by its MusicBrainz artist ID, as
upstreamAudioDbAlbumImageProviderandAudioDbArtistImageProviderdo.
Before, no remote image provider supported music items, so a cover could
not be picked in the image editor. TheAudioDB needsAUDIODB_API_KEY
(D-11) (#807).- A library scan follows symbolic links, as upstream does. A linked media
file or a linked directory, also one outside the library root, enters the
library under the link path; before, the scan left every link out. A
dangling link is skipped with a warning. A directory link to the directory
that holds it or to one of its ancestors is skipped with a warning (D-86).
A file link's snapshot now carries the facts of its target, so playback and
probing check the target file. - Every artist named in an
ARTISToralbum_artisttag gets a MusicArtist
item after a library scan, as upstreamArtistsValidatordoes. Before,
only artist folders made artists, so/Artistsand/Artists/AlbumArtists
left out featured artists and album artists without a folder (#739). An
artist folder serves its own name. An artist that no track names any more
is deleted on the next scan, unless it is locked. - The library scan logs a folder failure when the folder fails. Before, the
scanner folderlines came only after the whole scan ended, so a scan that
stalled logged no failure at all (#702). - A library scan keeps a folder that holds two names that differ only in
case, such asLiveandliveon a case-sensitive NFS or ZFS share. Both
names gave the same item ID, and the whole folder failed on every scan: an
artist's discography, a season, or at the library root the whole library
stayed missing. The scan now keeps the first name in ordinal order and logs
the other as skipped (D-85). A directory entry whose file status cannot be
read is skipped with a warning; before, one such entry failed the listing
of its whole directory (#702). - A multi-disc album is one album, as in Jellyfin. An album folder whose
tracks are in disc folders (CD 01,Disc 1,Digital Media 01, and the
other Jellyfin disc names) is the MusicAlbum, its parent folder is the
artist, and the disc folders are plain folders. The album lists the tracks
of every disc, its track count includes every disc, and each track shows
the album. Before, each disc folder was an album named after the folder,
with no album artist. A library scan replaces those albums (#703). - The library scan ignores Jellyfin trickplay directories, as Jellyfin does.
With "save trickplay with media" on, Jellyfin writes a
<video>.trickplay/directory next to each video. Deadfin indexed these
directories and their tile directories as Folder items that showed in
browse and search. The next scan removes Folder items that an earlier scan
made for them (#704). - The library scan ignores Synology and QNAP system directories, as
Jellyfin does:@eaDir,eaDir,#recycle,@Recycle,.@__thumb,
$RECYCLE.BIN,System Volume Informationand.grab. On a Synology
share, Deadfin indexed the@eaDirthumbnail directories as items, and an
@eaDirat the root of a Shows library became a series named "@eadir". - HLS copies a Dolby Vision profile 7 (dual-layer) HEVC stream as HDR10 for a
client that listsHDR10but notDOVIWithELin its range types. The copy
removes the RPU and the enhancement layer withhevc_metadata=remove_dovi
(ordovi_rpu=strip) and the master playlist offers anhvc1variant with
VIDEO-RANGE=PQ, as upstream does. Before, such a client got a 4K SDR
H.264 tone-mapped transcode. Startup probes which removal filters ffmpeg
has. The same port strips HDR10+ from a profile 8.1 HDR10+ copy for a
Dolby Vision client, and Dolby Vision from an invalid configuration (#586,
D-84). import-jellyfinreads a Jellyfin database in WAL mode from the read-only
/importmount that the import guide uses. The importer opens the stopped
copy immutable, so SQLite creates nojellyfin.db-shmnext to it. A
non-emptyjellyfin.db-walstops the import with a message to stop
Jellyfin and c...
v0.3.0-rc.19
v0.3.0 is the first public alpha of Deadfin.
Highlights
- The image includes deadfin-web. Deadfin serves the bundled web client
(v0.3.0-rc.4) at/web/with no extra download. To use jellyfin-web
instead, put its files in./deadfin/weband mount that directory at
/var/lib/deadfin/web; a<data root>/webwith anindex.htmlreplaces
the bundled client. An existing./deadfin/webmount keeps working and
keeps its own files: remove the mount to use the bundled deadfin-web. - Audio and subtitle choice carries to the next episode (D-36). When you
pick a language or a subtitle track in one episode, the next episode of the
same series starts with the matching tracks. Subtitles off also carries. - Anime search finds every title (D-48). Search matches the English,
romaji, native and alias titles from AniList and AniDB, with a kana/romaji
fold. "Shingeki" and "進撃" both find "Attack on Titan". - PostgreSQL support. SQLite stays the default. Set
DEADFIN_DATABASE_URL(or--database-url) to apostgres://URL to run
on PostgreSQL. See docs/alpha/install.md. - Security fixes from the release-candidate review: sign-out revokes the
token, video attachments are scoped to the user, the image downloader
refuses special-purpose address ranges, and the toolchain is Go 1.26.9.
Added
CHANGELOG.md. Each GitHub Release body comes from its section here.- Release images carry a build provenance attestation and an SPDX SBOM for
each architecture. The SBOMs are attached to the GitHub Release. - The
:alphaimage tag. It follows the newest release or release
candidate. The:latesttag follows the newest release (no-rc.N), so
v0.3.0 publishes it first. - Person pages show a biography, birth date, death date and birthplace from
TMDb. Opening a person without metadata fetches it, and the "Refresh
People" scheduled task fetches it for every person not yet refreshed
(D-74). Cast and crew keep their TMDb person ID. This needs a TMDb API
key (D-11). - The integrations guide: connect Seerr, Sonarr, Radarr and Bazarr beside
Jellyfin and after the cutover, with a script that moves Seerr users to
their Deadfin IDs. See
docs/alpha/integrations.md.
Changed
- The startup log names the web client in use: its directory, the source
(data rootorbundled) and the version from itsbuild.json. - The quick start and the install guide put TMDb API key setup first.
DEADFIN_DATA_DIRsets the data root.JELLYFIN_DATA_DIRstays as the
fallback. The image sets its default,/var/lib/deadfin, inJELLYFIN_DATA_DIR,
so a deployment that sets either variable overrides it. Deadfin
logs a warning for each setJELLYFIN_CONFIG_DIR,JELLYFIN_CACHE_DIR,
JELLYFIN_LOG_DIRorJELLYFIN_WEB_DIR.
Security
POST /Sessions/CapabilitiesandPOST /Sessions/Capabilities/Full
refuse another user's session ID from a non-administrator caller (D-67)./web/responses sendReferrer-Policy: no-referrerand
X-Content-Type-Options: nosniff. When the served client is deadfin-web,
they also send a restrictiveContent-Security-Policywith
frame-ancestors 'none'(D-68).- The one-time setup cookie is
Securewhen aKnownProxiespeer reports
HTTPS inX-Forwarded-Proto. Behind a TLS-terminating proxy, list the
proxy inKnownProxiesbefore first start (D-53).
Fixed
- A MusicBrainz timeout or rate-limit wait no longer fails the whole artist
folder. When a remote metadata provider's own request deadline expires, the
item keeps its stored metadata, the scan logs oneremote metadata provider failedwarning, and the folder staysok. A cancelled scan still stops
(D-107, #749; regression of #367). - A music album carries the artists of its songs, as upstream does:
AlbumArtist,AlbumArtists,ArtistsandArtistItems. The album
artists of most songs come first. Before, no album had an album artist, so
clients showed none on album tiles (#739). An album scanned before this
change gets its artists on the next library scan (D-110). A locked album
keeps its values. - Refresh Metadata saves provider IDs and images for every library root
again. A cast member, studio, or genre whose name differs only in case from
the stored one (StarzandSTARZ) has the same item ID but a different
path, and the refresh failed the whole folder withpath mismatch; for a
library root, nothing was saved. The refresh now keeps the stored person,
studio, or genre path, as upstream does. A stale row of a removed
case-variant folder no longer fails its surviving sibling with
parent mismatch: the refresh moves it under the scanned folder, as an
ordinary scan does (#748). - A music track whose file carries an embedded cover (an attached picture,
as FLAC and MP3 files often do) gets that cover as its Primary image, and
an album without a cover file takes the Primary image of its first track.
Before, the embedded cover was never extracted, so an album without a
folder.jpghad no image (#784, D-108). - A library scan follows symbolic links, as upstream does. A linked media
file or a linked directory, also one outside the library root, enters the
library under the link path; before, the scan left every link out. A
dangling link is skipped with a warning. A directory link to the directory
that holds it or to one of its ancestors is skipped with a warning (D-86).
A file link's snapshot now carries the facts of its target, so playback and
probing check the target file. - Every artist named in an
ARTISToralbum_artisttag gets a MusicArtist
item after a library scan, as upstreamArtistsValidatordoes. Before,
only artist folders made artists, so/Artistsand/Artists/AlbumArtists
left out featured artists and album artists without a folder (#739). An
artist folder serves its own name. An artist that no track names any more
is deleted on the next scan, unless it is locked. - The library scan logs a folder failure when the folder fails. Before, the
scanner folderlines came only after the whole scan ended, so a scan that
stalled logged no failure at all (#702). - A library scan keeps a folder that holds two names that differ only in
case, such asLiveandliveon a case-sensitive NFS or ZFS share. Both
names gave the same item ID, and the whole folder failed on every scan: an
artist's discography, a season, or at the library root the whole library
stayed missing. The scan now keeps the first name in ordinal order and logs
the other as skipped (D-85). A directory entry whose file status cannot be
read is skipped with a warning; before, one such entry failed the listing
of its whole directory (#702). - A multi-disc album is one album, as in Jellyfin. An album folder whose
tracks are in disc folders (CD 01,Disc 1,Digital Media 01, and the
other Jellyfin disc names) is the MusicAlbum, its parent folder is the
artist, and the disc folders are plain folders. The album lists the tracks
of every disc, its track count includes every disc, and each track shows
the album. Before, each disc folder was an album named after the folder,
with no album artist. A library scan replaces those albums (#703). - The library scan ignores Jellyfin trickplay directories, as Jellyfin does.
With "save trickplay with media" on, Jellyfin writes a
<video>.trickplay/directory next to each video. Deadfin indexed these
directories and their tile directories as Folder items that showed in
browse and search. The next scan removes Folder items that an earlier scan
made for them (#704). - The library scan ignores Synology and QNAP system directories, as
Jellyfin does:@eaDir,eaDir,#recycle,@Recycle,.@__thumb,
$RECYCLE.BIN,System Volume Informationand.grab. On a Synology
share, Deadfin indexed the@eaDirthumbnail directories as items, and an
@eaDirat the root of a Shows library became a series named "@eadir". - HLS copies a Dolby Vision profile 7 (dual-layer) HEVC stream as HDR10 for a
client that listsHDR10but notDOVIWithELin its range types. The copy
removes the RPU and the enhancement layer withhevc_metadata=remove_dovi
(ordovi_rpu=strip) and the master playlist offers anhvc1variant with
VIDEO-RANGE=PQ, as upstream does. Before, such a client got a 4K SDR
H.264 tone-mapped transcode. Startup probes which removal filters ffmpeg
has. The same port strips HDR10+ from a profile 8.1 HDR10+ copy for a
Dolby Vision client, and Dolby Vision from an invalid configuration (#586,
D-84). import-jellyfinreads a Jellyfin database in WAL mode from the read-only
/importmount that the import guide uses. The importer opens the stopped
copy immutable, so SQLite creates nojellyfin.db-shmnext to it. A
non-emptyjellyfin.db-walstops the import with a message to stop
Jellyfin and copy again (#697).- HLS plays an audio track that starts late. A track whose first packet is
more than 1 s into the file is encoded with leading silence instead of
copied: AAC when the client accepts it, else AC3 or E-AC3. A copied late
AC3 track gave an init segment withoutdac3and first segments without
audio, and AVPlayer failed the item at once. The Italian stereo track of a
4K remux starts at 33.55 s (#681, D-82). - Embedded text subtitles of large files load. One ffmpeg pass extracts
every embedded subtitle stream of a file into the subtitle cache, text
streams included, as upstream does. The first request waits for the pass
underSubtitleExtractionTimeoutMinutes; later requests read the cache. The
forced track of a 4K remux returned 500 after 30 s (#676, D-52). GET /UserItems/ResumeandGET /Users/{userId}/Items/Resumehonor
parentId: they return only the in-progress items under the series,
seaso...
v0.3.0-rc.18
v0.3.0 is the first public alpha of Deadfin.
Highlights
- The image includes deadfin-web. Deadfin serves the bundled web client
(v0.3.0-rc.4) at/web/with no extra download. To use jellyfin-web
instead, put its files in./deadfin/weband mount that directory at
/var/lib/deadfin/web; a<data root>/webwith anindex.htmlreplaces
the bundled client. An existing./deadfin/webmount keeps working and
keeps its own files: remove the mount to use the bundled deadfin-web. - Audio and subtitle choice carries to the next episode (D-36). When you
pick a language or a subtitle track in one episode, the next episode of the
same series starts with the matching tracks. Subtitles off also carries. - Anime search finds every title (D-48). Search matches the English,
romaji, native and alias titles from AniList and AniDB, with a kana/romaji
fold. "Shingeki" and "進撃" both find "Attack on Titan". - PostgreSQL support. SQLite stays the default. Set
DEADFIN_DATABASE_URL(or--database-url) to apostgres://URL to run
on PostgreSQL. See docs/alpha/install.md. - Security fixes from the release-candidate review: sign-out revokes the
token, video attachments are scoped to the user, the image downloader
refuses special-purpose address ranges, and the toolchain is Go 1.26.9.
Added
CHANGELOG.md. Each GitHub Release body comes from its section here.- Release images carry a build provenance attestation and an SPDX SBOM for
each architecture. The SBOMs are attached to the GitHub Release. - The
:alphaimage tag. It follows the newest release or release
candidate. The:latesttag follows the newest release (no-rc.N), so
v0.3.0 publishes it first. - Person pages show a biography, birth date, death date and birthplace from
TMDb. Opening a person without metadata fetches it, and the "Refresh
People" scheduled task fetches it for every person not yet refreshed
(D-74). Cast and crew keep their TMDb person ID. This needs a TMDb API
key (D-11). - The integrations guide: connect Seerr, Sonarr, Radarr and Bazarr beside
Jellyfin and after the cutover, with a script that moves Seerr users to
their Deadfin IDs. See
docs/alpha/integrations.md.
Changed
- The startup log names the web client in use: its directory, the source
(data rootorbundled) and the version from itsbuild.json. - The quick start and the install guide put TMDb API key setup first.
DEADFIN_DATA_DIRsets the data root.JELLYFIN_DATA_DIRstays as the
fallback. The image sets its default,/var/lib/deadfin, inJELLYFIN_DATA_DIR,
so a deployment that sets either variable overrides it. Deadfin
logs a warning for each setJELLYFIN_CONFIG_DIR,JELLYFIN_CACHE_DIR,
JELLYFIN_LOG_DIRorJELLYFIN_WEB_DIR.
Security
POST /Sessions/CapabilitiesandPOST /Sessions/Capabilities/Full
refuse another user's session ID from a non-administrator caller (D-67)./web/responses sendReferrer-Policy: no-referrerand
X-Content-Type-Options: nosniff. When the served client is deadfin-web,
they also send a restrictiveContent-Security-Policywith
frame-ancestors 'none'(D-68).- The one-time setup cookie is
Securewhen aKnownProxiespeer reports
HTTPS inX-Forwarded-Proto. Behind a TLS-terminating proxy, list the
proxy inKnownProxiesbefore first start (D-53).
Fixed
- A MusicBrainz timeout or rate-limit wait no longer fails the whole artist
folder. When a remote metadata provider's own request deadline expires, the
item keeps its stored metadata, the scan logs oneremote metadata provider failedwarning, and the folder staysok. A cancelled scan still stops
(D-107, #749; regression of #367). - A music album carries the artists of its songs, as upstream does:
AlbumArtist,AlbumArtists,ArtistsandArtistItems. The album
artists of most songs come first. Before, no album had an album artist, so
clients showed none on album tiles (#739). An album scanned before this
change gets its artists on the next library scan (D-110). A locked album
keeps its values. - Refresh Metadata saves provider IDs and images for every library root
again. A cast member, studio, or genre whose name differs only in case from
the stored one (StarzandSTARZ) has the same item ID but a different
path, and the refresh failed the whole folder withpath mismatch; for a
library root, nothing was saved. The refresh now keeps the stored person,
studio, or genre path, as upstream does. A stale row of a removed
case-variant folder no longer fails its surviving sibling with
parent mismatch: the refresh moves it under the scanned folder, as an
ordinary scan does (#748). - A music track whose file carries an embedded cover (an attached picture,
as FLAC and MP3 files often do) gets that cover as its Primary image, and
an album without a cover file takes the Primary image of its first track.
Before, the embedded cover was never extracted, so an album without a
folder.jpghad no image (#784, D-108). - A library scan follows symbolic links, as upstream does. A linked media
file or a linked directory, also one outside the library root, enters the
library under the link path; before, the scan left every link out. A
dangling link is skipped with a warning. A directory link to the directory
that holds it or to one of its ancestors is skipped with a warning (D-86).
A file link's snapshot now carries the facts of its target, so playback and
probing check the target file. - Every artist named in an
ARTISToralbum_artisttag gets a MusicArtist
item after a library scan, as upstreamArtistsValidatordoes. Before,
only artist folders made artists, so/Artistsand/Artists/AlbumArtists
left out featured artists and album artists without a folder (#739). An
artist folder serves its own name. An artist that no track names any more
is deleted on the next scan, unless it is locked. - The library scan logs a folder failure when the folder fails. Before, the
scanner folderlines came only after the whole scan ended, so a scan that
stalled logged no failure at all (#702). - A library scan keeps a folder that holds two names that differ only in
case, such asLiveandliveon a case-sensitive NFS or ZFS share. Both
names gave the same item ID, and the whole folder failed on every scan: an
artist's discography, a season, or at the library root the whole library
stayed missing. The scan now keeps the first name in ordinal order and logs
the other as skipped (D-85). A directory entry whose file status cannot be
read is skipped with a warning; before, one such entry failed the listing
of its whole directory (#702). - A multi-disc album is one album, as in Jellyfin. An album folder whose
tracks are in disc folders (CD 01,Disc 1,Digital Media 01, and the
other Jellyfin disc names) is the MusicAlbum, its parent folder is the
artist, and the disc folders are plain folders. The album lists the tracks
of every disc, its track count includes every disc, and each track shows
the album. Before, each disc folder was an album named after the folder,
with no album artist. A library scan replaces those albums (#703). - The library scan ignores Jellyfin trickplay directories, as Jellyfin does.
With "save trickplay with media" on, Jellyfin writes a
<video>.trickplay/directory next to each video. Deadfin indexed these
directories and their tile directories as Folder items that showed in
browse and search. The next scan removes Folder items that an earlier scan
made for them (#704). - The library scan ignores Synology and QNAP system directories, as
Jellyfin does:@eaDir,eaDir,#recycle,@Recycle,.@__thumb,
$RECYCLE.BIN,System Volume Informationand.grab. On a Synology
share, Deadfin indexed the@eaDirthumbnail directories as items, and an
@eaDirat the root of a Shows library became a series named "@eadir". - HLS copies a Dolby Vision profile 7 (dual-layer) HEVC stream as HDR10 for a
client that listsHDR10but notDOVIWithELin its range types. The copy
removes the RPU and the enhancement layer withhevc_metadata=remove_dovi
(ordovi_rpu=strip) and the master playlist offers anhvc1variant with
VIDEO-RANGE=PQ, as upstream does. Before, such a client got a 4K SDR
H.264 tone-mapped transcode. Startup probes which removal filters ffmpeg
has. The same port strips HDR10+ from a profile 8.1 HDR10+ copy for a
Dolby Vision client, and Dolby Vision from an invalid configuration (#586,
D-84). import-jellyfinreads a Jellyfin database in WAL mode from the read-only
/importmount that the import guide uses. The importer opens the stopped
copy immutable, so SQLite creates nojellyfin.db-shmnext to it. A
non-emptyjellyfin.db-walstops the import with a message to stop
Jellyfin and copy again (#697).- HLS plays an audio track that starts late. A track whose first packet is
more than 1 s into the file is encoded with leading silence instead of
copied: AAC when the client accepts it, else AC3 or E-AC3. A copied late
AC3 track gave an init segment withoutdac3and first segments without
audio, and AVPlayer failed the item at once. The Italian stereo track of a
4K remux starts at 33.55 s (#681, D-82). - Embedded text subtitles of large files load. One ffmpeg pass extracts
every embedded subtitle stream of a file into the subtitle cache, text
streams included, as upstream does. The first request waits for the pass
underSubtitleExtractionTimeoutMinutes; later requests read the cache. The
forced track of a 4K remux returned 500 after 30 s (#676, D-52). GET /UserItems/ResumeandGET /Users/{userId}/Items/Resumehonor
parentId: they return only the in-progress items under the series,
seaso...
v0.3.0-rc.17
v0.3.0 is the first public alpha of Deadfin.
Highlights
- The image includes deadfin-web. Deadfin serves the bundled web client
(v0.3.0-rc.4) at/web/with no extra download. To use jellyfin-web
instead, put its files in./deadfin/weband mount that directory at
/var/lib/deadfin/web; a<data root>/webwith anindex.htmlreplaces
the bundled client. An existing./deadfin/webmount keeps working and
keeps its own files: remove the mount to use the bundled deadfin-web. - Audio and subtitle choice carries to the next episode (D-36). When you
pick a language or a subtitle track in one episode, the next episode of the
same series starts with the matching tracks. Subtitles off also carries. - Anime search finds every title (D-48). Search matches the English,
romaji, native and alias titles from AniList and AniDB, with a kana/romaji
fold. "Shingeki" and "進撃" both find "Attack on Titan". - PostgreSQL support. SQLite stays the default. Set
DEADFIN_DATABASE_URL(or--database-url) to apostgres://URL to run
on PostgreSQL. See docs/alpha/install.md. - Security fixes from the release-candidate review: sign-out revokes the
token, video attachments are scoped to the user, the image downloader
refuses special-purpose address ranges, and the toolchain is Go 1.26.9.
Added
CHANGELOG.md. Each GitHub Release body comes from its section here.- Release images carry a build provenance attestation and an SPDX SBOM for
each architecture. The SBOMs are attached to the GitHub Release. - The
:alphaimage tag. It follows the newest release or release
candidate. The:latesttag follows the newest release (no-rc.N), so
v0.3.0 publishes it first. - Person pages show a biography, birth date, death date and birthplace from
TMDb. Opening a person without metadata fetches it, and the "Refresh
People" scheduled task fetches it for every person not yet refreshed
(D-74). Cast and crew keep their TMDb person ID. This needs a TMDb API
key (D-11). - The integrations guide: connect Seerr, Sonarr, Radarr and Bazarr beside
Jellyfin and after the cutover, with a script that moves Seerr users to
their Deadfin IDs. See
docs/alpha/integrations.md.
Changed
- The startup log names the web client in use: its directory, the source
(data rootorbundled) and the version from itsbuild.json. - The quick start and the install guide put TMDb API key setup first.
DEADFIN_DATA_DIRsets the data root.JELLYFIN_DATA_DIRstays as the
fallback. The image sets its default,/var/lib/deadfin, inJELLYFIN_DATA_DIR,
so a deployment that sets either variable overrides it. Deadfin
logs a warning for each setJELLYFIN_CONFIG_DIR,JELLYFIN_CACHE_DIR,
JELLYFIN_LOG_DIRorJELLYFIN_WEB_DIR.
Security
POST /Sessions/CapabilitiesandPOST /Sessions/Capabilities/Full
refuse another user's session ID from a non-administrator caller (D-67)./web/responses sendReferrer-Policy: no-referrerand
X-Content-Type-Options: nosniff. When the served client is deadfin-web,
they also send a restrictiveContent-Security-Policywith
frame-ancestors 'none'(D-68).- The one-time setup cookie is
Securewhen aKnownProxiespeer reports
HTTPS inX-Forwarded-Proto. Behind a TLS-terminating proxy, list the
proxy inKnownProxiesbefore first start (D-53).
Fixed
- A library scan follows symbolic links, as upstream does. A linked media
file or a linked directory, also one outside the library root, enters the
library under the link path; before, the scan left every link out. A
dangling link is skipped with a warning. A directory link to the directory
that holds it or to one of its ancestors is skipped with a warning (D-86).
A file link's snapshot now carries the facts of its target, so playback and
probing check the target file. - The library scan logs a folder failure when the folder fails. Before, the
scanner folderlines came only after the whole scan ended, so a scan that
stalled logged no failure at all (#702). - A library scan keeps a folder that holds two names that differ only in
case, such asLiveandliveon a case-sensitive NFS or ZFS share. Both
names gave the same item ID, and the whole folder failed on every scan: an
artist's discography, a season, or at the library root the whole library
stayed missing. The scan now keeps the first name in ordinal order and logs
the other as skipped (D-85). A directory entry whose file status cannot be
read is skipped with a warning; before, one such entry failed the listing
of its whole directory (#702). - A multi-disc album is one album, as in Jellyfin. An album folder whose
tracks are in disc folders (CD 01,Disc 1,Digital Media 01, and the
other Jellyfin disc names) is the MusicAlbum, its parent folder is the
artist, and the disc folders are plain folders. The album lists the tracks
of every disc, its track count includes every disc, and each track shows
the album. Before, each disc folder was an album named after the folder,
with no album artist. A library scan replaces those albums (#703). - The library scan ignores Jellyfin trickplay directories, as Jellyfin does.
With "save trickplay with media" on, Jellyfin writes a
<video>.trickplay/directory next to each video. Deadfin indexed these
directories and their tile directories as Folder items that showed in
browse and search. The next scan removes Folder items that an earlier scan
made for them (#704). - HLS copies a Dolby Vision profile 7 (dual-layer) HEVC stream as HDR10 for a
client that listsHDR10but notDOVIWithELin its range types. The copy
removes the RPU and the enhancement layer withhevc_metadata=remove_dovi
(ordovi_rpu=strip) and the master playlist offers anhvc1variant with
VIDEO-RANGE=PQ, as upstream does. Before, such a client got a 4K SDR
H.264 tone-mapped transcode. Startup probes which removal filters ffmpeg
has. The same port strips HDR10+ from a profile 8.1 HDR10+ copy for a
Dolby Vision client, and Dolby Vision from an invalid configuration (#586,
D-84). import-jellyfinreads a Jellyfin database in WAL mode from the read-only
/importmount that the import guide uses. The importer opens the stopped
copy immutable, so SQLite creates nojellyfin.db-shmnext to it. A
non-emptyjellyfin.db-walstops the import with a message to stop
Jellyfin and copy again (#697).- HLS plays an audio track that starts late. A track whose first packet is
more than 1 s into the file is encoded with leading silence instead of
copied: AAC when the client accepts it, else AC3 or E-AC3. A copied late
AC3 track gave an init segment withoutdac3and first segments without
audio, and AVPlayer failed the item at once. The Italian stereo track of a
4K remux starts at 33.55 s (#681, D-82). - Embedded text subtitles of large files load. One ffmpeg pass extracts
every embedded subtitle stream of a file into the subtitle cache, text
streams included, as upstream does. The first request waits for the pass
underSubtitleExtractionTimeoutMinutes; later requests read the cache. The
forced track of a 4K remux returned 500 after 30 s (#676, D-52). GET /UserItems/ResumeandGET /Users/{userId}/Items/Resumehonor
parentId: they return only the in-progress items under the series,
season, folder, library, collection, or playlist. Before, they returned the
whole resume list, so the series Play button in Swiftfin played an
unrelated movie.excludeActiveSessionsnow drops the items the user is
playing, and the Latest exclusions apply only to the unscoped list, as
upstream does (#674).- Sessions report the real play method. A report with no
PlayMethodis
Transcodewhile a transcoding job runs for itsPlaySessionId, else
DirectPlay, as upstream does./SessionscarriesTranscodingInfofor a
running HLS job, so an HLS remux no longer shows as direct play (#635). GET /Library/MediaFoldersreturns the library roots, as upstream does:
the enabled collection folders and the hidden playlists folder, ordered by
sort name, with theisHiddenfilter, for administrators only. Seerr and
other Jellyfin tools that list libraries this way work without a fallback.
The playlists folder projects asManualPlaylistsFolderwith
CollectionTypeplaylists(#596).- Comma-delimited enum query parameters drop unknown values, as upstream
does. Infuse home rows (/Items/Latestwith an Emby field) load again. GET /MediaSegments/{itemId}returns an emptyQueryResultfor a known
item (Infuse called it on every play).- HLS stream copy of Dolby Vision profile 7 (
DOVIWithEL) is taggedhvc1,
so the init segment matches thehvc1master playlist and AVPlayer can
decode the HDR10 base layer (D-65). - The H.264 level in the HLS master playlist matches the level the encoder
writes (D-66). - The HLS throttler and the transcode cache limits pause ffmpeg again.
jellyfin-ffmpeg 8 does not pause on the old key, so a fast remux kept writing
segments far ahead of playback. - A user with access to only some libraries can open a person, genre or
studio by its ID, as upstream does. Cast portraits returned 404 for these
users. Lists keep the library restriction.
Image
docker pull ghcr.io/deadfin-org/deadfin:v0.3.0-rc.17
docker pull ghcr.io/deadfin-org/deadfin@sha256:501bf3b5c0ec259fb1006aa74415dd0891b18dbb5d2eeec3ac0a97c50112d016Platforms: linux/amd64, linux/arm64. See docs/alpha to install.
Verify
The image carries a build provenance attestation and an SPDX SBOM attestation for each architecture. The SBOMs are attached to this release.
gh attestation verify oci://ghcr.io/deadfin-org/deadfin@sha256...v0.3.0-rc.16
v0.3.0 is the first public alpha of Deadfin.
Highlights
- The image includes deadfin-web. Deadfin serves the bundled web client
(v0.3.0-rc.4) at/web/with no extra download. To use jellyfin-web
instead, put its files in./deadfin/weband mount that directory at
/var/lib/deadfin/web; a<data root>/webwith anindex.htmlreplaces
the bundled client. An existing./deadfin/webmount keeps working and
keeps its own files: remove the mount to use the bundled deadfin-web. - Audio and subtitle choice carries to the next episode (D-36). When you
pick a language or a subtitle track in one episode, the next episode of the
same series starts with the matching tracks. Subtitles off also carries. - Anime search finds every title (D-48). Search matches the English,
romaji, native and alias titles from AniList and AniDB, with a kana/romaji
fold. "Shingeki" and "進撃" both find "Attack on Titan". - PostgreSQL support. SQLite stays the default. Set
DEADFIN_DATABASE_URL(or--database-url) to apostgres://URL to run
on PostgreSQL. See docs/alpha/install.md. - Security fixes from the release-candidate review: sign-out revokes the
token, video attachments are scoped to the user, the image downloader
refuses special-purpose address ranges, and the toolchain is Go 1.26.9.
Added
CHANGELOG.md. Each GitHub Release body comes from its section here.- Release images carry a build provenance attestation and an SPDX SBOM for
each architecture. The SBOMs are attached to the GitHub Release. - The
:alphaimage tag. It follows the newest release or release
candidate. The:latesttag follows the newest release (no-rc.N), so
v0.3.0 publishes it first. - Person pages show a biography, birth date, death date and birthplace from
TMDb. Opening a person without metadata fetches it, and the "Refresh
People" scheduled task fetches it for every person not yet refreshed
(D-74). Cast and crew keep their TMDb person ID. This needs a TMDb API
key (D-11). - The integrations guide: connect Seerr, Sonarr, Radarr and Bazarr beside
Jellyfin and after the cutover, with a script that moves Seerr users to
their Deadfin IDs. See
docs/alpha/integrations.md.
Changed
- The startup log names the web client in use: its directory, the source
(data rootorbundled) and the version from itsbuild.json. - The quick start and the install guide put TMDb API key setup first.
DEADFIN_DATA_DIRsets the data root.JELLYFIN_DATA_DIRstays as the
fallback. The image sets its default,/var/lib/deadfin, inJELLYFIN_DATA_DIR,
so a deployment that sets either variable overrides it. Deadfin
logs a warning for each setJELLYFIN_CONFIG_DIR,JELLYFIN_CACHE_DIR,
JELLYFIN_LOG_DIRorJELLYFIN_WEB_DIR.
Security
POST /Sessions/CapabilitiesandPOST /Sessions/Capabilities/Full
refuse another user's session ID from a non-administrator caller (D-67)./web/responses sendReferrer-Policy: no-referrerand
X-Content-Type-Options: nosniff. When the served client is deadfin-web,
they also send a restrictiveContent-Security-Policywith
frame-ancestors 'none'(D-68).- The one-time setup cookie is
Securewhen aKnownProxiespeer reports
HTTPS inX-Forwarded-Proto. Behind a TLS-terminating proxy, list the
proxy inKnownProxiesbefore first start (D-53).
Fixed
- A library scan follows symbolic links, as upstream does. A linked media
file or a linked directory, also one outside the library root, enters the
library under the link path; before, the scan left every link out. A
dangling link is skipped with a warning. A directory link to the directory
that holds it or to one of its ancestors is skipped with a warning (D-86).
A file link's snapshot now carries the facts of its target, so playback and
probing check the target file. - The library scan logs a folder failure when the folder fails. Before, the
scanner folderlines came only after the whole scan ended, so a scan that
stalled logged no failure at all (#702). - A library scan keeps a folder that holds two names that differ only in
case, such asLiveandliveon a case-sensitive NFS or ZFS share. Both
names gave the same item ID, and the whole folder failed on every scan: an
artist's discography, a season, or at the library root the whole library
stayed missing. The scan now keeps the first name in ordinal order and logs
the other as skipped (D-85). A directory entry whose file status cannot be
read is skipped with a warning; before, one such entry failed the listing
of its whole directory (#702). - A multi-disc album is one album, as in Jellyfin. An album folder whose
tracks are in disc folders (CD 01,Disc 1,Digital Media 01, and the
other Jellyfin disc names) is the MusicAlbum, its parent folder is the
artist, and the disc folders are plain folders. The album lists the tracks
of every disc, its track count includes every disc, and each track shows
the album. Before, each disc folder was an album named after the folder,
with no album artist. A library scan replaces those albums (#703). - The library scan ignores Jellyfin trickplay directories, as Jellyfin does.
With "save trickplay with media" on, Jellyfin writes a
<video>.trickplay/directory next to each video. Deadfin indexed these
directories and their tile directories as Folder items that showed in
browse and search. The next scan removes Folder items that an earlier scan
made for them (#704). - HLS copies a Dolby Vision profile 7 (dual-layer) HEVC stream as HDR10 for a
client that listsHDR10but notDOVIWithELin its range types. The copy
removes the RPU and the enhancement layer withhevc_metadata=remove_dovi
(ordovi_rpu=strip) and the master playlist offers anhvc1variant with
VIDEO-RANGE=PQ, as upstream does. Before, such a client got a 4K SDR
H.264 tone-mapped transcode. Startup probes which removal filters ffmpeg
has. The same port strips HDR10+ from a profile 8.1 HDR10+ copy for a
Dolby Vision client, and Dolby Vision from an invalid configuration (#586,
D-84). import-jellyfinreads a Jellyfin database in WAL mode from the read-only
/importmount that the import guide uses. The importer opens the stopped
copy immutable, so SQLite creates nojellyfin.db-shmnext to it. A
non-emptyjellyfin.db-walstops the import with a message to stop
Jellyfin and copy again (#697).- HLS plays an audio track that starts late. A track whose first packet is
more than 1 s into the file is encoded with leading silence instead of
copied: AAC when the client accepts it, else AC3 or E-AC3. A copied late
AC3 track gave an init segment withoutdac3and first segments without
audio, and AVPlayer failed the item at once. The Italian stereo track of a
4K remux starts at 33.55 s (#681, D-82). - Embedded text subtitles of large files load. One ffmpeg pass extracts
every embedded subtitle stream of a file into the subtitle cache, text
streams included, as upstream does. The first request waits for the pass
underSubtitleExtractionTimeoutMinutes; later requests read the cache. The
forced track of a 4K remux returned 500 after 30 s (#676, D-52). GET /UserItems/ResumeandGET /Users/{userId}/Items/Resumehonor
parentId: they return only the in-progress items under the series,
season, folder, library, collection, or playlist. Before, they returned the
whole resume list, so the series Play button in Swiftfin played an
unrelated movie.excludeActiveSessionsnow drops the items the user is
playing, and the Latest exclusions apply only to the unscoped list, as
upstream does (#674).- Sessions report the real play method. A report with no
PlayMethodis
Transcodewhile a transcoding job runs for itsPlaySessionId, else
DirectPlay, as upstream does./SessionscarriesTranscodingInfofor a
running HLS job, so an HLS remux no longer shows as direct play (#635). GET /Library/MediaFoldersreturns the library roots, as upstream does:
the enabled collection folders and the hidden playlists folder, ordered by
sort name, with theisHiddenfilter, for administrators only. Seerr and
other Jellyfin tools that list libraries this way work without a fallback.
The playlists folder projects asManualPlaylistsFolderwith
CollectionTypeplaylists(#596).- Comma-delimited enum query parameters drop unknown values, as upstream
does. Infuse home rows (/Items/Latestwith an Emby field) load again. GET /MediaSegments/{itemId}returns an emptyQueryResultfor a known
item (Infuse called it on every play).- HLS stream copy of Dolby Vision profile 7 (
DOVIWithEL) is taggedhvc1,
so the init segment matches thehvc1master playlist and AVPlayer can
decode the HDR10 base layer (D-65). - The H.264 level in the HLS master playlist matches the level the encoder
writes (D-66). - The HLS throttler and the transcode cache limits pause ffmpeg again.
jellyfin-ffmpeg 8 does not pause on the old key, so a fast remux kept writing
segments far ahead of playback. - A user with access to only some libraries can open a person, genre or
studio by its ID, as upstream does. Cast portraits returned 404 for these
users. Lists keep the library restriction.
Image
docker pull ghcr.io/deadfin-org/deadfin:v0.3.0-rc.16
docker pull ghcr.io/deadfin-org/deadfin@sha256:e19e2c84a4fa2221ea4c4cda80e9e3d2eb216f24709941ea3dcb9b9024413c37Platforms: linux/amd64, linux/arm64. See docs/alpha to install.
Verify
The image carries a build provenance attestation and an SPDX SBOM attestation for each architecture. The SBOMs are attached to this release.
gh attestation verify oci://ghcr.io/deadfin-org/deadfin@sha256...v0.3.0-rc.15
v0.3.0 is the first public alpha of Deadfin.
Highlights
- The image includes deadfin-web. Deadfin serves the bundled web client
(v0.3.0-rc.4) at/web/with no extra download. To use jellyfin-web
instead, put its files in./deadfin/weband mount that directory at
/var/lib/deadfin/web; a<data root>/webwith anindex.htmlreplaces
the bundled client. An existing./deadfin/webmount keeps working and
keeps its own files: remove the mount to use the bundled deadfin-web. - Audio and subtitle choice carries to the next episode (D-36). When you
pick a language or a subtitle track in one episode, the next episode of the
same series starts with the matching tracks. Subtitles off also carries. - Anime search finds every title (D-48). Search matches the English,
romaji, native and alias titles from AniList and AniDB, with a kana/romaji
fold. "Shingeki" and "進撃" both find "Attack on Titan". - PostgreSQL support. SQLite stays the default. Set
DEADFIN_DATABASE_URL(or--database-url) to apostgres://URL to run
on PostgreSQL. See docs/alpha/install.md. - Security fixes from the release-candidate review: sign-out revokes the
token, video attachments are scoped to the user, the image downloader
refuses special-purpose address ranges, and the toolchain is Go 1.26.9.
Added
CHANGELOG.md. Each GitHub Release body comes from its section here.- Release images carry a build provenance attestation and an SPDX SBOM for
each architecture. The SBOMs are attached to the GitHub Release. - The
:alphaimage tag. It follows the newest release or release
candidate. The:latesttag follows the newest release (no-rc.N), so
v0.3.0 publishes it first. - Person pages show a biography, birth date, death date and birthplace from
TMDb. Opening a person without metadata fetches it, and the "Refresh
People" scheduled task fetches it for every person not yet refreshed
(D-74). Cast and crew keep their TMDb person ID. This needs a TMDb API
key (D-11). - The integrations guide: connect Seerr, Sonarr, Radarr and Bazarr beside
Jellyfin and after the cutover, with a script that moves Seerr users to
their Deadfin IDs. See
docs/alpha/integrations.md.
Changed
- The startup log names the web client in use: its directory, the source
(data rootorbundled) and the version from itsbuild.json. - The quick start and the install guide put TMDb API key setup first.
DEADFIN_DATA_DIRsets the data root.JELLYFIN_DATA_DIRstays as the
fallback. The image sets its default,/var/lib/deadfin, inJELLYFIN_DATA_DIR,
so a deployment that sets either variable overrides it. Deadfin
logs a warning for each setJELLYFIN_CONFIG_DIR,JELLYFIN_CACHE_DIR,
JELLYFIN_LOG_DIRorJELLYFIN_WEB_DIR.
Security
POST /Sessions/CapabilitiesandPOST /Sessions/Capabilities/Full
refuse another user's session ID from a non-administrator caller (D-67)./web/responses sendReferrer-Policy: no-referrerand
X-Content-Type-Options: nosniff. When the served client is deadfin-web,
they also send a restrictiveContent-Security-Policywith
frame-ancestors 'none'(D-68).- The one-time setup cookie is
Securewhen aKnownProxiespeer reports
HTTPS inX-Forwarded-Proto. Behind a TLS-terminating proxy, list the
proxy inKnownProxiesbefore first start (D-53).
Fixed
- A library scan follows symbolic links, as upstream does. A linked media
file or a linked directory, also one outside the library root, enters the
library under the link path; before, the scan left every link out. A
dangling link is skipped with a warning. A directory link to the directory
that holds it or to one of its ancestors is skipped with a warning (D-86).
A file link's snapshot now carries the facts of its target, so playback and
probing check the target file. - The library scan logs a folder failure when the folder fails. Before, the
scanner folderlines came only after the whole scan ended, so a scan that
stalled logged no failure at all (#702). - A library scan keeps a folder that holds two names that differ only in
case, such asLiveandliveon a case-sensitive NFS or ZFS share. Both
names gave the same item ID, and the whole folder failed on every scan: an
artist's discography, a season, or at the library root the whole library
stayed missing. The scan now keeps the first name in ordinal order and logs
the other as skipped (D-85). A directory entry whose file status cannot be
read is skipped with a warning; before, one such entry failed the listing
of its whole directory (#702). - A multi-disc album is one album, as in Jellyfin. An album folder whose
tracks are in disc folders (CD 01,Disc 1,Digital Media 01, and the
other Jellyfin disc names) is the MusicAlbum, its parent folder is the
artist, and the disc folders are plain folders. The album lists the tracks
of every disc, its track count includes every disc, and each track shows
the album. Before, each disc folder was an album named after the folder,
with no album artist. A library scan replaces those albums (#703). - The library scan ignores Jellyfin trickplay directories, as Jellyfin does.
With "save trickplay with media" on, Jellyfin writes a
<video>.trickplay/directory next to each video. Deadfin indexed these
directories and their tile directories as Folder items that showed in
browse and search. The next scan removes Folder items that an earlier scan
made for them (#704). - HLS copies a Dolby Vision profile 7 (dual-layer) HEVC stream as HDR10 for a
client that listsHDR10but notDOVIWithELin its range types. The copy
removes the RPU and the enhancement layer withhevc_metadata=remove_dovi
(ordovi_rpu=strip) and the master playlist offers anhvc1variant with
VIDEO-RANGE=PQ, as upstream does. Before, such a client got a 4K SDR
H.264 tone-mapped transcode. Startup probes which removal filters ffmpeg
has. The same port strips HDR10+ from a profile 8.1 HDR10+ copy for a
Dolby Vision client, and Dolby Vision from an invalid configuration (#586,
D-84). import-jellyfinreads a Jellyfin database in WAL mode from the read-only
/importmount that the import guide uses. The importer opens the stopped
copy immutable, so SQLite creates nojellyfin.db-shmnext to it. A
non-emptyjellyfin.db-walstops the import with a message to stop
Jellyfin and copy again (#697).- HLS plays an audio track that starts late. A track whose first packet is
more than 1 s into the file is encoded with leading silence instead of
copied: AAC when the client accepts it, else AC3 or E-AC3. A copied late
AC3 track gave an init segment withoutdac3and first segments without
audio, and AVPlayer failed the item at once. The Italian stereo track of a
4K remux starts at 33.55 s (#681, D-82). - Embedded text subtitles of large files load. One ffmpeg pass extracts
every embedded subtitle stream of a file into the subtitle cache, text
streams included, as upstream does. The first request waits for the pass
underSubtitleExtractionTimeoutMinutes; later requests read the cache. The
forced track of a 4K remux returned 500 after 30 s (#676, D-52). GET /UserItems/ResumeandGET /Users/{userId}/Items/Resumehonor
parentId: they return only the in-progress items under the series,
season, folder, library, collection, or playlist. Before, they returned the
whole resume list, so the series Play button in Swiftfin played an
unrelated movie.excludeActiveSessionsnow drops the items the user is
playing, and the Latest exclusions apply only to the unscoped list, as
upstream does (#674).- Sessions report the real play method. A report with no
PlayMethodis
Transcodewhile a transcoding job runs for itsPlaySessionId, else
DirectPlay, as upstream does./SessionscarriesTranscodingInfofor a
running HLS job, so an HLS remux no longer shows as direct play (#635). GET /Library/MediaFoldersreturns the library roots, as upstream does:
the enabled collection folders and the hidden playlists folder, ordered by
sort name, with theisHiddenfilter, for administrators only. Seerr and
other Jellyfin tools that list libraries this way work without a fallback.
The playlists folder projects asManualPlaylistsFolderwith
CollectionTypeplaylists(#596).- Comma-delimited enum query parameters drop unknown values, as upstream
does. Infuse home rows (/Items/Latestwith an Emby field) load again. GET /MediaSegments/{itemId}returns an emptyQueryResultfor a known
item (Infuse called it on every play).- HLS stream copy of Dolby Vision profile 7 (
DOVIWithEL) is taggedhvc1,
so the init segment matches thehvc1master playlist and AVPlayer can
decode the HDR10 base layer (D-65). - The H.264 level in the HLS master playlist matches the level the encoder
writes (D-66). - The HLS throttler and the transcode cache limits pause ffmpeg again.
jellyfin-ffmpeg 8 does not pause on the old key, so a fast remux kept writing
segments far ahead of playback. - A user with access to only some libraries can open a person, genre or
studio by its ID, as upstream does. Cast portraits returned 404 for these
users. Lists keep the library restriction.
Image
docker pull ghcr.io/deadfin-org/deadfin:v0.3.0-rc.15
docker pull ghcr.io/deadfin-org/deadfin@sha256:f698010779c31380a86d9c15d7df72a16f3716e9bffa90d44bc36902e0bc1b38Platforms: linux/amd64, linux/arm64. See docs/alpha to install.
Verify
The image carries a build provenance attestation and an SPDX SBOM attestation for each architecture. The SBOMs are attached to this release.
gh attestation verify oci://ghcr.io/deadfin-org/deadfin@sha256...v0.3.0-rc.14
v0.3.0 is the first public alpha of Deadfin.
Highlights
- The image includes deadfin-web. Deadfin serves the bundled web client
(v0.3.0-rc.4) at/web/with no extra download. To use jellyfin-web
instead, put its files in./deadfin/weband mount that directory at
/var/lib/deadfin/web; a<data root>/webwith anindex.htmlreplaces
the bundled client. An existing./deadfin/webmount keeps working and
keeps its own files: remove the mount to use the bundled deadfin-web. - Audio and subtitle choice carries to the next episode (D-36). When you
pick a language or a subtitle track in one episode, the next episode of the
same series starts with the matching tracks. Subtitles off also carries. - Anime search finds every title (D-48). Search matches the English,
romaji, native and alias titles from AniList and AniDB, with a kana/romaji
fold. "Shingeki" and "進撃" both find "Attack on Titan". - PostgreSQL support. SQLite stays the default. Set
DEADFIN_DATABASE_URL(or--database-url) to apostgres://URL to run
on PostgreSQL. See docs/alpha/install.md. - Security fixes from the release-candidate review: sign-out revokes the
token, video attachments are scoped to the user, the image downloader
refuses special-purpose address ranges, and the toolchain is Go 1.26.9.
Added
CHANGELOG.md. Each GitHub Release body comes from its section here.- Release images carry a build provenance attestation and an SPDX SBOM for
each architecture. The SBOMs are attached to the GitHub Release. - The
:alphaimage tag. It follows the newest release or release
candidate. The:latesttag follows the newest release (no-rc.N), so
v0.3.0 publishes it first. - Person pages show a biography, birth date, death date and birthplace from
TMDb. Opening a person without metadata fetches it, and the "Refresh
People" scheduled task fetches it for every person not yet refreshed
(D-74). Cast and crew keep their TMDb person ID. This needs a TMDb API
key (D-11). - The integrations guide: connect Seerr, Sonarr, Radarr and Bazarr beside
Jellyfin and after the cutover, with a script that moves Seerr users to
their Deadfin IDs. See
docs/alpha/integrations.md.
Changed
- The startup log names the web client in use: its directory, the source
(data rootorbundled) and the version from itsbuild.json. - The quick start and the install guide put TMDb API key setup first.
DEADFIN_DATA_DIRsets the data root.JELLYFIN_DATA_DIRstays as the
fallback. The image sets its default,/var/lib/deadfin, inJELLYFIN_DATA_DIR,
so a deployment that sets either variable overrides it. Deadfin
logs a warning for each setJELLYFIN_CONFIG_DIR,JELLYFIN_CACHE_DIR,
JELLYFIN_LOG_DIRorJELLYFIN_WEB_DIR.
Security
POST /Sessions/CapabilitiesandPOST /Sessions/Capabilities/Full
refuse another user's session ID from a non-administrator caller (D-67)./web/responses sendReferrer-Policy: no-referrerand
X-Content-Type-Options: nosniff. When the served client is deadfin-web,
they also send a restrictiveContent-Security-Policywith
frame-ancestors 'none'(D-68).- The one-time setup cookie is
Securewhen aKnownProxiespeer reports
HTTPS inX-Forwarded-Proto. Behind a TLS-terminating proxy, list the
proxy inKnownProxiesbefore first start (D-53).
Fixed
import-jellyfinreads a Jellyfin database in WAL mode from the read-only
/importmount that the import guide uses. The importer opens the stopped
copy immutable, so SQLite creates nojellyfin.db-shmnext to it. A
non-emptyjellyfin.db-walstops the import with a message to stop
Jellyfin and copy again (#697).- HLS plays an audio track that starts late. A track whose first packet is
more than 1 s into the file is encoded with leading silence instead of
copied: AAC when the client accepts it, else AC3 or E-AC3. A copied late
AC3 track gave an init segment withoutdac3and first segments without
audio, and AVPlayer failed the item at once. The Italian stereo track of a
4K remux starts at 33.55 s (#681, D-82). - Embedded text subtitles of large files load. One ffmpeg pass extracts
every embedded subtitle stream of a file into the subtitle cache, text
streams included, as upstream does. The first request waits for the pass
underSubtitleExtractionTimeoutMinutes; later requests read the cache. The
forced track of a 4K remux returned 500 after 30 s (#676, D-52). GET /UserItems/ResumeandGET /Users/{userId}/Items/Resumehonor
parentId: they return only the in-progress items under the series,
season, folder, library, collection, or playlist. Before, they returned the
whole resume list, so the series Play button in Swiftfin played an
unrelated movie.excludeActiveSessionsnow drops the items the user is
playing, and the Latest exclusions apply only to the unscoped list, as
upstream does (#674).- Sessions report the real play method. A report with no
PlayMethodis
Transcodewhile a transcoding job runs for itsPlaySessionId, else
DirectPlay, as upstream does./SessionscarriesTranscodingInfofor a
running HLS job, so an HLS remux no longer shows as direct play (#635). GET /Library/MediaFoldersreturns the library roots, as upstream does:
the enabled collection folders and the hidden playlists folder, ordered by
sort name, with theisHiddenfilter, for administrators only. Seerr and
other Jellyfin tools that list libraries this way work without a fallback.
The playlists folder projects asManualPlaylistsFolderwith
CollectionTypeplaylists(#596).- Comma-delimited enum query parameters drop unknown values, as upstream
does. Infuse home rows (/Items/Latestwith an Emby field) load again. GET /MediaSegments/{itemId}returns an emptyQueryResultfor a known
item (Infuse called it on every play).- HLS stream copy of Dolby Vision profile 7 (
DOVIWithEL) is taggedhvc1,
so the init segment matches thehvc1master playlist and AVPlayer can
decode the HDR10 base layer (D-65). - The H.264 level in the HLS master playlist matches the level the encoder
writes (D-66). - The HLS throttler and the transcode cache limits pause ffmpeg again.
jellyfin-ffmpeg 8 does not pause on the old key, so a fast remux kept writing
segments far ahead of playback. - A user with access to only some libraries can open a person, genre or
studio by its ID, as upstream does. Cast portraits returned 404 for these
users. Lists keep the library restriction.
Image
docker pull ghcr.io/deadfin-org/deadfin:v0.3.0-rc.14
docker pull ghcr.io/deadfin-org/deadfin@sha256:c59746eb4e4b40b5a2e9c3c049bf8cd6d8ab1e20e34baa64908e8bbcfa1da4e9Platforms: linux/amd64, linux/arm64. See docs/alpha to install.
Verify
The image carries a build provenance attestation and an SPDX SBOM attestation for each architecture. The SBOMs are attached to this release.
gh attestation verify oci://ghcr.io/deadfin-org/deadfin@sha256:c59746eb4e4b40b5a2e9c3c049bf8cd6d8ab1e20e34baa64908e8bbcfa1da4e9 --repo deadfin-org/deadfinv0.3.0-rc.13
v0.3.0 is the first public alpha of Deadfin.
Highlights
- The image includes deadfin-web. Deadfin serves the bundled web client
(v0.3.0-rc.4) at/web/with no extra download. To use jellyfin-web
instead, put its files in./deadfin/weband mount that directory at
/var/lib/deadfin/web; a<data root>/webwith anindex.htmlreplaces
the bundled client. An existing./deadfin/webmount keeps working and
keeps its own files: remove the mount to use the bundled deadfin-web. - Audio and subtitle choice carries to the next episode (D-36). When you
pick a language or a subtitle track in one episode, the next episode of the
same series starts with the matching tracks. Subtitles off also carries. - Anime search finds every title (D-48). Search matches the English,
romaji, native and alias titles from AniList and AniDB, with a kana/romaji
fold. "Shingeki" and "進撃" both find "Attack on Titan". - PostgreSQL support. SQLite stays the default. Set
DEADFIN_DATABASE_URL(or--database-url) to apostgres://URL to run
on PostgreSQL. See docs/alpha/install.md. - Security fixes from the release-candidate review: sign-out revokes the
token, video attachments are scoped to the user, the image downloader
refuses special-purpose address ranges, and the toolchain is Go 1.26.9.
Added
CHANGELOG.md. Each GitHub Release body comes from its section here.- Release images carry a build provenance attestation and an SPDX SBOM for
each architecture. The SBOMs are attached to the GitHub Release. - The
:alphaimage tag. It follows the newest release or release
candidate. The:latesttag follows the newest release (no-rc.N), so
v0.3.0 publishes it first. - Person pages show a biography, birth date, death date and birthplace from
TMDb. Opening a person without metadata fetches it, and the "Refresh
People" scheduled task fetches it for every person not yet refreshed
(D-74). Cast and crew keep their TMDb person ID. This needs a TMDb API
key (D-11). - The integrations guide: connect Seerr, Sonarr, Radarr and Bazarr beside
Jellyfin and after the cutover, with a script that moves Seerr users to
their Deadfin IDs. See
docs/alpha/integrations.md.
Changed
- The startup log names the web client in use: its directory, the source
(data rootorbundled) and the version from itsbuild.json. - The quick start and the install guide put TMDb API key setup first.
DEADFIN_DATA_DIRsets the data root.JELLYFIN_DATA_DIRstays as the
fallback. The image sets its default,/var/lib/deadfin, inJELLYFIN_DATA_DIR,
so a deployment that sets either variable overrides it. Deadfin
logs a warning for each setJELLYFIN_CONFIG_DIR,JELLYFIN_CACHE_DIR,
JELLYFIN_LOG_DIRorJELLYFIN_WEB_DIR.
Security
POST /Sessions/CapabilitiesandPOST /Sessions/Capabilities/Full
refuse another user's session ID from a non-administrator caller (D-67)./web/responses sendReferrer-Policy: no-referrerand
X-Content-Type-Options: nosniff. When the served client is deadfin-web,
they also send a restrictiveContent-Security-Policywith
frame-ancestors 'none'(D-68).- The one-time setup cookie is
Securewhen aKnownProxiespeer reports
HTTPS inX-Forwarded-Proto. Behind a TLS-terminating proxy, list the
proxy inKnownProxiesbefore first start (D-53).
Fixed
- HLS plays an audio track that starts late. A track whose first packet is
more than 1 s into the file is encoded with leading silence instead of
copied: AAC when the client accepts it, else AC3 or E-AC3. A copied late
AC3 track gave an init segment withoutdac3and first segments without
audio, and AVPlayer failed the item at once. The Italian stereo track of a
4K remux starts at 33.55 s (#681, D-82). - Embedded text subtitles of large files load. One ffmpeg pass extracts
every embedded subtitle stream of a file into the subtitle cache, text
streams included, as upstream does. The first request waits for the pass
underSubtitleExtractionTimeoutMinutes; later requests read the cache. The
forced track of a 4K remux returned 500 after 30 s (#676, D-52). GET /UserItems/ResumeandGET /Users/{userId}/Items/Resumehonor
parentId: they return only the in-progress items under the series,
season, folder, library, collection, or playlist. Before, they returned the
whole resume list, so the series Play button in Swiftfin played an
unrelated movie.excludeActiveSessionsnow drops the items the user is
playing, and the Latest exclusions apply only to the unscoped list, as
upstream does (#674).- Sessions report the real play method. A report with no
PlayMethodis
Transcodewhile a transcoding job runs for itsPlaySessionId, else
DirectPlay, as upstream does./SessionscarriesTranscodingInfofor a
running HLS job, so an HLS remux no longer shows as direct play (#635). GET /Library/MediaFoldersreturns the library roots, as upstream does:
the enabled collection folders and the hidden playlists folder, ordered by
sort name, with theisHiddenfilter, for administrators only. Seerr and
other Jellyfin tools that list libraries this way work without a fallback.
The playlists folder projects asManualPlaylistsFolderwith
CollectionTypeplaylists(#596).- Comma-delimited enum query parameters drop unknown values, as upstream
does. Infuse home rows (/Items/Latestwith an Emby field) load again. GET /MediaSegments/{itemId}returns an emptyQueryResultfor a known
item (Infuse called it on every play).- HLS stream copy of Dolby Vision profile 7 (
DOVIWithEL) is taggedhvc1,
so the init segment matches thehvc1master playlist and AVPlayer can
decode the HDR10 base layer (D-65). - The H.264 level in the HLS master playlist matches the level the encoder
writes (D-66). - The HLS throttler and the transcode cache limits pause ffmpeg again.
jellyfin-ffmpeg 8 does not pause on the old key, so a fast remux kept writing
segments far ahead of playback. - A user with access to only some libraries can open a person, genre or
studio by its ID, as upstream does. Cast portraits returned 404 for these
users. Lists keep the library restriction.
Image
docker pull ghcr.io/deadfin-org/deadfin:v0.3.0-rc.13
docker pull ghcr.io/deadfin-org/deadfin@sha256:ed9fb53ee3dfa5d7b0980f46d9b160d16843a73b9e1fdb2f5734363fd3d0b2e0Platforms: linux/amd64, linux/arm64. See docs/alpha to install.
Verify
The image carries a build provenance attestation and an SPDX SBOM attestation for each architecture. The SBOMs are attached to this release.
gh attestation verify oci://ghcr.io/deadfin-org/deadfin@sha256:ed9fb53ee3dfa5d7b0980f46d9b160d16843a73b9e1fdb2f5734363fd3d0b2e0 --repo deadfin-org/deadfin