feat: Nomarchy ground-up rewrite on NixOS 26.05

Full replacement of the previous iteration, rebuilt around three ideas:

- Pure evaluation: theme-state.json lives inside the flake and is read
  via the nomarchy.stateFile option — no --impure, ever.
- All-Home-Manager theming: `nomarchy-theme-sync apply` writes the JSON
  and runs `home-manager switch`; every theme change is one atomic,
  rollbackable generation. Wallpaper (swww) is the sole runtime piece.
- Flat, downstream-first layout: modules/{nixos,home} with one
  options.nix each, exported as nixosModules/homeModules + overlay +
  flake template; system (nixos-rebuild) and desktop (home-manager
  switch) rebuild paths are fully split.

Ships 21 themes imported from the previous iteration (palettes,
wallpapers, btop themes, six whole-swap Waybar identities), Stylix for
the GTK/Qt/cursor long tail, a live ISO target with offline theme
switching, and docs/TESTING.md with the QEMU verification workflow.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Bernardo Magri
2026-06-10 10:59:13 +01:00
commit f211ef0d09
131 changed files with 4844 additions and 0 deletions

10
.gitignore vendored Normal file
View File

@@ -0,0 +1,10 @@
# Study material from the previous iteration — not part of the flake.
# Delete the directory once everything worth porting has been ported.
old_distro/
# Nix build artifacts
result
result-*
__pycache__/
.DS_Store

197
README.md Normal file
View File

@@ -0,0 +1,197 @@
# Nomarchy
**The rock-solid reproducibility of NixOS 26.05. The out-of-the-box polish of
Omarchy/Omakub.** One JSON file rules the look of the entire desktop; every
theme change is a Home Manager generation — atomic, rollbackable, never
partial.
```
┌──────────────────────────────────────────────────────────────────────────┐
│ theme-state.json (single source of truth) │
│ lives INSIDE your flake checkout, git-tracked │
└───────────────────────────────────┬──────────────────────────────────────┘
nomarchy-theme-sync apply gruvbox
1. merges the preset into the JSON (atomic write)
2. runs `home-manager switch` (no sudo, no system rebuild)
▼ pure read (nomarchy.stateFile)
┌──────────────────────────────────────────────────────────────────────────┐
│ Home Manager bakes EVERYTHING into one read-only generation: │
│ Hyprland (colors/gaps/borders) Waybar (palette or whole-swap) │
│ Ghostty (full ANSI palette) btop (asset or generated) │
│ Stylix → GTK, Qt, cursors, fonts │
└───────────────────────────────────┬──────────────────────────────────────┘
wallpaper via swww (the one runtime piece:
applied post-switch + at session start, `bg next` cycles)
```
## 1. Layout
Flat on purpose. Two module trees, one options file each, no hidden layers.
```
.
├── flake.nix # inputs + the downstream API (exports below)
├── theme-state.json # ★ THE single source of truth (git-tracked!)
├── themes/ # 21 presets: <slug>.json + optional <slug>/ assets
│ ├── nord.json # palette (required, works alone)
│ └── nord/ # assets (optional, fixed filenames)
│ ├── backgrounds/ # wallpapers (auto-picked, SUPER+SHIFT+T cycles)
│ ├── btop.theme # hand-made config drop (else generated)
│ └── waybar.css # whole-swap: replaces the generated bar style
├── modules/
│ ├── nixos/ # the distro, system side
│ │ ├── default.nix # Hyprland session, Pipewire, greetd, fonts
│ │ └── options.nix # nomarchy.system.* toggles
│ └── home/ # the distro, user side
│ ├── default.nix # entry point
│ ├── options.nix # nomarchy.* option surface
│ ├── theme.nix # JSON ingestion + wallpaper hook
│ ├── stylix.nix # GTK/Qt/cursors/fonts from the same JSON
│ ├── hyprland.nix # all JSON-driven
│ ├── waybar.nix
│ ├── ghostty.nix
│ └── btop.nix
├── hosts/
│ ├── default/ # reference machine (thin: boot, user, hostname)
│ └── live.nix # bootable live ISO (try the distro, no install)
├── pkgs/nomarchy-theme-sync/ # state writer + rebuild dispatcher (Python)
├── templates/downstream/ # `nix flake init -t` starter for users
├── docs/TESTING.md # how to verify changes (incl. AI-agent rules)
└── tools/ # maintainer-only
├── import-palettes.py # converts old-distro themes → JSON + assets
└── test-live-iso.sh # build the ISO + boot it in QEMU
```
**Rule of thumb:** `modules/` is the distro (reusable, no machine specifics),
`hosts/` is a machine, `themes/` is data, `pkgs/` is code, `tools/` is
maintainer-only. If a new file doesn't obviously belong to one of those, it
probably shouldn't exist.
## 2. Try it first (live ISO)
Boot the full desktop from a USB stick or VM without installing anything:
```sh
nix build .#nixosConfigurations.nomarchy-live.config.system.build.isoImage
# → result/iso/*.iso — dd to a stick, or boot it in QEMU:
tools/test-live-iso.sh
```
The live session auto-logs-in, seeds the flake at `~/.nomarchy`, and pins
the locked inputs into the ISO store — so theme switching (including the
`home-manager switch` it triggers) works **offline**, exactly like on an
installed system. Verification checklist: [docs/TESTING.md](docs/TESTING.md).
## 3. Using Nomarchy on your machine (downstream)
Nomarchy is consumed as a flake input — you never fork or edit this repo:
```sh
mkdir my-machine && cd my-machine
nix flake init -t github:YOUR-USER/nomarchy
```
You own three files: `system.nix`, `home.nix`, and **your own
`theme-state.json`**. Two deliberately separate rebuild paths:
```sh
sudo nixos-rebuild switch --flake .#default # system: rare
home-manager switch --flake .#me # desktop: every theme change, no sudo
```
Override anything with plain NixOS/HM options (the distro uses `mkDefault`
throughout) or the `nomarchy.*` surface:
| Option | Default | Purpose |
|---|---|---|
| `nomarchy.stateFile` | — (required) | Path to your theme-state.json |
| `nomarchy.terminal` | `"ghostty"` | Terminal for keybinds and `$TERMINAL` |
| `nomarchy.hyprland.enable` | `true` | Nomarchy's Hyprland config |
| `nomarchy.waybar.enable` | `true` | Nomarchy's Waybar |
| `nomarchy.ghostty.enable` | `true` | Nomarchy's Ghostty |
| `nomarchy.btop.enable` | `true` | btop with per-theme colors |
| `nomarchy.stylix.enable` | `true` | GTK/Qt/cursor theming |
| `nomarchy.themesDir` | Nomarchy's `themes/` | Where per-theme app overrides are probed |
| `nomarchy.system.greeter.enable` | `true` | greetd/tuigreet |
| `nomarchy.system.audio.enable` | `true` | Pipewire stack |
| `nomarchy.system.bluetooth.enable` | `true` | Bluetooth + blueman |
## 4. How theming works
### Pure JSON ingestion
The trap with "read a mutable file from Nix" is pure evaluation: flakes
cannot read arbitrary `$HOME` paths without `--impure` (the old prototype
required it — never again). Nomarchy's convention: **the state file lives
inside the consuming flake** and is wired via
`nomarchy.stateFile = ./theme-state.json;`. Reading it is pure — it's flake
source. It must be git-tracked (`nomarchy-theme-sync` runs
`git add --intent-to-add` after every write as a safety net).
### One change = one generation
`nomarchy-theme-sync apply <theme>` merges the preset into the JSON and runs
`home-manager switch` (override the command with `$NOMARCHY_REBUILD`, or pass
`--no-switch` to only write). Everything is baked: Hyprland, Waybar, Ghostty,
btop, and — via Stylix, mapped onto base16 roles — GTK, Qt, cursors and
fonts. No runtime patching means no partial states, and `home-manager
generations` is also your theme history. Waybar even restyles in place: it
re-reads `style.css` when the symlink flips.
The **wallpaper** is the one runtime piece (swww is imperative; nothing in
Nix consumes the path): applied at session start and after every switch via
a tiny activation hook, cycled instantly with `bg next`.
### Per-theme app assets (`themes/<slug>/`)
Recoloring covers 95% of theming; the rest is one optional assets directory
per theme — a single place to look, unlike the old distro's split:
| Asset | Mechanism |
|---|---|
| `backgrounds/` | wallpapers; empty `wallpaper` in the state means "first one"; `bg next` cycles |
| `btop.theme` | baked into the generation (generated from the palette when absent) |
| `waybar.css` | **whole-swap**: replaces the generated bar style entirely (probed at eval time, self-contained) |
| `waybar.jsonc` | whole-swap for the bar *layout* (must be plain JSON) |
Six ported themes ship a `waybar.css` identity (catppuccin, lumon, nord,
retro-82, summer-day, summer-night). Custom user themes can live in
`$NOMARCHY_PATH/themes/` (preset lookup) and `nomarchy.themesDir` (eval-time
asset probe).
## 5. Day-to-day
```sh
nomarchy-theme-sync list # 21 presets (nord, gruvbox, rose-pine, …)
nomarchy-theme-sync apply kanagawa # whole desktop, one generation (~a switch)
nomarchy-theme-sync set ui.gapsOut 16 # tweak one knob (also a switch)
nomarchy-theme-sync bg next # cycle wallpapers — instant, no rebuild
nomarchy-theme-sync bg auto # back to the theme's default wallpaper
nomarchy-theme-sync get colors.accent
```
Keybinds: `SUPER+Return` terminal · `SUPER+D` launcher · `SUPER+T` theme
picker · `SUPER+SHIFT+T` next wallpaper · `SUPER+Q` close · `SUPER+1..9`
workspaces · `Print` region screenshot.
## 6. Extending
- **New theme:** drop a JSON into `themes/` (schema = any existing preset),
plus an optional `themes/<slug>/` assets directory.
- **New themed value:** add the key to `theme-state.json` and consume it in
the Nix modules. One place — there is no second renderer to keep in sync.
- **Importing more old-distro palettes:**
`tools/import-palettes.py <palettes-dir> themes/`.
## Roadmap
- **Faster switches:** move `backgrounds/` out of the flake source (the 86 MB
re-copy on every state write is the main eval tax), then pre-built theme
variants if still needed
- Plymouth + SDDM/greeter theming from the same JSON
- Interactive installer on the live ISO (disko BTRFS+LUKS, hardware
profiles) — port from old_distro
- `hyprlock`/`hypridle`, swayosd, launch-or-focus UX scripts

89
docs/TESTING.md Normal file
View File

@@ -0,0 +1,89 @@
# Testing Nomarchy
How to verify changes actually work — from cheap eval checks to booting the
full desktop. Adapted from the previous Nomarchy iteration's agent docs.
**The honesty rule (for humans and AI agents alike):** for Waybar, Hyprland,
or any visual change, the only reliable check is booting the live ISO. If
you can't boot it (e.g. you're on macOS or have no KVM), **say so** rather
than claiming success. "All Nix files parse" is not "the bar renders."
## 1. Cheap checks (always do these first)
```sh
nix flake check --no-build # full module-system evaluation, no builds
nix-instantiate --parse <file> # syntax-only, works even on macOS
python3 -m py_compile pkgs/nomarchy-theme-sync/nomarchy-theme-sync.py
```
`nix flake check` needs a Linux machine (or a Linux builder) since all
outputs are `x86_64-linux`. It catches type errors, missing options, and
bad merges — most breakage stops here.
## 2. Build and boot the live ISO
```sh
# Build + boot in QEMU, one command:
tools/test-live-iso.sh
# Or by hand:
nix build .#nixosConfigurations.nomarchy-live.config.system.build.isoImage
# → result/iso/*.iso — dd it to a USB stick for real hardware
```
The script prefers UEFI (OVMF) with a legacy-BIOS fallback, uses KVM when
`/dev/kvm` is readable, and boots with `virtio-vga-gl` + `gl=on`
**Hyprland and Ghostty need real OpenGL in the guest**; without it the
session may not start.
### What the live environment gives you
- Auto-login as `nomarchy` (no password, passwordless sudo), greetd →
Hyprland via `initial_session`; logging out lands on tuigreet.
- The flake is seeded writable at `~/.nomarchy` (from the read-only
`/etc/nomarchy` copy) — `$NOMARCHY_PATH` already points there.
- Locked flake inputs are pinned into the ISO store, so
`home-manager switch` works **without a network**.
## 3. Verification checklist
Work through these in order; each one exercises a different layer.
| # | Check | Verifies |
|---|---|---|
| 1 | Boots to Hyprland with Tokyo Night wallpaper visible | greetd autologin, swww, session start |
| 2 | Waybar shows at top, themed (blue accent on dark) | HM waybar module, palette baking |
| 3 | `SUPER+Return` opens Ghostty with Tokyo Night colors | terminal default, ANSI palette |
| 4 | `btop` in the terminal is themed | per-theme asset baking |
| 5 | `nomarchy-theme-sync list` prints 21 presets | package, baked themes dir |
| 6 | `nomarchy-theme-sync apply gruvbox` → state written, `home-manager switch` runs, desktop re-themes, wallpaper changes | the whole engine: state write, pure eval, HM rebuild, wallpaper hook |
| 7 | `SUPER+SHIFT+T` cycles wallpapers instantly (try `tokyo-night`: 4 of them) | the runtime wallpaper path |
| 8 | `nomarchy-theme-sync apply summer-night` → after the switch the bar has its own identity (light bar, different styling) | whole-swap waybar.css assets |
| 9 | Open a GTK app — dark theme matching the palette | Stylix layer |
| 10 | `home-manager generations` lists one generation per theme change; activating an older one rolls the theme back | atomicity / rollback story |
Items 6 and 8 are the big ones — they prove the all-Home-Manager theming
model end to end.
## 4. VM-specific gotchas
- **No KVM** (e.g. nested without acceleration): everything works but
`home-manager switch` will be painfully slow. Don't read slowness as
breakage.
- **Black screen / session exits**: almost always missing guest GL. Use the
script's qemu flags; on real hardware check `journalctl -b -u greetd`.
- **Tiny resolution**: the live config forces `monitor = ,highres,auto,1`;
if QEMU still picks 1024×768, resize the window — Hyprland follows.
- **First theme switch is the slowest**: it evaluates the flake on a RAM
disk. Subsequent switches reuse the eval cache.
## 5. When something fails
- Session/login problems: `journalctl -b -u greetd`, then `journalctl
--user -b`.
- Theme switch failures: run `nomarchy-theme-sync apply <x>` from a
terminal — the home-manager output streams there. The state file is
written *before* the rebuild, so after fixing you can just re-run
`home-manager switch --flake ~/.nomarchy`.
- Report results faithfully: what booted, what rendered, what you could
not verify and why.

