
Build a declarative NixOS media stack, verify it locally, and expose only the web service you intend to share
Nixflix brings services such as Jellyfin, Seerr, Sonarr, Radarr, Lidarr, and Prowlarr into a declarative NixOS configuration. This guide explains the evidence-backed setup workflow, shows a documented starter configuration, and emphasizes local verification before remote access. After the selected service works on the NixOS host, we explain how to connect its HTTP endpoint to a Localtonet tunnel without inbound router port forwarding, firewall changes, VPN setup, or a public IP address. Because Nixflix service addresses and ports depend on the deployed configuration, the Localtonet target must come from your working system rather than an assumed default.
What Nixflix configures on NixOS

Nixflix is a declarative media server configuration manager for NixOS. Its purpose is to automate the connective configuration required by a media stack rather than leaving every integration to be completed manually through separate web interfaces. The project supports a Starr stack containing Sonarr, Radarr, Lidarr, and Prowlarr, along with user-facing and supporting services such as Jellyfin, Seerr, Navidrome, SABnzbd, qBittorrent, and Maintainerr.
The project uses the official REST APIs of supported services, with a small number of documented exceptions, to apply configuration represented through NixOS options. Its design is idempotent, so the declared configuration remains the source of truth and can be applied repeatedly. Nixflix can also create media and state directories, configure relationships between services, establish root folders, and manage custom service dependencies.
This architecture is important for remote access. Nixflix does not represent one universal web application with one guaranteed port. It can configure several independent services, and each service has a different role. Jellyfin is typically the interface used to browse and stream a personal media library, while Seerr provides media request management and integrates with Jellyfin libraries and Starr services. Administrative tools such as Sonarr, Radarr, and Prowlarr have powerful management interfaces that generally deserve more restrictive access than a user-facing media or request interface.
Plan the installation before changing the server
Start with the current Nixflix documentation and its Installation Guide. Nixflix is an actively developed NixOS project, and the exact method used to add it to a system can change between releases. The available evidence establishes that users should begin with the Installation Guide, then use the examples and complete option reference. It does not establish a universal flake input, import expression, channel requirement, or compatibility matrix that can safely be copied into every NixOS installation.
For that reason, this guide does not invent a flake URL, module import path, release pin, or NixOS version requirement. Follow the installation syntax shown by the documentation for the Nixflix release you actually select. If upgrading from an earlier deployment, read the relevant release notes before rebuilding. Nixflix v3.0.0 included a breaking change related to where the Jellyfin manifest is obtained, so an older configuration should not be assumed to migrate without review.
The repository documents commands such as nix develop, nix fmt, and nix flake check for development, formatting, and validation of the project itself. Those commands do not constitute the documented end-user installation procedure. Use the current Nixflix Installation Guide for the module inclusion method.
Install and configure Nixflix
Open the current Nixflix Installation Guide
Confirm the supported installation approach for your chosen Nixflix release and NixOS configuration style. Apply the documented module inclusion instructions exactly, including any release pinning or import details shown there. Do not infer those details from repository development files.
Choose the services and storage paths
Decide which components you actually need and select appropriate media and state directories. A smaller initial deployment is easier to validate. For example, begin with Jellyfin and only the Starr or download services required by your workflow rather than enabling every available component at once.
Add the documented Nixflix options
Add a nixflix configuration to the NixOS module configuration after completing the official installation step. Use secret files for API keys and adjust all example paths to match the server. The starter configuration below is based on the project’s documented quick example, but it is not a substitute for installing and importing the module correctly.
Rebuild the NixOS system
Review the configuration and apply it with the standard NixOS rebuild process. Resolve evaluation or activation errors before moving on. A tunnel cannot correct an invalid NixOS module declaration or a service that failed to start.
Verify the selected service locally
Confirm that Jellyfin, Seerr, or the chosen reverse proxy is running and reachable from the device that will run our client. Record the actual local IP address, hostname, scheme, and port. These observed values become the Localtonet HTTP tunnel target.
The Nixflix quick example demonstrates the shape of a small configuration with Sonarr, Prowlarr, SABnzbd, and Jellyfin enabled. It also demonstrates secret-file references rather than embedding API key values directly in the Nix expression:
{ nixflix = {
enable = true;
mediaDir = "/data/media";
stateDir = "/var/lib";
sonarr = {
enable = true;
config.apiKey = {
_secret = "/run/secrets/sonarr-api-key";
};
};
prowlarr = {
enable = true;
config.apiKey = {
_secret = "/run/secrets/prowlarr-api-key";
};
};
sabnzbd = {
enable = true;
settings.misc.api_key = {
_secret = "/run/secrets/sabnzbd-api-key";
};
};
jellyfin.enable = true;
}; }
Treat this as a starting structure, not a complete production policy. The referenced secret files must exist through a secret-management approach appropriate for the system, and their contents must never be committed to a public repository. The media directory must be mounted and readable by the relevant services. The complete Nixflix reference should be used for service-specific options, users, libraries, quality profiles, download clients, reverse proxies, and other integrations.
Rebuild and verify local operation

