50 Commits

Author SHA1 Message Date
kenji cbd2575515 git 2025-07-07 14:22:27 -05:00
lsoriano-mcm 1e73f9ce06 test 2025-07-04 22:37:37 -05:00
kenji c08bc7a576 test 2025-07-02 21:09:17 -05:00
kenji 27cc1641f2 added gaming module 2025-07-02 19:28:47 -05:00
kenji e1de9403e4 test 2025-07-02 08:11:25 -05:00
kenji d1ed8bc004 added 2025-07-02 08:03:25 -05:00
kenji 11da625ace py 2025-07-02 08:02:22 -05:00
kenji 357b9a4f04 test 2025-07-01 09:31:36 -05:00
kenji 2d69f55eba n 2025-07-01 09:22:28 -05:00
kenji c7787f3d27 added quickshell 2025-07-01 08:57:33 -05:00
kenji b37edeed36 major changes 2025-07-01 08:55:17 -05:00
kenji 945ed455c9 added security.nix 2025-06-30 15:45:32 -05:00
kenji 8f4de3964f added amd 2025-06-30 15:42:14 -05:00
kenji d7489f811a graphics added 2025-06-30 15:19:13 -05:00
kenji ed24c8eaea added mangohud 2025-06-30 14:37:42 -05:00
kenji d2baeeba6d added gaming scopes 2025-06-30 14:20:06 -05:00
kenji 6cdfd4c169 fixed gaming 2025-06-30 13:43:35 -05:00
kenji 30a55ac796 fixed browser 2025-06-30 13:35:51 -05:00
biscuit 277e7a1191 test 2025-06-30 13:31:00 -05:00
kenji 59a18fbe85 fixed formatting 2025-06-30 13:26:24 -05:00
kenji 31d4628955 test 2025-06-30 13:20:46 -05:00
biscuit 39162c5ead added config.toml for matugen 2025-06-30 13:15:36 -05:00
biscuit 2cee6724c8 fix minor stuff 2025-06-30 13:14:35 -05:00
biscuit 080f4ec678 added BOOT 2025-06-30 13:08:05 -05:00
biscuit 4271d20f44 major DESKTOP changes 2025-06-30 13:05:11 -05:00
biscuit 71c6d75ff7 users 2025-06-30 12:55:18 -05:00
biscuit 571645a2e6 test 2025-06-30 12:54:23 -05:00
biscuit f52a8923fd test 2025-06-30 12:51:52 -05:00
lsoriano-mcm 1fdd8f51fe changed initialHashedPassword 2025-06-28 21:21:06 -05:00
lsoriano-mcm 8c4c69b5dd changed initialHashedPassword 2025-06-28 21:20:28 -05:00
lsoriano-mcm 79a22e0041 renamed console.nix to terminal.nix 2025-06-28 21:17:45 -05:00
lsoriano-mcm fba74facdc test 2025-06-28 21:16:53 -05:00
lsoriano-mcm bdab858be2 nixos: system revamp 2025-06-28 21:15:22 -05:00
lsoriano-mcm 37e982c983 added SOPS 2025-06-28 21:00:01 -05:00
lsoriano-mcm 6fc18f11a5 added authentication for darwin system 2025-06-28 19:10:41 -05:00
lsoriano-mcm d9128fcf06 cleaned up v1 2025-06-28 17:56:08 -05:00
lsoriano-mcm b7d0583aaf changed initialHasedPasswd 2025-06-28 17:45:45 -05:00
lsoriano-mcm 2d5f115468 flakes updated 2025-06-28 17:40:14 -05:00
lsoriano-mcm 306ee40129 Revert "FIX: finally fixed flake.lock"
This reverts commit 1e19f865de.
2025-06-28 17:31:47 -05:00
lsoriano-mcm f7b315be25 Revert "udp"
This reverts commit 3ebe0c9fca.
2025-06-28 17:30:23 -05:00
lsoriano-mcm d00c9836d6 test2 2025-06-28 17:28:50 -05:00
lsoriano-mcm ea86b6f7e5 test 2025-06-28 17:27:08 -05:00
lsoriano-mcm 1e19f865de FIX: finally fixed flake.lock 2025-06-28 17:14:07 -05:00
lsoriano-mcm 3ebe0c9fca udp 2025-06-23 17:55:39 -05:00
lsoriano-mcm f214789d22 upd 2025-06-23 17:00:36 -05:00
lsoriano-mcm fe79d7a2c4 upd 2025-06-23 16:54:51 -05:00
lsoriano-mcm cc7aa6df6a upd 2025-06-23 16:46:05 -05:00
lsoriano-mcm e8e7b3dd4f upd 2025-06-23 16:27:29 -05:00
lsoriano-mcm 1d5dd8ac1f initial 2025-06-23 16:17:41 -05:00
lsoriano-mcm b631cb20a4 initial 2025-06-23 14:32:58 -05:00
132 changed files with 2359 additions and 2552 deletions
+1
View File
@@ -0,0 +1 @@
hosts/desktop/hardware-configuration.nix
-7
View File
@@ -1,7 +0,0 @@
keys:
- &user_kenji age1dhmt5tdyxd9zam542zkr9hq4tku7lzmf6j057sjtepk80deky5fqemczs5
creation_rules:
- path_regex: secrets/[^/]+\.(yaml|json|env|ini)$
key_groups:
- age:
- *user_kenji
+53 -57
View File
@@ -1,62 +1,58 @@
# HakaseOS
HakaseOS is an opinionated NixOS configuration heavily inspired by OmarchyOS.
# Sakamoto NixOS
## Features
* Vim keybindings
* TUI applications
* Simple Setup
* Pre-configured Firefox
Sakamoto NixOS is built with various profiles intended for reproducibility.
## To-do
* hypr animation
* TUI for everything
## Available Hosts
## How to Use SOPS
SOPS is an important aspect of this operating system. Learning to use it is important for security and modularity. It is impertinent that you do not lose the `private key`, as it is irrecoverable.
- MacBook M series
- Linux
To get started, follow the instructions below.
1. Create a folder.
```sh
mkdir -p ~/.config/sops/age
```
2. Generate a private key using `age`
```sh
nix-shell -p age --run "age-keygen -o ~/.config/sops/age/keys.txt"
```
**OR**
Use `ssh-to-age` to convert `id_ed22519` to `age`.
```sh
nix-shell -p ssh-to-age --run "ssh-to-age -private-key -i ~/.ssh/id_ed25519 > ~/.config/sops/age/keys.txt"
```
There are other ways of generating a private key. Refer to [sops-nix](https://github.com/Mic92/sops-nix).
3. Get a **public key**.
```sh
nix-shell -p age --run "age-keygen -y ~/.config/sops/age/keys.txt"
```
4. On the same directory as `flake.nix`, create `.sops.yaml` and paste the following below.
```yaml
# This example uses YAML anchors which allows reuse of multiple keys
# without having to repeat yourself.
# Also see https://github.com/Mic92/dotfiles/blob/d6114726d859df36ccaa32891c4963ae5717ef7f/nixos/.sops.yaml
# for a more complex example.
keys:
- &admin_alice 2504791468b153b8a3963cc97ba53d1919c5dfd4
- &admin_bob age12zlz6lvcdk6eqaewfylg35w0syh58sm7gh53q5vvn7hd7c6nngyseftjxl
creation_rules:
- path_regex: secrets/[^/]+\.(yaml|json|env|ini)$
key_groups:
- pgp:
- *admin_alice
age:
- *admin_bob
## Installation
```
Replace as according to your needs.
5. Create a sops `.yaml` file.
```sh
nix-shell -p sops --run "sops secrets/example.yaml"
```
NOTE: If you add a new host to your `.sops.yaml`, you will need to update the keys for all secrets.
```sh
nix-shell -p sops --run "sops updatekeys secrets/example.yaml"
```
1. Install [Nix](https://nixos.org/download/).
2. Ensure Nix is installed properly by running the following (this also gives you `nano` for editing later):
```sh
nix-shell -p nano
```
3. Clone the git repository:
```sh
git clone https://git.sakamoto.dev/kenji/nixos.git ~/.config/nixos && cd ~/.config/nixos/
```
4. Copy `info.default.nix` and rename it to `info.local.nix`:
```sh
cp ~/.config/nixos/info.default.nix ~/.config/nixos/info.local.nix
```
🚨 **CRITICAL STEP:** Edit `info.local.nix`:
```sh
nano ~/.config/nixos/info.local.nix
```
Modify it to fit your system — especially your **username**.
If you accidentally leave the default `biscuit`, that user will be created.
**Login password for `biscuit` is `Your-generic-password`.**
5. Execute the following command based on your host:
- **MacBook M series:**
```sh
sudo nix run nix-darwin --extra-experimental-features "nix-command flakes" -- switch --flake ~/.config/nixos#macos
```
- **Linux:**
```sh
sudo nixos-rebuild --flake ~/.config/nixos#desktop --impure
sudo nix run home-manager -- init --switch
home-manager switch --flake ~/.config/nixos#desktop --impure
nix-channel --add https://nixos.org/channels/nixos-unstable nixos nix-channel --update
reboot
```
-9
View File
@@ -1,9 +0,0 @@
{
programs.btop = {
enable = true;
settings = {
vim_keys = true;
color_theme = "TTY";
};
};
}
-169
View File
@@ -1,169 +0,0 @@
{
pkgs,
myConfig,
inputs,
...
}: {
imports = [
inputs.textfox.homeManagerModules.default
];
textfox = {
enable = true;
profile = "hakase";
config = {
# background = {
# color = "#123456";
# };
# border = {
# color = "#654321";
# width = "4px";
# transition = "1.0s ease";
# radius = "3px";
# };
# displayWindowControls = true;
# displayNavButtons = true;
# displayUrlbarIcons = true;
# displaySidebarTools = false;
displayTitles = true;
# newtabLogo = " __ __ ____ \A / /____ _ __/ /_/ __/___ _ __\A / __/ _ \\| |/_/ __/ /_/ __ \\| |/_/\A / /_/ __/> </ /_/ __/ /_/ /> < \A \\__/\\___/_/|_|\\__/_/ \\____/_/|_| ";
# font = {
# family = "Fira Code";
# size = "15px";
# accent = "#654321";
# };
tabs = {
horizontal.enable = false;
# horizontal.enable = true;
# vertical.enable = true;
# vertical.margin = "1.0rem";
};
# navbar = {
# margin = "8px 8px 2px";
# padding = "4px";
# };
bookmarks = {
alignment = "left";
};
# icons = {
# toolbar.extensions.enable = true;
# context.extensions.enable = true;
# context.firefox.enable = true;
# };
# textTransform = "uppercase";
# extraConfig = "/* custom css here */";
};
};
programs.firefox = {
enable = true;
languagePacks = ["en-US"];
profiles = {
hakase = {
search.force = true;
isDefault = true;
search.default = "ddg";
# Full declarative mode enabled.
# Note: Manual bookmarks added in the UI will be overwritten on next rebuild.
bookmarks = {
force = true;
settings = [
{
name = "Toolbar Bookmarks";
toolbar = true;
bookmarks = myConfig.firefox.bookmarks;
}
];
};
settings = {
# --- Privacy & Hardening ---
"browser.contentblocking.category" = "strict";
"privacy.trackingprotection.enabled" = true;
"privacy.resistFingerprinting" = true; # Note: Spoofs timezone and caps FPS to 60
"geo.enabled" = false;
"media.peerconnection.enabled" = false; # Prevents WebRTC IP leaks
"network.dns.disablePrefetch" = true;
"network.prefetch-next" = false;
# --- NixOS / Hyprland Integration ---
"widget.use-xdg-desktop-portal.file-picker" = 1; # Use native file picker
# --- UI & Behavior ---
"browser.compactmode.show" = true;
"browser.tabs.closeWindowWithLastTab" = false;
"extensions.pocket.enabled" = false;
"extensions.screenshots.disabled" = true;
"browser.topsites.contile.enabled" = false;
"browser.formfill.enable" = false;
"browser.search.suggest.enabled" = false;
"browser.search.suggest.enabled.private" = false;
"browser.urlbar.suggest.searches" = false;
"browser.urlbar.showSearchSuggestionsFirst" = false;
"browser.newtabpage.activity-stream.feeds.section.topstories" = false;
"browser.newtabpage.activity-stream.feeds.snippets" = false;
"browser.newtabpage.activity-stream.section.highlights.includePocket" = false;
"browser.newtabpage.activity-stream.section.highlights.includeBookmarks" = false;
"browser.newtabpage.activity-stream.section.highlights.includeDownloads" = false;
"browser.newtabpage.activity-stream.section.highlights.includeVisited" = false;
"browser.newtabpage.activity-stream.showSponsored" = false;
"browser.newtabpage.activity-stream.system.showSponsored" = false;
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
# --- Homepage & Navigation ---
"browser.startup.homepage" = "https://dash.sakamoto.dev";
"browser.newtabpage.pinned" = myConfig.firefox.newtabpage;
# --- DNS over HTTPS (Quad9) ---
"network.trr.mode" = 2; # Use DoH with system fallback
"network.trr.uri" = "https://dns.quad9.net/dns-query";
};
};
};
policies = {
DisableTelemetry = true;
DisableFirefoxStudies = true;
EnableTrackingProtection = {
Value = true;
Locked = false;
Cryptomining = true;
Fingerprinting = true;
};
DisablePocket = true;
DisableFirefoxAccounts = true;
DisableAccounts = true;
DisableFirefoxScreenshots = true;
OverrideFirstRunPage = "";
OverridePostUpdatePage = "";
DontCheckDefaultBrowser = true;
DisplayBookmarksToolbar = "always";
SearchBar = "unified";
# Power User Messaging
UserMessaging = {
ExtensionRecommendations = false;
SkipOnboarding = true;
FeatureRecommendations = false;
UrlbarInterventions = false;
WhatsNew = false;
};
ExtensionSettings = {
"uBlock0@raymondhill.net" = {
install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
installation_mode = "force_installed";
};
"{446900e4-71c2-419f-a6a7-df9c091e268b}" = {
install_url = "https://addons.mozilla.org/firefox/downloads/latest/bitwarden-password-manager/latest.xpi";
installation_mode = "force_installed";
};
"tridactyl.vim@cmcaine.co.uk" = {
install_url = "https://addons.mozilla.org/firefox/downloads/latest/tridactyl-vim/latest.xpi";
installation_mode = "force_installed";
};
};
};
};
}
-17
View File
@@ -1,17 +0,0 @@
# Colors
# highlight_color = "LightBlue"
# cursor = "█"
# App launcher
terminal_launcher = "ghostty -e"
[app_launcher]
filter_desktop = true # Filter apps by desktop environment
list_executables_in_path = false # Show CLI tools from $PATH
hide_before_typing = false # Hide list until you start typing
match_mode = "fuzzy" # "fuzzy" or "exact"
confirm_first_launch = false # Confirm before launching new apps with -p
# Pin/favorite settings
# pin_color = "rgb(255,165,0)" # Color for pin icon (orange)
# pin_icon = "📌" # Icon for pinned apps
-15
View File
@@ -1,15 +0,0 @@
{
pkgs,
inputs,
myConfig,
...
}: {
home.packages = [
inputs.fsel.packages.${pkgs.system}.default # FIXME: does not have its own homeManagerModules
pkgs.wl-clipboard
];
home.file.".config/fsel/config.toml".text = ''
[exec]
terminal_launcher = "${myConfig.terminal.default} -e"
'';
}
-5
View File
@@ -1,5 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [
gemini-cli
];
}
-65
View File
@@ -1,65 +0,0 @@
{
config,
pkgs,
...
}: {
programs.ghostty = {
enable = true;
package =
if pkgs.stdenv.isDarwin
then pkgs.ghostty-bin
else pkgs.ghostty;
enableFishIntegration = true;
settings = {
confirm-close-surface = false;
window-padding-x = 15;
window-padding-y = 15;
window-padding-balance = true;
# --- The Dynamic Hook (Keep this for your script!) ---
# This allows your 'switch-theme' script to override the colors below on the fly.
# config-file = "theme.conf";
# --- Base16 Color Mapping (The "Starship Logic") ---
# We map the Stylix Base16 palette to Ghostty's specific keys.
# Background (surface0 in your Starship config)
# background = "${config.lib.stylix.colors.withHashtag.base00}";
#
# # Foreground (text in your Starship config)
# foreground = "${config.lib.stylix.colors.withHashtag.base05}";
#
# # Cursor (Using text color or Rosewater/Base06)
# cursor-color = "${config.lib.stylix.colors.withHashtag.base05}";
# cursor-text = "${config.lib.stylix.colors.withHashtag.base00}";
#
# # Selection (Highlight)
# selection-background = "${config.lib.stylix.colors.withHashtag.base02}";
# selection-foreground = "${config.lib.stylix.colors.withHashtag.base05}";
#
# # --- The ANSI Palette (0-15) ---
# # Mapping Base16 -> ANSI
# # This ensures your 'ls', 'grep', and Starship colors align perfectly.
# palette = [
# "0=${config.lib.stylix.colors.withHashtag.base00}" # Black
# "1=${config.lib.stylix.colors.withHashtag.base08}" # Red
# "2=${config.lib.stylix.colors.withHashtag.base0B}" # Green
# "3=${config.lib.stylix.colors.withHashtag.base0A}" # Yellow
# "4=${config.lib.stylix.colors.withHashtag.base0D}" # Blue
# "5=${config.lib.stylix.colors.withHashtag.base0E}" # Purple (Lavender)
# "6=${config.lib.stylix.colors.withHashtag.base0C}" # Cyan (Sapphire)
# "7=${config.lib.stylix.colors.withHashtag.base05}" # White
#
# "8=${config.lib.stylix.colors.withHashtag.base03}" # Bright Black
# "9=${config.lib.stylix.colors.withHashtag.base08}" # Bright Red
# "10=${config.lib.stylix.colors.withHashtag.base0B}" # Bright Green
# "11=${config.lib.stylix.colors.withHashtag.base0A}" # Bright Yellow
# "12=${config.lib.stylix.colors.withHashtag.base0D}" # Bright Blue
# "13=${config.lib.stylix.colors.withHashtag.base0E}" # Bright Purple
# "14=${config.lib.stylix.colors.withHashtag.base0C}" # Bright Cyan
# "15=${config.lib.stylix.colors.withHashtag.base07}" # Bright White
# ];
};
};
}
-10
View File
@@ -1,10 +0,0 @@
{myConfig, ...}: {
programs.git = {
enable = true;
settings = {
user.name = "${myConfig.git.username}";
user.email = "${myConfig.git.email}";
init.defaultBranch = "${myConfig.git.defaultBranch}";
};
};
}
-38
View File
@@ -1,38 +0,0 @@
{
myConfig,
inputs,
pkgs,
...
}: {
programs.hyprland = {
enable = true;
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
withUWSM = true;
};
environment.systemPackages = [
pkgs.hyprpicker
pkgs.hyprlock
pkgs.hypridle
pkgs.hyprpaper
pkgs.hyprsunset
pkgs.hyprpolkitagent
];
xdg.terminal-exec = {
enable = true;
settings = {
default = ["${myConfig.terminal.default}"];
};
};
# systemd.user.services.hyprpolkitagent = {
# description = "Hyprland Polkit Agent";
# wantedBy = ["graphical-session.target"];
# serviceConfig = {
# ExecStart = "${pkgs.hyprpolkitagent}/libexec/hyprpolkitagent";
# Restart = "on-failure";
# };
# };
}
-13
View File
@@ -1,13 +0,0 @@
{
imports = [
./hypr/binds.nix
./hypr/general.nix
./hypr/exec.nix
./hypr/rules.nix
./hypr/animation.nix
./hypr/misc.nix
./hypr/input.nix
];
wayland.windowManager.hyprland.enable = true;
wayland.windowManager.hyprland.systemd.enable = false; # for UWSM support...
}
-32
View File
@@ -1,32 +0,0 @@
{
wayland.windowManager.hyprland.settings = {
animations = {
enabled = true;
bezier = [
"easeOutQuint,0.23,1,0.32,1"
"easeInOutCubic,0.65,0.05,0.36,1"
"linear,0,0,1,1"
"almostLinear,0.5,0.5,0.75,1.0"
"quick,0.15,0,0.1,1"
];
animation = [
"global, 1, 10, default"
"border, 1, 5.39, easeOutQuint"
"windows, 1, 4.79, easeOutQuint"
"windowsIn, 1, 4.1, easeOutQuint, popin 87%"
"windowsOut, 1, 1.49, linear, popin 87%"
"fadeIn, 1, 1.73, almostLinear"
"fadeOut, 1, 1.46, almostLinear"
"fade, 1, 3.03, quick"
"layers, 1, 3.81, easeOutQuint"
"layersIn, 1, 4, easeOutQuint, fade"
"layersOut, 1, 1.5, linear, fade"
"fadeLayersIn, 1, 1.79, almostLinear"
"fadeLayersOut, 1, 1.39, almostLinear"
"workspaces, 0, 0, ease"
];
};
};
}
-68
View File
@@ -1,68 +0,0 @@
{pkgs, ...}: {
services.swayosd.enable = true;
home.packages = [
pkgs.playerctl
];
wayland.windowManager.hyprland.settings = {
bindel = [
", XF86AudioRaiseVolume, exec, swayosd-client --output-volume raise"
", XF86AudioLowerVolume, exec, swayosd-client --output-volume lower"
];
bindl = [
", XF86AudioMute, exec, swayosd-client --output-volume mute-toggle"
", Caps_Lock, exec, swayosd-client --caps-lock"
", XF86AudioPlay, exec, playerctl play-pause && notify-send -u low -t 1000 \"Media\" \"$(playerctl status)\""
", XF86AudioPrev, exec, playerctl previous && notify-send -u low -t 1000 \"Previous Track\" \"$(playerctl metadata title)\""
", XF86AudioNext, exec, playerctl next && notify-send -u low -t 1000 \"Next Track\" \"$(playerctl metadata title)\""
", XF86AudioMute, exec, swayosd-client --output-volume mute-toggle"
]; # FIXME: not working
bindd =
[
# essential
"SUPER, Return, Open Terminal, exec, uwsm app -- xdg-terminal-exec"
"SUPER, Q, Kill active, killactive"
# move focus
"SUPER, J, Move focus down, movefocus, d"
"SUPER, K, Move focus up, movefocus, u"
"SUPER, H, Move focus left, movefocus, l"
"SUPER, L, Move focus right, movefocus, r"
# move window
"SUPER SHIFT, h, Move window left, movewindow, l"
"SUPER SHIFT, j, Move window down, movewindow, d"
"SUPER SHIFT, k, Move window up, movewindow, u"
"SUPER SHIFT, l, Move window right, movewindow, r"
# fullscreen
"SUPER, F, Toggle Fullscreen, fullscreen, 0"
"SUPER SHIFT, F, Toggle Maximized Fullscreen, fullscreen, 1"
# apps
"SUPER, W, Open Browser, exec, uwsm app -- firefox" # FIXME: must be xdg-open
"SUPER, SPACE, Open App Launcher, exec, uwsm app -- walker" # FIXME: pls make ghostty variable
# [Workspaces] Toggle between most recent workspaces
"SUPER, Tab, Cycle workspaces, workspace, previous"
]
++ (
# Generate binds for Super + [1-10] to switch workspaces
# and Super + Shift + [1-10] to move window to workspace
builtins.concatLists (builtins.genList (
i: let
ws = i + 1;
key = toString (
if ws == 10
then 0
else ws
);
in [
"SUPER, ${key}, Switch to workspace ${toString ws}, workspace, ${toString ws}"
"SUPER SHIFT, ${key}, Move window to workspace ${toString ws}, movetoworkspace, ${toString ws}"
]
)
10)
);
};
}
-17
View File
@@ -1,17 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [
psmisc
];
wayland.windowManager.hyprland.settings = {
exec-once = [
"uwsm app -- waybar"
"uwsm app -- hyprpaper"
"uwsm app -- elephant"
"uwsm app -- swayosd-server"
];
exec = [
"pkill -x hyprpaper; uwsm app -- hyprpaper"
"killall -SIGUSR2 .ghostty-wrappe"
];
};
}
-10
View File
@@ -1,10 +0,0 @@
{myConfig, ...}: {
wayland.windowManager.hyprland.settings = {
general = {
gaps_in = 5;
gaps_out = 15;
};
monitor = myConfig.hyprland.monitors;
};
}
-6
View File
@@ -1,6 +0,0 @@
{
wayland.windowManager.hyprland.settings = {
repeat_rate = 50;
repeat_delay = 300;
};
}
-11
View File
@@ -1,11 +0,0 @@
{
wayland.windowManager.hyprland.settings = {
misc = {
disable_hyprland_logo = true;
disable_splash_rendering = true;
focus_on_activate = true;
anr_missed_pings = 3;
new_window_takes_over_fullscreen = 1;
};
};
}
-21
View File
@@ -1,21 +0,0 @@
{
wayland.windowManager.hyprland.settings = {
windowrulev2 = [
# "float, class:^(org\.hakase\..*)$"
# "center, class:^(org\.hakase\..*)$"
# "size 80% 70%, class:^(org\.hakase\..*)$" # Example using percentages
# --- POPUP RULES (Wifi, BT, Audio) ---
# "size 602 478, class:^(org\.hakase\.popup\..*)$"
# "move 1312 32, class:^(org\.hakase\.popup\..*)$"
"float, class:^(org\.hakase\.popup\..*)$"
# "pin, class:^(org\.hakase\.popup\..*)$"
"animation slide right, class:^(org\.hakase\.popup\..*)$"
"dimaround, class:^(org\.hakase\.popup\..*)$"
# --- launcher ---
"float, title:^(launcher)$"
"size 500 430, title:^(launcher)$"
# Optional: Center it since it's floating
"center, title:^(launcher)$"
];
};
}
-12
View File
@@ -1,12 +0,0 @@
{myConfig, ...}: {
services.hyprpaper = {
enable = true;
settings = {
preload = ["../../assets/Wallpapers/${myConfig.hyprland.wallpaper}"];
wallpaper = [
"HDMI-A-1,../../assets/Wallpapers/${myConfig.hyprland.wallpaper}"
];
};
};
systemd.user.startServices = "sd-switch";
}
-5
View File
@@ -1,5 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [
jellyfin-tui
];
}
-9
View File
@@ -1,9 +0,0 @@
{
inputs,
system,
...
}: {
home.packages = [
inputs.nixovim.packages.${system}.full
];
}
-62
View File
@@ -1,62 +0,0 @@
{config, ...}: {
programs.starship = {
enable = true;
settings = {
# Pro layout: one-line, clear spacing
format = ''
[](surface0)$os$directory[](fg:surface0 bg:peach)$git_branch$git_status[](fg:peach bg:surface1)$c$rust$nodejs$python$golang[](fg:surface1 bg:surface0)$nix_shell[](surface0)
$character'';
# Palette definition (Catppuccin Mocha-inspired)
# Tell Starship to use the palette Stylix is already generating
palette = "base16";
# Map your custom names to Stylix/Base16 colors
# Stylix colors are available at: config.lib.stylix.colors.withHashtag.base0X
palettes.base16 = {
# Using standard Catppuccin/Base16 mapping
surface0 = "${config.lib.stylix.colors.withHashtag.base00}"; # Darkest BG
surface1 = "${config.lib.stylix.colors.withHashtag.base01}"; # Slightly lighter BG
text = "${config.lib.stylix.colors.withHashtag.base05}"; # Main Text
peach = "${config.lib.stylix.colors.withHashtag.base09}"; # Orange accent
lavender = "${config.lib.stylix.colors.withHashtag.base0E}"; # Purple accent
sapphire = "${config.lib.stylix.colors.withHashtag.base0C}"; # Cyan accent
};
os = {
disabled = false;
format = "[$symbol]($style)";
style = "bg:surface0 fg:text";
symbols = {NixOS = " ";};
};
directory = {
style = "bg:surface0 fg:lavender";
format = "[ $path ]($style)";
truncation_length = 3;
truncation_symbol = "/";
};
git_branch = {
symbol = "󰊢 ";
style = "bg:peach fg:surface0";
format = "[[ $symbol $branch ]($style)]($style)";
};
git_status = {
style = "bg:peach fg:surface0";
format = "[[($all_status$ahead_behind )]($style)]($style)";
};
nix_shell = {
symbol = "󱄅 ";
style = "bg:surface0 fg:sapphire";
format = "[ $symbol $state ]($style)";
};
character = {
success_symbol = "[󱞩](bold green)";
error_symbol = "[󱞩](bold red)";
};
};
};
}
-39
View File
@@ -1,39 +0,0 @@
{
pkgs,
inputs,
myConfig,
lib,
...
}: {
imports = [
inputs.stylix.homeModules.stylix
];
stylix = {
autoEnable = false;
targets = {
firefox = {
enable = true;
profileNames = [
"hakase"
];
};
waybar.enable = true;
ghostty.enable = true;
hyprpaper.enable = true;
gtk.enable = true;
};
enable = true;
# autoEnable = false;
image = ../../assets/Wallpapers/${myConfig.hyprland.wallpaper};
polarity = "dark";
# base16Scheme = lib.mkDefault {
# generator = "vibrant";
# };
iconTheme = {
enable = true;
package = pkgs.papirus-icon-theme; # The package to install
dark = "Papirus-Dark"; # The theme name for dark mode
light = "Papirus-Light"; # The theme name for light mode
};
};
}
-41
View File
@@ -1,41 +0,0 @@
{
inputs,
config,
pkgs,
...
}: {
imports = [
inputs.walker.homeManagerModules.default
./style.nix
];
programs.walker = {
enable = true;
runAsService = true;
package = inputs.walker.packages.${pkgs.system}.default;
# CSS Implementation using Stylix Colors
config = {
hide_action_hints = true;
icons.theme = config.gtk.iconTheme.name;
placeholders.default = {
input = "Search";
list = "No Results";
};
providers.prefixes = [
{
provider = "websearch";
prefix = "+";
}
{
provider = "providerlist";
prefix = "_";
}
];
};
};
}
-123
View File
@@ -1,123 +0,0 @@
{config, ...}: let
# Access Stylix colors (Base16)
colors = config.lib.stylix.colors.withHashtag;
in {
programs.walker = {
theme.style = ''
* {
all: unset;
}
* {
font-family: monospace;
font-size: 18px;
color: ${colors.base05};
}
scrollbar {
opacity: 0;
}
.normal-icons {
-gtk-icon-size: 16px;
}
.large-icons {
-gtk-icon-size: 32px;
}
.box-wrapper {
background: alpha(${colors.base00}, 0.95);
padding: 20px;
border: 2px solid ${colors.base0E};
}
.preview-box {
}
.box {
}
.search-container {
background: ${colors.base00};
padding: 10px;
}
.input placeholder {
opacity: 0.5;
}
.input {
}
.input:focus,
.input:active {
box-shadow: none;
outline: none;
}
.content-container {
}
.placeholder {
}
.scroll {
}
.list {
}
child,
child > * {
}
child:hover .item-box {
}
child:selected .item-box {
}
child:selected .item-box * {
color: ${colors.base0D};
}
.item-box {
padding-left: 14px;
}
.item-text-box {
all: unset;
padding: 14px 0;
}
.item-text {
}
.item-subtext {
font-size: 0px;
min-height: 0px;
margin: 0px;
padding: 0px;
}
.item-image {
margin-right: 14px;
-gtk-icon-transform: scale(0.9);
}
.current {
font-style: italic;
}
.keybind-hints {
background: ${colors.base01};
padding: 10px;
margin-top: 10px;
}
.preview {
}
'';
};
}
-4
View File
@@ -1,4 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [
];
}
-171
View File
@@ -1,171 +0,0 @@
{
config,
pkgs,
myConfig,
...
}: {
imports = [
./style.nix
];
programs.waybar = {
enable = true;
settings = {
mainBar = {
reload_style_on_change = true;
layer = "top";
position = "top";
spacing = 0;
height = 26;
modules-left = ["custom/omarchy" "hyprland/workspaces"];
modules-center = ["clock" "custom/update" "custom/screenrecording-indicator"];
modules-right = [
"group/tray-expander"
"bluetooth"
"network"
"pulseaudio"
"cpu"
"battery"
];
"hyprland/workspaces" = {
on-click = "activate";
format = "{icon}";
format-icons = {
"default" = "";
"1" = "1";
"2" = "2";
"3" = "3";
"4" = "4";
"5" = "5";
"6" = "6";
"7" = "7";
"8" = "8";
"9" = "9";
"10" = "0";
"active" = "󱓻";
};
persistent-workspaces = {
"1" = [];
"2" = [];
"3" = [];
"4" = [];
"5" = [];
};
};
"custom/omarchy" = {
format = "";
on-click = "omarchy-menu";
on-click-right = "xdg-terminal-exec";
tooltip-format = "Omarchy Menu\n\nSuper + Alt + Space";
};
# "custom/update" = {
# format = "";
# exec = "omarchy-update-available";
# on-click = "omarchy-launch-floating-terminal-with-presentation omarchy-update";
# tooltip-format = "Omarchy update available";
# signal = 7;
# interval = 21600;
# };
"cpu" = {
interval = 5;
format = "󰍛";
on-click = "hakase-focus-wrapper btop";
on-click-right = "xdg-terminal-exec";
};
"clock" = {
format = "{:%H:%M %a %b %d}";
format-alt = "{:L%d %B W%V %Y}";
tooltip = false;
on-click-right = "omarchy-launch-floating-terminal-with-presentation omarchy-tz-select";
};
"network" = {
format-icons = ["󰤯" "󰤟" "󰤢" "󰤥" "󰤨"];
format = "{icon}";
format-wifi = "{icon}";
format-ethernet = "󰀂";
format-disconnected = "󰤮";
tooltip-format-wifi = "{essid} ({frequency} GHz)\n{bandwidthDownBytes} {bandwidthUpBytes}";
tooltip-format-ethernet = "{bandwidthDownBytes} {bandwidthUpBytes}";
tooltip-format-disconnected = "Disconnected";
interval = 3;
spacing = 1;
on-click = "hakase-popup-wifi";
};
"battery" = {
format = "{capacity}% {icon}";
format-discharging = "{icon}";
format-charging = "{icon}";
format-plugged = "";
format-icons = {
charging = ["󰢜" "󰂆" "󰂇" "󰂈" "󰢝" "󰂉" "󰢞" "󰂊" "󰂋" "󰂅"];
default = ["󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹"];
};
format-full = "󰂅";
tooltip-format-discharging = "{power:>1.0f}W {capacity}%";
tooltip-format-charging = "{power:>1.0f}W {capacity}%";
interval = 5;
on-click = "omarchy-menu power";
states = {
warning = 20;
critical = 10;
};
};
"bluetooth" = {
format = "";
format-disabled = "󰂲";
format-connected = "󰂱";
format-no-controller = "";
tooltip-format = "Devices connected: {num_connections}";
on-click = "hakase-popup-bluetooth";
};
"pulseaudio" = {
format = "{icon}";
on-click = "hakase-popup-volume";
on-click-right = "pamixer -t";
tooltip-format = "Playing at {volume}%";
scroll-step = 5;
format-muted = "";
format-icons = {
default = ["" "" ""];
};
};
"group/tray-expander" = {
orientation = "inherit";
drawer = {
transition-duration = 600;
children-class = "tray-group-item";
};
modules = ["custom/expand-icon" "tray"];
};
"custom/expand-icon" = {
format = "";
tooltip = false;
};
"custom/screenrecording-indicator" = {
on-click = "omarchy-cmd-screenrecord";
# Note: $OMARCHY_PATH must be defined in your environment
exec = "$OMARCHY_PATH/default/waybar/indicators/screen-recording.sh";
signal = 8;
return-type = "json";
};
"tray" = {
icon-size = 12;
spacing = 17;
};
};
};
};
}
-89
View File
@@ -1,89 +0,0 @@
{config, ...}: let
colors = config.lib.stylix.colors.withHashtag;
in {
programs.waybar = {
style = ''
* {
background-color: ${colors.base11};
color: ${colors.base05};
border: none;
border-radius: 0;
min-height: 0;
font-family: 'JetBrainsMono Nerd Font';
font-size: 12px;
}
.modules-left {
margin-left: 8px;
}
.modules-right {
margin-right: 8px;
}
#workspaces button {
all: initial;
padding: 0 6px;
margin: 0 1.5px;
min-width: 9px;
}
#workspaces button.empty {
opacity: 0.5;
}
#cpu,
#battery,
#pulseaudio,
#custom-omarchy,
#custom-screenrecording-indicator,
#custom-update {
min-width: 12px;
margin: 0 7.5px;
}
#tray {
margin-right: 16px;
}
#bluetooth {
margin-right: 17px;
}
#network {
margin-right: 13px;
}
#custom-expand-icon {
margin-right: 18px;
}
tooltip {
padding: 2px;
}
#custom-update {
font-size: 10px;
}
#clock {
margin-left: 8.75px;
}
.hidden {
opacity: 0;
}
#custom-screenrecording-indicator {
min-width: 12px;
margin-left: 8.75px;
font-size: 10px;
}
#custom-screenrecording-indicator.active {
color: #a55555;
}
'';
};
}
-14
View File
@@ -1,14 +0,0 @@
{pkgs, ...}: {
programs.yazi = {
enable = true;
enableFishIntegration = true;
settings = {
manager = {
show_hidden = true;
sort_by = "natural";
sort_dir_first = true;
linemode = "size";
};
};
};
}
-9
View File
@@ -1,9 +0,0 @@
{
programs.zoxide = {
enable = true;
enableFishIntegration = true;
options = [
"--cmd cd"
];
};
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

@@ -1 +0,0 @@
/nix/store/yckzy9k5i7pvmlk6xjkdj4wwbfms1zpl-home-manager-files/Pictures/Wallpapers/1-Pawel-Czerwinski-Abstract-Purple-Blue.jpg
-1
View File
@@ -1 +0,0 @@
/nix/store/yckzy9k5i7pvmlk6xjkdj4wwbfms1zpl-home-manager-files/Pictures/Wallpapers/1-everforest.jpg
Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

-1
View File
@@ -1 +0,0 @@
/nix/store/yckzy9k5i7pvmlk6xjkdj4wwbfms1zpl-home-manager-files/Pictures/Wallpapers/gruvbox-1.jpg
-1
View File
@@ -1 +0,0 @@
/nix/store/yckzy9k5i7pvmlk6xjkdj4wwbfms1zpl-home-manager-files/Pictures/Wallpapers/kanagawa-1.png
Binary file not shown.

Before

Width:  |  Height:  |  Size: 607 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

-1
View File
@@ -1 +0,0 @@
/nix/store/yckzy9k5i7pvmlk6xjkdj4wwbfms1zpl-home-manager-files/Pictures/Wallpapers/nord-1.png
Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 MiB

+83 -48
View File
@@ -1,57 +1,92 @@
{
myConfig = {
nixos = {
username = "kenji";
hostname = "hakase";
timezone = "America/Chicago";
shell = "fish"; # FIXME: unassigned variable
};
git = {
username = "kenji";
email = "kenji@hakase";
defaultBranch = "master";
};
ssh = {
# FIXME: anonymize
extraConfig = ''
Host macair
User biscuit
HostName 192.168.68.81
general = {
Hostname = "hakase";
Username = "kenji";
Timezone = "America/Chicago";
Host gitea.sakamoto.dev
User kenji
ProxyCommand cloudflared access ssh --hostname %h
HostName gitea.sakamoto.dev
'';
};
terminal = {
default = "ghostty";
aliases = {
update = "sudo nixos-rebuild switch --flake ~/.config/nixos-new/#hakase";
allowUnfree = true; # allows installation of commercial apps.
terminal = {
Font = "JetBrainsMono Nerd Font"; # e.g., JetBrainsMono Nerd Font
Size = "18";
Shell = "fish";
Aliases = {
ls = "ls --color=auto";
update = ''
sh -c '
if [ "$(uname)" = "Darwin" ]; then
sudo darwin-rebuild switch --flake ~/.config/nixos#macos
else
sudo nixos-rebuild switch --flake ~/.config/nixos#desktop && home-manager switch --flake ~/.config/nixos#desktop
fi
'
'';
agu = "pkill gjs & ags run ~/.config/nixos/packages/ags/biscuit/app.ts & disown (jobs -p) &";
};
};
gitProfile = {
User = "kenji";
Email = "kenji@sakamoto.dev";
defaultBranch = "master";
};
ssh = {
extraConfig = ''
Host gitea.sakamoto.dev
User kenji
ProxyCommand cloudflared access ssh --hostname %h
HostName gitea.sakamoto.dev
'';
};
};
hyprland = {
monitors = ["HDMI-A-1, 1920x1080@120, auto, 1"];
# wallpaper = "nixos_rainbow.png";
wallpaper = "kanagawa.jpg";
builds = {
builder = {
trustedUsers = [
"@groups"
"biscuit"
];
buildMachines = [
{
hostName = "192.168.68.81";
sshUser = "biscuit";
sshKey = "/home/biscuit/.ssh/id_rsa.pub";
system = "x86_64-linux";
supportedFeatures = ["big-parallel" "kvm" "nixos-test"];
}
];
};
};
firefox = {
bookmarks = [
{
name = "Home Manager";
url = "https://mynixos.com/home-manager/options/programs";
}
{
name = "YouTube";
url = "https://youtube.com";
}
];
newtabpage = [
{
title = "Dashboard";
url = "https://dash.sakamoto.dev";
}
];
linux = {
system = "x86_64";
gaming = true;
vpn = {
Enable = false;
secretFile = builtins.toPath ./secrets/.vpn.yaml;
};
touchpadSupport = false;
logitech-hardware.enable = true;
# Custom Applications
apps = {
gaming = true;
apps = pkgs:
with pkgs; [
jellyfin-media-player
];
};
hyprconf = {
Monitor = [
# hyprctl monitors all
# monitor, resolution@refreshrate, position (e.g., 0x0 is middle, 0x1080 is top), scale
"DP-1,highres@165,0x1080,auto"
"DP-2,highres@highrr,0x0,auto"
"HDMI-A-1, preferred, 20000x20000,1"
];
};
};
};
}
Generated
+458 -790
View File
File diff suppressed because it is too large Load Diff
+88 -41
View File
@@ -1,68 +1,115 @@
{
description = "Hakase Configuration";
description = "Sakamoto's NixOS Configuration";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
elephant.url = "github:abenz1267/elephant";
chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
textfox.url = "github:adriankarlen/textfox";
fsel.url = "github:Mjoyufull/fsel";
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
home-manager.url = "github:nix-community/home-manager";
home-manager.inputs.nixpkgs.follows = "nixpkgs"; # `follows` ensure it follows nixpkgs versiona. Avoids breaking updates.
darwin.url = "github:lnl7/nix-darwin";
darwin.inputs.nixpkgs.follows = "nixpkgs";
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
hyprland = {
url = "git+https://github.com/hyprwm/Hyprland?submodules=1";
inputs.nixpkgs.follows = "nixpkgs";
};
nixovim = {
# FIXME: treesitter does not install automatically (disabled due to read-only problems)
url = "git+https://git.sakamoto.dev/kenji/nixovim.git";
inputs.nixpkgs.follows = "nixpkgs";
};
sops-nix = {
url = "github:Mic92/sops-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
stylix = {
url = "github:nix-community/stylix";
inputs.nixpkgs.follows = "nixpkgs";
};
ags.url = "github:aylur/ags";
ags.inputs.nixpkgs.follows = "nixpkgs";
walker = {
url = "github:abenz1267/walker";
inputs.elephant.follows = "elephant";
};
hyprland.url = "github:hyprwm/Hyprland";
hyprland.inputs.nixpkgs.follows = "nixpkgs";
unlisted-fonts.url = "git+https://git.sakamoto.dev/kenji/nix-fonts.git";
unlisted-fonts.inputs.nixpkgs.follows = "nixpkgs";
nixovim.url = "git+https://git.sakamoto.dev/kenji/nixovim.git";
nixovim.inputs.nixpkgs.follows = "nixpkgs";
matugen.url = "github:/InioX/Matugen";
matugen.inputs.nixpkgs.follows = "nixpkgs";
nix-gaming.url = "github:fufexan/nix-gaming";
nix-gaming.inputs.nixpkgs.follows = "nixpkgs";
sops-nix.url = "github:Mic92/sops-nix";
sops-nix.inputs.nixpkgs.follows = "nixpkgs";
quickshell.url = "git+https://git.outfoxxed.me/outfoxxed/quickshell";
quickshell.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = {
self,
nixpkgs,
home-manager,
stylix,
darwin,
ags,
hyprland,
unlisted-fonts,
nixovim,
chaotic,
sops-nix,
fsel,
textfox,
...
} @ inputs: let
config = import ./config.nix;
lib = nixpkgs.lib;
system = "x86_64-linux";
# pkgs = nixpkgs.legacyPackages.${system}; # alternative, without overlays. Unused.
args =
{
inherit inputs system;
}
// config;
in {
# nixosConfiguration for linux system
nixosConfigurations = {
hakase = nixpkgs.lib.nixosSystem {
desktop = lib.nixosSystem {
inherit system;
specialArgs = args;
modules = [
home-manager.nixosModules.home-manager
sops-nix.nixosModules.sops
chaotic.nixosModules.default
./hosts/hakase/configuration.nix
./hosts/desktop/configuration.nix
];
};
};
homeConfigurations = {
desktop = home-manager.lib.homeManagerConfiguration {
pkgs = import nixpkgs {
inherit system;
overlays = [
# (final: prev: {
# ags_1 = prev.ags_1.overrideAttrs (old: {
# buildInputs = old.buildInputs ++ [pkgs.libdbusmenu-gtk3];
# });
# })
];
};
extraSpecialArgs = args;
modules = [./home/desktop.nix];
};
gaming = home-manager.lib.homeManagerConfiguration {
pkgs = import nixpkgs {
inherit system;
overlays = [];
};
extraSpecialArgs = args;
modules = [./home/gaming.nix];
};
headless = home-manager.lib.homeManagerConfiguration {
pkgs = import nixpkgs {
inherit system;
overlays = [];
};
extraSpecialArgs = args;
modules = [./home/headless.nix];
};
};
# darwinConfiguration for macOS M series
darwinConfigurations = {
macos = darwin.lib.darwinSystem {
system = "aarch64-darwin";
specialArgs = args;
modules = [
./hosts/macos/darwin.nix
home-manager.darwinModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = args;
}
];
};
};
+22
View File
@@ -0,0 +1,22 @@
{
myConfig,
lib,
...
}: {
imports = [
../modules/terminal.nix
../modules/desktop.nix
];
programs.home-manager.enable = true;
home = {
username = "${myConfig.general.Username}";
homeDirectory = "/home/${myConfig.general.Username}";
packages = [];
sessionVariables = {};
};
systemd.user.startServices = "sd-switch";
home.stateVersion = "23.05";
}
-12
View File
@@ -1,12 +0,0 @@
{pkgs, ...}: {
imports = [
../modules/home/terminal.nix
../modules/home/apps.nix
../modules/home/apps-optional.nix
../modules/home/hyprland.nix
../modules/home/waybar.nix
../modules/home/theme.nix
];
home.stateVersion = "25.05";
}
View File
+15
View File
@@ -0,0 +1,15 @@
{
config,
pkgs,
inputs,
...
}: {
imports = [
../modules/terminal.nix
];
programs.home-manager.enable = true;
home.packages = [];
home.stateVersion = "23.05";
}
+36
View File
@@ -0,0 +1,36 @@
{
pkgs,
myConfig,
inputs,
lib,
...
}: {
imports =
[
inputs.sops-nix.nixosModules.sops
./hardware-configuration.nix
../../modules/linuxDev.nix
../../modules/system.nix
../../modules/de.nix
]
++ lib.optionals (myConfig.linux.apps.gaming == true) [
../../modules/gaming.nix
];
environment.systemPackages = [];
nixpkgs.config.allowUnfree = true;
nix.settings = {
trusted-users = myConfig.builds.builder.trustedUsers;
experimental-features = ["nix-command" "flakes"];
};
programs.ssh.extraConfig = myConfig.general.ssh.extraConfig;
nix.distributedBuilds = true;
nix.settings.builders-use-substitutes = true;
# nix.buildMachines = builder.buildMachines;
system.stateVersion = "25.05";
}
-12
View File
@@ -1,12 +0,0 @@
{
pkgs,
myConfig,
...
}: {
imports = [
./hardware-configuration.nix
../../modules/system/default.nix
../../modules/system/hyprland.nix
../../modules/system/scripts.nix
];
}
-33
View File
@@ -1,33 +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" "ahci" "usbhid" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/mapper/luks-f8bd85aa-b08e-472a-b7f6-5e190b9b9714";
fsType = "ext4";
};
boot.initrd.luks.devices."luks-f8bd85aa-b08e-472a-b7f6-5e190b9b9714".device = "/dev/disk/by-uuid/f8bd85aa-b08e-472a-b7f6-5e190b9b9714";
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/72BA-AF9B";
fsType = "vfat";
options = [ "fmask=0077" "dmask=0077" ];
};
swapDevices = [ ];
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}
+43
View File
@@ -0,0 +1,43 @@
{
pkgs,
myConfig,
inputs,
...
}: {
imports = [
../../modules/macosDev.nix
inputs.sops-nix.darwinModules.sops
];
# List packages installed in system profile. To search by name, run:
# $ nix-env -qaP | grep wget
environment.systemPackages = with pkgs; [
];
# Auto upgrade nix package and the daemon service.
# services.nix-daemon.enable = true;
# services.karabiner-elements.enable = true;
# nix.package = pkgs.nix;
# Necessary for using flakes on this system.
nix.settings.experimental-features = "nix-command flakes";
nix.settings.trusted-users = myConfig.builds.builder.trustedUsers;
# Create /etc/zshrc that loads the nix-darwin environment.
programs.zsh.enable = true; # default shell on catalina
programs.fish.enable = true;
# $ darwin-rebuild changelog
system.stateVersion = 5;
# The platform the configuration will be used on.
nixpkgs.hostPlatform = "aarch64-darwin";
security.pam.services.sudo_local.touchIdAuth = true;
users.users.${myConfig.general.Username} = {
name = "${myConfig.general.Username}";
home = "/Users/${myConfig.general.Username}";
# shell = pkgs.${myConfig.general.terminal.Shell}; # no support for nix-darwin, but can be changed via chsh.
};
home-manager.users.${myConfig.general.Username} = import ../../home/macos.nix;
}
View File
+19
View File
@@ -0,0 +1,19 @@
{
lib,
myConfig,
...
}: {
imports =
[
../system/font.nix
../system/browser.nix
../system/wayland.nix
../system/graphics.nix
../system/security.nix
# FIXME
../system/amd.nix
]
++ lib.optionals (myConfig.linux.gaming == true) [
];
}
+20
View File
@@ -0,0 +1,20 @@
{
lib,
myConfig,
...
}: {
imports =
[
../packages/hyprland/default.nix
../packages/hypridle/default.nix
../packages/hyprlock/default.nix
../packages/rofi/default.nix
../packages/matugen/default.nix
../packages/swww/default.nix
../packages/quickshell/default.nix
../packages/ags/default.nix
]
++ lib.optionals (myConfig.linux.gaming == true) [
../packages/mangohud/default.nix
];
}
+7
View File
@@ -0,0 +1,7 @@
{
imports = [
../system/stream.nix
../system/gaming.nix
../system/appimage.nix
];
}
-6
View File
@@ -1,6 +0,0 @@
{
imports = [
../../apps/jellyfin-tui/home.nix
../../apps/btop/home.nix
];
}
-8
View File
@@ -1,8 +0,0 @@
{
imports = [
../../apps/yazi/home.nix
../../apps/gemini/home.nix
../../apps/firefox/home.nix
../../apps/starship/home.nix
];
}
-8
View File
@@ -1,8 +0,0 @@
{
imports = [
../../apps/hyprland/home.nix
../../apps/walker/home.nix
# ../../apps/fsel/home.nix
../../apps/hyprpaper/home.nix
];
}
-9
View File
@@ -1,9 +0,0 @@
{
imports = [
../../apps/neovim/neovim.nix
../../apps/git/home.nix
../../apps/zoxide/home.nix
../../apps/fish/home.nix
../../apps/ghostty/home.nix
];
}
-5
View File
@@ -1,5 +0,0 @@
{
imports = [
../../apps/stylix/home.nix
];
}
-6
View File
@@ -1,6 +0,0 @@
{
imports = [
../../apps/waybar/home.nix
../../apps/waybar/deps.nix
];
}
+7
View File
@@ -0,0 +1,7 @@
{...}: {
imports = [
../system/dev/tools.nix
../system/dev/python.nix
../system/dev/linux.nix
];
}
+6
View File
@@ -0,0 +1,6 @@
{...}: {
imports = [
../system/dev/tools.nix
../system/dev/python.nix
];
}
+13
View File
@@ -0,0 +1,13 @@
{...}: {
imports = [
../system/users.nix
../system/hardware.nix
../system/locale.nix
../system/network.nix
../system/programs.nix
../system/services.nix
../system/tty.nix
../system/firewall.nix
../system/boot.nix
];
}
-22
View File
@@ -1,22 +0,0 @@
{pkgs, ...}: {
imports = [
../../system/time.nix
../../system/boot.nix
../../system/amd.nix
../../system/hardware.nix
../../system/home-manager.nix
../../system/services.nix
../../system/user.nix
../../system/version.nix
../../system/fonts.nix
../../system/programs.nix
../../system/security.nix
../../system/variables.nix
../../system/kernel.nix
];
environment.systemPackages = with pkgs; [
# FIXME: must be on their own app
git
cloudflared
];
}
-5
View File
@@ -1,5 +0,0 @@
{
imports = [
../../apps/hyprland/default.nix
];
}
-5
View File
@@ -1,5 +0,0 @@
{
imports = [
../../scripts/hakase-scripts.nix
];
}
+11
View File
@@ -0,0 +1,11 @@
{...}: {
imports = [
../packages/git/default.nix
../packages/fish/default.nix
../packages/kitty/default.nix
../packages/neovim/default.nix
../packages/starship/default.nix
../packages/fastfetch/default.nix
../packages/zsh/default.nix
];
}
+2
View File
@@ -0,0 +1,2 @@
node_modules/
@girs/
+17
View File
@@ -0,0 +1,17 @@
import { App } from "astal/gtk3"
import style from "./style.scss"
import Bar from "./widget/Bar"
App.start({
css: style,
instanceName: "js",
requestHandler(request, res) {
print(request)
res("ok")
},
main: () => {
const monitors = App.get_monitors()
const primary = monitors.find(m => m.primary) || monitors[0]
return Bar(primary)
}
})
+3
View File
@@ -0,0 +1,3 @@
$background: #131318;
$foreground: #e4e1e9;
$primary: #bec2ff;
+21
View File
@@ -0,0 +1,21 @@
declare const SRC: string
declare module "inline:*" {
const content: string
export default content
}
declare module "*.scss" {
const content: string
export default content
}
declare module "*.blp" {
const content: string
export default content
}
declare module "*.css" {
const content: string
export default content
}
+6
View File
@@ -0,0 +1,6 @@
{
"name": "astal-shell",
"dependencies": {
"astal": "/home/biscuit/.local/share/ags"
}
}
+143
View File
@@ -0,0 +1,143 @@
@use "sass:color";
@use "./colors" as *;
// default
// $bg: #212223;
// $fg: #f1f1f1;
// $accent: #378DF7;
// $radius: 7px;
// Kanagawa Theme
// $bg: #1F1F28;
// $fg: #DCD7BA;
// $accent: #C0A36E;
// $radius: 7px;
// mstcl
// $bg: #121212;
// $fg: #f1f1f1;
// $accent: #C0A36E;
// $radius: 7px;
$bg: $background;
$fg: $foreground;
$accent: $primary;
$radius: 7px;
window.Bar {
border: none;
box-shadow: none;
background-color: $bg;
color: $fg;
font-size: 1.1em;
font-weight: bold;
font-family: "JetBrainsMono Nerd Font";
label {
margin: 0 8px;
}
.Workspaces {
button {
all: unset;
background-color: transparent;
&:hover label {
background-color: color.adjust($fg, $alpha: -0.84);
border-color: color.adjust($accent, $alpha: -0.8);
}
&:active label {
background-color: color.adjust($fg, $alpha: -0.8)
}
}
label {
transition: 200ms;
padding: 0 8px;
margin: 2px;
border-radius: $radius;
border: 1pt solid transparent;
}
.focused label {
color: $accent;
border-color: $accent;
}
}
.SysTray {
margin-right: 8px;
button {
padding: 0 4px;
}
}
.Time {
.TimeHM {
font-weight: bold;
color: $accent;
}
.TimeDate {
// color: color.adjust($fg, $lightness: -10%);
color: $fg;
opacity: 0.85;
font-weight: normal;
}
}
.FocusedClient {
color: color.adjust($fg, $lightness: -30%);
opacity: 0.7;
}
.Media .Cover {
min-height: 1.2em;
min-width: 1.2em;
border-radius: $radius;
background-position: center;
background-size: contain;
}
.Battery label {
padding-left: 0;
margin-left: 0;
}
.AudioSlider {
* {
all: unset;
}
icon {
margin-right: .6em;
}
& {
margin: 0 1em;
}
trough {
background-color: color.adjust($fg, $alpha: -0.8);
border-radius: $radius;
}
highlight {
background-color: $accent;
min-height: .8em;
border-radius: $radius;
}
slider {
background-color: $fg;
border-radius: $radius;
min-height: 1em;
min-width: 1em;
margin: -.2em;
}
}
}
+14
View File
@@ -0,0 +1,14 @@
{
"$schema": "https://json.schemastore.org/tsconfig",
"compilerOptions": {
"experimentalDecorators": true,
"strict": true,
"target": "ES2022",
"module": "ES2022",
"moduleResolution": "Bundler",
// "checkJs": true,
// "allowJs": true,
"jsx": "react-jsx",
"jsxImportSource": "astal/gtk3",
}
}
+189
View File
@@ -0,0 +1,189 @@
import { App } from "astal/gtk3"
import { Variable, GLib, bind } from "astal"
import { Astal, Gtk, Gdk } from "astal/gtk3"
import Hyprland from "gi://AstalHyprland"
import Mpris from "gi://AstalMpris"
import Battery from "gi://AstalBattery"
import Wp from "gi://AstalWp"
import Network from "gi://AstalNetwork"
import Tray from "gi://AstalTray"
function SysTray() {
const tray = Tray.get_default()
return <box className="SysTray">
{bind(tray, "items").as(items => items.map(item => (
<menubutton
tooltipMarkup={bind(item, "tooltipMarkup")}
usePopover={false}
actionGroup={bind(item, "actionGroup").as(ag => ["dbusmenu", ag])}
menuModel={bind(item, "menuModel")}>
<icon gicon={bind(item, "gicon")} />
</menubutton>
)))}
</box>
}
function Wifi() {
const network = Network.get_default()
const wifi = bind(network, "wifi")
return <box visible={wifi.as(Boolean)}>
{wifi.as(wifi => wifi && (
<icon
tooltipText={bind(wifi, "ssid").as(String)}
className="Wifi"
icon={bind(wifi, "iconName")}
/>
))}
</box>
}
function AudioSlider() {
const speaker = Wp.get_default()?.audio.defaultSpeaker!
return <box className="AudioSlider" css="min-width: 140px">
<icon icon={bind(speaker, "volumeIcon")} />
<slider
hexpand
onDragged={({ value }) => speaker.volume = value}
value={bind(speaker, "volume")}
/>
</box>
}
function BatteryLevel() {
const bat = Battery.get_default()
return <box className="Battery"
visible={bind(bat, "isPresent")}>
<icon icon={bind(bat, "batteryIconName")} />
<label label={bind(bat, "percentage").as(p =>
`${Math.floor(p * 100)} %`
)} />
</box>
}
function Media() {
const mpris = Mpris.get_default()
return <box className="Media">
{bind(mpris, "players").as(ps => ps[0] ? (
<box>
<box
className="Cover"
valign={Gtk.Align.CENTER}
css={bind(ps[0], "coverArt").as(cover =>
`background-image: url('${cover}');`
)}
/>
<label
label={bind(ps[0], "metadata").as(() =>
`${ps[0].title} - ${ps[0].artist}`
)}
/>
</box>
) : (
<label label="Biscuit" />
))}
</box>
}
function Workspaces() {
const hypr = Hyprland.get_default();
return (
<box className="Workspaces">
{bind(hypr, "focusedWorkspace").as((fw) => {
if (!fw) return null;
// Determine the current chunk of 5 visible workspace buttons
const currentChunkStart = Math.floor((fw.id - 1) / 5) * 5 + 1;
const visibleIds = Array.from({ length: 5 }, (_, i) => currentChunkStart + i);
return visibleIds.map((id) => {
// Try to get the real workspace, fall back to a dummy one if it doesn't exist
const ws =
hypr.workspaces.find((w) => w.id === id) ??
Hyprland.Workspace.dummy(id, null);
return (
<button
className={fw.id === id ? "focused" : ""}
onClick={() => ws.focus()}
>
{id}
</button>
);
});
})}
</box>
);
}
function FocusedClient() {
const hypr = Hyprland.get_default();
const focused = bind(hypr, "focusedClient");
return (
<box className="FocusedClient" visible={focused.as(Boolean)}>
{focused.as(client => {
if (!client) return null;
return (
<label
label={bind(client, "title").as(title => {
return title.length > 40
? title.slice(0, 37) + "..."
: title;
})}
/>
);
})}
</box>
);
}
function Time({ format = "%H:%M|%a %b %d" }) {
const time = Variable<string>("").poll(1000, () =>
GLib.DateTime.new_now_local().format(format)!
);
return bind(time).as(str => {
const [hm, date] = str.split("|");
return (
<box className="Time">
<label className="TimeHM" label={hm} />
<label className="TimeDate" label={date} />
</box>
);
});
}
export default function Bar(monitor: Gdk.Monitor) {
const { TOP, LEFT, RIGHT } = Astal.WindowAnchor
return <window
className="Bar"
gdkmonitor={monitor}
exclusivity={Astal.Exclusivity.EXCLUSIVE}
anchor={TOP | LEFT | RIGHT}>
<centerbox>
<box hexpand halign={Gtk.Align.START}>
<Workspaces />
<FocusedClient />
</box>
<box>
<Time />
</box>
<box hexpand halign={Gtk.Align.END} >
<SysTray />
<Wifi />
<AudioSlider />
<BatteryLevel />
</box>
</centerbox>
</window>
}
+28
View File
@@ -0,0 +1,28 @@
{
inputs,
pkgs,
system,
...
}: {
imports = [inputs.ags.homeManagerModules.default];
programs.ags = {
enable = true;
configDir = ./biscuit;
extraPackages = let
agsPkgs = inputs.ags.packages.${system};
in
with pkgs; [
agsPkgs.battery
agsPkgs.hyprland
agsPkgs.mpris
agsPkgs.wireplumber
agsPkgs.notifd
agsPkgs.apps
agsPkgs.network
agsPkgs.tray
fzf
];
};
}
+131
View File
@@ -0,0 +1,131 @@
{
programs.fastfetch = {
enable = true;
settings = {
logo = {
padding = {
top = 2;
left = 1;
right = 2;
};
};
display = {
separator = " ";
};
modules = [
# Title
{
type = "title";
format = "{#1} {#}{user-name-colored}";
}
# System Information Header
{
type = "custom";
format = "{#1} {#}System Information";
}
{
type = "os";
key = " {#keys}󰍹 OS";
}
{
type = "kernel";
key = " {#keys}󰒋 Kernel";
}
{
type = "uptime";
key = " {#keys}󰅐 Uptime";
}
{
type = "packages";
key = " {#keys}󰏖 Packages";
format = "{all}";
}
{
type = "custom";
format = "{#1}";
}
# Desktop Environment
{
type = "custom";
format = "{#1} {#}Desktop Environment";
}
{
type = "de";
key = " {#keys}󰧨 DE";
}
{
type = "wm";
key = " {#keys}󱂬 WM";
}
{
type = "wmtheme";
key = " {#keys}󰉼 Theme";
}
{
type = "display";
key = " {#keys}󰹑 Resolution";
}
{
type = "shell";
key = " {#keys}󰞷 Shell";
}
{
type = "terminalfont";
key = " {#keys}󰛖 Font";
}
{
type = "custom";
format = "{#1}";
}
# Hardware Information
{
type = "custom";
format = "{#1} {#}Hardware Information";
}
{
type = "cpu";
key = " {#keys}󰻠 CPU";
}
{
type = "gpu";
key = " {#keys}󰢮 GPU";
}
{
type = "memory";
key = " {#keys}󰍛 Memory";
}
{
type = "disk";
key = " {#keys}󰋊 Disk (/)";
folders = "/";
}
{
type = "custom";
format = "{#1}";
}
# Colors
{
type = "colors";
key = "";
symbol = "circle";
}
# Footer
{
type = "custom";
format = "{#1}";
}
];
};
};
}
@@ -3,15 +3,16 @@
myConfig,
...
}: {
programs.zoxide.enable = true;
programs.fish = {
enable = true;
interactiveShellInit = ''
set fish_greeting
fish_vi_key_bindings
zoxide init fish | source
zoxide init fish --cmd cd | source
'';
shellAliases = myConfig.terminal.aliases;
shellAliases = myConfig.general.terminal.Aliases;
plugins = with pkgs.fishPlugins; [
];
+10
View File
@@ -0,0 +1,10 @@
{myConfig, ...}: {
programs.git = {
enable = true;
extraConfig = {
user.name = "${myConfig.general.gitProfile.User}";
user.email = "${myConfig.general.gitProfile.Email}";
init.defaultBranch = "${myConfig.general.gitProfile.defaultBranch}";
};
};
}
+38
View File
@@ -0,0 +1,38 @@
{...}: {
services.hypridle = {
enable = true;
settings = {
general = {
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 && agu"; # avoid needing to press a key twice to turn on the display.
};
listener = [
{
timeout = 150;
on-timeout = "brightnessctl -s set 10"; # set monitor backlight to minimum, avoid 0 on OLED monitor.
on-resume = "brightnessctl -r"; # restore monitor backlight.
}
{
timeout = 150;
on-timeout = "brightnessctl -sd rgb:kbd_backlight set 0"; # turn off keyboard backlight.
on-resume = "brightnessctl -rd rgb:kbd_backlight"; # turn on keyboard backlight.
}
{
timeout = 300;
on-timeout = "loginctl lock-session"; # lock screen when timeout has passed.
}
{
timeout = 330;
on-timeout = "hyprctl dispatch dpms off"; # screen off after 5.5min.
on-resume = "hyprctl dispatch dpms on && brightnessctl -r"; # screen on and restore brightness on resume.
}
{
timeout = 500;
on-timeout = "systemctl suspend"; # suspend PC after 30min.
}
];
};
};
}
+221
View File
@@ -0,0 +1,221 @@
{myConfig, ...}: {
wayland.windowManager.hyprland = {
enable = true;
xwayland.enable = true;
settings = {
"$mod" = "SUPER";
"$term" = "kitty --single-instance";
"$browser" = "firefox";
monitor = myConfig.linux.hyprconf.Monitor;
exec-once = [
"[workspace 20 silent] kitty --single-insance --hold fastfetch"
"[workspace 20 silent] firefox"
"[workspace 1] kitty --single-instance --hold fastfetch"
"pkill gjs & ags run"
"matugen image /home/${myConfig.general.Username}/.config/nixos/assets/wallpapers/ultrawide-nixos-default.png"
"hyprctl setcursor Bibata-Original-Classic 24"
"solaar -w hide"
];
general = {
gaps_in = 2;
gaps_out = 5;
border_size = 2;
# col.active_border = "#0DB7D4FF";
# col.inactive_border = "#31313600";
# col = {
# "inactive_border" = "rgba(595959aa)";
# "active_border" = "rgba(33ccffee) rgba(00ff99ee) 45deg";
# };
resize_on_border = false;
allow_tearing = false;
layout = "dwindle";
};
decoration = {
rounding = 0;
rounding_power = 2;
active_opacity = 1.0;
inactive_opacity = 1.0;
dim_inactive = true;
dim_strength = 0.1;
dim_special = 0.8;
shadow = {
enabled = true;
range = 4;
render_power = 3;
color = "rgba(1a1a1aee)";
};
blur = {
enabled = true;
size = 3;
passes = 1;
vibrancy = 0.1696;
};
};
animations = {
enabled = true;
bezier = [
"linear, 0, 0, 1, 1"
"md3_standard, 0.2, 0, 0, 1"
"md3_decel, 0.05, 0.7, 0.1, 1"
"md3_accel, 0.3, 0, 0.8, 0.15"
"overshot, 0.05, 0.9, 0.1, 1.1"
"crazyshot, 0.1, 1.5, 0.76, 0.92"
"hyprnostretch, 0.05, 0.9, 0.1, 1.0"
"menu_decel, 0.1, 1, 0, 1"
"menu_accel, 0.38, 0.04, 1, 0.07"
"easeInOutCirc, 0.85, 0, 0.15, 1"
"easeOutCirc, 0, 0.55, 0.45, 1"
"easeOutExpo, 0.16, 1, 0.3, 1"
"softAcDecel, 0.26, 0.26, 0.15, 1"
"md2, 0.4, 0, 0.2, 1"
];
animation = [
"windows, 1, 3, md3_decel, popin 60%"
"windowsIn, 1, 3, md3_decel, popin 60%"
"windowsOut, 1, 3, md3_accel, popin 60%"
"border, 1, 10, default"
"fade, 1, 3, md3_decel"
"layersIn, 1, 3, menu_decel, slide"
"layersOut, 1, 1.6, menu_accel"
"fadeLayersIn, 1, 2, menu_decel"
"fadeLayersOut, 1, 0.5, menu_accel"
"workspaces, 1, 7, menu_decel, slide"
"specialWorkspace, 1, 3, md3_decel, slidevert"
];
};
dwindle = {
pseudotile = true;
preserve_split = true;
};
master = {
new_status = "master";
};
misc = {
force_default_wallpaper = -1;
disable_hyprland_logo = true;
};
input = {
kb_layout = "us";
follow_mouse = 1;
sensitivity = 0;
force_no_accel = true;
repeat_delay = 250;
repeat_rate = 35;
touchpad = {
natural_scroll = false;
};
numlock_by_default = true;
};
gestures = {
workspace_swipe = false;
};
binds = {
workspace_back_and_forth = true;
scroll_event_delay = 0;
};
device = [
{
name = "epic-mouse-v1";
sensitivity = -0.5;
}
];
bind =
[
"$mod, Return, exec, $term"
"$mod, Q, killactive,"
"$mod, M, exit,"
"$mod, E, exec, $fileManager"
"$mod, V, togglefloating,"
"$mod, R, exec, $menu"
"$mod, P, pseudo,"
"$mod, B, togglesplit,"
"$mod, W, exec, $browser"
"$mod, H, movefocus, l"
"$mod, L, movefocus, r"
"$mod, K, movefocus, u"
"$mod, J, movefocus, d"
"$mod SHIFT, K, movewindow, u"
"$mod SHIFT, J, movewindow, d"
"$mod SHIFT, H, movewindow, l"
"$mod SHIFT, L, movewindow, r"
"$mod CTRL, K, resizeactive, 0 -50"
"$mod CTRL, J, resizeactive, 0 50"
"$mod CTRL, H, resizeactive, -50 0"
"$mod CTRL, L, resizeactive, 50 0"
"$mod, S, togglespecialworkspace, magic"
"$mod SHIFT, S, movetoworkspace, special:magic"
"$mod, mouse_down, workspace, e+1"
"$mod, mouse_up, workspace, e-1"
"$mod, F, fullscreen, 0"
"$mod, Space, exec, pkill rofi || rofi -show drun"
"$mod, C, exec, pkill rofi || rofi -show calc -modi calc -no-show-match -no-sort"
]
++ (
# workspaces
builtins.concatLists (builtins.genList (
i: let
ws = i + 1;
in [
"$mod, ${toString ws}, workspace, ${toString ws}"
"$mod SHIFT, ${toString ws}, movetoworkspace, ${toString ws}"
]
)
9)
)
++ [
"$mod, 0, workspace, 10"
"$mod, 0, movetoworkspace, 10"
];
bindm = [
"$mod, mouse:272, movewindow"
"$mod, mouse:273, resizewindow"
];
bindel = [
",XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+"
",XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"
",XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
",XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"
",XF86MonBrightnessUp, exec, brightnessctl s 10%+"
",XF86MonBrightnessDown, exec, brightnessctl s 10%-"
];
bindl = [
",XF86AudioNext, exec, playerctl next"
",XF86AudioPause, exec, playerctl play-pause"
",XF86AudioPlay, exec, playerctl play-pause"
",XF86AudioPrev, exec, playerctl previous"
];
env = [
"HYPRCURSOR_THEME, Bibata-Original-Classic"
"HYPRCURSOR_SIZE, 24"
];
};
};
}
+7
View File
@@ -0,0 +1,7 @@
{...}: {
programs.hyprlock = {
enable = true;
settings = {
};
};
}
+25
View File
@@ -0,0 +1,25 @@
{myConfig, ...}: {
programs.kitty = {
enable = true;
themeFile = "kanagawa";
settings = {
confirm_os_window_close = 0;
window_padding_width = 10;
font_size = myConfig.general.terminal.Size;
font_family = myConfig.general.terminal.Font;
bold_font = "auto";
italic_font = "auto";
bold_italic_font = "auto";
# optimization
input_delay = 0;
repaint_delay = 2;
sync_to_monitor = false;
wayland_enable_ime = false;
allow_remote_control = true;
};
extraConfig = "include colors.conf";
};
}
+23
View File
@@ -0,0 +1,23 @@
{...}: {
programs.mangohud = {
enable = true;
enableSessionWide = true;
settings = {
toggle_hud = "Shift_R+F12";
full = true;
gpu_temp = true;
cpu_temp = true;
fps_only = false;
blacklist = [
"pamac-manager"
"lact"
"ghb"
"bitwig-studio"
"ptyxis"
"yumex"
];
};
};
}
+70
View File
@@ -0,0 +1,70 @@
[config]
# If set to enabled, it will check for updates when you run the matugen command, notifying you that an update is avaiable.
# WARNING: Matugen needs to be compiled with the `update-informer` feature for this to work.
version_check = false
[config.wallpaper]
# The base command to run for applying the wallpaper, shouldn't have spaces in it.
command = "swww"
# The arguments that will be provided to the command.
# Keywords like {{ mode }} or anything that works inside of hooks doesn't work here.
# The last argument will be the image path.
arguments = ["img", "--transition-type", "center", "--transition-fps", "120"]
# For example, killing the wallpaper daemon. Usage is like a normal hook.
# pre_hook = ""
[config.custom_keywords]
test = "aaaa"
[templates.name1]
# Relative paths will be resolved from the path `config.toml` is in.
input_path = "./colors.whatever-extension"
output_path = "./a/colors-generated.whatever-extension"
# This will use a different input path depending on what mode you use.
# input_path_modes = { dark = "./colors.whatever-extension", light = "./colors.whatever-extension" }
# This will compare all of the colors inside the array with the color you set as `compare_to`, and returns the closest color to it.
# You can then use `{{closest_color}}` inside templates and hooks.
colors_to_compare = [
{ name = "black", color = "#000000" },
{ name = "red", color = "#ff0000" },
{ name = "maroon", color = "#800000" },
{ name = "yellow", color = "#ffff00" },
{ name = "olive", color = "#808000" },
{ name = "lime", color = "#00ff00" },
{ name = "green", color = "#008000" },
{ name = "aqua", color = "#00ffff" },
{ name = "teal", color = "#008080" },
{ name = "blue", color = "#0000ff" },
{ name = "navy", color = "#000080" },
{ name = "fuchsia", color = "#ff00ff" },
{ name = "purple", color = "#800080" },
]
compare_to = "{{colors.primary.default.hex}}"
# Runs before the template is exported. You can use keywords here,
pre_hook = 'echo "source color {{colors.source_color.default.hex}}, source image {{image}}, closest color {{closest_color}}"'
# Runs after the template is exported. You can use keywords here.
post_hook = 'echo "after gen"'
# Only hex values
# https://m3.material.io/styles/color/advanced/adjust-existing-colors#1cc12e43-237b-45b9-8fe0-9a3549c1f61e
# Blend is set to true by default.
[config.custom_colors]
green = "#00ff00"
red = "#ff0000"
blue = { color = "#0000ff", blend = false }
### --- my config
[templates.kitty]
input_path = '~/.config/nixos/pkgs/matugen/custom/templates/kitty.conf'
output_path = '~/.config/kitty/colors.conf'
post_hook = "kitty @ set-colors -a -c ~/.config/kitty/colors.conf"
[templates.ags]
input_path = '~/.config/nixos/pkgs/matugen/custom/templates/ags.scss'
output_path = '~/.config/nixos/pkgs/ags/biscuit/colors.scss'
post_hook = "pkill gjs & ags run ~/.config/nixos/pkgs/ags/biscuit/app.ts & disown (jobs -p) &"
@@ -0,0 +1,3 @@
$background: {{colors.surface.dark.hex}};
$foreground: {{colors.on_surface.dark.hex}};
$primary: {{colors.primary.dark.hex}};
@@ -0,0 +1,41 @@
cursor {{colors.on_surface.default.hex}}
cursor_text_color {{colors.on_surface_variant.default.hex}}
foreground {{colors.on_surface.default.hex}}
background {{colors.surface.default.hex}}
selection_foreground {{colors.on_secondary.default.hex}}
selection_background {{colors.secondary_fixed_dim.default.hex}}
url_color {{colors.primary.default.hex}}
# black
color8 #262626
color0 #4c4c4c
# red
color1 #ac8a8c
color9 #c49ea0
# green
color2 #8aac8b
color10 #9ec49f
# yellow
color3 #aca98a
color11 #c4c19e
# blue
/* color4 #8f8aac */
color4 {{colors.primary.default.hex}}
color12 #a39ec4
# magenta
color5 #ac8aac
color13 #c49ec4
# cyan
color6 #8aacab
color14 #9ec3c4
# white
color15 #e7e7e7
color7 #f0f0f0
+11
View File
@@ -0,0 +1,11 @@
{
pkgs,
inputs,
system,
...
}: {
imports = [inputs.matugen.nixosModules.default];
home.file.".config/matugen/config.toml" = {
source = builtins.toPath ./custom/config.toml;
};
}
+12
View File
@@ -0,0 +1,12 @@
{
pkgs,
inputs,
...
}: let
nixovim = inputs.nixovim.packages.${pkgs.system}.default;
in {
home.packages = [
nixovim
pkgs.lazygit
];
}
+8
View File
@@ -0,0 +1,8 @@
{pkgs, ...}: {
programs.rofi = {
enable = true;
plugins = with pkgs; [
rofi-calc
];
};
}
+62
View File
@@ -0,0 +1,62 @@
{lib, ...}: {
programs.starship = {
enable = true;
settings = {
format = lib.concatStrings [
"$username"
"$hostname"
"$directory"
"$git_branch"
"$git_state"
"$git_status"
"$cmd_duration"
"$line_break"
"$python"
"$character"
];
directory = {
style = "blue";
};
character = {
success_symbol = "[](purple)";
error_symbol = "[](red)";
vimcmd_symbol = "[](green)";
};
git_branch = {
format = "[$branch]($style)";
style = "bright-black";
};
git_status = {
format = "[(*$conflicted$untracked$modified$staged$renamed$deleted) $ahead_behind$stashed]($style)";
style = "cyan";
conflicted = "";
untracked = "";
modified = "";
staged = "";
renamed = "";
deleted = "";
stashed = "";
};
git_state = {
format = "([$state( $progress_current/$progress_total)]($style)) ";
style = "bright-black";
};
cmd_duration = {
format = "[$duration]($style) ";
style = "yellow";
};
python = {
format = "[$virtualenv]($style) ";
style = "bright-black";
};
};
};
# home.file.".config/starship.toml" = {
# source = builtins.toPath ./pure.toml;
# };
}
+3
View File
@@ -0,0 +1,3 @@
{...}: {
services.swww.enable = true;
}
+40
View File
@@ -0,0 +1,40 @@
{
pkgs,
myConfig,
...
}: {
home.packages = with pkgs; [
zoxide
];
programs.zsh.enable = true;
programs.zoxide.enable = true;
programs.zsh = {
enableCompletion = false;
syntaxHighlighting.enable = false;
shellAliases = myConfig.general.terminal.Aliases;
history.size = 10000;
antidote = {
enable = true;
plugins = [
"MichaelAquilina/zsh-autoswitch-virtualenv"
"jeffreytse/zsh-vi-mode"
"zdharma-continuum/fast-syntax-highlighting kind:defer"
"zsh-users/zsh-autosuggestions kind:defer"
"zsh-users/zsh-history-substring-search kind:defer"
];
};
initContent = ''
# zsh-autocomplete
# bindkey -M menuselect '^M' .accept-line # run code when selected completion
autoload -Uz compinit
if [ "$(date +'%j')" != "$(stat -f '%Sm' -t '%j' ~/.zcompdump 2>/dev/null)" ]; then
compinit
else
compinit -C
fi
'';
};
}
-169
View File
@@ -1,169 +0,0 @@
{pkgs, ...}: let
# 1. The Brain: Logic to find a window or launch a new one
hakase-launch-or-focus = pkgs.writeShellScriptBin "hakase-launch-or-focus" ''
if (($# == 0)); then
echo "Usage: hakase-launch-or-focus [window-pattern] [launch-command]"
exit 1
fi
WINDOW_PATTERN="$1"
# Escaped Nix interpolation for shell default value logic
LAUNCH_COMMAND="''${2:-"uwsm-app -- $WINDOW_PATTERN"}"
# Locate window address via hyprctl and jq
WINDOW_ADDRESS=$(${pkgs.hyprland}/bin/hyprctl clients -j | ${pkgs.jq}/bin/jq -r --arg p "$WINDOW_PATTERN" \
'.[] | select((.class | test("\\b" + $p + "\\b"; "i")) or (.title | test("\\b" + $p + "\\b"; "i"))) | .address' | head -n1)
if [[ -n $WINDOW_ADDRESS ]]; then
# If found, focus the existing window
${pkgs.hyprland}/bin/hyprctl dispatch focuswindow "address:$WINDOW_ADDRESS"
else
# If not found, execute the launch command
eval exec setsid $LAUNCH_COMMAND
fi
'';
hakase-launch-tui = pkgs.writeShellScriptBin "hakase-launch-tui" ''
APP_NAME=$(basename "$1")
# Using org.hakase prefix so the focus script can find it via class name
exec setsid uwsm-app -- xdg-terminal-exec --app-id=org.hakase."$APP_NAME" -e "$@"
'';
hakase-focus-wrapper = pkgs.writeShellScriptBin "hakase-focus-wrapper" ''
APP_NAME=$(basename "$1")
WINDOW_PATTERN="org.hakase.$APP_NAME"
LAUNCH_CMD="hakase-launch-tui $*"
exec hakase-launch-or-focus "$WINDOW_PATTERN" "$LAUNCH_CMD"
'';
hakase-launch-wifi = pkgs.writeShellScriptBin "hakase-launch-wifi" ''
# Unblock the WiFi radio (requires appropriate user groups/permissions)
# ${pkgs.util-linux}/bin/rfkill unblock wifi
# Use the focus wrapper to launch or switch to Impala
exec hakase-focus-wrapper impala
'';
hakase-launch-bluetooth =
pkgs.writeShellScriptBin "hakase-launch-bluetooth"
''
# ${pkgs.util-linux}/bin/rfkill unblock wifi
exec hakase-focus-wrapper bluetui
'';
hakase-launch-popup = pkgs.writeShellScriptBin "hakase-launch-popup" ''
if (($# < 3)); then
echo "Usage: hakase-launch-popup [width] [height] [command...]"
exit 1
fi
# --- ARGS & CONFIG ---
WIN_WIDTH="$1"
WIN_HEIGHT="$2"
shift 2
MARGIN=10
BAR_HEIGHT=40
# ---------------------
CMD_NAME=$(basename "$1")
TARGET_CLASS="org.hakase.popup.$CMD_NAME"
# 1. SINGLETON LOGIC: Check for ANY existing hakase popup
# We look for any client with a class starting with "org.hakase.popup."
EXISTING_JSON=$(${pkgs.hyprland}/bin/hyprctl clients -j | ${pkgs.jq}/bin/jq -r '.[] | select(.class | startswith("org.hakase.popup."))')
if [[ -n "$EXISTING_JSON" ]]; then
OLD_ADDR=$(echo "$EXISTING_JSON" | ${pkgs.jq}/bin/jq -r '.address')
OLD_CLASS=$(echo "$EXISTING_JSON" | ${pkgs.jq}/bin/jq -r '.class')
# Close the existing popup
${pkgs.hyprland}/bin/hyprctl dispatch closewindow "address:$OLD_ADDR"
# If the existing popup was the SAME one we are trying to launch, we are done (Toggle Off behavior)
if [[ "$OLD_CLASS" == "$TARGET_CLASS" ]]; then
exit 0
fi
# If it was a different popup, wait a tiny bit for Hyprland to process the close
# This prevents the new window from "merging" with the closing animation of the old one
sleep 0.15
fi
# 2. Calculate Geometry (Standard logic)
MONITOR_INFO=$(${pkgs.hyprland}/bin/hyprctl monitors -j | ${pkgs.jq}/bin/jq '.[] | select(.focused == true)')
MON_X=$(echo "$MONITOR_INFO" | ${pkgs.jq}/bin/jq '.x')
MON_Y=$(echo "$MONITOR_INFO" | ${pkgs.jq}/bin/jq '.y')
MON_WIDTH=$(echo "$MONITOR_INFO" | ${pkgs.jq}/bin/jq '.width')
TARGET_X=$((MON_X + MON_WIDTH - WIN_WIDTH - MARGIN))
TARGET_Y=$((MON_Y + BAR_HEIGHT + MARGIN))
# 3. Launch with Rules
RULE="[float;pin;size $WIN_WIDTH $WIN_HEIGHT;move $TARGET_X $TARGET_Y]"
${pkgs.hyprland}/bin/hyprctl dispatch exec "$RULE xdg-terminal-exec --app-id=$TARGET_CLASS -e $@"
# 4. Background Listener (Close on Blur)
(
TIMEOUT=0
WINDOW_ADDR=""
while [[ -z "$WINDOW_ADDR" && $TIMEOUT -lt 20 ]]; do
sleep 0.1
WINDOW_ADDR=$(${pkgs.hyprland}/bin/hyprctl clients -j | ${pkgs.jq}/bin/jq -r --arg c "$TARGET_CLASS" '.[] | select(.class == $c) | .address')
((TIMEOUT++))
done
if [[ -n "$WINDOW_ADDR" ]]; then
${pkgs.socat}/bin/socat -U - UNIX-CONNECT:"$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock" | while read -r line; do
if [[ "$line" == "activewindow>>"* ]]; then
NEW_FOCUS="0x$(echo "$line" | cut -d '>' -f3 | cut -d ',' -f1)"
# If focus is lost to another window, close this popup
if [[ "$WINDOW_ADDR" != "$NEW_FOCUS" ]]; then
${pkgs.hyprland}/bin/hyprctl dispatch closewindow "address:$WINDOW_ADDR"
break
fi
fi
done
fi
) &
exit 0
'';
# 1. WiFi (Impala) - Requires a larger view
hakase-popup-wifi = pkgs.writeShellScriptBin "hakase-popup-wifi" ''
exec hakase-launch-popup 800 500 impala
'';
# 2. Bluetooth (Bluetui) - Fits your specific test size
hakase-popup-bluetooth = pkgs.writeShellScriptBin "hakase-popup-bluetooth" ''
exec hakase-launch-popup 600 500 bluetui
'';
# 3. Volume (Wiremix) - Can be smaller
hakase-popup-volume = pkgs.writeShellScriptBin "hakase-popup-volume" ''
exec hakase-launch-popup 800 300 wiremix
'';
in {
environment.systemPackages = [
pkgs.jq
pkgs.socat # Required for the socket listener
pkgs.util-linux
pkgs.bluetui
pkgs.impala
pkgs.wiremix
pkgs.pamixer
hakase-launch-popup
hakase-popup-wifi
hakase-popup-bluetooth
hakase-popup-volume
hakase-launch-or-focus
hakase-launch-tui
hakase-focus-wrapper
hakase-launch-wifi
hakase-launch-bluetooth
];
}

Some files were not shown because too many files have changed in this diff Show More