138
flake.nix Normal file
View File

@@ -0,0 +1,138 @@
{
description = "Nomarchy the rock-solid reproducibility of NixOS, the polish of an opinionated desktop";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05";
home-manager = {
url = "github:nix-community/home-manager/release-26.05";
inputs.nixpkgs.follows = "nixpkgs";
};
stylix = {
url = "github:danth/stylix";
inputs.nixpkgs.follows = "nixpkgs";
inputs.home-manager.follows = "home-manager";
};
};
outputs = { self, nixpkgs, home-manager, stylix, ... }:
let
system = "x86_64-linux";
username = "nomarchy"; # reference host only; downstream picks its own
pkgs = import nixpkgs {
inherit system;
overlays = [ self.overlays.default ];
};
in
{
# ─── Downstream API ────────────────────────────────────────────
# A user's machine flake imports these and layers its own
# system.nix / home.nix on top (see templates/downstream).
# Their theme-state.json lives in THEIR flake and is wired up via
# the `nomarchy.stateFile` option — reading it stays pure.
overlays.default = final: prev: {
nomarchy-theme-sync = final.callPackage ./pkgs/nomarchy-theme-sync {
# Presets baked into the package, so `nomarchy-theme-sync list`
# works on machines that don't check out this repo.
themesDir = ./themes;
};
};
nixosModules.nomarchy = {
imports = [ ./modules/nixos ];
nixpkgs.overlays = [ self.overlays.default ];
};
homeModules.nomarchy = {
# stylix's home module is injected here because it needs the
# flake input; modules/home/stylix.nix only configures it.
imports = [ stylix.homeModules.stylix ./modules/home ];
};
templates.default = {
path = ./templates/downstream;
description = "Nomarchy machine configuration (downstream flake)";
};
packages.${system} = {
nomarchy-theme-sync = pkgs.nomarchy-theme-sync;
default = pkgs.nomarchy-theme-sync;
};
# ─── Reference host ────────────────────────────────────────────
# Deliberately split rebuild paths:
# system → sudo nixos-rebuild switch --flake .#nomarchy (rare)
# desktop → home-manager switch --flake .#nomarchy (no sudo;
# this is what `nomarchy-theme-sync apply` runs)
# Theme changes never touch the system layer, so they never need
# root and never rebuild the world.
nixosConfigurations.nomarchy = nixpkgs.lib.nixosSystem {
inherit system;
specialArgs = { inherit username; };
modules = [
self.nixosModules.nomarchy
./hosts/default/configuration.nix
];
};
homeConfigurations.${username} = home-manager.lib.homeManagerConfiguration {
inherit pkgs;
modules = [
self.homeModules.nomarchy
{
# The single source of truth — pure read: the file is part
# of this flake's source.
nomarchy.stateFile = ./theme-state.json;
home = {
inherit username;
homeDirectory = "/home/${username}";
};
}
];
};
# ─── Live ISO ──────────────────────────────────────────────────
# Full desktop on a bootable stick, no installation:
# nix build .#nixosConfigurations.nomarchy-live.config.system.build.isoImage
# Test in QEMU with tools/test-live-iso.sh. See docs/TESTING.md.
nixosConfigurations.nomarchy-live = nixpkgs.lib.nixosSystem {
inherit system;
specialArgs = { inherit username; nomarchySrc = self; };
modules = [
"${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix"
self.nixosModules.nomarchy
./hosts/live.nix
# The ISO is a sealed artifact, so the desktop is baked in via
# the HM NixOS module (the installed-system split into
# nixos-rebuild vs home-manager switch doesn't apply here —
# though the seeded ~/.nomarchy flake still allows standalone
# `home-manager switch` for theme testing).
home-manager.nixosModules.home-manager
{
home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
users.${username} = {
imports = [ self.homeModules.nomarchy ];
nomarchy.stateFile = ./theme-state.json;
};
};
# Keep the locked flake inputs in the ISO store so theme
# switching on the live system works without a network: the
# lockfile's narHashes resolve against these paths instead
# of fetching from GitHub.
system.extraDependencies = [
nixpkgs.outPath
home-manager.outPath
stylix.outPath
];
}
];
};
};
}

View File

@@ -0,0 +1,24 @@
# Reference host — machine specifics ONLY.
# The distro itself comes from nixosModules.nomarchy (modules/nixos),
# imported in flake.nix. Keep this file boring.
{ pkgs, username, ... }:
{
imports = [ ./hardware-configuration.nix ];
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
boot.kernelPackages = pkgs.linuxPackages_latest;
networking.hostName = "nomarchy";
time.timeZone = "UTC"; # adjust per machine
i18n.defaultLocale = "en_US.UTF-8";
users.users.${username} = {
isNormalUser = true;
description = "Nomarchy user";
extraGroups = [ "wheel" "networkmanager" "video" "input" ];
};
system.stateVersion = "26.05";
}

View File

@@ -0,0 +1,15 @@
# PLACEHOLDER — replace with the output of `nixos-generate-config` on the
# target machine. The mkDefault values below only exist so the flake
# evaluates and `nix flake check` passes before first install.
{ lib, ... }:
{
boot.initrd.availableKernelModules = lib.mkDefault [ "xhci_pci" "ahci" "nvme" "usbhid" "sd_mod" ];
fileSystems."/" = lib.mkDefault {
device = "/dev/disk/by-label/nixos";
fsType = "ext4";
};
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
}

85
hosts/live.nix Normal file
View File

@@ -0,0 +1,85 @@
# Live ISO host — boot the full Nomarchy desktop from a USB stick or QEMU
# without touching the disk. No installer yet (see roadmap); this target
# exists to test the distro end-to-end on real hardware.
{ lib, pkgs, username, nomarchySrc, ... }:
{
networking.hostName = "nomarchy-live";
isoImage.volumeID = lib.mkForce "NOMARCHY_LIVE";
isoImage.edition = lib.mkForce "live";
# The minimal-CD profile enables wpa_supplicant; Nomarchy ships
# NetworkManager and the two must not run together.
networking.wireless.enable = lib.mkForce false;
# ── Live user: no password, straight into the desktop ──────────────
users.users.${username} = {
isNormalUser = true;
initialHashedPassword = "";
extraGroups = [ "wheel" "networkmanager" "video" "render" "audio" "input" ];
};
security.sudo.wheelNeedsPassword = false;
services.getty.autologinUser = lib.mkForce username;
# Boot straight into Hyprland once; logging out lands on tuigreet.
services.greetd.settings.initial_session = {
command = "Hyprland";
user = username;
};
# ── Hardware breadth ────────────────────────────────────────────────
# Force-loading every GPU driver in the initrd (amdgpu+radeon+nouveau+
# i915) panics most machines — only one of them can claim the GPU and
# the others explode. `availableKernelModules` lets udev load just the
# one that matches; virtio_gpu covers QEMU (tools/test-live-iso.sh).
boot.initrd.availableKernelModules = [ "amdgpu" "radeon" "nouveau" "i915" "virtio_gpu" ];
services.qemuGuest.enable = lib.mkDefault true;
# ── The Nomarchy flake on board ─────────────────────────────────────
# Read-only copy in /etc (also pins the flake source into the ISO
# closure); seeded writable into the live home so theme switching —
# state write + `home-manager switch` — works exactly like on an
# installed system. $NOMARCHY_PATH already defaults to ~/.nomarchy.
environment.etc."nomarchy".source = nomarchySrc;
systemd.services.nomarchy-seed-flake = {
description = "Seed a writable Nomarchy flake into the live user's home";
wantedBy = [ "multi-user.target" ];
serviceConfig.Type = "oneshot";
script = ''
home=/home/${username}
if [ ! -e "$home/.nomarchy" ]; then
cp -r ${nomarchySrc} "$home/.nomarchy"
chmod -R u+w "$home/.nomarchy"
chown -R ${username}:users "$home/.nomarchy"
fi
'';
};
services.getty.helpLine = lib.mkForce ''
Welcome to the Nomarchy live environment.
The graphical session autologins as '${username}' (no password).
Theme switching: nomarchy-theme-sync apply <name> (or SUPER+T)
Wallpapers: nomarchy-theme-sync bg next (or SUPER+SHIFT+T)
The flake lives at ~/.nomarchy.
'';
# ── Live-session desktop tweaks ─────────────────────────────────────
home-manager.users.${username} = {
wayland.windowManager.hyprland.settings = {
# QEMU (and some panels) report a tiny "preferred" mode; ask for
# the highest resolution instead.
monitor = lib.mkForce [ ",highres,auto,1" ];
# Welcome toast once the session is up (concatenated onto the
# base exec-once list).
exec-once = [
"sh -c 'sleep 3; notify-send -a Nomarchy \"Welcome to Nomarchy\" \"SUPER+Return terminal · SUPER+T themes · SUPER+SHIFT+T wallpaper\"'"
];
};
};
system.stateVersion = "26.05";
}

61
modules/home/btop.nix Normal file
View File

@@ -0,0 +1,61 @@
# btop — themed from per-theme assets, baked at eval time.
# A hand-made themes/<slug>/btop.theme asset wins; otherwise a theme is
# generated from the palette, so custom themes get a themed btop too.
{ config, lib, ... }:
let
t = config.nomarchy.theme;
c = t.colors;
asset = config.nomarchy.themesDir + "/${t.slug}/btop.theme";
generated =
let
pairs = {
main_bg = c.base;
main_fg = c.text;
title = c.text;
hi_fg = c.accent;
selected_bg = c.overlay;
selected_fg = c.text;
inactive_fg = c.muted;
graph_text = c.subtext;
meter_bg = c.surface;
proc_misc = c.accentAlt;
cpu_box = c.accent;
mem_box = c.good;
net_box = c.accentAlt;
proc_box = c.surface;
div_line = c.overlay;
temp_start = c.good;
temp_mid = c.warn;
temp_end = c.bad;
cpu_start = c.good;
cpu_mid = c.warn;
cpu_end = c.bad;
free_start = c.good;
used_start = c.warn;
download_start = c.accent;
upload_start = c.accentAlt;
};
in
lib.concatStringsSep "\n"
(lib.mapAttrsToList (k: v: "theme[${k}]=\"${v}\"") pairs) + "\n";
in
{
config = lib.mkIf config.nomarchy.btop.enable {
programs.btop = {
enable = true;
settings = {
color_theme = "nomarchy";
theme_background = false; # let the terminal's opacity show through
vim_keys = true;
};
};
xdg.configFile."btop/themes/nomarchy.theme" =
if builtins.pathExists asset
then { source = asset; }
else { text = generated; };
};
}

36
modules/home/default.nix Normal file
View File

@@ -0,0 +1,36 @@
# Nomarchy — Home Manager entry point.
# Consume this via homeModules.nomarchy (flake.nix), which also pulls in
# the stylix home module that stylix.nix configures.
{ config, pkgs, ... }:
{
imports = [
./options.nix # the nomarchy.* option surface
./theme.nix # ingests theme-state.json, owns the live-sync hooks
./stylix.nix # GTK/Qt/cursor/fonts from the same JSON
./hyprland.nix
./waybar.nix
./ghostty.nix
./btop.nix
];
home.stateVersion = "26.05";
home.packages = with pkgs; [
swww # wallpaper daemon with animated transitions
fuzzel # launcher / dmenu (used by the theme picker bind)
libnotify
];
home.sessionVariables = {
TERMINAL = config.nomarchy.terminal;
NIXOS_OZONE_WL = "1"; # Electron/Chromium native Wayland
# Where the Nomarchy flake (and therefore theme-state.json) lives on
# disk. nomarchy-theme-sync writes its state here; rebuilds read from
# here. Clone/symlink your flake to this path.
NOMARCHY_PATH = "$HOME/.nomarchy";
};
programs.home-manager.enable = true;
}

41
modules/home/ghostty.nix Normal file
View File

@@ -0,0 +1,41 @@
# Ghostty — Nomarchy's default terminal, themed from theme-state.json.
# Colors, fonts and the full 16-color ANSI palette are baked from the
# JSON at eval time.
{ config, lib, ... }:
let
t = config.nomarchy.theme;
c = t.colors;
in
{
programs.ghostty = lib.mkIf config.nomarchy.ghostty.enable {
enable = true;
enableBashIntegration = true;
settings = {
# ── Typography (from theme-state.json) ────────────────────────
font-family = t.fonts.mono;
font-size = t.fonts.size;
# ── Colors (from theme-state.json) ────────────────────────────
background = c.base;
foreground = c.text;
cursor-color = c.accent;
selection-background = c.overlay;
selection-foreground = c.text;
split-divider-color = c.surface;
# "N=#rrggbb" entries; Ghostty accepts repeated `palette` keys,
# which the HM module renders from this list.
palette = lib.imap0 (i: color: "${toString i}=${color}") t.ansi;
# ── Chrome ────────────────────────────────────────────────────
background-opacity = t.ui.terminalOpacity;
window-padding-x = 12;
window-padding-y = 12;
window-decoration = false;
gtk-single-instance = true;
confirm-close-surface = false;
};
};
}

140
modules/home/hyprland.nix Normal file
View File

