From 1d82ab92b65bfea7d6901d09c863938d43195645 Mon Sep 17 00:00:00 2001 From: moons Date: Mon, 27 Jul 2026 10:05:55 +0900 Subject: [PATCH] feat --- .gitignore | 12 +- AGENTS.md | 574 +++++++++++++++++++++++- images/avatar.jpg | Bin 0 -> 42497 bytes modules/applications/btop/dracula.theme | 89 ++++ modules/applications/btop/home.nix | 8 + 5 files changed, 663 insertions(+), 20 deletions(-) create mode 100644 images/avatar.jpg create mode 100644 modules/applications/btop/dracula.theme create mode 100644 modules/applications/btop/home.nix diff --git a/.gitignore b/.gitignore index 415a9e4..07c6d80 100644 --- a/.gitignore +++ b/.gitignore @@ -19,9 +19,9 @@ !/flake/ !/overlays/ -!/modules/applications/ -!/modules/hardwares/ -!/modules/profiles/ -!/modules/services/ -!/modules/systems/ -!/modules/users/ +!/images/ +!/secrets/ + +!/hosts/ + +!/modules/ diff --git a/AGENTS.md b/AGENTS.md index 478f1b5..bb9683e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,28 +1,574 @@ # Repository Guidelines -## Project Structure & Module Organization +## Project Structure and Ownership -This repository manages NixOS and Home Manager configuration as a flake. `flake.nix` defines inputs and imports the project modules. Keep flake-level plumbing in `flake/`, reusable package overlays in `overlays/`, and development environments in `shells/`. Add configuration under the appropriate `modules/` category: `applications/`, `hardwares/`, `profiles/`, `services/`, `systems/`, or `users/`. Keep host- or user-specific choices near their owning module rather than in the root flake. +This repository manages NixOS, nix-darwin, and Home Manager configurations as a +flake. `flake.nix` defines inputs and delegates flake outputs through +flake-parts. Keep configuration with the component that owns it, rather than in +the root flake or an unrelated host. + +| Path | Responsibility | +| ----------------------- | ----------------------------------------------------------------------------------------------------------------- | +| `modules/applications/` | One software component, including GUI applications, window managers, desktop environments, CLI tools, and editors | +| `modules/systems/` | OS foundations such as Nix, boot, locale, Wayland, and networking | +| `modules/services/` | Daemons, long-running services, and configuration that involves permissions or user groups | +| `modules/hardwares/` | Reusable drivers, hardware families, and VM or WSL guest configuration | +| `modules/users/` | User identity and the user's NixOS-, nix-darwin-, and Home Manager-specific definitions | +| `modules/profiles/` | Purpose- or form-factor-oriented compositions of multiple units | +| `hosts/` | Machine-specific facts and the profiles or applications selected for each machine | +| `libs/` | Registry, unit discovery, and host construction logic | +| `overlays/` | Package replacements and additions | +| `shells/` | Development shells | +| `flake/` | Supporting flake outputs such as formatters, checks, and Git hooks | + +Use **unit** as the generic internal term for a Registry-managed component and +**profile** for a unit that composes multiple units. Do not introduce a +`features/` layer. Window managers and desktop environments such as niri and +GNOME belong in `modules/applications/`; do not create a separate `desktop/` +module category. + +Before adding configuration, decide whether it is owned by an application, +system foundation, service, hardware family, user, profile, or individual host. +Prefer the following placements: + +| Configuration | Placement | +| ---------------------------------------------------- | ------------------------------------------------ | +| Nix settings shared by every system host | `modules/systems/nix/common.nix` | +| NixOS-only boot configuration | `modules/systems/boot/.../nixos.nix` | +| Ghostty-specific configuration | `modules/applications/ghostty/` | +| niri-specific configuration | `modules/applications/niri/` | +| Applications selected for the niri environment | `modules/profiles/interface/niri/meta.nix` | +| GNOME itself | `modules/applications/gnome/` | +| Docker daemon and Docker group membership | `modules/services/docker/nixos.nix` | +| Reusable ThinkPad-family configuration | `modules/hardwares/thinkpad/` | +| The laptop unit composition | `modules/profiles/platform/laptop/meta.nix` | +| The development-environment unit composition | `modules/profiles/workload/development/meta.nix` | +| A user's OS- and Home Manager-specific configuration | `modules/users//` | +| x1g13-specific monitor layout | `hosts/x1g13/home.nix` | +| x1g13-specific disk UUID | `hosts/x1g13/nixos.nix` | +| Package replacement or addition | `overlays/` | +| Formatter, checks, or Git hooks | `flake/` | + +## Unit Discovery and Identity + +A directory below `modules/` is a unit if, and only if, it directly contains at +least one reserved file. Directories used only for classification, such as +`modules/applications/` or `modules/profiles/interface/`, are namespaces rather +than units when they have no reserved file of their own. + +The Registry recognizes exactly these five reserved filenames: + +| File | Target and responsibility | +| ------------ | -------------------------------------------------------------------------------- | +| `common.nix` | System-side configuration fragment shared by NixOS and nix-darwin | +| `nixos.nix` | NixOS-only configuration fragment | +| `darwin.nix` | nix-darwin-only configuration fragment | +| `home.nix` | Home Manager configuration fragment | +| `meta.nix` | Registry descriptor for dependencies, external modules, and descriptive metadata | + +`common.nix` is never applied to Home Manager. OS-independent Home Manager +configuration still belongs in `home.nix`. + +The Registry derives a unit ID from the path relative to `modules/`, joining +path components with dots. Category names remain plural. It also derives the +enable option by prefixing the same components with `my` and appending `enable`. + +| Unit directory | Unit ID | Enable option | +| ---------------------------------- | ------------------------- | ----------------------------------- | +| `modules/applications/ghostty/` | `applications.ghostty` | `my.applications.ghostty.enable` | +| `modules/applications/niri/` | `applications.niri` | `my.applications.niri.enable` | +| `modules/systems/boot/uefi/` | `systems.boot.uefi` | `my.systems.boot.uefi.enable` | +| `modules/services/docker/` | `services.docker` | `my.services.docker.enable` | +| `modules/hardwares/qemu-guest/` | `hardwares.qemu-guest` | `my.hardwares.qemu-guest.enable` | +| `modules/users/moons/` | `users.moons` | `my.users.moons.enable` | +| `modules/profiles/interface/niri/` | `profiles.interface.niri` | `my.profiles.interface.niri.enable` | + +Represent option paths as attribute-path lists, never as Nix source encoded in +strings or evaluated dynamically. Generate and read attributes with helpers such +as `lib.setAttrByPath` and `lib.getAttrFromPath`: + +```nix +{ + id = "applications.ghostty"; + + optionPath = [ + "my" + "applications" + "ghostty" + "enable" + ]; + + kind = "applications"; + name = "ghostty"; + + relativePath = [ + "applications" + "ghostty" + ]; +} +``` + +For `modules/profiles/interface/niri/`, path inference additionally gives +`kind = "profiles"`, `group = "interface"`, and `name = "niri"`. The path is +always authoritative for identity. `meta.nix` may provide display metadata such +as `description`, but it must not override or alias the unit ID. + +## Unit Files and Fragment Contract + +Only reserved files that a unit actually needs should exist. The Registry +registers present fragments and does not require empty or placeholder files. All +of the following are valid units: + +```text +# Home Manager only +modules/applications/ghostty/ +├── home.nix +└── settings.nix + +# NixOS only +modules/applications/gnome/ +└── nixos.nix + +# nix-darwin only +modules/systems/macos-defaults/ +└── darwin.nix + +# NixOS and Home Manager, with metadata and helpers +modules/applications/niri/ +├── nixos.nix +├── home.nix +├── meta.nix +├── settings.nix +└── keybindings.nix + +# Metadata only, commonly a composition profile +modules/profiles/interface/niri/ +└── meta.nix + +# System configuration shared by NixOS and nix-darwin +modules/systems/nix/ +└── common.nix +``` + +If a unit has no `home.nix`, do not generate or apply a Home Manager module for +it. The same rule applies independently to `common.nix`, `nixos.nix`, and +`darwin.nix`. + +### Configuration fragments + +`common.nix`, `nixos.nix`, `darwin.nix`, and `home.nix` are configuration +fragments to which the Registry adds the enable condition. They return the +configuration for their class directly and must not define top-level `imports`, +`options`, or `config` attributes: + +```nix +# modules/services/docker/nixos.nix +{ primaryUser, ... }: +{ + virtualisation.docker = { + enable = true; + autoPrune.enable = true; + }; + + users.users.${primaryUser}.extraGroups = [ + "docker" + ]; +} +``` + +Conceptually, the Registry supplies a wrapper like this: + +```nix +{ config, lib, ... }@args: +{ + config = + lib.mkIf + config.my.services.docker.enable + (import dockerNixosPath args); +} +``` + +Do not add hand-written `mkEnableOption`, `cfg`, or `mkIf` boilerplate to each +unit. The Registry generates the enable option from the unit path and guards the +fragment. + +### Helper files and directories + +Every filename other than the five reserved names is an ordinary helper, +regardless of its extension. The Registry neither discovers nor automatically +imports helper files such as `settings.nix`, `keybindings.nix`, `packages.nix`, +`colors.nix`, `rules.nix`, or `helpers.nix`. Import a helper explicitly from the +reserved fragment that uses it: + +```nix +# modules/applications/niri/home.nix +{ lib, ... }: +let + settings = import ./settings.nix; + keybindings = import ./keybindings.nix; +in +{ + programs.niri.settings = lib.recursiveUpdate settings { + binds = keybindings; + }; +} +``` + +Do not use a leading underscore to mark a file private; `_settings.nix` has no +special meaning. Give helper files descriptive names instead. When helpers are +configuration functions, pass the module arguments explicitly and combine them +with normal Nix expressions: + +```nix +# modules/applications/example/home.nix +{ lib, ... }@args: +lib.mkMerge [ + (import ./packages.nix args) + (import ./settings.nix args) +] +``` + +The same discovery rule applies recursively to helper directories: + +```text +modules/applications/niri/ +├── home.nix +└── parts/ + ├── appearance.nix + └── keybindings.nix +``` + +Here `parts/` is not a unit because it directly contains no reserved file. A +helper directory that directly contains `home.nix` or another reserved file is +itself discovered as a unit, so never use reserved filenames inside a directory +that is intended to contain helpers only. + +### Registry metadata + +`meta.nix` is a Registry descriptor, not a NixOS, nix-darwin, or Home Manager +module. It may declare `description`, `includes`, and class-specific external +module imports: + +```nix +# modules/applications/niri/meta.nix +{ inputs, ... }: +{ + description = "Niri Wayland compositor"; + + includes = [ + "systems.wayland" + "services.xdg-portal" + ]; + + imports.nixos = [ + inputs.niri-flake.nixosModules.niri + ]; + + imports.home = [ + inputs.niri-flake.homeModules.niri + ]; +} +``` + +External modules, including modules supplied by flake inputs, define Nix module +options and therefore belong in `meta.nix` under `imports.nixos`, +`imports.darwin`, or `imports.home`. Do not place them in a configuration +fragment's top-level `imports`: the Nix module system resolves imports before a +configuration-level enable condition. + +`includes` lists units to enable whenever the declaring unit is enabled. Always +use fully qualified unit IDs: + +```nix +# modules/profiles/interface/niri/meta.nix +{ + includes = [ + "applications.niri" + "applications.ghostty" + "applications.noctalia" + "applications.vicinae" + "applications.nautilus" + "services.xdg-portal" + ]; +} +``` + +Never omit a prefix such as `applications.` merely because the including unit is +a profile. Fully qualified IDs make ownership explicit and allow moves, name +collisions, and missing dependencies to be detected. Do not enable another unit +by assigning to its enable option from a class fragment; declare the dependency +in `meta.includes`. + +Application metadata should include only dependencies technically required for +the application to work. A profile owns the user's choice to adopt several +otherwise independent applications together. For example, niri may include the +Wayland foundation and xdg-desktop-portal as technical dependencies, while +`profiles.interface.niri` selects Ghostty, Vicinae, Noctalia, and Nautilus. +Ghostty must not depend on niri, and niri-specific keybindings remain owned by +the niri unit. + +## Profiles + +Profiles compose units by purpose or form factor; they do not replace clear +application, system, service, or hardware ownership. Suitable profile namespaces +include: + +```text +modules/profiles/ +├── base/ +├── interface/ +│ ├── niri/ +│ ├── gnome/ +│ ├── cli-minimal/ +│ └── cli-interactive/ +├── platform/ +│ ├── laptop/ +│ ├── thinkpad/ +│ ├── desktop/ +│ ├── vm/ +│ └── wsl/ +├── workload/ +│ ├── development/ +│ ├── personal/ +│ ├── server/ +│ └── remote/ +└── security/ + └── secure-boot/ +``` + +The `desktop/` name above is a form-factor profile under `profiles/platform/`, +not a top-level module category. + +A profile may consist only of `meta.includes`. Small settings that belong only +to the composition and have no useful independent identity may go directly in +the profile's `nixos.nix`, `darwin.nix`, or `home.nix`. Extract configuration to +an appropriate application, system, service, or hardware unit when any of these +conditions holds: + +- It should be independently enableable. +- Multiple profiles reuse it. +- It owns separate configuration files. +- Its NixOS, nix-darwin, and Home Manager implementations differ. +- Other units depend on it. +- It involves a daemon, permissions, or user groups. + +## Registry Responsibilities + +Implement unit discovery with Nix standard functionality such as +`builtins.readDir`. Do not depend on an external indiscriminate auto-import +mechanism, and do not design the repository around `import-tree`. Registry logic +has these responsibilities: + +1. Recursively visit directories below `modules/`. +2. Check only the five reserved filenames directly within each directory. +3. Register a directory as a unit when at least one reserved file exists there. +4. Derive the unit ID from the path relative to `modules/`. +5. Record only class fragments that exist. +6. Evaluate `meta.nix` as a descriptor only when it exists. +7. Exclude non-reserved files from discovery and implicit imports. +8. Generate every unit's `my..enable` option. +9. Enable included units from `meta.includes`. +10. Raise a clear evaluation error for a reference to a missing unit ID. +11. Apply only the fragments appropriate to the current host class. +12. Pass `home.nix` to Home Manager only for hosts that enable Home Manager. + +A unit record may conceptually look like this; the implementation need not use +this exact representation: + +```nix +{ + id = "applications.ghostty"; + directory = ./applications/ghostty; + + fragments = { + common = null; + nixos = null; + darwin = null; + home = ./applications/ghostty/home.nix; + }; + + meta = { }; +} +``` + +Keep the custom Registry limited to unit discovery, enable-option generation, +`includes`, and class dispatch. Do not reimplement general Nix imports or Nix +module evaluation. In particular, never infer a unit ID from metadata or +implicitly load a non-reserved file. + +## Hosts and Class Dispatch + +`hosts/` is outside Registry discovery. A host contains machine-specific facts, +differences, and unit selection, not reusable shared configuration. Appropriate +host-owned data includes: + +- Generated `hardware-configuration.nix`. +- Disk UUIDs and disko target devices. +- Monitor identifiers, layout, and scale. +- MAC addresses and static IP addresses. +- Kernel parameters required by one machine only. +- `system.stateVersion`. +- Host-specific secret references. +- The profiles, applications, and other units enabled on that host. + +A host registry may use a specification like this: + +```nix +# hosts/default.nix +{ + x1g13 = { + system = "x86_64-linux"; + user = "moons"; + path = ./x1g13; + + profiles = [ + "base" + "platform.thinkpad" + "interface.niri" + "interface.gnome" + "workload.development" + "workload.personal" + "security.secure-boot" + ]; + + applications = [ + "codex-desktop" + ]; + + units = [ + "services.tailscale" + ]; + }; + + macbook = { + system = "aarch64-darwin"; + user = "moons"; + path = ./macbook; + + profiles = [ + "base" + "platform.laptop" + "workload.development" + "workload.personal" + ]; + + applications = [ + "ghostty" + ]; + }; +} +``` + +Treat entries in `profiles` and `applications` as IDs relative to their +respective category roots. Add the category prefixes during host construction: + +```nix +selectedUnits = + [ "users.${spec.user}" ] + ++ map (name: "profiles.${name}") spec.profiles + ++ map (name: "applications.${name}") spec.applications + ++ spec.units or [ ]; +``` + +`units` is an escape hatch for fully qualified service, system, hardware, or +other unit IDs. Prefer profiles for the main composition; do not make hosts list +large numbers of low-level units directly. + +Host modules use normal Nix module semantics and are not Registry-guarded +configuration fragments. For example: + +```text +hosts/x1g13/ +├── nixos.nix +├── home.nix +├── hardware-configuration.nix +└── disko.nix +``` + +`hosts/x1g13/nixos.nix` may explicitly load `hardware-configuration.nix` and +`disko.nix` with the normal top-level Nix module `imports`. Do not confuse these +host imports with the prohibition on top-level `imports` in unit configuration +fragments. + +Derive the system class from the host's `system`: + +- A Linux NixOS host receives `common.nix` and `nixos.nix`. +- A nix-darwin host receives `common.nix` and `darwin.nix`. +- A host with integrated Home Manager additionally receives `home.nix`. + +Home Manager is additive, not a system class mutually exclusive with NixOS or +nix-darwin. The supported combinations are NixOS plus Home Manager and +nix-darwin plus Home Manager. If standalone Home Manager is supported later, add +an explicit host kind because `system` alone cannot distinguish it from NixOS. + +Do not duplicate reusable settings in hosts, but do not force genuinely +machine-specific values into a common unit merely to remove a host-local line. + +## Coding Style and Implementation Rules + +Use two-space indentation in Nix files and let `nixfmt` decide layout. Prefer +small units, explicit imports, and descriptive kebab-case names, for example +`modules/services/media-server/nixos.nix`. Use camelCase for Nix attributes +unless an upstream option dictates otherwise. Shell snippets must pass `shfmt` +and `shellcheck`; YAML, TOML, and Markdown are formatted by the configured +treefmt tools. + +When implementing or modifying modules: + +- Do not create `features/` or a top-level `desktop/` module category. +- Do not add per-unit `mkEnableOption`, `cfg`, or `mkIf` boilerplate; the Registry + derives and guards enable options from paths. +- Put unit dependencies in `meta.includes`, not in direct assignments to another + unit's enable option from a class fragment. +- Do not assume any non-reserved file is discovered or loaded automatically. +- Do not require an `_` prefix for helper or private files. +- Do not create unused `common.nix`, `nixos.nix`, `darwin.nix`, `home.nix`, or + `meta.nix` files. +- Do not override a path-derived unit ID from `meta.nix`. +- Keep technical application dependencies separate from the applications a + personal environment chooses to combine in a profile. +- Do not rely on module-list ordering to override values. Use Nix module + priorities such as `lib.mkDefault`, `lib.mkForce`, `lib.mkBefore`, or + `lib.mkAfter` explicitly when required. +- Keep Registry responsibilities narrow; use normal Nix imports and module + evaluation for everything outside discovery, generated enables, includes, and + class dispatch. ## Build, Test, and Development Commands -- `nix develop .#dotnix` enters the main development shell and installs the repository's pre-commit hooks. -- `nix develop .#android` provides Android platform tools such as `adb` and `fastboot`. +- `nix develop .#dotnix` enters the main development shell and installs the + repository's pre-commit hooks. +- `nix develop .#android` provides Android platform tools such as `adb` and + `fastboot`. - `nix fmt` formats all supported files through treefmt. - `nix flake check` evaluates flake outputs and runs configured checks. -- `pre-commit run --all-files` runs formatting, dead-code and static Nix checks, shell linting, and secret scanning. -- `nix flake update` refreshes pinned inputs in `flake.lock`; review lockfile changes before committing. +- `pre-commit run --all-files` runs formatting, dead-code and static Nix checks, + shell linting, and secret scanning. +- `nix flake update` refreshes pinned inputs in `flake.lock`; review lockfile + changes before committing. -If direnv is installed, `direnv allow` activates the `dotnix` shell from `.envrc` automatically. - -## Coding Style & Naming Conventions - -Use two-space indentation in Nix files and let `nixfmt` decide layout. Prefer small modules with explicit imports and descriptive kebab-case filenames, for example `modules/services/media-server.nix`. Use camelCase for Nix attributes unless an upstream option dictates otherwise. Shell snippets must pass `shfmt` and `shellcheck`; YAML, TOML, and Markdown are formatted by the configured treefmt tools. +If direnv is installed, `direnv allow` activates the `dotnix` shell from `.envrc` +automatically. ## Testing Guidelines -There is no separate unit-test suite. Before submitting changes, run `nix flake check` and `pre-commit run --all-files`. For system-specific changes, also build or evaluate the affected NixOS/Home Manager configuration without switching the live machine. Never commit generated secrets, `.age` plaintext, or local `.direnv/` state. +There is no separate unit-test suite. Before submitting changes, run +`nix flake check` and `pre-commit run --all-files`. For system-specific changes, +also build or evaluate the affected NixOS, nix-darwin, or Home Manager +configuration without switching the live machine. Never commit generated +secrets, `.age` plaintext, or local `.direnv/` state. -## Commit & Pull Request Guidelines +For Registry changes, test discovery of each supported fragment combination, +dependency closure through `meta.includes`, missing-unit errors, and class +dispatch. Verify that helper files are ignored until explicitly imported and +that directories without a directly contained reserved file remain namespaces. -Recent history favors short, lowercase, imperative subjects such as `fix` and `update action`; automated dependency commits use `chore(deps): ...`. Prefer a specific summary that states the affected area, such as `shells: add deployment tools`. Keep commits focused. Pull requests should explain the motivation, list affected hosts or profiles, report validation commands, and note any manual migration or secret-management steps. Include screenshots only for visible desktop or application configuration changes. +## Commit and Pull Request Guidelines + +Recent history favors short, lowercase, imperative subjects such as `fix` and +`update action`; automated dependency commits use `chore(deps): ...`. Prefer a +specific summary that states the affected area, such as +`shells: add deployment tools`. Keep commits focused. Pull requests should +explain the motivation, list affected hosts or profiles, report validation +commands, and note any manual migration or secret-management steps. Include +screenshots only for visible desktop or application configuration changes. diff --git a/images/avatar.jpg b/images/avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98cde4eba9e2a9d294575e39075034e00329854c GIT binary patch literal 42497 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 literal 0 HcmV?d00001 diff --git a/modules/applications/btop/dracula.theme b/modules/applications/btop/dracula.theme new file mode 100644 index 0000000..8a1a314 --- /dev/null +++ b/modules/applications/btop/dracula.theme @@ -0,0 +1,89 @@ +# Bashtop theme with Nord palette (https://www.nordtheme.com) +# by Justin Zobel + +# Colors should be in 6 or 2 character hexadecimal or single spaced rgb decimal: "#RRGGBB", "#BW" or "0-255 0-255 0-255" +# example for white: "#ffffff", "#ff" or "255 255 255". + +# All graphs and meters can be gradients +# For single color graphs leave "mid" and "end" variable empty. +# Use "start" and "end" variables for two color gradient +# Use "start", "mid" and "end" for three color gradient + +# Main background, empty for terminal default, need to be empty if you want transparent background +theme[main_bg]="#282A36" + +# Main text color +theme[main_fg]="#BD93F9" + +# Title color for boxes +theme[title]="#f8f8f2" + +# Highlight color for keyboard shortcuts +theme[hi_fg]="#ff79c6" + +# Background color of selected item in processes box +theme[selected_bg]="#44475A" + +# Foreground color of selected item in processes box +theme[selected_fg]="#ECEFF4" + +# Color of inactive/disabled text +theme[inactive_fg]="#6272a4" + +# Misc colors for processes box including mini cpu graphs, details memory graph and details status text +theme[proc_misc]="#BD93F9" + +# Cpu box outline color +theme[cpu_box]="#ff79c6" + +# Memory/disks box outline color +theme[mem_box]="#ff79c6" + +# Net up/down box outline color +theme[net_box]="#ff79c6" + +# Processes box outline color +theme[proc_box]="#ff79c6" + +# Box divider line and small boxes line color +theme[div_line]="#ff79c6" + +# Temperature graph colors +theme[temp_start]="#bd93f9" +theme[temp_mid]="#bd93f9" +theme[temp_end]="#bd93f9" + +# CPU graph colors +theme[cpu_start]="#bd93f9" +theme[cpu_mid]="#bd93f9" +theme[cpu_end]="#bd93f9" + +# Mem/Disk free meter +theme[free_start]="#bd93f9" +theme[free_mid]="#bd93f9" +theme[free_end]="#bd93f9" + +# Mem/Disk cached meter +theme[cached_start]="#bd93f9" +theme[cached_mid]="#bd93f9" +theme[cached_end]="#bd93f9" + +# Mem/Disk available meter +theme[available_start]="#bd93f9" +theme[available_mid]="#bd93f9" +theme[available_end]="#bd93f9" + +# Mem/Disk used meter +theme[used_start]="#bd93f9" +theme[used_mid]="#bd93f9" +theme[used_end]="#bd93f9" + +# Download graph colors +theme[download_start]="#bd93f9" +theme[download_mid]="#bd93f9" +theme[download_end]="#bd93f9" + +# Upload graph colors +theme[upload_start]="#bd93f9" +theme[upload_mid]="#bd93f9" +theme[upload_end]="#bd93f9" diff --git a/modules/applications/btop/home.nix b/modules/applications/btop/home.nix new file mode 100644 index 0000000..94f1536 --- /dev/null +++ b/modules/applications/btop/home.nix @@ -0,0 +1,8 @@ +{ + programs.btop = { + enable = true; + + settings.color_theme = "dracula"; + themes.dracula = builtins.readFile ./dracula.theme; + }; +}