❄️ Dotfiles for our NixOS system configuration.

Compare changes

Choose any two refs to compare.

+16
flake.lock
···
"type": "github"
}
},
+
"darwin-login-items": {
+
"locked": {
+
"lastModified": 1763528199,
+
"narHash": "sha256-8LQ5Wp3AJUp71Elax1R9lNkuEbO2Mrnpq+o8qpbhQyc=",
+
"owner": "uncenter",
+
"repo": "nix-darwin-login-items",
+
"rev": "ab75c315893ca206ddf9529e6e3aac6cb01b2f1a",
+
"type": "github"
+
},
+
"original": {
+
"owner": "uncenter",
+
"repo": "nix-darwin-login-items",
+
"type": "github"
+
}
+
},
"easy-hosts": {
"locked": {
"lastModified": 1755470564,
···
"root": {
"inputs": {
"catppuccin": "catppuccin",
+
"darwin-login-items": "darwin-login-items",
"easy-hosts": "easy-hosts",
"flake-parts": "flake-parts",
"home-manager": "home-manager",
+3 -5
flake.nix
···
url = "git+https://tangled.org/@tangled.org/core";
inputs.nixpkgs.follows = "nixpkgs";
};
+
+
darwin-login-items.url = "github:uncenter/nix-darwin-login-items";
};
outputs =
-
inputs@{
-
flake-parts,
-
nixos-wsl,
-
...
-
}:
+
inputs@{ flake-parts, ... }:
flake-parts.lib.mkFlake { inherit inputs; } {
imports = [
inputs.easy-hosts.flakeModule
+20
home/chloe/activation.nix
···
+
# macOS Tahoe (26.x) no longer supports symlinks in the Launchpad.
+
# So, we're forced to copy applications instead of linking them.
+
# This is computationally slower, but we're left with no choice.
+
+
{
+
pkgs,
+
lib,
+
...
+
}:
+
+
{
+
config = lib.mkIf pkgs.stdenv.hostPlatform.isDarwin {
+
targets.darwin.copyApps = {
+
enable = true;
+
enableChecks = true;
+
};
+
+
targets.darwin.linkApps.enable = false;
+
};
+
}
+28
home/chloe/autostart.nix
···
+
{
+
lib,
+
osConfig,
+
pkgs,
+
...
+
}:
+
+
{
+
config = lib.mkIf osConfig.settings.profiles.graphical.enable {
+
xdg.configFile = {
+
# .desktop files for autostart only work on Linux with XDG
+
"autostart/1password.desktop" = lib.mkIf pkgs.stdenv.hostPlatform.isLinux {
+
text = ''
+
[Desktop Entry]
+
Name=1Password
+
Exec=1password --silent %U
+
Terminal=false
+
Type=Application
+
Icon=1password
+
StartupWMClass=1Password
+
Comment=Password manager and secure wallet
+
MimeType=x-scheme-handler/onepassword;
+
Categories=Office;
+
'';
+
};
+
};
+
};
+
}
+3
home/chloe/default.nix
···
{
imports = [
+
./activation.nix
+
./autostart.nix
./catppuccin.nix
./docs.nix
./files.nix
./packages
./programs
+
./scripts.nix
];
xdg.enable = true;
-23
home/chloe/packages/autostart.nix
···
-
{ lib, osConfig, pkgs, ... }:
-
-
{
-
config = lib.mkIf osConfig.settings.profiles.graphical.enable {
-
xdg.configFile = {
-
# .desktop files for autostart only work on Linux with XDG
-
"autostart/1password.desktop" = lib.mkIf pkgs.stdenv.isLinux {
-
text = ''
-
[Desktop Entry]
-
Name=1Password
-
Exec=1password --silent %U
-
Terminal=false
-
Type=Application
-
Icon=1password
-
StartupWMClass=1Password
-
Comment=Password manager and secure wallet
-
MimeType=x-scheme-handler/onepassword;
-
Categories=Office;
-
'';
-
};
-
};
-
};
-
}
+14
home/chloe/packages/base.nix
···
+
{ pkgs }:
+
+
with pkgs;
+
[
+
# dev tools
+
nodejs
+
deno
+
cloudflared
+
corepack_latest
+
bun
+
+
# other
+
_1password-cli
+
]
+15
home/chloe/packages/darwin.nix
···
+
{
+
pkgs,
+
lib,
+
osConfig,
+
}:
+
+
let
+
packages = with pkgs; [
+
# tools
+
shottr
+
];
+
in
+
lib.optionals (
+
osConfig.settings.profiles.graphical.enable && pkgs.stdenv.hostPlatform.isDarwin
+
) packages
+7 -10
home/chloe/packages/default.nix
···
-
{
+
{
pkgs,
lib,
-
osConfig,
+
osConfig,
...
}:
let
-
defaultPackages = import ./list/default.nix { inherit pkgs; };
-
guiPackages = import ./list/gui.nix { inherit pkgs lib osConfig; };
+
basePackages = import ./base.nix { inherit pkgs; };
+
darwinPackages = import ./darwin.nix { inherit pkgs lib osConfig; };
+
linuxPackages = import ./linux.nix { inherit pkgs lib osConfig; };
+
universalPackages = import ./universal.nix { inherit pkgs lib osConfig; };
in
{
-
imports = [
-
./autostart.nix
-
./scripts.nix
-
];
-
config = {
-
home.packages = defaultPackages ++ guiPackages;
+
home.packages = basePackages ++ darwinPackages ++ linuxPackages ++ universalPackages;
};
}
+32
home/chloe/packages/linux.nix
···
+
{
+
pkgs,
+
lib,
+
osConfig,
+
}:
+
+
let
+
packages = with pkgs; [
+
# messengers
+
telegram-desktop
+
vesktop
+
+
# dev tools
+
httpie-desktop
+
+
# mail
+
thunderbird
+
+
# games
+
xivlauncher
+
+
# messengers
+
discord
+
+
# other GUI apps
+
obs-studio
+
_1password-gui
+
];
+
in
+
lib.optionals (
+
osConfig.settings.profiles.graphical.enable && pkgs.stdenv.hostPlatform.isLinux
+
) packages
-19
home/chloe/packages/list/default.nix
···
-
{ pkgs }:
-
-
with pkgs; [
-
# dev tools
-
nodejs
-
deno
-
cloudflared
-
corepack_latest
-
bun
-
-
# fonts
-
iosevka
-
inter
-
atkinson-hyperlegible
-
nerd-fonts.jetbrains-mono
-
-
# other
-
_1password-cli
-
]
-31
home/chloe/packages/list/gui.nix
···
-
{ pkgs, lib, osConfig }:
-
-
let
-
# Common GUI packages available on all platforms
-
commonPackages = with pkgs; [
-
# cloud
-
owncloud-client
-
-
# messengers
-
telegram-desktop
-
vesktop
-
-
# notes
-
obsidian
-
-
# dev tools
-
zed-editor
-
httpie-desktop
-
-
# mail
-
thunderbird
-
-
# games
-
prismlauncher
-
xivlauncher
-
-
# other GUI apps
-
obs-studio
-
_1password-gui
-
];
-
in lib.optionals osConfig.settings.profiles.graphical.enable commonPackages
-15
home/chloe/packages/scripts.nix
···
-
{ pkgs, ... }:
-
-
{
-
home.packages = with pkgs; [
-
# Convert nix hash to SRI format and fetch from URL
-
(writeShellScriptBin "shash" ''
-
nix hash to-sri --type sha256 $(nix-prefetch-url ''$1)
-
'')
-
-
# Create a Python virtual environment with --copies flag
-
(writeShellScriptBin "create-venv" ''
-
nix run nixpkgs#python3 -- -m venv .venv --copies
-
'')
-
];
-
}
+25
home/chloe/packages/universal.nix
···
+
{
+
pkgs,
+
lib,
+
osConfig,
+
}:
+
+
let
+
packages = with pkgs; [
+
# dev tools
+
zed-editor
+
+
# fonts
+
iosevka
+
inter
+
atkinson-hyperlegible
+
nerd-fonts.jetbrains-mono
+
+
# games
+
prismlauncher
+
+
# notes
+
obsidian
+
];
+
in
+
lib.optionals osConfig.settings.profiles.graphical.enable packages
+12 -8
home/chloe/programs/cli/zsh.nix
···
-
{ lib, pkgs, osConfig, config, ... }:
+
{
+
lib,
+
pkgs,
+
osConfig,
+
config,
+
...
+
}:
{
programs.zsh = {
···
'';
envExtra = ''
-
${lib.optionalString pkgs.stdenv.isLinux ''
-
export PRISMA_SCHEMA_ENGINE_BINARY="${pkgs.prisma-engines}/bin/schema-engine"
-
export PRISMA_QUERY_ENGINE_BINARY="${pkgs.prisma-engines}/bin/query-engine"
-
export PRISMA_QUERY_ENGINE_LIBRARY="${pkgs.prisma-engines}/lib/libquery_engine.node"
-
export PRISMA_INTROSPECTION_ENGINE_BINARY="${pkgs.prisma-engines}/bin/introspection-engine"
-
export PRISMA_FMT_BINARY="${pkgs.prisma-engines}/bin/prisma-fmt"
-
''}
+
export PRISMA_SCHEMA_ENGINE_BINARY="${pkgs.prisma-engines}/bin/schema-engine"
+
export PRISMA_QUERY_ENGINE_BINARY="${pkgs.prisma-engines}/bin/query-engine"
+
export PRISMA_QUERY_ENGINE_LIBRARY="${pkgs.prisma-engines}/lib/libquery_engine.node"
+
export PRISMA_INTROSPECTION_ENGINE_BINARY="${pkgs.prisma-engines}/bin/introspection-engine"
+
export PRISMA_FMT_BINARY="${pkgs.prisma-engines}/bin/prisma-fmt"
'';
shellAliases = lib.mkMerge [
+15
home/chloe/scripts.nix
···
+
{ pkgs, ... }:
+
+
{
+
home.packages = with pkgs; [
+
# Convert nix hash to SRI format and fetch from URL
+
(writeShellScriptBin "shash" ''
+
nix hash to-sri --type sha256 $(nix-prefetch-url ''$1)
+
'')
+
+
# Create a Python virtual environment with --copies flag
+
(writeShellScriptBin "create-venv" ''
+
nix run nixpkgs#python3 -- -m venv .venv --copies
+
'')
+
];
+
}
+6
hosts/juniper/default.nix
···
{
+
settings = {
+
profiles = {
+
graphical.enable = true;
+
laptop.enable = true;
+
};
+
};
system.stateVersion = 6; # Initial nix-darwin version
}
+1
modules/darwin/default.nix
···
./packages.nix
./preferences
./security
+
./startup.nix
./users.nix
];
}
+1
modules/darwin/extras.nix
···
imports = [
inputs.home-manager.darwinModules.home-manager
inputs.ragenix.darwinModules.default
+
inputs.darwin-login-items.darwinModules.default
];
}
+8 -1
modules/darwin/homebrew.nix
···
# Casks (GUI applications)
casks = [
"1password"
+
"bruno"
+
"crossover"
+
"discord"
"maccy"
+
"microsoft-edge"
"microsoft-teams"
+
"mos"
"music-presence"
-
"prismlauncher"
+
"osu"
+
"signal"
+
"steam"
];
# Mac App Store apps (requires mas-cli)
+19
modules/darwin/startup.nix
···
+
{
+
config,
+
pkgs,
+
lib,
+
...
+
}:
+
+
{
+
environment.loginItems = {
+
enable = true;
+
items = [
+
"/Applications/1Password.app"
+
"/Applications/Mos.app"
+
"/Applications/Maccy.app"
+
"/Users/chloe/Applications/Home Manager Apps/Shottr.app"
+
"/Applications/Tailscale.app"
+
];
+
};
+
}
+5 -2
services/caddy/default.nix
···
services.caddy = {
enable = true;
package = pkgs.caddy.withPlugins {
-
plugins = [ "github.com/caddy-dns/bunny@v1.2.0" ];
+
plugins = [
+
"github.com/caddy-dns/bunny@v1.2.0"
+
];
hash = "sha256-bwffi5sWq07DVoPQGgEIN1jnvQKL6c4tFfR9AT9ThD4=";
};
environmentFile = config.age.secrets.caddy.path;
globalConfig = ''
+
debug
email chloe@sapphic.moe
'';
extraConfig = ''
···
}
'';
logFormat = ''
-
level info
+
level debug
format json
'';
};
+1 -1
services/glance/default.nix
···
services.glance = {
enable = true;
-
openFirewall = true;
+
openFirewall = false;
environmentFile = config.age.secrets.glance.path;
settings = import ./settings.nix;
};
+28 -2
services/knot/default.nix
···
services.tangled-knot = {
enable = true;
motd = ''
-
🌸 welcome to the tangled knot server 🌸
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⡀⢀⠀⢀⠀⠀⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⢧⢳⣾⣂⣾⡁⣴⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠓⣬⠾⠋⠉⢸⣷⣋⣤⡦
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢯⡞⠃⠀⠀⠀⡼⠊⣠⡏⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣶⣄⣀⣀⡴⣡⡴⠃⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⣽⠧⢴⡀⢸⡛⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡿⠻⠛⠋⠉⠁⠀⠀⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠾⡇⢸⠉⠀⠀⠹⣼⣽⡚⠉⠹⡄⠀⠀⠀⠀⠀⠀⠀⠀⡴⠛⠙⢳⡀⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡘⢿⣆⠀⠀⠀⣿⠉⠀⠀⢀⣧⠀⢀⣤⠤⢤⣄⠀⢸⠉⠀⠀⠈⣧⢸⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⠾⠉⠙⠻⢗⠀⣦⣏⣤⠀⣠⠞⠀⠀⣞⠋⠀⠀⠈⠻⡼⡀⣄⡀⢀⡯⠟⠧⢤⡀⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢯⣀⠀⠀⠲⣷⡿⣿⠋⠉⠁⠀⠀⠀⠹⣄⠀⠀⣠⣤⠘⠧⣽⣨⣞⡁⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠁⠀⢸⣷⠀⠀⠀⠀⠀⠀⠈⣓⣦⣜⠉⣿⣶⠧⣟⣙⣀⣀⣠⠞⠁⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⠀⠀⠀⠀⠀⠀⡞⠉⠀⠾⠞⡵⢜⣇⡀⠙⢦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡤⠤⠤⣄⠀⣼⣿⡠⠴⠶⠦⣄⠀⣷⣀⠀⢀⣠⡷⡀⠉⠁⠀⢸⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⡋⠀⠀⠀⠈⢷⣿⠋⠀⠀⠀⠀⢸⡆⠀⠈⠉⣩⣿⠣⠙⠲⠤⠶⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⢻⠀⠀⠀⠀⠀⠀⡇⣠⣴⣾⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣄⠀⠀⠀⢠⣦⣌⡄⢠⣦⠀⠀⣾⠹⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡠⠤⠙⠢⢄⡀⠀⢳⡄⢃⡼⠉⣀⠜⠋⠉⠒⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⢠⡯⠀⠀⠀⠀⠀⣠⡉⠙⣹⣿⠶⣮⣁⡀⠀⠀⠀⠀⢻⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠳⣄⠀⠀⠀⠘⠛⠓⣛⠇⢸⡷⡀⠻⠟⠀⠀⠀⠀⢸⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣹⠒⠶⢶⠒⠉⠀⠀⠈⠉⢫⠳⢄⣀⣀⣀⡤⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⡾⠋⠀⠀⢰⠀⠀⠀⠀⠀⠀⢸⣇⠀⠈⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⠀⠀⠀⣠⣴⣾⠿⠛⠁⠀⠀⠀⠀⠈⠳⣄⣀⣀⣀⡤⠞⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⠀⣴⣿⡿⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⣾⡟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+
⢸⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+
⠈⢧⡃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+
⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
-
hosted by sapphic angels
+
Welcome to Sapphic Angels' Knot server for tangled.org.
'';
server = {
hostname = "knot.sappho.systems";
+2 -8
services/ntfy/default.nix
···
services.caddy.virtualHosts."notify.sappho.systems" = {
extraConfig = ''
import common
+
import tls_bunny
-
reverse_proxy http://127.0.0.1:7070 {
-
header_up X-Forwarded-Proto https
-
header_up X-Forwarded-Host notify.sappho.systems
-
header_up X-Real-IP {remote_host}
-
}
+
reverse_proxy http://127.0.0.1:7070
'';
};
-
-
# Firewall
-
settings.firewall.allowedTCPPorts = [ 7070 ];
}