{ description = "Puppy Tracker — offline-first puppy tracking app with server-side sync."; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils }: let mkStatic = pkgs: pkgs.stdenvNoCC.mkDerivation { pname = "puppy-tracker-static"; version = "0.2.0"; src = ./src; dontConfigure = true; dontBuild = true; installPhase = '' mkdir -p $out/share/puppy-tracker cp -r ./* $out/share/puppy-tracker/ ''; }; mkServer = pkgs: pkgs.buildGoModule { pname = "puppy-tracker-server"; version = "0.2.0"; src = ./server; vendorHash = null; # no external dependencies # Pure-Go build for a tiny static binary. env.CGO_ENABLED = "0"; ldflags = [ "-s" "-w" ]; # The binary built from `module puppy-tracker` is `puppy-tracker`, # rename so the executable name reflects its role. postInstall = '' mv $out/bin/puppy-tracker $out/bin/puppy-tracker-server ''; meta.mainProgram = "puppy-tracker-server"; }; in { nixosModules.default = import ./module.nix self; nixosModules.puppy-tracker = self.nixosModules.default; } // flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; static = mkStatic pkgs; server = mkServer pkgs; in { packages.static = static; packages.server = server; # `default` bundles both so `nix build` produces a runnable directory. packages.default = pkgs.symlinkJoin { name = "puppy-tracker"; paths = [ server static ]; }; devShells.default = pkgs.mkShell { packages = [ pkgs.go pkgs.python3 ]; shellHook = '' echo "puppy-tracker dev shell" echo " cd server && go run . -static ../src -data /tmp/puppy-events.json" ''; }; # `nix run` → start the server, serving the bundled static files, # storing data in $XDG_DATA_HOME/puppy-tracker/events.json. apps.default = { type = "app"; program = toString (pkgs.writeShellScript "puppy-tracker-run" '' data_dir="''${XDG_DATA_HOME:-$HOME/.local/share}/puppy-tracker" mkdir -p "$data_dir" exec ${server}/bin/puppy-tracker-server \ -addr "''${PUPPY_ADDR:-:8080}" \ -static ${static}/share/puppy-tracker \ -data "$data_dir/events.json" ''); meta.description = "Run puppy-tracker locally (data in $XDG_DATA_HOME/puppy-tracker)"; }; } ); }