{ description = "Ultimate Notetaking, Sync & Backup System - NixOS configuration for managing personal data"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; home-manager = { url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; }; sops-nix = { url = "github:Mic92/sops-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; lux = { url = "path:/home/blu/src/lux/lang"; inputs.nixpkgs.follows = "nixpkgs"; }; # Optional: Neovim distribution # nixvim = { # url = "github:nix-community/nixvim"; # inputs.nixpkgs.follows = "nixpkgs"; # }; }; outputs = { self, nixpkgs, home-manager, sops-nix, lux, ... }@inputs: let # Supported systems supportedSystems = [ "x86_64-linux" "aarch64-linux" ]; # Helper to generate outputs for all systems forAllSystems = nixpkgs.lib.genAttrs supportedSystems; # Nixpkgs instantiated for each system nixpkgsFor = forAllSystems (system: import nixpkgs { inherit system; config.allowUnfree = false; # FOSS only }); # Shared modules for all hosts sharedModules = [ ./modules/pal.nix ./modules/nb.nix ./modules/syncthing.nix ./modules/backup.nix sops-nix.nixosModules.sops ]; # Create a NixOS configuration for a host mkHost = { hostname, system ? "x86_64-linux", extraModules ? [] }: nixpkgs.lib.nixosSystem { inherit system; specialArgs = { inherit inputs; }; modules = sharedModules ++ [ ./hosts/${hostname}/configuration.nix home-manager.nixosModules.home-manager { home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true; # home-manager.users.YOUR_USERNAME = import ./home; } ] ++ extraModules; }; in { # Pal CLI package packages = forAllSystems (system: let pkgs = nixpkgsFor.${system}; luxPkg = lux.packages.${system}.default; in { pal = pkgs.stdenv.mkDerivation { pname = "pal"; version = "0.1.0"; src = ./cli; nativeBuildInputs = [ luxPkg pkgs.gcc ]; buildPhase = '' ${luxPkg}/bin/lux compile pal.lux -o pal ''; installPhase = '' mkdir -p $out/bin cp pal $out/bin/ ''; meta = { description = "Personal data infrastructure CLI"; homepage = "https://github.com/user/pal"; license = pkgs.lib.licenses.mit; }; }; default = self.packages.${system}.pal; } ); # NixOS configurations # Uncomment and customize for your hosts: # # nixosConfigurations = { # desktop = mkHost { hostname = "desktop"; }; # laptop = mkHost { hostname = "laptop"; }; # server = mkHost { # hostname = "server"; # extraModules = [ # ./modules/server/forgejo.nix # ./modules/server/immich.nix # ./modules/server/jellyfin.nix # ]; # }; # }; # One-command setup: nix run . apps = forAllSystems (system: let pkgs = nixpkgsFor.${system}; setupScript = pkgs.writeShellApplication { name = "usync-setup"; runtimeInputs = with pkgs; [ git jq age sops syncthing qrencode zbar ffmpeg ]; text = '' # Find the setup script SCRIPT_DIR="''${UNSBS_DIR:-}" if [[ -z "$SCRIPT_DIR" ]]; then # Try current directory first if [[ -f "./setup" ]]; then SCRIPT_DIR="." # Try the flake source elif [[ -f "${self}/setup" ]]; then SCRIPT_DIR="${self}" else echo "Error: Cannot find setup script" echo "Run from the repo directory, or clone it first:" echo " git clone ssh://git@your-server:2222/you/pal.git" exit 1 fi fi exec "$SCRIPT_DIR/setup" "$@" ''; }; in { default = { type = "app"; program = "${setupScript}/bin/usync-setup"; }; setup = { type = "app"; program = "${setupScript}/bin/usync-setup"; }; } ); # Development shell with all tools devShells = forAllSystems (system: let pkgs = nixpkgsFor.${system}; in { default = pkgs.mkShell { name = "unsbs-dev"; packages = [ lux.packages.${system}.default self.packages.${system}.pal ] ++ (with pkgs; [ # Tier 2: Notes & Sync nb # Notebook CLI syncthing # File sync unison # Alternative sync # Tier 3: Backup & Cloud restic # Backup rclone # Cloud storage # Setup & Pairing qrencode # QR codes for mobile pairing zbar # QR scanning (zbarimg) ffmpeg # Camera preview + capture age # Encryption for secrets sops # Secret management # Development git neovim jq ripgrep fd # Nix tools nil # Nix LSP nixpkgs-fmt # Nix formatter ]); shellHook = '' printf '\033[1m%s\033[0m\n' "pal - Your personal data, everywhere" echo "" echo "Get started: pal onboard" echo "Status: pal status" echo "Help: pal help" ''; }; } ); # Export modules for use in other flakes nixosModules = { pal = import ./modules/pal.nix; nb = import ./modules/nb.nix; syncthing = import ./modules/syncthing.nix; backup = import ./modules/backup.nix; default = { imports = sharedModules; }; }; # Templates for creating new hosts templates = { default = { path = ./templates/host; description = "Template for a new host configuration"; }; }; }; }