21d049afbb7c46bc14b37f7a38135fbc601100a6
❄️ My NixOS Configuration
This directory contains the declarative configuration for my user environment, managed by Home Manager.
🛠️ How it Works (The Nix Way)
In NixOS, configuration files are managed "declaratively" rather than manually.
- The Source of Truth: Everything is defined in your
.nixfiles. - The Nix Store: When you "switch," Nix builds your files and stores them in
/nix/store/. These are immutable (read-only). - Symlinking: Home Manager creates symbolic links in your home directory (like
~/.pi/agents/settings.json) that point back to that read-only store.
✍️ How to Make Changes
Do not edit the files in your home directory. They are read-only symlinks. To change settings:
- Edit your source code: Open
home.nixinnvim. - Modify the Nix block: Locate the
home.filesection for your agents. - Apply changes:
home-manager switch
❓ Why "sudo" doesn't work
The /nix/store is mounted as read-only at the system level. This ensures your system always matches your config and allows for instant rollbacks if something breaks.
Example: Adding a local file and remote extensions
{ config, pkgs, ... }:
{
home.file = {
# 1. Manual/Local File Management
".pi/agents/settings.json".text = ''
{
"defaultProvider": "openrouter",
"extensionsPath": "~/.pi/extensions"
}
'';
# 2. Adding an entire folder (e.g., extensions) from Gitea
".pi/extensions/my-tool".source = pkgs.fetchgit {
url = "https://your-gitea-instance.com";
rev = "main"; # or a specific commit hash
sha256 = "0000000000000000000000000000000000000000000000000000"; # Run 'nix-prefetch-git' to get this
};
# 3. Recursive directory from your local config folder
# This maps everything inside your local 'agents' folder to ~/.pi/agents/
".pi/agents" = {
source = ./agents;
recursive = true;
};
};
}
Tips for Extensions
- Git Tracking: If you use
git add .in your config directory, Nix will track your local changes. - Fetchers: Use pkgs.fetchgit for Gitea repos to ensure they are version-controlled and reproducible.
- Permissions: If an extension needs to be executable, add
executable = true;to thehome.fileblock.
Description
Languages
TypeScript
97.2%
Python
1.2%
HTML
1.1%
JavaScript
0.4%