working version

This commit is contained in:
2026-04-27 18:40:39 -04:00
commit cf9c61e67a
4 changed files with 319 additions and 0 deletions

13
.gitignore vendored Normal file
View File

@@ -0,0 +1,13 @@
# Nix build outputs
result
result-*
# Nix evaluation caches
.direnv/
.envrc
# Editor noise
.vscode/
.idea/
*.swp
*~

159
README.md Normal file
View File

@@ -0,0 +1,159 @@
# fladder — NixOS package
Unofficial NixOS package for [Fladder](https://github.com/DonutWare/Fladder),
a cross-platform [Jellyfin](https://jellyfin.org/) client built on Flutter.
## Files
| File | Purpose |
|---|---|
| `package.nix` | The derivation (import this into your config or flake) |
| `default.nix` | Convenience wrapper for `nix-build` local testing |
## Quick start
```bash
# Build and test locally
nix-build # produces ./result/bin/fladder
./result/bin/fladder
```
## Adding to your NixOS configuration
### Standalone (no flake)
Copy this repo somewhere (e.g. `~/nixpkgs-overlays/fladder/`) then in
`/etc/nixos/configuration.nix`:
```nix
{ pkgs, ... }:
let
fladder = pkgs.callPackage /path/to/this/repo/package.nix { };
in
{
environment.systemPackages = [ fladder ];
}
```
### As an overlay
```nix
# In configuration.nix or a separate overlay file:
nixpkgs.overlays = [
(final: prev: {
fladder = final.callPackage /path/to/this/repo/package.nix { };
})
];
environment.systemPackages = [ pkgs.fladder ];
```
### With flakes
```nix
# flake.nix
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
fladder-pkg.url = "path:/path/to/this/repo"; # or a github: URL
};
outputs = { nixpkgs, fladder-pkg, ... }: {
nixosConfigurations.mymachine = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
({ pkgs, ... }: {
environment.systemPackages = [
fladder-pkg.packages.x86_64-linux.fladder
];
})
];
};
};
}
```
## Package notes
### AppImage type
Fladder distributes a **Type 2 (SquashFS)** AppImage built with
[appimage-builder](https://appimage-builder.readthedocs.io/). The derivation
uses `appimageTools.wrapType2`, which:
1. Extracts the SquashFS filesystem.
2. Patches the ELF interpreter and `RPATH` to point at the Nix store.
3. Wraps the binary in a minimal FHS environment that provides the expected
shared libraries.
### Runtime dependencies
The main external shared libraries are:
| Library | Why needed |
|---|---|
| `libmpv` | Media playback (video/audio streaming) |
| `gtk3` | Flutter Linux window embedder |
| `libGL` / `mesa` | Flutter Impeller / OpenGL compositor |
| `libxkbcommon` | Keyboard input |
| `wayland` | Native Wayland support (Flutter ≥ 3.13) |
| `libpulseaudio` | Audio (mpv PulseAudio / PipeWire-pulse back-end) |
| `python3` | `libmpv` in nixpkgs pulls in `vapoursynth` which `dlopen`s `libpython` |
The `python3` dependency is subtle but important: without it the app exits
immediately with `libpython3.x.so.1.0: cannot open shared object file`
([upstream issue #724](https://github.com/DonutWare/Fladder/issues/724)).
### AMD GPU (RX 580)
The RX 580 uses the open-source `amdgpu` / `radeonsi` Mesa driver stack,
which is included via `pkgs.mesa` in `extraPkgs`. No additional configuration
should be required. If you encounter rendering artefacts, try:
```nix
# In configuration.nix
hardware.opengl.enable = true; # (or hardware.graphics.enable on 25.05+)
hardware.opengl.driSupport = true;
```
### X11 / Wayland
Fladder runs on both. Flutter will prefer Wayland when `WAYLAND_DISPLAY` is
set; it falls back to X11/XWayland otherwise. No special flags are needed.
### Updating to a new version
1. Update `version` in `package.nix`.
2. Update the `hash` field — get the new hash with:
```bash
nix-prefetch-url --type sha256 \
https://github.com/DonutWare/Fladder/releases/download/vNEW/Fladder-Linux-NEW.AppImage
# Convert to SRI format:
nix hash to-sri --type sha256 <raw-hash>
```
3. Run `nix-build` and test.
## Troubleshooting
**`libmpv.so: cannot open shared object file`**
: Ensure `pkgs.mpv` is in `extraPkgs`. If you build mpv yourself with custom
options, the `.so` name or version may differ — check with
`nix run nixpkgs#patchelf -- --print-needed result/bin/.fladder-wrapped`.
**`libpython3.x.so.1.0: cannot open shared object file`**
: The `python3` package in `extraPkgs` should fix this. If it persists, pin
the python version to match the one nixpkgs' mpv was linked against.
**App window is black / no video**
: Make sure Mesa / OpenGL is enabled in your NixOS config (see AMD GPU section
above). Also try setting `LIBGL_ALWAYS_SOFTWARE=0` to rule out Mesa's
software rasterizer being selected.
**Wayland: window appears but is blank**
: Try forcing X11 as a workaround: `WAYLAND_DISPLAY="" ./result/bin/fladder`.
This is a known Flutter/Wayland edge case on some compositor versions.
## License
The Nix packaging files in this repo are released under the MIT license.
Fladder itself is [GPL-3.0](https://github.com/DonutWare/Fladder/blob/develop/LICENSE).

22
default.nix Normal file
View File

@@ -0,0 +1,22 @@
# default.nix — local test entry-point
#
# Usage
# -----
# nix-build # build the package
# nix-build -A fladder # explicit attribute (same result)
# ./result/bin/fladder # run the built binary
#
# To drop into a shell with the package available:
# nix-shell -p "$(nix-build --no-out-link)"
#
# Or with nix shell (flake-agnostic):
# nix shell "$(nix-build --no-out-link)"
let
# Pin to a recent nixpkgs revision that ships NixOS 25.11 packages.
# Replace <nixpkgs> with a pinned fetchTarball for fully reproducible builds.
pkgs = import <nixpkgs> { };
in
{
fladder = pkgs.callPackage ./package.nix { };
}

125
package.nix Normal file
View File

@@ -0,0 +1,125 @@
{
lib,
appimageTools,
fetchurl,
makeDesktopItem,
copyDesktopItems,
imagemagick,
}:
let
pname = "fladder";
version = "0.10.3";
src = fetchurl {
url = "https://github.com/DonutWare/Fladder/releases/download/v${version}/Fladder-Linux-${version}.AppImage";
hash = "sha256-t9/rB7Iv0GI5HJWwBUQwfxISPpbYPeRouS6oD8BKMEY=";
};
# Extract the AppImage contents so we can pull out the icon.
# Fladder uses appimage-builder → Type 2 (SquashFS) AppImage.
appimageContents = appimageTools.extractType2 { inherit pname version src; };
in
appimageTools.wrapType2 rec {
inherit pname version src;
# ---------------------------------------------------------------------------
# Extra libraries injected into the FHS environment that wrapType2 creates.
#
# Why these?
# • libmpv Fladder is a media client; it links against libmpv at
# runtime (confirmed by AUR fladder-bin/fladder-git and the
# INSTALL.md "libmpv shared library errors" note).
# • gtk3 Flutter on Linux uses GTK3 for window management.
# • glib / pango / cairo / harfbuzz / fontconfig
# Transitive GTK3 / Flutter rendering dependencies.
# • libGL / mesa-gl-headers
# Flutter's Linux embedder always links libGL even when
# the app itself is not "GPU heavy". Needed for the
# OpenGL compositor / Impeller.
# • xorg.libX11 / libxkbcommon
# X11 window system support; also required under Wayland
# (XWayland path).
# • wayland Native Wayland support (Flutter >= 3.13 supports it).
# • dbus System notifications and D-Bus IPC.
# • alsa-lib Audio output via mpv's ALSA back-end.
# • libpulseaudio
# Audio output via mpv's PulseAudio / PipeWire-pulse
# back-end (preferred over bare ALSA on most desktops).
# • python3 libmpv in nixpkgs is built with vapoursynth support
# which dlopen's libpython at runtime. Without this the
# binary exits with "cannot open shared object file:
# libpython3.x.so.1.0" (upstream issue #724).
# ---------------------------------------------------------------------------
extraPkgs = pkgs: [
pkgs.mpv
pkgs.gtk3
pkgs.glib
pkgs.pango
pkgs.cairo
pkgs.harfbuzz
pkgs.fontconfig
pkgs.freetype
pkgs.libGL
pkgs.mesa
pkgs.xorg.libX11
pkgs.xorg.libXext
pkgs.xorg.libXrender
pkgs.libxkbcommon
pkgs.wayland
pkgs.dbus
pkgs.alsa-lib
pkgs.libpulseaudio
pkgs.python3
# Needed by some AppImageLauncher / appimage-builder runtime stubs
pkgs.fuse
pkgs.libepoxy
pkgs.lz4
];
# ---------------------------------------------------------------------------
# Post-install: wire up the .desktop file and icon.
#
# appimage-builder places the icon at:
# AppDir/usr/share/icons/fladder_icon_desktop.png
# and the upstream .desktop ID is nl.jknaapen.fladder.
# We install both a correctly-named .desktop file and a hicolor icon so
# the app appears in application launchers without extra config.
# ---------------------------------------------------------------------------
extraInstallCommands = ''
# Icon
install -Dm644 \
${appimageContents}/usr/share/icons/fladder_icon_desktop.png \
$out/share/icons/hicolor/256x256/apps/fladder.png
# Desktop file
install -Dm644 \
${appimageContents}/nl.jknaapen.fladder.desktop \
$out/share/applications/fladder.desktop
# Fix the Exec line so it points at the wrapped binary in $out/bin.
substituteInPlace $out/share/applications/fladder.desktop \
--replace-fail 'Exec=Fladder' 'Exec=fladder' \
--replace-quiet 'Icon=fladder_icon_desktop' 'Icon=fladder'
'';
meta = {
description = "Cross-platform Jellyfin frontend built on Flutter";
longDescription = ''
Fladder is a feature-rich Jellyfin client that supports streaming,
offline sync, trickplay scrubbing, intro/credits skipping, Jellyseerr
integration, comic-book reading, and more. It targets Linux, Windows,
macOS, Android, iOS, and Web from a single Flutter codebase.
'';
homepage = "https://github.com/DonutWare/Fladder";
downloadPage = "https://github.com/DonutWare/Fladder/releases";
changelog = "https://github.com/DonutWare/Fladder/releases/tag/v${version}";
license = lib.licenses.gpl3Only;
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
# AppImage is x86_64-only upstream.
platforms = [ "x86_64-linux" ];
mainProgram = "fladder";
maintainers = [ ]; # add yourself: lib.maintainers.yourhandle
};
}