Compare commits

...

21 Commits

Author SHA1 Message Date
aner c0f72be869 Beacon config, beacon integration into emacs 2026-06-01 11:43:42 +03:00
aner e271872cae Qutebrowser fix, attic setup, beacon usb live setup 2026-05-30 13:22:18 +03:00
aner 27fafdc111 Better suite dependencies 2026-05-28 22:59:22 +03:00
aner fcb7e0b884 Refractor to dendritic approach. 2026-05-24 19:24:38 +03:00
aner d4dee59413 Package lint inclusion 2026-05-24 17:22:54 +03:00
aner cf57b3eb4a Bugfix for dashboard 2026-05-19 22:44:11 +03:00
aner e5bf9c0a41 Updated 2026-05-17 11:48:46 +03:00
aner 00f62d61eb Fix 2026-05-17 11:23:27 +03:00
aner c4066da976 New azos-core 2026-05-12 23:33:55 +03:00
aner 6751554982 Better exfat support 2026-05-12 10:28:18 +03:00
aner 83c279ded4 Moved autmounting to core 2026-05-12 09:01:11 +03:00
aner f89e04d898 Fix even more things 2026-05-11 15:02:51 +03:00
aner a89f5ca015 Added hl-line externally plus automount 2026-05-11 14:50:45 +03:00
aner 9780d69f25 Updated azos core for safety. 2026-05-08 23:20:11 +03:00
aner 4cd4114f7c Send us back a little bit - I just exernalized evil hl line. 2026-05-08 23:15:15 +03:00
aner ea550d2e8c Updated azos-core, nextcloud client, better zoom for qutebrowser 2026-05-04 14:52:08 +03:00
aner 29a351845b Updated azos-core, cladav sync, arch64 emulation 2026-04-29 20:21:48 +03:00
aner 2d72c3e7df Fixed flake lock submodule things 2026-04-26 00:13:20 +03:00
aner 315e73c63c Fixed git config. 2026-04-25 21:59:10 +03:00
aner 8a8e63b095 Fixed shell handling 2026-04-25 21:40:20 +03:00
aner b68932f516 Fixed submodule handling 2026-04-25 21:39:54 +03:00
73 changed files with 1408 additions and 1134 deletions
+2 -2
View File
@@ -23,8 +23,8 @@ nix build .#formatter.x86_64-linux
```bash
# Rebuild the azos environment for lauretta (this machine) — use this when asked to "rebuild"
sudo nixos-rebuild switch --flake '.?submodules=1#lauretta'
nix flake update # Update all inputs
nix flake lock --update-input X # Update specific input
nix flake update --flake '.?submodules=1' # Update all inputs
nix flake lock --flake '.?submodules=1' --update-input X # Update specific input
```
> **Note**: When the user asks to "rebuild", they mean rebuilding the lauretta environment with the command above — NOT building the VM.
+17
View File
@@ -0,0 +1,17 @@
{
config,
inputs,
...
}: {
config.flake.nixosConfigurations.beacon = inputs.nixpkgs.lib.nixosSystem {
specialArgs = {
inherit inputs;
outputs = config.flake;
suiteModules = config.flake.modules;
};
modules = [../nixos/configuration-beacon.nix];
};
config.flake.packages.x86_64-linux.beacon-image =
config.flake.nixosConfigurations.beacon.config.system.build.image;
}
+14
View File
@@ -0,0 +1,14 @@
{
config,
inputs,
...
}: {
config.flake.nixosConfigurations.lauretta = inputs.nixpkgs.lib.nixosSystem {
specialArgs = {
inherit inputs;
outputs = config.flake;
suiteModules = config.flake.modules;
};
modules = [../nixos/configuration.nix];
};
}
+14
View File
@@ -0,0 +1,14 @@
{
config,
inputs,
...
}: {
config.flake.nixosConfigurations.vm = inputs.nixpkgs.lib.nixosSystem {
specialArgs = {
inherit inputs;
outputs = config.flake;
suiteModules = config.flake.modules;
};
modules = [../nixos/configuration-vm.nix];
};
}
+33
View File
@@ -0,0 +1,33 @@
{...}: {
config.flake.modules.nixos.attic = {
lib,
config,
pkgs,
...
}: {
options.azos.attic.enable = lib.mkOption {
default = false;
example = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.attic.enable {
environment.systemPackages = [pkgs.attic-client];
nix.settings = {
extra-substituters = ["https://attic.zakobar.com/main"];
extra-trusted-public-keys = ["main:9SZt/6plBU7jjQzz90J7O011I13hmJvOMYouxNqExNQ="];
netrc-file = "/etc/nix/attic-netrc";
};
environment.etc."nix/attic-netrc" = {
mode = "0600";
text = ''
machine attic.zakobar.com
login token
password eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjIwOTU3MDk0NDEsIm5iZiI6MTc4MDEzMzQ0MSwic3ViIjoibml4b3MtY2xpZW50IiwiaHR0cHM6Ly9qd3QuYXR0aWMucnMvdjEiOnsiY2FjaGVzIjp7IioiOnsiciI6MX19fX0.lqT_m2otoJQtA_AeJu62NT87u8cMWxgN-JhqtEtZ88s
'';
};
};
};
}
+41
View File
@@ -0,0 +1,41 @@
{...}: {
config.flake.modules.homeManager.audio = {
lib,
config,
...
}: {
options.azos.home-audio.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.home-audio.enable {};
};
config.flake.modules.nixos.audio = {
lib,
config,
pkgs,
...
}: {
options.azos.hardware-audio.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.hardware-audio.enable {
services = {
pipewire = {
enable = true;
audio.enable = true;
pulse.enable = true;
alsa = {
enable = true;
support32Bit = true;
};
jack.enable = true;
};
};
environment.systemPackages = with pkgs; [pavucontrol];
musnix.enable = true;
};
};
}
+15
View File
@@ -0,0 +1,15 @@
{...}: {
config.flake.modules.nixos.binfmt = {
lib,
config,
...
}: {
options.azos.binfmt.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.binfmt.enable {
boot.binfmt.emulatedSystems = ["aarch64-linux"];
};
};
}
+16
View File
@@ -0,0 +1,16 @@
{...}: {
config.flake.modules.nixos.bluetooth = {
lib,
config,
...
}: {
options.azos.bluetooth.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.bluetooth.enable {
services.blueman.enable = true;
hardware.bluetooth.enable = true;
};
};
}
+16
View File
@@ -0,0 +1,16 @@
{...}: {
config.flake.modules.homeManager.claude = {
lib,
config,
pkgs,
...
}: {
options.azos.claude.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.claude.enable {
home.packages = with pkgs; [claude-code claude-agent-acp];
};
};
}
+37
View File
@@ -0,0 +1,37 @@
{...}: {
config.flake.modules.homeManager.encryption = {
lib,
config,
pkgs,
...
}: {
options.azos.encryption.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.encryption.enable {
programs.password-store = {
enable = true;
settings = {
PASSWORD_STORE_KEY = "076AA297579A0064";
};
};
home.packages = with pkgs; [
yubikey-personalization
pinentry-gtk2
];
programs.gpg = {
enable = true;
};
services.gpg-agent = {
enable = true;
enableSshSupport = true;
grabKeyboardAndMouse = false;
pinentry.package = pkgs.pinentry-gtk2;
};
home.file.".ssh/config".source = ./ssh-config;
home.file.".ssh/gpg-as-ssh.pub".source = ./gpg-as-ssh.pub;
home.file.".gnupg/sshcontrol".source = ./sshcontrol;
};
};
}
+32
View File
@@ -0,0 +1,32 @@
{...}: {
config.flake.modules.homeManager.git-config = {
lib,
config,
pkgs,
...
}: {
options.azos.git-config.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.git-config.enable {
home.packages = with pkgs; [pass-git-helper unzip];
programs.git = {
enable = true;
signing = {
key = "6D17E295C70E2674";
signByDefault = true;
};
settings = {
credential.helper = "!pass-git-helper $@";
user = {
name = "Aner Zakobar";
email = "aner@zakobar.com";
};
};
};
home.file.".config/pass-git-helper/git-pass-mapping.ini".source =
./pass-git-mapping.ini;
};
};
}
+20
View File
@@ -0,0 +1,20 @@
{...}: {
config.flake.modules.homeManager.headphones = {
lib,
config,
pkgs,
...
}: {
options.azos.headphones-whmx4000.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.headphones-whmx4000.enable {
home.packages = [
(pkgs.writeShellScriptBin
"azos-connect-headphones-whmx4000"
"echo \"connect AC:80:0A:AF:E1:C2\" | bluetoothctl")
];
};
};
}
+16
View File
@@ -0,0 +1,16 @@
{...}: {
config.flake.modules.homeManager.hfsprogs = {
lib,
config,
pkgs,
...
}: {
options.azos.hfsprogs.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.hfsprogs.enable {
home.packages = with pkgs; [hfsprogs];
};
};
}
+38
View File
@@ -0,0 +1,38 @@
{...}: {
config.flake.modules.homeManager.hyprland = {
lib,
config,
pkgs,
...
}: {
options.azos.suites.hyprland.enable = lib.mkOption {
default = false;
type = lib.types.bool;
};
config = lib.mkIf config.azos.suites.hyprland.enable {
azos.suites.base.enable = lib.mkDefault true;
home.packages = with pkgs; [
hyprland
waybar
wofi
kitty
grim
slurp
swappy
networkmanagerapplet
xwayland
];
azos.emacs.enabledSuites = ["azos-emacs-hyprland"];
azos.emacs.pkgs = [pkgs.azos-emacs-hyprland];
azos.emacs.emacspkg = pkgs.emacs-pgtk;
home.file.".login.sh" = {
text = ''
#!/usr/bin/env bash
${pkgs.hyprland}/bin/Hyprland
'';
executable = true;
};
};
};
}
@@ -6,7 +6,7 @@
orgTrivialBuild {
pname = "azos-emacs-hyprland";
version = "0.1.6";
src = ./elisp/azos-emacs-hyprland.org;
src = ./config.org;
packageRequires = with epkgs; [
pkgs.azos-emacs-base
];
+3
View File
@@ -0,0 +1,3 @@
{...}: {
config.flake.overlayPkgs.azos-emacs-hyprland = pkgs: pkgs.localEmacsPkg ./_pkg.nix;
}
+16
View File
@@ -0,0 +1,16 @@
{...}: {
config.flake.modules.homeManager.kubernetes = {
lib,
config,
pkgs,
...
}: {
options.azos.kubectl.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.kubectl.enable {
home.packages = with pkgs; [kubectl kubernetes-helm velero];
};
};
}
+22
View File
@@ -0,0 +1,22 @@
{...}: {
config.flake.modules.homeManager.lauretta = {
lib,
config,
pkgs,
...
}: {
options.azos.suites.lauretta.enable = lib.mkOption {
default = false;
type = lib.types.bool;
};
config = lib.mkIf (config.azos.suites.lauretta.enable) {
azos.suites.exwm.enable = lib.mkDefault true;
azos.suites.editor.enable = lib.mkDefault true;
azos.suites.dev.enable = lib.mkDefault true;
azos.emacs.enabledSuites = ["azos-emacs-lauretta"];
azos.emacs.pkgs = [pkgs.azos-emacs-lauretta];
home.packages = with pkgs; [nix-search-cli];
};
};
}
@@ -6,7 +6,7 @@
orgTrivialBuild {
pname = "azos-emacs-lauretta";
version = "0.1.6";
src = ./elisp/azos-emacs-lauretta.org;
src = ./config.org;
packageRequires = with epkgs; [
pkgs.azos-emacs-base
pkgs.azos-emacs-dev
@@ -15,5 +15,6 @@ orgTrivialBuild {
pkgs.azos-emacs-station
agent-shell
org-caldav
];
}
+324
View File
@@ -0,0 +1,324 @@
#+title: Aner's Emacs Lauretta Configuration
#+property: header-args :results silent
* Base setup
** Require
#+begin_src emacs-lisp
(require 'azos-emacs-base)
(require 'azos-emacs-dev)
(require 'azos-emacs-editor)
(require 'azos-emacs-exwm)
(require 'azos-emacs-station)
#+end_src
* Lauretta specific
** LLM
#+begin_src emacs-lisp
(setq
gptel-model 'openai/gpt-oss-120b
gptel-backend
(gptel-make-openai "Groq"
:host "api.groq.com"
:endpoint "/openai/v1/chat/completions"
:stream t
:key "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"
:models '(openai/gpt-oss-120b)))
#+end_src
** Agent Shell
#+begin_src emacs-lisp
(setq agent-shell-opencode-default-model-id "opencode/big-pickle")
;; (setq agent-shell-preferred-agent-config (agent-shell-opencode-make-agent-config))
#+end_src
** Headphones
#+begin_src emacs-lisp
(defun azos/connect-headphones ()
(interactive)
(start-process-shell-command "connect-headphones" nil "azos-connect-headphones-whmx4000"))
(define-key azos/global-minor-mode/open-keymap
(kbd "h") 'azos/connect-headphones)
#+end_src
** Tab bar setup
#+begin_src emacs-lisp
(when (fboundp #'azos/bat/enable-tab-display)
(azos/bat/enable-tab-display))
(when (fboundp #'azos/network/enable-tab-display)
(azos/network/enable-tab-display))
(when (fboundp #'azos/audio/enable-tab-display)
(azos/audio/enable-tab-display))
#+end_src
** Nixpkgs Search
#+begin_src emacs-lisp
(defun azos/nixpkgs-parse-json-lines (str)
"Parse JSON Lines format (one JSON object per line) from STR."
(mapcar (lambda (line)
(and (not (string-empty-p line))
(string-match "^{" line)
(condition-case nil
(json-parse-string line)
(error nil))))
(split-string (string-trim str) "\n" t)))
(defun azos/nixpkgs-g (key hash)
"Get KEY from HASH table."
(when (hash-table-p hash)
(gethash key hash)))
(defun azos/nixpkgs-search ()
"Search for a nixpkgs package and show its info."
(interactive)
(let* ((pattern (read-string "Search pattern: "))
(json-output (shell-command-to-string
(format "nix-search --json --max-results 50 '%s'" pattern)))
(results (and json-output
(not (string-empty-p json-output))
(azos/nixpkgs-parse-json-lines json-output)))
(packages (delq nil (mapcar (lambda (item)
(let ((pname (azos/nixpkgs-g "package_pname" item)))
(when pname
(cons pname item))))
results))))
(if packages
(let* ((selected (completing-read "Package: " (mapcar #'car packages) nil t))
(package-data (cdr (assoc-string selected packages))))
(let ((buf (get-buffer-create "*nixpkgs-package-info*")))
(with-current-buffer buf
(erase-buffer)
(if package-data
(progn
(insert (format "Package: %s\n\n" selected))
(insert (format "Version: %s\n" (or (azos/nixpkgs-g "package_pversion" package-data) "unknown")))
(insert (format "Attr: %s\n" (or (azos/nixpkgs-g "package_attr_name" package-data) "unknown")))
(insert (format "\nDescription: %s\n"
(or (azos/nixpkgs-g "package_description" package-data) "none")))
(let ((programs (azos/nixpkgs-g "package_programs" package-data)))
(when (vectorp programs)
(insert (format "\nPrograms: %s\n"
(mapconcat #'identity (append programs nil) " ")))))
(let ((homepage (let ((h (azos/nixpkgs-g "package_homepage" package-data)))
(when (vectorp h) (aref h 0)))))
(when homepage
(insert (format "\nHomepage: %s\n" homepage))))
(let ((licenses (azos/nixpkgs-g "package_license" package-data)))
(when (vectorp licenses)
(insert (format "\nLicense: %s\n"
(mapconcat (lambda (l)
(or (azos/nixpkgs-g "fullName" l) ""))
(append licenses nil) ", ")))))
(insert (format "Package: %s\n\n" selected)
"\nNo additional info available.")))
(goto-char (point-min)))
(display-buffer buf)))
(message "No packages found matching '%s'" pattern))))
(define-key azos/global-minor-mode/open-keymap
(kbd "n") 'azos/nixpkgs-search)
#+end_src
** CalDAV / Org Sync
#+begin_src emacs-lisp
(require 'org-caldav)
(defvar azos/lauretta/nextcloud-user "aner"
"Nextcloud username for CalDAV sync.")
(setq org-caldav-url "https://nextcloud.zakobar.com/remote.php/dav/calendars/1ddd03a6-4c2d-103c-9f7b-27b20313341d"
org-caldav-calendar-id "personal"
org-caldav-inbox "~/org/caldav-inbox.org"
org-caldav-files '("~/org/todo.org")
org-icalendar-timezone "Asia/Jerusalem")
(defun azos/caldav-sync ()
"Sync org-caldav with Nextcloud calendar, reading password from pass."
(interactive)
(let* ((password (string-trim
(shell-command-to-string
(format "pass zakobar.com/users/%s" azos/lauretta/nextcloud-user))))
(url-http-real-basic-auth-storage
(list (list "nextcloud.zakobar.com:443"
(cons azos/lauretta/nextcloud-user password)))))
(org-caldav-sync)))
(define-key azos/global-minor-mode/open-keymap
(kbd "C") 'azos/caldav-sync)
#+end_src
** Beacon Remote Jobs
#+begin_src emacs-lisp
(defvar azos/beacon/host "aner@192.168.1.200"
"SSH connection for beacon machine.")
(defvar azos/beacon/max-logs 5
"Number of most-recent logs to keep per project on beacon.")
(defvar azos/beacon/keymap (make-sparse-keymap)
"Keymap for beacon remote job commands (M-o b prefix).")
(define-key azos/global-minor-mode/open-keymap (kbd "b") azos/beacon/keymap)
(defun azos/beacon--project-root ()
(or (and (fboundp 'projectile-project-root) (projectile-project-root))
(error "Not in a projectile project")))
(defun azos/beacon--project-name (root)
(file-name-nondirectory (directory-file-name root)))
(defun azos/beacon--list-python-files (root)
(split-string
(shell-command-to-string
(format "cd %s && git ls-files | grep '\\.py$'" (shell-quote-argument root)))
"\n" t))
(defun azos/beacon--list-executables (root)
(split-string
(shell-command-to-string
(format "cd %s && git ls-files | while IFS= read -r f; do [ -x \"$f\" ] && echo \"$f\"; done"
(shell-quote-argument root)))
"\n" t))
(defun azos/beacon--ssh-run (script)
"Pipe SCRIPT as bash to beacon over SSH stdin. Error on non-zero exit."
(with-temp-buffer
(insert script)
(let ((ret (call-process-region (point-min) (point-max) "ssh" nil t nil
azos/beacon/host "bash")))
(unless (zerop ret)
(error "Beacon SSH error (exit %d): %s" ret (string-trim (buffer-string)))))))
(defun azos/beacon--ssh-query (cmd &optional allow-exit-one)
"Run CMD on beacon, return output string. Error on failure.
With ALLOW-EXIT-ONE, exit code 1 is also treated as success (for tmux ls)."
(with-temp-buffer
(let ((ret (call-process "ssh" nil t nil azos/beacon/host cmd)))
(unless (or (zerop ret) (and allow-exit-one (= ret 1)))
(error "Beacon SSH error (exit %d): %s" ret (string-trim (buffer-string)))))
(buffer-string)))
(defun azos/beacon--dispatch (root cmd label)
"Sync ROOT to beacon and run CMD in project dir under direnv.
LABEL names the tmux session and log file."
(let* ((project-name (azos/beacon--project-name root))
(timestamp (format-time-string "%Y%m%d-%H%M%S"))
(session (format "%s-%s-%s" project-name label timestamp))
(log-name (format "%s-%s.log" label timestamp)))
(message "Syncing %s to beacon..." project-name)
(azos/beacon--ssh-run (format "mkdir -p ~/beacon-projects/%s\n" project-name))
(with-temp-buffer
(let ((ret (call-process-shell-command
(format "bash -c %s"
(shell-quote-argument
(format "cd %s && git ls-files | rsync -avz --files-from=- . %s:~/beacon-projects/%s/"
root azos/beacon/host project-name)))
nil t nil)))
(unless (zerop ret)
(error "Beacon rsync failed (exit %d): %s" ret (string-trim (buffer-string))))))
(azos/beacon--ssh-run
(format "RDIR=~/beacon-projects/%s
LDIR=~/beacon-logs/%s
mkdir -p \"$LDIR\"
direnv allow \"$RDIR\"
tmux new-session -d -s %s -- bash -c \"cd $RDIR && direnv exec . %s 2>&1 | tee $LDIR/%s\"
"
project-name project-name
(shell-quote-argument session)
cmd log-name))
(azos/beacon--ssh-run
(format "find ~/beacon-logs/%s -name '*.log' -printf '%%T@ %%p\\n' 2>/dev/null | sort -rn | tail -n +%d | cut -d' ' -f2- | xargs -r rm -f\n"
project-name (1+ azos/beacon/max-logs)))
(message "Beacon job started: %s" session)))
(defun azos/beacon/run-python ()
"Sync current project to beacon and run a selected Python file."
(interactive)
(let* ((root (azos/beacon--project-root))
(files (azos/beacon--list-python-files root))
(file (completing-read "Python file: " files nil t))
(label (file-name-sans-extension (file-name-nondirectory file))))
(azos/beacon--dispatch root (format "python3 %s" file) label)))
(defun azos/beacon/run-exec ()
"Sync current project to beacon and run a selected executable."
(interactive)
(let* ((root (azos/beacon--project-root))
(files (azos/beacon--list-executables root))
(file (completing-read "Executable: " files nil t))
(label (file-name-sans-extension (file-name-nondirectory file))))
(azos/beacon--dispatch root (format "./%s" file) label)))
(defun azos/beacon/run-command ()
"Sync current project to beacon and run an arbitrary command."
(interactive)
(let* ((root (azos/beacon--project-root))
(cmd (read-string "Command: "))
(label (replace-regexp-in-string
"[^a-zA-Z0-9-]" "-"
(substring cmd 0 (min 20 (length cmd))))))
(azos/beacon--dispatch root cmd label)))
(defun azos/beacon/list-jobs ()
"Show all running beacon tmux sessions."
(interactive)
(async-shell-command
(format "ssh %s 'tmux ls 2>/dev/null || echo \"No jobs running\"'" azos/beacon/host)
"*beacon-jobs*"))
(defun azos/beacon/kill-job ()
"Kill a beacon tmux session selected interactively."
(interactive)
(let* ((output (azos/beacon--ssh-query "tmux ls -F '#S' 2>/dev/null" t))
(sessions (split-string (string-trim output) "\n" t))
(session (completing-read "Kill job: " sessions nil t)))
(azos/beacon--ssh-run (format "tmux kill-session -t %s\n" (shell-quote-argument session)))
(message "Killed beacon job: %s" session)))
(defun azos/beacon--tail-path (path)
(async-shell-command
(format "ssh %s %s" azos/beacon/host
(shell-quote-argument (format "tail -f %s" path)))
(format "*beacon-tail-%s*" (file-name-nondirectory path))))
(defun azos/beacon/tail-log (&optional arg)
"Tail the most recent beacon log.
With prefix ARG, prompt for a pattern then select from matches."
(interactive "P")
(let* ((sorted-output (azos/beacon--ssh-query
"find ~/beacon-logs -name '*.log' -printf '%T@ %P\n' 2>/dev/null | sort -rn | cut -d' ' -f2-"))
(logs (split-string (string-trim sorted-output) "\n" t)))
(when (null logs) (error "No logs found on beacon"))
(if (not arg)
(azos/beacon--tail-path (format "~/beacon-logs/%s" (car logs)))
(let* ((pattern (read-string "Log pattern: "))
(matches (seq-filter (lambda (l) (string-match-p pattern l)) logs))
(log (if (= (length matches) 1)
(car matches)
(completing-read "Tail log: " matches nil t))))
(azos/beacon--tail-path (format "~/beacon-logs/%s" log))))))
(define-key azos/beacon/keymap (kbd "p") #'azos/beacon/run-python)
(define-key azos/beacon/keymap (kbd "e") #'azos/beacon/run-exec)
(define-key azos/beacon/keymap (kbd "c") #'azos/beacon/run-command)
(define-key azos/beacon/keymap (kbd "l") #'azos/beacon/list-jobs)
(define-key azos/beacon/keymap (kbd "k") #'azos/beacon/kill-job)
(define-key azos/beacon/keymap (kbd "t") #'azos/beacon/tail-log)
#+end_src
* Provide
#+begin_src emacs-lisp
(provide 'azos-emacs-lauretta)
#+end_src
+3
View File
@@ -0,0 +1,3 @@
{...}: {
config.flake.overlayPkgs.azos-emacs-lauretta = pkgs: pkgs.localEmacsPkg ./_pkg.nix;
}
+76
View File
@@ -0,0 +1,76 @@
{...}: {
config.flake.modules.homeManager.mail = {
lib,
config,
...
}: let
default_account_params = {
realName = "Aner Zakobar";
notmuch.enable = true;
mbsync = {
enable = true;
create = "maildir";
};
};
default_gmail_params =
default_account_params
// {
flavor = "gmail.com";
};
default_smtp = {
tls = {
enable = true;
certificatesFile = "/etc/ssl/certs/ca-certificates.crt";
};
};
in {
options.azos.mail.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.mail.enable {
programs = {
notmuch = {
enable = true;
hooks = {preNew = "mbsync -a";};
};
mbsync.enable = true;
msmtp.enable = true;
lieer.enable = true;
};
services.lieer.enable = true;
accounts.email.accounts = {
gmail =
default_gmail_params
// {
address = "anerisgreat@gmail.com";
userName = "anerisgreat";
passwordCommand = "pass gmail.com/mbsync-anerisgreat";
};
bgu =
default_gmail_params
// {
address = "anerz@post.bgu.ac.il";
userName = "anerz@post.bgu.ac.il";
passwordCommand = "pass post.bgu.ac.il/mbsync-anerz";
};
zakobar =
default_account_params
// {
address = "aner@zakobar.com";
msmtp.enable = true;
primary = true;
userName = "aner@zakobar.com";
imap = {host = "mail.privateemail.com";};
smtp =
default_smtp
// {
port = 587;
host = "mail.privateemail.com";
};
passwordCommand = "pass zakobar.com/mail/aner";
};
};
};
};
}
+15
View File
@@ -0,0 +1,15 @@
{...}: {
config.flake.modules.homeManager.mpris-proxy = {
lib,
config,
...
}: {
options.azos.mpris-proxy.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.mpris-proxy.enable {
services.mpris-proxy.enable = true;
};
};
}
+20
View File
@@ -0,0 +1,20 @@
{...}: {
config.flake.modules.homeManager.nextcloud = {
lib,
config,
pkgs,
...
}: {
options.azos.nextcloud-client.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.nextcloud-client.enable {
home.packages = with pkgs; [nextcloud-client];
services.nextcloud-client = {
enable = true;
startInBackground = false;
};
};
};
}
+15
View File
@@ -0,0 +1,15 @@
{...}: {
config.flake.modules.homeManager.opencode = {
lib,
config,
...
}: {
options.azos.opencode.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.opencode.enable {
programs.opencode.enable = true;
};
};
}
@@ -43,7 +43,7 @@ c.downloads.location.prompt = False
c.editor.command = ['emacsclient', '-e', '(find-file "{}")']
monospace = "10pt 'DejaVu Sans Mono'"
c.fonts.completion.category = f"bold{monospace}"
c.fonts.completion.category = f"bold {monospace}"
c.fonts.completion.entry = monospace
c.fonts.debug_console = monospace
c.fonts.downloads = monospace
@@ -54,3 +54,7 @@ c.fonts.messages.warning = monospace
c.fonts.prompts = monospace
c.fonts.statusbar = monospace
c.fonts.hints = "bold 13px 'LiberationMono'"
#Set highdpi
c.qt.highdpi = True
c.zoom.default = 70
+15
View File
@@ -0,0 +1,15 @@
{...}: {
config.flake.modules.homeManager.qutebrowser = {
lib,
config,
...
}: {
options.azos.qutebrowser-config.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.qutebrowser-config.enable {
home.file.".config/qutebrowser/config.py".source = ./config.py;
};
};
}
+21
View File
@@ -0,0 +1,21 @@
{...}: {
config.flake.modules.homeManager.reaper = {
lib,
config,
pkgs,
...
}: {
options.azos.reaper.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.reaper.enable {
home.packages = with pkgs; [
reaper
helm
lsp-plugins
vital
];
};
};
}
+61
View File
@@ -0,0 +1,61 @@
{...}: {
config.flake.modules.homeManager.snx-rs = {
lib,
config,
pkgs,
...
}: let
cfg = config.azos.snx-rs;
in {
options.azos.snx-rs = {
enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
server = lib.mkOption {
default = "vpn.bgu.ac.il";
type = lib.types.str;
description = "VPN server address";
};
username = lib.mkOption {
default = "anerz@vpn";
type = lib.types.str;
description = "VPN username";
};
loginType = lib.mkOption {
default = "vpn";
type = lib.types.str;
description = "Login type";
};
ignoreServerCert = lib.mkOption {
default = true;
type = lib.types.bool;
description = "Ignore server certificate validation";
};
};
config = lib.mkIf cfg.enable {
home.packages = with pkgs; [
snx-rs
(pkgs.writeShellScriptBin "snx-connect" ''
#!/bin/sh
sudo ${pkgs.snx-rs}/bin/snx-rs -m command &
sleep 1
${pkgs.snx-rs}/bin/snxctl connect
'')
(pkgs.writeShellScriptBin "snx-disconnect" ''
#!/bin/sh
${pkgs.snx-rs}/bin/snxctl disconnect
pkill -x snx-rs 2>/dev/null || true
'')
];
home.file.".config/snx-rs/snx-rs.conf" = {
text = ''
server ${cfg.server}
username ${cfg.username}
login-type ${cfg.loginType}
ignore-server-cert ${lib.boolToString cfg.ignoreServerCert}
'';
};
};
};
}
+15
View File
@@ -0,0 +1,15 @@
{...}: {
config.flake.modules.nixos.steam = {
lib,
config,
...
}: {
options.azos.steam.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.steam.enable {
programs.steam.enable = true;
};
};
}
+30
View File
@@ -0,0 +1,30 @@
{...}: {
config.flake.modules.nixos.virtualization = {
lib,
config,
pkgs,
...
}: {
options.azos.virtualization.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.virtualization.enable {
virtualisation.libvirtd = {
enable = true;
qemu = {
swtpm.enable = true;
};
};
environment.systemPackages = with pkgs; [
qemu_kvm
libvirt
virt-manager
virt-viewer
];
services.spice-vdagentd.enable = true;
networking.firewall.allowedTCPPorts = [5900 5901];
networking.firewall.allowedUDPPorts = [5900 5901];
};
};
}
+16
View File
@@ -0,0 +1,16 @@
{...}: {
config.flake.modules.homeManager.ytdl = {
lib,
config,
pkgs,
...
}: {
options.azos.ytdl.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf config.azos.ytdl.enable {
home.packages = with pkgs; [yt-dlp];
};
};
}
Generated
+174 -103
View File
@@ -3,8 +3,9 @@
"azos-core": {
"inputs": {
"cabata": "cabata",
"nix-search-cli": "nix-search-cli",
"nixpkgs": "nixpkgs_3"
"evil-hl-line": "evil-hl-line",
"flake-parts": "flake-parts",
"import-tree": "import-tree"
},
"locked": {
"path": "./azos-core",
@@ -23,11 +24,11 @@
"systems": "systems"
},
"locked": {
"lastModified": 1771368993,
"narHash": "sha256-mWcLaCViNfUMPcqCvQRed4kR20Ifs8aaHcjMlVbF2tQ=",
"lastModified": 1779008956,
"narHash": "sha256-jpJ30XX1pAH+Mpsyj92K8t6812Qs+P4J31wO7RS/e+Y=",
"owner": "anerisgreat",
"repo": "cabata",
"rev": "4fa661795527fa437698409395dc4363fbc0adf0",
"rev": "ff1871152ffb635e18e1a9804750192c6969d1cb",
"type": "github"
},
"original": {
@@ -36,19 +37,58 @@
"type": "github"
}
},
"flake-compat": {
"flake": false,
"evil-hl-line": {
"inputs": {
"flake-utils": "flake-utils_2",
"nixpkgs": "nixpkgs_2"
},
"locked": {
"lastModified": 1673956053,
"narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
"lastModified": 1778617640,
"narHash": "sha256-bG1hjyLIOiRB+M1rXm8ch0ftHPvV43lRtzQ8qWcus5s=",
"owner": "anerisgreat",
"repo": "evil-hl-line",
"rev": "7cf5a11bdca2abd9516f0ce572e1e03bb541507f",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"owner": "anerisgreat",
"repo": "evil-hl-line",
"type": "github"
}
},
"flake-parts": {
"inputs": {
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1778716662,
"narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-parts_2": {
"inputs": {
"nixpkgs-lib": "nixpkgs-lib_2"
},
"locked": {
"lastModified": 1778716662,
"narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
@@ -75,12 +115,15 @@
}
},
"flake-utils_2": {
"inputs": {
"systems": "systems_2"
},
"locked": {
"lastModified": 1676283394,
"narHash": "sha256-XX2f9c3iySLCw54rJ/CZs+ZK6IQy7GXNY4nSOyu2QG4=",
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "3db36a8b464d0c4532ba1c7dda728f4576d6d073",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
@@ -96,11 +139,11 @@
]
},
"locked": {
"lastModified": 1774647770,
"narHash": "sha256-UNNi14XiqRWWjO8ykbFwA5wRwx7EscsC+GItOVpuGjc=",
"lastModified": 1779969295,
"narHash": "sha256-HwIJ3tOcwSMiV75L7KqJXciXR9UfT+d7rwOZMX7cTnA=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "02371c05a04a2876cf92e2d67a259e8f87399068",
"rev": "61e2c9659324181e0f0ed911958c536333b1d4f6",
"type": "github"
},
"original": {
@@ -110,16 +153,46 @@
"type": "github"
}
},
"import-tree": {
"locked": {
"lastModified": 1778781969,
"narHash": "sha256-Jjuz5CmSkur8KvLDoGa+vylEp+RkQtv4mt/qcMznpH0=",
"owner": "vic",
"repo": "import-tree",
"rev": "d321337efd0f23a9eb14a42adb7b2c29313ab274",
"type": "github"
},
"original": {
"owner": "vic",
"repo": "import-tree",
"type": "github"
}
},
"import-tree_2": {
"locked": {
"lastModified": 1778781969,
"narHash": "sha256-Jjuz5CmSkur8KvLDoGa+vylEp+RkQtv4mt/qcMznpH0=",
"owner": "vic",
"repo": "import-tree",
"rev": "d321337efd0f23a9eb14a42adb7b2c29313ab274",
"type": "github"
},
"original": {
"owner": "vic",
"repo": "import-tree",
"type": "github"
}
},
"musnix": {
"inputs": {
"nixpkgs": "nixpkgs_4"
"nixpkgs": "nixpkgs_3"
},
"locked": {
"lastModified": 1773185476,
"narHash": "sha256-COuJkFg669oalmEN3T61gD3gM9SfUsiGvDS9pCOphZY=",
"lastModified": 1777848538,
"narHash": "sha256-Dj51C0NWsglqRrCpdmMr2nFiYacFOid1Tor4H9yG2HY=",
"owner": "musnix",
"repo": "musnix",
"rev": "739e2a1f94c87d5f4c8b880a12480185cf0d7620",
"rev": "8548782f0d1d0928daa3fffde8a008f72219a3f3",
"type": "github"
},
"original": {
@@ -128,49 +201,13 @@
"type": "github"
}
},
"nix-filter": {
"locked": {
"lastModified": 1710156097,
"narHash": "sha256-1Wvk8UP7PXdf8bCCaEoMnOT1qe5/Duqgj+rL8sRQsSM=",
"owner": "numtide",
"repo": "nix-filter",
"rev": "3342559a24e85fc164b295c3444e8a139924675b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "nix-filter",
"type": "github"
}
},
"nix-search-cli": {
"inputs": {
"flake-compat": "flake-compat",
"flake-utils": "flake-utils_2",
"nix-filter": "nix-filter",
"nixpkgs": "nixpkgs_2"
},
"locked": {
"lastModified": 1762187737,
"narHash": "sha256-NGL9jj4y16+d0Es7aK1oxqAimZn7sdJDAxVkcY3CTcg=",
"owner": "peterldowns",
"repo": "nix-search-cli",
"rev": "ab0d5156c1e3b383c250ff273639cd3dea6de2d9",
"type": "github"
},
"original": {
"owner": "peterldowns",
"repo": "nix-search-cli",
"type": "github"
}
},
"nixos-hardware": {
"locked": {
"lastModified": 1774567711,
"narHash": "sha256-uVlOHBvt6Vc/iYNJXLPa4c3cLXwMllOCVfAaLAcphIo=",
"lastModified": 1779826373,
"narHash": "sha256-3sRzgLX86qV5NlhWUAufLmHwkyP03tmL3VdZIM13dEo=",
"owner": "NixOS",
"repo": "nixos-hardware",
"rev": "3f6f874dfc34d386d10e434c48ad966c4832243e",
"rev": "ef4efb84766a166c906bd55759574676bf91267c",
"type": "github"
},
"original": {
@@ -194,13 +231,43 @@
"type": "indirect"
}
},
"nixpkgs-lib": {
"locked": {
"lastModified": 1777168982,
"narHash": "sha256-GOkGPcboWE9BmGCRMLX3worL4EMnsnG8MyKmXNeYuhQ=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
"rev": "f5901329dade4a6ea039af1433fb087bd9c1fe14",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixpkgs.lib",
"type": "github"
}
},
"nixpkgs-lib_2": {
"locked": {
"lastModified": 1777168982,
"narHash": "sha256-GOkGPcboWE9BmGCRMLX3worL4EMnsnG8MyKmXNeYuhQ=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
"rev": "f5901329dade4a6ea039af1433fb087bd9c1fe14",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixpkgs.lib",
"type": "github"
}
},
"nixpkgs-unstable": {
"locked": {
"lastModified": 1774386573,
"narHash": "sha256-4hAV26quOxdC6iyG7kYaZcM3VOskcPUrdCQd/nx8obc=",
"lastModified": 1779560665,
"narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "46db2e09e1d3f113a13c0d7b81e2f221c63b8ce9",
"rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786",
"type": "github"
},
"original": {
@@ -212,40 +279,11 @@
},
"nixpkgs_2": {
"locked": {
"lastModified": 1761752004,
"narHash": "sha256-z83uhYagfW6ZnH5Svvaxx6O0a305sBLGCCJZBJnMD9w=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "ddf56acbeb53825b79b82c13a657806774bfd137",
"type": "github"
},
"original": {
"owner": "nixos",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_3": {
"locked": {
"lastModified": 1774273680,
"narHash": "sha256-a++tZ1RQsDb1I0NHrFwdGuRlR5TORvCEUksM459wKUA=",
"lastModified": 1779508470,
"narHash": "sha256-Ap9KJX+5xHIn3bPIpfNgT6MEXdAECECwo4/rmlQD74M=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "fdc7b8f7b30fdbedec91b71ed82f36e1637483ed",
"type": "github"
},
"original": {
"id": "nixpkgs",
"type": "indirect"
}
},
"nixpkgs_4": {
"locked": {
"lastModified": 1772198003,
"narHash": "sha256-I45esRSssFtJ8p/gLHUZ1OUaaTaVLluNkABkk6arQwE=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "dd9b079222d43e1943b6ebd802f04fd959dc8e61",
"rev": "29916453413845e54a65b8a1cf996842300cd299",
"type": "github"
},
"original": {
@@ -255,13 +293,29 @@
"type": "github"
}
},
"nixpkgs_5": {
"nixpkgs_3": {
"locked": {
"lastModified": 1774273680,
"narHash": "sha256-a++tZ1RQsDb1I0NHrFwdGuRlR5TORvCEUksM459wKUA=",
"lastModified": 1777268161,
"narHash": "sha256-bxrdOn8SCOv8tN4JbTF/TXq7kjo9ag4M+C8yzzIRYbE=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "fdc7b8f7b30fdbedec91b71ed82f36e1637483ed",
"rev": "1c3fe55ad329cbcb28471bb30f05c9827f724c76",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_4": {
"locked": {
"lastModified": 1779877693,
"narHash": "sha256-NOF9NAREhxr50bbBfVcVOq+ArCMSoe8dP79Pk2uyARk=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "4100e830e085863741bc69b156ec4ccd53ab5be0",
"type": "github"
},
"original": {
@@ -274,10 +328,12 @@
"root": {
"inputs": {
"azos-core": "azos-core",
"flake-parts": "flake-parts_2",
"home-manager": "home-manager",
"import-tree": "import-tree_2",
"musnix": "musnix",
"nixos-hardware": "nixos-hardware",
"nixpkgs": "nixpkgs_5",
"nixpkgs": "nixpkgs_4",
"nixpkgs-unstable": "nixpkgs-unstable"
}
},
@@ -295,6 +351,21 @@
"repo": "x86_64-linux",
"type": "github"
}
},
"systems_2": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
+27 -49
View File
@@ -3,13 +3,8 @@
inputs = {
self.submodules = true;
# Nixpkgs
#Temporarily
# nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
#Need unstable for opencode and agent-shell
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
# Unused unstable
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
home-manager = {
@@ -19,59 +14,42 @@
nixos-hardware.url = "github:NixOS/nixos-hardware/master";
#Music production nix
musnix = {url = "github:musnix/musnix";};
azos-core = {
url = "./azos-core";
flake = true;
};
flake-parts.url = "github:hercules-ci/flake-parts";
import-tree.url = "github:vic/import-tree";
};
outputs = {
self,
nixpkgs,
home-manager,
...
} @ inputs: let
inherit (self) outputs;
systems = [
"aarch64-linux"
"x86_64-linux"
"aarch64-darwin"
"x86_64-darwin"
];
forAllSystems = nixpkgs.lib.genAttrs systems;
in {
formatter = forAllSystems (system: nixpkgs.legacyPackages.${system}.alejandra);
outputs = inputs:
inputs.flake-parts.lib.mkFlake {inherit inputs;} {
imports = [
inputs.azos-core.flakeModules.default
./overlays/default.nix
(inputs.import-tree ./features)
./_machines/lauretta.nix
./_machines/vm.nix
./_machines/beacon.nix
];
overlays = import ./overlays {inherit inputs;};
azos-core.nixosModules = inputs.azos-core.nixosModules.nixosModules;
nixosModules = import ./modules/nixos;
azos-core.homeManagerModules = inputs.azos-core.nixosModules.homeManagerModules;
homeManagerModules = import ./modules/home-manager;
systems = [
"aarch64-linux"
"x86_64-linux"
"aarch64-darwin"
"x86_64-darwin"
];
#Systems configured
nixosConfigurations = {
#Lauretta - laptop
lauretta = nixpkgs.lib.nixosSystem {
specialArgs = {inherit inputs outputs;};
modules = [
./nixos/configuration.nix
];
};
#Test VM
vm = nixpkgs.lib.nixosSystem {
specialArgs = {inherit inputs outputs;};
modules = [
./nixos/configuration-vm.nix
];
perSystem = {
system,
pkgs,
...
}: {
formatter = pkgs.alejandra;
devShells = (import ./shells) {inherit pkgs;};
};
};
#TODO this is probably unsupported
#TODO the devshells do not know of the new packages.
devShells = forAllSystems (system: ((import ./shells) {pkgs = nixpkgs.legacyPackages.${system};}));
};
}
+23 -11
View File
@@ -1,25 +1,39 @@
# This is your home-manager configuration file
# Use this to configure your home environment (it replaces ~/.config/nixpkgs/home.nix)
{
inputs,
outputs,
suiteModules,
lib,
config,
pkgs,
...
}: {
imports = [
outputs.homeManagerModules
outputs.azos-core.homeManagerModules
suiteModules.homeManager.base
suiteModules.homeManager.dev
suiteModules.homeManager.editor
suiteModules.homeManager.station
suiteModules.homeManager.exwm
suiteModules.homeManager.lauretta
suiteModules.homeManager.audio
suiteModules.homeManager.claude
suiteModules.homeManager.encryption
suiteModules.homeManager.git-config
suiteModules.homeManager.hfsprogs
suiteModules.homeManager.headphones
suiteModules.homeManager.hyprland
suiteModules.homeManager.kubernetes
suiteModules.homeManager.mail
suiteModules.homeManager.mpris-proxy
suiteModules.homeManager.nextcloud
suiteModules.homeManager.opencode
suiteModules.homeManager.qutebrowser
suiteModules.homeManager.reaper
suiteModules.homeManager.snx-rs
suiteModules.homeManager.ytdl
];
programs.home-manager.enable = true;
azos.suites.base.enable = true;
azos.suites.editor.enable = true;
azos.suites.dev.enable = true;
azos.suites.station.enable = true;
azos.suites.exwm.enable = true;
azos.suites.lauretta.enable = true;
azos.name = "Aner Zakobar";
@@ -28,9 +42,7 @@
homeDirectory = "/home/aner";
};
# Nicely reload system units when changing configs
systemd.user.startServices = "sd-switch";
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
home.stateVersion = "25.11";
}
-19
View File
@@ -1,19 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.home-audio.enable;
in {
options.azos.home-audio.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
# home.packages = with pkgs; [pavucontrol];
};
}
-19
View File
@@ -1,19 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.claude.enable;
in {
options.azos.claude.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
home.packages = with pkgs; [claude-code claude-agent-acp];
};
}
-22
View File
@@ -1,22 +0,0 @@
{
imports = [
./audio.nix
./claude.nix
./encryption.nix
./git.nix
./hfsprogs.nix
./headphones-whmx4000.nix
./hyprland-suite.nix
./kubernetes.nix
./lauretta-emacs.nix
./mail.nix
./mpris-proxy.nix
./opencode.nix
# ./printing.nix
# ./gnuradio.nix
./qutebrowser-config.nix
./reaper.nix
./snx-rs.nix
./ytdl.nix
];
}
-41
View File
@@ -1,41 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.encryption.enable;
in {
options.azos.encryption.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
programs.password-store = {
enable = true;
settings = {
PASSWORD_STORE_KEY = "076AA297579A0064";
};
};
home.packages = with pkgs; [
yubikey-personalization
pinentry-gtk2
];
programs.gpg = {
enable = true;
};
services.gpg-agent = {
enable = true;
enableSshSupport = true;
pinentry.package = pkgs.pinentry-gtk2;
};
home.file.".ssh/config".source = ./ssh-config;
home.file.".ssh/gpg-as-ssh.pub".source = ./gpg-as-ssh.pub;
home.file.".gnupg/sshcontrol".source = ./sshcontrol;
};
}
-40
View File
@@ -1,40 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.git-config.enable;
in {
options.azos.git-config.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
home.packages = with pkgs; [pass-git-helper unzip];
programs.git = {
enable = true;
signing = {
key = "6D17E295C70E2674";
signByDefault = true;
};
settings = {
extraConfig = {
credential.helper = "!pass-git-helper $@";
};
user = {
name = "Aner Zakobar";
email = "aner@zakobar.com";
};
};
};
home.file.".config/pass-git-helper/git-pass-mapping.ini".source =
./pass-git-mapping.ini;
};
}
-29
View File
@@ -1,29 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.gnuradio.enable;
in {
options.azos.gnuradio.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
home.packages = with pkgs; [
gnuradio
uhd
gmp
boost
volk
libxcursor
cmake
pkg-config
spdlog
];
};
}
@@ -1,23 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.headphones-whmx4000.enable;
in {
options.azos.headphones-whmx4000.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
home.packages = with pkgs; [
(pkgs.writeShellScriptBin
"azos-connect-headphones-whmx4000"
"echo \"connect AC:80:0A:AF:E1:C2\" | bluetoothctl")
];
};
}
-20
View File
@@ -1,20 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.hfsprogs.enable;
in {
options.azos.hfsprogs.enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
home.packages = with pkgs; [
hfsprogs
];
};
}
-58
View File
@@ -1,58 +0,0 @@
{
lib,
config,
pkgs,
options,
azos-utils,
...
}: let
isEnabled =
config.azos.suites.hyprland.enable;
in {
options.azos.suites.hyprland.enable = lib.mkOption {
default = false;
example = true;
type = lib.types.bool;
};
#TODO shutdown reboot commands
config = lib.mkIf isEnabled {
home.packages = with pkgs; [
hyprland
waybar # status bar
wofi # application launcher
kitty
grim # screenshot utility
slurp # region selector
swappy # screenshot editor
networkmanagerapplet
xwayland
];
azos.emacs.enabledSuites = ["azos-emacs-hyprland"];
azos.emacs.pkgs = [pkgs.azos-emacs-hyprland];
azos.emacs.emacspkg = pkgs.emacs-pgtk;
home.file.".login.sh" = {
text = ''
#!/usr/bin/env bash
${pkgs.hyprland}/bin/Hyprland
'';
#Make executable
executable = true;
};
# systemd.user.services.xwayland = {
# Unit.Description = "XWayland server";
# Install.WantedBy = [ "default.target" ];
# Service = {
# ExecStart = "${pkgs.xwayland}/bin/Xwayland :0 -rootless -terminate -listen tcp";
# Restart = "on-failure";
# RestartSec = "1s";
# StandardInput = "null";
# StandardOutput = "null";
# StandardError = "journal";
# };
# };
};
}
-23
View File
@@ -1,23 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.kubectl.enable;
in {
options.azos.kubectl.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
home.packages = with pkgs; [
kubectl
kubernetes-helm
velero
];
};
}
-23
View File
@@ -1,23 +0,0 @@
{
lib,
config,
pkgs,
azos-utils,
...
}: let
isEnabled =
config.azos.emacs.enable && config.azos.suites.lauretta.enable;
emacspkgs = config.azos.emacs.emacspkg.pkgs;
localPkgName = "azos-emacs-lauretta";
in {
#Set config
options.azos.suites.lauretta.enable = azos-utils.mkSuiteEnableOption {};
config = lib.mkIf isEnabled {
azos.emacs.enabledSuites = [localPkgName];
#Base emacs suite definition
azos.emacs.pkgs = [pkgs.azos-emacs-lauretta];
home.packages = with pkgs; [pkgs.nix-search-cli];
};
}
-108
View File
@@ -1,108 +0,0 @@
#https://xeiaso.net/talks/asg-2023-nixos/ example
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.mail.enable;
default_account_params = {
realName = "Aner Zakobar";
notmuch.enable = true;
mbsync = {
enable = true;
create = "maildir";
};
};
default_gmail_params =
default_account_params
// {
# lieer.enable = true;
# lieer.sync.enable = true;
flavor = "gmail.com";
# imap = {
# host = "mail.privateemail.com";
# };
};
default_smtp = {
tls = {
enable = true;
certificatesFile = "/etc/ssl/certs/ca-certificates.crt";
};
};
default_gmail_smtp =
default_smtp
// {
host = "smtp.gmail.com";
};
in {
options.azos.mail.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
programs = {
notmuch = {
enable = true;
hooks = {
preNew = "mbsync -a";
};
};
mbsync = {
enable = true;
};
msmtp = {
enable = true;
};
lieer = {
enable = true;
};
};
services.lieer.enable = true;
accounts.email.accounts = {
gmail =
default_gmail_params
// {
address = "anerisgreat@gmail.com";
userName = "anerisgreat";
# smtp = default_gmail_smtp;
passwordCommand = "pass gmail.com/mbsync-anerisgreat";
};
bgu =
default_gmail_params
// {
address = "anerz@post.bgu.ac.il";
userName = "anerz@post.bgu.ac.il";
# smtp = default_gmail_smtp;
passwordCommand = "pass post.bgu.ac.il/mbsync-anerz";
};
zakobar =
default_account_params
// {
address = "aner@zakobar.com";
msmtp.enable = true;
primary = true;
userName = "aner@zakobar.com";
imap = {
host = "mail.privateemail.com";
};
# mbsync = {
# enable = true;
# create = "maildir";
# };
smtp =
default_smtp
// {
port = 587;
host = "mail.privateemail.com";
};
passwordCommand = "pass zakobar.com/mail/aner";
};
};
};
}
-20
View File
@@ -1,20 +0,0 @@
#https://xeiaso.net/talks/asg-2023-nixos/ example
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.mpris-proxy.enable;
in {
options.azos.mpris-proxy.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
services.mpris-proxy.enable = true;
};
}
-19
View File
@@ -1,19 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.opencode.enable;
in {
options.azos.opencode.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
programs.opencode.enable = true;
};
}
-22
View File
@@ -1,22 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.printing.enable;
in {
options.azos.printing.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
services.printing.enable = true;
home.packages = with pkgs; [
hplip
];
};
}
@@ -1,19 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.qutebrowser-config.enable;
in {
options.azos.qutebrowser-config.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
home.file.".config/qutebrowser/config.py".source = ./qutebrowser-config.py;
};
}
-25
View File
@@ -1,25 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.reaper.enable;
in {
options.azos.reaper.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
home.packages = with pkgs; [
reaper
helm #TODO this synth had better work
# surge
lsp-plugins
vital
];
};
}
-63
View File
@@ -1,63 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.snx-rs.enable;
cfg = config.azos.snx-rs;
in {
options.azos.snx-rs = {
enable = lib.mkOption {
default = true;
type = lib.types.bool;
};
server = lib.mkOption {
default = "vpn.bgu.ac.il";
type = lib.types.str;
description = "VPN server address";
};
username = lib.mkOption {
default = "anerz@vpn";
type = lib.types.str;
description = "VPN username";
};
loginType = lib.mkOption {
default = "vpn";
type = lib.types.str;
description = "Login type (e.g., vpn, vpn_Microsoft_Authenticator)";
};
ignoreServerCert = lib.mkOption {
default = true;
type = lib.types.bool;
description = "Ignore server certificate validation";
};
};
config = lib.mkIf isEnabled {
home.packages = with pkgs; [
snx-rs
(pkgs.writeShellScriptBin "snx-connect" ''
#!/bin/sh
sudo ${pkgs.snx-rs}/bin/snx-rs -m command &
sleep 1
${pkgs.snx-rs}/bin/snxctl connect
'')
(pkgs.writeShellScriptBin "snx-disconnect" ''
#!/bin/sh
${pkgs.snx-rs}/bin/snxctl disconnect
pkill -x snx-rs 2>/dev/null || true
'')
];
home.file.".config/snx-rs/snx-rs.conf" = {
text = ''
server ${cfg.server}
username ${cfg.username}
login-type ${cfg.loginType}
ignore-server-cert ${lib.boolToString cfg.ignoreServerCert}
'';
};
};
}
-21
View File
@@ -1,21 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.ytdl.enable;
in {
options.azos.ytdl.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
home.packages = with pkgs; [
yt-dlp
];
};
}
-33
View File
@@ -1,33 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.hardware-audio.enable;
in {
options.azos.hardware-audio.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
services = {
pipewire = {
enable = true;
audio.enable = true;
pulse.enable = true;
alsa = {
enable = true;
support32Bit = true;
};
jack.enable = true;
};
};
# hardware.pulseaudio.enable = true;
environment.systemPackages = with pkgs; [pavucontrol];
musnix.enable = true;
};
}
-19
View File
@@ -1,19 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.binfmt.enable;
in {
options.azos.binfmt.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
boot.binfmt.emulatedSystems = ["aarch64-linux"];
};
}
-20
View File
@@ -1,20 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.bluetooth.enable;
in {
options.azos.bluetooth.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
services.blueman.enable = true;
hardware.bluetooth.enable = true;
};
}
-3
View File
@@ -1,3 +0,0 @@
{
imports = [./audio.nix ./binfmt.nix ./bluetooth.nix ./steam.nix ./virtualization.nix];
}
-19
View File
@@ -1,19 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.steam.enable;
in {
options.azos.steam.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
programs.steam.enable = true;
};
}
-40
View File
@@ -1,40 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.virtualization.enable;
in {
options.azos.virtualization.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
virtualisation.libvirtd = {
enable = true; # start / run libvirtd as a system service
# optional: expose the default NAT network (virbr0) libvirtd creates it
# automatically when the daemon is on, but we make sure the bridge is
# allowed through the firewall.
qemu = {
swtpm.enable = true; # (optional) enable software TPM for guests
};
};
environment.systemPackages = with pkgs; [
# QEMU (KVMaccelerated)
qemu_kvm # same as pkgs.qemu (but with KVM support explicitly enabled)
# CLI utilities
libvirt # provides virsh, virt-install, virt-manager (cli bits)
# GUI frontend
virt-manager # graphical manager (uses libvirt + spice)
virt-viewer # Spice/VNC client that virtmanager calls under the hood
];
services.spice-vdagentd.enable = true; # makes copypaste & autoresize work in Spice windows
networking.firewall.allowedTCPPorts = [5900 5901]; # Spice ports (adjust if you expose elsewhere)
networking.firewall.allowedUDPPorts = [5900 5901];
};
}
+146
View File
@@ -0,0 +1,146 @@
{
lib,
config,
pkgs,
modulesPath,
suiteModules,
...
}: {
imports = [
"${modulesPath}/virtualisation/disk-image.nix"
suiteModules.nixos.attic
];
image.format = "raw";
boot.initrd.availableKernelModules = [
"xhci_pci"
"usb_storage"
"uas"
"ahci"
"nvme"
"usbhid"
"sd_mod"
];
nixpkgs.hostPlatform = "x86_64-linux";
nixpkgs.config.allowUnfree = true;
nixpkgs.config.cudaSupport = true;
nix.settings = {
experimental-features = "nix-command flakes";
auto-optimise-store = true;
substituters = [
"https://cache.nixos.org"
"https://cuda-maintainers.cachix.org"
];
trusted-public-keys = [
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
"cuda-maintainers.cachix.org-1:0dq3bujKpuEPMCX6U4WylrUDZ9JyUG0VpVZa7CNfq5E="
];
};
security.sudo.wheelNeedsPassword = false;
networking.hostName = "beacon";
time.timeZone = "Asia/Jerusalem";
networking.networkmanager.enable = true;
hardware.enableRedistributableFirmware = true;
networking.useDHCP = false;
environment.etc."NetworkManager/system-connections/Zakobar.nmconnection" = {
mode = "0600";
text = ''
[connection]
id=Zakobar
type=wifi
autoconnect=true
[wifi]
mode=infrastructure
ssid=Zakobar
[wifi-security]
auth-alg=open
key-mgmt=wpa-psk
psk=0502711157
[ipv4]
method=manual
address1=192.168.1.200/24,192.168.1.1
dns=8.8.8.8;1.1.1.1;
ignore-auto-dns=true
[ipv6]
method=disabled
'';
};
# Swap is created on first boot after boot.growPartition expands the root
# partition to the full drive size. Non-blocking: a failure just means no
# swap on this boot (retried next boot once the partition has grown).
systemd.services.beacon-swap = {
description = "Create and activate swapfile";
after = ["systemd-growfs@-.service" "local-fs.target"];
wantedBy = ["multi-user.target"];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
script = ''
if [ ! -f /swapfile ]; then
dd if=/dev/zero of=/swapfile bs=1M count=16384 status=progress
chmod 600 /swapfile
${pkgs.util-linux}/bin/mkswap /swapfile
fi
${pkgs.util-linux}/bin/swapon /swapfile
'';
};
# NVIDIA RTX 4050 — Ada Lovelace supports open kernel modules
services.xserver.videoDrivers = ["nvidia"];
hardware.nvidia = {
open = true;
modesetting.enable = true;
package = config.boot.kernelPackages.nvidiaPackages.stable;
};
hardware.graphics.enable = true;
services.getty.autologinUser = "aner";
services.openssh = {
enable = true;
settings = {
PermitRootLogin = "no";
PasswordAuthentication = false;
};
};
users.users.aner = {
isNormalUser = true;
extraGroups = ["wheel" "video"];
openssh.authorizedKeys.keys = [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDfzDDO5juINctECmWlsYtGghEiX/RnTJ1cazLvOWSrPfsTyEd+B1+Ig8kFefNryjkpApfRXqj5KtLPNlpLfdVBrOIfhIveEp2MGqhgOGZFNVxQyXnZgii8Zdh4cqZ2O3pZpMsaAQBaJ9nH6dK0dJjicWT5f6TqwrVcInywRc5SuyizoSxoFmg7ch2rnlVi0j5XMVqdh8XLzHXZ7yWCzXy7+hWl/d7pwpyuzoK8dBw2EU9TauhgRDruom5Q9vWJTLStALC9pAIb0v9UFj9y+1zwx7pXsXp5F1g73EYrE4QR+QQ6z2LebuK280W0t+VA/fSCEB13DnkmofgqZQxX5MSCmrxZ5lTFp1FjW6yJo7As9FheF/GECowYkMRIx4IiQsjjHjZqlLRpLas11yAp6tGoZnw59hFo6Lu0Kva39jGVVmioYHtAeE5rD5w+v5kseJR4jlQ8aKB5yOjYUQOIz2AHQyoidgaeR2jPWqZUeRQbACI+/p3CHO45r3hrjATtGloBg0xF95Qws7Be3mjHVhbBLOoob8MdZ8nYAGnhlWrZphlkvXsHC6OUkuDJW00tmMjWXRlFwhFJ+nqUQCgLVjxVHQJ5rq9GeXBUuNXAeCm5BKBsdq+9qqVlt7D9iGyfr0lcZ7peKz/96KwPCWpG2En1Ur0/cVcbWnXEfG/xWO10tQ== openpgp:0xFA67FAB0"
];
};
environment.systemPackages = with pkgs; [
git
rsync
tmux
vim
wget
rclone
pciutils
nvtopPackages.nvidia
cudaPackages.cudatoolkit
cudaPackages.cudnn
cudaPackages.nccl
python3
direnv
];
azos.attic.enable = true;
system.stateVersion = "25.11";
}
+5 -30
View File
@@ -1,53 +1,42 @@
# This is your system's configuration file.
# Use this to configure your system environment (it replaces /etc/nixos/configuration.nix)
{
inputs,
outputs,
suiteModules,
lib,
config,
pkgs,
...
}: {
# You can import other NixOS modules here
virtualisation.vmVariant = {
virtualisation.resolution = {
x = 1280;
y = 1024;
};
virtualisation.qemu.options = [
# Better display option
"-vga virtio"
"-display gtk,zoom-to-fit=false"
# Enable copy/paste
# https://www.kraxel.org/blog/2021/05/qemu-cut-paste/
"-chardev qemu-vdagent,id=ch1,name=vdagent,clipboard=on"
"-device virtio-serial-pci"
"-device virtserialport,chardev=ch1,id=ch1,name=com.redhat.spice.0"
];
};
imports = [
inputs.home-manager.nixosModules.home-manager
outputs.nixosModules
];
nixpkgs.hostPlatform = "x86_64-linux";
nixpkgs = {
overlays = [
inputs.azos-core.overlays.addpkgs
# outputs.overlays.additions
# outputs.overlays.modifications
# outputs.overlays.unstable-packages
outputs.overlays.addpkgs
];
# Configure your nixpkgs instance
config = {
allowUnfree = true;
};
};
nix.registry = (lib.mapAttrs (_: flake: {inherit flake;})) ((lib.filterAttrs (_: lib.isType "flake")) inputs);
nix.nixPath = ["/etc/nix/path"];
environment.etc =
lib.mapAttrs'
@@ -59,21 +48,17 @@
nix.settings = {
experimental-features = "nix-command flakes";
# Deduplicate and optimize nix store
auto-optimise-store = true;
};
# TODO: Set your hostname
networking.hostName = "test-vm";
# TODO: This is just an example, be sure to use whatever bootloader you prefer
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
home-manager = {
extraSpecialArgs = {inherit inputs outputs;};
extraSpecialArgs = {inherit inputs outputs suiteModules pkgs;};
users = {
# Import your home-manager configuration
aner = import ../home-manager/home.nix;
};
};
@@ -82,28 +67,18 @@
aner = {
initialPassword = "password";
isNormalUser = true;
openssh.authorizedKeys.keys = [
# TODO: Add your SSH public key(s) here, if you plan on using SSH to connect
];
# TODO: Be sure to add any other groups you need (such as networkmanager, audio, docker, etc)
openssh.authorizedKeys.keys = [];
extraGroups = ["wheel" "libvirtd"];
};
};
# This setups a SSH server. Very important if you're setting up a headless system.
# Feel free to remove if you don't need it.
services.openssh = {
enable = true;
settings = {
# Forbid root login through SSH.
PermitRootLogin = "no";
# Use keys only. Remove if you want to SSH using password (not recommended)
PasswordAuthentication = true;
};
};
#Graphical environment
# services.xserver.desktopManager.xfce.enable = true;
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
system.stateVersion = "24.05";
}
+48 -27
View File
@@ -1,6 +1,7 @@
{
inputs,
outputs,
suiteModules,
lib,
config,
pkgs,
@@ -11,19 +12,27 @@
inputs.nixos-hardware.nixosModules.lenovo-thinkpad-t480
inputs.musnix.nixosModules.musnix
inputs.home-manager.nixosModules.home-manager
outputs.nixosModules
outputs.azos-core.nixosModules
suiteModules.nixos.base
suiteModules.nixos.exwm
suiteModules.nixos.audio
suiteModules.nixos.bluetooth
suiteModules.nixos.steam
suiteModules.nixos.virtualization
suiteModules.nixos.binfmt
suiteModules.nixos.attic
];
# Bootloader.
boot.loader.systemd-boot.enable = true;
boot.loader.grub = {
enable = true;
efiSupport = true;
device = "nodev";
};
boot.loader.efi.canTouchEfiVariables = true;
nixpkgs = {
overlays = [
inputs.azos-core.overlays.addpkgs
outputs.overlays.addpkgs
inputs.azos-core.overlays.qutebrowserdrm
outputs.overlays.qutebrowserdrm
outputs.overlays.modifications
outputs.overlays.unstable-packages
];
@@ -33,20 +42,14 @@
};
nix.registry = (lib.mapAttrs (_: flake: {inherit flake;})) ((lib.filterAttrs (_: lib.isType "flake")) inputs);
nix.nixPath = ["/etc/nix/path"];
networking.hostName = "lauretta"; # Define your hostname.
# Enable networking
networking.hostName = "lauretta";
networking.networkmanager.enable = true;
# Set your time zone.
time.timeZone = "Asia/Jerusalem";
# Select internationalisation properties.
i18n.defaultLocale = "en_IL";
i18n.extraLocaleSettings = {
LC_ADDRESS = "he_IL.UTF-8";
LC_IDENTIFICATION = "he_IL.UTF-8";
@@ -59,7 +62,6 @@
LC_TIME = "he_IL.UTF-8";
};
# Configure keymap in X11
services.xserver = {
xkb = {
layout = "us,il";
@@ -68,15 +70,12 @@
xkb.options = "grp:alt_shift_toggle";
};
# Configure console keymap
console.keyMap = "il";
# Define a user account. Don't forget to set a password with passwd.
users.users.aner = {
isNormalUser = true;
description = "Aner Zakobar";
#Audio group for audio config, video group necessary for backlight.
extraGroups = ["networkmanager" "wheel" "audio" "video"];
extraGroups = ["networkmanager" "wheel" "audio" "video" "seat" "input"];
packages = with pkgs; [];
};
@@ -85,34 +84,56 @@
auto-optimise-store = true;
};
azos.suites.exwm.enable = true;
azos.attic.enable = true;
home-manager = {
extraSpecialArgs = {inherit inputs outputs pkgs;};
extraSpecialArgs = {inherit inputs outputs suiteModules pkgs;};
users = {
aner = import ../home-manager/home.nix;
};
};
# Specializations
specialisation = {
hyprland = {
steam-big-picture = {
configuration = {
# Override homemanager options for this specialization
home-manager.users.aner = {pkgs, ...}: {
environment.systemPackages = [pkgs.sway];
environment.etc."sway-steam.conf".text = ''
output * bg #000000 solid_color
default_border none
default_floating_border none
exec ${pkgs.dbus}/bin/dbus-run-session -- ${pkgs.bash}/bin/bash -c "steam -tenfoot; ${pkgs.sway}/bin/swaymsg exit"
'';
services.seatd.enable = true;
services.greetd.settings = lib.mkForce {
terminal.vt = 1;
default_session = {
command = "${pkgs.tuigreet}/bin/tuigreet --time --user-menu --cmd '/home/aner/.login.sh'";
user = "greeter";
};
initial_session = {
command = "${pkgs.sway}/bin/sway --config /etc/sway-steam.conf";
user = "aner";
};
};
home-manager.users.aner = {lib, ...}: {
azos.suites.exwm.enable = lib.mkForce false;
azos.suites.hyprland.enable = true;
};
};
};
};
# List packages installed in system profile. To search, run:
# $ nix search wget
boot.supportedFilesystems = ["exfat"];
boot.kernelModules = ["exfat"];
environment.systemPackages = with pkgs; [
vim
git
tmux
killall
brightnessctl
exfatprogs
gamescope
];
fonts.enableDefaultPackages = true;
@@ -124,5 +145,5 @@
systemd.targets.hibernate.enable = false;
systemd.targets.hybrid-sleep.enable = false;
system.stateVersion = "25.11"; # Did you read the comment?
system.stateVersion = "25.11";
}
+4 -15
View File
@@ -1,22 +1,11 @@
# This file defines overlays
{inputs, ...}: {
addpkgs = final: _prev: (import ../pkgs {pkgs = final.pkgs;});
#Current overlay is for helm, to disable binary, so no conflict
modifications = final: prev: {
helm = prev.helm.overrideAttrs (oldAttrs: rec {
patches =
oldAttrs.patches
or []
++ [
./helm.patch
];
config.flake.overlays.modifications = _final: prev: {
helm = prev.helm.overrideAttrs (oldAttrs: {
patches = oldAttrs.patches or [] ++ [./helm.patch];
});
};
# When applied, the unstable nixpkgs set (declared in the flake inputs) will
# be accessible through 'pkgs.unstable'
unstable-packages = final: _prev: {
config.flake.overlays.unstable-packages = final: _prev: {
unstable = import inputs.nixpkgs-unstable {
system = final.system;
config.allowUnfree = true;
-7
View File
@@ -1,7 +0,0 @@
{pkgs} @ args: let
inherit args;
localEmacsPkg = pkgs.localEmacsPkg;
in {
azos-emacs-lauretta = localEmacsPkg ./azos-emacs-lauretta.nix;
azos-emacs-hyprland = localEmacsPkg ./azos-emacs-hyprland.nix;
}
-135
View File
@@ -1,135 +0,0 @@
#+title: Aner's Emacs Lauretta Configuration
#+property: header-args :results silent
* Base setup
** Require
#+begin_src emacs-lisp
(require 'azos-emacs-base)
(require 'azos-emacs-dev)
(require 'azos-emacs-editor)
(require 'azos-emacs-exwm)
(require 'azos-emacs-station)
#+end_src
* Lauretta specific
** LLM
#+begin_src emacs-lisp
(setq
gptel-model 'openai/gpt-oss-120b
gptel-backend
(gptel-make-openai "Groq"
:host "api.groq.com"
:endpoint "/openai/v1/chat/completions"
:stream t
:key "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"
:models '(openai/gpt-oss-120b)))
#+end_src
** Agent Shell
#+begin_src emacs-lisp
(setq agent-shell-opencode-default-model-id "opencode/big-pickle")
;; (setq agent-shell-preferred-agent-config (agent-shell-opencode-make-agent-config))
#+end_src
** Headphones
#+begin_src emacs-lisp
(defun azos/connect-headphones ()
(interactive)
(start-process-shell-command "connect-headphones" nil "azos-connect-headphones-whmx4000"))
(define-key azos/global-minor-mode/open-keymap
(kbd "h") 'azos/connect-headphones)
#+end_src
** Tab bar setup
#+begin_src emacs-lisp
(when (fboundp #'azos/bat/enable-tab-display)
(azos/bat/enable-tab-display))
(when (fboundp #'azos/network/enable-tab-display)
(azos/network/enable-tab-display))
(when (fboundp #'azos/audio/enable-tab-display)
(azos/audio/enable-tab-display))
#+end_src
** Nixpkgs Search
#+begin_src emacs-lisp
(defun azos/nixpkgs-parse-json-lines (str)
"Parse JSON Lines format (one JSON object per line) from STR."
(mapcar (lambda (line)
(and (not (string-empty-p line))
(string-match "^{" line)
(condition-case nil
(json-parse-string line)
(error nil))))
(split-string (string-trim str) "\n" t)))
(defun azos/nixpkgs-g (key hash)
"Get KEY from HASH table."
(when (hash-table-p hash)
(gethash key hash)))
(defun azos/nixpkgs-search ()
"Search for a nixpkgs package and show its info."
(interactive)
(let* ((pattern (read-string "Search pattern: "))
(json-output (shell-command-to-string
(format "nix-search --json --max-results 50 '%s'" pattern)))
(results (and json-output
(not (string-empty-p json-output))
(azos/nixpkgs-parse-json-lines json-output)))
(packages (delq nil (mapcar (lambda (item)
(let ((pname (azos/nixpkgs-g "package_pname" item)))
(when pname
(cons pname item))))
results))))
(if packages
(let* ((selected (completing-read "Package: " (mapcar #'car packages) nil t))
(package-data (cdr (assoc-string selected packages))))
(let ((buf (get-buffer-create "*nixpkgs-package-info*")))
(with-current-buffer buf
(erase-buffer)
(if package-data
(progn
(insert (format "Package: %s\n\n" selected))
(insert (format "Version: %s\n" (or (azos/nixpkgs-g "package_pversion" package-data) "unknown")))
(insert (format "Attr: %s\n" (or (azos/nixpkgs-g "package_attr_name" package-data) "unknown")))
(insert (format "\nDescription: %s\n"
(or (azos/nixpkgs-g "package_description" package-data) "none")))
(let ((programs (azos/nixpkgs-g "package_programs" package-data)))
(when (vectorp programs)
(insert (format "\nPrograms: %s\n"
(mapconcat #'identity (append programs nil) " ")))))
(let ((homepage (let ((h (azos/nixpkgs-g "package_homepage" package-data)))
(when (vectorp h) (aref h 0)))))
(when homepage
(insert (format "\nHomepage: %s\n" homepage))))
(let ((licenses (azos/nixpkgs-g "package_license" package-data)))
(when (vectorp licenses)
(insert (format "\nLicense: %s\n"
(mapconcat (lambda (l)
(or (azos/nixpkgs-g "fullName" l) ""))
(append licenses nil) ", ")))))
(insert (format "Package: %s\n\n" selected)
"\nNo additional info available.")))
(goto-char (point-min)))
(display-buffer buf)))
(message "No packages found matching '%s'" pattern))))
(define-key azos/global-minor-mode/open-keymap
(kbd "n") 'azos/nixpkgs-search)
#+end_src
* Provide
#+begin_src emacs-lisp
(provide 'azos-emacs-lauretta)
#+end_src
+9 -3
View File
@@ -4,12 +4,18 @@ pkgs.mkShell {
alejandra
(pkgs.writeShellScriptBin
"azos-lauretta-update"
"sudo nixos-rebuild switch --flake .#lauretta")
"sudo nixos-rebuild switch --flake '.?submodules=1#lauretta'")
(pkgs.writeShellScriptBin
"azos-update-azos-core"
"nix flake update azos-core")
"nix flake update --flake '.?submodules=1' azos-core")
(pkgs.writeShellScriptBin
"azos-update"
"nix flake update")
"nix flake update --flake '.?submodules=1'")
(pkgs.writeShellScriptBin
"azos-beacon-build-image"
"nix build '.?submodules=1#packages.x86_64-linux.beacon-image'")
(pkgs.writeShellScriptBin
"azos-beacon-remote-update"
"nixos-rebuild switch --flake '.?submodules=1#beacon' --target-host aner@192.168.1.200 --build-host aner@192.168.1.200 --sudo")
];
}