diff --git a/.github/workflows/auto-merge.yml.disabled b/.github/workflows/auto-merge.yml.disabled
new file mode 100644
index 00000000..d1e89c7c
--- /dev/null
+++ b/.github/workflows/auto-merge.yml.disabled
@@ -0,0 +1,21 @@
+name: Auto Merge Dependency Updates
+
+on:
+ - pull_request_target
+
+jobs:
+ auto-merge-dependency-updates:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ pull-requests: write
+ concurrency:
+ group: "auto-merge:${{ github.head_ref }}"
+ cancel-in-progress: true
+ steps:
+ - uses: Mic92/auto-merge@main
+ with:
+ merge-method: rebase
+ approve: true
+ required-labels: dependencies,auto-merge
+ use-auto-merge: true
diff --git a/.github/workflows/build-and-deploy-docs.yml b/.github/workflows/build-and-deploy-docs.yml
new file mode 100644
index 00000000..042e1508
--- /dev/null
+++ b/.github/workflows/build-and-deploy-docs.yml
@@ -0,0 +1,28 @@
+name: Build system documentation and deploy it
+on:
+ push:
+ branches:
+ - "main"
+jobs:
+ build-and-deploy-docs:
+ runs-on: ubuntu-24.04
+ permissions:
+ contents: read
+ pages: write
+ id-token: write
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - uses: DeterminateSystems/nix-installer-action@main
+ - name: Build docs
+ run: |
+ nix build .#docs-rendered
+ - name: Setup Pages
+ uses: actions/configure-pages@v5
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: "./result"
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.github/workflows/build-system.yml.disabled b/.github/workflows/build-system.yml.disabled
new file mode 100644
index 00000000..e60310d5
--- /dev/null
+++ b/.github/workflows/build-system.yml.disabled
@@ -0,0 +1,42 @@
+name: Build system configurations
+
+on:
+ pull_request:
+
+jobs:
+ build-x86_64-demeter:
+ runs-on: ubuntu-24.04
+ permissions:
+ contents: read
+ id-token: write
+ steps:
+ - name: Free Disk Space (Ubuntu)
+ uses: Jayllyz/free-disk-space@perf/use-rmz
+ - uses: actions/checkout@v4
+ - name: Check Nix flake Nixpkgs inputs
+ uses: DeterminateSystems/flake-checker-action@main
+ - uses: DeterminateSystems/nix-installer-action@main
+ with:
+ github-token: ${{ secrets.GH_TOKEN_FOR_UPDATES }}
+ - name: Build demeter
+ run: |
+ # nix flake check --all-systems
+ nix build .#nixosConfigurations.demeter.config.system.build.toplevel
+ build-aarch64-callisto:
+ runs-on: ubuntu-24.04-arm
+ permissions:
+ contents: read
+ id-token: write
+ steps:
+ - name: Free Disk Space (Ubuntu)
+ uses: Jayllyz/free-disk-space@perf/use-rmz
+ - uses: actions/checkout@v4
+ - name: Check Nix flake Nixpkgs inputs
+ uses: DeterminateSystems/flake-checker-action@main
+ - uses: DeterminateSystems/nix-installer-action@main
+ with:
+ github-token: ${{ secrets.GH_TOKEN_FOR_UPDATES }}
+ - name: Build callisto
+ run: |
+ # nix flake check --all-systems
+ nix build .#nixosConfigurations.callisto.config.system.build.toplevel
diff --git a/.github/workflows/lock.yml.disabled b/.github/workflows/lock.yml.disabled
new file mode 100644
index 00000000..f57e1cd0
--- /dev/null
+++ b/.github/workflows/lock.yml.disabled
@@ -0,0 +1,24 @@
+name: update-flake-lock
+on:
+ workflow_dispatch: # allows manual triggering
+ schedule:
+ # Runs weekly at 00:00 UTC on Sunday
+ - cron: "0 0 * * 0"
+jobs:
+ lockfile:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ - name: Install Nix
+ uses: DeterminateSystems/nix-installer-action@main
+ with:
+ github-token: ${{ secrets.GH_TOKEN_FOR_UPDATES }}
+ - name: Update flake.lock
+ uses: DeterminateSystems/update-flake-lock@main
+ with:
+ token: ${{ secrets.GH_TOKEN_FOR_UPDATES }}
+ pr-title: "deps(flake.lock): update"
+ pr-labels: |
+ dependencies,auto-merge
+ pr-assignees: youwen5
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..0eac0253
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+result
+.direnv/
+.aider*
diff --git a/README.md b/README.md
index 7012c65e..3305fc99 100755
--- a/README.md
+++ b/README.md
@@ -1,125 +1,115 @@
-# liminalOS
-
-This is a repository that implements liminalOS, my personal Linux distribution
-based on [NixOS](https://nixos.org/).
-
-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](https://asahilinux.org/), 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](./hosts) directory.
-
-## Installation guide
-
-TBD. May use `deploy-rs` or the in-house
-[dartgun](https://github.com/youwen5/dartgun) tool for easy deployment.
-
-## FAQ
-
-### This looks like a collection of NixOS configuration files and modules. What makes it a distinct distribution?
-
-Most Linux[^1] 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](https://nixos.wiki/wiki/Creating_a_NixOS_live_CD).
-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](/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. |
-
-[^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.
-
-## Keybinds
-
-| Shortcut | Action |
-| -------------------------------------------------------------------------------------------------------- | -------------------------------- |
-| Super + W | Toggle floating |
-| Super + J | 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 + P | Screenshot region |
-| Super + YUIO | Move around |
-| Super + Ctrl + YO | Move workspaces |
-| Super + Alt + Ctrl + YUIO | Move windows around workspaces |
-| Super + Shift + Ctrl + YUIO | Move windows around |
-| Super + S | Open Special Workspace |
-| Super + Enter | Fullscreen Window |
-| Super + Alt + S | Move Window to Special Workspace |
+# functorOS
+
+This is a modification of functorOS with support for sway and other experimental UI elements.
+All of the core modules are from and will be fetched from upstream functorOS.
+
+A highly experimental NixOS-based Linux distribution, descended from liminalOS.
+
+Currently under heavy development and not suitable for daily use. Please see
+[the project wiki](https://code.functor.systems/functor.systems/functorOS/wiki)
+for more details.
+
+See [os.functor.systems](https://os.functor.systems/) for module options.
+
+## Try it
+
+functorOS is ready for power users to test drive. You first need to install
+NixOS on your desired machine. To install functorOS, run the following command
+and look inside `flake.nix`, containing a minimal self-documenting configuration
+for functorOS.
+
+```sh
+nix flake init -t "git+https://code.functor.systems/functor.systems/functorOS"
+```
+
+## Technical overview
+
+```mermaid
+flowchart TB
+ subgraph Core
+ NixOS[NixOS Base System]
+ SysCore["System Core"]:::core
+ BuildTools["System Building Tools"]:::core
+ end
+
+ subgraph PlatformModules
+ direction TB
+ Linux["Linux Modules"]:::linux
+
+ subgraph LinuxComponents
+ direction TB
+ Audio["Audio System"]:::linux
+ Gaming["Gaming Support"]:::linux
+ Graphics["Graphics System"]:::linux
+ Network["Networking"]:::linux
+ Theme["Theming System"]:::linux
+ end
+ end
+
+ subgraph HomeManager
+ direction TB
+ HMCore["Home Manager Core"]:::hm
+ Desktop["Desktop Environment"]:::hm
+ Shell["Shell Environment"]:::hm
+ Platform["Platform-Specific Tweaks"]:::hm
+ end
+
+ subgraph ConfigLayer
+ direction TB
+ HostConfig["Host Configurations"]:::config
+ UserConfig["User Configurations"]:::config
+ Secrets["Secrets Management"]:::security
+ Pkgs["Package Management"]:::pkg
+ end
+
+ %% Relationships
+ NixOS --> SysCore
+ SysCore --> Linux
+ BuildTools --> HostConfig
+
+ Linux --> LinuxComponents
+ Linux --> Desktop
+
+ HMCore --> Shell
+ HMCore --> Platform
+ HMCore --> Desktop
+
+ HostConfig --> UserConfig
+ UserConfig --> Secrets
+ Pkgs --> HostConfig
+
+ %% Click Events
+ click SysCore "https://github.com/youwen5/liminalos/tree/main/modules/linux/core/"
+ click BuildTools "https://github.com/youwen5/liminalos/blob/main/lib/buildLiminalOS.nix"
+ click Linux "https://github.com/youwen5/liminalos/tree/main/modules/linux/"
+ click Audio "https://github.com/youwen5/liminalos/tree/main/modules/linux/audio/"
+ click Gaming "https://github.com/youwen5/liminalos/tree/main/modules/linux/gaming/"
+ click Graphics "https://github.com/youwen5/liminalos/tree/main/modules/linux/graphics/"
+ click Network "https://github.com/youwen5/liminalos/tree/main/modules/linux/networking/"
+ click Theme "https://github.com/youwen5/liminalos/tree/main/modules/linux/stylix/"
+ click HMCore "https://github.com/youwen5/liminalos/tree/main/hm/modules/common/"
+ click Desktop "https://github.com/youwen5/liminalos/tree/main/hm/modules/linux/desktop-environment/"
+ click Shell "https://github.com/youwen5/liminalos/tree/main/hm/modules/common/shellenv/"
+ click Platform "https://github.com/youwen5/liminalos/tree/main/hm/modules/linux/platform-tweaks/"
+ click HostConfig "https://github.com/youwen5/liminalos/tree/main/reference/hosts/"
+ click UserConfig "https://github.com/youwen5/liminalos/tree/main/reference/users/"
+ click Secrets "https://github.com/youwen5/liminalos/tree/main/reference/secrets/"
+ click Pkgs "https://github.com/youwen5/liminalos/tree/main/pkgs/"
+
+ %% Styling
+ classDef core fill:#2196F3,stroke:#1565C0,color:white
+ classDef linux fill:#4CAF50,stroke:#2E7D32,color:white
+ classDef hm fill:#FF9800,stroke:#EF6C00,color:white
+ classDef config fill:#795548,stroke:#4E342E,color:white
+ classDef security fill:#F44336,stroke:#C62828,color:white
+ classDef pkg fill:#607D8B,stroke:#37474F,color:white
+
+```
+
+## Reference implementations
+
+- Minimal template --- see [Try it](#try-it).
+- @kaitotlex --- [ame](https://github.com/kaitotlex/ame). A simple functorOS deployment relied completely on the flake, including additional flake support, and advanced host configs tailored specifically to the hardware. The primary use case is for functional roll back with the name derived from a fictional detective time traveler.
+
+
+
diff --git a/TODOS.md b/TODOS.md
deleted file mode 100644
index 1322e17d..00000000
--- a/TODOS.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# To Do
-
-## P1
-
-- Massively refactor module system
-
-## P2
-
-- Add Nvidia-specific config options for Hyprland (blocked by P1)
diff --git a/default.nix b/default.nix
new file mode 100644
index 00000000..f98f7624
--- /dev/null
+++ b/default.nix
@@ -0,0 +1,81 @@
+{
+ nixpkgs,
+ self,
+ inputs,
+ functorOS,
+}:
+rec {
+ # a thin wrapper around nixosSystem
+ system.instantiate =
+ {
+ hostname,
+ users,
+ configuration,
+ }:
+ nixpkgs.lib.nixosSystem {
+ specialArgs = {
+ inherit self inputs;
+ functorOSInputs = functorOS.inputs;
+ };
+ modules = [
+ functorOS.nixosModules.functorOS
+ configuration
+ {
+ networking.hostName = hostname;
+ }
+ ]
+ ++ users;
+ };
+ # a single place to configure all user options for a given user
+ user.instantiate =
+ {
+ username,
+ homeDirectory,
+ configuration,
+ fullName,
+ email,
+ superuser ? true,
+ configureGitUser ? true,
+ initialHashedPassword ? null,
+ extraGroups ? [ ],
+ _extraConfig ? { },
+ }:
+ { pkgs, config, ... }:
+ {
+ config = {
+ users.users.${username} = {
+ shell = nixpkgs.lib.mkOverride 999 pkgs.nushell;
+ isNormalUser = true;
+ description = fullName;
+ extraGroups =
+ nixpkgs.lib.optionals superuser [
+ "wheel"
+ ]
+ ++ nixpkgs.lib.optionals config.networking.networkmanager.enable [ "networkmanager" ]
+ ++ extraGroups;
+ initialHashedPassword = nixpkgs.lib.mkIf (initialHashedPassword != null) initialHashedPassword;
+ };
+
+ functorOS._users = [ { inherit username superuser; } ];
+
+ home-manager.extraSpecialArgs = { inherit self inputs; };
+ home-manager.users.${username} = {
+ imports = [
+ functorOS.homeManagerModules.functorOS
+ configuration
+ _extraConfig
+ ];
+ home = {
+ inherit username homeDirectory;
+ };
+ programs.git.settings = nixpkgs.lib.mkIf configureGitUser {
+ user.name = fullName;
+ user.email = email;
+ };
+ };
+ };
+ };
+ # same as user.instantiate, but return a function that accepts additional user configuration instead
+ user.instantiate' =
+ { ... }@args: extraConfig: user.instantiate (args // { _extraConfig = extraConfig; });
+}
diff --git a/docs/raw.nix b/docs/raw.nix
new file mode 100644
index 00000000..54ffbfc4
--- /dev/null
+++ b/docs/raw.nix
@@ -0,0 +1,27 @@
+{
+ lib,
+ runCommand,
+ nixosOptionsDoc,
+ pkgs,
+ hash,
+ ...
+}:
+let
+ # evaluate our options
+ eval = lib.evalModules {
+ modules = [ ../modules/default.nix ];
+ specialArgs = {
+ inherit pkgs;
+ };
+ };
+ # generate our docs
+ optionsDoc = nixosOptionsDoc {
+ inherit (eval) options;
+ };
+in
+# create a derivation for capturing the markdown output
+runCommand "options-doc.md" { } ''
+ tail -n +64 ${optionsDoc.optionsCommonMark} \
+ | sed -E 's#\[/nix/store/[a-z0-9]+-source(/[^]]*)\]\(file:///nix/store/[a-z0-9]+-source([^)]*)\)#[\1](https://code.functor.systems/functor.systems/functorOS/src/commit/${hash}\2)#g' \
+ >> $out
+''
diff --git a/docs/rendered.nix b/docs/rendered.nix
new file mode 100644
index 00000000..46ae6a10
--- /dev/null
+++ b/docs/rendered.nix
@@ -0,0 +1,27 @@
+{
+ docs-raw,
+ title,
+ pandoc,
+ stdenvNoCC,
+}:
+stdenvNoCC.mkDerivation {
+ name = "docs";
+
+ phases = [
+ "buildPhase"
+ "installPhase"
+ ];
+
+ nativeBuildInputs = [
+ pandoc
+ ];
+
+ buildPhase = ''
+ pandoc -s ${docs-raw} -o index.html --metadata title="${title}"
+ '';
+
+ installPhase = ''
+ mkdir -p $out
+ cp index.html $out/index.html
+ '';
+}
diff --git a/flake.lock b/flake.lock
old mode 100755
new mode 100644
index 3386095d..a524937e
--- a/flake.lock
+++ b/flake.lock
@@ -1,88 +1,161 @@
{
"nodes": {
- "apple-silicon": {
+ "advisory-db": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1757099341,
+ "narHash": "sha256-pNcLWCi1XNN7OnIRXd53YIzDibe33sEt1tIotJuWYV4=",
+ "owner": "rustsec",
+ "repo": "advisory-db",
+ "rev": "d6c6489daf1d2216b0bf99f6f6b66e53aa3b31cd",
+ "type": "github"
+ },
+ "original": {
+ "owner": "rustsec",
+ "repo": "advisory-db",
+ "type": "github"
+ }
+ },
+ "agenix": {
"inputs": {
- "flake-compat": "flake-compat",
+ "agenix": "agenix_2",
+ "crane": "crane",
+ "flake-utils": [
+ "flake-utils"
+ ],
"nixpkgs": [
"nixpkgs"
],
"rust-overlay": "rust-overlay"
},
"locked": {
- "lastModified": 1722469787,
- "narHash": "sha256-P20oAmbgXHl1E77TXPXiAj1Ntycc1mf7fZMI7X13VYw=",
- "owner": "tpwrules",
- "repo": "nixos-apple-silicon",
- "rev": "8a665fee82901878edaeb8ee120296a979db2dd2",
+ "lastModified": 1761832913,
+ "narHash": "sha256-VCNVjjuRvrKPiYYwqhE3BAKIaReiKXGpxGp27lZ0MFM=",
+ "owner": "yaxitech",
+ "repo": "ragenix",
+ "rev": "83bccfdea758241999f32869fb6b36f7ac72f1ac",
"type": "github"
},
"original": {
- "owner": "tpwrules",
- "repo": "nixos-apple-silicon",
+ "owner": "yaxitech",
+ "repo": "ragenix",
"type": "github"
}
},
- "bleedingpkgs": {
+ "agenix_2": {
+ "inputs": {
+ "darwin": "darwin",
+ "home-manager": "home-manager",
+ "nixpkgs": [
+ "agenix",
+ "nixpkgs"
+ ],
+ "systems": "systems"
+ },
"locked": {
- "lastModified": 1724117083,
- "narHash": "sha256-26Zgap4D9E8PRL9jvc4Df9POMNGFS9fMwKz+SiGrlXI=",
- "owner": "nixos",
- "repo": "nixpkgs",
- "rev": "44f636f8cb95238dabd5f33d00557329c0681cd5",
+ "lastModified": 1761656077,
+ "narHash": "sha256-lsNWuj4Z+pE7s0bd2OKicOFq9bK86JE0ZGeKJbNqb94=",
+ "owner": "ryantm",
+ "repo": "agenix",
+ "rev": "9ba0d85de3eaa7afeab493fed622008b6e4924f5",
"type": "github"
},
"original": {
- "owner": "nixos",
- "ref": "master",
- "repo": "nixpkgs",
+ "owner": "ryantm",
+ "repo": "agenix",
+ "type": "github"
+ }
+ },
+ "base16": {
+ "inputs": {
+ "fromYaml": "fromYaml"
+ },
+ "locked": {
+ "lastModified": 1755819240,
+ "narHash": "sha256-qcMhnL7aGAuFuutH4rq9fvAhCpJWVHLcHVZLtPctPlo=",
+ "owner": "SenchoPens",
+ "repo": "base16.nix",
+ "rev": "75ed5e5e3fce37df22e49125181fa37899c3ccd6",
+ "type": "github"
+ },
+ "original": {
+ "owner": "SenchoPens",
+ "repo": "base16.nix",
"type": "github"
}
},
- "brew-src": {
+ "base16-fish": {
"flake": false,
"locked": {
- "lastModified": 1718075954,
- "narHash": "sha256-4TeUhv5VLEufP+Z/NkKnUk4NUaf59cMsj6NvsVbE+8w=",
- "owner": "Homebrew",
- "repo": "brew",
- "rev": "3f08c75e7b950d4340dab462f3e7f77e8093fa2b",
+ "lastModified": 1765809053,
+ "narHash": "sha256-XCUQLoLfBJ8saWms2HCIj4NEN+xNsWBlU1NrEPcQG4s=",
+ "owner": "tomyun",
+ "repo": "base16-fish",
+ "rev": "86cbea4dca62e08fb7fd83a70e96472f92574782",
"type": "github"
},
"original": {
- "owner": "Homebrew",
- "ref": "4.3.5",
- "repo": "brew",
+ "owner": "tomyun",
+ "repo": "base16-fish",
+ "rev": "86cbea4dca62e08fb7fd83a70e96472f92574782",
"type": "github"
}
},
- "catppuccin": {
+ "base16-helix": {
+ "flake": false,
"locked": {
- "lastModified": 1724048768,
- "narHash": "sha256-OZ9OXsPQi+fNdMM7SBPtU8OB1ntLzOvUwA/3zYJY6Eo=",
- "owner": "catppuccin",
- "repo": "nix",
- "rev": "ff4128f8ea57879050145cf077a27b9d3a9cbf33",
+ "lastModified": 1760703920,
+ "narHash": "sha256-m82fGUYns4uHd+ZTdoLX2vlHikzwzdu2s2rYM2bNwzw=",
+ "owner": "tinted-theming",
+ "repo": "base16-helix",
+ "rev": "d646af9b7d14bff08824538164af99d0c521b185",
"type": "github"
},
"original": {
- "owner": "catppuccin",
- "repo": "nix",
+ "owner": "tinted-theming",
+ "repo": "base16-helix",
+ "type": "github"
+ }
+ },
+ "base16-vim": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1732806396,
+ "narHash": "sha256-e0bpPySdJf0F68Ndanwm+KWHgQiZ0s7liLhvJSWDNsA=",
+ "owner": "tinted-theming",
+ "repo": "base16-vim",
+ "rev": "577fe8125d74ff456cf942c733a85d769afe58b7",
+ "type": "github"
+ },
+ "original": {
+ "owner": "tinted-theming",
+ "repo": "base16-vim",
+ "rev": "577fe8125d74ff456cf942c733a85d769afe58b7",
"type": "github"
}
},
"crane": {
- "inputs": {
- "nixpkgs": [
- "lanzaboote",
- "nixpkgs"
- ]
+ "locked": {
+ "lastModified": 1760924934,
+ "narHash": "sha256-tuuqY5aU7cUkR71sO2TraVKK2boYrdW3gCSXUkF4i44=",
+ "owner": "ipetkov",
+ "repo": "crane",
+ "rev": "c6b4d5308293d0d04fcfeee92705017537cad02f",
+ "type": "github"
},
+ "original": {
+ "owner": "ipetkov",
+ "repo": "crane",
+ "type": "github"
+ }
+ },
+ "crane_2": {
"locked": {
- "lastModified": 1717535930,
- "narHash": "sha256-1hZ/txnbd/RmiBPNUs7i8UQw2N89uAK3UzrGAWdnFfU=",
+ "lastModified": 1756705356,
+ "narHash": "sha256-dpBFe8SqYKr7W6KN5QOVCr8N76SBKwTslzjw+4BVBVs=",
"owner": "ipetkov",
"repo": "crane",
- "rev": "55e7754ec31dac78980c8be45f8a28e80e370946",
+ "rev": "305707bbc27d83aa1039378e91d7dd816f4cac10",
"type": "github"
},
"original": {
@@ -91,50 +164,53 @@
"type": "github"
}
},
- "devshell": {
+ "darwin": {
"inputs": {
"nixpkgs": [
- "nixvim",
+ "agenix",
+ "agenix",
"nixpkgs"
]
},
"locked": {
- "lastModified": 1722113426,
- "narHash": "sha256-Yo/3loq572A8Su6aY5GP56knpuKYRvM2a1meP9oJZCw=",
- "owner": "numtide",
- "repo": "devshell",
- "rev": "67cce7359e4cd3c45296fb4aaf6a19e2a9c757ae",
+ "lastModified": 1744478979,
+ "narHash": "sha256-dyN+teG9G82G+m+PX/aSAagkC+vUv0SgUw3XkPhQodQ=",
+ "owner": "lnl7",
+ "repo": "nix-darwin",
+ "rev": "43975d782b418ebf4969e9ccba82466728c2851b",
"type": "github"
},
"original": {
- "owner": "numtide",
- "repo": "devshell",
+ "owner": "lnl7",
+ "ref": "master",
+ "repo": "nix-darwin",
"type": "github"
}
},
- "flake-compat": {
+ "firefox-gnome-theme": {
+ "flake": false,
"locked": {
- "lastModified": 1688025799,
- "narHash": "sha256-ktpB4dRtnksm9F5WawoIkEneh1nrEvuxb5lJFt1iOyw=",
- "owner": "nix-community",
- "repo": "flake-compat",
- "rev": "8bf105319d44f6b9f0d764efa4fdef9f1cc9ba1c",
+ "lastModified": 1764873433,
+ "narHash": "sha256-1XPewtGMi+9wN9Ispoluxunw/RwozuTRVuuQOmxzt+A=",
+ "owner": "rafaelmardojai",
+ "repo": "firefox-gnome-theme",
+ "rev": "f7ffd917ac0d253dbd6a3bf3da06888f57c69f92",
"type": "github"
},
"original": {
- "owner": "nix-community",
- "repo": "flake-compat",
+ "owner": "rafaelmardojai",
+ "repo": "firefox-gnome-theme",
"type": "github"
}
},
- "flake-compat_2": {
+ "flake-compat": {
"flake": false,
"locked": {
- "lastModified": 1696426674,
- "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
+ "lastModified": 1747046372,
+ "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=",
"owner": "edolstra",
"repo": "flake-compat",
- "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
+ "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885",
"type": "github"
},
"original": {
@@ -143,54 +219,34 @@
"type": "github"
}
},
- "flake-compat_3": {
- "locked": {
- "lastModified": 1696426674,
- "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
- "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
- "revCount": 57,
- "type": "tarball",
- "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.0.1/018afb31-abd1-7bff-a5e4-cff7e18efb7a/source.tar.gz"
- },
- "original": {
- "type": "tarball",
- "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"
- }
- },
- "flake-parts": {
- "inputs": {
- "nixpkgs-lib": [
- "lanzaboote",
- "nixpkgs"
- ]
- },
+ "flake-compat_2": {
+ "flake": false,
"locked": {
- "lastModified": 1717285511,
- "narHash": "sha256-iKzJcpdXih14qYVcZ9QC9XuZYnPc6T8YImb6dX166kw=",
- "owner": "hercules-ci",
- "repo": "flake-parts",
- "rev": "2a55567fcf15b1b1c7ed712a2c6fadaec7412ea8",
+ "lastModified": 1767039857,
+ "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
+ "owner": "edolstra",
+ "repo": "flake-compat",
+ "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
"type": "github"
},
"original": {
- "owner": "hercules-ci",
- "repo": "flake-parts",
+ "owner": "edolstra",
+ "repo": "flake-compat",
"type": "github"
}
},
- "flake-parts_2": {
+ "flake-parts": {
"inputs": {
"nixpkgs-lib": [
- "nixvim",
"nixpkgs"
]
},
"locked": {
- "lastModified": 1722555600,
- "narHash": "sha256-XOQkdLafnb/p9ij77byFQjDf5m5QYl9b2REiVClC+x4=",
+ "lastModified": 1772408722,
+ "narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=",
"owner": "hercules-ci",
"repo": "flake-parts",
- "rev": "8471fe90ad337a8074e957b69ca4d0089218391d",
+ "rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3",
"type": "github"
},
"original": {
@@ -200,33 +256,15 @@
}
},
"flake-utils": {
- "inputs": {
- "systems": "systems"
- },
- "locked": {
- "lastModified": 1710146030,
- "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
- "owner": "numtide",
- "repo": "flake-utils",
- "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
- "type": "github"
- },
- "original": {
- "owner": "numtide",
- "repo": "flake-utils",
- "type": "github"
- }
- },
- "flake-utils_2": {
"inputs": {
"systems": "systems_2"
},
"locked": {
- "lastModified": 1710146030,
- "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
+ "lastModified": 1731533236,
+ "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
- "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
+ "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
@@ -235,143 +273,55 @@
"type": "github"
}
},
- "flake-utils_3": {
- "inputs": {
- "systems": "systems_3"
- },
- "locked": {
- "lastModified": 1710146030,
- "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
- "owner": "numtide",
- "repo": "flake-utils",
- "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
- "type": "github"
- },
- "original": {
- "owner": "numtide",
- "repo": "flake-utils",
- "type": "github"
- }
- },
- "flake-utils_4": {
- "inputs": {
- "systems": "systems_4"
- },
- "locked": {
- "lastModified": 1710146030,
- "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
- "owner": "numtide",
- "repo": "flake-utils",
- "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
- "type": "github"
- },
- "original": {
- "owner": "numtide",
- "repo": "flake-utils",
- "type": "github"
- }
- },
- "flakey-profile": {
- "locked": {
- "lastModified": 1712898590,
- "narHash": "sha256-FhGIEU93VHAChKEXx905TSiPZKga69bWl1VB37FK//I=",
- "owner": "lf-",
- "repo": "flakey-profile",
- "rev": "243c903fd8eadc0f63d205665a92d4df91d42d9d",
- "type": "github"
- },
- "original": {
- "owner": "lf-",
- "repo": "flakey-profile",
- "type": "github"
- }
- },
- "git-hooks": {
- "inputs": {
- "flake-compat": [
- "nixvim",
- "flake-compat"
- ],
- "gitignore": "gitignore_2",
- "nixpkgs": [
- "nixvim",
- "nixpkgs"
- ],
- "nixpkgs-stable": [
- "nixvim",
- "nixpkgs"
- ]
- },
- "locked": {
- "lastModified": 1723803910,
- "narHash": "sha256-yezvUuFiEnCFbGuwj/bQcqg7RykIEqudOy/RBrId0pc=",
- "owner": "cachix",
- "repo": "git-hooks.nix",
- "rev": "bfef0ada09e2c8ac55bbcd0831bd0c9d42e651ba",
- "type": "github"
- },
- "original": {
- "owner": "cachix",
- "repo": "git-hooks.nix",
- "type": "github"
- }
- },
- "gitignore": {
- "inputs": {
- "nixpkgs": [
- "lanzaboote",
- "pre-commit-hooks-nix",
- "nixpkgs"
- ]
- },
+ "fromYaml": {
+ "flake": false,
"locked": {
- "lastModified": 1709087332,
- "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
- "owner": "hercules-ci",
- "repo": "gitignore.nix",
- "rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
+ "lastModified": 1731966426,
+ "narHash": "sha256-lq95WydhbUTWig/JpqiB7oViTcHFP8Lv41IGtayokA8=",
+ "owner": "SenchoPens",
+ "repo": "fromYaml",
+ "rev": "106af9e2f715e2d828df706c386a685698f3223b",
"type": "github"
},
"original": {
- "owner": "hercules-ci",
- "repo": "gitignore.nix",
+ "owner": "SenchoPens",
+ "repo": "fromYaml",
"type": "github"
}
},
- "gitignore_2": {
- "inputs": {
- "nixpkgs": [
- "nixvim",
- "git-hooks",
- "nixpkgs"
- ]
- },
+ "gnome-shell": {
+ "flake": false,
"locked": {
- "lastModified": 1709087332,
- "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
- "owner": "hercules-ci",
- "repo": "gitignore.nix",
- "rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
- "type": "github"
+ "host": "gitlab.gnome.org",
+ "lastModified": 1767737596,
+ "narHash": "sha256-eFujfIUQDgWnSJBablOuG+32hCai192yRdrNHTv0a+s=",
+ "owner": "GNOME",
+ "repo": "gnome-shell",
+ "rev": "ef02db02bf0ff342734d525b5767814770d85b49",
+ "type": "gitlab"
},
"original": {
- "owner": "hercules-ci",
- "repo": "gitignore.nix",
- "type": "github"
+ "host": "gitlab.gnome.org",
+ "owner": "GNOME",
+ "ref": "gnome-49",
+ "repo": "gnome-shell",
+ "type": "gitlab"
}
},
"home-manager": {
"inputs": {
"nixpkgs": [
+ "agenix",
+ "agenix",
"nixpkgs"
]
},
"locked": {
- "lastModified": 1723986931,
- "narHash": "sha256-Fy+KEvDQ+Hc8lJAV3t6leXhZJ2ncU5/esxkgt3b8DEY=",
+ "lastModified": 1745494811,
+ "narHash": "sha256-YZCh2o9Ua1n9uCvrvi5pRxtuVNml8X2a03qIFfRKpFs=",
"owner": "nix-community",
"repo": "home-manager",
- "rev": "2598861031b78aadb4da7269df7ca9ddfc3e1671",
+ "rev": "abfad3d2958c9e6300a883bd443512c55dfeb1be",
"type": "github"
},
"original": {
@@ -383,16 +333,15 @@
"home-manager_2": {
"inputs": {
"nixpkgs": [
- "nixvim",
"nixpkgs"
]
},
"locked": {
- "lastModified": 1723986931,
- "narHash": "sha256-Fy+KEvDQ+Hc8lJAV3t6leXhZJ2ncU5/esxkgt3b8DEY=",
+ "lastModified": 1774379316,
+ "narHash": "sha256-0nGNxWDUH2Hzlj/R3Zf4FEK6fsFNB/dvewuboSRZqiI=",
"owner": "nix-community",
"repo": "home-manager",
- "rev": "2598861031b78aadb4da7269df7ca9ddfc3e1671",
+ "rev": "1eb0549a1ab3fe3f5acf86668249be15fa0e64f7",
"type": "github"
},
"original": {
@@ -401,100 +350,26 @@
"type": "github"
}
},
- "homebrew-cask": {
- "flake": false,
- "locked": {
- "lastModified": 1724120139,
- "narHash": "sha256-vVE53gBCJPc3/dj7OHvQ7mNuUk1bWVpNR4c0jKe+K9U=",
- "owner": "homebrew",
- "repo": "homebrew-cask",
- "rev": "606d3429e6fae79849c0eaf4bbcf05ff1570051a",
- "type": "github"
- },
- "original": {
- "owner": "homebrew",
- "repo": "homebrew-cask",
- "type": "github"
- }
- },
- "homebrew-core": {
- "flake": false,
- "locked": {
- "lastModified": 1724119620,
- "narHash": "sha256-p+M24z3IDeIJBppaWWTpaz63WMGvi3HGW/mQHQVYpgM=",
- "owner": "homebrew",
- "repo": "homebrew-core",
- "rev": "cd06a79081ce6e08b475e01315cdf1cb51952d77",
- "type": "github"
- },
- "original": {
- "owner": "homebrew",
- "repo": "homebrew-core",
- "type": "github"
- }
- },
- "lanzaboote": {
+ "musnix": {
"inputs": {
- "crane": "crane",
- "flake-compat": "flake-compat_2",
- "flake-parts": "flake-parts",
- "flake-utils": "flake-utils",
"nixpkgs": [
"nixpkgs"
- ],
- "pre-commit-hooks-nix": "pre-commit-hooks-nix",
- "rust-overlay": "rust-overlay_2"
+ ]
},
"locked": {
- "lastModified": 1718178907,
- "narHash": "sha256-eSZyrQ9uoPB9iPQ8Y5H7gAmAgAvCw3InStmU3oEjqsE=",
- "owner": "nix-community",
- "repo": "lanzaboote",
- "rev": "b627ccd97d0159214cee5c7db1412b75e4be6086",
+ "lastModified": 1773185476,
+ "narHash": "sha256-COuJkFg669oalmEN3T61gD3gM9SfUsiGvDS9pCOphZY=",
+ "owner": "musnix",
+ "repo": "musnix",
+ "rev": "739e2a1f94c87d5f4c8b880a12480185cf0d7620",
"type": "github"
},
"original": {
- "owner": "nix-community",
- "ref": "v0.4.1",
- "repo": "lanzaboote",
+ "owner": "musnix",
+ "repo": "musnix",
"type": "github"
}
},
- "lix": {
- "flake": false,
- "locked": {
- "lastModified": 1720626042,
- "narHash": "sha256-f8k+BezKdJfmE+k7zgBJiohtS3VkkriycdXYsKOm3sc=",
- "rev": "2a4376be20d70feaa2b0e640c5041fb66ddc67ed",
- "type": "tarball",
- "url": "https://git.lix.systems/api/v1/repos/lix-project/lix/archive/2a4376be20d70feaa2b0e640c5041fb66ddc67ed.tar.gz"
- },
- "original": {
- "type": "tarball",
- "url": "https://git.lix.systems/lix-project/lix/archive/2.90.0.tar.gz"
- }
- },
- "lix-module": {
- "inputs": {
- "flake-utils": "flake-utils_2",
- "flakey-profile": "flakey-profile",
- "lix": "lix",
- "nixpkgs": [
- "nixpkgs"
- ]
- },
- "locked": {
- "lastModified": 1720641669,
- "narHash": "sha256-yEO2cGNgzm9x/XxiDQI+WckSWnZX63R8aJLBRSXtYNE=",
- "rev": "5c48c833c15bb80d127a398a8c2484d42fdd8257",
- "type": "tarball",
- "url": "https://git.lix.systems/api/v1/repos/lix-project/nixos-module/archive/5c48c833c15bb80d127a398a8c2484d42fdd8257.tar.gz"
- },
- "original": {
- "type": "tarball",
- "url": "https://git.lix.systems/lix-project/nixos-module/archive/2.90.0.tar.gz"
- }
- },
"nix-darwin": {
"inputs": {
"nixpkgs": [
@@ -502,11 +377,11 @@
]
},
"locked": {
- "lastModified": 1723859949,
- "narHash": "sha256-kiaGz4deGYKMjJPOji/JVvSP/eTefrIA3rAjOnOpXl4=",
+ "lastModified": 1773000227,
+ "narHash": "sha256-zm3ftUQw0MPumYi91HovoGhgyZBlM4o3Zy0LhPNwzXE=",
"owner": "LnL7",
"repo": "nix-darwin",
- "rev": "076b9a905af8a52b866c8db068d6da475839d97b",
+ "rev": "da529ac9e46f25ed5616fd634079a5f3c579135f",
"type": "github"
},
"original": {
@@ -515,118 +390,111 @@
"type": "github"
}
},
- "nix-darwin_2": {
- "inputs": {
- "nixpkgs": "nixpkgs"
- },
+ "nix-flatpak": {
"locked": {
- "lastModified": 1716329735,
- "narHash": "sha256-ap51w+VqG21vuzyQ04WrhI2YbWHd3UGz0e7dc/QQmoA=",
- "owner": "LnL7",
- "repo": "nix-darwin",
- "rev": "eac4f25028c1975a939c8f8fba95c12f8a25e01c",
+ "lastModified": 1768656715,
+ "narHash": "sha256-Sbh037scxKFm7xL0ahgSCw+X2/5ZKeOwI2clqrYr9j4=",
+ "owner": "gmodena",
+ "repo": "nix-flatpak",
+ "rev": "123fe29340a5b8671367055b75a6e7c320d6f89a",
"type": "github"
},
"original": {
- "owner": "LnL7",
- "repo": "nix-darwin",
+ "owner": "gmodena",
+ "repo": "nix-flatpak",
"type": "github"
}
},
- "nix-darwin_3": {
+ "nix-github-actions": {
"inputs": {
"nixpkgs": [
- "nixvim",
+ "run0-sudo-shim",
"nixpkgs"
]
},
"locked": {
- "lastModified": 1723859949,
- "narHash": "sha256-kiaGz4deGYKMjJPOji/JVvSP/eTefrIA3rAjOnOpXl4=",
- "owner": "lnl7",
- "repo": "nix-darwin",
- "rev": "076b9a905af8a52b866c8db068d6da475839d97b",
+ "lastModified": 1737420293,
+ "narHash": "sha256-F1G5ifvqTpJq7fdkT34e/Jy9VCyzd5XfJ9TO8fHhJWE=",
+ "owner": "nix-community",
+ "repo": "nix-github-actions",
+ "rev": "f4158fa080ef4503c8f4c820967d946c2af31ec9",
"type": "github"
},
"original": {
- "owner": "lnl7",
- "repo": "nix-darwin",
+ "owner": "nix-community",
+ "repo": "nix-github-actions",
"type": "github"
}
},
- "nix-homebrew": {
+ "nix-index": {
"inputs": {
- "brew-src": "brew-src",
- "flake-utils": "flake-utils_3",
- "nix-darwin": "nix-darwin_2",
- "nixpkgs": "nixpkgs_2"
+ "flake-compat": "flake-compat",
+ "nixpkgs": [
+ "nixpkgs"
+ ]
},
"locked": {
- "lastModified": 1719720211,
- "narHash": "sha256-FNK5ZxmNC+V/wOuioc5HqkUy0ld4eW3NqcsZHLYg9HI=",
- "owner": "zhaofengli-wip",
- "repo": "nix-homebrew",
- "rev": "0afc51fd86693c73e4b60be8ed8c782c4c09b4cc",
+ "lastModified": 1771617986,
+ "narHash": "sha256-Z9kKDCd6w7XxmjqqCI8wO9oNkWcSvL+bnUNFTzHN9EU=",
+ "owner": "nix-community",
+ "repo": "nix-index",
+ "rev": "059454beac4b11efd4c613143933ea69427dc0c1",
"type": "github"
},
"original": {
- "owner": "zhaofengli-wip",
- "repo": "nix-homebrew",
+ "owner": "nix-community",
+ "repo": "nix-index",
"type": "github"
}
},
- "nixpkgs": {
- "locked": {
- "lastModified": 1687274257,
- "narHash": "sha256-TutzPriQcZ8FghDhEolnHcYU2oHIG5XWF+/SUBNnAOE=",
- "path": "/nix/store/22qgs3skscd9bmrxv9xv4q5d4wwm5ppx-source",
- "rev": "2c9ecd1f0400076a4d6b2193ad468ff0a7e7fdc5",
- "type": "path"
+ "nix-index-database": {
+ "inputs": {
+ "nixpkgs": [
+ "nixpkgs"
+ ]
},
- "original": {
- "id": "nixpkgs",
- "type": "indirect"
- }
- },
- "nixpkgs-stable": {
"locked": {
- "lastModified": 1710695816,
- "narHash": "sha256-3Eh7fhEID17pv9ZxrPwCLfqXnYP006RKzSs0JptsN84=",
- "owner": "NixOS",
- "repo": "nixpkgs",
- "rev": "614b4613980a522ba49f0d194531beddbb7220d3",
+ "lastModified": 1765189544,
+ "narHash": "sha256-uGPUxiIP8MMlI8+jq8+tjyei4m3OXtVIcxpl+dzsM+o=",
+ "owner": "youwen5",
+ "repo": "nix-index-database",
+ "rev": "36e6decfe5283d60ea71a8811fcc02b5b7166169",
"type": "github"
},
"original": {
- "owner": "NixOS",
- "ref": "nixos-23.11",
- "repo": "nixpkgs",
+ "owner": "youwen5",
+ "repo": "nix-index-database",
"type": "github"
}
},
- "nixpkgs_2": {
+ "nixos-wsl": {
+ "inputs": {
+ "flake-compat": "flake-compat_2",
+ "nixpkgs": [
+ "nixpkgs"
+ ]
+ },
"locked": {
- "lastModified": 1716330097,
- "narHash": "sha256-8BO3B7e3BiyIDsaKA0tY8O88rClYRTjvAp66y+VBUeU=",
- "owner": "NixOS",
- "repo": "nixpkgs",
- "rev": "5710852ba686cc1fd0d3b8e22b3117d43ba374c2",
+ "lastModified": 1773882647,
+ "narHash": "sha256-VzcOcE0LLpEnyoxLuMuptZ9ZWCkSBn99bTgEQoz5Viw=",
+ "owner": "nix-community",
+ "repo": "NixOS-WSL",
+ "rev": "fd0eae98d1ecee31024271f8d64676250a386ee7",
"type": "github"
},
"original": {
- "owner": "NixOS",
- "ref": "nixos-unstable",
- "repo": "nixpkgs",
+ "owner": "nix-community",
+ "repo": "NixOS-WSL",
"type": "github"
}
},
- "nixpkgs_3": {
+ "nixpkgs": {
"locked": {
- "lastModified": 1723991338,
- "narHash": "sha256-Grh5PF0+gootJfOJFenTTxDTYPidA3V28dqJ/WV7iis=",
+ "lastModified": 1774386573,
+ "narHash": "sha256-4hAV26quOxdC6iyG7kYaZcM3VOskcPUrdCQd/nx8obc=",
"owner": "nixos",
"repo": "nixpkgs",
- "rev": "8a3354191c0d7144db9756a74755672387b702ba",
+ "rev": "46db2e09e1d3f113a13c0d7b81e2f221c63b8ce9",
"type": "github"
},
"original": {
@@ -636,108 +504,112 @@
"type": "github"
}
},
- "nixvim": {
+ "nur": {
"inputs": {
- "devshell": "devshell",
- "flake-compat": "flake-compat_3",
- "flake-parts": "flake-parts_2",
- "git-hooks": "git-hooks",
- "home-manager": "home-manager_2",
- "nix-darwin": "nix-darwin_3",
+ "flake-parts": [
+ "stylix",
+ "flake-parts"
+ ],
"nixpkgs": [
+ "stylix",
"nixpkgs"
- ],
- "nuschtosSearch": "nuschtosSearch",
- "treefmt-nix": "treefmt-nix"
+ ]
},
"locked": {
- "lastModified": 1724118730,
- "narHash": "sha256-UwtVD2FyD7FjfLLmqGLsCBCQgLC1Jj78e1PhiVb0MJk=",
+ "lastModified": 1767810917,
+ "narHash": "sha256-ZKqhk772+v/bujjhla9VABwcvz+hB2IaRyeLT6CFnT0=",
"owner": "nix-community",
- "repo": "nixvim",
- "rev": "39081a41067a7bdb66f6f85a3fee9693ff8a21b1",
+ "repo": "NUR",
+ "rev": "dead29c804adc928d3a69dfe7f9f12d0eec1f1a4",
"type": "github"
},
"original": {
"owner": "nix-community",
- "repo": "nixvim",
+ "repo": "NUR",
"type": "github"
}
},
- "nuschtosSearch": {
+ "onibotoke": {
"inputs": {
- "flake-utils": "flake-utils_4",
+ "advisory-db": "advisory-db",
+ "crane": "crane_2",
+ "flake-utils": [
+ "flake-utils"
+ ],
"nixpkgs": [
- "nixvim",
"nixpkgs"
]
},
"locked": {
- "lastModified": 1723969429,
- "narHash": "sha256-BuewfNEXEf11MIkJY+uvWsdLu1dIvgJqntWChvNdALg=",
- "owner": "NuschtOS",
- "repo": "search",
- "rev": "a05d1805f2a2bc47d230e5e92aecbf69f784f3d0",
+ "lastModified": 1757151634,
+ "narHash": "sha256-x9X3hohIfa5K3Dp4JssWq/cbpT5mmEonoCfYt8wTEjY=",
+ "owner": "youwen5",
+ "repo": "onibotoke",
+ "rev": "82f03e93c17aadecd819099a2c6709d86b65ac7c",
"type": "github"
},
"original": {
- "owner": "NuschtOS",
- "repo": "search",
+ "owner": "youwen5",
+ "repo": "onibotoke",
"type": "github"
}
},
- "pre-commit-hooks-nix": {
+ "root": {
"inputs": {
- "flake-compat": [
- "lanzaboote",
- "flake-compat"
- ],
- "gitignore": "gitignore",
+ "agenix": "agenix",
+ "flake-parts": "flake-parts",
+ "flake-utils": "flake-utils",
+ "home-manager": "home-manager_2",
+ "musnix": "musnix",
+ "nix-darwin": "nix-darwin",
+ "nix-flatpak": "nix-flatpak",
+ "nix-index": "nix-index",
+ "nix-index-database": "nix-index-database",
+ "nixos-wsl": "nixos-wsl",
+ "nixpkgs": "nixpkgs",
+ "onibotoke": "onibotoke",
+ "run0-sudo-shim": "run0-sudo-shim",
+ "spicetify": "spicetify",
+ "stylix": "stylix",
+ "treefmt-nix": "treefmt-nix_2",
+ "zen-browser": "zen-browser"
+ }
+ },
+ "run0-sudo-shim": {
+ "inputs": {
+ "nix-github-actions": "nix-github-actions",
"nixpkgs": [
- "lanzaboote",
"nixpkgs"
],
- "nixpkgs-stable": "nixpkgs-stable"
+ "treefmt-nix": "treefmt-nix"
},
"locked": {
- "lastModified": 1717664902,
- "narHash": "sha256-7XfBuLULizXjXfBYy/VV+SpYMHreNRHk9nKMsm1bgb4=",
- "owner": "cachix",
- "repo": "pre-commit-hooks.nix",
- "rev": "cc4d466cb1254af050ff7bdf47f6d404a7c646d1",
+ "lastModified": 1774339799,
+ "narHash": "sha256-UMEP0+vOoVXY/NqDiyWOuN0Y2kXfSj1qhHDxa4hZa/A=",
+ "owner": "LordGrimmauld",
+ "repo": "run0-sudo-shim",
+ "rev": "63043b9c3ac469dea5bd127a176e746b5e2fad11",
"type": "github"
},
"original": {
- "owner": "cachix",
- "repo": "pre-commit-hooks.nix",
+ "owner": "LordGrimmauld",
+ "repo": "run0-sudo-shim",
"type": "github"
}
},
- "root": {
- "inputs": {
- "apple-silicon": "apple-silicon",
- "bleedingpkgs": "bleedingpkgs",
- "catppuccin": "catppuccin",
- "home-manager": "home-manager",
- "homebrew-cask": "homebrew-cask",
- "homebrew-core": "homebrew-core",
- "lanzaboote": "lanzaboote",
- "lix-module": "lix-module",
- "nix-darwin": "nix-darwin",
- "nix-homebrew": "nix-homebrew",
- "nixpkgs": "nixpkgs_3",
- "nixvim": "nixvim",
- "stablepkgs": "stablepkgs"
- }
- },
"rust-overlay": {
- "flake": false,
+ "inputs": {
+ "nixpkgs": [
+ "agenix",
+ "nixpkgs"
+ ]
+ },
"locked": {
- "lastModified": 1686795910,
- "narHash": "sha256-jDa40qRZ0GRQtP9EMZdf+uCbvzuLnJglTUI2JoHfWDc=",
+ "lastModified": 1761791894,
+ "narHash": "sha256-myRIDh+PxaREz+z9LzbqBJF+SnTFJwkthKDX9zMyddY=",
"owner": "oxalica",
"repo": "rust-overlay",
- "rev": "5c2b97c0a9bc5217fc3dfb1555aae0fb756d99f9",
+ "rev": "59c45eb69d9222a4362673141e00ff77842cd219",
"type": "github"
},
"original": {
@@ -746,44 +618,60 @@
"type": "github"
}
},
- "rust-overlay_2": {
+ "spicetify": {
"inputs": {
- "flake-utils": [
- "lanzaboote",
- "flake-utils"
- ],
"nixpkgs": [
- "lanzaboote",
"nixpkgs"
- ]
+ ],
+ "systems": "systems_3"
},
"locked": {
- "lastModified": 1717813066,
- "narHash": "sha256-wqbRwq3i7g5EHIui0bIi84mdqZ/It1AXBSLJ5tafD28=",
- "owner": "oxalica",
- "repo": "rust-overlay",
- "rev": "6dc3e45fe4aee36efeed24d64fc68b1f989d5465",
+ "lastModified": 1774157037,
+ "narHash": "sha256-kJpgEIF0sxMW0vx543m3AwyqptJOxPoOJY1DfJ4jQas=",
+ "owner": "Gerg-L",
+ "repo": "spicetify-nix",
+ "rev": "2e2234c2932a3aff5f845cda33cb1972a9e889aa",
"type": "github"
},
"original": {
- "owner": "oxalica",
- "repo": "rust-overlay",
+ "owner": "Gerg-L",
+ "repo": "spicetify-nix",
"type": "github"
}
},
- "stablepkgs": {
+ "stylix": {
+ "inputs": {
+ "base16": "base16",
+ "base16-fish": "base16-fish",
+ "base16-helix": "base16-helix",
+ "base16-vim": "base16-vim",
+ "firefox-gnome-theme": "firefox-gnome-theme",
+ "flake-parts": [
+ "flake-parts"
+ ],
+ "gnome-shell": "gnome-shell",
+ "nixpkgs": [
+ "nixpkgs"
+ ],
+ "nur": "nur",
+ "systems": "systems_4",
+ "tinted-foot": "tinted-foot",
+ "tinted-kitty": "tinted-kitty",
+ "tinted-schemes": "tinted-schemes",
+ "tinted-tmux": "tinted-tmux",
+ "tinted-zed": "tinted-zed"
+ },
"locked": {
- "lastModified": 1723938990,
- "narHash": "sha256-9tUadhnZQbWIiYVXH8ncfGXGvkNq3Hag4RCBEMUk7MI=",
- "owner": "nixos",
- "repo": "nixpkgs",
- "rev": "c42fcfbdfeae23e68fc520f9182dde9f38ad1890",
+ "lastModified": 1774124764,
+ "narHash": "sha256-Poz9WTjiRlqZIf197CrMMJfTifZhrZpbHFv0eU1Nhtg=",
+ "owner": "danth",
+ "repo": "stylix",
+ "rev": "e31c79f571c5595a155f84b9d77ce53a84745494",
"type": "github"
},
"original": {
- "owner": "nixos",
- "ref": "nixos-24.05",
- "repo": "nixpkgs",
+ "owner": "danth",
+ "repo": "stylix",
"type": "github"
}
},
@@ -847,19 +735,120 @@
"type": "github"
}
},
+ "tinted-foot": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1726913040,
+ "narHash": "sha256-+eDZPkw7efMNUf3/Pv0EmsidqdwNJ1TaOum6k7lngDQ=",
+ "owner": "tinted-theming",
+ "repo": "tinted-foot",
+ "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4",
+ "type": "github"
+ },
+ "original": {
+ "owner": "tinted-theming",
+ "repo": "tinted-foot",
+ "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4",
+ "type": "github"
+ }
+ },
+ "tinted-kitty": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1735730497,
+ "narHash": "sha256-4KtB+FiUzIeK/4aHCKce3V9HwRvYaxX+F1edUrfgzb8=",
+ "owner": "tinted-theming",
+ "repo": "tinted-kitty",
+ "rev": "de6f888497f2c6b2279361bfc790f164bfd0f3fa",
+ "type": "github"
+ },
+ "original": {
+ "owner": "tinted-theming",
+ "repo": "tinted-kitty",
+ "type": "github"
+ }
+ },
+ "tinted-schemes": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1767710407,
+ "narHash": "sha256-+W1EB79Jl0/gm4JqmO0Nuc5C7hRdp4vfsV/VdzI+des=",
+ "owner": "tinted-theming",
+ "repo": "schemes",
+ "rev": "2800e2b8ac90f678d7e4acebe4fa253f602e05b2",
+ "type": "github"
+ },
+ "original": {
+ "owner": "tinted-theming",
+ "repo": "schemes",
+ "type": "github"
+ }
+ },
+ "tinted-tmux": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1767489635,
+ "narHash": "sha256-e6nnFnWXKBCJjCv4QG4bbcouJ6y3yeT70V9MofL32lU=",
+ "owner": "tinted-theming",
+ "repo": "tinted-tmux",
+ "rev": "3c32729ccae99be44fe8a125d20be06f8d7d8184",
+ "type": "github"
+ },
+ "original": {
+ "owner": "tinted-theming",
+ "repo": "tinted-tmux",
+ "type": "github"
+ }
+ },
+ "tinted-zed": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1767488740,
+ "narHash": "sha256-wVOj0qyil8m+ouSsVZcNjl5ZR+1GdOOAooAatQXHbuU=",
+ "owner": "tinted-theming",
+ "repo": "base16-zed",
+ "rev": "11abb0b282ad3786a2aae088d3a01c60916f2e40",
+ "type": "github"
+ },
+ "original": {
+ "owner": "tinted-theming",
+ "repo": "base16-zed",
+ "type": "github"
+ }
+ },
"treefmt-nix": {
"inputs": {
"nixpkgs": [
- "nixvim",
+ "run0-sudo-shim",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1773297127,
+ "narHash": "sha256-6E/yhXP7Oy/NbXtf1ktzmU8SdVqJQ09HC/48ebEGBpk=",
+ "owner": "numtide",
+ "repo": "treefmt-nix",
+ "rev": "71b125cd05fbfd78cab3e070b73544abe24c5016",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "treefmt-nix",
+ "type": "github"
+ }
+ },
+ "treefmt-nix_2": {
+ "inputs": {
+ "nixpkgs": [
"nixpkgs"
]
},
"locked": {
- "lastModified": 1723808491,
- "narHash": "sha256-rhis3qNuGmJmYC/okT7Dkc4M8CeUuRCSvW6kC2f3hBc=",
+ "lastModified": 1773297127,
+ "narHash": "sha256-6E/yhXP7Oy/NbXtf1ktzmU8SdVqJQ09HC/48ebEGBpk=",
"owner": "numtide",
"repo": "treefmt-nix",
- "rev": "1d07739554fdc4f8481068f1b11d6ab4c1a4167a",
+ "rev": "71b125cd05fbfd78cab3e070b73544abe24c5016",
"type": "github"
},
"original": {
@@ -867,6 +856,26 @@
"repo": "treefmt-nix",
"type": "github"
}
+ },
+ "zen-browser": {
+ "inputs": {
+ "nixpkgs": [
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1773722260,
+ "narHash": "sha256-U8MsSiqqYZHR3oKE+cCZ2AJt3b4LcXs+oQuNLipaO78=",
+ "owner": "youwen5",
+ "repo": "zen-browser-flake",
+ "rev": "0e6e43342fb3e9a3439fafa777d8cdf98e4ffc49",
+ "type": "github"
+ },
+ "original": {
+ "owner": "youwen5",
+ "repo": "zen-browser-flake",
+ "type": "github"
+ }
}
},
"root": "root",
diff --git a/flake.nix b/flake.nix
index 95eda5d6..8b8f40b4 100755
--- a/flake.nix
+++ b/flake.nix
@@ -1,205 +1,188 @@
{
- description = "System configuration flake.";
+ description = "functorOS";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
+ # stablepkgs.url = "github:nixos/nixpkgs/nixos-24.05";
+ # bleedingpkgs.url = "github:nixos/nixpkgs/master";
+ # nixpkgs-unstable-small.url = "github:nixos/nixpkgs/nixos-unstable-small";
+
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
- stablepkgs.url = "github:nixos/nixpkgs/nixos-24.05";
- bleedingpkgs.url = "github:nixos/nixpkgs/master";
- nix-darwin.url = "github:LnL7/nix-darwin";
- nix-darwin.inputs.nixpkgs.follows = "nixpkgs";
- nix-homebrew.url = "github:zhaofengli-wip/nix-homebrew";
- homebrew-core = {
- url = "github:homebrew/homebrew-core";
- flake = false;
+
+ flake-parts = {
+ url = "github:hercules-ci/flake-parts";
+ inputs.nixpkgs-lib.follows = "nixpkgs";
+ };
+
+ flake-utils.url = "github:numtide/flake-utils";
+
+ nix-darwin = {
+ url = "github:LnL7/nix-darwin";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
+
+ nix-flatpak.url = "github:gmodena/nix-flatpak";
+
+ spicetify = {
+ url = "github:Gerg-L/spicetify-nix";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
+
+ stylix = {
+ url = "github:danth/stylix";
+ inputs.nixpkgs.follows = "nixpkgs";
+ inputs.flake-parts.follows = "flake-parts";
};
- homebrew-cask = {
- url = "github:homebrew/homebrew-cask";
- flake = false;
+
+ nix-index-database = {
+ url = "github:youwen5/nix-index-database";
+ inputs.nixpkgs.follows = "nixpkgs";
};
- catppuccin.url = "github:catppuccin/nix";
- lanzaboote = {
- url = "github:nix-community/lanzaboote/v0.4.1";
- # Optional but recommended to limit the size of your system closure.
+ nix-index = {
+ url = "github:nix-community/nix-index";
inputs.nixpkgs.follows = "nixpkgs";
};
- lix-module = {
- url = "https://git.lix.systems/lix-project/nixos-module/archive/2.90.0.tar.gz";
+
+ agenix = {
+ url = "github:yaxitech/ragenix";
inputs.nixpkgs.follows = "nixpkgs";
+ inputs.flake-utils.follows = "flake-utils";
};
- apple-silicon = {
- url = "github:tpwrules/nixos-apple-silicon";
+
+ zen-browser = {
+ url = "github:youwen5/zen-browser-flake";
inputs.nixpkgs.follows = "nixpkgs";
};
- nixvim = {
- url = "github:nix-community/nixvim";
+
+ nixos-wsl = {
+ url = "github:nix-community/NixOS-WSL";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
+
+ musnix = {
+ url = "github:musnix/musnix";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
+
+ onibotoke = {
+ url = "github:youwen5/onibotoke";
+ inputs.nixpkgs.follows = "nixpkgs";
+ inputs.flake-utils.follows = "flake-utils";
+ };
+
+ run0-sudo-shim = {
+ url = "github:LordGrimmauld/run0-sudo-shim";
+ inputs.nixpkgs.follows = "nixpkgs";
+ inputs.flake-utils.follows = "flake-utils";
+ };
+
+ treefmt-nix = {
+ url = "github:numtide/treefmt-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
};
- outputs = {
- self,
- nixpkgs,
- home-manager,
- catppuccin,
- lanzaboote,
- stablepkgs,
- bleedingpkgs,
- lix-module,
- nix-darwin,
- nix-homebrew,
- apple-silicon,
- ...
- } @ inputs: rec {
- formatter.x86_64-linux = nixpkgs.legacyPackages.x86_64-linux.alejandra;
- nixosConfigurations = {
- demeter = nixpkgs.lib.nixosSystem {
- specialArgs = {inherit inputs;};
- system = "x86_64-linux";
- modules = [
- ./hosts/demeter
- ./modules/nixos/gaming
- ./modules/nixos/audio
- ./modules/nixos/networking
- ./modules/nixos/fonts
- ./modules/nixos/greeter
- ./modules/nixos/core
- ./overlays
-
- catppuccin.nixosModules.catppuccin
- lix-module.nixosModules.default
- lanzaboote.nixosModules.lanzaboote
- home-manager.nixosModules.home-manager
- {
- home-manager.useGlobalPkgs = true;
- home-manager.useUserPackages = true;
- home-manager.backupFileExtension = "backup";
- home-manager.users.youwen = {
- imports = [
- ./users/youwen/linux/desktop
- ./users/youwen/linux/packages/x86_64
- ./users/youwen/linux/programs
- ./users/youwen/common/neofetch
- ./users/youwen/common/neovim
- ./users/youwen/common
- inputs.catppuccin.homeManagerModules.catppuccin
- inputs.nixvim.homeManagerModules.nixvim
- ];
- };
- }
- ];
- };
- callisto = nixpkgs.lib.nixosSystem {
- specialArgs = {inherit inputs;};
- system = "aarch64-linux";
- modules = [
- ./hosts/callisto
- ./modules/nixos/audio
- ./modules/nixos/networking
- ./modules/nixos/fonts
- ./modules/nixos/greeter
- ./modules/nixos/core
-
- apple-silicon.nixosModules.apple-silicon-support
- catppuccin.nixosModules.catppuccin
- lix-module.nixosModules.default
- home-manager.nixosModules.home-manager
- {
- home-manager.useGlobalPkgs = true;
- home-manager.useUserPackages = true;
- home-manager.backupFileExtension = "backup";
- home-manager.users.youwen = {
- imports = [
- ./users/youwen/common
- ./users/youwen/common/neofetch/asahi-only.nix
- ./users/youwen/linux/laptop
- ./users/youwen/linux/packages/aarch-64
- ./users/youwen/common/neovim
-
- inputs.catppuccin.homeManagerModules.catppuccin
- inputs.nixvim.homeManagerModules.nixvim
- ];
- };
- }
- {
- nixpkgs.overlays = [
- (self: super: {
- signal-desktop =
- bleedingpkgs.legacyPackages.${self.system}.signal-desktop;
- })
+ outputs =
+ inputs@{
+ flake-parts,
+ self,
+ ...
+ }:
+ flake-parts.lib.mkFlake { inherit inputs; } {
+ systems = [
+ "x86_64-linux"
+ "aarch64-linux"
+ ];
+ flake = {
+ nixosModules = rec {
+ default = functorOS;
+ functorOS = {
+ imports = [
+ inputs.nix-flatpak.nixosModules.nix-flatpak
+ inputs.home-manager.nixosModules.home-manager
+ inputs.nixos-wsl.nixosModules.default
+ inputs.stylix.nixosModules.stylix
+ inputs.agenix.nixosModules.age
+ inputs.musnix.nixosModules.musnix
+ inputs.run0-sudo-shim.nixosModules.default
+ ./modules/default.nix
+ ./overlays
+ (
+ { pkgs, ... }:
+ {
+ home-manager.extraSpecialArgs = {
+ spicepkgs = inputs.spicetify.legacyPackages.${pkgs.stdenv.hostPlatform.system};
+ functorOSInputs = inputs;
+ inherit self;
+ };
+ nixpkgs.overlays = [
+ (final: prev: {
+ zen-browser = inputs.zen-browser.packages.${pkgs.stdenv.hostPlatform.system}.default;
+ })
+ ];
+ # instead of using ragenix from agenix which builds from
+ # source, use ragenix packaged in nixpkgs
+ environment.systemPackages = [ pkgs.ragenix ];
+ }
+ )
];
- }
- ];
- };
- adrastea = nixpkgs.lib.nixosSystem {
- specialArgs = {inherit inputs;};
- system = "x86_64-linux";
- modules = [
- ./hosts/adrastea
- ./modules/nixos/gaming
- ./modules/nixos/audio
- ./modules/nixos/networking
- ./modules/nixos/fonts
- ./modules/nixos/greeter
- ./modules/nixos/core
-
- catppuccin.nixosModules.catppuccin
- lix-module.nixosModules.default
- # lanzaboote.nixosModules.lanzaboote
- home-manager.nixosModules.home-manager
- {
- home-manager.useGlobalPkgs = true;
- home-manager.useUserPackages = true;
- home-manager.backupFileExtension = "backup";
- home-manager.users.youwen = {
- imports = [
- ./users/youwen/linux/laptop
- ./users/youwen/linux/packages/x86_64
- ./users/youwen/linux/programs
- ./users/youwen/common/neovim
- ./users/youwen/common
- ./users/youwen/common/neofetch
- ./hosts/adrastea/home-manager-overrides.nix
- inputs.catppuccin.homeManagerModules.catppuccin
- inputs.nixvim.homeManagerModules.nixvim
- ];
- };
- }
- ];
+ };
+ };
+
+ homeManagerModules = rec {
+ default = functorOS;
+ functorOS = {
+ imports = [
+ inputs.nix-index-database.homeModules.nix-index
+ inputs.spicetify.homeManagerModules.default
+ inputs.agenix.homeManagerModules.age
+ inputs.onibotoke.homeManagerModules.default
+ ./hm/modules/default.nix
+ ];
+ };
+ };
+
+ templates = rec {
+ functorOS = {
+ path = ./templates/minimal;
+ description = "Barebones configuration of functorOS";
+ };
+ default = functorOS;
+ };
};
- };
- formatter.aarch64-darwin = nixpkgs.legacyPackages.aarch64-darwin.alejandra;
- formatter.aarch64-linux = nixpkgs.legacyPackages.aarch64-linux.alejandra;
- # Build darwin flake using:
- # $ darwin-rebuild build --flake .#Youwens-MacBook-Pro
- darwinConfigurations.phobos = nix-darwin.lib.darwinSystem {
- specialArgs = {inherit inputs;};
- modules = [
- ./hosts/phobos
- home-manager.darwinModules.home-manager
+ perSystem =
{
- home-manager.useGlobalPkgs = true;
- home-manager.useUserPackages = true;
- home-manager.users.youwen.imports = [
- ./users/youwen/darwin/darwin-home.nix
- ./users/youwen/common/core.nix
- ./users/youwen/common/neofetch
- ./users/youwen/common/neovim
- ];
- home-manager.backupFileExtension = "backup";
-
- # Optionally, use home-manager.extraSpecialArgs to pass
- # arguments to home.nix
- }
- nix-homebrew.darwinModules.nix-homebrew
- ./modules/darwin/homebrew.nix
- ./modules/darwin/yabai.nix
- ./modules/darwin/skhd.nix
- ];
+ pkgs,
+ self',
+ ...
+ }:
+ let
+ treefmtEval = inputs.treefmt-nix.lib.evalModule pkgs ./treefmt.nix;
+ in
+ {
+ formatter = treefmtEval.config.build.wrapper;
+
+ devShells.default = pkgs.mkShell {
+ buildInputs = with pkgs; [
+ nixd
+ nixfmt-rfc-style
+ prettierd
+ taplo
+ marksman
+ ];
+ };
+
+ packages.docs-raw = pkgs.callPackage ./docs/raw.nix {
+ hash = if (self ? rev) then self.rev else "placeholder_hash";
+ };
+ packages.docs-rendered = pkgs.callPackage ./docs/rendered.nix {
+ inherit (self'.packages) docs-raw;
+ title = "functorOS module options for ${if (self ? rev) then self.rev else "placeholder_hash"}";
+ };
+ };
};
- };
}
diff --git a/hm/default.nix b/hm/default.nix
new file mode 100644
index 00000000..1e81a428
--- /dev/null
+++ b/hm/default.nix
@@ -0,0 +1,23 @@
+{
+ config,
+ lib,
+ ...
+}:
+let
+ cfg = config.functorOS;
+in
+{
+ options.functorOS.integrateHomeManager = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable;
+ description = ''
+ Whether to activate home manager with default options. Keep in mind you still have to import the functorOS home-manager module.
+ '';
+ };
+
+ config.home-manager = lib.mkIf cfg.integrateHomeManager {
+ useGlobalPkgs = true;
+ useUserPackages = true;
+ backupFileExtension = "backup";
+ };
+}
diff --git a/hm/modules/common/default.nix b/hm/modules/common/default.nix
new file mode 100644
index 00000000..a955cfd3
--- /dev/null
+++ b/hm/modules/common/default.nix
@@ -0,0 +1,10 @@
+{
+ imports = [ ./shellenv ];
+ # Let home Manager install and manage itself.
+ programs.home-manager.enable = true;
+
+ home.file.".essentials" = {
+ source = ./essentials;
+ recursive = true;
+ };
+}
diff --git a/hm/modules/common/essentials/README.md b/hm/modules/common/essentials/README.md
new file mode 100644
index 00000000..bd32b53b
--- /dev/null
+++ b/hm/modules/common/essentials/README.md
@@ -0,0 +1,2 @@
+This place contains all of the stuff that is too hard or unwieldy to manage
+fully with nix, but is still useful to have ready on every system.
diff --git a/hm/modules/common/essentials/tabliss.json b/hm/modules/common/essentials/tabliss.json
new file mode 100644
index 00000000..3e79a598
--- /dev/null
+++ b/hm/modules/common/essentials/tabliss.json
@@ -0,0 +1,92 @@
+{
+ "locale": "en",
+ "widget/QmFu0MVUS_uo": null,
+ "widget/cMOmcy4ZqrjS": null,
+ "widget/i54ELqP74_Sv": null,
+ "widget/B_kz3lJkUxlp": null,
+ "widget/Yvubo6Zu9lT8": null,
+ "widget/MHcdYwMetd1i": null,
+ "timeZone": null,
+ "widget/Dj61R7yvYklL": null,
+ "data/He0QCGvD65VV": {
+ "messages": ["There is no system but GNU, and Linux is one of its kernels."]
+ },
+ "widget/RuC5niQwKdxR": null,
+ "widget/LCUpMUdJn0Yf": null,
+ "widget/yJ9fL4n4XbdH": null,
+ "widget/FkVDvMgaeXIG": null,
+ "widget/L8ulAGK5O_0u": {
+ "id": "L8ulAGK5O_0u",
+ "key": "widget/literature-clock",
+ "order": 1,
+ "display": { "position": "middleCentre", "fontFamily": "Lora" }
+ },
+ "data/default-unsplash": {
+ "by": "topics",
+ "collections": "",
+ "featured": false,
+ "paused": false,
+ "search": "",
+ "topics": "xHxYTMHLgOc",
+ "timeout": 900
+ },
+ "data/y8f2hoHcUia3": {
+ "columns": 3,
+ "links": [
+ { "url": "https://github.com/", "icon": "github" },
+ { "url": "https://www.youtube.com/", "icon": "youtube" },
+ { "url": "https://github.com/youwen5", "icon": "user" }
+ ],
+ "visible": true,
+ "linkOpenStyle": false
+ },
+ "widget/sqbQm1Apn-Ad": null,
+ "widget/1SHRYajLSARQ": {
+ "id": "1SHRYajLSARQ",
+ "key": "widget/weather",
+ "order": 0,
+ "display": { "position": "topCentre", "fontSize": 26, "fontFamily": "Lora" }
+ },
+ "widget/He0QCGvD65VV": {
+ "id": "He0QCGvD65VV",
+ "key": "widget/message",
+ "order": 5,
+ "display": {
+ "position": "bottomCentre",
+ "fontFamily": "Lora",
+ "fontWeight": 400
+ }
+ },
+ "widget/y8f2hoHcUia3": {
+ "id": "y8f2hoHcUia3",
+ "key": "widget/links",
+ "order": 4,
+ "display": { "position": "middleCentre" }
+ },
+ "widget/KNX14ZQq5_lc": {
+ "id": "KNX14ZQq5_lc",
+ "key": "widget/css",
+ "order": 2,
+ "display": { "position": "middleCentre", "fontFamily": "" }
+ },
+ "widget/rOHrlmChb_Sp": null,
+ "data/KNX14ZQq5_lc": {
+ "input": "\n.Widget .LiteratureClock {\n padding: 20px;\n background-color: rgba(0,0,0,0.1);\n border-radius: 20px;\n backdrop-filter: blur(4px);\n font-size: 1.2em;\n max-width: 800px;\n}\n\n.Widget .Message {\n margin-bottom: 60px;\n}\n\n\n.Widget {\n user-select: none;\n}\n\n.Widget .Weather {\n padding: 20px;\n}\n\n.Widget .Links {\n margin-top: 40px;\n}\n.Widget .Links a:hover {\n scale: 1.15;\n}"
+ },
+ "background": {
+ "id": "default-unsplash",
+ "key": "background/unsplash",
+ "display": { "luminosity": -0.2, "blur": 0 }
+ },
+ "widget/default-time": null,
+ "widget/default-greeting": null,
+ "focus": false,
+ "data/1SHRYajLSARQ": {
+ "showDetails": false,
+ "units": "us",
+ "latitude": 34.4133,
+ "longitude": -119.861,
+ "name": "Isla Vista"
+ },
+ "version": 3
+}
diff --git a/hm/modules/common/shellenv/config.nu b/hm/modules/common/shellenv/config.nu
new file mode 100644
index 00000000..ab38d1a8
--- /dev/null
+++ b/hm/modules/common/shellenv/config.nu
@@ -0,0 +1,30 @@
+let fish_completer = {|spans|
+ fish --command $"complete '--do-complete=($spans | str join ' ')'"
+ | from tsv --flexible --noheaders --no-infer
+ | rename value description
+ | update value {
+ if ($in | path exists) {$'"($in | str replace "\"" "\\\"" )"'} else {$in}
+ }
+}
+
+# This completer will use fish by default
+let external_completer = {|spans|
+ let expanded_alias = scope aliases
+ | where name == $spans.0
+ | get --optional 0.expansion
+
+ let spans = if $expanded_alias != null {
+ $spans
+ | skip 1
+ | prepend ($expanded_alias | split row ' ' | take 1)
+ } else {
+ $spans
+ }
+
+ match $spans.0 {
+ # use zoxide completions for zoxide commands
+ _ => $fish_completer
+ } | do $in $spans
+}
+
+$env.config.completions.external.completer = $external_completer
diff --git a/hm/modules/common/shellenv/default.nix b/hm/modules/common/shellenv/default.nix
new file mode 100644
index 00000000..197b309e
--- /dev/null
+++ b/hm/modules/common/shellenv/default.nix
@@ -0,0 +1,275 @@
+{
+ config,
+ lib,
+ pkgs,
+ osConfig,
+ functorOSInputs,
+ ...
+}:
+let
+ cfg = config.functorOS;
+in
+{
+ imports = [
+ ./fastfetch
+ ];
+
+ options.functorOS.shellEnv = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = true;
+ description = ''
+ Whether to set up a CLI development environment.
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.shellEnv.enable {
+
+ programs.bash.enable = true;
+
+ programs.nushell =
+ let
+ zoxideInit = pkgs.stdenvNoCC.mkDerivation {
+ inherit (pkgs.zoxide) version;
+ pname = "zoxide-init";
+ nativeBuildInputs = [ pkgs.zoxide ];
+ phases = [ "installPhase" ];
+ installPhase = ''
+ zoxide init nushell >> $out
+ '';
+ };
+ in
+ {
+ enable = true;
+ configFile.source = ./config.nu;
+ settings = {
+ show_banner = false;
+ completions.external = {
+ enable = true;
+ max_results = 200;
+ };
+ edit_mode = "vi";
+ cursor_shape = {
+ emacs = "line";
+ vi_insert = "line";
+ vi_normal = "block";
+ };
+ };
+ extraConfig = lib.mkIf config.programs.zoxide.enable ''
+ source "${zoxideInit}"
+ def "nu-complete zoxide path" [context: string] {
+ let parts = $context | split row " " | skip 1
+ {
+ options: {
+ sort: false
+ completion_algorithm: prefix
+ positional: false
+ case_sensitive: false
+ }
+ completions: (zoxide query --list --exclude $env.PWD -- ...$parts | lines)
+ }
+ }
+
+ def --env --wrapped z [...rest: string@"nu-complete zoxide path"] {
+ __zoxide_z ...$rest
+ }
+
+ $env.config.hooks.command_not_found = source ${pkgs.nix-index-unwrapped}/etc/profile.d/command-not-found.nu
+ '';
+ plugins = with pkgs.nushellPlugins; [ polars ];
+ };
+
+ programs.onibotoke.enable = true;
+
+ programs.fzf = {
+ enable = true;
+ };
+
+ programs.git = {
+ enable = true;
+ maintenance.enable = true;
+ settings = {
+ user.name = lib.mkDefault "functorOS user";
+ user.email = lib.mkDefault "functorOS@localhost";
+ init.defaultBranch = "main";
+ safe.directory = lib.mkIf (
+ osConfig.functorOS.flakeLocation != null
+ ) osConfig.functorOS.flakeLocation;
+ };
+ };
+
+ programs.delta = {
+ enable = true;
+ enableGitIntegration = true;
+ };
+
+ home.packages = [ pkgs.git-absorb ];
+
+ programs.lazygit = {
+ enable = true;
+ settings = {
+ git.paging = {
+ colorArg = "always";
+ pager = "delta --dark --paging=never";
+ };
+ };
+ };
+
+ programs.bat.enable = true;
+
+ programs.ripgrep.enable = true;
+
+ programs.readline = {
+ enable = true;
+ extraConfig = "set editing-mode vi";
+ };
+
+ programs.zoxide = {
+ enable = true;
+ # we have our own fish completion plugin for zoxide
+ enableFishIntegration = false;
+ # we have our own nushell completion plugin for zoxide
+ enableNushellIntegration = false;
+ enableBashIntegration = true;
+ package =
+ if
+ (lib.versionAtLeast pkgs.zoxide.version "0.9.7" || lib.versionOlder pkgs.nushell.version "0.102.0")
+ then
+ pkgs.zoxide
+ else
+ pkgs.zoxide.overrideAttrs (
+ finalAttrs: prevAttrs: {
+ version = "0.9.7";
+ src = pkgs.fetchFromGitHub {
+ owner = "ajeetdsouza";
+ repo = "zoxide";
+ rev = "v${finalAttrs.version}";
+ hash = "sha256-+QZpLMlHOZdbKLFYOUOIRZHvIsbMDdstj9oGzyEGVxk=";
+ };
+
+ cargoDeps = pkgs.rustPlatform.fetchCargoVendor {
+ inherit (finalAttrs) src;
+ hash = "sha256-uqIL8KTrgWzzzyoPR9gctyh0Rf7WQpTGqXow2/xFvCU=";
+ };
+ }
+ );
+ };
+
+ programs.gh = {
+ enable = true;
+ };
+
+ programs.starship = {
+ enable = true;
+ enableFishIntegration = true;
+ enableBashIntegration = true;
+ enableNushellIntegration = true;
+ };
+
+ home.file.".config/starship.toml".text = builtins.readFile ./jetpack.toml;
+
+ programs.direnv = {
+ enable = true;
+ nix-direnv.enable = true;
+ config.global.hide_env_diff = true;
+ };
+
+ programs.fish = {
+ enable = true;
+ shellAliases = {
+ ls = "eza -l --icons=auto";
+ };
+ interactiveShellInit = ''
+ fish_vi_key_bindings
+ set -g fish_greeting
+ '';
+ plugins = [
+ {
+ name = "autopair";
+ src = pkgs.fishPlugins.autopair.src;
+ }
+ {
+ name = "fzf";
+ src = pkgs.fishPlugins.fzf.src;
+ }
+ {
+ name = "done";
+ src = pkgs.fishPlugins.done.src;
+ }
+ {
+ name = "sponge";
+ src = pkgs.fishPlugins.sponge.src;
+ }
+ ]
+ ++ lib.optionals config.programs.zoxide.enable [
+ {
+ name = "zoxide.fish";
+ src = pkgs.fetchFromGitHub {
+ owner = "icezyclon";
+ repo = "zoxide.fish";
+ rev = "a6dabb16dd2de570a2005617ea4510f0beb6dc53";
+ hash = "sha256-aGajwgFdB+wtjyryD/EQXSQ3SCFKwDJFjaZjLiJHt3E=";
+ };
+ }
+ ];
+ };
+
+ programs.nix-index = {
+ enable = true;
+ enableBashIntegration = true;
+ enableFishIntegration = true;
+ };
+
+ programs.nix-index-database.comma.enable = true;
+
+ programs.fd.enable = true;
+
+ programs.btop = {
+ enable = true;
+ settings = {
+ vim_keys = true;
+ theme_background = false;
+ };
+ };
+
+ programs.eza = {
+ enable = true;
+ enableFishIntegration = true;
+ enableBashIntegration = true;
+ enableNushellIntegration = false;
+ git = true;
+ };
+
+ programs.yazi = {
+ enable = true;
+ enableBashIntegration = true;
+ enableFishIntegration = true;
+ shellWrapperName = "y";
+ plugins = {
+ mediainfo = pkgs.fetchFromGitHub {
+ owner = "Ape";
+ repo = "mediainfo.yazi";
+ rev = "c69314e80f5b45fe87a0e06a10d064ed54110439";
+ hash = "sha256-8xdBPdKSiwB7iRU8DJdTHY+BjfR9D3FtyVtDL9tNiy4=";
+ };
+ };
+ settings = {
+ plugin = {
+ prepend_previewers = [
+ {
+ mime = "{image,audio,video}/*";
+ run = "mediainfo";
+ }
+ {
+ mime = "application/x-subrip";
+ run = "mediainfo";
+ }
+ ];
+ };
+ };
+ };
+
+ programs.zathura.enable = true;
+ };
+}
diff --git a/hm/modules/common/shellenv/fastfetch/config.json b/hm/modules/common/shellenv/fastfetch/config.json
new file mode 100644
index 00000000..2021c564
--- /dev/null
+++ b/hm/modules/common/shellenv/fastfetch/config.json
@@ -0,0 +1,81 @@
+{
+ "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
+ "display": {
+ "separator": " "
+ },
+ "modules": [
+ "break",
+ "break",
+ "break",
+ "break",
+ "break",
+ {
+ "type": "title",
+ "keyWidth": 10
+ },
+ "break",
+ {
+ "type": "os",
+ "key": " ",
+ "keyColor": "34",
+ "format": "{3} on {12}"
+ },
+ {
+ "type": "kernel",
+ "key": " ",
+ "keyColor": "34"
+ },
+ {
+ "type": "packages",
+ "key": " ",
+ "keyColor": "34"
+ },
+ {
+ "type": "shell",
+ "key": " ",
+ "keyColor": "34"
+ },
+ {
+ "type": "terminal",
+ "key": " ",
+ "keyColor": "34"
+ },
+ {
+ "type": "wm",
+ "key": " ",
+ "keyColor": "34"
+ },
+ {
+ "type": "CPU",
+ "key": " ",
+ "keyColor": "34"
+ },
+ {
+ "type": "GPU",
+ "key": " ",
+ "keyColor": "34"
+ },
+ {
+ "type": "uptime",
+ "key": " ",
+ "keyColor": "34"
+ },
+ {
+ "type": "media",
+ "key": " ",
+ "keyColor": "34"
+ },
+ {
+ "type": "player",
+ "key": " ",
+ "keyColor": "34"
+ },
+ "break",
+ {
+ "type": "custom",
+ "format": "\u001b[90m \u001b[31m \u001b[32m \u001b[33m \u001b[34m \u001b[35m \u001b[36m \u001b[37m "
+ },
+ "break",
+ "break"
+ ]
+}
diff --git a/hm/modules/common/shellenv/fastfetch/default.nix b/hm/modules/common/shellenv/fastfetch/default.nix
new file mode 100644
index 00000000..1612d8cf
--- /dev/null
+++ b/hm/modules/common/shellenv/fastfetch/default.nix
@@ -0,0 +1,74 @@
+{
+ config,
+ lib,
+ osConfig,
+ pkgs,
+ ...
+}:
+let
+ fastfetchConfig = builtins.fromJSON (builtins.readFile ./config.json);
+ cfg = config.functorOS.shellEnv.fastfetch;
+ useFunctorOSImage = osConfig.functorOS.system.core.customOSName;
+ functorOSImage =
+ if osConfig.functorOS.theming.enable then
+ if (osConfig.stylix.polarity == "dark") then
+ "${pkgs.functor-systems-icons}/icons/500x500/functor-systems-dark.png"
+ else
+ "${pkgs.functor-systems-icons}/icons/500x500/functor-systems-light.png"
+ else
+ null;
+in
+{
+ options.functorOS.shellEnv.fastfetch = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = config.functorOS.shellEnv.enable;
+ description = ''
+ Whether to set up and configure fastfetch.
+ '';
+ };
+ useKittyImage = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable;
+ description = ''
+ Whether to use the kitty image protocol.
+ '';
+ };
+ tintImage = lib.mkOption {
+ type = lib.types.bool;
+ default = osConfig.functorOS.theming.enable;
+ description = ''
+ Whether to tint the image with system wide colors.
+ '';
+ };
+ };
+ config.programs.fastfetch =
+ let
+ image =
+ if useFunctorOSImage then
+ functorOSImage
+ else if !cfg.tintImage then
+ ./nixos-logo.png
+ else
+ pkgs.runCommand "nixos-logo.png" { } ''
+ COLOR="#${config.lib.stylix.colors.base0A}"
+ ${lib.getExe pkgs.imagemagick} ${./nixos-logo.png} -size 512x512 -fill $COLOR -tint 50 $out
+ '';
+ in
+ lib.mkIf cfg.enable {
+ enable = true;
+ settings = (
+ fastfetchConfig
+ // {
+ logo = {
+ height = 18;
+ padding = {
+ top = 2;
+ };
+ type = if cfg.useKittyImage then "kitty" else "auto";
+ source = lib.mkIf cfg.useKittyImage image;
+ };
+ }
+ );
+ };
+}
diff --git a/hm/modules/common/shellenv/fastfetch/nixos-logo.png b/hm/modules/common/shellenv/fastfetch/nixos-logo.png
new file mode 100644
index 00000000..acbaad44
Binary files /dev/null and b/hm/modules/common/shellenv/fastfetch/nixos-logo.png differ
diff --git a/hm/modules/common/shellenv/jetpack.toml b/hm/modules/common/shellenv/jetpack.toml
new file mode 100644
index 00000000..2d209c76
--- /dev/null
+++ b/hm/modules/common/shellenv/jetpack.toml
@@ -0,0 +1,315 @@
+# version: 1.0.0
+
+add_newline = false
+continuation_prompt = "[▸▹ ](dimmed white)"
+
+format = """( $nix_shell$container$fill$git_metrics\n)$cmd_duration\
+$hostname\
+$localip\
+$shlvl\
+$shell\
+$env_var\
+$jobs\
+$sudo\
+$username\
+$character"""
+
+right_format = """
+$singularity\
+$kubernetes\
+$directory\
+$vcsh\
+$fossil_branch\
+$git_branch\
+$git_commit\
+$git_state\
+$git_status\
+$hg_branch\
+$pijul_channel\
+$docker_context\
+$package\
+$c\
+$cmake\
+$cobol\
+$daml\
+$dart\
+$deno\
+$dotnet\
+$elixir\
+$elm\
+$erlang\
+$fennel\
+$golang\
+$guix_shell\
+$haskell\
+$haxe\
+$helm\
+$java\
+$julia\
+$kotlin\
+$gradle\
+$lua\
+$nim\
+$nodejs\
+$ocaml\
+$opa\
+$perl\
+$php\
+$pulumi\
+$purescript\
+$python\
+$raku\
+$rlang\
+$red\
+$ruby\
+$rust\
+$scala\
+$solidity\
+$swift\
+$terraform\
+$vlang\
+$vagrant\
+$zig\
+$buf\
+$conda\
+$meson\
+$spack\
+$memory_usage\
+$aws\
+$gcloud\
+$openstack\
+$azure\
+$crystal\
+$custom\
+$status\
+$os\
+$battery\
+$time"""
+
+[fill]
+symbol = ' '
+
+[character]
+format = "$symbol "
+success_symbol = "[◎](bold italic bright-yellow)"
+error_symbol = "[○](italic purple)"
+vimcmd_symbol = "[■](italic dimmed green)"
+# not supported in zsh
+vimcmd_replace_one_symbol = "◌"
+vimcmd_replace_symbol = "□"
+vimcmd_visual_symbol = "▼"
+
+[env_var.VIMSHELL]
+format = "[$env_value]($style)"
+style = 'green italic'
+
+[sudo]
+format = "[$symbol]($style)"
+style = "bold italic bright-purple"
+symbol = "⋈┈"
+disabled = false
+
+[username]
+style_user = "bright-yellow bold italic"
+style_root = "purple bold italic"
+format = "[⭘ $user]($style) "
+disabled = false
+show_always = false
+
+[directory]
+home_symbol = "⌂"
+truncation_length = 2
+truncation_symbol = "□ "
+read_only = " ◈"
+use_os_path_sep = true
+style = "italic blue"
+format = '[$path]($style)[$read_only]($read_only_style)'
+repo_root_style = 'bold blue'
+repo_root_format = '[$before_root_path]($before_repo_root_style)[$repo_root]($repo_root_style)[$path]($style)[$read_only]($read_only_style) [△](bold bright-blue)'
+
+[cmd_duration]
+format = "[◄ $duration ](italic white)"
+
+[jobs]
+format = "[$symbol$number]($style) "
+style = "white"
+symbol = "[▶](blue italic)"
+
+[localip]
+ssh_only = true
+format = " ◯[$localipv4](bold magenta)"
+disabled = false
+
+[time]
+disabled = false
+format = "[ $time]($style)"
+time_format = "%R"
+utc_time_offset = "local"
+style = "italic dimmed white"
+
+[battery]
+format = "[ $percentage $symbol]($style)"
+full_symbol = "█"
+charging_symbol = "[↑](italic bold green)"
+discharging_symbol = "↓"
+unknown_symbol = "░"
+empty_symbol = "▃"
+
+[[battery.display]]
+threshold = 20
+style = "italic bold red"
+
+[[battery.display]]
+threshold = 60
+style = "italic dimmed bright-purple"
+
+[[battery.display]]
+threshold = 70
+style = "italic dimmed yellow"
+
+[git_branch]
+format = " [$branch(:$remote_branch)]($style)"
+symbol = "[△](bold italic bright-blue)"
+style = "italic bright-blue"
+truncation_symbol = "⋯"
+truncation_length = 11
+ignore_branches = ["main", "master"]
+only_attached = true
+
+[git_metrics]
+format = '([▴$added]($added_style))([▿$deleted]($deleted_style))'
+added_style = 'italic dimmed green'
+deleted_style = 'italic dimmed red'
+ignore_submodules = true
+disabled = false
+
+[git_status]
+style = "bold italic bright-blue"
+format = "([⎪$ahead_behind$staged$modified$untracked$renamed$deleted$conflicted$stashed⎥]($style))"
+conflicted = "[◪◦](italic bright-magenta)"
+ahead = "[▴│[${count}](bold white)│](italic green)"
+behind = "[▿│[${count}](bold white)│](italic red)"
+diverged = "[◇ ▴┤[${ahead_count}](regular white)│▿┤[${behind_count}](regular white)│](italic bright-magenta)"
+untracked = "[◌◦](italic bright-yellow)"
+stashed = "[◃◈](italic white)"
+modified = "[●◦](italic yellow)"
+staged = "[▪┤[$count](bold white)│](italic bright-cyan)"
+renamed = "[◎◦](italic bright-blue)"
+deleted = "[✕](italic red)"
+
+[deno]
+format = " [deno](italic) [∫ $version](green bold)"
+version_format = "${raw}"
+
+[lua]
+format = " [lua](italic) [${symbol}${version}]($style)"
+version_format = "${raw}"
+symbol = "⨀ "
+style = "bold bright-yellow"
+
+[nodejs]
+format = " [node](italic) [◫ ($version)](bold bright-green)"
+version_format = "${raw}"
+detect_files = ["package-lock.json", "yarn.lock"]
+detect_folders = ["node_modules"]
+detect_extensions = []
+
+[python]
+format = " [py](italic) [${symbol}${version}]($style)"
+symbol = "[⌉](bold bright-blue)⌊ "
+version_format = "${raw}"
+style = "bold bright-yellow"
+
+[ruby]
+format = " [rb](italic) [${symbol}${version}]($style)"
+symbol = "◆ "
+version_format = "${raw}"
+style = "bold red"
+
+[rust]
+format = " [rs](italic) [$symbol$version]($style)"
+symbol = "⊃ "
+version_format = "${raw}"
+style = "bold red"
+
+[package]
+format = " [pkg](italic dimmed) [$symbol$version]($style)"
+version_format = "${raw}"
+symbol = "◨ "
+style = "dimmed yellow italic bold"
+
+[swift]
+format = " [sw](italic) [${symbol}${version}]($style)"
+symbol = "◁ "
+style = "bold bright-red"
+version_format = "${raw}"
+
+[aws]
+disabled = true
+format = " [aws](italic) [$symbol $profile $region]($style)"
+style = "bold blue"
+symbol = "▲ "
+
+[buf]
+symbol = "■ "
+format = " [buf](italic) [$symbol $version $buf_version]($style)"
+
+[c]
+symbol = "ℂ "
+format = " [$symbol($version(-$name))]($style)"
+
+[conda]
+symbol = "◯ "
+format = " conda [$symbol$environment]($style)"
+
+[dart]
+symbol = "◁◅ "
+format = " dart [$symbol($version )]($style)"
+
+[docker_context]
+symbol = "◧ "
+format = " docker [$symbol$context]($style)"
+
+[elixir]
+symbol = "△ "
+format = " exs [$symbol $version OTP $otp_version ]($style)"
+
+[elm]
+symbol = "◩ "
+format = " elm [$symbol($version )]($style)"
+
+[golang]
+symbol = "∩ "
+format = " go [$symbol($version )]($style)"
+
+[haskell]
+symbol = "❯λ "
+format = " hs [$symbol($version )]($style)"
+
+[java]
+symbol = "∪ "
+format = " java [${symbol}(${version} )]($style)"
+
+[julia]
+symbol = "◎ "
+format = " jl [$symbol($version )]($style)"
+
+[memory_usage]
+symbol = "▪▫▪ "
+format = " mem [${ram}( ${swap})]($style)"
+
+[nim]
+symbol = "▴▲▴ "
+format = " nim [$symbol($version )]($style)"
+
+[nix_shell]
+style = 'bold italic dimmed blue'
+symbol = ''
+format = '[$symbol nix⎪$state⎪]($style) [$name](italic dimmed white)'
+impure_msg = '[⌽](bold dimmed red)'
+pure_msg = '[⌾](bold dimmed green)'
+unknown_msg = '[◌](bold dimmed ellow)'
+
+[spack]
+symbol = "◇ "
+format = " spack [$symbol$environment]($style)"
diff --git a/users/youwen/darwin/darwin-home.nix b/hm/modules/darwin/darwin-home.nix
similarity index 99%
rename from users/youwen/darwin/darwin-home.nix
rename to hm/modules/darwin/darwin-home.nix
index 39d97c74..c2ea10ee 100755
--- a/users/youwen/darwin/darwin-home.nix
+++ b/hm/modules/darwin/darwin-home.nix
@@ -3,7 +3,8 @@
config,
pkgs,
...
-}: {
+}:
+{
home.username = "youwen";
home.homeDirectory = "/Users/youwen";
diff --git a/hm/modules/default.nix b/hm/modules/default.nix
new file mode 100644
index 00000000..48ebc2cb
--- /dev/null
+++ b/hm/modules/default.nix
@@ -0,0 +1,6 @@
+{
+ imports = [
+ ./common
+ ./linux
+ ];
+}
diff --git a/hm/modules/linux/audio/default.nix b/hm/modules/linux/audio/default.nix
new file mode 100644
index 00000000..ffe2414f
--- /dev/null
+++ b/hm/modules/linux/audio/default.nix
@@ -0,0 +1,23 @@
+{
+ config,
+ lib,
+ ...
+}:
+let
+ cfg = config.functorOS.utils.audio;
+in
+{
+ options.functorOS.utils.audio = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = true;
+ description = ''
+ Whether to enable some audio enhancements (e.g. EasyEffects).
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ services.easyeffects.enable = true;
+ };
+}
diff --git a/hm/modules/linux/default.nix b/hm/modules/linux/default.nix
new file mode 100755
index 00000000..88447e87
--- /dev/null
+++ b/hm/modules/linux/default.nix
@@ -0,0 +1,33 @@
+{
+ pkgs,
+ lib,
+ config,
+ osConfig,
+ ...
+}:
+{
+ imports = [
+ ./audio
+ ./programs
+ ./spicetify
+ ./desktop-environment
+ ./theming
+ ./platform-tweaks
+ ./tidal-hifi
+ ./var/mangohud
+ ./photography
+ ];
+
+ programs.fish.functions = lib.mkIf config.functorOS.programs.enable {
+ # rebuild = ''doas nixos-rebuild --flake ~/.config/functorOS\#${osConfig.networking.hostName} switch &| nom'';
+ # os-test = ''doas nixos-rebuild --flake ~/.config/functorOS\#${osConfig.networking.hostName} test &| nom'';
+ # nixos-update = ''
+ # cd ~/.config/functorOS
+ # nix flake update --commit-lock-file
+ # doas nixos-rebuild --flake ~/.config/functorOS\#${osConfig.networking.hostName} switch &| nom
+ # '';
+ spt = "${lib.getExe pkgs.spotify-player}";
+ };
+
+ services.gnome-keyring.enable = true;
+}
diff --git a/hm/modules/linux/desktop-environment/default.nix b/hm/modules/linux/desktop-environment/default.nix
new file mode 100644
index 00000000..c9456a2b
--- /dev/null
+++ b/hm/modules/linux/desktop-environment/default.nix
@@ -0,0 +1,24 @@
+{
+ osConfig,
+ lib,
+ ...
+}:
+{
+ imports = [
+ ./hyprland
+ ./niri
+ ./sway
+ ./waybar
+ ./swaync.nix
+ ];
+
+ options.functorOS.desktop = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = osConfig.functorOS.desktop.enable;
+ description = ''
+ Whether to enable the default configuration for the userland portions of the functorOS desktop environment.
+ '';
+ };
+ };
+}
diff --git a/hm/modules/linux/desktop-environment/hyprland/binds.nix b/hm/modules/linux/desktop-environment/hyprland/binds.nix
new file mode 100644
index 00000000..7c72e685
--- /dev/null
+++ b/hm/modules/linux/desktop-environment/hyprland/binds.nix
@@ -0,0 +1,101 @@
+{
+ lib,
+ pkgs,
+ config,
+ ...
+}:
+let
+ cfg = config.functorOS.desktop.hyprland;
+ hyprnome = "${lib.getExe pkgs.hyprnome}";
+in
+{
+ wayland.windowManager.hyprland.settings = lib.mkIf cfg.enable {
+ bind = [
+ "$mod+Shift, $Left, layoutmsg, swapcol l"
+ "$mod+Shift, $Right, layoutmsg, swapcol r"
+ "$mod+Shift, $Up, movewindow, u"
+ "$mod+Shift, $Down, movewindow, d"
+
+ # Move around
+ "$mod, $Left, layoutmsg, focus l"
+ "$mod, $Right, layoutmsg, focus r"
+ "$mod, $Up, layoutmsg, focus u"
+ "$mod, $Down, layoutmsg, focus d"
+ "$mod, comma, layoutmsg, movewindowto l"
+ "$mod, period, layoutmsg, movewindowto r"
+ "$mod, F, layoutmsg, fit active"
+ "$mod, Y, layoutmsg, fit visible"
+ "$mod, semicolon, layoutmsg, colresize -conf"
+ "$mod, apostrophe, layoutmsg, colresize +conf"
+ "$mod, slash, layoutmsg, promote"
+
+ "$mod+Shift, U, exec, ${hyprnome} --move"
+ "$mod+Shift, I, exec, ${hyprnome} --previous --move"
+
+ "$mod, U, exec, ${hyprnome}"
+ "$mod, I, exec, ${hyprnome} --previous"
+
+ "$mod, C, layoutmsg, togglefit"
+ # "$mod, C, scroller:setmode, c"
+ # "$mod, V, scroller:setmode, r"
+
+ # "$mod, G, scroller:jump"
+ # "$mod+Ctrl, G, scroller:toggleoverview"
+ # Window actions
+ "$mod, Q, killactive"
+ "$mod, W, togglefloating"
+ "$mod, Return, fullscreen"
+
+ # Utilities
+ "$mod, Space, exec, pkill -x rofi || rofi -show drun" # Run rofi application launcher
+ "$mod, X, exec, pkill -x rofi || rofi -show window" # Run rofi window switcher
+
+ "$mod, Backspace, exec, pkill -x wlogout || wlogout" # show logout menu
+
+ "$mod, Z, exec, loginctl lock-session"
+
+ # Media controls
+ ",XF86AudioMute, exec, ${lib.getExe pkgs.pamixer} -t"
+ ",XF86AudioPlay, exec, ${lib.getExe pkgs.playerctl} --player=%any,firefox play-pause"
+ ",XF86AudioNext, exec, ${lib.getExe pkgs.playerctl} --player=%any,firefox next"
+ ",XF86AudioRewind, exec, ${lib.getExe pkgs.playerctl} --player=%any,firefox previous"
+
+ "$mod, S, togglespecialworkspace"
+ "$mod+Alt, S, movetoworkspacesilent, special"
+ "$mod, Tab, workspace, previous"
+ "$mod+Shift, P, exec, ${lib.getExe pkgs.grim} - | ${lib.getExe pkgs.swappy} -f -" # Screenshot full screen
+ ''$mod, P, exec, ${lib.getExe pkgs.grim} -g "$(${lib.getExe pkgs.slurp})" - | ${lib.getExe pkgs.swappy} -f -'' # Screenshot
+
+ # browser
+ "$mod, B, exec, ${lib.getExe config.functorOS.programs.defaultBrowser}"
+ ]
+ ++ (lib.optionals config.functorOS.desktop.swaync.enable [
+ "$mod, N, exec, sleep 0.1 && ${pkgs.swaynotificationcenter}/bin/swaync-client -t -sw"
+ ])
+ ++ (lib.optionals config.functorOS.programs.enable [
+ # Application Keybinds
+ "$mod, R, exec, ${lib.getExe pkgs.pavucontrol} -t 3" # open pavucontrol on 'outputs' tab
+ "$mod, T, exec, ${lib.getExe pkgs.kitty}"
+ "$mod, E, exec, ${lib.getExe pkgs.nautilus}"
+ "$mod, M, exec, ${lib.getExe pkgs.thunderbird}"
+ ]);
+
+ bindm = [
+ "$mod, mouse:272, movewindow"
+ "$mod, mouse:273, resizewindow"
+ ];
+ bindel = [
+ ",XF86MonBrightnessDown, exec, ${lib.getExe pkgs.brightnessctl} set 5%-"
+ ",XF86MonBrightnessUp, exec, ${lib.getExe pkgs.brightnessctl} set 5%+"
+ ",XF86AudioRaiseVolume, exec, ${lib.getExe pkgs.pamixer} -i 5"
+ ",XF86AudioLowerVolume, exec, ${lib.getExe pkgs.pamixer} -d 5"
+ ];
+ binde = [
+ # Resize windows
+ "$mod+Alt, $Right, resizeactive, 30 0"
+ "$mod+Alt, $Left, resizeactive, -30 0"
+ "$mod+Alt, $Up, resizeactive, 0 -30"
+ "$mod+Alt, $Down, resizeactive, 0 30"
+ ];
+ };
+}
diff --git a/hm/modules/linux/desktop-environment/hyprland/default.nix b/hm/modules/linux/desktop-environment/hyprland/default.nix
new file mode 100644
index 00000000..1ae7be9f
--- /dev/null
+++ b/hm/modules/linux/desktop-environment/hyprland/default.nix
@@ -0,0 +1,253 @@
+{
+ pkgs,
+ config,
+ lib,
+ osConfig,
+ ...
+}:
+let
+ cfg = config.functorOS.desktop.hyprland;
+in
+{
+ imports = [
+ ./binds.nix
+ ./utilities.nix
+ ./windowrules.nix
+ ];
+
+ options.functorOS.desktop.hyprland = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = config.functorOS.desktop.enable;
+ description = ''
+ Whether to enable and rice Hyprland as well as some basic desktop utilities.
+ '';
+ };
+ gtkUseOpenGL = lib.mkOption {
+ type = lib.types.bool;
+ default = false;
+ description = ''
+ Whether to set GSK_RENDERER environment variable to stop GTK apps from crashing.
+ '';
+ };
+ idleDaemon.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable;
+ description = ''
+ Whether to setup and enable Hypridle with some defaults to automatically lock the screen and suspend after idling.
+ '';
+ };
+ screenlocker.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable && cfg.idleDaemon.enable;
+ description = ''
+ Whether to set up Hyprlock for screen locking.
+ '';
+ };
+ screenlocker.useCrashFix = lib.mkOption {
+ type = lib.types.bool;
+ default = false;
+ description = ''
+ Whether to use a workaround for Hyprlock background blur not working on some machines. Before locking, a screenshot will be taken and placed at `/tmp/__hyprlock-monitor-screenshot.png`.
+ '';
+ };
+ screenlocker.monitor = lib.mkOption {
+ type = lib.types.nullOr lib.types.str;
+ default = null;
+ description = ''
+ Monitor to use for screen locker. Use `hyprctl monitors` to determine.
+ '';
+ };
+ bluelight.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = true;
+ description = ''
+ Whether to enable `hyprsunset` as a daemon.
+ '';
+ };
+ fcitx5.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = osConfig.i18n.inputMethod.enable && (osConfig.i18n.inputMethod.type == "fcitx5");
+ description = ''
+ Whether to execute fcitx5 at startup.
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ home.packages =
+ with pkgs;
+ [
+ wl-clipboard
+ libsForQt5.qtstyleplugin-kvantum
+ libsForQt5.qt5ct
+ papirus-icon-theme
+ libsForQt5.qt5ct
+ hyprland-qtutils
+ ]
+ ++ (lib.optionals (!osConfig.functorOS.theming.enable) [
+ pkgs.bibata-cursors
+ ]);
+
+ wayland.windowManager.hyprland = {
+ enable = true;
+ plugins = [
+ # (pkgs.hyprlandPlugins.hyprscrolling.overrideAttrs {
+ # src = pkgs.fetchFromGitHub {
+ # owner = "hyprwm";
+ # repo = "hyprland-plugins";
+ # rev = "64b7c2dff7e5e1fcb4cb7e5db078947744070e1a";
+ # hash = "sha256-1WYjD66gyjj7PVOe7xbho6030FdrIUjh/XpAtp5+ASo=";
+ # };
+ # })
+ pkgs.hyprlandPlugins.hyprscrolling
+ ];
+ settings = {
+ exec-once = [
+ "hyprctl dispatch workspace 100000"
+ ]
+ ++ (lib.optionals cfg.fcitx5.enable [
+ "fcitx5 -d -r"
+ "fcitx5-remote -r"
+ ]);
+ "$mod" = "SUPER";
+ "$Left" = "H";
+ "$Right" = "L";
+ "$Up" = "K";
+ "$Down" = "J";
+ env = [
+ # mitigates warning message due to ly workaround
+ # "XDG_CURRENT_DESKTOP,Hyprland"
+ ]
+ ++ (lib.optionals cfg.gtkUseOpenGL [
+ "GSK_RENDERER,ngl"
+ ])
+ ++ (lib.optionals (config.functorOS.formFactor == "laptop" && !osConfig.functorOS.theming.enable) [
+ "HYPRCURSOR_THEME,Bibata-Modern-Ice"
+ "HYPRCURSOR_SIZE,24"
+ "XCURSOR_THEME,Bibata-Modern-Ice"
+ "XCURSOR_SIZE,24"
+ ])
+ ++ (lib.optionals (config.functorOS.formFactor == "desktop" && !osConfig.functorOS.theming.enable) [
+ "HYPRCURSOR_THEME,Bibata-Modern-Ice"
+ "HYPRCURSOR_SIZE,26"
+ "XCURSOR_THEME,Bibata-Modern-Ice"
+ "XCURSOR_SIZE,26"
+ ]);
+ layerrule = [
+ "blur on,match:namespace rofi"
+ "ignore_alpha 0,match:namespace rofi"
+ "animation slide bottom 0.2 0.2 wind,match:namespace rofi"
+ "blur on,match:namespace notifications"
+ "ignore_alpha 0,match:namespace notifications"
+ "blur on,match:namespace swaync-notification-window"
+ "animation slide right 0.5 0.5,match:namespace swaync-control-center"
+ "animation slide right 0.5 0.5,match:namespace notifications"
+ "animation slide right 0.5 0.5,match:namespace swaync-notification-window"
+ "ignore_alpha 0,match:namespace swaync-notification-window"
+ "blur on,match:namespace swaync-control-center"
+ "ignore_alpha 0,match:namespace swaync-control-center"
+ "blur on,match:namespace logout_dialog"
+ "blur on,match:namespace waybar"
+ "ignore_alpha 0,match:namespace waybar"
+ "animation slide top 0.2 0.2 wind,match:namespace waybar"
+ ];
+ dwindle = {
+ pseudotile = "yes";
+ preserve_split = "yes";
+ };
+ animations = {
+ enabled = "yes";
+ bezier = [
+ "wind, 0.05, 0.9, 0.1, 1.05"
+ "winIn, 0.1, 1.1, 0.1, 1.1"
+ "winOut, 0.3, -0.3, 0, 1"
+ "liner, 1, 1, 1, 1"
+ "windup, 0.05, 0.9, 0.1, 1.05"
+ ];
+ animation = [
+ "windows, 1, 6, wind, slide"
+ "windowsIn, 1, 6, winIn, slide"
+ "windowsOut, 1, 5, winOut, slide"
+ "windowsMove, 1, 5, wind, slide"
+ "fade, 1, 10, default"
+ # "layers, 1, 8, default, slide"
+ "workspaces, 1, 5, wind, slidefadevert"
+ ]
+ ++ (lib.optionals (!osConfig.functorOS.powersave) [
+ "border, 1, 1, liner"
+ "borderangle, 1, 30, liner, loop"
+ ]);
+ };
+
+ general =
+ let
+ inherit (config.lib.stylix) colors;
+ in
+ {
+ gaps_in = "3";
+ gaps_out = "8";
+ border_size = "2";
+ # "col.active_border" = pkgs.lib.mkForce "rgba(ca9ee6ff) rgba(f2d5cfff) 45deg";
+ # "col.inactive_border" = pkgs.lib.mkForce "rgba(b4befecc) rgba(6c7086cc) 45deg";
+ "col.active_border" = "rgba(${colors.base0A}ff) rgba(${colors.base09}ff) 45deg";
+ "col.inactive_border" = "rgba(${colors.base01}cc) rgba(${colors.base02}cc) 45deg";
+ layout = "scrolling";
+ resize_on_border = "true";
+ };
+
+ misc = {
+ disable_hyprland_logo = true;
+ disable_splash_rendering = true;
+ };
+
+ cursor = {
+ hide_on_key_press = true;
+ };
+
+ decoration = {
+ rounding = "10";
+ dim_special = "0.3";
+ blur = {
+ enabled = "yes";
+ size = "6";
+ passes = "3";
+ new_optimizations = "on";
+ ignore_opacity = "on";
+ xray = "true";
+ special = true;
+ };
+ shadow = {
+ enabled = false;
+ };
+ };
+ input = {
+ sensitivity = if config.functorOS.formFactor == "laptop" then "0.0" else "-0.65";
+ };
+ plugin.hyprscrolling = {
+ explicit_column_widths = "0.333, 0.5, 0.667, 1.0";
+ fullscreen_on_one_column = true;
+ focus_fit_method = "1";
+ };
+ };
+ };
+
+ wayland.windowManager.hyprland.settings.input.touchpad =
+ lib.mkIf (config.functorOS.formFactor == "laptop")
+ {
+ natural_scroll = true;
+ disable_while_typing = true;
+ clickfinger_behavior = true;
+ tap-to-click = false;
+ scroll_factor = 0.15;
+ };
+
+ assertions = [
+ {
+ assertion =
+ !cfg.screenlocker.useCrashFix || (cfg.screenlocker.useCrashFix && cfg.screenlocker.monitor != null);
+ message = "To use the Nvidia crash fix, you must set screenlocker.monitor to the monitor you want to use as the lock screen that blurs! Use `hyprctl monitors` to determine the monitor codes (should be something like DP-1, HDMI-A-1, etc).";
+ }
+ ];
+ };
+}
diff --git a/hm/modules/linux/desktop-environment/hyprland/utilities.nix b/hm/modules/linux/desktop-environment/hyprland/utilities.nix
new file mode 100644
index 00000000..62a0c7c7
--- /dev/null
+++ b/hm/modules/linux/desktop-environment/hyprland/utilities.nix
@@ -0,0 +1,182 @@
+{
+ pkgs,
+ lib,
+ config,
+ ...
+}:
+let
+ cfg = config.functorOS.desktop.hyprland;
+in
+{
+ config = lib.mkIf cfg.enable {
+ systemd.user.services = lib.mkIf cfg.bluelight.enable {
+ hyprsunset = {
+ Unit = {
+ Description = "Start the hyprsunset daemon";
+ PartOf = "hyprland-session.target";
+ After = "hyprland-session.target";
+ };
+ Service = {
+ Type = "simple";
+ ExecStart = "${lib.getExe pkgs.hyprsunset}";
+ Restart = "on-failure";
+ RestartSec = 3;
+ };
+ Install = {
+ WantedBy = [ "hyprland-session.target" ];
+ };
+ };
+ };
+
+ services.hyprpaper.enable = true;
+
+ programs.wlogout.enable = true;
+
+ programs.rofi = {
+ enable = true;
+ terminal = "${lib.getExe pkgs.kitty}";
+ theme =
+ let
+ inherit (config.lib.formats.rasi) mkLiteral;
+ mkRgba =
+ opacity: color:
+ let
+ c = config.lib.stylix.colors;
+ r = c."${color}-rgb-r";
+ g = c."${color}-rgb-g";
+ b = c."${color}-rgb-b";
+ in
+ mkLiteral "rgba ( ${r}, ${g}, ${b}, ${opacity} % )";
+ mkRgb = mkRgba "100";
+ rofiOpacity = builtins.toString (builtins.ceil (config.stylix.opacity.popups * 100));
+ in
+ {
+ "*" = {
+ font = "${config.stylix.fonts.monospace.name} ${toString config.stylix.fonts.sizes.popups}";
+ text-color = mkRgb "base05";
+ background-color = mkRgba rofiOpacity "base00";
+ };
+ "window" = {
+ height = mkLiteral "20em";
+ width = mkLiteral "30em";
+ border-radius = mkLiteral "8px";
+ border-width = mkLiteral "2px";
+ padding = mkLiteral "1.5em";
+ };
+ "mainbox" = {
+ background-color = mkRgba rofiOpacity "base01";
+ };
+ "inputbar" = {
+ margin = mkLiteral "0 0 1em 0";
+ };
+ "prompt" = {
+ enabled = false;
+ };
+ "entry" = {
+ placeholder = "Search...";
+ padding = mkLiteral "1em 1em";
+ text-color = mkRgb "base05";
+ background-color = mkRgba rofiOpacity "base00";
+ border-radius = mkLiteral "8px";
+ };
+ "element-text" = {
+ padding = mkLiteral "0.5em 1em";
+ margin = mkLiteral "0 0.5em";
+ };
+ "element-icon" = {
+ size = mkLiteral "3ch";
+ };
+ "element-text selected" = {
+ background-color = mkRgba rofiOpacity "base0A";
+ text-color = mkRgb "base01";
+ border-radius = mkLiteral "8px";
+ };
+ };
+ };
+
+ services.swayosd.enable = true;
+
+ programs.hyprlock = lib.mkIf cfg.screenlocker.enable {
+ enable = true;
+ settings = {
+ general = {
+ hide_cursor = true;
+ grace = 0;
+ };
+ background = {
+ monitor = cfg.screenlocker.monitor;
+ path =
+ if cfg.screenlocker.useCrashFix then "/tmp/__hyprlock-monitor-screenshot.png" else "screenshot";
+ blur_passes = 3;
+ blur_size = 7;
+ noise = 0.0117;
+ contrast = 0.8916;
+ brightness = 0.8172;
+ vibrancy = 0.1696;
+ vibrancy_darkness = 0.0;
+ };
+ input-field = {
+ monitor = "";
+ size = "200, 50";
+ outline_thickness = 3;
+ dots_size = 0.33;
+ dots_spacing = 0.15;
+ dots_center = false;
+ dots_rounding = -1;
+ outer_color = "rgb(151515)";
+ inner_color = "rgb(200, 200, 200)";
+ font_color = "rgb(10, 10, 10)";
+ fade_on_empty = true;
+ fade_timeout = 1000;
+ placeholder_text = "Input Password...";
+ hide_input = false;
+ rounding = -1;
+ check_color = "rgb(204, 136, 34)";
+ fail_color = "rgb(204, 34, 34)";
+ fail_text = "$FAIL ($ATTEMPTS)";
+ fail_timeout = 2000;
+ fail_transition = 300;
+ capslock_color = -1;
+ numlock_color = -1;
+ bothlock_color = -1;
+ invert_numlock = false;
+ swap_font_color = false;
+
+ position = "0, -20";
+ halign = "center";
+ valign = "center";
+ };
+ };
+ };
+
+ services.hypridle = lib.mkIf cfg.idleDaemon.enable {
+ enable = true;
+ settings = {
+ general = {
+ lock_cmd =
+ if cfg.screenlocker.useCrashFix then
+ "pidof hyprlock || ${lib.getExe pkgs.grim} -o ${config.programs.hyprlock.settings.background.monitor} /tmp/__hyprlock-monitor-screenshot.png && ${lib.getExe pkgs.hyprlock}"
+ else
+ "pidof hyprlock || hyprlock";
+ before_sleep_cmd = "loginctl lock-session"; # lock before suspend.
+ after_sleep_cmd = "hyprctl dispatch dpms on"; # to avoid having to press a key twice to turn on the display.
+ };
+ listener = [
+ {
+ timeout = 1500;
+ on-timeout = "loginctl lock-session";
+ }
+ {
+ timeout = 330; # 5.5min
+ on-timeout = "hyprctl dispatch dpms off"; # screen off when timeout has passed
+ on-resume = "hyprctl dispatch dpms on"; # screen on when activity is detected after timeout has fired.
+ }
+ {
+ timeout = 1800;
+ on-timeout = "systemctl suspend";
+ }
+ ];
+ };
+ };
+ };
+}
diff --git a/hm/modules/linux/desktop-environment/hyprland/windowrules.nix b/hm/modules/linux/desktop-environment/hyprland/windowrules.nix
new file mode 100644
index 00000000..5f12885d
--- /dev/null
+++ b/hm/modules/linux/desktop-environment/hyprland/windowrules.nix
@@ -0,0 +1,107 @@
+{ config, lib, ... }:
+let
+ cfg = config.functorOS.desktop.hyprland;
+in
+{
+ config.wayland.windowManager.hyprland.settings.windowrule =
+ lib.mkIf config.functorOS.desktop.hyprland.enable
+ (
+ [
+ "match:class ^(librewolf)$, opacity 0.90 0.90"
+ "match:class ^(floorp)$, opacity 0.90 0.90"
+ "match:class ^(firefox)$, opacity 0.90 0.90"
+ "match:class ^(zen-alpha)$, opacity 0.90 0.90"
+ "match:class ^(zen-beta)$, opacity 0.90 0.90"
+ "match:class ^(zen)$, opacity 0.90 0.90"
+ "match:class ^(Brave-browser)$, opacity 0.90 0.90"
+ "match:class ^(Steam)$, opacity 0.80 0.80"
+ "match:class ^(steam)$, opacity 0.80 0.80"
+ "match:class ^(steamwebhelper)$, opacity 0.80 0.80"
+ "match:class ^(io.github.nokse22.high-tide)$, opacity 0.80 0.80"
+ "match:class ^(tidal-hifi)$, opacity 0.80 0.80"
+ "match:class ^(spotify)$, opacity 0.80 0.80"
+ "match:initial_title ^(Spotify Premium)$, opacity 0.80 0.80"
+ "match:initial_title ^(Spotify Free)$, opacity 0.80 0.80"
+ "match:class ^(code-oss)$, opacity 0.80 0.80"
+ "match:class ^(Code)$, opacity 0.80 0.80"
+ "match:class ^(code-url-handler)$, opacity 0.80 0.80"
+ "match:class ^(code-insiders-url-handler)$, opacity 0.80 0.80"
+ "match:class ^(kitty)$, opacity 0.80 0.80"
+ "match:class ^(neovide)$, opacity 0.80 0.80"
+ "match:class ^(org.kde.dolphin)$, opacity 0.80 0.80"
+ "match:class ^(org.gnome.Nautilus)$, opacity 0.80 0.80"
+ "match:class ^(org.kde.ark)$, opacity 0.80 0.80"
+ "match:class ^(nwg-look)$, opacity 0.80 0.80"
+ "match:class ^(qt5ct)$, opacity 0.80 0.80"
+ "match:class ^(qt6ct)$, opacity 0.80 0.80"
+ "match:class ^(kvantummanager)$, opacity 0.80 0.80"
+ "match:class ^(waypaper)$, opacity 0.80 0.80"
+ "match:class ^(org.pulseaudio.pavucontrol)$, opacity 0.80 0.80"
+ "match:class ^(com.github.wwmm.easyeffects)$, opacity 0.80 0.80"
+ "match:class ^(thunderbird)$, opacity 0.80 0.80"
+
+ "match:class ^(com.github.rafostar.Clapper)$, opacity 0.90 0.90 # Clapper-Gtk"
+ "match:class ^(com.github.tchx84.Flatseal)$, opacity 0.80 0.80 # Flatseal-Gtk"
+ "match:class ^(hu.kramo.Cartridges)$, opacity 0.80 0.80 # Cartridges-Gtk"
+ "match:class ^(com.obsproject.Studio)$, opacity 0.80 0.80 # Obs-Qt"
+ "match:class ^(gnome-boxes)$, opacity 0.80 0.80 # Boxes-Gtk"
+ "match:class ^(discord)$, opacity 0.80 0.80 # Discord-Electron"
+ "match:class ^(vesktop)$, opacity 0.80 0.80 # Vesktop-Electron"
+ "match:class ^(Element)$, opacity 0.80 0.80 # Element-Electron"
+ "match:class ^(ArmCord)$, opacity 0.80 0.80 # ArmCord-Electron"
+ "match:class ^(app.drey.Warp)$, opacity 0.80 0.80 # Warp-Gtk"
+ "match:class ^(net.davidotek.pupgui2)$, opacity 0.80 0.80 # ProtonUp-Qt"
+ "match:class ^(yad)$, opacity 0.80 0.80 # Protontricks-Gtk"
+ "match:class ^(signal)$, opacity 0.80 0.80 # Signal-Gtk"
+ "match:class ^(io.github.alainm23.planify)$, opacity 0.80 0.80 # planify-Gtk"
+ "match:class ^(io.gitlab.theevilskeleton.Upscaler)$, opacity 0.80 0.80 # Upscaler-Gtk"
+ "match:class ^(com.github.unrud.VideoDownloader)$, opacity 0.80 0.80 # VideoDownloader-Gtk"
+ "match:class ^(lutris)$, opacity 0.80 0.80 # Lutris game launcher"
+
+ "match:class ^(pavucontrol)$, opacity 0.80 0.70"
+ "match:class ^(blueman-manager)$, opacity 0.80 0.70"
+ "match:class ^(nm-applet)$, opacity 0.80 0.70"
+ "match:class ^(nm-connection-editor)$, opacity 0.80 0.70"
+ "match:class ^(org.kde.polkit-kde-authentication-agent-1)$, opacity 0.80 0.70"
+
+ "match:class ^(org.kde.dolphin)$, match:title ^(Progress Dialog — Dolphin)$, float on"
+ "match:class ^(org.kde.dolphin)$, match:title ^(Copying — Dolphin)$, float on"
+ "match:title ^(Picture-in-Picture)$, float on"
+ "match:class ^(librewolf)$, match:title ^(Library)$, float on"
+ "match:class ^(floorp)$, match:title ^(Library)$, float on"
+ "match:class ^(zen-alpha)$, match:title ^(Library)$, float on"
+ "match:class ^(zen-beta)$, match:title ^(Library)$, float on"
+ "match:class ^(zen)$, match:title ^(Library)$, float on"
+ ''match:class ^(zen)$, match:title ^(.*Extension: \(Bitwarden Password Manager\).*)$, float on''
+ "match:class ^(vlc)$, float on"
+ "match:class ^(kvantummanager)$, float on"
+ "match:class ^(qt5ct)$, float on"
+ "match:class ^(qt6ct)$, float on"
+ "match:class ^(nwg-look)$, float on"
+ "match:class ^(org.kde.ark)$, float on"
+ "match:class ^(org.pulseaudio.pavucontrol)$, float on"
+ "match:class ^(com.github.rafostar.Clapper)$, float on # Clapper-Gtk"
+ "match:class ^(app.drey.Warp)$, float on # Warp-Gtk"
+ "match:class ^(net.davidotek.pupgui2)$, float on # ProtonUp-Qt"
+ "match:class ^(yad)$, float on # Protontricks-Gtk"
+ "match:class ^(eog)$, float on # Imageviewer-Gtk"
+ "match:class ^(io.github.alainm23.planify)$, float on # planify-Gtk"
+ "match:class ^(io.gitlab.theevilskeleton.Upscaler)$, float on # Upscaler-Gtk"
+ "match:class ^(com.github.unrud.VideoDownloader)$, float on # VideoDownloader-Gtk"
+ "match:class ^(blueman-manager)$, float on"
+ "match:class ^(nm-applet)$, float on"
+ "match:class ^(nm-connection-editor)$, float on"
+ "match:class ^(org.kde.polkit-kde-authentication-agent-1)$, float on"
+ "match:class ^(org.freedesktop.impl.portal.desktop.gtk)$, opacity 0.80 0.80"
+ "match:class ^(org.freedesktop.impl.portal.desktop.hyprland)$, opacity 0.80 0.80"
+
+ ''match:class ^(zen)$, match:title ^(.*Extension: \(Bitwarden Password Manager\).*)$, size 70% 70%''
+ "match:class ^(org.pulseaudio.pavucontrol)$, size 50% 50%"
+
+ "match:class ^(pinentry-), stay_focused on" # fix pinentry losing focus
+ ]
+ ++ (lib.optionals cfg.fcitx5.enable [
+ "match:class ^(fcitx), pseudo on"
+ ])
+ );
+}
diff --git a/hm/modules/linux/desktop-environment/niri/config.kdl b/hm/modules/linux/desktop-environment/niri/config.kdl
new file mode 100644
index 00000000..e3e306f7
--- /dev/null
+++ b/hm/modules/linux/desktop-environment/niri/config.kdl
@@ -0,0 +1,509 @@
+// This config is in the KDL format: https://kdl.dev
+// "/-" comments out the following node.
+// Check the wiki for a full description of the configuration:
+// https://github.com/YaLTeR/niri/wiki/Configuration:-Overview
+
+// Input device configuration.
+// Find the full list of options on the wiki:
+// https://github.com/YaLTeR/niri/wiki/Configuration:-Input
+input {
+ keyboard {
+ xkb {
+ // You can set rules, model, layout, variant and options.
+ // For more information, see xkeyboard-config(7).
+
+ // For example:
+ // layout "us,ru"
+ // options "grp:win_space_toggle,compose:ralt,ctrl:nocaps"
+ }
+ }
+
+ // Next sections include libinput settings.
+ // Omitting settings disables them, or leaves them at their default values.
+ touchpad {
+ // off
+ tap
+ // dwt
+ // dwtp
+ natural-scroll
+ // accel-speed 0.2
+ // accel-profile "flat"
+ // scroll-method "two-finger"
+ // disabled-on-external-mouse
+ }
+
+ mouse {
+ // off
+ // natural-scroll
+ // accel-speed 0.2
+ // accel-profile "flat"
+ // scroll-method "no-scroll"
+ }
+
+ trackpoint {
+ // off
+ // natural-scroll
+ // accel-speed 0.2
+ // accel-profile "flat"
+ // scroll-method "on-button-down"
+ // scroll-button 273
+ // middle-emulation
+ }
+
+ // Uncomment this to make the mouse warp to the center of newly focused windows.
+ // warp-mouse-to-focus
+
+ // Focus windows and outputs automatically when moving the mouse into them.
+ // Setting max-scroll-amount="0%" makes it work only on windows already fully on screen.
+ // focus-follows-mouse max-scroll-amount="0%"
+}
+
+// You can configure outputs by their name, which you can find
+// by running `niri msg outputs` while inside a niri instance.
+// The built-in laptop monitor is usually called "eDP-1".
+// Find more information on the wiki:
+// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs
+// Remember to uncomment the node by removing "/-"!
+/-output "eDP-1" {
+ // Uncomment this line to disable this output.
+ // off
+
+ // Resolution and, optionally, refresh rate of the output.
+ // The format is "x" or "x@".
+ // If the refresh rate is omitted, niri will pick the highest refresh rate
+ // for the resolution.
+ // If the mode is omitted altogether or is invalid, niri will pick one automatically.
+ // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.
+ mode "1920x1080@120.030"
+
+ // You can use integer or fractional scale, for example use 1.5 for 150% scale.
+ scale 2
+
+ // Transform allows to rotate the output counter-clockwise, valid values are:
+ // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.
+ transform "normal"
+
+ // Position of the output in the global coordinate space.
+ // This affects directional monitor actions like "focus-monitor-left", and cursor movement.
+ // The cursor can only move between directly adjacent outputs.
+ // Output scale and rotation has to be taken into account for positioning:
+ // outputs are sized in logical, or scaled, pixels.
+ // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,
+ // so to put another output directly adjacent to it on the right, set its x to 1920.
+ // If the position is unset or results in an overlap, the output is instead placed
+ // automatically.
+ position x=1280 y=0
+}
+
+// Settings that influence how windows are positioned and sized.
+// Find more information on the wiki:
+// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout
+layout {
+ // Set gaps around windows in logical pixels.
+ gaps 16
+
+ // When to center a column when changing focus, options are:
+ // - "never", default behavior, focusing an off-screen column will keep at the left
+ // or right edge of the screen.
+ // - "always", the focused column will always be centered.
+ // - "on-overflow", focusing a column will center it if it doesn't fit
+ // together with the previously focused column.
+ center-focused-column "on-overflow"
+
+ // You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between.
+ preset-column-widths {
+ // Proportion sets the width as a fraction of the output width, taking gaps into account.
+ // For example, you can perfectly fit four windows sized "proportion 0.25" on an output.
+ // The default preset widths are 1/3, 1/2 and 2/3 of the output.
+ proportion 0.33333
+ proportion 0.5
+ proportion 0.66667
+
+ // Fixed sets the width in logical pixels exactly.
+ // fixed 1920
+ }
+
+ // You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between.
+ // preset-window-heights { }
+
+ // You can change the default width of the new windows.
+ default-column-width { proportion 0.5; }
+ // If you leave the brackets empty, the windows themselves will decide their initial width.
+ // default-column-width {}
+
+ // By default focus ring and border are rendered as a solid background rectangle
+ // behind windows. That is, they will show up through semitransparent windows.
+ // This is because windows using client-side decorations can have an arbitrary shape.
+ //
+ // If you don't like that, you should uncomment `prefer-no-csd` below.
+ // Niri will draw focus ring and border *around* windows that agree to omit their
+ // client-side decorations.
+ //
+ // Alternatively, you can override it with a window rule called
+ // `draw-border-with-background`.
+
+ // You can change how the focus ring looks.
+ focus-ring {
+ // Uncomment this line to disable the focus ring.
+ // off
+
+ // How many logical pixels the ring extends out from the windows.
+ width 4
+
+ // Colors can be set in a variety of ways:
+ // - CSS named colors: "red"
+ // - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa"
+ // - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others.
+
+ // Color of the ring on the active monitor.
+ active-color "#7fc8ff"
+
+ // Color of the ring on inactive monitors.
+ inactive-color "#505050"
+
+ // You can also use gradients. They take precedence over solid colors.
+ // Gradients are rendered the same as CSS linear-gradient(angle, from, to).
+ // The angle is the same as in linear-gradient, and is optional,
+ // defaulting to 180 (top-to-bottom gradient).
+ // You can use any CSS linear-gradient tool on the web to set these up.
+ // Changing the color space is also supported, check the wiki for more info.
+ //
+ // active-gradient from="#80c8ff" to="#bbddff" angle=45
+
+ // You can also color the gradient relative to the entire view
+ // of the workspace, rather than relative to just the window itself.
+ // To do that, set relative-to="workspace-view".
+ //
+ // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
+ }
+
+ // You can also add a border. It's similar to the focus ring, but always visible.
+ border {
+ // The settings are the same as for the focus ring.
+ // If you enable the border, you probably want to disable the focus ring.
+ off
+
+ width 4
+ active-color "#ffc87f"
+ inactive-color "#505050"
+
+ // active-gradient from="#ffbb66" to="#ffc880" angle=45 relative-to="workspace-view"
+ // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
+ }
+
+ // Struts shrink the area occupied by windows, similarly to layer-shell panels.
+ // You can think of them as a kind of outer gaps. They are set in logical pixels.
+ // Left and right struts will cause the next window to the side to always be visible.
+ // Top and bottom struts will simply add outer gaps in addition to the area occupied by
+ // layer-shell panels and regular gaps.
+ struts {
+ // left 64
+ // right 64
+ // top 64
+ // bottom 64
+ }
+}
+
+// Add lines like this to spawn processes at startup.
+// Note that running niri as a session supports xdg-desktop-autostart,
+// which may be more convenient to use.
+// See the binds section below for more spawn examples.
+// spawn-at-startup "alacritty" "-e" "fish"
+
+// Uncomment this line to ask the clients to omit their client-side decorations if possible.
+// If the client will specifically ask for CSD, the request will be honored.
+// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.
+// This option will also fix border/focus ring drawing behind some semitransparent windows.
+// After enabling or disabling this, you need to restart the apps for this to take effect.
+prefer-no-csd
+
+// You can change the path where screenshots are saved.
+// A ~ at the front will be expanded to the home directory.
+// The path is formatted with strftime(3) to give you the screenshot date and time.
+screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
+
+// You can also set this to null to disable saving screenshots to disk.
+// screenshot-path null
+
+// Animation settings.
+// The wiki explains how to configure individual animations:
+// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations
+animations {
+ // Uncomment to turn off all animations.
+ // off
+
+ // Slow down all animations by this factor. Values below 1 speed them up instead.
+ // slowdown 3.0
+}
+
+// Window rules let you adjust behavior for individual windows.
+// Find more information on the wiki:
+// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules
+
+// Work around WezTerm's initial configure bug
+// by setting an empty default-column-width.
+window-rule {
+ // This regular expression is intentionally made as specific as possible,
+ // since this is the default config, and we want no false positives.
+ // You can get away with just app-id="wezterm" if you want.
+ match app-id=r#"^org\.wezfurlong\.wezterm$"#
+ default-column-width {}
+}
+
+// Open the Firefox picture-in-picture player as floating by default.
+window-rule {
+ // This app-id regular expression will work for both:
+ // - host Firefox (app-id is "firefox")
+ // - Flatpak Firefox (app-id is "org.mozilla.firefox")
+ match app-id=r#"firefox$"# title="^Picture-in-Picture$"
+ open-floating true
+}
+
+// Example: block out two password managers from screen capture.
+// (This example rule is commented out with a "/-" in front.)
+/-window-rule {
+ match app-id=r#"^org\.keepassxc\.KeePassXC$"#
+ match app-id=r#"^org\.gnome\.World\.Secrets$"#
+
+ block-out-from "screen-capture"
+
+ // Use this instead if you want them visible on third-party screenshot tools.
+ // block-out-from "screencast"
+}
+
+// Example: enable rounded corners for all windows.
+// (This example rule is commented out with a "/-" in front.)
+window-rule {
+ geometry-corner-radius 12
+ clip-to-geometry true
+}
+
+binds {
+ // Keys consist of modifiers separated by + signs, followed by an XKB key name
+ // in the end. To find an XKB name for a particular key, you may use a program
+ // like wev.
+ //
+ // "Mod" is a special modifier equal to Super when running on a TTY, and to Alt
+ // when running as a winit window.
+ //
+ // Most actions that you can bind here can also be invoked programmatically with
+ // `niri msg action do-something`.
+
+ // Mod-Shift-/, which is usually the same as Mod-?,
+ // shows a list of important hotkeys.
+ Mod+Shift+Slash { show-hotkey-overlay; }
+
+ // Suggested binds for running programs: terminal, app launcher, screen locker.
+ Mod+T { spawn "kitty"; }
+ Mod+D { spawn "bash" "-c" "pkill -9 rofi || rofi -show drun"; }
+ Super+Alt+L { spawn "loginctl lock-session"; }
+
+ // You can also use a shell. Do this if you need pipes, multiple commands, etc.
+ // Note: the entire command goes as a single argument in the end.
+ // Mod+T { spawn "bash" "-c" "notify-send hello && exec alacritty"; }
+
+ // Example volume keys mappings for PipeWire & WirePlumber.
+ // The allow-when-locked=true property makes them work even when the session is locked.
+ XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; }
+ XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; }
+ XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
+ XF86AudioMicMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; }
+
+ Mod+Q { close-window; }
+
+ Mod+Left { focus-column-left; }
+ Mod+Down { focus-window-down; }
+ Mod+Up { focus-window-up; }
+ Mod+Right { focus-column-right; }
+ Mod+H { focus-column-left; }
+ Mod+J { focus-window-down; }
+ Mod+K { focus-window-up; }
+ Mod+L { focus-column-right; }
+
+ Mod+Ctrl+Left { move-column-left; }
+ Mod+Ctrl+Down { move-window-down; }
+ Mod+Ctrl+Up { move-window-up; }
+ Mod+Ctrl+Right { move-column-right; }
+ Mod+Ctrl+H { move-column-left; }
+ Mod+Ctrl+J { move-window-down; }
+ Mod+Ctrl+K { move-window-up; }
+ Mod+Ctrl+L { move-column-right; }
+
+ // Alternative commands that move across workspaces when reaching
+ // the first or last window in a column.
+ // Mod+J { focus-window-or-workspace-down; }
+ // Mod+K { focus-window-or-workspace-up; }
+ // Mod+Ctrl+J { move-window-down-or-to-workspace-down; }
+ // Mod+Ctrl+K { move-window-up-or-to-workspace-up; }
+
+ Mod+Home { focus-column-first; }
+ Mod+End { focus-column-last; }
+ Mod+Ctrl+Home { move-column-to-first; }
+ Mod+Ctrl+End { move-column-to-last; }
+
+ Mod+Shift+Left { focus-monitor-left; }
+ Mod+Shift+Down { focus-monitor-down; }
+ Mod+Shift+Up { focus-monitor-up; }
+ Mod+Shift+Right { focus-monitor-right; }
+ Mod+Shift+H { focus-monitor-left; }
+ Mod+Shift+J { focus-monitor-down; }
+ Mod+Shift+K { focus-monitor-up; }
+ Mod+Shift+L { focus-monitor-right; }
+
+ Mod+Shift+Ctrl+Left { move-column-to-monitor-left; }
+ Mod+Shift+Ctrl+Down { move-column-to-monitor-down; }
+ Mod+Shift+Ctrl+Up { move-column-to-monitor-up; }
+ Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }
+ Mod+Shift+Ctrl+H { move-column-to-monitor-left; }
+ Mod+Shift+Ctrl+J { move-column-to-monitor-down; }
+ Mod+Shift+Ctrl+K { move-column-to-monitor-up; }
+ Mod+Shift+Ctrl+L { move-column-to-monitor-right; }
+
+ // Alternatively, there are commands to move just a single window:
+ // Mod+Shift+Ctrl+Left { move-window-to-monitor-left; }
+ // ...
+
+ // And you can also move a whole workspace to another monitor:
+ // Mod+Shift+Ctrl+Left { move-workspace-to-monitor-left; }
+ // ...
+
+ Mod+Page_Down { focus-workspace-down; }
+ Mod+Page_Up { focus-workspace-up; }
+ Mod+U { focus-workspace-down; }
+ Mod+I { focus-workspace-up; }
+ Mod+Ctrl+Page_Down { move-column-to-workspace-down; }
+ Mod+Ctrl+Page_Up { move-column-to-workspace-up; }
+ Mod+Ctrl+U { move-column-to-workspace-down; }
+ Mod+Ctrl+I { move-column-to-workspace-up; }
+
+ // Alternatively, there are commands to move just a single window:
+ // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }
+ // ...
+
+ Mod+Shift+Page_Down { move-workspace-down; }
+ Mod+Shift+Page_Up { move-workspace-up; }
+ Mod+Shift+U { move-workspace-down; }
+ Mod+Shift+I { move-workspace-up; }
+
+ // You can bind mouse wheel scroll ticks using the following syntax.
+ // These binds will change direction based on the natural-scroll setting.
+ //
+ // To avoid scrolling through workspaces really fast, you can use
+ // the cooldown-ms property. The bind will be rate-limited to this value.
+ // You can set a cooldown on any bind, but it's most useful for the wheel.
+ Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
+ Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
+ Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
+ Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
+
+ Mod+WheelScrollRight { focus-column-right; }
+ Mod+WheelScrollLeft { focus-column-left; }
+ Mod+Ctrl+WheelScrollRight { move-column-right; }
+ Mod+Ctrl+WheelScrollLeft { move-column-left; }
+
+ // Usually scrolling up and down with Shift in applications results in
+ // horizontal scrolling; these binds replicate that.
+ Mod+Shift+WheelScrollDown { focus-column-right; }
+ Mod+Shift+WheelScrollUp { focus-column-left; }
+ Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }
+ Mod+Ctrl+Shift+WheelScrollUp { move-column-left; }
+
+ // Similarly, you can bind touchpad scroll "ticks".
+ // Touchpad scrolling is continuous, so for these binds it is split into
+ // discrete intervals.
+ // These binds are also affected by touchpad's natural-scroll, so these
+ // example binds are "inverted", since we have natural-scroll enabled for
+ // touchpads by default.
+ // Mod+TouchpadScrollDown { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"; }
+ // Mod+TouchpadScrollUp { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"; }
+
+ // You can refer to workspaces by index. However, keep in mind that
+ // niri is a dynamic workspace system, so these commands are kind of
+ // "best effort". Trying to refer to a workspace index bigger than
+ // the current workspace count will instead refer to the bottommost
+ // (empty) workspace.
+ //
+ // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on
+ // will all refer to the 3rd workspace.
+ Mod+1 { focus-workspace 1; }
+ Mod+2 { focus-workspace 2; }
+ Mod+3 { focus-workspace 3; }
+ Mod+4 { focus-workspace 4; }
+ Mod+5 { focus-workspace 5; }
+ Mod+6 { focus-workspace 6; }
+ Mod+7 { focus-workspace 7; }
+ Mod+8 { focus-workspace 8; }
+ Mod+9 { focus-workspace 9; }
+ Mod+Ctrl+1 { move-column-to-workspace 1; }
+ Mod+Ctrl+2 { move-column-to-workspace 2; }
+ Mod+Ctrl+3 { move-column-to-workspace 3; }
+ Mod+Ctrl+4 { move-column-to-workspace 4; }
+ Mod+Ctrl+5 { move-column-to-workspace 5; }
+ Mod+Ctrl+6 { move-column-to-workspace 6; }
+ Mod+Ctrl+7 { move-column-to-workspace 7; }
+ Mod+Ctrl+8 { move-column-to-workspace 8; }
+ Mod+Ctrl+9 { move-column-to-workspace 9; }
+
+ // Alternatively, there are commands to move just a single window:
+ // Mod+Ctrl+1 { move-window-to-workspace 1; }
+
+ // Switches focus between the current and the previous workspace.
+ // Mod+Tab { focus-workspace-previous; }
+
+ // The following binds move the focused window in and out of a column.
+ // If the window is alone, they will consume it into the nearby column to the side.
+ // If the window is already in a column, they will expel it out.
+ Mod+BracketLeft { consume-or-expel-window-left; }
+ Mod+BracketRight { consume-or-expel-window-right; }
+
+ // Consume one window from the right to the bottom of the focused column.
+ Mod+Comma { consume-window-into-column; }
+ // Expel the bottom window from the focused column to the right.
+ Mod+Period { expel-window-from-column; }
+
+ Mod+R { switch-preset-column-width; }
+ Mod+Shift+R { switch-preset-window-height; }
+ Mod+Ctrl+R { reset-window-height; }
+ Mod+F { maximize-column; }
+ Mod+Shift+F { fullscreen-window; }
+ Mod+C { center-column; }
+
+ // Finer width adjustments.
+ // This command can also:
+ // * set width in pixels: "1000"
+ // * adjust width in pixels: "-5" or "+5"
+ // * set width as a percentage of screen width: "25%"
+ // * adjust width as a percentage of screen width: "-10%" or "+10%"
+ // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,
+ // set-column-width "100" will make the column occupy 200 physical screen pixels.
+ Mod+Minus { set-column-width "-10%"; }
+ Mod+Equal { set-column-width "+10%"; }
+
+ // Finer height adjustments when in column with other windows.
+ Mod+Shift+Minus { set-window-height "-10%"; }
+ Mod+Shift+Equal { set-window-height "+10%"; }
+
+ // Move the focused window between the floating and the tiling layout.
+ Mod+V { toggle-window-floating; }
+ Mod+Shift+V { switch-focus-between-floating-and-tiling; }
+
+ // Actions to switch layouts.
+ // Note: if you uncomment these, make sure you do NOT have
+ // a matching layout switch hotkey configured in xkb options above.
+ // Having both at once on the same hotkey will break the switching,
+ // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).
+ // Mod+Space { switch-layout "next"; }
+ // Mod+Shift+Space { switch-layout "prev"; }
+
+ Print { screenshot; }
+ Ctrl+Print { screenshot-screen; }
+ Alt+Print { screenshot-window; }
+
+ // The quit action will show a confirmation dialog to avoid accidental exits.
+ Mod+Shift+E { quit; }
+ Ctrl+Alt+Delete { quit; }
+
+ // Powers off the monitors. To turn them back on, do any input like
+ // moving the mouse or pressing any other key.
+ Mod+Shift+P { power-off-monitors; }
+}
diff --git a/hm/modules/linux/desktop-environment/niri/default.nix b/hm/modules/linux/desktop-environment/niri/default.nix
new file mode 100644
index 00000000..545b5ef6
--- /dev/null
+++ b/hm/modules/linux/desktop-environment/niri/default.nix
@@ -0,0 +1,19 @@
+{ lib, config, ... }:
+let
+ cfg = config.functorOS.desktop.niri;
+in
+{
+ options.functorOS.desktop.niri = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = false;
+ description = ''
+ Whether to enable and rice Niri.
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ xdg.configFile."niri/config.kdl".source = config.lib.file.mkOutOfStoreSymlink ./config.kdl;
+ };
+}
diff --git a/hm/modules/linux/desktop-environment/sway/binds.nix b/hm/modules/linux/desktop-environment/sway/binds.nix
new file mode 100644
index 00000000..7584c84c
--- /dev/null
+++ b/hm/modules/linux/desktop-environment/sway/binds.nix
@@ -0,0 +1,102 @@
+{
+ lib,
+ pkgs,
+ config,
+ ...
+}:
+let
+ cfg = config.functorOS.desktop.sway;
+ modifier = "Mod4";
+in
+{
+ wayland.windowManager.sway.config.keybindings = lib.mkIf cfg.enable (
+ lib.mkForce (
+ {
+ # --- Scroller-style column navigation (mirrors hyprscrolling) ---
+ "${modifier}+h" = "focus left";
+ "${modifier}+l" = "focus right";
+ "${modifier}+k" = "focus up";
+ "${modifier}+j" = "focus down";
+
+ # Move windows between columns
+ "${modifier}+Shift+h" = "move left";
+ "${modifier}+Shift+l" = "move right";
+ "${modifier}+Shift+k" = "move up";
+ "${modifier}+Shift+j" = "move down";
+
+ # Layout: toggle horizontal/vertical split ($mod+C = togglefit equivalent)
+ "${modifier}+c" = "layout toggle splith splitv";
+ # Fullscreen ($mod+F = fit active equivalent)
+ "${modifier}+f" = "fullscreen toggle";
+
+ # Workspace navigation (mirrors hyprnome $mod+U / $mod+I)
+ "${modifier}+u" = "workspace next_on_output";
+ "${modifier}+i" = "workspace prev_on_output";
+ "${modifier}+Shift+u" = "move container to workspace next_on_output; workspace next_on_output";
+ "${modifier}+Shift+i" = "move container to workspace prev_on_output; workspace prev_on_output";
+
+ # --- Window actions ---
+ "${modifier}+q" = "kill";
+ "${modifier}+w" = "floating toggle";
+ "${modifier}+Return" = "fullscreen toggle";
+
+ # Scratchpad (special workspace equivalent)
+ "${modifier}+s" = "scratchpad show";
+ "${modifier}+Shift+s" = "move scratchpad";
+
+ # Workspace back and forth ($mod+Tab)
+ "${modifier}+Tab" = "workspace back_and_forth";
+
+ # --- Utilities ---
+ "${modifier}+space" = "exec pkill -x rofi || rofi -show drun";
+ "${modifier}+x" = "exec pkill -x rofi || rofi -show window";
+ "${modifier}+BackSpace" = "exec pkill -x wlogout || wlogout";
+ "${modifier}+z" = "exec loginctl lock-session";
+
+ # --- Media controls ---
+ "XF86AudioMute" = "exec ${lib.getExe pkgs.pamixer} -t";
+ "XF86AudioPlay" = "exec ${lib.getExe pkgs.playerctl} --player=%any,firefox play-pause";
+ "XF86AudioNext" = "exec ${lib.getExe pkgs.playerctl} --player=%any,firefox next";
+ "XF86AudioPrev" = "exec ${lib.getExe pkgs.playerctl} --player=%any,firefox previous";
+ "XF86MonBrightnessDown" = "exec ${lib.getExe pkgs.brightnessctl} set 5%-";
+ "XF86MonBrightnessUp" = "exec ${lib.getExe pkgs.brightnessctl} set 5%+";
+ "XF86AudioRaiseVolume" = "exec ${lib.getExe pkgs.pamixer} -i 5";
+ "XF86AudioLowerVolume" = "exec ${lib.getExe pkgs.pamixer} -d 5";
+
+ # --- Screenshots (same tooling as hyprland) ---
+ "${modifier}+Shift+p" = "exec ${lib.getExe pkgs.grim} - | ${lib.getExe pkgs.swappy} -f -";
+ "${modifier}+p" = ''exec ${lib.getExe pkgs.grim} -g "$(${lib.getExe pkgs.slurp})" - | ${lib.getExe pkgs.swappy} -f -'';
+
+ # --- Browser ---
+ "${modifier}+b" = "exec ${lib.getExe config.functorOS.programs.defaultBrowser}";
+
+ # --- Resize (mirrors $mod+Alt+Direction in hyprland) ---
+ "${modifier}+Mod1+l" = "resize grow width 30 px";
+ "${modifier}+Mod1+h" = "resize shrink width 30 px";
+ "${modifier}+Mod1+k" = "resize shrink height 30 px";
+ "${modifier}+Mod1+j" = "resize grow height 30 px";
+ }
+ // (lib.optionalAttrs config.functorOS.desktop.swaync.enable {
+ "${modifier}+n" = "exec sleep 0.1 && ${pkgs.swaynotificationcenter}/bin/swaync-client -t -sw";
+ })
+ // (lib.optionalAttrs config.functorOS.programs.enable {
+ "${modifier}+r" = "exec ${lib.getExe pkgs.pavucontrol} -t 3";
+ "${modifier}+t" = "exec ${lib.getExe pkgs.kitty}";
+ "${modifier}+e" = "exec ${lib.getExe pkgs.nautilus}";
+ "${modifier}+m" = "exec ${lib.getExe pkgs.thunderbird}";
+ })
+ // (lib.listToAttrs (
+ lib.concatMap (n: [
+ {
+ name = "${modifier}+${toString n}";
+ value = "workspace number ${toString n}";
+ }
+ {
+ name = "${modifier}+Shift+${toString n}";
+ value = "move container to workspace number ${toString n}; workspace number ${toString n}";
+ }
+ ]) (lib.range 1 9)
+ ))
+ )
+ );
+}
diff --git a/hm/modules/linux/desktop-environment/sway/default.nix b/hm/modules/linux/desktop-environment/sway/default.nix
new file mode 100644
index 00000000..bd6f55f7
--- /dev/null
+++ b/hm/modules/linux/desktop-environment/sway/default.nix
@@ -0,0 +1,264 @@
+{
+ pkgs,
+ config,
+ lib,
+ osConfig,
+ ...
+}:
+let
+ cfg = config.functorOS.desktop.sway;
+ inherit (config.lib.stylix) colors;
+in
+{
+ imports = [
+ ./binds.nix
+ ./utilities.nix
+ ];
+
+ options.functorOS.desktop.sway = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = false;
+ description = ''
+ Whether to enable and rice Sway as the desktop compositor.
+ Uses standard sway tiling (splith/splitv).
+ '';
+ };
+ idleDaemon.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable;
+ description = "Whether to enable swayidle for screen locking and power saving.";
+ };
+ screenlocker.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable && cfg.idleDaemon.enable;
+ description = "Whether to enable hyprlock for screen locking.";
+ };
+ bluelight.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = true;
+ description = "Whether to enable wlsunset as a blue light filter daemon.";
+ };
+ fcitx5.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = osConfig.i18n.inputMethod.enable && (osConfig.i18n.inputMethod.type == "fcitx5");
+ description = "Whether to start fcitx5 at sway startup.";
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ home.packages =
+ with pkgs;
+ [
+ wl-clipboard
+ libsForQt5.qtstyleplugin-kvantum
+ libsForQt5.qt5ct
+ papirus-icon-theme
+ hyprland-qtutils
+ ]
+ ++ (lib.optionals (!osConfig.functorOS.theming.enable) [
+ bibata-cursors
+ ]);
+
+ wayland.windowManager.sway = {
+ enable = true;
+ systemd.enable = true;
+ wrapperFeatures.gtk = true;
+ extraSessionCommands = ''
+ export XDG_SESSION_TYPE=wayland
+ export XDG_SESSION_DESKTOP=sway
+ export XDG_CURRENT_DESKTOP=sway
+ export MOZ_ENABLE_WAYLAND=1
+ export QT_QPA_PLATFORM=wayland
+ export QT_WAYLAND_DISABLE_WINDOWDECORATION=1
+ export SDL_VIDEODRIVER=wayland
+ export _JAVA_AWT_WM_NONREPARENTING=1
+ ''
+ + (lib.optionalString (!osConfig.functorOS.theming.enable) ''
+ export XCURSOR_THEME=Bibata-Modern-Ice
+ export XCURSOR_SIZE=${if config.functorOS.formFactor == "laptop" then "24" else "26"}
+ '');
+ config = {
+ modifier = "Mod4";
+ terminal = lib.getExe pkgs.kitty;
+ menu = "pkill -x rofi || rofi -show drun";
+
+ fonts = {
+ names = [ config.stylix.fonts.monospace.name ];
+ size = lib.mkDefault 12.0;
+ };
+
+ gaps = {
+ inner = 2;
+ outer = 6;
+ smartBorders = "on";
+ };
+
+ window = {
+ border = 2;
+ titlebar = false;
+ hideEdgeBorders = "smart";
+ commands = [
+ {
+ criteria = {
+ class = "kvantummanager";
+ };
+ command = "floating enable";
+ }
+ {
+ criteria = {
+ class = "qt5ct";
+ };
+ command = "floating enable";
+ }
+ {
+ criteria = {
+ class = "qt6ct";
+ };
+ command = "floating enable";
+ }
+ {
+ criteria = {
+ app_id = "org.pulseaudio.pavucontrol";
+ };
+ command = "floating enable, resize set 50% 50%";
+ }
+ {
+ criteria = {
+ title = "Picture-in-Picture";
+ };
+ command = "floating enable, sticky enable";
+ }
+ {
+ criteria = {
+ app_id = "nm-connection-editor";
+ };
+ command = "floating enable";
+ }
+ {
+ criteria = {
+ class = "nm-connection-editor";
+ };
+ command = "floating enable";
+ }
+ {
+ criteria = {
+ app_id = "blueman-manager";
+ };
+ command = "floating enable";
+ }
+ {
+ criteria = {
+ class = "vlc";
+ };
+ command = "floating enable";
+ }
+ {
+ criteria = {
+ app_id = "org.kde.ark";
+ };
+ command = "floating enable";
+ }
+ {
+ criteria = {
+ class = "eog";
+ };
+ command = "floating enable";
+ }
+ {
+ criteria = {
+ app_id = "app.drey.Warp";
+ };
+ command = "floating enable";
+ }
+ {
+ criteria = {
+ app_id = "net.davidotek.pupgui2";
+ };
+ command = "floating enable";
+ }
+ {
+ criteria = {
+ app_id = "yad";
+ };
+ command = "floating enable";
+ }
+ ];
+ };
+
+ floating = {
+ border = 2;
+ titlebar = false;
+ modifier = "Mod4";
+ };
+
+ colors = lib.mkDefault {
+ focused = {
+ border = "#${colors.base0A}";
+ background = "#${colors.base0A}";
+ text = "#${colors.base00}";
+ indicator = "#${colors.base09}";
+ childBorder = "#${colors.base0A}";
+ };
+ unfocused = {
+ border = "#${colors.base01}";
+ background = "#${colors.base01}";
+ text = "#${colors.base04}";
+ indicator = "#${colors.base02}";
+ childBorder = "#${colors.base01}";
+ };
+ focusedInactive = {
+ border = "#${colors.base02}";
+ background = "#${colors.base02}";
+ text = "#${colors.base05}";
+ indicator = "#${colors.base02}";
+ childBorder = "#${colors.base02}";
+ };
+ urgent = {
+ border = "#${colors.base08}";
+ background = "#${colors.base08}";
+ text = "#${colors.base00}";
+ indicator = "#${colors.base08}";
+ childBorder = "#${colors.base08}";
+ };
+ };
+
+ # waybar manages the bar
+ bars = [ ];
+
+ focus = {
+ followMouse = "yes";
+ mouseWarping = "container";
+ newWindow = "smart";
+ };
+
+ workspaceAutoBackAndForth = true;
+
+ input = {
+ "type:keyboard" = {
+ xkb_layout = "us";
+ };
+ "type:pointer" = {
+ accel_profile = "flat";
+ pointer_accel = if config.functorOS.formFactor == "laptop" then "0.0" else "-0.65";
+ };
+ }
+ // (lib.optionalAttrs (config.functorOS.formFactor == "laptop") {
+ "type:touchpad" = {
+ natural_scroll = "enabled";
+ tap = "disabled";
+ dwt = "enabled";
+ scroll_factor = "0.15";
+ click_method = "clickfinger";
+ };
+ });
+
+ startup = lib.optionals cfg.fcitx5.enable [
+ { command = "fcitx5 -d -r"; }
+ { command = "fcitx5-remote -r"; }
+ ];
+ };
+ extraConfig = "";
+ };
+ };
+}
diff --git a/hm/modules/linux/desktop-environment/sway/utilities.nix b/hm/modules/linux/desktop-environment/sway/utilities.nix
new file mode 100644
index 00000000..cfd4b139
--- /dev/null
+++ b/hm/modules/linux/desktop-environment/sway/utilities.nix
@@ -0,0 +1,225 @@
+{
+ pkgs,
+ lib,
+ config,
+ osConfig,
+ ...
+}:
+let
+ cfg = config.functorOS.desktop.sway;
+in
+{
+ config = lib.mkIf cfg.enable {
+ # --- Wallpaper ---
+ wayland.windowManager.sway.config.output =
+ if osConfig.functorOS.theming.enable then
+ {
+ "*" = {
+ bg = "${config.stylix.image} fill";
+ };
+ }
+ else
+ {
+ "*" = {
+ bg = "#${config.lib.stylix.colors.base00} solid_color";
+ };
+ };
+
+ # --- Blue light filter ---
+ systemd.user.services = lib.mkIf cfg.bluelight.enable {
+ wlsunset = {
+ Unit = {
+ Description = "Blue light filter daemon";
+ PartOf = "sway-session.target";
+ After = "sway-session.target";
+ };
+ Service = {
+ Type = "simple";
+ ExecStart = "${lib.getExe pkgs.wlsunset} -t 4500 -T 6500 -l 0 -L 0";
+ Restart = "on-failure";
+ RestartSec = 3;
+ };
+ Install = {
+ WantedBy = [ "sway-session.target" ];
+ };
+ };
+ };
+
+ # --- Screen locker ---
+ programs.hyprlock = lib.mkIf cfg.screenlocker.enable {
+ enable = true;
+ settings = {
+ general = {
+ hide_cursor = true;
+ grace = 0;
+ };
+ background = {
+ monitor = "";
+ path = "screenshot";
+ blur_passes = 3;
+ blur_size = 7;
+ noise = 0.0117;
+ contrast = 0.8916;
+ brightness = 0.8172;
+ vibrancy = 0.1696;
+ vibrancy_darkness = 0.0;
+ };
+ input-field = {
+ monitor = "";
+ size = "200, 50";
+ outline_thickness = 3;
+ dots_size = 0.33;
+ dots_spacing = 0.15;
+ dots_center = false;
+ dots_rounding = -1;
+ outer_color = "rgb(151515)";
+ inner_color = "rgb(200, 200, 200)";
+ font_color = "rgb(10, 10, 10)";
+ fade_on_empty = true;
+ fade_timeout = 1000;
+ placeholder_text = "Input Password...";
+ hide_input = false;
+ rounding = -1;
+ check_color = "rgb(204, 136, 34)";
+ fail_color = "rgb(204, 34, 34)";
+ fail_text = "$FAIL ($ATTEMPTS)";
+ fail_timeout = 2000;
+ fail_transition = 300;
+ capslock_color = -1;
+ numlock_color = -1;
+ bothlock_color = -1;
+ invert_numlock = false;
+ swap_font_color = false;
+ position = "0, -20";
+ halign = "center";
+ valign = "center";
+ };
+ };
+ };
+
+ # --- Idle daemon ---
+ services.swayidle = lib.mkIf cfg.idleDaemon.enable {
+ enable = true;
+ events = [
+ {
+ event = "before-sleep";
+ command = "loginctl lock-session";
+ }
+ {
+ event = "lock";
+ command = "${lib.getExe pkgs.hyprlock}";
+ }
+ ];
+ timeouts = [
+ {
+ timeout = 1500;
+ command = "loginctl lock-session";
+ }
+ {
+ timeout = 330;
+ command = "swaymsg 'output * dpms off'";
+ resumeCommand = "swaymsg 'output * dpms on'";
+ }
+ {
+ timeout = 1800;
+ command = "systemctl suspend";
+ }
+ ];
+ };
+
+ # --- OSD (volume/brightness visual feedback) ---
+ services.swayosd.enable = true;
+
+ # --- App launcher ---
+ programs.rofi = {
+ enable = true;
+ terminal = "${lib.getExe pkgs.kitty}";
+ extraConfig = {
+ prompt = ">";
+ };
+ theme =
+ let
+ inherit (config.lib.formats.rasi) mkLiteral;
+ mkRgba =
+ opacity: color:
+ let
+ c = config.lib.stylix.colors;
+ r = c."${color}-rgb-r";
+ g = c."${color}-rgb-g";
+ b = c."${color}-rgb-b";
+ in
+ mkLiteral "rgba ( ${r}, ${g}, ${b}, ${opacity} % )";
+ mkRgb = mkRgba "100";
+ rofiOpacity = builtins.toString (builtins.ceil (config.stylix.opacity.popups * 100));
+ in
+ {
+ "*" = {
+ font = "${config.stylix.fonts.monospace.name} ${toString config.stylix.fonts.sizes.popups}";
+ text-color = mkRgb "base05";
+ background-color = mkLiteral "transparent";
+ };
+ "window" = {
+ height = mkLiteral "20em";
+ width = mkLiteral "30em";
+ border-radius = mkLiteral "0px";
+ border = mkLiteral "1px";
+ border-color = mkRgb "base05";
+ background-color = mkRgba rofiOpacity "base00";
+ padding = mkLiteral "0";
+ };
+ "mainbox" = {
+ background-color = mkLiteral "transparent";
+ spacing = mkLiteral "0";
+ padding = mkLiteral "0";
+ };
+ "inputbar" = {
+ padding = mkLiteral "0.6em 1em";
+ background-color = mkRgba rofiOpacity "base00";
+ border = mkLiteral "0px 0px 1px 0px";
+ border-color = mkRgb "base05";
+ spacing = mkLiteral "0.5em";
+ };
+ "prompt" = {
+ enabled = true;
+ text-color = mkRgb "base0B";
+ padding = mkLiteral "0";
+ };
+ "entry" = {
+ placeholder = "search...";
+ placeholder-color = mkRgba "40" "base05";
+ padding = mkLiteral "0";
+ text-color = mkRgb "base05";
+ background-color = mkLiteral "transparent";
+ border-radius = mkLiteral "0px";
+ };
+ "listview" = {
+ padding = mkLiteral "0.5em 0";
+ background-color = mkLiteral "transparent";
+ };
+ "element" = {
+ padding = mkLiteral "0.35em 1em";
+ border-radius = mkLiteral "0px";
+ background-color = mkLiteral "transparent";
+ spacing = mkLiteral "0.5em";
+ };
+ "element-icon" = {
+ size = mkLiteral "3ch";
+ background-color = mkLiteral "transparent";
+ };
+ "element-text" = {
+ padding = mkLiteral "0";
+ background-color = mkLiteral "transparent";
+ text-color = mkRgb "base05";
+ };
+ "element-text selected" = {
+ background-color = mkRgba "25" "base0B";
+ text-color = mkRgb "base0B";
+ border-radius = mkLiteral "0px";
+ };
+ };
+ };
+
+ # --- Logout menu ---
+ programs.wlogout.enable = true;
+ };
+}
diff --git a/hm/modules/linux/desktop-environment/swaync.nix b/hm/modules/linux/desktop-environment/swaync.nix
new file mode 100644
index 00000000..cdc32a7c
--- /dev/null
+++ b/hm/modules/linux/desktop-environment/swaync.nix
@@ -0,0 +1,325 @@
+{ config, lib, ... }:
+let
+ cfg = config.functorOS.desktop.swaync;
+in
+{
+ options.functorOS.desktop.swaync = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = config.functorOS.desktop.enable;
+ description = ''
+ Whether to enable the swaync notification center and daemon.
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ services.swaync.enable = true;
+ services.swaync.settings = {
+ positionX = "right";
+ positionY = "top";
+ control-center-margin-top = 10;
+ control-center-margin-bottom = 10;
+ control-center-margin-right = 10;
+ control-center-margin-left = 10;
+ notification-icon-size = 64;
+ notification-body-image-height = 100;
+ notification-body-image-width = 200;
+ timeout = 10;
+ timeout-low = 5;
+ timeout-critical = 0;
+ fit-to-screen = false;
+ control-center-width = 500;
+ control-center-height = 800;
+ notification-window-width = 500;
+ keyboard-shortcuts = true;
+ image-visibility = "when-available";
+ transition-time = 200;
+ hide-on-clear = false;
+ hide-on-action = true;
+ script-fail-notify = true;
+ widgets = [
+ "title"
+ "mpris"
+ "volume"
+ "backlight"
+ "dnd"
+ "notifications"
+ ];
+ widget-config = {
+ title = {
+ text = "Mission Control";
+ clear-all-button = "true";
+ button-text = " All Systems Go";
+ };
+ dnd = {
+ text = "Do Not Disturb";
+ };
+ label = {
+ max-lines = 1;
+ text = "Mission Control";
+ };
+ mpris = {
+ image-size = 96;
+ image-radius = 7;
+ };
+ volume = {
+ label = "";
+ };
+ backlight = {
+ label = "";
+ };
+ };
+ };
+
+ home.file.".config/swaync/style.css".text = ''
+ * {
+ font-family: ${config.stylix.fonts.monospace.name};
+ }
+ .control-center .notification-row:focus,
+ .control-center .notification-row:hover {
+ background: #${config.lib.stylix.colors.base00}
+ }
+ .notification-row {
+ outline: none;
+ margin: 10px;
+ padding: 0;
+ }
+ .notification {
+ background: transparent;
+ padding: 0;
+ margin: 0px;
+ opacity: 0.75;
+ }
+ .notification-content {
+ background: #${config.lib.stylix.colors.base00};
+ padding: 10px;
+ border-radius: 5px;
+ border: 2px solid #${config.lib.stylix.colors.base05};
+ margin: 0;
+ }
+ .notification-default-action {
+ margin: 0;
+ padding: 0;
+ border-radius: 5px;
+ }
+ .close-button {
+ background: #${config.lib.stylix.colors.base08};
+ color: #${config.lib.stylix.colors.base00};
+ text-shadow: none;
+ padding: 0;
+ border-radius: 5px;
+ margin-top: 5px;
+ margin-right: 5px;
+ }
+ .close-button:hover {
+ box-shadow: none;
+ background: #${config.lib.stylix.colors.base0D};
+ transition: all .15s ease-in-out;
+ border: none
+ }
+ .notification-action {
+ border: 2px solid #${config.lib.stylix.colors.base0D};
+ border-top: none;
+ border-radius: 5px;
+ }
+ .notification-default-action:hover,
+ .notification-action:hover {
+ color: #${config.lib.stylix.colors.base0B};
+ background: #${config.lib.stylix.colors.base0B}
+ }
+ .notification-default-action {
+ border-radius: 5px;
+ margin: 0px;
+ }
+ .notification-default-action:not(:only-child) {
+ border-bottom-left-radius: 7px;
+ border-bottom-right-radius: 7px
+ }
+ .notification-action:first-child {
+ border-bottom-left-radius: 10px;
+ background: #${config.lib.stylix.colors.base00}
+ }
+ .notification-action:last-child {
+ border-bottom-right-radius: 10px;
+ background: #${config.lib.stylix.colors.base00}
+ }
+ .inline-reply {
+ margin-top: 8px
+ }
+ .inline-reply-entry {
+ background: #${config.lib.stylix.colors.base00};
+ color: #${config.lib.stylix.colors.base05};
+ caret-color: #${config.lib.stylix.colors.base05};
+ border: 1px solid #${config.lib.stylix.colors.base09};
+ border-radius: 5px
+ }
+ .inline-reply-button {
+ margin-left: 4px;
+ background: #${config.lib.stylix.colors.base00};
+ border: 1px solid #${config.lib.stylix.colors.base09};
+ border-radius: 5px;
+ color: #${config.lib.stylix.colors.base05}
+ }
+ .inline-reply-button:disabled {
+ background: initial;
+ color: #${config.lib.stylix.colors.base03};
+ border: 1px solid transparent
+ }
+ .inline-reply-button:hover {
+ background: #${config.lib.stylix.colors.base00}
+ }
+ .body-image {
+ margin-top: 6px;
+ background-color: #${config.lib.stylix.colors.base05};
+ border-radius: 5px
+ }
+ .summary {
+ font-size: 16px;
+ font-weight: 700;
+ background: transparent;
+ color: rgba(158, 206, 106, 1);
+ text-shadow: none
+ }
+ .time {
+ font-size: 16px;
+ font-weight: 700;
+ background: transparent;
+ color: #${config.lib.stylix.colors.base05};
+ text-shadow: none;
+ margin-right: 18px
+ }
+ .body {
+ font-size: 15px;
+ font-weight: 400;
+ background: transparent;
+ color: #${config.lib.stylix.colors.base05};
+ text-shadow: none
+ }
+ .control-center {
+ background: #${config.lib.stylix.colors.base00};
+ border: 2px solid #${config.lib.stylix.colors.base0C};
+ border-radius: 5px;
+ opacity: 0.85;
+ }
+ .control-center-list {
+ background: transparent
+ }
+ .control-center-list-placeholder {
+ opacity: .5
+ }
+ .floating-notifications {
+ background: transparent
+ }
+ .blank-window {
+ background: alpha(black, 0)
+ }
+ .widget-title {
+ color: #${config.lib.stylix.colors.base0B};
+ background: #${config.lib.stylix.colors.base00};
+ padding: 5px 10px;
+ margin: 10px 10px 5px 10px;
+ font-size: 1.5rem;
+ border-radius: 5px;
+ }
+ .widget-title>button {
+ font-size: 1rem;
+ color: #${config.lib.stylix.colors.base05};
+ text-shadow: none;
+ background: #${config.lib.stylix.colors.base00};
+ box-shadow: none;
+ border-radius: 5px;
+ }
+ .widget-title>button:hover {
+ background: #${config.lib.stylix.colors.base08};
+ color: #${config.lib.stylix.colors.base00};
+ }
+ .widget-dnd {
+ background: #${config.lib.stylix.colors.base00};
+ padding: 5px 10px;
+ margin: 10px 10px 5px 10px;
+ border-radius: 5px;
+ font-size: large;
+ color: #${config.lib.stylix.colors.base0B};
+ }
+ .widget-dnd>switch {
+ border-radius: 5px;
+ /* border: 1px solid #${config.lib.stylix.colors.base0B}; */
+ background: #${config.lib.stylix.colors.base0B};
+ }
+ .widget-dnd>switch:checked {
+ background: #${config.lib.stylix.colors.base08};
+ border: 1px solid #${config.lib.stylix.colors.base08};
+ }
+ .widget-dnd>switch slider {
+ background: #${config.lib.stylix.colors.base00};
+ border-radius: 5px
+ }
+ .widget-dnd>switch:checked slider {
+ background: #${config.lib.stylix.colors.base00};
+ border-radius: 5px
+ }
+ .widget-label {
+ margin: 10px 10px 5px 10px;
+ }
+ .widget-label>label {
+ font-size: 1rem;
+ color: #${config.lib.stylix.colors.base05};
+ }
+ .widget-mpris {
+ color: #${config.lib.stylix.colors.base05};
+ padding: 5px 10px;
+ margin: 10px 10px 5px 10px;
+ border-radius: 5px;
+ }
+ .widget-mpris > box > button {
+ border-radius: 5px;
+ }
+ .widget-mpris-player {
+ padding: 5px 10px;
+ margin: 10px
+ }
+ .widget-mpris-title {
+ font-weight: 700;
+ font-size: 1.25rem
+ }
+ .widget-mpris-subtitle {
+ font-size: 1.1rem
+ }
+ .widget-menubar>box>.menu-button-bar>button {
+ border: none;
+ background: transparent
+ }
+ .topbar-buttons>button {
+ border: none;
+ background: transparent
+ }
+ .widget-volume {
+ background: #${config.lib.stylix.colors.base01};
+ padding: 5px;
+ margin: 10px 10px 5px 10px;
+ border-radius: 5px;
+ font-size: x-large;
+ color: #${config.lib.stylix.colors.base05};
+ }
+ .widget-volume>box>button {
+ background: #${config.lib.stylix.colors.base0B};
+ border: none
+ }
+ .per-app-volume {
+ background-color: #${config.lib.stylix.colors.base00};
+ padding: 4px 8px 8px;
+ margin: 0 8px 8px;
+ border-radius: 5px;
+ }
+ .widget-backlight {
+ background: #${config.lib.stylix.colors.base01};
+ padding: 5px;
+ margin: 10px 10px 5px 10px;
+ border-radius: 5px;
+ font-size: x-large;
+ color: #${config.lib.stylix.colors.base05}
+ }
+ '';
+ };
+}
diff --git a/hm/modules/linux/desktop-environment/waybar/default.nix b/hm/modules/linux/desktop-environment/waybar/default.nix
new file mode 100644
index 00000000..ea5e3a4f
--- /dev/null
+++ b/hm/modules/linux/desktop-environment/waybar/default.nix
@@ -0,0 +1,672 @@
+{
+ pkgs,
+ config,
+ lib,
+ osConfig,
+ ...
+}:
+let
+ cfg = config.functorOS.desktop.waybar;
+ theme = config.lib.stylix;
+ palette = theme.colors;
+ useSway = config.functorOS.desktop.sway.enable;
+ wsModuleName = if useSway then "sway/workspaces" else "hyprland/workspaces";
+in
+{
+ options.functorOS.desktop.waybar = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = config.functorOS.desktop.enable;
+ description = ''
+ Whether to enable Waybar and the functorOS rice.
+ '';
+ };
+ variant = lib.mkOption {
+ type = lib.types.enum [
+ "full"
+ "minimal"
+ "laptop"
+ "compact"
+ ];
+ default = if osConfig.functorOS.formFactor == "laptop" then "laptop" else "full";
+ };
+ };
+ config = lib.mkIf cfg.enable {
+ home.packages = with pkgs; [ playerctl ];
+ programs.waybar = {
+ enable = true;
+ systemd.enable = true;
+ systemd.target =
+ if useSway then
+ "sway-session.target"
+ else if config.functorOS.desktop.hyprland.enable then
+ "hyprland-session.target"
+ else
+ "graphical-session.target";
+ settings.mainBar = {
+ name = "bar0";
+ reload_style_on_change = true;
+ position = "top";
+ layer = "top";
+ height = if cfg.variant == "compact" then 30 else 37;
+ margin-top = if cfg.variant == "compact" then 0 else 8;
+ margin-bottom = 0;
+ margin-left = if cfg.variant == "compact" then 0 else 8;
+ margin-right = if cfg.variant == "compact" then 0 else 8;
+ modules-left =
+ [
+ "custom/launcher"
+ ]
+ ++ (lib.optionals (cfg.variant != "laptop" && cfg.variant != "compact") [
+ "custom/playerctl#backward"
+ "custom/playerctl#play"
+ "custom/playerctl#forward"
+ ])
+ ++ [
+ "idle_inhibitor"
+ ]
+ ++ (lib.optionals (cfg.variant == "laptop" || cfg.variant == "compact") [
+ wsModuleName
+ ])
+ ++ (lib.optionals (cfg.variant == "minimal") [
+ "cava#left"
+ ])
+ ++ [
+ "custom/playerlabel"
+ ];
+ modules-center = lib.mkIf (cfg.variant != "laptop" && cfg.variant != "compact") (
+ (lib.optionals (cfg.variant == "full") [
+ "cava#left"
+ ])
+ ++ [
+ wsModuleName
+ ]
+ ++ (lib.optionals (cfg.variant == "full") [
+ "cava#right"
+ ])
+ );
+ modules-right =
+ [
+ "tray"
+ "battery"
+ ]
+ ++ (lib.optionals useSway [
+ "cpu"
+ "memory"
+ ])
+ ++ [
+ "pulseaudio"
+ "network"
+ "clock"
+ ];
+ idle_inhibitor = {
+ format = "{icon}";
+ format-icons = {
+ activated = " ";
+ deactivated = " ";
+ };
+ };
+ clock = {
+ format = " {:%a, %d %b, %I:%M %p}";
+ tooltip = "true";
+ tooltip-format = "{:%Y %B}\n{calendar}";
+ format-alt = " {:%d/%m}";
+ };
+ "${wsModuleName}" =
+ if useSway then
+ {
+ disable-scroll = false;
+ all-outputs = false;
+ on-scroll-down = "swaymsg workspace next_on_output";
+ on-scroll-up = "swaymsg workspace prev_on_output";
+ format = "{name}";
+ format-icons = {
+ urgent = "!";
+ };
+ }
+ else
+ {
+ disable-scroll = false;
+ on-scroll-down = "${lib.getExe pkgs.hyprnome}";
+ on-scroll-up = "${lib.getExe pkgs.hyprnome} --previous";
+ format = "{icon}";
+ on-click = "activate";
+ format-icons = {
+ active = "";
+ default = "";
+ urgent = "";
+ special = "";
+ };
+ sort-by-number = true;
+ };
+ "cava#left" = {
+ framerate = 60;
+ autosens = 1;
+ bars = 18;
+ lower_cutoff_freq = 50;
+ higher_cutoff_freq = 10000;
+ method = "pipewire";
+ source = "auto";
+ stereo = true;
+ reverse = false;
+ bar_delimiter = 0;
+ monstercat = false;
+ waves = false;
+ input_delay = 2;
+ format-icons = [
+ "▁"
+ "▂"
+ "▃"
+ "▄"
+ "▅"
+ "▆"
+ "▇"
+ "█"
+ ];
+ };
+ "cava#right" = {
+ framerate = 60;
+ autosens = 1;
+ bars = 18;
+ lower_cutoff_freq = 50;
+ higher_cutoff_freq = 10000;
+ method = "pipewire";
+ source = "auto";
+ stereo = true;
+ reverse = false;
+ bar_delimiter = 0;
+ monstercat = false;
+ waves = false;
+ input_delay = 2;
+ format-icons = [
+ "▁"
+ "▂"
+ "▃"
+ "▄"
+ "▅"
+ "▆"
+ "▇"
+ "█"
+ ];
+ };
+ "custom/playerctl#backward" = {
+ format = " ";
+ on-click = "playerctl previous";
+ on-scroll-up = "playerctl volume .05+";
+ on-scroll-down = "playerctl volume .05-";
+ };
+ "custom/playerctl#play" = {
+ format = "{icon}";
+ return-type = "json";
+ exec = "playerctl -a metadata --format '{\"text\": \"{{artist}} - {{markup_escape(title)}}\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F";
+ on-click = "playerctl play-pause";
+ on-scroll-up = "playerctl volume .05+";
+ on-scroll-down = "playerctl volume .05-";
+ format-icons = {
+ Playing = " ";
+ Paused = " ";
+ Stopped = " ";
+ };
+ };
+ "custom/playerctl#forward" = {
+ format = " ";
+ on-click = "playerctl next";
+ on-scroll-up = "playerctl volume .05+";
+ on-scroll-down = "playerctl volume .05-";
+ };
+ "custom/playerlabel" = {
+ format = " {} ";
+ return-type = "json";
+ max-length = 40;
+ exec = "playerctl -a metadata --format '{\"text\": \"{{artist}} - {{markup_escape(title)}}\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F";
+ on-click = "";
+ };
+ battery = {
+ states = {
+ good = 95;
+ warning = 30;
+ critical = 15;
+ };
+ format = "{icon} {capacity}%";
+ format-charging = " {capacity}%";
+ format-plugged = " {capacity}% ";
+ format-alt = "{icon} {time}";
+ format-icons = [
+ ""
+ ""
+ ""
+ ""
+ ""
+ ];
+ };
+
+ memory = {
+ format = " {}%";
+ format-alt = " {used}/{total} GiB";
+ interval = 5;
+ tooltip = true;
+ tooltip-format = "RAM: {used} GiB / {total} GiB";
+ };
+ cpu = {
+ format = " {usage}%";
+ format-alt = " {avg_frequency} GHz";
+ interval = 5;
+ tooltip = true;
+ tooltip-format = "CPU: {usage}% | {avg_frequency} GHz";
+ };
+ network = {
+ format-wifi = " {signalStrength}%";
+ format-ethernet = " 100% ";
+ tooltip-format = "Connected to {essid} {ifname} via {gwaddr}";
+ format-linked = "{ifname} (No IP)";
+ format-disconnected = " 0% ";
+ };
+ tray = {
+ icon-size = 20;
+ spacing = 8;
+ };
+ pulseaudio = {
+ format = "{icon} {volume}%";
+ format-muted = "";
+ format-icons = {
+ default = [
+ ""
+ ""
+ ""
+ ];
+ };
+ scroll-step = 5;
+ on-click = "${lib.getExe pkgs.pavucontrol}";
+ };
+ "custom/launcher" =
+ let
+ toggle-colorscheme = pkgs.writeShellScriptBin "toggle-colorscheme.sh" ''
+ POLARITY_FILE="/etc/polarity"
+
+ if [[ ! -f "$POLARITY_FILE" ]]; then
+ exit 0
+ elif [[ ! -r "$POLARITY_FILE" ]]; then
+ echo "Error: Cannot read $POLARITY_FILE. Check permissions." >&2
+ exit 1
+ fi
+
+ current_scheme=$(cat "$POLARITY_FILE")
+ if [[ $? -ne 0 ]]; then
+ echo "Error: Failed to read content from $POLARITY_FILE." >&2
+ exit 1
+ fi
+
+ current_scheme=$(echo "$current_scheme" | xargs)
+
+ target_service=""
+ case "$current_scheme" in
+ dawn)
+ target_service="colorscheme-dusk.service"
+ ;;
+ dusk)
+ target_service="colorscheme-dawn.service"
+ ;;
+ *)
+ echo "Error: Invalid content '$current_scheme' found in $POLARITY_FILE. Expected 'dawn' or 'dusk'." >&2
+ exit 1
+ ;;
+ esac
+
+ echo "Current scheme: '$current_scheme'. Attempting to start '$target_service'..."
+ systemctl start "$target_service"
+
+ if [[ $? -ne 0 ]]; then
+ echo "Error: Failed to execute 'systemctl start $target_service'. Check systemctl logs or permissions." >&2
+ exit 1
+ else
+ echo "Command 'systemctl start $target_service' executed successfully."
+ fi
+
+ exit 0
+ '';
+ in
+ {
+ format = "";
+ on-click = "pkill -9 rofi || rofi -show drun";
+ on-click-right = "${lib.getExe toggle-colorscheme}";
+ tooltip = "false";
+ };
+ };
+ style =
+ let
+ mkRgba =
+ opacity: color:
+ let
+ c = config.lib.stylix.colors;
+ r = c."${color}-rgb-r";
+ g = c."${color}-rgb-g";
+ b = c."${color}-rgb-b";
+ in
+ "rgba(${r}, ${g}, ${b}, ${opacity})";
+ compact = cfg.variant == "compact";
+ in
+ # ── Shared base styles (hyprland default) ──────────────────────────
+ ''
+ * {
+ border: none;
+ border-radius: 0px;
+ font-family: GeistMono Nerd Font;
+ font-size: ${if compact then "12px" else "13px"};
+ min-height: 0;
+ }
+ window#waybar {
+ background: transparent;
+ opacity: 0.9;
+ ${if compact then "" else "border-radius: 24px;"}
+ }
+
+ #waybar > box {
+ background: ${mkRgba "0.6" "base01"};
+ border-radius: 24px;
+ }
+
+ #cava.left, #cava.right {
+ background: #${palette.base00};
+ margin: 4px;
+ padding: 6px 16px;
+ color: #${palette.base00};
+ }
+ #cava.left {
+ border-radius: 16px;
+ border-color: #${palette.base03};
+ border-style: solid;
+ border-width: 2px;
+ }
+ #cava.right {
+ border-radius: 16px;
+ border-color: #${palette.base03};
+ border-style: solid;
+ border-width: 2px;
+ }
+ #workspaces {
+ background: #${palette.base00};
+ color: #${palette.base00}
+ }
+ #workspaces button {
+ padding: 0px 5px;
+ margin: 0px 3px;
+ border-radius: 16px;
+ color: transparent;
+ background: #${palette.base03};
+ transition: all 0.3s ease-in-out;
+ }
+
+ #workspaces button.active,
+ #workspaces button.focused {
+ background-color: #${palette.base0A};
+ color: #${palette.base03};
+ border-radius: 16px;
+ min-width: 50px;
+ background-size: 400% 400%;
+ transition: all 0.3s ease-in-out;
+ }
+
+ #workspaces button:hover {
+ background-color: #${palette.base05};
+ color: #${palette.base05};
+ border-radius: 16px;
+ min-width: 50px;
+ background-size: 400% 400%;
+ }
+
+ #tray, #pulseaudio, #network, #battery,
+ #custom-playerctl.backward, #custom-playerctl.play, #custom-playerctl.forward{
+ background: #${palette.base00};
+ font-weight: bold;
+ margin: 4px 0px;
+ }
+ #tray, #pulseaudio, #network, #battery{
+ color: #${palette.base05};
+ border-radius: 16px;
+ border-color: #${palette.base03};
+ border-style: solid;
+ border-width: 2px;
+ padding: 0 20px;
+ margin-left: 7px;
+ }
+ #clock {
+ color: #${palette.base05};
+ background: #${palette.base00};
+ ${
+ if compact then "border-radius: 18px 0px 0px 18px;" else "border-radius: 18px 12px 12px 18px;"
+ }
+ ${if compact then "padding: 6px 20px 6px 20px;" else "padding: 8px 25px 8px 25px;"}
+ margin-left: 7px;
+ font-weight: bold;
+ font-size: ${if compact then "13px" else "14px"};
+ }
+ #custom-launcher {
+ color: #${palette.base0A};
+ background: #${palette.base00};
+ ${
+ if compact then "border-radius: 0px 18px 18px 0px;" else "border-radius: 12px 18px 18px 12px;"
+ }
+ margin: 0px;
+ ${if compact then "padding: 0px 30px 0px 20px;" else "padding: 0px 35px 0px 25px;"}
+ font-size: 24px;
+ }
+
+ #custom-playerctl.backward, #custom-playerctl.play, #custom-playerctl.forward {
+ background: #${palette.base00};
+ font-size: 20px;
+ }
+ #custom-playerctl.backward:hover, #custom-playerctl.play:hover, #custom-playerctl.forward:hover{
+ color: #${palette.base00};
+ }
+ #custom-playerctl.backward {
+ color: #${palette.base08};
+ border-radius: 16px 0px 0px 16px;
+ border-color: #${palette.base03} #${palette.base00} #${palette.base03} #${palette.base03};
+ border-style: solid;
+ border-width: 2px 0px 2px 2px;
+ padding-left: 16px;
+ margin-left: 7px;
+ }
+ #custom-playerctl.play {
+ color: #${palette.base0A};
+ padding: 0 5px;
+ border-color: #${palette.base03} #${palette.base00} #${palette.base03} #${palette.base00};
+ border-style: solid;
+ border-width: 2px 0px 2px 0px;
+ }
+ #custom-playerctl.forward {
+ color: #${palette.base08};
+ border-radius: 0px 16px 16px 0px;
+ border-color: #${palette.base03} #${palette.base03} #${palette.base03} #${palette.base00};
+ border-style: solid;
+ border-width: 2px 2px 2px 0px;
+ padding-right: 12px;
+ margin-right: 7px
+ }
+ #custom-playerlabel {
+ background: #${palette.base00};
+ color: #${palette.base05};
+ padding: 0 20px;
+ border-radius: 16px;
+ border-color: #${palette.base03};
+ border-style: solid;
+ border-width: 2px;
+ margin: 4px 0;
+ font-weight: bold;
+ }
+ #idle_inhibitor {
+ background: #${palette.base00};
+ color: #${palette.base05};
+ padding: 0 10px 0 15px;
+ border-radius: 16px;
+ border-color: #${palette.base03};
+ border-style: solid;
+ border-width: 2px;
+ margin: 4px 7px 4px 0;
+ font-weight: bold;
+ }
+ #window{
+ background: #${palette.base00};
+ padding-left: 15px;
+ padding-right: 15px;
+ border-radius: 16px;
+ margin-top: 4px;
+ margin-bottom: 4px;
+ font-weight: normal;
+ font-style: normal;
+ }
+ ''
+ + (lib.optionalString (cfg.variant == "laptop" || cfg.variant == "compact") ''
+ #workspaces {
+ margin: 4px;
+ padding: 6px 16px;
+ border-radius: 16px;
+ border-color: #${palette.base03};
+ border-style: solid;
+ border-width: 2px;
+ }
+ '')
+ + (lib.optionalString (cfg.variant != "laptop" && cfg.variant != "compact") ''
+ #workspaces {
+ margin: 4px 5px;
+ padding: 6px 5px;
+ border-radius: 16px;
+ border-width: 2px;
+ border-color: #${palette.base03};
+ border-style: solid;
+ }
+ '')
+ # ── Sway overrides: squared-off, utilitarian ───────────────────────
+ + (lib.optionalString useSway ''
+ /* Sway: fully squared off — no border-radius anywhere */
+ window#waybar {
+ border-radius: 0px;
+ }
+ #waybar > box {
+ border-radius: 0px;
+ border-bottom: 2px solid #${palette.base03};
+ }
+ #workspaces,
+ #workspaces button,
+ #workspaces button.focused,
+ #workspaces button.active,
+ #workspaces button:hover,
+ #tray, #pulseaudio, #network, #battery,
+ #cpu, #memory,
+ #clock,
+ #custom-launcher,
+ #custom-playerlabel,
+ #idle_inhibitor,
+ #window,
+ #custom-playerctl.backward,
+ #custom-playerctl.play,
+ #custom-playerctl.forward {
+ border-radius: 0px;
+ }
+
+ /* Sway workspace buttons: underline style instead of pill */
+ #workspaces {
+ margin: 0px 4px;
+ padding: 0px 4px;
+ border-radius: 0px;
+ border-color: transparent;
+ border-style: solid;
+ border-width: 0px;
+ }
+ #workspaces button {
+ padding: 0px 8px;
+ margin: 0px 1px;
+ background: transparent;
+ color: #${palette.base04};
+ border-bottom: 2px solid transparent;
+ transition: all 0.15s ease-in-out;
+ }
+ #workspaces button.focused,
+ #workspaces button.active {
+ background: #${palette.base01};
+ color: #${palette.base0A};
+ border-bottom: 2px solid #${palette.base0A};
+ min-width: 40px;
+ }
+ #workspaces button.urgent {
+ background: #${palette.base08};
+ color: #${palette.base00};
+ border-bottom: 2px solid #${palette.base08};
+ }
+ #workspaces button:hover {
+ background: #${palette.base02};
+ color: #${palette.base05};
+ border-bottom: 2px solid #${palette.base05};
+ min-width: 40px;
+ }
+
+ /* Sway clock: squared */
+ #clock {
+ border-radius: 0px;
+ padding: 0px 20px 0px 14px;
+ border-left: 2px solid #${palette.base03};
+ border-right: none;
+ border-top: none;
+ border-bottom: none;
+ }
+
+ /* Sway launcher: squared */
+ #custom-launcher {
+ border-radius: 0px;
+ padding: 0px 24px 0px 18px;
+ border-right: 2px solid #${palette.base03};
+ border-left: none;
+ border-top: none;
+ border-bottom: none;
+ }
+
+ /* Sway stats modules: CPU and memory */
+ #cpu, #memory {
+ background: #${palette.base00};
+ font-weight: bold;
+ margin: 0px;
+ border-style: solid;
+ border-width: 0px 0px 0px 2px;
+ border-color: #${palette.base03};
+ padding: 0 14px;
+ }
+ #cpu {
+ color: #${palette.base08};
+ }
+ #memory {
+ color: #${palette.base0D};
+ }
+
+ /* Sway right-side modules: flat with left separator */
+ #tray, #pulseaudio, #network, #battery {
+ border-radius: 0px;
+ border-style: solid;
+ border-width: 0px 0px 0px 2px;
+ border-color: #${palette.base03};
+ padding: 0 14px;
+ margin: 0px;
+ margin-left: 0px;
+ }
+
+ /* Sway idle inhibitor: squared */
+ #idle_inhibitor {
+ border-radius: 0px;
+ border-style: solid;
+ border-width: 0px 2px 0px 0px;
+ border-color: #${palette.base03};
+ margin: 0px;
+ }
+
+ /* Sway player label: squared */
+ #custom-playerlabel {
+ border-radius: 0px;
+ border-style: solid;
+ border-width: 0px 0px 0px 2px;
+ border-color: #${palette.base03};
+ padding: 0 14px;
+ margin: 0px;
+ }
+ '');
+ };
+ };
+}
diff --git a/hm/modules/linux/photography/default.nix b/hm/modules/linux/photography/default.nix
new file mode 100644
index 00000000..565dfc1a
--- /dev/null
+++ b/hm/modules/linux/photography/default.nix
@@ -0,0 +1,28 @@
+{
+ pkgs,
+ lib,
+ config,
+ ...
+}:
+let
+ cfg = config.functorOS.suites.photography;
+in
+{
+ options.functorOS.suites.photography = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = config.functorOS.desktop.enable;
+ description = ''
+ Whether to enable the photography suite.
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ home.packages = with pkgs; [
+ darktable
+ digikam
+ imagemagick
+ ];
+ };
+}
diff --git a/hm/modules/linux/platform-tweaks/default.nix b/hm/modules/linux/platform-tweaks/default.nix
new file mode 100644
index 00000000..77fc8404
--- /dev/null
+++ b/hm/modules/linux/platform-tweaks/default.nix
@@ -0,0 +1,34 @@
+{
+ lib,
+ config,
+ osConfig,
+ ...
+}:
+let
+ cfg = config.functorOS;
+in
+{
+ options.functorOS = {
+ formFactor = lib.mkOption {
+ type = lib.types.nullOr (
+ lib.types.enum [
+ "laptop"
+ "desktop"
+ ]
+ );
+ default = osConfig.functorOS.formFactor;
+ description = ''
+ Form factor of the machine. Adjusts some UI features. Inherited from system configuration functorOS.formFactor if set, otherwise you must set it here.
+ '';
+ };
+ };
+
+ config = {
+ assertions = [
+ {
+ assertion = cfg.formFactor != null;
+ message = "You must set functorOS.formFactor either in the home-manager configuration for the user or in the OS configuration for the system!";
+ }
+ ];
+ };
+}
diff --git a/hm/modules/linux/programs/bulk-programs.nix b/hm/modules/linux/programs/bulk-programs.nix
new file mode 100644
index 00000000..c86eb03f
--- /dev/null
+++ b/hm/modules/linux/programs/bulk-programs.nix
@@ -0,0 +1,158 @@
+{
+ config,
+ osConfig,
+ pkgs,
+ lib,
+ ...
+}:
+let
+ cfg = config.functorOS.programs.bulk;
+ mkEnableOption' =
+ desc:
+ lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable;
+ description = ''
+ Whether to enable ${desc}.
+ '';
+ };
+in
+{
+ options.functorOS.programs.bulk = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = config.functorOS.programs.enable;
+ description = ''
+ Whether to enable installation of various useful programs in the system.
+ '';
+ };
+ archiveTools.enable = mkEnableOption' "archive tools";
+ instantMessaging.enable = mkEnableOption' "instant messengers";
+ nixCliTools.enable = mkEnableOption' "Nix CLI helper tools and utilities";
+ desktopApps.enable = mkEnableOption' "desktop applications like mail and file explorer";
+ misc.enable = mkEnableOption' "assorted uncategorized utilities";
+ };
+
+ config = lib.mkIf cfg.enable {
+ services.arrpc.enable = cfg.instantMessaging.enable;
+ programs.vesktop = lib.mkIf cfg.instantMessaging.enable {
+ enable = true;
+ settings = {
+ arRPC = false;
+ checkUpdates = false;
+ customTitlebar = false;
+ disableMinSize = true;
+ minimizeToTray = true;
+ tray = true;
+ splashTheming = true;
+ splashBackground = "#${config.lib.stylix.colors.base01}";
+ splashColor = "#${config.lib.stylix.colors.base05}";
+ hardwareAcceleration = true;
+ discordBranch = "stable";
+ };
+ vencord.settings = {
+ autoUpdate = false;
+ autoUpdateNotification = false;
+ notifyAboutUpdates = false;
+ useQuickCss = true;
+ disableMinSize = true;
+ useSystem = true;
+ plugins = {
+ FakeNitro.enabled = true;
+ YoutubeAdblock.enabled = true;
+ WhoReacted.enabled = true;
+ LastFMRichPresence = {
+ enabled = true;
+ hideWithActivity = false;
+ hideWithSpotify = true;
+ shareUsername = false;
+ shareSong = true;
+ statusName = "some music";
+ nameFormat = "artist";
+ useListeningStatus = true;
+ missingArt = "lastfmLogo";
+ showLastFmLogo = true;
+ username = "couscousdude";
+ apiKey = "8cf7c619e321677733819dbcc0411c10";
+ };
+ SpotifyCrack.enabled = true;
+ VolumeBooster.enabled = true;
+ "WebRichPresence (arRPC)".enabled = true;
+ PlatformIndicators.enabled = true;
+ };
+ };
+ };
+
+ programs.element-desktop.enable = lib.mkIf cfg.instantMessaging.enable true;
+
+ nixpkgs.overlays = [
+ (self: super: {
+ gnome = super.gnome.overrideScope' (
+ gself: gsuper: {
+ nautilus = gsuper.nautilus.overrideAttrs (nsuper: {
+ buildInputs =
+ nsuper.buildInputs
+ ++ (with super.gst_all_1; [
+ gst-plugins-good
+ gst-plugins-bad
+ ]);
+ });
+ }
+ );
+ })
+ ];
+
+ home.packages =
+ lib.optionals cfg.archiveTools.enable (
+ with pkgs;
+ [
+ zip
+ xz
+ unzip
+ p7zip
+ ]
+ )
+ ++ lib.optionals cfg.nixCliTools.enable (
+ with pkgs;
+ [
+ nurl
+ nix-output-monitor
+ ]
+ )
+ ++ lib.optionals cfg.misc.enable (
+ with pkgs;
+ [
+ ffmpeg
+
+ pciutils # lspci
+ usbutils # lsusb
+
+ ani-cli
+ manga-tui
+
+ hledger
+ ]
+ )
+ ++ lib.optionals cfg.instantMessaging.enable (
+ with pkgs;
+ [
+ signal-desktop
+ ]
+ ++ lib.optionals cfg.desktopApps.enable (
+ with pkgs;
+ [
+ thunderbird
+ nautilus
+ nicotine-plus # soulseek client
+ gapless # music player
+ loupe # image viewer
+ bitwarden-desktop # password manager
+ ]
+ ++ lib.optionals pkgs.stdenv.targetPlatform.isx86_64 [
+ sbctl
+ ]
+ ++ lib.optionals pkgs.stdenv.targetPlatform.isAarch64 [ ]
+ )
+ );
+ };
+}
diff --git a/hm/modules/linux/programs/default.nix b/hm/modules/linux/programs/default.nix
new file mode 100644
index 00000000..a09e5d79
--- /dev/null
+++ b/hm/modules/linux/programs/default.nix
@@ -0,0 +1,101 @@
+{
+ pkgs,
+ config,
+ lib,
+ ...
+}:
+let
+ cfg = config.functorOS.programs;
+in
+{
+ imports = [
+ ./bulk-programs.nix
+ ];
+
+ options.functorOS.programs = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = true;
+ description = ''
+ Whether to set up many default desktop programs.
+ '';
+ };
+ defaultBrowser = lib.mkOption {
+ type = lib.types.package;
+ default = pkgs.zen-browser;
+ description = ''
+ Default browser for the system.
+ '';
+ };
+ browserDesktopFile = lib.mkOption {
+ type = lib.types.str;
+ default = "zen.desktop";
+ description = ''
+ Name of desktop file of browser.
+ '';
+ };
+ terminal.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable;
+ description = ''
+ Whether to set up kitty terminal.
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ programs.kitty = lib.mkIf cfg.terminal.enable {
+ enable = true;
+ font.name = "CaskaydiaCove Nerd Font";
+ shellIntegration.enableFishIntegration = true;
+ shellIntegration.enableBashIntegration = true;
+ settings = {
+ font_size = 11;
+ window_padding_width = "8 8";
+ confirm_os_window_close = -1;
+ enable_audio_bell = "no";
+ background_opacity = pkgs.lib.mkForce "0.8";
+ allow_remote_control = "yes";
+ listen_on = "unix:/tmp/kitty";
+ scrollback_pager = ''nvim --noplugin -c "set signcolumn=no showtabline=0" -c "silent write! /tmp/kitty_scrollback_buffer | te cat /tmp/kitty_scrollback_buffer - "'';
+ cursor = pkgs.lib.mkForce "#c0caf5";
+ cursor_text_color = lib.mkForce "#1a1b26";
+ cursor_trail = 3;
+ };
+ keybindings = {
+ "kitty_mod+h" = "show_scrollback";
+ };
+ };
+
+ programs.spotify-player.enable = true;
+
+ programs.neovide = {
+ enable = false;
+ settings = {
+ font = {
+ normal = [ "CaskaydiaCove Nerd Font" ];
+ size = if config.functorOS.formFactor == "laptop" then 11 else 13;
+ };
+ };
+ };
+
+ xdg.mimeApps = {
+ enable = true;
+ defaultApplications =
+ let
+ desktopFile = cfg.browserDesktopFile;
+ in
+ {
+ "text/html" = [ desktopFile ];
+ "x-scheme-handler/http" = [ desktopFile ];
+ "x-scheme-handler/https" = [ desktopFile ];
+ "x-scheme-handler/about" = [ desktopFile ];
+ "x-scheme-handler/unknown" = [ desktopFile ];
+ };
+ };
+
+ home.packages = [ cfg.defaultBrowser ];
+
+ home.sessionVariables.DEFAULT_BROWSER = lib.getExe cfg.defaultBrowser;
+ };
+}
diff --git a/hm/modules/linux/spicetify/default.nix b/hm/modules/linux/spicetify/default.nix
new file mode 100644
index 00000000..491e4ce3
--- /dev/null
+++ b/hm/modules/linux/spicetify/default.nix
@@ -0,0 +1,37 @@
+{
+ spicepkgs,
+ config,
+ osConfig,
+ lib,
+ pkgs,
+ ...
+}:
+{
+ config =
+ lib.mkIf
+ (
+ config.functorOS.programs.enable
+ && osConfig.functorOS.config.allowUnfree
+ && pkgs.stdenv.hostPlatform.isLinux
+ && pkgs.stdenv.hostPlatform.isx86_64
+ )
+ {
+ programs.spicetify = {
+ enable = true;
+ # theme = spicepkgs.themes.dribbblish;
+ # colorScheme = "rosepine";
+ enabledExtensions = with spicepkgs.extensions; [
+ lastfm
+ fullAppDisplayMod
+ adblock
+ shuffle
+ fullAlbumDate
+ featureShuffle
+ showQueueDuration
+ ];
+ enabledCustomApps = with spicepkgs.apps; [
+ lyricsPlus
+ ];
+ };
+ };
+}
diff --git a/hm/modules/linux/theming/default.nix b/hm/modules/linux/theming/default.nix
new file mode 100644
index 00000000..744cd7e1
--- /dev/null
+++ b/hm/modules/linux/theming/default.nix
@@ -0,0 +1,10 @@
+{ pkgs, ... }:
+{
+ imports = [ ./stylix.nix ];
+ gtk = {
+ enable = true;
+ iconTheme = {
+ name = "Papirus-Dark";
+ };
+ };
+}
diff --git a/hm/modules/linux/theming/stylix.nix b/hm/modules/linux/theming/stylix.nix
new file mode 100644
index 00000000..5d3d2bac
--- /dev/null
+++ b/hm/modules/linux/theming/stylix.nix
@@ -0,0 +1,18 @@
+{ osConfig, lib, ... }:
+{
+ config = lib.mkIf osConfig.functorOS.theming.enable {
+ stylix.targets = {
+ waybar.enable = false;
+ kitty.variant256Colors = true;
+ neovim.enable = false;
+ kde.enable = true;
+ gnome.enable = true;
+ swaync.enable = false;
+ hyprlock.enable = false;
+ hyprland.enable = false;
+ starship.enable = false;
+ rofi.enable = false;
+ mako.enable = false;
+ };
+ };
+}
diff --git a/hm/modules/linux/tidal-hifi/default.nix b/hm/modules/linux/tidal-hifi/default.nix
new file mode 100644
index 00000000..e44348a1
--- /dev/null
+++ b/hm/modules/linux/tidal-hifi/default.nix
@@ -0,0 +1,723 @@
+{
+ config,
+ osConfig,
+ lib,
+ pkgs,
+ ...
+}:
+let
+ cfg = config.programs.tidal-hifi;
+in
+# TODO: add check for unfree: ++ lib.optionals osConfig.functorOS.config.allowUnfree [ tidal-hifi ]
+{
+ options.programs.tidal-hifi = {
+ enable = lib.mkEnableOption "tidal Hi-Fi client";
+ theme = lib.mkOption {
+ type = lib.types.nullOr lib.types.str;
+ default = null;
+ description = ''
+ Custom CSS to use as theme for Tidal HiFi.
+ '';
+ };
+ };
+ config = lib.mkIf pkgs.stdenv.targetPlatform.isx86_64 {
+ home.packages = lib.mkIf cfg.enable [ pkgs.tidal-hifi ];
+ xdg.configFile = lib.mkIf (cfg.theme != null) {
+ "tidal-hifi/themes/stylix.css".text = cfg.theme;
+ };
+
+ programs.tidal-hifi =
+ lib.mkIf (config.functorOS.programs.enable && osConfig.functorOS.config.allowUnfree)
+ {
+ enable = lib.mkDefault true;
+ theme =
+ with config.lib.stylix.colors.withHashtag;
+ lib.mkDefault ''
+ /*
+ {
+ "name": "Tidal Light",
+ "author": "Interstellar_1",
+ "description": "A light theme for Tidal. v0.3.5b"
+ "license": "MIT License"
+ }
+ */
+ :root {
+ /*background color*/
+ --wave-color-solid-base-fill: ${base00} !important;
+ --wave-color-solid-accent-darkest: ${base01} !important;
+ --wave-color-solid-base-brighter: ${base01} !important;
+ --wave-color-solid-base-bright: ${base01} !important;
+ --wave-color-opacity-base-bright-thick: ${base05} !important;
+
+ /*hover*/
+ --wave-color-solid-base-brightest: ${base03} !important;
+ --wave-color-opacity-base-brightest-regular: ${base01} !important;
+ --wave-color-opacity-contrast-fill-regular: ${base04} !important;
+ --wave-color-solid-contrast-dark: ${base03} !important;
+ --transparent-play-hover: #e1e1e166 !important;
+
+ /*border*/
+ --wave-color-opacity-contrast-fill-ultra-thin: ${base02} !important;
+
+ /*button color*/
+ --wave-color-opacity-contrast-fill-thin: ${base03} !important;
+ --wave-color-solid-accent-darker: ${base0C} !important;
+ --wave-color-solid-rainbow-red-darkest: ${base08} !important;
+ --wave-color-solid-rainbow-red-darker: ${base08} !important;
+ --button-light: ${base03} !important;
+ --button-medium: ${base04} !important;
+
+ /*accents*/
+ --wave-color-solid-accent-fill: ${base0E} !important;
+ --text-accent: ${base0E} !important;
+ [data-w="textUrl"] {
+ color: var(--text-accent) !important;
+ }
+ --switch-accent: ${base0E} !important;
+ --wave-color-solid-rainbow-yellow-fill: ${base0A} !important;
+
+ /*primary text*/
+ [data-wave-color="textDefault"] {
+ color: ${base05} !important;
+ }
+ [data-wave-color="textWhite"] {
+ color: ${base05} !important;
+ }
+ /*secondary text*/
+ --wave-color-text-secondary: ${base06} !important;
+ [data-wave-color="textSecondary"] {
+ color: ${base05}000b3 !important;
+ }
+ --wave-color-solid-contrast-darker: ${base06} !important;
+ --wave-color-opacity-contrast-fill-ultra-thick: ${base06} !important;
+ /*icons*/
+ --wave-color-solid-contrast-fill: ${base05} !important;
+ --wave-color-opacity-contrast-fill-thick: ${base05}0009a !important;
+
+ /*search*/
+ --wave-color-opacity-base-brighter-ultra-thick: ${base04} !important;
+ --search-background: ${base01}e0 !important;
+
+ /*user profile image*/
+ --user-profile-linear-gradient: linear-gradient(
+ 160deg,
+ ${base0B} 1.22%,
+ ${base0D} 40.51%,
+ ${base04} 79.07%
+ ) !important;
+ }
+
+ body {
+ background-color: ${base00} !important;
+ }
+ /*GENERAL*/
+ /*hide right shadow*/
+ #playQueueSidebar {
+ box-shadow: none !important;
+ }
+
+ /*buttons*/
+ ._activeTab_f47dafa {
+ background: ${base03};
+ }
+
+ /*HOMEPAGE*/
+ /*artists*/
+ .isLoggedIn--CEJH_::after {
+ background: none;
+ }
+
+ /*hide album + playlist + mix bg*/
+ ._dataContainer_66f4f40::before,
+ ._dataContainer_5bb6028::before,
+ ._dataContainer_7feb4a2::before {
+ background-image: none;
+ }
+
+ /*artist name*/
+ .css-5pl3ge {
+ color: ${base05}000ab;
+ }
+
+ /*icons*/
+ .icon--rmikT,
+ .icon--VV33E {
+ color: ${base05};
+ }
+ ._icon_77f3f89 {
+ fill: ${base05} !important;
+ }
+
+ /*SIDEBAR*/
+ ._active_3451dba:is(a._sidebarItem_730d27e, button._sidebarItem_730d27e) span {
+ color: var(--wave-color-solid-accent-fill) !important;
+ }
+
+ /*player shadow*/
+ .player--gAOQG.notFullscreen--xbpBL {
+ box-shadow: 0 -6px 24px ${base04}26;
+ }
+
+ /*ACCENT TEXT*/
+ /*yellow*/
+ ._wave-badge-color-max_1oxl7_22 {
+ color: ${base0A};
+ background-color: ${base0A}38;
+ }
+
+ /*blue*/
+ ._wave-badge-color-high_1oxl7_17 {
+ color: var(--text-accent);
+ }
+
+ .wave-text-title-bold {
+ color: ${base00} !important;
+ }
+
+ /*none*/
+ ._wave-badge-color-default_1oxl7_7 {
+ background-color: ${base03};
+ color: ${base05};
+ }
+
+ svg._accentedIcon_d6d54e4 {
+ color: var(--wave-color-solid-accent-fill);
+ fill: var(--wave-color-solid-accent-fill) !important;
+ }
+
+ .smallHeader--rfQsR {
+ --img: url(https://blocks.astratic.com/img/general-img-landscape.png) !important;
+ }
+
+ /*shortcuts*/
+ ._shortcutItem_6c8e7b4 {
+ box-shadow: none !important;
+ background-color: var(--wave-color-solid-base-brighter) !important;
+ }
+
+ ._shortcutItem_6c8e7b4::after {
+ background: linear-gradient(${base05}0, ${base00}9);
+ }
+
+ /*search*/
+ .container--cl4MJ,
+ div.searchField--fgDKc,
+ div.searchField--fgDKc:focus,
+ ._container_f1be359 {
+ background-color: var(--search-background) !important;
+ border-color: var(--wave-color-opacity-contrast-fill-ultra-thin) !important;
+ }
+
+ .container--sRPa5 {
+ border-color: var(--wave-color-opacity-contrast-fill-ultra-thin) !important;
+ }
+
+ .icon--nNXej,
+ ._icon_49dd0aa {
+ background: linear-gradient(180deg, ${base00}, ${base03}) !important;
+ }
+
+ a.searchPill--ED7eQ.active--e_BIx {
+ background: var(--wave-color-opacity-contrast-fill-thin) !important;
+ }
+
+ .css-10jmp6g {
+ color: var(--wave-color-text-secondary) !important;
+ }
+
+ ._imageContainer_dfdf7bd::after,
+ ._imageContainer_23303c1::after {
+ background: var(--transparent-play-hover) !important;
+ }
+
+ /*updates*/
+ .css-5pl3ge {
+ color: ${base05}000ab !important;
+ }
+
+ /*explict badge*/
+ ._explicitBadge_b93510b {
+ filter: invert(40%) brightness(110%) contrast(140%);
+ }
+
+ #explicit-badge {
+ color: ${base05} !important;
+ }
+
+ /*video badge*/
+ .videoBadge--Tpdav {
+ fill: var(--wave-color-text-secondary);
+ filter: brightness(0.3) invert(0);
+ }
+
+ /*canvas nav buttons*/
+ .viewAllButton--Nb87U,
+ .css-7l8ggf {
+ background: ${base03};
+ }
+
+ .viewAllButton--Nb87U:hover,
+ .css-7l8ggf:hover {
+ background: ${base04};
+ }
+
+ /*album hover*/
+ .overlay--ces1Z,
+ .overlay--Dn4ax,
+ .overlay--Cb6su,
+ .css-17bbmu3,
+ .css-ohr3gy,
+ ._overlay_3c15650,
+ ._overlay_aa1ee83,
+ ._overlay_62e2cfd,
+ ._overlay_e0e48ef,
+ ._overlay_7fd73e6,
+ ._overlay_f627136,
+ .css-1ug9uri,
+ .css-u7yq00 {
+ background: linear-gradient(${base05}0, ${base00}9e) !important;
+ }
+
+ :is(._dataContainer_66f4f40 ._coverArtContainer_2eafdf9)
+ ._creditsOverlay_b234d8c {
+ background: ${base00}80;
+ }
+
+ /*artist hover*/
+ .css-179fhoi,
+ .css-fvlky0 {
+ background: linear-gradient(${base05}0, ${base00}9e) !important;
+ }
+
+ /*play button hover*/
+ .css-75d7zy {
+ background-color: ${base00}a6;
+ transition: 100ms;
+ }
+
+ .css-75d7zy:hover {
+ background-color: var(--wave-color-solid-base-brighter);
+ }
+
+ button.button--W_J5g.gray--tvcIF.contextMenuButton--Bcnyd:hover {
+ background-size: 200%;
+ }
+
+ /*playlist hover*/
+ .css-1voubjj:hover {
+ background-color: var(--wave-color-solid-base-brighter);
+ border: 5px var(--wave-color-opacity-contrast-fill-ultra-thin);
+ }
+
+ /*queue popup*/
+ .bottomGradient--BngZe,
+ ._bottomGradient_104d99b {
+ background-image: none;
+ }
+
+ #playQueueSidebar {
+ box-shadow: 0 20px 25px 5px ${base00}57;
+ }
+
+ /*audio quality popup*/
+ ._containerMax_611862e {
+ background-color: transparent;
+ }
+
+ /*PLAYER PANE*/
+ .range--JNSfg {
+ background-color: ${base04};
+ }
+
+ :is(._player_1d16b04 button).withBackground[aria-checked="true"] {
+ background-color: ${base02};
+ }
+
+ ._range_ce0e571 {
+ background-color: var(--wave-color-opacity-contrast-fill-regular);
+ }
+
+ /*album hover*/
+ ._notFullscreenOverlay_1442d60 {
+ background: linear-gradient(0deg, ${base00}a6, ${base00}a6);
+ }
+
+ /*FULL VIEW*/
+ .activeTab--bqTiv {
+ background: ${base02};
+ }
+
+ .container--cl4MJ {
+ background: ${base00}63 !important;
+ }
+
+ .css-u7yq00 {
+ background: ${base00}75;
+ }
+
+ ._bottomGradient_5c344de {
+ background: none;
+ }
+
+ ._button_84b8ffe {
+ background-color: var(--wave-color-solid-base-brighter);
+ }
+
+ ._button_84b8ffe:hover {
+ background-color: var(--wave-color-solid-base-brightest);
+ }
+
+ ._baseButton_15fc215:focus {
+ background: ${base03};
+ }
+
+ #nowPlaying {
+ background-image: none !important;
+ }
+
+ /*thumbnail*/
+ ._albumImageOverlay_2eabc2b {
+ background: ${base00}4f;
+ }
+
+ /*ALBUM*/
+ .albumImage--i2CqD {
+ box-shadow:
+ 0 20px 50px 5px ${base04}38,
+ 0 20px 40px 0 ${base05}00024;
+ }
+
+ ._button_f1c7fcb {
+ background: var(--wave-color-solid-base-brighter);
+ }
+
+ .artist-link {
+ color: ${base05};
+ }
+
+ /*remove bg image*/
+ [class^="_dataContainer_"]:before {
+ --img: none !important;
+ background-image: none !important;
+ }
+
+ /*playlist*/
+ .refreshButton--bRrPi {
+ color: ${base05};
+ }
+
+ /*tracks page*/
+ .variantPrimary--pjymy,
+ ._button_3357ce6 {
+ background-color: var(--button-light);
+ }
+
+ .wave-text-body-demi {
+ color: ${base05};
+ }
+
+ /*track hover*/
+ ._rowContainer_ebb4cfc:hover {
+ background: var(--wave-color-solid-base-brightest) !important;
+ }
+
+ /*DIALOUGES*/
+ .ReactModal__Content {
+ background: ${base01} !important;
+ }
+
+ .label--fycqD.unchecked--goEjz {
+ background-color: ${base04};
+ }
+
+ .label--fycqD.checked--RVmZV {
+ background-color: var(--switch-accent);
+ }
+
+ .primary--NLSX4 {
+ background-color: ${base03};
+ }
+
+ .primary--NLSX4:hover {
+ background-color: var(--wave-color-opacity-contrast-fill-regular) !important;
+ }
+
+ .primary--NLSX4:disabled {
+ background-color: ${base02};
+ }
+
+ .primary--NLSX4:disabled:hover {
+ background-color: ${base02};
+ }
+
+ /*popups*/
+ .notification--hckxF,
+ .native-range {
+ box-shadow: 0 20px 50px 5px ${base00}2e;
+ }
+
+ ._notification_99c9c6e {
+ box-shadow: 0 16px 32px ${base05}0;
+ }
+
+ ._notification_99c9c6e._error_0b778e5 {
+ background: var(--wave-color-solid-rainbow-red-darker);
+ }
+
+ .errorIcon--VvndK {
+ fill: ${base05} !important;
+ }
+
+ /*PROFILE*/
+ .followingTag--CKRME,
+ .wave-text-footnote-medium {
+ color: var(--text-accent) !important;
+ }
+
+ ._wave-btn-rank-primary_1lao2_58:hover {
+ background-color: ${base0E};
+ }
+
+ ._button_94c5125 {
+ background-color: transparent !important;
+ }
+
+ .profilePicture--yrdRB {
+ box-shadow: none;
+ }
+
+ ._input_15c0d78:focus {
+ color: var(--wave-color-solid-contrast-darker);
+ }
+
+ /*my picks*/
+ #My\ favorite\ track\ on\ repeat,
+ ._selectedPrompt_dac4cfc[style*="--prompt-base-color: ${base0D}1A"] {
+ --prompt-base-color: ${base0D} !important;
+ --prompt-color: ${base0E} !important;
+ }
+
+ #My\ major\ mood\ booster,
+ ._selectedPrompt_dac4cfc[style*="--prompt-base-color: #FF91531A"] {
+ --prompt-base-color: ${base09} !important;
+ --prompt-color: ${base0A} !important;
+ }
+
+ #My\ go-to\ artist\ right\ now,
+ ._selectedPrompt_dac4cfc[style*="--prompt-base-color: #FF53531A"] {
+ --prompt-base-color: ${base08} !important;
+ --prompt-color: ${base0F} !important;
+ }
+
+ #My\ top\ album\ recently,
+ ._selectedPrompt_dac4cfc[style*="--prompt-base-color: #53FF981A"] {
+ --prompt-base-color: ${base0B} !important;
+ --prompt-color: ${base0B} !important;
+ }
+
+ ._wave-btn-rank-clean_1lao2_127:hover {
+ color: ${base00};
+ background-color: ${base05}38 !important;
+ }
+
+ #pick-promt-item-search-field {
+ color: ${base05};
+ }
+
+ /*ARTIST PAGE*/
+ ._background_4a10ea2:after {
+ content: "" !important;
+ position: absolute !important;
+ top: 0 !important;
+ left: 0 !important;
+ right: 0 !important;
+ bottom: 0 !important;
+ background-color: ${base00}4a !important;
+ }
+
+ :is(._background_a548b6d ._image_7ba9b97):before {
+ background-color: ${base00}21 !important;
+ background-image: none !important;
+ background-blend-mode: normal !important;
+ }
+
+ ._background_a548b6d {
+ background-image: linear-gradient(180deg, ${base00}66 0, ${base00}) !important;
+ }
+
+ :is(._background_a548b6d ._image_7ba9b97):after {
+ background-image: var(--img) !important;
+ background-position: center !important;
+ background-repeat: no-repeat !important;
+ background-size: cover !important;
+ content: "" !important;
+ filter: blur(5px) brightness(30%) !important;
+ inset: -20px 0 !important;
+ mask-image: linear-gradient(0deg, ${base00}0 43%, ${base00}) !important;
+ position: absolute !important;
+ }
+
+ ._mainImage_433f1ff:is(._background_a548b6d ._image_7ba9b97):after {
+ mask-image: linear-gradient(0deg, ${base00}0, ${base00}) !important;
+ filter: brightness(100%) !important;
+ height: 87% !important;
+ }
+
+ .buttonText--LMsAT {
+ color: ${base00} !important;
+ }
+
+ .css-10jmp6g {
+ color: ${base05};
+ }
+
+ .button--_0I_t {
+ background-color: var(--button-light);
+ }
+
+ .button--_0I_t:hover {
+ background-color: var(--wave-color-opacity-contrast-fill-regular);
+ }
+
+ #player__play {
+ color: ${base05};
+ }
+
+ .primary--NLSX4:hover {
+ background-color: ${base04};
+ }
+
+ :is(._buttons_ff12873 ._following_657edad) ._icon_29252d0 {
+ fill: var(--wave-color-solid-accent-fill) !important;
+ }
+
+ /*bio*/
+ ._dialog_148b5df {
+ color: ${base05};
+ }
+
+ /*producer discography*/
+ .css-1thhtwd {
+ background: var(--wave-color-solid-base-brighter);
+ }
+
+ .css-1thhtwd:hover {
+ background: var(--wave-color-opacity-contrast-fill-regular);
+ }
+
+ ._buttonActive_5125b72 {
+ background: var(--button-light);
+ }
+
+ ._buttonActive_5125b72:hover {
+ background: var(--wave-color-opacity-contrast-fill-regular);
+ }
+
+ ._buttonActive_5125b72 > .wave-text-body-medium {
+ color: ${base05};
+ }
+ /*SETTINGS*/
+ ._container_b4f1e20._fillDark_a1e5896 > div,
+ ._container_9a0abb9 {
+ background: ${base01} !important;
+ }
+
+ ._select_ef84104 {
+ background: var(--wave-color-solid-accent-darker) !important;
+ }
+
+ .licenseFrame--C_hup {
+ background: ${base06};
+ }
+
+ svg#lastfm path {
+ fill: ${base05};
+ }
+
+ ._button_94c5125 {
+ background: var(--wave-color-solid-base-brighter);
+ }
+
+ /*scrollbars*/
+ ::-webkit-scrollbar {
+ background-color: transparent !important;
+ border: none !important;
+ width: 8px !important;
+ }
+
+ ::-webkit-scrollbar-track {
+ background-color: var(--wave-color-solid-base-brighter) !important;
+ box-shadow: none;
+ }
+
+ ::-webkit-scrollbar-thumb {
+ background-color: ${base04} !important;
+ border: none !important;
+ }
+
+ /*luna*/
+ body
+ > div.ReactModalPortal
+ > div
+ > div
+ > div.modalBody--TFBWU.selectableText--UDUkZ.modalText--gCapb.subtitle--dYfEG
+ > neptune-reactive-root
+ > div
+ > button,
+ #main
+ > div.__NEPTUNE_PAGE
+ > neptune-reactive-root
+ > div
+ > div
+ > div:nth-child(2)
+ > div
+ > div.neptune-card
+ > div
+ > div:nth-child(2)
+ > div:nth-child(1)
+ > button:nth-child(1),
+ #main
+ > div.__NEPTUNE_PAGE
+ > neptune-reactive-root
+ > div
+ > div
+ > div:nth-child(2)
+ > div
+ > div.neptune-card
+ > div
+ > div:nth-child(2)
+ > div:nth-child(1)
+ > button:nth-child(2) {
+ color: ${base05} !important;
+ }
+
+ .neptune-switch::after {
+ background-color: ${base00} !important;
+ }
+
+ .css-16hze37,
+ #main
+ > div:nth-child(3)
+ > div
+ > div.MuiContainer-root.MuiContainer-maxWidthLg.css-sot3eg
+ > div
+ > div:nth-child(2)
+ > div.MuiStack-root.css-16a8gxx
+ > div {
+ color: ${base07} !important;
+ }
+
+ .css-yc8597,
+ .css-pfqxe1,
+ .css-axw7ok {
+ color: ${base00} !important;
+ }
+
+ to {
+ opacity: 1;
+ transform: scale(1);
+ }
+ '';
+ };
+ };
+}
diff --git a/hm/modules/linux/tidal-hifi/themify.py b/hm/modules/linux/tidal-hifi/themify.py
new file mode 100644
index 00000000..932524fb
--- /dev/null
+++ b/hm/modules/linux/tidal-hifi/themify.py
@@ -0,0 +1,162 @@
+import re
+import argparse
+import sys
+
+
+def create_themed_css(css_content):
+ """
+ Replaces hardcoded color values in a CSS string with stylix variables.
+
+ This function uses a predefined mapping to find and replace color codes (hex and named)
+ with their corresponding Nix stylix variables (e.g., ${base00}).
+
+ Args:
+ css_content (str): A string containing the source CSS.
+
+ Returns:
+ str: The themed CSS content with stylix variables.
+ """
+ # This dictionary maps stylix variables to a list of colors they should replace.
+ # It includes various formats (e.g., hex, named colors) for comprehensive matching.
+ # This structure makes it easy to see which colors are grouped and to extend the theme.
+ COLOR_MAPPING = {
+ # Base Backgrounds (Lightest)
+ "${base00}": [
+ "#ffffff",
+ "#fff",
+ "#fdfdfd",
+ "#fbfbfb",
+ "#fcfcfc",
+ ],
+ # Secondary & Modal Backgrounds
+ "${base01}": ["#f1f1f1", "#efefef", "#eaebeb", "#e5e5e5"],
+ # Hover, Active, Disabled States
+ "${base02}": ["#e7e7e8", "#00000013", "#00000017"],
+ # Brighter Hover & Light Buttons
+ "${base03}": [
+ "#e0e2e2",
+ "#d9d9d9",
+ "#e0e0e0",
+ "#d5d5d5",
+ "#dbdbdb",
+ "#0000001c",
+ "#0000001a",
+ "#0003",
+ ],
+ # UI Elements, Medium Grays, Scrollbars
+ "${base04}": [
+ "#bbbebe",
+ "#cbcbcb",
+ "#d4d4d4",
+ "#c3c3c3",
+ "#b6b6b6",
+ "#dddde0",
+ "#ababab",
+ "#0000003d",
+ "#a6a6a6",
+ ],
+ # Primary Text & Icons (Darkest)
+ "${base05}": ["#000", "#000000", "#252525", "#2a2a2a", "#6e6e6e"],
+ # Secondary Text
+ "${base06}": [
+ "#434343",
+ "#383838",
+ "#29292a",
+ "#000000b3",
+ "#000000ab",
+ "#0000009a",
+ ],
+ # "White" Text on Colored Backgrounds
+ "${base07}": ["#e6e6ed"],
+ # --- Accent Colors ---
+ # Red (Errors, Notifications)
+ "${base08}": ["#fa5656", "#d85959", "#ff5656"],
+ # Orange
+ "${base09}": ["#f98f54"],
+ # Yellow
+ "${base0A}": ["#d1a70d", "#bc991e", "#e6d165", "#ffd332"],
+ # Green
+ "${base0B}": ["#356e56", "#49c47a", "#5deaa6"],
+ # Cyan (Light)
+ "${base0C}": ["#d5edeb"],
+ # Blue / Slate
+ "${base0D}": ["#96a6af", "#97a1ff"],
+ # Teal / Primary Accent
+ "${base0E}": ["#39afa5", "#3cb4aa", "#3bafa5", "#5ecce3", "#8bd4cf"],
+ # Magenta / Pink
+ "${base0F}": ["#e860d2"],
+ }
+
+ # Replace the named color 'white' and 'black' first.
+ css_content = re.sub(r"\bwhite\b", "${base00}", css_content, flags=re.IGNORECASE)
+ css_content = re.sub(r"\bblack\b", "${base05}", css_content, flags=re.IGNORECASE)
+
+ # To handle box-shadows, we replace the hex color part directly.
+ # We target black shadows specifically, as requested by the stylix spec (`shadow = ${base00}`).
+ css_content = re.sub(
+ r"(box-shadow:.*?)#000000([0-9a-fA-F]*)", r"\1${base00}\2", css_content
+ )
+
+ # Iterate through the mapping and replace each color.
+ for stylix_var, color_list in COLOR_MAPPING.items():
+ for color in color_list:
+ try:
+ # Create a regex pattern for the specific color, ignoring case.
+ pattern = re.compile(re.escape(color), re.IGNORECASE)
+ css_content = pattern.sub(stylix_var, css_content)
+ except re.error as e:
+ # This error handling is for cases where a color string might form an invalid regex.
+ print(f"Regex error for color '{color}': {e}", file=sys.stderr)
+
+ return css_content
+
+
+def main():
+ """
+ Main function to parse arguments and run the CSS theming process.
+ """
+ # Set up command-line argument parsing.
+ parser = argparse.ArgumentParser(
+ description="Replaces hardcoded colors in a Tidal CSS file with stylix variables.",
+ formatter_class=argparse.RawTextHelpFormatter,
+ )
+ parser.add_argument("input_file", help="The path to the source CSS file.")
+ parser.add_argument(
+ "-o",
+ "--output",
+ dest="output_file",
+ help="The path to write the themed CSS file to.\nIf omitted, prints to standard output.",
+ )
+ args = parser.parse_args()
+
+ # Read the source CSS from the specified input file.
+ try:
+ with open(args.input_file, "r", encoding="utf-8") as f:
+ source_css = f.read()
+ except FileNotFoundError:
+ print(f"Error: Input file not found at '{args.input_file}'", file=sys.stderr)
+ sys.exit(1)
+ except Exception as e:
+ print(f"Error reading input file: {e}", file=sys.stderr)
+ sys.exit(1)
+
+ # Process the CSS content to replace colors.
+ themed_css = create_themed_css(source_css)
+
+ # Write the result to the output file or print to the console.
+ if args.output_file:
+ try:
+ with open(args.output_file, "w", encoding="utf-8") as f:
+ f.write(themed_css)
+ print(f"Successfully wrote themed CSS to '{args.output_file}'")
+ except Exception as e:
+ print(f"Error writing to output file: {e}", file=sys.stderr)
+ sys.exit(1)
+ else:
+ # If no output file is specified, print to standard output.
+ print(themed_css)
+
+
+# Execute the main function when the script is run.
+if __name__ == "__main__":
+ main()
diff --git a/hm/modules/linux/tidal-hifi/tidal-light.css b/hm/modules/linux/tidal-hifi/tidal-light.css
new file mode 100644
index 00000000..e58c5938
--- /dev/null
+++ b/hm/modules/linux/tidal-hifi/tidal-light.css
@@ -0,0 +1,684 @@
+/*
+{
+ "name": "Tidal Light",
+ "author": "Interstellar_1",
+ "description": "A light theme for Tidal. v0.3.5b"
+ "license": "MIT License"
+}
+*/
+:root {
+ /*background color*/
+ --wave-color-solid-base-fill: white !important;
+ --wave-color-solid-accent-darkest: #f1f1f1 !important;
+ --wave-color-solid-base-brighter: #eaebeb !important;
+ --wave-color-solid-base-bright: #f1f1f1 !important;
+ --wave-color-opacity-base-bright-thick: #000 !important;
+
+ /*hover*/
+ --wave-color-solid-base-brightest: #e0e2e2 !important;
+ --wave-color-opacity-base-brightest-regular: #e5e5e5 !important;
+ --wave-color-opacity-contrast-fill-regular: #bbbebe !important;
+ --wave-color-solid-contrast-dark: #e0e2e2 !important;
+ --transparent-play-hover: #e1e1e166 !important;
+
+ /*border*/
+ --wave-color-opacity-contrast-fill-ultra-thin: #00000017 !important;
+
+ /*button color*/
+ --wave-color-opacity-contrast-fill-thin: #0000001c !important;
+ --wave-color-solid-accent-darker: #d5edeb !important;
+ --wave-color-solid-rainbow-red-darkest: #fa5656 !important;
+ --wave-color-solid-rainbow-red-darker: #d85959 !important;
+ --button-light: #d9d9d9 !important;
+ --button-medium: #cbcbcb !important;
+
+ /*accents*/
+ --wave-color-solid-accent-fill: #39afa5 !important;
+ --text-accent: #3cb4aa !important;
+ [data-w="textUrl"] {
+ color: var(--text-accent) !important;
+ }
+ --switch-accent: #3bafa5 !important;
+ --wave-color-solid-rainbow-yellow-fill: #d1a70d !important;
+
+ /*primary text*/
+ [data-wave-color="textDefault"] {
+ color: #000 !important;
+ }
+ [data-wave-color="textWhite"] {
+ color: #000 !important;
+ }
+ /*secondary text*/
+ --wave-color-text-secondary: #434343 !important;
+ [data-wave-color="textSecondary"] {
+ color: #000000b3 !important;
+ }
+ --wave-color-solid-contrast-darker: #383838 !important;
+ --wave-color-opacity-contrast-fill-ultra-thick: #383838 !important;
+ /*icons*/
+ --wave-color-solid-contrast-fill: #000 !important;
+ --wave-color-opacity-contrast-fill-thick: #0000009a !important;
+
+ /*search*/
+ --wave-color-opacity-base-brighter-ultra-thick: #c3c3c3 !important;
+ --search-background: #efefefe0 !important;
+
+ /*user profile image*/
+ --user-profile-linear-gradient: linear-gradient(
+ 160deg,
+ #356e56 1.22%,
+ #96a6af 40.51%,
+ #cbcbcb 79.07%
+ ) !important;
+}
+
+body {
+ background-color: #fff !important;
+}
+/*GENERAL*/
+/*hide right shadow*/
+#playQueueSidebar {
+ box-shadow: none !important;
+}
+
+/*buttons*/
+._activeTab_f47dafa {
+ background: #0000001c;
+}
+
+/*HOMEPAGE*/
+/*artists*/
+.isLoggedIn--CEJH_::after {
+ background: none;
+}
+
+/*hide album + playlist + mix bg*/
+._dataContainer_66f4f40::before,
+._dataContainer_5bb6028::before,
+._dataContainer_7feb4a2::before {
+ background-image: none;
+}
+
+/*artist name*/
+.css-5pl3ge {
+ color: #000000ab;
+}
+
+/*icons*/
+.icon--rmikT,
+.icon--VV33E {
+ color: #000;
+}
+._icon_77f3f89 {
+ fill: #000 !important;
+}
+
+/*SIDEBAR*/
+._active_3451dba:is(a._sidebarItem_730d27e, button._sidebarItem_730d27e) span {
+ color: var(--wave-color-solid-accent-fill) !important;
+}
+
+/*player shadow*/
+.player--gAOQG.notFullscreen--xbpBL {
+ box-shadow: 0 -6px 24px #a6a6a626;
+}
+
+/*ACCENT TEXT*/
+/*yellow*/
+._wave-badge-color-max_1oxl7_22 {
+ color: #bc991e;
+ background-color: #ffd33238;
+}
+
+/*blue*/
+._wave-badge-color-high_1oxl7_17 {
+ color: var(--text-accent);
+}
+
+.wave-text-title-bold {
+ color: #fff !important;
+}
+
+/*none*/
+._wave-badge-color-default_1oxl7_7 {
+ background-color: #0000001a;
+ color: #000;
+}
+
+svg._accentedIcon_d6d54e4 {
+ color: var(--wave-color-solid-accent-fill);
+ fill: var(--wave-color-solid-accent-fill) !important;
+}
+
+.smallHeader--rfQsR {
+ --img: url(https://blocks.astratic.com/img/general-img-landscape.png) !important;
+}
+
+/*shortcuts*/
+._shortcutItem_6c8e7b4 {
+ box-shadow: none !important;
+ background-color: var(--wave-color-solid-base-brighter) !important;
+}
+
+._shortcutItem_6c8e7b4::after {
+ background: linear-gradient(#0000, #fff9);
+}
+
+/*search*/
+.container--cl4MJ,
+div.searchField--fgDKc,
+div.searchField--fgDKc:focus,
+._container_f1be359 {
+ background-color: var(--search-background) !important;
+ border-color: var(--wave-color-opacity-contrast-fill-ultra-thin) !important;
+}
+
+.container--sRPa5 {
+ border-color: var(--wave-color-opacity-contrast-fill-ultra-thin) !important;
+}
+
+.icon--nNXej,
+._icon_49dd0aa {
+ background: linear-gradient(180deg, #fdfdfd, #dbdbdb) !important;
+}
+
+a.searchPill--ED7eQ.active--e_BIx {
+ background: var(--wave-color-opacity-contrast-fill-thin) !important;
+}
+
+.css-10jmp6g {
+ color: var(--wave-color-text-secondary) !important;
+}
+
+._imageContainer_dfdf7bd::after,
+._imageContainer_23303c1::after {
+ background: var(--transparent-play-hover) !important;
+}
+
+/*updates*/
+.css-5pl3ge {
+ color: #000000ab !important;
+}
+
+/*explict badge*/
+._explicitBadge_b93510b {
+ filter: invert(40%) brightness(110%) contrast(140%);
+}
+
+#explicit-badge {
+ color: #000 !important;
+}
+
+/*video badge*/
+.videoBadge--Tpdav {
+ fill: var(--wave-color-text-secondary);
+ filter: brightness(0.3) invert(0);
+}
+
+/*canvas nav buttons*/
+.viewAllButton--Nb87U,
+.css-7l8ggf {
+ background: #e0e0e0;
+}
+
+.viewAllButton--Nb87U:hover,
+.css-7l8ggf:hover {
+ background: #cbcbcb;
+}
+
+/*album hover*/
+.overlay--ces1Z,
+.overlay--Dn4ax,
+.overlay--Cb6su,
+.css-17bbmu3,
+.css-ohr3gy,
+._overlay_3c15650,
+._overlay_aa1ee83,
+._overlay_62e2cfd,
+._overlay_e0e48ef,
+._overlay_7fd73e6,
+._overlay_f627136,
+.css-1ug9uri,
+.css-u7yq00 {
+ background: linear-gradient(#0000, #ffffff9e) !important;
+}
+
+:is(._dataContainer_66f4f40 ._coverArtContainer_2eafdf9)
+ ._creditsOverlay_b234d8c {
+ background: #fdfdfd80;
+}
+
+/*artist hover*/
+.css-179fhoi,
+.css-fvlky0 {
+ background: linear-gradient(#0000, #ffffff9e) !important;
+}
+
+/*play button hover*/
+.css-75d7zy {
+ background-color: #ffffffa6;
+ transition: 100ms;
+}
+
+.css-75d7zy:hover {
+ background-color: var(--wave-color-solid-base-brighter);
+}
+
+button.button--W_J5g.gray--tvcIF.contextMenuButton--Bcnyd:hover {
+ background-size: 200%;
+}
+
+/*playlist hover*/
+.css-1voubjj:hover {
+ background-color: var(--wave-color-solid-base-brighter);
+ border: 5px var(--wave-color-opacity-contrast-fill-ultra-thin);
+}
+
+/*queue popup*/
+.bottomGradient--BngZe,
+._bottomGradient_104d99b {
+ background-image: none;
+}
+
+#playQueueSidebar {
+ box-shadow: 0 20px 25px 5px #00000057;
+}
+
+/*audio quality popup*/
+._containerMax_611862e {
+ background-color: transparent;
+}
+
+/*PLAYER PANE*/
+.range--JNSfg {
+ background-color: #0000003d;
+}
+
+:is(._player_1d16b04 button).withBackground[aria-checked="true"] {
+ background-color: #00000013;
+}
+
+._range_ce0e571 {
+ background-color: var(--wave-color-opacity-contrast-fill-regular);
+}
+
+/*album hover*/
+._notFullscreenOverlay_1442d60 {
+ background: linear-gradient(0deg, #ffffffa6, #ffffffa6);
+}
+
+/*FULL VIEW*/
+.activeTab--bqTiv {
+ background: #00000017;
+}
+
+.container--cl4MJ {
+ background: #fcfcfc63 !important;
+}
+
+.css-u7yq00 {
+ background: #ffffff75;
+}
+
+._bottomGradient_5c344de {
+ background: none;
+}
+
+._button_84b8ffe {
+ background-color: var(--wave-color-solid-base-brighter);
+}
+
+._button_84b8ffe:hover {
+ background-color: var(--wave-color-solid-base-brightest);
+}
+
+._baseButton_15fc215:focus {
+ background: #0003;
+}
+
+#nowPlaying {
+ background-image: none !important;
+}
+
+/*thumbnail*/
+._albumImageOverlay_2eabc2b {
+ background: #ffffff4f;
+}
+
+/*ALBUM*/
+.albumImage--i2CqD {
+ box-shadow:
+ 0 20px 50px 5px #b6b6b638,
+ 0 20px 40px 0 #00000024;
+}
+
+._button_f1c7fcb {
+ background: var(--wave-color-solid-base-brighter);
+}
+
+.artist-link {
+ color: #252525;
+}
+
+/*remove bg image*/
+[class^="_dataContainer_"]:before {
+ --img: none !important;
+ background-image: none !important;
+}
+
+/*playlist*/
+.refreshButton--bRrPi {
+ color: #000;
+}
+
+/*tracks page*/
+.variantPrimary--pjymy,
+._button_3357ce6 {
+ background-color: var(--button-light);
+}
+
+.wave-text-body-demi {
+ color: #000;
+}
+
+/*track hover*/
+._rowContainer_ebb4cfc:hover {
+ background: var(--wave-color-solid-base-brightest) !important;
+}
+
+/*DIALOUGES*/
+.ReactModal__Content {
+ background: #f1f1f1 !important;
+}
+
+.label--fycqD.unchecked--goEjz {
+ background-color: #ababab;
+}
+
+.label--fycqD.checked--RVmZV {
+ background-color: var(--switch-accent);
+}
+
+.primary--NLSX4 {
+ background-color: #d5d5d5;
+}
+
+.primary--NLSX4:hover {
+ background-color: var(--wave-color-opacity-contrast-fill-regular) !important;
+}
+
+.primary--NLSX4:disabled {
+ background-color: #e7e7e8;
+}
+
+.primary--NLSX4:disabled:hover {
+ background-color: #e7e7e8;
+}
+
+/*popups*/
+.notification--hckxF,
+.native-range {
+ box-shadow: 0 20px 50px 5px #0000002e;
+}
+
+._notification_99c9c6e {
+ box-shadow: 0 16px 32px #0000;
+}
+
+._notification_99c9c6e._error_0b778e5 {
+ background: var(--wave-color-solid-rainbow-red-darker);
+}
+
+.errorIcon--VvndK {
+ fill: #000 !important;
+}
+
+/*PROFILE*/
+.followingTag--CKRME,
+.wave-text-footnote-medium {
+ color: var(--text-accent) !important;
+}
+
+._wave-btn-rank-primary_1lao2_58:hover {
+ background-color: #8bd4cf;
+}
+
+._button_94c5125 {
+ background-color: transparent !important;
+}
+
+.profilePicture--yrdRB {
+ box-shadow: none;
+}
+
+._input_15c0d78:focus {
+ color: var(--wave-color-solid-contrast-darker);
+}
+
+/*my picks*/
+#My\ favorite\ track\ on\ repeat,
+._selectedPrompt_dac4cfc[style*="--prompt-base-color: #97A1FF1A"] {
+ --prompt-base-color: #97a1ff !important;
+ --prompt-color: #5ecce3 !important;
+}
+
+#My\ major\ mood\ booster,
+._selectedPrompt_dac4cfc[style*="--prompt-base-color: #FF91531A"] {
+ --prompt-base-color: #f98f54 !important;
+ --prompt-color: #e6d165 !important;
+}
+
+#My\ go-to\ artist\ right\ now,
+._selectedPrompt_dac4cfc[style*="--prompt-base-color: #FF53531A"] {
+ --prompt-base-color: #ff5656 !important;
+ --prompt-color: #e860d2 !important;
+}
+
+#My\ top\ album\ recently,
+._selectedPrompt_dac4cfc[style*="--prompt-base-color: #53FF981A"] {
+ --prompt-base-color: #49c47a !important;
+ --prompt-color: #5deaa6 !important;
+}
+
+._wave-btn-rank-clean_1lao2_127:hover {
+ color: #fff;
+ background-color: #6e6e6e38 !important;
+}
+
+#pick-promt-item-search-field {
+ color: #000;
+}
+
+/*ARTIST PAGE*/
+._background_4a10ea2:after {
+ content: "" !important;
+ position: absolute !important;
+ top: 0 !important;
+ left: 0 !important;
+ right: 0 !important;
+ bottom: 0 !important;
+ background-color: #ffffff4a !important;
+}
+
+:is(._background_a548b6d ._image_7ba9b97):before {
+ background-color: #ffffff21 !important;
+ background-image: none !important;
+ background-blend-mode: normal !important;
+}
+
+._background_a548b6d {
+ background-image: linear-gradient(180deg, #fbfbfb66 0, #fff) !important;
+}
+
+:is(._background_a548b6d ._image_7ba9b97):after {
+ background-image: var(--img) !important;
+ background-position: center !important;
+ background-repeat: no-repeat !important;
+ background-size: cover !important;
+ content: "" !important;
+ filter: blur(5px) brightness(30%) !important;
+ inset: -20px 0 !important;
+ mask-image: linear-gradient(0deg, #fff0 43%, #fff) !important;
+ position: absolute !important;
+}
+
+._mainImage_433f1ff:is(._background_a548b6d ._image_7ba9b97):after {
+ mask-image: linear-gradient(0deg, #fff0, #fff) !important;
+ filter: brightness(100%) !important;
+ height: 87% !important;
+}
+
+.buttonText--LMsAT {
+ color: #fff !important;
+}
+
+.css-10jmp6g {
+ color: #2a2a2a;
+}
+
+.button--_0I_t {
+ background-color: var(--button-light);
+}
+
+.button--_0I_t:hover {
+ background-color: var(--wave-color-opacity-contrast-fill-regular);
+}
+
+#player__play {
+ color: #000;
+}
+
+.primary--NLSX4:hover {
+ background-color: #dddde0;
+}
+
+:is(._buttons_ff12873 ._following_657edad) ._icon_29252d0 {
+ fill: var(--wave-color-solid-accent-fill) !important;
+}
+
+/*bio*/
+._dialog_148b5df {
+ color: black;
+}
+
+/*producer discography*/
+.css-1thhtwd {
+ background: var(--wave-color-solid-base-brighter);
+}
+
+.css-1thhtwd:hover {
+ background: var(--wave-color-opacity-contrast-fill-regular);
+}
+
+._buttonActive_5125b72 {
+ background: var(--button-light);
+}
+
+._buttonActive_5125b72:hover {
+ background: var(--wave-color-opacity-contrast-fill-regular);
+}
+
+._buttonActive_5125b72 > .wave-text-body-medium {
+ color: #000;
+}
+/*SETTINGS*/
+._container_b4f1e20._fillDark_a1e5896 > div,
+._container_9a0abb9 {
+ background: #f1f1f1 !important;
+}
+
+._select_ef84104 {
+ background: var(--wave-color-solid-accent-darker) !important;
+}
+
+.licenseFrame--C_hup {
+ background: #29292a;
+}
+
+svg#lastfm path {
+ fill: #000;
+}
+
+._button_94c5125 {
+ background: var(--wave-color-solid-base-brighter);
+}
+
+/*scrollbars*/
+::-webkit-scrollbar {
+ background-color: transparent !important;
+ border: none !important;
+ width: 8px !important;
+}
+
+::-webkit-scrollbar-track {
+ background-color: var(--wave-color-solid-base-brighter) !important;
+ box-shadow: none;
+}
+
+::-webkit-scrollbar-thumb {
+ background-color: #d4d4d4 !important;
+ border: none !important;
+}
+
+/*luna*/
+body
+ > div.ReactModalPortal
+ > div
+ > div
+ > div.modalBody--TFBWU.selectableText--UDUkZ.modalText--gCapb.subtitle--dYfEG
+ > neptune-reactive-root
+ > div
+ > button,
+#main
+ > div.__NEPTUNE_PAGE
+ > neptune-reactive-root
+ > div
+ > div
+ > div:nth-child(2)
+ > div
+ > div.neptune-card
+ > div
+ > div:nth-child(2)
+ > div:nth-child(1)
+ > button:nth-child(1),
+#main
+ > div.__NEPTUNE_PAGE
+ > neptune-reactive-root
+ > div
+ > div
+ > div:nth-child(2)
+ > div
+ > div.neptune-card
+ > div
+ > div:nth-child(2)
+ > div:nth-child(1)
+ > button:nth-child(2) {
+ color: #000 !important;
+}
+
+.neptune-switch::after {
+ background-color: #fff !important;
+}
+
+.css-16hze37,
+#main
+ > div:nth-child(3)
+ > div
+ > div.MuiContainer-root.MuiContainer-maxWidthLg.css-sot3eg
+ > div
+ > div:nth-child(2)
+ > div.MuiStack-root.css-16a8gxx
+ > div {
+ color: #e6e6ed !important;
+}
+
+.css-yc8597,
+.css-pfqxe1,
+.css-axw7ok {
+ color: #fff !important;
+}
+
+to {
+ opacity: 1;
+ transform: scale(1);
+}
diff --git a/hm/modules/linux/var/easyeffects/default.nix b/hm/modules/linux/var/easyeffects/default.nix
new file mode 100644
index 00000000..ce6dde05
--- /dev/null
+++ b/hm/modules/linux/var/easyeffects/default.nix
@@ -0,0 +1,35 @@
+{
+ config,
+ lib,
+ osConfig,
+ ...
+}:
+let
+ cfg = config.functorOS.utils.easyeffects;
+in
+{
+ options.functorOS.utils.easyeffects = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = true;
+ description = ''
+ Whether to enable EasyEffects.
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ services.easyeffects.enable = true;
+
+ home.file = lib.mkIf (osConfig.functorOS.flakeLocation != null) {
+ ".config/easyeffects/output" = {
+ source = config.lib.file.mkOutOfStoreSymlink "${osConfig.functorOS.flakeLocation}/hm/modules/linux/var/easyeffects/output";
+ recursive = true;
+ };
+ ".config/easyeffects/input" = {
+ source = config.lib.file.mkOutOfStoreSymlink "${osConfig.functorOS.flakeLocation}/hm/modules/linux/var/easyeffects/input";
+ recursive = true;
+ };
+ };
+ };
+}
diff --git a/hm/modules/linux/var/mangohud/MangoHud.conf b/hm/modules/linux/var/mangohud/MangoHud.conf
new file mode 100644
index 00000000..ba839de1
--- /dev/null
+++ b/hm/modules/linux/var/mangohud/MangoHud.conf
@@ -0,0 +1,48 @@
+# Config Generated by MangoJuice #
+legacy_layout=false
+offset_x=0
+offset_y=140
+gpu_stats
+vram
+gpu_temp
+throttling_status
+cpu_stats
+cpu_mhz
+cpu_temp
+fps
+gamemode
+engine_short_names
+engine_version
+wine
+engine_short_names
+toggle_logging=Shift_L+F2
+log_duration=30
+log_interval=100
+fps_limit_method=late
+toggle_fps_limit=Shift_L+F1
+vsync=0
+gl_vsync=-1
+round_corners=0
+background_alpha=0.0
+position=top-left
+table_columns=3
+toggle_hud=Shift_R+F12
+font_size=14
+fps_sampling_period=500
+gpu_color=2e9762
+cpu_color=2e97cb
+fps_value=30,60
+fps_color=cc0000,ffaa7f,92e79a
+gpu_load_value=60,90
+gpu_load_color=92e79a,ffaa7f,cc0000
+cpu_load_value=60,90
+cpu_load_color=92e79a,ffaa7f,cc0000
+background_color=000000
+frametime_color=00ff00
+vram_color=ad64c1
+ram_color=c26693
+wine_color=eb5b5b
+engine_color=eb5b5b
+text_color=ffffff
+media_player_color=ffffff
+network_color=e07b85
\ No newline at end of file
diff --git a/hm/modules/linux/var/mangohud/default.nix b/hm/modules/linux/var/mangohud/default.nix
new file mode 100644
index 00000000..6f939b3d
--- /dev/null
+++ b/hm/modules/linux/var/mangohud/default.nix
@@ -0,0 +1,12 @@
+{
+ config,
+ osConfig,
+ lib,
+ ...
+}:
+{
+ config = lib.mkIf (osConfig.functorOS.flakeLocation != null) {
+ home.file.".config/MangoHud/MangoHud.conf".source =
+ config.lib.file.mkOutOfStoreSymlink "${osConfig.functorOS.flakeLocation}/hm/modules/linux/var/mangohud/MangoHud.conf";
+ };
+}
diff --git a/hosts/adrastea/default.nix b/hosts/adrastea/default.nix
deleted file mode 100755
index be473ef8..00000000
--- a/hosts/adrastea/default.nix
+++ /dev/null
@@ -1,227 +0,0 @@
-# Edit this configuration file to define what should be installed on
-# your system. Help is available in the configuration.nix(5) man page
-# and in the NixOS manual (accessible by running ‘nixos-help’).
-{
- config,
- inputs,
- pkgs,
- lib,
- ...
-}: {
- imports = [
- # Include the results of the hardware scan.
- ./hardware-configuration.nix
- ];
-
- # Bootloader.
- boot.loader = {
- efi.canTouchEfiVariables = true;
- timeout = 15;
- # Lanzaboote currently replaces the systemd-boot module.
- # This setting is usually set to true in configuration.nix
- # generated at installation time. So we force it to false
- # for now.
- systemd-boot = {
- enable = true;
- consoleMode = "auto";
- };
- };
-
- # boot.lanzaboote = {
- # enable = false;
- # pkiBundle = "/etc/secureboot";
- # };
-
- services.keyd = {
- enable = true;
- keyboards = {
- default = {
- ids = ["*"];
- settings = {
- main = {
- capslock = "esc";
- leftalt = "leftcontrol";
- leftcontrol = "leftalt";
- };
- };
- };
- };
- };
-
- boot.initrd.luks.devices."luks-52d1be6d-b32f-41e0-a6d7-2ff52599fe7c".device = "/dev/disk/by-uuid/52d1be6d-b32f-41e0-a6d7-2ff52599fe7c";
-
- services.tlp.enable = true;
-
- networking.hostName = "adrastea"; # Define your hostname.
- # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
-
- # select kernel
- boot.kernelPackages = pkgs.linuxPackages_zen;
-
- # Configure network proxy if necessary
- # networking.proxy.default = "http://user:password@proxy:port/";
- # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
-
- # Enable networking
- networking.networkmanager.enable = true;
-
- # Set your time zone.
- time.timeZone = "America/Los_Angeles";
-
- # Select internationalisation properties.
- i18n.defaultLocale = "en_US.UTF-8";
-
- i18n.extraLocaleSettings = {
- LC_ADDRESS = "en_US.UTF-8";
- LC_IDENTIFICATION = "en_US.UTF-8";
- LC_MEASUREMENT = "en_US.UTF-8";
- LC_MONETARY = "en_US.UTF-8";
- LC_NAME = "en_US.UTF-8";
- LC_NUMERIC = "en_US.UTF-8";
- LC_PAPER = "en_US.UTF-8";
- LC_TELEPHONE = "en_US.UTF-8";
- LC_TIME = "en_US.UTF-8";
- };
-
- systemd.services = {NetworkManager-wait-online.enable = false;};
-
- # Enable the X11 windowing system.
- # You can disable this if you're only using the Wayland session.
- services.xserver.enable = false;
-
- programs.nix-ld = {
- enable = true;
- libraries = with pkgs; [icu xorg.libXtst xorg.libXi];
- };
-
- hardware.nvidia = {
- modesetting.enable = true;
- powerManagement.enable = true;
- powerManagement.finegrained = false;
- open = false;
- nvidiaSettings = true;
- prime = {
- amdgpuBusId = "PCI:4:0:0";
- nvidiaBusId = "PCI:1:0:0";
- offload = {
- enable = true;
- enableOffloadCmd = true;
- };
- };
- };
-
- hardware.graphics.enable = true;
-
- hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.stable;
-
- services.xserver.videoDrivers = ["nvidia"];
-
- # services.desktopManager.plasma6.enable = true;
-
- # Configure keymap in X11
- services.xserver = {
- xkb.layout = "us";
- xkb.variant = "";
- };
-
- # Enable CUPS to print documents.
- services.printing.enable = true;
-
- # Enable touchpad support (enabled default in most desktopManager).
- # services.xserver.libinput.enable = true;
-
- # Define a user account. Don't forget to set a password with ‘passwd’.
- users.users.youwen = {
- isNormalUser = true;
- description = "Youwen Wu";
- extraGroups = ["networkmanager" "wheel" "nixos" "realtime"];
- };
-
- users.groups.realtime = {};
-
- nix.settings = {
- trusted-users = ["root" "youwen"];
- experimental-features = ["nix-command" "flakes"];
- };
-
- services.udev.extraRules = ''
- KERNEL=="cpu_dma_latency", GROUP="realtime"
- '';
-
- security.pam.loginLimits = [
- {
- domain = "@realtime";
- type = "-";
- item = "rtprio";
- value = 98;
- }
- {
- domain = "@realtime";
- type = "-";
- item = "memlock";
- value = "unlimited";
- }
- {
- domain = "@realtime";
- type = "-";
- item = "nice";
- value = -11;
- }
- ];
-
- # Allow unfree packages
- nixpkgs.config.allowUnfree = true;
-
- # List packages installed in system profile. To search, run:
- # $ nix search wget
- environment.systemPackages = with pkgs; [
- neovim
- wget
- git
- curl
- librewolf
- gnumake
- gcc
- cachix
- gnupg
- openssh
- python3
- steam-run
-
- # deps for neovim compilation
- lua51Packages.lua
- lua51Packages.luarocks
- tree-sitter
- ];
-
- environment.variables = {
- EDITOR = "nvim";
- NIX_AUTO_RUN = 1;
- };
-
- # tells electron apps to use Wayland
- environment.sessionVariables.NIXOS_OZONE_WL = "1";
-
- # Some programs need SUID wrappers, can be configured further or are
- # started in user sessions.
- # programs.mtr.enable = true;
- programs.gnupg.agent = {
- enable = true;
- enableSSHSupport = true;
- };
-
- programs.dconf.enable = true;
-
- programs.hyprland.enable = true;
-
- programs.zsh.enable = false;
- programs.fish.enable = true;
- users.users.youwen.shell = pkgs.fish;
- # This value determines the NixOS release from which the default
- # settings for stateful data, like file locations and database versions
- # on your system were taken. It‘s perfectly fine and recommended to leave
- # this value at the release version of the first install of this system.
- # Before changing this value read the documentation for this option
- # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
- system.stateVersion = "24.05"; # Did you read the comment?
-}
diff --git a/hosts/adrastea/hardware-configuration.nix b/hosts/adrastea/hardware-configuration.nix
deleted file mode 100644
index 5655ceb4..00000000
--- a/hosts/adrastea/hardware-configuration.nix
+++ /dev/null
@@ -1,44 +0,0 @@
-# Do not modify this file! It was generated by ‘nixos-generate-config’
-# and may be overwritten by future invocations. Please make changes
-# to /etc/nixos/configuration.nix instead.
-{
- config,
- lib,
- pkgs,
- modulesPath,
- ...
-}: {
- imports = [(modulesPath + "/installer/scan/not-detected.nix")];
-
- boot.initrd.availableKernelModules = ["nvme" "xhci_pci" "usbhid" "usb_storage" "sd_mod"];
- boot.initrd.kernelModules = [];
- boot.kernelModules = ["kvm-amd"];
- boot.extraModulePackages = [];
-
- fileSystems."/" = {
- device = "/dev/disk/by-uuid/01983a52-5693-4cda-ad2e-5a406776bfb9";
- fsType = "ext4";
- };
-
- boot.initrd.luks.devices."luks-f169a679-d70b-4dff-a344-7131f3303813".device = "/dev/disk/by-uuid/f169a679-d70b-4dff-a344-7131f3303813";
-
- fileSystems."/boot" = {
- device = "/dev/disk/by-uuid/3FCB-9D60";
- fsType = "vfat";
- options = ["fmask=0022" "dmask=0022"];
- };
-
- swapDevices = [{device = "/dev/disk/by-uuid/f28d0752-feab-4591-899e-e5deac3712d0";}];
-
- # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
- # (the default) this is the recommended approach. When using systemd-networkd it's
- # still possible to use this option, but it's recommended to use it in conjunction
- # with explicit per-interface declarations with `networking.interfaces..useDHCP`.
- networking.useDHCP = lib.mkDefault true;
- # networking.interfaces.enp4s0f3u2.useDHCP = lib.mkDefault true;
- # networking.interfaces.wlp2s0.useDHCP = lib.mkDefault true;
-
- nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
- hardware.cpu.amd.updateMicrocode =
- lib.mkDefault config.hardware.enableRedistributableFirmware;
-}
diff --git a/hosts/adrastea/home-manager-overrides.nix b/hosts/adrastea/home-manager-overrides.nix
deleted file mode 100644
index 05690566..00000000
--- a/hosts/adrastea/home-manager-overrides.nix
+++ /dev/null
@@ -1,3 +0,0 @@
-{pkgs, ...}: {
- wayland.windowManager.hyprland.settings.monitor = pkgs.lib.mkForce ["eDP-1,2560x1440@165,0x0,1.6"];
-}
diff --git a/hosts/callisto/default.nix b/hosts/callisto/default.nix
deleted file mode 100755
index e39ca0da..00000000
--- a/hosts/callisto/default.nix
+++ /dev/null
@@ -1,198 +0,0 @@
-# Edit this configuration file to define what should be installed on
-# your system. Help is available in the configuration.nix(5) man page
-# and in the NixOS manual (accessible by running ‘nixos-help’).
-{
- config,
- inputs,
- pkgs,
- ...
-}: {
- imports = [
- # Include the results of the hardware scan.
- ./hardware-configuration.nix
- # ./apple-silicon-support
- ];
-
- boot.loader.systemd-boot.enable = true;
- boot.loader.efi.canTouchEfiVariables = false;
-
- hardware.asahi = {
- peripheralFirmwareDirectory = ./firmware;
- useExperimentalGPUDriver = true;
- experimentalGPUInstallMode = "overlay";
- };
-
- boot.extraModprobeConfig = ''
- options hid_apple iso_layout=0
- '';
-
- boot.kernelParams = ["apple_dcp.show_notch=1"];
-
- networking.hostName = "callisto"; # Define your hostname.
- # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
-
- networking.wireless.iwd = {
- enable = true;
- settings.General.EnableNetworkConfiguration = true;
- };
-
- nixpkgs.overlays = [inputs.apple-silicon.overlays.apple-silicon-overlay];
-
- programs.light.enable = true;
-
- # Configure network proxy if necessary
- # networking.proxy.default = "http://user:password@proxy:port/";
- # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
-
- # Enable networking
- # networking.networkmanager.enable = true;
-
- # Set your time zone.
- time.timeZone = "America/Los_Angeles";
-
- # Select internationalisation properties.
- i18n.defaultLocale = "en_US.UTF-8";
-
- i18n.extraLocaleSettings = {
- LC_ADDRESS = "en_US.UTF-8";
- LC_IDENTIFICATION = "en_US.UTF-8";
- LC_MEASUREMENT = "en_US.UTF-8";
- LC_MONETARY = "en_US.UTF-8";
- LC_NAME = "en_US.UTF-8";
- LC_NUMERIC = "en_US.UTF-8";
- LC_PAPER = "en_US.UTF-8";
- LC_TELEPHONE = "en_US.UTF-8";
- LC_TIME = "en_US.UTF-8";
- };
-
- # Enable the X11 windowing system.
- # You can disable this if you're only using the Wayland session.
- services.xserver.enable = false;
-
- programs.nix-ld = {
- enable = true;
- libraries = with pkgs; [icu xorg.libXtst xorg.libXi];
- };
-
- # Configure keymap in X11
- services.xserver = {
- xkb.layout = "us";
- xkb.variant = "";
- };
-
- # Enable CUPS to print documents.
- services.printing.enable = true;
-
- # Enable touchpad support (enabled default in most desktopManager).
- # services.xserver.libinput.enable = true;
-
- # Define a user account. Don't forget to set a password with ‘passwd’.
- users.users.youwen = {
- isNormalUser = true;
- description = "Youwen Wu";
- extraGroups = ["networkmanager" "wheel" "nixos" "realtime"];
- };
-
- users.groups.realtime = {};
-
- nix.settings = {
- trusted-users = ["root" "youwen"];
- experimental-features = ["nix-command" "flakes"];
- };
-
- services.udev.extraRules = ''
- KERNEL=="cpu_dma_latency", GROUP="realtime"
- KERNEL=="macsmc-battery", SUBSYSTEM=="power_supply", ATTR{charge_control_end_threshold}="80", ATTR{charge_control_start_threshold}="70"
- '';
-
- security.pam.loginLimits = [
- {
- domain = "@realtime";
- type = "-";
- item = "rtprio";
- value = 98;
- }
- {
- domain = "@realtime";
- type = "-";
- item = "memlock";
- value = "unlimited";
- }
- {
- domain = "@realtime";
- type = "-";
- item = "nice";
- value = -11;
- }
- ];
-
- # Allow unfree packages
- nixpkgs.config.allowUnfree = true;
-
- # List packages installed in system profile. To search, run:
- # $ nix search wget
- environment.systemPackages = with pkgs; [
- neovim
- wget
- git
- curl
- ];
-
- environment.variables = {
- EDITOR = "nvim";
- NIX_AUTO_RUN = 1;
- };
- services.keyd = {
- enable = true;
- keyboards = {
- default = {
- ids = ["*"];
- settings = {
- main = {
- capslock = "esc";
- leftmeta = "leftcontrol";
- leftalt = "leftmeta";
- leftcontrol = "leftalt";
- rightmeta = "leftalt";
- rightalt = "layer(rightalt)";
- };
- rightalt = {
- i = "up";
- j = "left";
- k = "down";
- l = "right";
- };
- };
- };
- };
- };
-
- services.tlp.enable = true;
-
- # tells electron apps to use Wayland
- environment.sessionVariables.NIXOS_OZONE_WL = "1";
-
- # Some programs need SUID wrappers, can be configured further or are
- # started in user sessions.
- # programs.mtr.enable = true;
- programs.gnupg.agent = {
- enable = true;
- enableSSHSupport = true;
- };
-
- programs.dconf.enable = true;
-
- programs.hyprland.enable = true;
-
- # This value determines the NixOS release from which the default
- # settings for stateful data, like file locations and database versions
- # on your system were taken. It‘s perfectly fine and recommended to leave
- # this value at the release version of the first install of this system.
- # Before changing this value read the documentation for this option
- # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
- system.stateVersion = "24.11"; # Did you read the comment?
-
- programs.zsh.enable = false;
- programs.fish.enable = true;
- users.users.youwen.shell = pkgs.fish;
-}
diff --git a/hosts/callisto/firmware/all_firmware.tar.gz b/hosts/callisto/firmware/all_firmware.tar.gz
deleted file mode 100755
index b0687dc4..00000000
Binary files a/hosts/callisto/firmware/all_firmware.tar.gz and /dev/null differ
diff --git a/hosts/callisto/firmware/kernelcache.release.mac13j b/hosts/callisto/firmware/kernelcache.release.mac13j
deleted file mode 100755
index 71881bfa..00000000
Binary files a/hosts/callisto/firmware/kernelcache.release.mac13j and /dev/null differ
diff --git a/hosts/callisto/hardware-configuration.nix b/hosts/callisto/hardware-configuration.nix
deleted file mode 100755
index c812f7aa..00000000
--- a/hosts/callisto/hardware-configuration.nix
+++ /dev/null
@@ -1,39 +0,0 @@
-# Do not modify this file! It was generated by ‘nixos-generate-config’
-# and may be overwritten by future invocations. Please make changes
-# to /etc/nixos/configuration.nix instead.
-{
- config,
- lib,
- pkgs,
- modulesPath,
- ...
-}: {
- imports = [(modulesPath + "/installer/scan/not-detected.nix")];
-
- boot.initrd.availableKernelModules = ["usb_storage" "sdhci_pci"];
- boot.initrd.kernelModules = [];
- boot.kernelModules = [];
- boot.extraModulePackages = [];
-
- fileSystems."/" = {
- device = "/dev/disk/by-uuid/bc88058e-6e3a-4987-b78e-e19cb5611608";
- fsType = "ext4";
- };
-
- fileSystems."/boot" = {
- device = "/dev/disk/by-uuid/852F-07F1";
- fsType = "vfat";
- options = ["fmask=0022" "dmask=0022"];
- };
-
- swapDevices = [];
-
- # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
- # (the default) this is the recommended approach. When using systemd-networkd it's
- # still possible to use this option, but it's recommended to use it in conjunction
- # with explicit per-interface declarations with `networking.interfaces..useDHCP`.
- networking.useDHCP = lib.mkDefault true;
- # networking.interfaces.wlan0.useDHCP = lib.mkDefault true;
-
- nixpkgs.hostPlatform = lib.mkDefault "aarch64-linux";
-}
diff --git a/hosts/demeter/default.nix b/hosts/demeter/default.nix
deleted file mode 100755
index 2adccadd..00000000
--- a/hosts/demeter/default.nix
+++ /dev/null
@@ -1,210 +0,0 @@
-# Edit this configuration file to define what should be installed on
-# your system. Help is available in the configuration.nix(5) man page
-# and in the NixOS manual (accessible by running ‘nixos-help’).
-{
- config,
- inputs,
- pkgs,
- lib,
- ...
-}: {
- imports = [
- # Include the results of the hardware scan.
- ./hardware-configuration.nix
- ];
-
- # Bootloader.
- boot.loader = {
- efi.canTouchEfiVariables = true;
- timeout = 15;
- # Lanzaboote currently replaces the systemd-boot module.
- # This setting is usually set to true in configuration.nix
- # generated at installation time. So we force it to false
- # for now.
- systemd-boot = {
- enable = false;
- consoleMode = "auto";
- };
- };
-
- boot.lanzaboote = {
- enable = true;
- pkiBundle = "/etc/secureboot";
- };
-
- boot.initrd.luks.devices."luks-af320a0f-b388-43f5-b5a3-af2b47cfc716".device = "/dev/disk/by-uuid/af320a0f-b388-43f5-b5a3-af2b47cfc716";
-
- networking.hostName = "demeter"; # Define your hostname.
- # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
-
- # select kernel
- boot.kernelPackages = pkgs.linuxPackages_zen;
-
- # Configure network proxy if necessary
- # networking.proxy.default = "http://user:password@proxy:port/";
- # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
-
- # Enable networking
- networking.networkmanager.enable = true;
-
- # Set your time zone.
- time.timeZone = "America/Los_Angeles";
-
- # Select internationalisation properties.
- i18n.defaultLocale = "en_US.UTF-8";
-
- i18n.extraLocaleSettings = {
- LC_ADDRESS = "en_US.UTF-8";
- LC_IDENTIFICATION = "en_US.UTF-8";
- LC_MEASUREMENT = "en_US.UTF-8";
- LC_MONETARY = "en_US.UTF-8";
- LC_NAME = "en_US.UTF-8";
- LC_NUMERIC = "en_US.UTF-8";
- LC_PAPER = "en_US.UTF-8";
- LC_TELEPHONE = "en_US.UTF-8";
- LC_TIME = "en_US.UTF-8";
- };
-
- systemd.services = {NetworkManager-wait-online.enable = false;};
-
- # Enable the X11 windowing system.
- # You can disable this if you're only using the Wayland session.
- services.xserver.enable = false;
-
- programs.nix-ld = {
- enable = true;
- libraries = with pkgs; [icu xorg.libXtst xorg.libXi];
- };
-
- hardware.nvidia = {
- modesetting.enable = true;
- powerManagement.enable = true;
- powerManagement.finegrained = false;
- open = false;
- nvidiaSettings = true;
- };
-
- hardware.bluetooth = {
- enable = true;
- powerOnBoot = true;
- };
-
- services.blueman.enable = true;
-
- hardware.graphics.enable = true;
-
- hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.stable;
-
- services.xserver.videoDrivers = ["nvidia"];
-
- services.flatpak.enable = true;
-
- # services.desktopManager.plasma6.enable = true;
-
- # Configure keymap in X11
- services.xserver = {
- xkb.layout = "us";
- xkb.variant = "";
- };
-
- # Enable CUPS to print documents.
- services.printing.enable = true;
-
- # Enable touchpad support (enabled default in most desktopManager).
- # services.xserver.libinput.enable = true;
-
- # Define a user account. Don't forget to set a password with ‘passwd’.
- users.users.youwen = {
- isNormalUser = true;
- description = "Youwen Wu";
- extraGroups = ["networkmanager" "wheel" "nixos" "realtime"];
- };
-
- users.groups.realtime = {};
-
- nix.settings = {
- trusted-users = ["root" "youwen"];
- experimental-features = ["nix-command" "flakes"];
- };
-
- services.udev.extraRules = ''
- KERNEL=="cpu_dma_latency", GROUP="realtime"
- '';
-
- security.pam.loginLimits = [
- {
- domain = "@realtime";
- type = "-";
- item = "rtprio";
- value = 98;
- }
- {
- domain = "@realtime";
- type = "-";
- item = "memlock";
- value = "unlimited";
- }
- {
- domain = "@realtime";
- type = "-";
- item = "nice";
- value = -11;
- }
- ];
-
- # Allow unfree packages
- nixpkgs.config.allowUnfree = true;
-
- # List packages installed in system profile. To search, run:
- # $ nix search wget
- environment.systemPackages = with pkgs; [
- neovim
- wget
- git
- curl
- librewolf
- gnumake
- gcc
- cachix
- gnupg
- openssh
- python3
- steam-run
-
- # deps for neovim compilation
- lua51Packages.lua
- lua51Packages.luarocks
- tree-sitter
- ];
-
- environment.variables = {
- EDITOR = "nvim";
- NIX_AUTO_RUN = 1;
- };
-
- # tells electron apps to use Wayland
- environment.sessionVariables.NIXOS_OZONE_WL = "1";
-
- # Some programs need SUID wrappers, can be configured further or are
- # started in user sessions.
- # programs.mtr.enable = true;
- programs.gnupg.agent = {
- enable = true;
- enableSSHSupport = true;
- };
-
- programs.dconf.enable = true;
-
- programs.hyprland.enable = true;
-
- programs.zsh.enable = false;
- programs.fish.enable = true;
- users.users.youwen.shell = pkgs.fish;
- # This value determines the NixOS release from which the default
- # settings for stateful data, like file locations and database versions
- # on your system were taken. It‘s perfectly fine and recommended to leave
- # this value at the release version of the first install of this system.
- # Before changing this value read the documentation for this option
- # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
- system.stateVersion = "24.05"; # Did you read the comment?
-}
diff --git a/hosts/demeter/hardware-configuration.nix b/hosts/demeter/hardware-configuration.nix
deleted file mode 100644
index 27265a79..00000000
--- a/hosts/demeter/hardware-configuration.nix
+++ /dev/null
@@ -1,47 +0,0 @@
-# Do not modify this file! It was generated by ‘nixos-generate-config’
-# and may be overwritten by future invocations. Please make changes
-# to /etc/nixos/configuration.nix instead.
-{
- config,
- lib,
- pkgs,
- modulesPath,
- ...
-}: {
- imports = [
- (modulesPath + "/installer/scan/not-detected.nix")
- ];
-
- boot.initrd.availableKernelModules = ["xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod"];
- boot.initrd.kernelModules = [];
- boot.kernelModules = ["kvm-intel"];
- boot.extraModulePackages = [];
-
- fileSystems."/" = {
- device = "/dev/disk/by-uuid/5a339a7f-8668-42d7-9ecc-d7a8f1d3f7b2";
- fsType = "ext4";
- };
-
- boot.initrd.luks.devices."luks-362ec972-7c5e-4c9f-ba5d-b8f2ed083509".device = "/dev/disk/by-uuid/362ec972-7c5e-4c9f-ba5d-b8f2ed083509";
-
- fileSystems."/boot" = {
- device = "/dev/disk/by-uuid/27EE-D950";
- fsType = "vfat";
- options = ["fmask=0022" "dmask=0022"];
- };
-
- swapDevices = [
- {device = "/dev/disk/by-uuid/670fc084-d593-44b3-aed9-78d95fec71de";}
- ];
-
- # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
- # (the default) this is the recommended approach. When using systemd-networkd it's
- # still possible to use this option, but it's recommended to use it in conjunction
- # with explicit per-interface declarations with `networking.interfaces..useDHCP`.
- networking.useDHCP = lib.mkDefault true;
- # networking.interfaces.enp6s0.useDHCP = lib.mkDefault true;
- # networking.interfaces.wlo1.useDHCP = lib.mkDefault true;
-
- nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
- hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
-}
diff --git a/hosts/demeter/hardware-configuration.nix.old b/hosts/demeter/hardware-configuration.nix.old
deleted file mode 100755
index df06d011..00000000
--- a/hosts/demeter/hardware-configuration.nix.old
+++ /dev/null
@@ -1,39 +0,0 @@
-# Do not modify this file! It was generated by ‘nixos-generate-config’
-# and may be overwritten by future invocations. Please make changes
-# to /etc/nixos/configuration.nix instead.
-{ config, lib, pkgs, modulesPath, ... }:
-
-{
- imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];
-
- boot.initrd.availableKernelModules =
- [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ];
- boot.initrd.kernelModules = [ ];
- boot.kernelModules = [ "kvm-intel" ];
- boot.extraModulePackages = [ ];
-
- fileSystems."/" = {
- device = "/dev/disk/by-uuid/2616d86c-aac2-4780-9527-7b11192e783f";
- fsType = "ext4";
- };
-
- fileSystems."/boot" = {
- device = "/dev/disk/by-uuid/B826-E14B";
- fsType = "vfat";
- options = [ "fmask=0022" "dmask=0022" ];
- };
-
- swapDevices = [ ];
-
- # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
- # (the default) this is the recommended approach. When using systemd-networkd it's
- # still possible to use this option, but it's recommended to use it in conjunction
- # with explicit per-interface declarations with `networking.interfaces..useDHCP`.
- networking.useDHCP = lib.mkDefault true;
- # networking.interfaces.enp6s0.useDHCP = lib.mkDefault true;
- # networking.interfaces.wlo1.useDHCP = lib.mkDefault true;
-
- nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
- hardware.cpu.intel.updateMicrocode =
- lib.mkDefault config.hardware.enableRedistributableFirmware;
-}
diff --git a/hosts/phobos/default.nix b/hosts/phobos/default.nix
deleted file mode 100755
index c17278ed..00000000
--- a/hosts/phobos/default.nix
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- inputs,
- config,
- pkgs,
- ...
-}: {
- # Expose the package set, including overlays, for convenience.
- # darwinPackages = inputs.self.darwinConfigurations."Youwens-MacBook-Pro".pkgs;
-
- # List packages installed in system profile. To search by name, run:
- # $ nix-env -qaP | grep wget
- environment.systemPackages = with pkgs; [];
-
- # Use a custom configuration.nix location.
- # $ darwin-rebuild switch -I darwin-config=$HOME/.config/nixpkgs/darwin/configuration.nix
- # environment.darwinConfig = "$HOME/.config/nixpkgs/darwin/configuration.nix";
-
- # Auto upgrade nix package and the daemon service.
- services.nix-daemon.enable = true;
- # nix.package = pkgs.nix;
-
- nix.settings.experimental-features = "nix-command flakes";
-
- nixpkgs.config.allowUnfree = true;
-
- # Create /etc/zshrc that loads the nix-darwin environment.
- programs.zsh.enable = true; # default shell on catalina
- programs.fish.enable = true;
- programs.bash.enable = true;
-
- system.configurationRevision =
- config.self.rev or config.self.dirtyRev or null;
-
- nixpkgs.hostPlatform = "aarch64-darwin";
-
- # Used for backwards compatibility, please read the changelog before changing.
- # $ darwin-rebuild changelog
- system.stateVersion = 4;
-
- users.users.youwen = {
- home = "/Users/youwen";
- description = "Youwen Wu";
- shell = pkgs.fish;
- };
-
- security.pam.enableSudoTouchIdAuth = true;
-
- fonts = {
- packages = with pkgs; [
- noto-fonts
- noto-fonts-cjk
- noto-fonts-emoji
- (nerdfonts.override {fonts = ["CascadiaCode"];})
- (google-fonts.override {fonts = ["Lora"];})
- ];
- };
-}
diff --git a/lib/buildFunctorOS.nix b/lib/buildFunctorOS.nix
new file mode 100644
index 00000000..90b70465
--- /dev/null
+++ b/lib/buildFunctorOS.nix
@@ -0,0 +1,13 @@
+{
+ nixpkgs,
+ inputs,
+ systemModule,
+}:
+nixpkgs.lib.nixosSystem {
+ specialArgs = {
+ inherit inputs;
+ };
+ modules = [
+ systemModule
+ ];
+}
diff --git a/modules/darwin/homebrew.nix b/modules/darwin/homebrew.nix
index 674a5886..77445bbe 100755
--- a/modules/darwin/homebrew.nix
+++ b/modules/darwin/homebrew.nix
@@ -1,4 +1,5 @@
-{inputs, ...}: {
+{ inputs, ... }:
+{
nix-homebrew = {
enable = true;
enableRosetta = true;
diff --git a/modules/darwin/yabai.nix b/modules/darwin/yabai.nix
index 5cf06ab4..48abd2ec 100755
--- a/modules/darwin/yabai.nix
+++ b/modules/darwin/yabai.nix
@@ -2,7 +2,8 @@
config,
pkgs,
...
-}: {
+}:
+{
services.yabai = {
enable = true;
enableScriptingAddition = true;
diff --git a/modules/default.nix b/modules/default.nix
new file mode 100644
index 00000000..b269334e
--- /dev/null
+++ b/modules/default.nix
@@ -0,0 +1,25 @@
+{
+ pkgs,
+ lib,
+ config,
+ ...
+}:
+let
+ cfg = config.functorOS;
+in
+{
+ imports = [
+ ./linux
+ ../hm
+ ];
+ options.functorOS = {
+ darwin.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = false;
+ description = ''
+ Whether to enable functorOS's default modules and options for Darwin.
+ '';
+ };
+ };
+ config._module.check = false;
+}
diff --git a/modules/linux/audio-prod/default.nix b/modules/linux/audio-prod/default.nix
new file mode 100644
index 00000000..e14a7d35
--- /dev/null
+++ b/modules/linux/audio-prod/default.nix
@@ -0,0 +1,106 @@
+{
+ pkgs,
+ lib,
+ config,
+ ...
+}:
+let
+ cfg = config.functorOS.system.audio.prod;
+ forAllUsers = lib.genAttrs cfg.realtimeAudioUsers;
+ wine = pkgs.wineWowPackages.full;
+ overrideWine =
+ package:
+ (package.override {
+ inherit wine;
+ });
+in
+{
+ options.functorOS.system.audio.prod = {
+ enable = lib.mkEnableOption "audio production";
+ realtimeAudioUsers = lib.mkOption {
+ type = lib.types.listOf lib.types.str;
+ default = builtins.map (x: x.username) config.functorOS._users;
+ description = ''
+ List of users to add to the audio group for realtime capabilities.
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.enable (
+ lib.mkMerge [
+ {
+ functorOS = {
+ programs.wine.enable = true;
+ system.audio.enable = true;
+ config.extraUnfreePackages = lib.mkIf config.functorOS.config.allowUnfree [
+ "reaper"
+ ];
+ };
+
+ environment.systemPackages = with pkgs; [
+ (overrideWine yabridge)
+ (overrideWine yabridgectl)
+ alsa-scarlett-gui
+ ];
+
+ musnix.enable = true;
+ # PREEMPT_RT is merged into master
+ musnix.kernel.realtime = false;
+
+ musnix.das_watchdog.enable = true;
+ musnix.alsaSeq.enable = true;
+ musnix.rtcqs.enable = true;
+ users.users = forAllUsers (_: {
+ extraGroups = [ "audio" ];
+ });
+
+ boot.kernelParams = [
+ "threadirqs"
+ ];
+ }
+ (lib.mkIf config.functorOS.config.allowUnfree {
+ environment.systemPackages = with pkgs; [
+ (reaper.overrideAttrs (
+ finalAttrs: prevAttrs: {
+ installPhase = ''
+ runHook preInstall
+
+ HOME="$out/share" XDG_DATA_HOME="$out/share" ./install-reaper.sh \
+ --install $out/opt \
+ --integrate-user-desktop
+ rm $out/opt/REAPER/uninstall-reaper.sh
+
+ # Dynamic loading of plugin dependencies does not adhere to rpath of
+ # reaper executable that gets modified with runtimeDependencies.
+ # Patching each plugin with DT_NEEDED is cumbersome and requires
+ # hardcoding of API versions of each dependency.
+ # Setting the rpath of the plugin shared object files does not
+ # seem to have an effect for some plugins.
+ # We opt for wrapping the executable with LD_LIBRARY_PATH prefix.
+ # Note that libcurl and libxml2 are needed for ReaPack to run.
+ wrapProgram $out/opt/REAPER/reaper \
+ --prefix LD_LIBRARY_PATH : "${
+ lib.makeLibraryPath [
+ curl
+ lame
+ libxml2
+ ffmpeg
+ vlc
+ xdotool
+ stdenv.cc.cc
+ ]
+ }" \
+ --prefix PIPEWIRE_LATENCY : "128/48000"
+
+ mkdir $out/bin
+ ln -s $out/opt/REAPER/reaper $out/bin/
+
+ runHook postInstall
+ '';
+ }
+ ))
+ ];
+ })
+ ]
+ );
+}
diff --git a/modules/linux/audio/default.nix b/modules/linux/audio/default.nix
new file mode 100755
index 00000000..e100fd9c
--- /dev/null
+++ b/modules/linux/audio/default.nix
@@ -0,0 +1,30 @@
+{ lib, config, ... }:
+let
+ cfg = config.functorOS.system.audio;
+in
+{
+ options.functorOS.system.audio.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = config.functorOS.enable;
+ description = ''
+ Whether to set up PipeWire and default audio utilities.
+ '';
+ };
+
+ config = lib.mkIf cfg.enable {
+ services.playerctld.enable = true;
+ services.pipewire = {
+ enable = true;
+ alsa.enable = true;
+ alsa.support32Bit = true;
+ pulse.enable = true;
+ jack.enable = true;
+ wireplumber.enable = true;
+ # extraConfig.pipewire = {
+ # bluez = {
+ # bluez5.a2dp.latency.msec = 200;
+ # };
+ # };
+ };
+ };
+}
diff --git a/modules/linux/core/default.nix b/modules/linux/core/default.nix
new file mode 100644
index 00000000..fd39b4cd
--- /dev/null
+++ b/modules/linux/core/default.nix
@@ -0,0 +1,221 @@
+{
+ pkgs,
+ config,
+ lib,
+ ...
+}:
+let
+ cfg = config.functorOS.system.core;
+in
+{
+ options.functorOS.system.core = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = config.functorOS.enable;
+ description = ''
+ Whether to enable core functorOS system utilities and configurations (such as security policies, Nix options, etc)
+ '';
+ };
+ replaceSudoWithRun0 = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable;
+ description = ''
+ Whether to replace fully sudo with systemd-run0, systemd's replacement for sudo. Unlike sudo, sudo-rs, or doas (dedicated openbsd application subexecutor), run0 is not a setuid program and relies solely on existing polkit privilege escalation infrastructure, reducing attack surface of the machine.
+ '';
+ };
+ waylandFixes = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable;
+ description = ''
+ Whether to enable some Wayland fixes, like setting NIXOS_OZONE_WL to hint Electron apps to use the Wayland windowing system.
+ '';
+ };
+ nixSaneDefaults = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable;
+ description = ''
+ Whether to set sane defaults for Nix, such as optimization and automatic garbage collection.
+ '';
+ };
+ nixTrustWheel = lib.mkOption {
+ type = lib.types.bool;
+ default = !cfg.enable;
+ description = ''
+ Whether to allow any user in the group `wheel` to manipulate the Nix store.
+
+ WARNING: Enabling this option is equivalent to passwordless sudo, so any process running as your user can escalate to root at any time.
+ '';
+ };
+ useNh = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.nixSaneDefaults;
+ description = ''
+ Whether to enable the `nh` cli (yet another Nix helper), a reimplementation of some core NixOS utilities like nix-collect-garbage and nixos-rebuild. If enabled, automatic garbage collection will use `nh` instead of `nix-collect-garbage` and will be able to garbage collect `result` symlinks.
+ '';
+ };
+ suppressWarnings = lib.mkEnableOption "suppress warnings";
+ bluetooth.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable;
+ description = ''
+ Whether to enable bluetooth and blueman.
+ '';
+ };
+ uutils.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable;
+ description = ''
+ Whether to replace GNU coreutils with Rust uutils
+ '';
+ };
+ chinaOptimizations = lib.mkEnableOption "optimizations for Nix operations in Mainland China. e.g. use the Tsinghua University binary cache, set firewall options to tunnel Nix binary cache operations past Mullvad VPN to preven throttling.";
+ customOSName = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable;
+ description = ''
+ Whether to set the OS string to functorOS instead of NixOS. This means tools like neofetch/fastfetch will report your operating system as functorOS rather than NixOS. Note that we also patch fastfetch to display a custom logo if this is enabled.
+ '';
+ };
+ };
+
+ options.system.nixos.codeName = lib.mkOption {
+ readOnly = false;
+ internal = true;
+ };
+
+ config = lib.mkMerge [
+ (lib.mkIf cfg.enable {
+ environment.systemPackages =
+ (with pkgs; [
+ wget
+ git
+ curl
+ ])
+ ++ [
+ config.functorOS.defaultEditor
+ ];
+
+ programs.nix-ld = {
+ enable = true;
+ libraries = with pkgs; [
+ icu
+ libxtst
+ libxi
+ ];
+ };
+
+ services.gnome.gnome-keyring.enable = true;
+
+ services.resolved.enable = true;
+
+ boot.tmp.cleanOnBoot = true;
+
+ hardware.enableRedistributableFirmware = true;
+
+ programs.gnupg.agent = {
+ enable = true;
+ enableSSHSupport = true;
+ };
+
+ programs.dconf.enable = true;
+
+ programs.fish.enable = true;
+
+ services.gvfs.enable = true;
+ })
+ (lib.mkIf cfg.uutils.enable {
+ environment.systemPackages = [
+ (lib.hiPrio pkgs.uutils-coreutils-noprefix)
+ ];
+ })
+ (lib.mkIf cfg.waylandFixes {
+ environment.sessionVariables = {
+ NIXOS_OZONE_WL = "1";
+ };
+ })
+ (lib.mkIf cfg.replaceSudoWithRun0 {
+ # TODO: enable once dbus 1.15.7 lands
+ security.polkit.persistentAuthentication = false;
+ security.run0-sudo-shim.enable = true;
+ })
+ (lib.mkIf cfg.nixSaneDefaults {
+ nix = {
+ gc = lib.mkIf (!cfg.useNh) {
+ automatic = true;
+ dates = "weekly";
+ options = "--delete-older-than 14d";
+ };
+
+ optimise.automatic = true;
+ # Free up to 1GiB when there is less than 100MiB left
+ extraOptions = ''
+ min-free = ${toString (100 * 1024 * 1024)}
+ max-free = ${toString (1024 * 1024 * 1024)}
+ '';
+
+ settings = {
+ experimental-features = [
+ "nix-command"
+ "flakes"
+ ];
+ substituters = [ "https://nix-community.cachix.org" ];
+ trusted-public-keys = [ "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" ];
+ };
+
+ channel.enable = false;
+ };
+ })
+ (lib.mkIf cfg.nixTrustWheel {
+ nix.settings.trusted-users = [ "@wheel" ];
+ })
+ (lib.mkIf cfg.chinaOptimizations {
+ nix.settings.substituters = lib.mkOverride 900 [
+ "https://mirrors4.tuna.tsinghua.edu.cn/nix-channels/store?priority=1"
+ "https://cache.nixos.org?priority=2"
+ "https://nix-community.cachix.org?priority=3"
+ ];
+ })
+ (lib.mkIf cfg.customOSName {
+ system.nixos = {
+ distroName = "functorOS";
+ distroId = "functoros";
+ vendorName = "functor.systems";
+ vendorId = "functorsystems";
+ codeName = "Zardini";
+ };
+ })
+ (lib.mkIf cfg.useNh {
+ programs.nh = {
+ enable = true;
+ clean = lib.mkIf cfg.nixSaneDefaults {
+ enable = true;
+ extraArgs = "--keep-since 4d --keep 3";
+ };
+ flake = config.functorOS.flakeLocation;
+ };
+ })
+ (lib.mkIf (config.functorOS.formFactor == "laptop") {
+ services.tlp.enable = true;
+ programs.brightnessctl.enable = true;
+ # programs.light.enable = true;
+ })
+ (lib.mkIf cfg.bluetooth.enable {
+ hardware.bluetooth = {
+ enable = true;
+ powerOnBoot = true;
+ };
+ services.blueman.enable = true;
+ })
+ (lib.mkIf (!cfg.suppressWarnings && cfg.useNh && config.functorOS.flakeLocation == "") {
+ warnings = [
+ ''
+ The `nh` CLI is enabled but `functorOS.flakeLocation` is not set. It
+ is recommended that you set this option to the absolute file path of
+ your configuration flake so that `nh` can work without specifying the
+ flake path every time. You can disable this warning by setting
+ `functorOS.system.core.suppressWarnings`.
+ ''
+ ];
+ })
+ ];
+}
diff --git a/modules/linux/default.nix b/modules/linux/default.nix
new file mode 100644
index 00000000..0dd2d92a
--- /dev/null
+++ b/modules/linux/default.nix
@@ -0,0 +1,38 @@
+{ lib, ... }:
+{
+ imports = [
+ ./audio
+ ./audio-prod
+ ./core
+ ./desktop-environment
+ ./distrobox
+ ./flatpak
+ ./gaming
+ ./greeter
+ ./misc
+ ./networking
+ ./stylix
+ ./wine
+ ./wsl
+ ./graphics
+ ./localization
+ ./location-services
+ ];
+
+ options.functorOS.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = true;
+ description = ''
+ Whether to enable functorOS's default modules and options for Linux.
+ '';
+ };
+
+ options.functorOS._users = lib.mkOption {
+ type = lib.types.listOf lib.types.attrs;
+ description = ''
+ Internal list of all functorOS users.
+ '';
+ default = [ ];
+ internal = true;
+ };
+}
diff --git a/modules/linux/desktop-environment/default.nix b/modules/linux/desktop-environment/default.nix
new file mode 100644
index 00000000..f1306737
--- /dev/null
+++ b/modules/linux/desktop-environment/default.nix
@@ -0,0 +1,111 @@
+{
+ pkgs,
+ lib,
+ config,
+ ...
+}:
+let
+ cfg = config.functorOS.desktop;
+in
+{
+ options.functorOS.desktop = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = config.functorOS.enable;
+ description = ''
+ Whether to enable the functorOS desktop environment.
+ '';
+ };
+ hyprland.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable;
+ description = ''
+ Whether to enable Hyprland. Sets up a default configuration at the system and user level, and installs xdg-desktop-portal-gtk.
+ '';
+ };
+ niri.enable = lib.mkEnableOption "Niri compositor";
+ sway.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = false;
+ description = ''
+ Whether to enable Sway compositor. Sets up a system-level Sway installation
+ with wlroots portals. Configure the rice via functorOS.desktop.sway in Home Manager.
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ xdg.portal = lib.mkIf (cfg.hyprland.enable || cfg.sway.enable) {
+ enable = true;
+ extraPortals =
+ lib.optionals cfg.hyprland.enable [ pkgs.xdg-desktop-portal-gtk ]
+ ++ lib.optionals cfg.sway.enable [
+ pkgs.xdg-desktop-portal-gtk
+ pkgs.xdg-desktop-portal-wlr
+ ];
+ };
+
+ programs.hyprland = lib.mkIf cfg.hyprland.enable {
+ enable = true;
+ withUWSM = true;
+ };
+
+ programs.sway = lib.mkIf cfg.sway.enable {
+ enable = true;
+ wrapperFeatures.gtk = true;
+ };
+
+ services.displayManager.sessionPackages = lib.optionals cfg.hyprland.enable [
+ (
+ let
+ desktop-file = pkgs.writeText "hyprland-functoros.desktop" ''
+ [Desktop Entry]
+ Name=Hyprland (functorOS)
+ Comment=An intelligent dynamic tiling Wayland compositor
+ Exec=${config.programs.hyprland.package}/bin/start-hyprland --no-nixgl
+ Type=Application
+ DesktopNames=Hyprland
+ Keywords=tiling;wayland;compositor;
+ '';
+ uwsm-file = pkgs.writeText "hyprland-uwsm-functoros.desktop" ''
+ [Desktop Entry]
+ Name=functorOS Desktop
+ Comment=An intelligent dynamic tiling Wayland compositor
+ Exec=uwsm start -e -D Hyprland ${desktop-file}
+ TryExec=uwsm
+ DesktopNames=Hyprland
+ Type=Application
+ '';
+ in
+ pkgs.stdenvNoCC.mkDerivation {
+ pname = "functoros-hyprland-desktop";
+ version = config.programs.hyprland.package.version;
+
+ phases = [ "installPhase" ];
+
+ installPhase = ''
+ mkdir -p $out/share/wayland-sessions
+ cp ${uwsm-file} $out/share/wayland-sessions/hyprland-functoros.desktop
+ '';
+
+ passthru.providedSessions = [
+ "hyprland-functoros"
+ ];
+ }
+ )
+ ];
+
+ programs.uwsm.enable = true;
+
+ programs.niri.enable = cfg.niri.enable;
+
+ programs.xwayland.enable = lib.mkIf cfg.niri.enable (lib.mkForce true);
+
+ services.xserver.enable = false;
+
+ services.xserver = {
+ xkb.layout = "us";
+ xkb.variant = "";
+ };
+ };
+}
diff --git a/modules/linux/desktop-environment/hyprland.nix b/modules/linux/desktop-environment/hyprland.nix
new file mode 100644
index 00000000..8d9bf20d
--- /dev/null
+++ b/modules/linux/desktop-environment/hyprland.nix
@@ -0,0 +1,21 @@
+attrs@{
+ hyprland,
+ makeWrapper,
+ stdenv,
+ ...
+}:
+stdenv.mkDerivation {
+ pname = hyprland.pname;
+ version = hyprland.version;
+
+ nativeBuildInputs = [ makeWrapper ];
+
+ paths = [
+ (hyprland.override attrs)
+ ];
+
+ postInstall = ''
+ wrapProgram $out/bin/start-hyprland \
+ --add-flags "--no-nixgl"
+ '';
+}
diff --git a/modules/linux/distrobox/default.nix b/modules/linux/distrobox/default.nix
new file mode 100644
index 00000000..e1e7d370
--- /dev/null
+++ b/modules/linux/distrobox/default.nix
@@ -0,0 +1,21 @@
+{
+ pkgs,
+ lib,
+ config,
+ ...
+}:
+let
+ cfg = config.functorOS.extras.distrobox;
+in
+{
+ options.functorOS.extras.distrobox.enable = lib.mkEnableOption "distrobox and podman";
+
+ config = lib.mkIf cfg.enable {
+ virtualisation.podman = {
+ enable = true;
+ dockerCompat = true;
+ };
+
+ environment.systemPackages = [ pkgs.distrobox ];
+ };
+}
diff --git a/modules/linux/flatpak/default.nix b/modules/linux/flatpak/default.nix
new file mode 100644
index 00000000..ba564c88
--- /dev/null
+++ b/modules/linux/flatpak/default.nix
@@ -0,0 +1,50 @@
+# NOTE: this module is IMPURE. Flatpaks are declaratively specified but not
+# versioned. Therefore, they are not included in generational rollbacks and
+# persist between generations. This is not ideal, but at least it is a better
+# situation than imperative installation
+{
+ config,
+ lib,
+ ...
+}:
+let
+ cfg = config.functorOS.programs.flatpak;
+in
+{
+ options.functorOS.programs.flatpak = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = false;
+ description = ''
+ Whether to enable Nix flatpak support with some fixes as well as declarative flatpak management.
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ xdg.portal.enable = true;
+ services.flatpak = {
+ enable = true;
+
+ overrides = {
+ global = {
+ Context.sockets = [
+ "wayland"
+ "!x11"
+ "!fallback-x11"
+ ];
+
+ Environment = {
+ # Fix un-themed cursor in some Wayland apps
+ XCURSOR_PATH = "/run/host/user-share/icons:/run/host/share/icons";
+ };
+ };
+ };
+
+ update.auto = {
+ enable = true;
+ onCalendar = "weekly";
+ };
+ };
+ };
+}
diff --git a/modules/linux/gaming/default.nix b/modules/linux/gaming/default.nix
new file mode 100755
index 00000000..064644e5
--- /dev/null
+++ b/modules/linux/gaming/default.nix
@@ -0,0 +1,166 @@
+{
+ pkgs,
+ lib,
+ config,
+ ...
+}:
+let
+ cfg = config.functorOS.extras.gaming;
+in
+{
+ options.functorOS.extras.gaming = {
+ enable = lib.mkEnableOption "gaming";
+ utilities = {
+ hamachi.enable = lib.mkEnableOption "hamachi";
+ gamemode = {
+ enable = lib.mkEnableOption "gamemode";
+ gamemodeUsers = lib.mkOption {
+ type = lib.types.listOf lib.types.str;
+ default = builtins.map (x: x.username) config.functorOS._users;
+ description = ''
+ List of users to add to the gamemode group. Gamemode will likely not work unless you add your user to the group!
+ '';
+ };
+ };
+ };
+ roblox.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = false;
+ description = ''
+ Whether to install the Roblox Sober flatpak automatically. Note that this will enable the nix-flatpak service and automatic flatpak updates.`
+ '';
+ };
+ };
+ config = lib.mkIf cfg.enable (
+ let
+ forAllGamemodeUsers = lib.genAttrs cfg.utilities.gamemode.gamemodeUsers;
+ in
+ {
+ environment.systemPackages = with pkgs; [
+ ryubing
+ lutris
+ # heroic
+ mangohud
+ mangojuice
+ r2modman
+
+ (pkgs.writeShellScriptBin "steam-run-game" ''
+ set -euo pipefail
+
+ if [ $# -lt 1 ]; then
+ echo "Usage: $0 [args...]"
+ exit 1
+ fi
+
+ winediscordipcbridge-steam.sh mangohud gamemoderun "$@"
+ '')
+
+ # modrinth-app
+ prismlauncher
+ # (modrinth-app.overrideAttrs (oldAttrs: {
+ # buildCommand =
+ # ''
+ # gappsWrapperArgs+=(
+ # --set GDK_BACKEND x11
+ # --set WEBKIT_DISABLE_DMABUF_RENDERER 1
+ # )
+ # ''
+ # + oldAttrs.buildCommand;
+ # }))
+
+ (wine-discord-ipc-bridge.overrideAttrs (
+ final: prev: {
+ meta.platforms = prev.meta.platforms ++ [ "x86_64-linux" ];
+ }
+ ))
+ ];
+
+ functorOS.programs.flatpak.enable = true;
+
+ services.flatpak.packages = lib.mkIf cfg.roblox.enable [
+ "org.vinegarhq.Sober"
+ ];
+
+ programs.steam = {
+ enable = true;
+ remotePlay.openFirewall = true;
+ dedicatedServer.openFirewall = true;
+ localNetworkGameTransfers.openFirewall = true;
+ gamescopeSession.enable = true;
+ extraCompatPackages = with pkgs; [
+ proton-ge-bin
+ ];
+ };
+
+ programs.gamescope.enable = true;
+
+ programs.gamemode = {
+ enable = true;
+ enableRenice = true;
+ settings = {
+ general = {
+ renice = 10;
+ };
+ custom = {
+ start = "${pkgs.libnotify}/bin/notify-send 'GameMode engaged'";
+ end = "${pkgs.libnotify}/bin/notify-send 'GameMode disengaged'";
+ };
+ };
+ };
+
+ functorOS.config.extraUnfreePackages = lib.mkIf config.functorOS.config.allowUnfree [
+ "modrinth-app"
+ "modrinth-app-unwrapped"
+ "ModrinthApp"
+ "steam"
+ "steam-unwrapped"
+ ];
+
+ users.users = forAllGamemodeUsers (_: {
+ extraGroups = [ "gamemode" ];
+ });
+
+ services.logmein-hamachi.enable = cfg.utilities.hamachi.enable;
+ programs.haguichi.enable = cfg.utilities.hamachi.enable;
+
+ nixpkgs.config.packageOverrides = pkgs: {
+ steam = pkgs.steam.override {
+ extraPkgs =
+ pkgs: with pkgs; [
+ xorg.libXcursor
+ libxi
+ xorg.libXinerama
+ xorg.libXScrnSaver
+ libpng
+ libpulseaudio
+ libvorbis
+ stdenv.cc.cc.lib
+ libkrb5
+ (writeShellScriptBin "launch-gamescope" ''
+ (sleep 1; pgrep gamescope| xargs renice -n -11 -p)&
+ exec gamescope "$@"
+ '')
+ keyutils
+ ];
+ };
+ };
+
+ warnings =
+ if cfg.utilities.gamemode.enable && (builtins.length cfg.utilities.gamemode.gamemodeUsers == 0) then
+ [
+ "You enabled gamemode without setting any gamemode users in `functorOS.extras.gaming.utilities.gamemode.gamemodeUsers. Gamemode is unlikely to work unless you add your user to gamemodeUsers."
+ ]
+ else
+ [ ];
+
+ assertions = [
+ {
+ assertion = !cfg.roblox.enable || (config.functorOS.config.allowUnfree && cfg.roblox.enable);
+ message = ''
+ You enabled Roblox but did not allow unfree software in functorOS! Roblox is installed using the Sober Flatpak , which is a proprietary unfree package! You must set functorOS.config.allowUnfree to enable Roblox.
+ '';
+ }
+ ];
+ }
+ );
+}
diff --git a/modules/linux/graphics/default.nix b/modules/linux/graphics/default.nix
new file mode 100644
index 00000000..3e1667c8
--- /dev/null
+++ b/modules/linux/graphics/default.nix
@@ -0,0 +1,80 @@
+{
+ lib,
+ config,
+ pkgs,
+ ...
+}:
+let
+ cfg = config.functorOS.system.graphics;
+in
+{
+ options.functorOS.system.graphics = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = true;
+ description = ''
+ Whether to set up basic graphics settings and options.
+ '';
+ };
+ nvidia = {
+ enable = lib.mkEnableOption "recommended nvidia drivers and configuration";
+ optimus-prime.enable = lib.mkEnableOption "Nvidia OPTIMUS and PRIME";
+ optimus-prime.powerMode = lib.mkOption {
+ type = lib.types.enum [
+ "powersaving"
+ "performance"
+ ];
+ default = "performance";
+ description = ''
+ Whether to use Nvidia OPTIMUS with maximum performance using the discrete graphics card, or to use offload mode to primarily use the integrated GPU and save power.
+ '';
+ };
+ suppressUnfreeWarning = lib.mkOption {
+ type = lib.types.bool;
+ default = false;
+ description = ''
+ Whether to disable the assertion that warns the user if they try to enable proprietary nvidia drivers without setting allowUnfree.
+ '';
+ };
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ hardware.nvidia = lib.mkIf cfg.nvidia.enable {
+ modesetting.enable = true;
+ powerManagement.enable = true;
+ powerManagement.finegrained = false;
+ open = true;
+ package =
+ if (lib.versionAtLeast config.boot.kernelPackages.nvidiaPackages.latest.version "590.44.01") then
+ config.boot.kernelPackages.nvidiaPackages.latest
+ else
+ config.boot.kernelPackages.nvidiaPackages.beta;
+ nvidiaSettings = true;
+ };
+
+ hardware.graphics = {
+ enable = true;
+ extraPackages = with pkgs; [
+ libva-vdpau-driver
+ ];
+ };
+
+ services.xserver.videoDrivers = lib.mkIf cfg.nvidia.enable [ "nvidia" ];
+
+ functorOS.config.extraUnfreePackages = lib.mkIf cfg.nvidia.enable [
+ "nvidia-x11"
+ "nvidia-settings"
+ ];
+
+ assertions = [
+ {
+ assertion =
+ !cfg.nvidia.enable
+ || (config.functorOS.config.allowUnfree && cfg.nvidia.enable)
+ || cfg.nvidia.suppressUnfreeWarning;
+ message = "You enabled Nvidia proprietary driver installation but did not allow unfree packages to be installed! Consider setting functorOS.config.allowUnfree = true or nixpkgs.config.allowUnfree = true. If you are using an allowUnfreePredicate to whitelist these packages manually, you can set functorOS.system.graphics.nvidia.suppressUnfreeWarning = true";
+ }
+ ];
+ };
+}
diff --git a/modules/linux/greeter/default.nix b/modules/linux/greeter/default.nix
new file mode 100644
index 00000000..f245945d
--- /dev/null
+++ b/modules/linux/greeter/default.nix
@@ -0,0 +1,44 @@
+{
+ pkgs,
+ lib,
+ config,
+ ...
+}:
+let
+ cfg = config.functorOS.desktop.greeter;
+in
+{
+ options.functorOS.desktop.greeter = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = config.functorOS.desktop.enable;
+ description = ''
+ Whether to enable and set up ly, the default greeter for functorOS.
+ '';
+ };
+ command = lib.mkOption {
+ type = lib.types.str;
+ # must pass --no-nixgl as NixOS check fails since we are on functorOS
+ default = if config.functorOS.desktop.enable then "start-hyprland --no-nixgl" else "";
+ description = ''
+ Command for the greeter to execute to launch the desktop. If the functorOS Hyprland Desktop is enabled, defaults to `start-hyprland`.
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ # from https://github.com/NixOS/nixpkgs/pull/297434#issuecomment-2348783988
+ systemd.services.display-manager.environment.XDG_CURRENT_DESKTOP = "X-NIXOS-SYSTEMD-AWARE";
+ services.displayManager.ly = {
+ enable = true;
+ x11Support = false;
+ settings = {
+ animation = "colormix";
+ vi_mode = false;
+ colormix_col1 = "0x00${config.lib.stylix.colors.base00}";
+ colormix_col2 = "0x00${config.lib.stylix.colors.base07}";
+ colormix_col3 = "0x00${config.lib.stylix.colors.base0F}";
+ };
+ };
+ };
+}
diff --git a/modules/linux/localization/default.nix b/modules/linux/localization/default.nix
new file mode 100644
index 00000000..d1232922
--- /dev/null
+++ b/modules/linux/localization/default.nix
@@ -0,0 +1,153 @@
+{
+ pkgs,
+ lib,
+ config,
+ ...
+}:
+let
+ cfg = config.functorOS.desktop.localization;
+in
+{
+ options.functorOS.desktop.localization = {
+ spanish.input.enable = lib.mkEnableOption "Spanish input method using fcitx5.";
+ chinese.input.enable = lib.mkEnableOption "Chinese input method using fcitx5.";
+ chinese.script = lib.mkOption {
+ type = lib.types.enum [
+ "simplified"
+ "traditional"
+ ];
+ default = "simplified";
+ description = ''
+ Whether to use simplified or traditional characters.
+ '';
+ };
+ };
+
+ config = {
+ i18n.inputMethod = {
+ enable = true;
+ type = "fcitx5";
+ fcitx5.waylandFrontend = true;
+ fcitx5.addons =
+ (with pkgs; [
+ fcitx5-gtk
+ fcitx5-tokyonight
+ ])
+ ++ lib.optionals cfg.chinese.input.enable [ pkgs.qt6Packages.fcitx5-chinese-addons ];
+
+ fcitx5.settings.globalOptions = {
+ Hotkey = {
+ # Enumerate when press trigger key repeatedly
+ EnumerateWithTriggerKeys = true;
+ # Temporally switch between first and current Input Method
+ AltTriggerKeys = null;
+ # Enumerate Input Method Forward
+ EnumerateForwardKeys = null;
+ # Enumerate Input Method Backward
+ EnumerateBackwardKeys = null;
+ # Skip first input method while enumerating
+ EnumerateSkipFirst = false;
+ # Enumerate Input Method Group Forward
+ EnumerateGroupForwardKeys = null;
+ # Enumerate Input Method Group Backward
+ EnumerateGroupBackwardKeys = null;
+ # Activate Input Method
+ ActivateKeys = null;
+ # Deactivate Input Method
+ DeactivateKeys = null;
+ # Default Previous page
+ PrevPage = null;
+ # Default Next page
+ NextPage = null;
+ # Default Previous Candidate
+ PrevCandidate = null;
+ # Default Next Candidate
+ NextCandidate = null;
+ # Toggle embedded preedit
+ TogglePreedit = null;
+ # Time limit in milliseconds for triggering modifier key shortcuts
+ ModifierOnlyKeyTimeout = 250;
+ };
+
+ "Hotkey/TriggerKeys" = {
+ "0" = "Control+Super+space";
+ "1" = "Zenkaku_Hankaku";
+ "2" = "Hangul";
+ };
+
+ Behavior = {
+ # Active By Default;
+ ActiveByDefault = false;
+ # Reset state on Focus In;
+ resetStateWhenFocusIn = "No";
+ # Share Input State;
+ ShareInputState = "No";
+ # Show preedit in application;
+ PreeditEnabledByDefault = true;
+ # Show Input Method Information when switch input method;
+ ShowInputMethodInformation = true;
+ # Show Input Method Information when changing focus;
+ showInputMethodInformationWhenFocusIn = false;
+ # Show compact input method information;
+ CompactInputMethodInformation = true;
+ # Show first input method information;
+ ShowFirstInputMethodInformation = true;
+ # Default page size;
+ DefaultPageSize = 10;
+ # Override Xkb Option;
+ OverrideXkbOption = false;
+ # Custom Xkb Option;
+ CustomXkbOption = "";
+ # Force Enabled Addons;
+ EnabledAddons = "";
+ # Force Disabled Addons;
+ DisabledAddons = "";
+ # Preload input method to be used by default;
+ PreloadInputMethod = true;
+ # Allow input method in the password field;
+ AllowInputMethodForPassword = false;
+ # Show preedit text when typing password;
+ ShowPreeditForPassword = false;
+ # Interval of saving user data in minutes;
+ AutoSavePeriod = 30;
+
+ };
+ };
+ fcitx5.settings.inputMethod = {
+ "Groups/0" = {
+ # Group Name
+ Name = "Default";
+ # Layout
+ "Default Layout" = "us";
+ # Default Input Method
+ DefaultIM = lib.mkIf cfg.chinese.input.enable "pinyin";
+ };
+ "Groups/0/Items/0" = {
+ # Name
+ Name = "keyboard-us";
+ # Layout
+ Layout = "";
+ };
+
+ "Groups/0/Items/1" = lib.mkIf cfg.chinese.input.enable {
+ # Name
+ Name = "pinyin";
+ # Layout
+ Layout = "";
+ };
+
+ "Groups/0/Items/2" = lib.mkIf cfg.spanish.input.enable {
+ # Name
+ Name = "keyboard-latam";
+ # Layout
+ Layout = "latam";
+ };
+
+ "GroupOrder" = {
+ "0" = "Default";
+ };
+
+ };
+ };
+ };
+}
diff --git a/modules/linux/location-services/default.nix b/modules/linux/location-services/default.nix
new file mode 100644
index 00000000..7ceaed0d
--- /dev/null
+++ b/modules/linux/location-services/default.nix
@@ -0,0 +1,46 @@
+{
+ config,
+ lib,
+ ...
+}:
+let
+ cfg = config.functorOS.locationServices;
+in
+{
+ options.functorOS.locationServices = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = false;
+ description = ''
+ Whether to enable all utilities powered by location services (auto timezone, etc)
+ '';
+ };
+ autoTimezone.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable;
+ description = ''
+ Whether to enable automatic timezone daemon
+ '';
+ };
+ locationBackend.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable;
+ description = ''
+ Whether to enable the underlying geoclue2 location backend. Note this
+ MUST be enabled for other locationServices options to work, BUT you
+ generally don't have to touch it as setting a blanket
+ `locationServices.enable = true` is usually the right thing for most
+ users and will enable this.
+ '';
+ };
+ };
+ config = lib.mkMerge [
+ (lib.mkIf cfg.locationBackend.enable {
+ services.geoclue2.enable = true;
+ })
+ (lib.mkIf cfg.autoTimezone.enable {
+ services.automatic-timezoned.enable = true;
+ time.timeZone = lib.mkForce null;
+ })
+ ];
+}
diff --git a/modules/linux/misc/default.nix b/modules/linux/misc/default.nix
new file mode 100644
index 00000000..91180cb4
--- /dev/null
+++ b/modules/linux/misc/default.nix
@@ -0,0 +1,147 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+let
+ cfg = config.functorOS;
+ inherit (lib) mkIf;
+in
+{
+ options.functorOS = {
+ system.printing.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = config.functorOS.enable;
+ description = ''
+ Whether to set up default options for printing and printer discover on UNIX.
+ '';
+ };
+ system.fonts.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = config.functorOS.enable;
+ description = ''
+ Whether to set up some nice default fonts, including a Nerd Font, Noto Fonts, and CJK.
+ '';
+ };
+ config.allowUnfree = lib.mkOption {
+ type = lib.types.bool;
+ default = false;
+ description = ''
+ Whether to enable some proprietary packages required by certain functorOS modules. This does not set allowUnfree for the whole system, it merely allows the installation of a few proprietary packages such as Nvidia drivers, etc. You should still set this option even if you already set nixpkgs.config.allowUnfree for the whole system since it tells functorOS it can enable certain options that require proprietary packages.
+ '';
+ };
+ config.extraUnfreePackages = lib.mkOption {
+ type = lib.types.listOf lib.types.str;
+ default = [ ];
+ description = ''
+ Packages to enable in allowUnfreePredicate
+ '';
+ };
+ flakeLocation = lib.mkOption {
+ type = lib.types.nullOr lib.types.path;
+ default = null;
+ description = ''
+ Absolute filepath location of the NixOS system configuration flake.
+ '';
+ };
+ useEnUsLocale = lib.mkOption {
+ type = lib.types.bool;
+ default = true;
+ description = "Whether to use the en_US locale automatically";
+ };
+ defaultEditor = lib.mkOption {
+ type = lib.types.nullOr lib.types.package;
+ default = pkgs.neovim;
+ description = "Default text editor that will be installed and set as $EDITOR. Set to null to disable setting and installing default text editor.";
+ };
+ formFactor = lib.mkOption {
+ type = lib.types.nullOr (
+ lib.types.enum [
+ "laptop"
+ "desktop"
+ ]
+ );
+ default = null;
+ description = ''
+ Form factor of the machine. Adjusts some UI settings.
+ '';
+ };
+ powersave = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.formFactor == "laptop";
+ description = ''
+ Whether to set some options to reduce power consumption (mostly Hyprland).
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ services.printing.enable = mkIf cfg.system.printing.enable true;
+
+ services.avahi = mkIf cfg.system.printing.enable {
+ enable = true;
+ nssmdns4 = true;
+ openFirewall = true;
+ };
+
+ fonts = mkIf cfg.system.fonts.enable {
+ enableDefaultPackages = true;
+ packages =
+ with pkgs;
+ [
+ noto-fonts-cjk-sans
+ nerd-fonts.geist-mono
+ ]
+ ++ (lib.optionals (!config.functorOS.theming.enable) [
+ noto-fonts
+ noto-fonts-color-emoji
+ nerd-fonts.caskaydia-cove
+ ]);
+ };
+
+ nixpkgs.config.allowUnfreePredicate = lib.mkIf config.functorOS.config.allowUnfree (
+ pkg:
+ builtins.elem (pkgs.lib.getName pkg) (
+ config.functorOS.config.extraUnfreePackages
+ ++ [
+ "spotify"
+ "tidal-hifi"
+ "castlabs-electron"
+ ]
+ )
+ );
+
+ environment.variables.EDITOR = lib.mkIf (
+ cfg.defaultEditor != null
+ ) cfg.defaultEditor.meta.mainProgram;
+
+ environment.systemPackages = lib.mkIf (cfg.defaultEditor != null) [ cfg.defaultEditor ];
+
+ # Select internationalisation properties.
+ i18n = lib.mkIf cfg.useEnUsLocale {
+ defaultLocale = "en_US.UTF-8";
+
+ extraLocaleSettings = {
+ LC_ADDRESS = "en_US.UTF-8";
+ LC_IDENTIFICATION = "en_US.UTF-8";
+ LC_MEASUREMENT = "en_US.UTF-8";
+ LC_MONETARY = "en_US.UTF-8";
+ LC_NAME = "en_US.UTF-8";
+ LC_NUMERIC = "en_US.UTF-8";
+ LC_PAPER = "en_US.UTF-8";
+ LC_TELEPHONE = "en_US.UTF-8";
+ LC_TIME = "en_US.UTF-8";
+ };
+ };
+
+ assertions = [
+ {
+ assertion = cfg.formFactor != null;
+ message = ''
+ You must set `functorOS.formFactor` to either "laptop" or "desktop"!
+ '';
+ }
+ ];
+ };
+}
diff --git a/modules/linux/networking/default.nix b/modules/linux/networking/default.nix
new file mode 100755
index 00000000..7e1d236c
--- /dev/null
+++ b/modules/linux/networking/default.nix
@@ -0,0 +1,106 @@
+{ lib, config, ... }:
+let
+ cfg = config.functorOS.system.networking;
+
+ universalAllowedPorts =
+ (lib.optionals cfg.firewallPresets.grimDawn [
+ 27016 # grim dawn
+ 42805 # grim dawn
+ 42852 # grim dawn
+ 42872 # grim dawn
+ 27015 # grim dawn
+ 27036 # grim dawn
+ ])
+ ++ (lib.optionals cfg.firewallPresets.vite [
+ 5173 # vite test server
+ 4173 # vite test server
+ ])
+ ++ (lib.optionals cfg.firewallPresets.terraria [
+ 7777
+ ]);
+ universalAllowedRanges = [ ];
+in
+{
+ options.functorOS.system.networking = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = config.functorOS.enable;
+ description = ''
+ Whether to enable networking features.
+ '';
+ };
+ firewallPresets = {
+ grimDawn = lib.mkEnableOption "firewall ports for Grim Dawn";
+ vite = lib.mkEnableOption "firewall ports for Vite";
+ terraria = lib.mkEnableOption "firewall ports for Terraria";
+ };
+ cloudflareNameservers.enable = lib.mkEnableOption "Cloudflare DNS servers";
+ backend = lib.mkOption {
+ type = lib.types.enum [
+ "wpa_supplicant"
+ "iwd"
+ ];
+ default = "wpa_supplicant";
+ description = ''
+ Which backend to use for networking. Default is wpa_supplicant with NetworkManager as a frontend. With iwd, iwctl is the frontend.
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ services.openssh.enable = true;
+
+ # setting these bits allows requests to the IP of Tsinghua University TUNA to bypass Mullvad VPN. Helps with binary cache speed in Mainland China.
+ networking.nftables = lib.mkIf config.functorOS.system.core.chinaOptimizations {
+ enable = true;
+ ruleset = ''
+ define EXCLUDED_IPS = {
+ 101.6.15.130,
+ 10.128.0.1
+ }
+
+ table inet excludeTraffic {
+ chain excludeOutgoing {
+ type route hook output priority 0; policy accept;
+ ip daddr $EXCLUDED_IPS ct mark set 0x00000f41 meta mark set 0x6d6f6c65;
+ }
+ }
+ '';
+ };
+
+ networking.firewall = {
+ enable = true;
+ allowedTCPPorts = universalAllowedPorts;
+ allowedUDPPorts = universalAllowedPorts;
+ allowedUDPPortRanges =
+ universalAllowedRanges
+ ++ (lib.optionals cfg.firewallPresets.grimDawn [
+ {
+ from = 27031;
+ to = 27036;
+ }
+ ]);
+ allowedTCPPortRanges = universalAllowedRanges;
+ };
+
+ networking.nameservers = lib.mkIf cfg.cloudflareNameservers.enable [
+ "1.1.1.1"
+ "1.0.0.1"
+ ];
+
+ networking.networkmanager.enable = lib.mkIf cfg.enable true;
+
+ systemd.services.NetworkManager-wait-online.enable = lib.mkIf cfg.enable false;
+
+ networking.wireless.enable = lib.mkIf (cfg.enable && cfg.backend == "iwd") false;
+
+ networking.networkmanager.wifi.backend = lib.mkIf cfg.enable cfg.backend;
+
+ networking.wireless.iwd = lib.mkIf (cfg.enable && cfg.backend == "iwd") {
+ enable = true;
+ settings.General.EnableNetworkConfiguration = true;
+ settings.Rank.BandModifier5GHz = 2.0;
+ };
+
+ };
+}
diff --git a/modules/linux/stylix/default.nix b/modules/linux/stylix/default.nix
new file mode 100644
index 00000000..49d0d09d
--- /dev/null
+++ b/modules/linux/stylix/default.nix
@@ -0,0 +1,121 @@
+{
+ pkgs,
+ config,
+ lib,
+ ...
+}:
+let
+ cfg = config.functorOS.theming;
+in
+{
+ options.functorOS.theming = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = config.functorOS.enable;
+ description = ''
+ Whether to uniformly theme the entire system using Stylix.
+ '';
+ };
+ plymouth.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = cfg.enable;
+ description = ''
+ Whether to enable plymouth and sane defaults.
+ '';
+ };
+ wallpaper = lib.mkOption {
+ type = lib.types.anything;
+ default = "../../../hm/modules/common/shellenv/fastfetch/nixos-logo.png";
+ description = ''
+ Path to wallpaper to set as background and generate system colorscehme from.
+ '';
+ };
+ polarity = lib.mkOption {
+ type = lib.types.nullOr (
+ lib.types.enum [
+ "light"
+ "dark"
+ ]
+ );
+ default = null;
+ description = ''
+ Whether to force colorscheme to be generated as light or dark theme. Set to null to automatically determine.
+ '';
+ };
+ base16Scheme = lib.mkOption {
+ type = lib.types.nullOr lib.types.path;
+ default = null;
+ description = ''
+ Base 16 colorscheme from base16-schemes to override wallpaper generated colorscheme with. Set to null to use wallpaper generated scheme.
+ Example: ''${pkgs.base16-schemes}/share/themes/rose-pine.yaml
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ stylix = {
+ enable = true;
+ image = lib.mkIf (cfg.wallpaper != null) cfg.wallpaper;
+ base16Scheme = lib.mkIf (cfg.base16Scheme != null) cfg.base16Scheme;
+ polarity = lib.mkIf (cfg.polarity != null) cfg.polarity;
+ opacity.popups = 0.8;
+
+ fonts = {
+ serif = {
+ name = "Noto Serif";
+ package = pkgs.noto-fonts;
+ };
+ sansSerif = {
+ name = "Noto Sans";
+ package = pkgs.noto-fonts;
+ };
+ emoji = {
+ name = "Noto Color Emoji";
+ package = pkgs.noto-fonts-color-emoji;
+ };
+ monospace = {
+ name = "CaskaydiaCove Nerd Font";
+ package = pkgs.nerd-fonts.caskaydia-cove;
+ };
+ };
+
+ cursor = {
+ package = pkgs.bibata-cursors;
+ name = "Bibata-Modern-Ice";
+ size = if config.functorOS.formFactor == "laptop" then 24 else 26;
+ };
+
+ targets.plymouth = {
+ enable = true;
+ logoAnimated = false;
+ logo =
+ if (config.stylix.polarity == "dark") then
+ "${pkgs.functor-systems-icons}/icons/256x256/functor-systems-dark.png"
+ else
+ "${pkgs.functor-systems-icons}/icons/256x256/functor-systems-light.png";
+ };
+ };
+
+ boot = {
+ plymouth = {
+ enable = true;
+ font = "${config.stylix.fonts.monospace.package}/share/fonts/truetype/NerdFonts/CaskaydiaCove/CaskaydiaCoveNerdFontMono-Regular.ttf";
+ };
+
+ # Enable "Silent Boot"
+ consoleLogLevel = 0;
+ initrd.verbose = false;
+ kernelParams = [
+ "quiet"
+ "splash"
+ "boot.shell_on_fail"
+ "loglevel=3"
+ "rd.systemd.show_status=false"
+ "rd.udev.log_level=3"
+ "udev.log_priority=3"
+ ];
+ initrd.systemd.enable = true;
+ };
+
+ };
+}
diff --git a/modules/linux/wine/default.nix b/modules/linux/wine/default.nix
new file mode 100644
index 00000000..11f0beeb
--- /dev/null
+++ b/modules/linux/wine/default.nix
@@ -0,0 +1,22 @@
+{
+ pkgs,
+ config,
+ lib,
+ ...
+}:
+let
+ cfg = config.functorOS.programs.wine;
+in
+{
+ options.functorOS.programs.wine.enable = lib.mkEnableOption "wine";
+
+ config = lib.mkIf cfg.enable {
+ environment.systemPackages = (
+ with pkgs;
+ [
+ winetricks
+ wineWowPackages.full
+ ]
+ );
+ };
+}
diff --git a/modules/linux/wsl/default.nix b/modules/linux/wsl/default.nix
new file mode 100644
index 00000000..1f48b378
--- /dev/null
+++ b/modules/linux/wsl/default.nix
@@ -0,0 +1,19 @@
+{
+ config,
+ lib,
+ ...
+}:
+let
+ cfg = config.functorOS.wsl;
+in
+{
+ options.functorOS.wsl = {
+ enable = lib.mkEnableOption "WSL";
+ };
+
+ config.wsl = lib.mkIf cfg.enable {
+ enable = true;
+ defaultUser = config.functorOS.username;
+ useWindowsDriver = true;
+ };
+}
diff --git a/modules/nixos/audio/default.nix b/modules/nixos/audio/default.nix
deleted file mode 100755
index 9134b211..00000000
--- a/modules/nixos/audio/default.nix
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- # Enable sound with pipewire.
- hardware.pulseaudio.enable = false;
- security.rtkit.enable = true;
- services.pipewire = {
- enable = true;
- alsa.enable = true;
- alsa.support32Bit = true;
- pulse.enable = true;
- # If you want to use JACK applications, uncomment this
- #jack.enable = true;
-
- # use the example session manager (no others are packaged yet so this is enabled by default,
- # no need to redefine it in your config for now)
- #media-session.enable = true;
- };
-}
diff --git a/modules/nixos/core/default.nix b/modules/nixos/core/default.nix
deleted file mode 100644
index 2c63c085..00000000
--- a/modules/nixos/core/default.nix
+++ /dev/null
@@ -1,2 +0,0 @@
-{
-}
diff --git a/modules/nixos/fonts/default.nix b/modules/nixos/fonts/default.nix
deleted file mode 100755
index 5cfec33e..00000000
--- a/modules/nixos/fonts/default.nix
+++ /dev/null
@@ -1,18 +0,0 @@
-{pkgs, ...}: {
- fonts = {
- enableDefaultPackages = true;
- fontconfig = {
- defaultFonts = {
- serif = ["Noto Serif"];
- sansSerif = ["Noto Sans"];
- };
- };
- packages = with pkgs; [
- noto-fonts
- noto-fonts-cjk
- noto-fonts-emoji
- (nerdfonts.override {fonts = ["CascadiaCode"];})
- (google-fonts.override {fonts = ["Lora"];})
- ];
- };
-}
diff --git a/modules/nixos/gaming/default.nix b/modules/nixos/gaming/default.nix
deleted file mode 100755
index 04329805..00000000
--- a/modules/nixos/gaming/default.nix
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- programs.steam = {
- enable = true;
- remotePlay.openFirewall = true;
- dedicatedServer.openFirewall = true;
- localNetworkGameTransfers.openFirewall = true;
- gamescopeSession.enable = true;
- };
-
- programs.gamescope.enable = true;
-
- nixpkgs.config.packageOverrides = pkgs: {
- steam = pkgs.steam.override {
- extraPkgs = pkgs:
- with pkgs; [
- xorg.libXcursor
- xorg.libXi
- xorg.libXinerama
- xorg.libXScrnSaver
- libpng
- libpulseaudio
- libvorbis
- stdenv.cc.cc.lib
- libkrb5
- (writeShellScriptBin "launch-gamescope" ''
- (sleep 1; pgrep gamescope| xargs renice -n -11 -p)&
- exec gamescope "$@"
- '')
- keyutils
- ];
- };
- };
-}
diff --git a/modules/nixos/greeter/default.nix b/modules/nixos/greeter/default.nix
deleted file mode 100644
index 840d063d..00000000
--- a/modules/nixos/greeter/default.nix
+++ /dev/null
@@ -1,22 +0,0 @@
-{pkgs, ...}: {
- services.greetd = {
- enable = true;
- settings = {
- default_session = {
- command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd Hyprland --remember --greeting 'Welcome to liminalOS. Access is restricted to authorized personnel only.'";
- user = "greeter";
- };
- };
- };
-
- systemd.services.greetd.serviceConfig = {
- Type = "idle";
- StandardInput = "tty";
- StandardOutput = "tty";
- StandardError = "journal"; # Without this errors will spam on screen
- # Without these bootlogs will spam on screen
- TTYReset = true;
- TTYVHangup = true;
- TTYVTDisallocate = true;
- };
-}
diff --git a/modules/nixos/networking/default.nix b/modules/nixos/networking/default.nix
deleted file mode 100755
index 33589a8e..00000000
--- a/modules/nixos/networking/default.nix
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- services.openssh.enable = true;
- # networking.firewall.allowedTCPPorts = [ ... ];
- # networking.firewall.allowedUDPPorts = [ ... ];
- networking.nameservers = ["1.1.1.1" "1.0.0.1"];
-}
diff --git a/overlays/default.nix b/overlays/default.nix
index 268d5f58..8e0e8d5f 100644
--- a/overlays/default.nix
+++ b/overlays/default.nix
@@ -1,7 +1,28 @@
-{inputs, ...}: {
+{
+ pkgs,
+ functorOSInputs,
+ ...
+}:
+let
+ inherit (pkgs.stdenv.hostPlatform) system;
+in
+# stablepkgs = inputs.stablepkgs.legacyPackages.${pkgs.system};
+{
nixpkgs.overlays = [
- (self: super: {
- typst-lsp = inputs.stablepkgs.legacyPackages.${self.system}.typst-lsp;
+ (import ../pkgs { inherit pkgs; })
+ (final: prev: {
+ nix-index-unwrapped = prev.nix-index-unwrapped.overrideAttrs (
+ finalAttrs: prevAttrs: {
+ src = functorOSInputs.nix-index;
+
+ cargoDeps = prev.rustPlatform.fetchCargoVendor {
+ inherit (finalAttrs) src;
+ hash = "sha256-1M8ICkju2M9CNiRoMkeUveINmF7LmeCP0vuu+haJ+kI=";
+ };
+ }
+ );
+
+ # hyprland = prev.stdenv.mkDerivation { inherit (prev.hyprland) pname version; };
})
];
}
diff --git a/pkgs/by-name/functor-systems-icons/default.nix b/pkgs/by-name/functor-systems-icons/default.nix
new file mode 100644
index 00000000..6d9af78d
--- /dev/null
+++ b/pkgs/by-name/functor-systems-icons/default.nix
@@ -0,0 +1,12 @@
+{
+ fetchFromGitHub,
+}:
+fetchFromGitHub {
+ owner = "youwen5";
+ repo = "functor.systems-identity";
+ rev = "9a04adb3b5b0d8dc089550f307aee465451aff4b";
+ sparseCheckout = [
+ "icons"
+ ];
+ hash = "sha256-0KIadapBNWzkopm5jSt6tmhpYR17STgbDRf65JSvz7s=";
+}
diff --git a/pkgs/by-name/wine-discord-ipc-bridge/default.nix b/pkgs/by-name/wine-discord-ipc-bridge/default.nix
new file mode 100644
index 00000000..77902555
--- /dev/null
+++ b/pkgs/by-name/wine-discord-ipc-bridge/default.nix
@@ -0,0 +1,36 @@
+{
+ lib,
+ stdenv,
+ wine,
+ pkgsCross,
+ fetchFromGitHub,
+}:
+stdenv.mkDerivation (finalAttrs: {
+ pname = "wine-discord-ipc-bridge";
+ version = "0.0.3";
+
+ src = fetchFromGitHub {
+ owner = "0e4ef622";
+ repo = "wine-discord-ipc-bridge";
+ rev = "v${finalAttrs.version}";
+ hash = "sha256-jzsbOKMakNQ6RNMlioX088fGzFBDxOP45Atlsfm2RKg=";
+ };
+
+ nativeBuildInputs = [
+ pkgsCross.mingw32.stdenv.cc
+ wine
+ ];
+
+ installPhase = ''
+ mkdir -p $out/bin
+ cp winediscordipcbridge.exe $out/bin
+ cp winediscordipcbridge-steam.sh $out/bin
+ '';
+
+ meta = {
+ description = "Enable games running under wine to use Discord Rich Presence";
+ homepage = "https://github.com/0e4ef622/wine-discord-ipc-bridge";
+ license = lib.licenses.mit;
+ platforms = [ "x86_64-linux" ];
+ };
+})
diff --git a/pkgs/default.nix b/pkgs/default.nix
new file mode 100644
index 00000000..f0f29690
--- /dev/null
+++ b/pkgs/default.nix
@@ -0,0 +1,8 @@
+{ pkgs, ... }:
+let
+ inherit (pkgs) callPackage;
+in
+final: prev: {
+ wine-discord-ipc-bridge = callPackage ./by-name/wine-discord-ipc-bridge { };
+ functor-systems-icons = callPackage ./by-name/functor-systems-icons { };
+}
diff --git a/templates/minimal/flake.nix b/templates/minimal/flake.nix
new file mode 100644
index 00000000..6df79f7e
--- /dev/null
+++ b/templates/minimal/flake.nix
@@ -0,0 +1,241 @@
+{
+ description = "Minimal standalone functorOS system";
+
+ inputs = {
+ # Follow the nixpkgs in functorOS, which is verified to build properly before release.
+ functorOS.url = "git+https://code.functor.systems/functor.systems/functorOS.git";
+ nixpkgs.follows = "functorOS/nixpkgs";
+
+ # Alternatively, pin your own nixpkgs and set functorOS to follow it, as shown below.
+
+ # nixpkgs.follows = "github:nixos/nixpkgs?ref=nixos-unstable";
+ # functorOS.url = "github:youwen5/functorOS";
+ # functorOS.inputs.nixpkgs.follows = "nixpkgs";
+
+ # Either way, you should ensure that functorOS shares nixpkgs with your
+ # system to avoid any weird conflicts.
+ };
+
+ outputs =
+ inputs@{
+ nixpkgs,
+ self,
+ functorOS,
+ ...
+ }:
+ let
+ functorOSLib = import functorOS {
+ inherit
+ inputs
+ self
+ nixpkgs
+ functorOS
+ ;
+ };
+ exampleUser = functorOSLib.user.instantiate {
+ # Linux username for your user
+ username = "example-user";
+
+ # Absolute path to the home directory
+ homeDirectory = "/home/example-user";
+
+ # Full name. This is really just the string provided in the
+ # `description` field of your Linux user, which is generally the user's
+ # full name.
+ fullName = "Example User";
+
+ # Email address of user
+ email = "exampleuser@functor.systems";
+
+ # If you set this to true, Git will automatically be configured with the fullName and email set above.
+ configureGitUser = true;
+
+ # IMPORTANT! You can declaratively set the initial password of your
+ # user here. The hash below corresponds to `functoros`, typed exactly
+ # like that. If you do not change it, the password of your user will be
+ # `functoros`. You may also obtain a hash for your desired password by
+ # using the `mkpasswd` shell command.
+ #
+ # After you log into your functorOS system for the first time, you can
+ # change your password as usual with the `passwd` command.
+ initialHashedPassword = "$y$j9T$lbiby1K38jJ2sHZdqMri11$ICJIc8krn9osyHPdVW3cwIoOaCiXOAFAqCeYrILMqC8";
+
+ # This is treated just like a standard `home.nix` home-manager
+ # configuration file.
+ #
+ # The comments below also provide a general overview of the features.
+ #
+ # Optionally, see for
+ # further information about NixOS and home-manager modules.
+ configuration =
+ {
+ pkgs, # standard pkgs object
+ lib, # the nixpkgs standard library
+ inputs, # the flake inputs defined above
+ config, # object that represents the final home-manager configuration
+ ...
+ }:
+ {
+ # You can set arbitrary options here. For example, if your
+ # home-manager configuration is in another file, then import it like
+ # so:
+ # imports = [
+ # ./home.nix
+ # ];
+ # Or any other option, like
+ # programs.neovim.enable = true;
+ # programs.neovim.settings = { # --snip-- };
+
+ # Let's set the home-manager state version.
+
+ # This value determines the NixOS release from which the default
+ # settings for stateful data, like file locations and database versions
+ # on your system were taken. It‘s perfectly fine and recommended to leave
+ # this value at the release version of the first install of home-manager.
+ home.stateVersion = "25.05";
+ };
+ };
+ in
+ {
+ # Execute sudo nixos-rebuild switch --flake .#functorOS
+ nixosConfigurations = {
+ # If you change your hostname, make sure to set it in both places (i.e. both of the lines below).
+ functorOS-machine = functorOSLib.system.instantiate {
+ hostname = "functorOS-machine";
+
+ # List of users generated with functorOSLib.user.instantiate.
+ users = [ exampleUser ];
+
+ # Additional system configuration.
+ #
+ # The comments below also provide a general overview of the features.
+ #
+ # Optionally, see for
+ # further information about NixOS and home-manager modules.
+ configuration =
+ {
+ pkgs, # standard pkgs object
+ lib, # the nixpkgs standard library
+ inputs, # the flake inputs defined above
+ config, # object that represents the final NixOS configuration
+ ...
+ }:
+ {
+ # This is treated just like a standard configuration.nix file.
+
+ # You can set any arbitrary NixOS options here. For example, don't
+ # forget to import hardware-configuration.nix:
+
+ # The included hardware-configuration.nix in this template is a placeholder.
+ # The system WILL NOT build until you import your own!
+
+ # You need to import your `hardware-configuration.nix`. If you don't have it,
+ # run `nixos-generate-config` and it will be automatically populated at
+ # /etc/nixos/hardware-configuration.nix.
+
+ # Simply copy that file over into the same directory as your
+ # `flake.nix`, replacing the existing placeholder file.
+ imports = [ ./hardware-configuration.nix ];
+
+ # Set up a bootloader:
+ boot = {
+ loader = {
+ efi.canTouchEfiVariables = true;
+ timeout = 15;
+ systemd-boot.enable = true;
+ };
+
+ # (optionally) Select a kernel.
+ # kernelPackages = pkgs.linuxPackages_zen;
+ };
+
+ # Make sure to set the state version of your NixOS install! Find
+ # it in your existing /etc/nixos/configuration.nix.
+
+ # This value determines the NixOS release from which the default
+ # settings for stateful data, like file locations and database versions
+ # on your system were taken. It‘s perfectly fine and recommended to leave
+ # this value at the release version of the first install of this system.
+ # Before changing this value read the documentation for this option
+ # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
+ system.stateVersion = "24.05"; # Did you read the comment?
+
+ # Other options such as
+ # hardware.graphics.enable = true
+ # work fine here too.
+
+ # -----------------------------------------------------------------------
+
+ # The functorOS option below is a special option generated by
+ # functorOS, and used to configure it.
+
+ # Don't panic! Documentation for functorOS.* system options is
+ # available at
+ functorOS = {
+ # Set this to the absolute path of the location of this configuration flake
+ # to enable some UX enhanacements
+ flakeLocation = null;
+
+ # Allow functorOS's unfree packages
+ # This option doesn't set allowUnfree for the whole system,
+ # rather, it simply allows a specifically curated list of
+ # unfree packages in functorOS
+ config.allowUnfree = false;
+
+ # Set your default editor to any program.
+ defaultEditor = pkgs.neovim;
+
+ # Set to either "laptop" or "desktop" for some adjustments
+ formFactor = "desktop";
+
+ # Set to true to use the GeoClue2 geolocation daemon to provide
+ # various location-based QoL features like automatic timezone switching
+ locationServices.enable = false;
+
+ # Set a wallpaper to whatever you want! You can use a local path as well.
+ # The colorscheme for the system is automatically generated from this
+ # wallpaper!
+ theming = {
+ wallpaper = pkgs.fetchurl {
+ url = "https://w.wallhaven.cc/full/5g/wallhaven-5g22q5.png";
+ hash = "sha256-snqkeQecU0opsBfIrnkl6aiV71hSCmqnZBAsibNG4w8=";
+ };
+ };
+ system = {
+ # Toggle true to enable audio production software, like
+ # reaper, and yabridge + 64 bit wine for installing
+ # Windows-exclusive VSTs! Also sets realtime kernel
+ # configuration and other optimizations.
+ audio.prod.enable = false;
+
+ networking = {
+ # Toggle on to allow default vite ports of 5173 and 4173 through the firewall for local testing.
+ firewallPresets.vite = false;
+ # Use cloudflare's 1.1.1.1 DNS servers.
+ cloudflareNameservers.enable = true;
+ };
+ # Set some sane defaults for nvidia graphics, like proprietary drivers.
+ # WARNING: requires functorOS.config.allowUnfree to be set to true.
+ graphics.nvidia.enable = false;
+ };
+ extras.gaming = {
+ # Enable gaming utilities, like Lutris, Steam, Prism Launcher, etc.
+ enable = false;
+ # Installs Roblox using Sober, as a flatpak. Note that this will enable
+ # the impure flatpak service that automatically updates flatpaks every
+ # week upon nixos-rebuild switch
+ roblox.enable = false;
+
+ utilities.gamemode = {
+ # Enable the gamemoderun binary to maximize gaming performance
+ enable = false;
+ # Don't forget to update this if you change your username!
+ gamemodeUsers = [ "example-user" ];
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/templates/minimal/hardware-configuration.nix b/templates/minimal/hardware-configuration.nix
new file mode 100644
index 00000000..651f14f0
--- /dev/null
+++ b/templates/minimal/hardware-configuration.nix
@@ -0,0 +1,38 @@
+# IMPORTANT: you need to replace this file!
+# ----------------------------------------------------------------
+# You need to import your `hardware-configuration.nix`. If you don't have it,
+# run `nixos-generate-config` and it will be automatically populated at
+# /etc/nixos/hardware-configuration.nix.
+
+# Simply copy that file over into the same directory as your `flake.nix`,
+# replacing this file, which is a `hardware-configuration.nix`
+# placeholder that prints this message.
+
+{
+ # Only being set so that the assertion below triggers instead.
+ nixpkgs.hostPlatform = {
+ system = "x86_64-linux";
+ };
+
+ assertions = [
+ {
+ assertion = false;
+ message = ''
+ HEY THERE! READ THIS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+ If you're seeing this message, you forgot to import your
+ `hardware-configuration.nix`. If you don't have it, run
+ `nixos-generate-config` and it will be automatically populated at
+ /etc/nixos/hardware-configuration.nix.
+
+ Simply copy that file over into the same directory as your `flake.nix`,
+ replacing this file, which is a `hardware-configuration.nix`
+ placeholder that prints this message.
+
+ IMPORTANT: You can ignore all other errors that may appear above or
+ below this message until you import your hardware-configuration.nix as
+ described above.
+ '';
+ }
+ ];
+}
diff --git a/treefmt.nix b/treefmt.nix
new file mode 100644
index 00000000..3b7c406c
--- /dev/null
+++ b/treefmt.nix
@@ -0,0 +1,16 @@
+{
+ # Used to find the project root
+ projectRootFile = "flake.nix";
+
+ programs = {
+ nixfmt.enable = true;
+ taplo.enable = true;
+ yamlfmt.enable = true;
+ prettier.enable = true;
+ };
+
+ settings.global.excludes = [
+ ".direnv/*"
+ ".envrc"
+ ];
+}
diff --git a/users/youwen/common/core.nix b/users/youwen/common/core.nix
deleted file mode 100755
index b2103c4a..00000000
--- a/users/youwen/common/core.nix
+++ /dev/null
@@ -1,181 +0,0 @@
-{pkgs, ...}: {
- home.file.".essentials" = {
- source = ./essentials;
- recursive = true;
- };
-
- programs.bash.enable = true;
- programs.nushell = {
- enable = true;
- configFile.text = ''
- $env.config = {
- edit_mode: vi,
- show_banner: false
- }
- '';
- };
-
- programs.fzf = {enable = true;};
-
- programs.git = {
- enable = true;
- userName = "Youwen Wu";
- userEmail = "youwenw@gmail.com";
- delta.enable = true;
- extraConfig = {
- init.defaultBranch = "main";
- commit.gpgsign = pkgs.lib.mkDefault "true";
- user.signingkey = "8F5E6C1AF90976CA7102917A865658ED1FE61EC3";
- };
- };
-
- programs.lazygit = {
- enable = true;
- settings = {
- git.paging = {
- colorArg = "always";
- pager = "delta --dark --paging=never";
- };
- };
- };
-
- programs.bat.enable = true;
-
- programs.ripgrep.enable = true;
-
- programs.readline = {
- enable = true;
- extraConfig = "set editing-mode vi";
- };
-
- programs.zoxide = {
- enable = true;
- # enableZshIntegration = true;
- enableFishIntegration = true;
- enableNushellIntegration = true;
- };
-
- programs.gh = {
- enable = true;
- extensions = [pkgs.github-copilot-cli];
- };
-
- programs.oh-my-posh = {
- enable = true;
- # enableZshIntegration = true;
- enableFishIntegration = true;
- enableBashIntegration = true;
- useTheme = "gruvbox";
- };
-
- programs.direnv = {
- enable = true;
- nix-direnv.enable = true;
- };
-
- programs.fish = {
- enable = true;
- shellAliases = {
- rebuild = "sudo nixos-rebuild switch";
- ls = "eza -l --icons=auto";
- };
- functions = {
- update-nixos = {
- description = "Update the system flake and attempt to build and switch to the new configuration.";
- body = ''
- cd /etc/nixos
- nix flake update
- sudo nixos-rebuild switch
- '';
- };
- };
- interactiveShellInit = ''
- fish_vi_key_bindings
- set -g fish_greeting
- oh-my-posh disable notice
- '';
- plugins = [
- {
- name = "autopair";
- src = pkgs.fetchFromGitHub {
- owner = "jorgebucaran";
- repo = "autopair.fish";
- rev = "4d1752ff5b39819ab58d7337c69220342e9de0e2";
- hash = "sha256-qt3t1iKRRNuiLWiVoiAYOu+9E7jsyECyIqZJ/oRIT1A=";
- };
- }
- {
- name = "fzf";
- src = pkgs.fetchFromGitHub {
- owner = "PatrickF1";
- repo = "fzf.fish";
- rev = "8920367cf85eee5218cc25a11e209d46e2591e7a";
- hash = "sha256-T8KYLA/r/gOKvAivKRoeqIwE2pINlxFQtZJHpOy9GMM=";
- };
- }
- {
- name = "sponge";
- src = pkgs.fetchFromGitHub {
- owner = "meaningful-ooo";
- repo = "sponge";
- rev = "384299545104d5256648cee9d8b117aaa9a6d7be";
- hash = "sha256-MdcZUDRtNJdiyo2l9o5ma7nAX84xEJbGFhAVhK+Zm1w=";
- };
- }
- {
- name = "done";
- src = pkgs.fetchFromGitHub {
- owner = "franciscolourenco";
- repo = "done";
- rev = "eb32ade85c0f2c68cbfcff3036756bbf27a4f366";
- hash = "sha256-DMIRKRAVOn7YEnuAtz4hIxrU93ULxNoQhW6juxCoh4o=";
- };
- }
- ];
- };
-
- programs.fd.enable = true;
-
- programs.btop = {
- enable = true;
- settings = {
- color_theme = "tokyo-night";
- vim_keys = true;
- theme_background = false;
- };
- };
-
- programs.eza = {
- enable = true;
- enableFishIntegration = true;
- enableBashIntegration = true;
- };
-
- programs.yazi = {
- enable = true;
- enableBashIntegration = true;
- enableFishIntegration = true;
- plugins = {
- mediainfo = pkgs.fetchFromGitHub {
- owner = "Ape";
- repo = "mediainfo.yazi";
- rev = "c69314e80f5b45fe87a0e06a10d064ed54110439";
- hash = "sha256-8xdBPdKSiwB7iRU8DJdTHY+BjfR9D3FtyVtDL9tNiy4=";
- };
- };
- settings = {
- plugin = {
- prepend_previewers = [
- {
- mime = "{image,audio,video}/*";
- run = "mediainfo";
- }
- {
- mime = "application/x-subrip";
- run = "mediainfo";
- }
- ];
- };
- };
- };
-}
diff --git a/users/youwen/common/default.nix b/users/youwen/common/default.nix
deleted file mode 100644
index d6379e7e..00000000
--- a/users/youwen/common/default.nix
+++ /dev/null
@@ -1 +0,0 @@
-{imports = [./core.nix];}
diff --git a/users/youwen/common/essentials/README.md b/users/youwen/common/essentials/README.md
deleted file mode 100644
index 5d8c79db..00000000
--- a/users/youwen/common/essentials/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This place contains all of the stuff that is too hard or unwieldy to manage fully with nix, but is still useful to have ready on every system.
diff --git a/users/youwen/common/essentials/tabliss.json b/users/youwen/common/essentials/tabliss.json
deleted file mode 100644
index e594898c..00000000
--- a/users/youwen/common/essentials/tabliss.json
+++ /dev/null
@@ -1 +0,0 @@
-{"background":{"id":"default-unsplash","key":"background/unsplash","display":{"luminosity":-0.2,"blur":0}},"widget/default-time":null,"widget/default-greeting":null,"focus":false,"locale":"en","timeZone":null,"data/He0QCGvD65VV":{"messages":["There is no system but GNU, and Linux is one of its kernels."]},"widget/RuC5niQwKdxR":null,"widget/FkVDvMgaeXIG":null,"widget/LCUpMUdJn0Yf":null,"widget/He0QCGvD65VV":{"id":"He0QCGvD65VV","key":"widget/message","order":5,"display":{"position":"bottomCentre","fontFamily":"Lora","fontWeight":400}},"data/default-unsplash":{"by":"topics","collections":"","featured":false,"paused":false,"search":"","topics":"xHxYTMHLgOc","timeout":900},"widget/KNX14ZQq5_lc":{"id":"KNX14ZQq5_lc","key":"widget/css","order":2,"display":{"position":"middleCentre","fontFamily":""}},"data/y8f2hoHcUia3":{"columns":3,"links":[{"url":"https://github.com/","icon":"github"},{"url":"https://www.youtube.com/","icon":"youtube"},{"url":"https://github.com/youwen5","icon":"user"}],"visible":true,"linkOpenStyle":false},"widget/Dj61R7yvYklL":null,"widget/B_kz3lJkUxlp":null,"widget/i54ELqP74_Sv":null,"widget/yJ9fL4n4XbdH":null,"widget/rOHrlmChb_Sp":null,"widget/L8ulAGK5O_0u":{"id":"L8ulAGK5O_0u","key":"widget/literature-clock","order":1,"display":{"position":"middleCentre","fontFamily":"Lora"}},"data/KNX14ZQq5_lc":{"input":"\n.Widget .LiteratureClock {\n padding: 20px;\n background-color: rgba(0,0,0,0.1);\n border-radius: 20px;\n backdrop-filter: blur(4px);\n font-size: 1.2em;\n max-width: 800px;\n}\n\n.Widget .Message {\n margin-bottom: 60px;\n}\n\n\n.Widget {\n user-select: none;\n}\n\n.Widget .Weather {\n padding: 20px;\n}\n\n.Widget .Links {\n margin-top: 40px;\n}\n.Widget .Links a:hover {\n scale: 1.15;\n}"},"widget/MHcdYwMetd1i":null,"widget/Yvubo6Zu9lT8":null,"widget/sqbQm1Apn-Ad":null,"widget/cMOmcy4ZqrjS":null,"widget/y8f2hoHcUia3":{"id":"y8f2hoHcUia3","key":"widget/links","order":4,"display":{"position":"middleCentre"}},"widget/QmFu0MVUS_uo":null,"widget/1SHRYajLSARQ":{"id":"1SHRYajLSARQ","key":"widget/weather","order":0,"display":{"position":"topCentre","fontSize":26,"fontFamily":"Lora"}},"data/1SHRYajLSARQ":{"showDetails":false,"units":"us","latitude":37.8133523,"longitude":-122.0420157,"name":"Danville"},"version":3}
\ No newline at end of file
diff --git a/users/youwen/common/essentials/vencord-settings.json b/users/youwen/common/essentials/vencord-settings.json
deleted file mode 100644
index de2bbde8..00000000
--- a/users/youwen/common/essentials/vencord-settings.json
+++ /dev/null
@@ -1,566 +0,0 @@
-{
- "settings": {
- "autoUpdate": true,
- "autoUpdateNotification": true,
- "useQuickCss": true,
- "themeLinks": [
- "https://raw.githubusercontent.com/catppuccin/discord/main/themes/macchiato.theme.css"
- ],
- "enabledThemes": [],
- "enableReactDevtools": false,
- "frameless": false,
- "transparent": false,
- "winCtrlQ": false,
- "disableMinSize": false,
- "winNativeTitleBar": false,
- "plugins": {
- "ChatInputButtonAPI": {
- "enabled": false
- },
- "CommandsAPI": {
- "enabled": true
- },
- "MemberListDecoratorsAPI": {
- "enabled": false
- },
- "MessageAccessoriesAPI": {
- "enabled": true
- },
- "MessageDecorationsAPI": {
- "enabled": false
- },
- "MessageEventsAPI": {
- "enabled": true
- },
- "MessagePopoverAPI": {
- "enabled": false
- },
- "MessageUpdaterAPI": {
- "enabled": false
- },
- "ServerListAPI": {
- "enabled": true
- },
- "UserSettingsAPI": {
- "enabled": true
- },
- "AlwaysAnimate": {
- "enabled": true
- },
- "AlwaysTrust": {
- "enabled": true
- },
- "AnonymiseFileNames": {
- "enabled": true
- },
- "AppleMusicRichPresence": {
- "enabled": false
- },
- "WebRichPresence (arRPC)": {
- "enabled": false
- },
- "AutomodContext": {
- "enabled": false
- },
- "BANger": {
- "enabled": false
- },
- "BetterFolders": {
- "enabled": true
- },
- "BetterGifAltText": {
- "enabled": false
- },
- "BetterGifPicker": {
- "enabled": false
- },
- "BetterNotesBox": {
- "enabled": false
- },
- "BetterRoleContext": {
- "enabled": false
- },
- "BetterRoleDot": {
- "enabled": true
- },
- "BetterSessions": {
- "enabled": true
- },
- "BetterSettings": {
- "enabled": true
- },
- "BetterUploadButton": {
- "enabled": false
- },
- "BiggerStreamPreview": {
- "enabled": false
- },
- "BlurNSFW": {
- "enabled": false
- },
- "CallTimer": {
- "enabled": true
- },
- "ClearURLs": {
- "enabled": true
- },
- "ClientTheme": {
- "enabled": false
- },
- "ColorSighted": {
- "enabled": false
- },
- "ConsoleJanitor": {
- "enabled": false
- },
- "ConsoleShortcuts": {
- "enabled": false
- },
- "CopyEmojiMarkdown": {
- "enabled": false
- },
- "CopyUserURLs": {
- "enabled": true
- },
- "CrashHandler": {
- "enabled": true
- },
- "CtrlEnterSend": {
- "enabled": false
- },
- "CustomRPC": {
- "enabled": false
- },
- "CustomIdle": {
- "enabled": false
- },
- "Dearrow": {
- "enabled": false
- },
- "Decor": {
- "enabled": false
- },
- "DisableCallIdle": {
- "enabled": false
- },
- "DontRoundMyTimestamps": {
- "enabled": false
- },
- "EmoteCloner": {
- "enabled": false
- },
- "Experiments": {
- "enabled": false
- },
- "F8Break": {
- "enabled": false
- },
- "FakeNitro": {
- "enabled": false
- },
- "FakeProfileThemes": {
- "enabled": false
- },
- "FavoriteEmojiFirst": {
- "enabled": false
- },
- "FavoriteGifSearch": {
- "enabled": false
- },
- "FixCodeblockGap": {
- "enabled": false
- },
- "FixSpotifyEmbeds": {
- "enabled": false
- },
- "FixYoutubeEmbeds": {
- "enabled": false
- },
- "ForceOwnerCrown": {
- "enabled": false
- },
- "FriendInvites": {
- "enabled": false
- },
- "FriendsSince": {
- "enabled": false
- },
- "GameActivityToggle": {
- "enabled": false
- },
- "GifPaste": {
- "enabled": false
- },
- "GreetStickerPicker": {
- "enabled": false
- },
- "HideAttachments": {
- "enabled": false
- },
- "iLoveSpam": {
- "enabled": false
- },
- "IgnoreActivities": {
- "enabled": false
- },
- "ImageLink": {
- "enabled": false
- },
- "ImageZoom": {
- "enabled": false
- },
- "ImplicitRelationships": {
- "enabled": false
- },
- "InvisibleChat": {
- "enabled": false
- },
- "KeepCurrentChannel": {
- "enabled": false
- },
- "LastFMRichPresence": {
- "enabled": false
- },
- "LoadingQuotes": {
- "enabled": false
- },
- "MaskedLinkPaste": {
- "enabled": false
- },
- "MemberCount": {
- "enabled": false
- },
- "MessageClickActions": {
- "enabled": false
- },
- "MessageLatency": {
- "enabled": false
- },
- "MessageLinkEmbeds": {
- "enabled": false
- },
- "MessageLogger": {
- "enabled": false
- },
- "MessageTags": {
- "enabled": false
- },
- "MoreCommands": {
- "enabled": false
- },
- "MoreKaomoji": {
- "enabled": false
- },
- "MoreUserTags": {
- "enabled": false
- },
- "Moyai": {
- "enabled": false
- },
- "MutualGroupDMs": {
- "enabled": false
- },
- "NewGuildSettings": {
- "enabled": false
- },
- "NoBlockedMessages": {
- "enabled": false
- },
- "NoDefaultHangStatus": {
- "enabled": false
- },
- "NoDevtoolsWarning": {
- "enabled": false
- },
- "NoF1": {
- "enabled": false
- },
- "NoMosaic": {
- "enabled": false
- },
- "NoOnboardingDelay": {
- "enabled": false
- },
- "NoPendingCount": {
- "enabled": false
- },
- "NoProfileThemes": {
- "enabled": false
- },
- "NoReplyMention": {
- "enabled": false
- },
- "NoScreensharePreview": {
- "enabled": false
- },
- "NoServerEmojis": {
- "enabled": false
- },
- "NoTypingAnimation": {
- "enabled": false
- },
- "NoUnblockToJump": {
- "enabled": false
- },
- "NormalizeMessageLinks": {
- "enabled": false
- },
- "NotificationVolume": {
- "enabled": false
- },
- "NSFWGateBypass": {
- "enabled": false
- },
- "OnePingPerDM": {
- "enabled": false
- },
- "oneko": {
- "enabled": false
- },
- "OpenInApp": {
- "enabled": false
- },
- "OverrideForumDefaults": {
- "enabled": false
- },
- "PartyMode": {
- "enabled": false
- },
- "PauseInvitesForever": {
- "enabled": false
- },
- "PermissionFreeWill": {
- "enabled": false
- },
- "PermissionsViewer": {
- "enabled": false
- },
- "petpet": {
- "enabled": false
- },
- "PictureInPicture": {
- "enabled": false
- },
- "PinDMs": {
- "enabled": false
- },
- "PlainFolderIcon": {
- "enabled": false
- },
- "PlatformIndicators": {
- "enabled": false
- },
- "PreviewMessage": {
- "enabled": false
- },
- "PronounDB": {
- "enabled": false
- },
- "QuickMention": {
- "enabled": false
- },
- "QuickReply": {
- "enabled": false
- },
- "ReactErrorDecoder": {
- "enabled": false
- },
- "ReadAllNotificationsButton": {
- "enabled": true
- },
- "RelationshipNotifier": {
- "enabled": false
- },
- "ReplaceGoogleSearch": {
- "enabled": false
- },
- "ReplyTimestamp": {
- "enabled": false
- },
- "RevealAllSpoilers": {
- "enabled": false
- },
- "ReverseImageSearch": {
- "enabled": false
- },
- "ReviewDB": {
- "enabled": false
- },
- "RoleColorEverywhere": {
- "enabled": false
- },
- "SearchReply": {
- "enabled": false
- },
- "SecretRingToneEnabler": {
- "enabled": false
- },
- "Summaries": {
- "enabled": false
- },
- "SendTimestamps": {
- "enabled": false
- },
- "ServerInfo": {
- "enabled": false
- },
- "ServerListIndicators": {
- "enabled": false
- },
- "ShikiCodeblocks": {
- "enabled": false
- },
- "ShowAllMessageButtons": {
- "enabled": false
- },
- "ShowAllRoles": {
- "enabled": false
- },
- "ShowConnections": {
- "enabled": false
- },
- "ShowHiddenChannels": {
- "enabled": true
- },
- "ShowHiddenThings": {
- "enabled": true
- },
- "ShowMeYourName": {
- "enabled": false
- },
- "ShowTimeoutDuration": {
- "enabled": false
- },
- "SilentMessageToggle": {
- "enabled": false
- },
- "SilentTyping": {
- "enabled": false
- },
- "SortFriendRequests": {
- "enabled": false
- },
- "SpotifyControls": {
- "enabled": true
- },
- "SpotifyCrack": {
- "enabled": false
- },
- "SpotifyShareCommands": {
- "enabled": false
- },
- "StartupTimings": {
- "enabled": false
- },
- "StreamerModeOnStream": {
- "enabled": false
- },
- "SuperReactionTweaks": {
- "enabled": false
- },
- "TextReplace": {
- "enabled": false
- },
- "ThemeAttributes": {
- "enabled": false
- },
- "TimeBarAllActivities": {
- "enabled": false
- },
- "Translate": {
- "enabled": false
- },
- "TypingIndicator": {
- "enabled": false
- },
- "TypingTweaks": {
- "enabled": false
- },
- "Unindent": {
- "enabled": false
- },
- "UnlockedAvatarZoom": {
- "enabled": false
- },
- "UnsuppressEmbeds": {
- "enabled": false
- },
- "UserVoiceShow": {
- "enabled": false
- },
- "USRBG": {
- "enabled": false
- },
- "ValidReply": {
- "enabled": false
- },
- "ValidUser": {
- "enabled": false
- },
- "VoiceChatDoubleClick": {
- "enabled": false
- },
- "VcNarrator": {
- "enabled": false
- },
- "VencordToolbox": {
- "enabled": false
- },
- "ViewIcons": {
- "enabled": false
- },
- "ViewRaw": {
- "enabled": false
- },
- "VoiceDownload": {
- "enabled": false
- },
- "VoiceMessages": {
- "enabled": false
- },
- "WebKeybinds": {
- "enabled": true
- },
- "WebScreenShareFixes": {
- "enabled": true
- },
- "WhoReacted": {
- "enabled": false
- },
- "XSOverlay": {
- "enabled": false
- },
- "NoTrack": {
- "enabled": true,
- "disableAnalytics": true
- },
- "WebContextMenus": {
- "enabled": true,
- "addBack": true
- },
- "Settings": {
- "enabled": true,
- "settingsLocation": "aboveNitro"
- },
- "SupportHelper": {
- "enabled": true
- },
- "YoutubeAdblock": {
- "enabled": true
- }
- },
- "notifications": {
- "timeout": 5000,
- "position": "bottom-right",
- "useNative": "not-focused",
- "logLimit": 50
- },
- "cloud": {
- "authenticated": false,
- "url": "https://api.vencord.dev/",
- "settingsSync": false,
- "settingsSyncVersion": 1722547675778
- }
- },
- "quickCss": ""
-}
\ No newline at end of file
diff --git a/users/youwen/common/neofetch.conf.alternate b/users/youwen/common/neofetch.conf.alternate
deleted file mode 100644
index 833b4376..00000000
--- a/users/youwen/common/neofetch.conf.alternate
+++ /dev/null
@@ -1,828 +0,0 @@
-# See this wiki page for more info:
-# https://github.com/dylanaraps/neofetch/wiki/Customizing-Info
-print_info() {
-
- # prin " $(color 6) コンピューター"
- prin "$(color 16)┌──────────────────────────────────────────┐"
-
- info " $(color 1) OS " distro
- info " $(color 1) Host " model
- info " $(color 1) Kernel " kernel
- # info " $(color 1) Uptime " uptime
- info " $(color 2) Packages " packages
- info " $(color 2) Shell " shell
- info " $(color 2) Resolution " resolution
- info " $(color 3) DE " de
- # info " $(color 3) 缾WM " wm
- # info " $(color 12) WM Theme " wm_theme
- # info "$(color 13) Theme " theme
- # info "$(color 14) Icons " icons
- info " $(color 3) Terminal " term
- # info " Font " font
- # info " Terminal Font " term_font
-
- prin "$(color 16)└──────────────────────────────────────────┘"
- prin " "
- info " $(color 6) " title
- prin "$(color 16)┌──────────────────────────────────────────┐"
-
- info " $(color 12) CPU " cpu
- info " $(color 12) GPU " gpu
- info " $(color 13) GPU Driver " gpu_driver # Linux/macOS only
- info " $(color 13) Memory " memory
-
- # info "CPU Usage" cpu_usage
- # info "Disk" disk
- # info "Battery" battery
- # info "Song" song
- # [[ "$player" ]] && prin "Music Player" "$player"
- # info "Local IP" local_ip
- # info "Public IP" public_ip
- # info "Users" users
- # info "Locale" locale # This only works on glibc systems.
-
- prin "$(color 16)└──────────────────────────────────────────┘"
- prin " "
- prin " $(color 1) $(color 2) $(color 3) $(color 4) $(color 5) $(color 6) $(color 7) $(color 8) $(color 16)"
-
-}
-
-# Title
-
-# Hide/Show Fully qualified domain name.
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --title_fqdn
-title_fqdn="off"
-
-# Kernel
-
-# Shorten the output of the kernel function.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --kernel_shorthand
-# Supports: Everything except *BSDs (except PacBSD and PC-BSD)
-#
-# Example:
-# on: '4.8.9-1-ARCH'
-# off: 'Linux 4.8.9-1-ARCH'
-kernel_shorthand="false"
-
-# Distro
-
-# Shorten the output of the distro function
-#
-# Default: 'off'
-# Values: 'on', 'tiny', 'off'
-# Flag: --distro_shorthand
-# Supports: Everything except Windows and Haiku
-distro_shorthand="on"
-
-# Show/Hide OS Architecture.
-# Show 'x86_64', 'x86' and etc in 'Distro:' output.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --os_arch
-#
-# Example:
-# on: 'Arch Linux x86_64'
-# off: 'Arch Linux'
-os_arch="on"
-
-# Uptime
-
-# Shorten the output of the uptime function
-#
-# Default: 'on'
-# Values: 'on', 'tiny', 'off'
-# Flag: --uptime_shorthand
-#
-# Example:
-# on: '2 days, 10 hours, 3 mins'
-# tiny: '2d 10h 3m'
-# off: '2 days, 10 hours, 3 minutes'
-uptime_shorthand="on"
-
-# Memory
-
-# Show memory pecentage in output.
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --memory_percent
-#
-# Example:
-# on: '1801MiB / 7881MiB (22%)'
-# off: '1801MiB / 7881MiB'
-memory_percent="off"
-
-# Change memory output unit.
-#
-# Default: 'mib'
-# Values: 'kib', 'mib', 'gib'
-# Flag: --memory_unit
-#
-# Example:
-# kib '1020928KiB / 7117824KiB'
-# mib '1042MiB / 6951MiB'
-# gib: ' 0.98GiB / 6.79GiB'
-memory_unit="mib"
-
-# Packages
-
-# Show/Hide Package Manager names.
-#
-# Default: 'tiny'
-# Values: 'on', 'tiny' 'off'
-# Flag: --package_managers
-#
-# Example:
-# on: '998 (pacman), 8 (flatpak), 4 (snap)'
-# tiny: '908 (pacman, flatpak, snap)'
-# off: '908'
-package_managers="tiny"
-
-# Shell
-
-# Show the path to $SHELL
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --shell_path
-#
-# Example:
-# on: '/bin/bash'
-# off: 'bash'
-shell_path="off"
-
-# Show $SHELL version
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --shell_version
-#
-# Example:
-# on: 'bash 4.4.5'
-# off: 'bash'
-shell_version="on"
-
-# CPU
-
-# CPU speed type
-#
-# Default: 'bios_limit'
-# Values: 'scaling_cur_freq', 'scaling_min_freq', 'scaling_max_freq', 'bios_limit'.
-# Flag: --speed_type
-# Supports: Linux with 'cpufreq'
-# NOTE: Any file in '/sys/devices/system/cpu/cpu0/cpufreq' can be used as a value.
-speed_type="bios_limit"
-
-# CPU speed shorthand
-#
-# Default: 'off'
-# Values: 'on', 'off'.
-# Flag: --speed_shorthand
-# NOTE: This flag is not supported in systems with CPU speed less than 1 GHz
-#
-# Example:
-# on: 'i7-6500U (4) @ 3.1GHz'
-# off: 'i7-6500U (4) @ 3.100GHz'
-speed_shorthand="off"
-
-# Enable/Disable CPU brand in output.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --cpu_brand
-#
-# Example:
-# on: 'Intel i7-6500U'
-# off: 'i7-6500U (4)'
-cpu_brand="on"
-
-# CPU Speed
-# Hide/Show CPU speed.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --cpu_speed
-#
-# Example:
-# on: 'Intel i7-6500U (4) @ 3.1GHz'
-# off: 'Intel i7-6500U (4)'
-cpu_speed="on"
-
-# CPU Cores
-# Display CPU cores in output
-#
-# Default: 'logical'
-# Values: 'logical', 'physical', 'off'
-# Flag: --cpu_cores
-# Support: 'physical' doesn't work on BSD.
-#
-# Example:
-# logical: 'Intel i7-6500U (4) @ 3.1GHz' (All virtual cores)
-# physical: 'Intel i7-6500U (2) @ 3.1GHz' (All physical cores)
-# off: 'Intel i7-6500U @ 3.1GHz'
-cpu_cores="logical"
-
-# CPU Temperature
-# Hide/Show CPU temperature.
-# Note the temperature is added to the regular CPU function.
-#
-# Default: 'off'
-# Values: 'C', 'F', 'off'
-# Flag: --cpu_temp
-# Supports: Linux, BSD
-# NOTE: For FreeBSD and NetBSD-based systems, you'll need to enable
-# coretemp kernel module. This only supports newer Intel processors.
-#
-# Example:
-# C: 'Intel i7-6500U (4) @ 3.1GHz [27.2°C]'
-# F: 'Intel i7-6500U (4) @ 3.1GHz [82.0°F]'
-# off: 'Intel i7-6500U (4) @ 3.1GHz'
-cpu_temp="off"
-
-# GPU
-
-# Enable/Disable GPU Brand
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --gpu_brand
-#
-# Example:
-# on: 'AMD HD 7950'
-# off: 'HD 7950'
-gpu_brand="on"
-
-# Which GPU to display
-#
-# Default: 'all'
-# Values: 'all', 'dedicated', 'integrated'
-# Flag: --gpu_type
-# Supports: Linux
-#
-# Example:
-# all:
-# GPU1: AMD HD 7950
-# GPU2: Intel Integrated Graphics
-#
-# dedicated:
-# GPU1: AMD HD 7950
-#
-# integrated:
-# GPU1: Intel Integrated Graphics
-gpu_type="all"
-
-# Resolution
-
-# Display refresh rate next to each monitor
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --refresh_rate
-# Supports: Doesn't work on Windows.
-#
-# Example:
-# on: '1920x1080 @ 60Hz'
-# off: '1920x1080'
-refresh_rate="off"
-
-# Gtk Theme / Icons / Font
-
-# Shorten output of GTK Theme / Icons / Font
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --gtk_shorthand
-#
-# Example:
-# on: 'Numix, Adwaita'
-# off: 'Numix [GTK2], Adwaita [GTK3]'
-gtk_shorthand="off"
-
-# Enable/Disable gtk2 Theme / Icons / Font
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --gtk2
-#
-# Example:
-# on: 'Numix [GTK2], Adwaita [GTK3]'
-# off: 'Adwaita [GTK3]'
-gtk2="on"
-
-# Enable/Disable gtk3 Theme / Icons / Font
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --gtk3
-#
-# Example:
-# on: 'Numix [GTK2], Adwaita [GTK3]'
-# off: 'Numix [GTK2]'
-gtk3="on"
-
-# IP Address
-
-# Website to ping for the public IP
-#
-# Default: 'http://ident.me'
-# Values: 'url'
-# Flag: --ip_host
-public_ip_host="http://ident.me"
-
-# Public IP timeout.
-#
-# Default: '2'
-# Values: 'int'
-# Flag: --ip_timeout
-public_ip_timeout=2
-
-# Desktop Environment
-
-# Show Desktop Environment version
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --de_version
-de_version="on"
-
-# Disk
-
-# Which disks to display.
-# The values can be any /dev/sdXX, mount point or directory.
-# NOTE: By default we only show the disk info for '/'.
-#
-# Default: '/'
-# Values: '/', '/dev/sdXX', '/path/to/drive'.
-# Flag: --disk_show
-#
-# Example:
-# disk_show=('/' '/dev/sdb1'):
-# 'Disk (/): 74G / 118G (66%)'
-# 'Disk (/mnt/Videos): 823G / 893G (93%)'
-#
-# disk_show=('/'):
-# 'Disk (/): 74G / 118G (66%)'
-#
-disk_show=('/')
-
-# Disk subtitle.
-# What to append to the Disk subtitle.
-#
-# Default: 'mount'
-# Values: 'mount', 'name', 'dir', 'none'
-# Flag: --disk_subtitle
-#
-# Example:
-# name: 'Disk (/dev/sda1): 74G / 118G (66%)'
-# 'Disk (/dev/sdb2): 74G / 118G (66%)'
-#
-# mount: 'Disk (/): 74G / 118G (66%)'
-# 'Disk (/mnt/Local Disk): 74G / 118G (66%)'
-# 'Disk (/mnt/Videos): 74G / 118G (66%)'
-#
-# dir: 'Disk (/): 74G / 118G (66%)'
-# 'Disk (Local Disk): 74G / 118G (66%)'
-# 'Disk (Videos): 74G / 118G (66%)'
-#
-# none: 'Disk: 74G / 118G (66%)'
-# 'Disk: 74G / 118G (66%)'
-# 'Disk: 74G / 118G (66%)'
-disk_subtitle="mount"
-
-# Disk percent.
-# Show/Hide disk percent.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --disk_percent
-#
-# Example:
-# on: 'Disk (/): 74G / 118G (66%)'
-# off: 'Disk (/): 74G / 118G'
-disk_percent="on"
-
-# Song
-
-# Manually specify a music player.
-#
-# Default: 'auto'
-# Values: 'auto', 'player-name'
-# Flag: --music_player
-#
-# Available values for 'player-name':
-#
-# amarok
-# audacious
-# banshee
-# bluemindo
-# clementine
-# cmus
-# deadbeef
-# deepin-music
-# dragon
-# elisa
-# exaile
-# gnome-music
-# gmusicbrowser
-# gogglesmm
-# guayadeque
-# io.elementary.music
-# iTunes
-# juk
-# lollypop
-# mocp
-# mopidy
-# mpd
-# muine
-# netease-cloud-music
-# olivia
-# playerctl
-# pogo
-# pragha
-# qmmp
-# quodlibet
-# rhythmbox
-# sayonara
-# smplayer
-# spotify
-# strawberry
-# tauonmb
-# tomahawk
-# vlc
-# xmms2d
-# xnoise
-# yarock
-music_player="auto"
-
-# Format to display song information.
-#
-# Default: '%artist% - %album% - %title%'
-# Values: '%artist%', '%album%', '%title%'
-# Flag: --song_format
-#
-# Example:
-# default: 'Song: Jet - Get Born - Sgt Major'
-song_format="%artist% - %album% - %title%"
-
-# Print the Artist, Album and Title on separate lines
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --song_shorthand
-#
-# Example:
-# on: 'Artist: The Fratellis'
-# 'Album: Costello Music'
-# 'Song: Chelsea Dagger'
-#
-# off: 'Song: The Fratellis - Costello Music - Chelsea Dagger'
-song_shorthand="off"
-
-# 'mpc' arguments (specify a host, password etc).
-#
-# Default: ''
-# Example: mpc_args=(-h HOST -P PASSWORD)
-mpc_args=()
-
-# Text Colors
-
-# Text Colors
-#
-# Default: 'distro'
-# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num'
-# Flag: --colors
-#
-# Each number represents a different part of the text in
-# this order: 'title', '@', 'underline', 'subtitle', 'colon', 'info'
-#
-# Example:
-# colors=(distro) - Text is colored based on Distro colors.
-# colors=(4 6 1 8 8 6) - Text is colored in the order above.
-colors=(distro)
-
-# Text Options
-
-# Toggle bold text
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --bold
-bold="on"
-
-# Enable/Disable Underline
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --underline
-underline_enabled="on"
-
-# Underline character
-#
-# Default: '-'
-# Values: 'string'
-# Flag: --underline_char
-underline_char="-"
-
-# Info Separator
-# Replace the default separator with the specified string.
-#
-# Default: ':'
-# Flag: --separator
-#
-# Example:
-# separator="->": 'Shell-> bash'
-# separator=" =": 'WM = dwm'
-separator=":"
-
-# Color Blocks
-
-# Color block range
-# The range of colors to print.
-#
-# Default: '0', '15'
-# Values: 'num'
-# Flag: --block_range
-#
-# Example:
-#
-# Display colors 0-7 in the blocks. (8 colors)
-# neofetch --block_range 0 7
-#
-# Display colors 0-15 in the blocks. (16 colors)
-# neofetch --block_range 0 15
-block_range=(0 15)
-
-# Toggle color blocks
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --color_blocks
-color_blocks="on"
-
-# Color block width in spaces
-#
-# Default: '3'
-# Values: 'num'
-# Flag: --block_width
-block_width=3
-
-# Color block height in lines
-#
-# Default: '1'
-# Values: 'num'
-# Flag: --block_height
-block_height=1
-
-# Color Alignment
-#
-# Default: 'auto'
-# Values: 'auto', 'num'
-# Flag: --col_offset
-#
-# Number specifies how far from the left side of the terminal (in spaces) to
-# begin printing the columns, in case you want to e.g. center them under your
-# text.
-# Example:
-# col_offset="auto" - Default behavior of neofetch
-# col_offset=7 - Leave 7 spaces then print the colors
-col_offset="auto"
-
-# Progress Bars
-
-# Bar characters
-#
-# Default: '-', '='
-# Values: 'string', 'string'
-# Flag: --bar_char
-#
-# Example:
-# neofetch --bar_char 'elapsed' 'total'
-# neofetch --bar_char '-' '='
-bar_char_elapsed="-"
-bar_char_total="="
-
-# Toggle Bar border
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --bar_border
-bar_border="on"
-
-# Progress bar length in spaces
-# Number of chars long to make the progress bars.
-#
-# Default: '15'
-# Values: 'num'
-# Flag: --bar_length
-bar_length=15
-
-# Progress bar colors
-# When set to distro, uses your distro's logo colors.
-#
-# Default: 'distro', 'distro'
-# Values: 'distro', 'num'
-# Flag: --bar_colors
-#
-# Example:
-# neofetch --bar_colors 3 4
-# neofetch --bar_colors distro 5
-bar_color_elapsed="distro"
-bar_color_total="distro"
-
-# Info display
-# Display a bar with the info.
-#
-# Default: 'off'
-# Values: 'bar', 'infobar', 'barinfo', 'off'
-# Flags: --cpu_display
-# --memory_display
-# --battery_display
-# --disk_display
-#
-# Example:
-# bar: '[---=======]'
-# infobar: 'info [---=======]'
-# barinfo: '[---=======] info'
-# off: 'info'
-cpu_display="off"
-memory_display="off"
-battery_display="off"
-disk_display="off"
-
-# Backend Settings
-
-# Image backend.
-#
-# Default: 'ascii'
-# Values: 'ascii', 'caca', 'chafa', 'jp2a', 'iterm2', 'off',
-# 'pot', 'termpix', 'pixterm', 'tycat', 'w3m', 'kitty'
-# Flag: --backend
-image_backend="kitty"
-
-# Image Source
-#
-# Which image or ascii file to display.
-#
-# Default: 'auto'
-# Values: 'auto', 'ascii', 'wallpaper', '/path/to/img', '/path/to/ascii', '/path/to/dir/'
-# 'command output (neofetch --ascii "$(fortune | cowsay -W 30)")'
-# Flag: --source
-#
-# NOTE: 'auto' will pick the best image source for whatever image backend is used.
-# In ascii mode, distro ascii art will be used and in an image mode, your
-# wallpaper will be used.
-# image_source=$(find "${XDG_CONFIG_HOME:-$HOME/.config}/neofetch/pngs/" -name "*.png" | sort -R | head -1)
-
-# Ascii Options
-
-# Ascii distro
-# Which distro's ascii art to display.
-#
-# Default: 'auto'
-# Values: 'auto', 'distro_name'
-# Flag: --ascii_distro
-# NOTE: AIX, Alpine, Anarchy, Android, Antergos, antiX, "AOSC OS",
-# "AOSC OS/Retro", Apricity, ArcoLinux, ArchBox, ARCHlabs,
-# ArchStrike, XFerience, ArchMerge, Arch, Artix, Arya, Bedrock,
-# Bitrig, BlackArch, BLAG, BlankOn, BlueLight, bonsai, BSD,
-# BunsenLabs, Calculate, Carbs, CentOS, Chakra, ChaletOS,
-# Chapeau, Chrom*, Cleanjaro, ClearOS, Clear_Linux, Clover,
-# Condres, Container_Linux, CRUX, Cucumber, Debian, Deepin,
-# DesaOS, Devuan, DracOS, DarkOs, DragonFly, Drauger, Elementary,
-# EndeavourOS, Endless, EuroLinux, Exherbo, Fedora, Feren, FreeBSD,
-# FreeMiNT, Frugalware, Funtoo, GalliumOS, Garuda, Gentoo, Pentoo,
-# gNewSense, GNOME, GNU, GoboLinux, Grombyang, Guix, Haiku, Huayra,
-# Hyperbola, janus, Kali, KaOS, KDE_neon, Kibojoe, Kogaion,
-# Korora, KSLinux, Kubuntu, LEDE, LFS, Linux_Lite,
-# LMDE, Lubuntu, Lunar, macos, Mageia, MagpieOS, Mandriva,
-# Manjaro, Maui, Mer, Minix, LinuxMint, MX_Linux, Namib,
-# Neptune, NetBSD, Netrunner, Nitrux, NixOS, Nurunner,
-# NuTyX, OBRevenge, OpenBSD, openEuler, OpenIndiana, openmamba,
-# OpenMandriva, OpenStage, OpenWrt, osmc, Oracle, OS Elbrus, PacBSD,
-# Parabola, Pardus, Parrot, Parsix, TrueOS, PCLinuxOS, Peppermint,
-# popos, Porteus, PostMarketOS, Proxmox, Puppy, PureOS, Qubes, Radix,
-# Raspbian, Reborn_OS, Redstar, Redcore, Redhat, Refracted_Devuan,
-# Regata, Rosa, sabotage, Sabayon, Sailfish, SalentOS, Scientific,
-# Septor, SereneLinux, SharkLinux, Siduction, Slackware, SliTaz,
-# SmartOS, Solus, Source_Mage, Sparky, Star, SteamOS, SunOS,
-# openSUSE_Leap, openSUSE_Tumbleweed, openSUSE, SwagArch, Tails,
-# Trisquel, Ubuntu-Budgie, Ubuntu-GNOME, Ubuntu-MATE, Ubuntu-Studio,
-# Ubuntu, Venom, Void, Obarun, windows10, Windows7, Xubuntu, Zorin,
-# and IRIX have ascii logos
-# NOTE: Arch, Ubuntu, Redhat, and Dragonfly have 'old' logo variants.
-# Use '{distro name}_old' to use the old logos.
-# NOTE: Ubuntu has flavor variants.
-# Change this to Lubuntu, Kubuntu, Xubuntu, Ubuntu-GNOME,
-# Ubuntu-Studio, Ubuntu-Mate or Ubuntu-Budgie to use the flavors.
-# NOTE: Arcolinux, Dragonfly, Fedora, Alpine, Arch, Ubuntu,
-# CRUX, Debian, Gentoo, FreeBSD, Mac, NixOS, OpenBSD, android,
-# Antrix, CentOS, Cleanjaro, ElementaryOS, GUIX, Hyperbola,
-# Manjaro, MXLinux, NetBSD, Parabola, POP_OS, PureOS,
-# Slackware, SunOS, LinuxLite, OpenSUSE, Raspbian,
-# postmarketOS, and Void have a smaller logo variant.
-# Use '{distro name}_small' to use the small variants.
-ascii_distro="auto"
-
-# Ascii Colors
-#
-# Default: 'distro'
-# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num'
-# Flag: --ascii_colors
-#
-# Example:
-# ascii_colors=(distro) - Ascii is colored based on Distro colors.
-# ascii_colors=(4 6 1 8 8 6) - Ascii is colored using these colors.
-ascii_colors=(distro)
-
-# Bold ascii logo
-# Whether or not to bold the ascii logo.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --ascii_bold
-ascii_bold="on"
-
-# Image Options
-
-# Image loop
-# Setting this to on will make neofetch redraw the image constantly until
-# Ctrl+C is pressed. This fixes display issues in some terminal emulators.
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --loop
-image_loop="off"
-
-# Thumbnail directory
-#
-# Default: '~/.cache/thumbnails/neofetch'
-# Values: 'dir'
-thumbnail_dir="${XDG_CACHE_HOME:-${HOME}/.cache}/thumbnails/neofetch"
-
-# Crop mode
-#
-# Default: 'normal'
-# Values: 'normal', 'fit', 'fill'
-# Flag: --crop_mode
-#
-# See this wiki page to learn about the fit and fill options.
-# https://github.com/dylanaraps/neofetch/wiki/What-is-Waifu-Crop%3F
-crop_mode="normal"
-
-# Crop offset
-# Note: Only affects 'normal' crop mode.
-#
-# Default: 'center'
-# Values: 'northwest', 'north', 'northeast', 'west', 'center'
-# 'east', 'southwest', 'south', 'southeast'
-# Flag: --crop_offset
-crop_offset="northwest"
-
-# Image size
-# The image is half the terminal width by default.
-#
-# Default: 'auto'
-# Values: 'auto', '00px', '00%', 'none'
-# Flags: --image_size
-# --size
-image_size="270px"
-
-# Gap between image and text
-#
-# Default: '3'
-# Values: 'num', '-num'
-# Flag: --gap
-gap=8
-
-# Image offsets
-# Only works with the w3m backend.
-#
-# Default: '0'
-# Values: 'px'
-# Flags: --xoffset
-# --yoffset
-yoffset=0
-xoffset=2
-
-# Image background color
-# Only works with the w3m backend.
-#
-# Default: ''
-# Values: 'color', 'blue'
-# Flag: --bg_color
-background_color=
-
-# Misc Options
-
-# Stdout mode
-# Turn off all colors and disables image backend (ASCII/Image).
-# Useful for piping into another command.
-# Default: 'off'
-# Values: 'on', 'off'
-stdout="off"
diff --git a/users/youwen/common/neofetch/asahi-only.nix b/users/youwen/common/neofetch/asahi-only.nix
deleted file mode 100644
index a3eefd14..00000000
--- a/users/youwen/common/neofetch/asahi-only.nix
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- home.file.".config/neofetch/config.conf".source = ./neofetch-asahi.conf;
-}
diff --git a/users/youwen/common/neofetch/default.nix b/users/youwen/common/neofetch/default.nix
deleted file mode 100644
index e1cb11bd..00000000
--- a/users/youwen/common/neofetch/default.nix
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- home.file.".config/neofetch/config.conf".source = ./neofetch.conf;
-}
diff --git a/users/youwen/common/neofetch/neofetch-asahi.conf b/users/youwen/common/neofetch/neofetch-asahi.conf
deleted file mode 100644
index b9e9bfe0..00000000
--- a/users/youwen/common/neofetch/neofetch-asahi.conf
+++ /dev/null
@@ -1,864 +0,0 @@
-# Source: https://github.com/Chick2D/neofetch-themes/
-
-# Made by https://github.com/HimDek/ (HimDek)
-# A matching oh-my-zsh theme: https://github.com/HimDek/Acenoster-ZSH-Theme/
-
-# Customization Wiki https://github.com/dylanaraps/neofetch/wiki/Customizing-Info
-
-print_info() {
- prin " "
- info " " title
- prin " "
- info "${cl2} ╭─" distro
- info "${cl2} ├─" kernel
- # info "${cl2} ├─" users
- info "${cl2} ├─" packages
- info "${cl2} ╰─" shell
- echo
- info "${cl6} ╭─" de
- info "${cl6} ├─" term
- info "${cl6} ╰─" term_font
- echo
- info "${cl4} ╭─" model
- info "${cl4} ├─" cpu
- # info "${cl4} ├─" gpu
- prin "${cl4} ├─ ${cl0} Apple Neural Engine"
- info "${cl4} ├─" gpu_driver
- info "${cl4} ├─" resolution
- info "${cl4} ├─" memory
- # info "${cl4} ├─ ${cl0}" disk
-# info "${cl4} ├─ ${cl0} " battery
- # info "${cl4} ╰─" uptime
- info "${cl4} ╰─ ${cl0}" disk
-
- # prin " "
- # prin " \n \n \n \n \n \n ${cl3} \n \n ${cl5} \n \n ${cl2} \n \n ${cl6} \n \n ${cl4} \n \n ${cl1} \n \n ${cl7} \n \n ${cl0} \n "
-
-}
-
-##--------- Title
-
-# Hide/Show Fully qualified domain name.
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --title_fqdn
-title_fqdn="on"
-
-
-##--------- Kernel
-
-# Shorten the output of the kernel function.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --kernel_shorthand
-# Supports: Everything except *BSDs (except PacBSD and PC-BSD)
-#
-# Example:
-# on: '4.8.9-1-ARCH'
-# off: 'Linux 4.8.9-1-ARCH'
-kernel_shorthand="off"
-
-
-##--------- Distro
-
-# Shorten the output of the distro function
-#
-# Default: 'off'
-# Values: 'on', 'tiny', 'off'
-# Flag: --distro_shorthand
-# Supports: Everything except Windows and Haiku
-distro_shorthand="on"
-
-# Show/Hide OS Architecture.
-# Show 'x86_64', 'x86' and etc in 'Distro:' output.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --os_arch
-#
-# Example:
-# on: 'Arch Linux x86_64'
-# off: 'Arch Linux'
-os_arch="on"
-
-
-##--------- Uptime
-
-# Shorten the output of the uptime function
-#
-# Default: 'on'
-# Values: 'on', 'tiny', 'off'
-# Flag: --uptime_shorthand
-#
-# Example:
-# on: '2 days, 10 hours, 3 mins'
-# tiny: '2d 10h 3m'
-# off: '2 days, 10 hours, 3 minutes'
-uptime_shorthand="on"
-
-
-##--------- Memory
-
-# Show memory pecentage in output.
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --memory_percent
-#
-# Example:
-# on: '1801MiB / 7881MiB (22%)'
-# off: '1801MiB / 7881MiB'
-memory_percent="on"
-
-# Change memory output unit.
-#
-# Default: 'mib'
-# Values: 'kib', 'mib', 'gib'
-# Flag: --memory_unit
-#
-# Example:
-# kib '1020928KiB / 7117824KiB'
-# mib '1042MiB / 6951MiB'
-# gib: ' 0.98GiB / 6.79GiB'
-memory_unit="Gib"
-
-
-##--------- Packages
-
-# Show/Hide Package Manager names.
-#
-# Default: 'tiny'
-# Values: 'on', 'tiny' 'off'
-# Flag: --package_managers
-#
-# Example:
-# on: '998 (pacman), 8 (flatpak), 4 (snap)'
-# tiny: '908 (pacman, flatpak, snap)'
-# off: '908'
-package_managers="on"
-
-
-##--------- Shell
-
-# Show the path to $SHELL
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --shell_path
-#
-# Example:
-# on: '/bin/bash'
-# off: 'bash'
-shell_path="off"
-
-# Show $SHELL version
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --shell_version
-#
-# Example:
-# on: 'bash 4.4.5'
-# off: 'bash'
-shell_version="on"
-
-
-##--------- CPU
-
-# CPU speed type
-#
-# Default: 'bios_limit'
-# Values: 'scaling_cur_freq', 'scaling_min_freq', 'scaling_max_freq', 'bios_limit'.
-# Flag: --speed_type
-# Supports: Linux with 'cpufreq'
-# NOTE: Any file in '/sys/devices/system/cpu/cpu0/cpufreq' can be used as a value.
-speed_type="scaling_max_freq"
-
-# CPU speed shorthand
-#
-# Default: 'off'
-# Values: 'on', 'off'.
-# Flag: --speed_shorthand
-# NOTE: This flag is not supported in systems with CPU speed less than 1 GHz
-#
-# Example:
-# on: 'i7-6500U (4) @ 3.1GHz'
-# off: 'i7-6500U (4) @ 3.100GHz'
-speed_shorthand="on"
-
-# Enable/Disable CPU brand in output.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --cpu_brand
-#
-# Example:
-# on: 'Intel i7-6500U'
-# off: 'i7-6500U (4)'
-cpu_brand="on"
-
-# CPU Speed
-# Hide/Show CPU speed.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --cpu_speed
-#
-# Example:
-# on: 'Intel i7-6500U (4) @ 3.1GHz'
-# off: 'Intel i7-6500U (4)'
-cpu_speed="on"
-
-# CPU Cores
-# Display CPU cores in output
-#
-# Default: 'logical'
-# Values: 'logical', 'physical', 'off'
-# Flag: --cpu_cores
-# Support: 'physical' doesn't work on BSD.
-#
-# Example:
-# logical: 'Intel i7-6500U (4) @ 3.1GHz' (All virtual cores)
-# physical: 'Intel i7-6500U (2) @ 3.1GHz' (All physical cores)
-# off: 'Intel i7-6500U @ 3.1GHz'
-cpu_cores="logical"
-
-# CPU Temperature
-# Hide/Show CPU temperature.
-# Note the temperature is added to the regular CPU function.
-#
-# Default: 'off'
-# Values: 'C', 'F', 'off'
-# Flag: --cpu_temp
-# Supports: Linux, BSD
-# NOTE: For FreeBSD and NetBSD-based systems, you'll need to enable
-# coretemp kernel module. This only supports newer Intel processors.
-#
-# Example: sudo rm /var/lib/pacman/db.lck
-# C: 'Intel i7-6500U (4) @ 3.1GHz [27.2°C]'
-# F: 'Intel i7-6500U (4) @ 3.1GHz [82.0°F]'
-# off: 'Intel i7-6500U (4) @ 3.1GHz'
-cpu_temp="on"
-
-
-##--------- GPU
-
-# Enable/Disable GPU Brand
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --gpu_brand
-#
-# Example:
-# on: 'AMD HD 7950'
-# off: 'HD 7950'
-gpu_brand="on"
-
-# Which GPU to display
-#
-# Default: 'all'
-# Values: 'all', 'dedicated', 'integrated'
-# Flag: --gpu_type
-# Supports: Linux
-#
-# Example:
-# all:
-# GPU1: AMD HD 7950
-# GPU2: Intel Integrated Graphics
-#
-# dedicated:
-# GPU1: AMD HD 7950
-#
-# integrated:
-# GPU1: Intel Integrated Graphics
-gpu_type="all"
-
-
-##--------- Resolution
-
-# Display refresh rate next to each monitor
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --refresh_rate
-# Supports: Doesn't work on Windows.
-#
-# Example:
-# on: '1920x1080 @ 60Hz'
-# off: '1920x1080'
-refresh_rate="on"
-
-
-##--------- Gtk Theme / Icons / Font
-
-# Shorten output of GTK Theme / Icons / Font
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --gtk_shorthand
-#
-# Example:
-# on: 'Numix, Adwaita'
-# off: 'Numix [GTK2], Adwaita [GTK3]'
-gtk_shorthand="off"
-
-# Enable/Disable gtk2 Theme / Icons / Font
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --gtk2
-#
-# Example:
-# on: 'Numix [GTK2], Adwaita [GTK3]'
-# off: 'Adwaita [GTK3]'
-gtk2="off"
-
-# Enable/Disable gtk3 Theme / Icons / Font
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --gtk3
-#
-# Example:
-# on: 'Numix [GTK2], Adwaita [GTK3]'
-# off: 'Numix [GTK2]'
-gtk3="off"
-
-
-##--------- IP Address
-
-# Website to ping for the public IP
-#
-# Default: 'http://ident.me'
-# Values: 'url'
-# Flag: --ip_host
-public_ip_host="http://ident.me"
-
-# Public IP timeout.
-#
-# Default: '2'
-# Values: 'int'
-# Flag: --ip_timeout
-public_ip_timeout=2
-
-# Desktop Environment
-
-# Show Desktop Environment version
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --de_version
-de_version="on"
-
-
-##--------- Disk
-
-# Which disks to display.
-# The values can be any /dev/sdXX, mount point or directory.
-# NOTE: By default we only show the disk info for '/'.
-#
-# Default: '/'
-# Values: '/', '/dev/sdXX', '/path/to/drive'.
-# Flag: --disk_show
-#
-# Example:
-# disk_show=('/' '/dev/sdb1'):
-# 'Disk (/): 74G / 118G (66%)'
-# 'Disk (/mnt/Videos): 823G / 893G (93%)'
-#
-# disk_show=('/'):
-# 'Disk (/): 74G / 118G (66%)'
-#
-disk_show=('/')
-
-# Disk subtitle.
-# What to append to the Disk subtitle.
-#
-# Default: 'mount'
-# Values: 'mount', 'name', 'dir', 'none'
-# Flag: --disk_subtitle
-#
-# Example:
-# name: 'Disk (/dev/sda1): 74G / 118G (66%)'
-# 'Disk (/dev/sdb2): 74G / 118G (66%)'
-#
-# mount: 'Disk (/): 74G / 118G (66%)'
-# 'Disk (/mnt/Local Disk): 74G / 118G (66%)'
-# 'Disk (/mnt/Videos): 74G / 118G (66%)'
-#
-# dir: 'Disk (/): 74G / 118G (66%)'
-# 'Disk (Local Disk): 74G / 118G (66%)'
-# 'Disk (Videos): 74G / 118G (66%)'
-#
-# none: 'Disk: 74G / 118G (66%)'
-# 'Disk: 74G / 118G (66%)'
-# 'Disk: 74G / 118G (66%)'
-disk_subtitle="mount"
-
-# Disk percent.
-# Show/Hide disk percent.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --disk_percent
-#
-# Example:
-# on: 'Disk (/): 74G / 118G (66%)'
-# off: 'Disk (/): 74G / 118G'
-disk_percent="on"
-
-
-##--------- Song
-
-# Manually specify a music player.
-#
-# Default: 'auto'
-# Values: 'auto', 'player-name'
-# Flag: --music_player
-#
-# Available values for 'player-name':
-#
-# amarok
-# audacious
-# banshee
-# bluemindo
-# clementine
-# cmus
-# deadbeef
-# deepin-music
-# dragon
-# elisa
-# exaile
-# gnome-music
-# gmusicbrowser
-# gogglesmm
-# guayadeque
-# io.elementary.music
-# iTunes
-# juk
-# lollypop
-# mocp
-# mopidy
-# mpd
-# muine
-# netease-cloud-music
-# olivia
-# playerctl
-# pogo
-# pragha
-# qmmp
-# quodlibet
-# rhythmbox
-# sayonara
-# smplayer
-# spotify
-# strawberry
-# tauonmb
-# tomahawk
-# vlc
-# xmms2d
-# xnoise
-# yarock
-music_player="auto"
-
-# Format to display song information.
-#
-# Default: '%artist% - %album% - %title%'
-# Values: '%artist%', '%album%', '%title%'
-# Flag: --song_format
-#
-# Example:
-# default: 'Song: Jet - Get Born - Sgt Major'
-song_format="%artist% - %album% - %title%"
-
-# Print the Artist, Album and Title on separate lines
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --song_shorthand
-#
-# Example:
-# on: 'Artist: The Fratellis'
-# 'Album: Costello Music'
-# 'Song: Chelsea Dagger'
-#
-# off: 'Song: The Fratellis - Costello Music - Chelsea Dagger'
-song_shorthand="off"
-
-# 'mpc' arguments (specify a host, password etc).
-#
-# Default: ''
-# Example: mpc_args=(-h HOST -P PASSWORD)
-mpc_args=()
-
-
-##--------- Text Colors
-
-# Text Colors
-#
-# Default: 'distro'
-# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num'
-# Flag: --colors
-#
-# Each number represents a different part of the text in
-# this order: 'title', '@', 'underline', 'subtitle', 'colon', 'info'
-#
-# Example:
-# colors=(distro) - Text is colored based on Distro colors.
-# colors=(4 6 1 8 8 6) - Text is colored in the order above.
-colors=(distro)
-
-
-##--------- Text Options
-
-# Toggle bold text
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --bold
-bold="on"
-
-# Enable/Disable Underline
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --underline
-underline_enabled="on"
-
-# Underline character
-#
-# Default: '-'
-# Values: 'string'
-# Flag: --underline_char
-underline_char=""
-
-# Info Separator
-# Replace the default separator with the specified string.
-#
-# Default: ':'
-# Flag: --separator
-#
-# Example:
-# separator="->": 'Shell-> bash'
-# separator=" =": 'WM = dwm'
-separator=" "
-
-##--------- Color Blocks
-
-# Color block range
-# The range of colors to print.
-#
-# Default: '0', '15'
-# Values: 'num'
-# Flag: --block_range
-#
-# Example:
-#
-# Display colors 0-7 in the blocks. (8 colors)
-# neofetch --block_range 0 7
-#
-# Display colors 0-15 in the blocks. (16 colors)
-# neofetch --block_range 0 15
-#block_range=(8 15)
-block_range=(1 8)
-
-# Colors for custom colorblocks
-#colors
-#bold="(tput bold)"
-magenta="\033[1;35m"
-green="\033[1;32m"
-white="\033[1;37m"
-blue="\033[1;34m"
-red="\033[1;31m"
-black="\033[1;40;30m"
-yellow="\033[1;33m"
-cyan="\033[1;36m"
-reset="\033[0m"
-bgyellow="\033[1;43;33m"
-bgwhite="\033[1;47;37m"
-cl0="${reset}"
-cl1="${magenta}"
-cl2="${green}"
-cl3="${white}"
-cl4="${blue}"
-cl5="${red}"
-cl6="${yellow}"
-cl7="${cyan}"
-cl8="${black}"
-cl9="${bgyellow}"
-cl10="${bgwhite}"
-
-# Toggle color blocks
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --color_blocks
-color_blocks="on"
-
-# Color block width in spaces
-#
-# Default: '3'
-# Values: 'num'
-# Flag: --block_width
-block_width=4
-
-# Color block height in lines
-#
-# Default: '1'
-# Values: 'num'
-# Flag: --block_height
-block_height=1
-
-
-# Color Alignment
-#
-# Default: 'auto'
-# Values: 'auto', 'num'
-# Flag: --col_offset
-#
-# Number specifies how far from the left side of the terminal (in spaces) to
-# begin printing the columns, in case you want to e.g. center them under your
-# text.
-# Example:
-# col_offset="auto" - Default behavior of neofetch
-# col_offset=7 - Leave 7 spaces then print the colors
-col_offset="auto"
-
-##--------- Progress Bars
-
-# Bar characters
-#
-# Default: '-', '='
-# Values: 'string', 'string'
-# Flag: --bar_char
-#
-# Example:
-# neofetch --bar_char 'elapsed' 'total'
-# neofetch --bar_char '-' '='
-bar_char_elapsed="-"
-bar_char_total="="
-
-# Toggle Bar border
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --bar_border
-bar_border="on"
-
-# Progress bar length in spaces
-# Number of chars long to make the progress bars.
-#
-# Default: '15'
-# Values: 'num'
-# Flag: --bar_length
-bar_length=15
-
-# Progress bar colors
-# When set to distro, uses your distro's logo colors.
-#
-# Default: 'distro', 'distro'
-# Values: 'distro', 'num'
-# Flag: --bar_colors
-#
-# Example:
-# neofetch --bar_colors 3 4
-# neofetch --bar_colors distro 5
-bar_color_elapsed="distro"
-bar_color_total="distro"
-
-# Info display
-# Display a bar with the info.
-#
-# Default: 'off'
-# Values: 'bar', 'infobar', 'barinfo', 'off'
-# Flags: --cpu_display
-# --memory_display
-# --battery_display
-# --disk_display
-#
-# Example:
-# bar: '[---=======]'
-# infobar: 'info [---=======]'
-# barinfo: '[---=======] info'
-# off: 'info'
-cpu_display="on"
-memory_display="on"
-battery_display="on"
-disk_display="on"
-
-
-##--------- Backend Settings
-
-# Image backend.
-#
-# Default: 'ascii'
-# Values: 'ascii', 'caca', 'chafa', 'jp2a', 'iterm2', 'off',
-# 'pot', 'termpix', 'pixterm', 'tycat', 'w3m', 'kitty'
-# Flag: --backend
-image_backend="ascii"
-
-# Image Source
-#
-# Which image or ascii file to display.
-#
-# Default: 'auto'
-# Values: 'auto', 'ascii', 'wallpaper', '/path/to/img', '/path/to/ascii', '/path/to/dir/'
-# 'command output (neofetch --ascii "$(fortune | cowsay -W 30)")'
-# Flag: --source
-#
-# NOTE: 'auto' will pick the best image source for whatever image backend is used.
-# In ascii mode, distro ascii art will be used and in an image mode, your
-# wallpaper will be used.
-image_source="auto"
-
-
-##--------- Ascii Options
-
-# Ascii distro
-# Which distro's ascii art to display.
-#
-# Default: 'auto'
-# Values: 'auto', 'distro_name'
-# Flag: --ascii_distro
-# NOTE: AIX, Alpine, Anarchy, Android, Antergos, antiX, "AOSC OS",
-# "AOSC OS/Retro", Apricity, ArcoLinux, ArchBox, ARCHlabs,
-# ArchStrike, XFerience, ArchMerge, Arch, Artix, Arya, Bedrock,
-# Bitrig, BlackArch, BLAG, BlankOn, BlueLight, bonsai, BSD,
-# BunsenLabs, Calculate, Carbs, CentOS, Chakra, ChaletOS,
-# Chapeau, Chrom*, Cleanjaro, ClearOS, Clear_Linux, Clover,
-# Condres, Container_Linux, CRUX, Cucumber, Debian, Deepin,
-# DesaOS, Devuan, DracOS, DarkOs, DragonFly, Drauger, Elementary,
-# EndeavourOS, Endless, EuroLinux, Exherbo, Fedora, Feren, FreeBSD,
-# FreeMiNT, Frugalware, Funtoo, GalliumOS, Garuda, Gentoo, Pentoo,
-# gNewSense, GNOME, GNU, GoboLinux, Grombyang, Guix, Haiku, Huayra,
-# Hyperbola, janus, Kali, KaOS, KDE_neon, Kibojoe, Kogaion,
-# Korora, KSLinux, Kubuntu, LEDE, LFS, Linux_Lite,
-# LMDE, Lubuntu, Lunar, macos, Mageia, MagpieOS, Mandriva,
-# Manjaro, Maui, Mer, Minix, LinuxMint, MX_Linux, Namib,
-# Neptune, NetBSD, Netrunner, Nitrux, NixOS, Nurunner,
-# NuTyX, OBRevenge, OpenBSD, openEuler, OpenIndiana, openmamba,
-# OpenMandriva, OpenStage, OpenWrt, osmc, Oracle, OS Elbrus, PacBSD,
-# Parabola, Pardus, Parrot, Parsix, TrueOS, PCLinuxOS, Peppermint,
-# popos, Porteus, PostMarketOS, Proxmox, Puppy, PureOS, Qubes, Radix,
-# Raspbian, Reborn_OS, Redstar, Redcore, Redhat, Refracted_Devuan,
-# Regata, Rosa, sabotage, Sabayon, Sailfish, SalentOS, Scientific,
-# Septor, SereneLinux, SharkLinux, Siduction, Slackware, SliTaz,
-# SmartOS, Solus, Source_Mage, Sparky, Star, SteamOS, SunOS,
-# openSUSE_Leap, openSUSE_Tumbleweed, openSUSE, SwagArch, Tails,
-# Trisquel, Ubuntu-Budgie, Ubuntu-GNOME, Ubuntu-MATE, Ubuntu-Studio,
-# Ubuntu, Venom, Void, Obarun, windows10, Windows7, Xubuntu, Zorin,
-# and IRIX have ascii logos
-# NOTE: Arch, Ubuntu, Redhat, and Dragonfly have 'old' logo variants.
-# Use '{distro name}_old' to use the old logos.
-# NOTE: Ubuntu has flavor variants.
-# Change this to Lubuntu, Kubuntu, Xubuntu, Ubuntu-GNOME,
-# Ubuntu-Studio, Ubuntu-Mate or Ubuntu-Budgie to use the flavors.
-# NOTE: Arcolinux, Dragonfly, Fedora, Alpine, Arch, Ubuntu,
-# CRUX, Debian, Gentoo, FreeBSD, Mac, NixOS, OpenBSD, android,
-# Antrix, CentOS, Cleanjaro, ElementaryOS, GUIX, Hyperbola,
-# Manjaro, MXLinux, NetBSD, Parabola, POP_OS, PureOS,
-# Slackware, SunOS, LinuxLite, OpenSUSE, Raspbian,
-# postmarketOS, and Void have a smaller logo variant.
-# Use '{distro name}_small' to use the small variants.
-ascii_distro="auto"
-
-# Ascii Colors
-#
-# Default: 'distro'
-# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num'
-# Flag: --ascii_colors
-#
-# Example:
-# ascii_colors=(distro) - Ascii is colored based on Distro colors.
-# ascii_colors=(4 6 1 8 8 6) - Ascii is colored using these colors.
-ascii_colors=(distro)
-
-# Bold ascii logo
-# Whether or not to bold the ascii logo.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --ascii_bold
-ascii_bold="on"
-
-
-##--------- Image Options
-
-# Image loop
-# Setting this to on will make neofetch redraw the image constantly until
-# Ctrl+C is pressed. This fixes display issues in some terminal emulators.
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --loop
-image_loop="off"
-
-# Thumbnail directory
-#
-# Default: '~/.cache/thumbnails/neofetch'
-# Values: 'dir'
-thumbnail_dir="${XDG_CACHE_HOME:-${HOME}/.cache}/thumbnails/neofetch"
-
-# Crop mode
-#
-# Default: 'normal'
-# Values: 'normal', 'fit', 'fill'
-# Flag: --crop_mode
-#
-# See this wiki page to learn about the fit and fill options.
-# https://github.com/dylanaraps/neofetch/wiki/What-is-Waifu-Crop%3F
-crop_mode="normal"
-
-# Crop offset
-# Note: Only affects 'normal' crop mode.
-#
-# Default: 'center'
-# Values: 'northwest', 'north', 'northeast', 'west', 'center'
-# 'east', 'southwest', 'south', 'southeast'
-# Flag: --crop_offset
-crop_offset="center"
-
-# Image size
-# The image is half the terminal width by default.
-#
-# Default: 'auto'
-# Values: 'auto', '00px', '00%', 'none'
-# Flags: --image_size
-# --size
-image_size="auto"
-
-# Gap between image and text
-#
-# Default: '3'
-# Values: 'num', '-num'
-# Flag: --gap
-gap=2
-
-# Image offsets
-# Only works with the w3m backend.
-#
-# Default: '0'
-# Values: 'px'
-# Flags: --xoffset
-# --yoffset
-yoffset=0
-xoffset=0
-
-# Image background color
-# Only works with the w3m backend.
-#
-# Default: ''
-# Values: 'color', 'blue'
-# Flag: --bg_color
-background_color=
-
-
-##--------- Misc Options
-
-# Stdout mode
-# Turn off all colors and disables image backend (ASCII/Image).
-# Useful for piping into another command.
-# Default: 'off'
-# Values: 'on', 'off'
-stdout="off"
diff --git a/users/youwen/common/neofetch/neofetch.conf b/users/youwen/common/neofetch/neofetch.conf
deleted file mode 100755
index 109b225c..00000000
--- a/users/youwen/common/neofetch/neofetch.conf
+++ /dev/null
@@ -1,863 +0,0 @@
-# Source: https://github.com/Chick2D/neofetch-themes/
-
-# Made by https://github.com/HimDek/ (HimDek)
-# A matching oh-my-zsh theme: https://github.com/HimDek/Acenoster-ZSH-Theme/
-
-# Customization Wiki https://github.com/dylanaraps/neofetch/wiki/Customizing-Info
-
-print_info() {
- prin " "
- info " " title
- prin " "
- info "${cl2} ╭─" distro
- info "${cl2} ├─" kernel
- # info "${cl2} ├─" users
- info "${cl2} ├─" packages
- info "${cl2} ╰─" shell
- echo
- info "${cl6} ╭─" de
- info "${cl6} ├─" term
- info "${cl6} ╰─" term_font
- echo
- info "${cl4} ╭─" model
- info "${cl4} ├─" cpu
- info "${cl4} ├─" gpu
- info "${cl4} ├─" gpu_driver
- info "${cl4} ├─" resolution
- info "${cl4} ├─" memory
- # info "${cl4} ├─ ${cl0}" disk
-# info "${cl4} ├─ ${cl0} " battery
- # info "${cl4} ╰─" uptime
- info "${cl4} ╰─ ${cl0}" disk
-
- # prin " "
- # prin " \n \n \n \n \n \n ${cl3} \n \n ${cl5} \n \n ${cl2} \n \n ${cl6} \n \n ${cl4} \n \n ${cl1} \n \n ${cl7} \n \n ${cl0} \n "
-
-}
-
-##--------- Title
-
-# Hide/Show Fully qualified domain name.
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --title_fqdn
-title_fqdn="on"
-
-
-##--------- Kernel
-
-# Shorten the output of the kernel function.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --kernel_shorthand
-# Supports: Everything except *BSDs (except PacBSD and PC-BSD)
-#
-# Example:
-# on: '4.8.9-1-ARCH'
-# off: 'Linux 4.8.9-1-ARCH'
-kernel_shorthand="off"
-
-
-##--------- Distro
-
-# Shorten the output of the distro function
-#
-# Default: 'off'
-# Values: 'on', 'tiny', 'off'
-# Flag: --distro_shorthand
-# Supports: Everything except Windows and Haiku
-distro_shorthand="on"
-
-# Show/Hide OS Architecture.
-# Show 'x86_64', 'x86' and etc in 'Distro:' output.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --os_arch
-#
-# Example:
-# on: 'Arch Linux x86_64'
-# off: 'Arch Linux'
-os_arch="on"
-
-
-##--------- Uptime
-
-# Shorten the output of the uptime function
-#
-# Default: 'on'
-# Values: 'on', 'tiny', 'off'
-# Flag: --uptime_shorthand
-#
-# Example:
-# on: '2 days, 10 hours, 3 mins'
-# tiny: '2d 10h 3m'
-# off: '2 days, 10 hours, 3 minutes'
-uptime_shorthand="on"
-
-
-##--------- Memory
-
-# Show memory pecentage in output.
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --memory_percent
-#
-# Example:
-# on: '1801MiB / 7881MiB (22%)'
-# off: '1801MiB / 7881MiB'
-memory_percent="on"
-
-# Change memory output unit.
-#
-# Default: 'mib'
-# Values: 'kib', 'mib', 'gib'
-# Flag: --memory_unit
-#
-# Example:
-# kib '1020928KiB / 7117824KiB'
-# mib '1042MiB / 6951MiB'
-# gib: ' 0.98GiB / 6.79GiB'
-memory_unit="Gib"
-
-
-##--------- Packages
-
-# Show/Hide Package Manager names.
-#
-# Default: 'tiny'
-# Values: 'on', 'tiny' 'off'
-# Flag: --package_managers
-#
-# Example:
-# on: '998 (pacman), 8 (flatpak), 4 (snap)'
-# tiny: '908 (pacman, flatpak, snap)'
-# off: '908'
-package_managers="on"
-
-
-##--------- Shell
-
-# Show the path to $SHELL
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --shell_path
-#
-# Example:
-# on: '/bin/bash'
-# off: 'bash'
-shell_path="off"
-
-# Show $SHELL version
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --shell_version
-#
-# Example:
-# on: 'bash 4.4.5'
-# off: 'bash'
-shell_version="on"
-
-
-##--------- CPU
-
-# CPU speed type
-#
-# Default: 'bios_limit'
-# Values: 'scaling_cur_freq', 'scaling_min_freq', 'scaling_max_freq', 'bios_limit'.
-# Flag: --speed_type
-# Supports: Linux with 'cpufreq'
-# NOTE: Any file in '/sys/devices/system/cpu/cpu0/cpufreq' can be used as a value.
-speed_type="scaling_max_freq"
-
-# CPU speed shorthand
-#
-# Default: 'off'
-# Values: 'on', 'off'.
-# Flag: --speed_shorthand
-# NOTE: This flag is not supported in systems with CPU speed less than 1 GHz
-#
-# Example:
-# on: 'i7-6500U (4) @ 3.1GHz'
-# off: 'i7-6500U (4) @ 3.100GHz'
-speed_shorthand="on"
-
-# Enable/Disable CPU brand in output.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --cpu_brand
-#
-# Example:
-# on: 'Intel i7-6500U'
-# off: 'i7-6500U (4)'
-cpu_brand="on"
-
-# CPU Speed
-# Hide/Show CPU speed.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --cpu_speed
-#
-# Example:
-# on: 'Intel i7-6500U (4) @ 3.1GHz'
-# off: 'Intel i7-6500U (4)'
-cpu_speed="on"
-
-# CPU Cores
-# Display CPU cores in output
-#
-# Default: 'logical'
-# Values: 'logical', 'physical', 'off'
-# Flag: --cpu_cores
-# Support: 'physical' doesn't work on BSD.
-#
-# Example:
-# logical: 'Intel i7-6500U (4) @ 3.1GHz' (All virtual cores)
-# physical: 'Intel i7-6500U (2) @ 3.1GHz' (All physical cores)
-# off: 'Intel i7-6500U @ 3.1GHz'
-cpu_cores="logical"
-
-# CPU Temperature
-# Hide/Show CPU temperature.
-# Note the temperature is added to the regular CPU function.
-#
-# Default: 'off'
-# Values: 'C', 'F', 'off'
-# Flag: --cpu_temp
-# Supports: Linux, BSD
-# NOTE: For FreeBSD and NetBSD-based systems, you'll need to enable
-# coretemp kernel module. This only supports newer Intel processors.
-#
-# Example: sudo rm /var/lib/pacman/db.lck
-# C: 'Intel i7-6500U (4) @ 3.1GHz [27.2°C]'
-# F: 'Intel i7-6500U (4) @ 3.1GHz [82.0°F]'
-# off: 'Intel i7-6500U (4) @ 3.1GHz'
-cpu_temp="on"
-
-
-##--------- GPU
-
-# Enable/Disable GPU Brand
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --gpu_brand
-#
-# Example:
-# on: 'AMD HD 7950'
-# off: 'HD 7950'
-gpu_brand="on"
-
-# Which GPU to display
-#
-# Default: 'all'
-# Values: 'all', 'dedicated', 'integrated'
-# Flag: --gpu_type
-# Supports: Linux
-#
-# Example:
-# all:
-# GPU1: AMD HD 7950
-# GPU2: Intel Integrated Graphics
-#
-# dedicated:
-# GPU1: AMD HD 7950
-#
-# integrated:
-# GPU1: Intel Integrated Graphics
-gpu_type="all"
-
-
-##--------- Resolution
-
-# Display refresh rate next to each monitor
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --refresh_rate
-# Supports: Doesn't work on Windows.
-#
-# Example:
-# on: '1920x1080 @ 60Hz'
-# off: '1920x1080'
-refresh_rate="on"
-
-
-##--------- Gtk Theme / Icons / Font
-
-# Shorten output of GTK Theme / Icons / Font
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --gtk_shorthand
-#
-# Example:
-# on: 'Numix, Adwaita'
-# off: 'Numix [GTK2], Adwaita [GTK3]'
-gtk_shorthand="off"
-
-# Enable/Disable gtk2 Theme / Icons / Font
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --gtk2
-#
-# Example:
-# on: 'Numix [GTK2], Adwaita [GTK3]'
-# off: 'Adwaita [GTK3]'
-gtk2="off"
-
-# Enable/Disable gtk3 Theme / Icons / Font
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --gtk3
-#
-# Example:
-# on: 'Numix [GTK2], Adwaita [GTK3]'
-# off: 'Numix [GTK2]'
-gtk3="off"
-
-
-##--------- IP Address
-
-# Website to ping for the public IP
-#
-# Default: 'http://ident.me'
-# Values: 'url'
-# Flag: --ip_host
-public_ip_host="http://ident.me"
-
-# Public IP timeout.
-#
-# Default: '2'
-# Values: 'int'
-# Flag: --ip_timeout
-public_ip_timeout=2
-
-# Desktop Environment
-
-# Show Desktop Environment version
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --de_version
-de_version="on"
-
-
-##--------- Disk
-
-# Which disks to display.
-# The values can be any /dev/sdXX, mount point or directory.
-# NOTE: By default we only show the disk info for '/'.
-#
-# Default: '/'
-# Values: '/', '/dev/sdXX', '/path/to/drive'.
-# Flag: --disk_show
-#
-# Example:
-# disk_show=('/' '/dev/sdb1'):
-# 'Disk (/): 74G / 118G (66%)'
-# 'Disk (/mnt/Videos): 823G / 893G (93%)'
-#
-# disk_show=('/'):
-# 'Disk (/): 74G / 118G (66%)'
-#
-disk_show=('/')
-
-# Disk subtitle.
-# What to append to the Disk subtitle.
-#
-# Default: 'mount'
-# Values: 'mount', 'name', 'dir', 'none'
-# Flag: --disk_subtitle
-#
-# Example:
-# name: 'Disk (/dev/sda1): 74G / 118G (66%)'
-# 'Disk (/dev/sdb2): 74G / 118G (66%)'
-#
-# mount: 'Disk (/): 74G / 118G (66%)'
-# 'Disk (/mnt/Local Disk): 74G / 118G (66%)'
-# 'Disk (/mnt/Videos): 74G / 118G (66%)'
-#
-# dir: 'Disk (/): 74G / 118G (66%)'
-# 'Disk (Local Disk): 74G / 118G (66%)'
-# 'Disk (Videos): 74G / 118G (66%)'
-#
-# none: 'Disk: 74G / 118G (66%)'
-# 'Disk: 74G / 118G (66%)'
-# 'Disk: 74G / 118G (66%)'
-disk_subtitle="mount"
-
-# Disk percent.
-# Show/Hide disk percent.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --disk_percent
-#
-# Example:
-# on: 'Disk (/): 74G / 118G (66%)'
-# off: 'Disk (/): 74G / 118G'
-disk_percent="on"
-
-
-##--------- Song
-
-# Manually specify a music player.
-#
-# Default: 'auto'
-# Values: 'auto', 'player-name'
-# Flag: --music_player
-#
-# Available values for 'player-name':
-#
-# amarok
-# audacious
-# banshee
-# bluemindo
-# clementine
-# cmus
-# deadbeef
-# deepin-music
-# dragon
-# elisa
-# exaile
-# gnome-music
-# gmusicbrowser
-# gogglesmm
-# guayadeque
-# io.elementary.music
-# iTunes
-# juk
-# lollypop
-# mocp
-# mopidy
-# mpd
-# muine
-# netease-cloud-music
-# olivia
-# playerctl
-# pogo
-# pragha
-# qmmp
-# quodlibet
-# rhythmbox
-# sayonara
-# smplayer
-# spotify
-# strawberry
-# tauonmb
-# tomahawk
-# vlc
-# xmms2d
-# xnoise
-# yarock
-music_player="auto"
-
-# Format to display song information.
-#
-# Default: '%artist% - %album% - %title%'
-# Values: '%artist%', '%album%', '%title%'
-# Flag: --song_format
-#
-# Example:
-# default: 'Song: Jet - Get Born - Sgt Major'
-song_format="%artist% - %album% - %title%"
-
-# Print the Artist, Album and Title on separate lines
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --song_shorthand
-#
-# Example:
-# on: 'Artist: The Fratellis'
-# 'Album: Costello Music'
-# 'Song: Chelsea Dagger'
-#
-# off: 'Song: The Fratellis - Costello Music - Chelsea Dagger'
-song_shorthand="off"
-
-# 'mpc' arguments (specify a host, password etc).
-#
-# Default: ''
-# Example: mpc_args=(-h HOST -P PASSWORD)
-mpc_args=()
-
-
-##--------- Text Colors
-
-# Text Colors
-#
-# Default: 'distro'
-# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num'
-# Flag: --colors
-#
-# Each number represents a different part of the text in
-# this order: 'title', '@', 'underline', 'subtitle', 'colon', 'info'
-#
-# Example:
-# colors=(distro) - Text is colored based on Distro colors.
-# colors=(4 6 1 8 8 6) - Text is colored in the order above.
-colors=(distro)
-
-
-##--------- Text Options
-
-# Toggle bold text
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --bold
-bold="on"
-
-# Enable/Disable Underline
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --underline
-underline_enabled="on"
-
-# Underline character
-#
-# Default: '-'
-# Values: 'string'
-# Flag: --underline_char
-underline_char=""
-
-# Info Separator
-# Replace the default separator with the specified string.
-#
-# Default: ':'
-# Flag: --separator
-#
-# Example:
-# separator="->": 'Shell-> bash'
-# separator=" =": 'WM = dwm'
-separator=" "
-
-##--------- Color Blocks
-
-# Color block range
-# The range of colors to print.
-#
-# Default: '0', '15'
-# Values: 'num'
-# Flag: --block_range
-#
-# Example:
-#
-# Display colors 0-7 in the blocks. (8 colors)
-# neofetch --block_range 0 7
-#
-# Display colors 0-15 in the blocks. (16 colors)
-# neofetch --block_range 0 15
-#block_range=(8 15)
-block_range=(1 8)
-
-# Colors for custom colorblocks
-#colors
-#bold="(tput bold)"
-magenta="\033[1;35m"
-green="\033[1;32m"
-white="\033[1;37m"
-blue="\033[1;34m"
-red="\033[1;31m"
-black="\033[1;40;30m"
-yellow="\033[1;33m"
-cyan="\033[1;36m"
-reset="\033[0m"
-bgyellow="\033[1;43;33m"
-bgwhite="\033[1;47;37m"
-cl0="${reset}"
-cl1="${magenta}"
-cl2="${green}"
-cl3="${white}"
-cl4="${blue}"
-cl5="${red}"
-cl6="${yellow}"
-cl7="${cyan}"
-cl8="${black}"
-cl9="${bgyellow}"
-cl10="${bgwhite}"
-
-# Toggle color blocks
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --color_blocks
-color_blocks="on"
-
-# Color block width in spaces
-#
-# Default: '3'
-# Values: 'num'
-# Flag: --block_width
-block_width=4
-
-# Color block height in lines
-#
-# Default: '1'
-# Values: 'num'
-# Flag: --block_height
-block_height=1
-
-
-# Color Alignment
-#
-# Default: 'auto'
-# Values: 'auto', 'num'
-# Flag: --col_offset
-#
-# Number specifies how far from the left side of the terminal (in spaces) to
-# begin printing the columns, in case you want to e.g. center them under your
-# text.
-# Example:
-# col_offset="auto" - Default behavior of neofetch
-# col_offset=7 - Leave 7 spaces then print the colors
-col_offset="auto"
-
-##--------- Progress Bars
-
-# Bar characters
-#
-# Default: '-', '='
-# Values: 'string', 'string'
-# Flag: --bar_char
-#
-# Example:
-# neofetch --bar_char 'elapsed' 'total'
-# neofetch --bar_char '-' '='
-bar_char_elapsed="-"
-bar_char_total="="
-
-# Toggle Bar border
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --bar_border
-bar_border="on"
-
-# Progress bar length in spaces
-# Number of chars long to make the progress bars.
-#
-# Default: '15'
-# Values: 'num'
-# Flag: --bar_length
-bar_length=15
-
-# Progress bar colors
-# When set to distro, uses your distro's logo colors.
-#
-# Default: 'distro', 'distro'
-# Values: 'distro', 'num'
-# Flag: --bar_colors
-#
-# Example:
-# neofetch --bar_colors 3 4
-# neofetch --bar_colors distro 5
-bar_color_elapsed="distro"
-bar_color_total="distro"
-
-# Info display
-# Display a bar with the info.
-#
-# Default: 'off'
-# Values: 'bar', 'infobar', 'barinfo', 'off'
-# Flags: --cpu_display
-# --memory_display
-# --battery_display
-# --disk_display
-#
-# Example:
-# bar: '[---=======]'
-# infobar: 'info [---=======]'
-# barinfo: '[---=======] info'
-# off: 'info'
-cpu_display="on"
-memory_display="on"
-battery_display="on"
-disk_display="on"
-
-
-##--------- Backend Settings
-
-# Image backend.
-#
-# Default: 'ascii'
-# Values: 'ascii', 'caca', 'chafa', 'jp2a', 'iterm2', 'off',
-# 'pot', 'termpix', 'pixterm', 'tycat', 'w3m', 'kitty'
-# Flag: --backend
-image_backend="ascii"
-
-# Image Source
-#
-# Which image or ascii file to display.
-#
-# Default: 'auto'
-# Values: 'auto', 'ascii', 'wallpaper', '/path/to/img', '/path/to/ascii', '/path/to/dir/'
-# 'command output (neofetch --ascii "$(fortune | cowsay -W 30)")'
-# Flag: --source
-#
-# NOTE: 'auto' will pick the best image source for whatever image backend is used.
-# In ascii mode, distro ascii art will be used and in an image mode, your
-# wallpaper will be used.
-image_source="auto"
-
-
-##--------- Ascii Options
-
-# Ascii distro
-# Which distro's ascii art to display.
-#
-# Default: 'auto'
-# Values: 'auto', 'distro_name'
-# Flag: --ascii_distro
-# NOTE: AIX, Alpine, Anarchy, Android, Antergos, antiX, "AOSC OS",
-# "AOSC OS/Retro", Apricity, ArcoLinux, ArchBox, ARCHlabs,
-# ArchStrike, XFerience, ArchMerge, Arch, Artix, Arya, Bedrock,
-# Bitrig, BlackArch, BLAG, BlankOn, BlueLight, bonsai, BSD,
-# BunsenLabs, Calculate, Carbs, CentOS, Chakra, ChaletOS,
-# Chapeau, Chrom*, Cleanjaro, ClearOS, Clear_Linux, Clover,
-# Condres, Container_Linux, CRUX, Cucumber, Debian, Deepin,
-# DesaOS, Devuan, DracOS, DarkOs, DragonFly, Drauger, Elementary,
-# EndeavourOS, Endless, EuroLinux, Exherbo, Fedora, Feren, FreeBSD,
-# FreeMiNT, Frugalware, Funtoo, GalliumOS, Garuda, Gentoo, Pentoo,
-# gNewSense, GNOME, GNU, GoboLinux, Grombyang, Guix, Haiku, Huayra,
-# Hyperbola, janus, Kali, KaOS, KDE_neon, Kibojoe, Kogaion,
-# Korora, KSLinux, Kubuntu, LEDE, LFS, Linux_Lite,
-# LMDE, Lubuntu, Lunar, macos, Mageia, MagpieOS, Mandriva,
-# Manjaro, Maui, Mer, Minix, LinuxMint, MX_Linux, Namib,
-# Neptune, NetBSD, Netrunner, Nitrux, NixOS, Nurunner,
-# NuTyX, OBRevenge, OpenBSD, openEuler, OpenIndiana, openmamba,
-# OpenMandriva, OpenStage, OpenWrt, osmc, Oracle, OS Elbrus, PacBSD,
-# Parabola, Pardus, Parrot, Parsix, TrueOS, PCLinuxOS, Peppermint,
-# popos, Porteus, PostMarketOS, Proxmox, Puppy, PureOS, Qubes, Radix,
-# Raspbian, Reborn_OS, Redstar, Redcore, Redhat, Refracted_Devuan,
-# Regata, Rosa, sabotage, Sabayon, Sailfish, SalentOS, Scientific,
-# Septor, SereneLinux, SharkLinux, Siduction, Slackware, SliTaz,
-# SmartOS, Solus, Source_Mage, Sparky, Star, SteamOS, SunOS,
-# openSUSE_Leap, openSUSE_Tumbleweed, openSUSE, SwagArch, Tails,
-# Trisquel, Ubuntu-Budgie, Ubuntu-GNOME, Ubuntu-MATE, Ubuntu-Studio,
-# Ubuntu, Venom, Void, Obarun, windows10, Windows7, Xubuntu, Zorin,
-# and IRIX have ascii logos
-# NOTE: Arch, Ubuntu, Redhat, and Dragonfly have 'old' logo variants.
-# Use '{distro name}_old' to use the old logos.
-# NOTE: Ubuntu has flavor variants.
-# Change this to Lubuntu, Kubuntu, Xubuntu, Ubuntu-GNOME,
-# Ubuntu-Studio, Ubuntu-Mate or Ubuntu-Budgie to use the flavors.
-# NOTE: Arcolinux, Dragonfly, Fedora, Alpine, Arch, Ubuntu,
-# CRUX, Debian, Gentoo, FreeBSD, Mac, NixOS, OpenBSD, android,
-# Antrix, CentOS, Cleanjaro, ElementaryOS, GUIX, Hyperbola,
-# Manjaro, MXLinux, NetBSD, Parabola, POP_OS, PureOS,
-# Slackware, SunOS, LinuxLite, OpenSUSE, Raspbian,
-# postmarketOS, and Void have a smaller logo variant.
-# Use '{distro name}_small' to use the small variants.
-ascii_distro="auto"
-
-# Ascii Colors
-#
-# Default: 'distro'
-# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num'
-# Flag: --ascii_colors
-#
-# Example:
-# ascii_colors=(distro) - Ascii is colored based on Distro colors.
-# ascii_colors=(4 6 1 8 8 6) - Ascii is colored using these colors.
-ascii_colors=(distro)
-
-# Bold ascii logo
-# Whether or not to bold the ascii logo.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --ascii_bold
-ascii_bold="on"
-
-
-##--------- Image Options
-
-# Image loop
-# Setting this to on will make neofetch redraw the image constantly until
-# Ctrl+C is pressed. This fixes display issues in some terminal emulators.
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --loop
-image_loop="off"
-
-# Thumbnail directory
-#
-# Default: '~/.cache/thumbnails/neofetch'
-# Values: 'dir'
-thumbnail_dir="${XDG_CACHE_HOME:-${HOME}/.cache}/thumbnails/neofetch"
-
-# Crop mode
-#
-# Default: 'normal'
-# Values: 'normal', 'fit', 'fill'
-# Flag: --crop_mode
-#
-# See this wiki page to learn about the fit and fill options.
-# https://github.com/dylanaraps/neofetch/wiki/What-is-Waifu-Crop%3F
-crop_mode="normal"
-
-# Crop offset
-# Note: Only affects 'normal' crop mode.
-#
-# Default: 'center'
-# Values: 'northwest', 'north', 'northeast', 'west', 'center'
-# 'east', 'southwest', 'south', 'southeast'
-# Flag: --crop_offset
-crop_offset="center"
-
-# Image size
-# The image is half the terminal width by default.
-#
-# Default: 'auto'
-# Values: 'auto', '00px', '00%', 'none'
-# Flags: --image_size
-# --size
-image_size="auto"
-
-# Gap between image and text
-#
-# Default: '3'
-# Values: 'num', '-num'
-# Flag: --gap
-gap=2
-
-# Image offsets
-# Only works with the w3m backend.
-#
-# Default: '0'
-# Values: 'px'
-# Flags: --xoffset
-# --yoffset
-yoffset=0
-xoffset=0
-
-# Image background color
-# Only works with the w3m backend.
-#
-# Default: ''
-# Values: 'color', 'blue'
-# Flag: --bg_color
-background_color=
-
-
-##--------- Misc Options
-
-# Stdout mode
-# Turn off all colors and disables image backend (ASCII/Image).
-# Useful for piping into another command.
-# Default: 'off'
-# Values: 'on', 'off'
-stdout="off"
diff --git a/users/youwen/common/neovim/default.nix b/users/youwen/common/neovim/default.nix
deleted file mode 100644
index 659e7b13..00000000
--- a/users/youwen/common/neovim/default.nix
+++ /dev/null
@@ -1,685 +0,0 @@
-{pkgs, ...}: {
- programs.nixvim = {
- enable = true;
- viAlias = true;
- vimAlias = true;
- withNodeJs = true;
- withRuby = true;
-
- extraPackages = with pkgs; [
- # TS/JS
- nodePackages.prettier
-
- # Rust
- rust-analyzer
- rustfmt
-
- # Nix
- alejandra
-
- # Python
- black
-
- # Lua
- stylua
- lua-language-server
-
- # Haskell
- haskellPackages.fourmolu
-
- # Misc
- codespell
- ripgrep
- yazi
- fd
- ];
-
- luaLoader.enable = true;
- performance = {
- combinePlugins.enable = true;
- byteCompileLua.enable = true;
- };
-
- colorschemes.rose-pine.enable = true;
-
- opts = {
- laststatus = 3;
- relativenumber = true;
- number = true;
- };
-
- globals = {
- mapleader = " ";
- };
-
- extraConfigLua = ''
- require("telescope").load_extension("yank_history")
- vim.diagnostic.config({ virtual_lines = false });
- '';
-
- keymaps = [
- {
- # Unmap space (leader)
- action = "";
- key = "";
- options = {
- noremap = true;
- silent = true;
- };
- mode = "n";
- }
- {
- action = "spj";
- key = "-";
- options.silent = true;
- options.desc = "Split window horizontally";
- }
- {
- action = "vspl";
- key = "\\";
- options.silent = true;
- options.desc = "Split window vertically";
- }
- {
- action = "ZenMode";
- key = "wz";
- options = {
- silent = true;
- noremap = true;
- desc = "Zen mode";
- };
- }
- {
- action = "h";
- key = "";
- options = {
- silent = true;
- noremap = true;
- desc = "Move to left window";
- };
- }
- {
- action = "j";
- key = "";
- options = {
- silent = true;
- noremap = true;
- desc = "Move to lower window";
- };
- }
- {
- action = "k";
- key = "";
- options = {
- silent = true;
- noremap = true;
- desc = "Move to upper window";
- };
- }
- {
- action = "l";
- key = "";
- options = {
- silent = true;
- noremap = true;
- desc = "Move to right window";
- };
- }
- {
- action = "close";
- key = "wd";
- options = {
- silent = true;
- noremap = true;
- desc = "Close current window";
- };
- }
- {
- action = "Telescope find_files";
- key = "ff";
- options = {
- silent = true;
- noremap = true;
- desc = "Find files";
- };
- }
- {
- action = "Telescope live_grep";
- key = "/";
- options = {
- silent = true;
- noremap = true;
- desc = "Live grep";
- };
- }
- {
- action = "Telescope buffers";
- key = "fb";
- options = {
- silent = true;
- noremap = true;
- desc = "List buffers";
- };
- }
- {
- action = "Telescope help_tags";
- key = "fh";
- options = {
- silent = true;
- noremap = true;
- desc = "Help tags";
- };
- }
- {
- action = "lua require'telescope.builtin'.lsp_definitions{}";
- key = "gd";
- options = {
- silent = true;
- noremap = true;
- desc = "Go to definition";
- };
- }
- {
- action = "lua require'telescope.builtin'.git_files{}";
- key = " ";
- options = {
- silent = true;
- noremap = true;
- desc = "List Git files";
- };
- }
- {
- action = "lua require'telescope.builtin'.find_files{}";
- key = "ff";
- options = {
- silent = true;
- noremap = true;
- desc = "List all files";
- };
- }
- {
- action = "";
- key = "";
- options = {
- silent = true;
- noremap = true;
- desc = "Go to normal mode in built-in terminal.";
- };
- mode = "t";
- }
- {
- action = ":resize +4";
- key = "w=";
- options = {
- silent = true;
- noremap = true;
- desc = "Increase window height.";
- };
- }
- {
- action = ":resize -4";
- key = "w-";
- options = {
- silent = true;
- noremap = true;
- desc = "Decrease window height.";
- };
- }
- {
- action = ":vertical resize +4";
- key = "w]";
- options = {
- silent = true;
- noremap = true;
- desc = "Increase window width.";
- };
- }
- {
- action = ":vertical resize -4";
- key = "w[";
- options = {
- silent = true;
- noremap = true;
- desc = "Decrease window width.";
- };
- }
- {
- action = ":Bdelete!";
- key = "bd";
- options = {
- silent = true;
- noremap = true;
- desc = "Close buffer";
- };
- }
- {
- action = ":bprev";
- key = "H";
- options = {
- silent = true;
- noremap = true;
- desc = "Move to the previous buffer.";
- };
- }
- {
- action = ":bnext";
- key = "L";
- options = {
- silent = true;
- noremap = true;
- desc = "Move to the next buffer.";
- };
- }
- {
- action = ":LazyGit";
- key = "gg";
- options = {
- silent = true;
- noremap = true;
- desc = "Open LazyGit";
- };
- }
- {
- action = ":split | wincmd j | resize 15 | term";
- key = "tt";
- options = {
- silent = true;
- noremap = true;
- desc = "Open a half-size horizontal terminal split";
- };
- mode = "n";
- }
- {
- action = ":split | wincmd j | term";
- key = "te";
- options = {
- silent = true;
- noremap = true;
- desc = "Open a horizontal terminal split";
- };
- mode = "n";
- }
- {
- action = ":vsplit | wincmd l | term";
- key = "tv";
- options = {
- silent = true;
- noremap = true;
- desc = "Open a vertical terminal split";
- };
- mode = "n";
- }
- {
- action = ":Trouble diagnostics";
- key = "xx";
- options = {
- silent = true;
- noremap = true;
- desc = "View trouble diagnostics";
- };
- mode = "n";
- }
- {
- action = ":Trouble symbols";
- key = "xs";
- options = {
- silent = true;
- noremap = true;
- desc = "View symbols";
- };
- mode = "n";
- }
- {
- action = "(YankyPutAfter)";
- key = "p";
- mode = ["n" "x"];
- }
- {
- action = "(YankyPutBefore)";
- key = "P";
- mode = ["n" "x"];
- }
- {
- action = "(YankyGPutAfter)";
- key = "gp";
- mode = ["n" "x"];
- }
- {
- action = "(YankyGPutBefore)";
- key = "gP";
- mode = ["n" "x"];
- }
- {
- action = ":Telescope yank_history";
- key = "p";
- mode = "n";
- }
- {
- action = '':lua require("yazi").yazi()'';
- key = "mm";
- options = {
- desc = "Open Yazi current nvim working directory";
- noremap = true;
- silent = true;
- };
- }
- {
- action = '':lua vim.lsp.buf.code_action()'';
- key = "ca";
- options = {
- desc = "View available code actions";
- noremap = true;
- silent = true;
- };
- }
- {
- action = '':lua vim.lsp.buf.rename()'';
- key = "cr";
- options = {
- desc = "Rename symbol";
- noremap = true;
- silent = true;
- };
- }
- {
- action = '':lua require("lsp_lines").toggle()'';
- key = "cd";
- options = {
- desc = "Toggle lsp lines";
- noremap = true;
- silent = true;
- };
- }
- # {
- # action = ":Yazi";
- # key = "mf";
- # options = {
- # desc = "Open Yazi at current file";
- # noremap = true;
- # silent = true;
- # };
- # }
- # {
- # action = "lua require'conform'.format({ bufnr = args.bf })";
- # key = "cf";
- # options = {
- # silent = true;
- # noremap = true;
- # desc = "Format buffer";
- # };
- # }
- ];
-
- plugins = {
- # LSP and Treesitter related
- lsp = {
- enable = true;
- inlayHints = true;
- servers = {
- bashls.enable = true;
- clangd.enable = true;
- pyright.enable = true;
- nixd.enable = true;
- nushell.enable = true;
- svelte.enable = true;
- tailwindcss.enable = true;
- typst-lsp.enable = true;
- marksman.enable = true;
- };
- };
- treesitter = {
- enable = true;
- settings = {
- highlight.enable = true;
- indent.enable = true;
- folding.enable = true;
- };
- };
- lsp-lines.enable = true;
- crates-nvim.enable = true;
- treesitter-context.enable = true;
-
- # Language specific tools
- markdown-preview.enable = true;
- # rustaceanvim.enable = true;
- typescript-tools.enable = true;
-
- # git stuff
- lazygit.enable = true;
- gitsigns.enable = true;
-
- # QoL and utility
- intellitab.enable = true;
- guess-indent.enable = true;
- vim-bbye.enable = true;
- indent-blankline.enable = true;
- which-key.enable = true;
- zen-mode.enable = true;
- yanky = {
- enable = true;
- enableTelescope = true;
- };
- telescope = {
- enable = true;
- extensions = {
- ui-select = {
- enable = true;
- settings = {
- codeactions = true;
- };
- };
- media-files = {
- enable = true;
- settings = {
- filetypes = [
- "png"
- "webp"
- "jpg"
- "jpeg"
- "mp4"
- "svg"
- "pdf"
- "mov"
- "mkv"
- "avi"
- ];
- find_cmd = "rg";
- };
- dependencies = {
- imageMagick.enable = true;
- pdftoppm.enable = true;
- ffmpegthumbnailer.enable = true;
- };
- };
- };
- };
- trouble.enable = true;
- direnv.enable = true;
- yazi = {
- enable = true;
- settings = {
- open_for_directories = true;
- };
- };
- harpoon = {
- enable = true;
- keymaps = {
- addFile = "hh";
- cmdToggleQuickMenu = "hm";
- gotoTerminal = {
- "1" = "ht";
- "2" = "2";
- "3" = "3";
- "4" = "4";
- };
- navFile = {
- "1" = "ha";
- "2" = "hs";
- "3" = "hd";
- "4" = "hf";
- };
- navNext = "h]";
- navPrev = "h[";
- toggleQuickMenu = "hk";
- };
- };
-
- # Code formatting
- conform-nvim = {
- enable = true;
- formatOnSave = {
- timeoutMs = 500;
- lspFallback = true;
- };
- formattersByFt = {
- lua = ["stylua"];
- python = ["black"];
- nix = ["alejandra"];
- svelte = ["prettier"];
- rust = ["rustfmt"];
- haskell = ["fourmolu"];
- "*" = ["codespell"];
- "_" = ["trim_whitespace"];
- };
- };
-
- # mini.nvim
- mini = {
- enable = true;
- modules = {
- surround = {};
- pairs = {};
- ai = {};
- hipatterns = {};
- notify = {};
- tabline = {};
- trailspace = {};
- comment = {};
- cursorword = {};
- bracketed = {};
- };
- };
-
- # Completion
- cmp-async-path.enable = true;
- cmp = {
- enable = true;
- settings = {
- autoEnableSources = true;
- experimental = {ghost_text = true;};
- performance = {
- debounce = 60;
- fetchingTimeout = 200;
- maxViewEntries = 30;
- };
- snippet = {expand = "luasnip";};
- formatting = {fields = ["kind" "abbr" "menu"];};
- sources = [
- {name = "nvim_lsp";}
- {name = "emoji";}
- {
- name = "buffer"; # text within current buffer
- option.get_bufnrs.__raw = "vim.api.nvim_list_bufs";
- keywordLength = 3;
- }
- # { name = "copilot"; } # enable/disable copilot
- {
- name = "path"; # file system paths
- keywordLength = 3;
- }
- {
- name = "luasnip"; # snippets
- keywordLength = 3;
- }
- ];
-
- window = {
- completion = {border = "solid";};
- documentation = {border = "solid";};
- };
-
- mapping = {
- "" = "cmp.mapping(cmp.mapping.select_next_item(), {'i', 's'})";
- "" = "cmp.mapping.select_next_item()";
- "" = "cmp.mapping.select_prev_item()";
- "" = "cmp.mapping.abort()";
- "" = "cmp.mapping.scroll_docs(-4)";
- "" = "cmp.mapping.scroll_docs(4)";
- "" = "cmp.mapping.complete()";
- "" = "cmp.mapping.confirm({ select = true })";
- "" = "cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true })";
- };
- };
- };
- cmp-nvim-lsp = {
- enable = true; # LSP
- };
- cmp-buffer = {
- enable = true;
- };
- cmp-path = {
- enable = true; # file system paths
- };
- cmp-cmdline = {
- enable = true; # autocomplete for cmdline
- };
-
- # Extra (stuff that doesn't affect editing)
- wakatime.enable = true;
- presence-nvim = {
- enable = true;
- editingText = "Hacking %s";
- workspaceText = "The One True Text Editor";
- buttons = [
- {
- label = "GitHub";
- url = "https://github.com/youwen5";
- }
- {
- label = "Code Forge";
- url = "https://code.youwen.dev/";
- }
- ];
- };
- };
-
- extraPlugins = [
- (pkgs.vimUtils.buildVimPlugin {
- name = "satellite.nvim";
- src = pkgs.fetchFromGitHub {
- owner = "lewis6991";
- repo = "satellite.nvim";
- rev = "777ed56e1ef45ec808df701730b6597fc4fb0fbc";
- hash = "sha256-04Js+9SB4VuCq/ACbNh5BZcolu8i8vlGU72qo5xxfpk=";
- };
- })
- (pkgs.vimUtils.buildVimPlugin {
- name = "render-markdown.nvim";
- src = pkgs.fetchFromGitHub {
- owner = "MeanderingProgrammer";
- repo = "render-markdown.nvim";
- rev = "7986be47531d652e950776536987e01dd5b55b94";
- hash = "sha256-lc++IrXzEA3M2iUFZACAZOcH2EwVqX4p0fhET+en37o=";
- };
- })
- (pkgs.vimUtils.buildVimPlugin {
- name = "haskell-tools-nvim";
- src = pkgs.fetchFromGitHub {
- owner = "mrcjkb";
- repo = "haskell-tools.nvim";
- rev = "959eac0fadbdd27442904a8cb363f39afb528027";
- hash = "sha256-5CS5kvUSqQJe7iFFpicinBjCQXgFPL0ElGgnrZHTT+Y=";
- };
- })
- (pkgs.vimUtils.buildVimPlugin {
- name = "rustaceanvim";
- src = pkgs.fetchFromGitHub {
- owner = "mrcjkb";
- repo = "rustaceanvim";
- rev = "7cba8e599deca98d4b44cac1bcbd720c62937d90";
- hash = "sha256-OYfeJuo4FZUBdW9wGGCT0lZGYr/ur1uy8frcyUJMF3k=";
- };
- })
- ];
- };
-}
diff --git a/users/youwen/linux/desktop/default.nix b/users/youwen/linux/desktop/default.nix
deleted file mode 100644
index c147434f..00000000
--- a/users/youwen/linux/desktop/default.nix
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- imports = [
- ../theming
- ../home.nix
- ../programs
- ../hyprland/desktop
- ../waybar/desktop
- ];
-}
diff --git a/users/youwen/linux/easyeffects/input/Default.json b/users/youwen/linux/easyeffects/input/Default.json
deleted file mode 100644
index 60b56353..00000000
--- a/users/youwen/linux/easyeffects/input/Default.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
- "input": {
- "blocklist": [],
- "compressor#0": {
- "attack": 20.0,
- "boost-amount": 6.0,
- "boost-threshold": -72.0,
- "bypass": true,
- "dry": -100.0,
- "hpf-frequency": 10.0,
- "hpf-mode": "off",
- "input-gain": 0.0,
- "knee": -6.0,
- "lpf-frequency": 20000.0,
- "lpf-mode": "off",
- "makeup": 0.0,
- "mode": "Downward",
- "output-gain": 0.0,
- "ratio": 4.0,
- "release": 100.0,
- "release-threshold": -100.0,
- "sidechain": {
- "lookahead": 0.0,
- "mode": "RMS",
- "preamp": 0.0,
- "reactivity": 10.0,
- "source": "Middle",
- "stereo-split-source": "Left/Right",
- "type": "Feed-forward"
- },
- "stereo-split": false,
- "threshold": -12.0,
- "wet": 0.0
- },
- "limiter#0": {
- "alr": false,
- "alr-attack": 5.0,
- "alr-knee": 0.0,
- "alr-release": 50.0,
- "attack": 5.0,
- "bypass": true,
- "dithering": "None",
- "external-sidechain": false,
- "gain-boost": true,
- "input-gain": 0.0,
- "lookahead": 5.0,
- "mode": "Herm Thin",
- "output-gain": 0.0,
- "oversampling": "None",
- "release": 5.0,
- "sidechain-preamp": 0.0,
- "stereo-link": 100.0,
- "threshold": 0.0
- },
- "plugins_order": [
- "limiter#0",
- "compressor#0",
- "reverb#0"
- ],
- "reverb#0": {
- "amount": -12.0,
- "bass-cut": 300.0,
- "bypass": true,
- "decay-time": 1.5,
- "diffusion": 0.5,
- "dry": 0.0,
- "hf-damp": 5000.0,
- "input-gain": 0.0,
- "output-gain": 0.0,
- "predelay": 0.0,
- "room-size": "Large",
- "treble-cut": 5000.0
- }
- }
-}
diff --git a/users/youwen/linux/easyeffects/input/Studio.json b/users/youwen/linux/easyeffects/input/Studio.json
deleted file mode 100644
index 05e1675c..00000000
--- a/users/youwen/linux/easyeffects/input/Studio.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "input": {
- "blocklist": [],
- "compressor#0": {
- "attack": 20.0,
- "boost-amount": 6.0,
- "boost-threshold": -72.0,
- "bypass": false,
- "dry": -100.0,
- "hpf-frequency": 10.0,
- "hpf-mode": "off",
- "input-gain": 0.0,
- "knee": -6.0,
- "lpf-frequency": 20000.0,
- "lpf-mode": "off",
- "makeup": 0.0,
- "mode": "Downward",
- "output-gain": 0.0,
- "ratio": 4.0,
- "release": 100.0,
- "release-threshold": -100.0,
- "sidechain": {
- "lookahead": 0.0,
- "mode": "RMS",
- "preamp": 0.0,
- "reactivity": 10.0,
- "source": "Middle",
- "stereo-split-source": "Left/Right",
- "type": "Feed-forward"
- },
- "stereo-split": false,
- "threshold": -12.0,
- "wet": 0.0
- },
- "limiter#0": {
- "alr": false,
- "alr-attack": 5.0,
- "alr-knee": 0.0,
- "alr-release": 50.0,
- "attack": 5.0,
- "bypass": false,
- "dithering": "None",
- "external-sidechain": false,
- "gain-boost": true,
- "input-gain": 0.0,
- "lookahead": 5.0,
- "mode": "Herm Thin",
- "output-gain": 0.0,
- "oversampling": "None",
- "release": 5.0,
- "sidechain-preamp": 0.0,
- "stereo-link": 100.0,
- "threshold": 0.0
- },
- "plugins_order": ["limiter#0", "compressor#0", "reverb#0"],
- "reverb#0": {
- "amount": -12.0,
- "bass-cut": 300.0,
- "bypass": false,
- "decay-time": 0.4,
- "diffusion": 0.5,
- "dry": 0.0,
- "hf-damp": 5000.0,
- "input-gain": 0.0,
- "output-gain": 0.0,
- "predelay": 0.0,
- "room-size": "Large",
- "treble-cut": 5000.0
- }
- }
-}
diff --git a/users/youwen/linux/easyeffects/output/Arctis Pro EQ.json b/users/youwen/linux/easyeffects/output/Arctis Pro EQ.json
deleted file mode 100644
index 3f774c88..00000000
--- a/users/youwen/linux/easyeffects/output/Arctis Pro EQ.json
+++ /dev/null
@@ -1,243 +0,0 @@
-{
- "output": {
- "blocklist": [],
- "equalizer#0": {
- "balance": 0.0,
- "bypass": false,
- "input-gain": -8.61,
- "left": {
- "band0": {
- "frequency": 105.0,
- "gain": -0.6000000238418579,
- "mode": "APO (DR)",
- "mute": false,
- "q": 0.699999988079071,
- "slope": "x1",
- "solo": false,
- "type": "Lo-shelf",
- "width": 4.0
- },
- "band1": {
- "frequency": 50.0,
- "gain": 3.9000000953674316,
- "mode": "APO (DR)",
- "mute": false,
- "q": 2.0399999618530273,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band2": {
- "frequency": 135.6999969482422,
- "gain": -1.5,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.149999976158142,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band3": {
- "frequency": 361.3999938964844,
- "gain": 3.0999999046325684,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.159999966621399,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band4": {
- "frequency": 1135.300048828125,
- "gain": -4.599999904632568,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.2200000286102295,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band5": {
- "frequency": 2703.699951171875,
- "gain": -3.799999952316284,
- "mode": "APO (DR)",
- "mute": false,
- "q": 2.799999952316284,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band6": {
- "frequency": 3766.800048828125,
- "gain": 9.399999618530273,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.8300000429153442,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band7": {
- "frequency": 5260.39990234375,
- "gain": 5.0,
- "mode": "APO (DR)",
- "mute": false,
- "q": 3.609999895095825,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band8": {
- "frequency": 8775.2998046875,
- "gain": -7.400000095367432,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.75,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band9": {
- "frequency": 10000.0,
- "gain": -2.299999952316284,
- "mode": "APO (DR)",
- "mute": false,
- "q": 0.699999988079071,
- "slope": "x1",
- "solo": false,
- "type": "Hi-shelf",
- "width": 4.0
- }
- },
- "mode": "IIR",
- "num-bands": 10,
- "output-gain": 3.9,
- "pitch-left": 0.0,
- "pitch-right": 0.0,
- "right": {
- "band0": {
- "frequency": 105.0,
- "gain": -0.6000000238418579,
- "mode": "APO (DR)",
- "mute": false,
- "q": 0.699999988079071,
- "slope": "x1",
- "solo": false,
- "type": "Lo-shelf",
- "width": 4.0
- },
- "band1": {
- "frequency": 50.0,
- "gain": 3.9000000953674316,
- "mode": "APO (DR)",
- "mute": false,
- "q": 2.0399999618530273,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band2": {
- "frequency": 135.6999969482422,
- "gain": -1.5,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.149999976158142,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band3": {
- "frequency": 361.3999938964844,
- "gain": 3.0999999046325684,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.159999966621399,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band4": {
- "frequency": 1135.300048828125,
- "gain": -4.599999904632568,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.2200000286102295,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band5": {
- "frequency": 2703.699951171875,
- "gain": -3.799999952316284,
- "mode": "APO (DR)",
- "mute": false,
- "q": 2.799999952316284,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band6": {
- "frequency": 3766.800048828125,
- "gain": 9.399999618530273,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.8300000429153442,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band7": {
- "frequency": 5260.39990234375,
- "gain": 5.0,
- "mode": "APO (DR)",
- "mute": false,
- "q": 3.609999895095825,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band8": {
- "frequency": 8775.2998046875,
- "gain": -7.400000095367432,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.75,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band9": {
- "frequency": 10000.0,
- "gain": -2.299999952316284,
- "mode": "APO (DR)",
- "mute": false,
- "q": 0.699999988079071,
- "slope": "x1",
- "solo": false,
- "type": "Hi-shelf",
- "width": 4.0
- }
- },
- "split-channels": false
- },
- "plugins_order": [
- "equalizer#0"
- ]
- }
-}
diff --git a/users/youwen/linux/easyeffects/output/Default.json b/users/youwen/linux/easyeffects/output/Default.json
deleted file mode 100644
index 02e450d1..00000000
--- a/users/youwen/linux/easyeffects/output/Default.json
+++ /dev/null
@@ -1,243 +0,0 @@
-{
- "output": {
- "blocklist": [],
- "equalizer#0": {
- "balance": 0.0,
- "bypass": true,
- "input-gain": -8.61,
- "left": {
- "band0": {
- "frequency": 105.0,
- "gain": -0.6000000238418579,
- "mode": "APO (DR)",
- "mute": false,
- "q": 0.699999988079071,
- "slope": "x1",
- "solo": false,
- "type": "Lo-shelf",
- "width": 4.0
- },
- "band1": {
- "frequency": 50.0,
- "gain": 3.9000000953674316,
- "mode": "APO (DR)",
- "mute": false,
- "q": 2.0399999618530273,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band2": {
- "frequency": 135.6999969482422,
- "gain": -1.5,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.149999976158142,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band3": {
- "frequency": 361.3999938964844,
- "gain": 3.0999999046325684,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.159999966621399,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band4": {
- "frequency": 1135.300048828125,
- "gain": -4.599999904632568,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.2200000286102295,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band5": {
- "frequency": 2703.699951171875,
- "gain": -3.799999952316284,
- "mode": "APO (DR)",
- "mute": false,
- "q": 2.799999952316284,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band6": {
- "frequency": 3766.800048828125,
- "gain": 9.399999618530273,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.8300000429153442,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band7": {
- "frequency": 5260.39990234375,
- "gain": 5.0,
- "mode": "APO (DR)",
- "mute": false,
- "q": 3.609999895095825,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band8": {
- "frequency": 8775.2998046875,
- "gain": -7.400000095367432,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.75,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band9": {
- "frequency": 10000.0,
- "gain": -2.299999952316284,
- "mode": "APO (DR)",
- "mute": false,
- "q": 0.699999988079071,
- "slope": "x1",
- "solo": false,
- "type": "Hi-shelf",
- "width": 4.0
- }
- },
- "mode": "IIR",
- "num-bands": 10,
- "output-gain": 3.9,
- "pitch-left": 0.0,
- "pitch-right": 0.0,
- "right": {
- "band0": {
- "frequency": 105.0,
- "gain": -0.6000000238418579,
- "mode": "APO (DR)",
- "mute": false,
- "q": 0.699999988079071,
- "slope": "x1",
- "solo": false,
- "type": "Lo-shelf",
- "width": 4.0
- },
- "band1": {
- "frequency": 50.0,
- "gain": 3.9000000953674316,
- "mode": "APO (DR)",
- "mute": false,
- "q": 2.0399999618530273,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band2": {
- "frequency": 135.6999969482422,
- "gain": -1.5,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.149999976158142,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band3": {
- "frequency": 361.3999938964844,
- "gain": 3.0999999046325684,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.159999966621399,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band4": {
- "frequency": 1135.300048828125,
- "gain": -4.599999904632568,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.2200000286102295,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band5": {
- "frequency": 2703.699951171875,
- "gain": -3.799999952316284,
- "mode": "APO (DR)",
- "mute": false,
- "q": 2.799999952316284,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band6": {
- "frequency": 3766.800048828125,
- "gain": 9.399999618530273,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.8300000429153442,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band7": {
- "frequency": 5260.39990234375,
- "gain": 5.0,
- "mode": "APO (DR)",
- "mute": false,
- "q": 3.609999895095825,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band8": {
- "frequency": 8775.2998046875,
- "gain": -7.400000095367432,
- "mode": "APO (DR)",
- "mute": false,
- "q": 1.75,
- "slope": "x1",
- "solo": false,
- "type": "Bell",
- "width": 4.0
- },
- "band9": {
- "frequency": 10000.0,
- "gain": -2.299999952316284,
- "mode": "APO (DR)",
- "mute": false,
- "q": 0.699999988079071,
- "slope": "x1",
- "solo": false,
- "type": "Hi-shelf",
- "width": 4.0
- }
- },
- "split-channels": false
- },
- "plugins_order": [
- "equalizer#0"
- ]
- }
-}
diff --git a/users/youwen/linux/home.nix b/users/youwen/linux/home.nix
deleted file mode 100755
index ecfd013e..00000000
--- a/users/youwen/linux/home.nix
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- config,
- pkgs,
- ...
-}: {
- home.username = "youwen";
- home.homeDirectory = "/home/youwen";
-
- # link the configuration file in current directory to the specified location in home directory
- # home.file.".config/i3/wallpaper.jpg".source = ./wallpaper.jpg;
-
- # link all files in `./scripts` to `~/.config/i3/scripts`
- # home.file.".config/i3/scripts" = {
- # source = ./scripts;
- # recursive = true; # link recursively
- # executable = true; # make all files executable
- # };
-
- # encode the file content in nix configuration file directly
- # home.file.".xxx".text = ''
- # xxx
- # '';
-
- home.file.".wallpapers" = {
- source = ../../../wallpapers;
- recursive = true;
- };
-
- home.file.".config/easyeffects/input" = {
- source = ./easyeffects/input;
- recursive = true;
- };
-
- home.file.".config/easyeffects/output" = {
- source = ./easyeffects/output;
- recursive = true;
- };
- # This value determines the home Manager release that your
- # configuration is compatible with. This helps avoid breakage
- # when a new home Manager release introduces backwards
- # incompatible changes.
- home.stateVersion = "24.05";
- #
- # You can update home Manager without changing this value. See
- # the home Manager release notes for a list of state version
- # changes in each release.
-
- # Audio effects and EQ tool
- services.easyeffects.enable = true;
- services.easyeffects.package = pkgs.easyeffects;
-
- # Notification daemon
- services.dunst = {
- enable = true;
- catppuccin.enable = true;
- iconTheme = {
- name = "Papirus-Dark";
- package = pkgs.papirus-icon-theme;
- size = "32x32";
- };
- };
-
- # Currently non-functional
- programs.wlogout.enable = true;
- programs.rofi = {
- enable = true;
- package = pkgs.rofi-wayland;
- theme = "gruvbox-dark";
- };
-
- # Let home Manager install and manage itself.
- programs.home-manager.enable = true;
-}
diff --git a/users/youwen/linux/hyprland/common.nix b/users/youwen/linux/hyprland/common.nix
deleted file mode 100644
index c0facf2b..00000000
--- a/users/youwen/linux/hyprland/common.nix
+++ /dev/null
@@ -1,296 +0,0 @@
-{pkgs, ...}: {
- wayland.windowManager.hyprland = {
- enable = true;
- settings = {
- exec-once = ["waypaper --restore"];
- "$mod" = "SUPER";
- "$Left" = "Y";
- "$Right" = "O";
- "$Up" = "I";
- "$Down" = "U";
- env = [
- "HYPRCURSOR_THEME,Bibata-Modern-Ice"
- "HYPRCURSOR_SIZE,26"
- "XCURSOR_THEME,Bibata-Modern-Ice"
- "XCURSOR_SIZE,26"
- ];
- bind = [
- # Application Keybinds
- "$mod, F, exec, librewolf"
- "$mod, T, exec, kitty"
- "$mod, E, exec, dolphin"
- "$mod, R, exec, pavucontrol"
-
- # Window actions
- "$mod, Q, killactive"
- "$mod, W, togglefloating"
- "$mod, J, togglesplit"
- "$mod, Return, fullscreen"
-
- # Move around
- "$mod, $Left, movefocus, l"
- "$mod, $Right, movefocus, r"
- "$mod, $Up, movefocus, u"
- "$mod, $Down, movefocus, d"
-
- "$mod, 1, workspace, 1"
- "$mod, 2, workspace, 2"
- "$mod, 3, workspace, 3"
- "$mod, 4, workspace, 4"
- "$mod, 5, workspace, 5"
- "$mod, 6, workspace, 6"
- "$mod, 7, workspace, 7"
- "$mod, 8, workspace, 8"
- "$mod, 9, workspace, 9"
- "$mod, 0, workspace, 10"
-
- "$mod, S, togglespecialworkspace"
-
- # Move windows around
- "$mod+Shift+Ctrl, $Left, movewindow, l"
- "$mod+Shift+Ctrl, $Right, movewindow, r"
- "$mod+Shift+Ctrl, $Up, movewindow, u"
- "$mod+Shift+Ctrl, $Down, movewindow, d"
-
- "$mod+Ctrl+Alt, $Right, movetoworkspace, r+1"
- "$mod+Ctrl+Alt, $Left, movetoworkspace, r-1"
-
- "$mod+Ctrl, $Right, workspace, r+1"
- "$mod+Ctrl, $Left, workspace, r-1"
-
- "$mod+Alt, S, movetoworkspacesilent, special"
-
- # Utilities
- "$mod, Space, exec, pkill -x rofi || rofi -show drun" # Run rofi
-
- ''$mod, P, exec, grim -g "$(slurp)" - | swappy -f -'' # Screenshot
-
- "$mod, Backspace, exec, wlogout" # show logout menu
-
- "$mod, L, exec, hyprlock"
-
- # System control
- ",XF86MonBrightnessDown, exec, brightnessctl set 5%-"
- ",XF86MonBrightnessUp, exec, brightnessctl set 5%+"
- ",XF86AudioRaiseVolume, exec, pamixer -i 5"
- ",XF86AudioLowerVolume, exec, pamixer -d 5"
- ",XF86AudioMute, exec, pamixer -t"
- ];
- bindm = [
- "$mod, mouse:272, movewindow"
- "$mod, mouse:273, resizewindow"
- "$mod, Z, movewindow"
- "$mod, X, resizewindow"
- ];
- windowrulev2 = [
- "opacity 0.90 0.90,class:^(librewolf)$"
- "opacity 0.90 0.90,class:^(Brave-browser)$"
- "opacity 0.80 0.80,class:^(Steam)$"
- "opacity 0.80 0.80,class:^(steam)$"
- "opacity 0.80 0.80,class:^(steamwebhelper)$"
- "opacity 0.80 0.80,class:^(Spotify)$"
- "opacity 0.80 0.80,initialTitle:^(Spotify Premium)$"
- "opacity 0.80 0.80,initialTitle:^(Spotify Free)$"
- "opacity 0.80 0.80,class:^(code-oss)$"
- "opacity 0.80 0.80,class:^(Code)$"
- "opacity 0.80 0.80,class:^(code-url-handler)$"
- "opacity 0.80 0.80,class:^(code-insiders-url-handler)$"
- "opacity 0.80 0.80,class:^(kitty)$"
- "opacity 0.80 0.80,class:^(org.kde.dolphin)$"
- "opacity 0.80 0.80,class:^(org.kde.ark)$"
- "opacity 0.80 0.80,class:^(nwg-look)$"
- "opacity 0.80 0.80,class:^(qt5ct)$"
- "opacity 0.80 0.80,class:^(qt6ct)$"
- "opacity 0.80 0.80,class:^(kvantummanager)$"
-
- "opacity 0.90 0.90,class:^(com.github.rafostar.Clapper)$ # Clapper-Gtk"
- "opacity 0.80 0.80,class:^(com.github.tchx84.Flatseal)$ # Flatseal-Gtk"
- "opacity 0.80 0.80,class:^(hu.kramo.Cartridges)$ # Cartridges-Gtk"
- "opacity 0.80 0.80,class:^(com.obsproject.Studio)$ # Obs-Qt"
- "opacity 0.80 0.80,class:^(gnome-boxes)$ # Boxes-Gtk"
- "opacity 0.80 0.80,class:^(discord)$ # Discord-Electron"
- "opacity 0.80 0.80,class:^(vesktop)$ # Vesktop-Electron"
- "opacity 0.80 0.80,class:^(ArmCord)$ # ArmCord-Electron"
- "opacity 0.80 0.80,class:^(app.drey.Warp)$ # Warp-Gtk"
- "opacity 0.80 0.80,class:^(net.davidotek.pupgui2)$ # ProtonUp-Qt"
- "opacity 0.80 0.80,class:^(yad)$ # Protontricks-Gtk"
- "opacity 0.80 0.80,class:^(signal)$ # Signal-Gtk"
- "opacity 0.80 0.80,class:^(io.github.alainm23.planify)$ # planify-Gtk"
- "opacity 0.80 0.80,class:^(io.gitlab.theevilskeleton.Upscaler)$ # Upscaler-Gtk"
- "opacity 0.80 0.80,class:^(com.github.unrud.VideoDownloader)$ # VideoDownloader-Gtk"
- "opacity 0.80 0.80,class:^(lutris)$ # Lutris game launcher"
-
- "opacity 0.80 0.70,class:^(pavucontrol)$"
- "opacity 0.80 0.70,class:^(blueman-manager)$"
- "opacity 0.80 0.70,class:^(nm-applet)$"
- "opacity 0.80 0.70,class:^(nm-connection-editor)$"
- "opacity 0.80 0.70,class:^(org.kde.polkit-kde-authentication-agent-1)$"
-
- "float,class:^(org.kde.dolphin)$,title:^(Progress Dialog — Dolphin)$"
- "float,class:^(org.kde.dolphin)$,title:^(Copying — Dolphin)$"
- "float,title:^(Picture-in-Picture)$"
- "float,class:^(librewolf)$,title:^(Library)$"
- "float,class:^(vlc)$"
- "float,class:^(kvantummanager)$"
- "float,class:^(qt5ct)$"
- "float,class:^(qt6ct)$"
- "float,class:^(nwg-look)$"
- "float,class:^(org.kde.ark)$"
- "float,class:^(com.github.rafostar.Clapper)$ # Clapper-Gtk"
- "float,class:^(app.drey.Warp)$ # Warp-Gtk"
- "float,class:^(net.davidotek.pupgui2)$ # ProtonUp-Qt"
- "float,class:^(yad)$ # Protontricks-Gtk"
- "float,class:^(eog)$ # Imageviewer-Gtk"
- "float,class:^(io.github.alainm23.planify)$ # planify-Gtk"
- "float,class:^(io.gitlab.theevilskeleton.Upscaler)$ # Upscaler-Gtk"
- "float,class:^(com.github.unrud.VideoDownloader)$ # VideoDownloader-Gkk"
- "float,class:^(pavucontrol)$"
- "float,class:^(blueman-manager)$"
- "float,class:^(nm-applet)$"
- "float,class:^(nm-connection-editor)$"
- "float,class:^(org.kde.polkit-kde-authentication-agent-1)$"
- "opacity 0.80 0.80,class:^(org.freedesktop.impl.portal.desktop.gtk)$"
- "opacity 0.80 0.80,class:^(org.freedesktop.impl.portal.desktop.hyprland)$"
- ];
- layerrule = [
- "blur,rofi"
- "ignorezero,rofi"
- "blur,notifications"
- "ignorezero,notifications"
- "blur,swaync-notification-window"
- "ignorezero,swaync-notification-window"
- "blur,swaync-control-center"
- "ignorezero,swaync-control-center"
- "blur,logout_dialog"
- ];
- monitor = ["DP-1,2560x1440@165,1920x0,auto" "HDMI-A-1,1920x1080@60,0x0,1"];
- dwindle = {
- pseudotile = "yes";
- preserve_split = "yes";
- };
- animations = {
- enabled = "yes";
- bezier = [
- "wind, 0.05, 0.9, 0.1, 1.05"
- "winIn, 0.1, 1.1, 0.1, 1.1"
- "winOut, 0.3, -0.3, 0, 1"
- "liner, 1, 1, 1, 1"
- ];
- animation = [
- "windows, 1, 6, wind, slide"
- "windowsIn, 1, 6, winIn, slide"
- "windowsOut, 1, 5, winOut, slide"
- "windowsMove, 1, 5, wind, slide"
- "border, 1, 1, liner"
- "borderangle, 1, 30, liner, loop"
- "fade, 1, 10, default"
- "workspaces, 1, 5, wind"
- ];
- };
-
- general = {
- gaps_in = "3";
- gaps_out = "8";
- border_size = "2";
- #
- # the dot is a hyprland name, not nix syntax, so we escape it
- "col.active_border" = "rgba(ca9ee6ff) rgba(f2d5cfff) 45deg";
- "col.inactive_border" = "rgba(b4befecc) rgba(6c7086cc) 45deg";
- layout = "dwindle";
- resize_on_border = "true";
- sensitivity = "0.5";
- };
-
- misc = {
- disable_hyprland_logo = true;
- disable_splash_rendering = true;
- };
-
- cursor = {
- hide_on_key_press = true;
- };
-
- decoration = {
- rounding = "10";
- drop_shadow = "false";
- dim_special = "0.3";
- blur = {
- enabled = "yes";
- size = "6";
- passes = "3";
- new_optimizations = "on";
- ignore_opacity = "on";
- xray = "false";
- special = true;
- };
- };
- };
- };
-
- programs.hyprlock = {
- enable = true;
- settings = {
- general = {
- hide_cursor = true;
- grace = 1;
- };
- background = {
- monitor = "";
- path = "screenshot";
- blur_passes = 3;
- blur_size = 7;
- noise = 1.17e-2;
- contrast = 0.8916;
- brightness = 0.8172;
- vibrancy = 0.1696;
- vibrancy_darkness = 0.0;
- };
- input-field = {
- monitor = "";
- size = "200, 50";
- outline_thickness = 3;
- dots_size = 0.33;
- dots_spacing = 0.15;
- dots_center = false;
- dots_rounding = -1;
- outer_color = "rgb(151515)";
- inner_color = "rgb(200, 200, 200)";
- font_color = "rgb(10, 10, 10)";
- fade_on_empty = true;
- fade_timeout = 1000;
- placeholder_text = "Input Password...";
- hide_input = false;
- rounding = -1;
- check_color = "rgb(204, 136, 34)";
- fail_color = "rgb(204, 34, 34)";
- fail_text = "$FAIL ($ATTEMPTS)";
- fail_timeout = 2000;
- fail_transition = 300;
- capslock_color = -1;
- numlock_color = -1;
- bothlock_color = -1;
- invert_numlock = false;
- swap_font_color = false;
-
- position = "0, -20";
- halign = "center";
- valign = "center";
- };
- };
- };
-
- services.hypridle = {
- enable = true;
- settings = {
- lock_cmd = "pidof hyprlock || hyprlock"; # avoid starting multiple hyprlock instances.
- before_sleep_cmd = "loginctl lock-session"; # lock before suspend.
- after_sleep_cmd = "hyprctl dispatch dpms on"; # to avoid having to press a key twice to turn on the display.
- };
- };
-
- xdg.portal = {
- enable = true;
- configPackages = [pkgs.xdg-desktop-portal-hyprland];
- extraPortals = [pkgs.xdg-desktop-portal-hyprland];
- };
-}
diff --git a/users/youwen/linux/hyprland/desktop/default.nix b/users/youwen/linux/hyprland/desktop/default.nix
deleted file mode 100644
index ec1d3bc9..00000000
--- a/users/youwen/linux/hyprland/desktop/default.nix
+++ /dev/null
@@ -1 +0,0 @@
-{imports = [../common.nix];}
diff --git a/users/youwen/linux/hyprland/laptop/default.nix b/users/youwen/linux/hyprland/laptop/default.nix
deleted file mode 100644
index 65120997..00000000
--- a/users/youwen/linux/hyprland/laptop/default.nix
+++ /dev/null
@@ -1,17 +0,0 @@
-{lib, ...}: {
- imports = [../common.nix];
- wayland.windowManager.hyprland.settings.input.touchpad = {
- natural_scroll = true;
- disable_while_typing = true;
- clickfinger_behavior = true;
- tap-to-click = false;
- scroll_factor = 0.5;
- };
- wayland.windowManager.hyprland.settings.general.sensitivity = lib.mkForce 1.0;
- wayland.windowManager.hyprland.settings.env = [
- "HYPRCURSOR_THEME,Bibata-Modern-Ice"
- "HYPRCURSOR_SIZE,24"
- "XCURSOR_THEME,Bibata-Modern-Ice"
- "XCURSOR_SIZE,24"
- ];
-}
diff --git a/users/youwen/linux/laptop/default.nix b/users/youwen/linux/laptop/default.nix
deleted file mode 100644
index 601aeeaf..00000000
--- a/users/youwen/linux/laptop/default.nix
+++ /dev/null
@@ -1,6 +0,0 @@
-{pkgs, ...}: {
- imports = [../theming ../home.nix ../programs ../hyprland/laptop ../waybar/laptop];
-
- # some overrides for laptop specifically
- programs.kitty.settings.font_size = pkgs.lib.mkForce 11;
-}
diff --git a/users/youwen/linux/packages/aarch-64/default.nix b/users/youwen/linux/packages/aarch-64/default.nix
deleted file mode 100644
index 5cc9a494..00000000
--- a/users/youwen/linux/packages/aarch-64/default.nix
+++ /dev/null
@@ -1,3 +0,0 @@
-{pkgs, ...}: let
- createCommon = import ../common-packages.nix;
-in {home.packages = (createCommon pkgs) ++ [];}
diff --git a/users/youwen/linux/packages/common-packages.nix b/users/youwen/linux/packages/common-packages.nix
deleted file mode 100644
index 68bf4f56..00000000
--- a/users/youwen/linux/packages/common-packages.nix
+++ /dev/null
@@ -1,50 +0,0 @@
-pkgs:
-with pkgs; [
- neofetch
-
- # archives
- zip
- xz
- unzip
- p7zip
-
- # utils
- nurl # helps fetch git data for nixpkgs
-
- # nix related
- #
- # it provides the command `nom` works just like `nix`
- # with more details log output
- nix-output-monitor
-
- # system tools
- pciutils # lspci
- usbutils # lsusb
-
- # desktop utils
- wl-clipboard
- grim
- slurp
- swappy
- pavucontrol
- waypaper
- swaybg
- pamixer
- brightnessctl
- bitwarden-cli
-
- # desktop apps
- dolphin
- thunderbird
- vesktop
- signal-desktop
-
- gcc
-
- # desktop ricing
- bibata-cursors
- libsForQt5.qtstyleplugin-kvantum
- libsForQt5.qt5ct
- papirus-icon-theme
- libsForQt5.qt5ct
-]
diff --git a/users/youwen/linux/packages/x86_64/default.nix b/users/youwen/linux/packages/x86_64/default.nix
deleted file mode 100644
index b8d166ac..00000000
--- a/users/youwen/linux/packages/x86_64/default.nix
+++ /dev/null
@@ -1,15 +0,0 @@
-{pkgs, ...}: let
- createCommon = import ../common-packages.nix;
-in {
- home.packages =
- (createCommon pkgs)
- ++ (with pkgs; [
- spotify
- bitwarden-desktop
- modrinth-app
- lutris
- wine
- sbctl
- r2modman
- ]);
-}
diff --git a/users/youwen/linux/programs/default.nix b/users/youwen/linux/programs/default.nix
deleted file mode 100644
index 15dd19ac..00000000
--- a/users/youwen/linux/programs/default.nix
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- programs.kitty = {
- enable = true;
- theme = "Tokyo Night";
- font.name = "CaskaydiaCove Nerd Font";
- settings = {
- font_size = 12;
- window_padding_width = "8 8 0";
- confirm_os_window_close = -1;
- shell_integration = "enabled";
- enable_audio_bell = "no";
- background_opacity = "0.8";
- allow_remote_control = "socket-only";
- listen_on = "unix:/tmp/kitty";
- action_alias = "kitty_scrollback_nvim kitten /home/youwen/.local/share/nvim/lazy/kitty-scrollback.nvim/python/kitty_scrollback_nvim.py";
- };
- keybindings = {
- "kitty_mod+h" = "kitty_scrollback_nvim";
- "kitty_mod+g" = "kitty_scrollback_nvim --config ksb_builtin_last_cmd_output";
- };
- };
-
- programs.librewolf = {
- enable = true;
- settings = {
- "webgl.disabled" = false;
- "privacy.resistFingerprinting" = false;
- "privacy.clearOnShutdown.history" = false;
- "privacy.clearOnShutdown.cookies" = false;
- "network.cookie.lifetimePolicy" = 0;
- };
- };
-}
diff --git a/users/youwen/linux/theming/catppuccin.nix b/users/youwen/linux/theming/catppuccin.nix
deleted file mode 100755
index e6b4b433..00000000
--- a/users/youwen/linux/theming/catppuccin.nix
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- programs.fzf.catppuccin = {
- enable = true;
- flavor = "macchiato";
- };
- programs.lazygit.catppuccin = {
- enable = true;
- flavor = "macchiato";
- };
- programs.bat.catppuccin = {
- enable = true;
- flavor = "macchiato";
- };
- programs.fish.catppuccin = {
- enable = true;
- flavor = "mocha";
- };
- programs.yazi.catppuccin = {
- enable = true;
- flavor = "macchiato";
- };
-}
diff --git a/users/youwen/linux/theming/default.nix b/users/youwen/linux/theming/default.nix
deleted file mode 100644
index dd85c96a..00000000
--- a/users/youwen/linux/theming/default.nix
+++ /dev/null
@@ -1,28 +0,0 @@
-{pkgs, ...}: {
- imports = [./catppuccin.nix];
-
- gtk = {
- enable = true;
- catppuccin.enable = true;
- cursorTheme = {
- name = "Bibata-Modern-Ice";
- size = 26;
- };
- iconTheme = {name = "Papirus-Dark";};
- };
-
- qt = {
- enable = true;
- platformTheme.name = "qtct";
- style.name = "kvantum";
- };
-
- xdg.configFile = {
- "Kvantum/kvantum.kvconfig".text = ''
- [General]
- theme=GraphiteNordDark
- '';
-
- "Kvantum/GraphiteNord".source = "${pkgs.graphite-kde-theme}/share/Kvantum/GraphiteNord";
- };
-}
diff --git a/users/youwen/linux/waybar/desktop/default.nix b/users/youwen/linux/waybar/desktop/default.nix
deleted file mode 100644
index 1e2f773a..00000000
--- a/users/youwen/linux/waybar/desktop/default.nix
+++ /dev/null
@@ -1,91 +0,0 @@
-{
- programs.waybar = {
- enable = true;
- settings = {
- mainBar = {
- layer = "top";
- position = "top";
- height = 24;
- width = 1600;
- reload-style-on-change = true;
- margin = "10px 0px 0px 0px";
- modules-left = ["hyprland/window" "hyprland/workspaces"];
- modules-right = ["backlight" "group/adjustable" "custom/weather"];
- modules-center = ["network" "group/hardware" "clock"];
- "hyprland/workspaces" = {
- active-only = false;
- all-outputs = false;
- format = "{icon}";
- persistent-workspaces = {
- eDP-1 = [1];
- DP-1 = [2 3 4 5];
- };
- };
- "group/hardware" = {
- orientation = "inherit";
- modules = ["cpu" "memory" "battery"];
- };
- "group/adjustable" = {
- orientation = "inherit";
- drawer = {
- transition-duration = 500;
- transition-left-to-right = true;
- };
- modules = ["pulseaudio" "mpris"];
- };
- "custom/weather" = {
- orientation = "horizontal";
- exec = ''curl wttr.in/?format="%l:%20%t"'';
- interval = 10;
- };
- cpu = {
- interval = 10;
- format = "{usage}% ";
- };
- memory = {
- interval = 10;
- format = "{percentage}% ";
- };
- # mpris = {
- # format-playing = " {title} ";
- # format-paused = " {title} ";
- # format-stopped = "Nothing Playing";
- # };
- tray = {spacing = 10;};
- clock = {format = "{:%a %b %d, %I:%M %p} ";};
- backlight = {
- device = "intel_backlight";
- format = "{percent}% {icon}";
- format-icons = ["" ""];
- };
- battery = {
- states = {
- good = 95;
- warning = 20;
- critical = 10;
- };
- format = "{capacity}% {icon}";
- format-icons = ["" "" "" "" ""];
- };
- "hyprland/window" = {format = "{class}";};
- network = {
- format-wifi = "{essid} ";
- format-linked = "{ifname} (No IP) ";
- format-disconnected = "Disconnected ⚠";
- format-alt = "{ifname}: {ipaddr}/{cidr}";
- };
- pulseaudio = {
- format = "{volume}% {icon} {format_source}";
- format-bluetooth = "{volume}% {icon} {format_source}";
- format-bluetooth-muted = " {icon} {format_source}";
- format-muted = " {format_source}";
- format-source = "{volume}% ";
- format-source-muted = "";
- format-icons = {default = ["" "" ""];};
- };
- };
- };
- style = ./waybar.css;
- systemd.enable = true;
- };
-}
diff --git a/users/youwen/linux/waybar/desktop/waybar.css b/users/youwen/linux/waybar/desktop/waybar.css
deleted file mode 100755
index 7bd333f1..00000000
--- a/users/youwen/linux/waybar/desktop/waybar.css
+++ /dev/null
@@ -1,102 +0,0 @@
-* {
- font-size: 10px;
- font-family: CaskaydiaCove Nerd Font;
-}
-
-window#waybar {
- border-bottom: 0px solid #ffffff;
- background: transparent;
- transition-property: none;
- transition-duration: 0s;
-}
-
-#workspaces {
- background: #24273a;
- padding: 0px 2px 0px 2px;
- margin: 0px 0px 0px 5px;
- border-radius: 5px;
-}
-
-#workspaces {
- background: #24273a;
- padding: 0px 5px 0px 5px;
- margin: 0px 0px 0px 5px;
- border-radius: 5px;
-}
-
-#workspaces button,
-#workspaces button:hover {
- padding: 0;
- background-color: #24273a;
- /* color: @color4; */
-}
-#workspaces button.active,
-#workspaces button:hover {
- /* color: @color8; */
-}
-
-#clock,
-#pulseaudio,
-#network,
-#battery,
-#tray,
-#mpris,
-#cpu,
-#memory,
-#temperature,
-#custom-weather,
-#window,
-#backlight {
- background-color: #24273a;
- /* color: @color4; */
- opacity: 1;
- border-radius: 5px;
- padding: 1px 10px 1px 10px;
- margin: 0px 5px 0px 0px;
-}
-#backlight {
- margin-right: 0px;
- padding-right: 3px;
- border-top-right-radius: 0px;
- border-bottom-right-radius: 0px;
-}
-#mpris {
- padding-left: 0px;
- margin-left: 0px;
- margin-right: 5px;
- padding-right: 0px;
-}
-#pulseaudio {
- padding-left: 5px;
- padding-right: 5px;
- margin-left: 0px;
- margin-right: 5px;
- border-top-left-radius: 0px;
- border-bottom-left-radius: 0px;
-}
-#memory,
-#cpu {
- padding-right: 2px;
- /* border-top-right-radius: 0px; */
- /* border-bottom-right-radius: 0px; */
- /* border-right-width: 0px; */
-}
-#memory,
-#battery {
- margin-left: 0px;
- padding-left: 2px;
- border-top-left-radius: 0px;
- border-bottom-left-radius: 0px;
- border-left-width: 0px;
-}
-#battery {
- padding-right: 13px;
-}
-#custom-weather {
- margin-right: 0px;
-}
-
-#window {
- margin-right: 0px;
- margin-left: 0px;
-}
diff --git a/users/youwen/linux/waybar/laptop/default.nix b/users/youwen/linux/waybar/laptop/default.nix
deleted file mode 100644
index f21e0ec4..00000000
--- a/users/youwen/linux/waybar/laptop/default.nix
+++ /dev/null
@@ -1,91 +0,0 @@
-{
- programs.waybar = {
- enable = true;
- settings = {
- mainBar = {
- layer = "top";
- position = "top";
- height = 24;
- # width = 1000;
- reload-style-on-change = true;
- margin = "5px 0px 0px 0px";
- modules-left = ["hyprland/window" "hyprland/workspaces" "network" "clock"];
- modules-right = ["group/hardware" "backlight" "group/adjustable" "custom/weather"];
- # modules-center = [ "network" "group/hardware" "clock" ];
- "hyprland/workspaces" = {
- active-only = false;
- all-outputs = false;
- format = "{icon}";
- persistent-workspaces = {
- eDP-1 = [1];
- DP-1 = [2 3 4 5];
- };
- };
- "group/hardware" = {
- orientation = "inherit";
- modules = ["cpu" "battery"];
- };
- "group/adjustable" = {
- orientation = "inherit";
- drawer = {
- transition-duration = 500;
- transition-left-to-right = true;
- };
- modules = ["pulseaudio" "mpris"];
- };
- "custom/weather" = {
- orientation = "horizontal";
- exec = ''curl wttr.in/?format="%l:%20%t"'';
- interval = 10;
- };
- cpu = {
- interval = 10;
- format = "{usage}% ";
- };
- memory = {
- interval = 10;
- format = "{percentage}% ";
- };
- # mpris = {
- # format-playing = " {title} ";
- # format-paused = " {title} ";
- # format-stopped = "Nothing Playing";
- # };
- tray = {spacing = 10;};
- clock = {format = "{:%a %b %d, %I:%M %p} ";};
- backlight = {
- device = "intel_backlight";
- format = "{percent}% {icon}";
- format-icons = ["" ""];
- };
- battery = {
- states = {
- good = 95;
- warning = 20;
- critical = 10;
- };
- format = "{capacity}% {icon}";
- format-icons = ["" "" "" "" ""];
- };
- "hyprland/window" = {format = "{class}";};
- network = {
- format-wifi = "{essid} ";
- format-linked = "{ifname} (No IP) ";
- format-disconnected = "Disconnected ⚠";
- format-alt = "{ifname}: {ipaddr}/{cidr}";
- };
- pulseaudio = {
- format = "{volume}% {icon} {format_source}";
- format-bluetooth = "{volume}% {icon} {format_source}";
- format-bluetooth-muted = " {icon} {format_source}";
- format-muted = " {format_source}";
- format-source = "{volume}% ";
- format-source-muted = "";
- format-icons = {default = ["" "" ""];};
- };
- };
- };
- style = ./waybar.css;
- systemd.enable = true;
- };
-}
diff --git a/users/youwen/linux/waybar/laptop/waybar.css b/users/youwen/linux/waybar/laptop/waybar.css
deleted file mode 100755
index aaf25942..00000000
--- a/users/youwen/linux/waybar/laptop/waybar.css
+++ /dev/null
@@ -1,109 +0,0 @@
-* {
- font-size: 12px;
- font-family: CaskaydiaCove Nerd Font;
-}
-
-window#waybar {
- border-bottom: 0px solid #ffffff;
- background: transparent;
- transition-property: none;
- transition-duration: 0s;
-}
-
-#workspaces {
- background: #24273a;
- padding: 0px 5px 0px 5px;
- margin: 0px 0px 0px 2px;
- border-radius: 5px;
-}
-
-#workspaces {
- background: #24273a;
- padding: 0px 5px 0px 5px;
- margin: 0px 0px 0px 2px;
- border-radius: 5px;
-}
-
-#workspaces button,
-#workspaces button:hover {
- padding: 0;
- background-color: #24273a;
- /* color: @color4; */
-}
-#workspaces button.active,
-#workspaces button:hover {
- /* color: @color8; */
-}
-
-#clock,
-#pulseaudio,
-#network,
-#battery,
-#tray,
-#mpris,
-#cpu,
-#memory,
-#temperature,
-#custom-weather,
-#window,
-#backlight {
- background-color: #24273a;
- /* color: @color4; */
- opacity: 1;
- border-radius: 5px;
- padding: 1px 10px 1px 10px;
- margin: 0px 5px 0px 0px;
-}
-#backlight {
- margin-right: 0px;
- padding-right: 3px;
- border-top-right-radius: 0px;
- border-bottom-right-radius: 0px;
-}
-#network {
- margin-left: 15px;
- padding-right: 15px;
-}
-#mpris {
- padding-left: 0px;
- margin-left: 0px;
- margin-right: 5px;
- padding-right: 0px;
-}
-#pulseaudio {
- padding-left: 5px;
- padding-right: 5px;
- margin-left: 0px;
- margin-right: 5px;
- border-top-left-radius: 0px;
- border-bottom-left-radius: 0px;
-}
-#memory,
-#cpu {
- padding-right: 2px;
- border-top-right-radius: 0px;
- border-bottom-right-radius: 0px;
- border-right-width: 0px;
-}
-#memory,
-#battery {
- margin-left: 0px;
- padding-left: 2px;
- border-top-left-radius: 0px;
- border-bottom-left-radius: 0px;
- border-left-width: 0px;
-}
-#cpu {
- margin-right: 0px;
-}
-#battery {
- padding-right: 13px;
-}
-#custom-weather {
- margin-right: 10px;
-}
-
-#window {
- margin-right: 10px;
- margin-left: 10px;
-}
diff --git a/wallpapers/aesthetic/ign_colorful.png b/wallpapers/aesthetic/ign_colorful.png
deleted file mode 100755
index 63260548..00000000
Binary files a/wallpapers/aesthetic/ign_colorful.png and /dev/null differ
diff --git a/wallpapers/anime/frieren.jpg b/wallpapers/anime/frieren.jpg
deleted file mode 100755
index fdba4a4b..00000000
Binary files a/wallpapers/anime/frieren.jpg and /dev/null differ
diff --git a/wallpapers/anime/kudou-chitose-normal.jpg b/wallpapers/anime/kudou-chitose-normal.jpg
deleted file mode 100755
index 52867b9f..00000000
Binary files a/wallpapers/anime/kudou-chitose-normal.jpg and /dev/null differ
diff --git a/wallpapers/anime/kudou-chitose-violet.png b/wallpapers/anime/kudou-chitose-violet.png
deleted file mode 100755
index 6d68a398..00000000
Binary files a/wallpapers/anime/kudou-chitose-violet.png and /dev/null differ
diff --git a/wallpapers/anime/nixos-sus-anime-wallpaper.png b/wallpapers/anime/nixos-sus-anime-wallpaper.png
deleted file mode 100755
index 190fc2fc..00000000
Binary files a/wallpapers/anime/nixos-sus-anime-wallpaper.png and /dev/null differ
diff --git a/wallpapers/anime/nixos-sus-anime.png b/wallpapers/anime/nixos-sus-anime.png
deleted file mode 100755
index 58ccec01..00000000
Binary files a/wallpapers/anime/nixos-sus-anime.png and /dev/null differ
diff --git a/wallpapers/cityscapes/yellow_kyoto.jpg b/wallpapers/cityscapes/yellow_kyoto.jpg
deleted file mode 100755
index 5c107fed..00000000
Binary files a/wallpapers/cityscapes/yellow_kyoto.jpg and /dev/null differ
diff --git a/wallpapers/nixos/nix-neon.png b/wallpapers/nixos/nix-neon.png
deleted file mode 100755
index 6797ef8f..00000000
Binary files a/wallpapers/nixos/nix-neon.png and /dev/null differ
diff --git a/wallpapers/nixos/nix-wallpaper.png b/wallpapers/nixos/nix-wallpaper.png
deleted file mode 100755
index 5b6e5e1b..00000000
Binary files a/wallpapers/nixos/nix-wallpaper.png and /dev/null differ
diff --git a/wallpapers/nixos/nixos-ascii.png b/wallpapers/nixos/nixos-ascii.png
deleted file mode 100755
index 2cd684f6..00000000
Binary files a/wallpapers/nixos/nixos-ascii.png and /dev/null differ
diff --git a/wallpapers/nixos/nixos-declarative.jpg b/wallpapers/nixos/nixos-declarative.jpg
deleted file mode 100755
index 172270e6..00000000
Binary files a/wallpapers/nixos/nixos-declarative.jpg and /dev/null differ
diff --git a/wallpapers/nixos/nixos-everforest.png b/wallpapers/nixos/nixos-everforest.png
deleted file mode 100644
index b1d065e0..00000000
Binary files a/wallpapers/nixos/nixos-everforest.png and /dev/null differ
diff --git a/wallpapers/nixos/nixos-hm.png b/wallpapers/nixos/nixos-hm.png
deleted file mode 100755
index ccad36d3..00000000
Binary files a/wallpapers/nixos/nixos-hm.png and /dev/null differ
diff --git a/wallpapers/nixos/nixos-wallpaper-catppuccin-macchiato.png b/wallpapers/nixos/nixos-wallpaper-catppuccin-macchiato.png
deleted file mode 100755
index ccb261e1..00000000
Binary files a/wallpapers/nixos/nixos-wallpaper-catppuccin-macchiato.png and /dev/null differ
diff --git a/wallpapers/retro/commodore.jpg b/wallpapers/retro/commodore.jpg
deleted file mode 100755
index 7d7843b3..00000000
Binary files a/wallpapers/retro/commodore.jpg and /dev/null differ