mirror of
https://github.com/tomasriveral/nixos.git
synced 2026-10-10 17:02:43 +02:00
Compare commits
279
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b0c997dad | ||
|
|
21349e4585 | ||
|
|
f23ec09369 | ||
|
|
7d5ae9fa2c | ||
|
|
8f4117f3e7 | ||
|
|
bd97ba4df7 | ||
|
|
bd678ae32d | ||
|
|
9879131aca | ||
|
|
c2f733d4c9 | ||
|
|
44709a3b7c | ||
|
|
ce8c4f7d73 | ||
|
|
2f2d3cd2ba | ||
|
|
b738cbb8ef | ||
|
|
fdb4d53ec0 | ||
|
|
1a29fda1f9 | ||
|
|
b760904557 | ||
|
|
28d56cf671 | ||
|
|
4db1f329f2 | ||
|
|
7afe2cf7b6 | ||
|
|
434e6ed31d | ||
|
|
f1e266331c | ||
|
|
f745a79af8 | ||
|
|
a99cb710b3 | ||
|
|
9805986c10 | ||
|
|
bc67f2b0e8 | ||
|
|
7cd934c58c | ||
|
|
6e3286419f | ||
|
|
c7781b7483 | ||
|
|
682a5c13df | ||
|
|
82bd78bc73 | ||
|
|
1071ce70d7 | ||
|
|
1ff4785399 | ||
|
|
ed9ccd4b11 | ||
|
|
13cdae0655 | ||
|
|
d0b7183849 | ||
|
|
cea0d0e3f8 | ||
|
|
a4c66b4aff | ||
|
|
56a9bba86b | ||
|
|
1dab571e12 | ||
|
|
93f7328a3b | ||
|
|
0e222a9c50 | ||
|
|
d1125d1571 | ||
|
|
550413c6b1 | ||
|
|
b4537796a2 | ||
|
|
4c0fbc5f0e | ||
|
|
d0a9511ff7 | ||
|
|
262476404e | ||
|
|
9f9906d423 | ||
|
|
0d616266ff | ||
|
|
6b282b5344 | ||
|
|
19fd3ec35d | ||
|
|
324d54683c | ||
|
|
0030034418 | ||
|
|
fb7be79e86 | ||
|
|
5db8135dd5 | ||
|
|
2107d23209 | ||
|
|
77f4b0fc5f | ||
|
|
1642dc97ca | ||
|
|
2b59031896 | ||
|
|
d323e9f702 | ||
|
|
25813d8ab5 | ||
|
|
0ca30a4110 | ||
|
|
05ef065d75 | ||
|
|
fece2b565f | ||
|
|
2722840919 | ||
|
|
9e862337ca | ||
|
|
3c7d3584fc | ||
|
|
a619a10851 | ||
|
|
876ec4ce21 | ||
|
|
97beca4f88 | ||
|
|
e2b7fd8a64 | ||
|
|
752957818b | ||
|
|
2e322fbb79 | ||
|
|
1c600dbf3c | ||
|
|
4a648b7f7c | ||
|
|
67d21671c5 | ||
|
|
b8d8ef1aa8 | ||
|
|
2d16f3893b | ||
|
|
2a0c85275f | ||
|
|
23a9fdd4e8 | ||
|
|
246412ae4b | ||
|
|
58ec4221ef | ||
|
|
88eb91c780 | ||
|
|
3b73438d4f | ||
|
|
e758819398 | ||
|
|
8088f78f05 | ||
|
|
930e265420 | ||
|
|
3b89cf7b35 | ||
|
|
89eb25ca7d | ||
|
|
3ea36fa6bb | ||
|
|
523b104c43 | ||
|
|
4f3a74b741 | ||
|
|
2585a88780 | ||
|
|
52e5e4a4d4 | ||
|
|
2d8c797042 | ||
|
|
dd4fb62a2f | ||
|
|
09d92bc8e2 | ||
|
|
158a5c2b29 | ||
|
|
3d468572d5 | ||
|
|
d23c6979f9 | ||
|
|
01bde96826 | ||
|
|
552d898680 | ||
|
|
5b7c43c8f9 | ||
|
|
f1e9c76d02 | ||
|
|
a140ce9560 | ||
|
|
ba4727f453 | ||
|
|
6525d6d599 | ||
|
|
37f76a4439 | ||
|
|
c32e8112c6 | ||
|
|
ff1469dea2 | ||
|
|
89c87b8242 | ||
|
|
4bf8fe10c9 | ||
|
|
3b30916261 | ||
|
|
065012ed84 | ||
|
|
66ff0dc406 | ||
|
|
e4eb23f10f | ||
|
|
143f699365 | ||
|
|
d20f0d87d5 | ||
|
|
406baf2a5d | ||
|
|
2471741462 | ||
|
|
5039b2a37c | ||
|
|
45639e2531 | ||
|
|
2d2d4fd4a8 | ||
|
|
22bc2f218f | ||
|
|
d49c7ba99e | ||
|
|
c1354a3b98 | ||
|
|
29554e41ca | ||
|
|
f8255c42ed | ||
|
|
2a318bdced | ||
|
|
bd86051c13 | ||
|
|
34cde6f6f4 | ||
|
|
763bbbacd4 | ||
|
|
59f5d84de0 | ||
|
|
99f1dd3ec8 | ||
|
|
f56e535ff6 | ||
|
|
3836a6eb7c | ||
|
|
d9a650a964 | ||
|
|
d0ac13cec6 | ||
|
|
c92a868718 | ||
|
|
2c95860f5b | ||
|
|
4b6d0250df | ||
|
|
a063b505c6 | ||
|
|
433bb52cde | ||
|
|
d9969cbd71 | ||
|
|
68d81d5c4b | ||
|
|
259ee7e554 | ||
|
|
b1edbc9378 | ||
|
|
7e0ba6278c | ||
|
|
89d5ac8a17 | ||
|
|
d340b9c08b | ||
|
|
d4d24e6f61 | ||
|
|
45666fa728 | ||
|
|
2e0996938a | ||
|
|
8b2a086a4d | ||
|
|
4b6a5ffa59 | ||
|
|
19adc625f1 | ||
|
|
18d73c71c3 | ||
|
|
dc09f6dcce | ||
|
|
682bc4e5ab | ||
|
|
0beb6f374a | ||
|
|
6d15ae6a22 | ||
|
|
32c9d85f99 | ||
|
|
e3089e1d59 | ||
|
|
fa54be1c2b | ||
|
|
abf652e21b | ||
|
|
75002217f3 | ||
|
|
e42b1f9725 | ||
|
|
99ab54cc8b | ||
|
|
5afc0acf77 | ||
|
|
ccd9b3e97e | ||
|
|
cd3aa9b0dd | ||
|
|
07220185ee | ||
|
|
eaa0698bc0 | ||
|
|
9125dfddef | ||
|
|
fdbc3e1a79 | ||
|
|
73637ebc1d | ||
|
|
9a4b912e58 | ||
|
|
c128995bea | ||
|
|
d8982fab43 | ||
|
|
4bd062032f | ||
|
|
2419bc4f82 | ||
|
|
6a937f3863 | ||
|
|
4ee868fbc6 | ||
|
|
2ad6d8c165 | ||
|
|
8a7908a5c9 | ||
|
|
8207e1502c | ||
|
|
6d5ab8d831 | ||
|
|
95d14041cc | ||
|
|
ac11171bbf | ||
|
|
c2305331bb | ||
|
|
9e5cac3a2d | ||
|
|
f28ba6b799 | ||
|
|
933478d820 | ||
|
|
72cee5b891 | ||
|
|
a5e7dea053 | ||
|
|
d0c547d2e0 | ||
|
|
579f832afe | ||
|
|
d32a0e5948 | ||
|
|
c48d721d64 | ||
|
|
ad9f94fec2 | ||
|
|
efe30f4c1d | ||
|
|
774b7c0a77 | ||
|
|
68bef6e250 | ||
|
|
55ce1b6569 | ||
|
|
f28a6af581 | ||
|
|
3f5291cbaf | ||
|
|
e6d888e58f | ||
|
|
15afff222e | ||
|
|
5a8f8f5c08 | ||
|
|
7072f2a39e | ||
|
|
02b5924d31 | ||
|
|
a5d93f6ce1 | ||
|
|
8efd8a30bf | ||
|
|
5be623fd12 | ||
|
|
f491282dad | ||
|
|
a63984816d | ||
|
|
23606fecb6 | ||
|
|
a0dd94cb3c | ||
|
|
aca4458e4c | ||
|
|
3b99da9148 | ||
|
|
eee5117a22 | ||
|
|
6830973233 | ||
|
|
f7861f7ca1 | ||
|
|
2207b5ef03 | ||
|
|
9d4eb9b0a2 | ||
|
|
0713810716 | ||
|
|
8ee9c3f639 | ||
|
|
d673efcc8c | ||
|
|
3ecc4a55bf | ||
|
|
501965a0dc | ||
|
|
897795869f | ||
|
|
9e0f4e9aca | ||
|
|
44b77af9e9 | ||
|
|
dad71ed4a7 | ||
|
|
5b4b92ca06 | ||
|
|
f66b4ae739 | ||
|
|
fd8221d3ab | ||
|
|
42023bc87a | ||
|
|
8254cb871e | ||
|
|
a3c2dbe568 | ||
|
|
b53a392b37 | ||
|
|
6f6e197c12 | ||
|
|
90a2c60863 | ||
|
|
8ec20cee5b | ||
|
|
cb99ae907f | ||
|
|
256f7f802b | ||
|
|
d79e9ae0b1 | ||
|
|
dd6ad70e7c | ||
|
|
d017065992 | ||
|
|
5d5dd21c8e | ||
|
|
9e6e278c72 | ||
|
|
4fcbc31629 | ||
|
|
dc3eaf04c0 | ||
|
|
cfe758599d | ||
|
|
226ada8abd | ||
|
|
23e4261fef | ||
|
|
33174e7bc2 | ||
|
|
80118164bf | ||
|
|
11e6661af0 | ||
|
|
dbdc72dc64 | ||
|
|
cc5118c021 | ||
|
|
1f226bfcea | ||
|
|
3690b2896c | ||
|
|
e4e61b3d35 | ||
|
|
4d5e1ace42 | ||
|
|
7efb71d225 | ||
|
|
020f06def8 | ||
|
|
d7e2e22799 | ||
|
|
1d71a4dfcd | ||
|
|
1b33855fb1 | ||
|
|
43df516fa2 | ||
|
|
c6488c7d47 | ||
|
|
80dd4c217f | ||
|
|
982daa028a | ||
|
|
9a5c8c0c53 | ||
|
|
33d24f0cf6 | ||
|
|
f8985b786c | ||
|
|
9a709f8ae9 | ||
|
|
515247573f |
No files matched your search
@@ -0,0 +1,105 @@
|
||||
name: Sync branches into main
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 14 * * 1" # Monday
|
||||
- cron: "0 14 * * 3" # Wednesday
|
||||
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
source:
|
||||
description: Branch to sync into main
|
||||
required: true
|
||||
type: choice
|
||||
options:
|
||||
- laptop
|
||||
- desktop
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
sync:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Determine source branch
|
||||
id: branch
|
||||
run: |
|
||||
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
||||
echo "source=${{ inputs.source }}" >> "$GITHUB_OUTPUT"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
DOW=$(date -u +%u)
|
||||
|
||||
case "$DOW" in
|
||||
1)
|
||||
echo "source=laptop" >> "$GITHUB_OUTPUT"
|
||||
;;
|
||||
3)
|
||||
echo "source=desktop" >> "$GITHUB_OUTPUT"
|
||||
;;
|
||||
*)
|
||||
echo "No sync scheduled today."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
- name: Check for existing PR
|
||||
id: existing
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
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"
|
||||
|
||||
- name: Create PR
|
||||
id: create
|
||||
if: steps.existing.outputs.number == ''
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
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')
|
||||
|
||||
echo "number=$PR_NUMBER" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Determine PR number
|
||||
id: pr
|
||||
run: |
|
||||
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
|
||||
if: steps.pr.outputs.number != ''
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
gh pr merge \
|
||||
"${{ steps.pr.outputs.number }}" \
|
||||
--auto \
|
||||
--merge
|
||||
@@ -0,0 +1,9 @@
|
||||
# Ignore build outputs from performing a nix-build or `nix build` command
|
||||
result
|
||||
result-*
|
||||
|
||||
# Ignore automatically generated direnv output
|
||||
.direnv
|
||||
|
||||
# Ignore NixOS interactive test driver history
|
||||
**/.nixos-test-history
|
||||
@@ -1,235 +1,693 @@
|
||||
⚠️ Documentation outdated.
|
||||
|
||||
# NixOS Configuration
|
||||
|
||||