@@ -0,0 +1,140 @@
# Hyprland — fully driven by config.nomarchy.theme (theme-state.json).
# Gaps, borders and colors are baked from the JSON at eval time; theme
# changes arrive via `home-manager switch`.
{ config, lib, ... }:
let
t = config.nomarchy.theme;
c = t.colors;
inherit (config.nomarchy.lib) rgb rgba;
# SUPER+1..9 / SUPER+SHIFT+1..9 workspace binds, generated.
workspaceBinds = builtins.concatLists (builtins.genList
(i:
let ws = toString (i + 1);
in [
"$mod, ${ws}, workspace, ${ws}"
"$mod SHIFT, ${ws}, movetoworkspace, ${ws}"
])
9);
in
{
wayland.windowManager.hyprland = lib.mkIf config.nomarchy.hyprland.enable {
enable = true;
# The binary and portal come from the NixOS module
# (programs.hyprland.enable); HM only manages configuration.
package = null;
portalPackage = null;
settings = {
"$mod" = "SUPER";
"$terminal" = config.nomarchy.terminal;
monitor = [ ",preferred,auto,1" ];
exec-once = [
"swww-daemon"
# Paint the wallpaper as soon as the session is up (waits for
# swww-daemon internally).
"nomarchy-theme-sync wallpaper"
];
# ── Theme-driven look ──────────────────────────────────────────
general = {
gaps_in = t.ui.gapsIn;
gaps_out = t.ui.gapsOut;
border_size = t.ui.borderSize;
"col.active_border" = "${rgb c.accent} ${rgb c.accentAlt} 45deg";
"col.inactive_border" = rgb c.overlay;
layout = "dwindle";
resize_on_border = true;
};
decoration = {
rounding = t.ui.rounding;
active_opacity = t.ui.activeOpacity;
inactive_opacity = t.ui.inactiveOpacity;
blur = {
enabled = t.ui.blur;
size = 8;
passes = 2;
popups = true;
};
shadow = {
enabled = t.ui.shadow;
range = 20;
render_power = 3;
color = rgba c.mantle "aa";
};
};
animations = {
enabled = true;
bezier = [
"smooth, 0.25, 0.1, 0.25, 1.0"
"snappy, 0.6, 0.0, 0.1, 1.0"
];
animation = [
"windows, 1, 4, snappy, popin 85%"
"border, 1, 8, smooth"
"fade, 1, 5, smooth"
"workspaces, 1, 4, snappy, slidefade 15%"
];
};
# ── Behaviour ──────────────────────────────────────────────────
input = {
kb_layout = "us";
follow_mouse = 1;
touchpad.natural_scroll = true;
};
dwindle = {
pseudotile = true;
preserve_split = true;
};
misc = {
disable_hyprland_logo = true;
force_default_wallpaper = 0;
};
bind = [
"$mod, Return, exec, $terminal"
"$mod, D, exec, fuzzel"
"$mod, Q, killactive"
"$mod, F, fullscreen"
"$mod, V, togglefloating"
"$mod SHIFT, E, exit"
# Theme picker: fuzzel menu over the presets; apply writes the
# state and runs home-manager switch (progress via notify-send).
"$mod, T, exec, nomarchy-theme-sync apply \"$(nomarchy-theme-sync list | fuzzel --dmenu --prompt 'theme> ')\""
# Cycle the current theme's wallpapers (instant, no rebuild).
"$mod SHIFT, T, exec, nomarchy-theme-sync bg next"
# Focus
"$mod, H, movefocus, l"
"$mod, L, movefocus, r"
"$mod, K, movefocus, u"
"$mod, J, movefocus, d"
# Screenshot region to clipboard
", Print, exec, grim -g \"$(slurp)\" - | wl-copy"
] ++ workspaceBinds;
binde = [
", XF86AudioRaiseVolume, exec, pamixer -i 5"
", XF86AudioLowerVolume, exec, pamixer -d 5"
", XF86AudioMute, exec, pamixer -t"
", XF86MonBrightnessUp, exec, brightnessctl set +5%"
", XF86MonBrightnessDown, exec, brightnessctl set 5%-"
];
bindm = [
"$mod, mouse:272, movewindow"
"$mod, mouse:273, resizewindow"
];
};
};
}

64
modules/home/options.nix Normal file
View File

@@ -0,0 +1,64 @@
# User-level `nomarchy.*` options — the full surface downstream users
# configure in their home.nix. Kept small on purpose.
{ lib, pkgs, ... }:
{
options.nomarchy = {
# ── Required ───────────────────────────────────────────────────
stateFile = lib.mkOption {
type = lib.types.path;
example = lib.literalExpression "./theme-state.json";
description = ''
Path to theme-state.json, the single source of truth for all UI
configuration. Must live inside your flake (so evaluation stays
pure) and be git-tracked. nomarchy-theme-sync writes to the
on-disk copy; rebuilds bake it into the generation.
'';
};
# ── Preferences ────────────────────────────────────────────────
terminal = lib.mkOption {
type = lib.types.str;
default = "ghostty";
description = "Terminal emulator command, used by keybinds and $TERMINAL.";
};
package = lib.mkOption {
type = lib.types.package;
default = pkgs.nomarchy-theme-sync;
defaultText = lib.literalExpression "pkgs.nomarchy-theme-sync";
description = "The nomarchy-theme-sync package (provided by overlays.default).";
};
themesDir = lib.mkOption {
type = lib.types.path;
default = ../../themes;
defaultText = lib.literalExpression "\"\${nomarchy}/themes\"";
description = ''
Theme presets/assets directory probed at eval time for per-theme
app overrides (<slug>/waybar.css, <slug>/waybar.jsonc). Point it
at your own directory to ship custom layouts downstream.
'';
};
# ── Component toggles ──────────────────────────────────────────
hyprland.enable = lib.mkEnableOption "Nomarchy's Hyprland configuration" // { default = true; };
waybar.enable = lib.mkEnableOption "Nomarchy's Waybar configuration" // { default = true; };
ghostty.enable = lib.mkEnableOption "Nomarchy's Ghostty configuration" // { default = true; };
btop.enable = lib.mkEnableOption "btop with the per-theme nomarchy theme" // { default = true; };
stylix.enable = lib.mkEnableOption "Stylix theming for the long tail of apps (GTK, Qt, cursors)" // { default = true; };
# ── Computed (read-only) ───────────────────────────────────────
theme = lib.mkOption {
type = lib.types.attrs;
readOnly = true;
description = "The parsed theme state (stateFile merged over defaults).";
};
lib = lib.mkOption {
type = lib.types.attrs;
readOnly = true;
description = "Color-format helpers shared by the theme consumers.";
};
};
}

79
modules/home/stylix.nix Normal file
View File

@@ -0,0 +1,79 @@
# Stylix — themes the long tail of applications (GTK, Qt, cursors,
# fonts) from the same theme-state.json that drives the live engine.
#
# Division of labour: the hot-reload trio (Hyprland, Waybar, Ghostty)
# is owned by the Nomarchy engine and updates instantly; everything
# Stylix touches updates on the next home-manager switch. That is why
# autoEnable is off and the trio's Stylix targets stay disabled.
#
# Note: the stylix home module itself is imported by homeModules.nomarchy
# in flake.nix (it needs the stylix flake input).
{ config, lib, pkgs, ... }:
let
cfg = config.nomarchy;
t = cfg.theme;
c = t.colors;
hex = lib.removePrefix "#";
# Map the Nomarchy palette onto base16 roles.
base16 = {
base00 = hex c.base; # default background
base01 = hex c.mantle; # darker background (status bars)
base02 = hex c.surface; # selection background
base03 = hex c.muted; # comments
base04 = hex c.subtext; # dark foreground
base05 = hex c.text; # default foreground
base06 = hex c.text; # light foreground
base07 = hex c.text; # lightest foreground
base08 = hex c.bad; # red
base09 = hex c.warn; # orange
base0A = hex c.warn; # yellow
base0B = hex c.good; # green
base0C = hex (builtins.elemAt t.ansi 6); # cyan
base0D = hex c.accent; # blue
base0E = hex c.accentAlt;# magenta
base0F = hex c.bad; # brown/deprecated
};
in
{
config = lib.mkIf cfg.stylix.enable {
stylix = {
enable = true;
autoEnable = false; # explicit targets only — the engine owns the rest
polarity = if t.mode == "light" then "light" else "dark";
base16Scheme = base16;
targets = {
gtk.enable = true;
qt.enable = true;
};
cursor = {
name = lib.mkDefault "Bibata-Modern-Classic";
package = lib.mkDefault pkgs.bibata-cursors;
size = lib.mkDefault 24;
};
fonts = {
monospace = {
name = t.fonts.mono;
package = lib.mkDefault pkgs.nerd-fonts.jetbrains-mono;
};
sansSerif = {
name = t.fonts.ui;
package = lib.mkDefault pkgs.inter;
};
serif = {
name = t.fonts.ui;
package = lib.mkDefault pkgs.inter;
};
emoji = {
name = "Noto Color Emoji";
package = lib.mkDefault pkgs.noto-fonts-color-emoji;
};
sizes.terminal = t.fonts.size;
};
};
};
}

69
modules/home/theme.nix Normal file
View File

@@ -0,0 +1,69 @@
# Nomarchy theming engine.
#
# nomarchy.stateFile (theme-state.json, inside the consuming flake) is
# ingested at evaluation time — pure, because flake files are store
# paths — and exposed to every other module as `config.nomarchy.theme`.
#
# Theme changes are fully Home Manager managed: `nomarchy-theme-sync
# apply <theme>` writes the JSON and runs `home-manager switch`, baking
# everything (Hyprland, Waybar, Ghostty, btop, Stylix) into one
# read-only generation. No runtime patching, no partial states; theme
# history is generation history.
#
# The one runtime exception is the wallpaper (swww is imperative by
# nature): applied at session start, after every switch (hook below),
# and cycled instantly with `nomarchy-theme-sync bg next`.
{ config, lib, pkgs, ... }:
let
cfg = config.nomarchy;
themeState = builtins.fromJSON (builtins.readFile cfg.stateFile);
# Defaults guarantee evaluation succeeds on a sparse or older state
# file (e.g. one written before a schema field was added). The shipped
# Tokyo Night preset provides the color/ansi fallbacks; the path is
# relative to this module, so it resolves inside Nomarchy's own flake
# source even when consumed downstream.
preset = builtins.fromJSON (builtins.readFile ../../themes/tokyo-night.json);
defaults = preset // {
fonts = {
mono = "JetBrainsMono Nerd Font";
ui = "Inter";
size = 11;
};
ui = {
gapsIn = 5;
gapsOut = 12;
borderSize = 2;
rounding = 10;
activeOpacity = 1.0;
inactiveOpacity = 0.95;
terminalOpacity = 0.96;
blur = true;
shadow = true;
};
};
in
{
config = {
nomarchy.theme = lib.recursiveUpdate defaults themeState;
nomarchy.lib = {
# "#7aa2f7" -> "rgb(7aa2f7)" (Hyprland color syntax)
rgb = c: "rgb(${lib.removePrefix "#" c})";
# "#16161e" -> "rgba(16161eaa)" (Hyprland color + hex alpha)
rgba = c: alpha: "rgba(${lib.removePrefix "#" c}${alpha})";
};
home.packages = [ cfg.package ];
# After a switch the new theme's wallpaper should show without
# logging out. Best-effort: outside a graphical session swww isn't
# running and this is a no-op.
home.activation.nomarchyWallpaper = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
run ${lib.getExe cfg.package} --quiet wallpaper || true
'';
};
}

155
modules/home/waybar.nix Normal file
View File

@@ -0,0 +1,155 @@
# Waybar — two-tier theming:
#
# 1. Default: structure, fonts, geometry AND palette baked from
# theme-state.json (colors as GTK named colors, @define-color).
#
# 2. Whole-swap: themes with their own visual identity ship
# <themesDir>/<slug>/waybar.css (and optionally waybar.jsonc) which
# replace the generated style/layout entirely. Probed at eval time —
# pure, it's flake source.
{ config, lib, ... }:
let
t = config.nomarchy.theme;
# Per-theme override probe.
assetDir = config.nomarchy.themesDir + "/${t.slug}";
styleOverride = assetDir + "/waybar.css";
configOverride = assetDir + "/waybar.jsonc";
hasStyleOverride = builtins.pathExists styleOverride;
hasConfigOverride = builtins.pathExists configOverride;
# The palette as GTK named colors, straight from the JSON.
colorDefs = lib.concatStringsSep "\n"
(lib.mapAttrsToList (name: value: "@define-color ${name} ${value};") t.colors);
generatedSettings = {
layer = "top";
position = "top";
height = 34;
margin-top = t.ui.gapsOut;
margin-left = t.ui.gapsOut;
margin-right = t.ui.gapsOut;
spacing = 8;
# waybar re-reads style.css when it changes on disk, so a
# home-manager switch restyles the running bar without a restart.
reload_style_on_change = true;
modules-left = [ "hyprland/workspaces" "hyprland/window" ];
modules-center = [ "clock" ];
modules-right = [ "tray" "pulseaudio" "network" "cpu" "memory" "battery" ];
"hyprland/workspaces" = {
format = "{icon}";
on-click = "activate";
};
"hyprland/window" = {
max-length = 48;
separate-outputs = true;
};
clock = {
format = "{:%H:%M}";
format-alt = "{:%A %d %B %Y}";
tooltip-format = "<tt><small>{calendar}</small></tt>";
};
pulseaudio = {
format = "{icon} {volume}%";
format-muted = "󰝟";
format-icons.default = [ "󰕿" "󰖀" "󰕾" ];
on-click = "pamixer -t";
};
network = {
format-wifi = "󰤨 {essid}";
format-ethernet = "󰈀";
format-disconnected = "󰤭";
tooltip-format = "{ipaddr} via {gwaddr}";
};
cpu.format = "󰍛 {usage}%";
memory.format = "󰾆 {percentage}%";
battery = {
states = { warning = 25; critical = 10; };
format = "{icon} {capacity}%";
format-charging = "󰂄 {capacity}%";
format-icons = [ "󰁺" "󰁼" "󰁾" "󰂀" "󰁹" ];
};
tray.spacing = 8;
};
generatedStyle = ''
/* Palette baked from theme-state.json */
${colorDefs}
* {
font-family: "${t.fonts.ui}", "${t.fonts.mono}";
font-size: ${toString t.fonts.size}pt;
min-height: 0;
}
window#waybar {
background: alpha(@base, 0.85);
color: @text;
border: ${toString t.ui.borderSize}px solid alpha(@accent, 0.4);
border-radius: ${toString t.ui.rounding}px;
}
#workspaces button {
padding: 0 8px;
color: @muted;
border-radius: ${toString t.ui.rounding}px;
}
#workspaces button.active {
color: @base;
background: @accent;
}
#workspaces button.urgent {
color: @base;
background: @bad;
}
#window {
color: @subtext;
padding: 0 12px;
}
#clock {
color: @text;
font-weight: bold;
}
#tray, #pulseaudio, #network, #cpu, #memory, #battery {
color: @subtext;
padding: 0 10px;
}
#pulseaudio.muted { color: @muted; }
#battery.warning { color: @warn; }
#battery.critical { color: @bad; }
#battery.charging { color: @good; }
'';
in
{
programs.waybar = lib.mkIf config.nomarchy.waybar.enable {
enable = true;
systemd.enable = true; # started/stopped with graphical-session.target
settings.mainBar =
if hasConfigOverride
then builtins.fromJSON (builtins.readFile configOverride)
else generatedSettings;
style =
if hasStyleOverride
then builtins.readFile styleOverride
else generatedStyle;
};
}

