Compare commits

...

29 Commits

Author SHA1 Message Date
Remy Moll
5a26b08ba3 switch back to yabai for tiling. experimental shift of zen setup 2025-12-10 10:04:45 +01:00
Remy Moll
895a6011a0 moore tiling 2025-12-05 17:20:44 +01:00
Remy Moll
6ee9e50a01 initial macos setup 2025-12-02 23:17:14 +01:00
5ab5be9644 Merge pull request 'Feature creep' (#2) from feature/quickshell into main
Reviewed-on: #2
2025-12-02 22:06:53 +00:00
8772229192 more refinements to vscode + fish + hyprland 2025-12-02 23:04:02 +01:00
625039ee58 link wallpapers 2025-11-07 11:02:20 +01:00
7b9122fe7f cleanup hyprland and embrace dms 2025-11-07 10:39:48 +01:00
94f392c388 add networking through secrets 2025-11-07 10:39:29 +01:00
efe873d714 cleaned up the flake 2025-10-30 18:16:10 +01:00
a8d8c4dde9 had to switch to unstable for dms to work 2025-10-30 11:02:09 +01:00
f5d5791efd fix some regressions 2025-10-29 15:26:46 +01:00
6c53fe1aae switch to gnome for usb config 2025-10-09 09:36:41 +02:00
2e3b0b6a35 try to use watt (and quickshell) 2025-10-09 09:36:19 +02:00
38dc75a6e1 usability improvements 2025-09-23 00:06:24 +02:00
82e26ee498 many improvements 2025-07-17 18:10:37 +02:00
0a731ef17f added new usb system, started modularizing 2025-06-13 18:52:13 +02:00
58b0456f8c more vs code trial and error 2025-06-03 10:17:59 +02:00
b24d0f466a some more adjustments, tried to get vs code to work 2025-05-21 17:30:31 +02:00
d91ebe083d Desktop usability adjustments (#1)
Reviewed-on: #1
2025-05-18 12:56:42 +00:00
1d2b3f799d some more desktop functionality 2025-02-23 19:07:59 +01:00
5c79c29b7d wip - fixes to import and config location 2025-01-30 13:21:11 +01:00
1cd68c8ce1 wip: hyprland adjustments 2025-01-17 20:40:58 +01:00
b22e6ccc91 try hyprland instead 2025-01-17 20:19:21 +01:00
03784c606c fixes for the nvidia-enabled mode 2025-01-13 14:16:48 +01:00
d58bd057ac nvidia fixes 2025-01-13 13:51:22 +01:00
b2a1f39893 switch to two boot modes: with or without dgpu 2025-01-13 13:34:30 +01:00
bbfec6ea9a switch back to explicit sync? 2025-01-13 11:52:23 +01:00
076c892b4f change nvidia hybrid mode 2024-09-02 14:35:12 +02:00
6327a865b3 fixes and nvidia 2024-09-02 11:13:38 +02:00
96 changed files with 4120 additions and 828 deletions

1
.envrc Normal file
View File

@@ -0,0 +1 @@
use flake

4
.gitignore vendored
View File

@@ -1,2 +1,4 @@
# Result is a symlink to the built iso
result
result
# direnv binaries
.direnv

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "secrets"]
path = secrets
url = ssh://git@git.kluster.moll.re:2222/remoll/nixos-secrets.git

12
.sops.yaml Normal file
View File

@@ -0,0 +1,12 @@
keys:
- &remy_usb age1027e2vu808mvf95m4f0am3aeg88n8vgzt56s04ndpkgm7awzeajspxl6tu
- &remy_yoga ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAX4zsiXSSWbE75C0wyBVwaHOw6Gsbh/WqQsgEhvPwT8 remy@nyx
- &host_yoga age1ckqer7nxzq7q58v9xaqy8ac9vx2va69a46t86wp9m78pj5dpuy3sq8xeaj
creation_rules:
- path_regex: secrets/[^/]+\.(yaml|json|env|ini)$
key_groups:
- age:
- *remy_usb
- *remy_yoga
- *host_yoga

View File

@@ -17,19 +17,28 @@ Don't forget to add the `#<host>` to the end of the target to specify the host c
### Spectre
###
## Usage
### Deploying to a machine
Run
Run
```bash
nixos-rebuild switch --flake <target>#<machine>
# for instance
nixos-rebuild switch --flake .#spectre
nixos-rebuild switch --flake .#Nixtre
```
to apply the configuration.
### Using `nh`
Updating from a local config is now easy - since `nh` is already specified as installed:
```
nix flake update
nh os switch .
```
### Installer iso
To build an installer iso, run
```bash
@@ -38,9 +47,55 @@ nix build .#nixosConfigurations.bcachefs-iso.config.system.build.isoImage
This will create an iso image in the result directory.
### Macos install
Initial install of nix using the determinate nix installer. Then a "full" bootstrap that installs all required packages such as `nh`, `git` etc.:
```
sudo nix run nix-darwin/master#darwin-rebuild -- switch --flake .#Remys-MacBook-Pro
```
> some modifications might be necessary (i.e. due to faulty git setup at that stage).
```
# could also try something like this:
nix-shell -p git nh
```
Finally, the desired state has been reached where `nh` is available:
```
nh darwin switch .
```
## Installation
TODO - disable root user
```
I install with --no-root-passwd and set users.mutableUsers = false in configuration.nix
```
## TODO
## Inspirations
- https://github.com/the-nix-way/dev-templates
- https://fasterthanli.me/series/building-a-rust-service-with-nix/part-10
- https://codeberg.org/theDoctor/nixOS-config
- https://ianthehenry.com/posts/how-to-learn-nix/profiles/
- https://ianthehenry.com/posts/how-to-learn-nix/profiles
- https://github.com/JohnRTitor/nix-conf
- https://github.com/mwaldleben/nix-config
- https://github.com/anotherhadi/nixy
- https://github.com/Numb-0/nix-0
- https://github.com/Frost-Phoenix/nixos-config
- https://github.com/nomadics9/nixcfg
- https://github.com/Daholli/nixos-config
- https://github.com/khaneliman/khanelinix
- https://github.com/NotAShelf/nyx
- https://copeberg.org/bloxx12/nichts
- https://github.com/fufexan/dotfiles
- https://github.com/spikespaz/dotfiles
- https://github.com/luisnquin/nixos-config
- https://gitlab.com/fisuri/dotfiles
- https://github.com/NobbZ/nixos-config
- https://code.maralorn.de/maralorn/config/
- https://github.com/sameemul-haque/dotfiles
#### Hyprland specific
- https://github.com/elifouts/Dotfiles
- https://github.com/Abhra00/hyprdots

View File

@@ -1,471 +0,0 @@
[io/github/celluloid-player/celluloid]
settings-migrated=true
[io/github/celluloid-player/celluloid/window-state]
height=425
loop-playlist=false
maximized=true
playlist-width=250
show-controls=true
show-playlist=false
volume=0.80000000000000004
width=296
[org/gnome/Console]
audible-bell=false
font-scale=1.0
last-window-maximised=true
last-window-size=(1131, 1048)
theme='night'
[org/gnome/Extensions]
window-maximized=true
[org/gnome/Loupe]
show-properties=true
[org/gnome/Weather]
locations=[<(uint32 2, <('Zürich', 'LSZH', true, [(0.82874050067087668, 0.14893475701908529)], [(0.82670429484574492, 0.14922565104551519)])>)>]
window-height=495
window-maximized=false
window-width=992
[org/gnome/World/Secrets]
last-opened-database='davs://nextcloud.kluster.moll.re/remote.php/dav/files/admin/Various/KeePass/keepass.kdbx'
last-opened-list=['davs://nextcloud.kluster.moll.re/remote.php/dav/files/admin/Various/KeePass/keepass.kdbx']
window-size=[960, 1048]
[org/gnome/calculator]
accuracy=9
angle-units='degrees'
base=10
button-mode='basic'
number-format='automatic'
refresh-interval=0
show-thousands=false
show-zeroes=false
source-currency=''
source-units='degree'
target-currency=''
target-units='radian'
window-maximized=false
window-size=(360, 740)
word-size=64
[org/gnome/calendar]
active-view='month'
window-maximized=true
window-size=(768, 600)
[org/gnome/clocks/state/window]
maximized=false
panel-id='world'
size=(870, 690)
[org/gnome/control-center]
last-panel='display'
window-state=(1718, 851, false)
[org/gnome/desktop/app-folders]
folder-children=['Utilities', 'YaST', '1aa8a471-a3d4-448f-979d-708f041bd93e', '9a796cbb-fc11-4e0c-92ea-bbf29cc78df0', 'a683fc46-9a24-41c2-91e9-7637c554fdc4', 'aee3ca9c-d66d-42f4-9b76-4dda08403814', '599d49f8-20cb-482c-a619-451cf4f561a3', '212ada4d-a2fa-4063-b6b1-24b711d4e9ab', '862c0f6e-86e2-40fe-a06f-5d638a5bc5e7', '90c1ffb4-572f-4a17-8793-a248f0ee26e4', 'f5961050-635b-4ad1-91e1-3a67538a236b', '5ea1c1fc-c589-42d3-bbaa-05428cb9e434', '496a9ca3-5d6b-4231-9434-cf1da320fe55']
[org/gnome/desktop/app-folders/folders/1aa8a471-a3d4-448f-979d-708f041bd93e]
apps=['bvnc.desktop', 'avahi-discover.desktop', 'bssh.desktop', 'thorium-shell.desktop', 'org.gnome.PowerStats.desktop', 'stoken-gui-small.desktop', 'stoken-gui.desktop', 'qvidcap.desktop', 'qv4l2.desktop', 'electron25.desktop', 'btop.desktop', 'lstopo.desktop', 'mpv.desktop', 'gtk-lshw.desktop']
name='Useless'
translate=false
[org/gnome/desktop/app-folders/folders/212ada4d-a2fa-4063-b6b1-24b711d4e9ab]
apps=['jhelioviewer.desktop']
name='Unnamed Folder'
[org/gnome/desktop/app-folders/folders/496a9ca3-5d6b-4231-9434-cf1da320fe55]
apps=['com.github.flxzt.rnote.desktop', 'dev.linwood.butterfly.desktop', 'com.github.scrivanolabs.scrivano.desktop']
name='Unnamed Folder'
[org/gnome/desktop/app-folders/folders/599d49f8-20cb-482c-a619-451cf4f561a3]
apps=['electron28.desktop', 'electron30.desktop', 'electron29.desktop', 'cmake-gui.desktop', 'electron31.desktop', 'jshell-java17-openjdk.desktop', 'jconsole-java17-openjdk.desktop']
name='Programming'
[org/gnome/desktop/app-folders/folders/5ea1c1fc-c589-42d3-bbaa-05428cb9e434]
apps=['com.calibre_ebook.calibre.ebook-viewer.desktop', 'com.calibre_ebook.calibre.lrfviewer.desktop', 'com.calibre_ebook.calibre.ebook-edit.desktop', 'com.calibre_ebook.calibre.desktop']
name='Calibre'
translate=false
[org/gnome/desktop/app-folders/folders/862c0f6e-86e2-40fe-a06f-5d638a5bc5e7]
apps=['net.danigm.timetrack.desktop']
name='Unnamed Folder'
[org/gnome/desktop/app-folders/folders/90c1ffb4-572f-4a17-8793-a248f0ee26e4]
apps=['com.mattjakeman.ExtensionManager.desktop', 'org.gnome.Extensions.desktop']
name='Accessories'
[org/gnome/desktop/app-folders/folders/9a796cbb-fc11-4e0c-92ea-bbf29cc78df0]
apps=['Deep Rock Galactic.desktop', 'The Sims 4.desktop', 'steam.desktop', 'org.ryujinx.Ryujinx.desktop', 'net.veloren.airshipper.desktop', 'org.DolphinEmu.dolphin-emu.desktop', 'discord.desktop', 'simutrans.desktop', 'Darksiders Warmastered Edition.desktop', 'gearlever_curseforge_cd3cee.desktop']
name='Games'
[org/gnome/desktop/app-folders/folders/Utilities]
apps=['gnome-abrt.desktop', 'gnome-system-log.desktop', 'nm-connection-editor.desktop', 'org.gnome.baobab.desktop', 'org.gnome.Connections.desktop', 'org.gnome.DejaDup.desktop', 'org.gnome.Dictionary.desktop', 'org.gnome.DiskUtility.desktop', 'org.gnome.eog.desktop', 'org.gnome.FileRoller.desktop', 'org.gnome.fonts.desktop', 'org.gnome.seahorse.Application.desktop', 'org.gnome.tweaks.desktop', 'org.gnome.Usage.desktop', 'vinagre.desktop']
categories=['X-GNOME-Utilities']
excluded-apps=['org.gnome.Evince.desktop']
name='X-GNOME-Utilities.directory'
translate=true
[org/gnome/desktop/app-folders/folders/YaST]
categories=['X-SuSE-YaST']
name='suse-yast.directory'
translate=true
[org/gnome/desktop/app-folders/folders/a683fc46-9a24-41c2-91e9-7637c554fdc4]
apps=['jconsole-java-openjdk.desktop', 'jshell-java-openjdk.desktop']
name='Unnamed Folder'
[org/gnome/desktop/app-folders/folders/aee3ca9c-d66d-42f4-9b76-4dda08403814]
apps=['codium-wayland.desktop', 'codium.desktop']
name='Accessories'
[org/gnome/desktop/app-folders/folders/f5961050-635b-4ad1-91e1-3a67538a236b]
apps=['cafe.avery.Delfin.desktop']
name='Unnamed Folder'
[org/gnome/desktop/background]
color-shading-type='solid'
picture-options='zoom'
picture-uri='file:///mnt/media/@Bulk/Wallpaper/Linux/arch_btw_Gilded Glow.png'
picture-uri-dark='file:///mnt/media/@Bulk/Wallpaper/Linux/arch_btw_Gilded Glow.png'
primary-color='#000000000000'
secondary-color='#000000000000'
[org/gnome/desktop/calendar]
show-weekdate=false
[org/gnome/desktop/input-sources]
per-window=true
sources=[('xkb', 'de'), ('xkb', 'ch'), ('xkb', 'us')]
xkb-options=['lv3:ralt_switch']
[org/gnome/desktop/interface]
clock-show-weekday=true
color-scheme='prefer-dark'
cursor-theme='Qogir'
enable-animations=true
font-antialiasing='rgba'
font-hinting='slight'
font-name='Cantarell 11'
icon-theme='Qogir'
monospace-font-name='Fira Code 10'
show-battery-percentage=true
[org/gnome/desktop/peripherals/keyboard]
numlock-state=true
[org/gnome/desktop/peripherals/mouse]
natural-scroll=false
speed=0.20851063829787231
[org/gnome/desktop/peripherals/stylus/default-04f3:2817]
eraser-pressure-curve=[0, 0, 100, 100]
pressure-curve=[0, 0, 100, 100]
[org/gnome/desktop/peripherals/tablets/04f3:2817]
area=[0.0, 0.0, 0.0, 0.0]
[org/gnome/desktop/peripherals/touchpad]
speed=0.16872427983539096
tap-to-click=true
two-finger-scrolling-enabled=true
[org/gnome/desktop/privacy]
old-files-age=uint32 30
recent-files-max-age=30
report-technical-problems=false
[org/gnome/desktop/remote-desktop/rdp]
enable=false
screen-share-mode='extend'
tls-cert='/home/remy/.local/share/gnome-remote-desktop/rdp-tls.crt'
tls-key='/home/remy/.local/share/gnome-remote-desktop/rdp-tls.key'
view-only=true
[org/gnome/desktop/screensaver]
color-shading-type='solid'
picture-options='zoom'
picture-uri='file:///home/remy/.local/share/backgrounds/2022-09-12-22-02-00-arch_btw_In%20the%20Noise.png'
primary-color='#000000000000'
secondary-color='#000000000000'
[org/gnome/desktop/search-providers]
disabled=@as []
sort-order=['org.gnome.Contacts.desktop', 'org.gnome.Documents.desktop', 'org.gnome.Nautilus.desktop']
[org/gnome/desktop/session]
idle-delay=uint32 300
[org/gnome/desktop/sound]
event-sounds=true
theme-name='__custom'
[org/gnome/desktop/wm/keybindings]
maximize=@as []
switch-input-source=@as []
switch-input-source-backward=@as []
unmaximize=@as []
[org/gnome/desktop/wm/preferences]
action-middle-click-titlebar='lower'
action-right-click-titlebar='none'
button-layout='appmenu:close'
[org/gnome/eog/ui]
sidebar=false
[org/gnome/eog/view]
background-color='rgb(0,0,0)'
use-background-color=true
[org/gnome/evince]
document-directory=@ms 'file:///home/remy/Downloads'
[org/gnome/evince/default]
continuous=true
dual-page=false
dual-page-odd-left=false
enable-spellchecking=true
fullscreen=false
inverted-colors=false
show-sidebar=false
sidebar-page='thumbnails'
sidebar-size=133
sizing-mode='free'
window-ratio=(1.4368686868686869, 1.8659493444606587)
zoom=0.46691813714666941
[org/gnome/evolution-data-server]
migrated=true
network-monitor-gio-name=''
[org/gnome/file-roller/dialogs/add]
current-folder='file:///home/remy/Downloads'
exclude-files=''
exclude-folders=''
include-files='*'
no-symlinks=true
selected-files=@as []
update=false
[org/gnome/file-roller/dialogs/extract]
height=800
recreate-folders=true
skip-newer=false
width=1000
[org/gnome/file-roller/file-selector]
show-hidden=false
sidebar-size=168
window-size=(-1, -1)
[org/gnome/file-roller/listing]
list-mode='as-folder'
name-column-width=410
show-path=false
sort-method='name'
sort-type='descending'
[org/gnome/file-roller/ui]
sidebar-width=200
window-height=1001
window-width=960
[org/gnome/libgnomekbd/preview]
height=611
width=1464
x=240
y=135
[org/gnome/mutter]
attach-modal-dialogs=false
edge-tiling=false
experimental-features=['kms-modifiers']
[org/gnome/mutter/keybindings]
toggle-tiled-left=@as []
toggle-tiled-right=@as []
[org/gnome/nautilus/compression]
default-compression-format='zip'
[org/gnome/nautilus/preferences]
default-folder-viewer='list-view'
migrated-gtk-settings=true
search-filter-time-type='last_modified'
search-view='list-view'
[org/gnome/nautilus/window-state]
initial-size=(1920, 1048)
maximized=true
sidebar-width=157
[org/gnome/power-manager]
info-history-time=604800
info-history-type='charge'
info-last-device='/org/freedesktop/UPower/devices/battery_BAT0'
info-page-number=1
info-stats-type='discharge-accuracy'
[org/gnome/settings-daemon/peripherals/touchscreen]
orientation-lock=false
[org/gnome/settings-daemon/plugins/media-keys]
custom-keybindings=['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/']
[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0]
binding='<Super>space'
command='ulauncher'
name='Ulauncher'
[org/gnome/settings-daemon/plugins/power]
power-button-action='hibernate'
sleep-inactive-ac-timeout=3600
sleep-inactive-battery-type='suspend'
[org/gnome/shell]
app-picker-layout=[{'org.gnome.Settings.desktop': <{'position': <0>}>, 'com.github.tchx84.Flatseal.desktop': <{'position': <1>}>, 'aee3ca9c-d66d-42f4-9b76-4dda08403814': <{'position': <2>}>, 'org.gnome.Software.desktop': <{'position': <3>}>, 'org.pipewire.Helvum.desktop': <{'position': <4>}>, 'com.spotify.Client.desktop': <{'position': <5>}>, 'org.gnome.Evince.desktop': <{'position': <6>}>, 'org.keepassxc.KeePassXC.desktop': <{'position': <7>}>, 'us.zoom.Zoom.desktop': <{'position': <8>}>, 'org.onlyoffice.desktopeditors.desktop': <{'position': <9>}>, '496a9ca3-5d6b-4231-9434-cf1da320fe55': <{'position': <10>}>, 'io.podman_desktop.PodmanDesktop.desktop': <{'position': <11>}>, 'io.element.Element.desktop': <{'position': <12>}>, '9a796cbb-fc11-4e0c-92ea-bbf29cc78df0': <{'position': <13>}>, 'org.mozilla.Thunderbird.desktop': <{'position': <14>}>, 'com.discordapp.Discord.desktop': <{'position': <15>}>, 'org.gnome.Loupe.desktop': <{'position': <16>}>, 'owncloud.desktop': <{'position': <17>}>, 'Alacritty.desktop': <{'position': <18>}>, 'dev.zed.Zed.desktop': <{'position': <19>}>, 'zen-browser.desktop': <{'position': <20>}>}, {'1aa8a471-a3d4-448f-979d-708f041bd93e': <{'position': <0>}>, 'sqlitebrowser.desktop': <{'position': <1>}>, 'Utilities': <{'position': <2>}>, 'io.github.celluloid_player.Celluloid.desktop': <{'position': <3>}>, 'io.missioncenter.MissionCenter.desktop': <{'position': <4>}>, 'com.logseq.Logseq.desktop': <{'position': <5>}>, '599d49f8-20cb-482c-a619-451cf4f561a3': <{'position': <6>}>, 'org.inkscape.Inkscape.desktop': <{'position': <7>}>, '90c1ffb4-572f-4a17-8793-a248f0ee26e4': <{'position': <8>}>, '5ea1c1fc-c589-42d3-bbaa-05428cb9e434': <{'position': <9>}>, 'nvtop.desktop': <{'position': <10>}>, 'com.github.taiko2k.avvie.desktop': <{'position': <11>}>, 'ds9.desktop': <{'position': <12>}>, 'it.mijorus.gearlever.desktop': <{'position': <13>}>, 'org.gnome.Calculator.desktop': <{'position': <14>}>, 'fish.desktop': <{'position': <15>}>, 'scrcpy.desktop': <{'position': <16>}>, 'scrcpy-console.desktop': <{'position': <17>}>, 'org.gnome.Showtime.desktop': <{'position': <18>}>, 'gparted.desktop': <{'position': <19>}>}]
command-history=['r', 'restart', 'btop', 'terminal', 'console']
disable-user-extensions=false
disabled-extensions=['workspace-indicator@gnome-shell-extensions.gcampax.github.com', 'user-theme@gnome-shell-extensions.gcampax.github.com', 'bluetooth-quick-connect@bjarosze.gmail.com', 'launch-new-instance@gnome-shell-extensions.gcampax.github.com', 'just-perfection-desktop@just-perfection', 'syncthing@gnome.2nv2u.com', 'dash2dock-lite@icedman.github.com', 'awesome-tiles@velitasali.com', 'trayIconsReloaded@selfmade.pl']
enabled-extensions=['gestureImprovements@gestures', 'pano@elhan.io', 'clipboard-history@alexsaveau.dev', 'WallpaperSwitcher@Rishu', 'gsconnect@andyholmes.github.io', 'tiling-assistant@leleat-on-github', 'azwallpaper@azwallpaper.gitlab.com', 'caffeine@patapon.info', 'Vitals@CoreCoding.com', 'windowgestures@extension.amarullz.com', 'dash-to-dock@micxgx.gmail.com', 'tilingshell@ferrarodomenico.com', 'search-light@icedman.github.com', 'vscode-search-provider@mrmarble.github.com', 'appindicatorsupport@rgcjonas.gmail.com']
favorite-apps=['org.gnome.Nautilus.desktop', 'org.gnome.Console.desktop', 'obsidian.desktop', 'code.desktop', 'firefox.desktop']
had-bluetooth-devices-setup=true
last-selected-power-profile='power-saver'
remember-mount-password=false
welcome-dialog-last-shown-version='42.4'
[org/gnome/shell/extensions/azwallpaper]
slideshow-current-wallpapper='arch_btw_Gilded Glow.png'
slideshow-directory='/mnt/media/@Bulk/Wallpaper/Linux'
slideshow-slide-duration=(6, 0, 0)
slideshow-time-of-slide-start=uint64 1724945866662
slideshow-timer-remaining=17485
slideshow-wallpaper-queue=['arch_btw_Morning Dew.png', 'arch_btw_Red Wrath.png', 'arch_btw_Aquatic Shock.png', 'arch_btw_Industrial Blue.png', 'arch_btw_Cutting Edge.png', 'arch_btw_chad-z-lCPfh95L0nc-unsplash.jpg', 'arch_btw_Purple Nerves.png', 'arch_btw_Hypnotic Shock.png', 'arch_btw_New Waves.png', 'arch_btw_Chevron Sunset.png', 'arch_btw_Aurora Hills.png', 'arch_btw_Vileness.png', 'arch_btw_Red Undead.png', 'arch_btw_Sky Fire.png', 'arch_btw_ash-goldsbrough-YfgE8WCcZsQ-unsplash.jpg', 'arch_btw_stars-3840x2160-star-trail-galaxy-sky-4k-6k-18295.jpg', 'arch_btw_blue-green-and-red-abstract-illustration-1566909.jpg', 'arch_btw_patrick-fore-UxPYxMIDcKU-unsplash.jpg', 'arch_btw_Police Chase.png', 'arch_btw_polygon-3840x2160-4k-16202.jpg', 'arch_btw_Pitch.png', 'arch_btw_Acid Arrows.png', 'arch_btw_t-h-chia-1-Zr2ye5588-unsplash.jpg', 'arch_btw_Multiplex.png', 'arch_btw_silhouette-of-mountains-during-dawn-1809644.jpg', 'arch_btw_Hail Storm.png', "arch_btw_Uppin' Flames.png", 'arch_btw_Frostbite.png', 'arch_btw_Android P.png', "arch_btw_Ol' Reliable.png", 'arch_btw_Hex Glow.png', 'arch_btw_star-trail-photography-2868665.jpg', 'arch_btw_Industrial Blood.png', 'arch_btw_mountains_moon_canvas_172262_3840x2160.jpg', 'arch_btw_alex-perez-ioJBsYQ-pPM-unsplash.jpg', 'arch_btw_Neural Network.png', 'arch_btw_Cut Stone.png', 'arch_btw_Armageddon.png']
[org/gnome/shell/extensions/caffeine]
countdown-timer=0
indicator-position-max=1
[org/gnome/shell/extensions/clipboard-history]
display-mode=0
private-mode=false
window-width-percentage=20
[org/gnome/shell/extensions/gestureImprovements]
enable-alttab-gesture=false
enable-forward-back-gesture=true
forward-back-application-keyboard-shortcuts={'firefox.desktop': (1, false), 'org.chromium.Chromium.desktop': (1, false), 'org.gnome.gThumb.desktop': (2, false), 'org.gnome.eog.desktop': (3, false), 'org.gnome.Photos.desktop': (3, false), 'shotwell.desktop': (3, false), 'com.spotify.Client.desktop': (4, false), 'code.desktop': (5, false), 'code-insiders.desktop': (5, false), 'org.gnome.Terminal.desktop': (5, false), 'com.gexperts.Tilix.desktop': (5, false), 'org.gnome.TextEditor.desktop': (5, false), 'com.brave.Browser.desktop': (1, false)}
[org/gnome/shell/overrides]
edge-tiling=false
[org/gnome/shell/weather]
automatic-location=true
locations=[<(uint32 2, <('Zürich', 'LSZH', true, [(0.82874050067087668, 0.14893475701908529)], [(0.82670429484574492, 0.14922565104551519)])>)>]
[org/gnome/shell/world-clocks]
locations=@av []
[org/gnome/software]
check-timestamp=int64 1724142293
download-updates=false
download-updates-notify=false
first-run=false
flatpak-purge-timestamp=int64 1724771609
online-updates-timestamp=int64 1682110589
update-notification-timestamp=int64 1724699283
[org/gnome/terminal/legacy]
theme-variant='dark'
[org/gnome/terminal/legacy/profiles:/:b1dcc9dd-5262-4d8d-a863-c897e6d979b9]
background-color='rgb(0,0,0)'
default-size-rows=24
font='Fira Code 12'
foreground-color='rgb(170,170,170)'
use-system-font=false
use-theme-colors=false
[org/gnome/tweaks]
show-extensions-notice=false
[org/gtk/gtk4/settings/color-chooser]
custom-colors=[(0.20333333313465118, 0.20333333313465118, 0.20333333313465118, 0.80236488580703735), (0.20333333313465118, 0.20333333313465118, 0.20333333313465118, 1.0), (0.20333333313465118, 0.20333333313465118, 0.20333333313465118, 0.80666667222976685), (0.0, 0.0, 0.0, 0.56333333253860474), (0.0, 0.0, 0.0, 0.25)]
selected-color=(true, 0.20333333313465118, 0.20333333313465118, 0.20333333313465118, 0.80236488580703735)
[org/gtk/gtk4/settings/emoji-chooser]
recent-emotrue
sort-order='ascending'
type-format='category'
view-type='grid'
window-size=(887, 1027)
[org/gtk/settings/color-chooser]
custom-colors=[(0.14509803921568629, 0.74509803921568629, 0.54509803921568623, 1.0), (0.0, 0.85882352941176465, 0.37647058823529411, 1.0), (1.0, 0.92156862745098034, 0.062745098039215685, 1.0), (1.0, 0.52156862745098043, 0.10588235294117647, 1.0), (1.0, 0.25490196078431371, 0.21176470588235294, 1.0), (0.49803921568627452, 0.13725490196078433, 1.0, 1.0), (0.098039215686274508, 0.45098039215686275, 1.0, 1.0)]
selected-color=(true, 0.6470588235294118, 0.11372549019607843, 0.17647058823529413, 1.0)
[org/gtk/settings/file-chooser]
date-format='regular'
location-mode='path-bar'
show-hidden=true
show-size-column=true
show-type-column=true
sidebar-width=275
sort-column='name'
sort-directories-first=true
sort-order='ascending'
type-format='category'
window-position=(26, 120)
window-size=(1573, 856)
[org/mate/atril/default]
window-ratio=(3.2268907563025211, 1.2422802850356294)
.
[system/proxy]
mode='none'
ji=[(([uint32 9888], 'warning', ['warning'], uint32 8), uint32 0)]
[org/gtk/gtk4/settings/file-chooser]
date-format='regular'
location-mode='path-bar'
show-hidden=true
show-size-column=true
show-type-column=true
sidebar-width=170
sort-column='name'
sort-directories-first=true
sort-order='ascending'
type-format='category'
view-type='grid'
window-size=(887, 1027)
[org/gtk/settings/color-chooser]
custom-colors=[(0.14509803921568629, 0.74509803921568629, 0.54509803921568623, 1.0), (0.0, 0.85882352941176465, 0.37647058823529411, 1.0), (1.0, 0.92156862745098034, 0.062745098039215685, 1.0), (1.0, 0.52156862745098043, 0.10588235294117647, 1.0), (1.0, 0.25490196078431371, 0.21176470588235294, 1.0), (0.49803921568627452, 0.13725490196078433, 1.0, 1.0), (0.098039215686274508, 0.45098039215686275, 1.0, 1.0)]
selected-color=(true, 0.6470588235294118, 0.11372549019607843, 0.17647058823529413, 1.0)
[org/gtk/settings/file-chooser]
date-format='regular'
location-mode='path-bar'
show-hidden=true
show-size-column=true
show-type-column=true
sidebar-width=275
sort-column='name'
sort-directories-first=true
sort-order='ascending'
type-format='category'
window-position=(26, 120)
window-size=(1573, 856)
[org/mate/atril/default]
window-ratio=(3.2268907563025211, 1.2422802850356294)
.
[system/proxy]
mode='none'

1097
flake.lock generated

File diff suppressed because it is too large Load Diff

217
flake.nix
View File

@@ -1,65 +1,198 @@
{
description = "Nix config entry point";
# since secrets live in a submodule, enable submodules by default
inputs.self.submodules = true;
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05";
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
# Home manager
home-manager.url = "github:nix-community/home-manager/release-24.05";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
# Managing flatpak apps
nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=v0.4.1";
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
# Managing flatpak apps
nix-flatpak.url = "github:gmodena/nix-flatpak";
# hyprland, plugins and related utils
hyprland.url = "github:hyprwm/Hyprland";
stylix = {
url = "github:nix-community/stylix";
inputs.nixpkgs.follows = "nixpkgs";
};
# zen browser
zen-browser = {
url = "github:0xc000022070/zen-browser-flake";
inputs.nixpkgs.follows = "nixpkgs";
};
# secrets
sops-nix = {
url = "github:Mic92/sops-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
# quickshell
dankMaterialShell = {
url = "github:AvengeMedia/DankMaterialShell";
inputs.nixpkgs.follows = "nixpkgs";
};
nix4vscode = {
url = "github:nix-community/nix4vscode";
inputs.nixpkgs.follows = "nixpkgs";
};
nix-darwin.url = "github:nix-darwin/nix-darwin/nix-darwin-25.11";
nix-darwin.inputs.nixpkgs.follows = "nixpkgs";
mac-app-util = {
# see https://github.com/hraban/mac-app-util/issues/39#issuecomment-3503946041
url = "github:hraban/mac-app-util";
inputs.cl-nix-lite.url = "github:r4v3n6101/cl-nix-lite/url-fix";
};
};
outputs = {
self,
nixpkgs,
nixpkgs-unstable,
home-manager,
stylix,
sops-nix,
nix4vscode,
nix-darwin,
mac-app-util,
...
} @ inputs: {
## NixOS configurations are the main output of this flake
# HP Spectre x360 2018
nixosConfigurations.spectre = nixpkgs.lib.nixosSystem {
} @ inputs:
let
system = "x86_64-linux";
specialArgs = { inherit inputs; };
modules = [
./hosts/spectre-x360-2018
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
username = "remy";
name = "Rémy";
home-manager.users.remy.imports = [
./users/remy.nix
inputs.nix-flatpak.homeManagerModules.nix-flatpak
];
}
pkgs = nixpkgs.legacyPackages.${system};
pkgs-unstable = nixpkgs-unstable.legacyPackages.${system};
lib = nixpkgs.lib;
systems = {
# HP Spectre x360 2018
Nixtre = {
hostModules = [
./hosts/spectre-x360-2018
];
userModules = [
./users/remy_spectre
inputs.nix-flatpak.homeManagerModules.nix-flatpak
];
extraModules = [
inputs.stylix.nixosModules.stylix
inputs.sops-nix.nixosModules.sops
];
};
# Portable usb stick
nichts = {
hostModules = [
./hosts/mobile-usb
];
userModules = [
./users/remy_usb
inputs.nix-flatpak.homeManagerModules.nix-flatpak
];
extraModules = [
inputs.stylix.nixosModules.stylix
inputs.sops-nix.nixosModules.sops
];
};
# Lenovo yoga 7 pro
nyx = {
hostModules = [
./hosts/yoga-7-pro
];
userModules = [
./users/remy_yoga
inputs.nix-flatpak.homeManagerModules.nix-flatpak
inputs.dankMaterialShell.homeModules.dankMaterialShell.default
];
extraModules = [
inputs.stylix.nixosModules.stylix
inputs.sops-nix.nixosModules.sops
{ nixpkgs.overlays = [ inputs.nix4vscode.overlays.default ]; }
];
};
};
in
{
# For each entry in `systems` create a nixosConfiguration
nixosConfigurations = lib.mapAttrs (_name: cfg:
nixpkgs.lib.nixosSystem {
inherit system;
specialArgs = { inherit inputs pkgs-unstable; };
modules =
cfg.hostModules ++
cfg.extraModules ++
[ home-manager.nixosModules.home-manager {
# Common home-manager flags
home-manager = {
backupFileExtension = ".backup";
useGlobalPkgs = true;
useUserPackages = true;
extraSpecialArgs = { inherit inputs pkgs-unstable; };
};
# Merge in all the user fragments for this host
home-manager.users.remy = lib.mkMerge cfg.userModules;
}
]
;
}
) systems;
darwinConfigurations."Remys-MacBook-Pro" = nix-darwin.lib.darwinSystem {
modules = [
home-manager.darwinModules.home-manager {
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.backupFileExtension = ".backup";
home-manager.extraSpecialArgs = { inherit inputs pkgs-unstable; };
home-manager.users.remy.imports = [
./users/remy_macos
mac-app-util.homeManagerModules.default
];
}
mac-app-util.darwinModules.default
{ nixpkgs.overlays = [ inputs.nix4vscode.overlays.default ]; }
./hosts/macbook-pro
];
};
# nixosConfigurations.raspberry-pi = nixpkgs.lib.nixosSystem {
# system = "aarch64-linux";
# modules = [
# ./hosts/raspberry-pi/configuration.nix
# ];
# };
# ## Useful nix build tools
# # iso builder TODO
# nixosConfigurations.bcachefs-iso = nixpkgs.lib.nixosSystem {
# system = "x86_64-linux";
# modules = [
# "${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-minimal-new-kernel-no-zfs.nix"
# ({ lib, pkgs, ... }: {
# boot.supportedFilesystems = [ "bcachefs" ];
# boot.kernelPackages = lib.mkOverride 0 pkgs.linuxPackages_latest;
# })
# ];
# };
## Home Manager configurations here?
## Useful nix build tools
# iso builder TODO
nixosConfigurations.bcachefs-iso = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
"${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-minimal-new-kernel-no-zfs.nix"
({ lib, pkgs, ... }: {
boot.supportedFilesystems = [ "bcachefs" ];
boot.kernelPackages = lib.mkOverride 0 pkgs.linuxPackages_latest;
})
# devshell for this configuration
devShells.x86_64-linux.default = nixpkgs.legacyPackages.x86_64-linux.mkShell {
packages = [
pkgs.sops
];
# tell sops where the public ssh key to "seed" the age key from is located
SOPS_AGE_SSH_PRIVATE_KEY_FILE = "/home/remy/.ssh/main_key";
};
};
}

View File

@@ -0,0 +1,26 @@
{ config, lib, pkgs, ... }:
{
users.users.remy = {
home = "/Users/remy";
};
system.primaryUser = "remy";
nix.enable=false;
nixpkgs.config.allowUnfree = true;
security.pam.services.sudo_local.touchIdAuth = true;
# Necessary for using flakes on this system.
nix.settings.experimental-features = "nix-command flakes";
# Enable alternative shell support in nix-darwin.
# programs.fish.enable = true;
# Set Git commit hash for darwin-version.
# system.configurationRevision = self.rev or self.dirtyRev or null;
# Used for backwards compatibility, please read the changelog before changing.
# $ darwin-rebuild changelog
system.stateVersion = 6;
nixpkgs.hostPlatform = "aarch64-darwin";
}

View File

@@ -0,0 +1,15 @@
{
config = {
#nix-config = {
# networking.hostName = "nyx";
# userName = "remy";
#};
};
# Merge the configuration and hardware configuration
imports = [
./configuration.nix
../../modules/macos/tiling.nix
];
}

View File

@@ -0,0 +1,10 @@
# Edit this configuration file to define what should be installed on
# your system. Help is available in the configuration.nix(5) man page, on
# https://search.nixos.org/options and in the NixOS manual (`nixos-help`).
{ config, lib, pkgs, ... }:
{
# For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion .
system.stateVersion = "24.05"; # Did you read the comment?
}

View File

@@ -0,0 +1,38 @@
{lib, config, options, pkgs, ...}:
{
config = {
nix-config = {
networking.hostName = "nichts";
userName = "remy";
gnome.enable = true;
};
};
# Merge the configuration and hardware configuration
imports = [
./configuration.nix
./hardware-configuration.nix
# ../../modules/nixos/backup.nix
../../modules/nixos/bluetooth.nix
../../modules/nixos/flakes.nix
../../modules/nixos/flatpak.nix
../../modules/nixos/fonts.nix
../../modules/nixos/gnome.nix
../../modules/nixos/language.nix
../../modules/nixos/ld.nix
../../modules/nixos/monitoring.nix
../../modules/nixos/networking.nix
../../modules/nixos/pipewire.nix
../../modules/nixos/podman.nix
../../modules/nixos/power.nix
../../modules/nixos/stylix.nix
../../modules/nixos/user.nix
../../utils/binary-cache.nix
../../utils/garbage-collection.nix
../../utils/unfree.nix
];
}

View File

@@ -0,0 +1,40 @@
# Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{
imports =
[ (modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "thunderbolt" "usb_storage" "sd_mod" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/disk/by-uuid/621498e8-64f6-4979-8489-3dc1d145e349";
fsType = "ext4";
};
boot.initrd.luks.devices."root-enc".device = "/dev/disk/by-uuid/156d0f15-397c-4bc6-8f57-026108975246";
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/B2D0-672E";
fsType = "vfat";
options = [ "fmask=0022" "dmask=0022" ];
};
swapDevices = [ ];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's
# still possible to use this option, but it's recommended to use it in conjunction
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.interfaces.wlp1s0.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}

View File

@@ -0,0 +1,17 @@
{
config,
pkgs,
...
}:
{
boot.loader.grub.enable = true;
boot.loader.grub.efiSupport = true;
# location at install time. Since the drive is a USB drive this is expcected to change on each device
boot.loader.grub.device = "/dev/sdb";
boot.loader.grub.efiInstallAsRemovable = true;
boot.loader.systemd-boot.enable = false;
boot.loader.efi.canTouchEfiVariables = false;
boot.tmp.useTmpfs = true;
}

View File

@@ -30,6 +30,7 @@
# Select internationalisation properties.
i18n.defaultLocale = "en_US.UTF-8";
# i18n.supportedLocales = [ "en_US.UTF-8" "de_DE.UTF-8" ];

View File

@@ -4,12 +4,21 @@
imports = [
./configuration.nix
./hardware-configuration.nix
../../modules/nixos/bluetooth.nix
../../modules/nixos/flakes.nix
../../modules/nixos/flatpak.nix
../../modules/nixos/gdm.nix
../../modules/nixos/fonts.nix
../../modules/nixos/hyprland.nix
../../modules/nixos/ld.nix
../../modules/nixos/monitoring.nix
../../modules/nixos/networking.nix
../../modules/nixos/nh.nix
../../modules/nixos/nvidia.nix
../../modules/nixos/pipewire.nix
../../modules/nixos/podman.nix
../../modules/nixos/power.nix
../../modules/nixos/stylix.nix
../../utils/binary-cache.nix
../../utils/garbage-collection.nix
];
}

View File

@@ -0,0 +1,14 @@
Installed using
```
> sudo nixos-install --root /tmp/new-install/ --flake .#nyx --impure --no-root-passwd
```
where `/tmp/new-install` was the mount point of the target FS.
The root user is effectively deactivated, hence the additional setup:
- users are part of the `wheel` group
- password needs to be set before first boot:
- `nix-enter --root /tmp/new-install`
- `passwd <username>`

View File

@@ -0,0 +1,31 @@
# Edit this configuration file to define what should be installed on
# your system. Help is available in the configuration.nix(5) man page, on
# https://search.nixos.org/options and in the NixOS manual (`nixos-help`).
{ config, lib, pkgs, ... }:
{
boot.loader = {
systemd-boot.enable = true;
timeout = 0;
efi.canTouchEfiVariables = true;
};
services.logind.settings.Login = {
# because it is so inconveniently located
HandlePowerKey = "ignore";
# handled by the dm instead
# HandleLidSwitch = "ignore"; # needs to be set because it is not passed to other events
HandleLidSwitchDocked = "ignore";
};
# requires too many shenanigans so I just install using --no-root-passwd
# users.users.root.hashedPassword = "!";
nixpkgs.config.allowUnfree = true;
# For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion .
system.stateVersion = "24.05"; # Did you read the comment?
}

View File

@@ -0,0 +1,37 @@
{
config = {
nix-config = {
networking.hostName = "nyx";
userName = "remy";
};
};
# Merge the configuration and hardware configuration
imports = [
./configuration.nix
./hardware-configuration.nix
../../modules/nixos/backup.nix
../../modules/nixos/bluetooth.nix
../../modules/nixos/flakes.nix
../../modules/nixos/flatpak.nix
../../modules/nixos/fonts.nix
../../modules/nixos/hyprland.nix
../../modules/nixos/language.nix
../../modules/nixos/ld.nix
../../modules/nixos/monitoring.nix
../../modules/nixos/networking.nix
../../modules/nixos/pipewire.nix
../../modules/nixos/podman.nix
../../modules/nixos/power.nix
../../modules/nixos/sops.nix
../../modules/nixos/stylix.nix
../../modules/nixos/user.nix
../../utils/binary-cache.nix
../../utils/garbage-collection.nix
../../utils/unfree.nix
];
}

View File

@@ -0,0 +1,81 @@
# Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{
imports =
[ (modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "thunderbolt" "usb_storage" "sd_mod" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
boot.kernelPackages = pkgs.linuxPackages_latest;
boot.kernelParams = [
"quiet"
"splash"
];
# https://github.com/lwfinger/rtw89/issues/240
# boot.extraModprobeConfig = ''
# options rtw89_pci disable_aspm_l1ss=y disable_aspm_l1=y disable_clkreq=y
# options rtw89_core disable_ps_mode=y
# '';
# ipu is apparently required to make the webcam available as a camera device
hardware.ipu6 = {
enable = true;
platform = "ipu6";
};
services.fwupd.enable = true;
fileSystems."/" =
{ device = "/dev/disk/by-uuid/1ea0784c-4eeb-46f1-a0ae-f6b311b27bd1";
fsType = "btrfs";
options = [ "subvol=@" ];
};
boot.initrd.luks.devices."luks-root" = {
device = "/dev/disk/by-uuid/8832c090-9ca7-4a9c-8cfd-cf43cb59b3d3";
crypttabExtraOpts = [ "fido2-token=auto" ];
};
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/86C2-FD4D";
fsType = "vfat";
options = [ "fmask=0022" "dmask=0022" ];
};
fileSystems."/home" =
{ device = "/dev/disk/by-uuid/1ea0784c-4eeb-46f1-a0ae-f6b311b27bd1";
fsType = "btrfs";
options = [ "subvol=@home" ];
};
# TODO - only enable this if the user remy exists
fileSystems."/scratch/${config.nix-config.userName}" =
{ device = "/dev/disk/by-uuid/1ea0784c-4eeb-46f1-a0ae-f6b311b27bd1";
fsType = "btrfs";
options = [
"subvol=@scratch"
# Even though the mount point is not in home, we still want to show it in gnome-related file managers
"x-gvfs-show"
"x-gvfs-name=scratch"
"x-gvfs-icon=view-refresh"
];
# TODO make it owned by the user
};
swapDevices = [ ];
# Enables DHCP on each ethernet and wireless interface.
networking.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}

View File

@@ -0,0 +1,9 @@
{pkgs, ...}:
{
home.packages = [
pkgs.rofi-bluetooth
];
# patch the rofi-bluetooth script to use an alternative rofi-command variable
}

View File

@@ -1,12 +1,27 @@
{pkgs, ...}:
{pkgs, inputs, ...}:
{
programs.firefox = {
## Enable the Firefox web browser
imports = [
inputs.zen-browser.homeModules.beta
];
programs.zen-browser = {
enable = true;
## Global preferences
policies = {
BlockAboutConfig = true;
DefaultDownloadDirectory = "\${home}/Downloads";
AutofillAddressEnabled = false;
AutofillCreditCardEnabled = false;
DisableAppUpdate = true;
DisableFeedbackCommands = true;
DisableTelemetry = true;
DisablePocket = true;
DontCheckDefaultBrowser = true;
OfferToSaveLogins = false;
ExtensionSettings = with builtins;
let extension = shortId: uuid: {
name = uuid;
@@ -17,64 +32,20 @@
};
in listToAttrs [
(extension "ublock-origin" "uBlock0@raymondhill.net")
(extension "tabliss" "extension@tabliss.io")
(extension "clearurls" "{74145f27-f039-47ce-a470-a662b129930a}")
(extension "keepassxc-browser" "keepassxc-browser@keepassxc.org")
(extension "ghostery" "firefox@ghostery.com")
(extension "clearurls" "{74145f27-f039-47ce-a470-a662b129930a}")
];
};
## Per-profile preferences
profiles.default = {
search = {
force = true;
default = "DuckDuckGo";
privateDefault = "DuckDuckGo";
order = ["DuckDuckGo" "Google"];
};
settings = {
"browser.startup.homepage" = "about:home";
# Disable irritating first-run stuff
"browser.disableResetPrompt" = true;
"browser.download.panel.shown" = true;
"browser.feeds.showFirstRunUI" = false;
"browser.messaging-system.whatsNewPanel.enabled" = false;
"browser.rights.3.shown" = true;
"browser.shell.checkDefaultBrowser" = false;
"browser.shell.defaultBrowserCheckCount" = 1;
"browser.startup.homepage_override.mstone" = "ignore";
"browser.uitour.enabled" = false;
"startup.homepage_override_url" = "";
"trailhead.firstrun.didSeeAboutWelcome" = true;
"browser.bookmarks.restore_default_bookmarks" = false;
"browser.bookmarks.addedImportButton" = true;
# Disable "save password" prompt
"signon.rememberSignons" = false;
# Harden
"privacy.trackingprotection.enabled" = true;
"dom.security.https_only_mode" = true;
# Disable Pocket
"extensions.pocket.enabled" = false;
# Disable telemetry
"toolkit.telemetry.enabled" = false;
# Remove bookmarks toolbar
"browser.toolbars.bookmarks.visibility" = "never";
# Restore session on startup
"browser.startup.page" = 3;
# Automatically enable extensions
"extensions.autoDisableScopes" = 0;
};
};
# ## Per-profile preferences
# profiles.default = {
# search = {
# force = true;
# default = "ddg";
# privateDefault = "ddg";
# order = ["ddg" "google"];
# };
# };
};
}

View File

@@ -1,22 +1,190 @@
{pkgs, ...}:
{pkgs, ...}:
let
baseExtensions = pkgs.nix4vscode.forVscode [
# QOL
"mhutchie.git-graph"
"redhat.vscode-yaml"
# Nix environment selector
"arrterian.nix-env-selector"
# continue.continue
"github.copilot"
"github.copilot-chat"
];
baseSettings = {
# visual
"window.titleBarStyle" = "native";
"window.customTitleBarVisibility" = "never";
"window.menuBarVisibility" = "hidden";
"window.autoDetectColorScheme" = true;
"workbench.preferredDarkColorTheme" = "Default Dark Modern";
"workbench.preferredLightColorTheme" = "Default Light Modern";
"editor.fontFamily" = "'FiraCode Nerd Font Mono', 'monospace', monospace";
"terminal.integrated.fontFamily" = "FiraCode Nerd Font Mono";
"workbench.iconTheme" = "vs-seti";
# telemetry
"telemetry.telemetryLevel" = "off";
"redhat.telemetry.enabled" = false;
# editor QOL
"security.workspace.trust.untrustedFiles" = "open";
"editor.wordWrap" = "on";
"editor.suggestSelection" = "first";
"editor.renderWhitespace" = "none";
"editor.acceptSuggestionOnEnter" = "off";
"editor.fontLigatures" = true;
"editor.inlineSuggest.enabled" = true;
"editor.bracketPairColorization.enabled" = true;
"editor.unicodeHighlight.nonBasicASCII" = false;
"editor.unicodeHighlight.invisibleCharacters" = false;
"editor.unicodeHighlight.ambiguousCharacters" = false;
"files.autoSave" = "onWindowChange";
"files.autoSaveDelay" = 1000;
"files.insertFinalNewline" = true;
"files.trimTrailingWhitespace" = true;
"explorer.confirmDelete" = false;
"explorer.confirmDragAndDrop" = false;
"terminal.integrated.enableMultiLinePasteWarning" = false;
"update.showReleaseNotes" = false;
"terminal.external.linuxExec" = "kitty";
"workbench.startupEditor" = "newUntitledFile";
# Extension management
"extensions.autoCheckUpdates" = false;
"extensions.autoUpdate" = false;
"extensions.ignoreRecommendations" = true;
# git
"git.ignoreMissingGitWarning" = true;
"git.confirmSync" = false;
"git.enableSmartCommit" = true;
"git.autofetch" = true;
"diffEditor.renderSideBySide" = false;
"diffEditor.hideUnchangedRegions.enabled" = true;
"diffEditor.ignoreTrimWhitespace" = false;
# Copilot
"github.copilot.editor.enableAutoCompletions" = true;
"github.copilot.advanced" = {};
"github.copilot.enable" = {
"*" = true;
};
# Python
"python.terminal.activateEnvironment" = false; # let nix-shell handle this
};
baseKeybindings = [
# comment/uncomment line
{
key = "ctrl+[Backslash]"; # was ctrl+# but vscode reads the key differently apparently
command = "editor.action.commentLine";
when = "editorTextFocus";
}
];
in
{
programs.vscode = {
enable = true;
extensions = with pkgs.vscode-extensions; [
# QOL
mhutchie.git-graph
redhat.vscode-yaml
github.copilot
profiles.default = {
userSettings = baseSettings // {
"window.newWindowProfile" = "development";
};
extensions = [];
};
# python
ms-python.python
ms-python.isort
ms-python.debugpy
ms-python.vscode-pylance
profiles.development = {
extensions = baseExtensions ++ pkgs.nix4vscode.forVscode [
# python
"ms-python.python"
"ms-python.isort"
"ms-python.debugpy"
"ms-python.vscode-pylance"
# Nix language
jnoortheen.nix-ide
];
# nix language
"jnoortheen.nix-ide"
# Flutter and co
"dart-code.flutter"
"dart-code.dart-code"
];
keybindings = baseKeybindings;
userSettings = baseSettings;
};
profiles.science = {
extensions = baseExtensions ++ pkgs.nix4vscode.forVscode [
# python + jupyter
"ms-python.python"
"ms-python.isort"
"ms-python.debugpy"
"ms-python.vscode-pylance"
"ms-toolsai.vscode-jupyter-slideshow"
"ms-toolsai.jupyter"
"ms-toolsai.jupyter-hub"
"ms-toolsai.jupyter-renderers"
# Typst
"myriad-dreamin.tinymist"
];
keybindings = baseKeybindings ++ [
# run code cell in jupyter
{
key = "ctrl+enter";
command = "jupyter.runcurrentcell";
when = "editorTextFocus && isWorkspaceTrusted && jupyter.hascodecells && !editorHasSelection && !isCompositeNotebook && !notebookEditorFocused";
}
];
userSettings = baseSettings // {
"jupyter.disableJupyterAutoStart" = true;
"jupyter.askForKernelRestart" = false;
"workbench.editorAssociations" = {
"*.ipynb" = "jupyter-notebook";
};
"notebook.cellToolbarLocation" = {
"default" = "right";
"jupyter-notebook" = "left";
};
"jupyter.widgetScriptSources" = [
"jsdelivr.com"
"unpkg.com"
];
# Typst
"[typst]" = {
"editor.wordSeparators" = "`~!@#$%^&*()=+[{]}\\|;:'\",.<>/?";
};
"[typst-code]" = {
"editor.wordSeparators" = "`~!@#$%^&*()=+[{]}\\|;:'\",.<>/?";
};
"tinymist.fontPaths" = [
"./font"
];
"workbench.colorCustomizations" = {
"statusBar.background" = "#003f9293";
};
};
};
profiles.cloud = {
extensions = baseExtensions ++ pkgs.nix4vscode.forVscode [
"Tim-Koehler.helm-intellisense"
"HashiCorp.terraform"
"signageos.signageos-vscode-sops"
];
keybindings = baseKeybindings;
userSettings = baseSettings;
};
};
}

