██████╗ ██████╗ ██╗ ██╗███╗ ██╗███████╗████████╗
██╔═══██╗██╔═══██╗██║ ██╔╝████╗ ██║██╔════╝╚══██╔══╝
██║ ██║██║ ██║█████╔╝ ██╔██╗ ██║█████╗ ██║
██║ ██║██║ ██║██╔═██╗ ██║╚██╗██║██╔══╝ ██║
╚██████╔╝╚██████╔╝██║ ██╗██║ ╚████║███████╗ ██║
╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝ ╚═╝ .org
A monorepo for all my nix expressions powered by flake-parts.
The goals of this repository are:
- To maintain a centralized location for all my personal computing infrastructure
- To provide a place to experiment and learn about networking, administration, security, unix, design, and programming
Warning
This repository isn't intended to be used by anyone but myself. It's highly personalized and likely doesn't fit anyone else's needs. I maintain this repository publicly as a reference for anyone building something similar.
- NixOS configurations for all my hosts
- Home-Manager configuration for my workstations
- Custom packages
- Development environments
- Declarative secrets with agenix
- Personal website
- Templates for bootstrapping projects
Below are all the hosts I currently maintain within this flake:
| host | spec | role | description | architecture | status |
|---|---|---|---|---|---|
| ooksdesk | 7500F / RX5700XT / 32 GB DDR5 | Workstation | Primary desktop workstation | x86_64 | UP |
| ookst480s | T480s / i5-8350U / 24 GB DDR4 | Workstation | Secondary mobile workstation | x86_64 | UP |
| ooksmicro | GPD Micro PC / N8100 / 8 GB LPDR3 | Workstation | Pocket workstation | x86_64 | UP |
| ooksmedia | i3-10100 / 1650 Super / 64 GB DDR4 | Server | Homelab/Media server | x86_64 | UP |
| ooksx1 | X1 Carbon G4 / i5 6200U / 8 GB LPDDR3 | Workstation | Guest laptop | x86_64 | UP |
| ooknode | Linode Nanode | Server | VPS for website | x86_64 | UP |
| ookstest | QEMU VM | Server | Disposable test/sandbox server | x86_64 | N/A |
| ooksphone | Termux | Workstation | Nix environment for android phone | aarch64 | DOWN |
| ooksair | M4 MBA | Workstation | Primary mobile workstation | aarch64-darwin | UP |
| ooksinstall | Live ISO | Installer | Bootable installer image | x86_64 | N/A |
As this project serves as a learning environment, its architecture changes frequently. While I'll try to keep this documentation current, what follows is a high-level overview of the current design.
The current architecture enables straightforward bootstrapping of new hosts while maintaining fine-grained configuration on a per-host basis. This is accomplished using a roles and profiles pattern (similar to Puppet's roles and profiles method).
- Workstation: Desktop/laptop systems with a GUI environment
- Server: Headless systems running specific services
- Installer: Bootable ISO images for provisioning new hosts
Hosts are declared as plain data under
flake.ooknet.{workstations,servers,images}. The builders in outputs/builder/
map that data with mapAttrs into nixosConfigurations /
darwinConfigurations, wiring up the right platform modules
(lib.nixosSystem for
linux, nix-darwin's darwinSystem for macos) and importing the matching host
module from hosts/<hostname>. The host attribute name is the hostname, so a
declaration only carries what makes the host unique while the builder absorbs the
boilerplate.
Workstations:
flake.ooknet.workstations = {
ookst480s = {
system = "x86_64-linux";
type = "laptop";
};
ooksair = {
system = "aarch64-darwin";
type = "laptop";
};
};Servers:
flake.ooknet.servers = {
ooknode = {
system = "x86_64-linux";
type = "vm";
profile = "linode";
domain = "ooknet.org";
services = ["website" "forgejo"];
};
};Installer images:
flake.ooknet.images = {
ooksinstall = {
system = "x86_64-linux";
type = "iso";
role = "installer";
};
};Profiles are collections of related software and configuration that can be enabled on a per-host basis. Some example workstation profiles:
gaming: Steam & emulatorscommunication: Discord, Teams, Matrixproductivity: Document editing, note-takingcreative: Art and design toolsmedia: Audio/video playback and managementvirtualization: Virtual machine supportinfra: Infrastructure and ops toolingwork: Work specific tooling
Example:
ooknet.workstation.profiles = ["gaming" "creative" "media"];Servers pick a base profile (for VMs, e.g. linode) and a list of services
to run. Some example services:
website: My static websiteforgejo: Git serverookflix: Media server servicesmonitoring: Metrics and dashboardsauthentik: Identity provider
ooknet.server.services = ["ookflix" "monitoring"];- Compositor: Hyprland
- Utilities:
- Color Palette: Gruvbox extended
I want to give some appreciation to the many people/resources who have helped in some way to build this project.