100
modules/nixos/default.nix Normal file
View File

@@ -0,0 +1,100 @@
# Nomarchy — reusable system layer (NixOS 26.05).
#
# This module is the distro: import it from any host (see
# nixosModules.nomarchy in flake.nix) and layer your machine specifics
# (bootloader, hostname, users, hardware) on top. Host concerns are
# deliberately NOT set here. Everything user-facing (Hyprland config,
# Waybar, Ghostty, theming) lives in modules/home.
{ config, lib, pkgs, ... }:
let
cfg = config.nomarchy.system;
in
{
imports = [ ./options.nix ];
config = {
# ── Wayland session: Hyprland ────────────────────────────────────
# Installs the binary, registers the session, wires up
# xdg-desktop-portal-hyprland. Configuration is Home Manager's job.
programs.hyprland.enable = lib.mkDefault true;
xdg.portal = {
enable = lib.mkDefault true;
extraPortals = [ pkgs.xdg-desktop-portal-gtk ]; # file pickers, etc.
};
services.greetd = lib.mkIf cfg.greeter.enable {
enable = lib.mkDefault true;
settings.default_session = {
command = lib.mkDefault "${pkgs.greetd.tuigreet}/bin/tuigreet --time --remember --cmd Hyprland";
user = "greeter";
};
};
# ── Audio: Pipewire ──────────────────────────────────────────────
security.rtkit.enable = lib.mkDefault cfg.audio.enable;
services.pulseaudio.enable = lib.mkDefault false;
services.pipewire = lib.mkIf cfg.audio.enable {
enable = lib.mkDefault true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
wireplumber.enable = true;
};
# ── Desktop services ─────────────────────────────────────────────
security.polkit.enable = lib.mkDefault true;
services.gnome.gnome-keyring.enable = lib.mkDefault true;
services.dbus.enable = lib.mkDefault true;
services.upower.enable = lib.mkDefault true;
networking.networkmanager.enable = lib.mkDefault true;
hardware.bluetooth.enable = lib.mkDefault cfg.bluetooth.enable;
services.blueman.enable = lib.mkDefault cfg.bluetooth.enable;
# ── Fonts ────────────────────────────────────────────────────────
fonts = {
packages = with pkgs; [
nerd-fonts.jetbrains-mono
inter
noto-fonts
noto-fonts-color-emoji
];
fontconfig.defaultFonts = {
monospace = lib.mkDefault [ "JetBrainsMono Nerd Font" ];
sansSerif = lib.mkDefault [ "Inter" ];
emoji = lib.mkDefault [ "Noto Color Emoji" ];
};
};
# ── Essential packages ───────────────────────────────────────────
environment.systemPackages = with pkgs; [
nomarchy-theme-sync # provided by overlays.default
git
vim
wget
curl
jq
brightnessctl
playerctl
pamixer
wl-clipboard
grim
slurp
];
# ── Nix itself ───────────────────────────────────────────────────
nix = {
settings = {
experimental-features = [ "nix-command" "flakes" ];
auto-optimise-store = lib.mkDefault true;
};
gc = {
automatic = lib.mkDefault true;
dates = lib.mkDefault "weekly";
options = lib.mkDefault "--delete-older-than 14d";
};
};
};
}

14
modules/nixos/options.nix Normal file
View File

@@ -0,0 +1,14 @@
# System-level `nomarchy.system.*` options.
#
# Deliberately small: only things a downstream user plausibly disagrees
# with get a toggle. Everything else in the system module is set with
# lib.mkDefault, so plain NixOS options override it natively.
{ lib, ... }:
{
options.nomarchy.system = {
greeter.enable = lib.mkEnableOption "the greetd/tuigreet login screen" // { default = true; };
audio.enable = lib.mkEnableOption "the Pipewire audio stack" // { default = true; };
bluetooth.enable = lib.mkEnableOption "Bluetooth support with blueman" // { default = true; };
};
}

View File

@@ -0,0 +1,49 @@
{ lib
, stdenvNoCC
, python3
, makeWrapper
, swww
, libnotify
, git
# Shipped theme presets, baked into the package as a fallback so
# `list`/`apply` work even when $NOMARCHY_PATH has no themes/ dir.
, themesDir ? null
}:
stdenvNoCC.mkDerivation {
pname = "nomarchy-theme-sync";
version = "0.4.0";
src = ./.;
nativeBuildInputs = [ makeWrapper ];
buildInputs = [ python3 ];
installPhase = ''
runHook preInstall
install -Dm755 nomarchy-theme-sync.py $out/bin/nomarchy-theme-sync
patchShebangs $out/bin/nomarchy-theme-sync
${lib.optionalString (themesDir != null) ''
mkdir -p $out/share/nomarchy
cp -r ${themesDir} $out/share/nomarchy/themes
''}
# Stdlib-only Python. home-manager is deliberately NOT wrapped in
# the rebuild must use the user's own home-manager from their PATH.
wrapProgram $out/bin/nomarchy-theme-sync \
--prefix PATH : ${lib.makeBinPath [ swww libnotify git ]} \
${lib.optionalString (themesDir != null)
"--set NOMARCHY_DEFAULT_THEMES $out/share/nomarchy/themes"}
runHook postInstall
'';
meta = {
description = "Nomarchy theming: JSON state writer + Home Manager rebuild dispatcher";
license = lib.licenses.mit;
mainProgram = "nomarchy-theme-sync";
platforms = lib.platforms.linux;
};
}

View File