View File

@@ -0,0 +1,8 @@
{pkgs, ...}:
{
programs.direnv = {
enable = true;
# enableFishIntegration = true; # see note on other shells below
nix-direnv.enable = true;
};
}

View File

@@ -0,0 +1,22 @@
{ config, pkgs, ... }:
{
# Set up essential directories in the home directory
# TODO
# home.file."Dev".directory = true;
# home.file."owncloud".directory = true;
# Set XDG user directories
xdg.userDirs = {
enable = true;
createDirectories = true;
documents = "${config.home.homeDirectory}/Documents";
download = "${config.home.homeDirectory}/Downloads";
pictures = "${config.home.homeDirectory}/Pictures";
# do not create the following
desktop = null;
music = null;
publicShare = null;
templates = null;
videos = null;
};
}

View File

@@ -0,0 +1,11 @@
{pkgs, ...}:
{
home.packages = [
# pdf viewer
pkgs.papers
# image viewer
pkgs.loupe
# video player
pkgs.showtime
];
}

View File

@@ -1,27 +1,33 @@
{pkgs, ...}:
{pkgs, ...}:
{
# Required by the fzf fish plugin
programs.fzf = {
enable = true;
};
home.packages = with pkgs; [
fd
bat
];
programs.fish = {
enable = true;
# enableCompletion = true;
generateCompletions = true;
plugins = [
{
name = "fzf-fish";
src = pkgs.fetchFromGitHub {
owner = "PatrickF1";
repo = "fzf.fish";
rev = "v10.3";
sha256 = "sha256-T8KYLA/r/gOKvAivKRoeqIwE2pINlxFQtZJHpOy9GMM=";
};
}
# add others here
{ name = "fzf"; src = pkgs.fishPlugins.fzf-fish.src; }
{ name = "z"; src = pkgs.fishPlugins.z.src; }
{ name = "pure"; src = pkgs.fishPlugins.pure.src; }
];
functions = {
# disable the fish greeting
fish_greeting = "";
};
};
# sets the "default" shell to fish
# actually keeps bash as a posix-compliant default but starts fish if the shell is not bash
# See https://nixos.wiki/wiki/Fish
@@ -35,4 +41,5 @@
fi
'';
};
}

