Author SHA1 Message Date
tomasr 6b0c997dad add telegram desktop 2026-10-10 09:59:01 +02:00
tomasr 21349e4585 add detexify bookmark 2026-10-04 18:14:52 +02:00
tomasr f23ec09369 setup fwupd 2026-09-21 12:00:44 +02:00
tomasr 7d5ae9fa2c remove pomodoro timer shortcut 2026-09-21 12:00:30 +02:00
tomasr 8f4117f3e7 fix path sync cs-119l 2026-09-13 10:43:34 +02:00
tomasr bd97ba4df7 Auto: cleanup-2026-09-13T08-29-34Z 2026-09-13 10:31:41 +02:00
tomasr bd678ae32d epfl switchDrive 2026-09-10 11:12:35 +02:00
tomasr 9879131aca fix fastfetch vscode 2026-09-06 11:33:03 +02:00
tomasr c2f733d4c9 setup for cs-119l 2026-09-06 11:17:23 +02:00
tomasr 44709a3b7c librewolf: add courseware bookmark 2026-09-05 14:14:36 +02:00
tomasr ce8c4f7d73 librewolf: add moodle bookmark 2026-09-05 14:14:36 +02:00
tomasr 2f2d3cd2ba remove duplciate exec nixpkgs-notifier 2026-08-30 21:07:33 +02:00
tomasr b738cbb8ef ös alias 2026-08-30 19:33:11 +02:00
tomasr fdb4d53ec0 reajuste lock timing 2026-08-30 17:03:57 +02:00
tomasr 1a29fda1f9 reworked lock time 2026-08-27 17:53:24 +02:00
tomasr b760904557 bitwarden-client updated electron 2026-08-23 13:38:14 +02:00
tomasr 28d56cf671 remove duplciate exec qtbatticon 2026-08-21 18:00:19 +02:00
tomasr 4db1f329f2 add instruction for nix-update 2026-08-18 08:04:15 +02:00
tomasr 7afe2cf7b6 nixUtils: add nix-update 2026-08-18 07:53:45 +02:00
tomasr 434e6ed31d moved out of kdrive for notes. Keep backup in there rsynced 2026-08-17 17:11:42 +02:00
tomasr f1e266331c remove battery scripts 2026-08-17 15:03:40 +02:00
tomasr f745a79af8 switch hardware utils to unstable 2026-08-16 18:02:44 +02:00
tomasr a99cb710b3 add watchecosystem to hardwareUtils 2026-08-16 18:01:39 +02:00
tomasr 9805986c10 git config 2026-08-16 08:32:23 +02:00
tomasr bc67f2b0e8 custom-vpn-picker: init 2026-08-15 20:07:34 +02:00
tomasr 7cd934c58c first setup epfl vpn 2026-08-15 20:07:34 +02:00
tomasr 6e3286419f fix notewrapper config parse error 2026-08-14 17:27:02 +02:00
tomasr c7781b7483 update notewrapper config 2026-08-14 17:06:23 +02:00
tomasr 682a5c13df remove old icloudpd 2026-08-14 11:51:36 +02:00
tomasr 82bd78bc73 rewrote performance mode into lua 2026-08-14 11:49:26 +02:00
tomasr 1071ce70d7 replace rm by trash-cli 2026-08-14 10:20:52 +02:00
tomasr 1ff4785399 rewrite README.md 2026-08-14 09:59:29 +02:00
tomasr ed9ccd4b11 hyprland: migrated from hyprlang to lua
- all hyprlandScripts were migrated to lua functions
- hyprland.nix just handles the host specific and replacing the
  placeholders from hyprland.lua
2026-08-14 09:34:43 +02:00
tomasr 13cdae0655 restore mullvad 2026-08-12 19:49:00 +02:00
tomasr d0b7183849 add dolphin plugin 2026-08-12 15:32:53 +02:00
tomasr cea0d0e3f8 add ark for dolphin 2026-08-12 15:24:56 +02:00
tomasr a4c66b4aff fix archivebox extesnion 2026-08-11 17:08:51 +02:00
tomasr 56a9bba86b remove temp mullvad 2026-08-11 17:08:51 +02:00
tomasr 1dab571e12 add archivebox extension 2026-08-11 17:08:51 +02:00
tomasr 93f7328a3b add browser bookmark noogle.dev 2026-08-11 17:08:51 +02:00
tomasr 0e222a9c50 rss reader 2026-08-04 19:50:42 +02:00
tomasr d1125d1571 fix calendar? 2026-08-04 11:30:00 +02:00
tomasr 550413c6b1 add kontact 2026-08-04 11:25:59 +02:00
tomasr b4537796a2 add KOrganizer 2026-08-04 11:21:26 +02:00
tomasr 4c0fbc5f0e librewolf: remove old bookmark 2026-07-30 21:28:41 +02:00
tomasr d0a9511ff7 first tmux config 2026-07-30 21:18:44 +02:00
tomasr 262476404e tmux: init config 2026-07-30 14:07:36 +02:00
tomasr 9f9906d423 replace rss reader 2026-07-30 14:07:36 +02:00
tomasr 0d616266ff fix pagers 2026-07-30 14:07:36 +02:00
tomasr 6b282b5344 somehow this file disappeared 2026-07-26 16:08:36 +02:00
tomasr 19fd3ec35d Auto: cleanup-2026-07-26T14-02-17Z 2026-07-26 16:06:33 +02:00
tomasr 324d54683c snapshot pre-cleanup-2026-07-26T14-02-17Z 2026-07-26 16:05:00 +02:00
tomasr 0030034418 snapshot pre-cleanup-2026-07-26T13-59-06Z 2026-07-26 16:05:00 +02:00
tomasr fb7be79e86 snapshot pre-cleanup-2026-07-26T13-57-11Z 2026-07-26 16:05:00 +02:00
tomasr 5db8135dd5 setup agenix and migrate from matrix-commander-rs to ntfy for phone notifications 2026-07-26 15:53:57 +02:00
tomasr 2107d23209 notewrapper: use kdrive directly 2026-07-24 17:40:39 +02:00
tomasr 77f4b0fc5f neovim: add hledger integration 2026-07-21 16:54:36 +02:00
tomasr 1642dc97ca neovim: add lean lsp and config 2026-07-21 16:54:36 +02:00
tomasr 2b59031896 hledger: init 2026-07-21 16:54:36 +02:00
tomasr d323e9f702 Merge branch 'main' into desktop 2026-06-24 16:39:59 -05:00
github-actions[bot] 25813d8ab5 Merge pull request #33 from tomasriveral/laptop
Weekly sync: laptop → main
2026-06-22 18:12:48 +00:00
tomasr 05ef065d75 snapshot pre-cleanup-2026-06-20T19-29-55Z 2026-06-20 21:29:55 +02:00
tomasr 2722840919 ollama: add desktop 2026-06-20 14:01:36 +02:00
tomasr 9e862337ca snapshot pre-autoupdate-2026-06-20T10-53-01Z 2026-06-20 12:53:01 +02:00
tomasr 876ec4ce21 icloud backup with kdrive 2026-06-18 19:47:29 +02:00
tomasr e2b7fd8a64 kdrive: setup sync with desktop 2026-06-18 17:00:20 +02:00
tomasr 752957818b gitBackup: add ngcp and ReSSPublica 2026-06-16 22:49:01 +02:00
tomasr 1c600dbf3c gitBackup: add ngcp and ReSSPublica 2026-06-16 22:45:12 +02:00
tomasr 4a648b7f7c Merge pull request #31 from tomasriveral/laptop 2026-06-15 18:45:41 +00:00
tomasr 67d21671c5 treesitter: add sparql 2026-06-14 17:29:16 +02:00
tomasr b8d8ef1aa8 treesitter: add sparql 2026-06-14 17:28:07 +02:00
tomasr 2d16f3893b Auto: cleanup-2026-06-14T15-26-03Z 2026-06-14 17:26:24 +02:00
tomasr 2a0c85275f snapshot pre-cleanup-2026-06-14T15-26-03Z 2026-06-14 17:26:03 +02:00
tomasr 23a9fdd4e8 snapshot pre-cleanup-2026-06-14T15-11-35Z 2026-06-14 17:11:35 +02:00
tomasr 246412ae4b custom-performance: entire rewrite
Now kills caelestia, change monitor hz and launches lightweight
alternative to calestia (waybar and swaync)
2026-06-14 11:19:36 +02:00
tomasr 88eb91c780 desktop: ported custom-performance 2026-06-14 11:14:48 +02:00
tomasr 3b73438d4f custom-performance: reset on startup 2026-06-14 11:11:05 +02:00
tomasr 8088f78f05 tlp:replace by powerprofilesdaemon 2026-06-14 11:08:03 +02:00
tomasr 3b89cf7b35 flake.lock: autoupdate-2026-06-14T09-01-11Z 2026-06-14 11:04:07 +02:00
tomasr 89eb25ca7d snapshot pre-autoupdate-2026-06-14T09-01-11Z 2026-06-14 11:01:11 +02:00
tomasr 3ea36fa6bb Merge pull request #30 from tomasriveral/main
desktop
2026-06-14 08:13:03 +00:00
tomasr 3d468572d5 Merge pull request #28 from tomasriveral/laptop
Weekly sync: laptop → main
2026-06-13 07:47:36 +00:00
github-actions[bot] d23c6979f9 Merge pull request #29 from tomasriveral/desktop
Weekly sync: desktop → main
2026-06-13 07:47:29 +00:00
tomasr 552d898680 librewolf: add rryan-tm logs bookmark 2026-06-13 09:45:16 +02:00
tomasr 5b7c43c8f9 librewolf: add r/Piracy megathread bookmark 2026-06-13 09:45:16 +02:00
tomasr f1e9c76d02 librewolf: add temp-mail.org bookmark 2026-06-13 09:45:16 +02:00
tomasr 37f76a4439 nixpkgs-master: follow unstable when unused 2026-06-13 09:37:43 +02:00
tomasr 143f699365 flake-utils: use flakehub cache 2026-06-13 09:29:18 +02:00
tomasr d20f0d87d5 flake-parts: use flakehub cache 2026-06-13 09:29:18 +02:00
github-actions[bot] 45639e2531 Merge pull request #27 from tomasriveral/desktop
Weekly sync: desktop → main
2026-06-12 14:38:11 +00:00
tomasr 2d2d4fd4a8 Merge pull request #26 from tomasriveral/laptop
Weekly sync: laptop → main
2026-06-12 14:32:48 +00:00
tomasr d49c7ba99e limine: rice 2026-06-12 15:58:28 +02:00
tomasr 29554e41ca nixUtils: add custom-trimmer 2026-06-12 15:49:23 +02:00
tomasr 2a318bdced hosts: forgot to use nixUtils module 2026-06-12 15:38:01 +02:00
tomasr 763bbbacd4 bootloader: limine 2026-06-12 15:10:49 +02:00
tomasr 99f1dd3ec8 bootloader: reunited desktop and laptop config 2026-06-12 15:07:17 +02:00
34 changed files with 1178 additions and 641 deletions

No files matched your search

