Compare commits
43 Commits
07fb5656f2
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 78afc9e5bf | |||
| ebdee10fba | |||
| 890f39079b | |||
| e0a5891cd8 | |||
| 7f27339312 | |||
| bd64633454 | |||
| 7c187d1c3d | |||
| 1adc0439ea | |||
| 2254fd419d | |||
| cf976ae14a | |||
| c928f5f748 | |||
| 8d0f541fbe | |||
| c0f72be869 | |||
| e271872cae | |||
| 27fafdc111 | |||
| fcb7e0b884 | |||
| d4dee59413 | |||
| cf57b3eb4a | |||
| e5bf9c0a41 | |||
| 00f62d61eb | |||
| c4066da976 | |||
| 6751554982 | |||
| 83c279ded4 | |||
| f89e04d898 | |||
| a89f5ca015 | |||
| 9780d69f25 | |||
| 4cd4114f7c | |||
| ea550d2e8c | |||
| 29a351845b | |||
| 2d72c3e7df | |||
| 315e73c63c | |||
| 8a8e63b095 | |||
| b68932f516 | |||
| 91c775a6c3 | |||
| a6c4cc7922 | |||
| dc47722b8b | |||
| 6215127089 | |||
| dccdcd4f18 | |||
| e7ab8c10d8 | |||
| e6188adc0d | |||
| c567ca5c3f | |||
| 447cd2954d | |||
| 9e59e32d0e |
@@ -2,4 +2,5 @@ result
|
||||
.#*
|
||||
*.qcow2
|
||||
.direnv
|
||||
.agent-shell
|
||||
|
||||
|
||||
@@ -4,197 +4,251 @@ This is a NixOS/Nix flake-based configuration repository using home-manager for
|
||||
|
||||
## Build Commands
|
||||
|
||||
### Evaluating Configuration
|
||||
### Evaluating
|
||||
```bash
|
||||
# Evaluate system config (Lauretta laptop)
|
||||
nix eval .#nixosConfigurations.lauretta.config.system.build.toplevel
|
||||
|
||||
# Evaluate flake info
|
||||
nix flake show
|
||||
|
||||
# Evaluate all outputs
|
||||
nix eval . --apply 'x: x'
|
||||
```
|
||||
|
||||
### Building
|
||||
```bash
|
||||
# Build VM
|
||||
nix build .#nixosConfigurations.vm.config.system.build.vm
|
||||
# Or with submodules
|
||||
# VM (with submodules for azos-core)
|
||||
nix build '.?submodules=1#nixosConfigurations.vm.config.system.build.vm'
|
||||
|
||||
# Build formatter (alejandra)
|
||||
# Formatter
|
||||
nix build .#formatter.x86_64-linux
|
||||
```
|
||||
|
||||
### Deploying
|
||||
```bash
|
||||
# Switch to new config (Lauretta)
|
||||
sudo nixos-rebuild switch --flake '.?submodules=1#lauretta'
|
||||
|
||||
# Update flake inputs
|
||||
nix flake update
|
||||
|
||||
# Update specific input
|
||||
nix flake lock --update-input azos-core
|
||||
# Rebuild the azos environment for lauretta (this machine) — use this when asked to "rebuild"
|
||||
azos-lauretta-update
|
||||
nix flake update --flake '.?submodules=1' # Update all inputs
|
||||
nix flake lock --flake '.?submodules=1' --update-input X # Update specific input
|
||||
```
|
||||
|
||||
### Nix REPL
|
||||
> **Note**: When the user asks to "rebuild", they mean rebuilding the lauretta environment with the command above — NOT building the VM.
|
||||
|
||||
### Dev Shell & REPL
|
||||
```bash
|
||||
nix develop .#shells.x86_64-linux.default
|
||||
nix repl
|
||||
:lf .
|
||||
# Then explore with:
|
||||
inputs.nixpkgs.lib
|
||||
```
|
||||
|
||||
### Dev Shell
|
||||
### Ad-hoc Commands
|
||||
If an executable doesn't exist on the system, run it ad-hoc with:
|
||||
```bash
|
||||
nix develop .#shells.x86_64-linux.debugTexShell
|
||||
```
|
||||
|
||||
### Garbage Collection
|
||||
```bash
|
||||
sudo nix-collect-garbage --delete-old
|
||||
nix shell nixpkgs#<package> --command <cmd> <args>
|
||||
```
|
||||
|
||||
## Linting/Formatting
|
||||
|
||||
This project uses [alejandra](https://github.comkamadorama/alejandra) as the formatter.
|
||||
|
||||
Uses [alejandra](https://github.com/kamadorama/alejandra):
|
||||
```bash
|
||||
# Format all Nix files
|
||||
nix fmt
|
||||
|
||||
# Or use alejandra directly
|
||||
nix fmt # Format all Nix files
|
||||
alejandra .
|
||||
```
|
||||
|
||||
There are no automated tests in this repository. VM testing is manual:
|
||||
## Testing
|
||||
|
||||
Manual VM testing:
|
||||
```bash
|
||||
# Build and run VM
|
||||
nix build .#nixosConfigurations.vm.config.system.build.vm
|
||||
nix build '.?submodules=1#nixosConfigurations.vm.config.system.build.vm'
|
||||
./result/bin/run-nixos-vm
|
||||
```
|
||||
|
||||
## Emacs Debugging
|
||||
|
||||
When adding or debugging Emacs functionality, you can interact with the running Emacs session via `emacsclient` (with user permission):
|
||||
|
||||
```bash
|
||||
# Create and switch to a buffer
|
||||
emacsclient -c -e '(switch-to-buffer (get-buffer-create "test"))'
|
||||
|
||||
# Evaluate arbitrary Elisp
|
||||
emacsclient -e '(message "hello")'
|
||||
```
|
||||
|
||||
## Repository Structure
|
||||
|
||||
```
|
||||
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
|
||||
|
||||
### File Organization
|
||||
### Nix Module Template
|
||||
|
||||
- **Home-manager modules**: `modules/home-manager/<name>.nix`
|
||||
- **NixOS modules**: `modules/nixos/<name>.nix`
|
||||
- **Imports**: All modules are imported in `modules/home-manager/default.nix` and `modules/nixos/default.nix`
|
||||
- **Import sorting**: Alphabetical order in default.nix files
|
||||
|
||||
### Nix Module Structure
|
||||
|
||||
Follow this template for home-manager modules:
|
||||
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; [
|
||||
<package1>
|
||||
<package2>
|
||||
];
|
||||
config = lib.mkIf config.azos.<name>.enable {
|
||||
home.packages = with pkgs; [pkg1 pkg2];
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### Naming Conventions
|
||||
- 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
|
||||
|
||||
- **Option paths**: `config.azos.<module-name>.<option>`
|
||||
- **Enable option**: Always `enable` (bool), default `true`
|
||||
- **Module names**: kebab-case (e.g., `libreoffice.nix`, `git-config.nix`)
|
||||
- **Variable names**: kebab-case in let bindings (e.g., `isEnabled`)
|
||||
|
||||
### Formatting Rules
|
||||
|
||||
- **Indentation**: 2 spaces
|
||||
- **Let bindings**: Multi-line format with `isEnabled` on its own line
|
||||
```nix
|
||||
let
|
||||
isEnabled =
|
||||
config.azos.module.enable;
|
||||
in
|
||||
```
|
||||
- **Imports**: Sorted alphabetically in default.nix
|
||||
- **Packages**: Use `with pkgs;` block for package lists
|
||||
### Formatting
|
||||
- Indentation: 2 spaces
|
||||
- Packages: `with pkgs; [pkg1 pkg2]` (no trailing semicolon inside list)
|
||||
|
||||
### Imports
|
||||
|
||||
- Always include `{...}` for module args even if unused
|
||||
- Standard module args: `lib, config, pkgs, ...`
|
||||
- Use `./relative/path.nix` for local imports
|
||||
|
||||
### Adding New Modules
|
||||
|
||||
1. Create file in appropriate directory (`modules/home-manager/` or `modules/nixos/`)
|
||||
2. Add import to `modules/<type>/default.nix` in alphabetical order
|
||||
3. Use the standard module template above
|
||||
4. Run `nix fmt` to format
|
||||
- Always include `{...}` for the outer module args
|
||||
- Inner module args: `lib, config, pkgs, ...`
|
||||
|
||||
### Option Patterns
|
||||
- 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)
|
||||
|
||||
- **Boolean enable**: Always use `lib.mkOption` with `default = true`, `type = lib.types.bool`
|
||||
- **Conditional config**: Always use `lib.mkIf isEnabled` wrapper
|
||||
- **Package lists**: Use `with pkgs; [ ... ]` syntax
|
||||
### Extensible Options
|
||||
For options that multiple modules should be able to contribute to, use attrset options:
|
||||
|
||||
### Error Handling
|
||||
```nix
|
||||
options.azos.<name>.things = lib.mkOption {
|
||||
default = {};
|
||||
type = lib.types.attrsOf lib.types.path; # or lines, str, etc.
|
||||
};
|
||||
```
|
||||
|
||||
- Use `lib.mkIf` for conditional configuration rather than if-then-else
|
||||
- Use `lib.mkDefault` for values that can be overridden by users
|
||||
- Use `lib.mkForce` sparingly for values that must not be overridden
|
||||
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 Specific
|
||||
### Home-Manager vs NixOS
|
||||
- Home-manager: `home.packages`, `home.file`, `programs.<program>`
|
||||
- NixOS: `config.services`, `environment.systemPackages`
|
||||
|
||||
- Config goes under `home` attribute (e.g., `home.packages`, `home.file`, `home.sessionVariables`)
|
||||
- Use `programs.<program>` for program configurations
|
||||
- Use `services.<service>` for system services
|
||||
### 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"] ''...'';`
|
||||
|
||||
### NixOS Specific
|
||||
### Suites System
|
||||
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
|
||||
|
||||
- Config goes under `config` directly (e.g., `services`, `environment.systemPackages`)
|
||||
- Use `environment.systemPackages` for system-wide packages
|
||||
- Use `users.users.<name>` for user configuration
|
||||
The machine suite (`azos.suites.lauretta`) enables the relevant suites for this machine.
|
||||
|
||||
### Specializations
|
||||
NixOS supports specializations for alternative configurations:
|
||||
```nix
|
||||
specialisation = {
|
||||
hyprland = {
|
||||
configuration = {
|
||||
home-manager.users.aner = {pkgs, ...}: {
|
||||
azos.suites.exwm.enable = lib.mkForce false;
|
||||
azos.suites.hyprland.enable = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
## Adding New Modules
|
||||
|
||||
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
|
||||
|
||||
- `flake.nix`: Main flake definition, defines systems, overlays, modules
|
||||
- `modules/home-manager/default.nix`: Home-manager module imports
|
||||
- `modules/nixos/default.nix`: NixOS module imports
|
||||
- `nixos/configuration.nix`: Lauretta laptop configuration
|
||||
- `nixos/configuration-vm.nix`: Test VM configuration
|
||||
- `overlays/`: Custom package overlays
|
||||
- `pkgs/`: Custom packages
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `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/` | 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 new package to system
|
||||
1. Create or edit module in `modules/nixos/`
|
||||
2. Add to `environment.systemPackages = with pkgs; [ pkg ]`
|
||||
**Add system package**: Edit a NixOS feature, add to `environment.systemPackages = with pkgs; [ pkg ]`
|
||||
|
||||
### Add new home-manager package
|
||||
1. Create or edit module in `modules/home-manager/`
|
||||
2. 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 new system service
|
||||
1. Edit appropriate NixOS module
|
||||
2. Add service config under `services.<service>`
|
||||
**Add system service**: Edit a NixOS feature, add under `services.<service>`
|
||||
|
||||
### Test changes locally
|
||||
1. Build VM: `nix build .#nixosConfigurations.vm.config.system.build.vm`
|
||||
2. Run VM: `./result/bin/run-nixos-vm`
|
||||
**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: 1fad02b20f...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];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -2,10 +2,11 @@
|
||||
orgTrivialBuild,
|
||||
epkgs,
|
||||
pkgs,
|
||||
} : orgTrivialBuild {
|
||||
}:
|
||||
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
|
||||
@@ -14,5 +15,6 @@
|
||||
pkgs.azos-emacs-station
|
||||
|
||||
agent-shell
|
||||
org-caldav
|
||||
];
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -7,6 +7,8 @@ config.load_autoconfig(True)
|
||||
#Also using this https://github.com/miseran/tabs_are_windows/blob/main/config.py
|
||||
|
||||
c.tabs.show = 'never'
|
||||
c.session.default_name = ''
|
||||
c.auto_save.interval = 0
|
||||
c.tabs.tabs_are_windows = True
|
||||
c.window.title_format = 'qute: {private}{host}{perc}{title_sep}{current_title}'
|
||||
|
||||
@@ -26,12 +28,8 @@ c.url.searchengines = {
|
||||
|
||||
#Youtube stuff from DT.
|
||||
#Added media-title to MPV and youtube-dl with exwm process to track progress.
|
||||
config.bind('M', 'hint links spawn mpv --title=\'${media-title}\' {hint-url}')
|
||||
config.bind('Z',
|
||||
'hint links spawn emacsclient -e "(start-process '\
|
||||
'\\"youtube-dl {hint-url}\\" \\"youtube-dl {hint-url}\\" '\
|
||||
'\\"youtube-dl\\" \\"-o\\" \\"~/downloads/%(title)s.%(ext)s\\" '\
|
||||
'\\"{hint-url}\\" \\"--newline\\")"')
|
||||
config.bind('M', 'hint links spawn mpv --title="${media-title}" {hint-url}')
|
||||
config.bind('Z', 'hint links spawn emacsclient -e "(start-process \\"youtube-dl {hint-url}\\" \\"youtube-dl {hint-url}\\" \\"youtube-dl\\" \\"-o\\" \\"~/downloads/%(title)s.%(ext)s\\" \\"{hint-url}\\" \\"--newline\\")"')
|
||||
|
||||
config.bind('xb', 'config-cycle statusbar.show always in-mode')
|
||||
c.statusbar.show = 'in-mode'
|
||||
@@ -44,7 +42,7 @@ c.downloads.location.prompt = False
|
||||
|
||||
c.editor.command = ['emacsclient', '-e', '(find-file "{}")']
|
||||
|
||||
monospace = "10pt 'LiberationMono'"
|
||||
monospace = "10pt 'DejaVu Sans Mono'"
|
||||
c.fonts.completion.category = f"bold {monospace}"
|
||||
c.fonts.completion.entry = monospace
|
||||
c.fonts.debug_console = monospace
|
||||
@@ -56,3 +54,7 @@ c.fonts.messages.warning = monospace
|
||||
c.fonts.prompts = monospace
|
||||
c.fonts.statusbar = monospace
|
||||
c.fonts.hints = "bold 13px 'LiberationMono'"
|
||||
|
||||
#Set highdpi
|
||||
c.qt.highdpi = True
|
||||
c.zoom.default = 70
|
||||
@@ -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
+199
-29
@@ -3,7 +3,9 @@
|
||||
"azos-core": {
|
||||
"inputs": {
|
||||
"cabata": "cabata",
|
||||
"nixpkgs": "nixpkgs_2"
|
||||
"evil-hl-line": "evil-hl-line",
|
||||
"flake-parts": "flake-parts",
|
||||
"import-tree": "import-tree"
|
||||
},
|
||||
"locked": {
|
||||
"path": "./azos-core",
|
||||
@@ -22,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": {
|
||||
@@ -35,6 +37,61 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"evil-hl-line": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils_2",
|
||||
"nixpkgs": "nixpkgs_2"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1778617640,
|
||||
"narHash": "sha256-bG1hjyLIOiRB+M1rXm8ch0ftHPvV43lRtzQ8qWcus5s=",
|
||||
"owner": "anerisgreat",
|
||||
"repo": "evil-hl-line",
|
||||
"rev": "7cf5a11bdca2abd9516f0ce572e1e03bb541507f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "anerisgreat",
|
||||
"repo": "evil-hl-line",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-parts": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1778716662,
|
||||
"narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-parts_2": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": "nixpkgs-lib_2"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1778716662,
|
||||
"narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": [
|
||||
@@ -57,6 +114,24 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils_2": {
|
||||
"inputs": {
|
||||
"systems": "systems_2"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1731533236,
|
||||
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"home-manager": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
@@ -64,30 +139,60 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772020340,
|
||||
"narHash": "sha256-aqBl3GNpCadMoJ/hVkWTijM1Aeilc278MjM+LA3jK6g=",
|
||||
"lastModified": 1781642113,
|
||||
"narHash": "sha256-mAR7KTS9rjreTcXCNqfCbN96mnhJO8lDQq1vl7GviBQ=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "36e38ca0d9afe4c55405fdf22179a5212243eecc",
|
||||
"rev": "df4e0465717a2d34f05b8ccd967275aaf3ceaa01",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"ref": "release-25.11",
|
||||
"ref": "master",
|
||||
"repo": "home-manager",
|
||||
"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_3"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1767232402,
|
||||
"narHash": "sha256-li+h6crnhc5Zqs+M6pn7D7M0W9M63ECNennDjRgzioE=",
|
||||
"lastModified": 1777848538,
|
||||
"narHash": "sha256-Dj51C0NWsglqRrCpdmMr2nFiYacFOid1Tor4H9yG2HY=",
|
||||
"owner": "musnix",
|
||||
"repo": "musnix",
|
||||
"rev": "d65f98e0b1f792365f1705653d7b2d266ceeff6e",
|
||||
"rev": "8548782f0d1d0928daa3fffde8a008f72219a3f3",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -97,12 +202,15 @@
|
||||
}
|
||||
},
|
||||
"nixos-hardware": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs_4"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1771969195,
|
||||
"narHash": "sha256-qwcDBtrRvJbrrnv1lf/pREQi8t2hWZxVAyeMo7/E9sw=",
|
||||
"lastModified": 1781622756,
|
||||
"narHash": "sha256-JrPh4M6S7aPsEE9tOENuZrxC6o2szSLlK+t4+nLke9s=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixos-hardware",
|
||||
"rev": "41c6b421bdc301b2624486e11905c9af7b8ec68e",
|
||||
"rev": "08018c72174a4df5657f8d94178ac69fb9c243e5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -126,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": 1771848320,
|
||||
"narHash": "sha256-0MAd+0mun3K/Ns8JATeHT1sX28faLII5hVLq0L3BdZU=",
|
||||
"lastModified": 1781577229,
|
||||
"narHash": "sha256-lrp67w8AulE9Ks53n27I45ADSzbOCn4H+CNW1Ck8B+8=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "2fc6539b481e1d2569f25f8799236694180c0993",
|
||||
"rev": "567a49d1913ce81ac6e9582e3553dd90a955875f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -144,25 +282,27 @@
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1771923393,
|
||||
"narHash": "sha256-Fy0+UXELv9hOE8WjYhJt8fMDLYTU2Dqn3cX4BwoGBos=",
|
||||
"lastModified": 1779508470,
|
||||
"narHash": "sha256-Ap9KJX+5xHIn3bPIpfNgT6MEXdAECECwo4/rmlQD74M=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "ea7f1f06811ce7fcc81d6c6fd4213150c23edcf2",
|
||||
"rev": "29916453413845e54a65b8a1cf996842300cd299",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"id": "nixpkgs",
|
||||
"type": "indirect"
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_3": {
|
||||
"locked": {
|
||||
"lastModified": 1766902085,
|
||||
"narHash": "sha256-coBu0ONtFzlwwVBzmjacUQwj3G+lybcZ1oeNSQkgC0M=",
|
||||
"lastModified": 1777268161,
|
||||
"narHash": "sha256-bxrdOn8SCOv8tN4JbTF/TXq7kjo9ag4M+C8yzzIRYbE=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4",
|
||||
"rev": "1c3fe55ad329cbcb28471bb30f05c9827f724c76",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -174,11 +314,24 @@
|
||||
},
|
||||
"nixpkgs_4": {
|
||||
"locked": {
|
||||
"lastModified": 1773476965,
|
||||
"narHash": "sha256-Laaj25PvGeoP5SPhMfMGxvWqM6ZjZ6LdUeEhP6b3czY=",
|
||||
"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": 1781607440,
|
||||
"narHash": "sha256-rxO+uc/KFbSJp+pgyXRuAX6QlG9hJdnt0BXpEQRXY+U=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "f82ce7af0b79ac154b12e27ed800aeb97413723c",
|
||||
"rev": "3e41b24abd260e8f71dbe2f5737d24122f972158",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -191,10 +344,12 @@
|
||||
"root": {
|
||||
"inputs": {
|
||||
"azos-core": "azos-core",
|
||||
"flake-parts": "flake-parts_2",
|
||||
"home-manager": "home-manager",
|
||||
"import-tree": "import-tree_2",
|
||||
"musnix": "musnix",
|
||||
"nixos-hardware": "nixos-hardware",
|
||||
"nixpkgs": "nixpkgs_4",
|
||||
"nixpkgs": "nixpkgs_5",
|
||||
"nixpkgs-unstable": "nixpkgs-unstable"
|
||||
}
|
||||
},
|
||||
@@ -212,6 +367,21 @@
|
||||
"repo": "x86_64-linux",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems_2": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
|
||||
@@ -3,76 +3,53 @@
|
||||
|
||||
inputs = {
|
||||
self.submodules = true;
|
||||
# Nixpkgs
|
||||
#Temporarily
|
||||
# nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
|
||||
#Need unstable for opencode and agent-shell
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
|
||||
# Unused unstable
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
|
||||
home-manager = {
|
||||
# Follow corresponding `release` branch from Home Manager
|
||||
url = "github:nix-community/home-manager/release-25.11";
|
||||
url = "github:nix-community/home-manager/master";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
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 this is probably unsupported
|
||||
#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,21 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
isEnabled =
|
||||
config.azos.chromium.enable;
|
||||
in {
|
||||
options.azos.chromium.enable = lib.mkOption {
|
||||
default = true;
|
||||
example = true;
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
config = lib.mkIf isEnabled {
|
||||
home.packages = with pkgs; [
|
||||
chromium
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
{
|
||||
imports = [
|
||||
./zoom.nix
|
||||
./ytdl.nix
|
||||
./mail.nix
|
||||
./encryption.nix
|
||||
./kubernetes.nix
|
||||
./git.nix
|
||||
./mpris-proxy.nix
|
||||
./qutebrowser-config.nix
|
||||
./audio.nix
|
||||
./reaper.nix
|
||||
./discord.nix
|
||||
./spotify.nix
|
||||
./headphones-whmx4000.nix
|
||||
./deluge.nix
|
||||
./lauretta-emacs.nix
|
||||
./gimp.nix
|
||||
# ./printing.nix
|
||||
./libreoffice.nix
|
||||
./chromium.nix
|
||||
./hyprland-suite.nix
|
||||
# ./gnuradio.nix
|
||||
./opencode.nix
|
||||
];
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
isEnabled =
|
||||
config.azos.deluged.enable;
|
||||
in {
|
||||
options.azos.deluged.enable = lib.mkOption {
|
||||
default = true;
|
||||
example = true;
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
config = lib.mkIf isEnabled {
|
||||
home.packages = with pkgs; [
|
||||
deluged
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
isEnabled =
|
||||
config.azos.discord.enable;
|
||||
in {
|
||||
options.azos.discord.enable = lib.mkOption {
|
||||
default = true;
|
||||
example = true;
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
config = lib.mkIf isEnabled {
|
||||
home.packages = with pkgs; [
|
||||
discord
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
isEnabled =
|
||||
config.azos.encryption.enable;
|
||||
in {
|
||||
options.azos.encryption.enable = lib.mkOption {
|
||||
default = true;
|
||||
example = true;
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
config = lib.mkIf isEnabled {
|
||||
programs.password-store = {
|
||||
enable = true;
|
||||
settings = {
|
||||
PASSWORD_STORE_KEY = "076AA297579A0064";
|
||||
};
|
||||
};
|
||||
|
||||
home.packages = with pkgs; [
|
||||
yubikey-personalization
|
||||
pinentry-gtk2
|
||||
];
|
||||
programs.gpg = {
|
||||
enable = true;
|
||||
};
|
||||
services.gpg-agent = {
|
||||
enable = true;
|
||||
enableSshSupport = true;
|
||||
pinentry.package = pkgs.pinentry-gtk2;
|
||||
};
|
||||
|
||||
home.file.".ssh/config".source = ./ssh-config;
|
||||
home.file.".ssh/gpg-as-ssh.pub".source = ./gpg-as-ssh.pub;
|
||||
home.file.".gnupg/sshcontrol".source = ./sshcontrol;
|
||||
};
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
isEnabled =
|
||||
config.azos.gimp.enable;
|
||||
in {
|
||||
options.azos.gimp.enable = lib.mkOption {
|
||||
default = true;
|
||||
example = true;
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
config = lib.mkIf isEnabled {
|
||||
home.packages = with pkgs; [
|
||||
gimp3
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
isEnabled =
|
||||
config.azos.git-config.enable;
|
||||
in {
|
||||
options.azos.git-config.enable = lib.mkOption {
|
||||
default = true;
|
||||
example = true;
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
config = lib.mkIf isEnabled {
|
||||
home.packages = with pkgs; [pass-git-helper unzip];
|
||||
|
||||
programs.git = {
|
||||
enable = true;
|
||||
|
||||
signing = {
|
||||
key = "6D17E295C70E2674";
|
||||
signByDefault = true;
|
||||
};
|
||||
|
||||
settings = {
|
||||
extraConfig = {
|
||||
credential.helper = "!pass-git-helper $@";
|
||||
};
|
||||
user = {
|
||||
name = "Aner Zakobar";
|
||||
email = "aner@zakobar.com";
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
home.file.".config/pass-git-helper/git-pass-mapping.ini".source =
|
||||
./pass-git-mapping.ini;
|
||||
};
|
||||
}
|
||||
@@ -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,59 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
options,
|
||||
azos-utils,
|
||||
...
|
||||
}: let
|
||||
isEnabled =
|
||||
config.azos.suites.hyprland.enable;
|
||||
in {
|
||||
options.azos.suites.hyprland.enable = lib.mkOption {
|
||||
default = false;
|
||||
example = true;
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
#TODO shutdown reboot commands
|
||||
config = lib.mkIf isEnabled {
|
||||
home.packages = with pkgs; [
|
||||
hyprland
|
||||
waybar # status bar
|
||||
wofi # application launcher
|
||||
kitty
|
||||
grim # screenshot utility
|
||||
slurp # region selector
|
||||
swappy # screenshot editor
|
||||
networkmanagerapplet
|
||||
xwayland
|
||||
];
|
||||
|
||||
azos.emacs.enabledSuites = ["azos-emacs-hyprland"];
|
||||
azos.emacs.pkgs = [pkgs.azos-emacs-hyprland];
|
||||
azos.emacs.emacspkg = pkgs.emacs-pgtk;
|
||||
|
||||
home.file.".login.sh" = {
|
||||
text = ''
|
||||
#!/usr/bin/env bash
|
||||
${pkgs.hyprland}/bin/Hyprland
|
||||
'';
|
||||
#Make executable
|
||||
executable = true;
|
||||
};
|
||||
|
||||
# systemd.user.services.xwayland = {
|
||||
# Unit.Description = "XWayland server";
|
||||
# Install.WantedBy = [ "default.target" ];
|
||||
# Service = {
|
||||
# ExecStart = "${pkgs.xwayland}/bin/Xwayland :0 -rootless -terminate -listen tcp";
|
||||
# Restart = "on-failure";
|
||||
# RestartSec = "1s";
|
||||
# StandardInput = "null";
|
||||
# StandardOutput = "null";
|
||||
# StandardError = "journal";
|
||||
# };
|
||||
# };
|
||||
|
||||
};
|
||||
}
|
||||
@@ -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,21 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
azos-utils,
|
||||
...
|
||||
}: let
|
||||
isEnabled =
|
||||
config.azos.emacs.enable && config.azos.suites.lauretta.enable;
|
||||
emacspkgs = config.azos.emacs.emacspkg.pkgs;
|
||||
localPkgName = "azos-emacs-lauretta";
|
||||
in {
|
||||
#Set config
|
||||
options.azos.suites.lauretta.enable = azos-utils.mkSuiteEnableOption {};
|
||||
config = lib.mkIf isEnabled {
|
||||
azos.emacs.enabledSuites = [localPkgName];
|
||||
|
||||
#Base emacs suite definition
|
||||
azos.emacs.pkgs = [pkgs.azos-emacs-lauretta];
|
||||
};
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
isEnabled =
|
||||
config.azos.libreoffice.enable;
|
||||
in {
|
||||
options.azos.libreoffice.enable = lib.mkOption {
|
||||
default = true;
|
||||
example = true;
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
config = lib.mkIf isEnabled {
|
||||
home.packages = with pkgs; [
|
||||
libreoffice
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -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,21 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
isEnabled =
|
||||
config.azos.opencode.enable;
|
||||
in {
|
||||
options.azos.opencode.enable = lib.mkOption {
|
||||
default = true;
|
||||
example = true;
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
config = lib.mkIf isEnabled {
|
||||
home.packages = with pkgs; [
|
||||
opencode
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -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,21 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
isEnabled =
|
||||
config.azos.spotify.enable;
|
||||
in {
|
||||
options.azos.spotify.enable = lib.mkOption {
|
||||
default = true;
|
||||
example = true;
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
config = lib.mkIf isEnabled {
|
||||
home.packages = with pkgs; [
|
||||
spotify
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
isEnabled =
|
||||
config.azos.discord.enable;
|
||||
in {
|
||||
options.azos.ytdl.enable = lib.mkOption {
|
||||
default = true;
|
||||
example = true;
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
config = lib.mkIf isEnabled {
|
||||
home.packages = with pkgs; [
|
||||
yt-dlp
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
isEnabled =
|
||||
config.azos.zoom.enable;
|
||||
in {
|
||||
options.azos.zoom.enable = lib.mkOption {
|
||||
default = true;
|
||||
example = true;
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
config = lib.mkIf isEnabled {
|
||||
home.packages = with pkgs; [
|
||||
zoom-us
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -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,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 ./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,42 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
isEnabled =
|
||||
config.azos.virtualization.enable;
|
||||
in {
|
||||
options.azos.virtualization.enable = lib.mkOption {
|
||||
default = true;
|
||||
example = true;
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
config = lib.mkIf isEnabled {
|
||||
virtualisation.libvirtd = {
|
||||
enable = true; # start / run libvirtd as a system service
|
||||
# optional: expose the default NAT network (virbr0) – libvirtd creates it
|
||||
# automatically when the daemon is on, but we make sure the bridge is
|
||||
# allowed through the firewall.
|
||||
qemu = {
|
||||
swtpm.enable = true; # (optional) enable software TPM for guests
|
||||
};
|
||||
};
|
||||
environment.systemPackages = with pkgs; [
|
||||
# QEMU (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";
|
||||
}
|
||||
|
||||
+48
-27
@@ -1,6 +1,7 @@
|
||||
{
|
||||
inputs,
|
||||
outputs,
|
||||
suiteModules,
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
@@ -11,19 +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;
|
||||
|
||||
nixpkgs = {
|
||||
overlays = [
|
||||
inputs.azos-core.overlays.addpkgs
|
||||
outputs.overlays.addpkgs
|
||||
inputs.azos-core.overlays.qutebrowserdrm
|
||||
outputs.overlays.qutebrowserdrm
|
||||
outputs.overlays.modifications
|
||||
outputs.overlays.unstable-packages
|
||||
];
|
||||
@@ -33,20 +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";
|
||||
@@ -59,7 +63,6 @@
|
||||
LC_TIME = "he_IL.UTF-8";
|
||||
};
|
||||
|
||||
# Configure keymap in X11
|
||||
services.xserver = {
|
||||
xkb = {
|
||||
layout = "us,il";
|
||||
@@ -68,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; [];
|
||||
};
|
||||
|
||||
@@ -85,35 +85,56 @@
|
||||
auto-optimise-store = true;
|
||||
};
|
||||
|
||||
azos.suites.exwm.enable = true;
|
||||
azos.attic.enable = true;
|
||||
|
||||
home-manager = {
|
||||
extraSpecialArgs = {inherit inputs outputs pkgs;};
|
||||
extraSpecialArgs = {inherit inputs outputs suiteModules pkgs;};
|
||||
users = {
|
||||
aner = import ../home-manager/home.nix;
|
||||
};
|
||||
};
|
||||
|
||||
# Specializations
|
||||
specialisation = {
|
||||
hyprland = {
|
||||
steam-big-picture = {
|
||||
configuration = {
|
||||
# Override 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;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
boot.supportedFilesystems = ["exfat"];
|
||||
boot.kernelModules = ["exfat"];
|
||||
|
||||
# List packages installed in system profile. To search, run:
|
||||
# $ nix search wget
|
||||
environment.systemPackages = with pkgs; [
|
||||
vim
|
||||
git
|
||||
tmux
|
||||
killall
|
||||
brightnessctl
|
||||
exfatprogs
|
||||
gamescope
|
||||
];
|
||||
|
||||
fonts.enableDefaultPackages = true;
|
||||
@@ -125,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,74 +0,0 @@
|
||||
#+title: Aner's Emacs Lauretta Configuration
|
||||
#+property: header-args :results silent
|
||||
|
||||
* Base setup
|
||||
** Require
|
||||
|
||||
#+begin_src emacs-lisp
|
||||
(require 'azos-emacs-base)
|
||||
(require 'azos-emacs-dev)
|
||||
(require 'azos-emacs-editor)
|
||||
(require 'azos-emacs-exwm)
|
||||
(require 'azos-emacs-station)
|
||||
#+end_src
|
||||
|
||||
* Lauretta specific
|
||||
|
||||
** LLM
|
||||
|
||||
#+begin_src emacs-lisp
|
||||
(setq
|
||||
gptel-model 'openai/gpt-oss-120b
|
||||
gptel-backend
|
||||
(gptel-make-openai "Groq"
|
||||
:host "api.groq.com"
|
||||
:endpoint "/openai/v1/chat/completions"
|
||||
:stream t
|
||||
:key "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"
|
||||
:models '(openai/gpt-oss-120b)))
|
||||
;; This is where I would update agents if I had them
|
||||
;; (setq gptel-agent-dirs '("/home/aner/.agents"))
|
||||
;; (gptel-agent-update)
|
||||
|
||||
(use-package agent-shell
|
||||
:ensure t
|
||||
:ensure-system-package
|
||||
:config
|
||||
;; Evil state-specific RET behavior: insert mode = newline, normal mode = send
|
||||
(evil-define-key 'insert agent-shell-mode-map (kbd "RET") #'newline)
|
||||
(evil-define-key 'normal agent-shell-mode-map (kbd "RET") #'comint-send-input)
|
||||
(add-hook 'diff-mode-hook
|
||||
(lambda ()
|
||||
(when (string-match-p "\\*agent-shell-diff\\*" (buffer-name))
|
||||
(evil-emacs-state)))))
|
||||
#+end_src
|
||||
|
||||
** Headphones
|
||||
|
||||
#+begin_src emacs-lisp
|
||||
(defun azos/connect-headphones ()
|
||||
(interactive)
|
||||
(start-process-shell-command "connect-headphones" nil "azos-connect-headphones-whmx4000"))
|
||||
|
||||
(define-key azos/global-minor-mode/open-keymap
|
||||
(kbd "h") 'azos/connect-headphones)
|
||||
#+end_src
|
||||
|
||||
** Tab bar setup
|
||||
|
||||
#+begin_src emacs-lisp
|
||||
(when (fboundp #'azos/bat/enable-tab-display)
|
||||
(azos/bat/enable-tab-display))
|
||||
|
||||
(when (fboundp #'azos/network/enable-tab-display)
|
||||
(azos/network/enable-tab-display))
|
||||
|
||||
(when (fboundp #'azos/audio/enable-tab-display)
|
||||
(azos/audio/enable-tab-display))
|
||||
#+end_src
|
||||
|
||||
* Provide
|
||||
|
||||
#+begin_src emacs-lisp
|
||||
(provide 'azos-emacs-lauretta)
|
||||
#+end_src
|
||||
+10
-3
@@ -1,14 +1,21 @@
|
||||
{pkgs} @ args:
|
||||
pkgs.mkShell {
|
||||
buildInputs = with pkgs; [
|
||||
alejandra
|
||||
(pkgs.writeShellScriptBin
|
||||
"azos-lauretta-update"
|
||||
"sudo nixos-rebuild switch --flake .#lauretta" )
|
||||
"sudo nixos-rebuild switch --flake '.?submodules=1#lauretta'")
|
||||
(pkgs.writeShellScriptBin
|
||||
"azos-update-azos-core"
|
||||
"nix flake update azos-core" )
|
||||
"nix flake update --flake '.?submodules=1' azos-core")
|
||||
(pkgs.writeShellScriptBin
|
||||
"azos-update"
|
||||
"nix flake update" )
|
||||
"nix flake update --flake '.?submodules=1'")
|
||||
(pkgs.writeShellScriptBin
|
||||
"azos-beacon-build-image"
|
||||
"nix build '.?submodules=1#packages.x86_64-linux.beacon-image'")
|
||||
(pkgs.writeShellScriptBin
|
||||
"azos-beacon-remote-update"
|
||||
"nixos-rebuild switch --flake '.?submodules=1#beacon' --target-host aner@192.168.1.200 --build-host aner@192.168.1.200 --sudo")
|
||||
];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user