View File

@@ -1,19 +1,19 @@
{ lib, ... }: {
{
lib, pkgs, ...
}:
{
# requires that flatpaks be enabled in the system configuration as well
services.flatpak.enable = true;
services.flatpak.update.auto.enable = false;
services.flatpak.uninstallUnmanaged = false;
services.flatpak.packages = [
"com.calibre_ebook.calibre"
"com.github.flxzt.rnote"
"com.github.tchx84.Flatseal"
"com.spotify.Client"
"io.podman_desktop.PodmanDesktop"
"org.pipewire.Helvum"
"io.github.zen_browser.zen"
"im.riot.Riot"
"com.valvesoftware.Steam"
"org.prismlauncher.PrismLauncher"
];
}
}

View File

@@ -1,76 +0,0 @@
{pkgs, lib, ...}:
with lib.hm.gvariant;
{
## Gnome extensions
programs.gnome-shell = {
enable = true;
extensions = [
{
package = pkgs.gnomeExtensions.dash-to-dock;
}
{
id = "tilingshell@ferrarodomenico.com";
package = pkgs.gnome.gnome-shell-extensions;
}
{
id = "search-light@icedman.github.com";
package = pkgs.gnome.gnome-shell-extensions;
}
{
package = pkgs.gnomeExtensions.window-gestures;
}
{
package = pkgs.gnomeExtensions.random-wallpaper;
}
];
};
## And their settings (stored in dconf)
dconf.settings."org/gnome/shell/extensions/tilingshell" = {
inner-gaps = mkUint32 8;
layouts-json = ''
[{"id":"Layout 2","tiles":[{"x":0,"y":0,"width":0.22,"height":1,"groups":[1]},{"x":0.22,"y":0,"width":0.56,"height":1,"groups":[1,2]},{"x":0.78,"y":0,"width":0.22,"height":1,"groups":[2]}]},{"id":"Layout 3","tiles":[{"x":0,"y":0,"width":0.33,"height":1,"groups":[1]},{"x":0.33,"y":0,"width":0.67,"height":1,"groups":[1]}]},{"id":"Layout 4","tiles":[{"x":0,"y":0,"width":0.67,"height":1,"groups":[1]},{"x":0.67,"y":0,"width":0.33,"height":1,"groups":[1]}]},{"id":"2732837","tiles":[{"x":0,"y":0,"width":0.5002604166666667,"height":1,"groups":[1]},{"x":0.5002604166666667,"y":0,"width":0.49973958333333335,"height":1,"groups":[1]}]},{"id":"241562","tiles":[{"x":0,"y":0,"width":0.3328488372093023,"height":1,"groups":[1]},{"x":0.3328488372093023,"y":0,"width":0.33430232558139533,"height":1,"groups":[2,1]},{"x":0.6671511627906976,"y":0,"width":0.3328488372093023,"height":1,"groups":[2]}]}]
'';
outer-gaps = mkUint32 0;
overridden-settings = ''
{"org.gnome.mutter.keybindings":{"toggle-tiled-right":"['<Super>Right']","toggle-tiled-left":"['<Super>Left']"},"org.gnome.desktop.wm.keybindings":{"maximize":"['<Super>Up']","unmaximize":"['<Super>Down', '<Alt>F5']"},"org.gnome.mutter":{"edge-tiling":"true"}}
'';
selected-layouts = [ "Layout 4" ];
};
dconf.settings."org/gnome/shell/extensions/search-light" = {
background-color = mkTuple [ 0.20333333313465118 0.20333333313465118 0.20333333313465118 0.80236488580703735 ];
blur-background = false;
entry-font-size = 1;
monitor-count = 1;
scale-height = 0.10000000000000001;
scale-width = 0.20000000000000001;
shortcut-search = [ "<Control><Alt>space" ];
popup-at-cursor-monitor = true;
show-panel-icon = false;
};
dconf.settings."org/gnome/shell/extensions/windowgestures" = {
pinch-enable = false;
swipe4-left = 9;
swipe4-right = 8;
swipe4-updown = 0;
three-finger = true;
};
dconf.settings."org/gnome/shell/extensions/dash-to-dock" = {
background-opacity = 0.80000000000000004;
custom-theme-shrink = true;
dash-max-icon-size = 40;
dock-position = "BOTTOM";
height-fraction = 0.90000000000000002;
preview-size-scale = 0.29999999999999999;
show-running = true;
show-trash = false;
show-windows-preview = true;
};
}

