155 Commits

Author SHA1 Message Date
kenji 999710d44c fix: pywalfox now works 2025-12-27 16:50:54 -06:00
kenji 938c244704 add: pywalfox 2025-12-27 16:42:48 -06:00
kenji 6ab0623c55 feat: branding removed space 2025-12-27 16:29:22 -06:00
kenji fa543b059f add: hypr exec pywalfox 2025-12-27 16:29:13 -06:00
kenji 780afcbda6 feat: removed bg 2025-12-27 16:29:02 -06:00
kenji 9b3b09f6e5 add: extensions firefox 2025-12-27 16:07:25 -06:00
kenji a234c2d573 organize: textfox 2025-12-27 13:37:14 -06:00
kenji 602acee708 clean: removed git default 2025-12-27 13:32:45 -06:00
kenji cb9c91c7a7 fix: some stff 2025-12-27 13:27:47 -06:00
kenji 4d9d68e7e6 add: walker theme 2025-12-27 12:12:49 -06:00
kenji 3aad507ba8 remove: fsel 2025-12-27 11:57:56 -06:00
kenji 1cd2b54e6a cleaned up unused vars 2025-12-27 11:41:05 -06:00
kenji 8372715482 replace: starship loadout 2025-12-27 11:40:34 -06:00
kenji eb10aa526e add: starship conf 2025-12-27 11:37:21 -06:00
kenji e8abbff15e fix: waybar colors 2025-12-27 11:14:39 -06:00
kenji b9471c83ed add: waybar 2025-12-27 11:05:09 -06:00
kenji 46c08d95ec add 2025-12-27 10:51:09 -06:00
kenji f302399b70 add: hyprland colors 2025-12-27 10:48:22 -06:00
kenji c9387525eb add: conf 2025-12-27 10:20:28 -06:00
kenji c1a76f2b2b add: matugen 2025-12-27 10:11:03 -06:00
kenji ef68c8191e add: firewatch wallpapers 2025-12-26 19:44:40 -06:00
kenji 16a14f9863 add: firewatch wall 2025-12-26 19:41:19 -06:00
kenji 10cb0370b6 organize: tte 2025-12-26 19:34:48 -06:00
kenji 5bf24e41fb add: macos tahoe 2025-12-26 19:34:39 -06:00
kenji af2a4738a8 reserved 2025-12-26 19:34:25 -06:00
kenji 20e39113a9 optimization: faster essentials 2025-12-26 19:34:19 -06:00
kenji f5d81a5a43 fix: stuff 2025-12-26 16:47:50 -06:00
kenji 39f692919b added branding 2025-12-26 16:20:14 -06:00
kenji fed7db4fbc add: screensaver 2025-12-26 16:09:12 -06:00
kenji 9fa7d0c4f5 add: tte 2025-12-26 15:33:39 -06:00
kenji d1a3e369e4 rename: hakase-scripts 2025-12-26 15:29:31 -06:00
kenji ab9247bc45 add: gaming 2025-12-26 13:45:39 -06:00
kenji 4b1d5c5f02 add: brightness adjustment 2025-12-26 13:33:11 -06:00
kenji fe39db683a add: backlight.nix 2025-12-26 13:26:27 -06:00
kenji 5fa73c0bad add: decorations 2025-12-26 13:22:25 -06:00
kenji 8231d88a5b minor: readabilty 2025-12-26 13:19:09 -06:00
kenji b9595f283a fix: added input 2025-12-26 13:18:43 -06:00
kenji 4cf1c3e74d add: env.nix 2025-12-26 13:18:34 -06:00
kenji a97d65ac0e add: misc.nix, input.nix 2025-12-26 13:10:31 -06:00
kenji 5e905af198 add: misc.nix 2025-12-26 13:06:05 -06:00
kenji f113b5d9b8 replace: fsel -> walker 2025-12-26 13:05:57 -06:00
kenji 4ce7ab874f feat: disabled some hints 2025-12-26 13:05:38 -06:00
kenji 2049c94a1c add: improved animation 2025-12-26 13:05:26 -06:00
kenji 2e14ccbe1a fix: swayosd not working 2025-12-26 13:05:12 -06:00
kenji 80190502ba add: new binds for moving window 2025-12-26 13:05:00 -06:00
kenji 6ca530741e fix: fsel problems 2025-12-26 11:52:12 -06:00
kenji 3505aabbc7 add: fsel launcher 2025-12-26 11:34:32 -06:00
kenji c124898b8c add: config for fsel 2025-12-26 11:34:17 -06:00
kenji e3bac0adc6 boot: set timeout to 0 2025-12-26 11:16:08 -06:00
kenji af1ae030a4 new: audio setters 2025-12-26 10:07:24 -06:00
kenji f0b48b9f61 new: textfox--a firefox tui-like experience 2025-12-26 09:52:50 -06:00
kenji 8f6dc9796d feat: use tui for bar tools 2025-12-26 09:09:59 -06:00
kenji a9f2e86491 Revert "this one works"
This reverts commit 8ac3c21228.
2025-12-26 09:01:49 -06:00
kenji 8ac3c21228 this one works 2025-12-25 19:52:09 -06:00
kenji cf2f942f0b improved bar scripts (needs to be reliable though) 2025-12-25 19:14:51 -06:00
kenji 0ac2ceba5c added fsel 2025-12-25 11:26:02 -06:00
kenji b241a5c5f4 added todo 2025-12-25 11:16:42 -06:00
kenji 69154e639a btop: changed theme 2025-12-25 10:36:46 -06:00
kenji 6e8c747a5c added style for walker 2025-12-25 09:58:37 -06:00
kenji e753361e07 added fonts 2025-12-25 09:44:23 -06:00
kenji d96148bf06 ADD: preload nix 2025-12-25 08:59:52 -06:00
kenji 2d9f95e8e5 added kernel 2025-12-25 08:53:23 -06:00
kenji c604816aa9 fix: dynamic wallpaper 2025-12-25 00:41:44 -06:00
kenji cf28f0cede modded walker 2025-12-24 23:14:40 -06:00
kenji 22fc29f8f1 hypr: rules added 2025-12-24 23:06:55 -06:00
kenji 51419d6171 fix: hakase scripting 2025-12-24 23:03:49 -06:00
kenji 37dde66dc4 fix: impala aint working back 2025-12-24 22:36:56 -06:00
kenji fa1baa128f added scripts 2025-12-24 22:34:08 -06:00
kenji ad64748ad7 added BTOP 2025-12-24 22:28:31 -06:00
kenji 381c4876d9 changed to kanagawa 2025-12-24 22:21:29 -06:00
kenji 06383737d7 added nixos_rainbow 2025-12-24 22:06:16 -06:00
kenji 069e53d66f added kanagawa 2025-12-24 22:00:21 -06:00
kenji 00ea547c8d applied colors 2025-12-24 21:58:12 -06:00
kenji aa7e045303 renamed 2025-12-24 21:31:02 -06:00
kenji f9ab7268d2 added catppuccin wallpaper 2025-12-24 21:30:30 -06:00
kenji 9e49f7f433 added light tower wallpaper 2025-12-24 21:18:26 -06:00
kenji 6621b7aa7b fix: test 2025-12-24 21:04:54 -06:00
kenji bd5f8eec2b added wallpaper assets 2025-12-24 21:02:55 -06:00
kenji 11b4f2410d test2 2025-12-24 21:00:59 -06:00
kenji 4c0fe82453 tes 2025-12-24 18:20:35 -06:00
kenji 830165aab8 ADDED stylix on HOME 2025-12-24 18:11:56 -06:00
kenji 93e5181cb6 ADDED hyprpaper 2025-12-24 18:01:30 -06:00
kenji 7d5a24c7f8 walker and added icons 2025-12-24 17:46:04 -06:00
kenji 882063c6c6 ADDED home walker 2025-12-24 17:38:24 -06:00
kenji 7fe00a1375 ADDED walker 2025-12-24 17:36:54 -06:00
kenji 6d0963827b added impala 2025-12-24 17:36:36 -06:00
kenji 74bef0c5cd fixed the part where sops dont work with user 2025-12-24 17:24:22 -06:00
kenji 684ee6f23d added README features 2025-12-24 17:09:41 -06:00
kenji 3135e1cec4 added README 2025-12-24 16:47:32 -06:00
kenji be4b66fdd2 fully implemented SOPS 2025-12-24 16:24:38 -06:00
kenji 8b66ff719b added sops, age, ssh-to-age for security 2025-12-24 16:10:59 -06:00
kenji edfa915586 ADDED variables 2025-12-24 16:05:31 -06:00
kenji 3980c8ae88 added sops on inputs 2025-12-24 15:51:42 -06:00
kenji 348d2b46e6 added sops and age 2025-12-24 14:11:30 -06:00
kenji a4f41a0371 added newtabpage to config.nix 2025-12-24 13:53:02 -06:00
kenji 7cd5b88c45 nixovim: disabled auto_install due to problems 2025-12-24 13:33:26 -06:00
kenji bf3e18d17c nixovim: fixed error at startup
pain in the a**
2025-12-24 13:28:46 -06:00
kenji 7af0cfd06d test 2025-12-24 12:56:07 -06:00
kenji 6628c4d589 added apps-optional 2025-12-24 11:21:55 -06:00
kenji 260ca708a8 ADDED jellyfin-tui 2025-12-24 10:49:33 -06:00
kenji ef7c3d23a3 returned bindings to firefox 2025-12-24 10:49:27 -06:00
kenji c2cb932c66 FIREFOX: fixed not being able to add bookmarks 2025-12-24 10:49:16 -06:00
kenji 21b805741f fixed spelling error 2025-12-24 16:43:16 +00:00
kenji 44fa744312 added comment 2025-12-24 16:30:50 +00:00
kenji 445f70a5ec test 2025-12-24 16:29:44 +00:00
kenji eb9d3f2d16 ADDED timezone 2025-12-24 16:29:25 +00:00
kenji 66f6ae06d7 added option for default terminal 2025-12-24 16:28:37 +00:00
kenji 08868fc241 modular binding for firefox 2025-12-24 16:28:28 +00:00
kenji 811011d6d6 fixed some issue and added uwsm support 2025-12-24 16:19:44 +00:00
kenji 7df49ad646 added pamixer 2025-12-24 15:51:43 +00:00
kenji 2caa21482f added waybar style 2025-12-24 14:12:48 +00:00
kenji 573231b99a added workspace binds 2025-12-24 00:07:06 +00:00
kenji 04190ab15c ADDED exec hypr 2025-12-23 23:57:35 +00:00
kenji 63832528f2 waybar config 2025-12-23 23:53:50 +00:00
kenji 18a687f114 ADDED module for waybar 2025-12-23 23:52:19 +00:00
kenji e0edcb77e1 ADDED waybar 2025-12-23 23:43:57 +00:00
kenji 9795d54dd4 makes decent LUKS lock screen 2025-12-23 23:43:52 +00:00
kenji fd28c24d7a added padding for ghostty and hypr 2025-12-23 23:23:44 +00:00
kenji e05f9d387e ADDED starship 2025-12-23 23:08:13 +00:00
kenji 0ad80cf7a1 added firefox 2025-12-23 23:03:05 +00:00
kenji c4639d88c5 fix hyprland incorrect bindings 2025-12-23 22:58:54 +00:00
kenji e4e90059e3 ADDDED security 2025-12-23 22:53:00 +00:00
kenji 07879586b4 ADDED gemini 2025-12-23 21:56:59 +00:00
kenji 2d3ec51eb1 ADDED modules for hyprland 2025-12-23 21:50:16 +00:00
kenji 88eaa7a242 commented hyprpolkit 2025-12-23 21:46:33 +00:00
kenji 5faef18601 ADDED home for hyprland 2025-12-23 21:46:27 +00:00
kenji c9d7932bda added binds and general nix 2025-12-23 21:42:07 +00:00
kenji 7ebc2f366b uses proper home config for ghostty 2025-12-23 21:02:43 +00:00
kenji 69b3d42f9a ADDED ghostty 2025-12-23 20:59:59 +00:00
kenji 587266c904 ADDED yazi 2025-12-23 20:52:30 +00:00
kenji ded05e23fc added hyprland 2025-12-23 20:22:09 +00:00
kenji 07d33b60dc minor fixes 2025-12-23 20:22:05 +00:00
kenji cd647e7d7b added fonts and programs nix 2025-12-23 20:12:10 +00:00
kenji facce75d9f organadded unused starship 2025-12-23 20:12:05 +00:00
kenji ab6eb6db5b fixed lots of stuff 2025-12-23 19:48:09 +00:00
kenji a036da9b76 removed other integration for zoxide 2025-12-23 19:43:57 +00:00
kenji b796260c7e removed cd alias (did not work) 2025-12-23 19:43:41 +00:00
kenji 4a23455792 added shellaliases 2025-12-23 19:41:41 +00:00
kenji bbe6ef38b7 added fish 2025-12-23 19:15:50 +00:00
kenji 3b7ed586c6 added zoxide 2025-12-23 19:12:09 +00:00
kenji f9c11e0dc0 test 2025-12-23 19:01:28 +00:00
kenji 5e093d351b test 2025-12-23 19:00:25 +00:00
kenji 2c88a52d5a this one works! 2025-12-23 18:59:36 +00:00
kenji b55c662a1b hello world! 2025-12-23 18:43:43 +00:00
kenji 73b5b2c9f6 test 2025-12-23 12:22:32 -06:00
kenji f155563ca0 test 2025-12-23 12:19:53 -06:00
kenji 9b615f3825 added hardware config 2025-12-23 12:13:29 -06:00
kenji 56a829cdb3 renmaed 2025-12-22 09:39:51 -06:00
kenji d7c275f6e9 more added 2025-12-22 09:38:38 -06:00
kenji 420d4f173c revamped 2025-12-22 09:32:38 -06:00
kenji ec424cd6d8 restarted from the very beginning 2025-12-22 08:42:00 -06:00
lsoriano-mcm fc765ee94f renamed variables
renamed macbook-air to macbook
2025-08-07 12:03:23 -05:00
lsoriano-mcm b86646816b darwin rebuilding 2025-08-07 12:01:20 -05:00
lsoriano-mcm 12dbe7536f added new folders 2025-07-20 16:42:36 -05:00
kenji 1bbac664e7 added modern branch 2025-07-20 16:29:26 -05:00
150 changed files with 2754 additions and 3525 deletions
+7
View File
@@ -0,0 +1,7 @@
keys:
- &user_kenji age1dhmt5tdyxd9zam542zkr9hq4tku7lzmf6j057sjtepk80deky5fqemczs5
creation_rules:
- path_regex: secrets/[^/]+\.(yaml|json|env|ini)$
key_groups:
- age:
- *user_kenji
+55 -50
View File
@@ -1,55 +1,60 @@
# Nix Sakamoto
A rewrite of the original Sakamoto NixOS configuration.
# HakaseOS
HakaseOS is an opinionated NixOS configuration heavily inspired by OmarchyOS.
## Installation
Installing Sakamoto Nix configuration may vary on your current operating system.
## Features
* Vim keybindings
* Simple Setup
* Pre-configured Firefox
| Hosts | Description |
|----------|--------------|
| hakase | gaming desktop (linux) |
| sakamoto | \[unavailable] server that uses containers (linux) |
| nano | \[unavailable] windows configuration |
| macos | macos configuration |
## To-do
* TUI for everything
**Note: Replace `${Hosts}` with one of the options from the table above.**
## 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.
### Linux Installation
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
1. Install [Nix](https://nixos.org).
2. Clone this directory.
```sh
$ git clone https://git.sakamoto.dev/kenji/nixos.git ~/.config/nixos
```
3. Create a hardware-configuration.conf
```sh
$ sudo nixos-generate-config --dir ~/.config/nixos/hosts/${Hosts}/
```
4. ⚠️ Modify `config.nix` that suits your configuration. **Be sure to edit `config.nix`! Most especially `myConfig.essentials.Username`. Otherwise, your OS could break!!!**
5. Rebuild.
```sh
$ sudo nixos-rebuild switch --flake ~/.config/nixos/hosts/#${Hosts}
```
6. Install unstable channel (fixes `pkgs.fish` misconfiguration).
```sh
$ nix-channel --add https://nixos.org/channels/nixos-unstable nixos nix-channel --update
```
7. (Optional) You can install `proton-ge` by running the following command:
```sh
protonup
```
8. (Optional) Add Decky Loader for Steam via this command:
```sh
touch ~/.steam/steam/.cef-enable-remote-debugging
```
### MacOS (Darwin) Installation
1. Install [Nix](https://nixos.org).
2. Clone this directory.
```sh
$ git clone https://git.sakamoto.dev/kenji/nixos.git ~/.config/nixos
```
3. ⚠️ Modify `config.nix` that suits your configuration. **Be sure to edit `config.nix`! Most especially `myConfig.essentials.Username`. Otherwise, configuration would not work!!!**
4. Rebuild.
```sh
$ sudo nix run nix-darwin --extra-experimental-features "nix-command flakes" -- switch --flake ~/.config/nixos#macos
```
```
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"
```
@@ -3,6 +3,7 @@
enable = true;
settings = {
vim_keys = true;
color_theme = "TTY";
theme_background = false;
};
};
+130
View File
@@ -0,0 +1,130 @@
{
pkgs,
myConfig,
inputs,
...
}: {
imports = [
inputs.textfox.homeManagerModules.default
./textfox.nix
];
home.packages = with pkgs; [pywalfox-native];
programs.firefox = {
enable = true;
languagePacks = ["en-US"];
# nativeMessagingHosts = [pkgs.pywalfox-native];
profiles = {
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 ---
"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";
# };
# };
};
};
}
+48
View File
@@ -0,0 +1,48 @@
{
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 */";
};
};
}
@@ -9,9 +9,9 @@
set fish_greeting
fish_vi_key_bindings
zoxide init fish | source
zoxide init fish --cmd cd | source
'';
shellAliases = myConfig.general.Terminal.aliases;
shellAliases = myConfig.terminal.aliases;
plugins = with pkgs.fishPlugins; [
];
@@ -1,5 +1,5 @@
{pkgs, ...}: {
home.packages = with pkgs; [
solaar
gemini-cli
];
}
+26
View File
@@ -0,0 +1,26 @@
{
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;
window-padding-x = 15;
window-padding-y = 15;
window-padding-balance = true;
};
};
}
View File
+10
View File
@@ -0,0 +1,10 @@
{myConfig, ...}: {
programs.git = {
enable = true;
settings = {
user.name = "${myConfig.git.username}";
user.email = "${myConfig.git.email}";
init.defaultBranch = "${myConfig.git.defaultBranch}";
};
};
}
+38
View File
@@ -0,0 +1,38 @@
{
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
@@ -0,0 +1,13 @@
{
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
@@ -0,0 +1,51 @@
{
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;
};
};
};
}
+70
View File
@@ -0,0 +1,70 @@
{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
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, nc -U $XDG_RUNTIME_DIR/walker/walker.sock"
# [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
@@ -0,0 +1,14 @@
{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"
];
};
}
+27
View File
@@ -0,0 +1,27 @@
{pkgs, ...}: {
home.packages = with pkgs; [
psmisc
];
wayland.windowManager.hyprland.settings = {
exec = [
"pkill -x hyprpaper; uwsm app -- hyprpaper"
"killall -SIGUSR2 .ghostty-wrappe"
];
exec-once = [
"uwsm app -- waybar"
"uwsm app -- hyprpaper"
"uwsm app -- elephant"
"uwsm app -- swayosd-server"
"walker --gapplication-service"
"pywalfox start"
"[workspace 20 silent] uwsm app -- firefox"
"[workspace 20 silent] uwsm app -- xdg-terminal-exec"
"sh -c 'sleep 2; hyprctl dispatch workspace 1'"
"[workspace 1] uwsm app -- xdg-terminal-exec"
];
};
}
+18
View File
@@ -0,0 +1,18 @@
{myConfig, ...}: {
wayland.windowManager.hyprland.settings = {
general = {
gaps_in = 5;
gaps_out = 15;
layout = "dwindle";
};
monitor = myConfig.hyprland.monitors;
dwindle = {
pseudotile = true;
preserve_split = true;
force_split = 2;
};
master = {
new_status = "master";
};
};
}
+11
View File
@@ -0,0 +1,11 @@
{
wayland.windowManager.hyprland.settings = {
input = {
repeat_rate = 50;
repeat_delay = 300;
};
cursor = {
hide_on_key_press = true;
};
};
}
+11
View File
@@ -0,0 +1,11 @@
{
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;
};
};
}
+14
View File
@@ -0,0 +1,14 @@
{
wayland.windowManager.hyprland.settings = {
windowrulev2 = [
# --- POPUP RULES (Wifi, BT, Audio) ---
"float, class:^(org\.hakase\.popup\..*)$"
"animation slide right, class:^(org\.hakase\.popup\..*)$"
"dimaround, class:^(org\.hakase\.popup\..*)$"
# Prevent Firefox and Terminal from stealing focus on launch
"suppressevent activate, workspace:20"
"noinitialfocus, workspace:20"
];
};
}
+12
View File
@@ -0,0 +1,12 @@
{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";
}
@@ -1,5 +1,5 @@
{pkgs, ...}: {
home.packages = with pkgs; [
cloudflared
jellyfin-tui
];
}
+31
View File
@@ -0,0 +1,31 @@
[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'
+23
View File
@@ -0,0 +1,23 @@
{
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";
}
+22
View File
@@ -0,0 +1,22 @@
{
"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
@@ -0,0 +1,6 @@
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
@@ -0,0 +1,4 @@
<* for name, value in colors *>
$image = {{image}}
${{name}} = rgba({{value.default.hex_stripped}}ff)
<* endfor *>
+46
View File
@@ -0,0 +1,46 @@
format = '''
$directory$git_branch$rust$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}}'
# Prompt symbols
[character]
success_symbol = "[🞈](color9 bold)"
error_symbol = "[🞈](@{error})"
vicmd_symbol = "[🞈](#f9e2af)"
[directory]
format = "[](fg:color1 bg:color4)[󰉋](bg:color1 fg:color2)[ ](fg:color1 bg:color4)[$path ](fg:color3 bg:color4)[ ](fg:color4)"
[directory.substitutions]
"Documents" = "󰈙 "
"Downloads" = " "
"Music" = " "
"Pictures" = " "
[git_branch]
format = "[](fg:color8 bg:color4)[ ](bg:color8 fg:color5)[](fg:color8 bg:color4)[(bg:color8 fg:color5) $branch](fg:color3 bg:color4)[](fg:color4) "
[time]
format = "[](fg:color8 bg:color4)[ ](bg:color8 fg:color5)[](fg:color8 bg:color4)[(bg:color8 fg:color5) $time](fg:color3 bg:color4)[](fg:color4) "
disabled = false
time_format = "%R" # Hour:Minute Format
[python]
format = "[](fg:color8 bg:color4)[${symbol}${version}](bg:color8 fg:color5)[](fg:color8 bg:color4)[(bg:color8 fg:color5)( ${virtualenv})](fg:color3 bg:color4)[](fg:color4) "
symbol = '🐍'
# pyenv_version_name = true
pyenv_prefix = 'venv'
+207
View File
@@ -0,0 +1,207 @@
@define-color window_bg_color {{colors.surface_container.default.hex}};
@define-color accent_bg_color {{colors.primary.default.hex}};
@define-color theme_fg_color {{colors.on_surface.default.hex}};
@define-color error_bg_color {{colors.error.default.hex}};
@define-color error_fg_color {{colors.on_error.default.hex}};
* {
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;
}
+7
View File
@@ -0,0 +1,7 @@
/*
* Css Colors
* Generated with Matugen
*/
<* for name, value in colors *>
@define-color {{name}} {{value.default.hex}};
<* endfor *>
@@ -1,10 +1,10 @@
{
pkgs,
inputs,
system,
pkgs,
...
}: {
home.packages = [
inputs.nixovim.packages.${system}.default
inputs.nixovim.packages.${pkgs.system}.full
];
}
+40
View File
@@ -0,0 +1,40 @@
{
pkgs,
inputs,
myConfig,
lib,
...
}: {
imports = [
inputs.stylix.homeModules.stylix
];
stylix = {
autoEnable = false;
targets = {
firefox = {
enable = false;
colorTheme.enable = true;
profileNames = [
"hakase"
];
};
waybar.enable = false;
ghostty.enable = false;
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
@@ -0,0 +1,14 @@
{
pkgs,
lib,
...
}: let
#
hakase-screensaver-launch = pkgs.writeShellScriptBin "hakase-cmd-screensaver" ''
'';
in {
home.packages = with pkgs; [
hakase-screensaver-launch
];
}
+8
View File
@@ -0,0 +1,8 @@
{pkgs, ...}: {
home.packages = with pkgs; [
terminaltexteffects
];
home.file.".config/hakase/branding/screensaver.txt" = {
source = ../../assets/branding.txt;
};
}
+39
View File
@@ -0,0 +1,39 @@
{
inputs,
config,
pkgs,
...
}: {
imports = [
# ./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 = "_";
# }
# ];
};
};
}
+210
View File
@@ -0,0 +1,210 @@
{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
@@ -0,0 +1,169 @@
{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
@@ -0,0 +1,171 @@
{
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
@@ -0,0 +1,88 @@
{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
@@ -0,0 +1,14 @@
{pkgs, ...}: {
programs.yazi = {
enable = true;
enableFishIntegration = true;
settings = {
manager = {
show_hidden = true;
sort_by = "natural";
sort_dir_first = true;
linemode = "size";
};
};
};
}
@@ -2,7 +2,8 @@
programs.zoxide = {
enable = true;
enableFishIntegration = true;
enableZshIntegration = true;
enableBashIntegration = true;
options = [
"--cmd cd"
];
};
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

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

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 451 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 KiB

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

After

Width:  |  Height:  |  Size: 607 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

+1
View File
@@ -0,0 +1 @@
/nix/store/yckzy9k5i7pvmlk6xjkdj4wwbfms1zpl-home-manager-files/Pictures/Wallpapers/nord-1.png
+10
View File
@@ -0,0 +1,10 @@
▄▄▄
▄█████▄ ▄███████████▄ ▄███████ ▄███████ ▄███████ ▄█ █▄ ▄█ █▄
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ █▀ ███ ███ ███ ███
███ ███ ███ ███ ███ ▄███▄▄▄███ ▄███▄▄▄██▀ ███ ▄███▄▄▄███▄ ███▄▄▄███
███ ███ ███ ███ ███ ▀███▀▀▀███ ▀███▀▀▀▀ ███ ▀▀███▀▀▀███ ▀▀▀▀▀▀███
███ ███ ███ ███ ███ ███ ███ ██████████ ███ █▄ ███ ███ ▄██ ███
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
▀█████▀ ▀█ ███ █▀ ███ █▀ ███ ███ ███████▀ ███ █▀ ▀█████▀
███ █▀
+52 -76
View File
@@ -1,85 +1,61 @@
{
myConfig = {
essentials = {
# !!! replace it with your own, else system might malfunction.
Username = "kenji";
};
general = {
Terminal = {
font = "JetBrainsMono Nerd Font";
size = "18";
shell = "fish"; # or zsh
aliases = {};
};
allowUnfree = true;
};
nixos = {
Hostname = "hakase";
Timezone = "America/Chicago";
enableSteamOS = true;
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
Boot = {
mode = "systemd"; # systemd or grub
};
Apps = {
packages = pkgs:
with pkgs; [
jellyfin-media-player
usbutils
pciutils
goverlay
geekbench_6
gparted
ntfs3g
todoist
feishin
discord
xfce.thunar
];
};
Hyprland = {
enable = false;
monitors = [
"DP-1, highres@165,0x1080,1,vrr,1"
"DP-2, highres@highrr,0x0,1"
"HDMI-A-1, 1920x1080@120, 20000x20000,1"
# "HDMI-A-1, disabled"
];
};
Git = {
user = "";
email = "";
defaultBranch = "master";
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/#hakase";
};
};
optionals = {
Builds = {
trustedUsers = [
"@groups"
];
buildMachines = [
{
hostName = "";
sshUser = "";
sshKey = "";
system = "";
supportedFeatures = ["big-parallel" "kvm" "nixos-test"];
}
];
};
Ssh = {
extraConfig = ''
Host macair
User biscuit
HostName 192.168.68.81
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 = "firewatch_dusk.jpg";
};
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 = [
{
title = "Dashboard";
url = "https://dash.sakamoto.dev";
}
];
};
};
}
Generated
+596 -590
View File
File diff suppressed because it is too large Load Diff
+34 -78
View File
@@ -1,113 +1,69 @@
{
description = "A rewrite of the original Sakamoto NixOS config.";
description = "Hakase Configuration";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
elephant.url = "github:abenz1267/elephant";
chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
nur = {
url = "github:nix-community/NUR";
inputs.nixpkgs.follows = "nixpkgs";
};
jovian = {
url = "github:Jovian-Experiments/Jovian-NixOS";
inputs.nixpkgs.follows = "nixpkgs";
};
hyprland.url = "github:hyprwm/Hyprland";
hyprland.inputs.nixpkgs.follows = "nixpkgs";
textfox.url = "github:adriankarlen/textfox";
nur.url = "github:nix-community/NUR";
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
darwin = {
url = "github:lnl7/nix-darwin";
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";
};
matugen = {
url = "github:/InioX/Matugen";
sops-nix = {
url = "github:Mic92/sops-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
stylix = {
url = "github:nix-community/stylix";
inputs.nixpkgs.follows = "nixpkgs";
};
quickshell = {
url = "git+https://git.outfoxxed.me/outfoxxed/quickshell";
inputs.nixpkgs.follows = "nixpkgs";
};
caelestia-shell = {
url = "git+https://git.sakamoto.dev/kenji/caelestia-nix";
inputs.nixpkgs.follows = "nixpkgs";
walker = {
url = "github:abenz1267/walker";
inputs.elephant.follows = "elephant";
};
};
outputs = {
self,
nixpkgs,
flake-utils,
home-manager,
darwin,
stylix,
nixovim,
chaotic,
sops-nix,
textfox,
...
} @ inputs: let
config = import ./config.nix;
mkArgs = system:
system = "x86_64-linux";
args =
{
inherit inputs system;
}
// config;
systems = ["x86_64-linux" "aarch64-linux"];
in
flake-utils.lib.eachSystem systems (system: let
pkgs = import nixpkgs {
inherit system;
config.allowUnfree = true;
};
args = mkArgs system;
in {
})
// {
nixosConfigurations = {
hakase = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = mkArgs "x86_64-linux";
modules = [
./hosts/hakase/configuration.nix
];
};
};
homeConfigurations = {
hakase = home-manager.lib.homeManagerConfiguration {
pkgs = import nixpkgs {
system = "x86_64-linux";
config.allowUnfree = true;
extraSpecialArgs = mkArgs "x86_64-linux";
};
modules = [
./home/hakase.nix
];
};
};
darwinConfigurations = {
macos = darwin.lib.darwinSystem {
system = "aarch64-darwin";
specialArgs = mkArgs "aarch64-darwin";
modules = [
./hosts/macos/darwin.nix
];
};
in {
nixosConfigurations = {
hakase = nixpkgs.lib.nixosSystem {
specialArgs = args;
modules = [
home-manager.nixosModules.home-manager
sops-nix.nixosModules.sops
chaotic.nixosModules.default
./hosts/hakase/configuration.nix
];
};
};
};
}
-15
View File
@@ -1,15 +0,0 @@
{
config,
pkgs,
inputs,
...
}: {
imports = [
../modules/home/terminal.nix
];
programs.home-manager.enable = true;
home.packages = [];
home.stateVersion = "25.11";
}
+9 -7
View File
@@ -2,15 +2,17 @@
pkgs,
inputs,
...
}: let
info = import ../config.nix;
in {
}: {
imports = [
# inputs.chaotic.homeManagerModules.default
../modules/home/desktop.nix
../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
inputs.walker.homeManagerModules.default
];
# nix.package = pkgs.nix;
home.packages = info.myConfig.nixos.Apps.packages pkgs;
home.stateVersion = "25.05";
}
+4 -195
View File
@@ -1,204 +1,13 @@
{
pkgs,
myConfig,
inputs,
lib,
specialArgs,
...
}: {
imports = [
inputs.home-manager.nixosModules.home-manager
inputs.chaotic.nixosModules.default
./hardware-configuration.nix
../../modules/default/desktop.nix
../../modules/default/dev.nix
../../modules/default/remote.nix
../../modules/system/default.nix
../../modules/system/hyprland.nix
../../modules/system/scripts.nix
../../modules/system/gaming.nix
];
environment.systemPackages = with pkgs; [
pavucontrol
wl-clipboard
wget
protontricks
];
users = {
defaultUserShell = pkgs.${myConfig.general.Terminal.shell};
users = {
${myConfig.essentials.Username} = {
isNormalUser = true;
extraGroups = ["wheel" "networkmanager" "input" "video"];
initialHashedPassword = "$y$j9T$NHFtSwF4NJtEmgMjy4Xdg.$9WQltjEx3eEfZ7GbpGLW8lBhJtiXPOeIawrxdmx0.vB";
useDefaultShell = true;
packages = [];
};
};
};
home-manager = {
backupFileExtension = "backup";
useGlobalPkgs = true;
useUserPackages = true;
extraSpecialArgs = specialArgs;
users.${myConfig.essentials.Username} = import ../../home/hakase.nix;
};
nixpkgs.config.allowUnfree = myConfig.general.allowUnfree;
hardware.logitech.wireless.enable = true;
hardware.bluetooth.enable = true;
hardware.bluetooth.powerOnBoot = true;
hardware.bluetooth.settings = {
General = {
AutoEnable = true;
Experimental = true;
MultiProfile = "multiple";
FastConnectable = true;
};
};
hardware.graphics = {
enable = true;
enable32Bit = true;
};
i18n.defaultLocale = "en_US.UTF-8";
time.timeZone = "${myConfig.nixos.Timezone}";
boot.loader = {
systemd-boot = lib.mkIf (myConfig.nixos.Boot.mode == "systemd") {
enable = true;
};
grub = lib.mkIf (myConfig.nixos.Boot.mode == "grub") {
efiSupport = true;
enable = true;
device = "nodev";
useOSProber = true;
};
efi = {
canTouchEfiVariables = true;
efiSysMountPoint = "/boot";
};
};
programs.ssh.extraConfig = myConfig.optionals.Ssh.extraConfig;
programs.bash = {
interactiveShellInit = ''
if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
then
shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
fi
'';
};
programs = {
zsh.enable = true;
fish.enable = true;
};
services = {
displayManager.sessionPackages = [inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland];
# getty.autologinUser = "${myConfig.essentials.Username}";
# greetd = {
# enable = true;
# settings.default_session = {
# user = "${myConfig.essentials.Username}";
# command = "Hyprland";
# };
# };
seatd.enable = true;
upower.enable = true;
scx.enable = true; # by default uses scx_rustland scheduler
libinput.enable = true;
blueman.enable = true;
printing.enable = true;
openssh.enable = true;
pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
# lowLatency = {
# enable = true;
# quantum = 64;
# rate = 48000;
# };
};
};
# make pipewire realtime-capable
security.rtkit.enable = true;
nix = {
distributedBuilds = true;
settings = {
builders-use-substitutes = true;
trusted-users = myConfig.optionals.Builds.trustedUsers;
experimental-features = ["nix-command" "flakes"];
};
};
console = {
earlySetup = false;
font = "${pkgs.terminus_font}/share/consolefonts/ter-132n.psf.gz";
packages = with pkgs; [terminus_font];
useXkbConfig = true;
};
networking = {
# wakeOnLan.enable = true;
networkmanager.enable = true;
firewall = {
enable = true;
allowedTCPPorts = [22 80];
allowedUDPPorts = [53];
};
proxy.default = null;
proxy.noProxy = null;
};
boot.loader.timeout = 0;
boot.loader.limine.maxGenerations = 5;
hardware.amdgpu.initrd.enable = true;
boot.kernelParams = [
"quiet"
"splash"
"boot.shell_on_fail"
"udev.log_priority=3"
"rd.systemd.show_status=auto"
"iommu=pt"
"amd_pstate=active"
];
boot.kernelPackages = pkgs.linuxPackages_cachyos;
boot.kernel.sysctl = {
"kernel.split_lock_mitigate" = 0;
"kernel.nmi_watchdog" = 0;
"kernel.sched_bore" = "1";
};
boot.initrd = {
systemd.enable = true;
kernelModules = [];
verbose = false;
};
boot.plymouth.enable = true;
boot.plymouth.theme = "seal";
boot.plymouth.themePackages = with pkgs; [
# By default we would install all themes
(adi1090x-plymouth-themes.override {
selected_themes = ["seal"];
})
];
boot.consoleLogLevel = 0;
systemd.extraConfig = "DefaultTimeoutStopSec=5s";
# networking.firewall.allowedTCPPorts = [ ... ];
# networking.firewall.allowedUDPPorts = [ ... ];
# Or disable the firewall altogether.
# networking.firewall.enable = false;
# networking.proxy.default = "http://user:password@proxy:port/";
# networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
system.stateVersion = "25.05";
}
+7 -21
View File
@@ -8,39 +8,25 @@
[ (modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usbhid" "usb_storage" ];
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usbhid" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/disk/by-uuid/532ac73e-1370-4e4d-9d5a-15033de0b96d";
fsType = "btrfs";
options = [ "subvol=@" ];
{ 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/1368-D3F3";
{ device = "/dev/disk/by-uuid/72BA-AF9B";
fsType = "vfat";
options = [ "fmask=0077" "dmask=0077" ];
};
fileSystems."/home" =
{ device = "/dev/disk/by-uuid/780aa81f-c4d6-478b-9c51-2d60362fdb07";
fsType = "ext4";
};
swapDevices =
[ { device = "/dev/disk/by-uuid/b02ef55c-4caf-4a24-a6a2-fb8001eafe22"; }
];
# 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.enp11s0.useDHCP = lib.mkDefault true;
# networking.interfaces.wlp10s0.useDHCP = lib.mkDefault true;
swapDevices = [ ];
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
-47
View File
@@ -1,47 +0,0 @@
{
pkgs,
myConfig,
inputs,
system,
mkArgs,
...
}: {
imports = [
../../modules/default/darwin.nix
inputs.home-manager.darwinModules.home-manager
];
# List packages installed in system profile. To search by name, run:
# $ nix-env -qaP | grep wget
environment.systemPackages = [];
# 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.optionals.Builds.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.essentials.Username} = {
name = "${myConfig.essentials.Username}";
home = "/Users/${myConfig.essentials.Username}";
# shell = pkgs.${myConfig.general.terminal.Shell}; # no support for nix-darwin, but can be changed via chsh.
};
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = mkArgs system;
home-manager.users.${myConfig.essentials.Username} = import ../../home/darwin.nix;
}
-169
View File
@@ -1,169 +0,0 @@
{
config,
pkgs,
lib,
myConfig,
inputs,
...
}: {
imports = [
# Include the results of the hardware scan.
inputs.chaotic.nixosModules.default
./hardware-configuration.nix
];
nix.settings.experimental-features = ["nix-command" "flakes"];
nixpkgs.config.allowUnfree = true;
####################
# Boot & Kernel #
####################
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
boot.loader.timeout = 0;
boot.loader.limine.maxGenerations = 5;
hardware.amdgpu.initrd.enable = true;
boot.kernelParams = ["quiet"];
boot.kernelPackages = pkgs.linuxPackages_cachyos;
boot.kernel.sysctl = {
"kernel.split_lock_mitigate" = 0;
"kernel.nmi_watchdog" = 0;
"kernel.sched_bore" = "1";
};
boot.initrd = {
systemd.enable = true;
kernelModules = [];
verbose = false;
};
boot.plymouth.enable = true;
boot.consoleLogLevel = 0;
systemd.extraConfig = "DefaultTimeoutStopSec=5s";
################
# FileSystems #
################
# fileSystems."/" = {
# options = ["compress=zstd"];
# };
############
# Network #
############
networking = {
networkmanager.enable = true;
firewall.enable = false;
hostName = "nixos";
};
#################
# Bluetooth #
#################
hardware.bluetooth.enable = true;
hardware.bluetooth.settings = {
General = {
MultiProfile = "multiple";
FastConnectable = true;
};
};
#################
# Sound & RTKit #
#################
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
};
########################
# Graphical & Greetd #
########################
services.xserver.enable = false;
services.getty.autologinUser = "steamos";
services.greetd = {
enable = true;
settings.default_session = {
user = "${myConfig.essentials.Username}";
command = "steam-gamescope > /dev/null 2>&1";
};
};
########################
# Programs & Gaming #
########################
services.automatic-timezoned.enable = true;
services.flatpak.enable = true;
xdg.portal.enable = true;
xdg.portal.config.common.default = "*";
xdg.portal.extraPortals = [pkgs.xdg-desktop-portal-gtk];
# programs.steam.gamescopeSession.args = ["-w 1920" "-h 1080" "-r 120" "--xwayland-count 2" "-e" "--hdr-enabled" "--mangoapp"];
programs = {
appimage = {
enable = true;
binfmt = true;
};
fish = {enable = true;};
mosh = {enable = true;};
tmux = {enable = true;};
gamescope.capSysNice = true;
steam = {
enable = true;
gamescopeSession.enable = true;
extraCompatPackages = with pkgs; [proton-ge-bin];
extraPackages = with pkgs; [
mangohud
gamescope-wsi
];
};
};
environment.sessionVariables = {
PROTON_USE_NTSYNC = "1";
ENABLE_HDR_WSI = "1";
DXVK_HDR = "1";
PROTON_ENABLE_AMD_AGS = "1";
PROTON_ENABLE_NVAPI = "1";
ENABLE_GAMESCOPE_WSI = "1";
STEAM_MULTIPLE_XWAYLANDS = "1";
};
###################
# Virtualization #
###################
virtualisation.docker.enable = true;
virtualisation.docker.enableOnBoot = false;
virtualisation.libvirtd.enable = true;
###############
# Users #
###############
users.users.${myConfig.essentials.Username} = {
isNormalUser = true;
description = "SteamOS user";
extraGroups = ["networkmanager" "wheel" "docker" "video" "seat" "audio" "libvirtd"];
# password = "steamos";
};
#################
# Security #
#################
security.sudo.wheelNeedsPassword = false;
security.polkit.enable = true;
services.seatd.enable = true;
services.openssh.enable = true;
######################
######################
########################
# System State Version #
########################
system.stateVersion = "25.05";
}
-47
View File
@@ -1,47 +0,0 @@
# Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{
imports =
[ (modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usbhid" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/disk/by-uuid/532ac73e-1370-4e4d-9d5a-15033de0b96d";
fsType = "btrfs";
options = [ "subvol=@" ];
};
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/1368-D3F3";
fsType = "vfat";
options = [ "fmask=0077" "dmask=0077" ];
};
fileSystems."/home" =
{ device = "/dev/disk/by-uuid/780aa81f-c4d6-478b-9c51-2d60362fdb07";
fsType = "ext4";
};
swapDevices =
[ { device = "/dev/disk/by-uuid/b02ef55c-4caf-4a24-a6a2-fb8001eafe22"; }
];
# 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.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;
}
-5
View File
@@ -1,5 +0,0 @@
{
imports = [
../../packages/python/default.nix
];
}
-20
View File
@@ -1,20 +0,0 @@
{
lib,
myConfig,
...
}: {
imports =
[
../../packages/hyprland/default.nix
../../packages/matugen/default.nix
../../packages/quickshell/default.nix
../../packages/udev/default.nix
]
++ [
../../packages/steam/default.nix
../../packages/bottles/default.nix
]
++ lib.optionals (myConfig.nixos.enableSteamOS == true) [
../../packages/steam/jovian.nix
];
}
-5
View File
@@ -1,5 +0,0 @@
{
imports = [
../../packages/python/default.nix
];
}
+6
View File
@@ -0,0 +1,6 @@
{
imports = [
../../apps/jellyfin-tui/home.nix
../../apps/btop/home.nix
];
}
+8
View File
@@ -0,0 +1,8 @@
{
imports = [
../../apps/yazi/home.nix
../../apps/gemini/home.nix
../../apps/firefox/home.nix
# ../../apps/starship/home.nix
];
}
-26
View File
@@ -1,26 +0,0 @@
{
imports =
[
../../packages/fonts/home.nix
../../packages/firefox/home.nix
../../packages/hyprland/home.nix
../../packages/hyprlock/home.nix
../../packages/hypridle/home.nix
../../packages/quickshell/home.nix
../../packages/swww/home.nix
../../packages/hyprsunset/home.nix
../../packages/matugen/home.nix
../../packages/rofi/home.nix
../../packages/bibata/home.nix
]
++ [
../../packages/solaar/home.nix
]
++ [
../../packages/mangohud/home.nix
../../packages/protonup/home.nix
../../packages/lutris/home.nix
../../packages/steam/home.nix
];
}
+19
View File
@@ -0,0 +1,19 @@
{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;
};
};
}
+10
View File
@@ -0,0 +1,10 @@
{
imports = [
../../apps/tte/hakase-screensaver.nix
../../apps/hyprland/home.nix
../../apps/walker/home.nix
# ../../apps/fsel/home.nix
../../apps/hyprpaper/home.nix
../../apps/tte/home.nix
];
}
-6
View File
@@ -1,6 +0,0 @@
{
imports = [
../../packages/moondeck-buddy/appimage.nix
../../packages/sunshine/default.nix
];
}
+5 -15
View File
@@ -1,19 +1,9 @@
{
imports = [
../../packages/fish/home.nix
../../packages/kitty/home.nix
../../packages/neovim/home.nix
../../packages/starship/home.nix
../../packages/fastfetch/home.nix
../../packages/zsh/home.nix
../../packages/zoxide/home.nix
../../packages/fonts/home.nix
../../packages/git/home.nix
../../packages/btop/home.nix
../../packages/eza/home.nix
../../packages/cloudflared/home.nix
../../apps/neovim/neovim.nix
../../apps/git/home.nix
../../apps/zoxide/home.nix
../../apps/fish/home.nix
../../apps/ghostty/home.nix
];
}
+6
View File
@@ -0,0 +1,6 @@
{
imports = [
../../apps/stylix/home.nix
../../apps/matugen/home.nix
];
}
+6
View File
@@ -0,0 +1,6 @@
{
imports = [
../../apps/waybar/home.nix
../../apps/waybar/hakase-popup.nix
];
}
+23
View File
@@ -0,0 +1,23 @@
{pkgs, ...}: {
imports = [
../../system/time.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
];
}
+5
View File
@@ -0,0 +1,5 @@
{
imports = [
../../system/steam.nix
];
}
+5
View File
@@ -0,0 +1,5 @@
{
imports = [
../../apps/hyprland/default.nix
];
}
-2
View File
@@ -1,2 +0,0 @@
node_modules/
@girs/
-17
View File
@@ -1,17 +0,0 @@
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
@@ -1,3 +0,0 @@
$background: #131318;
$foreground: #e4e1e9;
$primary: #bec2ff;
-21
View File
@@ -1,21 +0,0 @@
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
@@ -1,6 +0,0 @@
{
"name": "astal-shell",
"dependencies": {
"astal": "/home/biscuit/.local/share/ags"
}
}
-143
View File
@@ -1,143 +0,0 @@
@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
@@ -1,14 +0,0 @@
{
"$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
@@ -1,189 +0,0 @@
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
@@ -1,28 +0,0 @@
{
inputs,
pkgs,
system,
...
}: {
imports = [inputs.ags.homeManagerModules.default];
programs.ags = {
enable = true;
configDir = ./custom;
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
];
};
}
-5
View File
@@ -1,5 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [
bibata-cursors
];
}
-5
View File
@@ -1,5 +0,0 @@
{pkgs, ...}: {
environment.systemPackages = with pkgs; [
bottles
];
}
-12
View File
@@ -1,12 +0,0 @@
{pkgs, ...}: {
programs.eza = {
enable = true;
git = true;
colors = "auto";
icons = "auto";
enableZshIntegration = true;
enableFishIntegration = true;
enableBashIntegration = true;
};
}
-131
View File
@@ -1,131 +0,0 @@
{
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}";
}
];
};
};
}
-113
View File
@@ -1,113 +0,0 @@
{
programs.firefox = {
enable = true;
languagePacks = [
"en-US"
];
profiles = {
hakase = {
search.force = true;
isDefault = true;
search.default = "ddg";
settings = {
"browser.contentblocking.category" = "strict";
"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;
"browser.startup.homepage" = "https://dash.sakamoto.dev";
"browser.newtabpage.pinned" = [
{
title = "Dashboard";
url = "https://dash.sakamoto.dev";
}
];
};
bookmarks = {
force = true;
settings = [
{
toolbar = true;
bookmarks = [
{
name = "Home Manager";
url = "https://mynixos.com/home-manager/options/programs";
}
{
name = "YouTube";
url = "https://youtube.com";
}
];
}
];
};
};
};
policies = {
DisableTelemetry = true;
DisableFirefoxStudies = true;
EnableTrackingProtection = {
Value = true;
Locked = true;
Cryptomining = true;
Fingerprinting = true;
};
DisablePocket = true;
DisableFirefoxAccounts = true;
DisableAccounts = true;
DisableFirefoxScreenshots = true;
OverrideFirstRunPage = "";
OverridePostUpdatePage = "";
DontCheckDefaultBrowser = true;
DisplayBookmarksToolbar = "always"; # alternatives: "always" or "newtab"
DisplayMenuBar = "default-off"; # alternatives: "always", "never" or "default-on"
SearchBar = "unified"; # alternative: "separate"
/*
---- EXTENSIONS ----
*/
# Check about:support for extension/add-on ID strings.
# Valid strings for installation_mode are "allowed", "blocked",
# "force_installed" and "normal_installed".
ExtensionSettings = {
"*".installation_mode = "blocked";
"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/file/4493940/bitwarden_password_manager-2025.5.0.xpi";
installation_mode = "force_installed";
};
"tridactyl.vim@cmcaine.co.uk" = {
install_url = "https://addons.mozilla.org/firefox/downloads/file/4405615/tridactyl_vim-1.24.2.xpi";
installation_mode = "force_installed";
};
# Privacy Badger:
# "jid1-MnnxcxisBPnSXQ@jetpack" = {
# install_url = "https://addons.mozilla.org/firefox/downloads/latest/privacy-badger17/latest.xpi";
# installation_mode = "force_installed";
# };
# 1Password:
# "{d634138d-c276-4fc8-924b-40a0ea21d284}" = {
# install_url = "https://addons.mozilla.org/firefox/downloads/latest/1password-x-password-manager/latest.xpi";
# installation_mode = "force_installed";
# };
};
};
};
}
-8
View File
@@ -1,8 +0,0 @@
{pkgs, ...}: {
fonts = {
fontconfig.enable = true;
};
home.packages = with pkgs; [
nerd-fonts.jetbrains-mono
];
}
-10
View File
@@ -1,10 +0,0 @@
{myConfig, ...}: {
programs.git = {
enable = true;
extraConfig = {
user.name = "${myConfig.nixos.Git.user}";
user.email = "${myConfig.nixos.Git.email}";
init.defaultBranch = "${myConfig.nixos.Git.defaultBranch}";
};
};
}
-38
View File
@@ -1,38 +0,0 @@
{...}: {
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.
}
];
};
};
}
-42
View File
@@ -1,42 +0,0 @@
{
config,
pkgs,
myConfig,
...
}: {
wayland.windowManager.hyprland.settings = {
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"
];
};
};
}
-297
View File
@@ -1,297 +0,0 @@
{
config,
pkgs,
...
}: {
wayland.windowManager.hyprland.settings = {
exec = [
"hyprctl dispatch submap global"
];
submap = [
"global"
];
# Shell keybinds
bindi = [
"$mod, Super_L, global, caelestia:launcher" # bind to `bind` because `bindi` maps to it
# Launcher
];
bindin =
[
"$mod, catchall, global, caelestia:launcherInterrupt"
"$mod, mouse:272, global, caelestia:launcherInterrupt"
"$mod, mouse:273, global, caelestia:launcherInterrupt"
"$mod, mouse:274, global, caelestia:launcherInterrupt"
"$mod, mouse:275, global, caelestia:launcherInterrupt"
"$mod, mouse:276, global, caelestia:launcherInterrupt"
"$mod, mouse:277, global, caelestia:launcherInterrupt"
"$mod, mouse_up, global, caelestia:launcherInterrupt"
"$mod, mouse_down, global, caelestia:launcherInterrupt"
"$mod, K, global, caelestia:launcherInterrupt"
"$mod, H, global, caelestia:launcherInterrupt"
"$mod, J, global, caelestia:launcherInterrupt"
"$mod, L, global, caelestia:launcherInterrupt"
"$mod, S, global, caelestia:launcherInterrupt"
"$mod, G, global, caelestia:launcherInterrupt"
"$mod, T, global, caelestia:launcherInterrupt"
"$mod, D, global, caelestia:launcherInterrupt"
"$mod, Escape, global, caelestia:launcherInterrupt"
"$mod, PERIOD, global, caelestia:launcherInterrupt"
"$mod, E, global, caelestia:launcherInterrupt"
"$mod, V, global, caelestia:launcherInterrupt"
"$mod, W, global, caelestia:launcherInterrupt"
"$mod, Q, global, caelestia:launcherInterrupt"
"$mod, C, global, caelestia:launcherInterrupt"
"$mod, Return, global, caelestia:launcherInterrupt"
]
++ (
# Go to workspace group #
builtins.concatLists (builtins.genList (
i: let
ws = i + 1;
in [
"$mod, ${toString ws}, global, caelestia:launcherInterrupt"
]
)
9)
)
++ [
"$mod, 0, global, caelestia:launcherInterrupt"
];
bind =
[
# Misc
"Control+Alt, Delete, exec, caelestia:session"
"$mod ALT, A, global, caelestia:showall"
"$mod ALT, L, global, caelestia:lock"
# Restore lock - these are `bindl` in your original, but `exec` should be fine here.
# However, `bindl` is typically for a *release* event. If `caelestia shell -d` is a daemon,
# and `caelestia:lock` is a quickshell internal, you might need to reconsider.
# For direct translation, they go into `bindl` list.
# Media - handled by bindl below
# Apps
"$mod, Return, exec, app2unit -- kitty"
"$mod, W, exec, app2unit -- firefox"
"$mod, E, exec, app2unit -- thunar"
"$mod, Q, killactive"
"$mod ALT, E, exec, app2unit -- nemo"
"Control+Alt, Escape, exec, app2unit -- qps"
"Control+Alt, V, exec, app2unit -- pavucontrol"
# Utilities
"$mod SHIFT, S, global, caelestia:screenshotFreeze"
"$mod SHIFT ALT, S, global, caelestia:screenshot"
"$mod ALT, R, exec, caelestia record -s"
"Control+Alt, R, exec, caelestia record"
"$mod SHIFT ALT, R, exec, caelestia record -r"
"$mod SHIFT, C, exec, hyprpicker -a" # Colour picker
# Sleep
"$mod SHIFT, PRINT, exec, systemctl suspend-then-hibernate"
# Clipboard and emoji picker
"$mod, V, exec, pkill fuzzel || caelestia clipboard"
"$mod ALT, V, exec, pkill fuzzel || caelestia clipboard -d"
"$mod, Period, exec, pkill fuzzel || caelestia emoji -p"
# Testing
# This is a `bindl` (key release), so move it to `bindl` list below.
# Window actions
"$mod, H, movefocus, l"
"$mod, L, movefocus, r"
"$mod, K, movefocus, u"
"$mod, J, movefocus, d"
"$mod SHIFT, H, movewindow, l"
"$mod SHIFT, L, movewindow, r"
"$mod SHIFT, K, movewindow, u"
"$mod SHIFT, J, movewindow, d"
"$mod CTRL, Backslash, centerwindow, 1"
"$mod CTRL ALT, Backslash, resizeactive, exact 55% 70%"
"$mod CTRL ALT, Backslash, centerwindow, 1"
"$mod ALT, Backslash, exec, caelestia pip"
"$mod, P, pin"
"$mod, F, fullscreen, 0"
"$mod ALT, F, fullscreen, 1"
# Special workspace toggles
"Control+Shift, Escape, exec, caelestia toggle sysmon"
"$mod, Escape, exec, caelestia toggle sysmon"
"$mod, M, exec, caelestia toggle music"
"$mod, D, exec, caelestia toggle communication"
"$mod, R, exec, caelestia toggle todo"
"$mod, G, togglespecialworkspace, gaming"
"$mod SHIFT, G, movetoworkspace, special:gaming"
"$mod, T, exec, caelestia toggle steam"
# "$mod, T, togglespecialworkspace, special:steam"
# "$mod SHIFT, T, movetoworkspace, special:steam"
# Toggle special workspace
"$mod, S, exec, caelestia toggle specialws"
# Window groups
"$mod, Comma, togglegroup"
"$mod SHIFT, Comma, lockactivegroup, toggle"
# Go to workspace -1/+1 (mouse binds are `bind` for mouse-wheel)
"$mod, mouse_down, workspace, -1"
"$mod, mouse_up, workspace, +1"
# Move window to workspace -1/+1
"$mod ALT, mouse_down, movetoworkspace, -1"
"$mod ALT, mouse_up, movetoworkspace, +1"
# Move window to/from special workspace
"$mod CTRL SHIFT, up, movetoworkspace, special:special"
"$mod CTRL SHIFT, down, movetoworkspace, e+0"
"$mod ALT, S, movetoworkspace, special:special"
]
++ (
# Go to workspace #
let
wsaction = "~/.config/hypr/scripts/wsaction.fish";
in
builtins.concatLists (builtins.genList (
i: let
ws = i + 1;
in [
"$mod, ${toString ws}, exec, ${wsaction} workspace ${toString ws}"
]
)
9) # For workspaces 1-9
)
++ [
# "$mod, 0, exec, ${config.wayland.windowManager.hyprland.settings.workspaceRule."0".exec} workspace 10" # Workaround for workspace 0
# Re-adding `wsaction` since it's used here.
"$mod, 0, exec, ~/.config/hypr/scripts/wsaction.fish workspace 10"
]
++ (
# Go to workspace group #
let
wsaction = "~/.config/hypr/scripts/wsaction.fish";
in
builtins.concatLists (builtins.genList (
i: let
ws = i + 1;
in [
"Control+$mod, ${toString ws}, exec, ${wsaction} -g workspace ${toString ws}"
]
)
9)
)
++ [
"Control+$mod, 0, exec, ~/.config/hypr/scripts/wsaction.fish -g workspace 10"
]
++ (
# Move window to workspace #
let
wsaction = "~/.config/hypr/scripts/wsaction.fish";
in
builtins.concatLists (builtins.genList (
i: let
ws = i + 1;
in [
"$mod SHIFT, ${toString ws}, exec, ${wsaction} movetoworkspace ${toString ws}"
]
)
9)
)
++ [
"$mod SHIFT, 0, exec, ~/.config/hypr/scripts/wsaction.fish movetoworkspace 10"
]
++ (
# Move window to workspace group #
let
wsaction = "~/.config/hypr/scripts/wsaction.fish";
in
builtins.concatLists (builtins.genList (
i: let
ws = i + 1;
in [
"Control+$mod ALT, ${toString ws}, exec, ${wsaction} -g movetoworkspace ${toString ws}"
]
)
9)
)
++ [
"Control+$mod ALT, 0, exec, ~/.config/hypr/scripts/wsaction.fish -g movetoworkspace 10"
];
binde = [
"$mod, Minus, splitratio, -0.1"
"$mod, Equal, splitratio, 0.1"
"Control+$mod, left, workspace, -1"
"$mod, Page_Up, workspace, -1"
"Control+$mod, right, workspace, +1"
"$mod, Page_Down, workspace, +1"
"$mod ALT, Page_Up, movetoworkspace, -1"
"$mod ALT, Page_Down, movetoworkspace, +1"
"Control+$mod SHIFT, right, movetoworkspace, +1"
"Control+$mod SHIFT, left, movetoworkspace, -1"
"Alt, Tab, cyclenext, activewindow" # `binde` for cycle next
"Control+Alt, Tab, changegroupactive, f" # `binde` for change group active
];
bindm = [
"$mod, mouse:272, movewindow"
"$mod, Z, movewindow"
"$mod, mouse:273, resizewindow"
"$mod, X, resizewindow"
];
bindl = [
# Restore lock
"$mod ALT, L, exec, caelestia shell -d"
"$mod ALT, L, global, caelestia:lock" # This is a Hyprland `global` command, not an `exec`
# Brightness
", XF86MonBrightnessUp, global, caelestia:brightnessUp"
", XF86MonBrightnessDown, global, caelestia:brightnessDown"
# Media
"Control+$mod, Space, global, caelestia:mediaToggle"
", XF86AudioPlay, global, caelestia:mediaToggle"
", XF86AudioPause, global, caelestia:mediaToggle"
"Control+$mod, Equal, global, caelestia:mediaNext"
", XF86AudioNext, global, caelestia:mediaNext"
"Control+$mod, Minus, global, caelestia:mediaPrev"
", XF86AudioPrev, global, caelestia:mediaPrev"
", XF86AudioStop, global, caelestia:mediaStop"
# Utilities (screenshot is `bindl` in your original)
", Print, exec, caelestia screenshot" # Full screen capture > clipboard
# Volume
", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
"$mod SHIFT, M, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
# Clipboard and emoji picker (alternate paste is `bindl`)
"Control+Shift+Alt, V, exec, sleep 0.5s && ydotool type -d 1 \"$(cliphist list | head -1 | cliphist decode)\""
# Testing
"$mod ALT, f12, exec, notify-send -u low -i dialog-information-symbolic 'Test notification' \"Here's a really long message to test truncation and wrapping\\nYou can middle click or flick this notification to dismiss it!\" -a 'Shell' -A \"Test1=I got it!\" -A \"Test2=Another action\""
];
bindel = [
# Volume
", XF86AudioRaiseVolume, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ 0; wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 10%+"
", XF86AudioLowerVolume, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ 0; wpctl set-volume @DEFAULT_AUDIO_SINK@ 10%-"
];
bindr = [
# Kill/restart
"Control+$mod SHIFT, R, exec, qs -c caelestia kill"
"Control+$mod ALT, R, exec, qs -c caelestia kill; caelestia shell -d"
];
};
}

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