Compare commits
16 Commits
d4dee59413
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 78afc9e5bf | |||
| ebdee10fba | |||
| 890f39079b | |||
| e0a5891cd8 | |||
| 7f27339312 | |||
| bd64633454 | |||
| 7c187d1c3d | |||
| 1adc0439ea | |||
| 2254fd419d | |||
| cf976ae14a | |||
| c928f5f748 | |||
| 8d0f541fbe | |||
| c0f72be869 | |||
| e271872cae | |||
| 27fafdc111 | |||
| fcb7e0b884 |
@@ -22,7 +22,7 @@ nix build .#formatter.x86_64-linux
|
||||
### Deploying
|
||||
```bash
|
||||
# Rebuild the azos environment for lauretta (this machine) — use this when asked to "rebuild"
|
||||
sudo nixos-rebuild switch --flake '.?submodules=1#lauretta'
|
||||
azos-lauretta-update
|
||||
nix flake update --flake '.?submodules=1' # Update all inputs
|
||||
nix flake lock --flake '.?submodules=1' --update-input X # Update specific input
|
||||
```
|
||||
@@ -70,76 +70,111 @@ emacsclient -c -e '(switch-to-buffer (get-buffer-create "test"))'
|
||||
emacsclient -e '(message "hello")'
|
||||
```
|
||||
|
||||
## Code Style Guidelines
|
||||
## Repository Structure
|
||||
|
||||
### File Organization
|
||||
- **Home-manager modules**: `modules/home-manager/<name>.nix`
|
||||
- **NixOS modules**: `modules/nixos/<name>.nix`
|
||||
- **Imports**: All modules in `modules/home-manager/default.nix` and `modules/nixos/default.nix` (alphabetical order)
|
||||
- **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)
|
||||
```
|
||||
azos/
|
||||
├── flake.nix # Main flake
|
||||
├── home-manager/home.nix # Home-manager entry point; manually imports all modules
|
||||
├── _machines/ # Per-machine NixOS configs (pass suiteModules as specialArgs)
|
||||
├── nixos/ # NixOS system configs (configuration.nix, configuration-vm.nix, etc.)
|
||||
├── features/ # Machine-specific home-manager features (auto-discovered)
|
||||
├── overlays/ # Package overlays
|
||||
├── shells/ # Dev shells
|
||||
└── azos-core/ # Shared feature library (git submodule)
|
||||
├── flake.nix
|
||||
├── features/ # Shared/reusable features (auto-discovered)
|
||||
├── overlays/ # Core overlays
|
||||
└── _lib/ # Module schema helpers
|
||||
```
|
||||
|
||||
Features are auto-discovered by `import-tree` — no central imports file. Each feature's
|
||||
`default.nix` registers itself via `config.flake.modules.homeManager.<name>`. Modules are
|
||||
then explicitly imported in `home-manager/home.nix` via `suiteModules.homeManager.<name>`.
|
||||
|
||||
**Where to put a new feature:**
|
||||
- Shared / reusable across machines → `azos-core/features/<name>/default.nix`
|
||||
- Machine-specific → `azos/features/<name>/default.nix`
|
||||
|
||||
## Code Style Guidelines
|
||||
|
||||
### Nix Module Template
|
||||
|
||||
All features follow this flake-parts registration pattern:
|
||||
|
||||
```nix
|
||||
{
|
||||
{...}: {
|
||||
config.flake.modules.homeManager.<name> = {
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
isEnabled =
|
||||
config.azos.<module-name>.enable;
|
||||
in {
|
||||
options.azos.<module-name>.enable = lib.mkOption {
|
||||
default = true;
|
||||
}: {
|
||||
options.azos.<name>.enable = lib.mkOption {
|
||||
default = false;
|
||||
example = true;
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
config = lib.mkIf isEnabled {
|
||||
home.packages = with pkgs; [ pkg1 pkg2 ];
|
||||
config = lib.mkIf config.azos.<name>.enable {
|
||||
home.packages = with pkgs; [pkg1 pkg2];
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### 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: `azos.<module-name>.<option>`
|
||||
- Module names: kebab-case (`git-config`, `claude-memory`)
|
||||
- Feature directories: kebab-case, one `default.nix` per feature
|
||||
- Variables: kebab-case
|
||||
|
||||
### Formatting
|
||||
- Indentation: 2 spaces
|
||||
- Let bindings: multi-line with `isEnabled` on its own line
|
||||
- Packages: Use `with pkgs; [ ... ]` syntax
|
||||
- Packages: `with pkgs; [pkg1 pkg2]` (no trailing semicolon inside list)
|
||||
|
||||
### Imports
|
||||
- Always include `{...}` for module args
|
||||
- Standard args: `lib, config, pkgs, ...`
|
||||
- NixOS config args: `inputs, outputs, lib, config, pkgs, ...`
|
||||
- Use `./relative/path.nix` for local imports
|
||||
- Always include `{...}` for the outer module args
|
||||
- Inner module args: `lib, config, pkgs, ...`
|
||||
|
||||
### Option Patterns
|
||||
- Boolean enable: `lib.mkOption { default = true; example = true; type = lib.types.bool; }`
|
||||
- Conditional config: `lib.mkIf isEnabled { ... }`
|
||||
- User-overridable: `lib.mkDefault`
|
||||
- Boolean enable: `lib.mkOption { default = false; example = true; type = lib.types.bool; }`
|
||||
- Conditional config: `lib.mkIf config.azos.<name>.enable { ... }`
|
||||
- Auto-enable a dependency: `azos.<dep>.enable = lib.mkDefault true;`
|
||||
- Force value: `lib.mkForce` (sparingly)
|
||||
|
||||
### Extensible Options
|
||||
For options that multiple modules should be able to contribute to, use attrset options:
|
||||
|
||||
```nix
|
||||
options.azos.<name>.things = lib.mkOption {
|
||||
default = {};
|
||||
type = lib.types.attrsOf lib.types.path; # or lines, str, etc.
|
||||
};
|
||||
```
|
||||
|
||||
Any module can then add entries without modifying the owning feature. Examples in use:
|
||||
- `azos.claude.globalSkills` — attrset of skill name → markdown file path
|
||||
- `azos.claude.globalMdSections` — attrset of key → markdown string (merged into `~/.claude/CLAUDE.md`)
|
||||
|
||||
### Home-Manager vs NixOS
|
||||
- Home-manager: `home.packages`, `home.file`, `programs.<program>`
|
||||
- NixOS: `config.services`, `environment.systemPackages`
|
||||
|
||||
### Deploying Files
|
||||
- Static file: `home.file."dest".source = ./file;`
|
||||
- Generated text: `home.file."dest".text = "...";`
|
||||
- Runtime script (e.g. merging JSON at activation): `home.activation.<name> = lib.hm.dag.entryAfter ["writeBoundary"] ''...'';`
|
||||
|
||||
### 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;`
|
||||
Top-level suites group related features (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
|
||||
|
||||
The machine suite (`azos.suites.lauretta`) enables the relevant suites for this machine.
|
||||
|
||||
### Specializations
|
||||
NixOS supports specializations for alternative configurations:
|
||||
@@ -158,33 +193,62 @@ specialisation = {
|
||||
|
||||
## Adding New Modules
|
||||
|
||||
1. Create file in `modules/home-manager/` or `modules/nixos/`
|
||||
2. Add import to `modules/<type>/default.nix` (alphabetical)
|
||||
3. Use module template above
|
||||
1. Create `features/<name>/default.nix` (machine-specific) or `azos-core/features/<name>/default.nix` (shared)
|
||||
2. Use the module template above
|
||||
3. Add `suiteModules.homeManager.<name>` to the imports list in `home-manager/home.nix`
|
||||
4. Run `nix fmt`
|
||||
|
||||
> **Submodule gotcha**: New files in `azos-core/` must be `git add`-ed inside the submodule
|
||||
> before `nix build` will see them — Nix flakes only evaluate git-tracked files.
|
||||
> ```bash
|
||||
> cd azos-core && git add features/<name>/
|
||||
> ```
|
||||
|
||||
## Claude Integration
|
||||
|
||||
Claude Code is integrated with this environment via several azos-core features:
|
||||
|
||||
| Feature | Option | What it does |
|
||||
|---------|--------|--------------|
|
||||
| `azos-core/features/claude-memory` | `azos.claude-memory.enable` | Registers org-roam-mcp as a global MCP server in `~/.claude.json` |
|
||||
| `azos-core/features/claude-skills` | `azos.claude-skills.enable` | Deploys skills to `~/.claude/commands/` and content to `~/.claude/CLAUDE.md` |
|
||||
| `azos/features/claude` | `azos.claude.enable` | Installs claude-code, auto-enables the above two |
|
||||
|
||||
### Adding Claude skills or standing instructions
|
||||
From any module — no need to touch azos-core:
|
||||
```nix
|
||||
azos.claude.globalSkills.my-skill = ./skills/my-skill.md;
|
||||
azos.claude.globalMdSections.my-rule = ''
|
||||
# My Rule
|
||||
Always do X when Y.
|
||||
'';
|
||||
```
|
||||
See `azos-core/features/claude-skills/README.md` for full documentation.
|
||||
|
||||
## Key Files
|
||||
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `flake.nix` | Main flake, defines systems, overlays |
|
||||
| `modules/home-manager/default.nix` | Home-manager imports |
|
||||
| `modules/nixos/default.nix` | NixOS imports |
|
||||
| `home-manager/home.nix` | User home-manager config, enables suites |
|
||||
| `nixos/configuration.nix` | Lauretta laptop config |
|
||||
| `flake.nix` | Main flake, defines systems and overlays |
|
||||
| `home-manager/home.nix` | Home-manager entry point, imports all modules |
|
||||
| `_machines/lauretta.nix` | Lauretta machine config, passes `suiteModules` as specialArgs |
|
||||
| `nixos/configuration.nix` | Lauretta NixOS system config |
|
||||
| `nixos/configuration-vm.nix` | Test VM config |
|
||||
| `overlays/` | Custom package overlays |
|
||||
| `pkgs/` | Custom packages |
|
||||
| `azos-core/` | Shared modules (submodule) |
|
||||
| `overlays/` | Package overlays |
|
||||
| `azos-core/` | Shared feature library (git submodule) |
|
||||
| `azos-core/features/` | Shared features (auto-discovered by import-tree) |
|
||||
| `features/` | Machine-specific features (auto-discovered by import-tree) |
|
||||
| `azos-core/features/editor/emacs/config.org` | Literate Emacs config |
|
||||
| `azos-core/features/claude-skills/README.md` | Claude skills extensibility docs |
|
||||
|
||||
## Common Tasks
|
||||
|
||||
**Add system package**: Edit NixOS module, add to `environment.systemPackages = with pkgs; [ pkg ]`
|
||||
**Add system package**: Edit a NixOS feature, add to `environment.systemPackages = with pkgs; [ pkg ]`
|
||||
|
||||
**Add home-manager package**: Edit module, add to `home.packages = with pkgs; [ pkg ]`
|
||||
**Add home-manager package**: Edit a feature's config block, add to `home.packages = with pkgs; [ pkg ]`
|
||||
|
||||
**Add system service**: Edit NixOS module, add under `services.<service>`
|
||||
**Add system service**: Edit a NixOS feature, add under `services.<service>`
|
||||
|
||||
**Add custom package**: Create file in `pkgs/`, add to `pkgs/default.nix`, use via overlay
|
||||
**Add custom package**: Add to `azos-core/overlays/` via `config.flake.overlayPkgs.<name>`, then use as `pkgs.<name>`
|
||||
|
||||
**Access unstable packages**: Use `pkgs.unstable.<package>` (via unstable-packages overlay)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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];
|
||||
};
|
||||
}
|
||||
@@ -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];
|
||||
};
|
||||
}
|
||||
+1
-1
Submodule azos-core updated: 72c8e88c11...1e46de4e6f
@@ -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
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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"];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
{...}: {
|
||||
config.flake.overlayPkgs.emacs-lichess = pkgs: let
|
||||
epkgs = pkgs.emacs.pkgs;
|
||||
in
|
||||
epkgs.trivialBuild {
|
||||
pname = "lichess";
|
||||
version = "0.8";
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "tmythicator";
|
||||
repo = "lichess.el";
|
||||
rev = "1dd8a25ede7144c5d6be1f45f4ae3d07903783cd";
|
||||
sha256 = "157l4crbz37x367m69sxwvnd1pd8cqa6w0lcvyyvs27cm021d2gr";
|
||||
};
|
||||
};
|
||||
|
||||
config.flake.modules.homeManager.chess = {
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
options.azos.chess.enable = lib.mkOption {
|
||||
default = false;
|
||||
example = true;
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
config = lib.mkIf config.azos.chess.enable {
|
||||
azos.emacs.pkgs = [pkgs.emacs-lichess];
|
||||
azos.emacs.enabledSuites = ["lichess"];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{...}: {
|
||||
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];
|
||||
azos.claude-memory.enable = lib.mkDefault true;
|
||||
azos.claude-skills.enable = lib.mkDefault true;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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")
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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
|
||||
];
|
||||
@@ -0,0 +1,3 @@
|
||||
{...}: {
|
||||
config.flake.overlayPkgs.azos-emacs-hyprland = pkgs: pkgs.localEmacsPkg ./_pkg.nix;
|
||||
}
|
||||
@@ -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];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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
|
||||
@@ -0,0 +1,340 @@
|
||||
#+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
|
||||
|
||||
** Weather
|
||||
|
||||
#+begin_src emacs-lisp
|
||||
(setq wttrin-default-cities '("Meitar, Israel"))
|
||||
#+end_src
|
||||
|
||||
** 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-preferred-agent-config 'claude-code)
|
||||
#+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
|
||||
|
||||
** Roam Backup
|
||||
|
||||
#+begin_src emacs-lisp
|
||||
(defun azos/roam/backup ()
|
||||
"Commit and push ~/roam to the remote git repo."
|
||||
(interactive)
|
||||
(async-shell-command "roam-backup" "*roam-backup*"))
|
||||
|
||||
(define-key azos/roam-keymap (kbd "B") #'azos/roam/backup)
|
||||
#+end_src
|
||||
|
||||
* Provide
|
||||
|
||||
#+begin_src emacs-lisp
|
||||
(provide 'azos-emacs-lauretta)
|
||||
#+end_src
|
||||
@@ -0,0 +1,3 @@
|
||||
{...}: {
|
||||
config.flake.overlayPkgs.azos-emacs-lauretta = pkgs: pkgs.localEmacsPkg ./_pkg.nix;
|
||||
}
|
||||
@@ -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";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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
|
||||
@@ -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;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{...}: {
|
||||
config.flake.modules.homeManager.roam-backup = {
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
options.azos.roam-backup.enable = lib.mkOption {
|
||||
default = false;
|
||||
example = true;
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
config = lib.mkIf config.azos.roam-backup.enable {
|
||||
home.packages = [
|
||||
(pkgs.writeShellScriptBin "roam-backup" ''
|
||||
set -e
|
||||
cd "$HOME/roam"
|
||||
git add -A
|
||||
if git diff --cached --quiet; then
|
||||
echo "Nothing to commit."
|
||||
else
|
||||
git commit -m "backup: $(date '+%Y-%m-%d %H:%M')"
|
||||
fi
|
||||
git push --set-upstream origin HEAD
|
||||
'')
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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}
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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
+135
-34
@@ -4,7 +4,8 @@
|
||||
"inputs": {
|
||||
"cabata": "cabata",
|
||||
"evil-hl-line": "evil-hl-line",
|
||||
"nixpkgs": "nixpkgs_3"
|
||||
"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": {
|
||||
@@ -55,6 +56,42 @@
|
||||
"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": {
|
||||
"inputs": {
|
||||
"systems": [
|
||||
@@ -102,11 +139,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1778954430,
|
||||
"narHash": "sha256-oaNyOr05lblaQdtbkbN1wO0b2KLIL2O1LkmwDgdQp4I=",
|
||||
"lastModified": 1781642113,
|
||||
"narHash": "sha256-mAR7KTS9rjreTcXCNqfCbN96mnhJO8lDQq1vl7GviBQ=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "26aaab785b0bab4af60a2c42b22760fa906ef22a",
|
||||
"rev": "df4e0465717a2d34f05b8ccd967275aaf3ceaa01",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -116,9 +153,39 @@
|
||||
"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": 1777848538,
|
||||
@@ -135,12 +202,15 @@
|
||||
}
|
||||
},
|
||||
"nixos-hardware": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs_4"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1778945272,
|
||||
"narHash": "sha256-Aipz0UiBhE2a1FYJrNc2y+5vKWo5QVkhmaIJk3/ls+g=",
|
||||
"lastModified": 1781622756,
|
||||
"narHash": "sha256-JrPh4M6S7aPsEE9tOENuZrxC6o2szSLlK+t4+nLke9s=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixos-hardware",
|
||||
"rev": "379c1f274f0fa354d012f0600806de54e79f29b5",
|
||||
"rev": "08018c72174a4df5657f8d94178ac69fb9c243e5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -164,13 +234,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": 1778869304,
|
||||
"narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=",
|
||||
"lastModified": 1781577229,
|
||||
"narHash": "sha256-lrp67w8AulE9Ks53n27I45ADSzbOCn4H+CNW1Ck8B+8=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "d233902339c02a9c334e7e593de68855ad26c4cb",
|
||||
"rev": "567a49d1913ce81ac6e9582e3553dd90a955875f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -182,11 +282,11 @@
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1778443072,
|
||||
"narHash": "sha256-zi7/fsqM/kFdNuED//4WOCUtezGtKKqRNORjMvfwjnA=",
|
||||
"lastModified": 1779508470,
|
||||
"narHash": "sha256-Ap9KJX+5xHIn3bPIpfNgT6MEXdAECECwo4/rmlQD74M=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "da5ad661ba4e5ef59ba743f0d112cbc30e474f32",
|
||||
"rev": "29916453413845e54a65b8a1cf996842300cd299",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -197,20 +297,6 @@
|
||||
}
|
||||
},
|
||||
"nixpkgs_3": {
|
||||
"locked": {
|
||||
"lastModified": 1774273680,
|
||||
"narHash": "sha256-a++tZ1RQsDb1I0NHrFwdGuRlR5TORvCEUksM459wKUA=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "fdc7b8f7b30fdbedec91b71ed82f36e1637483ed",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"id": "nixpkgs",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"nixpkgs_4": {
|
||||
"locked": {
|
||||
"lastModified": 1777268161,
|
||||
"narHash": "sha256-bxrdOn8SCOv8tN4JbTF/TXq7kjo9ag4M+C8yzzIRYbE=",
|
||||
@@ -226,13 +312,26 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_4": {
|
||||
"locked": {
|
||||
"lastModified": 1767892417,
|
||||
"narHash": "sha256-8bW3q88CEg2u4hSP66Vf4lpbLonHz7hqDNBMcCY7E9U=",
|
||||
"rev": "3497aa5c9457a9d88d71fa93a4a8368816fbeeba",
|
||||
"type": "tarball",
|
||||
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.05pre924538.3497aa5c9457/nixexprs.tar.xz"
|
||||
},
|
||||
"original": {
|
||||
"type": "tarball",
|
||||
"url": "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz"
|
||||
}
|
||||
},
|
||||
"nixpkgs_5": {
|
||||
"locked": {
|
||||
"lastModified": 1778869304,
|
||||
"narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=",
|
||||
"lastModified": 1781607440,
|
||||
"narHash": "sha256-rxO+uc/KFbSJp+pgyXRuAX6QlG9hJdnt0BXpEQRXY+U=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "d233902339c02a9c334e7e593de68855ad26c4cb",
|
||||
"rev": "3e41b24abd260e8f71dbe2f5737d24122f972158",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -245,7 +344,9 @@
|
||||
"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",
|
||||
|
||||
@@ -2,14 +2,9 @@
|
||||
description = "Aner's NIX config for his systems!";
|
||||
|
||||
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";
|
||||
self.submodules = true;
|
||||
|
||||
# Unused unstable
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
|
||||
home-manager = {
|
||||
@@ -19,58 +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;
|
||||
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
|
||||
];
|
||||
|
||||
systems = [
|
||||
"aarch64-linux"
|
||||
"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;};
|
||||
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 configured
|
||||
nixosConfigurations = {
|
||||
#Lauretta - laptop
|
||||
lauretta = nixpkgs.lib.nixosSystem {
|
||||
specialArgs = {inherit inputs outputs;};
|
||||
modules = [
|
||||
./nixos/configuration.nix
|
||||
];
|
||||
perSystem = {
|
||||
system,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
formatter = pkgs.alejandra;
|
||||
devShells = (import ./shells) {inherit pkgs;};
|
||||
};
|
||||
|
||||
#Test VM
|
||||
vm = nixpkgs.lib.nixosSystem {
|
||||
specialArgs = {inherit inputs outputs;};
|
||||
modules = [
|
||||
./nixos/configuration-vm.nix
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
#TODO the devshells do not know of the new packages.
|
||||
devShells = forAllSystems (system: ((import ./shells) {pkgs = nixpkgs.legacyPackages.${system};}));
|
||||
};
|
||||
}
|
||||
|
||||
+29
-11
@@ -1,36 +1,54 @@
|
||||
# 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.claude-memory
|
||||
suiteModules.homeManager.claude-skills
|
||||
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.roam-backup
|
||||
suiteModules.homeManager.ytdl
|
||||
suiteModules.homeManager.chess
|
||||
];
|
||||
|
||||
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.chess.enable = true;
|
||||
azos.name = "Aner Zakobar";
|
||||
azos.roam-backup.enable = true;
|
||||
|
||||
home = {
|
||||
username = "aner";
|
||||
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";
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
};
|
||||
}
|
||||
@@ -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];
|
||||
};
|
||||
}
|
||||
@@ -1,23 +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
|
||||
./nextcloud-client.nix
|
||||
];
|
||||
}
|
||||
@@ -1,42 +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;
|
||||
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;
|
||||
};
|
||||
}
|
||||
@@ -1,38 +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 = {
|
||||
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;
|
||||
};
|
||||
}
|
||||
@@ -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")
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -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
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -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";
|
||||
# };
|
||||
# };
|
||||
};
|
||||
}
|
||||
@@ -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
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -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];
|
||||
};
|
||||
}
|
||||
@@ -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";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
isEnabled =
|
||||
config.azos.nextcloud-client.enable;
|
||||
in {
|
||||
options.azos.nextcloud-client.enable = lib.mkOption {
|
||||
default = true;
|
||||
example = true;
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
config = lib.mkIf isEnabled {
|
||||
home.packages = with pkgs; [
|
||||
nextcloud-client
|
||||
];
|
||||
services.nextcloud-client = {
|
||||
enable = true;
|
||||
startInBackground = false;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
@@ -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
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -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}
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
@@ -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"];
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
imports = [./audio.nix ./binfmt.nix ./bluetooth.nix ./steam.nix ./virtualization.nix];
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
@@ -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 (KVM‑accelerated)
|
||||
qemu_kvm # same as pkgs.qemu (but with KVM support explicitly enabled)
|
||||
# CLI utilities
|
||||
libvirt # provides virsh, virt-install, virt-manager (cli bits)
|
||||
# GUI front‑end
|
||||
virt-manager # graphical manager (uses libvirt + spice)
|
||||
virt-viewer # Spice/VNC client that virt‑manager calls under the hood
|
||||
];
|
||||
|
||||
services.spice-vdagentd.enable = true; # makes copy‑paste & auto‑resize work in Spice windows
|
||||
networking.firewall.allowedTCPPorts = [5900 5901]; # Spice ports (adjust if you expose elsewhere)
|
||||
networking.firewall.allowedUDPPorts = [5900 5901];
|
||||
};
|
||||
}
|
||||
@@ -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";
|
||||
}
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
+43
-28
@@ -1,6 +1,7 @@
|
||||
{
|
||||
inputs,
|
||||
outputs,
|
||||
suiteModules,
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
@@ -11,20 +12,28 @@
|
||||
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";
|
||||
configurationLimit = 5;
|
||||
};
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
boot.binfmt.emulatedSystems = ["aarch64-linux"];
|
||||
|
||||
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
|
||||
];
|
||||
@@ -34,20 +43,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";
|
||||
@@ -60,7 +63,6 @@
|
||||
LC_TIME = "he_IL.UTF-8";
|
||||
};
|
||||
|
||||
# Configure keymap in X11
|
||||
services.xserver = {
|
||||
xkb = {
|
||||
layout = "us,il";
|
||||
@@ -69,15 +71,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; [];
|
||||
};
|
||||
|
||||
@@ -87,29 +86,44 @@
|
||||
};
|
||||
|
||||
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 home‑manager 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"];
|
||||
|
||||
@@ -120,6 +134,7 @@
|
||||
killall
|
||||
brightnessctl
|
||||
exfatprogs
|
||||
gamescope
|
||||
];
|
||||
|
||||
fonts.enableDefaultPackages = true;
|
||||
@@ -131,5 +146,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
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -1,164 +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
|
||||
|
||||
** 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
|
||||
|
||||
* Provide
|
||||
|
||||
#+begin_src emacs-lisp
|
||||
(provide 'azos-emacs-lauretta)
|
||||
#+end_src
|
||||
@@ -11,5 +11,11 @@ pkgs.mkShell {
|
||||
(pkgs.writeShellScriptBin
|
||||
"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")
|
||||
];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user