View File

@@ -0,0 +1,23 @@
{
config,
lib,
...
}:
let
cfg = config.nix-config.hypr;
in
{
options = {
nix-config.hypr.enable = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable an opinionated hyprland+quickshell setup as a desktop environment.";
};
};
imports = [
./hyprland
./hyprlock.nix
./hypridle.nix
];
}

View File

@@ -0,0 +1,44 @@
{inputs, pkgs, ...}:
{
services.hypridle = {
enable = true;
settings = {
general = {
# See: https://github.com/hyprwm/hypridle/issues/146
before_sleep_cmd = "hyprlock --no-fade-in";
lock_cmd = "hyprlock";
after_sleep_cmd = "hyprctl dispatch dpms on";
ignore_dbus_inhibit = false;
};
listener = [
{
# turn off keyboard backlight after 20 seconds
timeout = 10;
on-timeout = "brightnessctl -d platform::kbd_backlight -s set 0";
# restore keyboard backlight on resume to previous level.
on-resume = "brightnessctl -d platform::kbd_backlight -r";
}
{
# dim screen after 2 minutes
timeout = 120;
on-timeout = "brightnessctl -s set 2%";
on-resume = "brightnessctl -r";
# monitor backlight restore.
}
{
# lock screen after 10 minutes
timeout = 600;
on-timeout = "loginctl lock-session && hyprctl dispatch dpms off";
on-resume = "hyprctl dispatch dpms on";
}
{
# suspend after 15 minutes
timeout = 900;
on-timeout = "systemctl suspend";
on-resume = "hyprctl dispatch dpms on";
}
];
};
};
}