|
||||
|
||||
## 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
|
||||
```
|
||||
+206
-66
@@ -11,11 +11,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1779508871,
|
||||
"narHash": "sha256-SFl2je8b423f/tIy0RTgCrWQUJiyFsAZp1Y0cccXqio=",
|
||||
"lastModified": 1781239472,
|
||||
"narHash": "sha256-WFL8jZMWNH1tx3UwaJ9aa9NN25uOEJ9mbKPRNQJY/xM=",
|
||||
"owner": "caelestia-dots",
|
||||
"repo": "cli",
|
||||
"rev": "7f300626704b7a86fe838ab58df654fa99779613",
|
||||
"rev": "3f3229aed4f36752a02fd870fd6cad94bd76555f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -27,17 +27,18 @@
|
||||
"caelestia-shell": {
|
||||
"inputs": {
|
||||
"caelestia-cli": "caelestia-cli",
|
||||
"m3shapes": "m3shapes",
|
||||
"nixpkgs": [
|
||||
"nixpkgs-unstable"
|
||||
],
|
||||
"quickshell": "quickshell"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1779591587,
|
||||
"narHash": "sha256-Ud83/zsmDSHcqQ64MRiQ7SnGkUVIpRzqwqBBU65DGXY=",
|
||||
"lastModified": 1781408632,
|
||||
"narHash": "sha256-kYVf3Jye4UhyBrtubYcSrmVyFv9uqOY2JvjmElFiZHE=",
|
||||
"owner": "caelestia-dots",
|
||||
"repo": "shell",
|
||||
"rev": "2f7ab5e4140d9188185f6c3164e428c1eeda1fe6",
|
||||
"rev": "f86c359cd90530bacc800e94e35ffbebecd3f58f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -46,6 +47,26 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"disko": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1781152676,
|
||||
"narHash": "sha256-RxWs5ND31KzTG7wvMM+PMfUjyNpmIEr999lqNARaM5o=",
|
||||
"owner": "nix-community",
|
||||
"repo": "disko",
|
||||
"rev": "ff8702b4de27f72b4c78573dfb89ec74e36abdf1",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "disko",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-parts": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
@@ -53,15 +74,31 @@
|
||||
"locked": {
|
||||
"lastModified": 1778716662,
|
||||
"narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
|
||||
"type": "github"
|
||||
"revCount": 475,
|
||||
"type": "tarball",
|
||||
"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": {
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"type": "github"
|
||||
"type": "tarball",
|
||||
"url": "https://flakehub.com/f/hercules-ci/flake-parts/%2A"
|
||||
}
|
||||
},
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1731533236,
|
||||
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
||||
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
||||
"revCount": 102,
|
||||
"type": "tarball",
|
||||
"url": "https://api.flakehub.com/f/pinned/numtide/flake-utils/0.1.102%2Brev-11707dc2f618dd54ca8739b309ec4fc024de578b/0193276d-5b8f-7dbc-acf1-41cb7b54ad2e/source.tar.gz"
|
||||
},
|
||||
"original": {
|
||||
"type": "tarball",
|
||||
"url": "https://flakehub.com/f/numtide/flake-utils/%2A"
|
||||
}
|
||||
},
|
||||
"home-manager": {
|
||||
@@ -71,16 +108,16 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1779506708,
|
||||
"narHash": "sha256-QOD/CNm196nCJRheux/URi4/HE66fthdOMqCJoPP1Y0=",
|
||||
"lastModified": 1781319724,
|
||||
"narHash": "sha256-ZGuxexEMo4Xv28KJ0dX/m/PHN4oZIOnxHZpNTyrvx4M=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "3ee51fbdac8c8bdfe1e7e1fcaba6520a563f394f",
|
||||
"rev": "8355f0a16b2dbb06a97959a918af5b239bbe05ae",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"ref": "release-25.11",
|
||||
"ref": "release-26.05",
|
||||
"repo": "home-manager",
|
||||
"type": "github"
|
||||
}
|
||||
@@ -100,52 +137,58 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"microPlugins-vivify": {
|
||||
"m3shapes": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1770382657,
|
||||
"narHash": "sha256-yWmIgT90mC9PhzyH/itDbRMmRTiZiwW+Yo0dsHW7ni8=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "3c5cb25facf3fc4143bfea9323a60eda65ef8485",
|
||||
"revCount": 8,
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/gibbert/micro-vivify"
|
||||
},
|
||||
"original": {
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/gibbert/micro-vivify"
|
||||
}
|
||||
},
|
||||
"nixos-grub-themes": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1769794759,
|
||||
"narHash": "sha256-1doG74WkbtUpawduk9f8szyzWsw3Liblrh2z+2jQnw4=",
|
||||
"owner": "jeslie0",
|
||||
"repo": "nixos-grub-themes",
|
||||
"rev": "5e75f9b3ea9061dca6c53d34e166e08bf9ebc7c7",
|
||||
"lastModified": 1781017666,
|
||||
"narHash": "sha256-kfHyzZaPHgqZML48OA+5JwBOsLdQJ2ci/aGPShvUB4Y=",
|
||||
"owner": "soramanew",
|
||||
"repo": "m3shapes",
|
||||
"rev": "bdc327b29f95394a732baf3c9b19658ba23755b6",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "jeslie0",
|
||||
"repo": "nixos-grub-themes",
|
||||
"owner": "soramanew",
|
||||
"repo": "m3shapes",
|
||||
"rev": "bdc327b29f95394a732baf3c9b19658ba23755b6",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nix-git-cherry-picker": {
|
||||
"inputs": {
|
||||
"flake-utils": [
|
||||
"flake-utils"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"nixpkgs-unstable"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1781373243,
|
||||
"narHash": "sha256-CpZ5FEU1BtW6K4FywtCCE2wJs6R/Ifps3etRDh8NJ9w=",
|
||||
"owner": "tomasriveral",
|
||||
"repo": "nix-git-cherry-picker",
|
||||
"rev": "9865dba535620831ae7cab395bf404f8f464df0e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "tomasriveral",
|
||||
"repo": "nix-git-cherry-picker",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1702151865,
|
||||
"narHash": "sha256-9VAt19t6yQa7pHZLDbil/QctAgVsA66DLnzdRGqDisg=",
|
||||
"lastModified": 1781216227,
|
||||
"narHash": "sha256-9mUW6gNwoN2SWc/l0fW4svPNOulXLl8ijqKyeSOGgJE=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "666fc80e7b2afb570462423cb0e1cf1a3a34fedd",
|
||||
"rev": "a0374025a863d007d98e3297f6aa46cc3141c2f0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-unstable",
|
||||
"ref": "nixos-26.05",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
@@ -165,13 +208,36 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-notifier": {
|
||||
"inputs": {
|
||||
"flake-utils": [
|
||||
"flake-utils"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"nixpkgs-unstable"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1781273662,
|
||||
"narHash": "sha256-50dd7Cs1mUHq1srw7UojdzCYOB4TfrIXMv7XHHPU9zw=",
|
||||
"owner": "tomasriveral",
|
||||
"repo": "nixpkgs-notifier",
|
||||
"rev": "12183f26e8b196d9906f82dc05f9672793c61038",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "tomasriveral",
|
||||
"repo": "nixpkgs-notifier",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-unstable": {
|
||||
"locked": {
|
||||
"lastModified": 1779536132,
|
||||
"narHash": "sha256-q+fF42iv/geEbHfgSzy3tS0FF/EyD6XTZ98E6yxiBO8=",
|
||||
"lastModified": 1781328464,
|
||||
"narHash": "sha256-j9uBlHI0eJ9zWU9IlF6SlBBPdeJu30hcvar31IRKHpw=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "3d8f0f3f72a6cd4d93d0ad13203f2ea1cb7e1456",
|
||||
"rev": "5a722a7155bfc9fbe657f28d26b71860d95324bc",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -181,19 +247,50 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"notewrapper": {
|
||||
"inputs": {
|
||||
"flake-utils": [
|
||||
"flake-utils"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"nixpkgs-unstable"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1779102034,
|
||||
"narHash": "sha256-vZJZjLo513IeI8hjzHFc6TDezUd4uCE2Eq4SNO3DNNg=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "687f05a9184cad4eaf905c48b63649e3a86f5433",
|
||||
"lastModified": 1780908812,
|
||||
"narHash": "sha256-syxEJP0NNgVZYHp/zRVuz32VYf+ULD9itZk7V06SCos=",
|
||||
"owner": "tomasriveral",
|
||||
"repo": "notewrapper",
|
||||
"rev": "e670ef935f0dd87dc8a8c6982147a9b8dce7565e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-25.11",
|
||||
"repo": "nixpkgs",
|
||||
"owner": "tomasriveral",
|
||||
"repo": "notewrapper",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"patent": {
|
||||
"inputs": {
|
||||
"flake-utils": [
|
||||
"flake-utils"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"nixpkgs-unstable"
|
||||
],
|
||||
"rust-overlay": "rust-overlay"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1781158593,
|
||||
"narHash": "sha256-zxlheX4o1MK00dkYzoXm7Srj5SD9iOCSp4N7f1iShr0=",
|
||||
"owner": "r14dd",
|
||||
"repo": "patent",
|
||||
"rev": "68772d068088d62a030619090959165af5e71ed1",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "r14dd",
|
||||
"repo": "patent",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
@@ -205,11 +302,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1779430452,
|
||||
"narHash": "sha256-zTslhsxLqUlRTML506iougTGzyR38Fzhzn7t4KDEuuE=",
|
||||
"lastModified": 1781053488,
|
||||
"narHash": "sha256-P4WEBaKgl8flRckHxXGHzT0potPvB3x8ZFIp9gLEAMY=",
|
||||
"ref": "refs/heads/master",
|
||||
"rev": "4b4fca3224ab977dc515ac0bb78d00b3dfa71e00",
|
||||
"revCount": 819,
|
||||
"rev": "d99d87d5e5ec4e696815348692fdaaf0b6be1b2c",
|
||||
"revCount": 822,
|
||||
"type": "git",
|
||||
"url": "https://git.outfoxxed.me/outfoxxed/quickshell"
|
||||
},
|
||||
@@ -221,13 +318,56 @@
|
||||
"root": {
|
||||
"inputs": {
|
||||
"caelestia-shell": "caelestia-shell",
|
||||
"disko": "disko",
|
||||
"flake-parts": "flake-parts",
|
||||
"flake-utils": "flake-utils",
|
||||
"home-manager": "home-manager",
|
||||
"import-tree": "import-tree",
|
||||
"microPlugins-vivify": "microPlugins-vivify",
|
||||
"nixos-grub-themes": "nixos-grub-themes",
|
||||
"nixpkgs": "nixpkgs_2",
|
||||
"nixpkgs-unstable": "nixpkgs-unstable"
|
||||
"nix-git-cherry-picker": "nix-git-cherry-picker",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"nixpkgs-master": [
|
||||
"nixpkgs-unstable"
|
||||
],
|
||||
"nixpkgs-notifier": "nixpkgs-notifier",
|
||||
"nixpkgs-unstable": "nixpkgs-unstable",
|
||||
"notewrapper": "notewrapper",
|
||||
"patent": "patent"
|
||||
}
|
||||
},
|
||||
"rust-overlay": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"patent",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1780888890,
|
||||
"narHash": "sha256-MUQPFiskEENaJ2N82TRIqpKlHXGXJJkPfKH6W788oQo=",
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"rev": "7d5f8d75fc195a236b46633d7679139698aeb35f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -2,24 +2,59 @@
|
||||
description = "Nixos config flake";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-26.05";
|
||||
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixpkgs-unstable"; # used for some packages
|
||||
nixos-grub-themes.url = "github:jeslie0/nixos-grub-themes";
|
||||
|
||||
# Only uncomment when needed. This uses a lot of space and compute ressources for sometimes not that much. If not used, make it follow unstable
|
||||
nixpkgs-master.follows = "nixpkgs-unstable";
|
||||
#nixpkgs-master.url = "github:nixos/nixpkgs/master"; # used with precaution as they are untested and not cached
|
||||
|
||||
# This one is only used when testing some packaging. You must change the path to the correct nixpkgs clone
|
||||
#nixpkgs-local.url = "path:/home/tomasr/devel/fugit2-gpgme";
|
||||
home-manager = {
|
||||
url = "github:nix-community/home-manager/release-25.11";
|
||||
url = "github:nix-community/home-manager/release-26.05";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
flake-utils = {
|
||||
url = "https://flakehub.com/f/numtide/flake-utils/*"; # flakehub caches results
|
||||
};
|
||||
notewrapper = {
|
||||
url = "github:tomasriveral/notewrapper";
|
||||
inputs.nixpkgs.follows = "nixpkgs-unstable";
|
||||
inputs.flake-utils.follows = "flake-utils";
|
||||
};
|
||||
nixpkgs-notifier = {
|
||||
url = "github:tomasriveral/nixpkgs-notifier";
|
||||
inputs.flake-utils.follows = "flake-utils";
|
||||
inputs.nixpkgs.follows = "nixpkgs-unstable";
|
||||
};
|
||||
nix-git-cherry-picker = {
|
||||
url = "github:tomasriveral/nix-git-cherry-picker";
|
||||
inputs.flake-utils.follows = "flake-utils";
|
||||
inputs.nixpkgs.follows = "nixpkgs-unstable";
|
||||
};
|
||||
patent = {
|
||||
url = "github:r14dd/patent";
|
||||
inputs.flake-utils.follows = "flake-utils";
|
||||
inputs.nixpkgs.follows = "nixpkgs-unstable";
|
||||
};
|
||||
caelestia-shell = {
|
||||
# based on quickshell. See https://github.com/caelestia-dots/shell
|
||||
url = "github:caelestia-dots/shell";
|
||||
inputs.nixpkgs.follows = "nixpkgs-unstable";
|
||||
};
|
||||
microPlugins-vivify = {
|
||||
disko = {
|
||||
url = "github:nix-community/disko";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
/*
|
||||
microPlugins-vivify = {
|
||||
url = "git+https://codeberg.org/gibbert/micro-vivify";
|
||||
flake = false;
|
||||
};
|
||||
*/
|
||||
flake-parts = {
|
||||
url = "github:hercules-ci/flake-parts";
|
||||
url = "https://flakehub.com/f/hercules-ci/flake-parts/*"; # flakehub caches results
|
||||
};
|
||||
import-tree.url = "github:vic/import-tree"; # imports ./modules recursively
|
||||
};
|
||||
@@ -29,9 +64,17 @@
|
||||
flake = let
|
||||
system = "x86_64-linux";
|
||||
unfreePkgs = [
|
||||
"code"
|
||||
"hplip"
|
||||
"vivify.vim"
|
||||
"nvidia-x11"
|
||||
"nvidia-settings"
|
||||
"steam"
|
||||
"steam-unwrapped"
|
||||
"cheatsheet.nvim"
|
||||
"vscode"
|
||||
"vscode-fhs"
|
||||
"zoom-us"
|
||||
"zoom"
|
||||
];
|
||||
mkUnfreePredicate = pkg:
|
||||
builtins.elem (inputs.nixpkgs.lib.getName pkg) unfreePkgs;
|
||||
@@ -42,8 +85,11 @@
|
||||
};
|
||||
pkgs = mkPkgs inputs.nixpkgs;
|
||||
pkgs-unstable = mkPkgs inputs.nixpkgs-unstable;
|
||||
pkgs-local = mkPkgs inputs.nixpkgs-unstable;
|
||||
#pkgs-local = mkPkgs inputs.nixpkgs-local;
|
||||
pkgs-master = mkPkgs inputs.nixpkgs-master;
|
||||
in {
|
||||
inherit pkgs pkgs-unstable;
|
||||
inherit pkgs pkgs-unstable pkgs-local pkgs-master;
|
||||
};
|
||||
}
|
||||
// (inputs.import-tree ./modules));
|
||||
|
||||
@@ -57,7 +57,7 @@ _: {
|
||||
# we enable system wide with nixpkgs because it offers some addon configuration. We just use this for some config
|
||||
#enable = true;
|
||||
theme = "dark";
|
||||
sync = {
|
||||
profiles."User 1".sync = {
|
||||
autoSync = true;
|
||||
autoSyncMediaMinutes = 10;
|
||||
syncMedia = true;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
environment.systemPackages = with pkgs; [
|
||||
chromium # used only to flash the firmware on my framework laptop 16 (keyboard.frame.work) as only chromium based browser support webHID.
|
||||
pkgs-unstable.tor-browser
|
||||
self.packages.${pkgs.system}.custom-librewolfprofiles
|
||||
self.packages.${pkgs.system}.custom-browserprofiles
|
||||
];
|
||||
};
|
||||
flake.homeModules.librewolf = _: {
|
||||
@@ -146,7 +146,7 @@
|
||||
};
|
||||
"uBlock0@raymondhill.net" = {
|
||||
install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
|
||||
installation_mode = "force_installed";
|
||||
installation_mode = "blocked";
|
||||
};
|
||||
"{08d5243b-4236-4a27-984b-1ded22ce01c3}" = {
|
||||
install_url = "https://addons.mozilla.org/firefox/downloads/file/3729287/gruvboxgruvboxgruvboxgruvboxgr-1.0.xpi";
|
||||
@@ -160,6 +160,14 @@
|
||||
install_url = "https://addons.mozilla.org/firefox/downloads/file/4749958/bitwarden_password_manager-latest.xpi";
|
||||
installation_mode = "force_installed";
|
||||
};
|
||||
"@crw-extension-firefox" = {
|
||||
install_url = "https://addons.mozilla.org/firefox/downloads/file/4790089/consumer_rights_wiki-latest.xpi";
|
||||
installation_mode = "force_installed";
|
||||
};
|
||||
"archivebox@tjhorner.dev" = {
|
||||
install_url = "https://addons.mozilla.org/firefox/downloads/file/4820668/archivebox_exporter-latest.xpi";
|
||||
installation_mode = "force_installed";
|
||||
};
|
||||
};
|
||||
DisableTelemetry = true;
|
||||
DisableFirefoxStudies = true;
|
||||
@@ -304,6 +312,12 @@
|
||||
bookmarks = {
|
||||
force = true;
|
||||
settings = [
|
||||
{
|
||||
name = "Nixpkgs PRs";
|
||||
tags = ["nixpkgs" "PR" "github"];
|
||||
keyword = "nixpkgs prs";
|
||||
url = "https://github.com/NixOS/nixpkgs/pulls";
|
||||
}
|
||||
{
|
||||
name = "Nixos Config";
|
||||
tags = ["github"];
|
||||
@@ -334,18 +348,78 @@
|
||||
keyword = "nixpkgs tracker";
|
||||
url = "https://nixpk.gs/pr-tracker.html";
|
||||
}
|
||||
{
|
||||
name = "fahrlehrer";
|
||||
tags = ["theorie" "fahrlehrer" "conduite"];
|
||||
keyword = "fahrlehrer24";
|
||||
url = "https://app.fahrlehrer24.ch/";
|
||||
}
|
||||
{
|
||||
name = "cogito";
|
||||
tags = ["cogito" "esprit" "critique"];
|
||||
keyword = "Cogito l'Esprit critique";
|
||||
url = "https://app.cogito.fr";
|
||||
}
|
||||
{
|
||||
name = "EPFL email";
|
||||
tags = ["mail" "outlook" "epfl"];
|
||||
keyword = "EPFL email";
|
||||
url = "https://outlook.office.com/mail";
|
||||
}
|
||||
{
|
||||
name = "nixpkgs' failing and orphan packages";
|
||||
tags = ["nixpkgs" "fail" "orphan" "ZH" "zero hydra failure"];
|
||||
keyword = "Zero hydra failure orphan packages";
|
||||
url = "https://zh.fail/failed/by-maintainer/_.html";
|
||||
}
|
||||
{
|
||||
name = "NixOS Manual - Unstable";
|
||||
tags = ["nixos" "manual" "unstable"];
|
||||
keyword = "NixOS manual";
|
||||
url = "https://nixos.org/manual/nixos/unstable/";
|
||||
}
|
||||
{
|
||||
name = "Nixpgks Reference Manual - Unstable";
|
||||
tags = ["nixpkgs" "manual" "reference" "unstable"];
|
||||
keyword = "nixpkgs reference manual";
|
||||
url = "https://nixos.org/manual/nixpkgs/unstable/";
|
||||
}
|
||||
{
|
||||
name = "Nix Reference Manual - 2.34.";
|
||||
tags = ["nix" "manual" "reference" "2.34"];
|
||||
keyword = "nix reference manual";
|
||||
url = "https://nix.dev/manual/nix/2.34/nix-2.34.html";
|
||||
}
|
||||
{
|
||||
name = "Disposable temporary email";
|
||||
tags = ["privacy" "email" "temporary"];
|
||||
keyword = "disposable temporary email";
|
||||
url = "https://temp-mail.org";
|
||||
}
|
||||
{
|
||||
name = "nix-update-script Rryan-tm logs";
|
||||
tags = ["nixpkgs" "nix" "log" "rryan-tm"];
|
||||
keyword = "rryan-tm logs";
|
||||
url = "https://nixpkgs-update-logs.nix-community.org";
|
||||
}
|
||||
{
|
||||
name = "Nix function search";
|
||||
tags = ["nixpkgs" "nix" "search"];
|
||||
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 = {
|
||||
@@ -582,6 +656,23 @@
|
||||
# };
|
||||
#};
|
||||
};
|
||||
bookmarks = {
|
||||
force = true;
|
||||
settings = [
|
||||
{
|
||||
name = "Disposable temporary email";
|
||||
tags = ["privacy" "email" "temporary"];
|
||||
keyword = "disposable temporary email";
|
||||
url = "https://temp-mail.org";
|
||||
}
|
||||
{
|
||||
name = "r/Piracy megathread";
|
||||
tags = ["piracy" "megathread" "reddit"];
|
||||
keyword = "piracy megathread";
|
||||
url = "https://old.reddit.com/r/Piracy/wiki/megathread";
|
||||
}
|
||||
];
|
||||
};
|
||||
search = {
|
||||
force = true;
|
||||
default = "quant";
|
||||
@@ -643,6 +734,14 @@
|
||||
];
|
||||
definedAliases = ["on"];
|
||||
};
|
||||
"ProtonDB" = {
|
||||
urls = [
|
||||
{
|
||||
template = "https://www.protondb.com/search?q={searchTerms}";
|
||||
}
|
||||
];
|
||||
definedAliases = ["pr"];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -10,6 +10,35 @@
|
||||
quickshell # we have it but adding it there solves "WARN qt.qpa.services: Failed to register with host portal QDBusError("org.freedesktop.portal.Error.Failed", "Could not register app ID: App info not found for 'org.quickshell'")"
|
||||
];
|
||||
};
|
||||
flake.homeModules.caelestia-desktop = _: {
|
||||
# for some reason nvidia drivers or I don't know what break the lock. (activate even when use, crash, etc.)
|
||||
programs.caelestia.settings.general.idle = {
|
||||
lockBeforeSleep = false;
|
||||
inhibitWhenAudio = true;
|
||||
timeouts = [];
|
||||
};
|
||||
};
|
||||
flake.homeModules.caelestia-laptop = _: {
|
||||
programs.caelestia.settings.general.idle = {
|
||||
lockBeforeSleep = true;
|
||||
inhibitWhenAudio = true;
|
||||
timeouts = [
|
||||
{
|
||||
timeout = 1000;
|
||||
idleAction = "lock";
|
||||
}
|
||||
{
|
||||
timeout = 1010;
|
||||
idleAction = "dpms off"; # what's that?
|
||||
returnAction = "dpms on";
|
||||
}
|
||||
{
|
||||
timeout = 12200;
|
||||
idleAction = ["systemctl" "suspend-then-hibernate"];
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
flake.homeModules.caelestia = _: let
|
||||
sisyphe = ../../assets/sisyphe.gif;
|
||||
pepe-music = ../../assets/pepe-music.gif;
|
||||
@@ -101,25 +130,6 @@
|
||||
];
|
||||
criticalLevel = 3;
|
||||
};
|
||||
idle = {
|
||||
lockBeforeSleep = true;
|
||||
inhibitWhenAudio = true;
|
||||
timeouts = [
|
||||
{
|
||||
timeout = 180;
|
||||
idleAction = "lock";
|
||||
}
|
||||
{
|
||||
timeout = 300;
|
||||
idleAction = "dpms off"; # what's that?
|
||||
returnAction = "dpms on";
|
||||
}
|
||||
{
|
||||
timeout = 600;
|
||||
idleAction = ["systemctl" "suspend-then-hibernate"];
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
background = {
|
||||
desktopClock = {
|
||||
|
||||
@@ -5,5 +5,9 @@ _: {
|
||||
supertuxkart # fuck mariokart
|
||||
# my favorite italian plumber is free software
|
||||
];
|
||||
programs.steam = {
|
||||
enable = true;
|
||||
protontricks.enable = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -2,9 +2,13 @@ _: {
|
||||
flake.homeModules.git = _: {
|
||||
programs.git = {
|
||||
enable = true;
|
||||
settings = {
|
||||
/*
|
||||
for some reason this doesnt work really well. So it's best to setup git imperatively
|
||||
push.autoSetupRemote to true
|
||||
settings = {
|
||||
init.defaultBranch = "main";
|
||||
};
|
||||
*/
|
||||
};
|
||||
programs.gh = {
|
||||
enable = true;
|
||||
|
||||
@@ -1,21 +1,17 @@
|
||||
{self, ...}: {
|
||||
_: {
|
||||
flake.nixosModules.hyprland = {
|
||||
pkgs,
|
||||
pkgs-unstable,
|
||||
...
|
||||
}: {
|
||||
environment.systemPackages = with pkgs; [
|
||||
swww #wallpaper daemon
|
||||
awww #wallpaper daemon
|
||||
gruvbox-gtk-theme
|
||||
hyprcursor
|
||||
capitaine-cursors-themed # cursor theme
|
||||
papirus-icon-theme
|
||||
papirus-folders
|
||||
self.packages.${pkgs.system}.custom-wallpaper
|
||||
self.packages.${pkgs.system}.custom-dontkillsteam # kill app (if not steam or tomato-c
|
||||
self.packages.${pkgs.system}.custom-killall # kill all windows except focused window
|
||||
xdg-utils
|
||||
home-manager
|
||||
];
|
||||
# enable hyprland WM
|
||||
programs.hyprland = {
|
||||
@@ -38,466 +34,75 @@
|
||||
# Enable the X11 windowing system.
|
||||
services.xserver.enable = true;
|
||||
};
|
||||
flake.homeModules.hyprland-laptop = _: {
|
||||
wayland.windowManager.hyprland.settings = {
|
||||
exec-once = [
|
||||
"qtbatticon" # custom battery tray
|
||||
];
|
||||
monitor = [
|
||||
"eDP-1, highres@highrr, 0x0, 1"
|
||||
];
|
||||
flake.homeModules.hyprland-laptop = {
|
||||
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" = {
|
||||
text = ''
|
||||
hl.monitor({
|
||||
output = "",
|
||||
mode = "preferred",
|
||||
position = "auto",
|
||||
scale = 0.75,
|
||||
})
|
||||
'';
|
||||
enable = true;
|
||||
force = true;
|
||||
};
|
||||
flake.homeModules.hyprland = {pkgs-unstable, ...}: let
|
||||
wallpaper = ../../assets/wallpaper1.jpg;
|
||||
in {
|
||||
#refer to https://wiki.hypr.land/Nix/Hyprland-on-Home-Manager/
|
||||
wayland.windowManager.hyprland.enable = true;
|
||||
wayland.windowManager.hyprland.package = pkgs-unstable.hyprland;
|
||||
#hint Electron apps to use on wayland;
|
||||
home.sessionVariables.NIXOS_OZONE_WL = "1";
|
||||
wayland.windowManager.hyprland.plugins = [
|
||||
#pkgs-unstable.hyprlandPlugins.hyprspace # currently broken
|
||||
#pkgs-unstable.hyprlandPlugins.hypr-dynamic-cursors # currently broken
|
||||
];
|
||||
wayland.windowManager.hyprland.settings = {
|
||||
"$mod" = "SUPER";
|
||||
"$term" = "kitty";
|
||||
"$editor" = "nvim";
|
||||
"$notes" = "kitty --class \"custom-obsidianvaults\" --name \"Select Obsidian vault\" --hold custom-obsidianvaults";
|
||||
"$file" = "dolphin";
|
||||
"$browser" = "kitty --class \"custom-librewolfprofiles\" --name \"Select LibreWolf profile\" --hold custom-librewolfprofiles";
|
||||
# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█
|
||||
# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█
|
||||
animations = {
|
||||
enabled = true;
|
||||
bezier = [
|
||||
"wind, 0.05, 0.9, 0.1, 1.05"
|
||||
"winIn, 0.1, 1.1, 0.1, 1.1"
|
||||
"winOut, 0.3, -0.3, 0, 1"
|
||||
"liner, 1, 1, 1, 1"
|
||||
];
|
||||
animation = [
|
||||
"windows, 1, 6, wind, slide"
|
||||
"windowsIn, 1, 6, winIn, slide"
|
||||
"windowsOut, 1, 5, winOut, slide"
|
||||
"windowsMove, 1, 5, wind, slide"
|
||||
"border, 1, 1, liner"
|
||||
"borderangle, 1, 30, liner, loop"
|
||||
"fade, 1, 10, default"
|
||||
"workspaces, 1, 5, wind"
|
||||
];
|
||||
};
|
||||
};
|
||||
flake.homeModules.hyprland = {pkgs-unstable, ... }:
|
||||
let
|
||||
wallpaper1 = ../../assets/wallpaper1.jpg;
|
||||
wallpaper2 = ../../assets/wallpaper2.jpg;
|
||||
wallpaper3 = ../../assets/wallpaper3.jpg;
|
||||
wallpaper4 = ../../assets/wallpaper4.jpg;
|
||||
wallpaper5 = ../../assets/wallpaper5.jpg;
|
||||
|
||||
# █▀▀ █▄░█ █░█
|
||||
# ██▄ █░▀█ ▀▄▀
|
||||
hyprlandLua = builtins.replaceStrings
|
||||
[
|
||||
"WALLPAPER1/PATH/PLACEHOLDER"
|
||||
"WALLPAPER2/PATH/PLACEHOLDER"
|
||||
"WALLPAPER3/PATH/PLACEHOLDER"
|
||||
"WALLPAPER4/PATH/PLACEHOLDER"
|
||||
"WALLPAPER5/PATH/PLACEHOLDER"
|
||||
]
|
||||
[
|
||||
(toString wallpaper1)
|
||||
(toString wallpaper2)
|
||||
(toString wallpaper3)
|
||||
(toString wallpaper4)
|
||||
(toString wallpaper5)
|
||||
]
|
||||
(builtins.readFile ../../other/hyprland/hyprland.lua);
|
||||
in
|
||||
{
|
||||
|
||||
# See https://wiki.hyprland.org/Configuring/Environment-variables/
|
||||
env = [
|
||||
"PATH, $PATH:$scrPath"
|
||||
"XDG_CURRENT_DESKTOP,Hyprland"
|
||||
"XDG_SESSION_TYPE,wayland"
|
||||
"XDG_SESSION_DESKTOP,Hyprland"
|
||||
"QT_QPA_PLATFORM,wayland;xcb"
|
||||
"QT_QPAPLATFORMTHEME,qt6ct"
|
||||
"QT_WAYLAND_DISABLE_WINDOWDECORATION,1"
|
||||
"MOZ_ENABLE_WAYLAND,1"
|
||||
"GDK_SCALE,1"
|
||||
#refer to https://wiki.hypr.land/Nix/Hyprland-on-Home-Manager/
|
||||
wayland.windowManager.hyprland.enable = true;
|
||||
wayland.windowManager.hyprland.package = pkgs-unstable.hyprland;
|
||||
#hint Electron apps to use on wayland;
|
||||
home.sessionVariables.NIXOS_OZONE_WL = "1";
|
||||
wayland.windowManager.hyprland.plugins = [
|
||||
#pkgs-unstable.hyprlandPlugins.hyprspace # currently broken
|
||||
#pkgs-unstable.hyprlandPlugins.hypr-dynamic-cursors
|
||||
];
|
||||
|
||||
# █ █▄░█ █▀█ █░█ ▀█▀
|
||||
# █ █░▀█ █▀▀ █▄█ ░█░
|
||||
|
||||
input = {
|
||||
kb_layout = ["ch"];
|
||||
follow_mouse = 1;
|
||||
sensitivity = 0;
|
||||
force_no_accel = 1;
|
||||
};
|
||||
|
||||
# █▄▀ █▀▀ █▄█ █▄▄ █ █▄░█ █▀▄ █ █▄░█ █▀▀ █▀
|
||||
# █░█ ██▄ ░█░ █▄█ █ █░▀█ █▄▀ █ █░▀█ █▄█ ▄█
|
||||
# caelestia shell drawers toggle dashboard
|
||||
# caelestia shell drawers toggle utilities
|
||||
|
||||
bind = [
|
||||
#hyprland/utility keybindings
|
||||
"$mod, W, togglefloating"
|
||||
"$mod, G, togglegroup"
|
||||
"Alt, Return, fullscreen"
|
||||
"$mod, Left, movefocus, l"
|
||||
"$mod, Right, movefocus, r"
|
||||
"$mod, Up, movefocus, u"
|
||||
"$mod, Down, movefocus, d"
|
||||
"Alt, Tab, movefocus, d"
|
||||
"$mod, 1, workspace, 1"
|
||||
"$mod, 2, workspace, 2"
|
||||
"$mod, 3, workspace, 3"
|
||||
"$mod, 4, workspace, 4"
|
||||
"$mod, 5, workspace, 5"
|
||||
"$mod, 6, workspace, 6"
|
||||
"$mod, 7, workspace, 7"
|
||||
"$mod, 8, workspace, 8"
|
||||
"$mod, 9, workspace, 9"
|
||||
"$mod, 0, workspace, 10"
|
||||
"$mod+Ctrl, Right, workspace, r+1"
|
||||
"$mod+Ctrl, Left, workspace, r-1"
|
||||
"$mod+Ctrl, Doown, workspace, empty"
|
||||
"$mod+Shift, 1, movetoworkspace, 1"
|
||||
"$mod+Shift, 2, movetoworkspace, 2"
|
||||
"$mod+Shift, 3, movetoworkspace, 3"
|
||||
"$mod+Shift, 4, movetoworkspace, 4"
|
||||
"$mod+Shift, 5, movetoworkspace, 5"
|
||||
"$mod+Shift, 6, movetoworkspace, 6"
|
||||
"$mod+Shift, 7, movetoworkspace, 7"
|
||||
"$mod+Shift, 8, movetoworkspace, 8"
|
||||
"$mod+Shift, 9, movetoworkspace, 9"
|
||||
"$mod+Shift, 0, movetoworkspace, 10"
|
||||
"$mod+Ctrl+Alt, Right, movetoworkspace, r+1"
|
||||
"$mod+Ctrl+Alt, Left, movetoworkspace, r-1"
|
||||
#"$mod, Backspace, exec, wlogout -b 4 -T 600 -B 600"
|
||||
"$mod, Backspace, exec, caelestia shell drawers toggle session"
|
||||
"$mod+Shift+Ctrl, Left, movewindow, l"
|
||||
"$mod+Shift+Ctrl, Right, movewindow, r"
|
||||
"$mod+Shift+Ctrl, Up, movewindow, u"
|
||||
"$mod+Shift+Ctrl, Down, movewindow, d"
|
||||
"$mod, mouse_down, workspace, e+1"
|
||||
"$mod, mouse_up, workspace, e-1"
|
||||
"$mod, V, exec, cliphist list | rofi -dmenu| cliphist decode | wl-copy" # copy paste
|
||||
"$mod, B, exec, hyprkeys -bkr | rofi -dmenu"
|
||||
#"$mod, A, tagwindow, noborder" # used to not apply image border
|
||||
"$mod, S, togglespecialworkspace,"
|
||||
"Alt+$mod, S, movetoworkspace, special"
|
||||
# for the scrolling layout
|
||||
"$mod, A, layoutmsg, move -col"
|
||||
"$mod, D, layoutmsg, move +col"
|
||||
#apps keybindings
|
||||
"$mod, T, exec, $term"
|
||||
"$mod, E, exec, $file"
|
||||
"$mod, F, exec, $browser"
|
||||
"$mod, N, exec, $notes"
|
||||
#"$mod+Shift, A, exec, rofi -show drun"
|
||||
"$mod+Shift, A, exec, caelestia shell drawers toggle launcher"
|
||||
"$mod, Q, exec, custom-dontkillsteam"
|
||||
#"Ctrl+Alt, W, exec, pkill waybar || waybar"
|
||||
"Ctrl+Alt, W, exec, caelestia shell drawers toggle sidebar"
|
||||
#"$mod, L, exec, swaylock -eFLK -i ${wallpaper}"
|
||||
"$mod, L, exec, caelestia shell lock lock"
|
||||
#"$mod, F11, exec, hyprshot -m window"
|
||||
", F11, exec, caelestia screenshot"
|
||||
#"$mod_SHIFT, S, exec, hyprshot -m region --clipboard only"
|
||||
# "$mod_SHIFT, S, exec, qs ipc call screenshot toggle"
|
||||
"$mod_SHIFT, S, exec, caelestia shell picker open"
|
||||
# framework 16 rgb macropad
|
||||
"Ctrl+$mod, 6, exec, custom-killall" # pos 1 1 killall apps except focused one
|
||||
#"Ctrl+Alt, 7, exec, custom-performance" # pos 2 1 start performance mode
|
||||
"Ctrl+Alt, 7, exec, caelestia shell gameMode toggle"
|
||||
# reloads the autostart programs # pos 3 1
|
||||
# we passed to caelestia-shell and stoped using that
|
||||
/*
|
||||
"Ctrl+$mod, 4, exec, sleep 1 && kitty -o font_size=16 -e sh -c 'custom-weather'"
|
||||
"Ctrl+$mod, 4, exec, sleep 1 && kitty -o font_size=11 -e sh -c 'custom-cowsay'"
|
||||
"Ctrl+$mod, 4, exec, kitty -e 'custom-launch'"
|
||||
"Ctrl+$mod, 4, exec, sleep 1 && kitty -o font_size=5 -e btm --theme gruvbox --disable-click --disable_advanced_kill --enable_cache_memory -g -R -T "
|
||||
"Ctrl+$mod, 4, exec, sleep 1 && kitty -o font_size=1 -e sh -c 'cmatrix -br'"
|
||||
#"Ctrl+Alt, 1, exec, swaync-client -t" # pos 4 1 notification center
|
||||
"Ctrl+Alt, 1, exec, qs ipc call notifications toggle"
|
||||
*/
|
||||
"Ctrl+Alt, 1, exec, caelestia shell drawers toggle sidebar"
|
||||
"Ctrl+$mod, 4, exec, caelestia shell notifs toggleDnd"
|
||||
"Ctrl+$mod, 3, exec, pavucontrol" # pos 1 2 audiocontrol
|
||||
"Ctrl+Shift+Alt, 0, exec, kitty --hold --class \"custom-changeAudioOutput\" --name \"Select audio output\" zsh -c \"custom-changeAudioOutput\"" # pos 2 2 change audio output fzf
|
||||
"Ctrl+$mod, 5, exec, gnome-characters" # pos 3 2 special chars
|
||||
"Ctrl+Alt, 8, exec, hyprpicker | tee >(wl-copy) | cliphist store" # pos 4 2 colorpicker
|
||||
"Ctrl+Alt, 0, exec, custom-tomato" # pos 1 3 pomodoro app
|
||||
"Ctrl+Alt, 2, exec, custom-bottom" # pos 2 3 btm (like htop but cleaner)
|
||||
"Ctrl+Alt, 9, exec, anki"
|
||||
# if hyprexpo plugin enabled bind = $mainMod, Space, hyprexpo:expo, toggle
|
||||
# maybe exec sudo framework-tools-tui
|
||||
|
||||
#plugins keybindings
|
||||
#"$mod, SPACE, overview:toggle, "
|
||||
];
|
||||
binde = [
|
||||
"$mod+Shift, Right, resizeactive, 30 0"
|
||||
"$mod+Shift, Left, resizeactive, -30, 0"
|
||||
"$mod+Shift, Up, resizeactive, 0 -30"
|
||||
"$mod+Shift, Down, resizeactive,m 0 30"
|
||||
];
|
||||
bindl = [
|
||||
", F1, exec, pactl set-sink-mute @DEFAULT_SINK@ toggle" #toggle audio mute
|
||||
", F5, exec, playerctl play-pause" # media F4-F6
|
||||
", F4, exec, playerctl previous"
|
||||
", F6, exec, playerctl next"
|
||||
];
|
||||
bindel = [
|
||||
", F2, exec, pactl set-sink-volume @DEFAULT_SINK@ -10%" # decrease volume
|
||||
", F3, exec, pactl set-sink-volume @DEFAULT_SINK@ +10%" # increase volume
|
||||
", F7, exec, brightnessctl s 10%-" # decrease brightness
|
||||
", F8, exec, brightnessctl s +10%" # increase brightness
|
||||
];
|
||||
bindm = [
|
||||
"$mod, mouse:272, movewindow"
|
||||
"$mod, mouse:273, resizewindow"
|
||||
"$mod, Z, movewindow"
|
||||
"$mod, X, resizewindow"
|
||||
];
|
||||
# █░░ ▄▀█ █░█ █▄░█ █▀▀ █░█
|
||||
# █▄▄ █▀█ █▄█ █░▀█ █▄▄ █▀█
|
||||
exec-once = [
|
||||
"dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" # for XDPH
|
||||
"dbus-update-activation-environment --systemd --all" # for XDPH
|
||||
"systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" # for XDPH
|
||||
"systemctl --user start xdg-desktop-portal-wlr.service"
|
||||
"blueman-applet" # systray app for Bluetooth
|
||||
"udiskie --no-automount --smart-tray" # front-end that allows to manage removable media
|
||||
"nm-applet --indicator" # systray app for Network/wifi
|
||||
#setups clipboard
|
||||
"rm -rf ~/.cache/cliphist/ && wl-paste --type text --watch cliphist store & wl-paste --type image --watch cliphist store"
|
||||
#"wl-paste --type text --watch cliphist store" # clipboard store text data
|
||||
#"wl-paste --type image --watch cliphist store" # clipboard store image data
|
||||
"custom-batterynotify"
|
||||
"custom-batterywarning"
|
||||
#"birdtray" # thunderbird tray app # curently broken
|
||||
#wallpapers/b
|
||||
"swww img ${wallpaper}"
|
||||
"swww-daemon"
|
||||
"sleep 1 && custom-wallpaper"
|
||||
"custom-checkKdrive && custom-mountkdrive" # checks if the remote works and mount it
|
||||
#"waybar"
|
||||
"custom-gitnotify"
|
||||
"custom-checkMatrix" # checks if matrix-commander-rs is connected which is important for other stuff
|
||||
#"custom-obsidianbackup" # backups the obsidian notes to kdrive and to a timed hidden dir (~/.Notes.backup/)
|
||||
#"QS-notifycache" # builds the cache that will be used for the notification history
|
||||
"sleep 4 & caelestia-shell" #works better if it sleeps a bit before
|
||||
/*
|
||||
We stopped using that ######################### maybe we should desactivate those scripts
|
||||
# login autostart
|
||||
#######################
|
||||
"[workspace 1 silent] sleep 1 && kitty -o font_size=16 -e sh -c 'custom-weather'"
|
||||
"[workspace 1 silent] sleep 1 && kitty -o font_size=11 -e sh -c 'custom-cowsay'"
|
||||
"[workspace 1 silent] kitty -e 'custom-launch'"
|
||||
"[workspace 1 silent] sleep 1 && kitty -o font_size=5 -e btm --theme gruvbox --disable-click --disable_advanced_kill --enable_cache_memory -g -R -T "
|
||||
"[workspace 1 silent] sleep 1 && kitty -o font_size=1 -e sh -c 'cmatrix -br'"
|
||||
######################
|
||||
######################
|
||||
*/
|
||||
];
|
||||
splash = true; # remove default background on startup
|
||||
# gestures (also keybindings)
|
||||
gesture = [
|
||||
"3, right, move, +col"
|
||||
"3, left, move, -col"
|
||||
];
|
||||
|
||||
# █░░ ▄▀█ █▄█ █▀█ █░█ ▀█▀ █▀
|
||||
# █▄▄ █▀█ ░█░ █▄█ █▄█ ░█░ ▄█
|
||||
|
||||
dwindle = {
|
||||
preserve_split = true;
|
||||
};
|
||||
scrolling = {
|
||||
column_width = 0.45;
|
||||
};
|
||||
|
||||
# █▀▄▀█ █ █▀ █▀▀
|
||||
# █░▀░█ █ ▄█ █▄▄
|
||||
|
||||
misc = {
|
||||
vrr = 0;
|
||||
force_default_wallpaper = 0;
|
||||
};
|
||||
xwayland = {
|
||||
force_zero_scaling = true;
|
||||
};
|
||||
|
||||
# █▀▄▀█ █▀█ █▄░█ █ ▀█▀ █▀█ █▀█
|
||||
# █░▀░█ █▄█ █#░▀█ █ ░█░ █▄█ █▀▄
|
||||
monitor = [
|
||||
#",preferred, auto, auto"
|
||||
"HDMI-A-1, highres2highrr, auto-left, 1"
|
||||
];
|
||||
# _______ ___ __ __ _______ ___ __ _ _______
|
||||
#| || | | | | || || | | | | || |
|
||||
#| _ || | | | | || ___|| | | |_| || _____|
|
||||
#| |_| || | | |_| || | __ | | | || |_____
|
||||
#| ___|| |___ | || || || | | _ ||_____ |
|
||||
#| | | || || |_| || | | | | | _____| |
|
||||
#|___| |_______||_______||_______||___| |_| |__||_______|
|
||||
#
|
||||
"plugin:dynamic-cursors" = {
|
||||
enabled = true;
|
||||
threshold = 2;
|
||||
mode = "rotate";
|
||||
rotate = {
|
||||
# length in px of the simulated stick used to rotate the cursor
|
||||
# most realistic if this is your actual cursor size
|
||||
length = 20;
|
||||
offset = 0;
|
||||
};
|
||||
shake = {
|
||||
enabled = true;
|
||||
# use nearest-neighbour (pixelated) scaling when shaking
|
||||
# may look weird when effects are enabled
|
||||
nearest = true;
|
||||
threshold = 4;
|
||||
# magnification level immediately after shake start
|
||||
base = 4.0;
|
||||
# magnification increase per second when continuing to shake
|
||||
speed = 4.0;
|
||||
# how much the speed is influenced by the current shake intensitiy
|
||||
influence = 0.0;
|
||||
|
||||
# maximal magnification the cursor can reach
|
||||
# values below 1 disable the limit (e.g. 0)
|
||||
limit = 0.0;
|
||||
|
||||
# time in millseconds the cursor will stay magnified after a shake has ended
|
||||
timeout = 2000;
|
||||
|
||||
# show cursor behaviour `tilt`, `rotate`, etc. while shaking
|
||||
effects = true;
|
||||
|
||||
# enable ipc events for shake
|
||||
ipc = false;
|
||||
};
|
||||
};
|
||||
"plugin:overview" = {
|
||||
disableGestures = true;
|
||||
showEmptyWorkspace = true;
|
||||
workspaceActiveBorder = "rgb(ab7746)";
|
||||
disableBlur = true;
|
||||
};
|
||||
|
||||
#####################################################
|
||||
#####################################################
|
||||
# theme
|
||||
decoration = {
|
||||
dim_special = 0.3;
|
||||
rounding = 18;
|
||||
blur = {
|
||||
special = true;
|
||||
enabled = true;
|
||||
size = 4;
|
||||
passes = 2;
|
||||
new_optimizations = true;
|
||||
ignore_opacity = true;
|
||||
};
|
||||
};
|
||||
general = {
|
||||
gaps_in = 5;
|
||||
gaps_out = 15;
|
||||
border_size = 4;
|
||||
"col.active_border" = "rgba(ca6702ff) rgba(ecd3a0ff) 45deg";
|
||||
"col.inactive_border" = "rgba(f1dca7d9) rgba(ffe1a8d9) 45deg";
|
||||
layout = "dwindle";
|
||||
resize_on_border = true;
|
||||
};
|
||||
group = {
|
||||
"col.border_active" = "rgba(ca6702ff) rgba(ecd3a0ff) 45deg";
|
||||
"col.border_inactive" = "rgba(f1dca7d9) rgba(ffe1a8d9) 45deg";
|
||||
"col.border_locked_active" = "rgba(ca6702ff) rgba(ecd3a0ff) 45deg";
|
||||
"col.border_locked_inactive" = "rgba(f1dca7d9) rgba(ffe1a8d9) 45deg";
|
||||
};
|
||||
####################################################
|
||||
##################################################
|
||||
|
||||
# /$$ /$$ /$$
|
||||
#| $$ /$ | $$ | $$
|
||||
#| $$ /$$$| $$ /$$$$$$ /$$$$$$ | $$ /$$ /$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$
|
||||
#| $$/$$ $$ $$ /$$__ $$ /$$__ $$| $$ /$$/ /$$_____/ /$$__ $$ |____ $$ /$$_____/ /$$__ $$
|
||||
#| $$$$_ $$$$| $$ \ $$| $$ \__/| $$$$$$/ | $$$$$$ | $$ \ $$ /$$$$$$$| $$ | $$$$$$$$
|
||||
#| $$$/ \ $$$| $$ | $$| $$ | $$_ $$ \____ $$| $$ | $$ /$$__ $$| $$ | $$_____/
|
||||
#| $$/ \ $$| $$$$$$/| $$ | $$ \ $$ /$$$$$$$/| $$$$$$$/| $$$$$$$| $$$$$$$| $$$$$$$
|
||||
#|__/ \__/ \______/ |__/ |__/ \__/|_______/ | $$____/ \_______/ \_______/ \_______/
|
||||
# | $$
|
||||
# | $$
|
||||
# |__/
|
||||
# see https://wiki.hypr.land/Configuring/Workspace-Rules/
|
||||
workspace = [
|
||||
"1, layout:master"
|
||||
"2, layout:scrolling, layoutopt:direction:right"
|
||||
"name:special, layout:scrolling"
|
||||
# used for smart gaps along some windowrules
|
||||
#"w[tv1], gapsout:1, gapsin:1"
|
||||
#"f[1], gapsout:1, gapsin:1"
|
||||
];
|
||||
|
||||
# █░█░█ █ █▄░█ █▀▄ █▀█ █░█░█ █▀█ █░█ █░░ █▀▀ █▀
|
||||
# ▀▄▀▄▀ █ █░▀█ █▄▀ █▄█ ▀▄▀▄▀ █▀▄ █▄█ █▄▄ ██▄ ▄█
|
||||
windowrule = [
|
||||
"opacity 0.90 0.90, match:class ^(firefox)$"
|
||||
"opacity 0.90 0.90, match:class ^(Brave-browser)$"
|
||||
"opacity 0.80 0.80, match:class ^(code-oss)$"
|
||||
"opacity 0.80 0.80, match:class ^(Code)$"
|
||||
"opacity 0.80 0.80, match:class ^(code-url-handler)$"
|
||||
"opacity 0.80 0.80, match:class ^(code-insiders-url-handler)$"
|
||||
"opacity 0.75 0.75, match:class ^(kitty)$"
|
||||
"opacity 0.80 0.80, match:class ^(org.kde.dolphin)$"
|
||||
"opacity 0.80 0.80, float on, match:class ^(org.kde.ark)$"
|
||||
"opacity 0.80 0.80, float on, match:class ^(nwg-look)$"
|
||||
"opacity 0.80 0.80, float on, match:class ^(qt5ct)$"
|
||||
"opacity 0.80 0.80, float on, match:class ^(qt6ct)$"
|
||||
"opacity 0.80 0.80, float on, match:class ^(kvantummanager)$"
|
||||
"opacity 0.80 0.70, float on, match:class ^(org.pulseaudio.pavucontrol)$"
|
||||
"opacity 0.80 0.70, float on, match:class ^(blueman-manager)$"
|
||||
"opacity 0.80 0.70, float on, match:class ^(nm-applet)$"
|
||||
"opacity 0.80 0.70, float on, match:class ^(nm-connection-editor)$"
|
||||
"opacity 0.80 0.70, float on, match:class ^(org.kde.polkit-kde-authentication-agent-1)$"
|
||||
"opacity 0.80 0.70, match:class ^(polkit-gnome-authentication-agent-1)$"
|
||||
"opacity 0.80 0.70, match:class ^(org.freedesktop.impl.portal.desktop.gtk)$"
|
||||
"opacity 0.80 0.70, match:class ^(org.freedesktop.impl.portal.desktop.hyprland)$"
|
||||
"opacity 0.70 0.70, match:class ^([Ss]team)$"
|
||||
"opacity 0.70 0.70, match:class ^(steamwebhelper)$"
|
||||
"opacity 0.70 0.70, match:class ^(Spotify)$"
|
||||
"opacity 0.70 0.70, match:initial_title ^(Spotify Free)$"
|
||||
"opacity 0.90 0.90, float on, match:class ^(com.github.rafostar.Clapper)$"
|
||||
"opacity 0.80 0.80, match:class ^(com.github.tchx84.Flatseal)$"
|
||||
"opacity 0.80 0.80, match:class ^(hu.kramo.Cartridges)$"
|
||||
"opacity 0.80 0.80, match:class ^(com.obsproject.Studio)$"
|
||||
"opacity 0.80 0.80, match:class ^(gnome-boxes)$"
|
||||
"opacity 0.80 0.80, match:class ^(discord)$"
|
||||
"opacity 0.80 0.80, match:class ^(WebCord)$"
|
||||
"opacity 0.80 0.80, match:class ^(ArmCord)$"
|
||||
"opacity 0.80 0.80, float on, match:class ^(app.drey.Warp)$"
|
||||
"opacity 0.80 0.80, float on, match:class ^(net.davidotek.pupgui2)$"
|
||||
"opacity 0.80 0.80, float on, match:class ^(yad)$"
|
||||
"opacity 0.80 0.80, float on, match:class ^(Signal)$"
|
||||
"opacity 0.80 0.80, float on, match:class ^(io.github.alainm23.planify)$"
|
||||
"opacity 0.80 0.80, float on, match:class ^(io.gitlab.theevilskeleton.Upscaler)$"
|
||||
"opacity 0.80 0.80, float on, match:class ^(com.github.unrud.VideoDownloader)$"
|
||||
"opacity 0.80 0.80, float on, match:class ^(io.gitlab.adhami3310.Impression)$"
|
||||
"opacity 0.80 0.80, float on, match:class ^(io.missioncenter.MissionCenter)$"
|
||||
"opacity 0.80 0.80, match:class ^(io.github.flattool.Warehouse)$"
|
||||
"float on, match:class ^(org.kde.dolphin)$, match:title ^(Progress Dialog — Dolphin)$"
|
||||
"float on, match:class ^(org.kde.dolphin)$, match:title ^(Copying — Dolphin)$"
|
||||
"float on, match:class ^(firefox)$, match:title ^(Picture-in-Picture)$"
|
||||
"float on, match:class ^(firefox)$, match:title ^(Library)$"
|
||||
"float on, match:class ^(kitty)$, match:title ^(top)$"
|
||||
"float on, match:class ^(kitty)$, match:title ^(btop)$"
|
||||
"float on, match:class ^(kitty)$, match:title ^(htop)$"
|
||||
"float on, match:class ^(vlc)$"
|
||||
"float on, match:class ^(eog)$"
|
||||
"float on, size 400 225, match:class ^(custom-librewolfprofiles)$"
|
||||
"float on, size 1050 200, match:class ^(custom-changeAudioOutput)$"
|
||||
"float on, size 400 175, match:class ^(custom-obsidianvaults)$"
|
||||
"float on, size 600 600, match:initial_class ^(custom-pomodoro)$"
|
||||
"float on, size 1500 800, match:initial_class ^(custom-bottom)$"
|
||||
# smart gaps/border is ugly with caelestia-shell
|
||||
#"border_size 2, match:float 0, match:workspace w[tv1]"
|
||||
#"rounding 1, match:float 0, match:workspace w[tv1]"
|
||||
#"border_size 2, match:float 0, match:workspace f[1]"
|
||||
#"rounding 1, match:float 0, match:workspace f[1]"
|
||||
];
|
||||
# add a float for tomato when in kitty
|
||||
#"plugin:imgborders:noimgborders, tag:noborder"
|
||||
layerrule = [
|
||||
"blur on, ignore_alpha 0, match:namespace rofi"
|
||||
"blur on, ignore_alpha 0, match:namespace notifications"
|
||||
"blur on, ignore_alpha 0, match:namespace swaync-notification-window"
|
||||
"blur on, ignore_alpha 0, match:namespace swaync-control-center"
|
||||
"blur on, match:namespace logout_dialog"
|
||||
];
|
||||
};
|
||||
wayland.windowManager.hyprland.configType = "lua";
|
||||
wayland.windowManager.hyprland.extraConfig = hyprlandLua;
|
||||
};
|
||||
}
|
||||
@@ -1,99 +0,0 @@
|
||||
_: {
|
||||
# for some reason perSystem can't expose pkgs-unstable so we need to expose it here
|
||||
# -----------------------------------------------------
|
||||
# Here are a bunch of scripts that interact with hyprland
|
||||
# Some are still used. Some are broken. Some are deprecated. But I do still keep them in case I want to go back to old tools
|
||||
# -----------------------------------------------------
|
||||
perSystem = {pkgs, ...}: let
|
||||
wallpaper1 = ../../assets/wallpaper1.jpg;
|
||||
wallpaper2 = ../../assets/wallpaper2.jpg;
|
||||
wallpaper3 = ../../assets/wallpaper3.jpg;
|
||||
wallpaper4 = ../../assets/wallpaper4.jpg;
|
||||
wallpaper5 = ../../assets/wallpaper5.jpg;
|
||||
in {
|
||||
# kills the app, but when it's steam or custom-pomodoro
|
||||
packages.custom-dontkillsteam = pkgs.writeShellApplication {
|
||||
name = "custom-dontkillsteam";
|
||||
runtimeInputs = with pkgs; [
|
||||
hyprland
|
||||
jq
|
||||
];
|
||||
text = ''
|
||||
class=$(hyprctl activewindow -j | jq -r ".class")
|
||||
if [[ "$class" == "Steam" || "$class" == "custom-pomodoro" ]]; then
|
||||
hyprctl dispatch movetoworkspacesilent special
|
||||
else
|
||||
hyprctl dispatch killactive ""
|
||||
fi
|
||||
|
||||
'';
|
||||
};
|
||||
packages.custom-killall = pkgs.writeShellApplication {
|
||||
name = "custom-killall";
|
||||
runtimeInputs = [
|
||||
pkgs.hyprland # for some reason pkgs-unstable doesn't work here
|
||||
pkgs.jq
|
||||
];
|
||||
text = ''
|
||||
active_workspace_id=$(hyprctl activeworkspace -j | jq -r '.id')
|
||||
|
||||
hyprctl clients -j |
|
||||
jq -r ".[]
|
||||
| select(.workspace.id==''${active_workspace_id})
|
||||
| select(.focusHistoryID!=0)
|
||||
| .pid" |
|
||||
xargs -r kill
|
||||
'';
|
||||
};
|
||||
packages.custom-wallpaper = pkgs.writeShellApplication {
|
||||
name = "custom-wallpaper";
|
||||
runtimeInputs = with pkgs; [
|
||||
socat
|
||||
swww
|
||||
];
|
||||
text = ''
|
||||
handle() {
|
||||
case $1 in
|
||||
workspace*)
|
||||
str=$1
|
||||
i=$((''${#str}-1))
|
||||
workspace="''${str:$i:1}"
|
||||
case $workspace in
|
||||
1 | 6)
|
||||
swww img -t none ${wallpaper1}
|
||||
;;
|
||||
2 | 7)
|
||||
swww img -t none ${wallpaper2}
|
||||
;;
|
||||
3 | 8)
|
||||
swww img -t none ${wallpaper3}
|
||||
;;
|
||||
4 | 9)
|
||||
swww img -t none ${wallpaper4}
|
||||
;;
|
||||
5 | 10 | 0)
|
||||
swww img -t none ${wallpaper5}
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
socat -U - UNIX-CONNECT:"$XDG_RUNTIME_DIR"/hypr/"$HYPRLAND_INSTANCE_SIGNATURE"/.socket2.sock | while read -r line; do handle "$line"; done
|
||||
'';
|
||||
};
|
||||
packages.custom-launch = pkgs.writeShellApplication {
|
||||
# used for the terminal autostart. Needs to get cleared and recall fastfetch so that the bar from oh-my-zsh get resized
|
||||
# unused
|
||||
name = "custom-launch";
|
||||
runtimeInputs = with pkgs; [
|
||||
zsh
|
||||
];
|
||||
text = ''
|
||||
sleep 2
|
||||
clear
|
||||
zsh
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
{self, ...}: {
|
||||
flake.nixosModules.kdrive = {pkgs-unstable, ...}: {
|
||||
flake.nixosModules.kdrive-laptop = {pkgs-unstable, ...}: {
|
||||
environment.systemPackages = with pkgs-unstable; [
|
||||
rclone
|
||||
self.packages.${pkgs.system}.custom-checkKdrive
|
||||
self.packages.${pkgs.system}.custom-mountkdrive
|
||||
self.packages.${pkgs.system}.custom-mountkdrive-laptop
|
||||
];
|
||||
# removes rclone error
|
||||
programs.fuse = {
|
||||
@@ -11,16 +11,48 @@
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
flake.nixosModules.kdrive-desktop = {pkgs-unstable, ...}: {
|
||||
environment.systemPackages = with pkgs-unstable; [
|
||||
rclone
|
||||
self.packages.${pkgs-unstable.system}.custom-checkKdrive
|
||||
self.packages.${pkgs-unstable.system}.custom-synckdrive-desktop
|
||||
];
|
||||
# removes rclone error
|
||||
programs.fuse = {
|
||||
userAllowOther = true;
|
||||
enable = true;
|
||||
};
|
||||
systemd.user.services.kdrive-sync = {
|
||||
serviceConfig = {
|
||||
ExecStart = "${self.packages.${pkgs-unstable.system}.custom-synckdrive-desktop}/bin/custom-synckdrive";
|
||||
|
||||
Nice = 19; # lowest CPU scheduling priority
|
||||
IOSchedulingClass = "idle";
|
||||
IOSchedulingPriority = 7;
|
||||
|
||||
# Optional:
|
||||
CPUWeight = 1; # minimum relative CPU share
|
||||
};
|
||||
};
|
||||
systemd.user.timers.kdrive-sync = {
|
||||
wantedBy = ["timers.target"];
|
||||
timerConfig = {
|
||||
OnBootSec = "10m";
|
||||
OnUnitActiveSec = "1h";
|
||||
};
|
||||
};
|
||||
};
|
||||
perSystem = {pkgs, ...}: {
|
||||
packages.custom-checkKdrive = pkgs.writeShellApplication {
|
||||
name = "custom-checkKdrive";
|
||||
runtimeInputs = with pkgs; [
|
||||
rclone
|
||||
matrix-commander-rs
|
||||
curl
|
||||
libnotify
|
||||
];
|
||||
text = ''
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
source /run/agenix/ntfy
|
||||
# waits for an internet connection. It pings both Google DNS and Cloudfare dns in case one of them is down
|
||||
until ping -c1 -W1 1.1.1.1 >/dev/null 2>&1 || \
|
||||
ping -c1 -W1 8.8.8.8 >/dev/null 2>&1
|
||||
@@ -40,13 +72,15 @@
|
||||
else
|
||||
echo "kdrive rclone failed with error: $output"
|
||||
notify-send "rclone kdrive failed" "$output"
|
||||
matrix-commander-rs --verbose -m "rclone kdrive failed.<br>Error: <pre>$output</pre><br><a href=\"https://matrix.to/#/@notificationbot_0000:matrix.org\">@notificationbot_0000</a>" \
|
||||
--html \
|
||||
-r "\!7j-78_02dHROeLj4Ns8F12eo4IiZGv4zNsQ_1-WlyIU"
|
||||
curl \
|
||||
-u ":$NTFY_TOKEN" \
|
||||
-d "Rclone couldnt access kdrive (rclone lsd kdrive). Error: $output" \
|
||||
-H "Title: Rclone kdrive" \
|
||||
"$NTFY_SERVER/Alerts"
|
||||
fi
|
||||
'';
|
||||
};
|
||||
packages.custom-mountkdrive = pkgs.writeShellApplication {
|
||||
packages.custom-mountkdrive-laptop = pkgs.writeShellApplication {
|
||||
name = "custom-mountkdrive";
|
||||
runtimeInputs = with pkgs; [
|
||||
rclone
|
||||
@@ -66,5 +100,43 @@
|
||||
fi
|
||||
'';
|
||||
};
|
||||
/*
|
||||
Before setting up we must:
|
||||
* setup the rclone remote
|
||||
`rclone config` choose Webdaw and see login information in bitwarden.
|
||||
* give the good permissions for the hdd
|
||||
`sudo chown -R tomasr:users /home/tomasr/hdd`
|
||||
* Run the bisync once completly
|
||||
`rclone bisync ~/hdd/kdrive/ kdrive: --resync`
|
||||
|
||||
Note : only use the --resync flag once
|
||||
*/
|
||||
packages.custom-synckdrive-desktop = pkgs.writeShellApplication {
|
||||
name = "custom-synckdrive";
|
||||
runtimeInputs = with pkgs; [
|
||||
rclone
|
||||
libnotify
|
||||
ripgrep
|
||||
];
|
||||
text = ''
|
||||
REMOTE_NAME="kdrive"
|
||||
MOUNT_POINT="/home/tomasr/hdd/kdrive"
|
||||
LOGFILE="/tmp/rclone-bisync.log"
|
||||
rm LOGFILE && touch LOGFILE
|
||||
if rclone --config "$HOME/.config/rclone/rclone.conf" listremotes | rg "^''${REMOTE_NAME}:"; then
|
||||
echo "Syncing ''${REMOTE_NAME}..."
|
||||
if ! rclone --config "$HOME/.config/rclone/rclone.conf" bisync "$MOUNT_POINT" "$REMOTE_NAME:" --recover > "$LOGFILE" 2>&1; then
|
||||
notify-send "rclone bisync failed" "$(cat $LOGFILE)"
|
||||
echo "rclone bisync failed"
|
||||
cat $LOGFILE
|
||||
cp $LOGFILE "$HOME/hdd/kdrive/logs/$(date +%Y-%m-%d-%H-%M-%S).log"
|
||||
fi
|
||||
else
|
||||
notify-send "rclone sync failed" \
|
||||
"Remote ''${REMOTE_NAME} not found.\nConfigure rclone and create the dir ~/kdrive/ or comment out the exec line in hyprland.nix."
|
||||
echo "Remote ''${REMOTE_NAME} not found. Configure rclone or fix in ~/nixos/modules/applications/kdrive.nix"
|
||||
fi
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
_: {
|
||||
flake.nixosModules.mathematics = {pkgs, ...}: {
|
||||
environment.systemPackages = with pkgs; [
|
||||
elan
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
_: {
|
||||
flake.nixosModules.mullvad = {pkgs-unstable, ...}: {
|
||||
services.mullvad-vpn = {
|
||||
enable = true;
|
||||
package = pkgs-unstable.mullvad-vpn;
|
||||
};
|
||||
};
|
||||
flake.homeModules.mullvad = {pkgs-unstable, ...}: {
|
||||
programs.mullvad-vpn = {
|
||||
# gui
|
||||
enable = true;
|
||||
package = pkgs-unstable.mullvad-vpn;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,6 +1,8 @@
|
||||
_: {
|
||||
flake.homeModules.neovim = {pkgs-unstable, ...}: {
|
||||
programs.neovim = {
|
||||
withRuby = false;
|
||||
withPython3 = false;
|
||||
enable = true;
|
||||
vimAlias = false;
|
||||
viAlias = false;
|
||||
@@ -50,6 +52,9 @@ _: {
|
||||
pkgs-unstable.vimPlugins.nvim-treesitter-parsers.nix
|
||||
pkgs-unstable.vimPlugins.nvim-treesitter-parsers.printf
|
||||
pkgs-unstable.vimPlugins.nvim-treesitter-parsers.python
|
||||
pkgs-unstable.vimPlugins.nvim-treesitter-parsers.sparql
|
||||
pkgs-unstable.vimPlugins.lean-nvim
|
||||
pkgs-unstable.vimPlugins.vim-ledger
|
||||
pkgs-unstable.vimPlugins.telescope-nvim
|
||||
pkgs-unstable.vimPlugins.nvim-scrollbar
|
||||
pkgs-unstable.vimPlugins.promise-async
|
||||
@@ -63,7 +68,7 @@ _: {
|
||||
pkgs-unstable.vimPlugins.better-diagnostic-virtual-text
|
||||
pkgs-unstable.vimPlugins.garbage-day-nvim
|
||||
];
|
||||
extraLuaConfig = ''
|
||||
initLua = ''
|
||||
|
||||
local vim = vim
|
||||
|
||||
@@ -316,7 +321,7 @@ _: {
|
||||
})
|
||||
vim.lsp.config("pylsp", {
|
||||
cmd = { "pylsp" },
|
||||
filetypes = { "python" },
|
||||
filetypes = { "python", "py" },
|
||||
on_attach = on_attach,
|
||||
settings = {
|
||||
pylsp = {
|
||||
@@ -368,7 +373,7 @@ _: {
|
||||
},
|
||||
})
|
||||
|
||||
vim.lsp.enable({ "lua_ls", "clangd", "pylsp", "texlab", "nixd", "ltex"})
|
||||
vim.lsp.enable({ "lua_ls", "clangd", "pylsp", "texlab", "nixd", "ltex", "leanls"})
|
||||
-- =========================
|
||||
-- DASHBOARD
|
||||
-- =========================
|
||||
@@ -471,7 +476,12 @@ _: {
|
||||
-- =========================
|
||||
require('lualine').setup { options = { theme = "gruvbox_dark" } }
|
||||
|
||||
|
||||
-- ==================
|
||||
-- lean
|
||||
-- ==================
|
||||
require('lean').setup({
|
||||
mappings = true,
|
||||
})
|
||||
--==================0
|
||||
-- Some utils
|
||||
--==================
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
{inputs, ...}: {
|
||||
flake.homeModules.laptop-notewrapper = {pkgs, ...}: {
|
||||
home.packages = [
|
||||
inputs.notewrapper.packages.${pkgs.system}.default
|
||||
];
|
||||
home.file.".config/notewrapper/config.json" = {
|
||||
enable = true;
|
||||
force = true;
|
||||
text = ''
|
||||
{
|
||||
"directory": ["~/Documents/Notes/"],
|
||||
"render": true,
|
||||
"jumpToEndOfFileOnLaunch": true,
|
||||
"editor": "neovim",
|
||||
"journalRegex": ".*journal.*",
|
||||
"dateEntry": "# %Y %m %d %a",
|
||||
"newLineOnOpening": true,
|
||||
"backup": {
|
||||
"enable": true,
|
||||
"directory": {
|
||||
"~/Documents/Notes/": "~/kdrive/Notes/"
|
||||
},
|
||||
"interval": "daily",
|
||||
"rsyncArgs": ["-Lqah", "--update"],
|
||||
"git": {
|
||||
"enable": true,
|
||||
"name": "Tomas Rivera",
|
||||
"email": "tomas.riveral@icloud.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
'';
|
||||
};
|
||||
};
|
||||
flake.homeModules.desktop-notewrapper = {pkgs, ...}: {
|
||||
home.packages = [
|
||||
inputs.notewrapper.packages.${pkgs.system}.default
|
||||
];
|
||||
home.file.".config/notewrapper/config.json" = {
|
||||
enable = true;
|
||||
force = true;
|
||||
text = ''
|
||||
{
|
||||
"directory": ["~/hdd/kdrive/Notes/"],
|
||||
"render": true,
|
||||
"jumpToEndOfFileOnLaunch": true,
|
||||
"editor": "neovim",
|
||||
"journalRegex": ".*journal.*",
|
||||
"dateEntry": "# %Y %m %d %a",
|
||||
"newLineOnOpening": true,
|
||||
"backup": {
|
||||
"enable": false,
|
||||
"directory": {
|
||||
"~/Documents/Notes/": "~/hdd/kdrive/Notes/",
|
||||
"~/test/": "~/backupTest/"
|
||||
},
|
||||
"interval": "daily",
|
||||
"rsyncArgs": ["-Lqah", "--update"]
|
||||
}
|
||||
}
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -3,19 +3,22 @@ _: {
|
||||
programs.ssh = {
|
||||
enable = true;
|
||||
enableDefaultConfig = false; # will be removed in the futur. Removes evaluation warning
|
||||
matchBlocks."*" = {
|
||||
/*
|
||||
settings = {
|
||||
# equivalent to the default config
|
||||
forwardAgent = false;
|
||||
addKeysToAgent = "no";
|
||||
compression = false;
|
||||
#forwardAgent = false;
|
||||
# give errors in home-manager 26.05
|
||||
#addKeysToAgent = "no";
|
||||
#compression = false;
|
||||
serverAliveInterval = 0;
|
||||
serverAliveCountMax = 3;
|
||||
hashKnownHosts = false;
|
||||
userKnownHostsFile = "~/.ssh/known_hosts";
|
||||
controlMaster = "no";
|
||||
controlPath = "~/.ssh/master-%r@%n:%p";
|
||||
controlPersist = "no";
|
||||
#controlMaster = "no";
|
||||
#controlPath = "~/.ssh/master-%r@%n:%p";
|
||||
#controlPersist = "no";
|
||||
};
|
||||
*/
|
||||
};
|
||||
services.ssh-agent.enable = true;
|
||||
home.file.".ssh/config".text = ''
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
_: {
|
||||
|
||||
flake.homeModules.tmux = _: {
|
||||
programs.tmux = {
|
||||
enable = true;
|
||||
clock24 = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,4 +1,32 @@
|
||||
_: {
|
||||
flake.homeModules.waybar-minimal = _: {
|
||||
programs.waybar = {
|
||||
enable = true;
|
||||
settings = [
|
||||
{
|
||||
layer = "top";
|
||||
modules-left = [];
|
||||
modules-center = [];
|
||||
modules-right = [
|
||||
"battery"
|
||||
"clock"
|
||||
];
|
||||
|
||||
battery = {
|
||||
format = "{capacity}% {icon}";
|
||||
states = {
|
||||
warning = 30;
|
||||
critical = 15;
|
||||
};
|
||||
};
|
||||
|
||||
clock = {
|
||||
format = "{:%H:%M}";
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
flake.homeModules.waybar = _: {
|
||||
# replaced by caelestia
|
||||
programs.waybar = {
|
||||
|
||||
@@ -1,22 +1,53 @@
|
||||
{self, ...}: {
|
||||
_: {
|
||||
flake.homeModules.zsh-laptop = _: {
|
||||
programs.zsh = {
|
||||
shellAliases = {
|
||||
snrt = "git -C ~/nixos add -A && time sudo nixos-rebuild test --flake ~/nixos/#laptop && pkill shell || true && pkill caelestia-shell || true && caelestia-shell -n > /dev/null 2>&1 & disown";
|
||||
snrs = "git -C ~/nixos add -A && time sudo nixos-rebuild switch --flake ~/nixos/#laptop && pkill shell || true && pkill caelestia-shell || true && caelestia-shell -n > /dev/null 2>&1 & disown";
|
||||
snrt = ''
|
||||
git -C ~/nixos add -A &&
|
||||
time sudo nixos-rebuild test --flake ~/nixos/#laptop &&
|
||||
pkill shell || true &&
|
||||
if [ ! -f ~/.cache/hypr-battery-saver ]; then
|
||||
pkill caelestia-shell || true &&
|
||||
caelestia-shell -n > /dev/null 2>&1 & disown
|
||||
fi
|
||||
'';
|
||||
|
||||
snrs = ''
|
||||
git -C ~/nixos add -A &&
|
||||
time sudo nixos-rebuild switch --flake ~/nixos/#laptop &&
|
||||
pkill shell || true &&
|
||||
if [ ! -f ~/.cache/hypr-battery-saver ]; then
|
||||
pkill caelestia-shell || true &&
|
||||
caelestia-shell -n > /dev/null 2>&1 & disown
|
||||
fi
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
flake.homeModules.zsh = {pkgs, ...}: {
|
||||
flake.homeModules.zsh-desktop = _: {
|
||||
programs.zsh = {
|
||||
shellAliases = {
|
||||
snrt = "git -C ~/nixos add -A && time sudo nixos-rebuild test --flake ~/nixos/#desktop && pkill shell || true && pkill caelestia-shell || true && caelestia-shell -n > /dev/null 2>&1 & disown";
|
||||
snrs = "git -C ~/nixos add -A && time sudo nixos-rebuild switch --flake ~/nixos/#desktop && pkill shell || true && pkill caelestia-shell || true && caelestia-shell -n > /dev/null 2>&1 & disown";
|
||||
};
|
||||
};
|
||||
};
|
||||
flake.homeModules.zsh = {pkgs-unstable, ...}: {
|
||||
home.packages = [
|
||||
self.packages.${pkgs.system}.dejaManuallyDerived
|
||||
#pkgs-unstable.deja
|
||||
#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
|
||||
@@ -25,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 "$@"
|
||||
@@ -35,8 +66,11 @@
|
||||
}
|
||||
eval "$(direnv hook zsh)"
|
||||
eval "$(deja init zsh)"
|
||||
export PATH="$PATH:$HOME/NoteWrapper" # some project im coding
|
||||
fastfetch''\n'';
|
||||
if [[ "$TERM_PROGRAM" != "vscode" ]]; then
|
||||
fastfetch
|
||||
fi
|
||||
|
||||
'';
|
||||
shellAliases = {
|
||||
".." = "z ..";
|
||||
grep = "rg";
|
||||
@@ -64,6 +98,12 @@
|
||||
nnvim = "nvim";
|
||||
nvvim = "nvim";
|
||||
nviim = "nvim";
|
||||
hledger-ui = "puffin";
|
||||
rm = "trash-put";
|
||||
rml = "trash-list";
|
||||
rmr = "trash-restore";
|
||||
rme = "trash-empty";
|
||||
rmx = "trash-rm";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
+23
-128
@@ -1,9 +1,9 @@
|
||||
_: {
|
||||
flake.nixosModules.battery-laptop = {
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
{
|
||||
self,
|
||||
inputs,
|
||||
...
|
||||
}: {
|
||||
flake.nixosModules.battery-laptop = {pkgs, ...}:
|
||||
# https://discourse.nixos.org/t/what-is-the-best-option-for-power-management/63406/2
|
||||
# we just activate tlp unconditonally
|
||||
#let
|
||||
@@ -22,7 +22,8 @@ _: {
|
||||
# };
|
||||
|
||||
# config = lib.mkIf cfg.battery.enable {
|
||||
powerManagement.powertop.enable = true; # enable powertop auto tuning on startup.
|
||||
/*
|
||||
powerManagement.powertop.enable = true; # enable powertop auto tuning on startup.
|
||||
# Acording to https://community.frame.work/t/solved-keys-stick-and-repeat-after-being-released/51153/12
|
||||
# Some powertop bug is responsable for the problem of the random keypress being stuck
|
||||
# fix: from https://git.gabbie.blue/blue/nixconf/src/commit/2d1bc6dad4684c019b6b3e894408e76e2734806c/hosts/gabbielaptop/configuration.nix#L68
|
||||
@@ -31,27 +32,31 @@ _: {
|
||||
# Retrigger macropad udev rules
|
||||
${lib.getExe' config.systemd.package "udevadm"} trigger -c bind -s usb -a idVendor=32ac -a idProduct=0013
|
||||
'';
|
||||
*/
|
||||
services.system76-scheduler.settings.cfsProfiles.enable = true; # Better scheduling for CPU cycles - thanks System76!!!
|
||||
services.thermald.enable = true; # Enable thermald, the temperature management daemon. (only necessary if on Intel CPUs)
|
||||
services.power-profiles-daemon.enable = false; # Disable GNOMEs power management
|
||||
services.tlp = {
|
||||
services.thermald.enable = false; # Enable thermald, the temperature management daemon. (only necessary if on Intel CPUs)
|
||||
services.power-profiles-daemon.enable = true; # ppd is recommended over tlp for framework 16
|
||||
/*
|
||||
services.tlp = {
|
||||
enable = true; # Enable TLP (better than gnomes internal power manager)
|
||||
settings = {
|
||||
CPU_BOOST_ON_AC = 1;
|
||||
CPU_BOOST_ON_BAT = 1;
|
||||
CPU_HWP_DYN_BOOST_ON_AC = 1;
|
||||
CPU_HWP_DYN_BOOST_ON_BAT = 1;
|
||||
CPU_SCALING_GOVERNOR_ON_AC = "performance";
|
||||
CPU_SCALING_GOVERNOR_ON_AC = "balanced";
|
||||
CPU_SCALING_GOVERNOR_ON_BAT = "powersave";
|
||||
CPU_ENERGY_PERF_POLICY_ON_AC = "performance";
|
||||
CPU_ENERGY_PERF_POLICY_ON_BAT = "balance_power";
|
||||
PLATFORM_PROFILE_ON_AC = "performance";
|
||||
PLATFORM_PROFILE_ON_BAT = "balanced";
|
||||
START_CHARGE_THRESH_BAT1 = 75;
|
||||
STOP_CHARGE_THRESH_BAT1 = 85;
|
||||
CPU_ENERGY_PERF_POLICY_ON_AC = "balanced";
|
||||
CPU_ENERGY_PERF_POLICY_ON_BAT = "powersave";
|
||||
PLATFORM_PROFILE_ON_AC = "balanced";
|
||||
PLATFORM_PROFILE_ON_BAT = "powersave";
|
||||
STOP_CHARGE_THRESH_BAT1 = 80;
|
||||
};
|
||||
};
|
||||
# };
|
||||
*/
|
||||
environment.systemPackages = [
|
||||
self.packages.${pkgs.system}.custom-performance
|
||||
];
|
||||
};
|
||||
perSystem = {pkgs, ...}: let
|
||||
NotifySound = ../../assets/battery_notify.mp3;
|
||||
@@ -331,115 +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
|
||||
gawk
|
||||
libnotify
|
||||
];
|
||||
text = ''
|
||||
HYPRGAMEMODE=$(hyprctl getoption animations:enabled | awk 'NR==1{print $2}')
|
||||
if [ "$HYPRGAMEMODE" = 1 ] ; then
|
||||
hyprctl --batch "\
|
||||
keyword animations:enabled 0;\
|
||||
keyword animation borderangle,0; \
|
||||
keyword decoration:shadow:enabled 0;\
|
||||
keyword decoration:blur:enabled 0;\
|
||||
keyword decoration:fullscreen_opacity 1;\
|
||||
keyword general:gaps_in 0;\
|
||||
keyword general:gaps_out 0;\
|
||||
keyword general:border_size 1;\
|
||||
keyword decoration:rounding 0"
|
||||
notify-send -u critical -t 5000 "Performance mode [ON]"
|
||||
exit
|
||||
else
|
||||
notify-send -u critical -t 5000 "Performance mode [OFF]"
|
||||
hyprctl reload
|
||||
exit 0
|
||||
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;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,16 +1,31 @@
|
||||
_: {
|
||||
flake.nixosModules.bootloader-laptop = {
|
||||
inputs,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
# grub theme
|
||||
boot.loader.grub = {
|
||||
theme = inputs.nixos-grub-themes.packages.${pkgs.system}.nixos; # if you want to use nixos grub theme
|
||||
_: let
|
||||
wallpaper1 = ../../assets/wallpaper1.jpg;
|
||||
wallpaper2 = ../../assets/wallpaper2.jpg;
|
||||
wallpaper3 = ../../assets/wallpaper3.jpg;
|
||||
wallpaper4 = ../../assets/wallpaper4.jpg;
|
||||
wallpaper5 = ../../assets/wallpaper5.jpg;
|
||||
in {
|
||||
flake.nixosModules.bootloader = _: {
|
||||
# disable other bootloaders
|
||||
boot.loader.systemd-boot.enable = false;
|
||||
boot.loader.grub.enable = false;
|
||||
|
||||
boot.loader.limine = {
|
||||
enable = true;
|
||||
efiSupport = true;
|
||||
maxGenerations = 128;
|
||||
style = {
|
||||
wallpaperStyle = "centered";
|
||||
wallpapers = [
|
||||
wallpaper1
|
||||
wallpaper2
|
||||
wallpaper3
|
||||
wallpaper4
|
||||
wallpaper5
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
# Bootloader.
|
||||
boot.loader.systemd-boot.enable = true;
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,241 @@
|
||||
Note : ChatGPT helped me with the disko setup
|
||||
|
||||
This is the layout I'd start with. It's not fully copy-paste ready because you'll need to fill in the actual disk IDs after booting the installer, but it captures the architecture you described:
|
||||
|
||||
* SSD: LUKS → Btrfs
|
||||
* HDD: LUKS → ext4
|
||||
* One password entered at boot
|
||||
* HDD unlocked using a keyfile stored on the SSD
|
||||
* Suitable for a desktop host
|
||||
|
||||
# disko/desktop.nix
|
||||
```
|
||||
|
||||
{
|
||||
disko.devices = {
|
||||
disk = {
|
||||
ssd = {
|
||||
# Replace with actual disk id from:
|
||||
# ls -l /dev/disk/by-id
|
||||
device = "/dev/disk/by-id/REPLACE_SSD_ID";
|
||||
|
||||
type = "disk";
|
||||
|
||||
content = {
|
||||
type = "gpt";
|
||||
|
||||
partitions = {
|
||||
ESP = {
|
||||
size = "1G";
|
||||
type = "EF00";
|
||||
|
||||
content = {
|
||||
type = "filesystem";
|
||||
format = "vfat";
|
||||
mountpoint = "/boot";
|
||||
};
|
||||
};
|
||||
|
||||
luks = {
|
||||
size = "100%";
|
||||
|
||||
content = {
|
||||
type = "luks";
|
||||
name = "cryptroot";
|
||||
|
||||
# You will type this password at boot.
|
||||
settings.allowDiscards = true;
|
||||
|
||||
content = {
|
||||
type = "btrfs";
|
||||
|
||||
extraArgs = [ "-f" ];
|
||||
|
||||
subvolumes = {
|
||||
"@root" = {
|
||||
mountpoint = "/";
|
||||
mountOptions = [
|
||||
"compress=zstd"
|
||||
"noatime"
|
||||
];
|
||||
};
|
||||
|
||||
"@home" = {
|
||||
mountpoint = "/home";
|
||||
mountOptions = [
|
||||
"compress=zstd"
|
||||
"noatime"
|
||||
];
|
||||
};
|
||||
|
||||
"@nix" = {
|
||||
mountpoint = "/nix";
|
||||
mountOptions = [
|
||||
"compress=zstd"
|
||||
"noatime"
|
||||
];
|
||||
};
|
||||
|
||||
"@snapshots" = {
|
||||
mountpoint = "/.snapshots";
|
||||
};
|
||||
|
||||
# Keyfile storage.
|
||||
# This subvolume will contain the key used
|
||||
# to unlock the HDD automatically.
|
||||
"@keys" = {
|
||||
mountpoint = "/keys";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
hdd = {
|
||||
# Replace with actual disk id
|
||||
device = "/dev/disk/by-id/REPLACE_HDD_ID";
|
||||
|
||||
type = "disk";
|
||||
|
||||
content = {
|
||||
type = "gpt";
|
||||
|
||||
partitions = {
|
||||
luks = {
|
||||
size = "100%";
|
||||
|
||||
content = {
|
||||
type = "luks";
|
||||
|
||||
name = "cryptdata";
|
||||
|
||||
# IMPORTANT:
|
||||
# This keyfile will be created after installation.
|
||||
# The SSD unlocks first.
|
||||
# Then this keyfile unlocks the HDD automatically.
|
||||
settings = {
|
||||
keyFile = "/keys/hdd.key";
|
||||
};
|
||||
|
||||
content = {
|
||||
type = "filesystem";
|
||||
format = "ext4";
|
||||
mountpoint = "/data";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
A few notes:
|
||||
|
||||
### 1. You'll need the disk IDs
|
||||
|
||||
On the installer:
|
||||
|
||||
```bash
|
||||
ls -l /dev/disk/by-id
|
||||
```
|
||||
|
||||
Then replace:
|
||||
|
||||
```text
|
||||
REPLACE_SSD_ID
|
||||
REPLACE_HDD_ID
|
||||
```
|
||||
|
||||
with the actual values.
|
||||
|
||||
---
|
||||
|
||||
### 2. The HDD keyfile is a second step
|
||||
|
||||
After installation:
|
||||
|
||||
```bash
|
||||
sudo mkdir -p /keys
|
||||
sudo chmod 700 /keys
|
||||
|
||||
sudo dd if=/dev/urandom of=/keys/hdd.key bs=4096 count=1
|
||||
sudo chmod 000 /keys/hdd.key
|
||||
```
|
||||
|
||||
Then add the key to the HDD LUKS container:
|
||||
|
||||
```bash
|
||||
sudo cryptsetup luksAddKey /dev/disk/by-id/ACTUAL_HDD_PARTITION /keys/hdd.key
|
||||
```
|
||||
|
||||
Now:
|
||||
|
||||
```text
|
||||
boot
|
||||
↓
|
||||
enter SSD password
|
||||
↓
|
||||
SSD unlocks
|
||||
↓
|
||||
keyfile becomes available
|
||||
↓
|
||||
HDD unlocks automatically
|
||||
```
|
||||
|
||||
One password.
|
||||
|
||||
---
|
||||
|
||||
### 3. Btrfs subvolumes
|
||||
|
||||
I intentionally kept it simple:
|
||||
|
||||
```text
|
||||
/
|
||||
/home
|
||||
/nix
|
||||
/.snapshots
|
||||
```
|
||||
|
||||
This is a very common NixOS layout.
|
||||
|
||||
---
|
||||
|
||||
### 4. Swap
|
||||
|
||||
I haven't included swap because there are a few valid choices:
|
||||
|
||||
* swapfile on Btrfs
|
||||
* swap partition inside the SSD LUKS container
|
||||
* zram only
|
||||
|
||||
I'd probably use **zram + a small swapfile** unless you have a very specific workload.
|
||||
|
||||
---
|
||||
|
||||
### 5. Dendritic adaptation
|
||||
|
||||
The actual Disko definition above won't change much.
|
||||
|
||||
The dendritic part is mostly wrapping it in your top-level module structure, something like:
|
||||
|
||||
```nix
|
||||
{
|
||||
flake.diskoConfigurations.desktop = {
|
||||
imports = [
|
||||
./desktop-disko.nix
|
||||
];
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
or whatever convention your repository uses.
|
||||
|
||||
The storage design itself remains the same.
|
||||
@@ -0,0 +1,95 @@
|
||||
_: {
|
||||
flake.diskoConfigurations.desktop = _: {
|
||||
disko.devices = {
|
||||
disk = {
|
||||
ssd = {
|
||||
# Replace with actual disk id from:
|
||||
# ls -l /dev/disk/by-id
|
||||
device = "/dev/disk/by-id/REPLACE_SSD_ID";
|
||||
|
||||
type = "disk";
|
||||
|
||||
content = {
|
||||
type = "gpt";
|
||||
|
||||
partitions = {
|
||||
ESP = {
|
||||
size = "1G";
|
||||
type = "EF00";
|
||||
|
||||
content = {
|
||||
type = "filesystem";
|
||||
format = "vfat";
|
||||
mountpoint = "/boot";
|
||||
};
|
||||
};
|
||||
|
||||
root = {
|
||||
size = "100%";
|
||||
|
||||
content = {
|
||||
type = "btrfs";
|
||||
|
||||
extraArgs = ["-f"];
|
||||
|
||||
subvolumes = {
|
||||
"@root" = {
|
||||
mountpoint = "/";
|
||||
mountOptions = [
|
||||
"compress=zstd"
|
||||
"noatime"
|
||||
];
|
||||
};
|
||||
|
||||
"@home" = {
|
||||
mountpoint = "/home";
|
||||
mountOptions = [
|
||||
"compress=zstd"
|
||||
"noatime"
|
||||
];
|
||||
};
|
||||
|
||||
"@nix" = {
|
||||
mountpoint = "/nix";
|
||||
mountOptions = [
|
||||
"compress=zstd"
|
||||
"noatime"
|
||||
];
|
||||
};
|
||||
|
||||
"@snapshots" = {
|
||||
mountpoint = "/.snapshots";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
hdd = {
|
||||
# Replace with actual disk id
|
||||
device = "/dev/disk/by-id/REPLACE_HDD_ID";
|
||||
|
||||
type = "disk";
|
||||
|
||||
content = {
|
||||
type = "gpt";
|
||||
|
||||
partitions = {
|
||||
data = {
|
||||
size = "100%";
|
||||
|
||||
content = {
|
||||
type = "filesystem";
|
||||
format = "ext4";
|
||||
mountpoint = "/data";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -33,4 +33,53 @@ _: {
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
};
|
||||
flake.nixosModules.hardware-configuration-desktop =
|
||||
# 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,
|
||||
modulesPath,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
(modulesPath + "/installer/scan/not-detected.nix")
|
||||
];
|
||||
|
||||
boot.initrd.availableKernelModules = ["vmd" "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod"];
|
||||
boot.initrd.kernelModules = [];
|
||||
boot.kernelModules = ["kvm-intel"];
|
||||
boot.extraModulePackages = [];
|
||||
|
||||
fileSystems."/" = {
|
||||
device = "/dev/disk/by-uuid/14bcd132-b4a3-46f2-ac35-3497340de4b2";
|
||||
fsType = "btrfs";
|
||||
};
|
||||
|
||||
fileSystems."/home" = {
|
||||
device = "/dev/disk/by-uuid/14bcd132-b4a3-46f2-ac35-3497340de4b2";
|
||||
fsType = "btrfs";
|
||||
options = ["subvol=home"];
|
||||
};
|
||||
|
||||
fileSystems."/nix" = {
|
||||
device = "/dev/disk/by-uuid/14bcd132-b4a3-46f2-ac35-3497340de4b2";
|
||||
fsType = "btrfs";
|
||||
options = ["subvol=nix"];
|
||||
};
|
||||
|
||||
fileSystems."/boot" = {
|
||||
device = "/dev/disk/by-uuid/BAB4-34F6";
|
||||
fsType = "vfat";
|
||||
options = ["fmask=0077" "dmask=0077"];
|
||||
};
|
||||
|
||||
swapDevices = [
|
||||
{device = "/dev/disk/by-uuid/ce6f9a68-0517-4f8a-b375-66f2173efe59";}
|
||||
];
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
};
|
||||
}
|
||||
@@ -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
|
||||
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
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
_: {
|
||||
flake.nixosModules.hdd = {
|
||||
fileSystems."/home/tomasr/hdd" = {
|
||||
device = "/dev/disk/by-uuid/cbe24588-e04f-4ffc-ba44-6fe6ec6d6850";
|
||||
fsType = "ext4";
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
_: {
|
||||
flake.nixosModules.nvidia = _: {
|
||||
hardware.graphics.enable = true;
|
||||
services.xserver.videoDrivers = ["nvidia"];
|
||||
hardware.nvidia.open = true;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{self, ...}: {
|
||||
flake.nixosModules.performance-desktop = {pkgs, ...}: {
|
||||
environment.systemPackages = [
|
||||
self.packages.${pkgs.system}.custom-performance
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
# Note : i should add a way to communicate, annote which commits i should cherry-pick between computers
|
||||
{
|
||||
inputs,
|
||||
self,
|
||||
...
|
||||
}: {
|
||||
flake.nixosConfigurations.desktop = inputs.nixpkgs.lib.nixosSystem {
|
||||
#system = "x86_64-linux";
|
||||
specialArgs = {
|
||||
inherit (self) pkgs-unstable pkgs-master;
|
||||
};
|
||||
modules = with self.nixosModules; [
|
||||
# important do not remove
|
||||
home-manager-desktop
|
||||
desktop
|
||||
{nixpkgs.pkgs = self.pkgs;}
|
||||
# keep this alphabetically organised
|
||||
anki
|
||||
audioAndMedia
|
||||
autoCleanup-desktop
|
||||
autoUpdate-desktop
|
||||
bluetooth
|
||||
bootloader
|
||||
browsers
|
||||
caelestia
|
||||
development
|
||||
documentation
|
||||
disk # this only installs some disk utilities. disko will format the drives
|
||||
fonts
|
||||
games
|
||||
hardware-configuration-desktop
|
||||
hardwareUtils-desktop
|
||||
hdd
|
||||
hledger
|
||||
hledger-desktop
|
||||
hyprland
|
||||
IO
|
||||
kdrive-desktop # we will setup this later
|
||||
latex
|
||||
ly
|
||||
mathematics
|
||||
networking
|
||||
nixUtils
|
||||
notifications
|
||||
nvidia
|
||||
office
|
||||
ollama
|
||||
otherUtils
|
||||
performance-desktop
|
||||
printer
|
||||
rss
|
||||
udev
|
||||
user
|
||||
vpn
|
||||
];
|
||||
};
|
||||
flake.homeModules.desktop = {...}: {
|
||||
imports = with self.homeModules; [
|
||||
inputs.caelestia-shell.homeManagerModules.default
|
||||
anki
|
||||
caelestia
|
||||
caelestia-desktop
|
||||
cursor
|
||||
development
|
||||
eza
|
||||
fastfetch
|
||||
gtk
|
||||
hyprland
|
||||
hyprland-desktop
|
||||
kitty
|
||||
librewolf
|
||||
neovim
|
||||
nix-git-cherry-picker-desktop
|
||||
desktop-notewrapper
|
||||
oh-my-zsh
|
||||
ripgrep
|
||||
rofi
|
||||
sbb-tui
|
||||
ssh
|
||||
swaync # used in performance mode
|
||||
thunderbird
|
||||
tomasr
|
||||
tmux
|
||||
vivify
|
||||
waybar-minimal # used in performance mode
|
||||
zoxide
|
||||
zsh
|
||||
zsh-desktop
|
||||
];
|
||||
};
|
||||
flake.nixosModules.desktop = {pkgs, ...}: {
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "25.11"; # Did you read the comment?
|
||||
nix.settings.experimental-features = [
|
||||
"nix-command"
|
||||
"flakes"
|
||||
];
|
||||
environment.systemPackages = [
|
||||
self.packages.${pkgs.system}.custom-performance
|
||||
];
|
||||
};
|
||||
flake.nixosModules.home-manager-desktop = {pkgs, ...}: {
|
||||
imports = [
|
||||
inputs.home-manager.nixosModules.default # import official home-manager NixOS module
|
||||
];
|
||||
|
||||
# Warning. Git is used in case I break everything up. It already saved me once
|
||||
environment.systemPackages = [pkgs.git];
|
||||
home-manager = {
|
||||
useGlobalPkgs = true;
|
||||
useUserPackages = true;
|
||||
|
||||
extraSpecialArgs = {
|
||||
inherit (self) pkgs-unstable pkgs-master;
|
||||
inherit self;
|
||||
};
|
||||
};
|
||||
|
||||
users.users.tomasr = {
|
||||
isNormalUser = true;
|
||||
};
|
||||
home-manager.users.tomasr = self.homeModules.desktop;
|
||||
};
|
||||
# this is a copy of what is in laptop.nix
|
||||
/*
|
||||
flake.homeModules.tomasr = _: {
|
||||
home.username = "tomasr";
|
||||
home.homeDirectory = "/home/tomasr";
|
||||
|
||||
home.sessionVariables = {
|
||||
EDITOR = "neovim";
|
||||
TERMINAL = "kitty";
|
||||
};
|
||||
|
||||
# Required for Home Manager
|
||||
home.stateVersion = "25.11"; # match your Home Manager release
|
||||
# This value determines the Home Manager release that your configuration is
|
||||
# compatible with. This helps avoid breakage when a new Home Manager release
|
||||
# introduces backwards incompatible changes.
|
||||
#
|
||||
# You should not change this value, even if you update Home Manager. If you do
|
||||
# want to update the value, then make sure to first check the Home Manager
|
||||
# release notes.
|
||||
|
||||
# Let Home Manager install and manage itself.
|
||||
programs.home-manager.enable = true;
|
||||
};
|
||||
*/
|
||||
}
|
||||
@@ -6,7 +6,7 @@
|
||||
flake.nixosConfigurations.laptop = inputs.nixpkgs.lib.nixosSystem {
|
||||
#system = "x86_64-linux";
|
||||
specialArgs = {
|
||||
inherit (self) pkgs-unstable;
|
||||
inherit (self) pkgs-unstable pkgs-local pkgs-master;
|
||||
};
|
||||
modules = with self.nixosModules; [
|
||||
# important do not remove
|
||||
@@ -20,31 +20,39 @@
|
||||
autoUpdate-laptop
|
||||
battery-laptop
|
||||
bluetooth
|
||||
bootloader-laptop
|
||||
bootloader
|
||||
browsers
|
||||
caelestia
|
||||
cs-119l # I'm obliged to use vscode. RIP neovim
|
||||
development
|
||||
documentation
|
||||
disk
|
||||
disk-laptop
|
||||
epfl
|
||||
fonts
|
||||
games
|
||||
gitBackup
|
||||
hardware-configuration-laptop
|
||||
hardwareUtils-laptop
|
||||
hledger
|
||||
hledger-laptop
|
||||
hyprland
|
||||
IO
|
||||
kdrive
|
||||
kdrive-laptop
|
||||
latex
|
||||
ly
|
||||
mullvad
|
||||
mathematics
|
||||
networking
|
||||
nixUtils-laptop
|
||||
nixUtils
|
||||
notifications
|
||||
office
|
||||
#ollama
|
||||
otherUtils
|
||||
printer
|
||||
rss
|
||||
udev
|
||||
user
|
||||
vpn
|
||||
];
|
||||
};
|
||||
flake.homeModules.laptop = {...}: {
|
||||
@@ -52,7 +60,9 @@
|
||||
inputs.caelestia-shell.homeManagerModules.default
|
||||
anki
|
||||
caelestia
|
||||
caelestia-laptop
|
||||
cursor
|
||||
development
|
||||
eza
|
||||
fastfetch
|
||||
git
|
||||
@@ -61,16 +71,20 @@
|
||||
hyprland-laptop
|
||||
kitty
|
||||
librewolf
|
||||
mullvad
|
||||
neovim
|
||||
nix-git-cherry-picker-laptop
|
||||
laptop-notewrapper
|
||||
oh-my-zsh
|
||||
ripgrep
|
||||
rofi
|
||||
sbb-tui
|
||||
ssh
|
||||
swaync # used in performance mode
|
||||
thunderbird
|
||||
tmux
|
||||
tomasr
|
||||
vivify
|
||||
waybar-minimal # used in performance mode
|
||||
zoxide
|
||||
zsh
|
||||
zsh-laptop
|
||||
@@ -101,7 +115,7 @@
|
||||
useUserPackages = true;
|
||||
|
||||
extraSpecialArgs = {
|
||||
inherit (self) pkgs-unstable;
|
||||
inherit (self) pkgs-unstable pkgs-local pkgs-master;
|
||||
inherit self;
|
||||
};
|
||||
};
|
||||
@@ -118,6 +132,8 @@
|
||||
home.sessionVariables = {
|
||||
EDITOR = "neovim";
|
||||
TERMINAL = "kitty";
|
||||
SYSTEMD_PAGER = "cat";
|
||||
PAGER = "cat";
|
||||
};
|
||||
|
||||
# Required for Home Manager
|
||||
|
||||
+36
-19
@@ -27,24 +27,41 @@ _: {
|
||||
services.upower.enable = true;
|
||||
|
||||
# removes need for password for nixos-rebuild
|
||||
security.sudo.extraRules = [
|
||||
{
|
||||
users = ["tomasr"];
|
||||
commands = [
|
||||
{
|
||||
command = "/run/current-system/sw/bin/nixos-rebuild";
|
||||
options = ["NOPASSWD"];
|
||||
}
|
||||
{
|
||||
command = "${pkgs.nixos-rebuild}/bin/nixos-rebuild";
|
||||
options = ["NOPASSWD"];
|
||||
}
|
||||
{
|
||||
command = "${pkgs-unstable.nixos-rebuild}/bin/nixos-rebuild";
|
||||
options = ["NOPASSWD"];
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
security.sudo = {
|
||||
extraRules = [
|
||||
{
|
||||
users = ["tomasr"];
|
||||
commands = [
|
||||
{
|
||||
command = "/run/current-system/sw/bin/nixos-rebuild";
|
||||
options = ["NOPASSWD"];
|
||||
}
|
||||
{
|
||||
command = "${pkgs.nixos-rebuild}/bin/nixos-rebuild";
|
||||
options = ["NOPASSWD"];
|
||||
}
|
||||
{
|
||||
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"];
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
extraConfig = ''
|
||||
Defaults pwfeedback
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
+9
-6
@@ -1,18 +1,19 @@
|
||||
_: {
|
||||
perSystem = {pkgs, ...}: {
|
||||
# fzf librewolf profile selector
|
||||
packages.custom-librewolfprofiles = pkgs.writeShellApplication {
|
||||
name = "custom-librewolfprofiles";
|
||||
packages.custom-browserprofiles = pkgs.writeShellApplication {
|
||||
name = "custom-browserprofiles";
|
||||
runtimeInputs = with pkgs; [
|
||||
zsh
|
||||
fzf
|
||||
tor-browser
|
||||
];
|
||||
text = ''
|
||||
# List of profiles
|
||||
profiles=("work" "other" "private window")
|
||||
profiles=("work" "other" "private window" "tor-browser")
|
||||
|
||||
# Use fzf to select
|
||||
selected=$(printf "%s\n" "''${profiles[@]}" | fzf --height 6 --reverse --prompt="Select LibreWolf profile:")
|
||||
selected=$(printf "%s\n" "''${profiles[@]}" | fzf --height 6 --reverse --prompt="Select browser profile:")
|
||||
|
||||
# If user cancels, exit
|
||||
[[ -z "$selected" ]] && exit 0
|
||||
@@ -20,10 +21,12 @@ _: {
|
||||
# Launch LibreWolf detached, keeping environment
|
||||
if [[ "$selected" == "private window" ]]; then
|
||||
setsid librewolf --private-window --no-remote >/dev/null 2>&1 &
|
||||
pkill -f "kitty.*Select LibreWolf profile"
|
||||
pkill -f "kitty.*Select browser profile"
|
||||
elif [[ "$selected" == "tor-browser" ]]; then
|
||||
setsid tor-browser >/dev/null 2>&1 & pkill -f "kitty.*Select browser profile"
|
||||
else
|
||||
setsid librewolf -P "$selected" --no-remote >/dev/null 2>&1 &
|
||||
pkill -f "kitty.*Select LibreWolf profile"
|
||||
pkill -f "kitty.*Select browser profile"
|
||||
fi
|
||||
|
||||
# Exit the kitty terminal after selection
|
||||
@@ -1,44 +0,0 @@
|
||||
_: {
|
||||
perSystem = {
|
||||
pkgs,
|
||||
pkgs-unstable,
|
||||
...
|
||||
}: {
|
||||
packages.sbb-tuiManuallyDerived = pkgs-unstable.buildGoModule (finalAttrs: {
|
||||
pname = "sbb-tui";
|
||||
version = "1.14.2";
|
||||
__structuredAttrs = true;
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "Necrom4";
|
||||
repo = "sbb-tui";
|
||||
tag = "v${finalAttrs.version}";
|
||||
hash = pkgs.lib.fakeHash;
|
||||
};
|
||||
|
||||
vendorHash = "sha256-K4DOu3rfSlKAa5JNKCzWWpnWZlXXxtN5Po7p1Spqe1w=";
|
||||
|
||||
ldflags = [
|
||||
"-s"
|
||||
"-w"
|
||||
"-X main.version=${finalAttrs.version}"
|
||||
];
|
||||
|
||||
allowGoReference = true;
|
||||
|
||||
doCheck = true;
|
||||
|
||||
nativeCheckInputs = [pkgs.versionCheckHook];
|
||||
|
||||
passthru.updateScript = pkgs.nix-update-script {};
|
||||
|
||||
meta = {
|
||||
description = "TUI client for Switzerland's public transport timetables, inspired by SBB/CFF/FFS app";
|
||||
homepage = "https://github.com/Necrom4/sbb-tui";
|
||||
license = pkgs.lib.licenses.mit;
|
||||
platforms = pkgs.lib.platforms.unix;
|
||||
maintainers = with pkgs.lib.maintainers; [tomasrivera];
|
||||
mainProgram = "sbb-tui";
|
||||
};
|
||||
});
|
||||
};
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
imports = [
|
||||
# adds home-manager options to flake-parts
|
||||
inputs.home-manager.flakeModules.home-manager
|
||||
inputs.disko.flakeModules.default
|
||||
];
|
||||
|
||||
config.systems = [
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
systems = [
|
||||
"x86_64-linux"
|
||||
#"aarch64-linux"
|
||||
#"x86_64-darwin"
|
||||
#"aarch64-darwin"
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{inputs, ...}: {
|
||||
flake.nixosModules.agenix = {pkgs, ...}: {
|
||||
environment.systemPackages = [
|
||||
inputs.agenix.packages.${pkgs.system}.default
|
||||
pkgs.age
|
||||
];
|
||||
age.identityPaths = [
|
||||
"/etc/ssh/ssh_host_ed25519_key"
|
||||
];
|
||||
age.secrets.ntfy = {
|
||||
file = ../../secrets/ntfy.age;
|
||||
owner = "tomasr";
|
||||
group = "users";
|
||||
mode = "0400";
|
||||
};
|
||||
age.secrets.epfl = {
|
||||
file = ../../secrets/epfl.age;
|
||||
owner = "tomasr";
|
||||
group = "users";
|
||||
mode = "0400";
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -19,6 +19,8 @@
|
||||
self.packages.${pkgs.system}.custom-changeAudioOutput
|
||||
kdePackages.okular
|
||||
kdePackages.dolphin
|
||||
kdePackages.dolphin-plugins
|
||||
kdePackages.ark
|
||||
pulseaudio # sound server
|
||||
playerctl # controls media player
|
||||
pavucontrol # PulseAudio Volume Control
|
||||
|
||||
@@ -2,8 +2,12 @@
|
||||
flake.nixosModules.autoCleanup-laptop = {
|
||||
pkgs,
|
||||
pkgs-unstable,
|
||||
config,
|
||||
...
|
||||
}: {
|
||||
age.secrets.ntfy = {
|
||||
file = ../../secrets/ntfy.age;
|
||||
};
|
||||
# Ensure your script is available system-wide
|
||||
environment.systemPackages = [
|
||||
self.packages.${pkgs.system}.custom-cleanNix-laptop
|
||||
@@ -17,6 +21,68 @@
|
||||
description = "NixOS configuration auto cleanup";
|
||||
|
||||
serviceConfig = {
|
||||
Environment = [
|
||||
"NTFY_SECRET=${config.age.secrets.ntfy.path}"
|
||||
];
|
||||
Type = "oneshot";
|
||||
|
||||
ExecStart = "/run/current-system/sw/bin/custom-cleanNix";
|
||||
|
||||
# safety for long rebuilds
|
||||
TimeoutStartSec = "45min";
|
||||
TimeoutStopSec = "10min";
|
||||
|
||||
# avoid overlap
|
||||
RemainAfterExit = true;
|
||||
|
||||
# tweaks that should make the system run normally during the rebuilds
|
||||
Nice = 10;
|
||||
IOSchedulingClass = "best-effort";
|
||||
IOSchedulingPriority = 7;
|
||||
};
|
||||
};
|
||||
|
||||
# Systemd USER timer
|
||||
systemd.user.timers.custom-cleanNix = {
|
||||
wantedBy = ["timers.target"];
|
||||
|
||||
timerConfig = {
|
||||
OnCalendar = "Sat *-*-* 20:00:00"; # runs saturday night. If for whatever reason something breaks. I have whole sunday to fix it.
|
||||
|
||||
Persistent = true; # if it happens during shutted down
|
||||
|
||||
# avoids thundering herd on boot
|
||||
RandomizedDelaySec = "2h";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
## Desktop
|
||||
flake.nixosModules.autoCleanup-desktop = {
|
||||
pkgs,
|
||||
pkgs-unstable,
|
||||
config,
|
||||
...
|
||||
}: {
|
||||
age.secrets.ntfy = {
|
||||
file = ../../secrets/ntfy.age;
|
||||
};
|
||||
# Ensure your script is available system-wide
|
||||
environment.systemPackages = [
|
||||
self.packages.${pkgs.system}.custom-cleanNix-desktop
|
||||
pkgs-unstable.statix
|
||||
];
|
||||
users.users.tomasr = {
|
||||
linger = true; # lingering is required
|
||||
};
|
||||
|
||||
systemd.user.services.custom-cleanNix = {
|
||||
description = "NixOS configuration auto cleanup";
|
||||
|
||||
serviceConfig = {
|
||||
Environment = [
|
||||
"NTFY_SECRET=${config.age.secrets.ntfy.path}"
|
||||
];
|
||||
Type = "oneshot";
|
||||
|
||||
ExecStart = "/run/current-system/sw/bin/custom-cleanNix";
|
||||
@@ -56,14 +122,18 @@
|
||||
runtimeInputs = with pkgs; [
|
||||
git
|
||||
nixos-rebuild
|
||||
matrix-commander-rs
|
||||
curl
|
||||
libnotify
|
||||
alejandra
|
||||
deadnix
|
||||
statix
|
||||
];
|
||||
|
||||
text = ''
|
||||
set -e
|
||||
set -ex
|
||||
|
||||
# shellcheck disable=SC1090
|
||||
source "$NTFY_SECRET"
|
||||
|
||||
FLAKE_DIR="/home/tomasr/nixos"
|
||||
FLAKE="$FLAKE_DIR#laptop"
|
||||
@@ -87,7 +157,7 @@
|
||||
alejandra "$FLAKE_DIR" # formats the config
|
||||
echo "--------------------------------------------------------------"
|
||||
|
||||
if sudo /run/current-system/sw/bin/nixos-rebuild switch --flake "$FLAKE" 2> "$ERROR_FILE"; then # use /run/.../bin/ uses the sudoless rule
|
||||
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 ! git -C "$FLAKE_DIR" diff --quiet HEAD; then
|
||||
git -C "$FLAKE_DIR" add -A
|
||||
@@ -96,9 +166,11 @@
|
||||
|
||||
notify-send "Nix auto cleanup" "Everything OK"
|
||||
|
||||
matrix-commander-rs --verbose -m "Nix auto cleanup. Everything OK.<br><a href=\"https://matrix.to/#/@notificationbot_0000:matrix.org\">@notificationbot_0000</a>" \
|
||||
--html \
|
||||
-r "\!7j-78_02dHROeLj4Ns8F12eo4IiZGv4zNsQ_1-WlyIU"
|
||||
curl \
|
||||
-u ":$NTFY_TOKEN" \
|
||||
-d "Everything OK" \
|
||||
-H "Title: Laptop Nix auto cleanup" \
|
||||
"$NTFY_SERVER/Alerts"
|
||||
else
|
||||
notify-send "Nix auto cleanup" "No changes"
|
||||
git -C "$FLAKE_DIR" push
|
||||
@@ -109,9 +181,89 @@
|
||||
|
||||
notify-send -u critical "Nix auto cleanup" "FAILED"
|
||||
|
||||
matrix-commander-rs --verbose -m "Nix auto cleanup failed.<br>Error: <pre>$ERROR_MSG</pre><br><a href=\"https://matrix.to/#/@notificationbot_0000:matrix.org\">@notificationbot_0000</a>" \
|
||||
--html \
|
||||
-r "\!7j-78_02dHROeLj4Ns8F12eo4IiZGv4zNsQ_1-WlyIU"
|
||||
curl \
|
||||
-u ":$NTFY_TOKEN" \
|
||||
-d "Nix auto cleanup failed. Error: $ERROR_MSG" \
|
||||
-H "Title: Laptop Nix auto cleanup" \
|
||||
"$NTFY_SERVER/Alerts"
|
||||
|
||||
git -C "$FLAKE_DIR" reset --hard "pre-cleanup-$TIME"
|
||||
fi
|
||||
git -C "$FLAKE_DIR" tag -d "pre-cleanup-$TIME" # removes the tag
|
||||
|
||||
rm -f "$ERROR_FILE"
|
||||
'';
|
||||
};
|
||||
packages.custom-cleanNix-desktop = pkgs.writeShellApplication {
|
||||
name = "custom-cleanNix";
|
||||
|
||||
runtimeInputs = with pkgs; [
|
||||
git
|
||||
nixos-rebuild
|
||||
curl
|
||||
libnotify
|
||||
alejandra
|
||||
deadnix
|
||||
statix
|
||||
];
|
||||
|
||||
text = ''
|
||||
set -ex
|
||||
|
||||
# shellcheck disable=SC1090
|
||||
source "$NTFY_SECRET"
|
||||
|
||||
FLAKE_DIR="/home/tomasr/nixos"
|
||||
FLAKE="$FLAKE_DIR#desktop"
|
||||
TIME=$(date -u +"%Y-%m-%dT%H-%M-%SZ")
|
||||
|
||||
ERROR_FILE=$(mktemp)
|
||||
|
||||
# snapshot current state
|
||||
git -C "$FLAKE_DIR" add -A
|
||||
git -C "$FLAKE_DIR" commit --allow-empty -m "snapshot pre-cleanup-$TIME"
|
||||
git -C "$FLAKE_DIR" tag "pre-cleanup-$TIME" HEAD
|
||||
|
||||
# the echos are to separate what each one is doing. Just for curiosity
|
||||
echo "deadnix scans your Nix code and removes or reports unused (dead) variables and bindings"
|
||||
deadnix --edit "$FLAKE_DIR" # removes unused code
|
||||
echo "--------------------------------------------------------------"
|
||||
echo "statix lints your Nix code to find stylistic issues, bad patterns, and potential mistakes."
|
||||
statix fix "$FLAKE_DIR" # check other linting issues
|
||||
echo "--------------------------------------------------------------"
|
||||
echo "alejandra formats your Nix code consistently according to a strict, opinionated style."
|
||||
alejandra "$FLAKE_DIR" # formats the config
|
||||
echo "--------------------------------------------------------------"
|
||||
|
||||
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 ! git -C "$FLAKE_DIR" diff --quiet HEAD; then
|
||||
git -C "$FLAKE_DIR" add -A
|
||||
git -C "$FLAKE_DIR" commit -m "Auto: cleanup-$TIME"
|
||||
git -C "$FLAKE_DIR" push
|
||||
|
||||
notify-send "Nix auto cleanup" "Everything OK"
|
||||
|
||||
curl \
|
||||
-u ":$NTFY_TOKEN" \
|
||||
-d "Everything OK" \
|
||||
-H "Title: Desktop Nix auto cleanup" \
|
||||
"$NTFY_SERVER/Alerts"
|
||||
else
|
||||
notify-send "Nix auto cleanup" "No changes"
|
||||
git -C "$FLAKE_DIR" push
|
||||
fi
|
||||
|
||||
else
|
||||
ERROR_MSG=$(cat "$ERROR_FILE")
|
||||
|
||||
notify-send -u critical "Nix auto cleanup" "FAILED"
|
||||
|
||||
curl \
|
||||
-u ":$NTFY_TOKEN" \
|
||||
-d "Nix auto cleanup failed. Error: $ERROR_MSG" \
|
||||
-H "Title: Desktop Nix auto cleanup" \
|
||||
"$NTFY_SERVER/Alerts"
|
||||
|
||||
git -C "$FLAKE_DIR" reset --hard "pre-cleanup-$TIME"
|
||||
fi
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
{self, ...}: {
|
||||
flake.nixosModules.autoUpdate-laptop = {pkgs, ...}: {
|
||||
flake.nixosModules.autoUpdate-laptop = {
|
||||
pkgs,
|
||||
config,
|
||||
...
|
||||
}: {
|
||||
age.secrets.ntfy = {
|
||||
file = ../../secrets/ntfy.age;
|
||||
};
|
||||
# Ensure your script is available system-wide
|
||||
environment.systemPackages = [
|
||||
self.packages.${pkgs.system}.custom-autoupdate-laptop
|
||||
@@ -44,6 +51,60 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
## desktop
|
||||
flake.nixosModules.autoUpdate-desktop = {
|
||||
pkgs,
|
||||
config,
|
||||
...
|
||||
}: {
|
||||
age.secrets.ntfy = {
|
||||
file = ../../secrets/ntfy.age;
|
||||
};
|
||||
# Ensure your script is available system-wide
|
||||
environment.systemPackages = [
|
||||
self.packages.${pkgs.system}.custom-autoupdate-desktop
|
||||
];
|
||||
users.users.tomasr = {
|
||||
linger = true; # lingering is required
|
||||
};
|
||||
|
||||
systemd.user.services.custom-autoupdate = {
|
||||
description = "NixOS flake auto update";
|
||||
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
|
||||
ExecStart = "/run/current-system/sw/bin/custom-autoupdate";
|
||||
|
||||
# safety for long rebuilds
|
||||
TimeoutStartSec = "45min";
|
||||
TimeoutStopSec = "10min";
|
||||
|
||||
# avoid overlap
|
||||
RemainAfterExit = true;
|
||||
|
||||
# tweaks that should make the system run normally during the rebuilds
|
||||
Nice = 10;
|
||||
IOSchedulingClass = "best-effort";
|
||||
IOSchedulingPriority = 7;
|
||||
};
|
||||
};
|
||||
|
||||
# Systemd USER timer
|
||||
systemd.user.timers.custom-autoupdate = {
|
||||
wantedBy = ["timers.target"];
|
||||
|
||||
timerConfig = {
|
||||
OnCalendar = "Fri *-*-* 20:00:00"; # runs friday night. If for whatever reason something breaks. I have whole week-end to fix it.
|
||||
|
||||
Persistent = true; # if it happens during shutted down
|
||||
|
||||
# avoids thundering herd on boot
|
||||
RandomizedDelaySec = "2h";
|
||||
};
|
||||
};
|
||||
};
|
||||
perSystem = {pkgs, ...}: {
|
||||
packages.custom-autoupdate-laptop = pkgs.writeShellApplication {
|
||||
name = "custom-autoupdate";
|
||||
@@ -56,6 +117,8 @@
|
||||
];
|
||||
|
||||
text = ''
|
||||
# shellcheck disable=SC1090
|
||||
source "$NTFY_SECRET"
|
||||
set -e
|
||||
|
||||
FLAKE_DIR="/home/tomasr/nixos"
|
||||
@@ -81,9 +144,11 @@
|
||||
|
||||
notify-send "Flake autoupdate" "Rebuild OK"
|
||||
|
||||
matrix-commander-rs --verbose -m "Flake rebuild succesfull.<br><a href=\"https://matrix.to/#/@notificationbot_0000:matrix.org\">@notificationbot_0000</a>" \
|
||||
--html \
|
||||
-r "\!7j-78_02dHROeLj4Ns8F12eo4IiZGv4zNsQ_1-WlyIU"
|
||||
curl \
|
||||
-u ":$NTFY_TOKEN" \
|
||||
-d "Laptop Flake rebuild successful" \
|
||||
-H "Title: Flake autoupdate" \
|
||||
"$NTFY_SERVER/Alerts"
|
||||
else
|
||||
notify-send "Flake autoupdate" "No changes"
|
||||
git -C "$FLAKE_DIR" push
|
||||
@@ -94,9 +159,79 @@
|
||||
|
||||
notify-send -u critical "Flake autoupdate" "FAILED"
|
||||
|
||||
matrix-commander-rs --verbose -m "Flake rebuild failed.<br>Error: <pre>$ERROR_MSG</pre><br><a href=\"https://matrix.to/#/@notificationbot_0000:matrix.org\">@notificationbot_0000</a>" \
|
||||
--html \
|
||||
-r "\!7j-78_02dHROeLj4Ns8F12eo4IiZGv4zNsQ_1-WlyIU"
|
||||
curl \
|
||||
-u ":$NTFY_TOKEN" \
|
||||
-d "Laptop Flake rebuild failed. Error: $ERROR_MSG" \
|
||||
-H "Title: Flake autoupdate FAILED" \
|
||||
-H "Priority: urgent" \
|
||||
"$NTFY_SERVER/Alerts"
|
||||
|
||||
git -C "$FLAKE_DIR" reset --hard "pre-autoupdate-$TIME"
|
||||
fi
|
||||
|
||||
git -C "$FLAKE_DIR" tag -d "pre-autoupdate-$TIME" # removes the tag
|
||||
|
||||
rm -f "$ERROR_FILE"
|
||||
'';
|
||||
};
|
||||
packages.custom-autoupdate-desktop = pkgs.writeShellApplication {
|
||||
name = "custom-autoupdate";
|
||||
|
||||
runtimeInputs = with pkgs; [
|
||||
git
|
||||
nixos-rebuild
|
||||
matrix-commander-rs
|
||||
libnotify
|
||||
];
|
||||
|
||||
text = ''
|
||||
set -e
|
||||
|
||||
FLAKE_DIR="/home/tomasr/nixos"
|
||||
FLAKE="$FLAKE_DIR#desktop"
|
||||
TIME=$(date -u +"%Y-%m-%dT%H-%M-%SZ")
|
||||
|
||||
ERROR_FILE=$(mktemp)
|
||||
|
||||
# snapshot current state
|
||||
git -C "$FLAKE_DIR" add -A
|
||||
git -C "$FLAKE_DIR" commit --allow-empty -m "snapshot pre-autoupdate-$TIME"
|
||||
git -C "$FLAKE_DIR" tag "pre-autoupdate-$TIME" HEAD
|
||||
|
||||
# update lock only
|
||||
nix flake update --flake "$FLAKE_DIR"
|
||||
|
||||
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
|
||||
git -C "$FLAKE_DIR" commit -m "flake.lock: autoupdate-$TIME"
|
||||
git -C "$FLAKE_DIR" push
|
||||
|
||||
notify-send "Flake autoupdate" "Rebuild OK"
|
||||
|
||||
curl \
|
||||
-u ":$NTFY_TOKEN" \
|
||||
-d "Flake rebuild successful" \
|
||||
-H "Title: Desktop Flake autoupdate" \
|
||||
"$NTFY_SERVER/Alerts"
|
||||
|
||||
else
|
||||
notify-send "Flake autoupdate" "No changes"
|
||||
git -C "$FLAKE_DIR" push
|
||||
fi
|
||||
|
||||
else
|
||||
ERROR_MSG=$(cat "$ERROR_FILE")
|
||||
|
||||
notify-send -u critical "Flake autoupdate" "FAILED"
|
||||
|
||||
curl \
|
||||
-u ":$NTFY_TOKEN" \
|
||||
-d "Flake rebuild failed. Error: $ERROR_MSG" \
|
||||
-H "Title: Desktop Flake autoupdate FAILED" \
|
||||
-H "Priority: urgent" \
|
||||
"$NTFY_SERVER/Alerts"
|
||||
|
||||
git -C "$FLAKE_DIR" reset --hard "pre-autoupdate-$TIME"
|
||||
fi
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
_: {
|
||||
flake.nixosModules.hledger = {pkgs, ...}: {
|
||||
environment.systemPackages = with pkgs; [
|
||||
hledger
|
||||
hledger-ui
|
||||
hledger-web
|
||||
asciinema # used for some hledger demos
|
||||
];
|
||||
};
|
||||
flake.nixosModules.hledger-laptop = _: {
|
||||
environment.variables = {
|
||||
LEDGER_FILE = "/home/tomasr/kdrive/Budget/hledger.journal";
|
||||
};
|
||||
};
|
||||
flake.nixosModules.hledger-desktop = _: {
|
||||
environment.variables = {
|
||||
LEDGER_FILE = "/home/tomasr/hdd/kdrive/Budget/hledger.journal";
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -2,44 +2,28 @@
|
||||
flake.nixosModules.notifications = {pkgs, ...}: {
|
||||
environment.systemPackages = with pkgs; [
|
||||
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 swww to change wallpapers dinamically)
|
||||
matrix-commander-rs # matrix client used to send notifications from scripts to my phone
|
||||
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
|
||||
# checks if matrix-commander-rs is installed and logged in
|
||||
self.packages.${pkgs.system}.custom-checkMatrix
|
||||
/*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, ...}: {
|
||||
packages.custom-checkMatrix = pkgs.writeShellApplication {
|
||||
name = "custom-checkMatrix";
|
||||
|
||||
runtimeInputs = with pkgs; [
|
||||
matrix-commander-rs
|
||||
libnotify
|
||||
];
|
||||
|
||||
text = ''
|
||||
expected="@totorile1:unredacted.org"
|
||||
|
||||
current="$(matrix-commander-rs --whoami | tr -d '\n')"
|
||||
|
||||
if [ "$current" != "$expected" ]; then
|
||||
notify-send "matrix-commander-rs" \
|
||||
"You are not logged in as @totorile1:unredacted.org\nLog:\n$current"
|
||||
fi
|
||||
'';
|
||||
};
|
||||
packages.custom-gitnotify = pkgs.writeShellApplication {
|
||||
name = "custom-gitnotify";
|
||||
runtimeInputs = with pkgs; [
|
||||
git
|
||||
libnotify
|
||||
curl
|
||||
];
|
||||
text = ''
|
||||
# shellcheck disable=SC1091
|
||||
source /run/agenix/ntfy
|
||||
|
||||
# Check if git is installed
|
||||
if ! command -v git >/dev/null 2>&1; then
|
||||
exit 0
|
||||
@@ -52,9 +36,10 @@
|
||||
notify-send \
|
||||
"Git not configured" \
|
||||
"Set your identity\n or remove this warning by removing the custom-gitnotify line in\n ~/nixos/modules/applications/hyprland.nix"
|
||||
matrix-commander-rs --verbose -m "Git not configured.<br>Set your identify or remove this warning by removing the custom-gitnotify in ~/nixos/modules/applications/hyprland.nix<br><a href=\"https://matrix.to/#/@notificationbot_0000:matrix.org\">@notificationbot_0000</a>" \
|
||||
--html \
|
||||
-r "\!7j-78_02dHROeLj4Ns8F12eo4IiZGv4zNsQ_1-WlyIU"
|
||||
curl \
|
||||
-u ":$NTFY_TOKEN" \
|
||||
-d "Git not configured" \
|
||||
"$NTFY_SERVER/Alerts"
|
||||
fi
|
||||
'';
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
_: {
|
||||
{inputs, ...}: {
|
||||
flake.nixosModules.development = {
|
||||
pkgs,
|
||||
pkgs-unstable,
|
||||
@@ -17,19 +17,45 @@ _: {
|
||||
]))
|
||||
python313Packages.pygments # used for ccat (comment of colorize plugin from oh-my-zsh)
|
||||
pkg-config
|
||||
nixpkgs-review
|
||||
gdb
|
||||
raylib
|
||||
glfw # raylib and some dependecies
|
||||
gnumake
|
||||
go
|
||||
direnv
|
||||
git
|
||||
gh
|
||||
cling # c interpreter used for coding
|
||||
# lsp
|
||||
clang-tools
|
||||
python311Packages.python-lsp-server
|
||||
python314Packages.python-lsp-server
|
||||
ltex-ls-plus
|
||||
pylint
|
||||
black
|
||||
gnupg
|
||||
pinentry-curses
|
||||
inputs.nixpkgs-notifier.packages.${pkgs.system}.default
|
||||
inputs.patent.packages.${pkgs.system}.default
|
||||
];
|
||||
};
|
||||
flake.homeModules.development = _: {
|
||||
home.file.".config/nixpkgs-notifier/config.json" = {
|
||||
enable = true;
|
||||
text = ''
|
||||
{
|
||||
"configTime": 3600,
|
||||
"configFetchTime": 1,
|
||||
"localNotify": true,
|
||||
"matrix": {
|
||||
"enable": true,
|
||||
"room": "!BXRRokBmEdNOyYdfOF:matrix.org",
|
||||
"ping": true,
|
||||
"userPing": "@notificationbot_0000",
|
||||
"userPingServer": "matrix.org"
|
||||
}
|
||||
}
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
in {
|
||||
flake.nixosModules.documentation = {pkgs, ...}: {
|
||||
# unfortunatly this adds a lot of computation when nix rebuilds
|
||||
documentation.man.generateCaches = true; # used for the man script
|
||||
documentation.man.cache.enable = true; # used for the man script
|
||||
|
||||
environment.pathsToLink = [
|
||||
# see https://wiki.nixos.org/wiki/Documentation_Gaps#How_do_manpages_work?_Or:_environment.pathsToLink_and_buildEnv
|
||||
|
||||
@@ -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
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
{self, ...}: {
|
||||
flake.nixosModules.gitBackup = {
|
||||
pkgs,
|
||||
config,
|
||||
...
|
||||
}: {
|
||||
age.secrets.ntfy = {
|
||||
file = ../../secrets/ntfy.age;
|
||||
};
|
||||
environment.systemPackages = [
|
||||
self.packages.${pkgs.system}.custom-gitBackup
|
||||
];
|
||||
|
||||
systemd.user.services.custom-gitBackup = {
|
||||
description = "Backup selected git repos";
|
||||
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
Environment = [
|
||||
"NTFY_SECRET=${config.age.secrets.ntfy.path}"
|
||||
];
|
||||
|
||||
ExecStart = "/run/current-system/sw/bin/custom-gitBackup";
|
||||
|
||||
TimeoutStartSec = "45min";
|
||||
TimeoutStopSec = "10min";
|
||||
|
||||
RemainAfterExit = true;
|
||||
|
||||
Nice = 10;
|
||||
IOSchedulingClass = "best-effort";
|
||||
IOSchedulingPriority = 7;
|
||||
};
|
||||
};
|
||||
|
||||
# Systemd USER timer
|
||||
systemd.user.timers.custom-gitBackup = {
|
||||
wantedBy = ["timers.target"];
|
||||
|
||||
timerConfig = {
|
||||
OnCalendar = "Thu *-*-* 12:00:00";
|
||||
|
||||
Persistent = true; # if it happens during shutted down
|
||||
|
||||
RandomizedDelaySec = "20min";
|
||||
};
|
||||
};
|
||||
};
|
||||
perSystem = {pkgs, ...}: {
|
||||
packages.custom-gitBackup = pkgs.writeShellApplication {
|
||||
name = "custom-gitBackup";
|
||||
runtimeInputs = with pkgs; [
|
||||
rsync
|
||||
curl
|
||||
libnotify
|
||||
self.packages.${pkgs.system}.custom-checkKdrive
|
||||
];
|
||||
text = ''
|
||||
# shellcheck disable=SC1090
|
||||
source "$NTFY_SECRET"
|
||||
|
||||
# checks if kdrive is available
|
||||
custom-checkKdrive
|
||||
|
||||
REPOS=(
|
||||
"https://github.com/tomasriveral/nixos.git"
|
||||
"https://github.com/tomasriveral/notewrapper.git"
|
||||
"https://github.com/tomasriveral/fractal-cli.git"
|
||||
"https://github.com/tomasriveral/boids.git"
|
||||
"https://github.com/tomasriveral/nixpkgs-notifier.git"
|
||||
"https://github.com/tomasriveral/Nix-Git-Cherry-Picker.git"
|
||||
"https://github.com/tomasriveral/ReSSPublica.git"
|
||||
)
|
||||
|
||||
LOCAL_BACKUP_DIR="$HOME/.gitBackups"
|
||||
CLOUD_DIR="$HOME/kdrive/Code/gitBackups"
|
||||
|
||||
# Create backup directories if they don't exist
|
||||
mkdir -p "$LOCAL_BACKUP_DIR"
|
||||
mkdir -p "$CLOUD_DIR"
|
||||
|
||||
notify_error() {
|
||||
local message="$1"
|
||||
notify-send "Git Backup Failed" "$message"
|
||||
curl \
|
||||
-u ":$NTFY_TOKEN" \
|
||||
-d "Git backup failed. Error: $message" \
|
||||
-H "Title: Git Backup" \
|
||||
"$NTFY_SERVER/Alerts"
|
||||
|
||||
}
|
||||
|
||||
for REPO in "''${REPOS[@]}"; do
|
||||
# Extract repo name (without .git)
|
||||
REPO_NAME=$(basename "$REPO" .git)
|
||||
LOCAL_REPO_PATH="$LOCAL_BACKUP_DIR/$REPO_NAME.git"
|
||||
|
||||
if [ ! -d "$LOCAL_REPO_PATH" ]; then
|
||||
# Clone mirror if it doesn't exist
|
||||
echo "Cloning $REPO..."
|
||||
git clone --mirror "$REPO" "$LOCAL_REPO_PATH" || { notify_error "Failed to clone $REPO"; continue; }
|
||||
else
|
||||
# Update existing mirror
|
||||
echo "Updating $REPO..."
|
||||
cd "$LOCAL_REPO_PATH" || { notify_error "Cannot enter $LOCAL_REPO_PATH"; continue; }
|
||||
git remote update || { notify_error "Failed to update $REPO"; continue; }
|
||||
fi
|
||||
|
||||
# Rsync to cloud directory (only changes, preserve permissions)
|
||||
echo "Syncing $REPO_NAME to cloud..."
|
||||
rsync -a --delete "$LOCAL_REPO_PATH/" "$CLOUD_DIR/$REPO_NAME/" || { notify_error "Failed to rsync $REPO_NAME"; continue; }
|
||||
|
||||
done
|
||||
|
||||
echo "All backups completed."
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{inputs, ...}: {
|
||||
flake.homeModules.nix-git-cherry-picker-laptop = {pkgs, ...}: {
|
||||
home.packages = [
|
||||
inputs.nix-git-cherry-picker.packages.${pkgs.system}.default
|
||||
];
|
||||
home.file.".config/nix-git-cherry-picker/config.json" = {
|
||||
enable = true;
|
||||
text = ''
|
||||
{
|
||||
"localBranch": "laptop",
|
||||
"remoteBranch": "desktop",
|
||||
"nixConfigPath": "/home/tomasr/nixos/"
|
||||
}
|
||||
'';
|
||||
force = true;
|
||||
};
|
||||
};
|
||||
flake.homeModules.nix-git-cherry-picker-desktop = {pkgs, ...}: {
|
||||
home.packages = [
|
||||
inputs.nix-git-cherry-picker.packages.${pkgs.system}.default
|
||||
];
|
||||
home.file.".config/nix-git-cherry-picker/config.json" = {
|
||||
enable = true;
|
||||
text = ''
|
||||
{
|
||||
"localBranch": "desktop",
|
||||
"remoteBranch": "laptop",
|
||||
"nixConfigPath": "/home/tomasr/nixos/"
|
||||
}
|
||||
'';
|
||||
force = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,4 +1,8 @@
|
||||
{inputs, ...}: {
|
||||
{
|
||||
inputs,
|
||||
self,
|
||||
...
|
||||
}: {
|
||||
flake.nixosModules.nixUtils-laptop = _: {
|
||||
# nixpkgs-review crashed my laptop multiple times. We must reduce how much ressources it can take.
|
||||
# for reference, my laptop is a 12 core ryzen 7
|
||||
@@ -6,10 +10,18 @@
|
||||
nix.settings.cores = 6;
|
||||
};
|
||||
flake.nixosModules.nixUtils = {pkgs-unstable, ...}: {
|
||||
# Optimise the nix store
|
||||
nix.optimise = {
|
||||
automatic = true;
|
||||
persistent = true;
|
||||
randomizedDelaySec = "30min";
|
||||
dates = "Thu *-*-* 16:00:00";
|
||||
};
|
||||
# Garbage collector of generations
|
||||
nix.gc = {
|
||||
automatic = true;
|
||||
dates = "weekly";
|
||||
dates = "Wed *-*-* 16:00:00";
|
||||
persistent = true;
|
||||
options = "--delete-older-than 7d"; # every week delete generations older than a month
|
||||
};
|
||||
|
||||
@@ -32,6 +44,8 @@
|
||||
vimPluginsUpdater # used for building plugins
|
||||
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, ...}: {
|
||||
|
||||
@@ -3,6 +3,12 @@ _: {
|
||||
environment.systemPackages = with pkgs; [
|
||||
libreoffice
|
||||
birdtray
|
||||
kdePackages.korganizer
|
||||
#needed for korganizer
|
||||
kdePackages.akonadi
|
||||
kdePackages.akonadi-calendar
|
||||
kdePackages.akonadi-calendar-tools
|
||||
];
|
||||
programs.kde-pim.kontact = true; # needed for korganizer
|
||||
};
|
||||
}
|
||||
@@ -1,11 +1,7 @@
|
||||
{self, ...}: {
|
||||
flake.nixosModules.otherUtils =
|
||||
# try to keep packages here at a minium. Preferably use a dedicated file
|
||||
{
|
||||
pkgs,
|
||||
pkgs-unstable,
|
||||
...
|
||||
}: {
|
||||
{pkgs, pkgs-unstable, ...}: {
|
||||
environment.systemPackages = with pkgs; [
|
||||
gnome-calculator
|
||||
snapshot
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
_: {
|
||||
flake.nixosModules.rss = {pkgs, ...}: {
|
||||
environment.systemPackages = with pkgs; [
|
||||
newsflash
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -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
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
Migrating from hyprlang to lua is really difficult with home-manager. I tried to do it, but a some point half my keybinds stopped working and the nix language made everything much more difficult to debug. So what we will do is have a hyprland.lua which will import a host.lua (for laptop/desktop specific configuration). Both of them will be copied by home-manager. For the migration from .conf to .lua we will use some publicly available [website](https://eiontusk.github.io/hyprlang2lua/).
|
||||
@@ -0,0 +1,299 @@
|
||||
exec-once = /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
|
||||
$browser=kitty --class "custom-browserprofiles" --name "Select browser profile" --hold custom-browserprofiles
|
||||
$editor=nvim
|
||||
$file=dolphin
|
||||
$mod=SUPER
|
||||
$notes=kitty --class "custom-obsidianvaults" --name "Select Obsidian vault" --hold custom-obsidianvaults
|
||||
$term=kitty
|
||||
animations {
|
||||
bezier=wind, 0.05, 0.9, 0.1, 1.05
|
||||
bezier=winIn, 0.1, 1.1, 0.1, 1.1
|
||||
bezier=winOut, 0.3, -0.3, 0, 1
|
||||
bezier=liner, 1, 1, 1, 1
|
||||
animation=windows, 1, 6, wind, slide
|
||||
animation=windowsIn, 1, 6, winIn, slide
|
||||
animation=windowsOut, 1, 5, winOut, slide
|
||||
animation=windowsMove, 1, 5, wind, slide
|
||||
animation=border, 1, 1, liner
|
||||
animation=borderangle, 1, 30, liner, loop
|
||||
animation=fade, 1, 10, default
|
||||
animation=workspaces, 1, 5, wind
|
||||
enabled=true
|
||||
}
|
||||
|
||||
bind=$mod, W, togglefloating
|
||||
bind=$mod, G, togglegroup
|
||||
bind=Alt, Return, fullscreen
|
||||
bind=$mod, Left, movefocus, l
|
||||
bind=$mod, Right, movefocus, r
|
||||
bind=$mod, Up, movefocus, u
|
||||
bind=$mod, Down, movefocus, d
|
||||
bind=Alt, Tab, movefocus, d
|
||||
bind=$mod, 1, workspace, 1
|
||||
bind=$mod, 2, workspace, 2
|
||||
bind=$mod, 3, workspace, 3
|
||||
bind=$mod, 4, workspace, 4
|
||||
bind=$mod, 5, workspace, 5
|
||||
bind=$mod, 6, workspace, 6
|
||||
bind=$mod, 7, workspace, 7
|
||||
bind=$mod, 8, workspace, 8
|
||||
bind=$mod, 9, workspace, 9
|
||||
bind=$mod, 0, workspace, 10
|
||||
bind=$mod+Ctrl, Right, workspace, r+1
|
||||
bind=$mod+Ctrl, Left, workspace, r-1
|
||||
bind=$mod+Ctrl, Doown, workspace, empty
|
||||
bind=$mod+Shift, 1, movetoworkspace, 1
|
||||
bind=$mod+Shift, 2, movetoworkspace, 2
|
||||
bind=$mod+Shift, 3, movetoworkspace, 3
|
||||
bind=$mod+Shift, 4, movetoworkspace, 4
|
||||
bind=$mod+Shift, 5, movetoworkspace, 5
|
||||
bind=$mod+Shift, 6, movetoworkspace, 6
|
||||
bind=$mod+Shift, 7, movetoworkspace, 7
|
||||
bind=$mod+Shift, 8, movetoworkspace, 8
|
||||
bind=$mod+Shift, 9, movetoworkspace, 9
|
||||
bind=$mod+Shift, 0, movetoworkspace, 10
|
||||
bind=$mod+Ctrl+Alt, Right, movetoworkspace, r+1
|
||||
bind=$mod+Ctrl+Alt, Left, movetoworkspace, r-1
|
||||
bind=$mod, Backspace, exec, caelestia shell drawers toggle session
|
||||
bind=$mod+Shift+Ctrl, Left, movewindow, l
|
||||
bind=$mod+Shift+Ctrl, Right, movewindow, r
|
||||
bind=$mod+Shift+Ctrl, Up, movewindow, u
|
||||
bind=$mod+Shift+Ctrl, Down, movewindow, d
|
||||
bind=$mod, mouse_down, workspace, e+1
|
||||
bind=$mod, mouse_up, workspace, e-1
|
||||
bind=$mod, V, exec, cliphist list | rofi -dmenu| cliphist decode | wl-copy
|
||||
bind=$mod, B, exec, hyprkeys -bkr | rofi -dmenu
|
||||
bind=$mod, S, togglespecialworkspace,
|
||||
bind=Alt+$mod, S, movetoworkspace, special
|
||||
bind=$mod, A, layoutmsg, move -col
|
||||
bind=$mod, D, layoutmsg, move +col
|
||||
bind=$mod, T, exec, $term
|
||||
bind=$mod, E, exec, $file
|
||||
bind=$mod, F, exec, $browser
|
||||
bind=$mod, N, exec, $notes
|
||||
bind=$mod+Shift, A, exec, caelestia shell drawers toggle launcher
|
||||
bind=$mod, Q, exec, custom-dontkillsteam
|
||||
bind=Ctrl+Alt, W, exec, caelestia shell drawers toggle sidebar
|
||||
bind=$mod, L, exec, caelestia shell lock lock
|
||||
bind=, F11, exec, caelestia screenshot
|
||||
bind=$mod_SHIFT, S, exec, caelestia shell picker open
|
||||
bind=Ctrl+$mod, 6, exec, custom-killall
|
||||
bind=Ctrl+Alt, 7, exec, custom-performance
|
||||
bind=Ctrl+Alt, 1, exec, caelestia shell drawers toggle sidebar
|
||||
bind=Ctrl+$mod, 4, exec, caelestia shell notifs toggleDnd
|
||||
bind=Ctrl+$mod, 3, exec, pavucontrol
|
||||
bind=Ctrl+Shift+Alt, 0, exec, kitty --hold --class "custom-changeAudioOutput" --name "Select audio output" zsh -c "custom-changeAudioOutput"
|
||||
bind=Ctrl+$mod, 5, exec, gnome-characters
|
||||
bind=Ctrl+Alt, 8, exec, hyprpicker | tee >(wl-copy) | cliphist store
|
||||
bind=Ctrl+Alt, 0, exec, custom-tomato
|
||||
bind=Ctrl+Alt, 2, exec, custom-bottom
|
||||
bind=Ctrl+Alt, 9, exec, anki
|
||||
|
||||
binde=$mod+Shift, Right, resizeactive, 30 0
|
||||
binde=$mod+Shift, Left, resizeactive, -30, 0
|
||||
binde=$mod+Shift, Up, resizeactive, 0 -30
|
||||
binde=$mod+Shift, Down, resizeactive,m 0 30
|
||||
|
||||
bindel=, F2, exec, pactl set-sink-volume @DEFAULT_SINK@ -10%
|
||||
bindel=, F3, exec, pactl set-sink-volume @DEFAULT_SINK@ +10%
|
||||
bindel=, F7, exec, brightnessctl s 10%-
|
||||
bindel=, F8, exec, brightnessctl s +10%
|
||||
|
||||
bindl=, F1, exec, pactl set-sink-mute @DEFAULT_SINK@ toggle
|
||||
bindl=, F5, exec, playerctl play-pause
|
||||
bindl=, F4, exec, playerctl previous
|
||||
bindl=, F6, exec, playerctl next
|
||||
|
||||
bindm=$mod, mouse:272, movewindow
|
||||
bindm=$mod, mouse:273, resizewindow
|
||||
bindm=$mod, Z, movewindow
|
||||
bindm=$mod, X, resizewindow
|
||||
|
||||
decoration {
|
||||
blur {
|
||||
enabled=true
|
||||
ignore_opacity=true
|
||||
new_optimizations=true
|
||||
passes=2
|
||||
size=4
|
||||
special=true
|
||||
}
|
||||
dim_special=0.300000
|
||||
rounding=18
|
||||
}
|
||||
|
||||
dwindle {
|
||||
preserve_split=true
|
||||
}
|
||||
|
||||
env=PATH, $PATH:$scrPath
|
||||
env=XDG_CURRENT_DESKTOP,Hyprland
|
||||
env=XDG_SESSION_TYPE,wayland
|
||||
env=XDG_SESSION_DESKTOP,Hyprland
|
||||
env=QT_QPA_PLATFORM,wayland;xcb
|
||||
env=QT_QPAPLATFORMTHEME,qt6ct
|
||||
env=QT_WAYLAND_DISABLE_WINDOWDECORATION,1
|
||||
env=MOZ_ENABLE_WAYLAND,1
|
||||
env=GDK_SCALE,1
|
||||
|
||||
exec-once=qtbatticon
|
||||
exec-once=source /run/agenix/ntfy && nixpkgs-notifier listen
|
||||
exec-once=dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
|
||||
exec-once=dbus-update-activation-environment --systemd --all
|
||||
exec-once=systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
|
||||
exec-once=systemctl --user start xdg-desktop-portal-wlr.service
|
||||
exec-once=blueman-applet
|
||||
exec-once=udiskie --no-automount --smart-tray
|
||||
exec-once=nm-applet --indicator
|
||||
exec-once=rm -rf ~/.cache/cliphist/ && wl-paste --type text --watch cliphist store & wl-paste --type image --watch cliphist store
|
||||
exec-once=custom-batterynotify
|
||||
exec-once=custom-batterywarning
|
||||
exec-once=awww img /nix/store/30py8zav0pbsbcvcll5017hwz07fxmr0-wallpaper1.jpg
|
||||
exec-once=awww-daemon
|
||||
exec-once=sleep 1 && custom-wallpaper
|
||||
exec-once=custom-checkKdrive && custom-mountkdrive
|
||||
exec-once=custom-gitnotify
|
||||
exec-once=sleep 4 & caelestia-shell
|
||||
exec-once=sleep 20 && ngcp pull --automatic
|
||||
|
||||
general {
|
||||
border_size=4
|
||||
col.active_border=rgba(ca6702ff) rgba(ecd3a0ff) 45deg
|
||||
col.inactive_border=rgba(f1dca7d9) rgba(ffe1a8d9) 45deg
|
||||
gaps_in=5
|
||||
gaps_out=15
|
||||
layout=dwindle
|
||||
resize_on_border=true
|
||||
}
|
||||
|
||||
gesture=3, right, move, +col
|
||||
gesture=3, left, move, -col
|
||||
|
||||
group {
|
||||
col.border_active=rgba(ca6702ff) rgba(ecd3a0ff) 45deg
|
||||
col.border_inactive=rgba(f1dca7d9) rgba(ffe1a8d9) 45deg
|
||||
col.border_locked_active=rgba(ca6702ff) rgba(ecd3a0ff) 45deg
|
||||
col.border_locked_inactive=rgba(f1dca7d9) rgba(ffe1a8d9) 45deg
|
||||
}
|
||||
|
||||
input {
|
||||
kb_layout=ch
|
||||
follow_mouse=1
|
||||
force_no_accel=1
|
||||
sensitivity=0
|
||||
}
|
||||
|
||||
layerrule=blur on, ignore_alpha 0, match:namespace rofi
|
||||
layerrule=blur on, ignore_alpha 0, match:namespace notifications
|
||||
layerrule=blur on, ignore_alpha 0, match:namespace swaync-notification-window
|
||||
layerrule=blur on, ignore_alpha 0, match:namespace swaync-control-center
|
||||
layerrule=blur on, match:namespace logout_dialog
|
||||
|
||||
misc {
|
||||
force_default_wallpaper=0
|
||||
vrr=0
|
||||
}
|
||||
|
||||
monitor=eDP-1, highres@highrr, 0x0, 1
|
||||
monitor=HDMI-A-1, highres2highrr, auto-left, 1
|
||||
|
||||
plugin:dynamic-cursors {
|
||||
rotate {
|
||||
length=20
|
||||
offset=0
|
||||
}
|
||||
|
||||
shake {
|
||||
base=4.000000
|
||||
effects=true
|
||||
enabled=true
|
||||
influence=0.000000
|
||||
ipc=false
|
||||
limit=0.000000
|
||||
nearest=true
|
||||
speed=4.000000
|
||||
threshold=4
|
||||
timeout=2000
|
||||
}
|
||||
enabled=true
|
||||
mode=rotate
|
||||
threshold=2
|
||||
}
|
||||
|
||||
plugin:overview {
|
||||
disableBlur=true
|
||||
disableGestures=true
|
||||
showEmptyWorkspace=true
|
||||
workspaceActiveBorder=rgb(ab7746)
|
||||
}
|
||||
|
||||
scrolling {
|
||||
column_width=0.450000
|
||||
}
|
||||
|
||||
windowrule=opacity 0.90 0.90, match:class ^(firefox)$
|
||||
windowrule=opacity 0.90 0.90, match:class ^(Brave-browser)$
|
||||
windowrule=opacity 0.80 0.80, match:class ^(code-oss)$
|
||||
windowrule=opacity 0.80 0.80, match:class ^(Code)$
|
||||
windowrule=opacity 0.80 0.80, match:class ^(code-url-handler)$
|
||||
windowrule=opacity 0.80 0.80, match:class ^(code-insiders-url-handler)$
|
||||
windowrule=opacity 0.75 0.75, match:class ^(kitty)$
|
||||
windowrule=opacity 0.80 0.80, match:class ^(org.kde.dolphin)$
|
||||
windowrule=opacity 0.80 0.80, float on, match:class ^(org.kde.ark)$
|
||||
windowrule=opacity 0.80 0.80, float on, match:class ^(nwg-look)$
|
||||
windowrule=opacity 0.80 0.80, float on, match:class ^(qt5ct)$
|
||||
windowrule=opacity 0.80 0.80, float on, match:class ^(qt6ct)$
|
||||
windowrule=opacity 0.80 0.80, float on, match:class ^(kvantummanager)$
|
||||
windowrule=opacity 0.80 0.70, float on, match:class ^(org.pulseaudio.pavucontrol)$
|
||||
windowrule=opacity 0.80 0.70, float on, match:class ^(blueman-manager)$
|
||||
windowrule=opacity 0.80 0.70, float on, match:class ^(nm-applet)$
|
||||
windowrule=opacity 0.80 0.70, float on, match:class ^(nm-connection-editor)$
|
||||
windowrule=opacity 0.80 0.70, float on, match:class ^(org.kde.polkit-kde-authentication-agent-1)$
|
||||
windowrule=opacity 0.80 0.70, match:class ^(polkit-gnome-authentication-agent-1)$
|
||||
windowrule=opacity 0.80 0.70, match:class ^(org.freedesktop.impl.portal.desktop.gtk)$
|
||||
windowrule=opacity 0.80 0.70, match:class ^(org.freedesktop.impl.portal.desktop.hyprland)$
|
||||
windowrule=opacity 0.70 0.70, match:class ^([Ss]team)$
|
||||
windowrule=opacity 0.70 0.70, match:class ^(steamwebhelper)$
|
||||
windowrule=opacity 0.70 0.70, match:class ^(Spotify)$
|
||||
windowrule=opacity 0.70 0.70, match:initial_title ^(Spotify Free)$
|
||||
windowrule=opacity 0.90 0.90, float on, match:class ^(com.github.rafostar.Clapper)$
|
||||
windowrule=opacity 0.80 0.80, match:class ^(com.github.tchx84.Flatseal)$
|
||||
windowrule=opacity 0.80 0.80, match:class ^(hu.kramo.Cartridges)$
|
||||
windowrule=opacity 0.80 0.80, match:class ^(com.obsproject.Studio)$
|
||||
windowrule=opacity 0.80 0.80, match:class ^(gnome-boxes)$
|
||||
windowrule=opacity 0.80 0.80, match:class ^(discord)$
|
||||
windowrule=opacity 0.80 0.80, match:class ^(WebCord)$
|
||||
windowrule=opacity 0.80 0.80, match:class ^(ArmCord)$
|
||||
windowrule=opacity 0.80 0.80, float on, match:class ^(app.drey.Warp)$
|
||||
windowrule=opacity 0.80 0.80, float on, match:class ^(net.davidotek.pupgui2)$
|
||||
windowrule=opacity 0.80 0.80, float on, match:class ^(yad)$
|
||||
windowrule=opacity 0.80 0.80, float on, match:class ^(Signal)$
|
||||
windowrule=opacity 0.80 0.80, float on, match:class ^(io.github.alainm23.planify)$
|
||||
windowrule=opacity 0.80 0.80, float on, match:class ^(io.gitlab.theevilskeleton.Upscaler)$
|
||||
windowrule=opacity 0.80 0.80, float on, match:class ^(com.github.unrud.VideoDownloader)$
|
||||
windowrule=opacity 0.80 0.80, float on, match:class ^(io.gitlab.adhami3310.Impression)$
|
||||
windowrule=opacity 0.80 0.80, float on, match:class ^(io.missioncenter.MissionCenter)$
|
||||
windowrule=opacity 0.80 0.80, match:class ^(io.github.flattool.Warehouse)$
|
||||
windowrule=float on, match:class ^(org.kde.dolphin)$, match:title ^(Progress Dialog — Dolphin)$
|
||||
windowrule=float on, match:class ^(org.kde.dolphin)$, match:title ^(Copying — Dolphin)$
|
||||
windowrule=float on, match:class ^(firefox)$, match:title ^(Picture-in-Picture)$
|
||||
windowrule=float on, match:class ^(firefox)$, match:title ^(Library)$
|
||||
windowrule=float on, match:class ^(kitty)$, match:title ^(top)$
|
||||
windowrule=float on, match:class ^(kitty)$, match:title ^(btop)$
|
||||
windowrule=float on, match:class ^(kitty)$, match:title ^(htop)$
|
||||
windowrule=float on, match:class ^(vlc)$
|
||||
windowrule=float on, match:class ^(eog)$
|
||||
windowrule=float on, size 400 225, match:class ^(custom-browserprofiles)$
|
||||
windowrule=float on, size 1050 200, match:class ^(custom-changeAudioOutput)$
|
||||
windowrule=float on, size 400 175, match:class ^(custom-obsidianvaults)$
|
||||
windowrule=float on, size 600 600, match:initial_class ^(custom-pomodoro)$
|
||||
windowrule=float on, size 1500 800, match:initial_class ^(custom-bottom)$
|
||||
|
||||
workspace=1, layout:master
|
||||
workspace=2, layout:scrolling, layoutopt:direction:right
|
||||
workspace=name:special, layout:scrolling
|
||||
|
||||
xwayland {
|
||||
force_zero_scaling=true
|
||||
}
|
||||
splash=true
|
||||
@@ -0,0 +1,949 @@
|
||||
local browser = "kitty --class \"custom-browserprofiles\" --name \"Select browser profile\" --hold custom-browserprofiles"
|
||||
local editor = "nvim"
|
||||
local file = "dolphin"
|
||||
local mod = "SUPER"
|
||||
local notes = "kitty --class \"custom-obsidianvaults\" --name \"Select Obsidian vault\" --hold custom-obsidianvaults"
|
||||
local term = "kitty"
|
||||
|
||||
local function close_or_move_special()
|
||||
local window = hl.get_active_window()
|
||||
|
||||
if not window then
|
||||
return
|
||||
end
|
||||
|
||||
local class = window.class or window.initial_class
|
||||
|
||||
if class == "Steam" or class == "custom-pomodoro" then
|
||||
hl.dispatch(hl.dsp.window.move({ workspace = "special" }))
|
||||
else
|
||||
hl.dispatch(hl.dsp.window.close({ window = window }))
|
||||
end
|
||||
end
|
||||
local function close_other_windows()
|
||||
local active = hl.get_active_window()
|
||||
local workspace = hl.get_active_workspace()
|
||||
|
||||
if not active or not workspace then
|
||||
return
|
||||
end
|
||||
|
||||
for _, window in pairs(hl.get_windows()) do
|
||||
if window.workspace
|
||||
and window.workspace.id == workspace.id
|
||||
and window.address ~= active.address
|
||||
then
|
||||
hl.dispatch(hl.dsp.window.close({ window = window }))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local wallpapers_enabled = true
|
||||
local wallpapers = {
|
||||
[1] = "WALLPAPER1/PATH/PLACEHOLDER",
|
||||
[2] = "WALLPAPER2/PATH/PLACEHOLDER",
|
||||
[3] = "WALLPAPER3/PATH/PLACEHOLDER",
|
||||
[4] = "WALLPAPER4/PATH/PLACEHOLDER",
|
||||
[5] = "WALLPAPER5/PATH/PLACEHOLDER",
|
||||
[6] = "WALLPAPER1/PATH/PLACEHOLDER",
|
||||
[7] = "WALLPAPER2/PATH/PLACEHOLDER",
|
||||
[8] = "WALLPAPER3/PATH/PLACEHOLDER",
|
||||
[9] = "WALLPAPER4/PATH/PLACEHOLDER",
|
||||
[10] = "WALLPAPER5/PATH/PLACEHOLDER",
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
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 } } })
|
||||
hl.curve("winOut", { type = "bezier", points = { { 0.3, -0.3 }, { 0, 1 } } })
|
||||
hl.curve("liner", { type = "bezier", points = { { 1, 1 }, { 1, 1 } } })
|
||||
hl.animation({
|
||||
leaf = "windows",
|
||||
enabled = true,
|
||||
speed = 6,
|
||||
bezier = "wind",
|
||||
style = "slide",
|
||||
})
|
||||
hl.animation({
|
||||
leaf = "windowsIn",
|
||||
enabled = true,
|
||||
speed = 6,
|
||||
bezier = "winIn",
|
||||
style = "slide",
|
||||
})
|
||||
hl.animation({
|
||||
leaf = "windowsOut",
|
||||
enabled = true,
|
||||
speed = 5,
|
||||
bezier = "winOut",
|
||||
style = "slide",
|
||||
})
|
||||
hl.animation({
|
||||
leaf = "windowsMove",
|
||||
enabled = true,
|
||||
speed = 5,
|
||||
bezier = "wind",
|
||||
style = "slide",
|
||||
})
|
||||
hl.animation({
|
||||
leaf = "border",
|
||||
enabled = true,
|
||||
speed = 1,
|
||||
bezier = "liner",
|
||||
})
|
||||
hl.animation({
|
||||
leaf = "borderangle",
|
||||
enabled = true,
|
||||
speed = 30,
|
||||
bezier = "liner",
|
||||
style = "loop",
|
||||
})
|
||||
hl.animation({
|
||||
leaf = "fade",
|
||||
enabled = true,
|
||||
speed = 10,
|
||||
bezier = "default",
|
||||
})
|
||||
hl.animation({
|
||||
leaf = "workspaces",
|
||||
enabled = true,
|
||||
speed = 5,
|
||||
bezier = "wind",
|
||||
})
|
||||
|
||||
hl.bind(mod .. " + W", hl.dsp.window.float({ action = "toggle" }))
|
||||
hl.bind(mod .. " + G", hl.dsp.group.toggle())
|
||||
hl.bind("ALT + Return", hl.dsp.window.fullscreen({ mode = "fullscreen", action = "toggle" }))
|
||||
hl.bind(mod .. " + Left", hl.dsp.focus({ direction = "left" }))
|
||||
hl.bind(mod .. " + Right", hl.dsp.focus({ direction = "right" }))
|
||||
hl.bind(mod .. " + CTRL + D", hl.dsp.layout("swapcol r"))
|
||||
hl.bind(mod .. " + CTRL + A", hl.dsp.layout("swapcol l"))
|
||||
hl.bind(mod .. " + Up", hl.dsp.focus({ direction = "up" }))
|
||||
hl.bind(mod .. " + Down", hl.dsp.focus({ direction = "down" }))
|
||||
hl.bind("ALT + Tab", hl.dsp.focus({ direction = "down" }))
|
||||
hl.bind(mod .. " + 1", hl.dsp.focus({ workspace = 1 }))
|
||||
hl.bind(mod .. " + 2", hl.dsp.focus({ workspace = 2 }))
|
||||
hl.bind(mod .. " + 3", hl.dsp.focus({ workspace = 3 }))
|
||||
hl.bind(mod .. " + 4", hl.dsp.focus({ workspace = 4 }))
|
||||
hl.bind(mod .. " + 5", hl.dsp.focus({ workspace = 5 }))
|
||||
hl.bind(mod .. " + 6", hl.dsp.focus({ workspace = 6 }))
|
||||
hl.bind(mod .. " + 7", hl.dsp.focus({ workspace = 7 }))
|
||||
hl.bind(mod .. " + 8", hl.dsp.focus({ workspace = 8 }))
|
||||
hl.bind(mod .. " + 9", hl.dsp.focus({ workspace = 9 }))
|
||||
hl.bind(mod .. " + 0", hl.dsp.focus({ workspace = 10 }))
|
||||
hl.bind(mod .. " + CTRL + Right", hl.dsp.focus({ workspace = "r+1" }))
|
||||
hl.bind(mod .. " + CTRL + Left", hl.dsp.focus({ workspace = "r-1" }))
|
||||
hl.bind(mod .. " + CTRL + Down", hl.dsp.focus({ workspace = "empty" }))
|
||||
hl.bind(mod .. " + SHIFT + 1", hl.dsp.window.move({ workspace = 1 }))
|
||||
hl.bind(mod .. " + SHIFT + 2", hl.dsp.window.move({ workspace = 2 }))
|
||||
hl.bind(mod .. " + SHIFT + 3", hl.dsp.window.move({ workspace = 3 }))
|
||||
hl.bind(mod .. " + SHIFT + 4", hl.dsp.window.move({ workspace = 4 }))
|
||||
hl.bind(mod .. " + SHIFT + 5", hl.dsp.window.move({ workspace = 5 }))
|
||||
hl.bind(mod .. " + SHIFT + 6", hl.dsp.window.move({ workspace = 6 }))
|
||||
hl.bind(mod .. " + SHIFT + 7", hl.dsp.window.move({ workspace = 7 }))
|
||||
hl.bind(mod .. " + SHIFT + 8", hl.dsp.window.move({ workspace = 8 }))
|
||||
hl.bind(mod .. " + SHIFT + 9", hl.dsp.window.move({ workspace = 9 }))
|
||||
hl.bind(mod .. " + SHIFT + 0", hl.dsp.window.move({ workspace = 10 }))
|
||||
hl.bind(mod .. " + CTRL + ALT + Right", hl.dsp.window.move({ workspace = "r+1" }))
|
||||
hl.bind(mod .." + CTRL + ALT + Left", hl.dsp.window.move({ workspace = "r-1" }))
|
||||
hl.bind(mod .. " + Backspace", hl.dsp.exec_cmd("caelestia shell drawers toggle session"))
|
||||
hl.bind(mod .. " + SHIFT + CTRL + Left", hl.dsp.window.move({ direction = "l" }))
|
||||
hl.bind(mod .. " + SHIFT + CTRL + Right", hl.dsp.window.move({ direction = "r" }))
|
||||
hl.bind(mod .. " + SHIFT + CTRL + Up", hl.dsp.window.move({ direction = "u" }))
|
||||
hl.bind(mod .. " + SHIFT + CTRL + Down", hl.dsp.window.move({ direction = "d" }))
|
||||
hl.bind(mod .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" }))
|
||||
hl.bind(mod .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" }))
|
||||
hl.bind(mod .. " + V", hl.dsp.exec_cmd("cliphist list | rofi -dmenu| cliphist decode | wl-copy"))
|
||||
hl.bind(mod .. " + B", hl.dsp.exec_cmd("hyprkeys -bkr | rofi -dmenu"))
|
||||
hl.bind(mod .. " + S", hl.dsp.workspace.toggle_special(""))
|
||||
hl.bind(mod .. " + ALT + S", hl.dsp.window.move({ workspace = "special" }))
|
||||
hl.bind(mod .. " + A", hl.dsp.layout("move -col"))
|
||||
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("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)
|
||||
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", 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 + 2", hl.dsp.exec_cmd("custom-bottom"))
|
||||
hl.bind("CTRL + ALT + 9", hl.dsp.exec_cmd("anki"))
|
||||
|
||||
hl.bind(mod .. " + SHIFT + Right", hl.dsp.window.resize({ x = 30, y = 0, relative = true }), { repeating = true })
|
||||
-- TODO: manual review on line 93 — resizeactive: expected 'X Y' or 'X% Y%', got "-30"
|
||||
-- hl.bind("SUPER + SHIFT + Left", hl.dsp.resizeactive(-30, 0), { repeating = true })
|
||||
hl.bind(mod .. " + SHIFT + Up", hl.dsp.window.resize({ x = 0, y = -30, relative = true }), { repeating = true })
|
||||
-- TODO: manual review on line 95 — resizeactive: expected 'X Y' or 'X% Y%', got "m 0 30"
|
||||
-- hl.bind("SUPER + SHIFT + Down", hl.dsp.resizeactive("m 0 30"), { repeating = true })
|
||||
|
||||
hl.bind("F2", hl.dsp.exec_cmd("pactl set-sink-volume @DEFAULT_SINK@ -10%"), { locked = true, repeating = true })
|
||||
hl.bind("F3", hl.dsp.exec_cmd("pactl set-sink-volume @DEFAULT_SINK@ +10%"), { locked = true, repeating = true })
|
||||
hl.bind("F7", hl.dsp.exec_cmd("brightnessctl s 10%-"), { locked = true, repeating = true })
|
||||
hl.bind("F8", hl.dsp.exec_cmd("brightnessctl s +10%"), { locked = true, repeating = true })
|
||||
|
||||
hl.bind("F1", hl.dsp.exec_cmd("pactl set-sink-mute @DEFAULT_SINK@ toggle"), { locked = true })
|
||||
hl.bind("F5", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true })
|
||||
hl.bind("F4", hl.dsp.exec_cmd("playerctl previous"), { locked = true })
|
||||
hl.bind("F6", hl.dsp.exec_cmd("playerctl next"), { locked = true })
|
||||
|
||||
hl.bind(mod .. " + mouse:272", hl.dsp.window.drag())
|
||||
hl.bind(mod .. " + mouse:273", hl.dsp.window.resize())
|
||||
hl.bind(mod .. " + Z", hl.dsp.window.drag())
|
||||
hl.bind(mod .. " + X", hl.dsp.window.resize())
|
||||
|
||||
hl.env("XDG_CURRENT_DESKTOP", "Hyprland")
|
||||
hl.env("XDG_SESSION_TYPE", "wayland")
|
||||
hl.env("XDG_SESSION_DESKTOP", "Hyprland")
|
||||
hl.env("QT_QPA_PLATFORM", "wayland;xcb")
|
||||
hl.env("QT_QPAPLATFORMTHEME", "qt6ct")
|
||||
hl.env("QT_WAYLAND_DISABLE_WINDOWDECORATION", "1")
|
||||
hl.env("MOZ_ENABLE_WAYLAND", "1")
|
||||
hl.env("GDK_SCALE", "1")
|
||||
|
||||
hl.gesture({
|
||||
fingers = 3,
|
||||
direction = "horizontal",
|
||||
action = "scroll_move",
|
||||
})
|
||||
|
||||
hl.gesture({
|
||||
fingers = 2,
|
||||
direction = "pinch",
|
||||
action = "cursor_zoom",
|
||||
mode = "live",
|
||||
})
|
||||
|
||||
--hl.layer_rule({
|
||||
-- match = { namespace = "ignore_alpha 0" },
|
||||
-- TODO: manual review — unmapped layer rule: "blur on"
|
||||
-- TODO: manual review — unmapped layer rule: "blur on"
|
||||
-- TODO: manual review — unmapped layer rule: "blur on"
|
||||
-- TODO: manual review — unmapped layer rule: "blur on"
|
||||
--})
|
||||
|
||||
--hl.layer_rule({
|
||||
-- match = { namespace = "match:namespace logout_dialog" },
|
||||
-- TODO: manual review — unmapped layer rule: "blur on"
|
||||
--)
|
||||
|
||||
hl.monitor({
|
||||
output = "eDP-1",
|
||||
mode = "highres@highrr",
|
||||
position = "0x0",
|
||||
scale = "1",
|
||||
})
|
||||
|
||||
hl.monitor({
|
||||
output = "HDMI-A-1",
|
||||
mode = "highres2highrr",
|
||||
position = "auto-left",
|
||||
scale = "1",
|
||||
})
|
||||
|
||||
-- TODO: manual review — plugin section 'dynamic-cursors'. The new Lua API exposes plugins via hl.plugin.<name>(...) — wire up per the plugin's docs.
|
||||
--[[
|
||||
rotate { ... }
|
||||
shake { ... }
|
||||
enabled = true
|
||||
mode = rotate
|
||||
threshold = 2
|
||||
]]
|
||||
|
||||
-- TODO: manual review — plugin section 'overview'. The new Lua API exposes plugins via hl.plugin.<name>(...) — wire up per the plugin's docs.
|
||||
--[[
|
||||
disableBlur = true
|
||||
disableGestures = true
|
||||
showEmptyWorkspace = true
|
||||
workspaceActiveBorder = rgb(ab7746)
|
||||
]]
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(firefox)$",
|
||||
},
|
||||
opacity = "0.90 0.90",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(Brave-browser)$",
|
||||
},
|
||||
opacity = "0.90 0.90",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(code-oss)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(Code)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(code-url-handler)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(code-insiders-url-handler)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(kitty)$",
|
||||
},
|
||||
opacity = "0.75 0.75",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(org.kde.dolphin)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(org.kde.ark)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(nwg-look)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(qt5ct)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(qt6ct)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(kvantummanager)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(org.pulseaudio.pavucontrol)$",
|
||||
},
|
||||
opacity = "0.80 0.70",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(blueman-manager)$",
|
||||
},
|
||||
opacity = "0.80 0.70",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(nm-applet)$",
|
||||
},
|
||||
opacity = "0.80 0.70",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(nm-connection-editor)$",
|
||||
},
|
||||
opacity = "0.80 0.70",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(org.kde.polkit-kde-authentication-agent-1)$",
|
||||
},
|
||||
opacity = "0.80 0.70",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(polkit-gnome-authentication-agent-1)$",
|
||||
},
|
||||
opacity = "0.80 0.70",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(org.freedesktop.impl.portal.desktop.gtk)$",
|
||||
},
|
||||
opacity = "0.80 0.70",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(org.freedesktop.impl.portal.desktop.hyprland)$",
|
||||
},
|
||||
opacity = "0.80 0.70",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^([Ss]team)$",
|
||||
},
|
||||
opacity = "0.70 0.70",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(steamwebhelper)$",
|
||||
},
|
||||
opacity = "0.70 0.70",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(Spotify)$",
|
||||
},
|
||||
opacity = "0.70 0.70",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
initial_title = "^(Spotify Free)$",
|
||||
},
|
||||
opacity = "0.70 0.70",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(com.github.rafostar.Clapper)$",
|
||||
},
|
||||
opacity = "0.90 0.90",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(com.github.tchx84.Flatseal)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(hu.kramo.Cartridges)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(com.obsproject.Studio)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(gnome-boxes)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(discord)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(WebCord)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(ArmCord)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(app.drey.Warp)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(net.davidotek.pupgui2)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(yad)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(Signal)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(io.github.alainm23.planify)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(io.gitlab.theevilskeleton.Upscaler)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(com.github.unrud.VideoDownloader)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(io.gitlab.adhami3310.Impression)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(io.missioncenter.MissionCenter)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(io.github.flattool.Warehouse)$",
|
||||
},
|
||||
opacity = "0.80 0.80",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(org.kde.dolphin)$",
|
||||
title = "^(Progress Dialog — Dolphin)$",
|
||||
},
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(org.kde.dolphin)$",
|
||||
title = "^(Copying — Dolphin)$",
|
||||
},
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(firefox)$",
|
||||
title = "^(Picture-in-Picture)$",
|
||||
},
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(firefox)$",
|
||||
title = "^(Library)$",
|
||||
},
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(kitty)$",
|
||||
title = "^(top)$",
|
||||
},
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(kitty)$",
|
||||
title = "^(btop)$",
|
||||
},
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(kitty)$",
|
||||
title = "^(htop)$",
|
||||
},
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(vlc)$",
|
||||
},
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(eog)$",
|
||||
},
|
||||
float = true,
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(custom-browserprofiles)$",
|
||||
},
|
||||
float = true,
|
||||
size = "400 225",
|
||||
})
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(custom-vpn-picker)$",
|
||||
},
|
||||
float = true,
|
||||
size = "350 250",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(custom-changeAudioOutput)$",
|
||||
},
|
||||
float = true,
|
||||
size = "1050 200",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
class = "^(custom-obsidianvaults)$",
|
||||
},
|
||||
float = true,
|
||||
size = "400 175",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
initial_class = "^(custom-pomodoro)$",
|
||||
},
|
||||
float = true,
|
||||
size = "600 600",
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
match = {
|
||||
initial_class = "^(custom-bottom)$",
|
||||
},
|
||||
float = true,
|
||||
size = "1500 800",
|
||||
})
|
||||
|
||||
hl.workspace_rule({
|
||||
workspace = "1",
|
||||
layout = "master",
|
||||
})
|
||||
|
||||
hl.workspace_rule({
|
||||
workspace = "2",
|
||||
layout = "scrolling",
|
||||
})
|
||||
|
||||
hl.workspace_rule({
|
||||
workspace = "special",
|
||||
layout = "scrolling",
|
||||
})
|
||||
|
||||
-- TODO: manual review — top-level key 'splash = true' has no enclosing section
|
||||
hl.config({
|
||||
animations = {
|
||||
enabled = true,
|
||||
},
|
||||
decoration = {
|
||||
blur = {
|
||||
enabled = true,
|
||||
ignore_opacity = true,
|
||||
new_optimizations = true,
|
||||
passes = 2,
|
||||
size = 4,
|
||||
special = true,
|
||||
},
|
||||
dim_special = 0.300000,
|
||||
rounding = 18,
|
||||
},
|
||||
dwindle = {
|
||||
preserve_split = true,
|
||||
},
|
||||
general = {
|
||||
border_size = 4,
|
||||
col = {
|
||||
active_border = { colors = { "rgba(ca6702ff)", "rgba(ecd3a0ff)" }, angle = 45 },
|
||||
inactive_border = { colors = { "rgba(f1dca7d9)", "rgba(ffe1a8d9)" }, angle = 45 },
|
||||
},
|
||||
gaps_in = 5,
|
||||
gaps_out = 15,
|
||||
layout = "dwindle",
|
||||
resize_on_border = true,
|
||||
},
|
||||
group = {
|
||||
col = {
|
||||
border_active = { colors = { "rgba(ca6702ff)", "rgba(ecd3a0ff)" }, angle = 45 },
|
||||
border_inactive = { colors = { "rgba(f1dca7d9)", "rgba(ffe1a8d9)" }, angle = 45 },
|
||||
border_locked_active = { colors = { "rgba(ca6702ff)", "rgba(ecd3a0ff)" }, angle = 45 },
|
||||
border_locked_inactive = { colors = { "rgba(f1dca7d9)", "rgba(ffe1a8d9)" }, angle = 45 },
|
||||
},
|
||||
},
|
||||
input = {
|
||||
kb_layout = "ch",
|
||||
follow_mouse = 1,
|
||||
force_no_accel = 1,
|
||||
sensitivity = 0,
|
||||
},
|
||||
misc = {
|
||||
force_default_wallpaper = 0,
|
||||
vrr = 0,
|
||||
},
|
||||
scrolling = {
|
||||
column_width = 0.450000,
|
||||
},
|
||||
xwayland = {
|
||||
force_zero_scaling = true,
|
||||
},
|
||||
})
|
||||
|
||||
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("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")
|
||||
hl.exec_cmd("systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP")
|
||||
hl.exec_cmd("systemctl --user start xdg-desktop-portal-wlr.service")
|
||||
hl.exec_cmd("blueman-applet")
|
||||
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("awww img WALLPAPER/PATH/PLACEHOLDER")
|
||||
hl.exec_cmd("awww-daemon")
|
||||
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")
|
||||
end)
|
||||
-- host specific config
|
||||
require("host")
|
||||
@@ -125,4 +125,4 @@
|
||||
}
|
||||
],
|
||||
"rollout_threshold_seed": null
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
Binary file not shown.
@@ -0,0 +1,13 @@
|
||||
let
|
||||
backupAgeKey = "age1y4lhpk7awhjyu42p46ulg5q2c49r2lnwu8tyyk4ejj6jztd64uksfhd670";
|
||||
laptopHostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJCsewl8ZXXMjRyO20cBIiuW2gA4mGoMkxQ0dcMyNidR root@nixos";
|
||||
in {
|
||||
"ntfy.age".publicKeys = [
|
||||
backupAgeKey
|
||||
laptopHostKey
|
||||
];
|
||||
"epfl.age".publicKeys = [
|
||||
backupAgeKey
|
||||
laptopHostKey
|
||||
];
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
audacity.x86_64
|
||||
dolphin.x86_64 may be customized or nautilus cust
|
||||
ollama.x86_64
|
||||
plymouth.x86_64
|
||||
quickshell.x86_64
|
||||
raylib-devel.x86_64
|
||||
some notification daemon 0.12-32.fc43
|
||||
tor.x86_64
|
||||
torbrowser-launcher.noarch
|
||||
maybe configure a bit ripgrep? majuscules
|
||||
|
||||
organize packages in pkgs list
|
||||
|
||||
why frameworktooltui settings dont apply?
|
||||
|
||||
things to do?
|
||||
(maybe something periodic) deadnix and aljandra to clean up the repo
|
||||
|
||||
Review windowrules when only one window
|
||||
|
||||
setup lsp in neovim
|
||||
|
||||
Setup obsidian (plugsins, etc.)
|
||||
|
||||
setup kdrive as a git remote
|
||||
|
||||
setup tampermonkey
|
||||
|
||||
|
||||
with quickshell:
|
||||
fix player control icons
|
||||
give battery percentage
|
||||
maybe modify some of the images (like the notification body)
|
||||
do a full bar (no ugly empty space at top)
|
||||
add brightness slider
|
||||
maybe change sound icon by volume level
|
||||
maybe incorpore the fast fourier transform code
|
||||
|
||||
|
||||
|
||||
maybe write some notification center -- done. needs some style
|
||||
|
||||
battery dashboard https://www.reddit.com/r/hyprland/comments/1rkiajd/a_beautiful_battery_system_dashboard_on_hyprland/
|
||||
|
||||
have a small terminal popup for some usages (like custom-launch)
|
||||
|
||||
some meteo center with dates, etc
|
||||
|
||||
show name of the app
|
||||
|
||||
make the connection tray prettier? Maybe with a full rewrite
|
||||
|
||||
maybe some kind of overview?
|
||||
|
||||
show battery percentage
|
||||
|
||||
see what people did with quickshell and take inspiration
|
||||
|
||||
work on quickshell color palette to match gruvbox
|
||||
Reference in new issue
Block a user