After the Nixflix module has been installed and configured according to its documentation, apply the NixOS configuration:
sudo nixos-rebuild switch
A successful rebuild is only the first verification checkpoint. Check the systemd status of every service you intend to use. For a Jellyfin deployment, the documented status command is:
sudo systemctl status jellyfin
The standard NixOS Jellyfin service uses port 8096 by default, and a standalone local installation can normally be tested at http://localhost:8096. However, Nixflix supports nginx and Caddy reverse-proxy integration, and your Nixflix options can produce a different effective endpoint. Do not assume that port when a proxy, custom network configuration, or service-specific override is active.
Test the exact endpoint from the machine that will run the Localtonet client. If the client runs directly on the NixOS server, a loopback address may be suitable. If it runs on another device, the service must be reachable from that device over the local network. Complete Jellyfin’s application setup, confirm that its web interface loads, and verify that authentication works before making it remotely reachable.
Localtonet forwards requests to the local IP address and port you configure. It does not discover the Nixflix service or repair a failed reverse proxy. If the selected endpoint does not load locally from the client device, resolve the NixOS service, permissions, proxy, or network issue before creating a tunnel.
Choose the right endpoint to expose
Expose the smallest useful surface. Jellyfin is appropriate when remote users need to browse or stream an authorized personal library. Seerr is appropriate when users should submit and manage media requests without receiving access to the broader administration stack. An nginx or Caddy endpoint can be appropriate when Nixflix already places the service behind a configured reverse proxy.
| Endpoint | Typical purpose | Remote-access consideration |
|---|---|---|
| Jellyfin | Browse and stream a personal media library | Verify user authentication, library permissions, and the actual local HTTP endpoint before tunneling. |
| Seerr | Media request management | Prefer this narrower interface when remote users only need to request content rather than administer the stack. |
| nginx or Caddy | Reverse proxy in front of a selected service | Target the working proxy listener and confirm its host-routing behavior locally before public access. |
| Sonarr, Radarr, or Prowlarr | Administrative media automation | These interfaces can control libraries, indexers, and automation. Avoid broad exposure unless it is necessary and strongly access-controlled. |
Configure strong application credentials and least-privilege accounts before starting the tunnel. Never place API keys in a public URL, browser bookmark, article, or shared configuration. Review the selected service’s permissions and expose only the interface that remote users require.
Add Localtonet remote HTTP access

Once the Nixflix service is working locally, an HTTP tunnel is the natural fit for a browser-based Jellyfin, Seerr, nginx, or Caddy endpoint. Our client establishes an outbound connection to a Localtonet relay server, so this workflow does not require inbound router port forwarding, firewall changes, VPN setup, or a public IP address. The resulting tunnel provides a public address while the selected client is connected and the tunnel is running.
Install and run the Localtonet client
Install our client on the NixOS host or another device that can reach the verified Nixflix HTTP endpoint. Keep the client running for as long as remote access is required.
Authenticate the client device
Use the device-specific authentication token assigned through our platform. Treat the token as a secret, never place it in the Nixflix configuration, and never publish it in logs or screenshots.
Select an available relay server
Choose a currently available server or region from the dashboard. Available values can vary, so obtain the selection from the current product instead of copying a hardcoded server code from a tutorial.
Create an HTTP tunnel for the verified endpoint
Enter the local IP address and port that successfully served Jellyfin, Seerr, nginx, or Caddy during local testing. Do not guess the port. HTTP tunnels can use a random subdomain, a supported custom subdomain, or a custom domain, with the current dashboard determining the available choices.
Start the tunnel and test the public address
Creating a tunnel does not start it. Press Start, then open the assigned public URL and verify the expected application, sign-in flow, and content permissions from an external connection.
Stop or delete access when it is no longer needed
Stop the tunnel to make the public endpoint unavailable while retaining its configuration, or delete it when the configuration is no longer required. The endpoint is available only while the selected client is connected and the tunnel is running.
For current dashboard details, consult our Localtonet HTTP tunnel documentation. Recheck the application after every significant Nixflix or reverse-proxy change. A declarative rebuild can alter service listeners, proxy behavior, or enabled components, so the public endpoint should be retested rather than assumed to remain correct.
Frequently asked questions
Does Nixflix have one default port for the entire media stack?
No. Nixflix configures multiple independent services, and reverse-proxy or network options can change their effective endpoints. Determine the address and port from the deployed service and verify them locally before configuring Localtonet.
Can I use Jellyfin port 8096 as the Localtonet target?
Jellyfin uses port 8096 by default in a standard NixOS setup, but you should use it only if your deployed Nixflix configuration actually serves Jellyfin there. If nginx, Caddy, or another override is active, target the endpoint that you confirmed locally.
Should I expose Jellyfin or Seerr?
Choose Jellyfin when authorized users need library and streaming access. Choose Seerr when they only need media request management. Exposing the narrower interface is generally preferable when it meets the actual requirement.
Does Localtonet require router port forwarding?
No. Our client establishes an outbound connection to a relay server, so the standard tunnel workflow does not require inbound router port forwarding, firewall changes, VPN setup, or a public IP address.
Will creating the tunnel immediately make Nixflix available?
No. Creating a tunnel does not mean it is running. The selected client must be connected, and the tunnel must be started. The local service must also remain healthy and reachable from that client device.
Can a tunnel fix a failed Nixflix or Jellyfin service?
No. Localtonet forwards traffic to the configured local target. NixOS evaluation errors, failed systemd units, incorrect storage permissions, missing secrets, and reverse-proxy problems must be corrected on the local system first.
Connect your verified Nixflix service with Localtonet
Finish the NixOS deployment, confirm Jellyfin or Seerr locally, and then create an HTTP tunnel for that exact endpoint. Keep application authentication enabled and stop the tunnel whenever remote access is not required.
Get Started Free →