┌─ MD ───────────────────────────────────────────────────────────────────────┐│ ││ ``` ││ ██████╗ ██████╗ ██╗ ██╗███╗ ██╗███████╗████████╗ ││ ██╔═══██╗██╔═══██╗██║ ██╔╝████╗ ██║██╔════╝╚══██╔══╝ ││ ██║ ██║██║ ██║█████╔╝ ██╔██╗ ██║█████╗ ██║ ││ ██║ ██║██║ ██║██╔═██╗ ██║╚██╗██║██╔══╝ ██║ ││ ╚██████╔╝╚██████╔╝██║ ██╗██║ ╚████║███████╗ ██║ ││ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝ ╚═╝ .org ││ ``` ││ ││ <p align= center>A monorepo for all my nix expressions powered by flake-parts.</p> ││ ││ ## Overview ││ ││ The goals of this repository are: ││ ││ 1. To maintain a centralized location for all my personal computing ││ infrastructure ││ 2. 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. ││ ││ ## Features ││ ││ - 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 ││ ││ ## Fleet ││ ││ 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 desk ││ top workstation | x86_64 | UP | ││ | ookst480s | T480s / i5-8350U / 24 GB DDR4 | Workstation | Secondary mo ││ bile workstation | x86_64 | UP | ││ | ooksmicro | GPD Micro PC / N8100 / 8 GB LPDR3 | Workstation | Pocket works ││ tation | x86_64 | UP | ││ | ooksmedia | i3-10100 / 1650 Super / 64 GB DDR4 | Server | Homelab/Medi ││ a 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 webs ││ ite | x86_64 | UP | ││ | ookstest | QEMU VM | Server | Disposable t ││ est/sandbox server | x86_64 | N/A | ││ | ooksphone | Termux | Workstation | Nix environm ││ ent for android phone | aarch64 | DOWN | ││ | ooksair | M4 MBA | Workstation | Primary mobi ││ le workstation | aarch64-darwin | UP | ││ | ooksinstall | Live ISO | Installer | Bootable ins ││ taller image | x86_64 | N/A | ││ ││ ## Architecture ││ ││ 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](https://www.puppet.com/docs/puppet/7/the_role ││ s_and_profiles_method.html)). ││ ││ ### Roles ││ ││ - **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`](https://github.com/NixOS/nixpkgs/blob/master/flake.nix) 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: ││ ││ ```nix ││ flake.ooknet.workstations = { ││ ookst480s = { ││ system = "x86_64-linux"; ││ type = "laptop"; ││ }; ││ ooksair = { ││ system = "aarch64-darwin"; ││ type = "laptop"; ││ }; ││ }; ││ ``` ││ ││ Servers: ││ ││ ```nix ││ flake.ooknet.servers = { ││ ooknode = { ││ system = "x86_64-linux"; ││ type = "vm"; ││ profile = "linode"; ││ domain = "ooknet.org"; ││ services = ["website" "forgejo"]; ││ }; ││ }; ││ ``` ││ ││ Installer images: ││ ││ ```nix ││ flake.ooknet.images = { ││ ooksinstall = { ││ system = "x86_64-linux"; ││ type = "iso"; ││ role = "installer"; ││ }; ││ }; ││ ``` ││ ││ ### Profiles ││ ││ Profiles are collections of related software and configuration that can be ││ enabled on a per-host basis. Some example workstation profiles: ││ ││ - `gaming`: Steam & emulators ││ - `communication`: Discord, Teams, Matrix ││ - `productivity`: Document editing, note-taking ││ - `creative`: Art and design tools ││ - `media`: Audio/video playback and management ││ - `virtualization`: Virtual machine support ││ - `infra`: Infrastructure and ops tooling ││ - `work`: Work specific tooling ││ ││ Example: ││ ││ ```nix ││ 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 website ││ - `forgejo`: Git server ││ - `ookflix`: Media server services ││ - `monitoring`: Metrics and dashboards ││ - `authentik`: Identity provider ││ ││ ```nix ││ ooknet.server.services = ["ookflix" "monitoring"]; ││ ``` ││ ││ ## Desktop environment ││ ││ <img src=".github/assets/2025-01-26T21:52:48,481278761+11:00.png" /> ││ All workstations use a minimal wayland configuration made from the following ││ components: ││ ││ - **Compositor**: [Hyprland](https://github.com/hyprwm/Hyprland) ││ - **Utilities**: ││ - **Idle**: [hypridle](https://github.com/hyprwm/hypridle) ││ - **Screen locker**: [hyprlock](https://github.com/hyprwm/hyprlock) ││ - **Wallpaper**: [hyprpaper](https://github.com/hyprwm/hyprpaper) ││ - **Bar**: [Waybar](https://github.com/Alexays/Waybar) ││ - **Notifications**: [Mako](https://github.com/emersion/mako) ││ - **Color Palette**: ││ [Gruvbox extended](https://github.com/ooks-io/ooknet/blob/main/outputs/hozen/def ││ ault.nix) ││ ││ ## Appreciation ││ ││ I want to give some appreciation to the many people/resources who have helped in ││ some way to build this project. ││ ││ ### People ││ ││ - [ghuntley](https://github.com/ghuntley) ││ - [NobbZ](https://github.com/NobbZ) ││ - [notashelf](https://github.com/NotAShelf) ││ - [mic92](https://github.com/Mic92) ││ - [fabaff](https://github.com/fabaff) ││ - [gerg-l](https://github.com/Gerg-L) ││ - [viperML](https://github.com/viperML) ││ - [colemickens](https://github.com/colemickens) ││ - [fufexan](https://github.com/fufexan) ││ - [max-privatevoid](https://github.com/max-privatevoid) ││ ││ ### Resources ││ ││ - [nix.dev](https://nix.dev/) ││ - [noogle](https://noogle.dev/) ││ - [nix-pills](https://nixos.org/guides/nix-pills/) │└────────────────────────────────────────────────────────────────────────────────────┘
┌─ MD ─────────────────────────────────┐│ ││ ``` ││ ██████╗ ██████╗ ██╗ ██╗███╗ ██╗███████╗ ││ ████████╗ ││ ██╔═══██╗██╔═══██╗██║ ██╔╝████╗ ██║██╔════╝ ││ ╚══██╔══╝ ││ ██║ ██║██║ ██║█████╔╝ ██╔██╗ ██║█████╗ ││ ██║ ││ ██║ ██║██║ ██║██╔═██╗ ██║╚██╗██║██╔══╝ ││ ██║ ││ ╚██████╔╝╚██████╔╝██║ ██╗██║ ╚████║███████╗ ││ ██║ ││ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝ ││ ╚═╝ .org ││ ``` ││ ││ <p align= center>A monorepo for all my nix e ││ xpressions powered by flake-parts.</p> ││ ││ ## Overview ││ ││ The goals of this repository are: ││ ││ 1. To maintain a centralized location for al ││ l my personal computing ││ infrastructure ││ 2. To provide a place to experiment and lear ││ n 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 any ││ one building something similar. ││ ││ ## Features ││ ││ - NixOS configurations for all my hosts ││ - Home-Manager configuration for my workstat ││ ions ││ - Custom packages ││ - Development environments ││ - Declarative secrets with agenix ││ - Personal website ││ - Templates for bootstrapping projects ││ ││ ## Fleet ││ ││ Below are all the hosts I currently maintain ││ within this flake: ││ ││ | host | spec ││ | role | description ││ | architecture | status | ││ | ----------- | ---------------------------- ││ --------- | ----------- | ------------------ ││ --------------- | -------------- | ------ | ││ | ooksdesk | 7500F / RX5700XT / 32 GB DDR ││ 5 | Workstation | Primary desktop wo ││ rkstation | x86_64 | UP | ││ | ookst480s | T480s / i5-8350U / 24 GB DDR ││ 4 | Workstation | Secondary mobile w ││ orkstation | x86_64 | UP | ││ | ooksmicro | GPD Micro PC / N8100 / 8 GB ││ LPDR3 | Workstation | Pocket workstation ││ | x86_64 | UP | ││ | ooksmedia | i3-10100 / 1650 Super / 64 G ││ B DDR4 | Server | Homelab/Media serv ││ er | 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/sa ││ ndbox server | x86_64 | N/A | ││ | ooksphone | Termux ││ | Workstation | Nix environment fo ││ r android phone | aarch64 | DOWN | ││ | ooksair | M4 MBA ││ | Workstation | Primary mobile wor ││ kstation | aarch64-darwin | UP | ││ | ooksinstall | Live ISO ││ | Installer | Bootable installer ││ image | x86_64 | N/A | ││ ││ ## Architecture ││ ││ As this project serves as a learning environ ││ ment, its architecture changes ││ frequently. While I'll try to keep this docu ││ mentation current, what follows is a ││ high-level overview of the current design. ││ ││ The current architecture enables straightfor ││ ward bootstrapping of new hosts ││ while maintaining fine-grained configuration ││ on a per-host basis. This is ││ accomplished using a roles and profiles patt ││ ern (similar to ││ [Puppet's roles and profiles method](https:/ ││ /www.puppet.com/docs/puppet/7/the_roles_and_ ││ profiles_method.html)). ││ ││ ### Roles ││ ││ - **Workstation**: Desktop/laptop systems wi ││ th a GUI environment ││ - **Server**: Headless systems running speci ││ fic services ││ - **Installer**: Bootable ISO images for pro ││ visioning 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 `nixosCon ││ figurations` / ││ `darwinConfigurations`, wiring up the right ││ platform modules ││ ([`lib.nixosSystem`](https://github.com/NixO ││ S/nixpkgs/blob/master/flake.nix) for ││ linux, nix-darwin's `darwinSystem` for macos ││ ) and importing the matching host ││ module from `hosts/<hostname>`. The host att ││ ribute name is the hostname, so a ││ declaration only carries what makes the host ││ unique while the builder absorbs the ││ boilerplate. ││ ││ Workstations: ││ ││ ```nix ││ flake.ooknet.workstations = { ││ ookst480s = { ││ system = "x86_64-linux"; ││ type = "laptop"; ││ }; ││ ooksair = { ││ system = "aarch64-darwin"; ││ type = "laptop"; ││ }; ││ }; ││ ``` ││ ││ Servers: ││ ││ ```nix ││ flake.ooknet.servers = { ││ ooknode = { ││ system = "x86_64-linux"; ││ type = "vm"; ││ profile = "linode"; ││ domain = "ooknet.org"; ││ services = ["website" "forgejo"]; ││ }; ││ }; ││ ``` ││ ││ Installer images: ││ ││ ```nix ││ flake.ooknet.images = { ││ ooksinstall = { ││ system = "x86_64-linux"; ││ type = "iso"; ││ role = "installer"; ││ }; ││ }; ││ ``` ││ ││ ### Profiles ││ ││ Profiles are collections of related software ││ and configuration that can be ││ enabled on a per-host basis. Some example wo ││ rkstation profiles: ││ ││ - `gaming`: Steam & emulators ││ - `communication`: Discord, Teams, Matrix ││ - `productivity`: Document editing, note-tak ││ ing ││ - `creative`: Art and design tools ││ - `media`: Audio/video playback and manageme ││ nt ││ - `virtualization`: Virtual machine support ││ - `infra`: Infrastructure and ops tooling ││ - `work`: Work specific tooling ││ ││ Example: ││ ││ ```nix ││ ooknet.workstation.profiles = ["gaming" "cre ││ ative" "media"]; ││ ``` ││ ││ Servers pick a base `profile` (for VMs, e.g. ││ `linode`) and a list of `services` ││ to run. Some example services: ││ ││ - `website`: My static website ││ - `forgejo`: Git server ││ - `ookflix`: Media server services ││ - `monitoring`: Metrics and dashboards ││ - `authentik`: Identity provider ││ ││ ```nix ││ ooknet.server.services = ["ookflix" "monitor ││ ing"]; ││ ``` ││ ││ ## Desktop environment ││ ││ <img src=".github/assets/2025-01-26T21:52:48 ││ ,481278761+11:00.png" /> ││ All workstations use a minimal wayland confi ││ guration made from the following ││ components: ││ ││ - **Compositor**: [Hyprland](https://github. ││ com/hyprwm/Hyprland) ││ - **Utilities**: ││ - **Idle**: [hypridle](https://github.com/ ││ hyprwm/hypridle) ││ - **Screen locker**: [hyprlock](https://gi ││ thub.com/hyprwm/hyprlock) ││ - **Wallpaper**: [hyprpaper](https://githu ││ b.com/hyprwm/hyprpaper) ││ - **Bar**: [Waybar](https://github.com/Ale ││ xays/Waybar) ││ - **Notifications**: [Mako](https://github ││ .com/emersion/mako) ││ - **Color Palette**: ││ [Gruvbox extended](https://github.com/ooks ││ -io/ooknet/blob/main/outputs/hozen/default.n ││ ix) ││ ││ ## Appreciation ││ ││ I want to give some appreciation to the many ││ people/resources who have helped in ││ some way to build this project. ││ ││ ### People ││ ││ - [ghuntley](https://github.com/ghuntley) ││ - [NobbZ](https://github.com/NobbZ) ││ - [notashelf](https://github.com/NotAShelf) ││ - [mic92](https://github.com/Mic92) ││ - [fabaff](https://github.com/fabaff) ││ - [gerg-l](https://github.com/Gerg-L) ││ - [viperML](https://github.com/viperML) ││ - [colemickens](https://github.com/colemicke ││ ns) ││ - [fufexan](https://github.com/fufexan) ││ - [max-privatevoid](https://github.com/max-p ││ rivatevoid) ││ ││ ### Resources ││ ││ - [nix.dev](https://nix.dev/) ││ - [noogle](https://noogle.dev/) ││ - [nix-pills](https://nixos.org/guides/nix-p ││ ills/) │└──────────────────────────────────────────────┘