Compare commits

..

31 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
aner 91c775a6c3 No right click menu, added binfmt 2026-04-23 14:49:49 +03:00
aner a6c4cc7922 Fixed things 2026-04-14 17:06:46 +03:00
aner dc47722b8b Added claude. 2026-04-09 13:25:21 +03:00
aner 6215127089 Fixes for things! 2026-04-02 10:44:37 +03:00
aner dccdcd4f18 Fixed bugs and warnings. 2026-03-28 17:05:49 +03:00
aner e7ab8c10d8 Many changes by GLM 2026-03-28 15:43:14 +03:00
aner e6188adc0d qutebrowser: fix escape sequences and disable session restore
- Simplify escape sequences in bind commands (M, Z keys)
- Add c.session.default_name = '' and c.session.store_size = 0
- Update AGENTS.md (trimmed to 150 lines)
- Update flake.lock with latest dependencies
2026-03-22 00:07:52 +02:00
aner c567ca5c3f Fixy fixy 2026-03-15 08:00:04 +02:00
aner 447cd2954d Bugfix 2026-03-15 01:59:48 +02:00
aner 9e59e32d0e Add .agent-shell to gitignore 2026-03-15 01:28:43 +02:00
79 changed files with 1536 additions and 1163 deletions
+1
View File
@@ -2,4 +2,5 @@ result
.#* .#*
*.qcow2 *.qcow2
.direnv .direnv
.agent-shell
+100 -110
View File
@@ -4,90 +4,83 @@ This is a NixOS/Nix flake-based configuration repository using home-manager for
## Build Commands ## Build Commands
### Evaluating Configuration ### Evaluating
```bash ```bash
# Evaluate system config (Lauretta laptop)
nix eval .#nixosConfigurations.lauretta.config.system.build.toplevel nix eval .#nixosConfigurations.lauretta.config.system.build.toplevel
# Evaluate flake info
nix flake show nix flake show
# Evaluate all outputs
nix eval . --apply 'x: x'
``` ```
### Building ### Building
```bash ```bash
# Build VM # VM (with submodules for azos-core)
nix build .#nixosConfigurations.vm.config.system.build.vm
# Or with submodules
nix build '.?submodules=1#nixosConfigurations.vm.config.system.build.vm' nix build '.?submodules=1#nixosConfigurations.vm.config.system.build.vm'
# Build formatter (alejandra) # Formatter
nix build .#formatter.x86_64-linux nix build .#formatter.x86_64-linux
``` ```
### Deploying ### Deploying
```bash ```bash
# Switch to new config (Lauretta) # Rebuild the azos environment for lauretta (this machine) — use this when asked to "rebuild"
sudo nixos-rebuild switch --flake '.?submodules=1#lauretta' sudo nixos-rebuild switch --flake '.?submodules=1#lauretta'
nix flake update --flake '.?submodules=1' # Update all inputs
# Update flake inputs nix flake lock --flake '.?submodules=1' --update-input X # Update specific input
nix flake update
# Update specific input
nix flake lock --update-input azos-core
``` ```
### Nix REPL > **Note**: When the user asks to "rebuild", they mean rebuilding the lauretta environment with the command above — NOT building the VM.
### Dev Shell & REPL
```bash ```bash
nix develop .#shells.x86_64-linux.default
nix repl nix repl
:lf . :lf .
# Then explore with:
inputs.nixpkgs.lib
``` ```
### Dev Shell ### Ad-hoc Commands
If an executable doesn't exist on the system, run it ad-hoc with:
```bash ```bash
nix develop .#shells.x86_64-linux.debugTexShell nix shell nixpkgs#<package> --command <cmd> <args>
```
### Garbage Collection
```bash
sudo nix-collect-garbage --delete-old
``` ```
## Linting/Formatting ## Linting/Formatting
This project uses [alejandra](https://github.comkamadorama/alejandra) as the formatter. Uses [alejandra](https://github.com/kamadorama/alejandra):
```bash ```bash
# Format all Nix files nix fmt # Format all Nix files
nix fmt
# Or use alejandra directly
alejandra . alejandra .
``` ```
There are no automated tests in this repository. VM testing is manual: ## Testing
Manual VM testing:
```bash ```bash
# Build and run VM nix build '.?submodules=1#nixosConfigurations.vm.config.system.build.vm'
nix build .#nixosConfigurations.vm.config.system.build.vm
./result/bin/run-nixos-vm ./result/bin/run-nixos-vm
``` ```
## Emacs Debugging
When adding or debugging Emacs functionality, you can interact with the running Emacs session via `emacsclient` (with user permission):
```bash
# Create and switch to a buffer
emacsclient -c -e '(switch-to-buffer (get-buffer-create "test"))'
# Evaluate arbitrary Elisp
emacsclient -e '(message "hello")'
```
## Code Style Guidelines ## Code Style Guidelines
### File Organization ### File Organization
- **Home-manager modules**: `modules/home-manager/<name>.nix` - **Home-manager modules**: `modules/home-manager/<name>.nix`
- **NixOS modules**: `modules/nixos/<name>.nix` - **NixOS modules**: `modules/nixos/<name>.nix`
- **Imports**: All modules are imported in `modules/home-manager/default.nix` and `modules/nixos/default.nix` - **Imports**: All modules in `modules/home-manager/default.nix` and `modules/nixos/default.nix` (alphabetical order)
- **Import sorting**: Alphabetical order in default.nix files - **Home config**: `home-manager/home.nix` - main home-manager user config
- **Custom packages**: `pkgs/` - custom package definitions
- **Overlays**: `overlays/` - package overlays (addpkgs, modifications, unstable-packages)
### Nix Module Structure ### Nix Module Template
Follow this template for home-manager modules:
```nix ```nix
{ {
@@ -106,95 +99,92 @@ in {
}; };
config = lib.mkIf isEnabled { config = lib.mkIf isEnabled {
home.packages = with pkgs; [ home.packages = with pkgs; [ pkg1 pkg2 ];
<package1>
<package2>
];
}; };
} }
``` ```
### Naming Conventions ### Naming Conventions
- Option paths: `config.azos.<module-name>.<option>`
- Enable option: `enable` (bool), default `true`
- Module names: kebab-case (`libreoffice.nix`, `git-config.nix`)
- Option names: may differ from filename (e.g., `git.nix` uses `azos.git-config`)
- Variables: kebab-case (`isEnabled`)
- **Option paths**: `config.azos.<module-name>.<option>` ### Formatting
- **Enable option**: Always `enable` (bool), default `true` - Indentation: 2 spaces
- **Module names**: kebab-case (e.g., `libreoffice.nix`, `git-config.nix`) - Let bindings: multi-line with `isEnabled` on its own line
- **Variable names**: kebab-case in let bindings (e.g., `isEnabled`) - Packages: Use `with pkgs; [ ... ]` syntax
### Formatting Rules
- **Indentation**: 2 spaces
- **Let bindings**: Multi-line format with `isEnabled` on its own line
```nix
let
isEnabled =
config.azos.module.enable;
in
```
- **Imports**: Sorted alphabetically in default.nix
- **Packages**: Use `with pkgs;` block for package lists
### Imports ### Imports
- Always include `{...}` for module args
- Always include `{...}` for module args even if unused - Standard args: `lib, config, pkgs, ...`
- Standard module args: `lib, config, pkgs, ...` - NixOS config args: `inputs, outputs, lib, config, pkgs, ...`
- Use `./relative/path.nix` for local imports - Use `./relative/path.nix` for local imports
### Adding New Modules
1. Create file in appropriate directory (`modules/home-manager/` or `modules/nixos/`)
2. Add import to `modules/<type>/default.nix` in alphabetical order
3. Use the standard module template above
4. Run `nix fmt` to format
### Option Patterns ### Option Patterns
- Boolean enable: `lib.mkOption { default = true; example = true; type = lib.types.bool; }`
- Conditional config: `lib.mkIf isEnabled { ... }`
- User-overridable: `lib.mkDefault`
- Force value: `lib.mkForce` (sparingly)
- **Boolean enable**: Always use `lib.mkOption` with `default = true`, `type = lib.types.bool` ### Home-Manager vs NixOS
- **Conditional config**: Always use `lib.mkIf isEnabled` wrapper - Home-manager: `home.packages`, `home.file`, `programs.<program>`
- **Package lists**: Use `with pkgs; [ ... ]` syntax - NixOS: `config.services`, `environment.systemPackages`
### Error Handling ### Suites System
Modules are organized into suites (defined in `azos-core/`):
- `azos.suites.base` - Base packages and config
- `azos.suites.editor` - Editor tools
- `azos.suites.dev` - Development tools
- `azos.suites.station` - Desktop applications
- `azos.suites.exwm` - EXWM window manager
- Enable in `home-manager/home.nix` with `azos.suites.<name>.enable = true;`
- Use `lib.mkIf` for conditional configuration rather than if-then-else ### Specializations
- Use `lib.mkDefault` for values that can be overridden by users NixOS supports specializations for alternative configurations:
- Use `lib.mkForce` sparingly for values that must not be overridden ```nix
specialisation = {
hyprland = {
configuration = {
home-manager.users.aner = {pkgs, ...}: {
azos.suites.exwm.enable = lib.mkForce false;
azos.suites.hyprland.enable = true;
};
};
};
};
```
### Home-Manager Specific ## Adding New Modules
- Config goes under `home` attribute (e.g., `home.packages`, `home.file`, `home.sessionVariables`) 1. Create file in `modules/home-manager/` or `modules/nixos/`
- Use `programs.<program>` for program configurations 2. Add import to `modules/<type>/default.nix` (alphabetical)
- Use `services.<service>` for system services 3. Use module template above
4. Run `nix fmt`
### NixOS Specific
- Config goes under `config` directly (e.g., `services`, `environment.systemPackages`)
- Use `environment.systemPackages` for system-wide packages
- Use `users.users.<name>` for user configuration
## Key Files ## Key Files
- `flake.nix`: Main flake definition, defines systems, overlays, modules | File | Purpose |
- `modules/home-manager/default.nix`: Home-manager module imports |------|---------|
- `modules/nixos/default.nix`: NixOS module imports | `flake.nix` | Main flake, defines systems, overlays |
- `nixos/configuration.nix`: Lauretta laptop configuration | `modules/home-manager/default.nix` | Home-manager imports |
- `nixos/configuration-vm.nix`: Test VM configuration | `modules/nixos/default.nix` | NixOS imports |
- `overlays/`: Custom package overlays | `home-manager/home.nix` | User home-manager config, enables suites |
- `pkgs/`: Custom packages | `nixos/configuration.nix` | Lauretta laptop config |
| `nixos/configuration-vm.nix` | Test VM config |
| `overlays/` | Custom package overlays |
| `pkgs/` | Custom packages |
| `azos-core/` | Shared modules (submodule) |
## Common Tasks ## Common Tasks
### Add new package to system **Add system package**: Edit NixOS module, add to `environment.systemPackages = with pkgs; [ pkg ]`
1. Create or edit module in `modules/nixos/`
2. Add to `environment.systemPackages = with pkgs; [ pkg ]`
### Add new home-manager package **Add home-manager package**: Edit module, add to `home.packages = with pkgs; [ pkg ]`
1. Create or edit module in `modules/home-manager/`
2. Add to `home.packages = with pkgs; [ pkg ]`
### Add new system service **Add system service**: Edit NixOS module, add under `services.<service>`
1. Edit appropriate NixOS module
2. Add service config under `services.<service>`
### Test changes locally **Add custom package**: Create file in `pkgs/`, add to `pkgs/default.nix`, use via overlay
1. Build VM: `nix build .#nixosConfigurations.vm.config.system.build.vm`
2. Run VM: `./result/bin/run-nixos-vm` **Access unstable packages**: Use `pkgs.unstable.<package>` (via unstable-packages overlay)
+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 { orgTrivialBuild {
pname = "azos-emacs-hyprland"; pname = "azos-emacs-hyprland";
version = "0.1.6"; version = "0.1.6";
src = ./elisp/azos-emacs-hyprland.org; src = ./config.org;
packageRequires = with epkgs; [ packageRequires = with epkgs; [
pkgs.azos-emacs-base 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];
};
};
}
@@ -2,10 +2,11 @@
orgTrivialBuild, orgTrivialBuild,
epkgs, epkgs,
pkgs, pkgs,
} : orgTrivialBuild { }:
orgTrivialBuild {
pname = "azos-emacs-lauretta"; pname = "azos-emacs-lauretta";
version = "0.1.6"; version = "0.1.6";
src = ./elisp/azos-emacs-lauretta.org; src = ./config.org;
packageRequires = with epkgs; [ packageRequires = with epkgs; [
pkgs.azos-emacs-base pkgs.azos-emacs-base
pkgs.azos-emacs-dev pkgs.azos-emacs-dev
@@ -14,5 +15,6 @@
pkgs.azos-emacs-station pkgs.azos-emacs-station
agent-shell 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;
};
};
}
@@ -7,6 +7,8 @@ config.load_autoconfig(True)
#Also using this https://github.com/miseran/tabs_are_windows/blob/main/config.py #Also using this https://github.com/miseran/tabs_are_windows/blob/main/config.py
c.tabs.show = 'never' c.tabs.show = 'never'
c.session.default_name = ''
c.auto_save.interval = 0
c.tabs.tabs_are_windows = True c.tabs.tabs_are_windows = True
c.window.title_format = 'qute: {private}{host}{perc}{title_sep}{current_title}' c.window.title_format = 'qute: {private}{host}{perc}{title_sep}{current_title}'
@@ -26,12 +28,8 @@ c.url.searchengines = {
#Youtube stuff from DT. #Youtube stuff from DT.
#Added media-title to MPV and youtube-dl with exwm process to track progress. #Added media-title to MPV and youtube-dl with exwm process to track progress.
config.bind('M', 'hint links spawn mpv --title=\'${media-title}\' {hint-url}') config.bind('M', 'hint links spawn mpv --title="${media-title}" {hint-url}')
config.bind('Z', config.bind('Z', 'hint links spawn emacsclient -e "(start-process \\"youtube-dl {hint-url}\\" \\"youtube-dl {hint-url}\\" \\"youtube-dl\\" \\"-o\\" \\"~/downloads/%(title)s.%(ext)s\\" \\"{hint-url}\\" \\"--newline\\")"')
'hint links spawn emacsclient -e "(start-process '\
'\\"youtube-dl {hint-url}\\" \\"youtube-dl {hint-url}\\" '\
'\\"youtube-dl\\" \\"-o\\" \\"~/downloads/%(title)s.%(ext)s\\" '\
'\\"{hint-url}\\" \\"--newline\\")"')
config.bind('xb', 'config-cycle statusbar.show always in-mode') config.bind('xb', 'config-cycle statusbar.show always in-mode')
c.statusbar.show = 'in-mode' c.statusbar.show = 'in-mode'
@@ -44,8 +42,8 @@ c.downloads.location.prompt = False
c.editor.command = ['emacsclient', '-e', '(find-file "{}")'] c.editor.command = ['emacsclient', '-e', '(find-file "{}")']
monospace = "10pt 'LiberationMono'" 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.completion.entry = monospace
c.fonts.debug_console = monospace c.fonts.debug_console = monospace
c.fonts.downloads = monospace c.fonts.downloads = monospace
@@ -56,3 +54,7 @@ c.fonts.messages.warning = monospace
c.fonts.prompts = monospace c.fonts.prompts = monospace
c.fonts.statusbar = monospace c.fonts.statusbar = monospace
c.fonts.hints = "bold 13px 'LiberationMono'" 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
+182 -28
View File
@@ -3,7 +3,9 @@
"azos-core": { "azos-core": {
"inputs": { "inputs": {
"cabata": "cabata", "cabata": "cabata",
"nixpkgs": "nixpkgs_2" "evil-hl-line": "evil-hl-line",
"flake-parts": "flake-parts",
"import-tree": "import-tree"
}, },
"locked": { "locked": {
"path": "./azos-core", "path": "./azos-core",
@@ -22,11 +24,11 @@
"systems": "systems" "systems": "systems"
}, },
"locked": { "locked": {
"lastModified": 1771368993, "lastModified": 1779008956,
"narHash": "sha256-mWcLaCViNfUMPcqCvQRed4kR20Ifs8aaHcjMlVbF2tQ=", "narHash": "sha256-jpJ30XX1pAH+Mpsyj92K8t6812Qs+P4J31wO7RS/e+Y=",
"owner": "anerisgreat", "owner": "anerisgreat",
"repo": "cabata", "repo": "cabata",
"rev": "4fa661795527fa437698409395dc4363fbc0adf0", "rev": "ff1871152ffb635e18e1a9804750192c6969d1cb",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -35,6 +37,61 @@
"type": "github" "type": "github"
} }
}, },
"evil-hl-line": {
"inputs": {
"flake-utils": "flake-utils_2",
"nixpkgs": "nixpkgs_2"
},
"locked": {
"lastModified": 1778617640,
"narHash": "sha256-bG1hjyLIOiRB+M1rXm8ch0ftHPvV43lRtzQ8qWcus5s=",
"owner": "anerisgreat",
"repo": "evil-hl-line",
"rev": "7cf5a11bdca2abd9516f0ce572e1e03bb541507f",
"type": "github"
},
"original": {
"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"
}
},
"flake-utils": { "flake-utils": {
"inputs": { "inputs": {
"systems": [ "systems": [
@@ -57,6 +114,24 @@
"type": "github" "type": "github"
} }
}, },
"flake-utils_2": {
"inputs": {
"systems": "systems_2"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"home-manager": { "home-manager": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
@@ -64,30 +139,60 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1772020340, "lastModified": 1779969295,
"narHash": "sha256-aqBl3GNpCadMoJ/hVkWTijM1Aeilc278MjM+LA3jK6g=", "narHash": "sha256-HwIJ3tOcwSMiV75L7KqJXciXR9UfT+d7rwOZMX7cTnA=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "36e38ca0d9afe4c55405fdf22179a5212243eecc", "rev": "61e2c9659324181e0f0ed911958c536333b1d4f6",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nix-community", "owner": "nix-community",
"ref": "release-25.11", "ref": "master",
"repo": "home-manager", "repo": "home-manager",
"type": "github" "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": { "musnix": {
"inputs": { "inputs": {
"nixpkgs": "nixpkgs_3" "nixpkgs": "nixpkgs_3"
}, },
"locked": { "locked": {
"lastModified": 1767232402, "lastModified": 1777848538,
"narHash": "sha256-li+h6crnhc5Zqs+M6pn7D7M0W9M63ECNennDjRgzioE=", "narHash": "sha256-Dj51C0NWsglqRrCpdmMr2nFiYacFOid1Tor4H9yG2HY=",
"owner": "musnix", "owner": "musnix",
"repo": "musnix", "repo": "musnix",
"rev": "d65f98e0b1f792365f1705653d7b2d266ceeff6e", "rev": "8548782f0d1d0928daa3fffde8a008f72219a3f3",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -98,11 +203,11 @@
}, },
"nixos-hardware": { "nixos-hardware": {
"locked": { "locked": {
"lastModified": 1771969195, "lastModified": 1779826373,
"narHash": "sha256-qwcDBtrRvJbrrnv1lf/pREQi8t2hWZxVAyeMo7/E9sw=", "narHash": "sha256-3sRzgLX86qV5NlhWUAufLmHwkyP03tmL3VdZIM13dEo=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixos-hardware", "repo": "nixos-hardware",
"rev": "41c6b421bdc301b2624486e11905c9af7b8ec68e", "rev": "ef4efb84766a166c906bd55759574676bf91267c",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -126,13 +231,43 @@
"type": "indirect" "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": { "nixpkgs-unstable": {
"locked": { "locked": {
"lastModified": 1771848320, "lastModified": 1779560665,
"narHash": "sha256-0MAd+0mun3K/Ns8JATeHT1sX28faLII5hVLq0L3BdZU=", "narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "2fc6539b481e1d2569f25f8799236694180c0993", "rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -144,25 +279,27 @@
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1771923393, "lastModified": 1779508470,
"narHash": "sha256-Fy0+UXELv9hOE8WjYhJt8fMDLYTU2Dqn3cX4BwoGBos=", "narHash": "sha256-Ap9KJX+5xHIn3bPIpfNgT6MEXdAECECwo4/rmlQD74M=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "ea7f1f06811ce7fcc81d6c6fd4213150c23edcf2", "rev": "29916453413845e54a65b8a1cf996842300cd299",
"type": "github" "type": "github"
}, },
"original": { "original": {
"id": "nixpkgs", "owner": "NixOS",
"type": "indirect" "ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
} }
}, },
"nixpkgs_3": { "nixpkgs_3": {
"locked": { "locked": {
"lastModified": 1766902085, "lastModified": 1777268161,
"narHash": "sha256-coBu0ONtFzlwwVBzmjacUQwj3G+lybcZ1oeNSQkgC0M=", "narHash": "sha256-bxrdOn8SCOv8tN4JbTF/TXq7kjo9ag4M+C8yzzIRYbE=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "rev": "1c3fe55ad329cbcb28471bb30f05c9827f724c76",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -174,11 +311,11 @@
}, },
"nixpkgs_4": { "nixpkgs_4": {
"locked": { "locked": {
"lastModified": 1773476965, "lastModified": 1779877693,
"narHash": "sha256-Laaj25PvGeoP5SPhMfMGxvWqM6ZjZ6LdUeEhP6b3czY=", "narHash": "sha256-NOF9NAREhxr50bbBfVcVOq+ArCMSoe8dP79Pk2uyARk=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "f82ce7af0b79ac154b12e27ed800aeb97413723c", "rev": "4100e830e085863741bc69b156ec4ccd53ab5be0",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -191,7 +328,9 @@
"root": { "root": {
"inputs": { "inputs": {
"azos-core": "azos-core", "azos-core": "azos-core",
"flake-parts": "flake-parts_2",
"home-manager": "home-manager", "home-manager": "home-manager",
"import-tree": "import-tree_2",
"musnix": "musnix", "musnix": "musnix",
"nixos-hardware": "nixos-hardware", "nixos-hardware": "nixos-hardware",
"nixpkgs": "nixpkgs_4", "nixpkgs": "nixpkgs_4",
@@ -212,6 +351,21 @@
"repo": "x86_64-linux", "repo": "x86_64-linux",
"type": "github" "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", "root": "root",
+28 -51
View File
@@ -3,76 +3,53 @@
inputs = { inputs = {
self.submodules = true; 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"; nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
home-manager = { home-manager = {
# Follow corresponding `release` branch from Home Manager url = "github:nix-community/home-manager/master";
url = "github:nix-community/home-manager/release-25.11";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
nixos-hardware.url = "github:NixOS/nixos-hardware/master"; nixos-hardware.url = "github:NixOS/nixos-hardware/master";
#Music production nix
musnix = {url = "github:musnix/musnix";}; musnix = {url = "github:musnix/musnix";};
azos-core = { azos-core = {
url = "./azos-core"; url = "./azos-core";
flake = true; flake = true;
}; };
flake-parts.url = "github:hercules-ci/flake-parts";
import-tree.url = "github:vic/import-tree";
}; };
outputs = { outputs = inputs:
self, inputs.flake-parts.lib.mkFlake {inherit inputs;} {
nixpkgs, imports = [
home-manager, inputs.azos-core.flakeModules.default
... ./overlays/default.nix
} @ inputs: let (inputs.import-tree ./features)
inherit (self) outputs; ./_machines/lauretta.nix
systems = [ ./_machines/vm.nix
"aarch64-linux" ./_machines/beacon.nix
"x86_64-linux" ];
"aarch64-darwin"
"x86_64-darwin"
];
forAllSystems = nixpkgs.lib.genAttrs systems;
in {
formatter = forAllSystems (system: nixpkgs.legacyPackages.${system}.alejandra);
overlays = import ./overlays {inherit inputs;}; systems = [
azos-core.nixosModules = inputs.azos-core.nixosModules.nixosModules; "aarch64-linux"
nixosModules = import ./modules/nixos; "x86_64-linux"
azos-core.homeManagerModules = inputs.azos-core.nixosModules.homeManagerModules; "aarch64-darwin"
homeManagerModules = import ./modules/home-manager; "x86_64-darwin"
];
#Systems configured perSystem = {
nixosConfigurations = { system,
#Lauretta - laptop pkgs,
lauretta = nixpkgs.lib.nixosSystem { ...
specialArgs = {inherit inputs outputs;}; }: {
modules = [ formatter = pkgs.alejandra;
./nixos/configuration.nix devShells = (import ./shells) {inherit pkgs;};
];
};
#Test VM
vm = nixpkgs.lib.nixosSystem {
specialArgs = {inherit inputs outputs;};
modules = [
./nixos/configuration-vm.nix
];
}; };
}; };
#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, inputs,
outputs, outputs,
suiteModules,
lib, lib,
config, config,
pkgs, pkgs,
... ...
}: { }: {
imports = [ imports = [
outputs.homeManagerModules suiteModules.homeManager.base
outputs.azos-core.homeManagerModules 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; 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.suites.lauretta.enable = true;
azos.name = "Aner Zakobar"; azos.name = "Aner Zakobar";
@@ -28,9 +42,7 @@
homeDirectory = "/home/aner"; homeDirectory = "/home/aner";
}; };
# Nicely reload system units when changing configs
systemd.user.startServices = "sd-switch"; systemd.user.startServices = "sd-switch";
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
home.stateVersion = "25.11"; 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];
};
}
-21
View File
@@ -1,21 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.chromium.enable;
in {
options.azos.chromium.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
home.packages = with pkgs; [
chromium
];
};
}
-26
View File
@@ -1,26 +0,0 @@
{
imports = [
./zoom.nix
./ytdl.nix
./mail.nix
./encryption.nix
./kubernetes.nix
./git.nix
./mpris-proxy.nix
./qutebrowser-config.nix
./audio.nix
./reaper.nix
./discord.nix
./spotify.nix
./headphones-whmx4000.nix
./deluge.nix
./lauretta-emacs.nix
./gimp.nix
# ./printing.nix
./libreoffice.nix
./chromium.nix
./hyprland-suite.nix
# ./gnuradio.nix
./opencode.nix
];
}
-21
View File
@@ -1,21 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.deluged.enable;
in {
options.azos.deluged.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
home.packages = with pkgs; [
deluged
];
};
}
-21
View File
@@ -1,21 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.discord.enable;
in {
options.azos.discord.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
home.packages = with pkgs; [
discord
];
};
}
-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;
};
}
-21
View File
@@ -1,21 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.gimp.enable;
in {
options.azos.gimp.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
home.packages = with pkgs; [
gimp3
];
};
}
-41
View File
@@ -1,41 +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" )
];
};
}
-59
View File
@@ -1,59 +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
];
};
}
-21
View File
@@ -1,21 +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];
};
}
-21
View File
@@ -1,21 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.libreoffice.enable;
in {
options.azos.libreoffice.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
home.packages = with pkgs; [
libreoffice
];
};
}
-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;
};
}
-21
View File
@@ -1,21 +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 {
home.packages = with pkgs; [
opencode
];
};
}
-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
];
};
}
-21
View File
@@ -1,21 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.spotify.enable;
in {
options.azos.spotify.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
home.packages = with pkgs; [
spotify
];
};
}
-21
View File
@@ -1,21 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.discord.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
];
};
}
-21
View File
@@ -1,21 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
isEnabled =
config.azos.zoom.enable;
in {
options.azos.zoom.enable = lib.mkOption {
default = true;
example = true;
type = lib.types.bool;
};
config = lib.mkIf isEnabled {
home.packages = with pkgs; [
zoom-us
];
};
}
-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;
};
}
-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 ./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;
};
}
-42
View File
@@ -1,42 +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";
}
+6 -31
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, inputs,
outputs, outputs,
suiteModules,
lib, lib,
config, config,
pkgs, pkgs,
... ...
}: { }: {
# You can import other NixOS modules here
virtualisation.vmVariant = { virtualisation.vmVariant = {
virtualisation.resolution = { virtualisation.resolution = {
x = 1280; x = 1280;
y = 1024; y = 1024;
}; };
virtualisation.qemu.options = [ virtualisation.qemu.options = [
# Better display option
"-vga virtio" "-vga virtio"
"-display gtk,zoom-to-fit=false" "-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" "-chardev qemu-vdagent,id=ch1,name=vdagent,clipboard=on"
"-device virtio-serial-pci" "-device virtio-serial-pci"
"-device virtserialport,chardev=ch1,id=ch1,name=com.redhat.spice.0" "-device virtserialport,chardev=ch1,id=ch1,name=com.redhat.spice.0"
]; ];
}; };
imports = [ imports = [
inputs.home-manager.nixosModules.home-manager inputs.home-manager.nixosModules.home-manager
outputs.nixosModules
]; ];
nixpkgs.hostPlatform = "x86_64-linux"; nixpkgs.hostPlatform = "x86_64-linux";
nixpkgs = { nixpkgs = {
overlays = [ overlays = [
inputs.azos-core.overlays.addpkgs outputs.overlays.addpkgs
# outputs.overlays.additions
# outputs.overlays.modifications
# outputs.overlays.unstable-packages
]; ];
# Configure your nixpkgs instance
config = { config = {
allowUnfree = true; allowUnfree = true;
}; };
}; };
nix.registry = (lib.mapAttrs (_: flake: {inherit flake;})) ((lib.filterAttrs (_: lib.isType "flake")) inputs); nix.registry = (lib.mapAttrs (_: flake: {inherit flake;})) ((lib.filterAttrs (_: lib.isType "flake")) inputs);
nix.nixPath = ["/etc/nix/path"]; nix.nixPath = ["/etc/nix/path"];
environment.etc = environment.etc =
lib.mapAttrs' lib.mapAttrs'
@@ -59,21 +48,17 @@
nix.settings = { nix.settings = {
experimental-features = "nix-command flakes"; experimental-features = "nix-command flakes";
# Deduplicate and optimize nix store
auto-optimise-store = true; auto-optimise-store = true;
}; };
# TODO: Set your hostname
networking.hostName = "test-vm"; 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.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true; boot.loader.efi.canTouchEfiVariables = true;
home-manager = { home-manager = {
extraSpecialArgs = {inherit inputs outputs;}; extraSpecialArgs = {inherit inputs outputs suiteModules pkgs;};
users = { users = {
# Import your home-manager configuration
aner = import ../home-manager/home.nix; aner = import ../home-manager/home.nix;
}; };
}; };
@@ -82,28 +67,18 @@
aner = { aner = {
initialPassword = "password"; initialPassword = "password";
isNormalUser = true; isNormalUser = true;
openssh.authorizedKeys.keys = [ openssh.authorizedKeys.keys = [];
# TODO: Add your SSH public key(s) here, if you plan on using SSH to connect extraGroups = ["wheel" "libvirtd"];
];
# TODO: Be sure to add any other groups you need (such as networkmanager, audio, docker, etc)
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 = { services.openssh = {
enable = true; enable = true;
settings = { settings = {
# Forbid root login through SSH.
PermitRootLogin = "no"; PermitRootLogin = "no";
# Use keys only. Remove if you want to SSH using password (not recommended)
PasswordAuthentication = true; PasswordAuthentication = true;
}; };
}; };
#Graphical environment
# services.xserver.desktopManager.xfce.enable = true;
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
system.stateVersion = "24.05"; system.stateVersion = "24.05";
} }
+47 -27
View File
@@ -1,6 +1,7 @@
{ {
inputs, inputs,
outputs, outputs,
suiteModules,
lib, lib,
config, config,
pkgs, pkgs,
@@ -11,19 +12,27 @@
inputs.nixos-hardware.nixosModules.lenovo-thinkpad-t480 inputs.nixos-hardware.nixosModules.lenovo-thinkpad-t480
inputs.musnix.nixosModules.musnix inputs.musnix.nixosModules.musnix
inputs.home-manager.nixosModules.home-manager inputs.home-manager.nixosModules.home-manager
outputs.nixosModules suiteModules.nixos.base
outputs.azos-core.nixosModules suiteModules.nixos.exwm
suiteModules.nixos.audio
suiteModules.nixos.bluetooth
suiteModules.nixos.steam
suiteModules.nixos.virtualization
suiteModules.nixos.binfmt
suiteModules.nixos.attic
]; ];
# Bootloader. boot.loader.grub = {
boot.loader.systemd-boot.enable = true; enable = true;
efiSupport = true;
device = "nodev";
};
boot.loader.efi.canTouchEfiVariables = true; boot.loader.efi.canTouchEfiVariables = true;
nixpkgs = { nixpkgs = {
overlays = [ overlays = [
inputs.azos-core.overlays.addpkgs
outputs.overlays.addpkgs outputs.overlays.addpkgs
inputs.azos-core.overlays.qutebrowserdrm outputs.overlays.qutebrowserdrm
outputs.overlays.modifications outputs.overlays.modifications
outputs.overlays.unstable-packages outputs.overlays.unstable-packages
]; ];
@@ -33,20 +42,14 @@
}; };
nix.registry = (lib.mapAttrs (_: flake: {inherit flake;})) ((lib.filterAttrs (_: lib.isType "flake")) inputs); nix.registry = (lib.mapAttrs (_: flake: {inherit flake;})) ((lib.filterAttrs (_: lib.isType "flake")) inputs);
nix.nixPath = ["/etc/nix/path"]; nix.nixPath = ["/etc/nix/path"];
networking.hostName = "lauretta"; # Define your hostname. networking.hostName = "lauretta";
# Enable networking
networking.networkmanager.enable = true; networking.networkmanager.enable = true;
# Set your time zone.
time.timeZone = "Asia/Jerusalem"; time.timeZone = "Asia/Jerusalem";
# Select internationalisation properties.
i18n.defaultLocale = "en_IL"; i18n.defaultLocale = "en_IL";
i18n.extraLocaleSettings = { i18n.extraLocaleSettings = {
LC_ADDRESS = "he_IL.UTF-8"; LC_ADDRESS = "he_IL.UTF-8";
LC_IDENTIFICATION = "he_IL.UTF-8"; LC_IDENTIFICATION = "he_IL.UTF-8";
@@ -59,7 +62,6 @@
LC_TIME = "he_IL.UTF-8"; LC_TIME = "he_IL.UTF-8";
}; };
# Configure keymap in X11
services.xserver = { services.xserver = {
xkb = { xkb = {
layout = "us,il"; layout = "us,il";
@@ -68,15 +70,12 @@
xkb.options = "grp:alt_shift_toggle"; xkb.options = "grp:alt_shift_toggle";
}; };
# Configure console keymap
console.keyMap = "il"; console.keyMap = "il";
# Define a user account. Don't forget to set a password with passwd.
users.users.aner = { users.users.aner = {
isNormalUser = true; isNormalUser = true;
description = "Aner Zakobar"; description = "Aner Zakobar";
#Audio group for audio config, video group necessary for backlight. extraGroups = ["networkmanager" "wheel" "audio" "video" "seat" "input"];
extraGroups = ["networkmanager" "wheel" "audio" "video"];
packages = with pkgs; []; packages = with pkgs; [];
}; };
@@ -85,35 +84,56 @@
auto-optimise-store = true; auto-optimise-store = true;
}; };
azos.suites.exwm.enable = true;
azos.attic.enable = true;
home-manager = { home-manager = {
extraSpecialArgs = {inherit inputs outputs pkgs;}; extraSpecialArgs = {inherit inputs outputs suiteModules pkgs;};
users = { users = {
aner = import ../home-manager/home.nix; aner = import ../home-manager/home.nix;
}; };
}; };
# Specializations
specialisation = { specialisation = {
hyprland = { steam-big-picture = {
configuration = { configuration = {
# Override homemanager options for this specialization environment.systemPackages = [pkgs.sway];
home-manager.users.aner = { pkgs, ... }: { 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.exwm.enable = lib.mkForce false;
azos.suites.hyprland.enable = true;
}; };
}; };
}; };
}; };
boot.supportedFilesystems = ["exfat"];
boot.kernelModules = ["exfat"];
# List packages installed in system profile. To search, run:
# $ nix search wget
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
vim vim
git git
tmux tmux
killall killall
brightnessctl brightnessctl
exfatprogs
gamescope
]; ];
fonts.enableDefaultPackages = true; fonts.enableDefaultPackages = true;
@@ -125,5 +145,5 @@
systemd.targets.hibernate.enable = false; systemd.targets.hibernate.enable = false;
systemd.targets.hybrid-sleep.enable = false; systemd.targets.hybrid-sleep.enable = false;
system.stateVersion = "25.11"; # Did you read the comment? system.stateVersion = "25.11";
} }
+1 -1
View File
@@ -17,7 +17,7 @@
boot.kernelModules = ["kvm-intel"]; boot.kernelModules = ["kvm-intel"];
boot.extraModulePackages = []; boot.extraModulePackages = [];
fileSystems."/" ={ fileSystems."/" = {
device = "/dev/disk/by-uuid/d28f6c1d-f7ec-44a1-a59b-a598c7f136f7"; device = "/dev/disk/by-uuid/d28f6c1d-f7ec-44a1-a59b-a598c7f136f7";
fsType = "btrfs"; fsType = "btrfs";
options = ["subvol=@"]; options = ["subvol=@"];
+4 -15
View File
@@ -1,22 +1,11 @@
# This file defines overlays
{inputs, ...}: { {inputs, ...}: {
addpkgs = final: _prev: (import ../pkgs {pkgs = final.pkgs;}); config.flake.overlays.modifications = _final: prev: {
helm = prev.helm.overrideAttrs (oldAttrs: {
#Current overlay is for helm, to disable binary, so no conflict patches = oldAttrs.patches or [] ++ [./helm.patch];
modifications = final: prev: {
helm = prev.helm.overrideAttrs (oldAttrs: rec {
patches =
oldAttrs.patches
or []
++ [
./helm.patch
];
}); });
}; };
# When applied, the unstable nixpkgs set (declared in the flake inputs) will config.flake.overlays.unstable-packages = final: _prev: {
# be accessible through 'pkgs.unstable'
unstable-packages = final: _prev: {
unstable = import inputs.nixpkgs-unstable { unstable = import inputs.nixpkgs-unstable {
system = final.system; system = final.system;
config.allowUnfree = true; 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;
}
-74
View File
@@ -1,74 +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)))
;; This is where I would update agents if I had them
;; (setq gptel-agent-dirs '("/home/aner/.agents"))
;; (gptel-agent-update)
(use-package agent-shell
:ensure t
:ensure-system-package
:config
;; Evil state-specific RET behavior: insert mode = newline, normal mode = send
(evil-define-key 'insert agent-shell-mode-map (kbd "RET") #'newline)
(evil-define-key 'normal agent-shell-mode-map (kbd "RET") #'comint-send-input)
(add-hook 'diff-mode-hook
(lambda ()
(when (string-match-p "\\*agent-shell-diff\\*" (buffer-name))
(evil-emacs-state)))))
#+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
* Provide
#+begin_src emacs-lisp
(provide 'azos-emacs-lauretta)
#+end_src
+20 -13
View File
@@ -1,14 +1,21 @@
{pkgs} @ args: {pkgs} @ args:
pkgs.mkShell { pkgs.mkShell {
buildInputs = with pkgs; [ buildInputs = with pkgs; [
( pkgs.writeShellScriptBin alejandra
"azos-lauretta-update" (pkgs.writeShellScriptBin
"sudo nixos-rebuild switch --flake .#lauretta" ) "azos-lauretta-update"
( pkgs.writeShellScriptBin "sudo nixos-rebuild switch --flake '.?submodules=1#lauretta'")
"azos-update-azos-core" (pkgs.writeShellScriptBin
"nix flake update azos-core" ) "azos-update-azos-core"
( pkgs.writeShellScriptBin "nix flake update --flake '.?submodules=1' azos-core")
"azos-update" (pkgs.writeShellScriptBin
"nix flake update" ) "azos-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")
];
}