implements liminalOS, a NixOS-based Linux® distribution
Find a file
2024-10-22 23:18:53 -07:00
hosts fix: use new name for noto-fonts-cjk 2024-10-22 23:15:37 -07:00
modules fix: use new name for noto-fonts-cjk 2024-10-22 23:15:37 -07:00
overlays chore: remove commented out lines 2024-09-14 00:04:33 -07:00
users/youwen fix: replace theme with themeFile in kitty config 2024-10-22 23:18:53 -07:00
.gitignore chore: add gitignore 2024-08-28 19:07:38 -07:00
.prettierrc.toml docs(readme): formatting and some more content 2024-08-11 15:05:42 -07:00
flake.lock fix: temporarily use nixpkgs-unstable to build properly 2024-10-22 23:15:52 -07:00
flake.nix fix: temporarily use nixpkgs-unstable to build properly 2024-10-22 23:15:52 -07:00
LICENSE feat: successfully compile on callisto (asahi aarch64) 2024-08-07 05:57:55 -07:00
README.md docs: update some stuff 2024-08-24 03:23:36 -07:00
TODOS.md docs: update some stuff 2024-08-24 03:23:36 -07:00

liminalOS

This is a repository that implements liminalOS, my personal Linux distribution based on NixOS.

Time wasted writing Nix code:

lim·i·nal

  1. between or belonging to two different places, states, etc.

The goal of liminalOS is to allow my computing environment to exist in different places (computers) at the same time, without the minor disparities, issues, and inconsistencies that arise from traditional approaches such as scripting. This works exceptionally well, demonstrated by the fact that I have the exact same environment across three separate machines, spanning two completely different CPU architectures.

Traditionally, we expect to configure each of our computers separately. We have a general idea of the programs, settings, and minor tweaks that we like to make on every computer, but we have to manually set all of these up. Many Unix hackers have thus created sprawling installation scripts to manage their various systems so they can be deployed in a predictable manner each time. Of course, scripts are still heavily dependent on environment and prone to breakage. When they inevitably break, the system is left in a malformed state, where some setup actions have been taken and others have not, and it is up to the system administrator to fix the failing script and ensure the system is set up properly. Also, updating existing machines and rolling back to previous states is a separate, even more difficult issue to solve with this approach.

In essence, the primary failure of setup scripts is that they are imperative - they must specify precisely how to set up the system, down to minute details, whereas in a declarative approach, the user can simply specify what the system should look like, and abstractions take care of the how. This is what NixOS does, and it gives you remote syncing, versioning (via git), and rollbacks for free.

NixOS provides the key tools for reliably deploying systems - namely, a purely functional package manager that's reproducible by default and the necessary abstractions needed for a declarative system configuration. liminalOS is my set of opinionated NixOS and home-manager modules that aim to set up a computing environment independent of the host. This makes it possible for me to share common configuration between a multitude of entirely distinct machines, including an x86_64 desktop, an x86_64 laptop, an Apple Silicon Macbook running NixOS aarch64 using Asahi Linux, and the same Macbook running macOS with nix-darwin, sharing home-manager configuration with NixOS. Specific configuration necessary to adjust hardware-specific details between each machines are isolated to the hosts directory.

Installation guide

TBD. May use deploy-rs or the in-house dartgun tool for easy deployment.

FAQ

This looks like a collection of NixOS configuration files and modules. What makes it a distinct distribution?

Most Linux1 users will agree that any self-respecting distribution must include at least the following: installer, package manager, and some set of default packages. Therefore, anything that implements the aforementioned items must also be a Linux distribution.

liminalOS comes with the Nix package manager (nobody said you need a unique package manager - Ubuntu and Debian are distinct distributions yet both use apt), a custom desktop environment comprised of Waybar, Hyprland, rofi, as well as various applications installed by default, and the means to generate an installer. Therefore, liminalOS is a Linux distribution. QED.2

Should I actually install this?

No. You should instead use the modules as configuration examples if you need them as they are heavily customized for my needs, which are not the same as yours.

Hosts

The modules in liminalOS are designed to be utilized by a wide variety of machine configurations, including via nix-darwin on macOS. To that end, modules are organized by operating system (darwin vs. linux), architecture (x86_64 vs. aarch-64), and form factor (desktop vs laptop). Anything that is agnostic of these distinctions is considered a "common module" and allows configuration to be shared between the various host types. This generally includes core programs like CLI tools, the window manager, etc.

The flake.nix currently contains my configuration for four hosts:

Hostname Description
"callisto" a Macbook Pro M1 (2021) running under Asahi Linux. Imports the laptop module sets as well as the core NixOS module sets.
"demeter" a custom desktop with an i7-13700KF and RTX 4080. Imports the desktop module, the core NixOS modules, and additionally the gaming module.
"phobos" Macbook Pro M1 (2021) running macOS with nix-darwin. Imports the core home-manager module as well as some darwin-specific modules for window managers and the like.
"adrastea" Razer Blade 14 (2021) with RTX 3070. Imports the laptop module, the core NixOS modules, and the gaming module.

Keybinds

Non-exhaustive.

Shortcut Action
Super + W Toggle floating
Super + K Toggle layout
Super + E Open Dolphin
Super + T Open kitty
Super + F Open librewolf
Super + R Open pavucontrol
Super + Space Open rofi
Super + Backspace Open logout menu
Super + L Screenshot region
Super + HJKL Move around
Super + Ctrl + HL Move workspaces
Super + Alt + Ctrl + HJKL Move windows around workspaces
Super + Shift + Ctrl + HJKL Move windows around
Super + S Open Special Workspace
Super + Enter Fullscreen Window
Super + Alt + S Move Window to Special Workspace

  1. also known as GNU/Linux, GNU+Linux, Freedesktop/systemd/musl/busybox Linux, Linux+friends, etc ↩︎

  2. although this is not actually how the converse works, the rigor-hungry mathematicians reading can cry about it. ↩︎