View File

@@ -0,0 +1,30 @@
{inputs, pkgs, lib, config, ...}:
let
cfg = config.nix-config.hypr;
in
{
options = {
nix-config.hypr.autostartApps = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [
"gnome-keyring-daemon --start --components=secrets"
"wl-paste --watch cliphist store"
"${lib.getExe pkgs.hypridle}"
# TODO - currently broken
"${pkgs.owncloud-client}"
"${lib.getExe pkgs.keepassxc}"
];
description = "List of applications to start automatically in Hyprland.";
};
};
config = {
wayland.windowManager.hyprland = {
enable = true;
systemd.enable = true;
settings = {
exec-once = cfg.autostartApps;
};
};
};
}

View File

@@ -0,0 +1,10 @@
{
imports = [
./autostart.nix
./general.nix
./gestures.nix
./keybinds.nix
./layouts.nix
./packages.nix
];
}

View File

@@ -0,0 +1,146 @@
{inputs, pkgs, lib, config, ...}:
let
cfg = config.nix-config.hypr;
in
{
options = {
nix-config.hypr.internal-screen.resolution = lib.mkOption { type = lib.types.str; };
nix-config.hypr.internal-screen.scale = lib.mkOption { type = lib.types.str; };
nix-config.hypr.browser = lib.mkOption {
type = lib.types.str;
default = "firefox";
description = "The browser to use in Hyprland.";
};
nix-config.hypr.ide = lib.mkOption {
type = lib.types.str;
default = "code";
description = "The IDE to use in Hyprland.";
};
};
config = {
wayland.windowManager.hyprland = lib.mkIf cfg.enable {
enable = true;
systemd.enable = true;
settings = {
# debug = {
# disable_logs = false;
# };
general = {
resize_on_border = true;
gaps_in = 3;
gaps_out = 3;
border_size = 1;
"col.active_border" = "rgb(98971A) rgb(CC241D) 45deg";
"col.inactive_border" = "rgba(595959aa)";
layout = "master";
};
input = {
kb_layout = "de";
# remap caps lock to ctrl
kb_options = "ctrl:nocaps";
numlock_by_default = true;
# mouse input should be unchanged
natural_scroll = false;
sensitivity = 0.3;
touchpad = {
disable_while_typing = false;
natural_scroll = true;
};
};
device = {
name = "syna329a:00-06cb:cd4f-touchpad";
sensitivity = 0.5;
};
decoration = {
rounding = 10;
inactive_opacity = 0.9;
dim_inactive = false;
dim_strength = 0.1;
shadow = {
enabled = false;
};
# blur = {
# enabled = true;
# size = 5;
# passes = 2;
# };
# blur is set on a per-program basis
windowrulev2 = [
# kitty should behave like a floating window
"animation popin, class:kitty"
"move cursor -50% -50%, class:kitty"
"float, class:kitty"
"size 50% 50%, class:kitty"
# blur the launcher background
# "blur 10, class:${config.nix-config.launcher.name}"
# some more floating windows
"float, class:org.gnome.Settings"
"float, class:desktopclient.owncloud.com"
"float, class:org.keepassxc.KeePassXC"
"float, title:^(Picture-in-Picture)$"
"float, class:org.gnome.Nautilus"
# when there is a single window, deactivate border and gaps
# "border_size 0, onworkspace:w[tv1], "
# File pickers and dialogs
"float, title:^(Save As)$"
"float, title:^(Open File)$"
"size 50% 50%, title:^(Open File)$"
"center, title:^(Open File)$"
# Disable idle when gaming
"idleinhibit always, class:^(steam_app_)"
"idleinhibit always, class:^(gamescope)$"
];
};
monitor = [
# the internal monitor, always at the "center"
"eDP-1, ${cfg.internal-screen.resolution}, 0x0, ${cfg.internal-screen.scale}"
# ultra wide monitor at home
"desc:Samsung Electric Company C34H89x H4ZN501178, 3440x1440@99.98, auto-up, 1"
# Samsung monitors at irchel (matching the description)
"desc:Samsung Electric Company LS27D80xU, 2560x1440@59.95, auto-up, 1"
", preferred, auto-up, auto" # automatically add any newly detected monitor
];
xwayland = {
enabled = true;
force_zero_scaling = true;
};
env = [
# force apps to use wayland
"NIXOS_OZONE_WL, 1"
"ELECTRON_OZONE_PLATFORM_HINT, wayland"
# set the scale factor for GDK apps
"GDK_SCALE, ${cfg.internal-screen.scale}"
# set the scale factor for QT apps
# "QT_SCALE_FACTOR, ${cfg.internal-screen.scale}"
"QT_SCALE_FACTOR, 1.1"
# set the scale factor for GTK apps
];
};
plugins = [
# Global overview
pkgs.hyprlandPlugins.hyprspace
# Touch gestures
# pkgs.hyprlandPlugins.hyprgrass
];
};
};
}

View File

@@ -0,0 +1,21 @@
{inputs, pkgs, lib, config, ...}:
let
cfg = config.nix-config.hypr;
in
{
config = {
wayland.windowManager.hyprland = {
settings = {
gesture = [
# 4 finger swipe to switch workspace
"4, horizontal, workspace"
"3, up, fullscreen"
"3, down, float"
"4, vertical, scale: 0.5, special, magic"
];
};
};
};
}

View File

@@ -0,0 +1,135 @@
# Note that some keybindings are delegated to other components, e.g. the quickshell module
{inputs, pkgs, lib, config, ...}:
let
cfg = config.nix-config.hypr;
in
{
config = {
wayland.windowManager.hyprland = {
settings = {
"$mod" = "SUPER";
# Global bindings
bind = [
# Launch applications
"$mod, space, exec, ${lib.getExe config.nix-config.launcher}"
"$mod, return, exec, kitty"
"$mod, b, exec, ${cfg.browser}"
"$mod, s, exec, ${cfg.ide}"
"$mod, e, exec, ${lib.getExe pkgs.nautilus}"
# Lock screen
"$mod, l, exec, loginctl lock-session"
# Close window
"$mod, Q, killactive,"
# Force close window
"$mod+Shift, Q, forcekillactive,"
# Toggle Floating and reduce size
"$mod, f, togglefloating,"
"$mod, f, resizeactive, 50% 50%,"
# "$mod, P, pseudo, " # dwindle
# "$mod, J, togglesplit, " # dwindle
# Toggle fullscreen
"$mod+Shift, f, fullscreen,"
# Alt-tab alternative
"$mod, Tab, cyclenext,"
"$mod, Tab, bringactivetotop,"
# Move the window
"$mod+Shift, left, movewindow, l"
"$mod+Shift, right, movewindow, r"
"$mod+Shift, up, movewindow, u"
"$mod+Shift, down, movewindow, d"
# Move window to workspace
"$mod+Ctrl, left, movetoworkspace, -1"
"$mod+Ctrl, right, movetoworkspace, +1"
# Switch workspace
"$mod, left, workspace, e-1"
"$mod, right, workspace, e+1"
"$mod, mouse_down, workspace, e-1"
"$mod, mouse_up, workspace, e+1"
# move to scratch workspace
"$mod+Ctrl, up, movetoworkspace, special:magic"
"$mod+Ctrl, down, movetoworkspace, prev"
# switch to scratch workspace
"$mod, up, togglespecialworkspace, magic"
"$mod, down, togglespecialworkspace, magic"
# Screenshot
"$mod, Print, exec, hyprshot -m region -o ~/Pictures/Screenshots"
"$mod+Shift, Print, exec, hyprshot -m window -o ~/Pictures/Screenshots"
# # somehow logitech calls this SUPER_L but we refer to it by its code
"SUPER_L&Shift_L, S, exec, hyprshot -m region -o ~/Pictures/Screenshots"
"Shift&SUPER_L&Shift_L, S, exec, hyprshot -m window -o ~/Pictures/Screenshots"
# when there is a dedicated screenshot button
", XF86Cut, exec, hyprshot -m region -o ~/Pictures/Screenshots"
"Shift, XF86Cut, exec, hyprshot -m window -o ~/Pictures/Screenshots"
# Other pickers using the same launcher
"$mod+Ctrl, space, exec, ${lib.getExe config.nix-config.filePicker}"
"$mod, period, exec, ${lib.getExe config.nix-config.emojiPicker}"
];
# repeatable bindings
binde = [
# Reshape the window in focus
"$mod, MINUS, resizeactive, -2% -2%"
"$mod, KP_Subtract, resizeactive, -2% -2%"
"$mod, PLUS, resizeactive, 2% 2%"
"$mod, KP_Add, resizeactive, 2% 2%"
];
# lock-screen bindings
bindl = [
", XF86PowerOff, exec, hyprctl dispatch dpms on eDP-1"
## depending on the setup we expect different behaviors when closing the lid:
# either sleep & lock screen OR switch to clamshell mode
# through the `services.logind.lidSwitch` and `services.logind.lidSwitchDocked` we can differentiate both cases
# when not docked, the system is put to sleep and the screen is implicitly locked as per the hypridle configuration
# when docked, the lid switch is ignored by logind and needs to be handled manually, see below:
# if an additional monitor is detected, simply deactivate the internal screen and continue working on the external monitor
", switch:on:Lid Switch, exec, hyprctl keyword monitor 'eDP-1,disable"
## on reopening the lid, turn the internal screen back on
", switch:off:Lid Switch, exec, hyprctl dispatch dpms on eDP-1"
# we need to reload the monitor configuration so that the internal screen is turned back on
", switch:off:Lid Switch, exec, hyprctl reload"
];
# bindr = [
# # Overview
# "$mod, , overview:toggle"
# ];
bindm = [
# move the window using left click
"$mod, mouse:272, movewindow"
# resize the window using right click
"$mod, mouse:273, resizewindow"
];
};
# extraConfig = ''
# bind= , XF86AudioMicMute, submap, player_submap
# submap=player_submap
# bind=, XF86AudioRaiseVolume, exec, notify-send previous; hyprctl dispatch submap reset
# bind=, XF86AudioLowerVolume, exec, notify-send next; hyprctl dispatch submap reset
# bind=, XF86AudioMicMute, exec, notify-send pause; hyprctl dispatch submap reset
# submap=reset
# '';
};
};
}

View File

@@ -0,0 +1,57 @@
{inputs, pkgs, lib, config, ...}:
let
cfg = config.nix-config.hypr;
in
{
config = {
wayland.windowManager.hyprland = {
settings = {
master = {
# no_gaps_when_only = true;
# default: single app is centered/fullscreen; when more apps are added it splits
orientation = "right";
# keep center-master behaviour when there is exactly 1 slave (i.e. single app appears fullscreen)
slave_count_for_center_master = 1;
# only split in two columns
mfact = 0.6;
inherit_fullscreen = false;
};
# #create special workspaces with no gaps
# workspace = [
# "w[t1], gapsout:0, gapsin:0"
# "w[tg1], gapsout:0, gapsin:0"
# "f[1], gapsout:0, gapsin:0"
# ];
# # automatically assign windows to workspaces when there is only one window
# windowrulev2 = [
# "bordersize 0, floating:0, onworkspace:w[t1]"
# "rounding 0, floating:0, onworkspace:w[t1]"
# "bordersize 0, floating:0, onworkspace:w[tg1]"
# "rounding 0, floating:0, onworkspace:w[tg1]"
# "bordersize 0, floating:0, onworkspace:f[1]"
# "rounding 0, floating:0, onworkspace:f[1]"
# ];
misc = {
vfr = false;
disable_hyprland_logo = true;
};
# Keybind to toggle between 2 and 3 column master layout
bind = [
# Toggle master layout between 2 and 3 columns (press $mod + m)
"$mod, m, exec, hyprctl dispatch layoutmsg orientationcenter"
"$mod, m, exec, hyprctl dispatch layoutmsg mfact exact 0.34"
# Toggle master layout between 3 and 2 columns (press $mod + Shift + m)
"$mod, Shift+m, exec, hyprctl dispatch layoutmsg orientationright"
"$mod, Shift+m, exec, hyprctl dispatch layoutmsg mfact exact 0.6"
];
};
};
};
}

View File

@@ -0,0 +1,19 @@
{inputs, pkgs, lib, config, ...}:
let
cfg = config.nix-config.hypr;
in
{
# packages required by the current hyprland setup
home.packages = [
pkgs.hyprshot
pkgs.nautilus
pkgs.gnome-control-center
pkgs.gnome-bluetooth # needed by gnome-control-center to manage bluetooth
pkgs.cliphist
pkgs.wl-clipboard
pkgs.gcr # Provides org.gnome.keyring.SystemPrompter
];
# Also use gnome keyring
services.gnome-keyring.enable = true;
}

View File

@@ -0,0 +1,55 @@
{inputs, pkgs, ...}:
{
programs.hyprlock = {
enable = true;
settings = {
general = {
# immediately lock the screen
grace = 0;
# no_fade_in = false;
# disable_loading_bar = false;
};
background = {
blur_passes = 3;
blur_size = 10;
# image is set by stylix
};
input-field = {
monitor = "";
size = "300, 60";
# radius = 15;
position = "0, -250";
halign = "center";
valign = "center";
};
label = [
{
# Day-Month-Date
monitor = "";
text = ''cmd[update:1000] echo -e "$(date +"%A, %B %d")"'';
font_size = 28;
position = "0, 490";
halign = "center";
valign = "center";
}
# Time
{
monitor = "";
text = ''cmd[update:1000] echo "<span>$(date +"%H:%M")</span>"'';
font_size = 160;
font_weight = "bold";
# font_family = "steelfish outline regular";
position = "0, 370";
halign = "center";
valign = "center";
}
];
};
};
}

