2 Commits

Author SHA1 Message Date
biscuit a1c4841580 test 2025-06-30 13:29:56 -05:00
biscuit 62d8d36ed8 test 2025-06-30 12:49:36 -05:00
161 changed files with 3092 additions and 4026 deletions
-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
+50 -49
View File
@@ -1,57 +1,58 @@
# HakaseOS # Sakamoto NixOS
HakaseOS is an opinionated NixOS configuration heavily inspired by OmarchyOS.
## Features Sakamoto NixOS is built with various profiles intended for reproducibility.
* Vim keybindings
* Simple Setup
* Pre-configured Firefox
## How to Use SOPS ## Available Hosts
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.
To get started, follow the instructions below. - MacBook M series
1. Create a folder. - Linux
```sh
mkdir -p ~/.config/sops/age ## Installation
```
2. Generate a private key using `age` 1. Install [Nix](https://nixos.org/download/).
```sh
nix-shell -p age --run "age-keygen -o ~/.config/sops/age/keys.txt" 2. Ensure Nix is installed properly by running the following (this also gives you `nano` for editing later):
```
**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
```
Replace as according to your needs.
5. Create a sops `.yaml` file.
```sh ```sh
nix-shell -p sops --run "sops secrets/example.yaml" nix-shell -p nano
``` ```
NOTE: If you add a new host to your `.sops.yaml`, you will need to update the keys for all secrets.
3. Clone the git repository:
```sh ```sh
nix-shell -p sops --run "sops updatekeys secrets/example.yaml" 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 `<PLACEHOLDER>`.**
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
``` ```
-6
View File
@@ -1,6 +0,0 @@
* fix: special workspace preload always loads first. Toggling it back is easy, but i'd rather create a new sh script that forces back to normal workspace.
* add: hypridle
* add: similar to omarchy-menu
* cleanup: stylix configurations and wallpaper
* cleanup: convert `anonymize` fixme's to secret keys
* add: hyprlock
-5
View File
@@ -1,5 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [
cava
];
}
-146
View File
@@ -1,146 +0,0 @@
{
pkgs,
myConfig,
inputs,
...
}: {
imports = [
inputs.textfox.homeManagerModules.default
./textfox.nix
];
home.packages = with pkgs; [
pywalfox-native
tridactyl-native
];
home.file.".config/tridactyl/tridactylrc".text = ''
set focusbypass true
set smoothscroll true
bind J tabnext
bind K tabprev
unbind <C-e>
'';
programs.firefox = {
enable = true;
languagePacks = ["en-US"];
nativeMessagingHosts = [
pkgs.pywalfox-native
pkgs.tridactyl-native
];
profiles = {
youtube = import ./profiles/youtube.nix {inherit pkgs myConfig;};
hakase = {
search.force = true;
isDefault = true;
search.default = "ddg";
extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [
ublock-origin
bitwarden
tridactyl
# pywalfox
];
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 ---
"accessibility.typeaheadfind" = false;
"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";
# };
# };
};
};
}
-120
View File
@@ -1,120 +0,0 @@
{
pkgs,
myConfig,
...
}: {
id = 1;
name = "YouTube";
search.force = true;
search.default = "ddg";
extensions.force = true;
extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [
ublock-origin
bitwarden
tridactyl
];
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;
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
"extensions.autoDisableScopes" = 0; # Enable extensions by default
# --- Homepage & Navigation ---
"browser.startup.homepage" = "https://youtube.com";
"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";
};
userChrome = ''
/* --- Floating Autohide Toolbox (Tabs Only) --- */
/* Take toolbox out of the document flow so web content is 100% height */
#navigator-toolbox {
position: fixed !important;
top: 0;
left: 0;
width: 100%;
z-index: 9999 !important;
background-color: var(--toolbar-bgcolor, #1c1b22) !important;
/* Start hidden */
transform: translateY(-100%) !important;
opacity: 0 !important;
transition: transform 0.2s ease, opacity 0.2s ease !important;
}
/* Trigger zone */
#navigator-toolbox::after {
content: "";
position: absolute;
top: 100%;
left: 0;
width: 100%;
height: 10px;
z-index: 10000 !important;
}
/* Reveal when hovering */
#navigator-toolbox:hover {
transform: translateY(0) !important;
opacity: 1 !important;
}
/* --- Hide specific bars --- */
/* Hide Navigation Bar (Address Bar) COMPLETELY */
#nav-bar {
visibility: collapse !important;
height: 0px !important;
min-height: 0px !important;
padding: 0 !important;
margin: 0 !important;
}
/* Hide Bookmarks Toolbar */
#PersonalToolbar { visibility: collapse !important; }
/* Hide Titlebar */
#titlebar { appearance: none !important; }
/* Ensure TabsToolbar looks okay on its own */
#TabsToolbar {
border: none !important;
background: transparent !important;
}
'';
}
-48
View File
@@ -1,48 +0,0 @@
{
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 */";
};
};
}
-5
View File
@@ -1,5 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [
gemini-cli
];
}
-27
View File
@@ -1,27 +0,0 @@
{
config,
pkgs,
...
}: {
home.file.".config/ghostty/screensaver".text = ''
window-padding-x = 0
window-padding-y = 0
window-padding-color = "extend-always"
'';
programs.ghostty = {
enable = true;
package =
if pkgs.stdenv.isDarwin
then pkgs.ghostty-bin
else pkgs.ghostty;
enableFishIntegration = true;
settings = {
confirm-close-surface = false;
app-notifications = false;
window-padding-x = 15;
window-padding-y = 15;
window-padding-balance = true;
};
};
}
View File
-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...
}
-51
View File
@@ -1,51 +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"
];
};
decoration = {
rounding = 0;
shadow = {
enabled = true;
range = 2;
render_power = 3;
color = "rgba(1a1a1aee)";
};
blur = {
enabled = true;
size = 2;
passes = 2;
special = true;
brightness = 0.60;
contrast = 0.75;
};
};
};
}
-88
View File
@@ -1,88 +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"
", XF86MonBrightnessUp, exec, ddcutil setvcp 10 + 10"
", XF86MonBrightnessDown, exec, ddcutil setvcp 10 - 10"
];
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
bindm = [
"SUPER, mouse:272, movewindow"
"SUPER, mouse:273, resizewindow"
];
bindd =
[
# essential
"SUPER, Return, Open Terminal, exec, uwsm app -- xdg-terminal-exec"
"SUPER, Q, Kill active, killactive"
# resize
"SUPER CTRL, H, Resize Left, resizeactive, -40 0"
"SUPER CTRL, J, Resize Down, resizeactive, 0 40"
"SUPER CTRL, K, Resize Up, resizeactive, 0 -40"
"SUPER CTRL, L, Resize Right, resizeactive, 40 0"
# 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, swapwindow, l"
"SUPER SHIFT, j, Move window down, swapwindow, d"
"SUPER SHIFT, k, Move window up, swapwindow, u"
"SUPER SHIFT, l, Move window right, swapwindow, r"
# fullscreen
"SUPER, F, Toggle Fullscreen, fullscreen, 0"
"SUPER SHIFT, F, Toggle Maximized Fullscreen, fullscreen, 1"
# layout
"SUPER, O, Toggle Split, layoutmsg, togglesplit"
# apps
"SUPER, W, Open Browser, exec, uwsm app -- firefox" # FIXME: must be xdg-open
"SUPER, SPACE, Open App Launcher, exec, nc -U $XDG_RUNTIME_DIR/walker/walker.sock"
"SUPER, T, Toggle Steam, togglespecialworkspace, steam"
"SUPER, M, Toggle Music, togglespecialworkspace, music"
"SUPER, Y, Toggle YouTube, togglespecialworkspace, youtube"
"SUPER, P, Toggle Preload, togglespecialworkspace, preload"
# [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)
);
};
}
-14
View File
@@ -1,14 +0,0 @@
{pkgs, ...}: {
home.packages = [
pkgs.gum
];
wayland.windowManager.hyprland.settings = {
env = [
"GUM_CONFIRM_PROMPT_FOREGROUND,6"
"GUM_CONFIRM_SELECTED_FOREGROUND,0"
"GUM_CONFIRM_SELECTED_BACKGROUND,2"
"GUM_CONFIRM_UNSELECTED_FOREGROUND,0"
"GUM_CONFIRM_UNSELECTED_BACKGROUND,8"
];
};
}
-30
View File
@@ -1,30 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [
psmisc
];
wayland.windowManager.hyprland.settings = {
exec = [
# "pkill -x hyprpaper; uwsm app -- hyprpaper"
"killall -SIGUSR2 .ghostty-wrappe"
];
exec-once = [
"[workspace special:preload silent] uwsm app -- firefox"
"[workspace special:preload silent] uwsm app -- xdg-terminal-exec"
"[workspace special:preload silent] uwsm app -- firefox -P YouTube"
"uwsm app -- waybar"
"uwsm app -- hyprpaper"
"uwsm app -- elephant"
"uwsm app -- swayosd-server"
"uwsm app -- pywalfox start"
"walker --gapplication-service"
# "sh -c 'sleep 2; hyprctl dispatch workspace 1; sleep 2; hyprctl dispatch workspace 1'" # FIXME: tard wrangling edition
"[workspace 1] uwsm app -- xdg-terminal-exec"
"[workspace special:steam silent] uwsm app -- steam"
];
};
}
-18
View File
@@ -1,18 +0,0 @@
{myConfig, ...}: {
wayland.windowManager.hyprland.settings = {
general = {
gaps_in = 5;
gaps_out = 15;
layout = "dwindle";
};
monitor = myConfig.hyprland.monitors;
dwindle = {
pseudotile = true;
preserve_split = true;
smart_split = false;
};
master = {
new_status = "master";
};
};
}
-11
View File
@@ -1,11 +0,0 @@
{
wayland.windowManager.hyprland.settings = {
input = {
repeat_rate = 50;
repeat_delay = 300;
};
cursor = {
hide_on_key_press = true;
};
};
}
-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;
};
};
}
-56
View File
@@ -1,56 +0,0 @@
{
wayland.windowManager.hyprland.settings = {
workspace = [
"special:youtube, on-created-empty:uwsm app -- firefox -P YouTube --name youtube"
"special:music, on-created-empty:hakase-music-launch"
];
windowrulev2 = [
# --- POPUP RULES (Wifi, BT, Audio) ---
"float, class:^(org\.hakase\.popup\..*)$"
"animation slide right, class:^(org\.hakase\.popup\..*)$"
"dimaround, class:^(org\.hakase\.popup\..*)$"
# --- WALLPAPER PICKER ---
"float, class:^(org\.hakase\.switch-wallpaper)$"
"float, initialTitle:^(Wallpaper Selector)$"
"center, class:^(org\.hakase\.switch-wallpaper)$"
"center, initialTitle:^(Wallpaper Selector)$"
"size 60% 60%, class:^(org\.hakase\.switch-wallpaper)$"
"size 60% 60%, initialTitle:^(Wallpaper Selector)$"
"dimaround, class:^(org\.hakase\.switch-wallpaper)$"
"dimaround, initialTitle:^(Wallpaper Selector)$"
# Prevent Firefox and Terminal from stealing focus on launch
"suppressevent activate, workspace:special:preload"
"noinitialfocus, workspace:special:preload"
# --- STEAM RULES ---
"workspace special:steam silent, class:^(steam)$"
"noinitialfocus, class:^(steam)$"
"suppressevent activate, class:^(steam)$"
# --- MUSIC RULES (Jellyfin-TUI) ---
"workspace special:music silent, title:^(jellyfin-tui)$"
"workspace special:music silent, initialTitle:^(jellyfin-tui)$"
# --- CAVA RULES ---
"workspace special:music silent, title:^(cava)$"
"workspace special:music silent, initialTitle:^(cava)$"
# --- YOUTUBE RULES ---
"workspace special:youtube, class:^(youtube)$"
# --- GAMING RULES ---
# Steam Apps, Gamescope, Lutris, Heroic, and Wine/Proton apps
"fullscreen, class:^steam_app_\d+$"
"monitor 0, class:^steam_app_\d+$"
"workspace 1, class:^steam_app_\d+$"
"fullscreen, class:^(gamescope)$"
"fullscreen, class:^(lutris)$"
"fullscreen, class:^(heroic)$"
"fullscreen, class:^wine-.*$"
"fullscreen, title:^Wine .*$"
];
};
}
-35
View File
@@ -1,35 +0,0 @@
{
pkgs,
config,
lib,
myConfig,
...
}: let
wallpaperDir = "${config.home.homeDirectory}/.config/nixos/assets/Wallpapers";
defaultWallpaper = "${wallpaperDir}/${myConfig.hyprland.wallpaper}";
cacheWallpaper = "${config.home.homeDirectory}/.cache/current_wallpaper";
in {
services.hyprpaper = {
enable = true;
settings = {
preload = [cacheWallpaper];
wallpaper = [
",${cacheWallpaper}"
];
};
};
home.activation.setupWallpaper = lib.hm.dag.entryAfter ["writeBoundary"] ''
if [ ! -f "${cacheWallpaper}" ]; then
mkdir -p "$(dirname "${cacheWallpaper}")"
if [ -f "${defaultWallpaper}" ]; then
cp "${defaultWallpaper}" "${cacheWallpaper}"
else
echo "Default wallpaper not found at ${defaultWallpaper}"
touch "${cacheWallpaper}"
fi
fi
'';
systemd.user.startServices = "sd-switch";
}
-49
View File
@@ -1,49 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [
(writeShellScriptBin "hakase-wallpaper-switch" ''
if [[ "$1" != "run" ]]; then
if command -v ghostty &> /dev/null; then
ghostty --class="org.hakase.switch-wallpaper" --title="Wallpaper Selector" -e bash -c "hakase-wallpaper-switch run || read -p 'Hit Enter to close...'"
exit 0
elif command -v kitty &> /dev/null; then
kitty --class org.hakase.switch-wallpaper --title "Wallpaper Selector" -e bash -c "hakase-wallpaper-switch run || read -p 'Hit Enter to close...'"
exit 0
fi
fi
tmp_file=$(mktemp)
target_dir="$HOME/.config/nixos/assets/Wallpapers"
if [ ! -d "$target_dir" ]; then
target_dir="$HOME"
fi
# Ensure we are in a terminal that supports yazi
${pkgs.yazi}/bin/yazi "$target_dir" --chooser-file="$tmp_file"
if [ ! -f "$tmp_file" ]; then
echo "No selection file created."
exit 1
fi
WALLPAPER=$(cat "$tmp_file")
rm -f "$tmp_file"
if [ -z "$WALLPAPER" ]; then
echo "No wallpaper selected."
exit 0
fi
# Persistence logic
CACHE_FILE="$HOME/.cache/current_wallpaper"
cp "$WALLPAPER" "$CACHE_FILE"
# Reload hyprpaper
${pkgs.hyprland}/bin/hyprctl hyprpaper unload all
${pkgs.hyprland}/bin/hyprctl hyprpaper preload "$CACHE_FILE"
${pkgs.hyprland}/bin/hyprctl hyprpaper wallpaper ",$CACHE_FILE"
exec matugen image "$CACHE_FILE"
'')
];
}
-5
View File
@@ -1,5 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [
jellyfin-tui
];
}
-5
View File
@@ -1,5 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [
jellyfin-media-player
];
}
-36
View File
@@ -1,36 +0,0 @@
[config] # FIXME: ~/.config feels unreliable. Use config.home.homeDirectory instead.
reload_on_change = true
[templates.ghostty]
input_path = "~/.config/matugen/templates/ghostty"
output_path = "~/.config/ghostty/themes/matugen"
post_hook = "killall -SIGUSR2 .ghostty-wrappe"
[templates.hyprland]
input_path = "~/.config/matugen/templates/hyprland"
output_path = "~/.config/hypr/matugen.conf"
post_hook = "hyprctl reload"
[templates.waybar]
input_path = "~/.config/matugen/templates/waybar"
output_path = "~/.config/waybar/matugen.css"
post_hook = "killall -SIGUSR2 .waybar-wrapped"
[templates.starship]
input_path = "~/.config/matugen/templates/starship"
output_path = "~/.config/starship.toml"
[templates.walker]
input_path = "~/.config/matugen/templates/walker"
output_path = "~/.config/walker/themes/nixos/style.css"
[templates.pywalfox]
input_path = '~/.config/matugen/templates/firefox'
output_path = '~/.cache/wal/colors.json'
post_hook = 'pywalfox update'
[templates.cava]
input_path = "~/.config/matugen/templates/cava"
output_path = "~/.config/cava/config"
post_hook = "pkill -USR1 cava"
-23
View File
@@ -1,23 +0,0 @@
{
pkgs,
inputs,
...
}: {
home.packages = with pkgs; [
matugen
psmisc # for killall
];
home.file.".config/matugen/config.toml" = {
source = ./config.toml;
};
home.file.".config/matugen/templates" = {
source = ./templates;
recursive = true;
};
programs.ghostty.settings.theme = "matugen";
programs.starship.enable = true;
wayland.windowManager.hyprland.settings.source = ["./matugen.conf"];
programs.walker.config.theme = "nixos";
}
-25
View File
@@ -1,25 +0,0 @@
[general]
framerate = 60
autosens = 1
bars = 0
bar_width = 3
bar_spacing = 1
sleep_timer = 5
[input]
method = pipewire
source = auto
[output]
method = ncurses
style = stereo
[color]
gradient = 1
gradient_count = 6
gradient_color_1 = '{{colors.primary.default.hex}}'
gradient_color_2 = '{{colors.primary_container.default.hex}}'
gradient_color_3 = '{{colors.secondary.default.hex}}'
gradient_color_4 = '{{colors.secondary_container.default.hex}}'
gradient_color_5 = '{{colors.tertiary.default.hex}}'
gradient_color_6 = '{{colors.tertiary_container.default.hex}}'
-22
View File
@@ -1,22 +0,0 @@
{
"wallpaper": "{{image}}",
"alpha": "100",
"colors": {
"color0": "{{colors.background.default.hex}}",
"color1": "",
"color2": "",
"color3": "",
"color4": "",
"color5": "",
"color6": "",
"color7": "",
"color8": "",
"color9": "",
"color10": "{{colors.primary.default.hex}}",
"color11": "",
"color12": "",
"color13": "{{colors.surface_bright.default.hex}}",
"color14": "",
"color15": "{{colors.on_surface.default.hex}}"
}
}
-6
View File
@@ -1,6 +0,0 @@
background = {{colors.background.default.hex}}
foreground = {{colors.on_surface.default.hex}}
cursor-color = {{colors.on_surface.default.hex}}
cursor-text = {{colors.on_surface_variant.default.hex}}
selection-background = {{colors.secondary_fixed_dim.default.hex}}
selection-foreground = {{colors.on_secondary.default.hex}}
-4
View File
@@ -1,4 +0,0 @@
<* for name, value in colors *>
$image = {{image}}
${{name}} = rgba({{value.default.hex_stripped}}ff)
<* endfor *>
-53
View File
@@ -1,53 +0,0 @@
format = '''
[╭─](color1)$username$hostname$directory$git_branch$git_state$git_status$cmd_duration$line_break[╰─](color1)$python$character'''
palette = 'colors'
[palettes.colors]
mustard = '#af8700' # example
color1 = '{{colors.primary_fixed_dim.default.hex}}'
color2 = '{{colors.on_primary.default.hex}}'
color3 = '{{colors.on_surface_variant.default.hex}}'
color4 = '{{colors.surface_container.default.hex}}'
color5 = '{{colors.on_primary.default.hex}}'
color6 = '{{colors.surface_dim.default.hex}}'
color7 = '{{colors.surface.default.hex}}'
color8 = '{{colors.primary.default.hex}}'
color9 = '{{colors.tertiary.default.hex}}'
[directory]
style = "bold color8"
[character]
success_symbol = "[](bold color9)"
error_symbol = "[](bold red)"
vicmd_symbol = "[](bold color3)"
[git_branch]
format = "[$branch]($style) "
style = "bold color3"
[git_status]
format = "[[(*$conflicted$untracked$modified$staged$renamed$deleted)](color9) ($ahead_behind$stashed)]($style) "
style = "bold color9"
conflicted = ""
untracked = ""
modified = ""
staged = ""
renamed = ""
deleted = ""
stashed = "≡"
[git_state]
format = '\([$state( $progress_current/$progress_total)]($style)\) '
style = "bold color3"
[cmd_duration]
format = "[$duration]($style) "
style = "bold mustard"
[python]
format = "[$virtualenv]($style) "
style = "bold color3"
detect_extensions = []
detect_files = []
-123
View File
@@ -1,123 +0,0 @@
/* @import "../../../../../../../.config/omarchy/current/theme/walker.css"; */
/* Define Matugen Colors */
@define-color text {{colors.on_surface.default.hex}};
@define-color base {{colors.surface_container.default.hex}};
@define-color border {{colors.primary.default.hex}};
@define-color selected_text {{colors.primary.default.hex}};
@define-color background {{colors.surface.default.hex}};
* {
all: unset;
}
* {
font-family: monospace;
font-size: 18px;
color: @text;
}
scrollbar {
opacity: 0;
}
.normal-icons {
-gtk-icon-size: 16px;
}
.large-icons {
-gtk-icon-size: 32px;
}
.box-wrapper {
background: alpha(@base, 0.95);
padding: 20px;
border: 2px solid @border;
}
.preview-box {
}
.box {
}
.search-container {
background: @base;
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: @selected_text;
}
.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: @background;
padding: 10px;
margin-top: 10px;
}
.preview {
}
-7
View File
@@ -1,7 +0,0 @@
/*
* Css Colors
* Generated with Matugen
*/
<* for name, value in colors *>
@define-color {{name}} {{value.default.hex}};
<* endfor *>
-10
View File
@@ -1,10 +0,0 @@
{
inputs,
system,
pkgs,
...
}: {
home.packages = [
inputs.nixovim.packages.${pkgs.system}.full
];
}
-38
View File
@@ -1,38 +0,0 @@
{
pkgs,
inputs,
myConfig,
lib,
...
}: {
imports = [
inputs.stylix.homeModules.stylix
];
stylix = {
autoEnable = false;
targets = {
firefox = {
enable = false;
colorTheme.enable = true;
profileNames = [
"hakase"
];
};
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
};
};
}
-14
View File
@@ -1,14 +0,0 @@
{
pkgs,
lib,
...
}: let
#
hakase-screensaver-launch = pkgs.writeShellScriptBin "hakase-cmd-screensaver" ''
'';
in {
home.packages = with pkgs; [
hakase-screensaver-launch
];
}
-8
View File
@@ -1,8 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [
terminaltexteffects
];
home.file.".config/hakase/branding/screensaver.txt" = {
source = ../../assets/branding.txt;
};
}
-573
View File
@@ -1,573 +0,0 @@
{
inputs,
config,
pkgs,
...
}: {
imports = [
# ./style.nix
./layout.nix
];
programs.walker = {
enable = true;
runAsService = true;
package = inputs.walker.packages.${pkgs.system}.default;
# CSS Implementation using Stylix Colors
config = {
# General Settings
force_keyboard_focus = true;
close_when_open = true;
click_to_close = true;
single_click_activation = true;
selection_wrap = true;
global_argument_delimiter = "#";
exact_search_prefix = "'";
# theme = "default";
disable_mouse = false;
debug = false;
page_jump_items = 10;
hide_quick_activation = true;
hide_action_hints = true;
hide_action_hints_dmenu = true;
hide_return_action = false;
resume_last_query = false;
actions_as_menu = false;
# Shell positioning
shell = {
anchor_top = true;
anchor_bottom = true;
anchor_left = true;
anchor_right = true;
};
# Column config
columns.symbols = 3;
# Placeholders
placeholders.default = {
input = "Search";
list = "No Results";
};
# Keybinds
keybinds = {
close = ["Escape"];
next = ["Down"];
previous = ["Up"];
left = ["Left"];
right = ["Right"];
down = ["Down"];
up = ["Up"];
toggle_exact = ["ctrl e"];
resume_last_query = ["ctrl r"];
quick_activate = ["F1" "F2" "F3" "F4"];
page_down = ["Page_Down"];
page_up = ["Page_Up"];
show_actions = ["alt j"];
};
# Providers General
providers = {
default = ["desktopapplications" "calc" "websearch"];
empty = ["desktopapplications"];
ignore_preview = [];
max_results = 50;
argument_delimiter.runner = " ";
clipboard.time_format = "%d.%m. - %H:%M";
# Provider Prefixes
prefixes = [
{
prefix = ";";
provider = "providerlist";
}
{
prefix = ">";
provider = "runner";
}
{
prefix = "/";
provider = "files";
}
{
prefix = ".";
provider = "symbols";
}
{
prefix = "!";
provider = "todo";
}
{
prefix = "%";
provider = "bookmarks";
}
{
prefix = "=";
provider = "calc";
}
{
prefix = "@";
provider = "websearch";
}
{
prefix = ":";
provider = "clipboard";
}
{
prefix = "$";
provider = "windows";
}
];
# Actions
actions = {
fallback = [
{
action = "menus:open";
label = "open";
after = "Nothing";
}
{
action = "menus:default";
label = "run";
after = "Close";
}
{
action = "menus:parent";
label = "back";
bind = "Escape";
after = "Nothing";
}
{
action = "erase_history";
label = "clear hist";
bind = "ctrl h";
after = "AsyncReload";
}
];
dmenu = [
{
action = "select";
default = true;
bind = "Return";
}
];
providerlist = [
{
action = "activate";
default = true;
bind = "Return";
after = "ClearReload";
}
];
bluetooth = [
{
action = "find";
bind = "ctrl f";
after = "AsyncClearReload";
}
{
action = "remove";
bind = "ctrl d";
after = "AsyncReload";
}
{
action = "trust";
bind = "ctrl t";
after = "AsyncReload";
}
{
action = "untrust";
bind = "ctrl t";
after = "AsyncReload";
}
{
action = "pair";
bind = "Return";
after = "AsyncReload";
}
{
action = "connect";
default = true;
bind = "Return";
after = "AsyncReload";
}
{
action = "disconnect";
default = true;
bind = "Return";
after = "AsyncReload";
}
];
archlinuxpkgs = [
{
action = "install";
bind = "Return";
default = true;
}
{
action = "remove";
bind = "Return";
}
{
action = "show_all";
label = "show all";
bind = "ctrl i";
after = "AsyncClearReload";
}
{
action = "refresh";
label = "refresh";
bind = "ctrl r";
after = "AsyncReload";
}
{
action = "visit_url";
label = "open URL";
bind = "ctrl o";
}
{
action = "show_installed";
label = "show installed";
bind = "ctrl i";
after = "AsyncClearReload";
}
];
calc = [
{
action = "copy";
default = true;
bind = "Return";
}
{
action = "delete";
bind = "ctrl d";
after = "AsyncReload";
}
{
action = "save";
bind = "ctrl s";
after = "AsyncClearReload";
}
];
websearch = [
{
action = "search";
default = true;
bind = "Return";
}
{
action = "open_url";
label = "open url";
default = true;
bind = "Return";
}
];
desktopapplications = [
{
action = "start";
default = true;
bind = "Return";
}
{
action = "start:keep";
label = "open+next";
bind = "shift Return";
after = "KeepOpen";
}
{
action = "new_instance";
label = "new instance";
bind = "ctrl Return";
}
{
action = "new_instance:keep";
label = "new+next";
bind = "ctrl alt Return";
after = "KeepOpen";
}
{
action = "pin";
bind = "ctrl p";
after = "AsyncReload";
}
{
action = "unpin";
bind = "ctrl p";
after = "AsyncReload";
}
{
action = "pinup";
bind = "ctrl n";
after = "AsyncReload";
}
{
action = "pindown";
bind = "ctrl m";
after = "AsyncReload";
}
];
files = [
{
action = "open";
default = true;
bind = "Return";
}
{
action = "opendir";
label = "open dir";
bind = "ctrl Return";
}
{
action = "copypath";
label = "copy path";
bind = "ctrl shift c";
}
{
action = "copyfile";
label = "copy file";
bind = "ctrl c";
}
{
action = "localsend";
label = "localsend";
bind = "ctrl l";
}
{
action = "refresh_index";
label = "reload";
bind = "ctrl r";
after = "AsyncReload";
}
];
# Note: "1password" key starts with a digit, must be quoted in Nix
"1password" = [
{
action = "copy_password";
label = "copy password";
default = true;
bind = "Return";
}
{
action = "copy_username";
label = "copy username";
bind = "shift Return";
}
{
action = "copy_2fa";
label = "copy 2fa";
bind = "ctrl Return";
}
];
todo = [
{
action = "save";
default = true;
bind = "Return";
after = "AsyncClearReload";
}
{
action = "save_next";
label = "save & new";
bind = "shift Return";
after = "AsyncClearReload";
}
{
action = "delete";
bind = "ctrl d";
after = "AsyncClearReload";
}
{
action = "active";
default = true;
bind = "Return";
after = "Nothing";
}
{
action = "inactive";
default = true;
bind = "Return";
after = "Nothing";
}
{
action = "done";
bind = "ctrl f";
after = "Nothing";
}
{
action = "change_category";
bind = "ctrl y";
label = "change category";
after = "Nothing";
}
{
action = "clear";
bind = "ctrl x";
after = "AsyncClearReload";
}
{
action = "create";
bind = "ctrl a";
after = "AsyncClearReload";
}
{
action = "search";
bind = "ctrl a";
after = "AsyncClearReload";
}
];
runner = [
{
action = "run";
default = true;
bind = "Return";
}
{
action = "runterminal";
label = "run in terminal";
bind = "shift Return";
}
];
symbols = [
{
action = "copy";
label = "select";
default = true;
bind = "Return";
}
];
unicode = [
{
action = "copy";
label = "select";
default = true;
bind = "Return";
}
];
nirisessions = [
{
action = "start";
label = "start";
default = true;
bind = "Return";
}
{
action = "start_new";
label = "start blank";
bind = "ctrl Return";
}
];
clipboard = [
{
action = "copy";
default = true;
bind = "Return";
}
{
action = "remove";
bind = "ctrl d";
after = "AsyncClearReload";
}
{
action = "remove_all";
label = "clear";
bind = "ctrl shift d";
after = "AsyncClearReload";
}
{
action = "show_images_only";
label = "only images";
bind = "ctrl i";
after = "AsyncClearReload";
}
{
action = "show_text_only";
label = "only text";
bind = "ctrl i";
after = "AsyncClearReload";
}
{
action = "show_combined";
label = "show all";
bind = "ctrl i";
after = "AsyncClearReload";
}
{
action = "pause";
bind = "ctrl p";
}
{
action = "unpause";
bind = "ctrl p";
}
{
action = "edit";
bind = "ctrl o";
}
{
action = "localsend";
bind = "ctrl l";
}
];
bookmarks = [
{
action = "save";
bind = "Return";
after = "AsyncClearReload";
}
{
action = "open";
default = true;
bind = "Return";
}
{
action = "delete";
bind = "ctrl d";
after = "AsyncClearReload";
}
{
action = "change_category";
label = "Change category";
bind = "ctrl y";
after = "Nothing";
}
{
action = "change_browser";
label = "Change browser";
bind = "ctrl b";
after = "Nothing";
}
{
action = "import";
label = "Import";
bind = "ctrl i";
after = "AsyncClearReload";
}
{
action = "create";
bind = "ctrl a";
after = "AsyncClearReload";
}
{
action = "search";
bind = "ctrl a";
after = "AsyncClearReload";
}
];
};
};
};
};
home.file.".config/elephant/websearch.toml".text = ''
[[entries]]
name = "DuckDuckGo"
url = "https://duckduckgo.com/?q=%TERM%"
default = true
'';
}
-160
View File
@@ -1,160 +0,0 @@
{
home.file.".config/walker/themes/nixos/layout.xml".text = ''
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk" version="4.0"></requires>
<object class="GtkWindow" id="Window">
<style>
<class name="window"></class>
</style>
<property name="resizable">true</property>
<property name="title">Walker</property>
<child>
<object class="GtkBox" id="BoxWrapper">
<style>
<class name="box-wrapper"></class>
</style>
<property name="width-request">644</property>
<property name="overflow">hidden</property>
<property name="orientation">horizontal</property>
<property name="valign">center</property>
<property name="halign">center</property>
<child>
<object class="GtkBox" id="Box">
<style>
<class name="box"></class>
</style>
<property name="orientation">vertical</property>
<property name="hexpand-set">true</property>
<property name="hexpand">true</property>
<property name="spacing">10</property>
<child>
<object class="GtkBox" id="SearchContainer">
<style>
<class name="search-container"></class>
</style>
<property name="overflow">hidden</property>
<property name="orientation">horizontal</property>
<property name="halign">fill</property>
<property name="hexpand-set">true</property>
<property name="hexpand">true</property>
<child>
<object class="GtkEntry" id="Input">
<style>
<class name="input"></class>
</style>
<property name="halign">fill</property>
<property name="hexpand-set">true</property>
<property name="hexpand">true</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox" id="ContentContainer">
<style>
<class name="content-container"></class>
</style>
<property name="orientation">horizontal</property>
<property name="spacing">10</property>
<property name="vexpand">true</property>
<property name="vexpand-set">true</property>
<child>
<object class="GtkLabel" id="ElephantHint">
<style>
<class name="elephant-hint"></class>
</style>
<property name="hexpand">true</property>
<property name="height-request">100</property>
<property name="label">Waiting for elephant...</property>
</object>
</child>
<child>
<object class="GtkLabel" id="Placeholder">
<style>
<class name="placeholder"></class>
</style>
<property name="label">No Results</property>
<property name="yalign">0.0</property>
<property name="hexpand">true</property>
</object>
</child>
<child>
<object class="GtkScrolledWindow" id="Scroll">
<style>
<class name="scroll"></class>
</style>
<property name="hexpand">true</property>
<property name="can_focus">false</property>
<property name="overlay-scrolling">true</property>
<property name="max-content-width">600</property>
<property name="max-content-height">300</property>
<property name="min-content-height">0</property>
<property name="propagate-natural-height">true</property>
<property name="propagate-natural-width">true</property>
<property name="hscrollbar-policy">automatic</property>
<property name="vscrollbar-policy">automatic</property>
<child>
<object class="GtkGridView" id="List">
<style>
<class name="list"></class>
</style>
<property name="max_columns">1</property>
<property name="can_focus">false</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox" id="Preview">
<style>
<class name="preview"></class>
</style>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox" id="Keybinds">
<property name="hexpand">true</property>
<property name="margin-top">10</property>
<style>
<class name="keybinds"></class>
</style>
<child>
<object class="GtkBox" id="GlobalKeybinds">
<property name="spacing">10</property>
<style>
<class name="global-keybinds"></class>
</style>
</object>
</child>
<child>
<object class="GtkBox" id="ItemKeybinds">
<property name="hexpand">true</property>
<property name="halign">end</property>
<property name="spacing">10</property>
<style>
<class name="item-keybinds"></class>
</style>
</object>
</child>
</object>
</child>
<child>
<object class="GtkLabel" id="Error">
<style>
<class name="error"></class>
</style>
<property name="xalign">0</property>
<property name="visible">false</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>
'';
}
-210
View File
@@ -1,210 +0,0 @@
{config, ...}: {
# themes."nixos".style = ''
# @define-color window_bg_color #1f1f28;
# @define-color accent_bg_color #54546d;
# @define-color theme_fg_color #f2ecbc;
# @define-color error_bg_color #C34043;
# @define-color error_fg_color #DCD7BA;
#
# * {
# all: unset;
# }
#
# popover {
# background: lighter(@window_bg_color);
# border: 1px solid darker(@accent_bg_color);
# border-radius: 18px;
# padding: 10px;
# }
#
# .normal-icons {
# -gtk-icon-size: 16px;
# }
#
# .large-icons {
# -gtk-icon-size: 32px;
# }
#
# scrollbar {
# opacity: 0;
# }
#
# .box-wrapper {
# box-shadow:
# 0 19px 38px rgba(0, 0, 0, 0.3),
# 0 15px 12px rgba(0, 0, 0, 0.22);
# background: @window_bg_color;
# padding: 20px;
# border-radius: 20px;
# border: 1px solid darker(@accent_bg_color);
# }
#
# .preview-box,
# .elephant-hint,
# .placeholder {
# color: @theme_fg_color;
# }
#
# .box {
# }
#
# .search-container {
# border-radius: 10px;
# }
#
# .input placeholder {
# opacity: 0.5;
# }
#
# .input selection {
# background: lighter(lighter(lighter(@window_bg_color)));
# }
#
# .input {
# caret-color: @theme_fg_color;
# background: lighter(@window_bg_color);
# padding: 10px;
# color: @theme_fg_color;
# }
#
# .input:focus,
# .input:active {
# }
#
# .content-container {
# }
#
# .placeholder {
# }
#
# .scroll {
# }
#
# .list {
# color: @theme_fg_color;
# }
#
# child {
# }
#
# .item-box {
# border-radius: 10px;
# padding: 10px;
# }
#
# .item-quick-activation {
# background: alpha(@accent_bg_color, 0.25);
# border-radius: 5px;
# padding: 10px;
# }
#
# /* child:hover .item-box, */
# child:selected .item-box {
# background: alpha(@accent_bg_color, 0.25);
# }
#
# .item-text-box {
# }
#
# .item-subtext {
# font-size: 12px;
# opacity: 0.5;
# }
#
# .providerlist .item-subtext {
# font-size: unset;
# opacity: 0.75;
# }
#
# .item-image-text {
# font-size: 28px;
# }
#
# .preview {
# border: 1px solid alpha(@accent_bg_color, 0.25);
# /* padding: 10px; */
# border-radius: 10px;
# color: @theme_fg_color;
# }
#
# .calc .item-text {
# font-size: 24px;
# }
#
# .calc .item-subtext {
# }
#
# .symbols .item-image {
# font-size: 24px;
# }
#
# .todo.done .item-text-box {
# opacity: 0.25;
# }
#
# .todo.urgent {
# font-size: 24px;
# }
#
# .todo.active {
# font-weight: bold;
# }
#
# .bluetooth.disconnected {
# opacity: 0.5;
# }
#
# .preview .large-icons {
# -gtk-icon-size: 64px;
# }
#
# .keybinds {
# padding-top: 10px;
# border-top: 1px solid lighter(@window_bg_color);
# font-size: 12px;
# color: @theme_fg_color;
# }
#
# .global-keybinds {
# }
#
# .item-keybinds {
# }
#
# .keybind {
# }
#
# .keybind-button {
# opacity: 0.5;
# }
#
# .keybind-button:hover {
# opacity: 0.75;
# cursor: pointer;
# }
#
# .keybind-bind {
# text-transform: lowercase;
# opacity: 0.35;
# }
#
# .keybind-label {
# padding: 2px 4px;
# border-radius: 4px;
# border: 1px solid @theme_fg_color;
# }
#
# .error {
# padding: 10px;
# background: @error_bg_color;
# color: @error_fg_color;
# }
#
# :not(.calc).current {
# font-style: italic;
# }
#
# .preview-content.archlinuxpkgs {
# font-family: monospace;
# } '';
}
-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 {
home.packages = [
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
];
}
-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;
};
};
};
};
}
-88
View File
@@ -1,88 +0,0 @@
{config, ...}: {
programs.waybar = {
style = ''
@import "matugen.css";
* {
background-color: @background;
color: @on_surface;
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: @on_secondary;
}
'';
};
}
-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: 3.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 510 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 451 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 488 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: 6.0 MiB

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
-10
View File
@@ -1,10 +0,0 @@
▄▄▄
▄█████▄ ▄███████████▄ ▄███████ ▄███████ ▄███████ ▄█ █▄ ▄█ █▄
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ █▀ ███ ███ ███ ███
███ ███ ███ ███ ███ ▄███▄▄▄███ ▄███▄▄▄██▀ ███ ▄███▄▄▄███▄ ███▄▄▄███
███ ███ ███ ███ ███ ▀███▀▀▀███ ▀███▀▀▀▀ ███ ▀▀███▀▀▀███ ▀▀▀▀▀▀███
███ ███ ███ ███ ███ ███ ███ ██████████ ███ █▄ ███ ███ ▄██ ███
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
▀█████▀ ▀█ ███ █▀ ███ █▀ ███ ███ ███████▀ ███ █▀ ▀█████▀
███ █▀
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

+67 -46
View File
@@ -1,61 +1,82 @@
{ {
myConfig = {
nixos = {
username = "kenji";
hostname = "hakase"; hostname = "hakase";
timezone = "America/Chicago";
shell = "fish"; # FIXME: unassigned variable
};
git = {
username = "kenji"; username = "kenji";
email = "kenji@hakase"; timezone = "America/Chicago";
vpn = {
vpnEnable = false;
vpnSecretFile = "/home/kenji/Wireguard/secret";
};
gitProfile = {
user = "biscuit";
email = "biscuit@sakamoto.dev";
defaultBranch = "master"; defaultBranch = "master";
}; };
ssh = {
# FIXME: anonymize terminal = {
extraConfig = '' termFont = "JetBrainsMono Nerd Font"; # e.g., JetBrainsMono Nerd Font
termSize = "20";
termShell = "fish";
shellAliases = {
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/pkgs/ags/biscuit/app.ts & disown (jobs -p) &";
};
};
allowUnfree = true; # allows installation of commercial apps.
touchpadSupport = false;
logitech-hardware = {
enable = true;
};
# Custom Applications
linux-apps = {
gamingDesktop = true; # adds steam
my-apps = pkgs:
with pkgs; [
jellyfin-media-player
mangohud
];
};
hyprconf = {
monitor = [
"DP-1,highres@165,0x1080,auto"
"DP-2,highres@highrr,0x0,auto"
];
};
sshExtraConfig = ''
Host macair Host macair
User biscuit User biscuit
HostName 192.168.68.81 HostName 192.168.68.81
Host gitea.sakamoto.dev
User kenji
ProxyCommand cloudflared access ssh --hostname %h
HostName gitea.sakamoto.dev
''; '';
};
terminal = { # BUILD (optional), you can remove these blocks.
default = "ghostty"; builder = {
aliases = { trustedUsers = [
update = "sudo nixos-rebuild switch --flake ~/.config/nixos/#hakase"; "@groups"
}; "biscuit"
};
hyprland = {
monitors = ["HDMI-A-1, 1920x1080@120, auto, 1"];
# wallpaper = "nixos_rainbow.png";
wallpaper = "ai_pixel_purple.jpg"; # FIXME: redundant
};
firefox = {
bookmarks = [
{
name = "Home Manager";
url = "https://mynixos.com/home-manager/options/programs";
}
{
name = "YouTube";
url = "https://youtube.com";
}
{
name = "Nur";
url = "https://nur.nix-community.org/repos";
}
]; ];
newtabpage = [ buildMachines = [
{ {
title = "Dashboard"; hostName = "192.168.68.81";
url = "https://dash.sakamoto.dev"; sshUser = "biscuit";
sshKey = "/home/biscuit/.ssh/id_rsa.pub";
system = "x86_64-linux";
supportedFeatures = ["big-parallel" "kvm" "nixos-test"];
} }
]; ];
}; };
};
} }
Generated
+490 -767
View File
File diff suppressed because it is too large Load Diff
+69 -54
View File
@@ -1,80 +1,95 @@
{ {
description = "Hakase Configuration"; description = "A very basic flake";
inputs = { inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
elephant = { home-manager.url = "github:nix-community/home-manager";
url = "github:abenz1267/elephant"; home-manager.inputs.nixpkgs.follows = "nixpkgs"; # `follows` ensure it follows nixpkgs versiona. Avoids breaking updates.
inputs.nixpkgs.follows = "nixpkgs"; darwin.url = "github:lnl7/nix-darwin";
}; darwin.inputs.nixpkgs.follows = "nixpkgs";
chaotic = {
url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
inputs.nixpkgs.follows = "nixpkgs";
};
textfox = {
url = "github:adriankarlen/textfox";
inputs.nixpkgs.follows = "nixpkgs";
};
nur = {
url = "github:nix-community/NUR";
inputs.nixpkgs.follows = "nixpkgs";
};
home-manager = { ags.url = "github:aylur/ags";
url = "github:nix-community/home-manager"; ags.inputs.nixpkgs.follows = "nixpkgs";
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";
};
walker = { hyprland.url = "github:hyprwm/Hyprland";
url = "github:abenz1267/walker"; hyprland.inputs.nixpkgs.follows = "nixpkgs";
inputs.nixpkgs.follows = "nixpkgs";
inputs.elephant.follows = "elephant"; unlisted-fonts.url = "git+https://git.sakamoto.dev/kenji/nix-fonts.git";
}; unlisted-fonts.inputs.nixpkgs.follows = "nixpkgs";
nixvim.url = "github:nix-community/nixvim";
nixvim.inputs.nixpkgs.follows = "nixpkgs";
nix-neovim.url = "git+https://git.sakamoto.dev/kenji/nix-neovim.git";
nix-neovim.inputs.nixpkgs.follows = "nixpkgs";
# kitty-catppuccin.url = "git+https://git.sakamoto.dev/kenji/nix-kitty-catppuccin.git";
# kitty-catppuccin.inputs.nixpkgs.follows = "nixpkgs";
matugen.url = "github:/InioX/Matugen";
matugen.inputs.nixpkgs.follows = "nixpkgs";
}; };
outputs = { outputs = {
self, self,
nixpkgs, nixpkgs,
home-manager, home-manager,
stylix, darwin,
nixovim, ags,
chaotic, hyprland,
sops-nix, unlisted-fonts,
textfox, nix-neovim,
... ...
} @ inputs: let } @ inputs: let
config = import ./config.nix; config = import ./config.nix;
lib = nixpkgs.lib;
system = "x86_64-linux"; system = "x86_64-linux";
# pkgs = nixpkgs.legacyPackages.${system}; # alternative, without overlays. Unused.
args = args =
{ {
inherit inputs system; inherit inputs system;
} }
// config; // config;
in { in {
# linux only
nixosConfigurations = { nixosConfigurations = {
hakase = nixpkgs.lib.nixosSystem { desktop = lib.nixosSystem {
inherit system;
specialArgs = args; specialArgs = args;
modules = [ modules = [
home-manager.nixosModules.home-manager ./nixos/desktop/configuration.nix
sops-nix.nixosModules.sops ];
chaotic.nixosModules.default };
./hosts/hakase/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/home.nix];
};
};
# exclusive to macos M series
darwinConfigurations = {
macos = darwin.lib.darwinSystem {
system = "aarch64-darwin";
specialArgs = args;
modules = [
./nixos/macos/darwin.nix
home-manager.darwinModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = args;
}
]; ];
}; };
}; };
+20
View File
@@ -0,0 +1,20 @@
{username, ...}: {
imports = [
../../modules/editor.nix
../../modules/desktop/display-manager.nix
../../modules/desktop/misc.nix
../../modules/desktop/app.nix
];
programs.home-manager.enable = true;
home = {
username = "${username}";
homeDirectory = "/home/${username}";
packages = [];
sessionVariables = {};
};
systemd.user.startServices = "sd-switch";
home.stateVersion = "23.05";
}
-24
View File
@@ -1,24 +0,0 @@
{
pkgs,
inputs,
config,
...
}: {
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
../modules/home/gaming.nix
../modules/home/music.nix
inputs.walker.homeManagerModules.default
inputs.sops-nix.homeManagerModules.sops
];
home.sessionVariables = {
};
home.stateVersion = "25.05";
}
+15
View File
@@ -0,0 +1,15 @@
{
config,
pkgs,
inputs,
...
}: {
imports = [
../../modules/editor.nix
];
programs.home-manager.enable = true;
home.packages = [];
home.stateVersion = "23.05";
}
-13
View File
@@ -1,13 +0,0 @@
{
pkgs,
myConfig,
...
}: {
imports = [
./hardware-configuration.nix
../../modules/system/default.nix
../../modules/system/hyprland.nix
../../modules/system/scripts.nix
../../modules/system/gaming.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;
}
+13
View File
@@ -0,0 +1,13 @@
{
linux-apps,
lib,
...
}: {
imports =
[
]
++ lib.optionals (linux-apps.gamingDesktop == true) [
../pkgs/steam/default.nix
../pkgs/heroic/default.nix
];
}
+5
View File
@@ -0,0 +1,5 @@
{pkgs, ...}: let
info = import ../../config.nix;
in {
home.packages = info.linux-apps.my-apps pkgs;
}
+11
View File
@@ -0,0 +1,11 @@
{...}: {
imports = [
../../pkgs/hyprland/default.nix
../../pkgs/ags/default.nix
../../pkgs/swww/default.nix
../../pkgs/waybar/default.nix
../../pkgs/rofi/default.nix
../../pkgs/hypridle/default.nix
../../pkgs/hyprlock/default.nix
];
}
+6
View File
@@ -0,0 +1,6 @@
{...}: {
imports = [
../../pkgs/btop/default.nix
../../pkgs/matugen/default.nix
];
}
+11
View File
@@ -0,0 +1,11 @@
{...}: {
imports = [
../system/desktop/wayland.nix
../system/desktop/sound.nix
../system/desktop/misc.nix
../system/desktop/browser.nix
../system/desktop/font.nix
../system/desktop/theme.nix
../system/desktop/cursor.nix
];
}
+11
View File
@@ -0,0 +1,11 @@
{...}: {
imports = [
../pkgs/fastfetch/default.nix
../pkgs/git/default.nix
../pkgs/kitty/default.nix
../pkgs/neovim/default.nix
../pkgs/fish/default.nix
../pkgs/starship/default.nix
../pkgs/zsh/default.nix
];
}
-6
View File
@@ -1,6 +0,0 @@
{
imports = [
../../apps/btop/home.nix
../../apps/jellyfin/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
];
}
-19
View File
@@ -1,19 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [
protonup-qt
protontricks
mangohud
];
programs.mangohud = {
enable = true;
settings = {
full = true;
no_display = true; # Don't show by default (toggle with Shift+F12)
cpu_temp = true;
gpu_temp = true;
ram = true;
vram = true;
};
};
}
-11
View File
@@ -1,11 +0,0 @@
{
imports = [
../../apps/tte/hakase-screensaver.nix
../../apps/hyprland/home.nix
../../apps/walker/home.nix
# ../../apps/fsel/home.nix
../../apps/hyprpaper/home.nix
../../apps/hyprpaper/switch-wallpaper.nix
../../apps/tte/home.nix
];
}
-33
View File
@@ -1,33 +0,0 @@
{pkgs, ...}: let
launch-music = pkgs.writeShellScriptBin "hakase-music-launch" ''
echo "--- Launching Music Apps ---"
echo "Launching jellyfin-tui..."
uwsm app -- /usr/bin/env ghostty --class=jellyfin-tui --title=jellyfin-tui -e jellyfin-tui &
PID_JELLY=$!
echo "Jellyfin launched with PID $PID_JELLY"
echo "Waiting for window..."
sleep 0.1
echo "Focusing jellyfin-tui..."
hyprctl dispatch focuswindow title:jellyfin-tui
echo "Preselecting down..."
hyprctl dispatch layoutmsg preselect d
echo "Launching cava..."
uwsm app -- /usr/bin/env ghostty --class=cava --title=cava -e cava &
PID_CAVA=$!
echo "Cava launched with PID $PID_CAVA"
echo "Launch script completed."
'';
in {
imports = [
../../apps/jellyfin-tui/home.nix
../../apps/cava/home.nix
];
home.packages = [
launch-music
];
}
-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
];
}
-6
View File
@@ -1,6 +0,0 @@
{
imports = [
../../apps/stylix/home.nix
../../apps/matugen/home.nix
];
}
-6
View File
@@ -1,6 +0,0 @@
{
imports = [
../../apps/waybar/home.nix
../../apps/waybar/hakase-popup.nix
];
}
+14
View File
@@ -0,0 +1,14 @@
{
vpn,
lib,
...
}: {
imports =
[
../system/default.nix
../system/users.nix
]
++ lib.optionals (vpn.vpnEnable == true) [
../system/vpn.nix
];
}
-25
View File
@@ -1,25 +0,0 @@
{pkgs, ...}: {
imports = [
../../system/time.nix
../../system/nix.nix
../../system/backlight.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
cachix
];
}
-5
View File
@@ -1,5 +0,0 @@
{
imports = [
../../system/steam.nix
];
}
-5
View File
@@ -1,5 +0,0 @@
{
imports = [
../../apps/hyprland/default.nix
];
}
-4
View File
@@ -1,4 +0,0 @@
{
imports = [
];
}
+35
View File
@@ -0,0 +1,35 @@
{
pkgs,
allowUnfree,
builder,
sshExtraConfig,
...
}: {
imports = [
# Include the results of the hardware scan.
/etc/nixos/hardware-configuration.nix
../../modules/system.nix
../../modules/display-manager.nix
../../modules/app.nix
];
environment.systemPackages = with pkgs; [
vim
wget
];
nixpkgs.config.allowUnfree = allowUnfree;
nix.settings = {
trusted-users = builder.trustedUsers;
experimental-features = ["nix-command" "flakes"];
};
programs.ssh.extraConfig = sshExtraConfig;
nix.distributedBuilds = true;
nix.settings.builders-use-substitutes = true;
# nix.buildMachines = builder.buildMachines;
system.stateVersion = "25.05";
}
+48
View File
@@ -0,0 +1,48 @@
# 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" "sd_mod" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/disk/by-uuid/3f2c4a5a-3124-462a-9fb9-cccc933bac63";
fsType = "btrfs";
options = [ "subvol=@" ];
};
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/18F8-7DC1";
fsType = "vfat";
options = [ "fmask=0077" "dmask=0077" ];
};
fileSystems."/mnt/CRUCIAL" =
{ device = "/dev/disk/by-uuid/394f67b9-e75b-40cc-9b15-28bbda40fff4";
fsType = "ext4";
};
swapDevices =
[ { device = "/dev/disk/by-uuid/bbe1e281-4b1d-4d85-ba6a-6f5265f0e3a3"; }
];
# 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.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.interfaces.biscuit-default.useDHCP = lib.mkDefault true;
# networking.interfaces.enp11s0.useDHCP = lib.mkDefault true;
# networking.interfaces.wlp10s0.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}
+40
View File
@@ -0,0 +1,40 @@
{
pkgs,
builder,
terminal,
username,
...
}: {
# List packages installed in system profile. To search by name, run:
# $ nix-env -qaP | grep wget
environment.systemPackages = with pkgs; [
python313
];
# 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 = 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";
users.users.${username} = {
name = "${username}";
home = "/Users/${username}";
shell = pkgs.${terminal.termShell};
};
home-manager.users.${username} = import ../../home/macos/home.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"
}
}

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