# nb - CLI Notebook Module # # This module installs and configures nb, a command-line notebook tool # with git-backed versioning and sync. # # Usage in your configuration.nix: # programs.nb.enable = true; # programs.nb.notebooks.personal.remote = "git@forgejo:you/notes.git"; { config, lib, pkgs, ... }: with lib; let cfg = config.programs.nb; in { options.programs.nb = { enable = mkEnableOption "nb notebook CLI"; package = mkOption { type = types.package; default = pkgs.nb; defaultText = literalExpression "pkgs.nb"; description = "The nb package to use."; }; defaultNotebook = mkOption { type = types.str; default = "home"; description = "The default notebook name."; }; editor = mkOption { type = types.str; default = "nvim"; description = "Editor to use for editing notes."; }; defaultExtension = mkOption { type = types.str; default = "md"; description = "Default file extension for new notes."; }; autoSync = mkOption { type = types.bool; default = false; description = '' Whether to automatically sync notebooks after operations. Note: This can slow down operations if network is slow. ''; }; colorTheme = mkOption { type = types.str; default = "blacklight"; description = "Color theme for nb (see 'nb settings colors')."; }; notebooks = mkOption { type = types.attrsOf (types.submodule { options = { remote = mkOption { type = types.nullOr types.str; default = null; description = "Git remote URL for syncing this notebook."; example = "git@github.com:user/notes.git"; }; encrypted = mkOption { type = types.bool; default = false; description = "Whether to encrypt notes in this notebook."; }; }; }); default = {}; description = "Notebooks to configure with their remotes."; example = literalExpression '' { personal = { remote = "git@forgejo:user/personal.git"; }; work = { remote = "git@forgejo:user/work.git"; encrypted = true; }; } ''; }; }; config = mkIf cfg.enable { environment.systemPackages = [ cfg.package pkgs.git # nb requires git pkgs.bat # Optional: better file viewing pkgs.w3m # Optional: for nb browse ]; # Set environment variables for nb environment.variables = { EDITOR = cfg.editor; NB_DEFAULT_EXTENSION = cfg.defaultExtension; NB_AUTO_SYNC = if cfg.autoSync then "1" else "0"; NB_COLOR_THEME = cfg.colorTheme; }; # Create activation script to set up notebooks system.activationScripts.nb-setup = let notebookSetup = concatStringsSep "\n" (mapAttrsToList (name: opts: '' # Create notebook if it doesn't exist if ! ${cfg.package}/bin/nb notebooks | grep -q "^${name}$"; then echo "Creating nb notebook: ${name}" ${cfg.package}/bin/nb notebooks add ${name} fi ${optionalString (opts.remote != null) '' # Set remote for notebook echo "Setting remote for ${name}: ${opts.remote}" ${cfg.package}/bin/nb ${name}:remote set ${opts.remote} 2>/dev/null || true ''} '') cfg.notebooks); in stringAfter [ "users" ] '' # Skip if running in a chroot or during initial install if [ -d /home ]; then ${notebookSetup} fi ''; # Optional: systemd timer for periodic sync # Uncomment if you want automatic background sync # # systemd.user.services.nb-sync = { # description = "Sync nb notebooks"; # serviceConfig = { # Type = "oneshot"; # ExecStart = "${cfg.package}/bin/nb sync --all"; # }; # }; # # systemd.user.timers.nb-sync = { # description = "Periodic nb sync"; # wantedBy = [ "timers.target" ]; # timerConfig = { # OnCalendar = "*:0/15"; # Every 15 minutes # Persistent = true; # }; # }; }; }