feat(packs): opt-in package packs — media/office/dev/gaming/containers/compat
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
e0f2a3951f
commit
095f2ccf29
8 changed files with 449 additions and 0 deletions
46
modules/packs/README.md
Normal file
46
modules/packs/README.md
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
# modules/packs
|
||||
|
||||
Opt-in **packs** — bundles of (packages + services + config) toggled with
|
||||
`omni.packs.<name>.enable`. This is the "core + goodies" layer: core is
|
||||
always on; packs are off until you ask for them.
|
||||
|
||||
Full guide (enabling, standalone import, authoring, bitcoin specifics,
|
||||
verification): **[`docs/packs.md`](../../docs/packs.md)**.
|
||||
|
||||
## Pattern
|
||||
|
||||
Each pack is one self-contained module, **always imported but inert** until
|
||||
enabled (hlissner-style enable-gate):
|
||||
|
||||
```nix
|
||||
{ config, lib, pkgs, ... }:
|
||||
let cfg = config.omni.packs.media; in {
|
||||
options.omni.packs.media.enable = lib.mkEnableOption "Media pack";
|
||||
config = lib.mkIf cfg.enable { environment.systemPackages = with pkgs; [ … ]; };
|
||||
}
|
||||
```
|
||||
|
||||
## Files
|
||||
|
||||
| File | Purpose |
|
||||
|---|---|
|
||||
| `default.nix` | Aggregator — imports every pack + `compat.nix`. Wired into the build once, via `lib/mksystem.nix`. The ISO bypasses mksystem, so it stays pack-free. |
|
||||
| `compat.nix` | Back-compat bridge: maps legacy `omni.features.*` → `omni.packs.*.enable` (mkDefault). Aggregator-only, so standalone imports don't pull in `omni.features`. |
|
||||
| `media.nix`, `development.nix`, `gaming.nix`, `office.nix`, `containers.nix` | Desktop-bundle packs (migrated from `packages.nix` categories + the feature-gated bits of `core.nix`/`development.nix`). Omnixient-coupled (use `omni.lib.filterPackages`). |
|
||||
| `lnbits.nix` | Wraps `../dev-env` and enables it. **Standalone-importable** (dev-env is decoupled from `omni.*`). |
|
||||
| `aiolabs.nix` | Imports the gated aiolabs preset (`../dev-env/presets/aiolabs.nix`) and pulls in `lnbits`. **Standalone-importable.** |
|
||||
| `bitcoin.nix` | nix-bitcoin node (bitcoind + clightning). **NOT in the aggregator** — nix-bitcoin's module asserts on import even when disabled; exposed as `nixosModules.bitcoin` for explicit per-host import. |
|
||||
|
||||
## Exposed as flake outputs
|
||||
|
||||
`flake.nixosModules.{media,development,gaming,office,containers,lnbits,
|
||||
aiolabs,bitcoin}` — reusable across a second host (`gizmo`) and third
|
||||
parties. `lnbits`/`aiolabs`/`bitcoin` work on a non-Omnixient NixOS.
|
||||
|
||||
## Adding a pack
|
||||
|
||||
See [`docs/packs.md` → Authoring a new pack](../../docs/packs.md#authoring-a-new-pack).
|
||||
In short: copy the template, register in `default.nix` (unless it has
|
||||
import-time side effects), expose in `flake.nix`, keep it
|
||||
`config.omni.<core>`-free if it should be standalone, and verify the
|
||||
omni closure is unchanged with `nix store diff-closures`.
|
||||
25
modules/packs/compat.nix
Normal file
25
modules/packs/compat.nix
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
# Back-compat bridge — maps the legacy omni.features.* booleans onto the
|
||||
# new omni.packs.*.enable toggles via mkDefault, so existing hosts and
|
||||
# the `preset` enum keep working unchanged through (and after) the
|
||||
# migration. A host can still override any omni.packs.<name>.enable
|
||||
# explicitly because these are mkDefault.
|
||||
#
|
||||
# Lives in the packs aggregator (modules/packs/default.nix), which is only
|
||||
# loaded as part of a full omni system via lib/mksystem.nix — so a
|
||||
# standalone consumer importing a single pack module (e.g.
|
||||
# nixosModules.lnbits) never pulls in this omni.features dependency.
|
||||
{ config, lib, ... }:
|
||||
let
|
||||
cfg = config.omni;
|
||||
in
|
||||
{
|
||||
config = lib.mkIf (cfg.enable or false) {
|
||||
omni.packs = {
|
||||
media.enable = lib.mkDefault (cfg.features.media or false);
|
||||
gaming.enable = lib.mkDefault (cfg.features.gaming or false);
|
||||
office.enable = lib.mkDefault ((cfg.features.office or false) || (cfg.features.communication or false));
|
||||
containers.enable = lib.mkDefault (cfg.features.containers or false);
|
||||
development.enable = lib.mkDefault (cfg.features.coding or false);
|
||||
};
|
||||
};
|
||||
}
|
||||
43
modules/packs/containers.nix
Normal file
43
modules/packs/containers.nix
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
# Containers pack — Docker + Podman.
|
||||
#
|
||||
# Unifies the docker config that was previously split between core.nix
|
||||
# (basic enable + weekly autoPrune) and development.nix (daemon.settings
|
||||
# buildkit + registry-mirror + autoPrune --all), plus the podman block
|
||||
# that lived coding-gated in development.nix. Now a single source of truth
|
||||
# gated on omni.packs.containers.enable. (The merged result is the union
|
||||
# of the two old blocks — identical on any host that had both features on,
|
||||
# e.g. omni.)
|
||||
{ config, lib, ... }:
|
||||
let
|
||||
cfg = config.omni.packs.containers;
|
||||
in
|
||||
{
|
||||
options.omni.packs.containers.enable =
|
||||
lib.mkEnableOption "Containers pack (Docker + Podman)";
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
virtualisation.docker = {
|
||||
enable = true;
|
||||
enableOnBoot = true;
|
||||
daemon.settings = {
|
||||
features = {
|
||||
buildkit = true;
|
||||
};
|
||||
registry-mirrors = [ "https://mirror.gcr.io" ];
|
||||
};
|
||||
|
||||
autoPrune = {
|
||||
enable = true;
|
||||
dates = "weekly";
|
||||
flags = [ "--all" ];
|
||||
};
|
||||
};
|
||||
|
||||
# Podman as Docker alternative (dockerCompat off to avoid conflict).
|
||||
virtualisation.podman = {
|
||||
enable = true;
|
||||
dockerCompat = false;
|
||||
defaultNetwork.settings.dns_enabled = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
33
modules/packs/default.nix
Normal file
33
modules/packs/default.nix
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
# omni packs — opt-in bundles of (packages + services + config).
|
||||
#
|
||||
# Every pack module is ALWAYS imported but inert until
|
||||
# `omni.packs.<name>.enable = true` (hlissner-style enable-gate), so
|
||||
# the option namespace is always declared and discoverable while nothing
|
||||
# is built unless asked for. This aggregator is wired into the build at a
|
||||
# single point — lib/mksystem.nix — so the ISO path (a direct nixosSystem
|
||||
# call that bypasses mksystem) stays pack-free.
|
||||
#
|
||||
# The lnbits / aiolabs / bitcoin packs are standalone-importable: they
|
||||
# declare their own option namespace and touch only standard NixOS
|
||||
# options + their own bundled modules, so a third party can import e.g.
|
||||
# `nixosModules.lnbits` on their own NixOS without enabling omni core.
|
||||
{ ... }:
|
||||
{
|
||||
imports = [
|
||||
./compat.nix
|
||||
./media.nix
|
||||
./development.nix
|
||||
./gaming.nix
|
||||
./office.nix
|
||||
./containers.nix
|
||||
./lnbits.nix
|
||||
./aiolabs.nix
|
||||
# bitcoin.nix is deliberately NOT in this always-loaded aggregator:
|
||||
# nix-bitcoin's default module fires a secrets assertion just from
|
||||
# being imported (even with no services enabled), so importing it
|
||||
# inert on every host breaks eval. It's exposed as
|
||||
# `nixosModules.bitcoin` instead — a host that wants a node imports it
|
||||
# explicitly and sets omni.packs.bitcoin.enable. (inputs.nix-bitcoin
|
||||
# is provided to such hosts via mksystem specialArgs.)
|
||||
];
|
||||
}
|
||||
109
modules/packs/development.nix
Normal file
109
modules/packs/development.nix
Normal file
|
|
@ -0,0 +1,109 @@
|
|||
# Development pack — editors, language servers, compilers, build tools,
|
||||
# container CLIs, DB clients, cloud tooling, plus git/npm programs and dev
|
||||
# manpages.
|
||||
#
|
||||
# Migrated from packages.nix `development` category + the coding-gated
|
||||
# bits of core.nix (programs.git/npm, documentation.dev, gcc/gnumake).
|
||||
# The richer dev module (modules/development.nix: shells, services,
|
||||
# helper scripts) is re-gated onto omni.packs.development.enable.
|
||||
{ config, lib, pkgs, ... }:
|
||||
let
|
||||
cfg = config.omni.packs.development;
|
||||
in
|
||||
{
|
||||
options.omni.packs.development.enable =
|
||||
lib.mkEnableOption "Development pack (editors, LSPs, compilers, build tools, container CLIs)";
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
documentation.dev.enable = true;
|
||||
|
||||
programs.git = {
|
||||
enable = true;
|
||||
lfs.enable = true;
|
||||
};
|
||||
programs.npm.enable = true;
|
||||
|
||||
environment.systemPackages = config.omni.lib.filterPackages (
|
||||
with pkgs;
|
||||
[
|
||||
# Editors and IDEs
|
||||
# neovim (configured via home-manager programs.neovim)
|
||||
emacs
|
||||
vscode
|
||||
jetbrains.idea-oss
|
||||
|
||||
# Language servers
|
||||
typescript-language-server
|
||||
vscode-langservers-extracted
|
||||
rust-analyzer
|
||||
gopls
|
||||
pyright
|
||||
lua-language-server
|
||||
clang-tools
|
||||
|
||||
# Debuggers
|
||||
gdb
|
||||
lldb
|
||||
delve
|
||||
|
||||
# Build tools
|
||||
gnumake
|
||||
cmake
|
||||
meson
|
||||
ninja
|
||||
autoconf
|
||||
automake
|
||||
libtool
|
||||
pkg-config
|
||||
|
||||
# Compilers and interpreters
|
||||
gcc
|
||||
clang
|
||||
rustc
|
||||
cargo
|
||||
go
|
||||
python3
|
||||
nodejs
|
||||
deno
|
||||
bun
|
||||
|
||||
# Container tools
|
||||
docker
|
||||
docker-compose
|
||||
podman
|
||||
buildah
|
||||
skopeo
|
||||
kind
|
||||
kubectl
|
||||
kubernetes-helm
|
||||
k9s
|
||||
|
||||
# Database clients
|
||||
postgresql
|
||||
mariadb
|
||||
sqlite
|
||||
redis
|
||||
mongodb-tools
|
||||
dbeaver-bin
|
||||
|
||||
# API testing
|
||||
httpie
|
||||
curl
|
||||
postman
|
||||
insomnia
|
||||
|
||||
# Cloud tools
|
||||
awscli2
|
||||
google-cloud-sdk
|
||||
azure-cli
|
||||
terraform
|
||||
ansible
|
||||
|
||||
# Documentation
|
||||
mdbook
|
||||
hugo
|
||||
zola
|
||||
]
|
||||
);
|
||||
};
|
||||
}
|
||||
33
modules/packs/gaming.nix
Normal file
33
modules/packs/gaming.nix
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
# Gaming pack — Steam, Lutris, Wine, performance tools.
|
||||
# Migrated from packages.nix `gaming` category + the steam block in core.nix.
|
||||
{ config, lib, pkgs, ... }:
|
||||
let
|
||||
cfg = config.omni.packs.gaming;
|
||||
in
|
||||
{
|
||||
options.omni.packs.gaming.enable =
|
||||
lib.mkEnableOption "Gaming pack (Steam, Lutris, Wine, performance tools)";
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
programs.steam = {
|
||||
enable = true;
|
||||
remotePlay.openFirewall = true;
|
||||
dedicatedServer.openFirewall = true;
|
||||
};
|
||||
|
||||
environment.systemPackages = config.omni.lib.filterPackages (
|
||||
with pkgs;
|
||||
[
|
||||
steam
|
||||
lutris
|
||||
wine
|
||||
winetricks
|
||||
protonup-rs
|
||||
mangohud
|
||||
gamemode
|
||||
discord
|
||||
obs-studio
|
||||
]
|
||||
);
|
||||
};
|
||||
}
|
||||
84
modules/packs/media.nix
Normal file
84
modules/packs/media.nix
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
# Media pack — players, image/video editing, screen capture.
|
||||
#
|
||||
# Migrated from packages.nix `multimedia` category. Runs the list through
|
||||
# omni.lib.filterPackages so the omni.packages.exclude mechanism still
|
||||
# applies — this is a desktop-bundle pack (omni-coupled by design), not
|
||||
# one of the standalone-importable packs.
|
||||
{ config, lib, pkgs, ... }:
|
||||
let
|
||||
cfg = config.omni.packs.media;
|
||||
in
|
||||
{
|
||||
options.omni.packs.media.enable =
|
||||
lib.mkEnableOption "Media pack (players, image/video editing, screen capture)";
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
environment.systemPackages = config.omni.lib.filterPackages (
|
||||
with pkgs;
|
||||
[
|
||||
# Audio
|
||||
pipewire
|
||||
pulseaudio
|
||||
pavucontrol
|
||||
easyeffects
|
||||
spotify
|
||||
spotifyd
|
||||
cmus
|
||||
mpd
|
||||
ncmpcpp
|
||||
|
||||
# Video
|
||||
mpv
|
||||
vlc
|
||||
obs-studio
|
||||
kdePackages.kdenlive
|
||||
handbrake
|
||||
ffmpeg-full
|
||||
|
||||
# Images
|
||||
imv
|
||||
feh
|
||||
gimp
|
||||
inkscape
|
||||
krita
|
||||
imagemagick
|
||||
graphicsmagick
|
||||
drawio
|
||||
|
||||
# Image morphing (python + opencv + dlib for landmark-based morphing).
|
||||
# Exposed as `morph-py` so it doesn't collide with the bare `python3`
|
||||
# pulled in by the development category.
|
||||
(writeShellScriptBin "morph-py" ''
|
||||
exec ${
|
||||
python3.withPackages (
|
||||
ps: with ps; [
|
||||
opencv4
|
||||
dlib
|
||||
face-recognition-models
|
||||
numpy
|
||||
scipy
|
||||
]
|
||||
)
|
||||
}/bin/python3 "$@"
|
||||
'')
|
||||
|
||||
# 3D / CAD — bare `openscad` is pinned to 2021.01 which no
|
||||
# longer builds against current toolchains in nixpkgs-unstable.
|
||||
openscad-unstable
|
||||
|
||||
# Screen capture
|
||||
grim
|
||||
slurp
|
||||
wf-recorder
|
||||
flameshot
|
||||
peek
|
||||
|
||||
# PDF
|
||||
zathura
|
||||
evince
|
||||
kdePackages.okular
|
||||
mupdf
|
||||
]
|
||||
);
|
||||
};
|
||||
}
|
||||
76
modules/packs/office.nix
Normal file
76
modules/packs/office.nix
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
# Office pack — browsers, communication, office suite, notes, password
|
||||
# managers, sync/backup.
|
||||
#
|
||||
# Migrated from packages.nix `productivity` category, which is gated on
|
||||
# features.office OR features.communication today; this pack reproduces
|
||||
# the whole list to preserve parity (splitting office vs communication is
|
||||
# a follow-up). Run through omni.lib.filterPackages so exclude applies.
|
||||
{ config, lib, pkgs, ... }:
|
||||
let
|
||||
cfg = config.omni.packs.office;
|
||||
in
|
||||
{
|
||||
options.omni.packs.office.enable =
|
||||
lib.mkEnableOption "Office pack (browsers, comms, office suite, notes, backup)";
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
environment.systemPackages = config.omni.lib.filterPackages (
|
||||
with pkgs;
|
||||
[
|
||||
# Browsers
|
||||
firefox
|
||||
chromium
|
||||
brave
|
||||
qutebrowser
|
||||
|
||||
# Communication
|
||||
# discord
|
||||
# slack
|
||||
# telegram-desktop
|
||||
signal-desktop
|
||||
element-desktop
|
||||
ferdium
|
||||
# zoom-us
|
||||
# teams-for-linux
|
||||
|
||||
# Bitcoin
|
||||
sparrow
|
||||
|
||||
# Office
|
||||
libreoffice
|
||||
onlyoffice-desktopeditors
|
||||
wpsoffice
|
||||
|
||||
# Note taking
|
||||
obsidian
|
||||
# logseq
|
||||
# joplin-desktop
|
||||
# zettlr
|
||||
|
||||
# Spaced repetition / learning
|
||||
anki
|
||||
|
||||
# Email
|
||||
# thunderbird
|
||||
# aerc
|
||||
# neomutt
|
||||
|
||||
# Calendar
|
||||
calcurse
|
||||
khal
|
||||
|
||||
# Password managers
|
||||
bitwarden-desktop
|
||||
keepassxc
|
||||
pass
|
||||
|
||||
# Sync and backup
|
||||
syncthing
|
||||
nextcloud-client
|
||||
rclone
|
||||
restic
|
||||
borgbackup
|
||||
]
|
||||
);
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue