{ 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"; }; # Optional: Neovim distribution # nixvim = { # url = "github:nix-community/nixvim"; # inputs.nixpkgs.follows = "nixpkgs"; # }; }; outputs = { self, nixpkgs, home-manager, sops-nix, ... }@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/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 { # 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/grapho.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 = 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' "Ultimate Notetaking, Sync & Backup System" echo "" echo "Get started: ./setup" echo "Pair mobile: ./setup mobile" echo "Sync: ./scripts/usync" echo "Status: ./scripts/ustatus" ''; }; } ); # Export modules for use in other flakes nixosModules = { 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"; }; }; }; }