Self-hosted deployment platform for Nix flake applications. Connect a GitHub repository, pick a flake output, and deploy — NixHost supervises the process, streams logs, assigns a stable LAN port, and optionally exposes it through Cloudflare Tunnel.
- GitHub auto-deploy — push to your production branch, NixHost redeploys the exact commit. Branch reconciliation catches missed webhooks.
- LAN-first — every application gets a stable port reachable at
http://<device-ip>:<port>with no external dependency. - Quick Tunnels — account-free temporary
trycloudflare.comURLs for the dashboard and every web application, shown only after the public edge reaches the local route whencloudflaredis available. - Persistent named tunnels — optional Cloudflare OAuth or manual API token connection for custom domains, DNS management and multi-zone support.
- Encrypted secrets — environment variables are encrypted at rest and never
returned by APIs. Paste directly from a
.envfile. - Zero-downtime deploys — the current healthy release stays routed until the candidate passes health checks.
Prerequisites: a working Nix installation on
x86_64-linux, aarch64-linux, or aarch64-darwin.
nix develop
pnpm install
pnpm devOpen one of the clearly marked setup URLs printed in your terminal to claim the
instance and create the owner account. NixHost prints the LAN URL (or a local
URL for a loopback-only binding) and also prints a Quick Tunnel URL when
cloudflared becomes available. The link carries the one-time claim token, so
there is no token field to copy. Creating the owner account signs you in
immediately.
- Connect GitHub from the Applications page — NixHost creates a per-node GitHub App through the manifest flow.
- Search and select a repository granted to the App installation, or paste a public GitHub HTTPS URL.
- Pick the flake output (defaults to
apps.<system>.default). - Configure health path and environment variables.
- Deploy — NixHost clones, evaluates the flake, builds via
nix run, and health-checks the candidate before switching traffic.
A web application must remain in the foreground and listen on HOST and PORT.
Mutable state belongs under DATA_DIR. The repository must contain flake.nix
and flake.lock.
apps.${system}.default = {
type = "app";
program = "${package}/bin/server";
};See docs/DEPLOYMENT_CONTRACT.md and the
example projects.
- Next.js App Router, React, TypeScript strict mode
- Node.js 24, SQLite through
better-sqlite3 - Tailwind CSS, daisyUI
- Zod validation, Server-Sent Events
- Biome (format + lint), Vitest, Playwright
- Nix, Git and cloudflared as managed executables
- Architecture
- Deployment contract
- Security model
- GitHub integration
- Cloudflare integration
- Android and Nix-on-Droid
- Operations
- Testing
- Known limitations
- Product requirements
- Specification
- Implementation status
Every imported repository executes arbitrary code under the NixHost OS account. Nix flakes provide reproducibility, not a security boundary. Only deploy repositories you trust.
Apache-2.0. Copyright 2026 Rituraj Basak. See LICENSE.