@@ -0,0 +1,327 @@
#!/usr/bin/env python3
"""nomarchy-theme-sync — state writer for Nomarchy's declarative theming.
Single source of truth: $NOMARCHY_PATH/theme-state.json (inside the flake,
read purely by Home Manager via the nomarchy.stateFile option).
Theme changes are applied by Home Manager: this tool writes the new state
and runs `home-manager switch` (override with $NOMARCHY_REBUILD, or skip
with --no-switch). All app theming — Hyprland, Waybar, Ghostty, btop,
Stylix — is baked into the generation; nothing is patched at runtime.
The one runtime exception is the wallpaper: swww is imperative by nature,
so `bg next` cycles instantly and `wallpaper` (re-)applies the current one
at session start and after a switch.
Commands:
list list theme presets
apply <name|file.json> merge a preset into the state + rebuild
set <dotted.path> <value> tweak one key (e.g. `set ui.gapsOut 16`) + rebuild
get [dotted.path] print the current state (or one key)
wallpaper apply the current wallpaper via swww
bg [next|auto] cycle the theme's wallpapers (instant, no rebuild)
"""
import argparse
import json
import os
import shlex
import shutil
import subprocess
import sys
import tempfile
import time
from pathlib import Path
# ─── Paths ────────────────────────────────────────────────────────────────
FLAKE_DIR = Path(os.environ.get("NOMARCHY_PATH", Path.home() / ".nomarchy")).expanduser()
STATE_FILE = FLAKE_DIR / "theme-state.json"
# Preset search path: the user's flake first (their custom themes win),
# then the presets baked into this package by the Nix build.
THEMES_DIRS = [FLAKE_DIR / "themes"]
if os.environ.get("NOMARCHY_DEFAULT_THEMES"):
THEMES_DIRS.append(Path(os.environ["NOMARCHY_DEFAULT_THEMES"]))
WALLPAPER_EXTS = {".png", ".jpg", ".jpeg", ".webp"}
QUIET = False
def log(msg: str) -> None:
if not QUIET:
print(f"nomarchy-theme-sync: {msg}")
def die(msg: str) -> "None":
print(f"nomarchy-theme-sync: error: {msg}", file=sys.stderr)
sys.exit(1)
def notify(body: str) -> None:
if shutil.which("notify-send"):
subprocess.run(["notify-send", "-a", "Nomarchy", "Nomarchy", body],
capture_output=True)
# ─── State management ─────────────────────────────────────────────────────
def load_state(path: Path = STATE_FILE) -> dict:
try:
return json.loads(path.read_text())
except FileNotFoundError:
die(f"state file not found: {path} (set $NOMARCHY_PATH to your flake checkout)")
except json.JSONDecodeError as e:
die(f"invalid JSON in {path}: {e}")
def write_state(state: dict) -> None:
"""Atomic write: render to a temp file in the same dir, then rename."""
STATE_FILE.parent.mkdir(parents=True, exist_ok=True)
fd, tmp = tempfile.mkstemp(dir=STATE_FILE.parent, prefix=".theme-state.", suffix=".json")
try:
with os.fdopen(fd, "w") as f:
json.dump(state, f, indent=2)
f.write("\n")
os.replace(tmp, STATE_FILE)
except BaseException:
os.unlink(tmp)
raise
log(f"state written to {STATE_FILE}")
# Flakes only see git-tracked files. theme-state.json ships tracked,
# but make sure a fresh checkout / reset can't silently hide it.
if (FLAKE_DIR / ".git").exists() and shutil.which("git"):
subprocess.run(
["git", "-C", str(FLAKE_DIR), "add", "--intent-to-add", "theme-state.json"],
capture_output=True,
)
def deep_merge(base: dict, override: dict) -> dict:
out = dict(base)
for k, v in override.items():
if isinstance(v, dict) and isinstance(out.get(k), dict):
out[k] = deep_merge(out[k], v)
else:
out[k] = v
return out
# ─── Rebuild dispatch ─────────────────────────────────────────────────────
def run_switch() -> None:
"""Bake the new state into a Home Manager generation."""
override = os.environ.get("NOMARCHY_REBUILD")
argv = shlex.split(override) if override else \
["home-manager", "switch", "--flake", str(FLAKE_DIR)]
if shutil.which(argv[0]) is None:
log(f"'{argv[0]}' not found — state written; rebuild manually to apply")
return
log(f"rebuilding: {' '.join(argv)}")
notify("Applying theme — rebuilding the desktop…")
result = subprocess.run(argv) # stream output to the caller's terminal
if result.returncode != 0:
notify("Theme rebuild FAILED — see terminal / journal")
die("rebuild failed (state file already updated; fix and re-run)")
notify("Theme applied ✓")
# ─── Theme assets (wallpapers) ────────────────────────────────────────────
# Convention: a preset themes/<slug>.json may have a sibling directory
# themes/<slug>/ with assets: backgrounds/ (wallpapers), btop.theme,
# waybar.css / waybar.jsonc. All except backgrounds/ are consumed by the
# Nix modules at eval time; wallpapers are applied here via swww.
def find_asset(slug: str, name: str):
for themes_dir in THEMES_DIRS:
candidate = themes_dir / slug / name
if candidate.exists():
return candidate
return None
def backgrounds_for(slug: str) -> list:
bg_dir = find_asset(slug, "backgrounds")
if bg_dir is None or not bg_dir.is_dir():
return []
return sorted(p for p in bg_dir.iterdir() if p.suffix.lower() in WALLPAPER_EXTS)
def resolve_wallpaper(state: dict):
"""Explicit path in the state wins; empty means 'first theme background'."""
explicit = state.get("wallpaper", "")
if explicit:
path = Path(explicit).expanduser()
if path.is_file():
return path
log(f"wallpaper not found, using theme default: {explicit}")
backgrounds = backgrounds_for(state.get("slug", ""))
return backgrounds[0] if backgrounds else None
def apply_wallpaper(state: dict, wait: bool = False) -> None:
wallpaper = resolve_wallpaper(state)
if wallpaper is None:
log(f"no wallpaper for theme '{state.get('slug', '?')}', skipping")
return
if shutil.which("swww") is None:
log("swww not found, skipping wallpaper")
return
# At session start swww-daemon may still be coming up.
for _ in range(10 if wait else 1):
if subprocess.run(["swww", "query"], capture_output=True).returncode == 0:
break
time.sleep(0.5)
result = subprocess.run(
["swww", "img", str(wallpaper),
"--transition-type", "grow",
"--transition-pos", "center",
"--transition-duration", "1",
"--transition-fps", "60"],
capture_output=True,
)
log(f"wallpaper: {wallpaper.name}" if result.returncode == 0
else "wallpaper: swww failed (daemon not running?)")
# ─── Commands ─────────────────────────────────────────────────────────────
def find_preset(name: str):
for themes_dir in THEMES_DIRS:
candidate = themes_dir / f"{name}.json"
if candidate.is_file():
return candidate
return None
def cmd_list(_args) -> None:
names = sorted({f.stem for d in THEMES_DIRS if d.is_dir() for f in d.glob("*.json")})
if not names:
die(f"no theme presets found (searched: {', '.join(map(str, THEMES_DIRS))})")
print("\n".join(names))
def cmd_apply(args) -> None:
candidate = Path(args.theme).expanduser()
preset_path = candidate if candidate.is_file() else find_preset(args.theme)
if preset_path is None:
die(f"unknown theme '{args.theme}' (try `nomarchy-theme-sync list`)")
preset = json.loads(preset_path.read_text())
# Merge over current state: presets define palette/name/wallpaper,
# user tweaks (gaps, fonts) outside the preset survive.
state = deep_merge(load_state(), preset)
write_state(state)
log(f"theme: {state.get('name', args.theme)}")
if not args.no_switch:
run_switch()
apply_wallpaper(state)
def cmd_set(args) -> None:
state = load_state()
try:
value = json.loads(args.value) # numbers, bools, null, quoted strings
except json.JSONDecodeError:
value = args.value # bare string ("#7aa2f7", font names, paths)
node = state
keys = args.path.split(".")
for key in keys[:-1]:
node = node.setdefault(key, {})
if not isinstance(node, dict):
die(f"cannot descend into non-object at '{key}' in '{args.path}'")
node[keys[-1]] = value
write_state(state)
log(f"set {args.path} = {value!r}")
if not args.no_switch:
run_switch()
apply_wallpaper(state)
def cmd_get(args) -> None:
state = load_state()
if args.path:
node = state
for key in args.path.split("."):
try:
node = node[key]
except (KeyError, TypeError):
die(f"no such key: {args.path}")
print(json.dumps(node, indent=2) if isinstance(node, (dict, list)) else node)
else:
print(json.dumps(state, indent=2))
def cmd_wallpaper(_args) -> None:
"""Apply the current wallpaper (session start, post-switch hook)."""
apply_wallpaper(load_state(), wait=True)
def cmd_bg(args) -> None:
"""Cycle the theme's wallpapers — instant, no rebuild needed (the
wallpaper is runtime state for swww; nothing in Nix consumes it)."""
state = load_state()
if args.action == "auto":
state["wallpaper"] = ""
else: # next
backgrounds = backgrounds_for(state.get("slug", ""))
if not backgrounds:
die(f"theme '{state.get('slug', '?')}' has no backgrounds/ directory")
current = resolve_wallpaper(state)
idx = (backgrounds.index(current) + 1) % len(backgrounds) if current in backgrounds else 0
state["wallpaper"] = str(backgrounds[idx])
write_state(state)
apply_wallpaper(state)
# ─── Entry point ──────────────────────────────────────────────────────────
def main() -> None:
global QUIET
parser = argparse.ArgumentParser(
prog="nomarchy-theme-sync",
description="Nomarchy theming — state writer + Home Manager rebuild dispatcher.",
)
parser.add_argument("--quiet", action="store_true", help="suppress progress output")
sub = parser.add_subparsers(dest="command", required=True)
sub.add_parser("list", help="list theme presets").set_defaults(func=cmd_list)
p = sub.add_parser("apply", help="apply a theme preset (name or JSON file) + rebuild")
p.add_argument("theme")
p.add_argument("--no-switch", action="store_true", help="write state only, skip the rebuild")
p.set_defaults(func=cmd_apply)
p = sub.add_parser("set", help="set one key, e.g. `set ui.gapsOut 16` + rebuild")
p.add_argument("path")
p.add_argument("value")
p.add_argument("--no-switch", action="store_true", help="write state only, skip the rebuild")
p.set_defaults(func=cmd_set)
p = sub.add_parser("get", help="print state (or one dotted key)")
p.add_argument("path", nargs="?")
p.set_defaults(func=cmd_get)
sub.add_parser("wallpaper", help="apply the current wallpaper via swww").set_defaults(func=cmd_wallpaper)
p = sub.add_parser("bg", help="wallpaper control: `bg next` cycles, `bg auto` resets")
p.add_argument("action", choices=["next", "auto"], default="next", nargs="?")
p.set_defaults(func=cmd_bg)
args = parser.parse_args()
QUIET = args.quiet
try:
args.func(args)
except KeyboardInterrupt:
sys.exit(130)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,22 @@
# My Nomarchy machine
1. `nixos-generate-config --show-hardware-config > hardware-configuration.nix`
2. Edit `flake.nix` (Nomarchy repo URL, username), `system.nix` (hostname,
user), `home.nix` (your packages).
3. `git init && git add -A` — flakes only see tracked files, including
`theme-state.json`.
4. System: `sudo nixos-rebuild switch --flake .#default`
5. Desktop: `nix run home-manager -- switch --flake .#me`
(afterwards just `home-manager switch --flake .#me` — it's installed)
6. Clone/symlink this directory to `~/.nomarchy` (or export
`NOMARCHY_PATH`) so `nomarchy-theme-sync` knows where the state lives.
Day-to-day:
```sh
nomarchy-theme-sync list # 21 shipped presets
nomarchy-theme-sync apply gruvbox # writes state + home-manager switch
nomarchy-theme-sync bg next # cycle wallpapers (instant, no rebuild)
```
The system layer only needs `nixos-rebuild` when you change `system.nix`.

View File

@@ -0,0 +1,53 @@
{
description = "My Nomarchy machine";
inputs = {
# Pin Nomarchy; nixpkgs and home-manager follow whatever it ships.
nomarchy.url = "github:YOUR-USER/nomarchy"; # <- point at the distro repo
nixpkgs.follows = "nomarchy/nixpkgs";
home-manager.follows = "nomarchy/home-manager";
};
outputs = { self, nomarchy, nixpkgs, home-manager, ... }:
let
system = "x86_64-linux";
username = "me"; # <- your login name
pkgs = import nixpkgs {
inherit system;
overlays = [ nomarchy.overlays.default ];
};
in
{
# System layer — rebuilt rarely:
# sudo nixos-rebuild switch --flake .#default
nixosConfigurations.default = nixpkgs.lib.nixosSystem {
inherit system;
modules = [
nomarchy.nixosModules.nomarchy # the distro
./hardware-configuration.nix # from `nixos-generate-config`
./system.nix # your machine
];
};
# Desktop layer — rebuilt on every theme change, no sudo:
# home-manager switch --flake .#me
# (`nomarchy-theme-sync apply <theme>` runs this for you.)
homeConfigurations.${username} = home-manager.lib.homeManagerConfiguration {
inherit pkgs;
modules = [
nomarchy.homeModules.nomarchy
./home.nix
{
# Your theme state — written by nomarchy-theme-sync, baked
# in on every switch. Keep it git-tracked.
nomarchy.stateFile = ./theme-state.json;
home = {
inherit username;
homeDirectory = "/home/${username}";
};
}
];
};
};
}

View File

@@ -0,0 +1,16 @@
# Your user environment. The Nomarchy desktop (Hyprland, Waybar,
# Ghostty, theming engine, Stylix) comes from homeModules.nomarchy;
# tune it via the nomarchy.* options, add your own packages and
# programs below.
{ pkgs, ... }:
{
# Examples:
# nomarchy.terminal = "kitty"; # swap the default terminal
# nomarchy.waybar.enable = false; # bring your own bar
# nomarchy.stylix.enable = false; # opt out of GTK/Qt theming
home.packages = with pkgs; [
# firefox
];
}

View File

@@ -0,0 +1,25 @@
# Your machine: bootloader, hostname, users, services.
# The distro itself comes from nomarchy.nixosModules.nomarchy — override
# any of its defaults here with plain NixOS options (they use mkDefault),
# or via the nomarchy.system.* toggles.
{ pkgs, ... }:
{
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
networking.hostName = "my-nomarchy";
time.timeZone = "UTC";
i18n.defaultLocale = "en_US.UTF-8";
users.users.me = { # <- keep in sync with `username` in flake.nix
isNormalUser = true;
extraGroups = [ "wheel" "networkmanager" "video" "input" ];
};
# Examples:
# nomarchy.system.greeter.enable = false; # bring your own login manager
# environment.systemPackages = [ pkgs.htop ];
system.stateVersion = "26.05";
}

View File

@@ -0,0 +1,55 @@
{
"version": 1,
"name": "Tokyo Night",
"slug": "tokyo-night",
"mode": "dark",
"wallpaper": "",
"colors": {
"base": "#1a1b26",
"mantle": "#161720",
"surface": "#32344a",
"overlay": "#444b6a",
"text": "#a9b1d6",
"subtext": "#787c99",
"muted": "#444b6a",
"accent": "#7aa2f7",
"accentAlt": "#ad8ee6",
"good": "#9ece6a",
"warn": "#e0af68",
"bad": "#f7768e"
},
"ansi": [
"#32344a",
"#f7768e",
"#9ece6a",
"#e0af68",
"#7aa2f7",
"#ad8ee6",
"#449dab",
"#787c99",
"#444b6a",
"#ff7a93",
"#b9f27c",
"#ff9e64",
"#7da6ff",
"#bb9af7",
"#0db9d7",
"#acb0d0"
],
"fonts": {
"mono": "JetBrainsMono Nerd Font",
"ui": "Inter",
"size": 11
},
"ui": {
"gapsIn": 5,
"gapsOut": 12,
"borderSize": 2,
"rounding": 10,
"activeOpacity": 1.0,
"inactiveOpacity": 0.95,
"terminalOpacity": 0.96,
"blur": true,
"shadow": true
}
}

55
theme-state.json Normal file
View File

@@ -0,0 +1,55 @@
{
"version": 1,
"name": "Tokyo Night",
"slug": "tokyo-night",
"mode": "dark",
"wallpaper": "",
"colors": {
"base": "#1a1b26",
"mantle": "#161720",
"surface": "#32344a",
"overlay": "#444b6a",
"text": "#a9b1d6",
"subtext": "#787c99",
"muted": "#444b6a",
"accent": "#7aa2f7",
"accentAlt": "#ad8ee6",
"good": "#9ece6a",
"warn": "#e0af68",
"bad": "#f7768e"
},
"ansi": [
"#32344a",
"#f7768e",
"#9ece6a",
"#e0af68",
"#7aa2f7",
"#ad8ee6",
"#449dab",
"#787c99",
"#444b6a",
"#ff7a93",
"#b9f27c",
"#ff9e64",
"#7da6ff",
"#bb9af7",
"#0db9d7",
"#acb0d0"
],
"fonts": {
"mono": "JetBrainsMono Nerd Font",
"ui": "Inter",
"size": 11
},
"ui": {
"gapsIn": 5,
"gapsOut": 12,
"borderSize": 2,
"rounding": 10,
"activeOpacity": 1.0,
"inactiveOpacity": 0.95,
"terminalOpacity": 0.96,
"blur": true,
"shadow": true
}
}

View File

@@ -0,0 +1,39 @@
{
"version": 1,
"name": "Catppuccin Latte",
"slug": "catppuccin-latte",
"mode": "light",
"wallpaper": "",
"colors": {
"base": "#eff1f5",
"mantle": "#cbcdd0",
"surface": "#bcc0cc",
"overlay": "#acb0be",
"text": "#4c4f69",
"subtext": "#5c5f77",
"muted": "#acb0be",
"accent": "#1e66f5",
"accentAlt": "#ea76cb",
"good": "#40a02b",
"warn": "#df8e1d",
"bad": "#d20f39"
},
"ansi": [
"#bcc0cc",
"#d20f39",
"#40a02b",
"#df8e1d",
"#1e66f5",
"#ea76cb",
"#179299",
"#5c5f77",
"#acb0be",
"#d20f39",
"#40a02b",
"#df8e1d",
"#1e66f5",
"#ea76cb",
"#179299",
"#6c6f85"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 652 KiB

View File

@@ -0,0 +1,84 @@
# https://github.com/catppuccin/btop/blob/main/themes/catppuccin_latte.theme
# Main background, empty for terminal default, need to be empty if you want transparent background
theme[main_bg]="#eff1f5"
# Main text color
theme[main_fg]="#4c4f69"
# Title color for boxes
theme[title]="#4c4f69"
# Highlight color for keyboard shortcuts
theme[hi_fg]="#1e66f5"
# Background color of selected item in processes box
theme[selected_bg]="#bcc0cc"
# Foreground color of selected item in processes box
theme[selected_fg]="#1e66f5"
# Color of inactive/disabled text
theme[inactive_fg]="#8c8fa1"
# Color of text appearing on top of graphs, i.e uptime and current network graph scaling
theme[graph_text]="#dc8a78"
# Background color of the percentage meters
theme[meter_bg]="#bcc0cc"
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
theme[proc_misc]="#dc8a78"
# CPU, Memory, Network, Proc box outline colors
theme[cpu_box]="#8839ef" #Mauve
theme[mem_box]="#40a02b" #Green
theme[net_box]="#e64553" #Maroon
theme[proc_box]="#1e66f5" #Blue
# Box divider line and small boxes line color
theme[div_line]="#9ca0b0"
# Temperature graph color (Green -> Yellow -> Red)
theme[temp_start]="#40a02b"
theme[temp_mid]="#df8e1d"
theme[temp_end]="#d20f39"
# CPU graph colors (Teal -> Lavender)
theme[cpu_start]="#179299"
theme[cpu_mid]="#209fb5"
theme[cpu_end]="#7287fd"
# Mem/Disk free meter (Mauve -> Lavender -> Blue)
theme[free_start]="#8839ef"
theme[free_mid]="#7287fd"
theme[free_end]="#1e66f5"
# Mem/Disk cached meter (Sapphire -> Lavender)
theme[cached_start]="#209fb5"
theme[cached_mid]="#1e66f5"
theme[cached_end]="#7287fd"
# Mem/Disk available meter (Peach -> Red)
theme[available_start]="#fe640b"
theme[available_mid]="#e64553"
theme[available_end]="#d20f39"
# Mem/Disk used meter (Green -> Sky)
theme[used_start]="#40a02b"
theme[used_mid]="#179299"
theme[used_end]="#04a5e5"
# Download graph colors (Peach -> Red)
theme[download_start]="#fe640b"
theme[download_mid]="#e64553"
theme[download_end]="#d20f39"
# Upload graph colors (Green -> Sky)
theme[upload_start]="#40a02b"
theme[upload_mid]="#179299"
theme[upload_end]="#04a5e5"
# Process box color gradient for threads, mem and cpu usage (Sapphire -> Mauve)
theme[process_start]="#209fb5"
theme[process_mid]="#7287fd"
theme[process_end]="#8839ef"

39
themes/catppuccin.json Normal file
View File

@@ -0,0 +1,39 @@
{
"version": 1,
"name": "Catppuccin",
"slug": "catppuccin",
"mode": "dark",
"wallpaper": "",
"colors": {
"base": "#1e1e2e",
"mantle": "#1a1a27",
"surface": "#45475a",
"overlay": "#585b70",
"text": "#cdd6f4",
"subtext": "#bac2de",
"muted": "#585b70",
"accent": "#89b4fa",
"accentAlt": "#f5c2e7",
"good": "#a6e3a1",
"warn": "#f9e2af",
"bad": "#f38ba8"
},
"ansi": [
"#45475a",
"#f38ba8",
"#a6e3a1",
"#f9e2af",
"#89b4fa",
"#f5c2e7",
"#94e2d5",
"#bac2de",
"#585b70",
"#f38ba8",
"#a6e3a1",
"#f9e2af",
"#89b4fa",
"#f5c2e7",
"#94e2d5",
"#a6adc8"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

View File

@@ -0,0 +1,83 @@
# Main background, empty for terminal default, need to be empty if you want transparent background
theme[main_bg]="#1E1E2E"
# Main text color
theme[main_fg]="#c6d0f5"
# Title color for boxes
theme[title]="#c6d0f5"
# Highlight color for keyboard shortcuts
theme[hi_fg]="#8caaee"
# Background color of selected item in processes box
theme[selected_bg]="#51576d"
# Foreground color of selected item in processes box
theme[selected_fg]="#8caaee"
# Color of inactive/disabled text
theme[inactive_fg]="#838ba7"
# Color of text appearing on top of graphs, i.e uptime and current network graph scaling
theme[graph_text]="#f2d5cf"
# Background color of the percentage meters
theme[meter_bg]="#51576d"
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
theme[proc_misc]="#f2d5cf"
# CPU, Memory, Network, Proc box outline colors
theme[cpu_box]="#ca9ee6" #Mauve
theme[mem_box]="#a6d189" #Green
theme[net_box]="#ea999c" #Maroon
theme[proc_box]="#8caaee" #Blue
# Box divider line and small boxes line color
theme[div_line]="#737994"
# Temperature graph color (Green -> Yellow -> Red)
theme[temp_start]="#a6d189"
theme[temp_mid]="#e5c890"
theme[temp_end]="#e78284"
# CPU graph colors (Teal -> Lavender)
theme[cpu_start]="#81c8be"
theme[cpu_mid]="#85c1dc"
theme[cpu_end]="#babbf1"
# Mem/Disk free meter (Mauve -> Lavender -> Blue)
theme[free_start]="#ca9ee6"
theme[free_mid]="#babbf1"
theme[free_end]="#8caaee"
# Mem/Disk cached meter (Sapphire -> Lavender)
theme[cached_start]="#85c1dc"
theme[cached_mid]="#8caaee"
theme[cached_end]="#babbf1"
# Mem/Disk available meter (Peach -> Red)
theme[available_start]="#ef9f76"
theme[available_mid]="#ea999c"
theme[available_end]="#e78284"
# Mem/Disk used meter (Green -> Sky)
theme[used_start]="#a6d189"
theme[used_mid]="#81c8be"
theme[used_end]="#99d1db"
# Download graph colors (Peach -> Red)
theme[download_start]="#ef9f76"
theme[download_mid]="#ea999c"
theme[download_end]="#e78284"
# Upload graph colors (Green -> Sky)
theme[upload_start]="#a6d189"
theme[upload_mid]="#81c8be"
theme[upload_end]="#99d1db"
# Process box color gradient for threads, mem and cpu usage (Sapphire -> Mauve)
theme[process_start]="#85c1dc"
theme[process_mid]="#babbf1"
theme[process_end]="#ca9ee6"

View File

@@ -0,0 +1,2 @@
@define-color foreground #cdd6f4;
@define-color background #181824;

39
themes/ethereal.json Normal file
View File

@@ -0,0 +1,39 @@
{
"version": 1,
"name": "Ethereal",
"slug": "ethereal",
"mode": "dark",
"wallpaper": "",
"colors": {
"base": "#060B1E",
"mantle": "#05091a",
"surface": "#060B1E",
"overlay": "#6d7db6",
"text": "#ffcead",
"subtext": "#F99957",
"muted": "#6d7db6",
"accent": "#7d82d9",
"accentAlt": "#c89dc1",
"good": "#92a593",
"warn": "#E9BB4F",
"bad": "#ED5B5A"
},
"ansi": [
"#060B1E",
"#ED5B5A",
"#92a593",
"#E9BB4F",
"#7d82d9",
"#c89dc1",
"#a3bfd1",
"#F99957",
"#6d7db6",
"#faaaa9",
"#c4cfc4",
"#f7dc9c",
"#c2c4f0",
"#ead7e7",
"#dfeaf0",
"#ffcead"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 MiB

View File

@@ -0,0 +1,70 @@
# Main background, empty for terminal default, need to be empty if you want transparent background
theme[main_bg]="#060B1E"
# Main text color
theme[main_fg]="#ffcead"
# Title color for boxes
theme[title]="#c89dc1"
# Highlight color for keyboard shortcuts
theme[hi_fg]="#a3bfd1"
# Background color of selected item in processes box
theme[selected_bg]="#6d7db6"
# Foreground color of selected item in processes box
theme[selected_fg]="#ffcead"
# Color of inactive/disabled text
theme[inactive_fg]="#6d7db6"
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
theme[proc_misc]="#c89dc1"
# Box outline and divider line color
theme[cpu_box]="#92a593"
theme[mem_box]="#92a593"
theme[net_box]="#92a593"
theme[proc_box]="#92a593"
theme[div_line]="#6d7db6"
# Gradient for all meters and graphs
theme[temp_start]="#a3bfd1"
theme[temp_mid]="#7d82d9"
theme[temp_end]="#92a593"
theme[cpu_start]="#a3bfd1"
theme[cpu_mid]="#7d82d9"
theme[cpu_end]="#92a593"
theme[free_start]="#7d82d9"
theme[free_mid]="#E9BB4F"
theme[free_end]="#E9BB4F"
theme[cached_start]="#E9BB4F"
theme[cached_mid]="#E9BB4F"
theme[cached_end]="#E9BB4F"
theme[available_start]="#a3bfd1"
theme[available_mid]="#a3bfd1"
theme[available_end]="#a3bfd1"
theme[used_start]="#92a593"
theme[used_mid]="#92a593"
theme[used_end]="#92a593"
theme[download_start]="#E9BB4F"
theme[download_mid]="#a3bfd1"
theme[download_end]="#7d82d9"
theme[upload_start]="#E9BB4F"
theme[upload_mid]="#a3bfd1"
theme[upload_end]="#7d82d9"

39
themes/everforest.json Normal file
View File

@@ -0,0 +1,39 @@
{
"version": 1,
"name": "Everforest",
"slug": "everforest",
"mode": "dark",
"wallpaper": "",
"colors": {
"base": "#2d353b",
"mantle": "#262d32",
"surface": "#475258",
"overlay": "#475258",
"text": "#d3c6aa",
"subtext": "#d3c6aa",
"muted": "#475258",
"accent": "#7fbbb3",
"accentAlt": "#d699b6",
"good": "#a7c080",
"warn": "#dbbc7f",
"bad": "#e67e80"
},
"ansi": [
"#475258",
"#e67e80",
"#a7c080",
"#dbbc7f",
"#7fbbb3",
"#d699b6",
"#83c092",
"#d3c6aa",
"#475258",
"#e67e80",
"#a7c080",
"#dbbc7f",
"#7fbbb3",
"#d699b6",
"#83c092",
"#d3c6aa"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 KiB

View File

@@ -0,0 +1,92 @@
# 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]="#2d353b"
# Main text color
theme[main_fg]="#d3c6aa"
# Title color for boxes
theme[title]="#d3c6aa"
# Highlight color for keyboard shortcuts
theme[hi_fg]="#e67e80"
# Background color of selected items
theme[selected_bg]="#3d484d"
# Foreground color of selected items
theme[selected_fg]="#dbbc7f"
# Color of inactive/disabled text
theme[inactive_fg]="#2d353b"
# Color of text appearing on top of graphs, i.e uptime and current network graph scaling
theme[graph_text]="#d3c6aa"
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
theme[proc_misc]="#a7c080"
# Cpu box outline color
theme[cpu_box]="#3d484d"
# Memory/disks box outline color
theme[mem_box]="#3d484d"
# Net up/down box outline color
theme[net_box]="#3d484d"
# Processes box outline color
theme[proc_box]="#3d484d"
# Box divider line and small boxes line color
theme[div_line]="#3d484d"
# Temperature graph colors
theme[temp_start]="#a7c080"
theme[temp_mid]="#dbbc7f"
theme[temp_end]="#f85552"
# CPU graph colors
theme[cpu_start]="#a7c080"
theme[cpu_mid]="#dbbc7f"
theme[cpu_end]="#f85552"
# Mem/Disk free meter
theme[free_start]="#f85552"
theme[free_mid]="#dbbc7f"
theme[free_end]="#a7c080"
# Mem/Disk cached meter
theme[cached_start]="#7fbbb3"
theme[cached_mid]="#83c092"
theme[cached_end]="#a7c080"
# Mem/Disk available meter
theme[available_start]="#f85552"
theme[available_mid]="#dbbc7f"
theme[available_end]="#a7c080"
# Mem/Disk used meter
theme[used_start]="#a7c080"
theme[used_mid]="#dbbc7f"
theme[used_end]="#f85552"
# Download graph colors
theme[download_start]="#a7c080"
theme[download_mid]="#83c092"
theme[download_end]="#7fbbb3"
# Upload graph colors
theme[upload_start]="#dbbc7f"
theme[upload_mid]="#e69875"
theme[upload_end]="#e67e80"
# Process box color gradient for threads, mem and cpu usage
theme[process_start]="#a7c080"
theme[process_mid]="#e67e80"
theme[process_end]="#f85552"

39
themes/flexoki-light.json Normal file
View File

@@ -0,0 +1,39 @@
{
"version": 1,
"name": "Flexoki Light",
"slug": "flexoki-light",
"mode": "light",
"wallpaper": "",
"colors": {
"base": "#FFFCF0",
"mantle": "#d9d6cc",
"surface": "#100F0F",
"overlay": "#100F0F",
"text": "#100F0F",
"subtext": "#FFFCF0",
"muted": "#100F0F",
"accent": "#205EA6",
"accentAlt": "#CE5D97",
"good": "#879A39",
"warn": "#D0A215",
"bad": "#D14D41"
},
"ansi": [
"#100F0F",
"#D14D41",
"#879A39",
"#D0A215",
"#205EA6",
"#CE5D97",
"#3AA99F",
"#FFFCF0",
"#100F0F",
"#D14D41",
"#879A39",
"#D0A215",
"#4385BE",
"#CE5D97",
"#3AA99F",
"#FFFCF0"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

View File

@@ -0,0 +1,78 @@
# Main bg
theme[main_bg]="#FFFCF0"
# Main text color
theme[main_fg]="#100F0F"
# Title color for boxes
theme[title]="#100F0F"
# Highlight color for keyboard shortcuts
theme[hi_fg]="#205EA6"
# Background color of selected item in processes box
theme[selected_bg]="#414868"
# Foreground color of selected item in processes box
theme[selected_fg]="#100F0F"
# Color of inactive/disabled text
theme[inactive_fg]="#6F6E69"
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
theme[proc_misc]="#205EA6"
# Cpu box outline color
theme[cpu_box]="#6F6E69"
# Memory/disks box outline color
theme[mem_box]="#6F6E69"
# Net up/down box outline color
theme[net_box]="#6F6E69"
# Processes box outline color
theme[proc_box]="#6F6E69"
# Box divider line and small boxes line color
theme[div_line]="#6F6E69"
# Temperature graph colors
theme[temp_start]="#66800B"
theme[temp_mid]="#BC5215"
theme[temp_end]="#AF3029"
# CPU graph colors
theme[cpu_start]="#66800B"
theme[cpu_mid]="#BC5215"
theme[cpu_end]="#AF3029"
# Mem/Disk free meter
theme[free_start]="#66800B"
theme[free_mid]="#BC5215"
theme[free_end]="#AF3029"
# Mem/Disk cached meter
theme[cached_start]="#66800B"
theme[cached_mid]="#BC5215"
theme[cached_end]="#AF3029"
# Mem/Disk available meter
theme[available_start]="#66800B"
theme[available_mid]="#BC5215"
theme[available_end]="#AF3029"
# Mem/Disk used meter
theme[used_start]="#66800B"
theme[used_mid]="#BC5215"
theme[used_end]="#AF3029"
# Download graph colors
theme[download_start]="#66800B"
theme[download_mid]="#BC5215"
theme[download_end]="#AF3029"
# Upload graph colors
theme[upload_start]="#66800B"
theme[upload_mid]="#BC5215"
theme[upload_end]="#AF3029"

39
themes/gruvbox.json Normal file
View File

@@ -0,0 +1,39 @@
{
"version": 1,
"name": "Gruvbox",
"slug": "gruvbox",
"mode": "dark",
"wallpaper": "",
"colors": {
"base": "#282828",
"mantle": "#222222",
"surface": "#3c3836",
"overlay": "#3c3836",
"text": "#d4be98",
"subtext": "#d4be98",
"muted": "#3c3836",
"accent": "#7daea3",
"accentAlt": "#d3869b",
"good": "#a9b665",
"warn": "#d8a657",
"bad": "#ea6962"
},
"ansi": [
"#3c3836",
"#ea6962",
"#a9b665",
"#d8a657",
"#7daea3",
"#d3869b",
"#89b482",
"#d4be98",
"#3c3836",
"#ea6962",
"#a9b665",
"#d8a657",
"#7daea3",
"#d3869b",
"#89b482",
"#d4be98"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 434 KiB

92
themes/gruvbox/btop.theme Normal file
View File

@@ -0,0 +1,92 @@
#Bashtop gruvbox (https://github.com/morhetz/gruvbox) theme
#by BachoSeven
# 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]="#282828"
# Main text color
theme[main_fg]="#a89984"
# Title color for boxes
theme[title]="#ebdbb2"
# Highlight color for keyboard shortcuts
theme[hi_fg]="#d79921"
# Background color of selected items
theme[selected_bg]="#282828"
# Foreground color of selected items
theme[selected_fg]="#fabd2f"
# Color of inactive/disabled text
theme[inactive_fg]="#282828"
# Color of text appearing on top of graphs, i.e uptime and current network graph scaling
theme[graph_text]="#585858"
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
theme[proc_misc]="#98971a"
# Cpu box outline color
theme[cpu_box]="#a89984"
# Memory/disks box outline color
theme[mem_box]="#a89984"
# Net up/down box outline color
theme[net_box]="#a89984"
# Processes box outline color
theme[proc_box]="#a89984"
# Box divider line and small boxes line color
theme[div_line]="#a89984"
# Temperature graph colors
theme[temp_start]="#458588"
theme[temp_mid]="#d3869b"
theme[temp_end]="#fb4394"
# CPU graph colors
theme[cpu_start]="#b8bb26"
theme[cpu_mid]="#d79921"
theme[cpu_end]="#fb4934"
# Mem/Disk free meter
theme[free_start]="#4e5900"
theme[free_mid]=""
theme[free_end]="#98971a"
# Mem/Disk cached meter
theme[cached_start]="#458588"
theme[cached_mid]=""
theme[cached_end]="#83a598"
# Mem/Disk available meter
theme[available_start]="#d79921"
theme[available_mid]=""
theme[available_end]="#fabd2f"
# Mem/Disk used meter
theme[used_start]="#cc241d"
theme[used_mid]=""
theme[used_end]="#fb4934"
# Download graph colors
theme[download_start]="#3d4070"
theme[download_mid]="#6c71c4"
theme[download_end]="#a3a8f7"
# Upload graph colors
theme[upload_start]="#701c45"
theme[upload_mid]="#b16286"
theme[upload_end]="#d3869b"

39
themes/hackerman.json Normal file
View File

@@ -0,0 +1,39 @@
{
"version": 1,
"name": "Hackerman",
"slug": "hackerman",
"mode": "dark",
"wallpaper": "",
"colors": {
"base": "#0B0C16",
"mantle": "#090a13",
"surface": "#0B0C16",
"overlay": "#6a6e95",
"text": "#ddf7ff",
"subtext": "#85E1FB",
"muted": "#6a6e95",
"accent": "#82FB9C",
"accentAlt": "#86a7df",
"good": "#4fe88f",
"warn": "#50f7d4",
"bad": "#50f872"
},
"ansi": [
"#0B0C16",
"#50f872",
"#4fe88f",
"#50f7d4",
"#829dd4",
"#86a7df",
"#7cf8f7",
"#85E1FB",
"#6a6e95",
"#85ff9d",
"#9cf7c2",
"#a4ffec",
"#c4d2ed",
"#cddbf4",
"#d1fffe",
"#ddf7ff"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

View File

@@ -0,0 +1,70 @@
# Main background, empty for terminal default, need to be empty if you want transparent background
theme[main_bg]="#0B0C16"
# Main text color
theme[main_fg]="#ddf7ff"
# Title color for boxes
theme[title]="#86a7df"
# Highlight color for keyboard shortcuts
theme[hi_fg]="#7cf8f7"
# Background color of selected item in processes box
theme[selected_bg]="#6a6e95"
# Foreground color of selected item in processes box
theme[selected_fg]="#ddf7ff"
# Color of inactive/disabled text
theme[inactive_fg]="#6a6e95"
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
theme[proc_misc]="#86a7df"
# Box outline and divider line color
theme[cpu_box]="#4fe88f"
theme[mem_box]="#4fe88f"
theme[net_box]="#4fe88f"
theme[proc_box]="#4fe88f"
theme[div_line]="#6a6e95"
# Gradient for all meters and graphs
theme[temp_start]="#7cf8f7"
theme[temp_mid]="#829dd4"
theme[temp_end]="#4fe88f"
theme[cpu_start]="#7cf8f7"
theme[cpu_mid]="#829dd4"
theme[cpu_end]="#4fe88f"
theme[free_start]="#829dd4"
theme[free_mid]="#50f7d4"
theme[free_end]="#50f7d4"
theme[cached_start]="#50f7d4"
theme[cached_mid]="#50f7d4"
theme[cached_end]="#50f7d4"
theme[available_start]="#7cf8f7"
theme[available_mid]="#7cf8f7"
theme[available_end]="#7cf8f7"
theme[used_start]="#4fe88f"
theme[used_mid]="#4fe88f"
theme[used_end]="#4fe88f"
theme[download_start]="#50f7d4"
theme[download_mid]="#7cf8f7"
theme[download_end]="#829dd4"
theme[upload_start]="#50f7d4"
theme[upload_mid]="#7cf8f7"
theme[upload_end]="#829dd4"

39
themes/kanagawa.json Normal file
View File

@@ -0,0 +1,39 @@
{
"version": 1,
"name": "Kanagawa",
"slug": "kanagawa",
"mode": "dark",
"wallpaper": "",
"colors": {
"base": "#1f1f28",
"mantle": "#1a1a22",
"surface": "#090618",
"overlay": "#727169",
"text": "#dcd7ba",
"subtext": "#c8c093",
"muted": "#727169",
"accent": "#7e9cd8",
"accentAlt": "#957fb8",
"good": "#76946a",
"warn": "#c0a36e",
"bad": "#c34043"
},
"ansi": [
"#090618",
"#c34043",
"#76946a",
"#c0a36e",
"#7e9cd8",
"#957fb8",
"#6a9589",
"#c8c093",
"#727169",
"#e82424",
"#98bb6c",
"#e6c384",
"#7fb4ca",
"#938aa9",
"#7aa89f",
"#dcd7ba"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

View File

@@ -0,0 +1,86 @@
# Bashtop Kanagawa-wave (https://github.com/rebelot/kanagawa.nvim) theme
# By: philikarus
# Main bg
theme[main_bg]="#1f1f28"
# Main text color
theme[main_fg]="#dcd7ba"
# Title color for boxes
theme[title]="#dcd7ba"
# Highlight color for keyboard shortcuts
theme[hi_fg]="#C34043"
# Background color of selected item in processes box
theme[selected_bg]="#223249"
# Foreground color of selected item in processes box
theme[selected_fg]="#dca561"
# Color of inactive/disabled text
theme[inactive_fg]="#727169"
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
theme[proc_misc]="#7aa89f"
# Cpu box outline color
theme[cpu_box]="#727169"
# Memory/disks box outline color
theme[mem_box]="#727169"
# Net up/down box outline color
theme[net_box]="#727169"
# Processes box outline color
theme[proc_box]="#727169"
# Box divider line and small boxes line color
theme[div_line]="#727169"
# Temperature graph colors
theme[temp_start]="#98BB6C"
theme[temp_mid]="#DCA561"
theme[temp_end]="#E82424"
# CPU graph colors
theme[cpu_start]="#98BB6C"
theme[cpu_mid]="#DCA561"
theme[cpu_end]="#E82424"
# Mem/Disk free meter
theme[free_start]="#E82424"
theme[free_mid]="#C34043"
theme[free_end]="#FF5D62"
# Mem/Disk cached meter
theme[cached_start]="#C0A36E"
theme[cached_mid]="#DCA561"
theme[cached_end]="#FF9E3B"
# Mem/Disk available meter
theme[available_start]="#938AA9"
theme[available_mid]="#957FBB"
theme[available_end]="#9CABCA"
# Mem/Disk used meter
theme[used_start]="#658594"
theme[used_mid]="#7E9CDB"
theme[used_end]="#7FB4CA"
# Download graph colors
theme[download_start]="#7E9CDB"
theme[download_mid]="#938AA9"
theme[download_end]="#957FBB"
# Upload graph colors
theme[upload_start]="#DCA561"
theme[upload_mid]="#E6C384"
theme[upload_end]="#E82424"
# Process box color gradient for threads, mem and cpu usage
theme[process_start]="#98BB6C"
theme[process_mid]="#DCA561"
theme[process_end]="#C34043"

39
themes/lumon.json Normal file
View File

@@ -0,0 +1,39 @@
{
"version": 1,
"name": "Lumon",
"slug": "lumon",
"mode": "dark",
"wallpaper": "",
"colors": {
"base": "#16242d",
"mantle": "#131f26",
"surface": "#1b2d40",
"overlay": "#304860",
"text": "#d6e2ee",
"subtext": "#d6e2ee",
"muted": "#304860",
"accent": "#f2fcff",
"accentAlt": "#8bc9eb",
"good": "#5e95bc",
"warn": "#6fa4c9",
"bad": "#4d86b0"
},
"ansi": [
"#1b2d40",
"#4d86b0",
"#5e95bc",
"#6fa4c9",
"#6fb8e3",
"#8bc9eb",
"#b4e4f6",
"#d6e2ee",
"#304860",
"#73a6cb",
"#86b7d8",
"#9dcae5",
"#f2fcff",
"#b1d8ee",
"#d1eef8",
"#ffffff"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

64
themes/lumon/btop.theme Normal file
View File

@@ -0,0 +1,64 @@
# Main background, empty for terminal default, need to be empty if you want transparent background
theme[main_bg]=""
theme_background=false
# Main text color
theme[main_fg]="#c7d2de"
# Title color for boxes
theme[title]="#9fcfe9"
# Highlight color for keyboard shortcuts
theme[hi_fg]="#b5deef"
# Background color of selected item in processes box
theme[selected_bg]="#355066"
# Foreground color of selected item in processes box
theme[selected_fg]="#c7d2de"
# Color of inactive/disabled text
theme[inactive_fg]="#355066"
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
theme[proc_misc]="#9fcfe9"
# Box outline and divider line color
theme[cpu_box]="#79abd2"
theme[mem_box]="#79abd2"
theme[net_box]="#79abd2"
theme[proc_box]="#79abd2"
theme[div_line]="#355066"
# Gradient for all meters and graphs
theme[temp_start]="#b5deef"
theme[temp_mid]="#92c7e7"
theme[temp_end]="#79abd2"
theme[cpu_start]="#b5deef"
theme[cpu_mid]="#92c7e7"
theme[cpu_end]="#79abd2"
theme[free_start]="#92c7e7"
theme[free_mid]="#86b6da"
theme[free_end]="#86b6da"
theme[cached_start]="#86b6da"
theme[cached_mid]="#86b6da"
theme[cached_end]="#86b6da"
theme[available_start]="#b5deef"
theme[available_mid]="#b5deef"
theme[available_end]="#b5deef"
theme[used_start]="#79abd2"
theme[used_mid]="#79abd2"
theme[used_end]="#79abd2"
theme[download_start]="#86b6da"
theme[download_mid]="#b5deef"
theme[download_end]="#92c7e7"
theme[upload_start]="#86b6da"
theme[upload_mid]="#b5deef"
theme[upload_end]="#92c7e7"

2
themes/lumon/waybar.css Normal file
View File

@@ -0,0 +1,2 @@
@define-color foreground #d6e2ee;
@define-color background #213442;

39
themes/matte-black.json Normal file
View File

@@ -0,0 +1,39 @@
{
"version": 1,
"name": "Matte Black",
"slug": "matte-black",
"mode": "dark",
"wallpaper": "",
"colors": {
"base": "#121212",
"mantle": "#0f0f0f",
"surface": "#333333",
"overlay": "#8a8a8d",
"text": "#bebebe",
"subtext": "#bebebe",
"muted": "#8a8a8d",
"accent": "#e68e0d",
"accentAlt": "#D35F5F",
"good": "#FFC107",
"warn": "#b91c1c",
"bad": "#D35F5F"
},
"ansi": [
"#333333",
"#D35F5F",
"#FFC107",
"#b91c1c",
"#e68e0d",
"#D35F5F",
"#bebebe",
"#bebebe",
"#8a8a8d",
"#B91C1C",
"#FFC107",
"#b90a0a",
"#f59e0b",
"#B91C1C",
"#eaeaea",
"#ffffff"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1010 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 471 KiB

View File

@@ -0,0 +1,92 @@
# ────────────────────────────────────────────────────────────
# Bashtop theme - Nomarchy Matte Black
# by tahayvr
# https://github.com/tahayvr
# ────────────────────────────────────────────────────────────
# 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]=""
# Main text color
theme[main_fg]="#EAEAEA"
# Title color for boxes
theme[title]="#8a8a8d"
# Highlight color for keyboard shortcuts
theme[hi_fg]="#f59e0b"
# Background color of selected item in processes box
theme[selected_bg]="#f59e0b"
# Foreground color of selected item in processes box
theme[selected_fg]="#EAEAEA"
# Color of inactive/disabled text
theme[inactive_fg]="#333333"
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
theme[proc_misc]="#8a8a8d"
# Cpu box outline color
theme[cpu_box]="#8a8a8d"
# Memory/disks box outline color
theme[mem_box]="#8a8a8d"
# Net up/down box outline color
theme[net_box]="#8a8a8d"
# Processes box outline color
theme[proc_box]="#8a8a8d"
# Box divider line and small boxes line color
theme[div_line]="#8a8a8d"
# Temperature graph colors
theme[temp_start]="#8a8a8d"
theme[temp_mid]="#f59e0b"
theme[temp_end]="#b91c1c"
# CPU graph colors
theme[cpu_start]="#8a8a8d"
theme[cpu_mid]="#f59e0b"
theme[cpu_end]="#b91c1c"
# Mem/Disk free meter
theme[free_start]="#8a8a8d"
theme[free_mid]="#f59e0b"
theme[free_end]="#b91c1c"
# Mem/Disk cached meter
theme[cached_start]="#8a8a8d"
theme[cached_mid]="#f59e0b"
theme[cached_end]="#b91c1c"
# Mem/Disk available meter
theme[available_start]="#8a8a8d"
theme[available_mid]="#f59e0b"
theme[available_end]="#b91c1c"
# Mem/Disk used meter
theme[used_start]="#8a8a8d"
theme[used_mid]="#f59e0b"
theme[used_end]="#b91c1c"
# Download graph colors
theme[download_start]="#8a8a8d"
theme[download_mid]="#f59e0b"
theme[download_end]="#b91c1c"
# Upload graph colors
theme[upload_start]="#8a8a8d"
theme[upload_mid]="#f59e0b"
theme[upload_end]="#b91c1c"

39
themes/miasma.json Normal file
View File

@@ -0,0 +1,39 @@
{
"version": 1,
"name": "Miasma",
"slug": "miasma",
"mode": "dark",
"wallpaper": "",
"colors": {
"base": "#222222",
"mantle": "#1d1d1d",
"surface": "#000000",
"overlay": "#666666",
"text": "#c2c2b0",
"subtext": "#d7c483",
"muted": "#666666",
"accent": "#78824b",
"accentAlt": "#bb7744",
"good": "#5f875f",
"warn": "#b36d43",
"bad": "#685742"
},
"ansi": [
"#000000",
"#685742",
"#5f875f",
"#b36d43",
"#78824b",
"#bb7744",
"#c9a554",
"#d7c483",
"#666666",
"#685742",
"#5f875f",
"#b36d43",
"#78824b",
"#bb7744",
"#c9a554",
"#d7c483"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 983 KiB

70
themes/miasma/btop.theme Normal file
View File

@@ -0,0 +1,70 @@
# Main background, empty for terminal default, need to be empty if you want transparent background
theme[main_bg]="#222222"
# Main text color
theme[main_fg]="#c2c2b0"
# Title color for boxes
theme[title]="#bb7744"
# Highlight color for keyboard shortcuts
theme[hi_fg]="#c9a554"
# Background color of selected item in processes box
theme[selected_bg]="#e4c47a"
# Foreground color of selected item in processes box
theme[selected_fg]="#000000"
# Color of inactive/disabled text
theme[inactive_fg]="#666666"
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
theme[proc_misc]="#bb7744"
# Box outline and divider line color
theme[cpu_box]="#5f875f"
theme[mem_box]="#5f875f"
theme[net_box]="#5f875f"
theme[proc_box]="#5f875f"
theme[div_line]="#666666"
# Gradient for all meters and graphs
theme[temp_start]="#c9a554"
theme[temp_mid]="#78824b"
theme[temp_end]="#5f875f"
theme[cpu_start]="#c9a554"
theme[cpu_mid]="#78824b"
theme[cpu_end]="#5f875f"
theme[free_start]="#78824b"
theme[free_mid]="#b36d43"
theme[free_end]="#b36d43"
theme[cached_start]="#b36d43"
theme[cached_mid]="#b36d43"
theme[cached_end]="#b36d43"
theme[available_start]="#c9a554"
theme[available_mid]="#c9a554"
theme[available_end]="#c9a554"
theme[used_start]="#5f875f"
theme[used_mid]="#5f875f"
theme[used_end]="#5f875f"
theme[download_start]="#b36d43"
theme[download_mid]="#c9a554"
theme[download_end]="#78824b"
theme[upload_start]="#b36d43"
theme[upload_mid]="#c9a554"
theme[upload_end]="#78824b"

39
themes/nord.json Normal file
View File

@@ -0,0 +1,39 @@
{
"version": 1,
"name": "Nord",
"slug": "nord",
"mode": "dark",
"wallpaper": "",
"colors": {
"base": "#2e3440",
"mantle": "#272c36",
"surface": "#3b4252",
"overlay": "#4c566a",
"text": "#d8dee9",
"subtext": "#e5e9f0",
"muted": "#4c566a",
"accent": "#81a1c1",
"accentAlt": "#b48ead",
"good": "#a3be8c",
"warn": "#ebcb8b",
"bad": "#bf616a"
},
"ansi": [
"#3b4252",
"#bf616a",
"#a3be8c",
"#ebcb8b",
"#81a1c1",
"#b48ead",
"#88c0d0",
"#e5e9f0",
"#4c566a",
"#bf616a",
"#a3be8c",
"#ebcb8b",
"#81a1c1",
"#b48ead",
"#8fbcbb",
"#eceff4"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

89
themes/nord/btop.theme Normal file
View File

@@ -0,0 +1,89 @@
#Bashtop theme with nord palette (https://www.nordtheme.com)
#by Justin Zobel <justin.zobel@gmail.com>
# 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]="#2E3440"
# Main text color
theme[main_fg]="#D8DEE9"
# Title color for boxes
theme[title]="#8FBCBB"
# Highlight color for keyboard shortcuts
theme[hi_fg]="#5E81AC"
# Background color of selected item in processes box
theme[selected_bg]="#4C566A"
# Foreground color of selected item in processes box
theme[selected_fg]="#ECEFF4"
# Color of inactive/disabled text
theme[inactive_fg]="#4C566A"
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
theme[proc_misc]="#5E81AC"
# Cpu box outline color
theme[cpu_box]="#4C566A"
# Memory/disks box outline color
theme[mem_box]="#4C566A"
# Net up/down box outline color
theme[net_box]="#4C566A"
# Processes box outline color
theme[proc_box]="#4C566A"
# Box divider line and small boxes line color
theme[div_line]="#4C566A"
# Temperature graph colors
theme[temp_start]="#81A1C1"
theme[temp_mid]="#88C0D0"
theme[temp_end]="#ECEFF4"
# CPU graph colors
theme[cpu_start]="#81A1C1"
theme[cpu_mid]="#88C0D0"
theme[cpu_end]="#ECEFF4"
# Mem/Disk free meter
theme[free_start]="#81A1C1"
theme[free_mid]="#88C0D0"
theme[free_end]="#ECEFF4"
# Mem/Disk cached meter
theme[cached_start]="#81A1C1"
theme[cached_mid]="#88C0D0"
theme[cached_end]="#ECEFF4"
# Mem/Disk available meter
theme[available_start]="#81A1C1"
theme[available_mid]="#88C0D0"
theme[available_end]="#ECEFF4"
# Mem/Disk used meter
theme[used_start]="#81A1C1"
theme[used_mid]="#88C0D0"
theme[used_end]="#ECEFF4"
# Download graph colors
theme[download_start]="#81A1C1"
theme[download_mid]="#88C0D0"
theme[download_end]="#ECEFF4"
# Upload graph colors
theme[upload_start]="#81A1C1"
theme[upload_mid]="#88C0D0"
theme[upload_end]="#ECEFF4"

14
themes/nord/waybar.css Normal file
View File

@@ -0,0 +1,14 @@
@define-color background #2e3440;
@define-color foreground #d8dee9;
@define-color accent #88c0d0;
/* Base style for Nord */
* {
font-family: JetBrainsMono Nerd Font, FontAwesome;
font-size: 13px;
}
window#waybar {
background-color: @background;
color: @foreground;
}

39
themes/osaka-jade.json Normal file
View File

@@ -0,0 +1,39 @@
{
"version": 1,
"name": "Osaka Jade",
"slug": "osaka-jade",
"mode": "dark",
"wallpaper": "",
"colors": {
"base": "#111c18",
"mantle": "#0e1814",
"surface": "#23372B",
"overlay": "#53685B",
"text": "#C1C497",
"subtext": "#F6F5DD",
"muted": "#53685B",
"accent": "#509475",
"accentAlt": "#D2689C",
"good": "#549e6a",
"warn": "#459451",
"bad": "#FF5345"
},
"ansi": [
"#23372B",
"#FF5345",
"#549e6a",
"#459451",
"#509475",
"#D2689C",
"#2DD5B7",
"#F6F5DD",
"#53685B",
"#db9f9c",
"#63b07a",
"#E5C736",
"#ACD4CF",
"#75bbb3",
"#8CD3CB",
"#9eebb3"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

View File

@@ -0,0 +1,87 @@
# Main background
theme[main_bg]="#111c18"
# Main text color
theme[main_fg]="#F7E8B2"
# Title color for boxes
theme[title]="#D6D5BC"
# Highlight color for keyboard shortcuts
theme[hi_fg]="#E67D64"
# Background color of selected items
theme[selected_bg]="#364538"
# Foreground color of selected items
theme[selected_fg]="#DEB266"
# Color of inactive/disabled text
theme[inactive_fg]="#32473B"
# Color of text appearing on top of graphs
theme[graph_text]="#E6D8BA"
# Misc colors for processes box
theme[proc_misc]="#E6D8BA"
# Cpu box outline color
theme[cpu_box]="#81B8A8"
# Memory/disks box outline color
theme[mem_box]="#81B8A8"
# Net up/down box outline color
theme[net_box]="#81B8A8"
# Processes box outline color
theme[proc_box]="#81B8A8"
# Box divider line and small boxes line color
theme[div_line]="#81B8A8"
# Temperature graph colors
theme[temp_start]="#BFD99A"
theme[temp_mid]="#E1B55E"
theme[temp_end]="#DBB05C"
# CPU graph colors
theme[cpu_start]="#5F8C86"
theme[cpu_mid]="#629C89"
theme[cpu_end]="#76AD98"
# Mem/Disk free meter
theme[free_start]="#5F8C86"
theme[free_mid]="#629C89"
theme[free_end]="#76AD98"
# Mem/Disk cached meter
theme[cached_start]="#5F8C86"
theme[cached_mid]="#629C89"
theme[cached_end]="#76AD98"
# Mem/Disk available meter
theme[available_start]="#5F8C86"
theme[available_mid]="#629C89"
theme[available_end]="#76AD98"
# Mem/Disk used meter
theme[used_start]="#5F8C86"
theme[used_mid]="#629C89"
theme[used_end]="#76AD98"
# Download graph colors
theme[download_start]="#75BBB3"
theme[download_mid]="#61949A"
theme[download_end]="#215866"
# Upload graph colors
theme[upload_start]="#215866"
theme[upload_mid]="#91C080"
theme[upload_end]="#549E6A"
# Process box color gradient for threads, mem and cpu usage
theme[process_start]="#72CFA3"
theme[process_mid]="#D0D494"
theme[process_end]="#DB9F9C"

39
themes/retro-82.json Normal file
View File

@@ -0,0 +1,39 @@
{
"version": 1,
"name": "Retro 82",
"slug": "retro-82",
"mode": "dark",
"wallpaper": "",
"colors": {
"base": "#05182e",
"mantle": "#041427",
"surface": "#00172e",
"overlay": "#134e5a",
"text": "#f6dcac",
"subtext": "#a7c9c6",
"muted": "#134e5a",
"accent": "#faa968",
"accentAlt": "#3f8f8a",
"good": "#028391",
"warn": "#e97b3c",
"bad": "#f85525"
},
"ansi": [
"#00172e",
"#f85525",
"#028391",
"#e97b3c",
"#faa968",
"#3f8f8a",
"#8cbfb8",
"#a7c9c6",
"#134e5a",
"#f85525",
"#028391",
"#e97b3c",
"#faa968",
"#3f8f8a",
"#8cbfb8",
"#f6dcac"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 889 KiB

View File

@@ -0,0 +1,63 @@
# Main background, empty for terminal default, need to be empty if you want transparent background
theme[main_bg]=""
# Main text color
theme[main_fg]="#f6dcac"
# Title color for boxes
theme[title]="#3f8f8a"
# Highlight color for keyboard shortcuts
theme[hi_fg]="#8cbfb8"
# Background color of selected item in processes box
theme[selected_bg]="#134e5a"
# Foreground color of selected item in processes box
theme[selected_fg]="#f6dcac"
# Color of inactive/disabled text
theme[inactive_fg]="#134e5a"
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
theme[proc_misc]="#3f8f8a"
# Box outline and divider line color
theme[cpu_box]="#e97b3c"
theme[mem_box]="#e97b3c"
theme[net_box]="#e97b3c"
theme[proc_box]="#e97b3c"
theme[div_line]="#134e5a"
# Gradient for all meters and graphs
theme[temp_start]="#a7c9c6"
theme[temp_mid]="#8cbfb8"
theme[temp_end]="#028391"
theme[cpu_start]="#a7c9c6"
theme[cpu_mid]="#e97b3c"
theme[cpu_end]="#f85525"
theme[free_start]="#faa968"
theme[free_mid]="#e97b3c"
theme[free_end]="#f85525"
theme[cached_start]="#faa968"
theme[cached_mid]="#e97b3c"
theme[cached_end]="#f85525"
theme[available_start]="#faa968"
theme[available_mid]="#e97b3c"
theme[available_end]="#f85525"
theme[used_start]="#faa968"
theme[used_mid]="#e97b3c"
theme[used_end]="#f85525"
theme[download_start]="#faa968"
theme[download_mid]="#e97b3c"
theme[download_end]="#f85525"
theme[upload_start]="#faa968"
theme[upload_mid]="#e97b3c"
theme[upload_end]="#f85525"

View File

@@ -0,0 +1,3 @@
@define-color bg #00172e;
@define-color foreground #f6dcac;
@define-color background alpha(@bg, 0.8);

39
themes/ristretto.json Normal file
View File

@@ -0,0 +1,39 @@
{
"version": 1,
"name": "Ristretto",
"slug": "ristretto",
"mode": "dark",
"wallpaper": "",
"colors": {
"base": "#2c2525",
"mantle": "#251f1f",
"surface": "#72696a",
"overlay": "#948a8b",
"text": "#e6d9db",
"subtext": "#e6d9db",
"muted": "#948a8b",
"accent": "#f38d70",
"accentAlt": "#a8a9eb",
"good": "#adda78",
"warn": "#f9cc6c",
"bad": "#fd6883"
},
"ansi": [
"#72696a",
"#fd6883",
"#adda78",
"#f9cc6c",
"#f38d70",
"#a8a9eb",
"#85dacc",
"#e6d9db",
"#948a8b",
"#ff8297",
"#c8e292",
"#fcd675",
"#f8a788",
"#bebffd",
"#9bf1e1",
"#f1e5e7"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 798 KiB

View File

@@ -0,0 +1,82 @@
#Btop monokai pro ristretto theme
#Reconfigured from monokai theme
# Main background, empty for terminal default, need to be empty if you want transparent background
theme[main_bg]="#2c2421"
# Main text color
theme[main_fg]="#e6d9db"
# Title color for boxes
theme[title]="#e6d9db"
# Highlight color for keyboard shortcuts
theme[hi_fg]="#fd6883"
# Background color of selected item in processes box
theme[selected_bg]="#3d2f2a"
# Foreground color of selected item in processes box
theme[selected_fg]="#e6d9db"
# Color of inactive/disabled text
theme[inactive_fg]="#72696a"
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
theme[proc_misc]="#adda78"
# Cpu box outline color
theme[cpu_box]="#5b4a45"
# Memory/disks box outline color
theme[mem_box]="#5b4a45"
# Net up/down box outline color
theme[net_box]="#5b4a45"
# Processes box outline color
theme[proc_box]="#5b4a45"
# Box divider line and small boxes line color
theme[div_line]="#72696a"
# Temperature graph colors
theme[temp_start]="#a8a9eb"
theme[temp_mid]="#f38d70"
theme[temp_end]="#fd6a85"
# CPU graph colors
theme[cpu_start]="#adda78"
theme[cpu_mid]="#f9cc6c"
theme[cpu_end]="#fd6883"
# Mem/Disk free meter
theme[free_start]="#5b4a45"
theme[free_mid]="#adda78"
theme[free_end]="#c5e2a3"
# Mem/Disk cached meter
theme[cached_start]="#5b4a45"
theme[cached_mid]="#85dacc"
theme[cached_end]="#b3e8dd"
# Mem/Disk available meter
theme[available_start]="#5b4a45"
theme[available_mid]="#f9cc6c"
theme[available_end]="#fce2a3"
# Mem/Disk used meter
theme[used_start]="#5b4a45"
theme[used_mid]="#fd6a85"
theme[used_end]="#feb5c7"
# Download graph colors
theme[download_start]="#3d2f2a"
theme[download_mid]="#a8a9eb"
theme[download_end]="#c5c6f0"
# Upload graph colors
theme[upload_start]="#3d2f2a"
theme[upload_mid]="#fd6a85"
theme[upload_end]="#feb5c7"

Some files were not shown because too many files have changed in this diff Show More