View File

@@ -0,0 +1,6 @@
{pkgs, ...}:
{
home.packages = [
pkgs.keepassxc
];
}

View File

@@ -0,0 +1,67 @@
{pkgs, lib, config, ...}:
let
cfg = config.nix-config.style;
in
{
programs.kitty = {
enable = true;
shellIntegration.enableFishIntegration = true;
settings = {
# # import the colors from the stylix theme, but keep the background black
# color0 = stylix.stylix.base16Scheme.base00;
# color8 = stylix.stylix.base16Scheme.base08;
# color1 = stylix.stylix.base16Scheme.base01;
# color9 = stylix.stylix.base16Scheme.base09;
# color2 = stylix.stylix.base16Scheme.base02;
# color10 = stylix.stylix.base16Scheme.base0A;
# color3 = stylix.stylix.base16Scheme.base03;
# color11 = stylix.stylix.base16Scheme.base0B;
# color4 = stylix.stylix.base16Scheme.base04;
# color12 = stylix.stylix.base16Scheme.base0C;
# color5 = stylix.stylix.base16Scheme.base05;
# color13 = stylix.stylix.base16Scheme.base0D;
# color6 = stylix.stylix.base16Scheme.base06;
# color14 = stylix.stylix.base16Scheme.base0E;
# color7 = stylix.stylix.base16Scheme.base07;
# color15 = stylix.stylix.base16Scheme.base0F;
# also reuse the background opacity by stylix
background_opacity = cfg.terminalOpacity;
background = "#000000";
font_family = cfg.monospaceFont;
font_size = cfg.fontSizes.terminal;
confirm_os_window_close = 0;
enable_audio_bell = false;
cursor_trail = 3;
cursor_trail_decay = "0.1 0.4";
url_style = "curly";
notify_on_cmd_finish = "unfocused";
window_padding_width = 5;
};
keybindings = {
# copy and paste
"ctrl+shift+c" = "copy_to_clipboard";
"ctrl+shift+v" = "paste_from_clipboard";
# zoom
"ctrl+shift+plus" = "increase_font_size";
"ctrl+shift+minus" = "decrease_font_size";
"ctrl+shift+0" = "reset_font_size";
# tabs
"ctrl+shift+t" = "new_tab";
"ctrl+shift+w" = "close_tab";
};
};
}

View File

@@ -0,0 +1,25 @@
{pkgs, ...}:
{
home.packages = [
pkgs.kubectl
];
# Add the shell alias
programs.fish.shellAliases = {
k = "kubectl";
};
# set the kubectl autocompletions for fish
# the fish functions are generated by kubectl itself, we do this at compile time and write them a single time to avoid generating them at each shell start
# the command is kubectl completion fish
# which becomes
programs.fish.completions."kubectl" = builtins.readFile "${pkgs.runCommand "kubectl-completion" {} ''
${pkgs.kubectl}/bin/kubectl completion fish > $out
''}";
programs.kubeswitch = {
enable = true;
enableFishIntegration = true;
};
}

View File

@@ -0,0 +1,123 @@
{ config, pkgs, lib, ... }:
let
cfg = config.nix-config.style;
powerMenu = pkgs.writeShellScriptBin "power-menu" ''
options=" Power Off\n Reboot\n Lock\n Suspend"
selected=$(echo -e "$options" | fuzzel --dmenu --prompt "Power Menu" --lines 4 --width 20)
case "$selected" in
" Power Off") systemctl poweroff ;;
" Reboot") systemctl reboot ;;
" Lock") hyprlock ;;
" Suspend") systemctl suspend ;;
*) exit 1 ;;
esac
'';
filePicker = pkgs.writeShellScriptBin "file-picker" ''
files=$(${lib.getExe pkgs.fd} . $HOME --type f)
filesShortened=$(echo "$files" | sed "s|$HOME|~|g" | awk -F/ '{print $(NF)" ("$0")"}')
selected=$(echo "$filesShortened" | fuzzel --dmenu --prompt "🔎 " --placeholder "File search" --index)
if [ -n "$selected" ]; then
# Since fuzzel was launched with the --index option the actual path is now files[selected]
selectedPlusOne=$((selected + 1))
file=$(echo "$files" | sed -n "''${selectedPlusOne}p")
xdg-open "$file"
# plus one
else
echo "No file selected"
exit 1
fi
'';
emojiPicker = pkgs.writeShellScriptBin "emoji-picker" ''
curl -s https://raw.githubusercontent.com/littleboycoding/emoji-dmenu/refs/heads/master/emoji.txt | fuzzel --dmenu | cut -d ' ' -f 1 | wl-copy
'';
in
{
options.nix-config = {
powerMenu = lib.mkOption {
description = "Package to use as a power menu";
type = lib.types.package;
default = powerMenu;
};
launcher = lib.mkOption {
description = "Configuration for the launcher";
type = lib.types.package;
default = pkgs.fuzzel;
};
filePicker = lib.mkOption {
description = "Package to use as a file picker";
type = lib.types.package;
default = filePicker;
};
emojiPicker = lib.mkOption {
description = "Package to use as a emoji picker";
type = lib.types.package;
default = emojiPicker;
};
};
config = {
programs.fuzzel = {
enable = true;
settings = {
main = {
font = "monospace:size=${builtins.toString (cfg.fontSizes.applications - 1)}";
terminal = "${lib.getExe pkgs.kitty}";
layer = "overlay"; #or top?
use-bold = true;
dpi-aware = true;
icons-enabled = true;
match-mode = "fzf";
horizontal-pad = cfg.fontSizes.applications + 5;
vertical-pad = cfg.fontSizes.applications + 5;
inner-pad = cfg.fontSizes.applications;
show-actions = true;
lines = 12;
width = 50;
};
colors = {
background = "000000aa";
text = "ffffffaa";
# prompt
# placeholder
# input
match = "ffffffaa";
selection = "00000000";
selection-text = "ffffffbb";
selection-match = "ffffffaa";
};
border = {
width = 0;
radius = 15;
};
};
};
home.packages = with pkgs; [
powerMenu
filePicker
emojiPicker
];
};
}

View File

@@ -0,0 +1,21 @@
{pkgs, ...}:
{
# on macos we don't set the default shell to fish
# instead we just tell the terminal to run fish as the first command
# this means that the first thing fish should do is to clear the screen
programs.fish = {
interactiveShellInit = "clear";
};
# stylix will be tricky as well, so we just install the fonts manually
fonts.fontconfig.enable = true;
home.packages = with pkgs; [
nerd-fonts.fira-code
noto-fonts-color-emoji
] ++ [ # some more packages that are not available as flatpaks
pkgs.spotify
];
}

View File

@@ -0,0 +1,10 @@
{
config,
pkgs,
...
}:
{
programs.nh = {
enable = true;
};
}

View File

@@ -1,8 +1,6 @@
{pkgs, ...}:
{pkgs, ...}:
{
home.packages = [
pkgs.obsidian
];
# obsidian options
}

View File

@@ -1,6 +1,7 @@
{pkgs, ...}:
{
home.packages = [
pkgs.rquickshare
pkgs.owncloud-client
];
}

View File

@@ -0,0 +1,59 @@
{
lib,
pkgs,
...
}:
{
programs.dankMaterialShell.enable = true;
programs.dankMaterialShell = {
enableSystemd = true;
enableSystemMonitoring = false;
enableClipboard = true;
enableVPN = true;
enableBrightnessControl = true;
enableColorPicker = false;
enableDynamicTheming = true;
enableAudioWavelength = false;
enableCalendarEvents = false;
enableSystemSound = true;
# default = {
# settings = ''{}'';
# session = ''{}'';
# };
# plugins = {};
};
wayland.windowManager.hyprland = {
settings = {
binde = [
# Brightness
", XF86MonBrightnessDown, exec, dms ipc call brightness decrement 5 \"\""
", XF86MonBrightnessUp, exec, dms ipc call brightness increment 5 \"\""
# Audio volume + playback
", XF86AudioMute, exec, dms ipc call audio mute"
", XF86AudioLowerVolume, exec, dms ipc call audio decrement 5"
", XF86AudioRaiseVolume, exec, dms ipc call audio increment 5"
"$mod, XF86AudioMute, exec, dms ipc call mpris playPause"
"$mod, XF86AudioLowerVolume, exec, dms ipc call mpris previous"
"$mod, XF86AudioRaiseVolume, exec, dms ipc call mpris next"
# also allow the dedicated media keys to control playback
", XF86AudioPlay, exec, dms ipc call mpris playPause"
", XF86AudioPrev, exec, dms ipc call mpris previous"
", XF86AudioNext, exec, dms ipc call mpris next"
];
bind = [
", XF86PowerOff, exec, dms ipc call powermenu toggle"
# used to be ", XF86PowerOff, exec, ${lib.getExe config.nix-config.powerMenu}"
"$mod, V, exec, dms ipc call clipboard toggle"
# used to be "$mod, V, exec, cliphist list | ${lib.getExe config.nix-config.launcher} --dmenu | cliphist decode | wl-copy"
];
};
};
}

View File

View File

@@ -0,0 +1,23 @@
{ lib, config, ... }:
{
programs.ssh.enable = true;
programs.ssh.matchBlocks = {
"*" = {
identityFile = "${config.home.homeDirectory}/.ssh/main_key";
};
ela = lib.hm.dag.entryBefore ["eiger"] {
hostname = "ela.cscs.ch";
user = "rmoll";
identityFile = "${config.home.homeDirectory}/.ssh/cscs-key";
identitiesOnly = true;
};
eiger = {
hostname = "eiger.cscs.ch";
user = "rmoll";
identityFile = "${config.home.homeDirectory}/.ssh/cscs-key";
identitiesOnly = true;
proxyJump = "ela";
};
};
}

View File

@@ -0,0 +1,182 @@
{pkgs, config, lib, ...}:
let
cfg = config.nix-config.style;
in
{
options.nix-config.style = {
cursor = {
size = lib.mkOption {
type = lib.types.int;
default = 22;
description = "Size of the cursor in pixels.";
};
};
fontSizes = {
applications = lib.mkOption {
type = lib.types.int;
default = 12;
description = "Font size for applications.";
};
desktop = lib.mkOption {
type = lib.types.int;
default = 12;
description = "Font size for desktop icons.";
};
popups = lib.mkOption {
type = lib.types.int;
default = 12;
description = "Font size for popups.";
};
terminal = lib.mkOption {
type = lib.types.int;
default = 12;
description = "Font size for terminal.";
};
};
terminalOpacity = lib.mkOption {
type = lib.types.float;
default = 0.8;
description = "Terminal default opacity";
};
monospaceFont = lib.mkOption {
type = lib.types.str;
default = "FiraCode Nerd Font Mono";
description = "Monospace font. Needs to be installed.";
};
};
config = {
stylix = {
# Stylix is already enabled since the system is configured to use it
enable = true;
image = ./../../wallpapers/magicpattern-87PP9Zd7MNo-unsplash.jpg;
# don't theme applications by default
autoEnable = false;
cursor = {
package = pkgs.bibata-cursors;
name = "Bibata-Modern-Ice";
size = cfg.cursor.size;
};
iconTheme = {
enable = true;
package = pkgs.tela-icon-theme;
};
polarity = lib.mkDefault "dark";
fonts = {
serif = {
package = pkgs.dejavu_fonts;
name = "DejaVu Serif";
};
sansSerif = {
package = pkgs.dejavu_fonts;
name = "DejaVu Sans";
};
monospace = {
package = pkgs.nerd-fonts.fira-code;
name = cfg.monospaceFont;
};
emoji = {
package = pkgs.noto-fonts-color-emoji;
name = "Noto Color Emoji";
};
sizes = {
applications = cfg.fontSizes.applications;
desktop = cfg.fontSizes.desktop;
popups = cfg.fontSizes.popups;
terminal = cfg.fontSizes.terminal;
};
};
opacity = {
applications = 1.0;
desktop = 1.0;
popups = 0.9;
terminal = cfg.terminalOpacity;
};
base16Scheme = {
scheme = "onelight";
author = "https://github.com/one-dark";
base00 = "#fafafa";
base01 = "#f4f4f4";
base02 = "#e5e5e6";
base03 = "#dfdfe0";
base04 = "#d7d7d8";
base05 = "#383a42";
base06 = "#202227";
base07 = "#090a0b";
base08 = "#d84a3d";
base09 = "#a626a4";
base0A = "#c18401";
base0B = "#50a14f";
base0C = "#0070a8";
base0D = "#4078f2";
base0E = "#a626a4";
base0F = "#986801";
};
targets = {
hyprpaper.enable = true;
hyprlock.enable = true;
# disabled because they overwrite too many settings
# gnome
# wofi
# vscode
# waybar
# kitty
fontconfig.enable = true;
font-packages.enable = true;
};
};
# https://pltanton.dev/posts/2024/02/nix-based-dark-light-theme-switch/
home.packages = [
(lib.lowPrio (pkgs.writeShellApplication {
name = "toggle-theme";
runtimeInputs = with pkgs; [ home-manager coreutils ripgrep ];
text =
''
"$(home-manager generations | head -1 | rg -o '/[^ ]*')"/specialisation/light-theme/activate
echo "Switched to light theme"
'';
}))
];
specialisation.light-theme.configuration = {
stylix = {
polarity = "light";
};
home.packages = [
(lib.hiPrio (pkgs.writeShellApplication {
name = "toggle-theme";
runtimeInputs = with pkgs; [ home-manager coreutils ripgrep ];
text =
''
"$(home-manager generations | head -2 | tail -1 | rg -o '/[^ ]*')"/activate
echo "Switched to dark theme"
'';
}))
];
};
};
}

View File

@@ -0,0 +1,9 @@
{
lib, pkgs, ...
}:
{
# requires avahi or similar
home.packages = with pkgs; [ uxplay ];
}

View File

@@ -0,0 +1,11 @@
# Write an importable nix file that copies a folder from this repo into the store and creates a symlink to a predictible directory in my home file
{
lib, pkgs, ...
}:
{
# Copy the entire wallpapers directory into the Nix store and symlink it to ~/wallpapers
home.file."wallpapers" = {
source = ../../wallpapers;
target = "Pictures/wallpapers";
};
}

View File

