Compare commits

..

10 commits

Author SHA1 Message Date
a31369fea8 docs: point template + install docs at the real Omnixient repo
Replace the <your-org> placeholders with the actual public URL
(git+https://git.atitlan.io/aiolabs/omnixient, https so forkers need no
SSH), and switch the packs standalone-import example from git+ssh to the
same https URL.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 11:45:27 +02:00
78fb9b4b30 rebrand: fix upstream attribution in README + Omnixient wordmark
The mechanical omnixy->omni pass mangled README lines that refer to the
*upstream* OmniXY project (restored to OmniXY/omnixy), and replaced the
block-letter OMNIXY fastfetch logo with a clean Omnixient wordmark.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 11:23:49 +02:00
a054bfaa38 docs(getting-started): rewrite for the dependency model
Lead with consuming OmniXY as a flake input (omnixy.lib.mkSystem +
nixosModules.omnixy via `nix flake init -t`): tiny consumer repo,
conflict-free `nix flake update omnixy`. Add an 'Already on NixOS?'
section (reuse hardware scan + stateVersion, preview in VM, rollback),
a Secrets opt-in walkthrough, and keep forking as a documented
alternative.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 10:51:12 +02:00
8011163293 fix(core): handle null omnixy.preset everywhere it's interpolated
Same null-vs-missing bug as the fastfetch fix, across lib.nix (env var +
status echo), menus.nix, scripts.nix, and fastfetch's about screen:
`cfg.preset or "…"` returns null (not the fallback) because preset
defaults to null. Any consumer that doesn't set a preset hit 'cannot
coerce null to a string'. Replace with explicit null checks.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 10:45:21 +02:00
f42d4482ff fix(fastfetch): handle null omnixy.preset
`${cfg.preset or "custom"}` only falls back when the attr is missing,
not when it's null — and omnixy.preset defaults to null. A host that
doesn't set a preset (any consumer of nixosModules.omnixy) hit 'cannot
coerce null to a string'. Use an explicit null check. Surfaced by the
dependency-model consumer test.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 10:43:53 +02:00
fa467a346a feat(mksystem): inject home-manager sharedModules OmniXY home needs
home.nix depends on nix-colors (colorScheme), lazyvim, and walker HM
modules; previously every host wired them by hand via `modules`, which
external consumers couldn't know to do. Inject them in mkSystem so any
host built through it gets them; re-importing from a host is a no-op.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 10:40:55 +02:00
f6b8ddf598 feat(flake): add consumer template (nix flake init -t)
Expose templates.default — a starter flake that consumes OmniXY as an
input (dependency model): omnixy.lib.mkSystem + nixosModules.omnixy +
a placeholder host. Lets adopters track OmniXY with `nix flake update`
instead of forking. See templates/default/README.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 10:38:14 +02:00
08c2a1a46c feat(mksystem): consumer-friendly home-manager resolution
mkSystem resolved the user's home config only from this repo's
users/<user>/, so an external consumer's user got no home-manager setup.
Add a `home` param (a path) and resolve in priority order: caller `home`
-> internal users/<user>/home-manager.nix -> OmniXY's home.nix. Internal
hosts keep their shims (unchanged); consumers now get a working home by
default. Unblocks the consumer template.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 10:34:42 +02:00
1e2677c543 feat(flake): expose nixosModules.omnixy core aggregate
Extract the reusable core module list into modules/default.nix (single
source of truth) and expose it as nixosModules.omnixy / .default.
configuration.nix now imports ./modules instead of listing each module,
so this repo's hosts and external consumers share one definition. Theme
stays a settings.theme-driven import inside the aggregate. Packs,
dev-env, sops and home-manager remain injected by mkSystem.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 10:22:37 +02:00
8678f637db feat(flake): expose lib.mkSystem for external consumers
Surface mkSystem as a flake output and make its host resolution
non-throwing: internal hosts (this repo's hosts/<name>/) are still
imported automatically, but a consumer using OmniXY as a flake input
can now pass their own host via `modules` instead. First brick of the
dependency-model framework; the core module aggregate (nixosModules)
follows so a consumer's host can import OmniXY core.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 10:15:52 +02:00
15 changed files with 488 additions and 207 deletions

View file

@ -4,7 +4,7 @@ Transform your NixOS installation into a fully-configured, beautiful, and modern
## 🌀 aiolabs/omnixient
This repository is **derived from** [TheArctesian/omnixy](https://github.com/TheArctesian/omnixy) and **evolves independently** at [git.atitlan.io/aiolabs/omnixient](https://git.atitlan.io/aiolabs/omnixient). It keeps the desktop layer that omni ships (Hyprland, themes, ISO builder, dev shells) and adds infrastructure for managing a multi-project Bitcoin/Lightning development workflow on top of it.
This repository is **derived from** [TheArctesian/omnixy](https://github.com/TheArctesian/omnixy) and **evolves independently** at [git.atitlan.io/aiolabs/omnixient](https://git.atitlan.io/aiolabs/omnixient). It keeps the desktop layer that OmniXY ships (Hyprland, themes, ISO builder, dev shells) and adds infrastructure for managing a multi-project Bitcoin/Lightning development workflow on top of it.
We're not actively syncing changes from TheArctesian/omnixy — the diff has grown large enough that the two projects serve different audiences now. If you only want the polished desktop, the original is the right place. If you want the dev environment, fleet deploy story, and aiolabs-specific tooling, this is.
@ -418,7 +418,7 @@ The ISO includes:
Issues + PRs at [git.atitlan.io/aiolabs/omnixient/issues](https://git.atitlan.io/aiolabs/omnixient/issues).
This repo evolves independently of TheArctesian/omnixy — we don't sync changes upstream and you don't need to send the same fix to two places. If you want to contribute to the original omni desktop project instead, head to [github.com/TheArctesian/omnixy](https://github.com/TheArctesian/omnixy) directly; the two are now separate projects sharing common ancestry.
This repo evolves independently of TheArctesian/omnixy — we don't sync changes upstream and you don't need to send the same fix to two places. If you want to contribute to the original OmniXY desktop project instead, head to [github.com/TheArctesian/omnixy](https://github.com/TheArctesian/omnixy) directly; the two are now separate projects sharing common ancestry.
For aiolabs/omnixient contributions, the dev-env module ships an upstream-PR helper for sending PRs to OUR upstream OSS dependencies (lnbits, lamassu, nix-bitcoin, etc.) — see [`modules/dev-env/docs/upstream-prs.md`](modules/dev-env/docs/upstream-prs.md).
@ -428,7 +428,7 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
## 🙏 Acknowledgments
- [TheArctesian/omnixy](https://github.com/TheArctesian/omnixy) — the original Omnixient project this is derived from. Desktop, themes, ISO, hyprland config all originate there. We've evolved independently since.
- [TheArctesian/omnixy](https://github.com/TheArctesian/omnixy) — the original OmniXY project this is derived from. Desktop, themes, ISO, hyprland config all originate there. We've evolved independently since.
- Inspired by [Omakub](https://omakub.org/) and [Omarchy](https://omarchy.org/) by DHH — the original opinionated desktop setups
- The dev-env mksystem pattern is adapted from [mitchellh/nixos-config](https://github.com/mitchellh/nixos-config) — see `lib/mksystem.nix`
- The dev-env cross-level option forwarding pattern is inspired by [henrysipp/omarchy-nix](https://github.com/henrysipp/omarchy-nix), another NixOS port of omarchy
@ -479,7 +479,7 @@ per-author characterizations as summary, not gospel.)*
- [Hyprland Wiki](https://wiki.hyprland.org/) - Hyprland configuration reference
- [Nix Package Search](https://search.nixos.org/) - Search available packages
- [aiolabs/omnixient issues](https://git.atitlan.io/aiolabs/omnixient/issues) — issues + PRs for this repo
- [TheArctesian/omnixy](https://github.com/TheArctesian/omnixy) — the original omni project (separate, no longer tracked for syncing)
- [TheArctesian/omnixy](https://github.com/TheArctesian/omnixy) — the original OmniXY project (separate, no longer tracked for syncing)
## 📚 Learning Resources

View file

@ -15,28 +15,14 @@ let
in
{
imports = [
# NOTE: hardware-configuration.nix is imported per-host from
# hosts/<name>/default.nix (it's machine-specific), not here.
# Omnixient modules
./modules/lib.nix
./modules/core.nix
./modules/colors.nix
./modules/boot.nix
./modules/security.nix
./modules/secrets.nix
./modules/fastfetch.nix
./modules/walker.nix
./modules/scripts.nix
./modules/menus.nix
./modules/desktop/hyprland.nix
./modules/packages.nix
./modules/development.nix
./modules/mcp.nix
./modules/themes/${currentTheme}.nix
./modules/users.nix
./modules/services.nix
./modules/hardware
# Omnixient core module aggregate (modules/default.nix) — the same set
# exposed as nixosModules.omni for external consumers, so there's a
# single source of truth for the core module list. The active theme
# is selected inside it from settings.theme.
#
# hardware-configuration.nix is imported per-host from
# hosts/<name>/default.nix (machine-specific), not here.
./modules
];
# --- Per-host settings (edit these) ---

View file

@ -1,201 +1,243 @@
# Getting Started — adopting Omnixient on your machine
# Getting Started — adopting Omnixient
Omnixient is a personal NixOS config published as a starting point, not a
turnkey distro installer. Adopting it means **forking it and making it
yours**. Almost everything you need to change is funnelled through one
file (`settings.nix`) plus your machine's hardware scan.
Omnixient is a Hyprland desktop you build on top of, not a turnkey installer.
There are **two ways to adopt it**:
This guide assumes you already have a working NixOS install (or are
installing from the official NixOS ISO). If you don't know NixOS at all,
read [the NixOS manual](https://nixos.org/manual/nixos/stable/) and
[NixOS & Flakes Book](https://nixos-and-flakes.thiscute.world/) first.
1. **As a flake input (recommended)** — your own small repo pins Omnixient as
a dependency. You never edit Omnixient's files, so `nix flake update omni`
pulls upstream changes with zero merge conflicts. This is the path below.
2. **By forking** — clone Omnixient and edit it directly. More control over
Omnixient internals, but you maintain a fork. See
[Forking instead](#forking-instead) at the end.
> **Heads-up:** the `omni` host (`hosts/omni/`) is the maintainer's
> actual machine — a Framework Desktop with WireGuard, the aiolabs dev
> environment, and a Bitcoin/Lightning workflow. You'll want your own
> host directory rather than inheriting all of that. See
> [Step 4](#4-make-it-your-host).
This guide assumes a working NixOS install (or the official NixOS ISO). New
to NixOS? Read the [NixOS manual](https://nixos.org/manual/nixos/stable/)
and the [NixOS & Flakes Book](https://nixos-and-flakes.thiscute.world/)
first.
---
## The two things that are truly yours
## What's yours vs. what's Omnixient's
1. **`settings.nix`** — identity, hostname, timezone, theme, SSH keys, and
the all-important `stateVersion`. One file, fully commented.
2. **`hosts/<yourhost>/hardware-configuration.nix`** — the scan of your
actual hardware. Generated by `nixos-generate-config`; never copy
someone else's.
In the dependency model your repo is tiny and owns only **your** stuff:
Everything else (the desktop, theming, packs) is shared and opt-in.
- `flake.nix` — pins Omnixient + your `settings` (identity, hostname, theme…).
- `hosts/<host>/default.nix` — which packs/options you want.
- `hosts/<host>/hardware-configuration.nix` — your real hardware scan.
Omnixient (the desktop, theming, packs, modules) comes from the pinned input.
You update it like any dependency; it never touches your files.
---
## 1. Get the repo
## 1. Scaffold your config
```bash
git clone https://git.atitlan.io/aiolabs/omnixient.git ~/omni
cd ~/omni
nix flake init -t git+https://git.atitlan.io/aiolabs/omnixient # writes flake.nix + hosts/myhost/
cd <your-config>
```
You can put it anywhere; `/etc/nixos` and `~/omni` both work. Rebuild
commands below use `--flake .#<host>` from inside the clone.
This drops a starter that already wires `omni.lib.mkSystem` +
`omni.nixosModules.omni`. Open `flake.nix` and:
- set `omni.url` to the real repo (pin a tag for reproducibility, e.g.
`git+https://git.atitlan.io/aiolabs/omnixient?ref=v1.0.0`);
- fill in the `settings` block:
```nix
settings = {
user = "alice";
gitName = "Alice Example";
gitEmail = "alice@example.com";
hostName = "myhost";
timeZone = "America/New_York";
theme = "tokyo-night"; # any module under Omnixient's modules/themes/
sshKeys = [ ]; # e.g. [ "ssh-ed25519 AAAA… alice@myhost" ]
stateVersion = "24.11"; # ⚠ the release you FIRST installed — never change
};
```
> **`stateVersion`** is the field that bites people: it is *not* your
> current NixOS version. It pins stateful defaults from your original
> install; changing it on a live system can break data.
## 2. Generate your hardware scan
```bash
sudo nixos-generate-config --show-hardware-config > /tmp/hardware-configuration.nix
sudo nixos-generate-config --show-hardware-config \
> hosts/myhost/hardware-configuration.nix
```
Review it (it captures your disks, filesystems, kernel modules, CPU
microcode). You'll place it into your host directory in step 4.
This captures your disks, filesystems, kernel modules, and CPU microcode.
The template ships a placeholder — replace it before building on real
hardware.
> A stray `hardware-configuration.nix` at the repo root is gitignored on
> purpose — the tracked copy belongs in your host directory.
## 3. Choose packs and options
## 3. Fill in `settings.nix`
Open `settings.nix` and set every field for your machine:
Edit `hosts/myhost/default.nix`. Core (base system + Hyprland desktop +
theming) is always on; everything else is opt-in:
```nix
{
user = "alice"; # your Linux username
gitName = "Alice Example";
gitEmail = "alice@example.com";
hostName = "nimbus"; # your machine's hostname
timeZone = "America/New_York";
theme = "tokyo-night"; # any of modules/themes/*.nix
sshKeys = [
"ssh-ed25519 AAAAC3Nza... alice@nimbus"
];
stateVersion = "24.05"; # ⚠ the release you FIRST installed — never change later
}
```
omni = {
enable = true;
desktop.enable = true;
user = settings.user;
theme = settings.theme;
The comments in the file explain each field. The **`stateVersion`**
warning is the one that bites people: it is *not* your current NixOS
version — it pins stateful defaults from your original install, and
changing it on a live system can break data.
## 4. Make it your host
The cleanest path is your own host directory, and there's a ready-made
template to copy — **`hosts/example/`** (a minimal, generic host, kept
build-checked in `flake.nix` so it never rots):
```bash
cp -r hosts/example hosts/nimbus # name it your host
cp /tmp/hardware-configuration.nix \
hosts/nimbus/hardware-configuration.nix # your real scan (step 2)
```
`hosts/example/default.nix` imports your hardware scan + the shared Omnixient
base and enables a sensible starter set of packs — edit it to taste (it's
fully commented). Then register the host in `flake.nix` (copy the
`example` block, rename it):
```nix
# flake.nix → nixosConfigurations
nimbus = mkSystem "nimbus" {
inherit system;
user = settings.user; # add `devEnv = true;` if you want the dev-env
extraSpecialArgs = { inherit settings; };
extraHmArgs = { inherit settings; };
modules = [
{ home-manager.sharedModules = [
inputs.nix-colors.homeManagerModules.default
inputs.lazyvim.homeManagerModules.default
inputs.walker.homeManagerModules.default
];
}
];
packs.development.enable = true; # editors, LSPs, compilers, container CLIs
packs.media.enable = true; # gimp, inkscape, mpv, obs, …
# packs.gaming.enable = true; # Steam, Lutris, Wine
# packs.bitcoin.enable = true; # a real bitcoind + lightning node
};
```
If your username differs from the template's, also create
`users/<youruser>/home-manager.nix` — copy `users/user/home-manager.nix`,
a one-line shim to the shared `home.nix`.
The full catalog is in **[docs/packs.md](packs.md)**.
**What's maintainer-specific in `hosts/omni/` — leave it out of yours:**
the `framework-desktop-*` hardware module, `wireguard.nix` (a private
tunnel), `omni.packs.aiolabs.enable` and the whole `dev-env { … }` block
(the aiolabs Lightning workflow), and the Framework `fwupd`/polkit rule.
## 4. Track your files, then build
> Prefer the absolute-minimum change? You *can* skip renaming: replace
> `hosts/omni/hardware-configuration.nix` with your scan, strip the
> maintainer-specific lines from `hosts/omni/default.nix`, set
> `settings.hostName`, and build `.#omni`. The flake attribute name and
> your machine's hostname are independent. A dedicated host dir is just
> tidier once you have more than one machine.
## 5. Choose your packs
Core (base system + Hyprland desktop + theming) is always on. Everything
else is opt-in via `omni.packs.<name>.enable`. The full catalog and the
standalone-import story are in **[docs/packs.md](packs.md)**.
```nix
omni.packs.media.enable = true; # gimp, inkscape, mpv, obs, …
omni.packs.development.enable = true; # editors, LSPs, compilers, container CLIs
omni.packs.gaming.enable = true; # Steam, Lutris, Wine
# omni.packs.bitcoin.enable = true; # a real bitcoind + lightning node (opt-in import)
```
## 6. Build and switch
Flakes only see **git-tracked** files, so stage everything first:
```bash
sudo nixos-rebuild switch --flake .#<host>
git init && git add .
sudo nixos-rebuild switch --flake .#myhost
```
> **Flakes not enabled yet?** If your existing NixOS install hasn't
> turned on flakes, this first command fails with something like
> `experimental Nix feature 'nix-command' is disabled` — flakes are
> opt-in on stock NixOS. Bootstrap the first build with a one-shot flag:
> **Flakes not enabled yet?** On a stock NixOS install the first command
> fails with `experimental Nix feature 'nix-command' is disabled` — flakes
> are opt-in. Bootstrap the first build with a one-shot flag:
>
> ```bash
> sudo nixos-rebuild switch --flake .#<host> \
> sudo nixos-rebuild switch --flake .#myhost \
> --extra-experimental-features "nix-command flakes"
> ```
>
> You only need this **once** — Omnixient's own config enables
> `nix-command` and `flakes` (`configuration.nix`), so every later
> `nixos-rebuild` / `omni-rebuild` works without the flag.
> (Alternatively, add
> `nix.settings.experimental-features = [ "nix-command" "flakes" ];`
> to your *current* `/etc/nixos/configuration.nix`, run
> `sudo nixos-rebuild switch`, then come back to this step.)
> Your `hosts/myhost/default.nix` enables flakes permanently, so later
> rebuilds don't need the flag.
On the next boot you'll have the Omnixient desktop. After that, the bundled
helpers take over (`omni-rebuild`, `omni-update`, `omni-theme`,
`omni-help` lists them all — note they're individual `omni-*`
commands, not a single dispatcher).
On the next boot you'll have the Omnixient desktop, plus the bundled helpers
(`omni-rebuild`, `omni-update`, `omni-theme`; `omni-help` lists them).
## 7. Set your password
## 5. Set your password
The template ships `initialPassword = "omni"` (`modules/users.nix`).
Change it immediately after first login:
The default is `initialPassword = "omni"`. Change it after first login:
```bash
passwd
```
For a permanent declarative password, switch to
`hashedPasswordFile` with a sops-managed secret (see
`modules/secrets.nix` and `.sops.yaml`).
For a declarative password, use `hashedPasswordFile` with a sops secret
(see [Secrets](#secrets-optional)).
---
## Already on NixOS?
Adopting Omnixient on a machine you already run is the same flow, with three
differences — because you're protecting a working system:
1. **Enable flakes first** (if you're on channels): add
`nix.settings.experimental-features = [ "nix-command" "flakes" ];` to your
current `/etc/nixos/configuration.nix` and `sudo nixos-rebuild switch`.
2. **Reuse what you have** — copy your existing
`hardware-configuration.nix` into `hosts/myhost/`, and carry your
**existing `stateVersion` across verbatim** (never bump it).
3. **Preview before you switch** — Omnixient is a full opinionated desktop
(Hyprland + greetd login manager + services), so it *will* change your
desktop:
```bash
sudo nixos-rebuild build --flake .#myhost # build only, catch errors
sudo nixos-rebuild build-vm --flake .#myhost && ./result/bin/run-*-vm # try it in a VM
```
When happy, `switch`. If it's not what you want, roll back instantly from
the boot menu or `sudo nixos-rebuild switch --rollback` — your old
generation is untouched.
> If you currently run GNOME/KDE/another login manager, expect overlap with
> greetd + Hyprland; preview in the VM first and disable the old desktop in
> the same switch.
---
## Updating
```bash
nix flake update omni # pull the latest Omnixient
sudo nixos-rebuild switch --flake .#myhost
```
This **can't** conflict with your config — Omnixient is a pinned dependency,
not a checkout. Roll back by reverting `flake.lock`; pin a release with
`omni.url = "git+https://git.atitlan.io/aiolabs/omnixient?ref=v1.0.0"`.
---
## Secrets (optional)
Secrets are **off by default** — a fresh config builds with zero secret
setup. Enable them only if you turn on something that needs one (e.g. an
MCP server) or add your own. Omnixient ships the sops-nix *module*; you supply
the *data*, with **your own** age key:
```bash
# 1. your master key (back this up!)
nix-shell -p age --run 'age-keygen -o ~/.config/sops/age/keys.txt' # prints age1…
# 2. declare yourself the recipient (copy Omnixient's .sops.yaml.example)
$EDITOR .sops.yaml # paste your age1… public key
# 3. create + encrypt your secrets (copy secrets/omni.yaml.example)
nix-shell -p sops --run 'sops secrets/omni.yaml'
# 4. TRACK the encrypted file — flakes only see git-tracked files
git add .sops.yaml secrets/omni.yaml
```
Then enable it in `hosts/myhost/default.nix` and rebuild:
```nix
omni.secrets.enable = true;
```
`modules/secrets.nix` reads `/home/<user>/.config/sops/age/keys.txt`, and
only activates when the flag is set *and* `secrets/omni.yaml` exists — so
it never gets in your way until you ask for it.
---
## Building a custom ISO (optional)
From an Omnixient checkout (or `nix build git+https://git.atitlan.io/aiolabs/omnixient#omni-iso`):
```bash
nix build .#omni-iso # → result/iso/nixos-*.iso
```
The ISO is a live Omnixient environment for installing onto new hardware.
A live Omnixient environment for installing onto new hardware.
---
## Forking instead
If you want to modify Omnixient's own modules/themes rather than just consume
them, fork the repo and edit in place:
```bash
git clone https://git.atitlan.io/aiolabs/omnixient.git ~/omni && cd ~/omni
```
Then model a host on **`hosts/example/`** (copy it to `hosts/<yourhost>/`,
drop in your hardware scan, register it in `flake.nix`), and edit
`settings.nix`. The trade-off is the usual fork one: to get upstream
changes you `git pull` / rebase and resolve conflicts in any files you've
edited. The dependency model above avoids that entirely, which is why it's
recommended for most adopters.
---
## Where to go next
- **[docs/packs.md](packs.md)** — the pack catalog, enabling/disabling, and
reusing packs on a non-Omnixient NixOS.
- **[docs/ARCHITECTURE.md](ARCHITECTURE.md)** — how the flake, `mksystem`,
- **[docs/ARCHITECTURE.md](ARCHITECTURE.md)** — how the flake, `mkSystem`,
modules, and theming fit together.
- **[docs/system-map.md](system-map.md)** — a file-by-file map of the repo.

View file

@ -93,7 +93,7 @@ flake as an input and import just the pack you want:
```nix
# your own flake.nix
inputs.omni.url = "git+ssh://forgejo@git.atitlan.io/aiolabs/omnixient";
inputs.omni.url = "git+https://git.atitlan.io/aiolabs/omnixient";
# your host's modules
{

View file

@ -218,6 +218,19 @@
};
in
{
# Reusable library for external consumers. Use this flake as an
# input and build a host with the Omnixient conventions from your own
# repo, without forking:
#
# omni.lib.mkSystem "myhost" {
# settings = { ... }; # your identity (see settings.nix)
# modules = [ ./hosts/myhost ];
# };
#
# mkSystem bakes in Omnixient's nixpkgs, overlays, and inputs
# (home-manager, sops-nix, …), so you don't redeclare them.
lib.mkSystem = mkSystem;
# NixOS configurations.
#
# This public template ships the `example` host (copy-me starter) and
@ -232,20 +245,13 @@
# that won't match real hardware, so don't `switch` to it. Adopters
# copy hosts/example → hosts/<name> and rename this block. See
# hosts/example/default.nix and docs/getting-started.md.
# nix-colors/lazyvim/walker home-manager modules are injected by
# mkSystem now, so hosts no longer wire them by hand.
example = mkSystem "example" {
inherit system;
user = settings.user;
extraSpecialArgs = { inherit settings; };
extraHmArgs = { inherit settings; };
modules = [
{
home-manager.sharedModules = [
inputs.nix-colors.homeManagerModules.default
inputs.lazyvim.homeManagerModules.default
inputs.walker.homeManagerModules.default
];
}
];
};
# ISO image for live USB/DVD. This is a variant rather than a
@ -298,6 +304,18 @@
# / bitcoin packs are standalone-importable — usable on a non-omni
# NixOS without enabling omni core.
nixosModules = {
# Omnixient core, as a single importable module. A consumer using
# this flake as an input builds a host with:
# omni.lib.mkSystem "myhost" {
# settings = { ... };
# modules = [ omni.nixosModules.omni ./hosts/myhost ];
# };
# mkSystem also injects packs + home-manager; this provides the
# desktop/system core (option namespace + behavior). Theme is
# chosen from settings.theme.
omni = import ./modules;
default = import ./modules;
lnbits = import ./modules/packs/lnbits.nix;
aiolabs = import ./modules/packs/aiolabs.nix;
bitcoin = import ./modules/packs/bitcoin.nix;
@ -308,6 +326,15 @@
containers = import ./modules/packs/containers.nix;
};
# Starter config for adopters: `nix flake init -t github:<org>/omni`
# scaffolds a consumer flake that uses Omnixient as an input (dependency
# model) — see templates/default/README.md.
templates.default = {
path = ./templates/default;
description = "Starter Omnixient consumer config (Omnixient as a flake input)";
};
templates.omni = self.templates.default;
# Flake checks — run by `nix flake check`. Lightweight targets
# that exercise the dev-env module schema end-to-end without
# loading the full omni system. Each check renders a small

View file

@ -56,6 +56,10 @@ name:
user,
devEnv ? false,
modules ? [ ],
# Home-manager config for `user`, as a PATH. External consumers pass
# their own (e.g. `home = ./home.nix`). When null, fall back to this
# repo's users/<user>/home-manager.nix, then to Omnixient's home.nix.
home ? null,
# Extra args merged into the system-level specialArgs. Used by hosts
# whose configuration.nix expects values beyond the defaults (e.g.
# omni's configuration.nix takes `settings` from settings.nix).
@ -70,19 +74,35 @@ let
# fall back to a flat `hosts/<name>.nix`.
hostDir = ../hosts/${name};
hostFile = ../hosts + "/${name}.nix";
hostConfig =
# Internal hosts (this repo's hosts/<name>/) are imported automatically.
# External consumers using this flake as an input have no host dir here,
# so they pass their host config through `modules` and we add nothing.
hostConfigModules =
if builtins.pathExists hostDir then
hostDir
[ hostDir ]
else if builtins.pathExists hostFile then
hostFile
[ hostFile ]
else if modules != [ ] then
[ ]
else
throw "mksystem: no host config for '${name}' (looked at ${toString hostDir} and ${toString hostFile})";
throw "mksystem: no host config for '${name}' add hosts/${name}/ or pass one via `modules` (looked at ${toString hostDir} and ${toString hostFile})";
userNixosConfig = ../users/${user}/nixos.nix;
userHMConfig = ../users/${user}/home-manager.nix;
hasUserNixosConfig = builtins.pathExists userNixosConfig;
hasUserHMConfig = builtins.pathExists userHMConfig;
# Home-manager config for `user`, resolved in priority order so both
# internal hosts and external consumers get a working home:
# 1. caller-supplied `home` (consumer override), else
# 2. this repo's users/<user>/home-manager.nix (internal hosts), else
# 3. Omnixient's default home.nix (consumer whose user isn't in this tree).
internalUserHM = ../users/${user}/home-manager.nix;
userHMConfig =
if home != null then
home
else if builtins.pathExists internalUserHM then
internalUserHM
else
../home.nix;
in
nixpkgs.lib.nixosSystem {
@ -101,10 +121,10 @@ nixpkgs.lib.nixosSystem {
{ nixpkgs.hostPlatform = system; }
{ nixpkgs.overlays = overlays; }
{ nixpkgs.config.allowUnfree = true; }
# Per-host configuration.
hostConfig
]
# Per-host configuration: this repo's hosts/<name>/ when present;
# external consumers supply their host through `modules`.
++ hostConfigModules
# Per-user system-level config (account, shell, sudo) — only if the
# user file exists. Skipping silently is fine; some hosts share users
# defined elsewhere (e.g. omni's users.nix).
@ -135,6 +155,15 @@ nixpkgs.lib.nixosSystem {
currentSystemUser = user;
}
// extraHmArgs;
# Omnixient's home.nix depends on these home-manager modules
# (colorScheme via nix-colors, programs.lazyvim, programs.walker).
# Inject them for every host so consumers don't wire them by hand;
# re-importing the same module from a host's `modules` is a no-op.
home-manager.sharedModules = [
inputs.nix-colors.homeManagerModules.default
inputs.lazyvim.homeManagerModules.default
inputs.walker.homeManagerModules.default
];
}
# Pre-create the home-manager activation script's expected
# directory tree. See modules/home-manager-bootstrap.nix for
@ -144,9 +173,11 @@ nixpkgs.lib.nixosSystem {
# bootstrap.
../modules/home-manager-bootstrap.nix
]
++ nixpkgs.lib.optional hasUserHMConfig {
home-manager.users.${user} = import userHMConfig;
}
++ [
# Home config for `user` — always wired now that userHMConfig always
# resolves (caller `home`, internal shim, or Omnixient's home.nix).
{ home-manager.users.${user} = import userHMConfig; }
]
# dev-env is opt-in.
++ nixpkgs.lib.optional devEnv ../modules/dev-env
# Caller-supplied extras.

48
modules/default.nix Normal file
View file

@ -0,0 +1,48 @@
# Omnixient core module aggregate.
#
# The reusable Omnixient module set as a single importable module, used from
# one source of truth in two places:
# - configuration.nix imports it for this repo's own hosts;
# - it's exposed as `nixosModules.omni` (flake.nix) so an external
# consumer can `imports = [ omni.nixosModules.omni ]` from their
# own flake without forking.
#
# Deliberately NOT here:
# - modules/packs and modules/dev-env — injected separately by
# lib/mksystem.nix (packs unconditionally, dev-env opt-in);
# - hardware-configuration.nix — per-host;
# - the sops-nix / home-manager modules — injected by mkSystem.
#
# The active theme is selected from `settings.theme` (a specialArg
# provided by mkSystem), matching the prior configuration.nix behavior.
{
imports = [
./lib.nix
./core.nix
./colors.nix
./boot.nix
./security.nix
./secrets.nix
./fastfetch.nix
./walker.nix
./scripts.nix
./menus.nix
./desktop/hyprland.nix
./packages.nix
./development.nix
./mcp.nix
./users.nix
./services.nix
./hardware
# Theme: import the colorscheme module named by settings.theme. Kept
# as a settings-driven dynamic import (rather than importing all 12
# and guarding each) so the closure stays minimal.
(
{ settings, ... }:
{
imports = [ ./themes/${settings.theme}.nix ];
}
)
];
}

View file

@ -31,7 +31,7 @@ in
cat /etc/omni/branding/about.txt
echo
echo "Theme: ${cfg.theme}"
echo "Preset: ${cfg.preset or "custom"}"
echo "Preset: ${if cfg.preset == null then "custom" else cfg.preset}"
echo "User: ${cfg.user}"
echo "NixOS Version: $(nixos-version)"
echo
@ -42,29 +42,18 @@ in
# Create Omnixient branding directory
environment.etc."omni/branding/logo.txt".text = ''
omnixient
Declarative NixOS Configuration
'';
environment.etc."omni/branding/about.txt".text = ''
omnixient
🚀 Declarative 🎨 Beautiful Fast
'';
# Create fastfetch configuration
@ -165,7 +154,7 @@ in
},
{
"type": "custom",
"format": " 󰣇 Preset: ${cfg.preset or "custom"}",
"format": " 󰣇 Preset: ${if cfg.preset == null then "custom" else cfg.preset}",
"keyColor": "magenta"
},
{

View file

@ -148,7 +148,7 @@ in
environment.variables = {
OMNI_USER = cfg.user;
OMNI_THEME = cfg.theme;
OMNI_PRESET = cfg.preset or "custom";
OMNI_PRESET = if cfg.preset == null then "custom" else cfg.preset;
OMNI_CONFIG_DIR = helpers.paths.config;
OMNI_CACHE_DIR = helpers.paths.cache;
};
@ -174,7 +174,7 @@ in
echo "Configuration:"
echo " User: ${cfg.user}"
echo " Theme: ${cfg.theme}"
echo " Preset: ${cfg.preset or "none"}"
echo " Preset: ${if cfg.preset == null then "none" else cfg.preset}"
echo ""
echo "Colors (base16 scheme):"
echo " Background: ${helpers.colors.bg}"

View file

@ -44,7 +44,7 @@ in
echo -e "''${WHITE} 🚀 Declarative 🎨 Beautiful Fast''${NC}"
echo
echo -e "''${BLUE}''${NC}"
echo -e "''${WHITE} Theme: ''${YELLOW}${cfg.theme}''${WHITE} User: ''${GREEN}${cfg.user}''${WHITE} Preset: ''${PURPLE}${cfg.preset or "custom"}''${NC}"
echo -e "''${WHITE} Theme: ''${YELLOW}${cfg.theme}''${WHITE} User: ''${GREEN}${cfg.user}''${WHITE} Preset: ''${PURPLE}${if cfg.preset == null then "custom" else cfg.preset}''${NC}"
echo -e "''${BLUE}''${NC}"
echo
}

View file

@ -25,7 +25,7 @@ in
echo " 🐧 OS: NixOS $(nixos-version)"
echo " 🎨 Theme: ${cfg.theme}"
echo " 👤 User: ${cfg.user}"
echo " 🏠 Preset: ${cfg.preset or "custom"}"
echo " 🏠 Preset: ${if cfg.preset == null then "custom" else cfg.preset}"
echo ""
echo " 🔧 Uptime: $(uptime -p)"
echo " 💾 Memory: $(free -h | awk 'NR==2{printf "%.1f/%.1fGB (%.0f%%)", $3/1024/1024, $2/1024/1024, $3*100/$2}')"

View file

@ -0,0 +1,41 @@
# My Omnixient config
Generated from Omnixient's starter template (`nix flake init -t git+https://git.atitlan.io/aiolabs/omnixient`).
You consume Omnixient as a flake **input** — you do not fork it — so
`nix flake update omni` pulls upstream changes without ever touching
your files.
## Setup
1. **Edit `flake.nix`** — set the `omni.url` to the real repo, and fill
in the `settings` block (user, hostName, timeZone, theme, stateVersion).
2. **Generate your hardware scan:**
```bash
sudo nixos-generate-config --show-hardware-config \
> hosts/myhost/hardware-configuration.nix
```
(Rename `hosts/myhost` to your hostname if you like; keep `flake.nix` in sync.)
3. **Pick packs / options** in `hosts/myhost/default.nix`.
4. **`git add` everything** — flakes only see git-tracked files.
5. **Build & switch** (first build on a flakes-disabled system needs the flag):
```bash
sudo nixos-rebuild switch --flake .#myhost \
--extra-experimental-features "nix-command flakes"
```
## Updating
```bash
nix flake update omni # pull latest Omnixient (a pinned dependency)
sudo nixos-rebuild switch --flake .#myhost
```
This can't conflict with your config — Omnixient is an input, not a checkout.
Roll back by reverting `flake.lock`. Pin a release with
`omni.url = "git+https://git.atitlan.io/aiolabs/omnixient?ref=v1.0.0"`.
## Secrets (optional)
Off by default. To enable, set `omni.secrets.enable = true` and provide
your own age key + `secrets/omni.yaml` — see Omnixient's
`docs/getting-started.md`.

View file

@ -0,0 +1,41 @@
{
description = "My NixOS machine(s), built on Omnixient";
inputs = {
# Pin Omnixient. Point this at the canonical repo or your own fork, and
# ideally pin a release tag (…/omni/v1.0.0) for reproducible updates:
# nix flake update omni # pull the latest Omnixient, never touches your config
omni.url = "git+https://git.atitlan.io/aiolabs/omnixient";
# Reuse Omnixient's nixpkgs so you evaluate a single package set.
nixpkgs.follows = "omni/nixpkgs";
};
outputs =
{ omni, ... }:
let
# Your identity + machine settings. Omnixient core reads `settings.theme`;
# the home config reads the rest. Edit these.
settings = {
user = "alice";
gitName = "Alice Example";
gitEmail = "alice@example.com";
hostName = "myhost";
timeZone = "America/New_York";
theme = "tokyo-night"; # any module under Omnixient's modules/themes/
sshKeys = [ ]; # e.g. [ "ssh-ed25519 AAAA… alice@myhost" ]
stateVersion = "24.11"; # release you first installed — never change
};
in
{
nixosConfigurations.${settings.hostName} = omni.lib.mkSystem settings.hostName {
system = "x86_64-linux";
user = settings.user;
extraSpecialArgs = { inherit settings; };
extraHmArgs = { inherit settings; };
modules = [
omni.nixosModules.omni # Omnixient desktop/system core
./hosts/myhost # your hardware + option choices
];
};
};
}

View file

@ -0,0 +1,33 @@
# Your host. Replace hardware-configuration.nix with your real scan:
# sudo nixos-generate-config --show-hardware-config \
# > hosts/myhost/hardware-configuration.nix
{ settings, ... }:
{
imports = [ ./hardware-configuration.nix ];
# Omnixient behavior. See Omnixient's docs/packs.md for the full pack catalog.
omni = {
enable = true;
desktop.enable = true;
user = settings.user;
theme = settings.theme;
packs.development.enable = true;
packs.media.enable = true;
# packs.gaming.enable = true;
# packs.office.enable = true;
# Opt into sops-nix secrets only if you need them (see Omnixient's
# docs/getting-started.md "Enabling secrets"). Off by default.
# secrets.enable = true;
};
# System basics Omnixient core leaves to you:
networking.hostName = settings.hostName;
time.timeZone = settings.timeZone;
nix.settings.experimental-features = [
"nix-command"
"flakes"
];
system.stateVersion = settings.stateVersion;
}

View file

@ -0,0 +1,43 @@
# PLACEHOLDER hardware scan — REPLACE before building on real hardware:
# sudo nixos-generate-config --show-hardware-config > hardware-configuration.nix
#
# This generic stub only lets the template evaluate. The by-label devices
# below will NOT match your machine — a real scan captures your actual
# disks, filesystems, kernel modules, and CPU microcode.
#
# hostPlatform is set by Omnixient's mkSystem; the bootloader (systemd-boot)
# by Omnixient core — so this file only needs filesystems.
{
config,
lib,
modulesPath,
...
}:
{
imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];
boot.initrd.availableKernelModules = [
"xhci_pci"
"nvme"
"ahci"
"usbhid"
"sd_mod"
];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ ];
boot.extraModulePackages = [ ];
fileSystems."/" = {
device = "/dev/disk/by-label/nixos";
fsType = "ext4";
};
fileSystems."/boot" = {
device = "/dev/disk/by-label/boot";
fsType = "vfat";
};
swapDevices = [ ];
networking.useDHCP = lib.mkDefault true;
}