+28 -43
View File
@@ -49,30 +49,20 @@ jobs:
exit 1
;;
esac
- name: Check for changes
run: |
git fetch origin main "${{ steps.branch.outputs.source }}"
HAS_CHANGES=true
if git diff --quiet \
"origin/main...origin/${{ steps.branch.outputs.source }}"; then
HAS_CHANGES=false
fi
- name: Check for existing PR
id: existing
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
if $HAS_CHANGES; then
PR_NUMBER=$(gh pr list \
--base main \
--head "${{ steps.branch.outputs.source }}" \
--state open \
--json number \
--jq '.[0].number // empty')
PR_NUMBER=$(gh pr list \
--base main \
--head "${{ steps.branch.outputs.source }}" \
--state open \
--json number \
--jq '.[0].number // empty')
echo "number=$PR_NUMBER" >> "$GITHUB_OUTPUT"
fi
echo "number=$PR_NUMBER" >> "$GITHUB_OUTPUT"
- name: Create PR
id: create
@@ -80,31 +70,28 @@ jobs:
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
if $HAS_CHANGES; then
gh pr create \
--base main \
--head "${{ steps.branch.outputs.source }}" \
--title "Weekly sync: ${{ steps.branch.outputs.source }} → main" \
--body "This pull request was created automatically by GitHub Actions."
gh pr create \
--base main \
--head "${{ steps.branch.outputs.source }}" \
--title "Weekly sync: ${{ steps.branch.outputs.source }} → main" \
--body "This pull request was created automatically by GitHub Actions."
PR_NUMBER=$(gh pr list \
--base main \
--head "${{ steps.branch.outputs.source }}" \
--state open \
--json number \
--jq '.[0].number')
PR_NUMBER=$(gh pr list \
--base main \
--head "${{ steps.branch.outputs.source }}" \
--state open \
--json number \
--jq '.[0].number')
echo "number=$PR_NUMBER" >> "$GITHUB_OUTPUT"
echo "number=$PR_NUMBER" >> "$GITHUB_OUTPUT"
fi
- name: Determine PR number
id: pr
run: |
if $HAS_CHANGES; then
if [ -n "${{ steps.existing.outputs.number }}" ]; then
echo "number=${{ steps.existing.outputs.number }}" >> "$GITHUB_OUTPUT"
else
echo "number=${{ steps.create.outputs.number }}" >> "$GITHUB_OUTPUT"
fi
if [ -n "${{ steps.existing.outputs.number }}" ]; then
echo "number=${{ steps.existing.outputs.number }}" >> "$GITHUB_OUTPUT"
else
echo "number=${{ steps.create.outputs.number }}" >> "$GITHUB_OUTPUT"
fi
- name: Enable auto-merge
@@ -112,9 +99,7 @@ jobs:
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
if $HAS_CHANGES; then
gh pr merge \
"${{ steps.pr.outputs.number }}" \
--auto \
--merge
fi
gh pr merge \
"${{ steps.pr.outputs.number }}" \
--auto \
--merge
+644 -186
View File
@@ -1,235 +1,693 @@
⚠️ Documentation outdated. I recently rewrote the entire config using the [dendritic pattern](https://github.com/mightyiam/dendritic/). One of these days, I will update the README.
# NixOS Configuration
![NixOS configuration](/assets/example.png)
## Installation Guide
This repository contains my personal NixOS configuration.
⚠️ **Important Notes**
Before applying this configuration on another system, make sure to:
- Update the `hostName` (in `configuration.nix` and `home.nix`).
The configuration uses the **[dendritic pattern](https://github.com/mightyiam/dendritic)**. Instead of keeping one large system configuration, functionality is split into smaller, composable modules. This makes it easier to reuse pieces of the configuration across hosts and to keep application, hardware, utility, and host-specific configuration separate.
Requirements: `git` installed. Then run:
```bash
cd
git clone https://github.com/Totorile1/nixos.git
cd nixos
sudo cp /etc/nixos/hardware-configuration.nix ./hosts/laptop/hardware-configuration
sudo nixos-rebuild switch --flake ~/nixos/#laptop
```
### Things That Don't Work Reliably and need manual setup
- Librewolf's extension settings
- Librewolf's bookmarks
- Thunderbird's email servers and settings and birdtray's settings[^1]
- Inkscape's settings
[^1]: You must change in Advanced settings Thunderbird command line to the result of `where thunderbird`.
See the [dendritic pattern repository](https://github.com/mightyiam/dendritic) for an explanation of the approach.
---
## Configuration Structure
## Installation
This configuration is primarily designed for my own machines, so some parts are host- and hardware-specific.
### Requirements
* NixOS
* Git
* Nix flakes enabled
Clone the repository:
```bash
cd ~
git clone https://github.com/tomasriveral/nixos.git
cd nixos
```
The available hosts are:
```text
hosts/
├── laptop.nix
└── desktop.nix
```
Build and switch to a host with:
```bash
sudo nixos-rebuild switch --flake ~/nixos#laptop
```
or:
```bash
sudo nixos-rebuild switch --flake ~/nixos#desktop
```
For a temporary test generation:
```bash
sudo nixos-rebuild test --flake ~/nixos#laptop
```
### Hardware configuration
Hardware-specific configuration is kept under:
```text
modules/hardware/
```
This includes:
* bootloader configuration
* disks and filesystems
* battery and power management
* Bluetooth
* NVIDIA
* performance settings
* udev rules
* hardware utilities
Declarative disk configuration is located in:
```text
modules/hardware/disko/
```
When deploying this configuration to a new machine, review the host and hardware modules rather than assuming the existing hardware configuration is appropriate.
---
# Repository Structure
```text
nixos/
├── assets/ # Images, icons, wallpapers, sounds
├── hosts/laptop/ # Host-specific NixOS config
├── assets/ # Wallpapers, images, sounds and other static assets
├── docs/ # Additional documentation
│ └── printing.md
│
├── modules/
│ ├── home-manager/ # User-level configurations (apps, shell, WM, plugins)
│ ├── nixos/ # System-level modules (daemons, services, udev, ly)
│ ├── qt/ # qt modules (qtbatticon)
│ └── scripts/ # Custom scripts called from keybinds or tools
│ ├── applications/ # Application and desktop application configuration
│ ├── hardware/ # Hardware, boot, disk, battery, GPU and device configuration
│ ├── other/ # Fonts, cursor, printer, desktop entries, user configuration, etc.
│ ├── packages/ # Custom packages and scripts
│ └── utilities/ # Reusable utilities and supporting services
│
├── hosts/
│ ├── laptop.nix # Laptop-specific configuration
│ └── desktop.nix # Desktop-specific configuration
│
├── other/
│ ├── kblayouts/ # Framework 16 RGB macropad layout
│ └── quickshell/ # QML configuration for topbar, notifications, screenshot, etc.
│ ├── hyprland/ # Hyprland configuration
│ │ ├── hyprland.conf # Previous hyprlang configuration
│ │ ├── hyprland.lua # Current Lua configuration
│ │ └── README.md
│ ├── kblayouts/ # Keyboard and Framework macropad layouts
│ ├── mullvad/ # Mullvad configuration
│ └── quickshell/ # Quickshell configuration
│
├── secrets/ # agenix-encrypted secrets
├── flake.nix
├── flake.lock
└── README.md
```
> other/quickshell is the older quickshell configuration.
---
# Modules
## Applications
`modules/applications/` contains configuration for applications and desktop components.
Some examples:
* `anki.nix`
* `browser.nix`
* `caelestia.nix`
* `git.nix`
* `gtk.nix`
* `hypridle.nix`
* `hyprland.nix`
* `kitty.nix`
* `neovim.nix`
* `obsidian.nix`
* `rofi.nix`
* `thunderbird.nix`
* `waybar.nix`
* `wlogout.nix`
* `zsh.nix`
## Hardware
`modules/hardware/` contains machine-level configuration such as:
* battery and power management
* Bluetooth
* bootloader
* disks
* hardware detection/configuration
* NVIDIA
* performance tuning
* udev rules
## Other
`modules/other/` contains configuration that does not fit directly into applications or hardware, such as:
* cursors
* desktop entries
* fonts
* I/O configuration
* printers
* user configuration
## Packages
`modules/packages/` contains custom packages and scripts used throughout the configuration.
Examples include:
* `custom-bottom`
* `custom-browserprofiles`
* `custom-colorpicker`
* `custom-cowsay`
* `custom-syllabes`
* `custom-tomato`
* `custom-weather`
* manually derived packages
Many of these packages are called directly by Hyprland keybindings.
## Utilities
`modules/utilities/` contains reusable system utilities and services, including:
* agenix
* audio/media configuration
* automatic cleanup
* automatic updates
* communication and notifications
* development tools
* documentation tools
* Git backup
* LaTeX
* networking
* Nix utilities
* office tools
* Ollama
* RSS tools
---
## Applications & Tools
# Hosts
### Shell & Terminal
- [`zsh`](https://www.zsh.org/) with [`oh-my-zsh`](https://ohmyz.sh/) for shell customization
- [`kitty`](https://sw.kovidgoyal.net/kitty/) terminal
Host-specific configuration is kept under:
### Window Management
- [`hyprland`](https://github.com/hyprwm/Hyprland) (tiling window manager)
- [`ly`](https://github.com/fairyglade/ly) login manager
- [`swaylock`](https://github.com/swaywm/swaylock) screen locking
- [`hypridle`](https://github.com/hyprwm/Hyprland/wiki/HyprIdle) for idle mode
```text
hosts/
```
### Browsing & Productivity
- [`librewolf`](https://librewolf-community.gitlab.io/) browser
- Extensions: [AdNauseam](https://github.com/dhowe/AdNauseam), [Enhancer for YouTube](https://github.com/ParticleCore/yt-enhancer), [TrackMeNot](https://www.tornhq.com/tmn/), [SponsorBlock](https://sponsor.ajay.app/)
- Privacy options mostly enabled; some disabled to avoid conflicts with AdNauseam
- [`thunderbird`](https://www.thunderbird.net/) email client
- [`obsidian`](https://obsidian.md/) notes and knowledge management
- [`libreoffice`](https://www.libreoffice.org/) full-featured office suite
Currently:
### Utilities
- [`cliphist`](https://github.com/skywind3000/cliphist) clipboard manager
- [`zoxide`](https://github.com/ajeetdsouza/zoxide) faster directory navigation
- [`fastfetch`](https://github.com/LinusDierheimer/fastfetch) system info
- [`gnome-calculator`](https://wiki.gnome.org/Apps/Calculator)
- [`gnome-characters`](https://wiki.gnome.org/Apps/Characters)
- [`gnome-disk-utility`](https://wiki.gnome.org/Apps/Disks)
- [`gnome-font-viewer`](https://wiki.gnome.org/Apps/FontViewer)
- [`nautilus`](https://wiki.gnome.org/Apps/Nautilus) file manager
- [`okular`](https://okular.kde.org/) document & image viewer
- [`vlc`](https://www.videolan.org/vlc/) media player
- [`krita`](https://krita.org/) and [`inkscape`](https://inkscape.org/) for image editing and drawing
- [`anki`](https://apps.ankiweb.net/) flashcards for learning
- [`texlive`](https://www.tug.org/texlive/) LaTeX distribution
- [`biber`](https://ctan.org/pkg/biber) bibliography for LaTeX
- [`eza`](https://github.com/eza-community/eza) replacement for `ls`
```text
hosts/
├── laptop.nix
└── desktop.nix
```
### System & Hardware
- [`bottom`](https://github.com/ClementTsang/bottom) system monitor
- [`tomato-c`](https://github.com/erikras/tomato-c) Pomodoro timer
- [`framework-tool-tui`](https://github.com/romanl/fx16-tui) Framework 16 laptop settings
**Daemons:** `upower`, `pipewire`, `pulseaudio`, `brightnessctl`, `playerctl`, `blueman`, `udiskie`, `networkmanager-applet`, `swww` wallpaper daemon
### Screenshots, Notifications, Bar and much more!
- [caelestia-shell](https://github.com/caelestia-dots/shell)
The host files combine the nixos and home-manager modules needed for each machine.
---
## Keybindings
# Hyprland
### Window Management
| Key | Action |
|-----|--------|
| `$mod + W` | Toggle floating |
| `$mod + G` | Toggle group |
| `Alt + Return` | Fullscreen |
| `$mod + Arrow keys` / `Alt + Tab` | Move focus |
| `$mod + Shift + Ctrl + Arrow keys` | Move window |
| `$mod + Shift + Arrow keys` | Resize window |
Hyprland is configured using its **Lua configuration API**.
### Workspaces
| Key | Action |
|-----|--------|
| `$mod + 1..0` | Switch workspace |
| `$mod + Shift + 1..0` | Move window to workspace |
| `$mod + Ctrl + Arrow keys` | Cycle workspaces |
| `$mod + Mouse wheel` | Scroll workspace |
| `$mod + S` / `Alt + $mod + S` | Special workspace |
The current configuration is:
### Layout
| Key | Action |
|-----|--------|
| `$mod + A` | Scroll layout column left |
| `$mod + D` | Scroll layout column right |
```text
other/hyprland/hyprland.lua
```
### Applications
| Key | Action |
|-----|--------|
| `$mod + T` | Terminal |
| `$mod + E` | File manager |
| `$mod + F` | Browser |
| `$mod + N` | Notes |
| `$mod + Shift + A` | App launcher |
| `$mod + Alt + A` | Toggle sidebar |
| `$mod + Q` | Kill apps (Steam/Pomodoro to special workspace) |
| `$mod + L` | Lock screen |
| `$mod + Shift + S` | Screenshot a window|
| `F11` | Screenshot the whole screen|
The previous hyprlang configuration remains here:
### Multimedia & System
| Key | Action |
|-----|--------|
| F1 | Mute audio |
| F2 / F3 | Volume down / up |
| F4 / F5 / F6 | Media prev / play / next |
| F7 / F8 | Brightness down / up |
| `$mod + mouse` | Move / resize window |
```text
other/hyprland/hyprland.conf
```
Host specific hyprland settings are generated by `/modules/applications/hyprland.nix` as `host.lua` which is imported by `hyprland.lua`.
## Workspace layouts
The current layout configuration is:
| Workspace | Layout |
| --------- | ----------- |
| `1` | `master` |
| `2` | `scrolling` 0.45 width |
| `other` | `dwindle` |
## Wallpapers
The wallpapers are stored in:
```text
assets/
├── wallpaper1.jpg
├── wallpaper2.jpg
├── wallpaper3.jpg
├── wallpaper4.jpg
└── wallpaper5.jpg
```
The active wallpaper is selected based on the workspace:
| Workspace | Wallpaper |
| --------- | ---------------- |
| `1` | `wallpaper1.jpg` |
| `2` | `wallpaper2.jpg` |
| `3` | `wallpaper3.jpg` |
| `4` | `wallpaper4.jpg` |
| `5` | `wallpaper5.jpg` |
| `6` | `wallpaper1.jpg` |
| `7` | `wallpaper2.jpg` |
| `8` | `wallpaper3.jpg` |
| `9` | `wallpaper4.jpg` |
| `10` | `wallpaper5.jpg` |
The Lua configuration contains placeholders for these paths, which are replaced by Nix during configuration generation.
The five wallpapers are paintings from Thomas Cole's *The Course of Empire* series.
---
### Framework 16 RGB Macropad
# Hyprland Keybindings
The **Framework 16 RGB macropad** is a 4×6 programmable key grid. Each key triggers one of the keybindings above via a macro.
`SUPER` is the primary modifier.
If you **don’t have the physical macropad**, the table below shows which keybinding each macro triggers so you can run it from the keyboard instead:
## Window management
| Macropad Key | Linked Action (Hyprland keybinding) |
| ------------ | -------------------------------------------- |
| Row 1, Col 1 | Kill all apps except focused (`Ctrl+$mod+6`) |
| Row 1, Col 2 | Performance mode (`Ctrl+Alt+7`) |
| Row 1, Col 3 | Do not disturb (`Ctrl+$mod+4` |
| Row 1, Col 4 | Notification center (`Ctrl+Alt+1`) |
| Row 2, Col 1 | Pulseaudio control (`Ctrl+$mod+3`) |
| Row 2, Col 2 | Change audio output (`Ctrl+Alt+Shift+0`) |
| Row 2, Col 3 | Special characters (`Ctrl+$mod+3`) |
| Row 2, Col 4 | Color picker (`Ctrl+Alt+8`) |
| Row 3, Col 1 | Pomodoro timer (`Ctrl+Alt+0`) |
| Row 4, Col 1 | Launch Anki (`Ctrl+Alt+9`) |
| Key | Action |
| ----------------------------------- | ----------------- |
| `SUPER + W` | Toggle floating |
| `SUPER + G` | Toggle group |
| `ALT + Return` | Toggle fullscreen |
| `SUPER + Arrow keys` | Move focus |
| `SUPER + CTRL + A` | Swap column left |
| `SUPER + CTRL + D` | Swap column right |
| `SUPER + SHIFT + CTRL + Arrow keys` | Move window |
| `SUPER + SHIFT + Arrow keys` | Resize window |
| `SUPER + Z` | Drag window |
| `SUPER + X` | Resize window |
| `SUPER + mouse:272` | Drag window |
| `SUPER + mouse:273` | Resize window |
> Positions are labeled as `[row, column]` starting from top-left `[1,1]`.
> Each macro calls a script or application from this configuration.
## Workspaces
### Neovim keybinds
| Key | Action |
| ---------------------- | --------------------------------------- |
| `SUPER + 1..9` | Focus workspace 1–9 |
| `SUPER + 0` | Focus workspace 10 |
| `SUPER + SHIFT + 1..9` | Move window to workspace 1–9 |
| `SUPER + SHIFT + 0` | Move window to workspace 10 |
| `SUPER + CTRL + Right` | Move to relative workspace `+1` |
| `SUPER + CTRL + Left` | Move to relative workspace `-1` |
| `SUPER + CTRL + Down` | Focus an empty workspace |
| `SUPER + mouse_down` | Next workspace |
| `SUPER + mouse_up` | Previous workspace |
| `SUPER + S` | Toggle special workspace |
| `SUPER + ALT + S` | Move active window to special workspace |
| Key | Action |
|-------------|-----------------------|
| `<Space>` | `<leader>` |
| `§` | Cheatsheet |
| `<leader>1` | Open fold |
| `<leader>2` | Close fold |
| `<leader>e4` | Previous error |
| `<leader>e5` | Next error |
| `<leader>e1` | See error message |
| `<leader>e3` | See list of errors |
| `<leader>e2` | Show correction |
| `<leader>e<Tab>` | Stop grammar LSP |
| `<leader>f1` | Telescope files |
| `<leader>f2` | Telescope grep |
| `<leader>f3` | Telescope buffers |
| `<leader>f4` | Telescope help |
| `<leader>g1` | Hover documentation |
| `<leader>g2` | Go to definition |
| `<leader>g3` | Go to declaration |
| `<leader>g4` | Go to implementation |
| `<leader>g5` | Show references |
| `<leader><leader>` | Launch runner (terminal) |
| `<leader>r1` | Run fugit |
| `t` | Count syllabes (french) |
## Scrolling layout
All moving macros with `<Space>`, `g`, and the recording with `q` are disabled.
---
| Key | Action |
| ----------- | --------------------------- |
| `SUPER + A` | Move scrolling layout left |
| `SUPER + D` | Move scrolling layout right |
## Aliases
## Custom window management
| Alias | Command |
| ------ | ----------------------------------------------------------------- |
| `snrt` | `git add -A && sudo nixos-rebuild test --flake ~/nixos/#laptop` |
| `snrs` | `git add -A && sudo nixos-rebuild switch --flake ~/nixos/#laptop` |
### `SUPER + Q`
A custom Lua function checks the active window.
* Steam → move it to the special workspace
* `custom-pomodoro` → move it to the special workspace
* anything else → close the window
### `SUPER + CTRL + 6`
Closes every window on the current workspace except the currently focused window.
---
## Useful Information
- If you have an error similar to `Failed to register with host portal QDBusError("org.freedesktop.portal.Error.Failed", "Could not register app ID: App info not found for 'org.quickshell'")` see `./modules/other/desktopEntries.nix`
- `ls` is an alias for `eza`. If you want more info than the normal `ls` run `eza`, `l`, `ll` or `la`
- `qtbatticon` is a custom battery icon tray, because `cbatticon` and `batticonplus` did not work. Click on it to get more info about the battery.
- `man` and `manix` use `fzf` for fuzzy search of pages.
- `pkgs-unstable` can be used for unstable nixpkgs packages.
- Nix garbage collection runs weekly, deleting generations older than 7 days.
- Non-free packages (e.g., Obsidian) are allowed.
- `neovim` plugins configured in `./modules/home-manager/neovim.nix`
- `oh-my-zsh` plugins configured in `./modules/home-manager/oh-my-zsh.nix`
- `ripgrep` default flags: `-S -. -p -n`
- Wallpapers change per workspace (5 paintings from Thomas Cole’s *The Course of Empire*).
- LibreWolf search engines: `@q` (Quant), `@hm` (Home-manager), `@np` (nixpkgs), `@nw` (Nixwiki), `@map` (OpenStreetMap).
- `ccat` colors `cat` output when not redirected; disables coloring if output is redirected (e.g., `>>`) to avoid breaking pipelines.
- Anki addons: `./modules/nixos/anki.nix`
- TLP config: `./modules/nixos/battery.nix`
- Framework 16 RGB macropad layout: `./other/kblayouts/framework_laptop_16_rgb_macropad.layout.json`
# Applications
| Key | Action |
| ------------------- | ------------------------ |
| `SUPER + T` | Kitty |
| `SUPER + E` | Dolphin |
| `SUPER + F` | Browser profile selector |
| `SUPER + N` | Obsidian vault selector |
| `SUPER + SHIFT + A` | Application launcher |
| `SUPER + Backspace` | Session drawer |
| `CTRL + ALT + W` | Sidebar |
| `SUPER + L` | Lock screen |
| `SUPER + SHIFT + S` | Screenshot picker |
| `F11` | Screenshot |
| `SUPER + V` | Clipboard history
Additional bindings launch or control:
* Hyprland keybinding viewer
* Pavucontrol
* GNOME Characters
* Anki
* custom performance mode
* custom tomato/pomodoro
* custom bottom launcher
* custom audio-output selector
* Caelestia shell
---
# Multimedia and Hardware Keys
| Key | Action |
| ---- | -------------------- |
| `F1` | Mute audio |
| `F2` | Volume down |
| `F3` | Volume up |
| `F4` | Previous media track |
| `F5` | Play/pause |
| `F6` | Next media track |
| `F7` | Brightness down |
| `F8` | Brightness up |
Volume and brightness bindings repeat while held.
---
# Gestures
The current Hyprland configuration includes:
| Gesture | Action |
| ----------------------- | ------------- |
| Three-finger horizontal | `scroll_move` (only for scrolling layout) |
| Two-finger pinch | Cursor zoom |
---
# Framework 16 RGB Macropad
The Framework 16 RGB Macropad layout is stored at:
```text
other/kblayouts/framework_laptop_16_rgb_macropad.layout.json
```
The macropad is used as a collection of physical shortcuts for actions that already have Hyprland keybindings.
The macros in the layout generate combinations involving `CTRL`, `ALT`, `SUPER`, and `SHIFT`. The important part is the **logical mapping** between each physical macropad position and its Hyprland shortcut.
> Positions are documented as `[row, column]`, starting from the top-left.
| Macropad Key | Linked Action |
| ------------ | ------------------------------------------------- |
| Row 1, Col 1 | Kill all apps except focused (`CTRL + SUPER + 6`) |
| Row 1, Col 2 | Performance mode (`CTRL + ALT + 7`) |
| Row 1, Col 3 | Do not disturb (`CTRL + SUPER + 4`) |
| Row 1, Col 4 | Notification center (`CTRL + ALT + 1`) |
| Row 2, Col 1 | PulseAudio control (`CTRL + SUPER + 3`) |
| Row 2, Col 2 | Change audio output (`CTRL + ALT + SHIFT + 0`) |
| Row 2, Col 3 | Special characters (`CTRL + SUPER + 5`) |
| Row 2, Col 4 | Color picker (`CTRL + ALT + 8`) |
| Row 4, Col 1 | Launch Anki (`CTRL + ALT + 9`) |
The physical layout file contains additional transparent/unused positions, but the bindings above are the active shortcuts documented for the macropad.
---
# Neovim
Neovim is configured in:
```text
modules/applications/neovim.nix
```
The configuration includes LSP support, Telescope, Git tooling, grammar tooling and custom commands.
`<Space>` is the leader key.
| Key | Action |
| ------------------ | ---------------------- |
| `§` | Cheatsheet |
| `<leader>1` | Open fold |
| `<leader>2` | Close fold |
| `<leader>e1` | Show error message |
| `<leader>e2` | Show correction |
| `<leader>e3` | Show diagnostics |
| `<leader>e4` | Previous error |
| `<leader>e5` | Next error |
| `<leader>e<Tab>` | Stop grammar LSP |
| `<leader>f1` | Telescope files |
| `<leader>f2` | Telescope grep |
| `<leader>f3` | Telescope buffers |
| `<leader>f4` | Telescope help |
| `<leader>g1` | Hover documentation |
| `<leader>g2` | Go to definition |
| `<leader>g3` | Go to declaration |
| `<leader>g4` | Go to implementation |
| `<leader>g5` | Show references |
| `<leader><leader>` | Launch runner |
| `<leader>r1` | Run Fugitive |
| `t` | Count French syllables |
Some movement macros involving `<Space>`, `g`, and recording with `q` are intentionally disabled.
---
# Shell
The shell is based on **zsh**.
Relevant configuration is primarily found in:
```text
modules/applications/zsh.nix
```
and related application modules.
`oh-my-zsh` is used for shell customization.
`deja` is used for shell completion.
Useful command-line tools include:
* `eza`
* `zoxide`
* `ripgrep`
* `fzf`
* `fastfetch`
* `man`
* `manix`
`ls` is replaced by `eza`.
Common aliases include:
```text
l
ll
la
```
---
# Git and Nix Workflow
The configuration includes tooling for Git, Nix development, backups and cherry-picking.
Relevant modules include:
```text
modules/utilities/gitBackup.nix
modules/utilities/nixGitCherryPicker.nix
modules/utilities/nixUtils.nix
```
Two useful rebuild aliases are:
```bash
snrt
```
which runs:
```bash
git add -A && sudo nixos-rebuild test --flake ~/nixos/#laptop
```
and:
```bash
snrs
```
which runs:
```bash
git add -A && sudo nixos-rebuild switch --flake ~/nixos/#laptop
```
These aliases currently target the laptop host.
---
# Secrets
Secrets are managed using **agenix**.
The relevant files are:
```text
secrets/
├── ntfy.age
└── secrets.nix
```
Encrypted secrets should remain encrypted in Git. Decrypted secret contents and private keys should not be committed.
* To edit a secret use `agenix -e <secret_file>.age -i /etc/ssh/ssh_host_ed25519_key`.
* To decrypt a secret use `sudo agenix -d <secret_file>.age -i /etc/ssh/ssh_host_ed25519_key`.
---
# Quickshell
The legacy Quickshell configuration lives under:
```text
other/quickshell/
```
---
# Custom Packages
Custom scripts and packages are located in:
```text
modules/packages/
```
Examples include:
* `custom-colorpicker`
* `custom-cowsay`
* `custom-syllabes`
* `custom-tomato`
* `custom-weather`
* `vivifyManuallyDerived`
* `dejaManuallyDerived`
Or imported in flake.nix from other repos.
Examples include:
* `custom-browserprofiles` Fzf selector between different LibreWolf profiles, private window and the tor browser.
* `custom-syllabes` A syllab counter when I write french poetry. (note: algorithmic syllab counting is pretty difficult in french, so this small scripts makes a lot of errors)
* `ngcp` (see the [GitHub repo](https://github.com/tomasriveral/Nix-Git-Cherry-Picker)) is what i use to manage between my `laptop` and `desktop` git branch.
* `nixpkgs-notifier` (see the [GitHub repo](https://github.com/tomasriveral/nixpkgs-notifier)) notifies my when PRs get merged to nixos-unstable.
---
# Applications and Desktop Environment
The configuration currently contains modules for applications and components such as:
* Hyprland
* Kitty
* Dolphin
* LibreWolf/browser tooling
* Thunderbird
* Obsidian
* Neovim
* Caelestia
* Quickshell
* Hypridle
* Rofi
* Waybar
* Wlogout
* Git
* SSH
* Mullvad
* Bluetooth
* audio/media tools
* office tools
* LaTeX
* development tools
* Ollama
The exact set of enabled software depends on the host configuration and imported modules.
---
# Things That Still Require Manual Setup
Not everything used by the desktop environment is completely declarative.
Some application state may need to be configured manually after installation:
* LibreWolf extension settings
* LibreWolf bookmarks
* Thunderbird account/server settings
* Birdtray settings
* Inkscape settings
* other application-specific user data
* git configuration
---
# Useful Information
* Wallpapers are five paintings from Thomas Cole's *The Course of Empire*.
* `qtbatticon` is a custom battery tray indicator.
* `man` and `manix` use `fzf` for fuzzy searching.
* `pkgs-unstable` is available for packages that need to come from unstable nixpkgs.
* `pkgs-master` can be enabled in flake.nix. Attention, all the packages will need to be compiled on the machine.
* `pkgs-local` can be enable in flake.nix. Attention, all the packages will need to be compiled on the machine.
* Automatic Nix garbage collection removes old generations according to the configured cleanup policy.
* Non-free packages are enabled where required.
* Neovim plugins are configured in `modules/applications/neovim.nix`.
* `oh-my-zsh` configuration is kept with the shell/application modules.
* The Framework 16 RGB Macropad layout is stored in `other/kblayouts/framework_laptop_16_rgb_macropad.layout.json`.
* Anki-related configuration is distributed across the relevant application/package modules.
* Battery and power-related configuration is under `modules/hardware/`.
* Custom commands used by Hyprland are generally provided by `modules/packages/`.
---
# Documentation
Additional documentation is kept close to the corresponding configuration where practical.
Important documentation files include:
```text
docs/printing.md
modules/applications/README.md
modules/hardware/disko/README.md
modules/packages/README.md
modules/utilities/README.md
other/hyprland/README.md
other/mullvad/README.md
other/quickshell/README.md
```
Generated
+43 -106
View File
@@ -1,30 +1,5 @@
{
"nodes": {
"agenix": {
"inputs": {
"darwin": "darwin",
"home-manager": [
"home-manager"
],
"nixpkgs": [
"nixpkgs"
],
"systems": "systems"
},
"locked": {
"lastModified": 1770165109,
"narHash": "sha256-9VnK6Oqai65puVJ4WYtCTvlJeXxMzAp/69HhQuTdl/I=",
"owner": "ryantm",
"repo": "agenix",
"rev": "b027ee29d959fda4b60b57566d64c98a202e0feb",
"type": "github"
},
"original": {
"owner": "ryantm",
"repo": "agenix",
"type": "github"
}
},
"caelestia-cli": {
"inputs": {
"caelestia-shell": [
@@ -36,11 +11,11 @@
]
},
"locked": {
"lastModified": 1786071436,
"narHash": "sha256-/CQJ781dRGWWUMrJ34vIj1PQnNEEWgnEEuod0r5LKGk=",
"lastModified": 1781239472,
"narHash": "sha256-WFL8jZMWNH1tx3UwaJ9aa9NN25uOEJ9mbKPRNQJY/xM=",
"owner": "caelestia-dots",
"repo": "cli",
"rev": "751fbc555a83faba5dd589270d14eeb22afab174",
"rev": "3f3229aed4f36752a02fd870fd6cad94bd76555f",
"type": "github"
},
"original": {
@@ -59,11 +34,11 @@
"quickshell": "quickshell"
},
"locked": {
"lastModified": 1786238888,
"narHash": "sha256-pnO0u0UUYwkr72pJR5Giu93LZfU/fhTKJZYa1xeM7Po=",
"lastModified": 1781408632,
"narHash": "sha256-kYVf3Jye4UhyBrtubYcSrmVyFv9uqOY2JvjmElFiZHE=",
"owner": "caelestia-dots",
"repo": "shell",
"rev": "817a220e8e87c4df9f3681033a0d8a8054cdaa30",
"rev": "f86c359cd90530bacc800e94e35ffbebecd3f58f",
"type": "github"
},
"original": {
@@ -72,28 +47,6 @@
"type": "github"
}
},
"darwin": {
"inputs": {
"nixpkgs": [
"agenix",
"nixpkgs"
]
},
"locked": {
"lastModified": 1744478979,
"narHash": "sha256-dyN+teG9G82G+m+PX/aSAagkC+vUv0SgUw3XkPhQodQ=",
"owner": "lnl7",
"repo": "nix-darwin",
"rev": "43975d782b418ebf4969e9ccba82466728c2851b",
"type": "github"
},
"original": {
"owner": "lnl7",
"ref": "master",
"repo": "nix-darwin",
"type": "github"
}
},
"disko": {
"inputs": {
"nixpkgs": [
@@ -119,12 +72,12 @@
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1785627969,
"narHash": "sha256-4dtXQk/NMePegK/nWp5NSeuZKLATItOq61lpEvmXqGw=",
"rev": "427bf4bd9435fdf21321c8cc628c24efc14c0f7a",
"revCount": 483,
"lastModified": 1778716662,
"narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
"rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
"revCount": 475,
"type": "tarball",
"url": "https://api.flakehub.com/f/pinned/hercules-ci/flake-parts/0.1.483%2Brev-427bf4bd9435fdf21321c8cc628c24efc14c0f7a/019fc124-5bcc-79d1-a1e4-306df724dc0a/source.tar.gz"
"url": "https://api.flakehub.com/f/pinned/hercules-ci/flake-parts/0.1.475%2Brev-f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb/019e2533-0324-7e90-93eb-29b02e1a61cd/source.tar.gz"
},
"original": {
"type": "tarball",
@@ -133,7 +86,7 @@
},
"flake-utils": {
"inputs": {
"systems": "systems_2"
"systems": "systems"
},
"locked": {
"lastModified": 1731533236,
@@ -155,11 +108,11 @@
]
},
"locked": {
"lastModified": 1785119570,
"narHash": "sha256-Rgs2xKnGLFWQscxUaXX07oyZeuMDOHEbqDOsgliLFGM=",
"lastModified": 1781319724,
"narHash": "sha256-ZGuxexEMo4Xv28KJ0dX/m/PHN4oZIOnxHZpNTyrvx4M=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "d4fd24667c8cbef124bb70a20380cab75ec8474d",
"rev": "8355f0a16b2dbb06a97959a918af5b239bbe05ae",
"type": "github"
},
"original": {
@@ -171,11 +124,11 @@
},
"import-tree": {
"locked": {
"lastModified": 1784254960,
"narHash": "sha256-iI88R3wHz8wTKQb5orvpc51L/Xr64AJyxid/0MKa/b8=",
"lastModified": 1778781969,
"narHash": "sha256-Jjuz5CmSkur8KvLDoGa+vylEp+RkQtv4mt/qcMznpH0=",
"owner": "vic",
"repo": "import-tree",
"rev": "4ebb10ae17d5f1ad366e7aef5b92cb8eecf24f69",
"rev": "d321337efd0f23a9eb14a42adb7b2c29313ab274",
"type": "github"
},
"original": {
@@ -211,11 +164,11 @@
]
},
"locked": {
"lastModified": 1786462419,
"narHash": "sha256-A7Q3UIyzDg1O54E0W6HOQIzvsVJq/rMuelJR+ELLRvI=",
"lastModified": 1781373243,
"narHash": "sha256-CpZ5FEU1BtW6K4FywtCCE2wJs6R/Ifps3etRDh8NJ9w=",
"owner": "tomasriveral",
"repo": "nix-git-cherry-picker",
"rev": "aec69257dc9b68d875333ec9f4a7b310d878abd1",
"rev": "9865dba535620831ae7cab395bf404f8f464df0e",
"type": "github"
},
"original": {
@@ -226,11 +179,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1786535285,
"narHash": "sha256-rG5HKMAgAhMgydvKGtco6rqTxRq4EDZQCx9USLvVqYw=",
"lastModified": 1781216227,
"narHash": "sha256-9mUW6gNwoN2SWc/l0fW4svPNOulXLl8ijqKyeSOGgJE=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "9f78f44a87948854445dae0b6bf82b2e87e4efb5",
"rev": "a0374025a863d007d98e3297f6aa46cc3141c2f0",
"type": "github"
},
"original": {
@@ -242,11 +195,11 @@
},
"nixpkgs-lib": {
"locked": {
"lastModified": 1785031560,
"narHash": "sha256-OmshNvn2vupOFpYinLUu+1Dnpu4n7Q5N3ggGVNHpkUI=",
"lastModified": 1777168982,
"narHash": "sha256-GOkGPcboWE9BmGCRMLX3worL4EMnsnG8MyKmXNeYuhQ=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
"rev": "0e79af5e3d4dcfcd676ab5ba3f95d2e3352e078c",
"rev": "f5901329dade4a6ea039af1433fb087bd9c1fe14",
"type": "github"
},
"original": {
@@ -265,11 +218,11 @@
]
},
"locked": {
"lastModified": 1785077063,
"narHash": "sha256-rJxX9Mq16TOiIlf+nNR4SaLsWf1yII8xsQpJUNio3Yg=",
"lastModified": 1781273662,
"narHash": "sha256-50dd7Cs1mUHq1srw7UojdzCYOB4TfrIXMv7XHHPU9zw=",
"owner": "tomasriveral",
"repo": "nixpkgs-notifier",
"rev": "39a89ffbdc49cc9ab6f67bc4be7ea2f7d3e2b38c",
"rev": "12183f26e8b196d9906f82dc05f9672793c61038",
"type": "github"
},
"original": {
@@ -280,11 +233,11 @@
},
"nixpkgs-unstable": {
"locked": {
"lastModified": 1786534138,
"narHash": "sha256-fBJMdnKUTUDtfi/BYLr71HLaC9dG382arxLF2Egg2uo=",
"lastModified": 1781328464,
"narHash": "sha256-j9uBlHI0eJ9zWU9IlF6SlBBPdeJu30hcvar31IRKHpw=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "044bfe75bfe4c7bbe043dc17b5e42ea823b84a09",
"rev": "5a722a7155bfc9fbe657f28d26b71860d95324bc",
"type": "github"
},
"original": {
@@ -304,11 +257,11 @@
]
},
"locked": {
"lastModified": 1786346006,
"narHash": "sha256-PDM9fB1zBhqVVE75WxRM7vIo3QhL2LGKKdd6N+hTGlg=",
"lastModified": 1780908812,
"narHash": "sha256-syxEJP0NNgVZYHp/zRVuz32VYf+ULD9itZk7V06SCos=",
"owner": "tomasriveral",
"repo": "notewrapper",
"rev": "689c3074c03328e2086dc032a2fc3de00bbef466",
"rev": "e670ef935f0dd87dc8a8c6982147a9b8dce7565e",
"type": "github"
},
"original": {
@@ -328,11 +281,11 @@
"rust-overlay": "rust-overlay"
},
"locked": {
"lastModified": 1786270331,
"narHash": "sha256-GRhNuYIXR/0WWBya4CHfTKyCbL3wuFPJC5yBh5pHU8s=",
"lastModified": 1781158593,
"narHash": "sha256-zxlheX4o1MK00dkYzoXm7Srj5SD9iOCSp4N7f1iShr0=",
"owner": "r14dd",
"repo": "patent",
"rev": "d852cea921124a8b9002db9beb2af2d935af8130",
"rev": "68772d068088d62a030619090959165af5e71ed1",
"type": "github"
},
"original": {
@@ -349,11 +302,11 @@
]
},
"locked": {
"lastModified": 1785704021,
"narHash": "sha256-eQtczKMAS4ItlB4pr1B3MqBZiyRVl2nkqNdtyRSQMa8=",
"lastModified": 1781053488,
"narHash": "sha256-P4WEBaKgl8flRckHxXGHzT0potPvB3x8ZFIp9gLEAMY=",
"ref": "refs/heads/master",
"rev": "28771c7c74b42e20afca0b1b63980cb46515537c",
"revCount": 835,
"rev": "d99d87d5e5ec4e696815348692fdaaf0b6be1b2c",
"revCount": 822,
"type": "git",
"url": "https://git.outfoxxed.me/outfoxxed/quickshell"
},
@@ -364,7 +317,6 @@
},
"root": {
"inputs": {
"agenix": "agenix",
"caelestia-shell": "caelestia-shell",
"disko": "disko",
"flake-parts": "flake-parts",
@@ -417,21 +369,6 @@
"repo": "default",
"type": "github"
}
},
"systems_2": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
+3 -5
View File
@@ -47,11 +47,6 @@
url = "github:nix-community/disko";
inputs.nixpkgs.follows = "nixpkgs";
};
agenix = {
url = "github:ryantm/agenix";
inputs.nixpkgs.follows = "nixpkgs";
inputs.home-manager.follows = "home-manager";
};
/*
microPlugins-vivify = {
url = "git+https://codeberg.org/gibbert/micro-vivify";
@@ -69,12 +64,15 @@
flake = let
system = "x86_64-linux";
unfreePkgs = [
"code"
"hplip"
"nvidia-x11"
"nvidia-settings"
"steam"
"steam-unwrapped"
"cheatsheet.nvim"
"vscode"
"vscode-fhs"
"zoom-us"
"zoom"
];
+18
View File
@@ -402,6 +402,24 @@
keyword = "nix function search";
url = "https://noogle.dev";
}
{
name = "EPFL Moodle";
tags = ["epfl" "moodle"];
keyword = "epfl moodle";
url = "https://moodle.epfl.ch/my/courses.php";
}
{
name = "EPFL ICC Courseware";
tags = ["icc" "epfl" "courseware"];
keyword = "icc epfl courseware";
url = "https://courseware.epfl.ch/learner-dashboard/";
}
{
name = "Detexify";
tags = ["draw" "Latex" "symbols"];
keyword = "draw latex symbols";
url = "https://detexify.kirelabs.org/";
}
];
};
search = {
+3 -3
View File
@@ -24,16 +24,16 @@
inhibitWhenAudio = true;
timeouts = [
{
timeout = 180;
timeout = 1000;
idleAction = "lock";
}
{
timeout = 300;
timeout = 1010;
idleAction = "dpms off"; # what's that?
returnAction = "dpms on";
}
{
timeout = 600;
timeout = 12200;
idleAction = ["systemctl" "suspend-then-hibernate"];
}
];
+2
View File
@@ -3,6 +3,8 @@ _: {
programs.git = {
enable = true;
/*
for some reason this doesnt work really well. So it's best to setup git imperatively
push.autoSetupRemote to true
settings = {
init.defaultBranch = "main";
};
+18 -18
View File
@@ -1,4 +1,4 @@
{...}: {
_: {
flake.nixosModules.hyprland = {
pkgs,
pkgs-unstable,
@@ -35,23 +35,22 @@
services.xserver.enable = true;
};
flake.homeModules.hyprland-laptop = {
home.file.".config/hypr/host.lua" = {
text = ''
hl.on("hyprland.start", function()
hl.exec_cmd("qtbatticon")
hl.exec_cmd("source /run/agenix/ntfy && nixpkgs-notifier listen")
end)
hl.monitor({
output = "eDP-1",
mode = "highres@highrr",
position = "0x0",
scale = 1,
})
'';
enable = true;
force = true;
};
home.file.".config/hypr/host.lua" = {
text = ''
hl.on("hyprland.start", function()
hl.exec_cmd("qtbatticon")
end)
hl.monitor({
output = "eDP-1",
mode = "highres@highrr",
position = "0x0",
scale = 1,
})
'';
enable = true;
force = true;
};
};
flake.homeModules.hyprland-desktop = {
home.file.".config/hypr/host.lua" = {
@@ -93,6 +92,7 @@ let
(builtins.readFile ../../other/hyprland/hyprland.lua);
in
{
#refer to https://wiki.hypr.land/Nix/Hyprland-on-Home-Manager/
wayland.windowManager.hyprland.enable = true;
wayland.windowManager.hyprland.package = pkgs-unstable.hyprland;
-1
View File
@@ -14,7 +14,6 @@
flake.nixosModules.kdrive-desktop = {pkgs-unstable, ...}: {
environment.systemPackages = with pkgs-unstable; [
rclone
icloudpd
self.packages.${pkgs-unstable.system}.custom-checkKdrive
self.packages.${pkgs-unstable.system}.custom-synckdrive-desktop
];
-13
View File
@@ -1,13 +0,0 @@
_: {
flake.nixosModules.mullvad = _: {
services.mullvad-vpn = {
enable = true;
};
};
flake.homeModules.mullvad = _: {
programs.mullvad-vpn = {
# gui
enable = true;
};
};
}
+10 -6
View File
@@ -8,7 +8,7 @@
force = true;
text = ''
{
"directory": ["~/kdrive/Notes/"],
"directory": ["~/Documents/Notes/"],
"render": true,
"jumpToEndOfFileOnLaunch": true,
"editor": "neovim",
@@ -16,13 +16,17 @@
"dateEntry": "# %Y %m %d %a",
"newLineOnOpening": true,
"backup": {
"enable": false,
"enable": true,
"directory": {
"~/Documents/Notes/": "~/kdrive/Notes/",
"~/test/": "~/backupTest/"
"~/Documents/Notes/": "~/kdrive/Notes/"
},
"interval": "daily",
"rsyncArgs": ["-Lqah", "--update"]
"rsyncArgs": ["-Lqah", "--update"],
"git": {
"enable": true,
"name": "Tomas Rivera",
"email": "tomas.riveral@icloud.com"
}
}
}
'';
@@ -47,7 +51,7 @@
"backup": {
"enable": false,
"directory": {
"~/Documents/Notes/": "~/kdrive/Notes/",
"~/Documents/Notes/": "~/hdd/kdrive/Notes/",
"~/test/": "~/backupTest/"
},
"interval": "daily",
+1
View File
@@ -1,4 +1,5 @@
_: {
flake.homeModules.tmux = _: {
programs.tmux = {
enable = true;
+17 -2
View File
@@ -36,12 +36,18 @@ _: {
home.packages = [
#self.packages.${pkgs.system}.dejaManuallyDerived
pkgs-unstable.deja
pkgs-unstable.trash-cli
];
programs.zsh = {
enable = true;
autosuggestion.enable = false; # zsh-autocomplete is replaced by deja
initContent = ''
# those aliases can't be written in nix, because of ö
# l and ö are very close
alias -- ös=ls
alias -- öös=ls
# Safe cat that uses colorize plugin ccat
custom-cat() {
if [[ -t 1 ]]; then
@@ -50,7 +56,7 @@ _: {
command cat "$@"
fi
}
custom-eza() { # behaves differently if we just call it or if we pipe initContent
if [[ -t 1 ]]; then
eza -hlF -aa --color=always --hyperlink --group-directories-first --show-symlinks --icons=always --git --no-permissions "$@"
@@ -60,7 +66,11 @@ _: {
}
eval "$(direnv hook zsh)"
eval "$(deja init zsh)"
fastfetch''\n'';
if [[ "$TERM_PROGRAM" != "vscode" ]]; then
fastfetch
fi
'';
shellAliases = {
".." = "z ..";
grep = "rg";
@@ -89,6 +99,11 @@ _: {
nvvim = "nvim";
nviim = "nvim";
hledger-ui = "puffin";
rm = "trash-put";
rml = "trash-list";
rmr = "trash-restore";
rme = "trash-empty";
rmx = "trash-rm";
};
};
};
-179
View File
@@ -336,184 +336,5 @@
install -m755 qtbatticon $out/bin/
'';
};
# This was replaced by caelestia shell's Game Mode
packages.custom-performance = pkgs.writeShellApplication {
name = "custom-performance";
runtimeInputs = with pkgs; [
hyprland
brightnessctl
swaynotificationcenter
self.packages.${pkgs.system}.custom-wallpaper
libnotify
inputs.caelestia-shell.packages.${pkgs.system}.default
];
text = ''
STATE="$HOME/.cache/hypr-battery-saver"
enable() {
mkdir -p "$(dirname "$STATE")"
echo "Enabling battery saver mode..."
# Save brightness
brightnessctl get > "''${STATE}.brightness" 2>/dev/null || true
# Kill heavy UI components
pkill -f caelestia-shell || true
pkill -f caelestia || true
pkill shell || true
pkill -f custom-wallpaper || true
# Start lightweight notifications
pkill swaync || true
swaync & disown
# Start lightweight waybar
pkill waybar || true
waybar & disown
# Lower refresh rate (BIGGEST win)
hyprctl keyword monitor "eDP-1,2560x1600@60,0x0,1"
# Core performance toggles
hyprctl --batch "\
keyword animations:enabled 0;\
keyword animation borderangle,0;\
keyword decoration:shadow:enabled 0;\
keyword decoration:blur:enabled 0;\
keyword decoration:rounding 0;\
keyword decoration:fullscreen_opacity 1;\
keyword general:gaps_in 0;\
keyword general:gaps_out 0;\
keyword general:border_size 1;\
keyword decoration:active_opacity 1;\
keyword decoration:inactive_opacity 1;\
keyword misc:vfr true"
# Lower brightness
brightnessctl set 5% 2>/dev/null || true
touch "$STATE"
notify-send "Battery Saver" "Enabled"
}
disable() {
echo "Disabling battery saver mode..."
# Restore refresh rate
hyprctl keyword monitor "eDP-1,2560x1600@165,0x0,1"
# Restore Caelestia
pkill swaync || true
pkill waybar || true
caelestia shell -d >/dev/null 2>&1 &
disown
# Restart wallpaper
custom-wallpaper >/dev/null 2>&1 &
disown
# Restore full UI via reload (safe here on exit)
hyprctl reload
# Restore brightness
if [[ -f "''${STATE}.brightness" ]]; then
brightnessctl set "$(cat "''${STATE}.brightness")" 2>/dev/null || true
fi
rm -f "$STATE" "''${STATE}.brightness"
notify-send "Battery Saver" "Disabled"
}
if [[ -f "$STATE" ]]; then
disable
else
enable
fi
'';
};
# Old script that was used for the battery. Might not work.
packages.custom-olddeprecatedbatterynotify = pkgs.writeShellApplication {
name = "custom-olddeprecatedbatterynotify";
runtimeInputs = with pkgs; [
libnotify # provides notify-send
systemd # provides systemctl
];
text = ''
set -euo pipefail
LOW="''${BATTERY_LOW_THRESHOLD:-20}"
CRITICAL="''${BATTERY_CRITICAL_THRESHOLD:-5}"
FULL="''${BATTERY_FULL_THRESHOLD:-95}"
INTERVAL="''${BATTERY_INTERVAL:-30}"
ACTION="''${BATTERY_CRITICAL_ACTION:-systemctl suspend}"
notify() {
notify-send -a "Battery" -u "$1" "$2" "$3"
}
get_info() {
total=0
count=0
for bat in /sys/class/power_supply/BAT*; do
[ -f "$bat/capacity" ] || continue
capacity=$(<"$bat/capacity")
status=$(<"$bat/status")
total=$((total + capacity))
count=$((count + 1))
done
[ "$count" -gt 0 ] || exit 0
percentage=$((total / count))
}
last_state=""
while true; do
get_info
if [[ "$status" == "Discharging" && "$percentage" -le "$CRITICAL" ]]; then
notify critical "Battery Critically Low" "$percentage% — suspending."
$ACTION
elif [[ "$status" == "Discharging" && "$percentage" -le "$LOW" ]]; then
if [[ "$last_state" != "low" ]]; then
notify normal "Battery Low" "$percentage% remaining."
last_state="low"
fi
elif [[ "$status" != "Discharging" && "$percentage" -ge "$FULL" ]]; then
if [[ "$last_state" != "full" ]]; then
notify normal "Battery Full" "$percentage% — unplug charger."
last_state="full"
fi
else
last_state=""
fi
sleep "$INTERVAL"
done
'';
};
};
flake.homeModules.cbatticon = _: {
# don't works. some GTK error. I let it here if someday, someone is interest in this shit.
# ChatGPT half baked a replacement that works on my system.
# see qtbatticon
services.cbatticon = {
enable = true;
lowLevelPercent = 20;
criticalLevelPercent = 5;
batteryId = "BAT1";
hideNotification = true; # we use another script for battery notifications
updateIntervalSeconds = 10;
};
};
}
+20 -4
View File
@@ -1,10 +1,26 @@
_: {
flake.nixosModules.hardwareUtils-laptop = {pkgs, ...}: {
environment.systemPackages = with pkgs; [
flake.nixosModules.hardwareUtils-laptop = {pkgs-unstable, ...}: {
environment.systemPackages = with pkgs-unstable; [
# used for the framework 16 laptop
#framework-tool
#framework-tool-tui
framework-tool
framework-tool-tui
vial # Open-source GUI and QMK fork for configuring your keyboard in real time
netwatch
(diskwatch.override {
withSmartmontools = true;
})
syswatch
];
services.fwupd.enable = true; # update device firmware
};
flake.nixosModules.hardwareUtils-desktop = {pkgs-unstable, ...}: {
environment.systemPackages = with pkgs-unstable; [
netwatch
(diskwatch.override {
withSmartmontools = true;
})
syswatch
];
services.fwupd.enable = true; # update device firmware
};
}
-10
View File
@@ -1,10 +0,0 @@
_: {
flake.nixosModules.onxyboox = {pkgs, ...}: {
services.gvfs.enable = true;
environment.systemPackages = with pkgs; [
gvfs
calibre
kdePackages.kio-extras
];
};
}
+4 -4
View File
@@ -29,6 +29,7 @@
fonts
games
hardware-configuration-desktop
hardwareUtils-desktop
hdd
hledger
hledger-desktop
@@ -38,19 +39,19 @@
latex
ly
mathematics
mullvad
networking
nixUtils
notifications
nvidia
office
#ollama
ollama
otherUtils
performance-desktop
printer
rss
udev
user
vpn
];
};
flake.homeModules.desktop = {...}: {
@@ -68,7 +69,6 @@
hyprland-desktop
kitty
librewolf
mullvad
neovim
nix-git-cherry-picker-desktop
desktop-notewrapper
@@ -133,7 +133,7 @@
home.homeDirectory = "/home/tomasr";
home.sessionVariables = {
EDITOR = "nvim";
EDITOR = "neovim";
TERMINAL = "kitty";
};
+5 -7
View File
@@ -9,8 +9,6 @@
inherit (self) pkgs-unstable pkgs-local pkgs-master;
};
modules = with self.nixosModules; [
inputs.agenix.nixosModules.default
agenix
# important do not remove
home-manager-laptop
laptop
@@ -20,15 +18,17 @@
audioAndMedia
autoCleanup-laptop
autoUpdate-laptop
#battery-laptop
battery-laptop
bluetooth
bootloader
browsers
caelestia
cs-119l # I'm obliged to use vscode. RIP neovim
development
documentation
disk
disk-laptop
epfl
fonts
gitBackup
hardware-configuration-laptop
@@ -41,19 +41,18 @@
latex
ly
mathematics
mullvad
networking
nixUtils-laptop
nixUtils
notifications
office
onxyboox
#ollama
otherUtils
printer
rss
udev
user
vpn
];
};
flake.homeModules.laptop = {...}: {
@@ -72,7 +71,6 @@
hyprland-laptop
kitty
librewolf
mullvad
neovim
nix-git-cherry-picker-laptop
laptop-notewrapper
@@ -132,7 +130,7 @@
home.homeDirectory = "/home/tomasr";
home.sessionVariables = {
EDITOR = "nvim";
EDITOR = "neovim";
TERMINAL = "kitty";
SYSTEMD_PAGER = "cat";
PAGER = "cat";
+12
View File
@@ -44,6 +44,18 @@ _: {
command = "${pkgs-unstable.nixos-rebuild}/bin/nixos-rebuild";
options = ["NOPASSWD"];
}
{
command = "/run/current-system/sw/bin/open";
options = ["NOPASSWD"];
}
{
command = "${pkgs.openconnect}/bin/openconnect";
options = ["NOPASSWD"];
}
{
command = "${pkgs-unstable.openconnect}/bin/openconnect";
options = ["NOPASSWD"];
}
];
}
];
+6
View File
@@ -13,5 +13,11 @@
group = "users";
mode = "0400";
};
age.secrets.epfl = {
file = ../../secrets/epfl.age;
owner = "tomasr";
group = "users";
mode = "0400";
};
};
}
+4 -14
View File
@@ -19,9 +19,6 @@
description = "NixOS flake auto update";
serviceConfig = {
Environment = [
"NTFY_SECRET=${config.age.secrets.ntfy.path}"
];
Type = "oneshot";
ExecStart = "/run/current-system/sw/bin/custom-autoupdate";
@@ -76,9 +73,6 @@
description = "NixOS flake auto update";
serviceConfig = {
Environment = [
"NTFY_SECRET=${config.age.secrets.ntfy.path}"
];
Type = "oneshot";
ExecStart = "/run/current-system/sw/bin/custom-autoupdate";
@@ -118,9 +112,8 @@
runtimeInputs = with pkgs; [
git
nixos-rebuild
curl
matrix-commander-rs
libnotify
nix
];
text = ''
@@ -142,7 +135,7 @@
# update lock only
nix flake update --flake "$FLAKE_DIR"
if /run/wrappers/bin/sudo ${pkgs.nixos-rebuild}/bin/nixos-rebuild switch --flake "$FLAKE" 2> "$ERROR_FILE"; then # use /run/.../bin/ uses the sudoless rule
if sudo /run/current-system/sw/bin/nixos-rebuild switch --flake "$FLAKE" 2> "$ERROR_FILE"; then # use /run/.../bin/ uses the sudoless rule
if ! git -C "$FLAKE_DIR" diff --quiet -- flake.lock; then
git -C "$FLAKE_DIR" add flake.lock
@@ -187,14 +180,11 @@
runtimeInputs = with pkgs; [
git
nixos-rebuild
matrix-commander-rs
libnotify
curl
nix
];
text = ''
# shellcheck disable=SC1090
source "$NTFY_SECRET"
set -e
FLAKE_DIR="/home/tomasr/nixos"
@@ -211,7 +201,7 @@
# update lock only
nix flake update --flake "$FLAKE_DIR"
if /run/wrappers/bin/sudo /run/current-system/sw/bin/nixos-rebuild switch --flake "$FLAKE" 2> "$ERROR_FILE"; then # use /run/.../bin/ uses the sudoless rule
if sudo /run/current-system/sw/bin/nixos-rebuild switch --flake "$FLAKE" 2> "$ERROR_FILE"; then # use /run/.../bin/ uses the sudoless rule
if ! git -C "$FLAKE_DIR" diff --quiet -- flake.lock; then
git -C "$FLAKE_DIR" add flake.lock
+1 -1
View File
@@ -2,9 +2,9 @@ _: {
flake.nixosModules.hledger = {pkgs, ...}: {
environment.systemPackages = with pkgs; [
hledger
hledger-ui
hledger-web
asciinema # used for some hledger demos
puffin
];
};
flake.nixosModules.hledger-laptop = _: {
@@ -4,11 +4,12 @@
libnotify # Library that sends desktop notifications to a notification daemon
socat # Utility for bidirectional data transfer between two independent data channels (used to communicate between hyprland and awww to change wallpapers dinamically)
# battery notifications
self.packages.${pkgs.system}.custom-batterynotify
self.packages.${pkgs.system}.custom-batterywarning
/*self.packages.${pkgs.system}.custom-batterynotify
self.packages.${pkgs.system}.custom-batterywarning*/
self.packages.${pkgs.system}.custom-gitnotify # checks if git is set up
self.packages.${pkgs.system}.custom-checkKdrive # check if kdrive is set up with rclone
zoom-us
telegram-desktop
];
};
perSystem = {pkgs, ...}: {
+1 -7
View File
@@ -48,17 +48,11 @@
"configFetchTime": 1,
"localNotify": true,
"matrix": {
"enable": false,
"enable": true,
"room": "!BXRRokBmEdNOyYdfOF:matrix.org",
"ping": true,
"userPing": "@notificationbot_0000",
"userPingServer": "matrix.org"
},
"ntfy": {
"enable": true,
"auth": ":$NTFY_TOKEN",
"server": "$NTFY_SERVER",
"topic": "Alerts"
}
}
'';
+65
View File
@@ -0,0 +1,65 @@
{self, ...}: {
flake.nixosModules.epfl = {pkgs, ...}: {
environment.systemPackages = with pkgs; [
openconnect
self.packages.${pkgs.system}.custom-mountEpflDrive
];
};
flake.nixosModules.cs-119l = {pkgs, ...}: let
user = "tomasr";
home = "/home/${user}";
src = "${home}/epfl/cs-119l-ICC/";
dst = "${home}/kdrive/Travail/2 - Bachelor/BA1/Information, calcul, communication CS-119l/code/";
in {
environment.systemPackages = with pkgs; [
vscode-fhs
];
systemd.services.sync-cs119l-to-kdrive = {
description = "Sync CS-119l ICC to kDrive";
serviceConfig = {
Type = "oneshot";
User = user;
ExecStart = "${pkgs.rsync}/bin/rsync -a '${src}' '${dst}'";
};
};
systemd.timers.sync-cs119l-to-kdrive = {
description = "Sync CS-119l ICC to kDrive every Thursday and Friday evening";
wantedBy = ["timers.target"];
timerConfig = {
OnCalendar = [
"Thu *-*-* 20:00:00"
"Fri *-*-* 20:00:00"
];
Persistent = true;
};
};
};
perSystem = {pkgs, ...}: {
packages.custom-mountEpflDrive = pkgs.writeShellApplication {
name = "custom-mountEpflDrive";
runtimeInputs = with pkgs; [
rclone
libnotify
];
text = ''
REMOTE_NAME="epfl"
MOUNT_POINT="$HOME/epfl/drive"
if rclone listremotes | rg "^''${REMOTE_NAME}:"; then
echo "Mounting ''${REMOTE_NAME}..."
rclone mount "''${REMOTE_NAME}:" "$MOUNT_POINT" --vfs-cache-mode writes --allow-non-empty &
else
notify-send "rclone mount failed" \
"Remote ''${REMOTE_NAME} not found.\nConfigure rclone and create the dir ~/epfl/drive/ or comment out the exec line in hyprland.lua."
echo "Remote ''${REMOTE_NAME} not found. Configure rclone or comment out the exec line in hyprland.lua."
fi
'';
};
};
}
+1 -9
View File
@@ -16,15 +16,7 @@ _: {
networking.networkmanager.enable = true;
# Enable the OpenSSH daemon.
services.openssh = {
enable = true;
hostKeys = [
{
path = "/etc/ssh/ssh_host_ed25519_key";
type = "ed25519";
}
];
};
# services.openssh.enable = true;
# Open ports in the firewall.
# networking.firewall.allowedTCPPorts = [ ... ];
+1
View File
@@ -45,6 +45,7 @@
nix-index
statix
self.packages.${pkgs-unstable.system}.custom-trimmer
nix-update # nix-update <package> --build --test --format # the review will be done by nixpkgs-review-gha
];
};
perSystem = {pkgs, ...}: {
+2 -3
View File
@@ -1,7 +1,7 @@
{self, ...}: {
flake.nixosModules.otherUtils =
# try to keep packages here at a minium. Preferably use a dedicated file
{pkgs, ...}: {
{pkgs, pkgs-unstable, ...}: {
environment.systemPackages = with pkgs; [
gnome-calculator
snapshot
@@ -18,8 +18,7 @@
usbutils # used for lsusb
self.packages.${pkgs.system}.custom-tomato
self.packages.${pkgs.system}.custom-syllabes
# Electron 39 EOL. https://github.com/bitwarden/clients/pull/20448 should move it to 41. For the moment use the browser extension
#pkgs-unstable.bitwarden-desktop
pkgs-unstable.bitwarden-desktop
fluffychat # matrix client
];
};
+100
View File
@@ -0,0 +1,100 @@
# config for openconnect is in ./epfl.nix
{self, ...}: {
flake.nixosModules.vpn = {pkgs,...}: {
services.mullvad-vpn = {
enable = true;
};
environment.systemPackages = [
self.packages.${pkgs.system}.custom-vpn-picker
];
age.secrets.epfl = {
file = ../../secrets/epfl.age;
};
};
perSystem = {pkgs, ...}: {
packages.custom-vpn-picker = pkgs.writeShellApplication {
name = "custom-vpn-picker";
runtimeInputs = with pkgs; [
fzf
mullvad-compass
mullvad
openconnect
gawk
wl-clipboard
cliphist
];
text = ''
mullvad_connect () {
mullvad disconnect
mullvad relay set location "$1"
mullvad connect
}
profiles=(
"mullvad-best"
"mullvad-zurich"
"mullvad-tirana"
"mullvad-bogota"
"epfl"
"disconnect"
)
selected=$(printf "%s\n" "''${profiles[@]}" |
fzf --height 8 --reverse --prompt="Select vpn:")
[[ -z "$selected" ]] && exit 0
if [[ "$selected" == "mullvad-best" ]]; then
mullvad_connect "$(
mullvad-compass |
awk '/Best server:/ {
getline
split($1, a, "-")
print a[1]
}'
)"
elif [[ "$selected" == "mullvad-zurich" ]]; then
mullvad_connect ch
elif [[ "$selected" == "mullvad-tirana" ]]; then
mullvad_connect al
elif [[ "$selected" == "mullvad-bogota" ]]; then
mullvad_connect co
elif [[ "$selected" == "epfl" ]]; then
# shellcheck disable=SC1091
source /run/agenix/epfl
# Put password in clipboard so it can be pasted into openconnect.
printf '%s' "$EPFL_VPN_PASSWORD" | wl-copy
sudo openconnect \
--background \
--pid-file="$HOME/.local/state/epfl-openconnect.pid" \
--server="$EPFL_VPN_SERVER" \
--user="$EPFL_VPN_USER"
# Remove the password from cliphist and clear the current clipboard.
cliphist delete-query "$EPFL_VPN_PASSWORD" || true
wl-copy --clear
elif [[ "$selected" == "disconnect" ]]; then
if [[ -f "$HOME/.local/state/epfl-openconnect.pid" ]]; then
sudo kill "$(cat "$HOME/.local/state/epfl-openconnect.pid")" 2>/dev/null || true
fi
mullvad disconnect
rm "$HOME/.local/state/epfl-openconnect.pid"
fi
pkill -f "kitty.*Select vpn option" || true
exit
'';
};
};
}
+155 -10
View File
@@ -38,6 +38,7 @@ local function close_other_windows()
end
end
local wallpapers_enabled = true
local wallpapers = {
[1] = "WALLPAPER1/PATH/PLACEHOLDER",
[2] = "WALLPAPER2/PATH/PLACEHOLDER",
@@ -51,13 +52,144 @@ local wallpapers = {
[10] = "WALLPAPER5/PATH/PLACEHOLDER",
}
hl.on("workspace.active", function(workspace)
local function set_wallpaper(workspace)
if not wallpapers_enabled then
return
end
local wallpaper = wallpapers[workspace.id]
if wallpaper then
hl.exec_cmd("awww img -t none " .. wallpaper)
end
end)
end
hl.on("workspace.active", set_wallpaper)
local performance_mode = false
local saved_brightness = nil
local function get_brightness()
local handle = io.popen("brightnessctl get 2>/dev/null")
if not handle then
return nil
end
local value = handle:read("*a")
handle:close()
if not value then
return nil
end
value = value:gsub("%s+$", "")
return tonumber(value)
end
local function set_performance_mode()
if performance_mode then
hl.monitor({
output = "eDP-1",
mode = "2560x1600@165",
position = "0x0",
scale = 1,
})
hl.exec_cmd("pkill swaync || true")
hl.exec_cmd("pkill waybar || true")
hl.exec_cmd("caelestia shell -d")
if saved_brightness then
hl.exec_cmd("brightnessctl set " .. saved_brightness)
end
saved_brightness = nil
wallpapers_enabled = true
performance_mode = false
hl.exec_cmd("hyprctl reload")
local workspace = hl.get_active_workspace()
if workspace then
set_wallpaper(workspace)
end
hl.notification.create({
text = "Battery Saver",
subtext = "Disabled",
timeout = 3000,
})
return
end
-- Save current brightness.
saved_brightness = get_brightness()
-- Lower refresh rate.
hl.monitor({
output = "eDP-1",
mode = "2560x1600@60",
position = "0x0",
scale = 1,
})
-- Stop heavy UI components.
hl.exec_cmd("pkill -f caelestia-shell || true")
hl.exec_cmd("pkill -f caelestia || true")
-- Start lightweight notification daemon.
hl.exec_cmd("pkill swaync || true")
hl.exec_cmd("swaync")
-- Start lightweight status bar.
hl.exec_cmd("pkill waybar || true")
hl.exec_cmd("waybar")
-- Disable expensive Hyprland effects.
hl.config({
animations = {
enabled = false,
},
decoration = {
shadow = {
enabled = false,
},
blur = {
enabled = false,
},
rounding = 0,
fullscreen_opacity = 1,
active_opacity = 1,
inactive_opacity = 1,
},
general = {
gaps_in = 0,
gaps_out = 0,
border_size = 1,
},
misc = {
vfr = 1,
},
})
-- Lower brightness.
hl.exec_cmd("brightnessctl set 5%")
-- Disable workspace wallpaper switching.
wallpapers_enabled = false
performance_mode = true
hl.notification.create({
text = "Battery Saver",
subtext = "Enabled",
timeout = 3000,
})
end
hl.curve("wind", { type = "bezier", points = { { 0.05, 0.9 }, { 0.1, 1.05 } } })
hl.curve("winIn", { type = "bezier", points = { { 0.1, 1.1 }, { 0.1, 1.1 } } })
@@ -168,22 +300,29 @@ hl.bind(mod .. " + D", hl.dsp.layout("move +col"))
hl.bind(mod .. " + T", hl.dsp.exec_cmd(term))
hl.bind(mod .. " + E", hl.dsp.exec_cmd(file))
hl.bind(mod .. " + F", hl.dsp.exec_cmd(browser))
hl.bind(mod .. " + N", hl.dsp.exec_cmd(notes))
hl.bind(mod .. " + N", hl.dsp.exec_cmd("kitty --hold --class \"custom-vpn-picker\" --name \"Select vpn option\" custom-vpn-picker"))
hl.bind(mod .. " + SHIFT + A", hl.dsp.exec_cmd("caelestia shell drawers toggle launcher"))
hl.bind(mod .. " + Q", close_or_move_special)
hl.bind("CTRL + ALT + W", hl.dsp.exec_cmd("caelestia shell drawers toggle sidebar"))
local function toggle_sidebar()
if performance_mode then
hl.exec_cmd("swaync-client -t")
else
hl.exec_cmd("caelestia shell drawers toggle sidebar")
end
end
hl.bind("CTRL + ALT + W", toggle_sidebar)
hl.bind(mod .. " + L", hl.dsp.exec_cmd("caelestia shell lock lock"))
hl.bind("F11", hl.dsp.exec_cmd("caelestia screenshot"))
hl.bind(mod .. " + SHIFT + S", hl.dsp.exec_cmd("caelestia shell picker open"))
hl.bind(mod .. " + CTRL + 6", close_other_windows)
hl.bind("CTRL + ALT + 7", hl.dsp.exec_cmd("custom-performance"))
hl.bind("CTRL + ALT + 7", set_performance_mode)
hl.bind("CTRL + ALT + 1", hl.dsp.exec_cmd("caelestia shell drawers toggle sidebar"))
hl.bind(mod .. " + CTRL + 4", hl.dsp.exec_cmd("caelestia shell notifs toggleDnd"))
hl.bind(mod .. " + CTRL + 3", hl.dsp.exec_cmd("pavucontrol"))
hl.bind("CTRL + SHIFT + ALT + 0", hl.dsp.exec_cmd("kitty --hold --class \"custom-changeAudioOutput\" --name \"Select audio output\" zsh -c \"custom-changeAudioOutput\""))
hl.bind(mod .. " + CTRL + 5", hl.dsp.exec_cmd("gnome-characters"))
hl.bind("CTRL + ALT + 8", hl.dsp.exec_cmd("hyprpicker | tee >(wl-copy) | cliphist store"))
hl.bind("CTRL + ALT + 0", hl.dsp.exec_cmd("custom-tomato"))
-- hl.bind("CTRL + ALT + 0", hl.dsp.exec_cmd("custom-tomato"))
hl.bind("CTRL + ALT + 2", hl.dsp.exec_cmd("custom-bottom"))
hl.bind("CTRL + ALT + 9", hl.dsp.exec_cmd("anki"))
@@ -673,6 +812,13 @@ hl.window_rule({
float = true,
size = "400 225",
})
hl.window_rule({
match = {
class = "^(custom-vpn-picker)$",
},
float = true,
size = "350 250",
})
hl.window_rule({
match = {
@@ -780,7 +926,6 @@ hl.config({
hl.on("hyprland.start", function()
hl.exec_cmd("/nix/store/8kih8alkk4qzgjchg5501r1c3a8a71aw-dbus-1.16.2/bin/dbus-update-activation-environment --systemd DISPLAY HYPRLAND_INSTANCE_SIGNATURE WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_TYPE && systemctl --user stop hyprland-session.target && systemctl --user start hyprland-session.target")
hl.exec_cmd("qtbatticon")
hl.exec_cmd("source /run/agenix/ntfy && nixpkgs-notifier listen")
hl.exec_cmd("dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP")
hl.exec_cmd("dbus-update-activation-environment --systemd --all")
@@ -790,12 +935,12 @@ hl.on("hyprland.start", function()
hl.exec_cmd("udiskie --no-automount --smart-tray")
hl.exec_cmd("nm-applet --indicator")
hl.exec_cmd("rm -rf ~/.cache/cliphist/ && wl-paste --type text --watch cliphist store & wl-paste --type image --watch cliphist store")
hl.exec_cmd("custom-batterynotify")
hl.exec_cmd("custom-batterywarning")
-- hl.exec_cmd("custom-batterynotify")
-- hl.exec_cmd("custom-batterywarning")
hl.exec_cmd("awww img WALLPAPER/PATH/PLACEHOLDER")
hl.exec_cmd("awww-daemon")
hl.exec_cmd("sleep 1 && custom-wallpaper")
hl.exec_cmd("custom-checkKdrive && custom-mountkdrive")
hl.exec_cmd("custom-mountEpflDrive")
hl.exec_cmd("custom-gitnotify")
hl.exec_cmd("sleep 4 & caelestia-shell")
hl.exec_cmd("sleep 20 && ngcp pull --automatic")
+7
View File
@@ -0,0 +1,7 @@
age-encryption.org/v1
-> X25519 XuDyuQL0WjW/IvtzxswKnOfXlJa42Itdu+inNPsiNhw
3z2v3GbNdMvX9QtgAMrWZB/5Y1HatgpoXGQUMnW91+M
-> ssh-ed25519 +tvThg i3NM64rsEgRRgah4PKWdrl4i0pmP6X2bgr2Etzm33Ag
OwUETps78LPyjIAcJo8eC9eh0m9qtRUh399xGzMCTwQ
--- 7LnVrVnmfA8YubysLVeGyRGlLI+ef0VxnIHRi6rRAlc
W¾TîópF’X±áì‘làBTœÝ"^ï”�-þµ‹à¤û§÷Ÿ(üÛ'™ghÕóÎôGÜqx5FË~6Èï6DÎí¬gŒz…¾w·nñSÏHtß…ÌÂÓT«Úè›æŒÅó¤˜sød@°1!P""WHA$Ÿ�›,d68Ñ“õˆ�k“tù\qXÞHŽ®R=�vÕîŸZ
BIN
View File
Binary file not shown.
+4
View File
@@ -6,4 +6,8 @@ in {
backupAgeKey
laptopHostKey
];
"epfl.age".publicKeys = [
backupAgeKey
laptopHostKey
];
}
-8
View File
@@ -1,8 +0,0 @@
I am testing the tool ngcp i created. If this file disapears. It means I coded it wrong.
The problem before was that it did:
1. cherry pick
2. push
I didn't pulled changed before cherry picking