@@ -0,0 +1,139 @@
{ config, pkgs, lib, ... }:
let
cfg = config.nix-config.style;
wofiPowerMenu = pkgs.writeShellScriptBin "wofi-power-menu" ''
#!/usr/bin/env bash
options=" Power Off\n Reboot\n Lock\n Suspend"
selected=$(echo -e "$options" | wofi --dmenu --prompt "Power Menu")
# --width 300 --height 250
case "$selected" in
" Power Off") systemctl poweroff ;;
" Reboot") systemctl reboot ;;
" Lock") hyprlock ;;
" Suspend") systemctl suspend ;;
*) exit 1 ;;
esac
'';
wofiFilePicker = pkgs.writeShellScriptBin "wofi-file-picker" ''
#!/usr/bin/env bash
initial=$(find $HOME -maxdepth 2 -type f)
selected=$(printf "%s\n" $initial | wofi --dmenu --prompt "Select a file")
if [ -n "$selected" ]; then
xdg-open "$selected"
else
echo "No file selected"
exit 1
fi
'';
in
{
options.nix-config = {
powerMenu = lib.mkOption {
description = "Package to use as a power menu";
type = lib.types.package;
default = wofiPowerMenu;
};
};
config = {
programs.wofi = {
enable = true;
settings = {
# global layout
width = "50%";
height = "50%";
orientation = "vertical";
hide_scroll = true;
line_wrap = "off";
dynamic_lines = true;
# search behaviour
matching = "fuzzy";
single_click = true;
show = "drun";
prompt = "Launch...";
# normal_window = true;
layer = "top";
term = "foot";
halign = "fill";
# Rich rendering
allow_markup = true;
allow_images = true;
image_size = 24;
exec_search = false;
hide_search = false;
parse_search = false;
insensitive = true;
no_actions = true;
filter_rate = 100;
key_expand = "Tab";
key_exit = "Escape";
};
style = ''
* {
font-family: ${cfg.monospaceFont};
font-size: ${builtins.toString (cfg.fontSizes.desktop + 8)}px;
color: white;
background: transparent;
}
#window {
background: rgba(1, 1, 1, 0.5);
margin: auto;
padding: 10px;
}
#input {
padding: 10px;
margin-bottom: 10px;
border-radius: 15px;
}
#outer-box {
padding: 20px;
}
#img {
margin-right: 6px;
}
#entry {
padding: 10px;
border-radius: 15px;
}
#entry:selected {
background-color: #2e3440;
outline: none;
border: none;
}
#text {
margin: 2px;
}
'';
};
home.packages = with pkgs; [
wofiPowerMenu
wofi-emoji
];
};
}

View File

@@ -0,0 +1,11 @@
{pkgs, ...}:
{
# Add aliases for the various environments in aws so that their contexts can be easily switched
programs.fish.shellAliases = {
cdev = "aws-vault exec dev --";
cstage = "aws-vault exec stage --";
cprod = "aws-vault exec prod --";
clogs = "aws-vault exec logs --";
cshared = "aws-vault exec shared --";
};
}

View File

@@ -0,0 +1,7 @@
{pkgs, ...}:
{
home.packages = [
pkgs.gnupg
pkgs.sops
];
}

View File

@@ -0,0 +1,19 @@
{
config,
lib,
...
}:
let
cfg = config.nix-config.hypr;
in
{
options = {
};
imports = [
./aliases.nix
./cryptography.nix
./git.nix
./kluster.nix
];
}

View File

@@ -0,0 +1,14 @@
{
config,
lib,
...
}:
{
programs.git = {
enable = true;
settings = {
user.name = "Remy Moll";
user.email = "remy.moll@artidis.com";
};
};
}

View File

@@ -0,0 +1,14 @@
{pkgs, ...}:
{
home.packages = [
pkgs.kubernetes-helm
pkgs.awscli2
pkgs.aws-vault
pkgs.k9s
# some parsers
pkgs.ripgrep
pkgs.jq
pkgs.yq
];
}

View File

@@ -0,0 +1,32 @@
{inputs, pkgs, ...}:
{
xdg.enable = true;
xdg.portal = {
enable = true;
xdgOpenUsePortal = true;
# configPackages = [ pkgs.hyprland ];
config = {
common.default = ["gtk"];
hyprland.default = ["gtk" "hyprland"];
};
extraPortals = [
pkgs.xdg-desktop-portal-gtk
pkgs.xdg-desktop-portal-wlr
pkgs.xdg-desktop-portal-hyprland
];
};
xdg.mimeApps.defaultApplications = {
"text/*" = [ "code" ];
"application/x-yaml" = [ "code" ];
"application/pdf" = [ "papers" ];
"image/*" = [ "loupe" ];
"video/*" = [ "showtime" ];
};
}

79
modules/macos/tiling.nix Normal file
View File

@@ -0,0 +1,79 @@
{ config, pkgs, lib, ... }:
{
# Enable yabai service
# Caution: at the very least yabai requires Accessibility permissions to be granted
# https://github.com/koekeishiya/yabai/issues/2688
services.yabai = {
enable = true;
config = {
layout = "bsp";
focus_follows_mouse = "autoraise";
window_placement = "second_child";
window_topmost = "on";
window_shadow = "float";
# by default, set balanced split ratio and auto balance => three windows will be evenly spaced on an ultrawide monitor
split_ratio = "0.50";
auto_balance = "on";
mouse_modifier = "alt";
mouse_action1 = "move";#
mouse_action2 = "resize";
window_opacity = "on";
normal_window_opacity = 0.9;
top_padding = 0;
bottom_padding = 0;
left_padding = 0;
right_padding = 0;
window_gap = 10;
};
extraConfig = ''
# Example: rules for floating windows
yabai -m rule --add app="System Preferences" manage=off
'';
};
# # Enable skhd service
# services.skhd = {
# enable = true;
# package = pkgs.skhd;
# skhdConfig = ''
# # Focus windows with Command + Arrow keys
# cmd - left : yabai -m window --focus west
# cmd - right : yabai -m window --focus east
# cmd - up : yabai -m window --focus north
# cmd - down : yabai -m window --focus south
# # Swap windows with Command + Shift + Arrow keys
# cmd + shift - left : yabai -m window --swap west
# cmd + shift - right : yabai -m window --swap east
# cmd + shift - up : yabai -m window --swap north
# cmd + shift - down : yabai -m window --swap south
# # Move windows with Command + Control + Arrow keys
# cmd + ctrl - left : yabai -m window --warp west
# cmd + ctrl - right : yabai -m window --warp east
# cmd + ctrl - up : yabai -m window --warp north
# cmd + ctrl - down : yabai -m window --warp south
# # Resize windows with Command + Option + Arrow keys
# cmd + alt - left : yabai -m window --resize left:-50:0
# cmd + alt - right : yabai -m window --resize right:50:0
# cmd + alt - up : yabai -m window --resize top:0:-50
# cmd + alt - down : yabai -m window --resize bottom:0:50
# # Toggle window float with Command + F
# cmd - f : yabai -m window --toggle float
# # Toggle window fullscreen with Command + Enter
# cmd - return : yabai -m window --toggle zoom-fullscreen
# '';
# };
}

7
modules/nixos/agenix.nix Normal file
View File

@@ -0,0 +1,7 @@
{ config, pkgs, lib, inputs, ... }:
{
# agenix client
environment.systemPackages = [
inputs.agenix.packages."${system}".default
];
}

88
modules/nixos/backup.nix Normal file
View File

@@ -0,0 +1,88 @@
{pkgs, lib, ...}:
let
snapshotsDir = "/snapshots/home";
in
{
environment.systemPackages = with pkgs; [
restic
btrbk
libnotify
];
# btrbk systemd service and timer for daily home snapshots
systemd.services.btrbk-home-snapshot = {
description = "Create daily btrbk snapshot of the home subvolume";
serviceConfig = {
Type = "oneshot";
User = "remy";
ExecStartPre = "${lib.getExe pkgs.libnotify} \"Backup\" \"Creating BTRBK snapshot of /home.\"";
# run the btrbk command as superuser
ExecStart = "+${lib.getExe pkgs.btrbk} -c /etc/btrbk/home.conf run";
Environment = "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus"; # ensure the notification is sent to the correct display
ExecStartPost = "${lib.getExe pkgs.libnotify} \"Backup\" \"Snapshot of /home created successfully.\"";
};
};
systemd.timers.btrbk-home-snapshot = {
enable = true;
description = "Daily timer for btrbk home snapshot";
wantedBy = [ "timers.target" ];
timerConfig = {
OnCalendar = "*-*-* 12:00";
Persistent = true; # ensures missed runs are triggered after resume
};
};
# ensure the target directory exists
systemd.tmpfiles.settings = {
"btrbk snapshots" = {
"${snapshotsDir}" = {
d = {
group = "root";
user = "root";
mode = "0770";
};
};
};
};
# btrbk config for home snapshots
environment.etc."btrbk/home.conf".text = ''
timestamp_format long
# keep snapshots for 2 days independently of the call
snapshot_preserve_min 2d
# retain daily snapshots for 14 days
snapshot_preserve 14d
subvolume /home
snapshot_dir ${snapshotsDir}
'';
# Now create a restic backup off the newest btrbk snapshot
systemd.services.restic-backup-latest-snapshot = {
description = "Backup home subvolume using restic";
serviceConfig = {
Type = "oneshot";
ExecStart = "${lib.getExe pkgs.restic} -r /home/snapshots/restic-backup backup /home/snapshots/home-$(date +%Y-%m-%d_%H-%M-%S)";
# send a notification when the service is done
ExecStartPost = "su remy -c 'notify-send \"Restic Backup\" \"Home backup created successfully.\"'";
};
};
# # the udev rule:
# services.udev.extraRules = ''
# ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_LABEL}=="backup-restic", TAG+="systemd", ENV{SYSTEMD_WANTS}="backup-restic.service"
# '';
# # the systemd service:
# systemd.services.backup-restic = {
# description = "Backup using restic (triggered when USB drive is plugged in)";
# after = [ "local-fs.target" ];
# wantedBy = [ "multi-user.target" ];
# serviceConfig = {
# Type = "oneshot";
# # TODO: adapt command
# ExecStart = "${lib.getExe pkgs.restic} backup /home/username";
# };
# };
}

View File

@@ -0,0 +1,31 @@
{
config,
lib,
pkgs,
...
}:
{
environment.systemPackages = [
pkgs.bluez
# bluez-qt
# gnome.gnome-control-center
pkgs.gnome-bluetooth
];
services.dbus.packages = with pkgs; [
gnome-bluetooth
bluez
];
users.users.remy.extraGroups = [
"networkmanager"
];
hardware.bluetooth = {
enable = true;
powerOnBoot = false;
};
}

3
modules/nixos/flakes.nix Normal file
View File

@@ -0,0 +1,3 @@
{
nix.settings.experimental-features = [ "nix-command" "flakes" ];
}

View File

@@ -1,9 +1,9 @@
{
config,
lib,
pkgs,
...
config,
lib,
pkgs,
...
}:
{
services.flatpak.enable = true;
services.flatpak.enable = true;
}

11
modules/nixos/fonts.nix Normal file
View File

@@ -0,0 +1,11 @@
{
config,
lib,
pkgs,
...
}:
{
# from here on fonts are managed on a user level
fonts.fontDir.enable = true;
fonts.fontconfig.enable = true;
}

View File

@@ -1,45 +0,0 @@
{
config,
lib,
pkgs,
...
}:
{
# this actually does not enable xorg, but it is required for GDM
services.xserver.enable = true;
services.xserver.displayManager.gdm.enable = true;
services.xserver.desktopManager.gnome.enable = true;
# here we set wayland to be used
services.xserver.displayManager.gdm.wayland = true;
## Slim down the gnome dependencies
environment.gnome.excludePackages = (with pkgs; [
gnome-photos
gnome-tour
gnome.geary
gedit
gnome.tali
gnome.gnome-music
gnome.cheese
epiphany
gnome.gnome-calendar
gnome.gnome-maps
gnome.simple-scan
gnome.yelp
gnome.gnome-disk-utility
gnome.gnome-notes
gnome.gnome-weather
gnome-secrets
gnome.gnome-characters
gnome.gnome-font-viewer
gnome.gnome-system-monitor
gnome-text-editor
gnome-connections
gnome.gnome-clocks
baobab
gnome.gnome-contacts
gnome.gnome-logs
]);
}

31
modules/nixos/gnome.nix Normal file
View File

@@ -0,0 +1,31 @@
{
config,
lib,
pkgs,
...
}:
{
options.nix-config.gnome.enable = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Enable GNOME desktop environment.";
};
config = lib.mkIf config.nix-config.gnome.enable {
services = {
displayManager.gdm.enable = true;
desktopManager.gnome.enable = true;
gnome = {
core-apps.enable = false;
core-developer-tools.enable = false;
games.enable = false;
};
# Exclude some packages to keep the installation lean
environment.gnome.excludePackages = with pkgs; [
gnome-tour
gnome-user-docs
];
};
};
}

View File

@@ -0,0 +1,48 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.nix-config;
in
{
config = {
# Use hyprland as the main desktop environment but use gdm as desktop manager
programs.hyprland = {
enable = true;
xwayland.enable = true;
};
services.displayManager = {
defaultSession = "hyprland";
};
services.displayManager.gdm = {
enable = true;
wayland = true;
};
services.gvfs.enable = true;
security.pam.services.hyprlock = {};
security.pam.services.gdm.enableGnomeKeyring = true;
# Enable RTKit for real-time audio processing, ...
# improving audio performance and reducing dropouts.
security.rtkit.enable = true;
# Enable D-Bus for inter-process communication
services.dbus.enable = true;
programs.dconf.enable = true;
};
}

View File

@@ -0,0 +1,11 @@
{ config, pkgs, ... }:
{
# Configure console keymap
console.keyMap = "de";
i18n.defaultLocale = "en_US.UTF-8";
# i18n.supportedLocales = [ "en_US.UTF-8" "de_DE.UTF-8" ];
time.timeZone = "Europe/Berlin";
}

4
modules/nixos/ld.nix Normal file
View File

@@ -0,0 +1,4 @@
{config, ...}:
{
programs.nix-ld.enable = true;
}

View File

@@ -0,0 +1,13 @@
{
config,
lib,
pkgs,
...
}:
{
environment.systemPackages = [
pkgs.btop
];
programs.iotop.enable = true;
}

View File

@@ -0,0 +1,94 @@
{
lib,
config,
...
}:
let
cfg = config.nix-config.networking;
in
{
options = {
nix-config.networking.hostName = lib.mkOption {
type = lib.types.str;
default = "nixos";
};
nix-config.networking.vpn = lib.mkOption {
type = lib.types.bool;
default = true;
};
};
config = {
networking.hostName = cfg.hostName;
networking.networkmanager.enable = true;
networking.networkmanager.wifi.powersave = lib.mkDefault true;
users.users.${config.nix-config.userName}.extraGroups = [
"networkmanager"
];
services.avahi.enable = true;
services.avahi.openFirewall = true;
# networking.firewall = {
# enable = false;
# };
# # VPN setup
networking.networkmanager.ensureProfiles = {
environmentFiles = [ config.sops.secrets.vpnEnvironment.path ];
profiles.wg-home = {
connection = {
id = "wg-home";
type = "wireguard";
interface-name = "wgh";
autoconnect = false;
};
ipv4 = {
address = "10.0.0.2/32";
method = "manual";
};
wireguard = {
listen-port = 51820;
private-key = "$HOME_PRIVATE_KEY";
};
"wireguard-peer.y/TBD/c0GkrRtekDkCb8TUnYYil8bSRPIjPDY650pz8=" = {
endpoint = "$HOME_ENDPOINT";
allowed-ips = "192.168.1.0/16";
};
};
profiles.wg-fritzbox = {
connection = {
id = "wg-fritzbox";
type = "wireguard";
interface-name = "wgfb";
autoconnect = false;
};
ipv4 = {
address = "192.168.178.201/24";
dns = "192.168.178.1";
method = "manual";
};
wireguard = {
listen-port = 51820;
private-key = "$FRITZBOX_PRIVATE_KEY";
};
"wireguard-peer.Jf/seKAL7kWm2qX9gf5Ln8FiN7OlPQB3CyRovDIOEHw=" = {
endpoint = "$FRITZBOX_ENDPOINT";
allowed-ips = "192.168.178.0/24;fd73:ea00:5841::/64";
preshared-key = "$FRITZBOX_PRESHARED_KEY";
};
};
};
};
}

70
modules/nixos/nvidia.nix Normal file
View File

@@ -0,0 +1,70 @@
{
config,
lib,
pkgs,
...
}:
{
# Allow to use the nvidia driver in the special case
# Use in the boot menu
specialisation = {
nvidia-enabled = {
configuration = {
system.nixos.tags = [ "nvidia-enabled" ];
# Enable OpenGL
hardware.graphics.enable = lib.mkForce true;
hardware.nvidia = lib.mkForce {
modesetting.enable = true;
powerManagement.enable = false;
powerManagement.finegrained = false;
# features not available for the old graphics card
open = false;
nvidiaSettings = false;
prime = {
sync.enable = true;
nvidiaBusId = "PCI:1:0:0";
intelBusId = "PCI:0:2:0";
};
package = config.boot.kernelPackages.nvidiaPackages.mkDriver {
version = "575.51.02";
sha256_64bit = "sha256-XZ0N8ISmoAC8p28DrGHk/YN1rJsInJ2dZNL8O+Tuaa0=";
openSha256 = "sha256-NQg+QDm9Gt+5bapbUO96UFsPnz1hG1dtEwT/g/vKHkw=";
settingsSha256 = "sha256-6n9mVkEL39wJj5FB1HBml7TTJhNAhS/j5hqpNGFQE4w=";
usePersistenced = false;
};
};
# overwrite the blacklists set previously
boot.extraModprobeConfig = lib.mkForce "";
boot.blacklistedKernelModules = lib.mkForce [];
services.udev.extraRules = lib.mkForce "";
services.xserver.videoDrivers = lib.mkForce ["nvidia"];
};
};
};
# In the global configuration, we blacklist the nouveau driver and load the nvidia driver
boot.extraModprobeConfig = ''
blacklist nouveau
options nouveau modeset=0
'';
services.udev.extraRules = ''
# Remove NVIDIA USB xHCI Host Controller devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{power/control}="auto", ATTR{remove}="1"
# Remove NVIDIA USB Type-C UCSI devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c8000", ATTR{power/control}="auto", ATTR{remove}="1"
# Remove NVIDIA Audio devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", ATTR{power/control}="auto", ATTR{remove}="1"
# Remove NVIDIA VGA/3D controller devices
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", ATTR{power/control}="auto", ATTR{remove}="1"
'';
# # Remove the whole bridge responsible for the VGA/3D controller
# ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", ATTR{class}=="0x060400", ATTR{power/control}="auto", ATTR{remove}="1"
boot.blacklistedKernelModules = [ "nouveau" "nvidia" "nvidia_drm" "nvidia_modeset" ];
}

View File

@@ -6,7 +6,7 @@
}:
{
# Needs to be explicitly set to false...
hardware.pulseaudio.enable = false;
services.pulseaudio.enable = false;
# OR
services.pipewire = {
enable = true;

View File

@@ -1,24 +1,24 @@
{
config,
lib,
pkgs,
...
config,
lib,
pkgs,
...
}:
{
virtualisation.containers.enable = true;
virtualisation = {
podman = {
enable = true;
virtualisation.containers.enable = true;
virtualisation = {
podman = {
enable = true;
dockerCompat = false;
dockerCompat = false;
# Required for containers under podman-compose to be able to talk to each other.
defaultNetwork.settings.dns_enabled = true;
};
# Required for containers under podman-compose to be able to talk to each other.
defaultNetwork.settings.dns_enabled = true;
};
};
# Useful other development tools
environment.systemPackages = with pkgs; [
podman-compose # start group of containers for dev
];
# Useful other development tools
environment.systemPackages = with pkgs; [
podman-compose # start group of containers for dev
];
}

99
modules/nixos/power.nix Normal file
View File

@@ -0,0 +1,99 @@
{
config,
inputs,
lib,
pkgs,
...
}:
{
options.nix-config = {
power = {
batteryThresholds = lib.mkOption {
type = lib.types.listOf lib.types.int;
default = [ 60 80 ];
description = "Battery charge thresholds for power management.";
};
};
};
imports = [
inputs.watt.nixosModules.default
];
config = {
# environment.systemPackages = [
# pkgs.power-profiles-daemon
# ];
services.power-profiles-daemon.enable = true;
# services.tlp = {
# enable = true;
# settings = {
# # # processor chooses frequencies itself but respects the limits set by the user
# # CPU_DRIVER_OPMODE_ON_AC = "guided";
# # CPU_DRIVER_OPMODE_ON_BAT = "guided";
# # # governor dictates global behavior of the CPU
# # CPU_SCALING_GOVERNOR_ON_BAT = "powersave";
# # CPU_SCALING_GOVERNOR_ON_AC = "performance";
# # # energy performance policy (EPP) sets the energy/performance balance
# # CPU_ENERGY_PERF_POLICY_ON_BAT = "balance_power";
# # CPU_ENERGY_PERF_POLICY_ON_AC = "performance";
# # # clock speeds reported by `sudo tlp-stat`
# # # 623377 [kHz] and 5090910 [kHz]
# # CPU_SCALING_MIN_FREQ_ON_AC = 623377;
# # CPU_SCALING_MAX_FREQ_ON_AC = 5090910;
# # CPU_SCALING_MIN_FREQ_ON_BAT = 0;
# # # reduce max frequency on battery to save power
# # CPU_SCALING_MAX_FREQ_ON_BAT = 3000000;
# # # Allow the CPU to boost
# # CPU_BOOST_ON_AC = 1;
# # CPU_BOOST_ON_BAT = 1;
# # RADEON_DPM_PERF_LEVEL_ON_AC = "high";
# # # WIFI_PWR_ON_BAT = "off";
# # enable battery charge thresholds on the default battery
# STOP_CHARGE_THRESH_BAT0 = 1;
# };
# };
systemd.sleep.extraConfig = ''
AllowSuspend=yes
AllowHibernation=yes
AllowHybridSleep=yes
AllowSuspendThenHibernate=yes
'';
# services.watt = {
# enable = true;
# settings = {
# battery_charge_thresholds = [
# 40
# 80
# ];
# };
# };
services.upower.enable = true;
services.irqbalance = {
enable = true;
};
services.thermald = {
enable = true;
};
};
}

12
modules/nixos/sops.nix Normal file
View File

@@ -0,0 +1,12 @@
{
inputs,
...
}:
{
sops.age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];
sops.defaultSopsFile = ./../../secrets/vpn.env;
sops.secrets.vpnEnvironment = {
sopsFile = ./../../secrets/vpn.env;
format = "dotenv";
};
}

33
modules/nixos/stylix.nix Normal file
View File

@@ -0,0 +1,33 @@
{
config,
lib,
pkgs,
...
}:
{
stylix = {
enable = true;
polarity = "dark";
homeManagerIntegration.followSystem = false;
base16Scheme = {
# scheme = "onedark";
# author = "https://github.com/one-dark";
base00 = "#282c34";
base01 = "#353b45";
base02 = "#3e4451";
base03 = "#545862";
base04 = "#565c64";
base05 = "#abb2bf";
base06 = "#b6bdca";
base07 = "#c8ccd4";
base08 = "#e06c75";
base09 = "#d19a66";
base0A = "#e6c07b";
base0B = "#98c379";
base0C = "#56b6c2";
base0D = "#61afef";
base0E = "#c678dd";
base0F = "#be5046";
};
};
}

28
modules/nixos/user.nix Normal file
View File

@@ -0,0 +1,28 @@
{
lib,
config,
...
}:
let
cfg = config.nix-config;
in
{
options = {
nix-config.userName = lib.mkOption {
type = lib.types.str;
default = "remy";
};
};
config = {
users.users.${cfg.userName} = {
isNormalUser = true;
extraGroups = [
"wheel" # Enable sudo for the user.
"input"
# other groups are added as needed, eg. networkmanager
];
};
};
}

1
secrets Submodule

Submodule secrets added at a51d89c420

View File

@@ -1,11 +0,0 @@
let
remy-nix = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMU7pWZfs7GfFTvqljA99pJV9DGJIPH+eK6DvGqBs4pG";
remy-arch = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOP0PZqY8/YfV0NnVbFs2fZLj+nXXVJ8bDo03TyYDfW1";
users = [remy-arch remy-nix];
in {
"secret1.age".publicKeys = users;
"wifi.age".publicKeys = users;
}

Binary file not shown.

View File

@@ -1,16 +1,5 @@
{ config, pkgs, lib, ... }:
with lib.hm.gvariant;
{
imports = [
../modules/home-manager/fish.nix
../modules/home-manager/browser.nix
../modules/home-manager/code.nix
../modules/home-manager/flatpaks.nix
../modules/home-manager/thunderbird.nix
../modules/home-manager/quickshare.nix
../modules/home-manager/gnome-shell-customization.nix
];
## Home Manager configuration
home.stateVersion = "24.05";
# Let Home Manager install and manage itself.
@@ -20,38 +9,40 @@ with lib.hm.gvariant;
home.username = "remy";
home.homeDirectory = "/home/remy";
#home.file.<filepath> = <content>;
## Utils relevant to this user only
programs.git = {
enable = true;
userName = "Remy Moll";
userEmail = "me@moll.re";
settings = {
user.name = "Remy Moll";
user.email = "me@moll.re";
};
};
## Gnome keyboard and mouse settings
dconf.settings = {
# set the keyboard layout to german
"org/gnome/desktop/input-sources" = {
current = mkUint32 0;
sources = [ (mkTuple [ "xkb" "de" ]) (mkTuple [ "xkb" "ch" ]) (mkTuple [ "xkb" "us" ]) ];
xkb-options = [ "lv3:ralt_switch" ];
};
## XDG configuration
xdg = {
"org/gnome/desktop/peripherals/keyboard" = {
numlock-state = true;
};
"org/gnome/desktop/peripherals/mouse" = {
natural-scroll = false;
speed = 0.20851063829787231;
};
"org/gnome/desktop/peripherals/touchpad" = {
tap-to-click = true;
two-finger-scrolling-enabled = true;
speed = 0.16872427983539096;
mimeApps = {
enable = true;
defaultApplications = {
# TODO
"inode/directory" = "org.gnome.Nautilus.desktop";
"application/zip" = "org.gnome.FileRoller.desktop";
"application/octet-stream" = "org.gnome.GHex.desktop";
# pdfs
"application/pdf" = "org.gnome.Evince.desktop";
# links
"x-scheme-handler/https" = "firefox.desktop"; # Links
"x-scheme-handler/http" = "firefox.desktop"; # Links
# images
# "image/png" = "org.gnome.Evince.desktop";
# "image/jpeg" = "org.gnome.Evince.desktop";
# "image/gif" = "org.gnome.Evince.desktop";
# "image/svg+xml" = "org.gnome.Evince.desktop";
# "image/tiff" = "org.gnome.Evince.desktop";
# text-based
"text/*" = "vscode.desktop";
};
};
};
}

View File

@@ -0,0 +1,23 @@
{ config, pkgs, lib, ... }:
with lib.hm.gvariant;
{
config = {
home.stateVersion = "24.05";
};
imports = [
../../modules/home-manager/browser.nix
../../modules/home-manager/code.nix
../../modules/home-manager/dev.nix
../../modules/home-manager/fish.nix
../../modules/home-manager/kubectl.nix
../../modules/home-manager/macos-fixes.nix
../../modules/home-manager/nh.nix
../../modules/home-manager/obsidian.nix
../../modules/home-manager/work
];
}

View File

@@ -0,0 +1,38 @@
{ config, pkgs, lib, ... }:
with lib.hm.gvariant;
{
config = {
nix-config = {
hypr = {
internal-screen = {
resolution = "3840x2160";
scale = "1.666667";
};
};
};
};
imports = [
../remy.nix
../../modules/home-manager/browser.nix
../../modules/home-manager/code.nix
../../modules/home-manager/dev.nix
../../modules/home-manager/documents.nix
../../modules/home-manager/fish.nix
../../modules/home-manager/flatpaks.nix
../../modules/home-manager/hypr
../../modules/home-manager/keepassxc.nix
../../modules/home-manager/kitty.nix
../../modules/home-manager/kubectl.nix
../../modules/home-manager/obsidian.nix
../../modules/home-manager/owncloud-client.nix
../../modules/home-manager/ssh.nix
../../modules/home-manager/stylix.nix
../../modules/home-manager/thunderbird.nix
../../modules/home-manager/wofi.nix
../../modules/home-manager/xdg-portals.nix
];
}

View File

@@ -0,0 +1,38 @@
{ config, pkgs, lib, ... }:
with lib.hm.gvariant;
{
config = {
nix-config = {
hypr = {
internal-screen = {
resolution = "auto";
scale = "auto";
};
};
};
};
imports = [
../remy.nix
../../modules/home-manager/browser.nix
../../modules/home-manager/code.nix
../../modules/home-manager/dev.nix
../../modules/home-manager/documents.nix
../../modules/home-manager/fish.nix
../../modules/home-manager/flatpaks.nix
../../modules/home-manager/hypr
../../modules/home-manager/keepassxc.nix
../../modules/home-manager/kitty.nix
../../modules/home-manager/kubectl.nix
../../modules/home-manager/obsidian.nix
../../modules/home-manager/owncloud-client.nix
../../modules/home-manager/nh.nix
../../modules/home-manager/ssh.nix
../../modules/home-manager/stylix.nix
../../modules/home-manager/thunderbird.nix
../../modules/home-manager/wofi.nix
../../modules/home-manager/xdg-portals.nix
];
}

View File

@@ -0,0 +1,44 @@
{ config, nixpkgs, lib, ... }:
with lib.hm.gvariant;
{
config = {
nix-config = {
hypr = {
internal-screen = {
resolution = "2944x1840@90.00";
scale = "1.6";
};
};
# quickshell = {
# enable = true;
# };
};
};
imports = [
../remy.nix
../../modules/home-manager/browser.nix
../../modules/home-manager/code.nix
../../modules/home-manager/dev.nix
../../modules/home-manager/directories.nix
../../modules/home-manager/documents.nix
../../modules/home-manager/fish.nix
../../modules/home-manager/flatpaks.nix
../../modules/home-manager/hypr
../../modules/home-manager/keepassxc.nix
../../modules/home-manager/kitty.nix
../../modules/home-manager/kubectl.nix
../../modules/home-manager/launcher.nix
../../modules/home-manager/nh.nix
../../modules/home-manager/obsidian.nix
../../modules/home-manager/owncloud-client.nix
../../modules/home-manager/quickshell
../../modules/home-manager/ssh.nix
../../modules/home-manager/stylix.nix
../../modules/home-manager/thunderbird.nix
../../modules/home-manager/uxplay.nix
../../modules/home-manager/wallpaper.nix
../../modules/home-manager/xdg-portals.nix
];
}

View File

@@ -11,12 +11,15 @@
# also add mirrors?
# "https://mirrors.ustc.edu.cn/nix-channels/store"
"https://cache.nixos.org"
"https://hyprland.cachix.org"
];
trusted-public-keys = [
# the default public key of cache.nixos.org, it's built-in, no need to add it here
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
"hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="
];
builders-use-substitutes = true;
};
}

4
utils/unfree.nix Normal file
View File

@@ -0,0 +1,4 @@
{ config, lib, pkgs, ... }:
{
nixpkgs.config.allowUnfree = true;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 381 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB