diff --git a/.chezmoi.yaml.tmpl b/.chezmoi.yaml.tmpl deleted file mode 100644 index 01a7800..0000000 --- a/.chezmoi.yaml.tmpl +++ /dev/null @@ -1,239 +0,0 @@ -{{- /* git commit config */ -}} -{{- - $gitName := promptStringOnce - . "git.name" - "git: committer name" --}} -{{- - $gitEmail := promptStringOnce - . "git.email" - "git: committer email" --}} - -{{- /* gpg config */ -}} -{{- - $gpgSigningKey := promptStringOnce - . "gpg.signingkey" - "GPG: signing key" --}} -{{- - $gpgKeyservers := list - "keys.openpgp.org" - "keyserver.ubuntu.com" - "pgp.mit.edu" --}} -{{- - $gpgKeyserver := promptChoiceOnce - . "gpg.keyserver" - "GPG: preferred keyserver" $gpgKeyservers --}} - -{{- /* npm config */ -}} -{{- - $npmToken := promptStringOnce - . "npm.token" - "npm: npmjs.com token" --}} - -{{- /* vim/nvim config */ -}} -{{- - $vimCocIntelephenseLicenseKey := promptStringOnce - . "vim.coc.intelephense_licensekey" - "vim: coc intelephense license key" --}} - -{{- /* hyprland config */ -}} -{{- - $hyprlandPrimaryMonitorOutput := promptStringOnce - . "hyprland.primaryMonitorConfig.output" - "hyprland: primary monitor output ID" --}} -{{- - $hyprlandPrimaryMonitorMode := promptStringOnce - . "hyprland.primaryMonitorConfig.mode" - "hyprland: primary monitor mode" --}} -{{- - $hyprlandPrimaryMonitorPosition := promptStringOnce - . "hyprland.primaryMonitorConfig.position" - "hyprland: primary monitor position" - "0x0" --}} -{{- - $hyprlandPrimaryMonitorScale := promptStringOnce - . "hyprland.primaryMonitorConfig.scale" - "hyprland: primary monitor scale" - "1.0" --}} - -{{- /* hypridle config */ -}} -{{- - $hypridleScreenDim := promptIntOnce - . "hypridle.screen_dim" - "hypridle: dim screen after N seconds" - 150 --}} -{{- - $hypridleKeyboardBacklightDim := promptIntOnce - . "hypridle.keyboard_backlight_dim" - "hypridle: dim keyboard backlight after N seconds" - 150 --}} -{{- - $hypridleScreenLock := promptIntOnce - . "hypridle.screen_lock" - "hypridle: lock screen after N seconds" - 300 --}} -{{- - $hypridleScreenOff := promptIntOnce - . "hypridle.screen_off" - "hypridle: turn screen off after N seconds" - 450 --}} -{{- - $hypridleSuspend := promptIntOnce - . "hypridle.suspend" - "hypridle: suspend after N seconds" - 600 --}} - -{{- /* hyprlock config */ -}} -{{- - $hyprlockFingerprintEnabled := promptBoolOnce - . "hyprlock.fingerprint_enabled" - "hyprlock: enable fingerprint reader" --}} - - -{{- /* waybar config */ -}} -{{- - $waybarPowerAdapter := promptStringOnce - . "waybar.power.adapter" - "Waybar: power adater ID (leave blank for having Waybar selecting a sensitive default)" --}} -{{- - $waybarPowerBattery := promptStringOnce - . "waybar.power.battery" - "Waybar: battery ID (leave blank for having Waybar selecting a sensitive default)" --}} -{{- - $waybarNetEthInterface := promptStringOnce - . "waybar.net.eth" - "Waybar: ethernet interface name" --}} -{{- - $waybarNetWifiInterface := promptStringOnce - . "waybar.net.wifi" - "Waybar: WiFi interface name" --}} -{{- - $waybarTemperaturZone := promptStringOnce . - "waybar.temperature.thermal_zone" - "Waybar: temperature thermal zone ID (leave blank for having Waybar selecting a sensitive default)" --}} -{{- - $waybarTemperaturHwmonPath := promptStringOnce - . "waybar.temperature.hwmon_path" - "Waybar: HWMON file path to use instead of thermal zone ID (leave blank for having Waybar selecting a sensitive default)" --}} - -# Config -edit: - command: "nvim" - -merge: - command: "nvim" - args: ["-d", "{{ "{{" }} .Destination {{ "}}" }}", "{{ "{{" }} .Source {{ "}}" }}", "{{ "{{" }} .Target {{ "}}" }}"] - -diff: - pager: "delta" - -data: - git: - name: {{ $gitName | quote }} - email: {{ $gitEmail | quote }} - signingkey: {{ $gpgSigningKey | quote }} - - gpg: - signingkey: {{ $gpgSigningKey | quote }} - # we use either one of these: - {{- range $gpgKeyservers }} - # - {{ . }} - {{- end }} - keyserver: {{ $gpgKeyserver | quote }} - - npm: - token: {{ $npmToken | quote }} - - vim: - coc: - intelephense_licensekey: {{ $vimCocIntelephenseLicenseKey | quote }} - - hyprland: - # monitor config shall be written as defined by Hyprland's `monitorv2` - # spec. - # https://wiki.hypr.land/Configuring/Monitors/ - primaryMonitorConfig: - output: {{ $hyprlandPrimaryMonitorOutput | quote }} - mode: {{ $hyprlandPrimaryMonitorMode | quote }} - position: {{ $hyprlandPrimaryMonitorPosition | quote }} - scale: {{ $hyprlandPrimaryMonitorScale | quote }} - - # Additional external monitors shall be declared as an array of objects, - # similar to the `primaryMonitorConfig` object. Optionally, a `comment` - # property may be provided for a free-text description. - # - # Example: - # - # externalMonitors: - # - comment: "my external monitor" - # output: "desc:LG Electronics LG ULTRAGEAR 408BOHE0K857" - # mode: "2560x1440@143.99100" - # position: "1920x0" - # scale: "1" - # - comment: "my 2nd external monitor" - # output: "[...]" - # mode: "[...]" - # position: "[...]" - # scale: "[...]" - externalMonitors: [] - - hypridle: - # all values in seconds - # set to 0 for skipping listener - screen_dim: {{ $hypridleScreenDim }} - keyboard_backlight_dim: {{ $hypridleKeyboardBacklightDim }} - screen_lock: {{ $hypridleScreenLock }} - screen_off: {{ $hypridleScreenOff }} - suspend: {{ $hypridleSuspend }} - - hyprlock: - fingerprint_enabled: {{ $hyprlockFingerprintEnabled }} - - waybar: - # Run `ls -1 /sys/class/power_supply/` in order to get an overview. - # Waybar picks sensitive defaults if below is left blank. - power: - show: true - adapter: {{ $waybarPowerAdapter | quote }} - battery: {{ $waybarPowerBattery | quote }} - - # Run `bluetoothctl list` in order to see available controller - bluetooth: - show: true - controller: "" - - # Run `ip link` for an overview of applicable interfaces - net: - eth: {{ $waybarNetEthInterface | quote }} - wifi: {{ $waybarNetWifiInterface | quote }} - - # see https://github.com/Alexays/Waybar/wiki/Module:-Temperature - # Waybar picks sensitive defaults if below is left blank. - temperature: - # The thermal zone, as in /sys/class/thermal/. - thermal_zone: {{ $waybarTemperaturZone | quote }} - # The temperature path to use - # e.g. /sys/class/hwmon/hwmon2/temp1_input instead of one in /sys/class/thermal/. - hwmon_path: {{ $waybarTemperaturHwmonPath | quote }} diff --git a/.chezmoiignore b/.chezmoiignore deleted file mode 100644 index f0f644e..0000000 --- a/.chezmoiignore +++ /dev/null @@ -1,2 +0,0 @@ -LICENSE -README.md diff --git a/.editorconfig b/.editorconfig deleted file mode 120000 index 33545d9..0000000 --- a/.editorconfig +++ /dev/null @@ -1 +0,0 @@ -dot_editorconfig \ No newline at end of file diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 0000000..e454bb9 --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,62 @@ +name: Flake Tests + +on: [push, pull_request, workflow_dispatch] + +jobs: + flake-check: + name: Flake Check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: cachix/install-nix-action@v31 + with: + install_url: https://nixos.org/nix/install + extra_nix_config: | + auto-optimise-store = true + access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} + experimental-features = nix-command flakes + - run: nix flake check --all-systems . + lint: + name: Nix lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: cachix/install-nix-action@v31 + with: + install_url: https://nixos.org/nix/install + extra_nix_config: | + auto-optimise-store = true + access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} + - uses: workflow/nix-shell-action@v3 + with: + packages: nil + script: | + find . -name '*.nix' -print0 | xargs -0 nil diagnostics | tee /tmp/findings.txt + if [ -s "/tmp/findings.txt" ]; then + echo "Nil detected warnings/errors" + exit 1 + fi + formatter: + name: Nix formatter + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: cachix/install-nix-action@v31 + with: + install_url: https://nixos.org/nix/install + extra_nix_config: | + auto-optimise-store = true + access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} + - uses: workflow/nix-shell-action@v3 + with: + packages: nixfmt-tree,git + script: | + treefmt + GIT_CHANGES="$(git status --porcelain=v1)" + if [[ -n "$GIT_CHANGES" ]]; then + echo "Code not formatted" + echo "Run nixfmt and commit changes" + echo "Affected files:" + echo "$GIT_CHANGES" + exit 1 + fi diff --git a/.sops.yaml b/.sops.yaml new file mode 100644 index 0000000..b4ed51a --- /dev/null +++ b/.sops.yaml @@ -0,0 +1,25 @@ +keys: + hosts: + qemu-nixos-btw: &host_qemu-nixos-btw_age | + age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk + dell-xps9360-nixos-btw: &host_dell-xps9360-nixos-btw_age | + age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa + + users: + rtucek: + user_rtucek_pgp_key_yubi_13364058: &user_rtucek_pgp_key_yubi_13364058 "0x416CF1EF9AAF90BC" + user_rtucek_age_identity: &user_rtucek_age_identity | + age1pq10dd9wceuvcn50w9nqec5fws670qz7eqhfw7teyptqfp02c6k05pjhrp6kgtfwyx4rv6gry4uwpanqvknsvn2x26zf8p9d2ccelq24uncr0hqev9yjm8wdeypgfspdn9vt0ulvx6jcsy293j2y7chsmse3wfd8qeg99fwnup9psuqewrzpwfdv0kcfjlu2skxx8nxcykxwaz2dny825e3wxphmn5c0vtxp4tjetzw8f98sxgfmv720sk94ezpg5fzw2a5k2eszvnpjqrcpw2ck5zxwuyprd598gaqezkj5jy0ry7eqx4su5rtxdemkphhwjppe0fsp3t7p3vezf3pzuhq3n3etxkcggsy62u94ufeclrchdswkl6gwp5ce65aevnu04aqxrsm0deuf8pgfaqxk3ys43ex2wz625a06s7kfcc8tagp8zk6c9cpqu7jg7sxtjf6faq4e8extucyxjjq42a92ancn8ae5gdgr2ea4wuqg2eurs662ufux35nhkutjqm7kxlglafwu92vefqn8lvn9gwm6jvcvtpvs6nngj7zf43fd0k3pqs8dzvvf0fc7ea3v3ct5q6zt0ptdkdpjnv2t9jcnh2vhxv3t9uk6rzjw5zqtraxp52w3345edj0fzugwdfqcd8jge75yufv6u47wz22qhqzucch2wkgj8lk266ep7e6mwvfv6efcgf4jy35kpmhm6fzwcdsxxlup5q2zxzdpg67xjslp9f6t96khpxepp50jgss4d2edermg68xkff8wahg72ayaats9dz5rukqphkahguf5hyq0dwtz6s90jlh0l3ajql7pfy64zkz6ftuu6u2578wnpmpkwta0es47d3sve9neqa89w708j4afc2raxdf2gaucl70jn7e039axgmzk069ha4p923rf3lwugys0v56tgfu79x5pcuw2zespxely7tyyhg9z4upquxynwpzcj7atq57yazfu74tv6cun0c265am8zahls5x6y5t4f4zpdgmggtst5cefyatmqehted0gw5sawprpdf6gg9nf4c84xmk575auu0mn35j2rgy8wdkhykkrdxtjah88gr2cmrr9ra8edw9fs6v3pzkh49rtk24qhh2505c4d2zrw8ashyedtapnmeyndpy8f8szlz5tc7w0jyxm69s9ysaq5cgkfst4ude8z3phshy5yk5f3yakuxkgv7gyp2hwgl3kl223wzhv40ukmpajyass46zrgtfxr8sr3gax24d3edekg3sf52vklktkgkx3wgctvu6l9xzr098zc5gvsf50xqw8dp3y96rx5nkswt6uw7glxpyyj9hzxkqhylnry7h79hlrualwsr6qh0nx8mc5q2mmv8sc3nx9ggnek8jc0x9qaq426ssf9y35qr6jf4fk40xex45hvx72zpr3g92j2yczrd4qnwvf9flp9ekg0nsp7ru5z7c0fzqz2uwsvjlly6zmqaq5awgt9lclp0rply9jy9tcgfsqchncxuarqfc4zzf3jrpg9dvxgvhyqsl034lv732d0rc44032w7gt3c8kpnypaj6f2gpf5qzyrjy9d26h326gzv8gy6glqrrhunfxk54gjw6ktrhy4fp8ez3jz8wv89z798dz6q2upgkuyf3hgpf42wgs427ufmvetpqc9v6p032yllpcnrrkxc5qrfj9spttawd5hf4gxg2xk67hwcy6g3u5rlqslth3yu8x25ah966nq7v339ytf33avuuxaer6yrhfdpft42cj5a8apcrw0z5ksgmn0qcgeq3p3wmqecnucswe7rga66rde9ax7wtldwzqa85m3mqj8vwspehqfdy8gn4nke4knf2zr9cjpx37jawu2p5gzzejqe26mgzjh90nv9mf2h3x6g8h6tzumyktdscdu5azuzmf9mvxv2n9aky + +creation_rules: + - key_groups: + - pgp: + - *user_rtucek_pgp_key_yubi_13364058 + age: + - *user_rtucek_age_identity + - *host_qemu-nixos-btw_age + - *host_dell-xps9360-nixos-btw_age + +stores: + yaml: + indent: 2 diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 3fcb641..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Rudolf Tucek - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index 73a2412..0000000 --- a/README.md +++ /dev/null @@ -1,486 +0,0 @@ -# Dotfiles - -My dotfiles - use them and contribute your personal changes/suggestions. - - -## Installation - -The specifically target Arch-alike distributions. For instance, the -instructions here should also work for Manjaro, which builds upon Arch. - -Most importantly, it's require to install a package manager, which -makes use of the AUR. [yay](https://github.com/Jguer/yay) is by far -the best one I've ever seen and can simply be installed like so. - -```bash -sudo pacman -S --needed git base-devel && git clone https://aur.archlinux.org/yay.git && cd yay && makepkg -si -``` - -Then, you'd want to install all relevant packages from the [General -packages](#general-packages), [Fonts](#fonts) and [AUR](#aur) sections. - -Dotfiles are managed by [`chezmoi`](https://github.com/twpayne/chezmoi). Run -`chezmoi init rtucek` in order to download all dotfiles, followed by `chezmoi -cd` for jumping directly to the git repo of the dotfiles. - -A couple of template variables have to be set for proper configuration. -Use the sample config file from `dot_config/chezmoi/chezmoi.toml.sample` and -copy it to `~/.config/chezmoi/chezmoi.toml`, then set the value accordingly and -run `chezmoi apply` for having the actual dotfiles being put a their right -place. - -Refer to [chezmoi's docs](https://www.chezmoi.io/) for further details. - - -## Contribution - -Pull requests are welcome! - - -## Dependencies - -The dotfiles are optimized for the following setup. - - -### General packages - -- alsa-utils -- arch-audit -- arch-wiki-docs -- bash-completion -- bat [[1]](#syntax-highlight-with-bat-and-cat-[1]) -- bc -- bluetui -- bluez -- bluez-utils -- bolt [[4]](#fix-hotplug-issue-with-thunderbolt-[4]) -- brightnessctl -- chezmoi -- ctags -- diff-so-fancy -- dmidecode -- docker [[2]](#docker-post-installation-[2]) -- docker-compose -- dog -- dunst -- ethtool -- fastfetch -- firefox -- fwupd -- fzf -- gimp -- git-delta [[1]](#syntax-highlight-with-bat-and-cat-[1]) -- glab -- globalprotect-openconnect -- gnome-keyring -- gnu-netcat -- go -- gparted -- gufw -- gzip -- helm -- helvum -- htop -- httpie -- imagemagick -- inxi -- ipcalc -- jless -- jq -- k9s -- kubectl -- less -- libreoffice-fresh -- libvirt -- lsb-release -- lshw -- lsof -- man-db -- mkcert -- monique -- msr-tools -- mtr -- mysql-workbench -- neovim -- network-manager-applet -- networkmanager-openconnect -- nitrogen -- nvm -- openconnect -- openssh -- osquery -- pcmanfm -- percona-server-clients -- percona-toolkit -- perl-image-exiftool -- pgcli -- pigz -- pipewire [[7]](#pipewire-post-installation-activation-[7]) -- pipewire-libcamera -- pipewire-pulse -- playerctl -- postgresql-client -- pwgen -- python-pip -- python-pipx -- python-pynvim -- qemu-full -- ranger -- rofi -- rsync -- ruby-erb -- seahorse -- sound-theme-freedesktop -- speedtest-cli -- stern -- strongswan -- tcpdump -- tela-circle-icon-theme-manjaro -- testssl.sh -- the_silver_searcher -- thunderbird -- tmux [[3]](#install-tmux-plugins-[3]) -- torbrowser-launcher -- tree -- tree-sitter-cli -- udiskie -- udisks2 -- ufw -- unzip -- usbutils -- veracrypt -- vi -- virt-manager -- virt-viewer -- whois -- wireplumber -- wl-clipboard -- yubikey-manager - - -### FS support - -- bcachefs-tools -- btrfs-progs -- btrfs-tools -- cryptsetup -- dosfstools -- exfatprogs -- hfsprogrs -- hfsutils -- lvm2 -- mtools -- ntfs-3g -- ntfs-progrs -- xfsprogs - - -### Fonts - -- noto-fonts -- noto-fonts-cjk -- noto-fonts-emoji -- otf-font-awesome -- ttf-dejavu -- ttf-input-nerd -- ttf-jetbrains-mono-nerd -- ttf-joypixels -- woff2-font-awesome - - -### AUR - -- auto-cpufreq [[9]](#auto-cpufreq-post-installation-activation-[9]) -- brave-bin -- certigo -- csvtools-git -- devspace-bin -- grimblast-git -- kind-bin -- lastpass-cli -- litecli -- mycli -- postman-bin -- ptcpdump -- pw-volume -- snapd -- tmuxinator -- unimatrix-git -- yay -- yubioath-desktop - - -### Snap packages - -n/a - - -### Composer - -```bash -composer global require consolidation/cgr -``` - - -### nvm - -Most important commands are: - -```bash -nvm install --lts # Installing most recent LTS version -nvm alias default "lts/*" # Alias most recent lts node version as default -nvm use default # Use most recent version -nvm install-latest-npm # Upgrade npm to the latest version -``` - - -### npm - -The following npm packages are considered as standard. -Install them via `npm install --global [packages]`: - -- @vue/cli -- create-react-app -- neovim - - -### yarn - -Install yarn via npm. Let yarn manage itself by re-installing yarn globally and -removing it afterwards via npm again. - -``` -npm -g install yarn -yarn global add yarn -npm -g remove yarn -``` - - -### PIP - -```bash -pipx install python-language-server # (coc-python) -``` - - -### Bash completion - -- composer (`cgr require bamarni/symfony-console-autocomplete`) -- tmux (https://github.com/imomaliev/tmux-bash-completion/blob/master/completions/tmux) -- yarn (https://github.com/dsifford/yarn-completion/blob/master/yarn-completion.bash) - - -## Addendum - -### Syntax highlight with bat and cat [1] - -As a special case, in order to have syntax highlighting for PHP work with -`bat` in combination with `delta` diffs, refer to [these -instructions](https://github.com/dandavison/delta/issues/162#issuecomment-625952288). - -It's necessary to perform this step, whenever `bat` gets updated. - - -### Install tmux plugins [3] - -After tmux has been installed, run the following commands in order to install -and setup tmux plugin manager ([TPM](https://github.com/tmux-plugins/tpm)) for -the first time. The following commands below will clone TPM's source code and -install it at the right location, then type; `Ctrl + SPACE + I` in order to -actually install tmux plugins. - -```bash -git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm -``` - - -### Fix hotplug issue with Thunderbolt [4] - -Given the following symptoms: -> Devices, connected via Thunderbolt don't work if "hot plugged in" (that is, -> after the OS has booted). However, if the device is connected at cold boot -> time, the device works mystically. In particular, to a Dock connected devices -> like keyboards and mouses don't assume to have any powered state (e.g. the -> laser pointer of a mouse remains switched off). - -This is due to the [OS' security -settings](https://wiki.archlinux.org/title/Thunderbolt#User_device_authorization). -The OS - by default - protects against [DMA -attacks](https://en.wikipedia.org/wiki/DMA_attack) such as -[Thunderstrike](https://trmm.net/Thunderstrike_2/), by setting the security mode -to `user` or `secure`. So the in some form or another, we have to "approve" the -connected device. - -One way to simply get away with it, is to add a udev rule to -`/etc/udev/rules.d/99-removable.rules`, which just authorizes essentially every -hot-plugged Thunderbolt device: - -``` -ACTION=="add", SUBSYSTEM=="thunderbolt", ATTR{authorized}=="0", ATTR{authorized}="1" -``` - -The rule will become effective after the next reboot, however you can also avoid -a reboot by live-reloading udev rules: - -```bash -sudo udevadm control --reload-rules -sudo udevadm trigger -``` - -However, a much simpler approach would be actually authorizing the device via -`bolt`. - -Sources: -- [Thunderbolt](https://wiki.archlinux.org/title/Thunderbolt) -- [Thunderbolt - udev rule (Arch Wiki)](https://wiki.archlinux.org/title/Thunderbolt#Automatically_connect_any_device) -- [Live-reload udev rule (unix.stackexchange.com)](https://unix.stackexchange.com/a/39371/213414) - - -### GPG keyservers - -My GPG keys are generally distributed via the following public keyservers: -- keys.openpgp.org -- keyserver.ubuntu.com -- pgp.mit.edu - - -### Fix automatic wake ups from suspend - -For some Tuxedo Laptops, the Laptop wakes up automatically within a couple of -seconds. This is due to a bug in the BIOS, which can be seen in the syslog, -based on these log entries: - -``` -[...] -xxx xx xx:xx:xx archlinux kernel: ACPI BIOS Error (bug): Could not resolve symbol [\_SB.ACDC.RTAC], AE_NOT_FOUND (20230628/psargs-332) -xxx xx xx:xx:xx archlinux kernel: ACPI Error: Aborting method \_SB.PEP._DSM due to previous error (AE_NOT_FOUND) (20230628/psparse-529) -[...] -``` - -For mitigation, the kernel parameter `acpi.ec_no_wakeup=1` must be set in -`/etc/default/grub`: - -```diff --GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" -+GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi.ec_no_wakeup=1" -``` - -> Don't forget to run `sudo update-grub` in order re-build and deploy the grub -> config, so that it becomes effective from the next system boot onwards.. - -For testing purpose, the `acpi.ec_no_wakeup=1` parameter can also be set at -post-boot with the sysfs interface: - -```bash -# Read current state of acpi.ec_no_wakeup via ... -cat /sys/module/acpi/parameters/ec_no_wakeup -# ... Y -> 1 (on); N -> 0 (off) -# Set the value by writing 1 or 0 to the file: e.g. -echo "1" | sudo tee /sys/module/acpi/parameters/ec_no_wakeup -``` - -It's worth pointing out, that even with setting the parameter, the error will -still be logged to syslog, however the automatic wake ups are prevented this -way. - - -Links: -- [Tuxedo FAQ / Device Immediately Wakes Up After Suspend](https://www.tuxedocomputers.com/en/FAQ-TUXEDO-InfinityBook-Pro-15-Gen9.tuxedo#3675) -- [Arch Wiki / /sys/module/acpi/parameters/ec_no_wakeup](https://wiki.archlinux.org/title/Power_management/Wakeup_triggers#/sys/module/acpi/parameters/ec_no_wakeup) - - -### Have systemd using same default console editor - -By default, systemd may use any available console-based editor. -However, the `SYSTEMD_EDITOR` ENV allows configuring any editor of preference. -In order to have `sudo` based commands inheriting this ENV, add the following -line to the sudoers file manually via `visudo`. - -```diff - ## - ## Preserve editor environment variables for visudo. - ## To preserve these for all commands, remove the "!visudo" qualifier. - Defaults!/usr/bin/visudo env_keep += "SUDO_EDITOR EDITOR VISUAL" -+Defaults env_keep += "SYSTEMD_EDITOR" - ## - ## Use a hard-coded PATH instead of the user's to find commands. -``` - - -### Permissions for Polybar [6] - -Many modules may not work out of the box. Inspect -`~/.config/polybar/config.ini`, which might require a few parameters to be -properly templated via chezmoi. - -#### Change backlight via scrolling - -For having support for changing the backlight via scrolling, do the following: - -1) Add your user to the `video` group. - -```bash -sudo usermod -aG video $USER -newgrp video -``` - -2) Add the following udev rule `/etc/udev/rules.d/99-backlight.rules` - -``` -ACTION=="add", SUBSYSTEM=="backlight", RUN+="/bin/chgrp video $sys$devpath/brightness", RUN+="/bin/chmod g+w $sys$devpath/brightness" -``` - -Reload udev via: - -```bash -sudo udevadm control --reload-rules -sudo udevadm trigger -``` - -In case it does not work, try rebooting the system. - - -### Pipewire post-installation activation [7] - -[`pipewire`](https://wiki.archlinux.org/title/PipeWire) is used as the audio -router and processor. For audio session management, -[`wireplumber`](https://wiki.archlinux.org/title/WirePlumber) is used. - -Additionally, the `pipewire-pulse` package is installed for mimicking -[`pulseaudio`](https://wiki.archlinux.org/title/PulseAudio) for some -applications. In order to have both services working reliably, make sure systemd -is running them upon startup. - -Either [`helvum`](https://gitlab.freedesktop.org/pipewire/helvum) or -[`hyprpwcenter`](https://wiki.hypr.land/Hypr-Ecosystem/hyprpwcenter/) may be -used as patchbay GUI for pipewire. - -```bash -systemctl enable --user --now pipewire.service -systemctl enable --user --now pipewire-pulse.service -``` - - -### Bluetooth support - -For having [Bluetooth](https://wiki.archlinux.org/title/Bluetooth) working, the -`bluetoothd` daemon must run in the background. -Run the following systemd command in order to run bluetoothd from the beginning. - -```bash -sudo systemctl enable --now bluetooth.service -``` - -Tools like [`bluetui`](https://github.com/pythops/bluetui) and -`bluetoothctl` may be used for frontends for interacting. - - -### Yubikey support - -[Yubikey](https://wiki.archlinux.org/title/YubiKey) builds upon the smartcard -interface, whose service may not be running. -You may enable the service to become available via systemd activation: - -```bash -sudo systemctl enable --now pcscd.service -``` diff --git a/bin/executable_backlight.sh b/bin/executable_backlight.sh deleted file mode 100644 index 94718d5..0000000 --- a/bin/executable_backlight.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -# set -x - -# Get current brightness in percent -BRIGHTNESS="$(brightnessctl -m | cut -d',' -f4 | grep -Po '\d+')" -DIFF="$(echo "$1" | grep -Po "[\+\-]\d+(?=%)")" - -# Round properly -TARGET_BRIGHTNESS="$(( (("$BRIGHTNESS" / 5) * 5) + "$DIFF" ))" - -# Do not go beyond the boundaries of 0 and 100 -TARGET_BRIGHTNESS="$(( 0 <= $TARGET_BRIGHTNESS ? $TARGET_BRIGHTNESS : 0 ))" -TARGET_BRIGHTNESS="$(( $TARGET_BRIGHTNESS <= 100 ? $TARGET_BRIGHTNESS : 100 ))" - -# Set brightness -brightnessctl set "${TARGET_BRIGHTNESS}%" - -# Show the brightness notification -notify-send \ - -a "changeBrightness" \ - -u normal \ - -t 1500 \ - -i /usr/share/icons/Tela-circle-manjaro/symbolic/status/display-brightness-symbolic.svg \ - -h string:synchronous:my-progress "Brightness: ${BRIGHTNESS}" diff --git a/bin/executable_capslock-check.sh b/bin/executable_capslock-check.sh deleted file mode 100644 index 338bac0..0000000 --- a/bin/executable_capslock-check.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -# set -x - -while true -do - # Check if caps-lock LED is enabled for first-best input device - CAPS_ON="$(cat "$(find /sys/class/leds/input*::capslock/ -name 'brightness' | head -1)")" - - # empty string causes waybar to show nothing - TEXT="{ \"text\": \"\"}" - - if [[ "$CAPS_ON" == "1" ]]; then - TEXT="{ \"text\": \"󰘲\", \"class\": \"active\"}" - fi - - echo "$TEXT" | jq --unbuffered --compact-output - sleep 1 -done diff --git a/bin/executable_composer b/bin/executable_composer deleted file mode 100644 index 4ee6257..0000000 --- a/bin/executable_composer +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -COMPOSER_VERSION=2.9.5 -COMPOSER_HOME=${COMPOSER_HOME:-$HOME/.config/composer} -COMPOSER_CACHE_DIR=${COMPOSER_CACHE_DIR:-$HOME/.cache/composer} - -mkdir -p "$COMPOSER_HOME" "$COMPOSER_CACHE_DIR" - -docker run \ - -it \ - --rm \ - -u "$(id -u):$(id -g)" \ - -v /etc/passwd:/etc/passwd:ro \ - -v /etc/group:/etc/group:ro \ - -e SSH_AUTH_SOCK=/ssh-auth.sock \ - -v "$SSH_AUTH_SOCK:/ssh-auth.sock" \ - -e "COMPOSER_HOME=${COMPOSER_HOME}" \ - -v "${COMPOSER_HOME}:${COMPOSER_HOME}" \ - -e "COMPOSER_CACHE_DIR=${COMPOSER_CACHE_DIR}" \ - -v "${COMPOSER_CACHE_DIR}:${COMPOSER_CACHE_DIR}" \ - -v "$PWD":/app \ - "composer:${COMPOSER_VERSION}" \ - "$@" diff --git a/bin/executable_nmcli-active-vpn-conn.sh b/bin/executable_nmcli-active-vpn-conn.sh deleted file mode 100644 index 22292ed..0000000 --- a/bin/executable_nmcli-active-vpn-conn.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -# set -x - -ALL_ACTIVE_CONNS="$(nmcli con show --active)" -ALL_ACTIVE_VPN_CONNS="$(echo "$ALL_ACTIVE_CONNS" | awk '{ if ($3=="vpn") print $1}')" -ALL_ACTIVE_VPN_CONNS_CNT="$(echo "$ALL_ACTIVE_VPN_CONNS" | wc -l)" - -if [[ "$ALL_ACTIVE_VPN_CONNS" == "" ]]; then - echo "{ \"text\": \" 0\", \"tooltip\": \"No active VPN connections\", \"class\": \"inactive\" }" - - exit 0 -fi - -echo "{ \"text\": \" ${ALL_ACTIVE_VPN_CONNS_CNT}\", \"tooltip\": "$(echo -n "$ALL_ACTIVE_VPN_CONNS" | jq -Rsa .)", \"class\": \"active\" }" - -exit 0 diff --git a/bin/executable_phpstan b/bin/executable_phpstan deleted file mode 100644 index c9816ed..0000000 --- a/bin/executable_phpstan +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -PHPSTAN_VERSION=2.0.4 -PHP_VERSION=php8.3 - -docker run \ - -t \ - --rm \ - -v $PWD:/app \ - "ghcr.io/phpstan/phpstan:${PHPSTAN_VERSION}-${PHP_VERSION}" \ - ${@//"${PWD}/"/"/app/"} \ - | sed -E "s/\/app\//${PWD//"/"/"\/"}\//" diff --git a/bin/executable_rfkill-toggle.sh b/bin/executable_rfkill-toggle.sh deleted file mode 100644 index 33828f8..0000000 --- a/bin/executable_rfkill-toggle.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -# Toggle rfkill switches -rfkill --json | jq --raw-output0 '.rfkilldevices | map(.type) | .[]' | xargs -0 -L1 rfkill toggle - -# Check current status on first-best device -STATUS="$(rfkill --json | jq -r '.rfkilldevices[0].soft')" - -# Show notification -UNBLOCKED="/usr/share/icons/Tela-circle-manjaro/22/panel/network-flightmode-off.svg" -BLOCKED="/usr/share/icons/Tela-circle-manjaro/22/panel/network-flightmode-on.svg" - -ICON="$UNBLOCKED" -STATUS_TXT="off" -if [[ $STATUS == "blocked" ]]; then - ICON="$BLOCKED" - STATUS_TXT="on" -fi - -notify-send \ - -a "changeFlightmode" \ - -u normal \ - -t 1500 \ - -i "$ICON" \ - -h string:synchronous:my-progress "Flightmode: $STATUS_TXT" diff --git a/bin/executable_sound.sh b/bin/executable_sound.sh deleted file mode 100644 index efba7d1..0000000 --- a/bin/executable_sound.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/bash - -# set -x - -VOLUME="$(pactl get-sink-volume "@DEFAULT_SINK@" | grep -Po '\d+(?=%)' | head -n 1)" -MUTED="$(pactl get-sink-mute @DEFAULT_SINK@ | grep -Po 'yes|no')" - -if [[ "$1" == "mute" && "$2" == "toggle" ]]; then - # toggle mute - pactl set-sink-mute @DEFAULT_SINK@ toggle - - MSG="Volume muted" - ICON="/usr/share/icons/Tela-circle-manjaro/24/panel/audio-volume-muted-blocking.svg" - if [[ "$MUTED" == "yes" ]]; then - # in this case, we toggle to unmute - MSG="Volume unmuted" - ICON="/usr/share/icons/Tela-circle-manjaro/24/panel/audio-volume-muted.svg" - fi - - notify-send \ - -a "changeVolume" \ - -u normal \ - -t 1500 \ - -i "$ICON" \ - -h string:synchronous:my-progress "$MSG" - - exit 0 -fi - -if [[ "$1" == "volume" ]]; then - # Force unmuting upon changing sound - pactl set-sink-mute "@DEFAULT_SINK@" no - - DIFF="$(echo "$2" | grep -Po "[\+\-]\d+(?=%)")" - - # Round properly - TARGET_VOLUME="$(( (("$VOLUME" / 5) * 5) + "$DIFF" ))" - - # Do not go beyond the boundaries of 0 and 100 - TARGET_VOLUME="$(( 0 <= $TARGET_VOLUME ? $TARGET_VOLUME : 0 ))" - TARGET_VOLUME="$(( $TARGET_VOLUME <= 100 ? $TARGET_VOLUME : 100 ))" - - # set again with properly rounded value - pactl set-sink-volume "@DEFAULT_SINK@" "${TARGET_VOLUME}%" - - # icon to display - ICON="/usr/share/icons/Tela-circle-manjaro/24/panel/audio-volume-low.svg" - if [[ "$TARGET_VOLUME" -ge "33" ]]; then - ICON="/usr/share/icons/Tela-circle-manjaro/24/panel/audio-volume-medium.svg" - fi - if [[ "$TARGET_VOLUME" -ge "66" ]]; then - ICON="/usr/share/icons/Tela-circle-manjaro/24/panel/audio-volume-high.svg" - fi - - # Show the volume notification - notify-send \ - -a "changeVolume" \ - -u normal \ - -t 1500 \ - -i "$ICON" \ - -h string:synchronous:my-progress "Volume: ${TARGET_VOLUME}%" - - # Play the volume changed sound - paplay /usr/share/sounds/freedesktop/stereo/audio-volume-change.oga -fi diff --git a/dot_bash/aliases b/dot_bash/aliases deleted file mode 100644 index 4339c59..0000000 --- a/dot_bash/aliases +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -# override some default commands -alias cp="cp -i" # confirm before overwriting something -alias df='df -h' # human-readable sizes -alias free='free -m' # show sizes in MB -alias np='nano -w PKGBUILD' -alias more=less - -# some more ls aliases -alias ls='ls --color=auto' -alias ll='ls -alF' -alias la='ls -A' -alias l='ls -CF' - -# grep aliases -alias grep='grep --colour=auto' -alias egrep='egrep --colour=auto' -alias fgrep='fgrep --colour=auto' - -# diff color alias -alias diff='diff --color=auto' - -# Mock pbcopy and pbpaste -alias pbcopy='wl-copy' -alias pbpaste='wl-paste' - -# Open file via CLI -alias open='xdg-open' diff --git a/dot_bash/completion b/dot_bash/completion deleted file mode 100644 index 131ce83..0000000 --- a/dot_bash/completion +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -# Source nvm -[ -f /usr/share/nvm/init-nvm.sh ] && source /usr/share/nvm/init-nvm.sh - -# Smart completion for npm commands -if command -v npm &> /dev/null; then - source <(npm completion) -fi - -# Smart completion for composer -# see https://github.com/bamarni/symfony-console-autocomplete -if command -v php &> /dev/null && command -v symfony-autocomplete &> /dev/null; then - source <(symfony-autocomplete) -fi - -# Smart completion for pip -if command -v pip &> /dev/null; then - source <(pip completion --bash) -fi - -# Smart completion for pipx -if command -v pipx &> /dev/null && command -v register-python-argcomplete &> /dev/null; then - eval "$(register-python-argcomplete pipx)" -fi - -# Smart completion for arch-audit -if command -v arch-audit &> /dev/null; then - source <(arch-audit completions bash) -fi - -# Smart completion for op (1password cli client) -if command -v op &> /dev/null; then - source <(op completion bash) -fi - -# Smart completion for op (auto-cpufreq cli client) -if command -v auto-cpufreq &> /dev/null; then - eval "$(_AUTO_CPUFREQ_COMPLETE=bash_source auto-cpufreq)" -fi diff --git a/dot_bash/conf b/dot_bash/conf deleted file mode 100644 index adf7563..0000000 --- a/dot_bash/conf +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -# Don't exit shell on EOF -set -o ignoreeof - - - -## BASH HISTORY -# don't put duplicate lines or lines starting with space in the history. -# See bash(1) for more options -HISTCONTROL=ignoreboth:erasedups - -# append to the history file, don't overwrite it -shopt -s histappend - -# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) -HISTSIZE=-1 -HISTFILESIZE=-1 - - - -# check the window size after each command and, if necessary, -# update the values of LINES and COLUMNS. -shopt -s checkwinsize - - - -# enable programmable completion features (you don't need to enable -# this, if it's already enabled in /etc/bash.bashrc and /etc/profile -# sources /etc/bash.bashrc). -if ! shopt -oq posix; then - if [ -f /usr/share/bash-completion/bash_completion ]; then - . /usr/share/bash-completion/bash_completion - elif [ -f /etc/bash_completion ]; then - . /etc/bash_completion - fi -fi - - - -# Expand alias in non-interactive shells -shopt -s expand_aliases diff --git a/dot_bash/exports b/dot_bash/exports deleted file mode 100644 index 1baaa7f..0000000 --- a/dot_bash/exports +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -# Set default editor -export EDITOR=nvim -# Set default editor for systemd -export SYSTEMD_EDITOR="$EDITOR" - -# Set default browser -export BROWSER=/usr/bin/google-chrome-stable - -# Set default terminal -export TERMINAL=/usr/bin/kitty diff --git a/dot_bash/gpg b/dot_bash/gpg deleted file mode 100644 index 3009779..0000000 --- a/dot_bash/gpg +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -unset SSH_AGENT_PID -if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then - export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)" -fi - -export GPG_TTY=$(tty) -gpg-connect-agent updatestartuptty /bye >/dev/null diff --git a/dot_bash/path b/dot_bash/path deleted file mode 100644 index bbfb5cc..0000000 --- a/dot_bash/path +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -# Add go binaries to PATH -if [[ ! "$PATH" == *"/usr/local/go/bin"* ]]; then - export PATH="${PATH}:/usr/local/go/bin" -fi -if [[ ! "$PATH" == *"${HOME}/go/bin"* ]]; then - export PATH="${PATH}:${HOME}/go/bin" -fi - -# Add PHP executables to PATH -if [[ ! "$PATH" == *"${HOME}/.config/composer/vendor/bin"* ]]; then - export PATH="${PATH}:${HOME}/.config/composer/vendor/bin" -fi -if [[ ! "$PATH" == *"${HOME}/.composer/vendor/bin"* ]]; then - export PATH="${PATH}:${HOME}/.composer/vendor/bin" -fi - -# Add yarn executables to PATH -if [[ ! "$PATH" == *"${HOME}/.yarn/bin"* ]]; then - export PATH="${PATH}:${HOME}/.yarn/bin" -fi - -# Add GEM executables to PATH -GEMPATH="$(ruby -r rubygems -e 'puts Gem.user_dir')/bin" -if [[ ! "$PATH" == *"$GEMPATH"* ]]; then - export PATH="${PATH}:$GEMPATH" -fi - -# Add any custom executables to PATH -if [[ ! "$PATH" == *"${HOME}/bin"* ]]; then - export PATH="${PATH}:${HOME}/bin" -fi diff --git a/dot_bash/prompt b/dot_bash/prompt deleted file mode 100644 index ac9814a..0000000 --- a/dot_bash/prompt +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -# Initialize git helper shell -source /usr/share/git/completion/git-prompt.sh - -GIT_PS1_SHOWDIRTYSTATE="1" -GIT_PS1_SHOWUNTRACKEDFILES="1" -GIT_PS1_SHOWUPSTREAM="auto" -GIT_PS1_SHOWCONFLICTSTATE="yes" -GIT_PS1_DESCRIBE_STYLE="describe" -GIT_PS1_SHOWCOLORHINTS="1" - -PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' diff --git a/dot_bash/scripts b/dot_bash/scripts deleted file mode 100644 index c509a73..0000000 --- a/dot_bash/scripts +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash - -# Quick HTTPBIN server for request inspection -httpbin() { - docker run -it --rm --name httpbin -p "${1:-8080}:80" kennethreitz/httpbin -} - - - -# Synchronize history between bash sessions -# -# Make history from other terminals available to the current one. However, -# don't mix all histories together - make sure that *all* commands from the -# current session are on top of its history, so that pressing up arrow will -# give you most recent command from this session, not from any session. -# -# Since history is saved on each prompt, this additionally protects it from -# terminal crashes. -# -# on every prompt, save new history to dedicated file and recreate full history -# by reading all files, always keeping history from current session on top. -update_history () { - history -a ${HISTFILE}.$$ - history -c - history -r # load common history file - - # load histories of other sessions - for f in `ls ${HISTFILE}.[0-9]* 2>/dev/null | grep -v "${HISTFILE}.$$\$"`; do - history -r $f - done - - history -r "${HISTFILE}.$$" # load current session history -} - -if [[ "$PROMPT_COMMAND" != *update_history* ]]; then - export PROMPT_COMMAND="update_history; $PROMPT_COMMAND" -fi - -# merge session history into main history file on bash exit -merge_session_history () { - if [ -e ${HISTFILE}.$$ ]; then - cat ${HISTFILE}.$$ >> $HISTFILE - rm ${HISTFILE}.$$ - fi -} -trap merge_session_history EXIT - - -# detect leftover files from crashed sessions and merge them back -active_shells=$(pgrep `ps -p $$ -o comm=`) -grep_pattern=`for pid in $active_shells; do echo -n "-e \.${pid}\$ "; done` -orphaned_files=`ls $HISTFILE.[0-9]* 2>/dev/null | grep -v $grep_pattern` - -if [ -n "$orphaned_files" ]; then - echo Merging orphaned history files: - for f in $orphaned_files; do - echo " `basename $f`" - cat $f >> $HISTFILE - rm $f - done - echo "done." -fi diff --git a/dot_bash_logout b/dot_bash_logout deleted file mode 100644 index de4f5f7..0000000 --- a/dot_bash_logout +++ /dev/null @@ -1,7 +0,0 @@ -# ~/.bash_logout: executed by bash(1) when login shell exits. - -# when leaving the console clear the screen to increase privacy - -if [ "$SHLVL" = 1 ]; then - [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q -fi diff --git a/dot_bash_profile b/dot_bash_profile deleted file mode 100644 index 5545f00..0000000 --- a/dot_bash_profile +++ /dev/null @@ -1,5 +0,0 @@ -# -# ~/.bash_profile -# - -[[ -f ~/.bashrc ]] && . ~/.bashrc diff --git a/dot_bashrc b/dot_bashrc deleted file mode 100644 index 5ae288e..0000000 --- a/dot_bashrc +++ /dev/null @@ -1,28 +0,0 @@ -# -# ~/.bashrc -# - -# If not running interactively, don't do anything -[[ $- != *i* ]] && return - -# ------------ -# CUSTOM CONFIGURATION -# ------------ -# Load the rest of the dotfiles -DOTFILES=( - ".bash/exports" - ".bash/path" - ".bash/conf" - ".bash/aliases" - ".bash/scripts" - ".bash/prompt" - ".bash/gpg" - ".bash/completion" - ".localrc" -) -for DOTFILE in ${DOTFILES[@]}; do - FILE="${HOME}/${DOTFILE}" - [ -f "$FILE" ] && source "$FILE" -done - -[ -f ~/.fzf.bash ] && source ~/.fzf.bash diff --git a/dot_cargo/config b/dot_cargo/config deleted file mode 100644 index a42311e..0000000 --- a/dot_cargo/config +++ /dev/null @@ -1,2 +0,0 @@ -[http] -multiplexing = false diff --git a/dot_config/autostart/nm-applet.desktop b/dot_config/autostart/nm-applet.desktop deleted file mode 100644 index 7f55d8f..0000000 --- a/dot_config/autostart/nm-applet.desktop +++ /dev/null @@ -1,158 +0,0 @@ -[Desktop Entry] -Name[af]=NetworkManager-miniprogram -Name[an]=Miniaplicacion Chestor d'o rete -Name[ar]=بريمج مدير الشبكة -Name[as]=NetworkManager এপ্লেট -Name[ast]=Aplicación NetworkManager -Name[be]=Аплет NetworkManager -Name[be@latin]=Aplet NetworkManager -Name[bg]=Аплетът NetworkManager -Name[bn_IN]=NetworkManager অ্যাপ্লেট -Name[bs]=Programče Upravnik mreže -Name[ca]=Miniaplicació NetworkManager -Name[ca@valencia]=Miniaplicació NetworkManager -Name[crh]=NetworkManager Uygulamacığı -Name[cs]=Applet NetworkManager -Name[da]=Panelprogram til Netværkshåndtering -Name[de]=Netzwerk-Manager-Applet -Name[dz]=ཡོངས་འབྲེལ་འཛིན་སྐྱོང་པའི་ཨེཔ་ལེཊི་ -Name[el]=Μικροεφαρμογή NetworkManager -Name[en_CA]=NetworkManager Applet -Name[en_GB]=NetworkManager Applet -Name[eo]=Apleto por NetworkManager -Name[es]=Miniaplicación Gestor de la red -Name[et]=Võrguhalduri rakend -Name[eu]=NetworkManager miniaplikazioa -Name[fa]=برنامک مدیریت شبکه -Name[fi]=Verkon hallinta -sovelma -Name[fr]=Applet NetworkManager -Name[gd]=Aplaid Manaidsear lìonraidh -Name[gl]=Miniaplicación NetworkManager -Name[gu]=NetworkManager એપ્લેટ -Name[he]=יישומון מנהל הרשתות -Name[hi]=नेटवर्कप्रबंधक एप्लेट -Name[hr]=Aplet mrežnog upravitelja -Name[hu]=Hálózatkezelő kisalkalmazás -Name[id]=Aplet NetworkManager -Name[is]=NetworkManager forrit -Name[it]=Applet NetworkManager -Name[ja]=NetworkManager アプレット -Name[kk]=NetworkManager апплеті -Name[km]=អាប់ភ្លេត NetworkManager -Name[kn]=NetworkManager ಆಪ್ಲೆಟ್ -Name[ko]=네트워크 관리 애플릿 -Name[ku]=Sepanoka NetworkManager -Name[lt]=NetworkManager įtaisas -Name[lv]=NetworkManager sīklietotne -Name[mk]=Аплет за менаџирање со мрежи -Name[ml]=NetworkManager ലഘുപ്രയോഗം -Name[mr]=NetworkManager ॲप्लेट -Name[ms]=Aplet NetworkManager -Name[nb]=NetworkManager panelprogram -Name[ne]=सञ्जालप्रबन्धक एप्लेट -Name[nl]=Netwerkbeheer-applet -Name[nn]=Panelprogram for NetworkManager -Name[oc]=Apondon (applet) NetworkManager -Name[or]=ନେଟୱର୍କ ପରିଚାଳକ ଆପଲେଟ -Name[pa]=ਨੈੱਟਵਰਕਮੈਨੇਜਰ ਐਪਲਿਟ -Name[pl]=Aplet NetworkManager -Name[pt]=Aplicação Gestor de redes -Name[pt_BR]=Miniaplicativo gerenciador de redes -Name[ro]=Miniaplicație Administrator de rețea -Name[ru]=Аплет NetworkManager -Name[sk]=Aplet Správca siete -Name[sl]=Aplet upravljalnika omrežja -Name[sr]=Програмче управника мреже -Name[sr@latin]=Programče upravnika mreže -Name[sv]=Miniprogram för nätverkshantering -Name[ta]=பிணைய மேலாளர் அப்லெட் -Name[te]=నెట్‌వర్క్ మ్యానేజర్ ఆప్లెట్ -Name[th]=แอพเพล็ต NetworkManager -Name[tr]=NetworkManager Programcığı -Name[ug]=NetworkManager قوللانچاق -Name[uk]=Аплет NetworkManager -Name[ur]=نیٹ ورک منیجر ایپلیٹ -Name[vi]=Quản lý mạng -Name[zh_CN]=网络管理器小程序 -Name[zh_HK]=NetworkManager 面板程式 -Name[zh_TW]=NetworkManager 面板程式 -Name=NetworkManager Applet -Comment[af]=Bestuur u netwerkverbindings -Comment[an]=Chestione as suyas conexions de rete -Comment[ar]=إدارة اتصالات الشبكة -Comment[as]=আপোনাৰ নেটৱৰ্ক সংযোগসমূহ ব্যৱস্থাপনা কৰক -Comment[ast]=Remana les conexones de rede -Comment[be]=Кіраванне сеткавымі злучэннямі -Comment[bg]=Управление на мрежовите връзки -Comment[bs]=Upravljajte svojim mrežnim vezama -Comment[ca]=Gestioneu les connexions de xarxa -Comment[ca@valencia]=Gestioneu les connexions de xarxa -Comment[crh]=Şebeke bağlantılarıñıznı idare etiñiz -Comment[cs]=Spravujte svá síťová připojení -Comment[da]=Håndtér dine netværksforbindelser -Comment[de]=Verwaltung der Netzwerkverbindungen -Comment[el]=Διαχείριση των συνδέσεων δικτύου -Comment[en_GB]=Manage your network connections -Comment[eo]=Kontroli viajn retkonektojn -Comment[es]=Gestione sus conexiones de red -Comment[et]=Võrguühenduste haldamine -Comment[eu]=Kudeatu sareko konexioak -Comment[fa]=اتصال‌های شبکه خود را مدیریت کنید -Comment[fi]=Hallitse verkkoyhteyksiä -Comment[fr]=Gérer vos connexions réseau -Comment[gd]=Stiùirich na ceanglaichean agad ris an eadar-lìon -Comment[gl]=Xestione as súas conexións de rede -Comment[gu]=તમારા નેટવર્ક જોડાણોને સંચાલિત કરો -Comment[he]=ניהול חיבורי הרשת שלך -Comment[hi]=अपना संजाल कनेक्शन नियंत्रित करें -Comment[hr]=Upravljanje mrežnim povezivanjem -Comment[hu]=Hálózati kapcsolatok kezelése -Comment[id]=Mengelola koneksi jaringan Anda -Comment[is]=Sýsla með nettengingar -Comment[it]=Gestisce le connessioni di rete -Comment[ja]=ネットワーク接続の管理 -Comment[ka]=ქსელური შეერთებების მართვა -Comment[kk]=Желілік байланыстарыңызды басқару -Comment[km]=គ្រប់គ្រង​ការ​តភ្ជាប់បណ្ដាញ​របស់​អ្នក -Comment[ko]=네트워크 연결을 관리합니다 -Comment[ku]=Girêdanên torê yên xwe birêve bike -Comment[lt]=Tvarkyti tinklo ryšius -Comment[lv]=Pārvaldiet savus tīkla savienojumus -Comment[mk]=Менаџирајте со Вашите мрежни врски -Comment[ml]=നിങ്ങളുടെ ശൃംഖല ബന്ധങ്ങള്‍ കൈകാര്യം ചെയ്യുക -Comment[mr]=नेटवर्क जोडणी नियंत्रीत करा -Comment[ms]=Urus sambungan-sambungan rangkaian anda -Comment[nb]=Håndter dine nettverksforbindelser -Comment[nl]=Uw netwerkverbindingen beheren -Comment[nn]=Handsam nettverkstilkoplingane -Comment[oc]=Gerir la connexions a la ret -Comment[pa]=ਆਪਣੇ ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨਾਂ ਦਾ ਪਰਬੰਧ ਕਰੋ -Comment[pl]=Zarządzanie połączeniami sieciowymi -Comment[pt]=Controle as suas ligações de rede -Comment[pt_BR]=Controle suas conexões de rede -Comment[ro]=Gestionează conexiunile la rețea -Comment[ru]=Управление сетевыми соединениями -Comment[sk]=Spravuje vaše sieťové pripojenia -Comment[sl]=Upravljanje omrežnih povezav -Comment[sr]=Управљајте вашим везама мреже -Comment[sr@latin]=Upravljajte vašim vezama mreže -Comment[sv]=Hantera dina nätverksanslutningar -Comment[ta]=உங்களது பிணையத்தின் இணைப்புகளை மேலாண்மை செய்க -Comment[te]=మీ నెట్వర్కు అనుసంధానములను నిర్వహించు -Comment[th]=จัดการการเชื่อมต่อเครือข่ายของคุณ -Comment[tr]=Ağ bağlantılarınızı yönetin -Comment[ug]=تور باغلىنىشلىرىڭىزنى باشقۇرۇڭ -Comment[uk]=Організуйте ваші мережеві з'єднання -Comment[vi]=Quản lý kết nối mạng -Comment[zh_CN]=管理您的网络连接 -Comment[zh_HK]=管理你的網絡連線 -Comment[zh_TW]=管理您的網路連線 -Comment=Manage your network connections -Icon=nm-device-wireless -Exec=nm-applet -Terminal=false -Type=Application -NoDisplay=true -NotShowIn=KDE;GNOME; -X-GNOME-UsesNotifications=true -Hidden=true diff --git a/dot_config/bat/config b/dot_config/bat/config deleted file mode 100644 index cf0267a..0000000 --- a/dot_config/bat/config +++ /dev/null @@ -1,4 +0,0 @@ ---color auto ---tabs 8 ---theme "Monokai Extended" ---wrap auto diff --git a/dot_config/bat/syntaxes/PHP.sublime-syntax b/dot_config/bat/syntaxes/PHP.sublime-syntax deleted file mode 100644 index f3a32a2..0000000 --- a/dot_config/bat/syntaxes/PHP.sublime-syntax +++ /dev/null @@ -1,30 +0,0 @@ -%YAML 1.2 ---- -name: PHP -file_extensions: - - php - - php3 - - php4 - - php5 - - php7 - - phps - - phpt - - phtml -first_line_match: '^(#!.*[^-]php[0-9]?|<\?php)\b' -scope: embedding.php -contexts: - main: - - match: '' - push: scope:text.html.basic - push: - - meta_scope: meta.embedded.block.php - - meta_content_scope: source.php - - include: php-end-tag-pop - - include: scope:source.php - - php-end-tag-pop: - - match: (\?>)(\s*\n)? - captures: - 1: punctuation.section.embedded.end.php - 2: meta.html-newline-after-php.php - pop: true diff --git a/dot_config/ctags/default.ctags b/dot_config/ctags/default.ctags deleted file mode 100644 index f744653..0000000 --- a/dot_config/ctags/default.ctags +++ /dev/null @@ -1,7 +0,0 @@ ---recurse=yes - ---exclude=node_modules ---exclude=*.min.js ---exclude=.git - --f .tags diff --git a/dot_config/dunst/dunstrc b/dot_config/dunst/dunstrc deleted file mode 100644 index b125025..0000000 --- a/dot_config/dunst/dunstrc +++ /dev/null @@ -1,436 +0,0 @@ -# See dunst(5) for all configuration options - -[global] - ### Display ### - - # Which monitor should the notifications be displayed on. - monitor = 0 - - # Display notification on focused monitor. Possible modes are: - # mouse: follow mouse pointer - # keyboard: follow window with keyboard focus - # none: don't follow anything - # - # "keyboard" needs a window manager that exports the - # _NET_ACTIVE_WINDOW property. - # This should be the case for almost all modern window managers. - # - # If this option is set to mouse or keyboard, the monitor option - # will be ignored. - follow = mouse - - ### Geometry ### - - # dynamic width from 0 to 300 - # width = (0, 300) - # constant width of 300 - width = 300 - - # The maximum height of a single notification, excluding the frame. - height = (0, 150) - - # Position the notification in the top right corner - origin = top-right - - # Offset from the origin - offset = (10, 50) - - # Scale factor. It is auto-detected if value is 0. - scale = 0 - - # Maximum number of notification (0 means no limit) - notification_limit = 0 - - ### Progress bar ### - - # Turn on the progess bar. It appears when a progress hint is passed with - # for example dunstify -h int:value:12 - progress_bar = true - - # Set the progress bar height. This includes the frame, so make sure - # it's at least twice as big as the frame width. - progress_bar_height = 10 - - # Set the frame width of the progress bar - progress_bar_frame_width = 1 - - # Set the minimum width for the progress bar - progress_bar_min_width = 150 - - # Set the maximum width for the progress bar - progress_bar_max_width = 300 - - - # Show how many messages are currently hidden (because of - # notification_limit). - indicate_hidden = yes - - # The transparency of the window. Range: [0; 100]. - # This option will only work if a compositing window manager is - # present (e.g. xcompmgr, compiz, etc.). (X11 only) - transparency = 15 - - # Draw a line of "separator_height" pixel height between two - # notifications. - # Set to 0 to disable. - separator_height = 1 - - # Padding between text and separator. - padding = 8 - - # Horizontal padding. - horizontal_padding = 10 - - # Padding between text and icon. - text_icon_padding = 0 - - # Defines width in pixels of frame around the notification window. - # Set to 0 to disable. - frame_width = 0 - - # Defines color of the frame around the notification window. - frame_color = "#788388" - - # Define a color for the separator. - # possible values are: - # * auto: dunst tries to find a color fitting to the background; - # * foreground: use the same color as the foreground; - # * frame: use the same color as the frame; - # * anything else will be interpreted as a X color. - separator_color = "frame" - - # Sort messages by urgency. - sort = yes - - # Don't remove messages, if the user is idle (no mouse or keyboard input) - # for longer than idle_threshold seconds. - # Set to 0 to disable. - # A client can set the 'transient' hint to bypass this. See the rules - # section for how to disable this if necessary - # idle_threshold = 120 - - ### Text ### - - font = Noto Sans 10 - - # The spacing between lines. If the height is smaller than the - # font height, it will get raised to the font height. - line_height = 0 - - # Possible values are: - # full: Allow a small subset of html markup in notifications: - # bold - # italic - # strikethrough - # underline - # - # For a complete reference see - # . - # - # strip: This setting is provided for compatibility with some broken - # clients that send markup even though it's not enabled on the - # server. Dunst will try to strip the markup but the parsing is - # simplistic so using this option outside of matching rules for - # specific applications *IS GREATLY DISCOURAGED*. - # - # no: Disable markup parsing, incoming notifications will be treated as - # plain text. Dunst will not advertise that it has the body-markup - # capability if this is set as a global setting. - # - # It's important to note that markup inside the format option will be parsed - # regardless of what this is set to. - markup = full - - # The format of the message. Possible variables are: - # %a appname - # %s summary - # %b body - # %i iconname (including its path) - # %I iconname (without its path) - # %p progress value if set ([ 0%] to [100%]) or nothing - # %n progress value if set without any extra characters - # %% Literal % - # Markup is allowed - format = "%s %p\n%b" - - # Alignment of message text. - # Possible values are "left", "center" and "right". - alignment = left - - # Vertical alignment of message text and icon. - # Possible values are "top", "center" and "bottom". - vertical_alignment = center - - # Show age of message if message is older than show_age_threshold - # seconds. - # Set to -1 to disable. - show_age_threshold = 60 - - # Specify where to make an ellipsis in long lines. - # Possible values are "start", "middle" and "end". - ellipsize = start - - # Ignore newlines '\n' in notifications. - ignore_newline = no - - # Stack together notifications with the same content - stack_duplicates = true - - # Hide the count of stacked notifications with the same content - hide_duplicate_count = false - - # Display indicators for URLs (U) and actions (A). - show_indicators = yes - - ### Icons ### - - # Align icons left/right/off - icon_position = left - - # Scale small icons up to this size, set to 0 to disable. Helpful - # for e.g. small files or high-dpi screens. In case of conflict, - # max_icon_size takes precedence over this. - min_icon_size = 96 - - # Scale larger icons down to this size, set to 0 to disable - max_icon_size = 128 - - # Paths to default icons. - icon_path = /usr/share/icons/Adwaita/96x96/status/:/usr/share/icons/Adwaita/96x96/devices/ - - ### History ### - - # Should a notification popped up from history be sticky or timeout - # as if it would normally do. - sticky_history = yes - - # Maximum amount of notifications kept in history - history_length = 20 - - ### Misc/Advanced ### - - # dmenu path. - dmenu = /usr/bin/dmenu -p dunst: - - # Browser for opening urls in context menu. - browser = /usr/bin/xdg-open - - # Always run rule-defined scripts, even if the notification is suppressed - always_run_script = true - - # Define the title of the windows spawned by dunst - title = Dunst - - # Define the class of the windows spawned by dunst - class = Dunst - - # Define the corner radius of the notification window - # in pixel size. If the radius is 0, you have no rounded - # corners. - # The radius will be automatically lowered if it exceeds half of the - # notification height to avoid clipping text and/or icons. - corner_radius = 0 - - # Ignore the dbus closeNotification message. - # Useful to enforce the timeout set by dunst configuration. Without this - # parameter, an application may close the notification sent before the - # user defined timeout. - ignore_dbusclose = false - - ### Wayland ### - # These settings are Wayland-specific. They have no effect when using X11 - - # Uncomment this if you want to let notications appear under fullscreen - # applications (default: overlay) - # layer = top - - # Set this to true to use X11 output on Wayland. - force_xwayland = false - - ### Legacy - - # Use the Xinerama extension instead of RandR for multi-monitor support. - # This setting is provided for compatibility with older nVidia drivers that - # do not support RandR and using it on systems that support RandR is highly - # discouraged. - # - # By enabling this setting dunst will not be able to detect when a monitor - # is connected or disconnected which might break follow mode if the screen - # layout changes. - force_xinerama = false - - ### mouse - - # Defines list of actions for each mouse event - # Possible values are: - # * none: Don't do anything. - # * do_action: Invoke the action determined by the action_name rule. If there is no - # such action, open the context menu. - # * open_url: If the notification has exactly one url, open it. If there are multiple - # ones, open the context menu. - # * close_current: Close current notification. - # * close_all: Close all notifications. - # * context: Open context menu for the notification. - # * context_all: Open context menu for all notifications. - # These values can be strung together for each mouse event, and - # will be executed in sequence. - mouse_left_click = close_current - mouse_middle_click = do_action, close_current - mouse_right_click = close_all - -# Experimental features that may or may not work correctly. Do not expect them -# to have a consistent behaviour across releases. -[experimental] - # Calculate the dpi to use on a per-monitor basis. - # If this setting is enabled the Xft.dpi value will be ignored and instead - # dunst will attempt to calculate an appropriate dpi value for each monitor - # using the resolution and physical size. This might be useful in setups - # where there are multiple screens with very different dpi values. - per_monitor_dpi = false - - -[urgency_low] - # IMPORTANT: colors have to be defined in quotation marks. - # Otherwise the "#" and following would be interpreted as a comment. - background = "#263238" - foreground = "#556064" - timeout = 10 - # Icon for notifications with low urgency, uncomment to enable - #new_icon = /path/to/icon - -[urgency_normal] - background = "#263238" - foreground = "#F9FAF9" - timeout = 10 - # Icon for notifications with normal urgency, uncomment to enable - #new_icon = /path/to/icon - -[urgency_critical] - background = "#D62929" - foreground = "#F9FAF9" - frame_color = "#ff0000" - timeout = 0 - # Icon for notifications with critical urgency, uncomment to enable - #new_icon = /path/to/icon - -# Every section that isn't one of the above is interpreted as a rules to -# override settings for certain messages. -# -# Messages can be matched by -# appname (discouraged, see desktop_entry) -# body -# category -# desktop_entry -# icon -# match_transient -# msg_urgency -# stack_tag -# summary -# -# and you can override the -# background -# foreground -# format -# frame_color -# fullscreen -# new_icon -# set_stack_tag -# set_transient -# set_category -# timeout -# urgency -# skip_display -# history_ignore -# action_name -# word_wrap -# ellipsize -# alignment -# -# Shell-like globbing will get expanded. -# -# Instead of the appname filter, it's recommended to use the desktop_entry filter. -# GLib based applications export their desktop-entry name. In comparison to the appname, -# the desktop-entry won't get localized. -# -# SCRIPTING -# You can specify a script that gets run when the rule matches by -# setting the "script" option. -# The script will be called as follows: -# script appname summary body icon urgency -# where urgency can be "LOW", "NORMAL" or "CRITICAL". -# -# NOTE: It might be helpful to run dunst -print in a terminal in order -# to find fitting options for rules. - -# Disable the transient hint so that idle_threshold cannot be bypassed from the -# client -#[transient_disable] -# match_transient = yes -# set_transient = no -# -# Make the handling of transient notifications more strict by making them not -# be placed in history. -#[transient_history_ignore] -# match_transient = yes -# history_ignore = yes - -# fullscreen values -# show: show the notifications, regardless if there is a fullscreen window opened -# delay: displays the new notification, if there is no fullscreen window active -# If the notification is already drawn, it won't get undrawn. -# pushback: same as delay, but when switching into fullscreen, the notification will get -# withdrawn from screen again and will get delayed like a new notification -#[fullscreen_delay_everything] -# fullscreen = delay -#[fullscreen_show_critical] -# msg_urgency = critical -# fullscreen = show - -#[espeak] -# summary = "*" -# script = dunst_espeak.sh - -#[script-test] -# summary = "*script*" -# script = dunst_test.sh - -#[ignore] -# # This notification will not be displayed -# summary = "foobar" -# skip_display = true - -#[history-ignore] -# # This notification will not be saved in history -# summary = "foobar" -# history_ignore = yes - -#[skip-display] -# # This notification will not be displayed, but will be included in the history -# summary = "foobar" -# skip_display = yes - -#[signed_on] -# appname = Pidgin -# summary = "*signed on*" -# urgency = low -# -#[signed_off] -# appname = Pidgin -# summary = *signed off* -# urgency = low -# -#[says] -# appname = Pidgin -# summary = *says* -# urgency = critical -# -#[twitter] -# appname = Pidgin -# summary = *twitter.com* -# urgency = normal -# -#[stack-volumes] -# appname = "some_volume_notifiers" -# set_stack_tag = "volume" -# -# vim: ft=cfg diff --git a/dot_config/hypr/hypridle.conf.tmpl b/dot_config/hypr/hypridle.conf.tmpl deleted file mode 100644 index d475c9e..0000000 --- a/dot_config/hypr/hypridle.conf.tmpl +++ /dev/null @@ -1,48 +0,0 @@ -general { - lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances. - before_sleep_cmd = loginctl lock-session # lock before suspend. - after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display. -} -{{- if gt .hypridle.screen_dim 0 }} - -# dim screen -listener { - timeout = {{ .hypridle.screen_dim }} - on-timeout = brightnessctl -s set 10 # set monitor backlight to minimum, avoid 0 on OLED monitor. - on-resume = brightnessctl -r # monitor backlight restore. -} -{{- end }} -{{- if gt .hypridle.keyboard_backlight_dim 0 }} - -# turn off keyboard backlight, comment out this section if you don't have a keyboard backlight. -listener { - timeout = {{ .hypridle.keyboard_backlight_dim }} - on-timeout = brightnessctl -sd chromeos::kbd_backlight set 1 # turn off keyboard backlight. - on-resume = brightnessctl -rd chromeos::kbd_backlight # turn on keyboard backlight. -} -{{- end }} -{{- if gt .hypridle.screen_lock 0 }} - -# lock screen -listener { - timeout = {{ .hypridle.screen_lock }} - on-timeout = loginctl lock-session # lock screen when timeout has passed -} -{{- end }} -{{- if gt .hypridle.screen_off 0 }} - -# turn off the screen entirely -listener { - timeout = {{ .hypridle.screen_off }} - on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed - on-resume = hyprctl dispatch dpms on && brightnessctl -r # screen on when activity is detected after timeout has fired. -} -{{- end }} -{{- if gt .hypridle.suspend 0 }} - -# suspend the machine -listener { - timeout = {{ .hypridle.suspend }} - on-timeout = systemctl suspend # suspend pc -} -{{- end }} diff --git a/dot_config/hypr/hyprland.conf.tmpl b/dot_config/hypr/hyprland.conf.tmpl deleted file mode 100644 index f1b1b4d..0000000 --- a/dot_config/hypr/hyprland.conf.tmpl +++ /dev/null @@ -1,387 +0,0 @@ -################ -### MONITORS ### -################ - -# See https://wiki.hypr.land/Configuring/Monitors/ - -{{ if .hyprland.primaryMonitorConfig.output -}} -# Primary monitor -monitorv2 { - output = {{ .hyprland.primaryMonitorConfig.output }} - mode = {{ default "preferred" .hyprland.primaryMonitorConfig.mode }} - position = {{ default "auto" .hyprland.primaryMonitorConfig.position }} - scale = {{ default "auto" .hyprland.primaryMonitorConfig.scale }} -} -{{- end }} - -{{- range .hyprland.externalMonitors }} - -{{ if .comment -}} -# {{ .comment }} -{{ end -}} -monitorv2 { - output = {{ .output }} - mode = {{ .mode }} - position = {{ .position }} - scale = {{ .scale }} -} -{{- end }} - -# Sensitive default for arbitrary new monitor -monitor=,preferred,auto,auto - - -################### -### MY PROGRAMS ### -################### - -# See https://wiki.hypr.land/Configuring/Keywords/ - -# Set programs that you use -$terminal = kitty -$fileManager = pcmanfm -$menu = rofi -show drun -drun-show-actions - - -################# -### AUTOSTART ### -################# - -# Autostart necessary processes (like notifications daemons, status bars, etc.) -# Or execute your favorite apps at launch like this: - -# exec-once = $terminal -# exec-once = nm-applet & -# exec-once = waybar & hyprpaper & firefox - - -############################# -### ENVIRONMENT VARIABLES ### -############################# - -# See https://wiki.hypr.land/Configuring/Environment-variables/ - -env = XCURSOR_SIZE,24 -env = HYPRCURSOR_SIZE,24 - - -################### -### PERMISSIONS ### -################### - -# See https://wiki.hypr.land/Configuring/Permissions/ -# Please note permission changes here require a Hyprland restart and are not applied on-the-fly -# for security reasons - -ecosystem { - no_update_news = 1 - no_donation_nag = 1 - # enforce_permissions = 1 -} - -# permission = /usr/(bin|local/bin)/grim, screencopy, allow -# permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow -# permission = /usr/(bin|local/bin)/hyprpm, plugin, allow - - -##################### -### LOOK AND FEEL ### -##################### - -# Refer to https://wiki.hypr.land/Configuring/Variables/ - -# https://wiki.hypr.land/Configuring/Variables/#general -general { - gaps_in = 5 - gaps_out = 20 - - border_size = 2 - - # https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors - col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg - col.inactive_border = rgba(595959aa) - - # Set to true enable resizing windows by clicking and dragging on borders and gaps - resize_on_border = false - - # Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on - allow_tearing = false - - layout = dwindle -} - -# https://wiki.hypr.land/Configuring/Variables/#decoration -decoration { - rounding = 10 - rounding_power = 2 - - # Change transparency of focused and unfocused windows - active_opacity = 1.0 - inactive_opacity = 1.0 - - shadow { - enabled = true - range = 4 - render_power = 3 - color = rgba(1a1a1aee) - } - - # https://wiki.hypr.land/Configuring/Variables/#blur - blur { - enabled = true - size = 3 - passes = 1 - - vibrancy = 0.1696 - } -} - -# https://wiki.hypr.land/Configuring/Variables/#animations -animations { - enabled = true - - # Default animations, see https://wiki.hypr.land/Configuring/Animations/ for more - - bezier = easeOutQuint,0.23,1,0.32,1 - bezier = easeInOutCubic,0.65,0.05,0.36,1 - bezier = linear,0,0,1,1 - bezier = almostLinear,0.5,0.5,0.75,1.0 - bezier = quick,0.15,0,0.1,1 - - animation = global, 1, 10, default - animation = border, 1, 5.39, easeOutQuint - animation = windows, 1, 4.79, easeOutQuint - animation = windowsIn, 1, 4.1, easeOutQuint, popin 87% - animation = windowsOut, 1, 1.49, linear, popin 87% - animation = fadeIn, 1, 1.73, almostLinear - animation = fadeOut, 1, 1.46, almostLinear - animation = fade, 1, 3.03, quick - animation = layers, 1, 3.81, easeOutQuint - animation = layersIn, 1, 4, easeOutQuint, fade - animation = layersOut, 1, 1.5, linear, fade - animation = fadeLayersIn, 1, 1.79, almostLinear - animation = fadeLayersOut, 1, 1.39, almostLinear - animation = workspaces, 1, 1.94, almostLinear, fade - animation = workspacesIn, 1, 1.21, almostLinear, fade - animation = workspacesOut, 1, 1.94, almostLinear, fade -} - -# Ref https://wiki.hypr.land/Configuring/Workspace-Rules/ -# "Smart gaps" / "No gaps when only" -workspace = w[tv1], gapsout:9, gapsin:0 -workspace = f[1], gapsout:0, gapsin:0 -windowrule { - name = smartgaps1 - - match:workspace = w[tv1] - - rounding = 10 - -} -windowrule { - name = smartgaps2 - - match:workspace = w[tv1] - - border_size = 2 -} -windowrule { - name = smartgaps3 - - match:workspace = f[1] - - border_size = 0 -} -windowrule { - name = smartgaps4 - - match:workspace = f[1] - - rounding = 0 -} - -# See https://wiki.hypr.land/Configuring/Dwindle-Layout/ for more -dwindle { - preserve_split = true # You probably want this -} - -# See https://wiki.hypr.land/Configuring/Master-Layout/ for more -master { - new_status = master -} - -# https://wiki.hypr.land/Configuring/Variables/#misc -misc { - force_default_wallpaper = 0 # Set to 0 or 1 to disable the anime mascot wallpapers - disable_hyprland_logo = true # If true disables the random hyprland logo / anime girl background. -} - - -############# -### INPUT ### -############# - -# https://wiki.hypr.land/Configuring/Variables/#input -input { - kb_layout = us,de - kb_variant = - kb_model = - kb_options = - kb_rules = - - follow_mouse = 1 - - sensitivity = 0 # -1.0 - 1.0, 0 means no modification. - - touchpad { - natural_scroll = true - } -} - -# See https://wiki.hypr.land/Configuring/Gestures -gesture = 3, horizontal, workspace - -# Example per-device config -# See https://wiki.hypr.land/Configuring/Keywords/#per-device-input-configs for more -device { - name = epic-mouse-v1 - sensitivity = -0.5 -} - - -################### -### KEYBINDINGS ### -################### - -# See https://wiki.hypr.land/Configuring/Keywords/ -$mainMod = ALT - -# Example binds, see https://wiki.hypr.land/Configuring/Binds/ for more -bind = $mainMod, Q, exec, $terminal -bind = $mainMod, C, killactive, -bind = $mainMod, M, exec, hyprshutdown -bind = $mainMod, E, exec, $fileManager -bind = $mainMod SHIFT, E, exec, kitty ranger -bind = $mainMod, V, togglefloating, -bind = $mainMod, R, exec, $menu -bind = $mainMod, P, pseudo, # dwindle -# bind = $mainMod, J, togglesplit, # dwindle -bind = $mainMod, F, fullscreen, 1 # toggle fullscreen for active window - -# Move focus with mainMod + arrow keys -bind = $mainMod, left, movefocus, l -bind = $mainMod, right, movefocus, r -bind = $mainMod, up, movefocus, u -bind = $mainMod, down, movefocus, d - -# Switch workspaces with mainMod + [0-9] -bind = $mainMod, 1, workspace, 1 -bind = $mainMod, 2, workspace, 2 -bind = $mainMod, 3, workspace, 3 -bind = $mainMod, 4, workspace, 4 -bind = $mainMod, 5, workspace, 5 -bind = $mainMod, 6, workspace, 6 -bind = $mainMod, 7, workspace, 7 -bind = $mainMod, 8, workspace, 8 -bind = $mainMod, 9, workspace, 9 -bind = $mainMod, 0, workspace, 10 - -# Move active window to a workspace with mainMod + SHIFT + [0-9] -bind = $mainMod SHIFT, 1, movetoworkspace, 1 -bind = $mainMod SHIFT, 2, movetoworkspace, 2 -bind = $mainMod SHIFT, 3, movetoworkspace, 3 -bind = $mainMod SHIFT, 4, movetoworkspace, 4 -bind = $mainMod SHIFT, 5, movetoworkspace, 5 -bind = $mainMod SHIFT, 6, movetoworkspace, 6 -bind = $mainMod SHIFT, 7, movetoworkspace, 7 -bind = $mainMod SHIFT, 8, movetoworkspace, 8 -bind = $mainMod SHIFT, 9, movetoworkspace, 9 -bind = $mainMod SHIFT, 0, movetoworkspace, 10 - -# Move active window to a workspace without switching to the new workspace with mainMod + CTRL + SHIFT + [0-9] -bind = $mainMod CTRL SHIFT, 1, movetoworkspacesilent, 1 -bind = $mainMod CTRL SHIFT, 2, movetoworkspacesilent, 2 -bind = $mainMod CTRL SHIFT, 3, movetoworkspacesilent, 3 -bind = $mainMod CTRL SHIFT, 4, movetoworkspacesilent, 4 -bind = $mainMod CTRL SHIFT, 5, movetoworkspacesilent, 5 -bind = $mainMod CTRL SHIFT, 6, movetoworkspacesilent, 6 -bind = $mainMod CTRL SHIFT, 7, movetoworkspacesilent, 7 -bind = $mainMod CTRL SHIFT, 8, movetoworkspacesilent, 8 -bind = $mainMod CTRL SHIFT, 9, movetoworkspacesilent, 9 -bind = $mainMod CTRL SHIFT, 0, movetoworkspacesilent, 10 - -# Example special workspace (scratchpad) -bind = $mainMod, S, togglespecialworkspace, magic -bind = $mainMod SHIFT, S, movetoworkspace, special:magic - -# Scroll through existing workspaces with mainMod + scroll -bind = $mainMod, mouse_down, workspace, e+1 -bind = $mainMod, mouse_up, workspace, e-1 - -# Move/resize windows with mainMod + LMB/RMB and dragging -bindm = $mainMod, mouse:272, movewindow -bindm = $mainMod, mouse:273, resizewindow - -# Laptop multimedia keys for volume and LCD brightness -bindel = ,XF86AudioRaiseVolume, exec, ~/bin/sound.sh "volume" "+5%" -bindel = ,XF86AudioLowerVolume, exec, ~/bin/sound.sh "volume" "-5%" -bindel = ,XF86AudioMute, exec, ~/bin/sound.sh "mute" "toggle" -bindel = ,XF86AudioMicMute, exec, ~/bin/sound.sh "mute" "toggle" -bindel = ,XF86MonBrightnessUp, exec, ~/bin/backlight.sh "+5%" -bindel = ,XF86MonBrightnessDown, exec, ~/bin/backlight.sh "-5%" - -# Requires playerctl -bindl = , XF86AudioNext, exec, playerctl next -bindl = , XF86AudioPause, exec, playerctl play-pause -bindl = , XF86AudioPlay, exec, playerctl play-pause -bindl = , XF86AudioPrev, exec, playerctl previous - -# Other XF86 key bindings -bindl = , XF86RFKill, exec, ~/bin/rfkill-toggle.sh - -# Bindings for making screenshots -bind = , Print, exec, grimblast --notify save area "$(xdg-user-dir PICTURES)/$(date --utc '+%F_%H.%M.%S').png" -bind = $mainMod, Print, exec, grimblast --notify copy area -bind = CTRL, Print, exec, grimblast --notify save active "$(xdg-user-dir PICTURES)/$(date --utc '+%F_%H.%M.%S').png" -bind = $mainMod CTRL, Print, exec, grimblast --notify copy active - - -############################## -### WINDOWS AND WORKSPACES ### -############################## - -# See https://wiki.hypr.land/Configuring/Window-Rules/ for more -# See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules - -# Example windowrule -windowrule { - name = kitty - - match:class = ^(kitty)$,title:^(kitty)$ - - float = on -} - -# Ignore maximize requests from apps. You'll probably like this. -windowrule { - name = suppressevent - - match:class = .* - - suppress_event = maximize -} - - -# Fix some dragging issues with XWayland -windowrule { - name = xwayland_fix - - match:class = ^$ - match:title = ^$ - match:xwayland = true - match:pin = false - - float = true - fullscreen = false - no_focus = true -} diff --git a/dot_config/hypr/hyprlock.conf.tmpl b/dot_config/hypr/hyprlock.conf.tmpl deleted file mode 100644 index 1fb51b7..0000000 --- a/dot_config/hypr/hyprlock.conf.tmpl +++ /dev/null @@ -1,106 +0,0 @@ -# Refer https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock -$font = Monospace - -general { - hide_cursor = false - ignore_empty_input = true - immediate_render = false - text_trim = true - screencopy_mode = 0 - fail_timeout = 2000 # 2 seconds -} - -auth { - pam { - enabled = true - module = hyprlock - } - {{- if .hyprlock.fingerprint_enabled }} - fingerprint { - enabled = true - ready_message = Scan fingerprint to unlock or enter password - present_message = Scanning... - retry_delay = 250 # in milliseconds - } - {{- end }} -} - -animations { - enabled = true - bezier = linear, 1, 1, 0, 0 - animation = fadeIn, 1, 5, linear - animation = fadeOut, 1, 5, linear - animation = inputFieldDots, 1, 2, linear -} - -background { - monitor = - path = screenshot - blur_passes = 3 -} - -input-field { - monitor = - size = 20%, 5% - outline_thickness = 3 - inner_color = rgba(0, 0, 0, 0.0) # no fill - - outer_color = rgba(33ccffee) rgba(00ff99ee) 45deg - check_color = rgba(00ff99ee) rgba(ff6633ee) 120deg - fail_color = rgba(ff6633ee) rgba(ff0066ee) 40deg - - font_color = rgb(143, 143, 143) - fade_on_empty = false - rounding = 15 - - font_family = $font - placeholder_text = {{ if .hyprlock.fingerprint_enabled -}} $FPRINTPROMPT {{- else -}} $PAMPROMPT {{- end }} - fail_text = {{ if .hyprlock.fingerprint_enabled -}} $FPRINTFAIL {{ end -}} $PAMFAIL - - # uncomment to use a letter instead of a dot to indicate the typed password - # dots_text_format = * - # dots_size = 0.4 - dots_spacing = 0.3 - - # uncomment to use an input indicator that does not show the password length (similar to swaylock's input indicator) - # hide_input = true - - position = 0, -20 - halign = center - valign = center -} - -# TIME -label { - monitor = - text = $TIME # ref. https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock/#variable-substitution - font_size = 90 - font_family = $font - - position = -30, 0 - halign = right - valign = top -} - -# DATE -label { - monitor = - text = cmd[update:60000] date +"%A, %d %B %Y" # update every 60 seconds - font_size = 25 - font_family = $font - - position = -30, -150 - halign = right - valign = top -} - -label { - monitor = - text = $LAYOUT[en,de] - font_size = 24 - onclick = hyprctl switchxkblayout all next - - position = 0, 80 - halign = center - valign = center -} diff --git a/dot_config/hypr/hyprpaper.conf b/dot_config/hypr/hyprpaper.conf deleted file mode 100644 index 04eafbd..0000000 --- a/dot_config/hypr/hyprpaper.conf +++ /dev/null @@ -1,6 +0,0 @@ -splash = false -wallpaper { - monitor = - path = ~/.config/hypr/screensaver.jpeg - fit_mode = cover -} diff --git a/dot_config/hypr/xdph.conf b/dot_config/hypr/xdph.conf deleted file mode 100644 index 242dd64..0000000 --- a/dot_config/hypr/xdph.conf +++ /dev/null @@ -1,3 +0,0 @@ -screencopy { - allow_token_by_default = true -} diff --git a/dot_config/mimeapps.list b/dot_config/mimeapps.list deleted file mode 100644 index c46a4df..0000000 --- a/dot_config/mimeapps.list +++ /dev/null @@ -1,46 +0,0 @@ -[Default Applications] -x-scheme-handler/http=brave-browser.desktop -x-scheme-handler/https=brave-browser.desktop -x-scheme-handler/ftp=brave-browser.desktop -text/html=brave-browser.desktop -application/x-extension-htm=brave-browser.desktop -application/x-extension-html=brave-browser.desktop -application/x-extension-shtml=brave-browser.desktop -application/xhtml+xml=brave-browser.desktop -application/x-extension-xhtml=brave-browser.desktop -application/x-extension-xht=brave-browser.desktop -image/jpeg=viewnior.desktop;gpicview.desktop; -image/png=viewnior.desktop;gpicview.desktop; -text/plain=mousepad.desktop -x-scheme-handler/mailto=brave-browser.desktop -message/rfc822=userapp-Thunderbird-829TE1.desktop -application/pdf=brave-browser.desktop -x-scheme-handler/webcal=brave-browser.desktop -x-scheme-handler/feed=thunderbird.desktop -application/rss+xml=thunderbird.desktop -application/x-extension-rss=thunderbird.desktop -x-scheme-handler/postman=Postman.desktop -x-scheme-handler/mid=userapp-Thunderbird-829TE1.desktop - -[Added Associations] -x-scheme-handler/http=brave-browser.desktop; -x-scheme-handler/https=brave-browser.desktop; -x-scheme-handler/ftp=brave-browser.desktop; -text/html=brave-browser.desktop; -application/x-extension-htm=brave-browser.desktop; -application/x-extension-html=brave-browser.desktop; -application/x-extension-shtml=brave-browser.desktop; -application/xhtml+xml=brave-browser.desktop; -application/x-extension-xhtml=brave-browser.desktop; -application/x-extension-xht=brave-browser.desktop; -image/jpeg=viewnior.desktop;gpicview.desktop; -image/png=viewnior.desktop;gpicview.desktop; -text/plain=mousepad.desktop; -x-scheme-handler/mailto=thunderbird.desktop;userapp-Thunderbird-829TE1.desktop; -message/rfc822=thunderbird.desktop; -application/pdf=epdfview.desktop;brave-browser.desktop; -x-scheme-handler/feed=thunderbird.desktop; -application/rss+xml=thunderbird.desktop; -application/x-extension-rss=thunderbird.desktop; -x-scheme-handler/mid=userapp-Thunderbird-829TE1.desktop; -application/x-ole-storage=org.mozilla.Thunderbird.desktop; diff --git a/dot_config/pgcli/config b/dot_config/pgcli/config deleted file mode 100644 index df0f751..0000000 --- a/dot_config/pgcli/config +++ /dev/null @@ -1,186 +0,0 @@ -# vi: ft=dosini -[main] - -# Enables context sensitive auto-completion. If this is disabled the all -# possible completions will be listed. -smart_completion = True - -# Display the completions in several columns. (More completions will be -# visible.) -wider_completion_menu = True - -# Multi-line mode allows breaking up the sql statements into multiple lines. If -# this is set to True, then the end of the statements must have a semi-colon. -# If this is set to False then sql statements can't be split into multiple -# lines. End of line (return) is considered as the end of the statement. -multi_line = True - -# If multi_line_mode is set to "psql", in multi-line mode, [Enter] will execute -# the current input if the input ends in a semicolon. -# If multi_line_mode is set to "safe", in multi-line mode, [Enter] will always -# insert a newline, and [Esc] [Enter] or [Alt]-[Enter] must be used to execute -# a command. -multi_line_mode = psql - -# Destructive warning mode will alert you before executing a sql statement -# that may cause harm to the database such as "drop table", "drop database" -# or "shutdown". -destructive_warning = True - -# Enables expand mode, which is similar to `\x` in psql. -expand = False - -# Enables auto expand mode, which is similar to `\x auto` in psql. -auto_expand = True - -# If set to True, table suggestions will include a table alias -generate_aliases = False - -# log_file location. -# In Unix/Linux: ~/.config/pgcli/log -# In Windows: %USERPROFILE%\AppData\Local\dbcli\pgcli\log -# %USERPROFILE% is typically C:\Users\{username} -log_file = default - -# keyword casing preference. Possible values "lower", "upper", "auto" -keyword_casing = auto - -# casing_file location. -# In Unix/Linux: ~/.config/pgcli/casing -# In Windows: %USERPROFILE%\AppData\Local\dbcli\pgcli\casing -# %USERPROFILE% is typically C:\Users\{username} -casing_file = default - -# If generate_casing_file is set to True and there is no file in the above -# location, one will be generated based on usage in SQL/PLPGSQL functions. -generate_casing_file = False - -# Casing of column headers based on the casing_file described above -case_column_headers = True - -# history_file location. -# In Unix/Linux: ~/.config/pgcli/history -# In Windows: %USERPROFILE%\AppData\Local\dbcli\pgcli\history -# %USERPROFILE% is typically C:\Users\{username} -history_file = default - -# Default log level. Possible values: "CRITICAL", "ERROR", "WARNING", "INFO" -# and "DEBUG". "NONE" disables logging. -log_level = INFO - -# Order of columns when expanding * to column list -# Possible values: "table_order" and "alphabetic" -asterisk_column_order = table_order - -# Whether to qualify with table alias/name when suggesting columns -# Possible values: "always", never" and "if_more_than_one_table" -qualify_columns = if_more_than_one_table - -# When no schema is entered, only suggest objects in search_path -search_path_filter = False - -# Default pager. -# By default 'PAGER' environment variable is used -# pager = less -SRXF - -# Timing of sql statments and table rendering. -timing = True - -# Table format. Possible values: psql, plain, simple, grid, fancy_grid, pipe, -# ascii, double, github, orgtbl, rst, mediawiki, html, latex, latex_booktabs, -# textile, moinmoin, jira, vertical, tsv, csv. -# Recommended: psql, fancy_grid and grid. -table_format = psql - -# Syntax Style. Possible values: manni, igor, xcode, vim, autumn, vs, rrt, -# native, perldoc, borland, tango, emacs, friendly, monokai, paraiso-dark, -# colorful, murphy, bw, pastie, paraiso-light, trac, default, fruity -syntax_style = monokai - -# Keybindings: -# When Vi mode is enabled you can use modal editing features offered by Vi in the REPL. -# When Vi mode is disabled emacs keybindings such as Ctrl-A for home and Ctrl-E -# for end are available in the REPL. -vi = True - -# Error handling -# When one of multiple SQL statements causes an error, choose to either -# continue executing the remaining statements, or stopping -# Possible values "STOP" or "RESUME" -on_error = STOP - -# Set threshold for row limit prompt. Use 0 to disable prompt. -row_limit = 1000 - -# Skip intro on startup and goodbye on exit -less_chatty = False - -# Postgres prompt -# \t - Current date and time -# \u - Username -# \h - Short hostname of the server (up to first '.') -# \H - Hostname of the server -# \d - Database name -# \p - Database port -# \i - Postgres PID -# \# - "@" sign if logged in as superuser, '>' in other case -# \n - Newline -# \dsn_alias - name of dsn alias if -D option is used (empty otherwise) -prompt = '\t \u@\H:\d> ' - -# Number of lines to reserve for the suggestion menu -min_num_menu_lines = 4 - -# Character used to left pad multi-line queries to match the prompt size. -multiline_continuation_char = '' - -# The string used in place of a null value. -null_string = '' - -# manage pager on startup -enable_pager = True - -# Use keyring to automatically save and load password in a secure manner -keyring = True - -# Custom colors for the completion menu, toolbar, etc. -[colors] -completion-menu.completion.current = 'bg:#ffffff #000000' -completion-menu.completion = 'bg:#008888 #ffffff' -completion-menu.meta.completion.current = 'bg:#44aaaa #000000' -completion-menu.meta.completion = 'bg:#448888 #ffffff' -completion-menu.multi-column-meta = 'bg:#aaffff #000000' -scrollbar.arrow = 'bg:#003333' -scrollbar = 'bg:#00aaaa' -selected = '#ffffff bg:#6666aa' -search = '#ffffff bg:#4444aa' -search.current = '#ffffff bg:#44aa44' -bottom-toolbar = 'bg:#222222 #aaaaaa' -bottom-toolbar.off = 'bg:#222222 #888888' -bottom-toolbar.on = 'bg:#222222 #ffffff' -search-toolbar = 'noinherit bold' -search-toolbar.text = 'nobold' -system-toolbar = 'noinherit bold' -arg-toolbar = 'noinherit bold' -arg-toolbar.text = 'nobold' -bottom-toolbar.transaction.valid = 'bg:#222222 #00ff5f bold' -bottom-toolbar.transaction.failed = 'bg:#222222 #ff005f bold' - -# style classes for colored table output -output.header = "#00ff5f bold" -output.odd-row = "" -output.even-row = "" - -# Named queries are queries you can execute by name. -[named queries] - -# DSN to call by -D option -[alias_dsn] -# example_dsn = postgresql://[user[:password]@][netloc][:port][/dbname] - -# Format for number representation -# for decimal "d" - 12345678, ",d" - 12,345,678 -# for float "g" - 123456.78, ",g" - 123,456.78 -[data_formats] -decimal = "" -float = "" diff --git a/dot_config/private_user-dirs.dirs b/dot_config/private_user-dirs.dirs deleted file mode 100644 index 7f9a959..0000000 --- a/dot_config/private_user-dirs.dirs +++ /dev/null @@ -1,15 +0,0 @@ -# This file is written by xdg-user-dirs-update -# If you want to change or add directories, just edit the line you're -# interested in. All local changes will be retained on the next run. -# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped -# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an -# absolute path. No other format is supported. -# -XDG_DESKTOP_DIR="$HOME/Desktop" -XDG_DOWNLOAD_DIR="$HOME/Downloads" -XDG_TEMPLATES_DIR="$HOME/Templates" -XDG_PUBLICSHARE_DIR="$HOME/Public" -XDG_DOCUMENTS_DIR="$HOME/Documents" -XDG_MUSIC_DIR="$HOME/Music" -XDG_PICTURES_DIR="$HOME/Pictures" -XDG_VIDEOS_DIR="$HOME/Videos" diff --git a/dot_config/ranger/commands.py b/dot_config/ranger/commands.py deleted file mode 100644 index 60d8676..0000000 --- a/dot_config/ranger/commands.py +++ /dev/null @@ -1,38 +0,0 @@ -from ranger.api.commands import Command - -class paste_as_root(Command): - def execute(self): - if self.fm.do_cut: - self.fm.execute_console('shell sudo mv %c .') - else: - self.fm.execute_console('shell sudo cp -r %c .') - -class fzf_select(Command): - """ - :fzf_select - - Find a file using fzf. - - With a prefix argument select only directories. - - See: https://github.com/junegunn/fzf - """ - def execute(self): - import subprocess - import os.path - if self.quantifier: - # match only directories - command="find -L . \( -path '*/\.*' -o -fstype 'dev' -o -fstype 'proc' \) -prune \ - -o -type d -print 2> /dev/null | sed 1d | cut -b3- | fzf +m --reverse --header='Jump to file'" - else: - # match files and directories - command="find -L . \( -path '*/\.*' -o -fstype 'dev' -o -fstype 'proc' \) -prune \ - -o -print 2> /dev/null | sed 1d | cut -b3- | fzf +m --reverse --header='Jump to filemap fzf_select'" - fzf = self.fm.execute_command(command, universal_newlines=True, stdout=subprocess.PIPE) - stdout, stderr = fzf.communicate() - if fzf.returncode == 0: - fzf_file = os.path.abspath(stdout.rstrip('\n')) - if os.path.isdir(fzf_file): - self.fm.cd(fzf_file) - else: - self.fm.select_file(fzf_file) \ No newline at end of file diff --git a/dot_config/ranger/devicons.py b/dot_config/ranger/devicons.py deleted file mode 100644 index 216c673..0000000 --- a/dot_config/ranger/devicons.py +++ /dev/null @@ -1,219 +0,0 @@ -#!/usr/bin/python -# coding=UTF-8 -# These glyphs, and the mapping of file extensions to glyphs -# has been copied from the vimscript code that is present in -# https://github.com/ryanoasis/vim-devicons -import re; -import os; - -# all those glyphs will show as weird squares if you don't have the correct patched font -# My advice is to use NerdFonts which can be found here: -# https://github.com/ryanoasis/nerd-fonts -file_node_extensions = { - '7z' : '', - 'ai' : '', - 'apk' : '', - 'avi' : '', - 'bat' : '', - 'bmp' : '', - 'bz2' : '', - 'c' : '', - 'c++' : '', - 'cab' : '', - 'cc' : '', - 'clj' : '', - 'cljc' : '', - 'cljs' : '', - 'coffee' : '', - 'conf' : '', - 'cp' : '', - 'cpio' : '', - 'cpp' : '', - 'css' : '', - 'cxx' : '', - 'd' : '', - 'dart' : '', - 'db' : '', - 'deb' : '', - 'diff' : '', - 'dump' : '', - 'edn' : '', - 'ejs' : '', - 'epub' : '', - 'erl' : '', - 'f#' : '', - 'fish' : '', - 'flac' : '', - 'flv' : '', - 'fs' : '', - 'fsi' : '', - 'fsscript' : '', - 'fsx' : '', - 'gem' : '', - 'gif' : '', - 'go' : '', - 'gz' : '', - 'gzip' : '', - 'hbs' : '', - 'hrl' : '', - 'hs' : '', - 'htm' : '', - 'html' : '', - 'ico' : '', - 'ini' : '', - 'java' : '', - 'jl' : '', - 'jpeg' : '', - 'jpg' : '', - 'js' : '', - 'json' : '', - 'jsx' : '', - 'less' : '', - 'lha' : '', - 'lhs' : '', - 'log' : '', - 'lua' : '', - 'lzh' : '', - 'lzma' : '', - 'markdown' : '', - 'md' : '', - 'mkv' : '', - 'ml' : 'λ', - 'mli' : 'λ', - 'mov' : '', - 'mp3' : '', - 'mp4' : '', - 'mpeg' : '', - 'mpg' : '', - 'mustache' : '', - 'ogg' : '', - 'pdf' : '', - 'php' : '', - 'pl' : '', - 'pm' : '', - 'png' : '', - 'psb' : '', - 'psd' : '', - 'py' : '', - 'pyc' : '', - 'pyd' : '', - 'pyo' : '', - 'rar' : '', - 'rb' : '', - 'rc' : '', - 'rlib' : '', - 'rpm' : '', - 'rs' : '', - 'rss' : '', - 'scala' : '', - 'scss' : '', - 'sh' : '', - 'slim' : '', - 'sln' : '', - 'sql' : '', - 'styl' : '', - 'suo' : '', - 't' : '', - 'tar' : '', - 'tgz' : '', - 'ts' : '', - 'twig' : '', - 'vim' : '', - 'vimrc' : '', - 'wav' : '', - 'xml' : '', - 'xul' : '', - 'xz' : '', - 'yml' : '', - 'zip' : '', -} - -dir_node_exact_matches = { -# English - '.git' : '', - 'Desktop' : '', - 'Documents' : '', - 'Downloads' : '', - 'Dropbox' : '', - 'Music' : '', - 'Pictures' : '', - 'Public' : '', - 'Templates' : '', - 'Videos' : '', -# French - 'Bureau' : '', - 'Documents' : '', - 'Images' : '', - 'Musique' : '', - 'Publique' : '', - 'Téléchargements' : '', - 'Vidéos' : '', -# Portuguese - 'Documentos' : '', - 'Imagens' : '', - 'Modelos' : '', - 'Música' : '', - 'Público' : '', - 'Vídeos' : '', - 'Área de trabalho' : '', -# Italian - 'Documenti' : '', - 'Immagini' : '', - 'Modelli' : '', - 'Musica' : '', - 'Pubblici' : '', - 'Scaricati' : '', - 'Scrivania' : '', - 'Video' : '', -# German - 'Bilder' : '', - 'Dokumente' : '', - 'Musik' : '', - 'Schreibtisch' : '', - 'Vorlagen' : '', - 'Öffentlich' : '', -} - -file_node_exact_matches = { - '.Xdefaults' : '', - '.Xresources' : '', - '.bashprofile' : '', - '.bashrc' : '', - '.dmrc' : '', - '.ds_store' : '', - '.fasd' : '', - '.gitconfig' : '', - '.gitignore' : '', - '.jack-settings' : '', - '.mime.types' : '', - '.nvidia-settings-rc' : '', - '.pam_environment' : '', - '.profile' : '', - '.recently-used' : '', - '.selected_editor' : '', - '.vimrc' : '', - '.xinputrc' : '', - 'config' : '', - 'dropbox' : '', - 'exact-match-case-sensitive-1.txt' : 'X1', - 'exact-match-case-sensitive-2' : 'X2', - 'favicon.ico' : '', - 'gruntfile.coffee' : '', - 'gruntfile.js' : '', - 'gruntfile.ls' : '', - 'gulpfile.coffee' : '', - 'gulpfile.js' : '', - 'gulpfile.ls' : '', - 'ini' : '', - 'ledger' : '', - 'license' : '', - 'mimeapps.list' : '', - 'node_modules' : '', - 'procfile' : '', - 'react.jsx' : '', - 'user-dirs.dirs' : '', -} - -def devicon(file): - if file.is_directory: return dir_node_exact_matches.get(file.relative_path, '') - return file_node_exact_matches.get(file.relative_path, file_node_extensions.get(file.extension, '')) \ No newline at end of file diff --git a/dot_config/ranger/executable_scope.sh b/dot_config/ranger/executable_scope.sh deleted file mode 100644 index 98515e0..0000000 --- a/dot_config/ranger/executable_scope.sh +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env sh -# ranger supports enhanced previews. If the option "use_preview_script" -# is set to True and this file exists, this script will be called and its -# output is displayed in ranger. ANSI color codes are supported. - -# NOTES: This script is considered a configuration file. If you upgrade -# ranger, it will be left untouched. (You must update it yourself.) -# Also, ranger disables STDIN here, so interactive scripts won't work properly - -# Meanings of exit codes: -# code | meaning | action of ranger -# -----+------------+------------------------------------------- -# 0 | success | success. display stdout as preview -# 1 | no preview | failure. display no preview at all -# 2 | plain text | display the plain content of the file -# 3 | fix width | success. Don't reload when width changes -# 4 | fix height | success. Don't reload when height changes -# 5 | fix both | success. Don't ever reload -# 6 | image | success. display the image $cached points to as an image preview -# 7 | image | success. display the file directly as an image - -# Meaningful aliases for arguments: -path="$1" # Full path of the selected file -width="$2" # Width of the preview pane (number of fitting characters) -height="$3" # Height of the preview pane (number of fitting characters) -cached="$4" # Path that should be used to cache image previews -preview_images="$5" # "True" if image previews are enabled, "False" otherwise. - -maxln=200 # Stop after $maxln lines. Can be used like ls | head -n $maxln - -# Find out something about the file: -mimetype=$(file --mime-type -Lb "$path") -extension=$(/bin/echo "${path##*.}" | awk '{print tolower($0)}') - -# Functions: -# runs a command and saves its output into $output. Useful if you need -# the return value AND want to use the output in a pipe -try() { output=$(eval '"$@"'); } - -# writes the output of the previously used "try" command -dump() { /bin/echo "$output"; } - -# a common post-processing function used after most commands -trim() { head -n "$maxln"; } - -# wraps highlight to treat exit code 141 (killed by SIGPIPE) as success -safepipe() { "$@"; test $? = 0 -o $? = 141; } - -# Image previews, if enabled in ranger. -if [ "$preview_images" = "True" ]; then - case "$mimetype" in - # Image previews for SVG files, disabled by default. - image/svg+xml) - convert "$path" "$cached" && exit 6 || exit 1;; - # Image previews for image files. w3mimgdisplay will be called for all - # image files (unless overriden as above), but might fail for - # unsupported types. - image/*) - exit 7;; - # Image preview for video, disabled by default.: - video/*) - ffmpegthumbnailer -i "$path" -o "$cached" -s 0 && exit 6 || exit 1;; - esac -fi - -case "$extension" in - # Archive extensions: - a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|\ - rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip) - try als "$path" && { dump | trim; exit 0; } - try acat "$path" && { dump | trim; exit 3; } - try bsdtar -lf "$path" && { dump | trim; exit 0; } - exit 1;; - rar) - # avoid password prompt by providing empty password - try unrar -p- lt "$path" && { dump | trim; exit 0; } || exit 1;; - 7z) - # avoid password prompt by providing empty password - try 7z -p l "$path" && { dump | trim; exit 0; } || exit 1;; - # PDF documents: - pdf) - try pdftotext -l 10 -nopgbrk -q "$path" - && \ - { dump | trim | fmt -s -w $width; exit 0; } || exit 1;; - # BitTorrent Files - torrent) - try transmission-show "$path" && { dump | trim; exit 5; } || exit 1;; - # ODT Files - odt|ods|odp|sxw) - try odt2txt "$path" && { dump | trim; exit 5; } || exit 1;; - # HTML Pages: - htm|html|xhtml) - try w3m -dump "$path" && { dump | trim | fmt -s -w $width; exit 4; } - try lynx -dump "$path" && { dump | trim | fmt -s -w $width; exit 4; } - try elinks -dump "$path" && { dump | trim | fmt -s -w $width; exit 4; } - ;; # fall back to highlight/cat if the text browsers fail -esac - -case "$mimetype" in - # Syntax highlight for text files: - text/* | */xml) - if [ "$(tput colors)" -ge 256 ]; then - pygmentize_format=terminal256 - highlight_format=xterm256 - else - pygmentize_format=terminal - highlight_format=ansi - fi - try safepipe highlight --out-format=${highlight_format} "$path" && { dump | trim; exit 5; } - try safepipe pygmentize -f ${pygmentize_format} "$path" && { dump | trim; exit 5; } - exit 2;; - # Ascii-previews of images: - image/*) - img2txt --gamma=0.6 --width="$width" "$path" && exit 4 || exit 1;; - # Display information about media files: - video/* | audio/*) - exiftool "$path" && exit 5 - # Use sed to remove spaces so the output fits into the narrow window - try mediainfo "$path" && { dump | trim | sed 's/ \+:/: /;'; exit 5; } || exit 1;; -esac - -exit 1 diff --git a/dot_config/ranger/rc.conf b/dot_config/ranger/rc.conf deleted file mode 100644 index 3596601..0000000 --- a/dot_config/ranger/rc.conf +++ /dev/null @@ -1,619 +0,0 @@ -# =================================================================== -# This file contains the default startup commands for ranger. -# To change them, it is recommended to create the file -# ~/.config/ranger/rc.conf and add your custom commands there. -# -# If you copy this whole file there, you may want to set the environment -# variable RANGER_LOAD_DEFAULT_RC to FALSE to avoid loading it twice. -# -# The purpose of this file is mainly to define keybindings and settings. -# For running more complex python code, please create a plugin in "plugins/" or -# a command in "commands.py". -# -# Each line is a command that will be run before the user interface -# is initialized. As a result, you can not use commands which rely -# on the UI such as :delete or :mark. -# =================================================================== - -# =================================================================== -# == Options -# =================================================================== - -# Which viewmode should be used? Possible values are: -# miller: Use miller columns which show multiple levels of the hierarchy -# multipane: Midnight-commander like multipane view showing all tabs next -# to each other -set viewmode miller -#set viewmode multipane - -# How many columns are there, and what are their relative widths? -set column_ratios 1,3,4 - -# Which files should be hidden? (regular expression) -set hidden_filter ^\.|\.(?:pyc|pyo|bak|swp)$|^lost\+found$|^__(py)?cache__$ - -# Show hidden files? You can toggle this by typing 'zh' -set show_hidden true - -# Ask for a confirmation when running the "delete" command? -# Valid values are "always", "never", "multiple" (default) -# With "multiple", ranger will ask only if you delete multiple files at once. -set confirm_on_delete never - -# Which script is used to generate file previews? -# ranger ships with scope.sh, a script that calls external programs (see -# README.md for dependencies) to preview images, archives, etc. -set preview_script ~/.config/ranger/scope.sh - -# Use the external preview script or display simple plain text or image previews? -set use_preview_script true - -# Automatically count files in the directory, even before entering them? -set automatically_count_files true - -# Open all images in this directory when running certain image viewers -# like feh or sxiv? You can still open selected files by marking them. -set open_all_images true - -# Be aware of version control systems and display information. -set vcs_aware false - -# State of the three backends git, hg, bzr. The possible states are -# disabled, local (only show local info), enabled (show local and remote -# information). -set vcs_backend_git enabled -set vcs_backend_hg disabled -set vcs_backend_bzr disabled - -# Use one of the supported image preview protocols -set preview_images true - -# Set the preview image method. Supported methods: -# -# * w3m (default): -# Preview images in full color with the external command "w3mimgpreview"? -# This requires the console web browser "w3m" and a supported terminal. -# It has been successfully tested with "xterm" and "urxvt" without tmux. -# -# * iterm2: -# Preview images in full color using iTerm2 image previews -# (http://iterm2.com/images.html). This requires using iTerm2 compiled -# with image preview support. -# -# * urxvt: -# Preview images in full color using urxvt image backgrounds. This -# requires using urxvt compiled with pixbuf support. -# -# * urxvt-full: -# The same as urxvt but utilizing not only the preview pane but the -# whole terminal window. -set preview_images_method w3m - -# Use a unicode "..." character to mark cut-off filenames? -set unicode_ellipsis false - -# Show dotfiles in the bookmark preview box? -set show_hidden_bookmarks true - -# Which colorscheme to use? These colorschemes are available by default: -# default, jungle, snow, solarized -set colorscheme default - -# Preview files on the rightmost column? -# And collapse (shrink) the last column if there is nothing to preview? -set preview_files true -set preview_directories true -set collapse_preview true - -# Save the console history on exit? -set save_console_history true - -# Draw the status bar on top of the browser window (default: bottom) -set status_bar_on_top false - -# Draw a progress bar in the status bar which displays the average state of all -# currently running tasks which support progress bars? -set draw_progress_bar_in_status_bar true - -# Draw borders around columns? -set draw_borders true - -# Display the directory name in tabs? -set dirname_in_tabs false - -# Enable the mouse support? -set mouse_enabled true - -# Display the file size in the main column or status bar? -set display_size_in_main_column true -set display_size_in_status_bar true - -# Display files tags in all columns or only in main column? -set display_tags_in_all_columns true - -# Set a title for the window? -set update_title false - -# Set the title to "ranger" in the tmux program? -set update_tmux_title false - -# Shorten the title if it gets long? The number defines how many -# directories are displayed at once, 0 turns off this feature. -set shorten_title 3 - -# Abbreviate $HOME with ~ in the titlebar (first line) of ranger? -set tilde_in_titlebar false - -# How many directory-changes or console-commands should be kept in history? -set max_history_size 20 -set max_console_history_size 50 - -# Try to keep so much space between the top/bottom border when scrolling: -set scroll_offset 8 - -# Flush the input after each key hit? (Noticeable when ranger lags) -set flushinput true - -# Padding on the right when there's no preview? -# This allows you to click into the space to run the file. -set padding_right true - -# Save bookmarks (used with mX and `X) instantly? -# This helps to synchronize bookmarks between multiple ranger -# instances but leads to *slight* performance loss. -# When false, bookmarks are saved when ranger is exited. -set autosave_bookmarks true - -# You can display the "real" cumulative size of directories by using the -# command :get_cumulative_size or typing "dc". The size is expensive to -# calculate and will not be updated automatically. You can choose -# to update it automatically though by turning on this option: -set autoupdate_cumulative_size false - -# Turning this on makes sense for screen readers: -set show_cursor false - -# One of: size, natural, basename, atime, ctime, mtime, type, random -set sort natural - -# Additional sorting options -set sort_reverse false -set sort_case_insensitive true -set sort_directories_first true -set sort_unicode false - -# Enable this if key combinations with the Alt Key don't work for you. -# (Especially on xterm) -set xterm_alt_key false - -# Whether to include bookmarks in cd command -set cd_bookmarks true - -# Avoid previewing files larger than this size, in bytes. Use a value of 0 to -# disable this feature. -set preview_max_size 0 - -# Add the highlighted file to the path in the titlebar -set show_selection_in_titlebar true - -# The delay that ranger idly waits for user input, in milliseconds, with a -# resolution of 100ms. Lower delay reduces lag between directory updates but -# increases CPU load. -set idle_delay 2000 - -# When the metadata manager module looks for metadata, should it only look for -# a ".metadata.json" file in the current directory, or do a deep search and -# check all directories above the current one as well? -set metadata_deep_search false - -# Clear all existing filters when leaving a directory -set clear_filters_on_dir_change false - -# Disable displaying line numbers in main column -set line_numbers false - -# =================================================================== -# == Local Options -# =================================================================== -# You can set local options that only affect a single directory. - -# Examples: -# setlocal path=~/downloads sort mtime - -# =================================================================== -# == Command Aliases in the Console -# =================================================================== - -alias e edit -alias q quit -alias q! quitall -alias qa quitall -alias qall quitall -alias setl setlocal - -alias filter scout -prt -alias find scout -aeit -alias mark scout -mr -alias unmark scout -Mr -alias search scout -rs -alias search_inc scout -rts -alias travel scout -aefiklst - -# =================================================================== -# == Define keys for the browser -# =================================================================== - -# Basic -map Q quit! -map q quit -copymap q ZZ ZQ - -map R reload_cwd -map reset -map redraw_window -map abort -map change_mode normal -map ~ set viewmode! - -map i display_file -map ? help -map W display_log -map w taskview_open -map S shell $SHELL - -map : console -map ; console -map ! console shell%space -map @ console -p6 shell %%s -map # console shell -p%space -map s console shell%space -map r chain draw_possible_programs; console open_with%%space -#map f console find%space -map f console scout -ftsea%space -map cd console cd%space - -# Change the line mode -map Mf linemode filename -map Mi linemode fileinfo -map Mm linemode mtime -map Mp linemode permissions -map Ms linemode sizemtime -map Mt linemode metatitle - -# Tagging / Marking -map t tag_toggle -map ut tag_remove -map " tag_toggle tag=%any -map mark_files toggle=True -map v mark_files all=True toggle=True -map uv mark_files all=True val=False -map V toggle_visual_mode -map uV toggle_visual_mode reverse=True - -# For the nostalgics: Midnight Commander bindings -map help -map display_file -map edit -map copy -map cut -map console mkdir%space -map console delete -map exit - -# In case you work on a keyboard with dvorak layout -map move up=1 -map move down=1 -map move left=1 -map move right=1 -map move to=0 -map move to=-1 -map move down=1 pages=True -map move up=1 pages=True -map move right=1 -map console delete -map console touch%space - -# VIM-like -copymap k -copymap j -copymap h -copymap l -copymap gg -copymap G -copymap -copymap - -map J move down=0.5 pages=True -map K move up=0.5 pages=True -copymap J -copymap K - -# Jumping around -map H history_go -1 -map L history_go 1 -map ] move_parent 1 -map [ move_parent -1 -map } traverse - -map gh cd ~ -map ge cd /etc -map gu cd /usr -map gd cd /dev -map gl cd -r . -map gL cd -r %f -map go cd /opt -map gv cd /var -map gm cd /media -map gM cd /mnt -map gs cd /srv -map gr cd / -map gR eval fm.cd(ranger.RANGERDIR) -map g/ cd / -map g? cd /usr/share/doc/ranger - -# External Programs -map E edit -map du shell -p du --max-depth=1 -h --apparent-size -map dU shell -p du --max-depth=1 -h --apparent-size | sort -rh -map yp shell -f echo -n %d/%f | xsel -i; xsel -o | xsel -i -b -map yd shell -f echo -n %d | xsel -i; xsel -o | xsel -i -b -map yn shell -f echo -n %f | xsel -i; xsel -o | xsel -i -b - -# Filesystem Operations -map = chmod - -#map cw console rename%space -map cw eval fm.execute_console("bulkrename") if fm.thisdir.marked_items else fm.open_console("rename ") -map a rename_append -map A eval fm.open_console('rename ' + fm.thisfile.relative_path.replace("%", "%%")) -map I eval fm.open_console('rename ' + fm.thisfile.relative_path.replace("%", "%%"), position=7) - -map pp paste -map po paste overwrite=True -map pP paste append=True -map pO paste overwrite=True append=True -map pl paste_symlink relative=False -map pL paste_symlink relative=True -map phl paste_hardlink -map pht paste_hardlinked_subtree -map pr paste_as_root - -map dD console delete - -map dd cut -map ud uncut -map da cut mode=add -map dr cut mode=remove -map dt cut mode=toggle - -map yy copy -map uy uncut -map ya copy mode=add -map yr copy mode=remove -map yt copy mode=toggle - -# Temporary workarounds -map dgg eval fm.cut(dirarg=dict(to=0), narg=quantifier) -map dG eval fm.cut(dirarg=dict(to=-1), narg=quantifier) -map dj eval fm.cut(dirarg=dict(down=1), narg=quantifier) -map dk eval fm.cut(dirarg=dict(up=1), narg=quantifier) -map ygg eval fm.copy(dirarg=dict(to=0), narg=quantifier) -map yG eval fm.copy(dirarg=dict(to=-1), narg=quantifier) -map yj eval fm.copy(dirarg=dict(down=1), narg=quantifier) -map yk eval fm.copy(dirarg=dict(up=1), narg=quantifier) - -# Searching -map / console search%space -map n search_next -map N search_next forward=False -map ct search_next order=tag -map cs search_next order=size -map ci search_next order=mimetype -map cc search_next order=ctime -map cm search_next order=mtime -map ca search_next order=atime - -# Tabs -map tab_new ~ -map tab_close -map tab_move 1 -map tab_move -1 -map tab_move 1 -map tab_move -1 -map gt tab_move 1 -map gT tab_move -1 -map gn tab_new ~ -map gc tab_close -map uq tab_restore -map tab_open 1 -map tab_open 2 -map tab_open 3 -map tab_open 4 -map tab_open 5 -map tab_open 6 -map tab_open 7 -map tab_open 8 -map tab_open 9 - -# Sorting -map or set sort_reverse! -map oz set sort=random -map os chain set sort=size; set sort_reverse=False -map ob chain set sort=basename; set sort_reverse=False -map on chain set sort=natural; set sort_reverse=False -map om chain set sort=mtime; set sort_reverse=False -map oc chain set sort=ctime; set sort_reverse=False -map oa chain set sort=atime; set sort_reverse=False -map ot chain set sort=type; set sort_reverse=False -map oe chain set sort=extension; set sort_reverse=False - -map oS chain set sort=size; set sort_reverse=True -map oB chain set sort=basename; set sort_reverse=True -map oN chain set sort=natural; set sort_reverse=True -map oM chain set sort=mtime; set sort_reverse=True -map oC chain set sort=ctime; set sort_reverse=True -map oA chain set sort=atime; set sort_reverse=True -map oT chain set sort=type; set sort_reverse=True -map oE chain set sort=extension; set sort_reverse=True - -map dc get_cumulative_size - -# Settings -map zc set collapse_preview! -map zd set sort_directories_first! -map zh set show_hidden! -map set show_hidden! -map zI set flushinput! -map zi set preview_images! -map zm set mouse_enabled! -map zp set preview_files! -map zP set preview_directories! -map zs set sort_case_insensitive! -map zu set autoupdate_cumulative_size! -map zv set use_preview_script! -map zf console filter%space - -# Bookmarks -map ` enter_bookmark %any -map ' enter_bookmark %any -map m set_bookmark %any -map um unset_bookmark %any - -map m draw_bookmarks -copymap m um ` ' - -# Generate all the chmod bindings with some python help: -eval for arg in "rwxXst": cmd("map +u{0} shell -f chmod u+{0} %s".format(arg)) -eval for arg in "rwxXst": cmd("map +g{0} shell -f chmod g+{0} %s".format(arg)) -eval for arg in "rwxXst": cmd("map +o{0} shell -f chmod o+{0} %s".format(arg)) -eval for arg in "rwxXst": cmd("map +a{0} shell -f chmod a+{0} %s".format(arg)) -eval for arg in "rwxXst": cmd("map +{0} shell -f chmod u+{0} %s".format(arg)) - -eval for arg in "rwxXst": cmd("map -u{0} shell -f chmod u-{0} %s".format(arg)) -eval for arg in "rwxXst": cmd("map -g{0} shell -f chmod g-{0} %s".format(arg)) -eval for arg in "rwxXst": cmd("map -o{0} shell -f chmod o-{0} %s".format(arg)) -eval for arg in "rwxXst": cmd("map -a{0} shell -f chmod a-{0} %s".format(arg)) -eval for arg in "rwxXst": cmd("map -{0} shell -f chmod u-{0} %s".format(arg)) - -# =================================================================== -# == Define keys for the console -# =================================================================== -# Note: Unmapped keys are passed directly to the console. - -# Basic -cmap eval fm.ui.console.tab() -cmap eval fm.ui.console.tab(-1) -cmap eval fm.ui.console.close() -cmap eval fm.ui.console.execute() -cmap redraw_window - -copycmap -copycmap - -# Move around -cmap eval fm.ui.console.history_move(-1) -cmap eval fm.ui.console.history_move(1) -cmap eval fm.ui.console.move(left=1) -cmap eval fm.ui.console.move(right=1) -cmap eval fm.ui.console.move(right=0, absolute=True) -cmap eval fm.ui.console.move(right=-1, absolute=True) -cmap eval fm.ui.console.move_word(left=1) -cmap eval fm.ui.console.move_word(right=1) - -# Line Editing -cmap eval fm.ui.console.delete(-1) -cmap eval fm.ui.console.delete(0) -cmap eval fm.ui.console.delete_word() -cmap eval fm.ui.console.delete_word(backward=False) -cmap eval fm.ui.console.delete_rest(1) -cmap eval fm.ui.console.delete_rest(-1) -cmap eval fm.ui.console.paste() - -# And of course the emacs way -copycmap -copycmap -copycmap -copycmap -copycmap -copycmap -copycmap -copycmap - -# Note: There are multiple ways to express backspaces. (code 263) -# and (code 127). To be sure, use both. -copycmap - -# This special expression allows typing in numerals: -cmap false - -# =================================================================== -# == Pager Keybindings -# =================================================================== - -# Movement -pmap pager_move down=1 -pmap pager_move up=1 -pmap pager_move left=4 -pmap pager_move right=4 -pmap pager_move to=0 -pmap pager_move to=-1 -pmap pager_move down=1.0 pages=True -pmap pager_move up=1.0 pages=True -pmap pager_move down=0.5 pages=True -pmap pager_move up=0.5 pages=True - -copypmap k -copypmap j -copypmap h -copypmap l -copypmap g -copypmap G -copypmap d -copypmap u -copypmap n f -copypmap p b - -# Basic -pmap redraw_window -pmap pager_close -copypmap q Q i -pmap E edit_file - -# =================================================================== -# == Taskview Keybindings -# =================================================================== - -# Movement -tmap taskview_move up=1 -tmap taskview_move down=1 -tmap taskview_move to=0 -tmap taskview_move to=-1 -tmap taskview_move down=1.0 pages=True -tmap taskview_move up=1.0 pages=True -tmap taskview_move down=0.5 pages=True -tmap taskview_move up=0.5 pages=True - -copytmap k -copytmap j -copytmap g -copytmap G -copytmap u -copytmap n f -copytmap p b - -# Changing priority and deleting tasks -tmap J eval -q fm.ui.taskview.task_move(-1) -tmap K eval -q fm.ui.taskview.task_move(0) -tmap dd eval -q fm.ui.taskview.task_remove() -tmap eval -q fm.ui.taskview.task_move(-1) -tmap eval -q fm.ui.taskview.task_move(0) -tmap eval -q fm.ui.taskview.task_remove() - -# Basic -tmap redraw_window -tmap taskview_close -copytmap q Q w -default_linemode devicons - -# find -map fzf_select diff --git a/dot_config/rofi/config.rasi b/dot_config/rofi/config.rasi deleted file mode 100644 index f32defb..0000000 --- a/dot_config/rofi/config.rasi +++ /dev/null @@ -1,4 +0,0 @@ -configuration { -} - -@theme "/usr/share/rofi/themes/sidebar.rasi" diff --git a/dot_config/symlink_nvim b/dot_config/symlink_nvim deleted file mode 100644 index b68ce03..0000000 --- a/dot_config/symlink_nvim +++ /dev/null @@ -1 +0,0 @@ -../.vim diff --git a/dot_config/systemd/user/default.target.wants/symlink_udiskie.service.tmpl b/dot_config/systemd/user/default.target.wants/symlink_udiskie.service.tmpl deleted file mode 100644 index 3e8f870..0000000 --- a/dot_config/systemd/user/default.target.wants/symlink_udiskie.service.tmpl +++ /dev/null @@ -1 +0,0 @@ -{{ .chezmoi.destDir }}/.config/systemd/user/udiskie.service diff --git a/dot_config/systemd/user/graphical-session.target.wants/symlink_hypridle.service b/dot_config/systemd/user/graphical-session.target.wants/symlink_hypridle.service deleted file mode 100644 index 5301d23..0000000 --- a/dot_config/systemd/user/graphical-session.target.wants/symlink_hypridle.service +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/systemd/user/hypridle.service diff --git a/dot_config/systemd/user/graphical-session.target.wants/symlink_hyprpaper.service b/dot_config/systemd/user/graphical-session.target.wants/symlink_hyprpaper.service deleted file mode 100644 index 3e5dae9..0000000 --- a/dot_config/systemd/user/graphical-session.target.wants/symlink_hyprpaper.service +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/systemd/user/hyprpaper.service diff --git a/dot_config/systemd/user/graphical-session.target.wants/symlink_hyprpolkitagent.service b/dot_config/systemd/user/graphical-session.target.wants/symlink_hyprpolkitagent.service deleted file mode 100644 index c1bab3a..0000000 --- a/dot_config/systemd/user/graphical-session.target.wants/symlink_hyprpolkitagent.service +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/systemd/user/hyprpolkitagent.service diff --git a/dot_config/systemd/user/graphical-session.target.wants/symlink_waybar.service b/dot_config/systemd/user/graphical-session.target.wants/symlink_waybar.service deleted file mode 100644 index 70fd0a8..0000000 --- a/dot_config/systemd/user/graphical-session.target.wants/symlink_waybar.service +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/systemd/user/waybar.service diff --git a/dot_config/systemd/user/udiskie.service b/dot_config/systemd/user/udiskie.service deleted file mode 100644 index 6c0f16e..0000000 --- a/dot_config/systemd/user/udiskie.service +++ /dev/null @@ -1,9 +0,0 @@ -[Unit] -Description=Udiskie daemon -Documentation=man:udiskie(8) https://github.com/coldfix/udiskie/wiki - -[Service] -ExecStart=/usr/bin/udiskie - -[Install] -WantedBy=multi-user.target diff --git a/dot_config/terminator/config b/dot_config/terminator/config deleted file mode 100644 index dff6026..0000000 --- a/dot_config/terminator/config +++ /dev/null @@ -1,22 +0,0 @@ -[global_config] - title_hide_sizetext = True -[keybindings] - layout_launcher = None - help = None -[profiles] - [[default]] - cursor_color = "#aaaaaa" - foreground_color = "#ffffff" - show_titlebar = False - scrollbar_position = hidden - scroll_on_keystroke = False -[layouts] - [[default]] - [[[child1]]] - parent = window0 - profile = default - type = Terminal - [[[window0]]] - parent = "" - type = Window -[plugins] diff --git a/dot_config/tmuxinator/dotfiles.yml.tmpl b/dot_config/tmuxinator/dotfiles.yml.tmpl deleted file mode 100644 index 8f77c02..0000000 --- a/dot_config/tmuxinator/dotfiles.yml.tmpl +++ /dev/null @@ -1,48 +0,0 @@ -# {{ .chezmoi.homeDir }}/.config/tmuxinator/dotfiles.yml - -name: dotfiles -root: {{ .chezmoi.sourceDir }} - -# Optional tmux socket -# socket_name: foo - -# Runs before everything. Use it to start daemons etc. -# pre: sudo /etc/rc.d/mysqld start - -# Project hooks -# Runs on project start, always -# on_project_start: command -# Run on project start, the first time -# on_project_first_start: command -# Run on project start, after the first time -# on_project_restart: command -# Run on project exit ( detaching from tmux session ) -# on_project_exit: command -# Run on project stop -# on_project_stop: command - -# Runs in each window and pane before window/pane specific commands. Useful for setting up interpreter versions. -# pre_window: rbenv shell 2.0.0-p247 - -# Pass command line options to tmux. Useful for specifying a different tmux.conf. -# tmux_options: -f ~/.tmux.mac.conf - -# Change the command to call tmux. This can be used by derivatives/wrappers like byobu. -# tmux_command: byobu - -# Specifies (by name or index) which window will be selected on project startup. If not set, the first window is used. -startup_window: git - -# Specifies (by index) which pane of the specified window will be selected on project startup. If not set, the first pane is used. -# startup_pane: 1 - -# Controls whether the tmux session should be attached to automatically. Defaults to true. -# attach: false - -# Runs after everything. Use it to attach to tmux with custom options etc. -# post: tmux -CC attach -t dotfiles - -windows: - - editor: nvim - - git: - - diff --git a/dot_config/tmuxinator/local.yml.tmpl b/dot_config/tmuxinator/local.yml.tmpl deleted file mode 100644 index 7406619..0000000 --- a/dot_config/tmuxinator/local.yml.tmpl +++ /dev/null @@ -1,47 +0,0 @@ -# {{ .chezmoi.homeDir }}/.config/tmuxinator/local.yml - -name: local -root: ~/ - -# Optional tmux socket -# socket_name: foo - -# Runs before everything. Use it to start daemons etc. -# pre: sudo /etc/rc.d/mysqld start - -# Project hooks -# Runs on project start, always -# on_project_start: command -# Run on project start, the first time -# on_project_first_start: command -# Run on project start, after the first time -# on_project_restart: command -# Run on project exit ( detaching from tmux session ) -# on_project_exit: command -# Run on project stop -# on_project_stop: command - -# Runs in each window and pane before window/pane specific commands. Useful for setting up interpreter versions. -# pre_window: rbenv shell 2.0.0-p247 - -# Pass command line options to tmux. Useful for specifying a different tmux.conf. -# tmux_options: -f ~/.tmux.mac.conf - -# Change the command to call tmux. This can be used by derivatives/wrappers like byobu. -# tmux_command: byobu - -# Specifies (by name or index) which window will be selected on project startup. If not set, the first window is used. -startup_window: cli - -# Specifies (by index) which pane of the specified window will be selected on project startup. If not set, the first pane is used. -# startup_pane: 1 - -# Controls whether the tmux session should be attached to automatically. Defaults to true. -# attach: false - -# Runs after everything. Use it to attach to tmux with custom options etc. -# post: tmux -CC attach -t local - -windows: - - htop: htop - - cli: fastfetch diff --git a/dot_config/tmuxinator/notes.yml.tmpl b/dot_config/tmuxinator/notes.yml.tmpl deleted file mode 100644 index 59b6eee..0000000 --- a/dot_config/tmuxinator/notes.yml.tmpl +++ /dev/null @@ -1,48 +0,0 @@ -# {{ .chezmoi.homeDir }}/.config/tmuxinator/notes.yml - -name: notes -root: {{ .chezmoi.homeDir }}/projects/notes - -# Optional tmux socket -# socket_name: foo - -# Runs before everything. Use it to start daemons etc. -# pre: sudo /etc/rc.d/mysqld start - -# Project hooks -# Runs on project start, always -# on_project_start: command -# Run on project start, the first time -# on_project_first_start: command -# Run on project start, after the first time -# on_project_restart: command -# Run on project exit ( detaching from tmux session ) -# on_project_exit: command -# Run on project stop -# on_project_stop: command - -# Runs in each window and pane before window/pane specific commands. Useful for setting up interpreter versions. -# pre_window: rbenv shell 2.0.0-p247 - -# Pass command line options to tmux. Useful for specifying a different tmux.conf. -# tmux_options: -f ~/.tmux.mac.conf - -# Change the command to call tmux. This can be used by derivatives/wrappers like byobu. -# tmux_command: byobu - -# Specifies (by name or index) which window will be selected on project startup. If not set, the first window is used. -startup_window: git - -# Specifies (by index) which pane of the specified window will be selected on project startup. If not set, the first pane is used. -# startup_pane: 1 - -# Controls whether the tmux session should be attached to automatically. Defaults to true. -# attach: false - -# Runs after everything. Use it to attach to tmux with custom options etc. -# post: tmux -CC attach -t notes - -windows: - - editor: nvim - - git: - - diff --git a/dot_config/user-dirs.locale b/dot_config/user-dirs.locale deleted file mode 100644 index 3e0b419..0000000 --- a/dot_config/user-dirs.locale +++ /dev/null @@ -1 +0,0 @@ -en_US \ No newline at end of file diff --git a/dot_config/waybar/config.tmpl b/dot_config/waybar/config.tmpl deleted file mode 100644 index 719d81d..0000000 --- a/dot_config/waybar/config.tmpl +++ /dev/null @@ -1,375 +0,0 @@ -{ - /////////////////////////// - // default config - /////////////////////////// - "layer": "top", - "position": "top", - "height": 42, - "spacing": 4, - "mode": "dock", - "exclusive": true, - "gtk-layer-shell": true, - "passthrough": false, - "fixed-center": true, - - /////////////////////////// - // layout - /////////////////////////// - "modules-left": [ - "hyprland/workspaces", - "hyprland/window" - ], - "modules-center": [ - "idle_inhibitor", - "clock", - "hyprland/language", - "custom/capslock", - "privacy", - "systemd-failed-units", - ], - "modules-right": [ - {{- if .waybar.bluetooth.show }} - "bluetooth", - {{- end }} - "custom/vpn", - {{- if .waybar.net.wifi }} - "network#wifi", - {{- end }} - {{- if .waybar.net.eth }} - "network#eth", - {{- end }} - {{- if .waybar.power.show }} - "battery", - {{- end }} - "group/settings", - "cpu", - "memory", - "temperature", - "disk", - "tray", - "custom/power-buttons", - ], - - /////////////////////////// - // groups - /////////////////////////// - // see https://github.com/Alexays/Waybar/wiki/Module:-Group - "group/settings": { - "orientation": "horizontal", - "modules": [ - "wireplumber", - "backlight", - ], - "drawer": { - "transition-duration": 500, - "transition-left-to-right": false, - "click-to-reveal": false, - }, - }, - - /////////////////////////// - // custom - /////////////////////////// - // see https://github.com/Alexays/Waybar/wiki/Module:-Custom - "custom/capslock": { - "exec": "~/bin/capslock-check.sh", - "restart-interval": 1, - "return-type": "json", - "format": "{}", - }, - "custom/power-buttons": { - "format": "⏻", - "tooltip": false, - "menu": "on-click", - "menu-file": "~/.config/waybar/power_menu.xml", - "menu-actions": { - "lock": "loginctl lock-session", - "logout": "uwsm stop", - "reboot": "systemctl reboot", - "shutdown": "systemctl poweroff", - "suspend": "systemctl suspend", - }, - }, - "custom/vpn": { - "format": "{}", - "exec": "~/bin/nmcli-active-vpn-conn.sh", - "return-type": "json", - "interval": 3, - }, - - /////////////////////////// - // modules - /////////////////////////// - "backlight": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Backlight - "interval": 2, - "format": "{icon} {percent}%", - "format-icons": ["󰛩", "󱩎", "󱩏", "󱩐", "󱩑", "󱩒", "󱩓", "󱩔", "󱩕", "󱩖", "󰛨"], - "scroll-step": 5, - "on-scroll-up": "~/bin/backlight.sh \"+5%\"", - "on-scroll-down": "~/bin/backlight.sh \"-5%\"", - "smooth-scrolling-threshold": 3, - "tooltip": false, - }, - {{- if .waybar.power.show }} - "battery": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Battery - {{- if .waybar.power.battery }} - "bat": {{ .waybar.power.battery | quote }}, - {{- else }} - // The battery to monitor, as in /sys/class/power_supply/ instead of auto detect. - // "bat": "", - {{- end }} - {{- if .waybar.power.adapter }} - "adapter": {{ .waybar.power.adapter | quote }}, - {{- else }} - // The adapter to monitor, as in /sys/class/power_supply/ instead of auto detect. - // "adapter": "", - {{- end }} - "interval": 3, - "states": { - "warning": 20, - "critical": 10, - }, - "format-discharging": "{icon} {capacity}%", - "format-icons": ["", "", "", "", ""], - "format-full": " {capacity}%", - "format-plugged": " {capacity}%", - "format-charging": " {capacity}%", - "tooltip": true, - "tooltip-format": "{timeTo}", - "max-length": 25, - }, - {{- end }} - {{- if .waybar.bluetooth.show }} - "bluetooth": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Bluetooth - {{- if .waybar.bluetooth.controller }} - controller: {{ .waybar.bluetooth.controller | quote }}, - {{- else }} - // Use this specific controller, otherwise a random controller - // is chosen. May only be required if there is more than 1 - // controller present. - // controller: "", - {{- end }} - "tooltip": true, - "format": "󰂯", - "tooltip-format": "{controller_address} is {status}", - "format-disabled": "󰂲", - "tooltip-format-disabled": "Bluetooth disabled ({controller_address})", - "format-off": "󰂲", - "tooltip-format-off": "Bluetooth off ({controller_address})", - "format-on": "󰂲", - "tooltip-format-on": "Bluetooth on ({controller_address})", - "format-connected": "󰂱 {num_connections}", - "tooltip-format-connected": "{device_enumerate}", - "tooltip-format-enumerate-connected": "{device_alias}\t{device_address}", - "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\tBattery: {device_battery_percentage}%", - }, - {{- end }} - "clock": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Clock - "interval": 1, - "format": "󰔠 {:%a, %Y-%m-%d %H:%M:%S}", - // locale must be enabled - "locale": "de_AT.UTF-8", - // "timezone": "Europe/Vienna", - // "timezones": [ - // "UTC", - // ], - "tooltip": true, - "tooltip-format": "{calendar}", - "calendar": { - "mode": "month", - "mode-mon-col": 3, - "weeks-pos": "left", - "on-scroll": 1, - "format": { - "months": "{}", - "days": "{}", - "weeks": "CW{}", - "weekdays": "{}", - "today": "{}", - }, - }, - "actions": { - "on-click-right": "mode", - "on-scroll-up": "tz_up", - "on-scroll-down": "tz_down", - "on-scroll-up": "shift_up", - "on-scroll-down": "shift_down", - }, - }, - "cpu": { - // see https://github.com/Alexays/Waybar/wiki/Module:-CPU - "format": " {usage}%", - "tooltip": true, - "interval": 1, - }, - "disk": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Disk - "interval": 30, - "format": "󰋊 {percentage_used}%", - "path": "/", - "unit": "GB", - "tooltip": "true", - "tooltip-format": "Free:\t\t{specific_free:0.2f} GB\t({percentage_free}%)\nUsed:\t\t{specific_used:0.2f} GB\t({percentage_used}%)\nTotal space:\t{specific_total:0.2f} GB", - }, - "hyprland/language": { - "format": "󰌌 {}", - "format-en": "en", - "format-de": "de", - "keyboard-name": "at-translated-set-2-keyboard", - "on-click": "hyprctl switchxkblayout at-translated-set-2-keyboard next", - "on-scroll-up": "hyprctl switchxkblayout at-translated-set-2-keyboard next", - "on-scroll-down": "hyprctl switchxkblayout at-translated-set-2-keyboard prev", - }, - "hyprland/workspaces": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Hyprland#workspaces - "active-only": true, - "on-click": "activate", - "format": "{id}", - "all-outputs": false, - "disable-scroll": false, - "active-only": false, - }, - "hyprland/window": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Hyprland#window - "format": "{title}", - "separate-outputs": true, - }, - "idle_inhibitor": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Idle-Inhibitor - "start-activated": false, - "timeout": 120, // Deactivate automatically after 2h - "format": "{icon}", - "format-icons": { - "activated": "", - "deactivated": "", - }, - "tooltip": true, - }, - "memory": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Memory - "interval": 10, - "format": " {used:0.1f}Gi", - "tooltip": true, - "tooltip-format": "Used:\t\t{used:0.1f}GiB ({percentage}%)\nAvailable:\t{avail:0.1f}GiB\nTotal:\t\t{total:0.1f}GiB", - }, - {{- if .waybar.net.eth }} - "network#eth": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Network - "interface": {{ .waybar.net.eth | quote }}, - "interval": 5, - "tooltip": true, - "format-ethernet": "󰈁", - "tooltip-format-ethernet": "IP:\t\t{ipaddr}/{cidr}\nBandwith:\t {bandwidthDownBits} /  {bandwidthUpBits}\nInterface:\t{ifname}", - "format-disabled": "󰈂", - "tooltip-format-disabled": "{ifname} is disabled", - "format-linked": "󰈂", - "tooltip-format-linked": "{ifname} is linked", - "format-disconnected": "", // do not show, when not connected at all - // "tooltip-format-disconnected": "{ifname} is not connected", - "format": "", // do not show for any other states, except for those specified above - // "tooltip-format": "", - }, - {{- end }} - {{- if .waybar.net.wifi }} - "network#wifi": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Network - "interface": {{ .waybar.net.wifi | quote }}, - "interval": 5, - "tooltip": true, - "format-icons": ["󰤯", "󰤟", "󰤢", "󰤥", "󰤨"], - "format-wifi": "{icon} {signalStrength}%", - "tooltip-format-wifi": "SSID:\t\t{essid}\nIP:\t\t{ipaddr}/{cidr}\nFrequency:\t{frequency} GHz\nBandwith:\t {bandwidthDownBits} /  {bandwidthUpBits}\nInterface:\t{ifname}", - "format-disabled": "󰤫", - "tooltip-format-disabled": "{ifname} is disabled", - "format-linked": "󱛇", - "tooltip-format-linked": "{ifname} is linked", - "format-disconnected": "󰤮", - "tooltip-format-disconnected": "{ifname} is not connected", - }, - {{- end }} - "privacy": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Privacy - "icon-spacing": 4, - "icon-size": 18, - "transition-duration": 250, - "expand": true, - "ignore-monitor": false, - "modules": [ - { - "type": "screenshare", - "tooltip": true, - "tooltip-icon-size": 24, - }, - // { - // "type": "audio-out", - // "tooltip": true, - // "tooltip-icon-size": 24, - // }, - { - "type": "audio-in", - "tooltip": true, - "tooltip-icon-size": 24, - }, - ], - // Example for ignore object: - // { - // "type": "audio-in", - // "name": "cava" - // }, - "ignore": [ - ], - }, - "systemd-failed-units": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Systemd-failed-units - "hide-on-ok": true, - "format": " {nr_failed}", - "system": true, - "user": true, - }, - "temperature": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Temperature - {{- if .waybar.temperature.thermal_zone }} - "thermal-zone": {{ .waybar.temperature.thermal_zone }}, - {{- else }} - // Leave commented out as the module will pick sensitive defaults - // "thermal-zone": 2, - {{- end }} - {{- if .waybar.temperature.hwmon_path }} - "hwmon-path": {{ .waybar.temperature.hwmon_path | quote }} - {{- else }} - // Leave commented out as the module will pick sensitive defaults - // "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input", - {{- end }} - "format-icons": ["", "", ""], - "critical-threshold": 80, - "format": "{icon} {temperatureC}°C", - "format-critical": "{temperatureC}°C {icon}", - "tooltip": true, - "tooltip-format": "{temperatureC}°C", - }, - "tray": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Tray - "show-passive-items": true, - "spacing": 10, - }, - "wireplumber": { - // see https://github.com/Alexays/Waybar/wiki/Module:-WirePlumber - "format": "{icon} {volume}%", - "format-muted": "󰖁", - "format-icons": ["󰕿", "󰖀", "󰕾"], - "on-scroll-up": "~/bin/sound.sh \"volume\" \"+5%\"", - "on-scroll-down": "~/bin/sound.sh \"volume\" \"-5%\"", - "on-click": "~/bin/sound.sh \"mute\" \"toggle\"", - "on-click-middle": "helvum", - "scroll-step": 5, - "max-volume": 100, - "tooltip": true, - "tooltip-format": "Volume:\t{volume}%\nNode:\t{node_name}", - "smooth-scrolling-threshold": 3, - "node-type": "Audio/Sink", - }, -} diff --git a/dot_config/wireplumber/wireplumber.conf.d/alsa-config.conf b/dot_config/wireplumber/wireplumber.conf.d/alsa-config.conf deleted file mode 100644 index c3d4e4b..0000000 --- a/dot_config/wireplumber/wireplumber.conf.d/alsa-config.conf +++ /dev/null @@ -1,3 +0,0 @@ -monitor.alsa.properties = { - alsa.use-ucm = false -} diff --git a/dot_dir_colors b/dot_dir_colors deleted file mode 100644 index 89c085d..0000000 --- a/dot_dir_colors +++ /dev/null @@ -1,243 +0,0 @@ -# Configuration file for dircolors, a utility to help you set the -# LS_COLORS environment variable used by GNU ls with the --color option. - -# Copyright (C) 1996-2014 Free Software Foundation, Inc. -# Copying and distribution of this file, with or without modification, -# are permitted provided the copyright notice and this notice are preserved. - -# The keywords COLOR, OPTIONS, and EIGHTBIT (honored by the -# slackware version of dircolors) are recognized but ignored. - -# You can copy this file to .dir_colors in your $HOME directory to override -# the system defaults. - -# Below, there should be one TERM entry for each termtype that is colorizable -TERM Eterm -TERM ansi -TERM color-xterm -TERM con132x25 -TERM con132x30 -TERM con132x43 -TERM con132x60 -TERM con80x25 -TERM con80x28 -TERM con80x30 -TERM con80x43 -TERM con80x50 -TERM con80x60 -TERM cons25 -TERM console -TERM cygwin -TERM dtterm -TERM eterm-color -TERM gnome -TERM gnome-256color -TERM hurd -TERM jfbterm -TERM konsole -TERM kterm -TERM linux -TERM linux-c -TERM mach-color -TERM mach-gnu-color -TERM mlterm -TERM putty -TERM putty-256color -TERM rxvt -TERM rxvt-256color -TERM rxvt-cygwin -TERM rxvt-cygwin-native -TERM rxvt-unicode -TERM rxvt-unicode-256color -TERM rxvt-unicode256 -TERM screen -TERM screen-256color -TERM screen-256color-bce -TERM screen-bce -TERM screen-w -TERM screen.Eterm -TERM screen.rxvt -TERM screen.linux -TERM st -TERM st-256color -TERM terminator -TERM vt100 -TERM xterm -TERM xterm-16color -TERM xterm-256color -TERM xterm-88color -TERM xterm-color -TERM xterm-debian - -# Below are the color init strings for the basic file types. A color init -# string consists of one or more of the following numeric codes: -# Attribute codes: -# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed -# Text color codes: -# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white -# Background color codes: -# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white -#NORMAL 00 # no color code at all -#FILE 00 # regular file: use no color at all -RESET 0 # reset to "normal" color -DIR 01;34 # directory -LINK 01;36 # symbolic link. (If you set this to 'target' instead of a - # numerical value, the color is as for the file pointed to.) -MULTIHARDLINK 00 # regular file with more than one link -FIFO 40;33 # pipe -SOCK 01;35 # socket -DOOR 01;35 # door -BLK 40;33;01 # block device driver -CHR 40;33;01 # character device driver -ORPHAN 01;05;37;41 # orphaned syminks -MISSING 01;05;37;41 # ... and the files they point to -SETUID 37;41 # file that is setuid (u+s) -SETGID 30;43 # file that is setgid (g+s) -CAPABILITY 30;41 # file with capability -STICKY_OTHER_WRITABLE 30;42 # dir that is sticky and other-writable (+t,o+w) -OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky -STICKY 37;44 # dir with the sticky bit set (+t) and not other-writable - -# This is for files with execute permission: -EXEC 01;32 - -# List any file extensions like '.gz' or '.tar' that you would like ls -# to colorize below. Put the extension, a space, and the color init string. -# (and any comments you want to add after a '#') - -# If you use DOS-style suffixes, you may want to uncomment the following: -#.cmd 01;32 # executables (bright green) -#.exe 01;32 -#.com 01;32 -#.btm 01;32 -#.bat 01;32 -# Or if you want to colorize scripts even if they do not have the -# executable bit actually set. -#.sh 01;32 -#.csh 01;32 - - # archives or compressed (bright red) -.tar 01;31 -.tgz 01;31 -.arc 01;31 -.arj 01;31 -.taz 01;31 -.lha 01;31 -.lz4 01;31 -.lzh 01;31 -.lzma 01;31 -.tlz 01;31 -.txz 01;31 -.tzo 01;31 -.t7z 01;31 -.zip 01;31 -.z 01;31 -.Z 01;31 -.dz 01;31 -.gz 01;31 -.lrz 01;31 -.lz 01;31 -.lzo 01;31 -.xz 01;31 -.bz2 01;31 -.bz 01;31 -.tbz 01;31 -.tbz2 01;31 -.tz 01;31 -.deb 01;31 -.rpm 01;31 -.jar 01;31 -.war 01;31 -.ear 01;31 -.sar 01;31 -.rar 01;31 -.alz 01;31 -.ace 01;31 -.zoo 01;31 -.cpio 01;31 -.7z 01;31 -.rz 01;31 -.cab 01;31 - -# image formats -.jpg 01;35 -.jpeg 01;35 -.gif 01;35 -.bmp 01;35 -.pbm 01;35 -.pgm 01;35 -.ppm 01;35 -.tga 01;35 -.xbm 01;35 -.xpm 01;35 -.tif 01;35 -.tiff 01;35 -.png 01;35 -.svg 01;35 -.svgz 01;35 -.mng 01;35 -.pcx 01;35 -.mov 01;35 -.mpg 01;35 -.mpeg 01;35 -.m2v 01;35 -.mkv 01;35 -.webm 01;35 -.ogm 01;35 -.mp4 01;35 -.m4v 01;35 -.mp4v 01;35 -.vob 01;35 -.qt 01;35 -.nuv 01;35 -.wmv 01;35 -.asf 01;35 -.rm 01;35 -.rmvb 01;35 -.flc 01;35 -.avi 01;35 -.fli 01;35 -.flv 01;35 -.gl 01;35 -.dl 01;35 -.xcf 01;35 -.xwd 01;35 -.yuv 01;35 -.cgm 01;35 -.emf 01;35 - -# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions -.axv 01;35 -.anx 01;35 -.ogv 01;35 -.ogx 01;35 - -# Document files -.pdf 00;32 -.ps 00;32 -.txt 00;32 -.patch 00;32 -.diff 00;32 -.log 00;32 -.tex 00;32 -.doc 00;32 - -# audio formats -.aac 00;36 -.au 00;36 -.flac 00;36 -.m4a 00;36 -.mid 00;36 -.midi 00;36 -.mka 00;36 -.mp3 00;36 -.mpc 00;36 -.ogg 00;36 -.ra 00;36 -.wav 00;36 - -# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions -.axa 00;36 -.oga 00;36 -.spx 00;36 -.xspf 00;36 diff --git a/dot_editorconfig b/dot_editorconfig deleted file mode 100644 index 8d478bd..0000000 --- a/dot_editorconfig +++ /dev/null @@ -1,66 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -indent_size = 8 -indent_style = tab -insert_final_newline = true -max_line_length = 80 -trim_trailing_whitespace = true - - - -# File extensions -[*.css] -indent_size = 2 -indent_style = space - -[*.go] -# Nothing to add here - -[*.md] -trim_trailing_whitespace = false - -[*.nix] -indent_size = 2 -indent_style = space - -[*.js] -indent_size = 2 -indent_style = space - -[*.php] -indent_size = 4 -indent_style = space - -[*.py] -indent_size = 4 -indent_style = space - -[*.sass] -indent_size = 2 -indent_style = space - -[*.scss] -indent_size = 2 -indent_style = space - -[*.ts] -indent_size = 2 -indent_style = space - -[*.vue] -indent_size = 2 -indent_style = space - -[*.{yaml,yml}] -indent_size = 2 -indent_style = space - - - -# Files -[package.json] -indent_size = 2 -indent_style = space diff --git a/dot_editrc b/dot_editrc deleted file mode 100644 index f06812c..0000000 --- a/dot_editrc +++ /dev/null @@ -1,5 +0,0 @@ -bind "^W" ed-delete-prev-word -bind "^U" vi-kill-line-prev - -# Show all bindings -# bind diff --git a/dot_fzf.bash b/dot_fzf.bash deleted file mode 100644 index 15758e9..0000000 --- a/dot_fzf.bash +++ /dev/null @@ -1,7 +0,0 @@ -# Setup fzf -# --------- -if [[ ! "$PATH" == */home/rtucek/.fzf/bin* ]]; then - PATH="${PATH:+${PATH}:}/home/rtucek/.fzf/bin" -fi - -eval "$(fzf --bash)" diff --git a/dot_gitconfig.tmpl b/dot_gitconfig.tmpl deleted file mode 100644 index 96df348..0000000 --- a/dot_gitconfig.tmpl +++ /dev/null @@ -1,117 +0,0 @@ -[core] - autocrlf = input - editor = nvim - excludesfile = ~/.gitignore_global - ; pager = /usr/share/git/diff-highlight/diff-highlight | less -RFX - pager = delta - ; pager = delta --keep-plus-minus-markers --theme='zenburn' - ; pager = diff-so-fancy | less -RFX - -[user] - name = {{ .git.name }} - email = {{ .git.email }} -{{- if .git.signingkey }} - signingkey = {{ .git.signingkey }} -{{- end }} - -[alias] - fork-point = !bash -c 'diff -u <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | sed -ne \"s/^ //p\" | head -1' - - get-branch = !bash -c 'git branch -ra | grep -i $1' - - lg = !git lg1 - lg1 = log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset) %C(bold yellow)%d%C(reset)' --branches --remotes --tags - lg2 = log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset) %C(bold yellow)%d%C(reset)' --all - patch = !git --no-pager diff --no-color - permission-reset = !git diff -p -R | grep -E \"^(diff|(old|new) mode)\" | git apply - no-ci-push = push -o ci.skip - -[credential] - helper = cache --timeout=3600 - -[init] - defaultBranch = main - -[commit] -{{- if .git.signingkey }} - gpgsign = true -{{- end }} - verbose = true - cleanup = scissors - -[gpg] - program = gpg - -[tag] -{{- if .git.signingkey }} - forceSignAnnotated = true - gpgSign = true -{{- end }} - -[format] - coverFromDescription = auto - coverLetter = auto - signOff = true - -[fetch] - prune = true - -[pull] - rebase = merges - -[push] - default = simple - -[merge] - autoStash = true - conflictstyle = diff3 - ff = false - log = true - tool = nvimdiff - -[mergetool] - prompt = true - -[mergetool "nvimdiff"] - cmd = nvim -d $BASE $LOCAL $REMOTE $MERGED -c '$wincmd w' -c 'wincmd J' - -[diff] - colorMoved = default - renames = copies - tool = nvimdiff - -[difftool] - prompt = true - -[difftool "nvimdiff"] - cmd = nvim -d $LOCAL $REMOTE -c '$wincmd w' -c 'wincmd L' - -[interactive] - diffFilter = delta --color-only --hunk-header-style raw - -[color] - ui = true - -[color "diff"] - commit = yellow bold - frag = magenta bold - meta = 11 - new = green bold - old = red bold - ; whitespace = red reverse - -[diff-so-fancy] - changeHunkIndicators = false - markEmptyLines = false - stripLeadingSymbols = false - useUnicodeRuler = false - -[delta] - color-only = true - hunk-header-style = syntax - line-numbers = true - minus-style = syntax "#3f0001" - ; side-by-side = true - syntax-theme = Monokai Extended - whitespace-error-style = normal - -[rebase] - autoStash = true diff --git a/dot_gitignore_global b/dot_gitignore_global deleted file mode 100644 index 0671cf6..0000000 --- a/dot_gitignore_global +++ /dev/null @@ -1,10 +0,0 @@ -*.sublime-project -*.sublime-workspace -*.swp -*~ -.DS_Store -.tags -.tags.lock -.tags.temp -/.tmuxinator.yml -Session.vim diff --git a/dot_inputrc b/dot_inputrc deleted file mode 100644 index 04c93c3..0000000 --- a/dot_inputrc +++ /dev/null @@ -1,46 +0,0 @@ -# Make Tab autocomplete regardless of filename case -set completion-ignore-case on - -# List all matches in case multiple possible completions are possible -set show-all-if-ambiguous on - -# Immediately add a trailing slash when autocompleting symlinks to directories -set mark-symlinked-directories on - -# Use the text that has already been typed as the prefix for searching through -# commands (i.e. more intelligent Up/Down behavior) - -# Do not autocomplete hidden files unless the pattern explicitly begins with a dot -set match-hidden-files off - -# Show all autocomplete results at once -set page-completions off - -# If there are more than 200 possible completions for a word, ask to show them all -set completion-query-items 200 - -# Show extra file information when completing, like `ls -F` does -set visible-stats on - -# Be more intelligent when autocompleting by also looking at the text after -# the cursor. For example, when the current line is "cd ~/src/mozil", and -# the cursor is on the "z", pressing Tab will not autocomplete it to "cd -# ~/src/mozillail", but to "cd ~/src/mozilla". (This is supported by the -# Readline used by Bash 4.) -set skip-completed-text on - -# Allow UTF-8 input and output, instead of showing stuff like $'\0123\0456' -set input-meta on -set output-meta on -set convert-meta off - -# Key bindings -"\e[B": history-search-forward -"\e[A": history-search-backward -"\e[3;3~": kill-word -"\e[1;5C": forward-word -"\e[1;5D": backward-word -"\e[5C": forward-word -"\e[5D": backward-word -"\e\e[C": forward-word -"\e\e[D": backward-word diff --git a/dot_my.cnf b/dot_my.cnf deleted file mode 100644 index d56a634..0000000 --- a/dot_my.cnf +++ /dev/null @@ -1,10 +0,0 @@ -[mysql] -auto-rehash -auto-vertical-output -pager = less -FX - -[mysql] -pager = less -FX - -[mysqldump] -column-statistics = 0 diff --git a/dot_myclirc b/dot_myclirc deleted file mode 100644 index a2fdb00..0000000 --- a/dot_myclirc +++ /dev/null @@ -1,104 +0,0 @@ -# vi: ft=dosini -[main] - -# Enables context sensitive auto-completion. If this is disabled the all -# possible completions will be listed. -smart_completion = True - -# Multi-line mode allows breaking up the sql statements into multiple lines. If -# this is set to True, then the end of the statements must have a semi-colon. -# If this is set to False then sql statements can't be split into multiple -# lines. End of line (return) is considered as the end of the statement. -multi_line = True - -# Destructive warning mode will alert you before executing a sql statement -# that may cause harm to the database such as "drop table", "drop database" -# or "shutdown". -destructive_warning = True - -# log_file location. -log_file = ~/.mycli.log - -# Default log level. Possible values: "CRITICAL", "ERROR", "WARNING", "INFO" -# and "DEBUG". "NONE" disables logging. -log_level = INFO - -# Log every query and its results to a file. Enable this by uncommenting the -# line below. -# audit_log = ~/.mycli-audit.log - -# Timing of sql statments and table rendering. -timing = True - -# Table format. Possible values: psql, plain, simple, grid, fancy_grid, pipe, -# orgtbl, rst, mediawiki, html, latex, latex_booktabs, tsv. -# Recommended: psql, fancy_grid and grid. -table_format = psql - -# Syntax coloring style. Possible values (many support the "-dark" suffix): -# manni, igor, xcode, vim, autumn, vs, rrt, native, perldoc, borland, tango, emacs, -# friendly, monokai, paraiso, colorful, murphy, bw, pastie, paraiso, trac, default, -# fruity. -# Screenshots at http://mycli.net/syntax -syntax_style = monokai - -# Keybindings: Possible values: emacs, vi. -# Emacs mode: Ctrl-A is home, Ctrl-E is end. All emacs keybindings are available in the REPL. -# When Vi mode is enabled you can use modal editing features offered by Vi in the REPL. -key_bindings = vi - -# Enabling this option will show the suggestions in a wider menu. Thus more items are suggested. -wider_completion_menu = True - -# MySQL prompt -# \t - Product type (Percona, MySQL, Mariadb) -# \u - Username -# \h - Hostname of the server -# \d - Database name -# \n - Newline -prompt = "\t \u@\h:\d> " -prompt_continuation = "-> " - -# Skip intro info on startup and outro info on exit -less_chatty = False - -# Use alias from --login-path instead of host name in prompt -login_path_as_host = False - -# Enable the pager on startup. -enable_pager = True - -# Cause result sets to be displayed vertically if they are too wide for the current window, -# and using normal tabular format otherwise. (This applies to statements terminated by ; or \G.) -; auto_vertical_output = True - -# Custom colors for the completion menu, toolbar, etc. -[colors] -# Completion menus. -Token.Menu.Completions.Completion.Current = "bg:#00aaaa #000000" -Token.Menu.Completions.Completion = "bg:#008888 #ffffff" -Token.Menu.Completions.MultiColumnMeta = "bg:#aaffff #000000" -Token.Menu.Completions.ProgressButton = "bg:#003333" -Token.Menu.Completions.ProgressBar = "bg:#00aaaa" - -# Selected text. -Token.SelectedText = "#ffffff bg:#6666aa" - -# Search matches. (reverse-i-search) -Token.SearchMatch = "#ffffff bg:#4444aa" -Token.SearchMatch.Current = "#ffffff bg:#44aa44" - -# The bottom toolbar. -Token.Toolbar = "bg:#222222 #aaaaaa" -Token.Toolbar.Off = "bg:#222222 #888888" -Token.Toolbar.On = "bg:#222222 #ffffff" - -# Search/arg/system toolbars. -Token.Toolbar.Search = noinherit bold -Token.Toolbar.Search.Text = nobold -Token.Toolbar.System = noinherit bold -Token.Toolbar.Arg = noinherit bold -Token.Toolbar.Arg.Text = nobold - -# Favorite queries. -[favorite_queries] diff --git a/dot_npmrc.tmpl b/dot_npmrc.tmpl deleted file mode 100644 index 587c46e..0000000 --- a/dot_npmrc.tmpl +++ /dev/null @@ -1,8 +0,0 @@ -git=git -git-tag-version=true -sign-git-commit=true -sign-git-tag=true -tag-version-prefix=v -{{- if .npm.token }} -//registry.npmjs.org/:_authToken={{ .npm.token }} -{{- end }} diff --git a/dot_profile b/dot_profile deleted file mode 100644 index 135da8d..0000000 --- a/dot_profile +++ /dev/null @@ -1,29 +0,0 @@ -# ~/.profile: executed by the command interpreter for login shells. -# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login -# exists. -# see /usr/share/doc/bash/examples/startup-files for examples. -# the files are located in the bash-doc package. - -# the default umask is set in /etc/profile; for setting the umask -# for ssh logins, install and configure the libpam-umask package. -#umask 022 - -# if running bash -if [ -n "$BASH_VERSION" ]; then - # include .bashrc if it exists - if [ -f "$HOME/.bashrc" ]; then - . "$HOME/.bashrc" - fi -fi - -# set PATH so it includes user's private bin if it exists -if [ -d "$HOME/bin" ] ; then - PATH="$HOME/bin:$PATH" -fi - -export QT_QPA_PLATFORMTHEME="qt5ct" -export EDITOR=/usr/bin/nvim -export GTK2_RC_FILES="$HOME/.gtkrc-2.0" -# fix "xdg-open fork-bomb" export your preferred browser from here -export BROWSER=/usr/bin/google-chrome-stable -export TERMINAL=/usr/bin/kitty diff --git a/dot_selected_editor b/dot_selected_editor deleted file mode 100644 index d7052d4..0000000 --- a/dot_selected_editor +++ /dev/null @@ -1,2 +0,0 @@ -# Generated by /usr/bin/select-editor -SELECTED_EDITOR="/usr/bin/nvim" diff --git a/dot_signature/ixo-raw.html b/dot_signature/ixo-raw.html deleted file mode 100644 index 4c1e294..0000000 --- a/dot_signature/ixo-raw.html +++ /dev/null @@ -1,22 +0,0 @@ -
- - - - - -
- - IXOPAY - - -
- Rudolf Tucek -
-
- Staff Engineer, IXOPAY
- -
-
\ No newline at end of file diff --git a/dot_signature/ixo-thunderbird.html b/dot_signature/ixo-thunderbird.html deleted file mode 100644 index d868ec1..0000000 --- a/dot_signature/ixo-thunderbird.html +++ /dev/null @@ -1,25 +0,0 @@ - - -
- - - - - -
- - IXOPAY - - -
- Rudolf Tucek -
-
- Staff Engineer, IXOPAY
- -
-
- diff --git a/dot_tmux.conf b/dot_tmux.conf deleted file mode 100644 index 17a1eff..0000000 --- a/dot_tmux.conf +++ /dev/null @@ -1,183 +0,0 @@ -### GENERAL CONFIG ### -# Prefix -unbind C-b -set -g prefix C-Space -bind Space send-prefix - -# Quick config reload -bind-key r source-file ~/.tmux.conf \; display-message "tmux.conf reloaded." - -# Set ability to capture on start and restore on exit window data when -# running an application -setw -g alternate-screen on - -# Scrolling -set -g terminal-overrides 'xterm*:smcup@:rmcup@' - -# Cursor shape -set -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[ q' - -# Ensure colors are set properly -set-option -sa terminal-overrides ',rxvt-unicode-256color:RGB' # urxvt -set-option -sa terminal-overrides ',xterm-256color:RGB' # terminator - -# Set window title -set-option -g set-titles on -set-option -g set-titles-string "#S: #{pane_current_command}" - -# Mouse Mode -set -g mouse on - -# Don't set the clipboard via escape sequence -set-option -s set-clipboard off - - - -### GENERAL KEY BINDINGS ### -# Clock mode (default binding "t" gets overridden via tmux-sessionist plugin) -bind T clock-mode - -# Move back and forward -bind -r 'C-p' previous-window -bind -r 'C-n' next-window - -# Split windows -bind 'c' new-window -c '#{pane_current_path}' - -# send-keys -X copy-pipe-and-cancel "xclip -selection clipboard" -bind -T copy-mode Enter send-keys -X copy-pipe-and-cancel "xclip -selection clipboard" -bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xclip -selection clipboard" -bind ']' run "tmux set-buffer \"$(xclip -o -sel clipboard)\"; tmux paste-buffer" - - - -### TWEAK UI ### -# Derived from -# http://www.hamvocke.com/blog/a-guide-to-customizing-your-tmux-conf/ - -# Start window numbering at 1 for easier switching -set -g base-index 1 -setw -g pane-base-index 1 -# Re-enumerate windows on close -set-option -g renumber-windows on -# Re-name windows, based on current program -setw -g automatic-rename on - -# Panes -set -g pane-border-style fg=black -set -g pane-active-border-style fg=brightred - - -## Status bar design -# Status line -set -g status-justify left -set -g status-bg default -set -g status-fg colour12 -set -g status-interval 1 - - -# Messaging -set -g message-style fg=black -set -g message-style bg=yellow -set -g message-command-style fg=blue -set -g message-command-style bg=black - - -# Window mode -setw -g mode-style bg=colour6 -setw -g mode-style fg=colour0 - - -# Window status -setw -g window-status-format " #F#I:#W#F " -setw -g window-status-current-format " #F#I:#W#F " -setw -g window-status-format "#[fg=magenta]#[bg=black] #I #[bg=cyan]#[fg=colour8] #W " -setw -g window-status-current-format "#[bg=brightmagenta]#[fg=colour8] #I #[fg=colour8]#[bg=colour14] #W " -setw -g window-status-current-style bg=colour0 -setw -g window-status-current-style fg=colour11 -setw -g window-status-current-style dim -setw -g window-status-style bg=green -setw -g window-status-style fg=black -setw -g window-status-style reverse - - -# Info on left (I don't have a session display for now) -set -g status-left '' - - -# Loud or quiet? -set-option -g visual-activity off -set-option -g visual-bell off -set-option -g visual-silence off -set-window-option -g monitor-activity off -set-option -g bell-action none - - -# The modes -setw -g clock-mode-colour colour135 -setw -g mode-style bold -setw -g mode-style fg=colour196 -setw -g mode-style bg=colour238 - - -# The panes -set -g pane-border-style bg=colour235 -set -g pane-border-style fg=colour238 -set -g pane-active-border-style bg=colour236 -set -g pane-active-border-style fg=colour51 - - -# The statusbar -set -g status-position bottom -set -g status-bg colour234 -set -g status-fg colour137 -set -g status-style dim -set -g status-left '' -set -g status-right '#[fg=colour233,bg=colour241,bold] %Y-%m-%d #[fg=colour233,bg=colour245,bold] %H:%M:%S ' -set -g status-right-length 100 -set -g status-left-length 20 - -setw -g window-status-current-style fg=colour81 -setw -g window-status-current-style bg=colour238 -setw -g window-status-current-style bold -setw -g window-status-current-format ' #I#[fg=colour250]:#[fg=colour255]#W#[fg=colour50]#F ' - -setw -g window-status-style fg=colour138 -setw -g window-status-style bg=colour235 -setw -g window-status-style none -setw -g window-status-format ' #I#[fg=colour237]:#[fg=colour250]#W#[fg=colour244]#F ' - -setw -g window-status-bell-style bold -setw -g window-status-bell-style fg=colour255 -setw -g window-status-bell-style bg=colour1 - - -# The messages -set -g message-style bold -set -g message-style fg=colour232 -set -g message-style bg=colour166 - - - -### TMUX PLUGINS ### -# List of plugins -set -g @plugin 'tmux-plugins/tpm' - -set -g @plugin 'tmux-plugins/tmux-copycat' -set -g @plugin 'tmux-plugins/tmux-open' -set -g @plugin 'tmux-plugins/tmux-pain-control' -set -g @plugin 'tmux-plugins/tmux-sensible' -set -g @plugin 'tmux-plugins/tmux-sessionist' -set -g @plugin 'tmux-plugins/tmux-yank' -set -g @plugin 'tmux-plugins/vim-tmux-focus-events' - - - -### TMUX PLUGINS ### -## tmux-yank -set -g @yank_selection 'clipboard' - - - -### INIT PLUGIN MANAGER ### -run '~/.tmux/plugins/tpm/tpm' diff --git a/dot_vim/symlink_init.vim b/dot_vim/symlink_init.vim deleted file mode 100644 index 1e8c5aa..0000000 --- a/dot_vim/symlink_init.vim +++ /dev/null @@ -1 +0,0 @@ -../.vimrc diff --git a/dot_vimrc.tmpl b/dot_vimrc.tmpl deleted file mode 100644 index 11f3862..0000000 --- a/dot_vimrc.tmpl +++ /dev/null @@ -1,837 +0,0 @@ -set nocompatible - -" -----VIM-PLUG----- -" Install vim-plug automatically -if empty(glob('~/.vim/autoload/plug.vim')) - silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs - \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim - augroup vimPlugInstall - autocmd! - autocmd VimEnter * PlugInstall --sync | source $MYVIMRC - augroup end -endif - - -" PLUGINS -call plug#begin('~/.vim/bundle') -if !has('nvim') - " vim-sensible - ONLY for vim - Plug 'tpope/vim-sensible' -endif -if !has('nvim-0.9') - " editorconfig is built-in as of nvim 0.9 - Plug 'editorconfig/editorconfig-vim' -endif -if has('nvim') - " treesitter works only with nvim - Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'} -endif - - -Plug 'airblade/vim-gitgutter' -Plug 'alvan/vim-closetag' -Plug 'arnaud-lb/vim-php-namespace' -Plug 'dense-analysis/ale' -Plug 'djoshea/vim-autoread' -Plug 'dyng/ctrlsf.vim' -Plug 'easymotion/vim-easymotion' -Plug 'gregsexton/matchtag' -Plug 'haya14busa/incsearch-easymotion.vim' -Plug 'haya14busa/incsearch.vim' -Plug 'haya14busa/vim-asterisk' -Plug 'honza/vim-snippets' -Plug 'iamcco/markdown-preview.nvim', { 'do': 'cd app && yarn install' } -Plug 'itchyny/lightline.vim' -Plug 'jiangmiao/auto-pairs' -Plug 'jlanzarotta/bufexplorer' -Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } -Plug 'junegunn/fzf.vim' -Plug 'junegunn/gv.vim' -Plug 'ludovicchabant/vim-gutentags' -Plug 'majutsushi/tagbar' -Plug 'MarcWeber/vim-addon-mw-utils' -Plug 'mattn/emmet-vim' -Plug 'maximbaz/lightline-ale' -Plug 'mbbill/undotree' -Plug 'mg979/vim-visual-multi' -Plug 'mileszs/ack.vim' -Plug 'nelsyeung/twig.vim' -Plug 'neoclide/coc.nvim', { 'branch': 'release' } -Plug 'preservim/nerdcommenter' -Plug 'qpkorr/vim-bufkill' -Plug 'scrooloose/nerdtree' -Plug 'SirVer/ultisnips' -Plug 'svermeulen/vim-subversive' -Plug 'svermeulen/vim-yoink' -Plug 'szw/vim-maximizer' -Plug 'tommcdo/vim-lion' -Plug 'tomtom/tlib_vim' -Plug 'towolf/vim-helm' -Plug 'tpope/vim-fugitive' -Plug 'tpope/vim-markdown' -Plug 'tpope/vim-obsession' -Plug 'tpope/vim-repeat' -Plug 'tpope/vim-surround' -Plug 'tpope/vim-vinegar' -Plug 'vim-php/tagbar-phpctags.vim' -Plug 'vim-scripts/tinykeymap' - -" COC extensions -Plug 'clangd/coc-clangd', {'do': 'yarn install --frozen-lockfile'} -Plug 'fannheyward/coc-pyright', {'do': 'yarn install --frozen-lockfile'} -Plug 'iamcco/coc-svg', {'do': 'yarn install --frozen-lockfile'} -Plug 'iamcco/coc-tailwindcss', {'do': 'yarn install --frozen-lockfile && yarn run build'} -Plug 'josa42/coc-go', {'do': 'yarn install --frozen-lockfile'} -Plug 'josa42/coc-sh', {'do': 'yarn install --frozen-lockfile'} -Plug 'neoclide/coc-css', {'do': 'yarn install --frozen-lockfile'} -Plug 'neoclide/coc-emmet', {'do': 'yarn install --frozen-lockfile'} -Plug 'neoclide/coc-eslint', {'do': 'yarn install --frozen-lockfile'} -Plug 'neoclide/coc-html', {'do': 'yarn install --frozen-lockfile'} -Plug 'neoclide/coc-json', {'do': 'yarn install --frozen-lockfile'} -Plug 'neoclide/coc-stylelint', {'do': 'yarn install --frozen-lockfile'} -Plug 'neoclide/coc-tsserver', {'do': 'yarn install --frozen-lockfile'} -" Plug 'neoclide/coc-vetur', {'do': 'yarn install --frozen-lockfile'} -Plug 'neoclide/coc-yaml', {'do': 'yarn install --frozen-lockfile'} -Plug 'yaegassy/coc-intelephense', {'do': 'yarn install --frozen-lockfile'} -Plug 'yaegassy/coc-volar', {'do': 'yarn install --frozen-lockfile'} - -" COLORSCHEMES -Plug 'crusoexia/vim-monokai' -Plug 'gosukiwi/vim-atom-dark' -Plug 'joshdick/onedark.vim' -Plug 'morhetz/gruvbox' -Plug 'romainl/Apprentice' -call plug#end() - - -" vim-sensible -" Apply configs from vim-sensible -if !has('nvim') - runtime! plugin/sensible.vim -endif - - - -" -----GENERAL----- -" The default leader is a backslash, but we use ',' -" let mapleader = ',' - -set encoding=UTF-8 - -" Fix backspace key" -set backspace=indent,eol,start - -" Set language for spell check -setlocal spell spelllang=en_us -set spell - -" Fixing tabs and indentation -set autoindent -set copyindent -set noexpandtab -set preserveindent -set softtabstop=0 - -" Case-insensitive tab completion -set wildignorecase - -" Make scrolling faster and more accurate -set ttyfast - -" Refresh buffer automatically -set autoread - -" Use system clipboard -set clipboard=unnamedplus - -" Add mouse support -set mouse=a - -" Suppress warning when changing FROM unsaved buffer -set hidden - -" Demand explicit confirmation when closing unsaved buffers -set confirm - -" Deactivate folding -set nofoldenable -set foldmethod=syntax - -" Don't use swapfiles -set noswapfile - -" Don't change default cursor -" Kudos @binaryreverse https://github.com/neovim/neovim/issues/6005 -set guicursor= - -" Disable some unused provider -let g:loaded_python_provider = 0 -let g:loaded_perl_provider = 0 - - - -" -----MAPPINGS----- -" Quick edit ~/.vimrc -nmap ev :e $MYVIMRC - -" Toggle Spell check -nnoremap s :set spell!:set spell? - -" Tab navigation -nnoremap tab :tabnew -nnoremap w :tabclose -nnoremap tabthis :tabnew %:tabprevious - -" Better navigation with wrapped lines -noremap k gk -noremap j gj -noremap 0 g0 -noremap $ g$ - -" Fix whitespace errors -nnoremap fwe :%s/^ //g:nohlsearch - -" Unexpand 4 spaces to tab -nnoremap uex :%s/ /\t/g:nohlsearch - -" Don't yank selected text after overwriting via paste -vnoremap p "_dP - -" Move lines up and down in visual mode -vnoremap :m '>+1gv -vnoremap :m '<-2gv - -" (Un-)Indent lines and preserve selection -vnoremap < <gv -vnoremap > >gv - -" Toggle relative line numbers -nnoremap r :set relativenumber!:set relativenumber? -vnoremap r :set relativenumber!gv - -" Toggle folding -nnoremap f :set foldenable!:set foldenable? - -" Sudo write -cmap w!! w !sudo tee > /dev/null % - - - -" -----AUTO-COMMANDS----- -augroup generalAutocmd - autocmd! - autocmd BufEnter * :syntax sync fromstart -augroup end - - - -" -----FUNCTIONS----- -function! s:DiffWithSaved() - let filetype=&ft - diffthis - vnew | r # | normal! 1Gdd - diffthis - exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype -endfunction -com! DiffSaved call s:DiffWithSaved() - - - -" -----PLUGIN CONFIGURATION----- -if !has('nvim-0.9') - " editorconfig is built-in as of nvim v0.9 - - " editorconfig - " Show visual mark, depending on max_line_length value - let g:EditorConfig_verbose = 1 - let g:EditorConfig_max_line_indicator = "line" - let g:EditorConfig_enable_for_new_buf = 1 - let g:EditorConfig_preserve_formatoptions = 1 - let g:EditorConfig_exclude_patterns = [ - \ '.*\.diff', - \ '.*\.patch', - \ ] -else - " Neovim v0.9 and above specific config - " - " set colorcolumn explicitly, so the ruler of max_line_indicator gets - " displayed - set colorcolumn=+1 -endif - - -" NERDTree -let NERDTreeShowHidden = 1 -nnoremap d :NERDTreeToggle -nnoremap D :NERDTreeFind -let NERDTreeIgnore = [ - \ '\~$', - \ '\.sw[op]$', - \'\.\=tags$', '^\.tags\.\(lock\|temp\)$', - \ '^Session.vim', - \ '^.git$[[dir]]', -\ ] - - -" fzf -nnoremap :Files -nnoremap cwdp :Files =expand('%:p:h') . '/' -nnoremap p :GFiles -nnoremap gp :GFiles? -nnoremap buf :Buffers -nnoremap lin :BLines -nnoremap tag :BTags -nnoremap com :Commits -let g:fzf_layout = { 'down': '~40%' } -let g:fzf_buffers_jump = 1 - - -" vim-gitgutter -let g:gitgutter_sign_added = '+' -let g:gitgutter_sign_removed = '-' -let g:gitgutter_sign_modified = '±' -let g:gitgutter_sign_modified_removed = '±' -if exists('&signcolumn') - set signcolumn=yes -else - let g:gitgutter_sign_column_always = 1 -endif - - -" php.vim -let php_html_load = 0 -let php_html_in_heredoc = 0 -let php_html_in_nowdoc = 0 -let php_sql_query = 0 -let php_sql_heredoc = 0 -let php_sql_nowdoc = 0 - -function! PhpSyntaxOverride() - hi! def link phpDocTags phpDefine - hi! def link phpDocParam phpType -endfunction - -augroup phpVimAutocmd - autocmd! - autocmd FileType php call PhpSyntaxOverride() -augroup end - - -" vim-php-namespace -" Insert use statement -let g:php_namespace_sort_after_insert = 1 - -function! IPhpInsertUse() - call PhpInsertUse() - call feedkeys('a', 'n') -endfunction - - -" Expand Namespace -function! IPhpExpandClass() - call PhpExpandClass() - call feedkeys('a', 'n') -endfunction - -augroup phpInsertUseAutocmd - autocmd! - autocmd FileType php inoremap u :call IPhpInsertUse() - autocmd FileType php noremap u :call PhpInsertUse() - autocmd FileType php inoremap e :call IPhpExpandClass() - autocmd FileType php noremap e :call PhpExpandClass() -augroup end - - -" nerdcommenter -filetype plugin on -let g:NERDSpaceDelims = 1 -let g:NERDDefaultAlign = 'left' -let g:NERDCommentEmptyLines = 1 -let g:NERDCommentEmptyLines = 1 - -" Make NERDCommenter work with vue files -let g:ft = '' -function! NERDCommenter_before() - if &ft == 'vue' - let g:ft = 'vue' - let stack = synstack(line('.'), col('.')) - if len(stack) > 0 - let syn = synIDattr((stack)[0], 'name') - if len(syn) > 0 - let syn = tolower(syn) - exe 'setf '.syn - endif - endif - endif -endfunction -function! NERDCommenter_after() - if g:ft == 'vue' - setf vue - let g:ft = '' - endif -endfunction - - -" vim-fugitive -noremap gstatus :Git -noremap gblame :Git blame -w - - -" tagbar -nnoremap tb :TagbarToggle -" needs manual installation/build of https://github.com/vim-php/phpctags via -" ``` -" cgr techlivezheng/phpctags -" ln -s ~/.config/composer/global/techlivezheng/phpctags/vendor/bin/phpctags ~/.config/composer/vendor/bin/ -" ``` -let g:tagbar_autoclose = 1 - - -" lightline -set laststatus=2 -set noshowmode -let g:lightline = { - \ 'colorscheme': 'onedark', - \ 'active': { - \ 'left': [ - \ ['mode', 'paste'], - \ ['gitbranch', 'readonly', 'filename', 'TreeSitterStatus'], - \ ['gutentags'], - \ ], - \ 'right': [ - \ ['linter_checking', 'linter_errors', 'linter_warnings', 'linter_ok'], - \ ['lineinfo'], - \ ['fileformat', 'fileencoding', 'filetype'], - \ ], - \ }, - \ 'component_function': { - \ 'gitbranch': 'FugitiveHead', - \ 'filename': 'LightlineFilename', - \ 'TreeSitterStatus': 'TreeSitterStatus', - \ }, - \ 'component': { - \ 'lineinfo': '%l>%c', - \ 'tagbar': '%{tagbar#currenttag("[%s]", "", "f")}', - \ 'gutentags': '%{gutentags#statusline("[Generating...]")}', - \ }, - \ 'component_expand': { - \ 'linter_checking': 'lightline#ale#checking', - \ 'linter_warnings': 'lightline#ale#warnings', - \ 'linter_errors': 'lightline#ale#errors', - \ 'linter_ok': 'lightline#ale#ok', - \ }, - \ 'component_type': { - \ 'linter_checking': 'left', - \ 'linter_warnings': 'warning', - \ 'linter_errors': 'error', - \ 'linter_ok': 'left', - \ }, -\ } - -function! LightlineFilename() - let filename = expand('%:t') !=# '' ? expand('%:t') : '[No Name]' - let modified = &modified ? ' +' : '' - return filename . modified -endfunction - -if has('nvim') - function! TreeSitterStatus() - return nvim_treesitter#statusline(500) - endfunction -else - " even tough, tree-sitter is not loaded, lightline expects this function - " just declare a noop so it doesn't break - function! TreeSitterStatus() - return '' - endfunction -endif - - -" gutentags -let g:gutentags_ctags_tagfile = '.tags' -set tags='.tags' - - -" ack.vim -let g:ackprg = 'ag --vimgrep --hidden --smart-case --ignore .git/' -cnoreabbrev Ack Ack! -nnoremap a :Ack! - - -" ctrlsf.vim -let g:ctrlsf_regex_pattern = 1 -let g:ctrlsf_auto_close = 0 -nnoremap A :CtrlSF -let g:ctrlsf_extra_backend_args = { - \ 'ag': '--hidden --smart-case --ignore .git/' -\ } - - -" vim-markdown -augroup vimMarkdownAutocmd - autocmd! - autocmd BufNewFile,BufReadPost *.md.erb set filetype=markdown -augroup end - - -" bufexplorer -let g:bufExplorerShowRelativePath = 1 - - -" ultisnips -let g:UltiSnipsExpandTrigger = 'st' -let g:UltiSnipsJumpForwardTrigger = 'sn' -let g:UltiSnipsJumpBackwardTrigger = 'sb' - - -" ale -nnoremap [e :ALEPreviousWrap -nnoremap ]e :ALENextWrap -let g:ale_fix_on_save = 1 -let g:ale_completion_enabled = 0 -let g:ale_set_highlights = 1 -let g:ale_php_phpstan_level = 9 - -let g:ale_linter_aliases = { - \ 'vue': [ - \ 'css', - \ 'javascript', - \ ] -\ } - -let g:ale_linters = { - \ 'css': [ - \ 'stylelint', - \ ], - \ 'go': [ - \ 'gobuild', - \ 'gofmt', - \ 'golint', - \ 'gotype', - \ 'govet', - \ ], - \ 'javascript': [ - \ 'eslint', - \ ], - \ 'javascriptreact': [ - \ 'eslint', - \ ], - \ 'php': [ - \ 'phpstan', - \ ], - \ 'sass': [ - \ 'stylelint', - \ ], - \ 'scss': [ - \ 'stylelint', - \ ], - \ 'typescript': [ - \ 'eslint', - \ ], - \ 'vue': [ - \ 'eslint', - \ 'stylelint', - \ ], -\ } - -let g:ale_fixers = { - \ 'css': [ - \ 'stylelint', - \ ], - \ 'go': [ - \ 'gofmt', - \ 'goimports', - \ ], - \ 'javascript': [ - \ 'eslint', - \ ], - \ 'javascriptreact': [ - \ 'eslint', - \ ], - \ 'sass': [ - \ 'stylelint', - \ ], - \ 'scss': [ - \ 'stylelint', - \ ], - \ 'typescript': [ - \ 'eslint', - \ ], - \ 'vue': [ - \ 'eslint', - \ 'stylelint', - \ ], -\ } - - -" undotree -nnoremap u :NERDTreeClose:UndotreeToggle -if has("persistent_undo") - set undodir=~/.undodir/ - set undofile -endif - - -" vim-maximizer -let g:maximizer_set_default_mapping = 0 -nmap m :MaximizerToggle! - - -" vim-closetag -let g:closetag_filenames = '*.html,*.xhtml,*.phtml,*.vue,*.twig,*.blade.php' - - -" vim-vue -let g:vue_disable_pre_processors = 1 - - -" incsearch.vim, vim-asterisk & incsearch-easymotion.vim -set hlsearch -set ignorecase -let g:incsearch#auto_nohlsearch = 1 -let g:asterisk#keeppos = 1 -" search -map / (incsearch-forward) -map ? (incsearch-backward) -map g/ (incsearch-stay) -" Search with easymotion -map z/ (incsearch-easymotion-/) -map z? (incsearch-easymotion-?) -map zg/ (incsearch-easymotion-stay) -" search forth- and backwards -map n (incsearch-nohl-n) -map N (incsearch-nohl-N) -" search word under cursor (move) -map * (incsearch-nohl)(asterisk-*) -map # (incsearch-nohl)(asterisk-#) -map g* (incsearch-nohl)(asterisk-g*) -map g# (incsearch-nohl)(asterisk-g#) -" search word under cursor (stay) -map z* (incsearch-nohl)(asterisk-z*) -map z# (incsearch-nohl)(asterisk-z#) -map gz* (incsearch-nohl)(asterisk-gz*) -map gz# (incsearch-nohl)(asterisk-gz#) - - -" COC -" Config -call coc#config('suggest', { - \ 'noselect': 1, - \ 'enablePreselect': 0, - \ }) -call coc#config('diagnostic', { - \ 'displayByAle': 1, - \ 'refreshOnInsertMode': 1, - \ 'signOffset': 999999, -\ }) -call coc#config('yaml.schemas', { - \ 'kubernetes': '*.yaml', -\ }) - -" General config -" Some server have issues with backup files, see #649 -set nobackup -set nowritebackup -" Better display for messages -set cmdheight=2 -" Better experience as with the default 4000 -set updatetime=300 -" Don't give |ins-completion-menu| messages. -set shortmess+=c - -" Configure completion -" Use tab for trigger completion with characters ahead and navigate. -function! CheckBackspace() abort - let col = col('.') - 1 - return !col || getline('.')[col - 1] =~# '\s' -endfunction -inoremap - \ coc#pum#visible() ? coc#pum#next(1): - \ CheckBackspace() ? "\" : - \ coc#refresh() -inoremap - \ coc#pum#visible() ? - \ coc#pum#prev(1) : - \ "\" -" Make to accept selected completion item or notify coc.nvim to format -" u breaks current undo, please make your own choice. -inoremap - \ coc#pum#visible() ? - \ coc#pum#confirm() : - \ "\u\\=coc#on_enter()\" - -" Use to trigger completion. -if has('nvim') - inoremap coc#refresh() -else - inoremap coc#refresh() -endif - -" General mappings -" Remap for rename current word -nmap rn (coc-rename) -" Remap for format selected region -vmap f (coc-format-selected) -nmap f (coc-format-selected) -" Remap keys for gotos -nmap gd (coc-definition) -nmap gy (coc-type-definition) -nmap gi (coc-implementation) -nmap gr (coc-references) -" Use K for show documentation in preview window -nnoremap K :call show_documentation() -function! s:show_documentation() - if (index(['vim','help'], &filetype) >= 0) - execute 'h '.expand('') - else - call CocAction('doHover') - endif -endfunction -" Using CocList -nnoremap a :CocList diagnostics -nnoremap e :CocList extensions -nnoremap c :CocList commands -nnoremap o :CocList outline -nnoremap s :CocList -I symbols -nnoremap j :CocNext -nnoremap k :CocPrev -nnoremap p :CocListResume -" Remap for do codeAction of selected region, ex: `aap` for current paragraph -" vmap a (coc-codeaction-selected) -" nmap a (coc-codeaction-selected) -" Remap for do codeAction of current line -nmap ac (coc-codeaction) -" Fix autofix problem of current line -nmap qf (coc-fix-current) - -" Highlight symbol under cursor on CursorHold -augroup cocCursorhold - autocmd! - " Highlight element under cursor when idle - autocmd CursorHold * silent call CocActionAsync('highlight') - " Show signature help for parameters in insert mode when idle - autocmd CursorHoldI * silent call CocActionAsync('showSignatureHelp') -augroup end - -augroup coc - autocmd! - " Setup formatexpr specified filetype(s). - autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') - " Format/re-organize imports - autocmd BufWritePre *.go :call CocAction('runCommand', 'editor.action.organizeImport') - " Update signature help on jump placeholder - autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') -augroup end - -" Use `:Format` for format current buffer -command! -nargs=0 Format :call CocAction('format') -" Use `:Fold` for fold current buffer -command! -nargs=? Fold :call CocAction('fold', ) -" use `:OR` for organize import of current buffer -command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport') - -{{- if .vim.coc.intelephense_licensekey}} - -" Coc Config (if any) -call coc#config('intelephense', { - \ 'licenceKey': '{{ .vim.coc.intelephense_licensekey }}', -\ }) -{{- end }} - - -" lightline-ale -let g:lightline#ale#indicator_checking = "\uf110" -let g:lightline#ale#indicator_warnings = "\uf071" -let g:lightline#ale#indicator_errors = "\uf05e" -let g:lightline#ale#indicator_ok = "\uf00c" - - -" Tinykeymap -let g:tinykeymaps_default = [] -call tinykeymap#Load('windows') -call tinykeymap#Map('windows', '', 'wincmd >') -call tinykeymap#Map('windows', '', 'wincmd <') -call tinykeymap#Map('windows', '', 'wincmd +') -call tinykeymap#Map('windows', '', 'wincmd -') - - -" vim-yoink -let g:yoinkMaxItems = 50 -let g:yoinkIncludeDeleteOperations = 1 -let g:yoinkSyncSystemClipboardOnFocus = 1 -if has('nvim') - let g:yoinkSavePersistently = 1 -endif - -" Basic functionality -nmap [p (YoinkPostPasteSwapBack) -nmap ]p (YoinkPostPasteSwapForward) -nmap p (YoinkPaste_p) -nmap P (YoinkPaste_P) - -" Swap pointer of current yank -nmap [y (YoinkRotateBack) -nmap ]y (YoinkRotateForward) - - -" vim-subversive -" For supporting yoink in visual mode -xmap s (SubversiveSubstitute) -xmap p (SubversiveSubstitute) -xmap P (SubversiveSubstitute) - - -" vim-lion -let g:lion_squeeze_spaces = 1 - - -" tpope/vim-markdown -let g:markdown_fenced_languages = [ - \ 'bash=sh', - \ 'css', - \ 'html', - \ 'javascript', - \ 'php', - \ 'python', - \ 'vue', -\ ] - - - -" -----VISUAL----- - -" Syntax highlighting -syntax enable - -set t_ut= -set t_Co=256 -colorscheme onedark - -" Link color definition for menu highlighting -highlight! link CocMenuSel PmenuSel - -" Always display tabline -set showtabline=2 - -" Highlight current line -set cursorline - -" Show column length -set ruler - -" Show line numbers -set number - - - -" -----END----- -" Auto sourcing the .vimrc file on safe -augroup sourcingAutocmd - autocmd! - autocmd BufWritePost $MYVIMRC nested source $MYVIMRC - - " Reload lightline - call lightline#init() - call lightline#colorscheme() - call lightline#update() -augroup end diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..b978a1f --- /dev/null +++ b/flake.lock @@ -0,0 +1,200 @@ +{ + "nodes": { + "disko": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1768920986, + "narHash": "sha256-CNzzBsRhq7gg4BMBuTDObiWDH/rFYHEuDRVOwCcwXw4=", + "owner": "nix-community", + "repo": "disko", + "rev": "de5708739256238fb912c62f03988815db89ec9a", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "latest", + "repo": "disko", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1785627969, + "narHash": "sha256-4dtXQk/NMePegK/nWp5NSeuZKLATItOq61lpEvmXqGw=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "427bf4bd9435fdf21321c8cc628c24efc14c0f7a", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1778716662, + "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1785119570, + "narHash": "sha256-Rgs2xKnGLFWQscxUaXX07oyZeuMDOHEbqDOsgliLFGM=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "d4fd24667c8cbef124bb70a20380cab75ec8474d", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "release-26.05", + "repo": "home-manager", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1785734586, + "narHash": "sha256-ODZkEK9Gy50yg6h98u7KkitZ3oc/uuTFK00bh1CRdNA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "531670d871c0e29724a02f3cbcac170adc65b58c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-26.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1785031560, + "narHash": "sha256-OmshNvn2vupOFpYinLUu+1Dnpu4n7Q5N3ggGVNHpkUI=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "0e79af5e3d4dcfcd676ab5ba3f95d2e3352e078c", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1781216227, + "narHash": "sha256-9mUW6gNwoN2SWc/l0fW4svPNOulXLl8ijqKyeSOGgJE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "a0374025a863d007d98e3297f6aa46cc3141c2f0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-26.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixvim": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_2", + "systems": "systems" + }, + "locked": { + "lastModified": 1782919967, + "narHash": "sha256-pRwjfB5HQJ3m8J8bOR43pPHtHI7VUJSqwLA3P06cOY0=", + "owner": "nix-community", + "repo": "nixvim", + "rev": "667c8471f4a0fb24d702d1a61af8609f1a5f1ba6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "nixos-26.05", + "repo": "nixvim", + "type": "github" + } + }, + "root": { + "inputs": { + "disko": "disko", + "flake-parts": "flake-parts", + "home-manager": "home-manager", + "nixpkgs": "nixpkgs", + "nixvim": "nixvim", + "sops-nix": "sops-nix" + } + }, + "sops-nix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1783174389, + "narHash": "sha256-aCWC8ngycU7OdJrU2+Je3qf+1a2ykuBvpPhZT/9tXMc=", + "owner": "Mic92", + "repo": "sops-nix", + "rev": "f1406619a3884cd5c47992a70b8b35c9c0fcb4c9", + "type": "github" + }, + "original": { + "owner": "Mic92", + "repo": "sops-nix", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..c6ce9ad --- /dev/null +++ b/flake.nix @@ -0,0 +1,59 @@ +{ + description = "rtucek's NixOS and Home-Manager flake"; + + inputs = { + flake-parts.url = "github:hercules-ci/flake-parts"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05"; + + nixvim.url = "github:nix-community/nixvim/nixos-26.05"; + + disko = { + url = "github:nix-community/disko/latest"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + home-manager = { + url = "github:nix-community/home-manager/release-26.05"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + sops-nix = { + url = "github:Mic92/sops-nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = + inputs@{ flake-parts, ... }: + flake-parts.lib.mkFlake { inherit inputs; } { + systems = [ "x86_64-linux" ]; + + imports = [ + ./hosts + ]; + + perSystem = + { + config, + self', + inputs', + pkgs, + system, + ... + }: + { + # Per-system attributes can be defined here. The self' and inputs' + # module parameters provide easy access to attributes of the same + # system. + + # Equivalent to inputs'.nixpkgs.legacyPackages.hello; + packages.default = pkgs.hello; + }; + + flake = { + # The usual flake attributes can be defined here, including system- + # agnostic ones like nixosModule and system-enumerating ones, although + # those are more easily expressed in perSystem. + }; + }; +} diff --git a/home/default.nix b/home/default.nix new file mode 100644 index 0000000..011581c --- /dev/null +++ b/home/default.nix @@ -0,0 +1,17 @@ +{ + imports = [ + ./editorconfig + ./git + ./gpg + ./hyprland + ./neovim + ./shell + ./sops + ./tmux + ./tools + ./udiskie + ./xdg + ]; + + programs.home-manager.enable = true; +} diff --git a/home/editorconfig/default.nix b/home/editorconfig/default.nix new file mode 100644 index 0000000..f78d00b --- /dev/null +++ b/home/editorconfig/default.nix @@ -0,0 +1,63 @@ +{ ... }: +{ + editorconfig = { + enable = true; + + settings = { + "*" = { + charset = "utf-8"; + end_of_line = "lf"; + indent_size = 4; + tab_width = 8; + indent_style = "tab"; + insert_final_newline = true; + max_line_length = 100; + trim_trailing_whitespace = true; + }; + + "*.{css,scss,sass}" = { + indent_size = 2; + indent_style = "space"; + }; + + "*.go" = { + tab_width = 8; + indent_style = "tab"; + }; + + "*.html" = { + indent_size = 2; + indent_style = "space"; + }; + + "*.md" = { + trim_trailing_whitespace = false; + }; + + "*.nix" = { + indent_size = 2; + indent_style = "space"; + }; + + "*.{js,ts,json}" = { + indent_size = 2; + indent_style = "space"; + }; + + "*.php" = { + indent_size = 4; + indent_style = "space"; + }; + + "*.py" = { + indent_size = 4; + indent_style = "space"; + }; + + "*.{yml,yaml}" = { + indent_size = 2; + indent_style = "space"; + }; + }; + }; +} diff --git a/home/git/default.nix b/home/git/default.nix new file mode 100644 index 0000000..06c731b --- /dev/null +++ b/home/git/default.nix @@ -0,0 +1,178 @@ +{ pkgs, lib, ... }: +{ + programs.git = + let + bash = "${lib.getExe pkgs.bash}"; + delta = "${lib.getExe pkgs.delta}"; + diff = "${lib.getBin pkgs.diffutils}/bin/diff"; + git = "${lib.getExe pkgs.git}"; + grep = "${lib.getExe pkgs.gnugrep}"; + head = "${lib.getBin pkgs.coreutils-full}/bin/head"; + nvim = "${lib.getExe pkgs.neovim}"; + sed = "${lib.getExe pkgs.gnused}"; + in + { + enable = true; + package = pkgs.gitFull; + + ignores = [ + "/.idea/" + "*.sublime-project" + "*.sublime-workspace" + "*.swp" + "*~" + ".DS_Store" + ".tags" + ".tags.lock" + ".tags.temp" + "/.tmuxinator.yml" + "Session.vim" + ]; + + maintenance.enable = true; + + # # To be set by the importer + # signing = { + # format = "openpgp"; + # key = "0x49593BD010DE4723"; + # signByDefault = true; + # }; + + settings = [ + { + core = { + autocrlf = "input"; + editor = "nvim"; + pager = delta; + }; + } + # # To be set by the importer + # { + # user = { + # name = "Rudolf Tucek"; + # email = "tucek.rudolf@gmail.com"; + # }; + # } + { + alias = { + fork-point = "!${bash} -c '${diff} -u <(${git} rev-list --first-parent \"\${1:-master}\") <(${git} rev-list --first-parent \"\${2:-HEAD}\") | ${sed} -ne \"s/^ //p\" | ${head} -1' -"; + lg = "lg1"; + lg1 = "log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset) %C(bold yellow)%d%C(reset)' --branches --remotes --tags"; + lg2 = "log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset) %C(bold yellow)%d%C(reset)' --all"; + patch = "!${git} --no-pager diff --no-color"; + permission-reset = "!${git} diff -p -R | ${grep} -E \"^(diff|(old|new) mode)\" | ${git} apply"; + }; + } + { + commit = { + verbose = true; + cleanup = "scissors"; + }; + } + { + tag = { + forceSignAnnotated = true; + }; + } + { + format = { + coverFromDescription = "auto"; + coverLetter = "auto"; + signOff = "true"; + }; + } + { + fetch = { + prune = true; + }; + } + { + prune = { + rebase = "merges"; + }; + } + { + pull = { + rebase = "merges"; + }; + } + { + push = { + default = "simple"; + }; + } + { + rebase = { + autoStash = true; + }; + } + { + merge = { + autoStash = true; + conflictstyle = "diff3"; + ff = false; + log = true; + tool = "nvimdiff"; + }; + } + { + mergetool = { + prompt = true; + }; + } + { + "mergetool \"nvimdiff\"" = { + cmd = "${nvim} -d $BASE $LOCAL $REMOTE $MERGED -c '$wincmd w' -c 'wincmd J'"; + }; + } + { + color = { + ui = true; + }; + } + { + diff = { + colorMoved = "default"; + renames = "copies"; + tool = "nvimdiff"; + }; + } + { + difftool = { + prompt = true; + }; + } + { + "difftool \"nvimdiff\"" = { + cmd = "${nvim} -d $LOCAL $REMOTE -c '$wincmd w' -c 'wincmd L'"; + }; + } + { + delta = { + color-only = true; + hunk-header-style = "syntax"; + line-numbers = true; + minus-style = "syntax \"#3f0001\""; + # side-by-side = true; + syntax-theme = "Monokai Extended"; + whitespace-error-style = "normal"; + }; + } + { + interactive = { + diffFilter = "${delta} --color-only --hunk-header-style raw"; + }; + } + { + "color \"diff\"" = { + commit = "yellow bold"; + frag = "magenta bold"; + meta = "11"; + new = "green bold"; + old = "red bold"; + # whitespace = "red reverse"; + }; + } + ]; + }; +} diff --git a/home/gpg/default.nix b/home/gpg/default.nix new file mode 100644 index 0000000..071824d --- /dev/null +++ b/home/gpg/default.nix @@ -0,0 +1,78 @@ +{ pkgs, ... }: +{ + programs.gpg = { + enable = true; + + # Have GPG database being managed by the user. + mutableKeys = true; + mutableTrust = true; + + settings = { + charset = "utf=8"; + default-key = "0x49593BD010DE4723"; + no-emit-version = true; + no-comments = true; + keyid-format = "0xlong"; + with-fingerprint = true; + list-options = "show-uid-validity"; + verify-options = "show-uid-validity"; + use-agent = true; + keyserver = "keys.openpgp.org"; + keyserver-options = [ + "no-honor-keyserver-url" + "include-revoked" + ]; + personal-cipher-preferences = [ + "AES256" + "AES192" + "AES" + "CAST5" + ]; + personal-digest-preferences = [ + "SHA512" + "SHA384" + "SHA256" + "SHA224" + ]; + cert-digest-algo = "SHA512"; + s2k-digest-algo = "SHA512"; + default-preference-list = [ + "SHA512" + "SHA384" + "SHA256" + "SHA224" + "AES256" + "AES192" + "AES" + "CAST5" + "ZLIB" + "BZIP2" + "ZIP" + "Uncompressed" + ]; + }; + }; + + services.gpg-agent = { + enable = true; + pinentry = { + package = pkgs.pinentry-all; + program = "pinentry"; + }; + + enableBashIntegration = true; + enableFishIntegration = true; + + enableScDaemon = true; + enableSshSupport = true; + + # Cache passphrase for the given TTL in seconds. + # Extend the cache lifetime on cache hits. + defaultCacheTtl = 60 * 60; + defaultCacheTtlSsh = 60 * 60; + + # Maximum cache TTL beyond which it cannot be extended. + maxCacheTtl = 60 * 60 * 8; + maxCacheTtlSsh = 60 * 60 * 8; + }; +} diff --git a/home/hyprland/clipboard.nix b/home/hyprland/clipboard.nix new file mode 100644 index 0000000..331f371 --- /dev/null +++ b/home/hyprland/clipboard.nix @@ -0,0 +1,12 @@ +{ pkgs, ... }: +{ + home.packages = [ + pkgs.cliphist + pkgs.wl-clipboard + ]; + + services.cliphist = { + enable = true; + allowImages = true; + }; +} diff --git a/home/hyprland/default.nix b/home/hyprland/default.nix new file mode 100644 index 0000000..f911f7a --- /dev/null +++ b/home/hyprland/default.nix @@ -0,0 +1,16 @@ +{ + imports = [ + ./clipboard.nix + ./dunst.nix + ./fonts.nix + ./hypridle.nix + ./hyprland.nix + ./hyprlock.nix + ./hyprpaper + ./hyprpolkitagent.nix + ./hyprsysteminfo.nix + ./qt.nix + ./rofi.nix + ./waybar + ]; +} diff --git a/home/hyprland/dunst.nix b/home/hyprland/dunst.nix new file mode 100644 index 0000000..8b70081 --- /dev/null +++ b/home/hyprland/dunst.nix @@ -0,0 +1,447 @@ +{ + services.dunst = { + enable = true; + + settings = { + # See dunst(5) for all configuration options + global = { + ### Display ### + + # Which monitor should the notifications be displayed on. + monitor = 0; + + # Display notification on focused monitor. Possible modes are: + # mouse: follow mouse pointer + # keyboard: follow window with keyboard focus + # none: don't follow anything + # + # "keyboard" needs a window manager that exports the + # _NET_ACTIVE_WINDOW property. + # This should be the case for almost all modern window managers. + # + # If this option is set to mouse or keyboard, the monitor option + # will be ignored. + follow = "mouse"; + + ### Geometry ### + + # dynamic width from 0 to 300 + # width = (0, 300) + # constant width of 300 + width = 300; + + # The maximum height of a single notification, excluding the frame. + height = "(0, 150)"; + + # Position the notification in the top right corner + origin = "top-right"; + + # Offset from the origin + offset = "(10, 50)"; + + # Scale factor. It is auto-detected if value is 0. + scale = 0; + + # Maximum number of notification (0 means no limit) + notification_limit = 0; + + ### Progress bar ### + + # Turn on the progess bar. It appears when a progress hint is passed with + # for example dunstify -h int:value:12 + progress_bar = true; + + # Set the progress bar height. This includes the frame, so make sure + # it's at least twice as big as the frame width. + progress_bar_height = 10; + + # Set the frame width of the progress bar + progress_bar_frame_width = 1; + + # Set the minimum width for the progress bar + progress_bar_min_width = 150; + + # Set the maximum width for the progress bar + progress_bar_max_width = 300; + + # Show how many messages are currently hidden (because of + # notification_limit). + indicate_hidden = "yes"; + + # The transparency of the window. Range: [0; 100]. + # This option will only work if a compositing window manager is + # present (e.g. xcompmgr, compiz, etc.). (X11 only) + transparency = 15; + + # Draw a line of "separator_height" pixel height between two + # notifications. + # Set to 0 to disable. + separator_height = 1; + + # Padding between text and separator. + padding = 8; + + # Horizontal padding. + horizontal_padding = 10; + + # Padding between text and icon. + text_icon_padding = 0; + + # Defines width in pixels of frame around the notification window. + # Set to 0 to disable. + frame_width = 0; + + # Defines color of the frame around the notification window. + frame_color = "#788388"; + + # Define a color for the separator. + # possible values are: + # * auto: dunst tries to find a color fitting to the background; + # * foreground: use the same color as the foreground; + # * frame: use the same color as the frame; + # * anything else will be interpreted as a X color. + separator_color = "frame"; + + # Sort messages by urgency. + sort = "yes"; + + # Don't remove messages, if the user is idle (no mouse or keyboard input) + # for longer than idle_threshold seconds. + # Set to 0 to disable. + # A client can set the 'transient' hint to bypass this. See the rules + # section for how to disable this if necessary + # idle_threshold = 120 + + ### Text ### + + font = "Noto Sans 10"; + + # The spacing between lines. If the height is smaller than the + # font height, it will get raised to the font height. + line_height = 0; + + # Possible values are: + # full: Allow a small subset of html markup in notifications: + # bold + # italic + # strikethrough + # underline + # + # For a complete reference see + # . + # + # strip: This setting is provided for compatibility with some broken + # clients that send markup even though it's not enabled on the + # server. Dunst will try to strip the markup but the parsing is + # simplistic so using this option outside of matching rules for + # specific applications *IS GREATLY DISCOURAGED*. + # + # no: Disable markup parsing, incoming notifications will be treated as + # plain text. Dunst will not advertise that it has the body-markup + # capability if this is set as a global setting. + # + # It's important to note that markup inside the format option will be parsed + # regardless of what this is set to. + markup = "full"; + + # The format of the message. Possible variables are: + # %a appname + # %s summary + # %b body + # %i iconname (including its path) + # %I iconname (without its path) + # %p progress value if set ([ 0%] to [100%]) or nothing + # %n progress value if set without any extra characters + # %% Literal % + # Markup is allowed + format = "%s %p\n%b"; + + # Alignment of message text. + # Possible values are "left", "center" and "right". + alignment = "left"; + + # Vertical alignment of message text and icon. + # Possible values are "top", "center" and "bottom". + vertical_alignment = "center"; + + # Show age of message if message is older than show_age_threshold + # seconds. + # Set to -1 to disable. + show_age_threshold = 60; + + # Specify where to make an ellipsis in long lines. + # Possible values are "start", "middle" and "end". + ellipsize = "start"; + + # Ignore newlines '\n' in notifications. + ignore_newline = "no"; + + # Stack together notifications with the same content + stack_duplicates = "true"; + + # Hide the count of stacked notifications with the same content + hide_duplicate_count = "false"; + + # Display indicators for URLs (U) and actions (A). + show_indicators = "yes"; + + ### Icons ### + + # Align icons left/right/off + icon_position = "left"; + + # Scale small icons up to this size, set to 0 to disable. Helpful + # for e.g. small files or high-dpi screens. In case of conflict, + # max_icon_size takes precedence over this. + min_icon_size = 96; + + # Scale larger icons down to this size, set to 0 to disable + max_icon_size = 128; + + # Paths to default icons. + # Managed via nix package path + # icon_path = "/usr/share/icons/Adwaita/96x96/status/:/usr/share/icons/Adwaita/96x96/devices/"; + + ### History ### + + # Should a notification popped up from history be sticky or timeout + # as if it would normally do. + sticky_history = "yes"; + + # Maximum amount of notifications kept in history + history_length = "20"; + + ### Misc/Advanced ### + + # dmenu path. + # dmenu = /usr/bin/dmenu -p dunst: + + # Browser for opening urls in context menu. + # browser = /usr/bin/xdg-open + + # Always run rule-defined scripts, even if the notification is suppressed + always_run_script = "true"; + + # Define the title of the windows spawned by dunst + title = "Dunst"; + + # Define the class of the windows spawned by dunst + class = "Dunst"; + + # Define the corner radius of the notification window + # in pixel size. If the radius is 0, you have no rounded + # corners. + # The radius will be automatically lowered if it exceeds half of the + # notification height to avoid clipping text and/or icons. + corner_radius = 0; + + # Ignore the dbus closeNotification message. + # Useful to enforce the timeout set by dunst configuration. Without this + # parameter, an application may close the notification sent before the + # user defined timeout. + ignore_dbusclose = "false"; + + ### Wayland ### + # These settings are Wayland-specific. They have no effect when using X11 + + # Uncomment this if you want to let notications appear under fullscreen + # applications (default: overlay) + # layer = top + + # Set this to true to use X11 output on Wayland. + force_xwayland = false; + + ### Legacy + + # Use the Xinerama extension instead of RandR for multi-monitor support. + # This setting is provided for compatibility with older nVidia drivers that + # do not support RandR and using it on systems that support RandR is highly + # discouraged. + # + # By enabling this setting dunst will not be able to detect when a monitor + # is connected or disconnected which might break follow mode if the screen + # layout changes. + force_xinerama = "false"; + + ### mouse + + # Defines list of actions for each mouse event + # Possible values are: + # * none: Don't do anything. + # * do_action: Invoke the action determined by the action_name rule. If there is no + # such action, open the context menu. + # * open_url: If the notification has exactly one url, open it. If there are multiple + # ones, open the context menu. + # * close_current: Close current notification. + # * close_all: Close all notifications. + # * context: Open context menu for the notification. + # * context_all: Open context menu for all notifications. + # These values can be strung together for each mouse event, and + # will be executed in sequence. + mouse_left_click = "close_current"; + mouse_middle_click = "do_action, close_current"; + mouse_right_click = "close_all"; + }; + + # Experimental features that may or may not work correctly. Do not expect them + # to have a consistent behaviour across releases. + experimental = { + # Calculate the dpi to use on a per-monitor basis. + # If this setting is enabled the Xft.dpi value will be ignored and instead + # dunst will attempt to calculate an appropriate dpi value for each monitor + # using the resolution and physical size. This might be useful in setups + # where there are multiple screens with very different dpi values. + per_monitor_dpi = "false"; + }; + + urgency_low = { + # IMPORTANT: colors have to be defined in quotation marks. + # Otherwise the "#" and following would be interpreted as a comment. + background = "#263238"; + foreground = "#556064"; + timeout = 10; + # Icon for notifications with low urgency, uncomment to enable + #new_icon = /path/to/icon + }; + + urgency_normal = { + background = "#263238"; + foreground = "#F9FAF9"; + timeout = 10; + # Icon for notifications with normal urgency, uncomment to enable + #new_icon = /path/to/icon + }; + + urgency_critical = { + background = "#D62929"; + foreground = "#F9FAF9"; + frame_color = "#ff0000"; + timeout = 0; + # Icon for notifications with critical urgency, uncomment to enable + #new_icon = /path/to/icon + }; + + # Every section that isn't one of the above is interpreted as a rules to + # override settings for certain messages. + # + # Messages can be matched by + # appname (discouraged, see desktop_entry) + # body + # category + # desktop_entry + # icon + # match_transient + # msg_urgency + # stack_tag + # summary + # + # and you can override the + # background + # foreground + # format + # frame_color + # fullscreen + # new_icon + # set_stack_tag + # set_transient + # set_category + # timeout + # urgency + # skip_display + # history_ignore + # action_name + # word_wrap + # ellipsize + # alignment + # + # Shell-like globbing will get expanded. + # + # Instead of the appname filter, it's recommended to use the desktop_entry filter. + # GLib based applications export their desktop-entry name. In comparison to the appname, + # the desktop-entry won't get localized. + # + # SCRIPTING + # You can specify a script that gets run when the rule matches by + # setting the "script" option. + # The script will be called as follows: + # script appname summary body icon urgency + # where urgency can be "LOW", "NORMAL" or "CRITICAL". + # + # NOTE: It might be helpful to run dunst -print in a terminal in order + # to find fitting options for rules. + + # Disable the transient hint so that idle_threshold cannot be bypassed from the + # client + #[transient_disable] + # match_transient = yes + # set_transient = no + # + # Make the handling of transient notifications more strict by making them not + # be placed in history. + #[transient_history_ignore] + # match_transient = yes + # history_ignore = yes + + # fullscreen values + # show: show the notifications, regardless if there is a fullscreen window opened + # delay: displays the new notification, if there is no fullscreen window active + # If the notification is already drawn, it won't get undrawn. + # pushback: same as delay, but when switching into fullscreen, the notification will get + # withdrawn from screen again and will get delayed like a new notification + #[fullscreen_delay_everything] + # fullscreen = delay + #[fullscreen_show_critical] + # msg_urgency = critical + # fullscreen = show + + #[espeak] + # summary = "*" + # script = dunst_espeak.sh + + #[script-test] + # summary = "*script*" + # script = dunst_test.sh + + #[ignore] + # # This notification will not be displayed + # summary = "foobar" + # skip_display = true + + #[history-ignore] + # # This notification will not be saved in history + # summary = "foobar" + # history_ignore = yes + + #[skip-display] + # # This notification will not be displayed, but will be included in the history + # summary = "foobar" + # skip_display = yes + + #[signed_on] + # appname = Pidgin + # summary = "*signed on*" + # urgency = low + # + #[signed_off] + # appname = Pidgin + # summary = *signed off* + # urgency = low + # + #[says] + # appname = Pidgin + # summary = *says* + # urgency = critical + # + #[twitter] + # appname = Pidgin + # summary = *twitter.com* + # urgency = normal + # + #[stack-volumes] + # appname = "some_volume_notifiers" + # set_stack_tag = "volume" + # + # vim: ft=cfg + }; + }; +} diff --git a/home/hyprland/fonts.nix b/home/hyprland/fonts.nix new file mode 100644 index 0000000..0f7dea6 --- /dev/null +++ b/home/hyprland/fonts.nix @@ -0,0 +1,22 @@ +{ pkgs, ... }: +{ + home.packages = with pkgs; [ + # Icon fonts + material-symbols + + # Sans(Serif) fonts + libertinus + noto-fonts + noto-fonts-cjk-sans + noto-fonts-color-emoji + roboto + (google-fonts.override { fonts = [ "Inter" ]; }) + + # Monospace fonts + jetbrains-mono + + # Nerdfonts + nerd-fonts.jetbrains-mono + nerd-fonts.symbols-only + ]; +} diff --git a/home/hyprland/hypridle.nix b/home/hyprland/hypridle.nix new file mode 100644 index 0000000..8060e8f --- /dev/null +++ b/home/hyprland/hypridle.nix @@ -0,0 +1,64 @@ +{ lib, pkgs, ... }: +let + pidof = "${lib.getBin pkgs.procps}/bin/pidof"; + hyprlock = "${lib.getExe pkgs.hyprlock}"; + loginctl = "${lib.getBin pkgs.systemd}/bin/loginctl"; + hyprctl = "${lib.getBin pkgs.hyprland}/bin/hyprctl"; + brightnessctl = "${lib.getExe pkgs.brightnessctl}"; + systemctl = "${lib.getBin pkgs.systemd}/bin/systemctl"; +in +{ + services.hypridle = { + enable = true; + settings = { + + general = { + # Avoid starting multiple hyprlock instances. + lock_cmd = "${pidof} ${hyprlock} || ${hyprlock}"; + # Lock before suspend. + before_sleep_cmd = "${loginctl} lock-session"; + # To avoid having to press a key twice to turn on the display. + after_sleep_cmd = "${hyprctl} dispatch dpms on"; + }; + + listener = [ + { + # Dim screen + timeout = 150; + # Set monitor backlight to minimum, avoid 0 on OLED monitor. + on-timeout = "${brightnessctl} -s set 10"; + # Monitor backlight restore. + on-resume = "${brightnessctl} -r"; + } + { + # Turn off keyboard backlight. + timeout = 150; + # Turn off keyboard backlight. + on-timeout = "${brightnessctl} -sd chromeos::kbd_backlight set 1"; + # Turn on keyboard backlight. + on-resume = "${brightnessctl} -rd chromeos::kbd_backlight"; + } + { + # Lock screen + timeout = 300; + # Lock screen when timeout has passe + on-timeout = "${loginctl} lock-session"; + } + { + # Turn off screen + timeout = 450; + # Screen off when timeout has passed + on-timeout = "${hyprctl} dispatch dpms off"; + # Screen on when activity is detected after timeout has fired. + on-resume = "${hyprctl} dispatch dpms on && brightnessctl -r"; + } + { + # Suspend the machine + timeout = 600; + # Suspend pc + on-timeout = "${systemctl} suspend"; + } + ]; + }; + }; +} diff --git a/home/hyprland/hyprland.nix b/home/hyprland/hyprland.nix new file mode 100644 index 0000000..72b5983 --- /dev/null +++ b/home/hyprland/hyprland.nix @@ -0,0 +1,740 @@ +{ lib, pkgs, ... }: +{ + wayland.windowManager.hyprland = + let + # Mod key + MOD = "ALT"; + in + { + enable = true; + xwayland.enable = true; + + systemd.enable = true; + systemd.variables = [ "--all" ]; + + configType = "lua"; + settings = + let + # Paths to binaries + backlight = "${import ../scripts/backlight.nix { inherit pkgs lib; }}/bin/backlight.sh"; + date = "${lib.getBin pkgs.coreutils-full}/bin/date"; + fileManager = "${lib.getExe pkgs.pcmanfm}"; + filemanager-cli = "${lib.getExe pkgs.yazi}"; + grimblast = "${lib.getExe pkgs.grimblast}"; + logout = "${lib.getExe pkgs.hyprshutdown}"; + menu = "${lib.getExe pkgs.rofi}"; + playerctl = "${lib.getExe pkgs.playerctl}"; + rfkill-toggle = "${import ../scripts/rfkill-toggle.nix { inherit pkgs lib; }}/bin/rfkill-toggle.sh"; + sound = "${import ../scripts/sound.nix { inherit pkgs lib; }}/bin/sound.sh"; + terminal = "${lib.getExe pkgs.kitty}"; + xdg-user-dirs = "${lib.getBin pkgs.xdg-user-dirs}/bin/xdg-user-dir"; + + # Smart gaps + # See https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/#smart-gaps + smart-gaps = { + workspace-rule = [ + { + workspace = "w[tv1]"; + gaps_out = 9; + gaps_in = 0; + } + { + workspace = "f[1]"; + gaps_out = 0; + gaps_in = 0; + } + ]; + window-rule = [ + { + match = { + float = false; + workspace = "w[tv1]"; + }; + border_size = 2; + rounding = 10; + } + { + match = { + float = false; + workspace = "f[1]"; + }; + border_size = 0; + rounding = 0; + } + ]; + }; + in + with lib.generators; + { + ######################## + ## VARS + ######################## + + # mod = { + # _var = "ALT"; + # }; + + ######################## + ## Monitors + ######################## + + # See https://wiki.hypr.land/Configuring/Basics/Monitors/ + monitor = [ + { + # Sensitive default for arbitrary new monitors + output = ""; + mode = "preferred"; + position = "auto"; + scale = 1; + } + ]; + + ############################# + ### ENVIRONMENT VARIABLES ### + ############################# + + # See https://wiki.hypr.land/Configuring/Environment-variables/ + env = [ + { + _args = [ + "XCURSOR_SIZE" + "24" + ]; + } + { + _args = [ + "HYPRCURSOR_SIZE" + "24" + ]; + } + ]; + + ################### + ### PERMISSIONS ### + ################### + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#ecosystem + config.ecosystem = { + no_update_news = true; + no_donation_nag = true; + # enforce_permissions = true; + }; + + ##################### + ### LOOK AND FEEL ### + ##################### + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#general + config.general = { + gaps_in = 5; + gaps_out = 20; + + border_size = 2; + + col.active_border = { + colors = [ + "rgba(33ccffee)" + "rgba(00ff99ee)" + ]; + angle = 45; + }; + col.inactive_border = { + colors = [ "rgba(595959aa)" ]; + }; + + # Set to true enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = true; + + # See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Tearing/ + allow_tearing = false; + + layout = "dwindle"; + }; + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#decoration + config.decoration = { + rounding = 10; + rounding_power = 2; + + # Change transparency of focused and unfocused windows + active_opacity = 1.0; + inactive_opacity = 1.0; + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#shadow + shadow = { + enabled = true; + range = 4; + render_power = 3; + color = "rgba(1a1a1aee)"; + }; + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#blur + blur = { + enabled = true; + size = 3; + passes = 1; + vibrancy = 0.1696; + }; + }; + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#animations + # as well as https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/ + config.animations = { + enabled = true; + }; + curve = [ + { + _args = [ + "easeOutQuint" + { + type = "bezier"; + points = [ + [ + 0.23 + 1 + ] + [ + 0.32 + 1 + ] + ]; + } + ]; + } + { + _args = [ + "easeInOutCubic" + { + type = "bezier"; + points = [ + [ + 0.65 + 0.05 + ] + [ + 0.36 + 1 + ] + ]; + } + ]; + } + { + _args = [ + "linear" + { + type = "bezier"; + points = [ + [ + 0 + 0 + ] + [ + 1 + 1 + ] + ]; + } + ]; + } + { + _args = [ + "almostLinear" + { + type = "bezier"; + points = [ + [ + 0.5 + 0.5 + ] + [ + 0.75 + 1.0 + ] + ]; + } + ]; + } + { + _args = [ + "quick" + { + type = "bezier"; + points = [ + [ + 0.15 + 0 + ] + [ + 0.1 + 1 + ] + ]; + } + ]; + } + ]; + animation = [ + { + leaf = "global"; + enabled = true; + speed = 10; + bezier = "default"; + } + { + leaf = "border"; + enabled = true; + speed = 5.39; + bezier = "easeOutQuint"; + } + { + leaf = "windows"; + enabled = true; + speed = 4.79; + bezier = "easeOutQuint"; + } + { + leaf = "windowsIn"; + enabled = true; + speed = 4.1; + bezier = "easeOutQuint"; + stye = "popin 87%"; + } + { + leaf = "windowsOut"; + enabled = true; + speed = 1.49; + bezier = "linear"; + style = "popin 87%"; + } + { + leaf = "fadeIn"; + enabled = true; + speed = 1.73; + bezier = "almostLinear"; + } + { + leaf = "fadeOut"; + enabled = true; + speed = 1.46; + bezier = "almostLinear"; + } + { + leaf = "fade"; + enabled = true; + speed = 3.03; + bezier = "quick"; + } + { + leaf = "layers"; + enabled = true; + speed = 3.81; + bezier = "easeOutQuint"; + } + { + leaf = "layersIn"; + enabled = true; + speed = 4; + bezier = "easeOutQuint"; + style = "fade"; + } + { + leaf = "layersOut"; + enabled = true; + speed = 1.5; + bezier = "linear"; + style = "fade"; + } + { + leaf = "fadeLayersIn"; + enabled = true; + speed = 1.79; + bezier = "almostLinear"; + } + { + leaf = "fadeLayersOut"; + enabled = true; + speed = 1.39; + bezier = "almostLinear"; + } + { + leaf = "workspaces"; + enabled = true; + speed = 1.94; + bezier = "almostLinear"; + style = "fade"; + } + { + leaf = "workspacesIn"; + enabled = true; + speed = 1.21; + bezier = "almostLinear"; + style = "fade"; + } + { + leaf = "workspacesOut"; + enabled = true; + speed = 1.94; + bezier = "almostLinear"; + style = "fade"; + } + ]; + + # Dwindle Layout + # See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ + config.dwindle.preserve_split = true; + + # Master Layout + # See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ + config.master.new_status = "master"; + + # Scrolling Layout + # See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ + config.scrolling.fullscreen_on_one_column = true; + + # Get rid of default wallpaper + config.misc = { + force_default_wallpaper = false; + disable_hyprland_logo = true; + }; + + ############# + ### INPUT ### + ############# + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#input + config.input = { + kb_layout = "us,de"; + kb_variant = ""; + kb_model = ""; + kb_options = ""; + kb_rules = ""; + + follow_mouse = true; + + sensitivity = 0; # between -1.0 and 1.0; 0 means no modification. + + touchpad.natural_scroll = true; + }; + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#gestures + config.gesture = [ + { + fingers = 3; + direction = "horizontal"; + action = "workspace"; + } + ]; + + ##################### + #### KEYBINDINGS #### + ##################### + + # See https://wiki.hypr.land/Configuring/Basics/Binds/ + + bind = [ + # Common bindings + { + _args = [ + "${MOD} + Q" + (mkLuaInline "hl.dsp.exec_cmd('${terminal}')") + ]; + } + { + _args = [ + "${MOD} + C" + (mkLuaInline "hl.dsp.window.close()") + ]; + } + { + _args = [ + "${MOD} + M" + (mkLuaInline "hl.dsp.exec_cmd('${logout}')") + ]; + } + { + _args = [ + "${MOD} + E" + (mkLuaInline "hl.dsp.exec_cmd('${fileManager}')") + ]; + } + { + _args = [ + "${MOD} + SHIFT + E" + (mkLuaInline "hl.dsp.exec_cmd('${terminal} ${filemanager-cli}')") + ]; + } + { + _args = [ + "${MOD} + V" + (mkLuaInline "hl.dsp.window.float({ action = \"toggle\" })") + ]; + } + { + _args = [ + "${MOD} + R" + (mkLuaInline "hl.dsp.exec_cmd('${menu} -show drun -drun-show-actions')") + ]; + } + { + _args = [ + "${MOD} + P" + (mkLuaInline "hl.dsp.window.pseudo()") + ]; + } + { + _args = [ + "${MOD} + J" + (mkLuaInline "hl.dsp.layout(\"togglesplit\")") + ]; + } + { + _args = [ + "${MOD} + F" + (mkLuaInline "hl.dsp.window.fullscreen({ [\"mode\"] = \"maximized\" })") + ]; + } + + # Move focus with main mod + arrow keys + { + _args = [ + "${MOD} + left" + (mkLuaInline "hl.dsp.focus({ [\"direction\"] = \"l\" })") + ]; + } + { + _args = [ + "${MOD} + right" + (mkLuaInline "hl.dsp.focus({ [\"direction\"] = \"r\" })") + ]; + } + { + _args = [ + "${MOD} + up" + (mkLuaInline "hl.dsp.focus({ [\"direction\"] = \"u\" })") + ]; + } + { + _args = [ + "${MOD} + down" + (mkLuaInline "hl.dsp.focus({ [\"direction\"] = \"d\" })") + ]; + } + + # Special workspace (aka scratchpad) + { + _args = [ + "${MOD} + S" + (mkLuaInline "hl.dsp.workspace.toggle_special(\"magic\")") + ]; + } + { + _args = [ + "${MOD} + SHIFT + S" + (mkLuaInline "hl.dsp.workspace.move({ [\"workspace\"] = \"special:magic\", [\"monitor\"] = \"current\" })") + ]; + } + + # Scroll through existing workspaces with mod + scroll + { + _args = [ + "${MOD} + mouse_down" + (mkLuaInline "hl.dsp.focus({ [\"workspace\"] = \"m+1\" })") + ]; + } + { + _args = [ + "${MOD} + mouse_up" + (mkLuaInline "hl.dsp.focus({ [\"workspace\"] = \"m-1\" })") + ]; + } + + # Move/resize windows with mod + LMB/RMB and dragging + { + _args = [ + "${MOD} + mouse:272" + (mkLuaInline "hl.dsp.window.drag()") + { mouse = true; } + ]; + } + { + _args = [ + "${MOD} + mouse:273" + (mkLuaInline "hl.dsp.window.resize()") + { mouse = true; } + ]; + } + + # Multimedia keys + { + _args = [ + "XF86AudioRaiseVolume" + (mkLuaInline "hl.dsp.exec_cmd(\"${sound} volume '+5%'\")") + { + locked = true; + repeating = true; + } + ]; + } + { + _args = [ + "XF86AudioLowerVolume" + (mkLuaInline "hl.dsp.exec_cmd(\"${sound} volume '-5%'\")") + { + locked = true; + repeating = true; + } + ]; + } + { + _args = [ + "XF86AudioMute" + (mkLuaInline "hl.dsp.exec_cmd(\"${sound} mute toggle\")") + { + locked = true; + repeating = true; + } + ]; + } + + # Brightness control + { + _args = [ + "XF86MonBrightnessUp" + (mkLuaInline "hl.dsp.exec_cmd(\"${backlight} '+5%'\")") + { + locked = true; + repeating = true; + } + ]; + } + { + _args = [ + "XF86MonBrightnessDown" + (mkLuaInline "hl.dsp.exec_cmd(\"${backlight} '-5%'\")") + { + locked = true; + repeating = true; + } + ]; + } + + # Multimedia control + { + _args = [ + "XF86AudioNext" + (mkLuaInline "hl.dsp.exec_cmd(\"${playerctl} 'next'\")") + { locked = true; } + ]; + } + { + _args = [ + "XF86AudioPrev" + (mkLuaInline "hl.dsp.exec_cmd(\"${playerctl} 'previous'\")") + { locked = true; } + ]; + } + { + _args = [ + "XF86AudioPlay" + (mkLuaInline "hl.dsp.exec_cmd(\"${playerctl} 'play-pause'\")") + { locked = true; } + ]; + } + { + _args = [ + "XF86AudioPause" + (mkLuaInline "hl.dsp.exec_cmd(\"${playerctl} 'play-pause'\")") + { locked = true; } + ]; + } + + # Screenshots + { + _args = [ + "Print" + (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify save area \"$(${xdg-user-dirs} PICTURES)/$(${date} --utc \\'+%F_%H.%M.%S\\').png')") + { locked = true; } + ]; + } + { + _args = [ + "${MOD} + Print" + (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify copy area')") + { locked = true; } + ]; + } + { + _args = [ + "CTRL + Print" + (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify save active \"$(${xdg-user-dirs} PICTURES)/$(${date} --utc \\'+%F_%H.%M.%S\\').png')") + { locked = true; } + ]; + } + { + _args = [ + "${MOD} + CTRL + Print" + (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify copy active')") + { locked = true; } + ]; + } + + # Other XF86 key bindings + { + _args = [ + "XF86RFKill" + (mkLuaInline "hl.dsp.exec_cmd('${rfkill-toggle}')") + { locked = true; } + ]; + } + ]; + + ################################ + #### WINDOWS AND WORKSPACES #### + ################################ + + # See https://wiki.hypr.land/Configuring/Basics/Window-Rules/ + # and https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/ + workspace_rule = smart-gaps.workspace-rule ++ [ ]; + window_rule = smart-gaps.window-rule ++ [ + # Suppress maximize request from all apps + { + name = "suppress-maximize-events"; + match = { + class = ".*"; + }; + + suppress_event = "maximize"; + } + { + name = "fix-xwayland-drags"; + match = { + class = "^$"; + title = "^$"; + xwayland = true; + float = true; + fullscreen = false; + pin = false; + }; + + no_focus = true; + } + ]; + }; + + extraConfig = '' + for i = 1, 10 do + local key = i % 10 -- 10 maps to key 0 + + -- Switch workspaces with mod + [0-9] + hl.bind("${MOD} + " .. key, hl.dsp.focus({ ["workspace"] = i})) + + -- Move active window to a workspace with mod + SHIFT + [0-9] + hl.bind("${MOD} + SHIFT + " .. key, hl.dsp.window.move({ ["workspace"] = i })) + + -- Move active window to a workspace with mod + SHIFT + [0-9] + hl.bind("${MOD} + CTRL + SHIFT + " .. key, hl.dsp.window.move({ ["workspace"] = i, ["follow"] = false })) + end + ''; + }; +} diff --git a/home/hyprland/hyprlock.nix b/home/hyprland/hyprlock.nix new file mode 100644 index 0000000..3878a6d --- /dev/null +++ b/home/hyprland/hyprlock.nix @@ -0,0 +1,120 @@ +{ + programs.hyprlock = { + # Note: `security.pam.services.hyprlock.enable = true` is required in order + # to work. + enable = true; + + settings = + let + fingerprint_auth_enabled = false; + in + { + # Refer https://wiki.hypr.land/Hypr-Ecosystem/hyprlock/ + "$font" = "Monospace"; + + general = { + hide_cursor = false; + ignore_empty_input = true; + immediate_render = false; + text_trim = true; + screencopy_mode = 0; + fail_timeout = 2000; # 2 seconds + }; + + auth = { + pam = { + enabled = true; + module = "hyprlock"; + }; + fingerprint = { + enabled = fingerprint_auth_enabled; + ready_message = "Scan fingerprint to unlock or enter password"; + present_message = "Scanning..."; + retry_delay = 250; # in milliseconds + }; + }; + + animations = { + enabled = true; + bezier = "linear, 1, 1, 0, 0"; + animation = [ + "fadeIn, 1, 5, linear" + "fadeOut, 1, 5, linear;" + "inputFieldDots, 1, 2, linear" + ]; + }; + + background = { + monitor = ""; + path = "screenshot"; + blur_passes = 3; + }; + + input-field = { + monitor = ""; + size = "20%, 5%"; + outline_thickness = 3; + inner_color = "rgba(0, 0, 0, 0.0)"; # no fill + + outer_color = "rgba(33ccffee) rgba(00ff99ee) 45deg"; + check_color = "rgba(00ff99ee) rgba(ff6633ee) 120deg"; + fail_color = "rgba(ff6633ee) rgba(ff0066ee) 40deg"; + + font_color = "rgb(143, 143, 143)"; + fade_on_empty = false; + rounding = 15; + + font_family = "$font"; + placeholder_text = if fingerprint_auth_enabled then "$FPRINTPROMPT" else "Password"; + fail_text = if fingerprint_auth_enabled then "$FPRINTFAIL" else "$PAMFAIL"; + + # Uncomment to use a letter instead of a dot to indicate the typed password + # dots_text_format = "*"; + # dots_size = 0.4; + dots_spacing = 0.3; + + # Uncomment to use an input indicator that does not show the password + # length (similar to swaylock's input indicator) + # hide_input = true; + position = "0, -20"; + halign = "center"; + valign = "center"; + }; + + label = [ + { + # TIME + monitor = ""; + text = "$TIME"; # ref. https://wiki.hypr.land/Hypr-Ecosystem/hyprlock/#variable-substitution + font_size = 90; + font_family = "$font"; + + position = "-30, 0"; + halign = "right"; + valign = "top"; + } + { + # DATE + monitor = ""; + text = "cmd[update:60000] date +\"%A, %d %B %Y\""; # update every 60 seconds + font_size = 25; + font_family = "$font"; + + position = "-30, -150"; + halign = "right"; + valign = "top"; + } + { + monitor = ""; + text = "$LAYOUT[en,de]"; + font_size = 24; + onclick = "hyprctl switchxkblayout all next"; + + position = "0, 80"; + halign = "center"; + valign = "center"; + } + ]; + }; + }; +} diff --git a/home/hyprland/hyprpaper/default.nix b/home/hyprland/hyprpaper/default.nix new file mode 100644 index 0000000..d1e6d73 --- /dev/null +++ b/home/hyprland/hyprpaper/default.nix @@ -0,0 +1,14 @@ +{ ... }: +{ + services.hyprpaper = { + enable = true; + settings = { + splash = false; + wallpaper = { + monitor = ""; + path = toString ./screensaver.jpeg; + fit_mode = "cover"; + }; + }; + }; +} diff --git a/dot_config/hypr/screensaver.jpeg b/home/hyprland/hyprpaper/screensaver.jpeg similarity index 100% rename from dot_config/hypr/screensaver.jpeg rename to home/hyprland/hyprpaper/screensaver.jpeg diff --git a/home/hyprland/hyprpolkitagent.nix b/home/hyprland/hyprpolkitagent.nix new file mode 100644 index 0000000..79f55e0 --- /dev/null +++ b/home/hyprland/hyprpolkitagent.nix @@ -0,0 +1,5 @@ +{ + services.hyprpolkitagent = { + enable = true; + }; +} diff --git a/home/hyprland/hyprsysteminfo.nix b/home/hyprland/hyprsysteminfo.nix new file mode 100644 index 0000000..78172f3 --- /dev/null +++ b/home/hyprland/hyprsysteminfo.nix @@ -0,0 +1,6 @@ +{ pkgs, ... }: +{ + home.packages = [ + pkgs.hyprsysteminfo + ]; +} diff --git a/home/hyprland/qt.nix b/home/hyprland/qt.nix new file mode 100644 index 0000000..e2091c8 --- /dev/null +++ b/home/hyprland/qt.nix @@ -0,0 +1,12 @@ +{ pkgs, ... }: +{ + home.packages = [ + # Proper Qt support for wayland + # See https://wiki.hypr.land/Useful-Utilities/Must-have/#qt-wayland-support + pkgs.qt6.qtwayland + pkgs.libsForQt5.qt5.qtwayland + # QML Style for Qt6 apps + # See https://wiki.hypr.land/Hypr-Ecosystem/hyprland-qt-support/ + pkgs.hyprland-qt-support + ]; +} diff --git a/home/hyprland/rofi.nix b/home/hyprland/rofi.nix new file mode 100644 index 0000000..0ed896b --- /dev/null +++ b/home/hyprland/rofi.nix @@ -0,0 +1,6 @@ +{ + programs.rofi = { + enable = true; + theme = "sidebar"; + }; +} diff --git a/home/hyprland/waybar/default.nix b/home/hyprland/waybar/default.nix new file mode 100644 index 0000000..f908503 --- /dev/null +++ b/home/hyprland/waybar/default.nix @@ -0,0 +1,413 @@ +{ pkgs, lib, ... }: +let + hyprctl = "${lib.getBin pkgs.hyprland}/bin/hyprctl"; + hyprpwcenter = "${lib.getExe pkgs.hyprpwcenter}"; + loginctl = "${lib.getBin pkgs.systemd}/bin/loginctl"; + systemctl = "${lib.getBin pkgs.systemd}/bin/systemctl"; + uwsm = "${lib.getExe pkgs.uwsm}"; +in +{ + programs.waybar = { + enable = true; + systemd.enable = true; + + settings = + let + capslock-check = "${ + import ../../scripts/capslock-check.nix { inherit pkgs lib; } + }/bin/capslock-check.sh"; + nmcli-active-vpn-conn = "${ + import ../../scripts/nmcli-active-vpn-conn.nix { inherit pkgs lib; } + }/bin/nmcli-active-vpn-conn.sh"; + backlight = "${import ../../scripts/backlight.nix { inherit pkgs lib; }}/bin/backlight.sh"; + sound = "${import ../../scripts/sound.nix { inherit pkgs lib; }}/bin/sound.sh"; + in + [ + { + ########################### + ## default config + ########################### + layer = "top"; + position = "top"; + height = 42; + spacing = 4; + mode = "dock"; + exclusive = true; + gtk-layer-shell = true; + passthrough = false; + fixed-center = true; + + ########################### + ## layout + ########################### + modules-left = [ + "hyprland/workspaces" + "hyprland/window" + ]; + modules-center = [ + "idle_inhibitor" + "clock" + "hyprland/language" + "custom/capslock" + "privacy" + "systemd-failed-units" + ]; + modules-right = [ + "bluetooth" + "custom/vpn" + "network#wifi" + "network#ethernet" + "battery" + "group/settings" + "cpu" + "memory" + "temperature" + "disk" + "tray" + "custom/power-buttons" + ]; + + ########################### + ## groups + ########################### + + # See https://github.com/Alexays/Waybar/wiki/Module:-Group + "group/settings" = { + orientation = "horizontal"; + modules = [ + "wireplumber" + "backlight" + ]; + drawer = { + transition-duration = 500; + transition-left-to-right = false; + click-to-reveal = false; + }; + }; + + ########################### + ## custom + ########################### + + # See https://github.com/Alexays/Waybar/wiki/Module:-Custom + "custom/capslock" = { + exec = capslock-check; + restart-interval = 1; + return-type = "json"; + format = "{}"; + }; + "custom/power-buttons" = { + format = "⏻"; + tooltip = false; + menu = "on-click"; + menu-file = ./power-menu.xml; + menu-actions = { + lock = "${loginctl} lock-session"; + logout = "${uwsm} stop"; + reboot = "${systemctl} reboot"; + shutdown = "${systemctl} poweroff"; + suspend = "${systemctl} suspend"; + }; + }; + "custom/vpn" = { + format = "{}"; + exec = nmcli-active-vpn-conn; + return-type = "json"; + interval = 3; + }; + + ########################### + ## modules + ########################### + + backlight = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Backlight + interval = 2; + format = "{icon} {percent}%"; + format-icons = [ + "󰛩" + "󱩎" + "󱩏" + "󱩐" + "󱩑" + "󱩒" + "󱩓" + "󱩔" + "󱩕" + "󱩖" + "󰛨" + ]; + scroll-step = 5; + on-scroll-up = "${backlight} \"+5%\""; + on-scroll-down = "${backlight} \"-5%\""; + smooth-scrolling-threshold = 3; + tooltip = false; + }; + + battery = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Battery + interval = 3; + states = { + warning = 20; + critical = 10; + }; + format-discharging = "{icon} {capacity}%"; + format-icons = [ + "" + "" + "" + "" + "" + ]; + format-full = " {capacity}%"; + format-plugged = " {capacity}%"; + format-charging = " {capacity}%"; + tooltip = true; + tooltip-format = "{timeTo}"; + max-length = 25; + }; + + bluetooth = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Bluetooth + tooltip = true; + format = "󰂯"; + tooltip-format = "{controller_address} is {status}"; + format-disabled = "󰂲"; + tooltip-format-disabled = "Bluetooth disabled ({controller_address})"; + format-off = "󰂲"; + tooltip-format-off = "Bluetooth off ({controller_address})"; + format-on = "󰂲"; + tooltip-format-on = "Bluetooth on ({controller_address})"; + format-connected = "󰂱 {num_connections}"; + tooltip-format-connected = "{device_enumerate}"; + tooltip-format-enumerate-connected = "{device_alias}\t{device_address}"; + tooltip-format-enumerate-connected-battery = "{device_alias}\t{device_address}\tBattery: {device_battery_percentage}%"; + }; + + clock = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Clock + interval = 1; + format = "󰔠 {:%a, %Y-%m-%d %H:%M:%S}"; + # locale MUST be enabled + locale = "de_AT.UTF-8"; + # "timezone": "Europe/Vienna", + # "timezones": [ + # "UTC", + # ], + tooltip = true; + tooltip-format = "{calendar}"; + calendar = { + mode = "month"; + mode-mon-col = 3; + weeks-pos = "left"; + on-scroll = 1; + format = { + months = "{}"; + days = "{}"; + weeks = "CW{}"; + weekdays = "{}"; + today = "{}"; + }; + }; + actions = { + "on-click-right" = "mode"; + "on-scroll-up" = "shift_up"; + "on-scroll-down" = "shift_down"; + # "on-scroll-up"= "tz_up"; + # "on-scroll-down"= "tz_down"; + }; + }; + + cpu = { + # see https://github.com/Alexays/Waybar/wiki/Module:-CPU + format = " {usage}%"; + tooltip = true; + interval = 1; + }; + + disk = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Disk + interval = 30; + format = "󰋊 {percentage_used}%"; + path = "/"; + unit = "GB"; + tooltip = true; + tooltip-format = "Free:\t\t{specific_free:0.2f} GB\t({percentage_free}%)\nUsed:\t\t{specific_used:0.2f} GB\t({percentage_used}%)\nTotal space:\t{specific_total:0.2f} GB"; + }; + + "hyprland/language" = { + format = "󰌌 {}"; + format-en = "en"; + format-de = "de"; + keyboard-name = "at-translated-set-2-keyboard"; + on-click = "${hyprctl} switchxkblayout at-translated-set-2-keyboard next"; + on-scroll-up = "${hyprctl} switchxkblayout at-translated-set-2-keyboard next"; + on-scroll-down = "${hyprctl} switchxkblayout at-translated-set-2-keyboard prev"; + }; + + "hyprland/workspaces" = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Hyprland#workspaces + active-only = false; + on-click = "activate"; + format = "{id}"; + all-outputs = false; + disable-scroll = false; + }; + + "hyprland/window" = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Hyprland#window + format = "{title}"; + separate-outputs = true; + }; + + idle_inhibitor = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Idle-Inhibitor + start-activated = false; + # Deactivate automatically after 2h + timeout = 120; + format = "{icon}"; + format-icons = { + activated = ""; + deactivated = ""; + }; + tooltip = true; + }; + + memory = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Memory + interval = 10; + format = " {used:0.1f}Gi"; + tooltip = true; + tooltip-format = "Used:\t\t{used:0.1f}GiB ({percentage}%)\nAvailable:\t{avail:0.1f}GiB\nTotal:\t\t{total:0.1f}GiB"; + }; + + "network#ethernet" = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Network + interface = "en*"; + interval = 5; + tooltip = true; + format-ethernet = "󰈁"; + tooltip-format-ethernet = "IP:\t\t{ipaddr}/{cidr}\nBandwith:\t {bandwidthDownBits} /  {bandwidthUpBits}\nInterface:\t{ifname}"; + format-disabled = "󰈂"; + tooltip-format-disabled = "{ifname} is disabled"; + format-linked = "󰈂"; + tooltip-format-linked = "{ifname} is linked"; + # Do not show, when not connected at all + format-disconnected = ""; + # "tooltip-format-disconnected"= "{ifname} is not connected"; + format = ""; # do not show for any other states, except for those specified above + # "tooltip-format"= ""; + }; + + "network#wifi" = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Network + interface = "wl*"; + interval = 5; + tooltip = true; + format-icons = [ + "󰤯" + "󰤟" + "󰤢" + "󰤥" + "󰤨" + ]; + format-wifi = "{icon} {signalStrength}%"; + tooltip-format-wifi = "SSID:\t\t{essid}\nIP:\t\t{ipaddr}/{cidr}\nFrequency:\t{frequency} GHz\nBandwith:\t {bandwidthDownBits} /  {bandwidthUpBits}\nInterface:\t{ifname}"; + format-disabled = "󰤫"; + tooltip-format-disabled = "{ifname} is disabled"; + format-linked = "󱛇"; + tooltip-format-linked = "{ifname} is linked"; + format-disconnected = "󰤮"; + tooltip-format-disconnected = "{ifname} is not connected"; + }; + + privacy = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Privacy + icon-spacing = 4; + icon-size = 18; + transition-duration = 250; + expand = true; + ignore-monitor = false; + modules = [ + { + type = "screenshare"; + tooltip = true; + tooltip-icon-size = 24; + } + # { + # "type"= "audio-out"; + # "tooltip"= true; + # "tooltip-icon-size"= 24; + # } + { + type = "audio-in"; + tooltip = true; + tooltip-icon-size = 24; + } + # # Example for ignore object: + # { + # "type"= "audio-in"; + # "name"= "cava"; + # } + ]; + ignore = [ ]; + }; + + systemd-failed-units = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Systemd-failed-units + hide-on-ok = true; + format = " {nr_failed}"; + system = true; + user = true; + }; + + temperature = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Temperature + # Leave commented out as the module will pick sensitive defaults + # "thermal-zone"= 2; + # Leave commented out as the module will pick sensitive defaults + # "hwmon-path"= "/sys/class/hwmon/hwmon2/temp1_input"; + format-icons = [ + "" + "" + "" + ]; + critical-threshold = 80; + format = "{icon} {temperatureC}°C"; + format-critical = "{temperatureC}°C {icon}"; + tooltip = true; + tooltip-format = "{temperatureC}°C"; + }; + + tray = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Tray + show-passive-items = true; + spacing = 10; + }; + + wireplumber = { + # see https://github.com/Alexays/Waybar/wiki/Module:-WirePlumber + format = "{icon} {volume}%"; + format-muted = "󰖁"; + format-icons = [ + "󰕿" + "󰖀" + "󰕾" + ]; + on-scroll-up = "${sound} \"volume\" \"+5%\""; + on-scroll-down = "${sound} \"volume\" \"-5%\""; + on-click = "${sound} \"mute\" \"toggle\""; + on-click-middle = "${hyprpwcenter}"; + scroll-step = 5; + max-volume = 100; + tooltip = true; + tooltip-format = "Volume:\t{volume}%\nNode:\t{node_name}"; + smooth-scrolling-threshold = 3; + node-type = "Audio/Sink"; + }; + } + ]; + + style = builtins.readFile ./style.css; + }; +} diff --git a/dot_config/waybar/power_menu.xml b/home/hyprland/waybar/power-menu.xml similarity index 100% rename from dot_config/waybar/power_menu.xml rename to home/hyprland/waybar/power-menu.xml diff --git a/dot_config/waybar/style.css.tmpl b/home/hyprland/waybar/style.css similarity index 94% rename from dot_config/waybar/style.css.tmpl rename to home/hyprland/waybar/style.css index fc2eab8..647aa15 100644 --- a/dot_config/waybar/style.css.tmpl +++ b/home/hyprland/waybar/style.css @@ -2,7 +2,6 @@ * { min-height: 0; min-width: 0; - /* pacman -S ttf-jetbrains-mono-nerd */ font-family: Lexend, "JetBrainsMono NFP"; font-size: 14px; font-weight: 600; @@ -53,12 +52,8 @@ tooltip { /* Background of widgets */ #backlight, -{{- if .waybar.power.show }} #battery, -{{- end }} -{{- if .waybar.bluetooth.show }} #bluetooth, -{{- end }} #clock, #cpu, #custom-capslock, @@ -124,7 +119,6 @@ menuitem { #backlight { color: #ef9c66; } -{{- if .waybar.power.show }} #battery { @@ -151,8 +145,6 @@ menuitem { color: #11111b; } } -{{- end }} -{{- if .waybar.bluetooth.show }} #bluetooth, @@ -181,7 +173,6 @@ menuitem { color: #eb6383; } } -{{- end }} #clock { diff --git a/home/neovim/default.nix b/home/neovim/default.nix new file mode 100644 index 0000000..bbba12a --- /dev/null +++ b/home/neovim/default.nix @@ -0,0 +1,15 @@ +{ inputs, ... }: +{ + imports = [ + inputs.nixvim.homeModules.nixvim + + ./keybindings.nix + ./lsp + ./plugins + ./settings.nix + ]; + + programs.nixvim = { + enable = true; + }; +} diff --git a/home/neovim/keybindings.nix b/home/neovim/keybindings.nix new file mode 100644 index 0000000..79a354e --- /dev/null +++ b/home/neovim/keybindings.nix @@ -0,0 +1,197 @@ +{ config, ... }: +{ + programs.nixvim = + let + nixvimLua = config.lib.nixvim.mkRaw; + in + { + keymaps = [ + { + # Quick edit ~/.vimrc + action = ":e $MYVIMRC"; + key = "ev"; + mode = [ "n" ]; + options = { + silent = true; + }; + } + + { + # Toggle Spell check + action = nixvimLua '' + function() + vim.opt.spell = not vim.opt.spell:get() + print(string.format("spellcheck=%s", vim.opt.spell:get())) + end + ''; + key = "s"; + mode = [ "n" ]; + options = { + noremap = true; + }; + } + + # Tab navigation + { + # Create new tab + action = ":tabnew"; + key = "tab"; + mode = [ "n" ]; + options = { + noremap = true; + }; + } + { + # Close tab (keep buffer intact) + action = ":tabclose"; + key = "w"; + mode = [ "n" ]; + options = { + silent = true; + noremap = true; + }; + } + { + # Close tab (keep buffer intact) + action = ":tabnew %:tabprevious"; + key = "tabthis"; + mode = [ "n" ]; + options = { + silent = true; + noremap = true; + }; + } + + # Better navigation with wrapped lines + { + action = "gk"; + key = "k"; + mode = [ "n" ]; + options = { + noremap = true; + }; + } + { + action = "gj"; + key = "j"; + mode = [ "n" ]; + options = { + noremap = true; + }; + } + { + action = "g0"; + key = "0"; + mode = [ "n" ]; + options = { + noremap = true; + }; + } + { + action = "g$"; + key = "$"; + mode = [ "n" ]; + options = { + noremap = true; + }; + } + + { + # Don't yank selected text after overwriting via paste + action = "\"_dP"; + key = "p"; + mode = [ "v" ]; + options = { + noremap = true; + silent = true; + }; + } + + # Move blocks of selected lines up and down in visual mode + { + action = ":m '>+1gv"; + key = ""; + mode = [ "v" ]; + options = { + noremap = true; + silent = true; + }; + } + { + action = ":m '<-2gv"; + key = ""; + mode = [ "v" ]; + options = { + noremap = true; + silent = true; + }; + } + + # In- and un-indent lines while also preserving selection + { + action = "<gv"; + key = "<"; + mode = [ "v" ]; + options = { + noremap = true; + silent = true; + }; + } + { + action = ">gv"; + key = ">"; + mode = [ "v" ]; + options = { + noremap = true; + silent = true; + }; + } + + { + # Toggle relative line numbers + action = nixvimLua '' + function() + vim.opt.relativenumber = not vim.opt.relativenumber:get() + print(string.format("relativenumber=%s", vim.opt.relativenumber:get())) + end + ''; + key = "r"; + mode = [ + "n" + "v" + ]; + options = { + noremap = true; + silent = true; + }; + } + + { + # Toggle relative line numbers + action = nixvimLua '' + function() + vim.opt.foldenable = not vim.opt.foldenable:get() + print(string.format("foldenable=%s", vim.opt.foldenable:get())) + end + ''; + key = "f"; + mode = [ + "n" + "v" + ]; + options = { + noremap = true; + silent = true; + }; + } + + ## Leave commented out for now, since it does not work with sudo-rs + # { + # # Sudo write + # action = "w !sudo -S tee > /dev/null %"; + # key = "w!!"; + # mode = [ "c" ]; + # } + ]; + }; +} diff --git a/home/neovim/lsp/default.nix b/home/neovim/lsp/default.nix new file mode 100644 index 0000000..feda27f --- /dev/null +++ b/home/neovim/lsp/default.nix @@ -0,0 +1,110 @@ +{ pkgs, ... }: +{ + imports = [ + ./golang.nix + ./nix.nix + ./sh.nix + ]; + + programs.nixvim = { + extraPlugins = with pkgs.vimPlugins; [ + ultisnips + ]; + + autoGroups = { + format_on_save = { + clear = true; + }; + }; + autoCmd = [ + { + event = [ "BufWritePre" ]; + buffer = 0; + command = "lua vim.lsp.buf.format()"; + desc = "Auto-format on save"; + group = "format_on_save"; + } + ]; + + # Required for the `lsp-lines` plugin + diagnostic = { + settings = { + virtual_lines = true; + virtual_text = false; + }; + }; + + highlight = { + LspSignatureActiveParameter = { + fg = "#282c34"; + bg = "#61afef"; + }; + }; + + plugins = { + # see https://github.com/neovim/nvim-lspconfig/ + lsp = { + enable = true; + keymaps = { + lspBuf = { + K = "hover"; + gD = "references"; + gd = "definition"; + gi = "implementation"; + gt = "type_definition"; + }; + }; + }; + + # see https://git.sr.ht/~whynothugo/lsp_lines.nvim + lsp-lines = { + enable = true; + }; + + # see https://github.com/ray-x/lsp_signature.nvim/ + lsp-signature = { + enable = true; + settings = { + hint_enable = false; + }; + }; + + # see https://github.com/hrsh7th/nvim-cmp + cmp = { + enable = true; + autoEnableSources = true; + settings = { + sources = [ + { name = "nvim_lsp"; } + { name = "buffer"; } + { name = "path"; } + { name = "ultisnips"; } + ]; + + snippet = { + expand = '' + function(args) + -- ultisnips + vim.fn["UltiSnips#Anon"](args.body) + end + ''; + }; + + mapping = { + "" = "cmp.mapping.complete()"; + "" = "cmp.mapping.scroll_docs(-4)"; + "" = "cmp.mapping.close()"; + "" = "cmp.mapping.scroll_docs(4)"; + "" = "cmp.mapping.confirm({ select = true })"; + "" = "cmp.mapping(cmp.mapping.select_prev_item(), {'i', 's'})"; + "" = "cmp.mapping(cmp.mapping.select_next_item(), {'i', 's'})"; + }; + }; + }; + # see https://github.com/quangnguyen30192/cmp-nvim-ultisnips/ + cmp-nvim-ultisnips = { + enable = true; + }; + }; + }; +} diff --git a/home/neovim/lsp/golang.nix b/home/neovim/lsp/golang.nix new file mode 100644 index 0000000..dc3e328 --- /dev/null +++ b/home/neovim/lsp/golang.nix @@ -0,0 +1,12 @@ +{ + programs.nixvim = { + dependencies.go.enable = true; + + lsp.servers = { + # see https://github.com/golang/tools/tree/master/gopls + gopls = { + enable = true; + }; + }; + }; +} diff --git a/home/neovim/lsp/nix.nix b/home/neovim/lsp/nix.nix new file mode 100644 index 0000000..623d92b --- /dev/null +++ b/home/neovim/lsp/nix.nix @@ -0,0 +1,12 @@ +{ + programs.nixvim = { + lsp.servers = { + nil_ls = { + enable = true; + }; + nixd = { + enable = true; + }; + }; + }; +} diff --git a/home/neovim/lsp/sh.nix b/home/neovim/lsp/sh.nix new file mode 100644 index 0000000..9341056 --- /dev/null +++ b/home/neovim/lsp/sh.nix @@ -0,0 +1,12 @@ +{ + programs.nixvim = { + lsp.servers = { + bashls = { + enable = true; + }; + fish_lsp = { + enable = true; + }; + }; + }; +} diff --git a/home/neovim/plugins/default.nix b/home/neovim/plugins/default.nix new file mode 100644 index 0000000..a1ffc40 --- /dev/null +++ b/home/neovim/plugins/default.nix @@ -0,0 +1,13 @@ +{ + imports = [ + ./editing.nix + ./finder.nix + ./fs.nix + ./git.nix + ./icons.nix + ./lightline.nix + ./motion.nix + ./treesitter.nix + ./undotree.nix + ]; +} diff --git a/home/neovim/plugins/editing.nix b/home/neovim/plugins/editing.nix new file mode 100644 index 0000000..7160f22 --- /dev/null +++ b/home/neovim/plugins/editing.nix @@ -0,0 +1,16 @@ +{ ... }: +{ + programs.nixvim = { + plugins = { + # see https://github.com/tpope/vim-surround/ + vim-surround = { + enable = true; + }; + + # see https://github.com/nvim-mini/mini.indentscope/ + mini-indentscope = { + enable = true; + }; + }; + }; +} diff --git a/home/neovim/plugins/finder.nix b/home/neovim/plugins/finder.nix new file mode 100644 index 0000000..ff6639d --- /dev/null +++ b/home/neovim/plugins/finder.nix @@ -0,0 +1,85 @@ +{ ... }: +{ + programs.nixvim = { + dependencies = { + ripgrep.enable = true; + }; + plugins = { + # see https://github.com/nvim-telescope/telescope.nvim + telescope = { + enable = true; + keymaps = { + # Fuzzy search + "" = { + action = "find_files"; + options = { + desc = "Search files"; + }; + }; + "p" = { + action = "git_files"; + options = { + desc = "Search files via `git ls-files` (respects .gitignore)"; + }; + }; + "buf" = { + action = "buffers"; + options = { + desc = "Search buffers"; + }; + }; + "lin" = { + action = "current_buffer_fuzzy_find"; + options = { + desc = "Search for lines in current buffer"; + }; + }; + "tag" = { + action = "current_buffer_tags"; + options = { + desc = "Search by tags in current buffer"; + }; + }; + + # Git integration + "gitstatus" = { + action = "git_status"; + options = { + desc = "List current changes per file with diff preview"; + }; + }; + "gitbranch" = { + action = "git_branches"; + options = { + desc = "List current branches"; + }; + }; + "gitstash" = { + action = "git_stash"; + options = { + desc = "List stash item"; + }; + }; + "gitcom" = { + action = "git_commits"; + options = { + desc = "List git commits with diff preview; checkout via "; + }; + }; + "gitbcom" = { + action = "git_bcommits"; + options = { + desc = "List git commits with diff preview of current file only; checkout via "; + }; + }; + "a" = { + action = "live_grep"; + options = { + desc = "Search for string by using ripgrep (respecting .gitignore)"; + }; + }; + }; + }; + }; + }; +} diff --git a/home/neovim/plugins/fs.nix b/home/neovim/plugins/fs.nix new file mode 100644 index 0000000..7705871 --- /dev/null +++ b/home/neovim/plugins/fs.nix @@ -0,0 +1,37 @@ +{ ... }: +{ + programs.nixvim = { + keymaps = [ + { + # Quick edit ~/.vimrc + action = ":CHADopen"; + key = "d"; + mode = [ "n" ]; + options = { + silent = true; + }; + } + ]; + plugins = { + # see https://github.com/ms-jpq/chadtree/ + chadtree = { + enable = true; + settings = { + ignore.name_exact = [ + ".DS_Store" + ".directory" + "thumbs.db" + ".git" + ]; + + options = { + show_hidden = true; + follow = true; + follow_links = true; + version_control.enable = true; + }; + }; + }; + }; + }; +} diff --git a/home/neovim/plugins/git.nix b/home/neovim/plugins/git.nix new file mode 100644 index 0000000..640fd11 --- /dev/null +++ b/home/neovim/plugins/git.nix @@ -0,0 +1,29 @@ +{ ... }: +{ + programs.nixvim = { + opts = { + # Set signcolumn to be always present. + # This way, we don't have awkward flash jumps. + signcolumn = "yes"; + }; + + plugins = { + # see https://github.com/airblade/vim-gitgutter/ + gitgutter = { + enable = true; + recommendedSettings = true; + settings = { + sign_added = "+"; + sign_removed = "-"; + sign_modified = "±"; + sign_modified_removed = "±"; + }; + }; + + # see https://github.com/tpope/vim-fugitive/ + fugitive = { + enable = true; + }; + }; + }; +} diff --git a/home/neovim/plugins/icons.nix b/home/neovim/plugins/icons.nix new file mode 100644 index 0000000..ed1df86 --- /dev/null +++ b/home/neovim/plugins/icons.nix @@ -0,0 +1,18 @@ +{ ... }: +{ + programs.nixvim = { + plugins = { + # see https://github.com/nvim-tree/nvim-web-devicons + # + # web-devicons provides Nerd Font icons, used by several plugins (e.g. + # CHADtree and telescope, just to name a few...). + web-devicons = { + enable = true; + settings = { + color_icons = true; + strict = true; + }; + }; + }; + }; +} diff --git a/home/neovim/plugins/lightline.nix b/home/neovim/plugins/lightline.nix new file mode 100644 index 0000000..5fdd235 --- /dev/null +++ b/home/neovim/plugins/lightline.nix @@ -0,0 +1,60 @@ +{ ... }: +{ + programs.nixvim = { + opts = { + # Always leave space for lightline + laststatus = 2; + + # Don't show mode as we'll have lightline display it + showmode = false; + }; + + plugins = { + # Install fugitive, so we have lightline integration. + # + # see https://github.com/tpope/vim-fugitive/ + fugitive = { + enable = true; + }; + + # See https://github.com/itchyny/lightline.vim/ + lightline = { + enable = true; + + settings = { + colorscheme = "one"; + + active = { + left = [ + [ + "mode" + "paste" + ] + [ + "gitbranch" + "readonly" + ] + ]; + + right = [ + [ "lineinfo" ] + [ + "fileformat" + "fileencoding" + "filetype" + ] + ]; + }; + + component = { + lineinfo = "%l>%c"; + }; + + component_function = { + gitbranch = "FugitiveHead"; + }; + }; + }; + }; + }; +} diff --git a/home/neovim/plugins/motion.nix b/home/neovim/plugins/motion.nix new file mode 100644 index 0000000..2cfa433 --- /dev/null +++ b/home/neovim/plugins/motion.nix @@ -0,0 +1,60 @@ +{ config, ... }: +{ + programs.nixvim = { + keymaps = + let + nixvimLua = config.lib.nixvim.mkRaw; + in + [ + { + mode = [ + "n" + "v" + ]; + key = "s"; + action = nixvimLua '' + function() + local hop = require('hop') + local directions = require('hop.hint').HintDirection + + hop.hint_char1({ + direction = directions.AFTER_CURSOR + }) + end + ''; + options = { + desc = "Quick jump after the cursor via hop motion plugin"; + silent = true; + }; + } + { + mode = [ + "n" + "v" + ]; + key = "S"; + action = nixvimLua '' + function() + local hop = require('hop') + local directions = require('hop.hint').HintDirection + + hop.hint_char1({ + direction = directions.BEFORE_CURSOR + }) + end + ''; + options = { + desc = "Quick jump before the cursor via hop motion plugin"; + silent = true; + }; + } + ]; + + plugins = { + # see https://github.com/smoka7/hop.nvim/ + hop = { + enable = true; + }; + }; + }; +} diff --git a/home/neovim/plugins/treesitter.nix b/home/neovim/plugins/treesitter.nix new file mode 100644 index 0000000..532a7c2 --- /dev/null +++ b/home/neovim/plugins/treesitter.nix @@ -0,0 +1,103 @@ +{ config, ... }: +{ + programs.nixvim = { + dependencies = { + tree-sitter.enable = true; + }; + + # see https://github.com/nvim-treesitter/nvim-treesitter/ + plugins = { + treesitter = + let + grammarBuilder = config.programs.nixvim.plugins.treesitter.package.builtGrammars; + in + { + enable = true; + highlight.enable = true; + indent.enable = true; + folding.enable = true; + grammarPackages = with grammarBuilder; [ + awk + bash + blade + c + cmake + comment + cpp + css + csv + desktop + diff + dockerfile + ebnf + editorconfig + fish + gitattributes + gitcommit + git_config + gitignore + git_rebase + go + gomod + gosum + gotmpl + gpg + graphql + hlsplaylist + html + http + hyprlang + ini + java + javadoc + javascript + jq + jsdoc + json + just + kconfig + latex + llvm + lua + luadoc + make + markdown + meson + nginx + nix + objdump + passwd + pem + php + phpdoc + printf + properties + puppet + python + rasi + regex + requirements + robots_txt + rust + scss + sql + ssh_config + strace + svelte + sway + textproto + tmux + toml + twig + typescript + udev + vim + vimdoc + vue + xml + yaml + ]; + }; + }; + }; +} diff --git a/home/neovim/plugins/undotree.nix b/home/neovim/plugins/undotree.nix new file mode 100644 index 0000000..fa520fa --- /dev/null +++ b/home/neovim/plugins/undotree.nix @@ -0,0 +1,33 @@ +{ config, ... }: +{ + programs.nixvim = { + keymaps = [ + { + action = ":UndotreeToggle"; + key = "u"; + mode = [ "n" ]; + options = { + silent = true; + }; + } + ]; + + opts = + let + nixvimLua = config.lib.nixvim.mkRaw; + in + { + undodir = nixvimLua '' + vim.fn.expand('~') .. '/.undodir' + ''; + undofile = true; + }; + + plugins = { + # see https://github.com/mbbill/undotree/ + undotree = { + enable = true; + }; + }; + }; +} diff --git a/home/neovim/settings.nix b/home/neovim/settings.nix new file mode 100644 index 0000000..3eb3e55 --- /dev/null +++ b/home/neovim/settings.nix @@ -0,0 +1,101 @@ +{ ... }: +{ + programs.nixvim = { + defaultEditor = true; + vimdiffAlias = true; + enableMan = true; + + # Clip-board syncing + waylandSupport = true; + clipboard.register = "unnamedplus"; + + # Language providers + withNodeJs = true; + withPerl = true; + withPython3 = true; + withRuby = true; + + editorconfig = { + enable = true; + }; + + colorschemes = { + onedark = { + enable = true; + }; + }; + + opts = { + # -----GENERAL----- + encoding = "UTF-8"; + backspace = "indent,eol,start"; + + # Set language for spell check + spell = true; + + # Fixing tabs and indentation + autoindent = true; + copyindent = true; + expandtab = false; + preserveindent = true; + softtabstop = 0; + + # Case-insensitive tab completion + wildignorecase = true; + + # Make scrolling faster and more accurate + ttyfast = true; + + # Refresh buffer automatically + autoread = true; + + # Add mouse support + mouse = "a"; + + # Suppress warning when changing FROM unsaved buffer + hidden = true; + + # Demand explicit confirmation when closing unsaved buffers + confirm = true; + + # Deactivate folding + foldenable = false; + foldmethod = "syntax"; + + # Don't use swapfiles + swapfile = false; + + # Optimize search + incsearch = true; + hlsearch = true; + ignorecase = true; + smartcase = true; + + # Show ruler at at `textwidth`'s n+1 position. + # `textwidth` in return is typically controlled by editorconfig's `max_line_length` setting. + colorcolumn = "+1"; + + # -----VISUAL----- + + # Syntax highlighting + syntax = "enable"; + + # Always display tabline + showtabline = 2; + + # Highlight line of the current cursor + cursorline = true; + + # Show column length + ruler = true; + + # Show line numbers + number = true; + }; + + localOpts = { + # Set language for spell check + spelllang = "en_us"; + }; + }; +} diff --git a/home/scripts/backlight.nix b/home/scripts/backlight.nix new file mode 100644 index 0000000..b01c2e4 --- /dev/null +++ b/home/scripts/backlight.nix @@ -0,0 +1,32 @@ +{ pkgs, lib, ... }: +let + cut = "${lib.getBin pkgs.coreutils-full}/bin/cut"; + grep = "${lib.getBin pkgs.gnugrep}/bin/grep"; + brightnessctl = "${lib.getExe pkgs.brightnessctl}"; + notify-send = "${lib.getExe pkgs.libnotify}"; + + tela-circle-icon-theme."display-brightness-symbolic.svg" = + "${pkgs.tela-circle-icon-theme}/share/icons/Tela-circle/symbolic/status/display-brightness-symbolic.svg"; +in +pkgs.writeShellScriptBin "backlight.sh" '' + BRIGHTNESS="$(${brightnessctl} -m | ${cut} -d',' -f4 | ${grep} -Po '\d+')" + DIFF="$(echo "$1" | ${grep} -Po "[\+\-]\d+(?=%)")" + + # Round properly + TARGET_BRIGHTNESS="$(( (("$BRIGHTNESS" / 5) * 5) + "$DIFF" ))" + + # Do not go beyond the boundaries of 0 and 100 + TARGET_BRIGHTNESS="$(( 0 <= $TARGET_BRIGHTNESS ? $TARGET_BRIGHTNESS : 0 ))" + TARGET_BRIGHTNESS="$(( $TARGET_BRIGHTNESS <= 100 ? $TARGET_BRIGHTNESS : 100 ))" + + # Set brightness + ${brightnessctl} set "''${TARGET_BRIGHTNESS}%" + + # Show the brightness notification + ${notify-send} \ + -a "changeBrightness" \ + -u normal \ + -t 1500 \ + -i ${tela-circle-icon-theme."display-brightness-symbolic.svg"} \ + -h string:synchronous:my-progress "Brightness: ''${BRIGHTNESS}" +'' diff --git a/home/scripts/capslock-check.nix b/home/scripts/capslock-check.nix new file mode 100644 index 0000000..8d997a7 --- /dev/null +++ b/home/scripts/capslock-check.nix @@ -0,0 +1,24 @@ +{ pkgs, lib, ... }: +let + find = "${lib.getExe pkgs.findutils}"; + cat = "${lib.getBin pkgs.coreutils-full}/bin/cat"; + head = "${lib.getBin pkgs.coreutils-full}/bin/head"; + jq = "${lib.getExe pkgs.jq}"; +in +pkgs.writeShellScriptBin "capslock-check.sh" '' + while true + do + # Check if caps-lock LED is enabled for first-best input device + CAPS_ON="$(${cat} "$(${find} /sys/class/leds/input*::capslock/ -name 'brightness' | ${head} -1)")" + + # empty string causes waybar to show nothing + TEXT="{ \"text\": \"\"}" + + if [[ "$CAPS_ON" == "1" ]]; then + TEXT="{ \"text\": \"󰘲\", \"class\": \"active\"}" + fi + + echo "$TEXT" | ${jq} --unbuffered --compact-output + sleep 1 + done +'' diff --git a/home/scripts/clone-dotfiles.nix b/home/scripts/clone-dotfiles.nix new file mode 100644 index 0000000..f8c2df7 --- /dev/null +++ b/home/scripts/clone-dotfiles.nix @@ -0,0 +1,20 @@ +{ + pkgs, + lib, + config, + ... +}: +let + targetDir = "${config.home.homeDirectory}/projects/dotfiles"; + repoUrl = "https://github.com/rtucek/dotfiles.git"; + git = "${lib.getExe pkgs.git}"; + mkdir = "${lib.getBin pkgs.coreutils-full}/bin/mkdir"; +in +pkgs.writeShellScriptBin "clone-dotfiles.sh" '' + # Only clone if the .git directory doesn\'t exist + # This preserves local changes if the repo already exists + if [ ! -d "${targetDir}/.git" ]; then + ${mkdir} -p ${targetDir} + ${git} clone ${repoUrl} ${targetDir} + fi +'' diff --git a/home/scripts/nmcli-active-vpn-conn.nix b/home/scripts/nmcli-active-vpn-conn.nix new file mode 100644 index 0000000..f12c86d --- /dev/null +++ b/home/scripts/nmcli-active-vpn-conn.nix @@ -0,0 +1,22 @@ +{ pkgs, lib, ... }: +let + nmcli = "${lib.getBin pkgs.networkmanager}/bin/nmcli"; + awk = "${lib.getBin pkgs.gawk}/bin/awk"; + wc = "${lib.getBin pkgs.coreutils-full}/bin/wc"; + jq = "${lib.getBin pkgs.jq}/bin/jq"; +in +pkgs.writeShellScriptBin "nmcli-active-vpn-conn.sh" '' + ALL_ACTIVE_CONNS="$(${nmcli} con show --active)" + ALL_ACTIVE_VPN_CONNS="$(echo "$ALL_ACTIVE_CONNS" | ${awk} '{ if ($3=="vpn") print $1}')" + ALL_ACTIVE_VPN_CONNS_CNT="$(echo "$ALL_ACTIVE_VPN_CONNS" | ${wc} -l)" + + if [[ "$ALL_ACTIVE_VPN_CONNS" == "" ]]; then + echo "{ \"text\": \" 0\", \"tooltip\": \"No active VPN connections\", \"class\": \"inactive\" }" + + exit 0 + fi + + echo "{ \"text\": \" ''${ALL_ACTIVE_VPN_CONNS_CNT}\", \"tooltip\": "$(echo -n "$ALL_ACTIVE_VPN_CONNS" | ${jq} -Rsa .)", \"class\": \"active\" }" + + exit 0 +'' diff --git a/home/scripts/rfkill-toggle.nix b/home/scripts/rfkill-toggle.nix new file mode 100644 index 0000000..ae9181b --- /dev/null +++ b/home/scripts/rfkill-toggle.nix @@ -0,0 +1,38 @@ +{ pkgs, lib, ... }: +let + rfkill = "${lib.getBin pkgs.util-linux}/bin/rfkill"; + xargs = "${lib.getBin pkgs.findutils}/bin/xargs"; + jq = "${lib.getExe pkgs.jq}"; + notify-send = "${lib.getExe pkgs.libnotify}"; + + tela-icon-path = icon: "${pkgs.tela-circle-icon-theme}/share/icons/Tela-circle/22/panel/${icon}"; + tela-circle-icon-theme = { + "network-flightmode-off.svg" = tela-icon-path "network-flightmode-off.svg"; + "network-flightmode-on.svg" = tela-icon-path "network-flightmode-on.svg"; + }; +in +pkgs.writeShellScriptBin "rfkill-toggle.sh" '' + # Toggle rfkill switches + ${rfkill} --json | ${jq} --raw-output0 '.rfkilldevices | map(.type) | .[]' | ${xargs} -0 -L1 ${rfkill} toggle + + # Check current status on first-best device + STATUS="$(${rfkill} --json | ${jq} -r '.rfkilldevices[0].soft')" + + # Show notification + UNBLOCKED="${tela-circle-icon-theme."network-flightmode-off.svg"}" + BLOCKED="${tela-circle-icon-theme."network-flightmode-on.svg"}" + + ICON="$UNBLOCKED" + STATUS_TXT="off" + if [[ $STATUS == "blocked" ]]; then + ICON="$BLOCKED" + STATUS_TXT="on" + fi + + ${notify-send} \ + -a "changeFlightmode" \ + -u normal \ + -t 1500 \ + -i "$ICON" \ + -h string:synchronous:my-progress "Flightmode: $STATUS_TXT" +'' diff --git a/home/scripts/sound.nix b/home/scripts/sound.nix new file mode 100644 index 0000000..1acc893 --- /dev/null +++ b/home/scripts/sound.nix @@ -0,0 +1,90 @@ +{ pkgs, lib, ... }: +let + bc = "${lib.getBin pkgs.bc}/bin/bc"; + wpctl = "${lib.getBin pkgs.wireplumber}/bin/wpctl"; + pw-play = "${lib.getBin pkgs.pipewire}/bin/pw-play"; + grep = "${lib.getBin pkgs.gnugrep}/bin/grep"; + notify-send = "${lib.getExe pkgs.libnotify}"; + sed = "${lib.getExe pkgs.gnused}"; + + freedesktop-sounds-path = + sound: "${pkgs.sound-theme-freedesktop}/share/sounds/freedesktop/stereo/${sound}"; + freedesktop-sounds = { + "audio-volume-change.oga" = freedesktop-sounds-path "audio-volume-change.oga"; + }; + + tela-icon-path = + icon: "${pkgs.tela-circle-icon-theme}/share/icons/Tela-circle-light/24/panel/${icon}"; + tela-circle-icon-theme = { + "audio-volume-muted-blocking.svg" = tela-icon-path "audio-volume-muted-blocking.svg"; + "audio-volume-muted.svg" = tela-icon-path "audio-volume-muted.svg"; + "audio-volume-low.svg" = tela-icon-path "audio-volume-muted.svg"; + "audio-volume-medium.svg" = tela-icon-path "audio-volume-medium.svg"; + "audio-volume-high.svg" = tela-icon-path "audio-volume-high.svg"; + }; +in +pkgs.writeShellScriptBin "sound.sh" '' + VOLUME="$(printf '%f * 100\n' "$(${wpctl} get-volume "@DEFAULT_SINK@" | ${grep} -Eo '[-+]?[0-9]+(\.[0-9]+)?')" | ${bc} -l | ${sed} -E 's/^([0-9]*)\.[0-9]*/\1/')" + MUTED="$(if [[ "$(${wpctl} get-volume "@DEFAULT_SINK@" | ${grep} -Eo 'MUTED')" ]]; then echo yes; else echo no; fi)" + + if [[ "$1" == "mute" && "$2" == "toggle" ]]; then + # toggle mute + ${wpctl} set-mute "@DEFAULT_SINK@" toggle + + MSG="Volume muted" + ICON="${tela-circle-icon-theme."audio-volume-muted-blocking.svg"}" + if [[ "$MUTED" == "yes" ]]; then + # in this case, we toggle to unmute + MSG="Volume unmuted" + ICON="${tela-circle-icon-theme."audio-volume-muted.svg"}" + fi + + ${notify-send} \ + -a "changeVolume" \ + -u normal \ + -t 1500 \ + -i "$ICON" \ + -h string:synchronous:my-progress "$MSG" + + exit 0 + fi + + if [[ "$1" == "volume" ]]; then + # Force unmuting upon changing sound + ${wpctl} set-mute @DEFAULT_SINK@ 0 + + DIFF="$(echo "$2" | ${grep} -Po "[\+\-]\d+(?=%)")" + + # Round properly + TARGET_VOLUME="$(( (("$VOLUME" / 5) * 5) + "$DIFF" ))" + + # Do not go beyond the boundaries of 0 and 100 + TARGET_VOLUME="$(( 0 <= $TARGET_VOLUME ? $TARGET_VOLUME : 0 ))" + TARGET_VOLUME="$(( $TARGET_VOLUME <= 100 ? $TARGET_VOLUME : 100 ))" + + # Set again with properly rounded value + # As a special case, wpctl wants to target volume as a fraction. + # That is, 50 % => 0.50; 100 % => 1.00; etc + ${wpctl} set-volume "@DEFAULT_SINK@" "$(printf '%.2f' "$(echo "$TARGET_VOLUME / 100" | ${bc} -l)")" + + # icon to display + ICON="${tela-circle-icon-theme."audio-volume-low.svg"}" + if [[ "$TARGET_VOLUME" -ge "33" ]]; then + ICON="${tela-circle-icon-theme."audio-volume-medium.svg"}" + fi + if [[ "$TARGET_VOLUME" -ge "66" ]]; then + ICON="${tela-circle-icon-theme."audio-volume-high.svg"}" + fi + + # Show the volume notification + ${notify-send} \ + -a "changeVolume" \ + -u normal \ + -t 1500 \ + -i "$ICON" \ + -h string:synchronous:my-progress "Volume: ''${TARGET_VOLUME}%" + + # Play the volume changed sound + ${pw-play} "${freedesktop-sounds."audio-volume-change.oga"}" + fi +'' diff --git a/home/shell/bash.nix b/home/shell/bash.nix new file mode 100644 index 0000000..d515e49 --- /dev/null +++ b/home/shell/bash.nix @@ -0,0 +1,5 @@ +{ + programs.bash = { + enable = true; + }; +} diff --git a/home/shell/default.nix b/home/shell/default.nix new file mode 100644 index 0000000..82a59bc --- /dev/null +++ b/home/shell/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./bash.nix + ./fish.nix + ]; +} diff --git a/home/shell/fish.nix b/home/shell/fish.nix new file mode 100644 index 0000000..17ef2bf --- /dev/null +++ b/home/shell/fish.nix @@ -0,0 +1,5 @@ +{ + programs.fish = { + enable = true; + }; +} diff --git a/home/sops/default.nix b/home/sops/default.nix new file mode 100644 index 0000000..5a4a3f0 --- /dev/null +++ b/home/sops/default.nix @@ -0,0 +1,18 @@ +{ config, inputs, ... }: +{ + imports = [ + inputs.sops-nix.homeManagerModules.sops + ]; + + sops = { + log = [ + "keyImport" + "secretChanges" + ]; + defaultSopsFormat = "yaml"; + age = { + keyFile = "${config.xdg.configHome}/sops/age/keys.txt"; + generateKey = false; + }; + }; +} diff --git a/home/tmux/default.nix b/home/tmux/default.nix new file mode 100644 index 0000000..8873ecb --- /dev/null +++ b/home/tmux/default.nix @@ -0,0 +1,180 @@ +{ pkgs, lib, ... }: +{ + imports = [ + ./tmuxinator + ]; + + programs.tmux = { + enable = true; + sensibleOnTop = true; + + secureSocket = true; + + prefix = "C-Space"; + keyMode = "vi"; + + mouse = true; + baseIndex = 1; + clock24 = true; + + extraConfig = '' + # Set ability to capture on start and restore on exit window data when + # running an application + setw -g alternate-screen on + + # Scrolling + set -g terminal-overrides 'xterm*:smcup@:rmcup@' + + # Cursor shape + set -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[ q' + + # Ensure colors are set properly + set-option -sa terminal-overrides ',rxvt-unicode-256color:RGB' # urxvt + set-option -sa terminal-overrides ',xterm-256color:RGB' # terminator + + # Set window title + set-option -g set-titles on + set-option -g set-titles-string "#S: #{pane_current_command}" + + # Don't set the clipboard via escape sequence + set-option -s set-clipboard off + + + + ### GENERAL KEY BINDINGS ### + # Clock mode (default binding "t" gets overridden via tmux-sessionist plugin) + bind T clock-mode + + # Move back and forward + bind -r 'C-p' previous-window + bind -r 'C-n' next-window + + # Split windows + bind 'c' new-window -c '#{pane_current_path}' + + + + ### TWEAK UI ### + # Derived from + # https://www.hamvocke.com/blog/a-guide-to-customizing-your-tmux-conf/ + + # Re-enumerate windows on close + set-option -g renumber-windows on + # Re-name windows, based on current program + setw -g automatic-rename on + + # Panes + set -g pane-border-style fg=black + set -g pane-active-border-style fg=brightred + + + ## Status bar design + # Status line + set -g status-justify left + set -g status-bg default + set -g status-fg colour12 + set -g status-interval 1 + + + # Messaging + set -g message-style fg=black + set -g message-style bg=yellow + set -g message-command-style fg=blue + set -g message-command-style bg=black + + + # Window mode + setw -g mode-style bg=colour6 + setw -g mode-style fg=colour0 + + + # Window status + setw -g window-status-format " #F#I:#W#F " + setw -g window-status-current-format " #F#I:#W#F " + setw -g window-status-format "#[fg=magenta]#[bg=black] #I #[bg=cyan]#[fg=colour8] #W " + setw -g window-status-current-format "#[bg=brightmagenta]#[fg=colour8] #I #[fg=colour8]#[bg=colour14] #W " + setw -g window-status-current-style bg=colour0 + setw -g window-status-current-style fg=colour11 + setw -g window-status-current-style dim + setw -g window-status-style bg=green + setw -g window-status-style fg=black + setw -g window-status-style reverse + + + # Info on left (I don't have a session display for now) + set -g status-left ''' + + + # Loud or quiet? + set-option -g visual-activity off + set-option -g visual-bell off + set-option -g visual-silence off + set-window-option -g monitor-activity off + set-option -g bell-action none + + + # The modes + setw -g clock-mode-colour colour135 + setw -g mode-style bold + setw -g mode-style fg=colour196 + setw -g mode-style bg=colour238 + + + # The panes + set -g pane-border-style bg=colour235 + set -g pane-border-style fg=colour238 + set -g pane-active-border-style bg=colour236 + set -g pane-active-border-style fg=colour51 + + + # The statusbar + set -g status-position bottom + set -g status-bg colour234 + set -g status-fg colour137 + set -g status-style dim + set -g status-left ''' + set -g status-right '#[fg=colour233,bg=colour241,bold] %Y-%m-%d #[fg=colour233,bg=colour245,bold] %H:%M:%S ' + set -g status-right-length 100 + set -g status-left-length 20 + + setw -g window-status-current-style fg=colour81 + setw -g window-status-current-style bg=colour238 + setw -g window-status-current-style bold + setw -g window-status-current-format ' #I#[fg=colour250]:#[fg=colour255]#W#[fg=colour50]#F ' + + setw -g window-status-style fg=colour138 + setw -g window-status-style bg=colour235 + setw -g window-status-style none + setw -g window-status-format ' #I#[fg=colour237]:#[fg=colour250]#W#[fg=colour244]#F ' + + setw -g window-status-bell-style bold + setw -g window-status-bell-style fg=colour255 + setw -g window-status-bell-style bg=colour1 + + + # The messages + set -g message-style bold + set -g message-style fg=colour232 + set -g message-style bg=colour166 + ''; + + plugins = + let + wl-copy = "${lib.getBin pkgs.wl-clipboard}/bin/wl-copy"; + in + with pkgs; + [ + tmuxPlugins.copycat + tmuxPlugins.open + tmuxPlugins.pain-control + tmuxPlugins.sessionist + { + plugin = tmuxPlugins.yank; + extraConfig = '' + set -g @override_copy_command '${wl-copy}' + ''; + } + tmuxPlugins.jump + ]; + }; +} diff --git a/home/tmux/tmuxinator/default.nix b/home/tmux/tmuxinator/default.nix new file mode 100644 index 0000000..e48589b --- /dev/null +++ b/home/tmux/tmuxinator/default.nix @@ -0,0 +1,11 @@ +{ ... }: +{ + imports = [ + ./dotfiles.nix + ./home.nix + ]; + + programs.tmux.tmuxinator = { + enable = true; + }; +} diff --git a/home/tmux/tmuxinator/dotfiles.nix b/home/tmux/tmuxinator/dotfiles.nix new file mode 100644 index 0000000..d4c8aea --- /dev/null +++ b/home/tmux/tmuxinator/dotfiles.nix @@ -0,0 +1,58 @@ +{ + pkgs, + config, + lib, + ... +}: +let + targetDir = "${config.home.homeDirectory}/projects/dotfiles"; + clone-dotfiles = "${ + import ../../scripts/clone-dotfiles.nix { + inherit + pkgs + lib + config + targetDir + ; + } + }/bin/clone-dotfiles.sh"; +in +{ + systemd.user.services.clone-dotfiles = { + Unit = { + Description = "Clone dotfiles repo"; + Wants = "NetworkManager-wait-online.service"; + After = "NetworkManager-wait-online.service"; + }; + Service = { + Type = "oneshot"; + RemainAfterExit = true; + WorkingDirectory = "%h"; + ExecStart = clone-dotfiles; + }; + }; + + programs.tmux.tmuxinator.projects = { + dotfiles = { + name = "dotfiles"; + root = "${targetDir}/"; + + startup_window = "git"; + + windows = + let + nvim = "${config.programs.nixvim.build.package}/bin/nvim"; + in + [ + { + nvim = nvim; + } + { + git = [ + "" + ]; + } + ]; + }; + }; +} diff --git a/home/tmux/tmuxinator/home.nix b/home/tmux/tmuxinator/home.nix new file mode 100644 index 0000000..581fe38 --- /dev/null +++ b/home/tmux/tmuxinator/home.nix @@ -0,0 +1,25 @@ +{ pkgs, lib, ... }: +{ + programs.tmux.tmuxinator.projects = { + home = { + name = "home"; + root = "~/"; + + startup_window = "cli"; + + windows = + let + htop = "${lib.getExe pkgs.htop}"; + fastfetch = "${lib.getExe pkgs.fastfetch}"; + in + [ + { + htop = htop; + } + { + cli = fastfetch; + } + ]; + }; + }; +} diff --git a/home/tools/crypto.nix b/home/tools/crypto.nix new file mode 100644 index 0000000..6116155 --- /dev/null +++ b/home/tools/crypto.nix @@ -0,0 +1,18 @@ +{ pkgs, ... }: +{ + home.packages = [ + # General + pkgs.openssl + + # Certificate inspection and management + pkgs.certigo + pkgs.testssl + pkgs.mkcert + + # Secret management + pkgs.age + pkgs.keepassxc + pkgs.lastpass-cli + pkgs.sops + ]; +} diff --git a/home/tools/default.nix b/home/tools/default.nix new file mode 100644 index 0000000..7f0dc6f --- /dev/null +++ b/home/tools/default.nix @@ -0,0 +1,14 @@ +{ + imports = [ + ./crypto.nix + ./dev.nix + ./fs.nix + ./k8s.nix + ./misc.nix + ./network.nix + ./security.nix + ./sys.nix + ./virt.nix + ./web.nix + ]; +} diff --git a/home/tools/desktop.nix b/home/tools/desktop.nix new file mode 100644 index 0000000..197e695 --- /dev/null +++ b/home/tools/desktop.nix @@ -0,0 +1,30 @@ +{ pkgs, ... }: +{ + home.packages = [ + # CLI & terminal + pkgs.wl-clipboard + pkgs.kitty + + # Encryption + pkgs.veracrypt + + # Sound + pkgs.hyprpwcenter + + # Office + pkgs.libreoffice + + # HTTP client + pkgs.postman + ]; + + programs = { + thunderbird = { + enable = true; + languagePacks = [ + "en-US" + "de" + ]; + }; + }; +} diff --git a/home/tools/dev.nix b/home/tools/dev.nix new file mode 100644 index 0000000..956c432 --- /dev/null +++ b/home/tools/dev.nix @@ -0,0 +1,16 @@ +{ pkgs, ... }: +{ + home.packages = [ + # Common tools + pkgs.delta + pkgs.jless + pkgs.jq + + # Golang + pkgs.go + + # Nix + pkgs.nix-diff + pkgs.nixfmt-tree + ]; +} diff --git a/home/tools/fs.nix b/home/tools/fs.nix new file mode 100644 index 0000000..310e2a6 --- /dev/null +++ b/home/tools/fs.nix @@ -0,0 +1,48 @@ +{ pkgs, ... }: +{ + home.packages = [ + # Compression + pkgs.gnutar + pkgs.gzip + pkgs.xz + pkgs.zip + pkgs.zstd + + # Inspect + pkgs.pcmanfm + pkgs.yazi + pkgs.bat + pkgs.file + pkgs.less + pkgs.tree + + # Search'n'replace + pkgs.findutils + pkgs.gawk + pkgs.gnugrep + pkgs.gnused + pkgs.ripgrep + + # Debugging + pkgs.lsof + pkgs.ncdu + + # File system support + pkgs.bcachefs-tools + pkgs.btrfs-progs + pkgs.cryptsetup + pkgs.dosfstools + pkgs.exfatprogs + pkgs.hfsprogs + pkgs.hfsutils + pkgs.lvm2 + pkgs.mtools + pkgs.ntfs3g + pkgs.xfsprogs + pkgs.zfs + + # Misc + pkgs.rsync + pkgs.socat + ]; +} diff --git a/home/tools/k8s.nix b/home/tools/k8s.nix new file mode 100644 index 0000000..90e5e6a --- /dev/null +++ b/home/tools/k8s.nix @@ -0,0 +1,14 @@ +{ pkgs, ... }: +{ + home.packages = [ + # k8s + pkgs.kubectl + + # Deployment + pkgs.helm + + # Monitoring + pkgs.k9s + pkgs.stern + ]; +} diff --git a/home/tools/misc.nix b/home/tools/misc.nix new file mode 100644 index 0000000..cc413d3 --- /dev/null +++ b/home/tools/misc.nix @@ -0,0 +1,11 @@ +{ pkgs, ... }: +{ + home.packages = [ + pkgs.cowsay + pkgs.fastfetch + pkgs.fortune + pkgs.gitlogue + pkgs.lolcat + pkgs.pwgen + ]; +} diff --git a/home/tools/network.nix b/home/tools/network.nix new file mode 100644 index 0000000..9ab473b --- /dev/null +++ b/home/tools/network.nix @@ -0,0 +1,26 @@ +{ pkgs, ... }: +{ + home.packages = [ + # General + pkgs.inetutils + pkgs.iproute2 + pkgs.ethtool + + # DNS + pkgs.doggo + pkgs.dig + pkgs.whois + + # Debugging + pkgs.ipcalc + pkgs.traceroute + pkgs.mtr # Better alternative to traceroute + pkgs.netcat-gnu + pkgs.nmap + pkgs.tcpdump + pkgs.ptcpdump # Better alternative to traceroute + + # Monitoring + pkgs.speedtest-cli + ]; +} diff --git a/home/tools/security.nix b/home/tools/security.nix new file mode 100644 index 0000000..ebb8bdd --- /dev/null +++ b/home/tools/security.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: +{ + home.packages = [ + # General + pkgs.vulnix + ]; +} diff --git a/home/tools/sys.nix b/home/tools/sys.nix new file mode 100644 index 0000000..5a19ef4 --- /dev/null +++ b/home/tools/sys.nix @@ -0,0 +1,23 @@ +{ pkgs, ... }: +{ + home.packages = [ + # Standard UNIX tools + pkgs.coreutils-full + + # System management (local & remote) + pkgs.efibootmgr + pkgs.util-linux + pkgs.openssh + + # System monitoring + pkgs.btop + pkgs.htop + pkgs.inxi + pkgs.lshw + pkgs.pstree + + # Shells + pkgs.bash + pkgs.fish + ]; +} diff --git a/home/tools/virt.nix b/home/tools/virt.nix new file mode 100644 index 0000000..7245f67 --- /dev/null +++ b/home/tools/virt.nix @@ -0,0 +1,15 @@ +{ pkgs, ... }: +{ + home.packages = [ + # docker + pkgs.docker + pkgs.docker-compose + + # container + pkgs.podman + pkgs.podman-compose + + # container dev + pkgs.kind + ]; +} diff --git a/home/tools/web.nix b/home/tools/web.nix new file mode 100644 index 0000000..99fd927 --- /dev/null +++ b/home/tools/web.nix @@ -0,0 +1,11 @@ +{ pkgs, ... }: +{ + home.packages = [ + # Browsers + pkgs.brave + + # CLI clients + pkgs.curl + pkgs.httpie + ]; +} diff --git a/home/udiskie/default.nix b/home/udiskie/default.nix new file mode 100644 index 0000000..104344a --- /dev/null +++ b/home/udiskie/default.nix @@ -0,0 +1,10 @@ +{ ... }: +{ + services.udiskie = { + enable = true; + + automount = true; + notify = true; + tray = "never"; + }; +} diff --git a/home/xdg/default.nix b/home/xdg/default.nix new file mode 100644 index 0000000..56b2cd7 --- /dev/null +++ b/home/xdg/default.nix @@ -0,0 +1,10 @@ +{ ... }: +{ + xdg = { + enable = true; + + userDirs = { + createDirectories = true; + }; + }; +} diff --git a/hosts/common/default.nix b/hosts/common/default.nix new file mode 100644 index 0000000..cf2e200 --- /dev/null +++ b/hosts/common/default.nix @@ -0,0 +1,8 @@ +{ ... }: +{ + imports = [ + ../../networks/private.nix + ./disko.nix + ./home-manager.nix + ]; +} diff --git a/hosts/common/disko.nix b/hosts/common/disko.nix new file mode 100644 index 0000000..d0b0213 --- /dev/null +++ b/hosts/common/disko.nix @@ -0,0 +1,85 @@ +{ lib, ... }: +{ + disko.devices = { + disk = { + main = { + device = lib.mkDefault "/dev/nvme0n1"; + type = "disk"; + content = { + type = "gpt"; + partitions = { + ESP = { + type = "EF00"; + size = "1G"; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + mountOptions = [ "umask=0077" ]; + }; + }; + + luks = { + size = "100%"; + content = { + type = "luks"; + name = "volgroup0"; + # To be provided via nixos-anywhere. + # e.g. via... + # + # ``` + # nix run github:numtide/nixos-anywhere -- \ + # --disk-encryption-keys /tmp/disk.key <(echo -n "MyFullDiskPassword123#") \ + # --flake .#HOSTNAME \ + # USER@HOST + # ``` + passwordFile = lib.mkDefault "/tmp/disk.key"; + settings = { + allowDiscards = true; + }; + content = { + type = "lvm_pv"; + vg = "volgroup0"; + }; + # additionalKeyFiles = [ ]; + # extraOpenArgs = [ ]; + }; + }; + }; + }; + }; + }; + lvm_vg = { + # As a sensitive default, partitions for "/" and "/home" will each + # get 33 %, leaving the remaining 33 % for extending when needed. + # + # Nonetheless, it's generally recommended to that each host defines + # its own proper volume size. + volgroup0 = { + type = "lvm_vg"; + lvs = { + lv_root = { + size = lib.mkDefault "33%VG"; + content = { + type = "filesystem"; + format = "ext4"; + mountpoint = "/"; + mountOptions = [ + "defaults" + ]; + }; + }; + + lv_home = { + size = lib.mkDefault "33%VG"; + content = { + type = "filesystem"; + format = "ext4"; + mountpoint = "/home"; + }; + }; + }; + }; + }; + }; +} diff --git a/hosts/common/home-manager.nix b/hosts/common/home-manager.nix new file mode 100644 index 0000000..8e4633e --- /dev/null +++ b/hosts/common/home-manager.nix @@ -0,0 +1,8 @@ +{ inputs, ... }: +{ + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + extraSpecialArgs = { inherit inputs; }; + }; +} diff --git a/hosts/common/users/rtucek.nix b/hosts/common/users/rtucek.nix new file mode 100644 index 0000000..1268ead --- /dev/null +++ b/hosts/common/users/rtucek.nix @@ -0,0 +1,104 @@ +{ + config, + pkgs, + ... +}: +let + rtucekSopsFile = ../../../secrets/users/rtucek.yaml; +in +{ + # User config + users.users.rtucek = { + isNormalUser = true; + hashedPasswordFile = config.sops.secrets.initial_hashed_password.path; + openssh.authorizedKeys.keys = [ + "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC8X/6YtTiciDgv4SBbr+sHRfqbyD/xTulOgJuifcTlDDPwA8mJc19EI/HyDgGHQm/+GHK6YLxCQvxa5QzhgDxr9FILH4724NM2HSRADpA2NF5SqRNqK0uwnXof4U3H0zRr1mFUzoUJUvV7T2ammAC9SdPa+gFgwM7erpTd4MYpsawmzfHDGtNxdYBVZZXQQ0G587zUEG5VZcogvGehANNTC2s4se4wher56Jh5j/nwVhO11LZ7NMXJaxl9fWyBEWj58ybX8eLOHfWT43dyZFXgTNXMTzvmUSnCZGVR7Kqk8porKZBT8hvksbEYAq45aNDYl2J1ArSLVjJEHT4zUv7G8iUHtDkKStcS9ZaxhIIOluHuQAIa+R9am/LPD62WjnEJ5F72JK3BRoaVP/JGe5IClWSQqkqG4pgn3MHuYW7zwk4QZcagLM0Ecv8aXcgIO3kJ8vwjJzH+vsdfBGaXOdPKBbKNLaEG6w0phvyt7N3P3N6yyN28gk812ALKScsiSmYEAmnJFzj3ot/yUs+9EduXsNCHLJch+a1xcHuaPMEJHUzbOLbi/DFikq85wsa+U2h89D085voepp1uzRLS5BHzvCFk8t7d5boOZxX39Pat5wHs2QbdC2z2bB0NpQphTWnnc2TiWjJBpx9MVbZGB3Svzy50VZA2hJBhuaM6yG7yYw== cardno:13_364_058" + ]; + shell = pkgs.fish; + extraGroups = [ + "wheel" # sudo make me a sandwich + "docker" # run docker commands without sudo + "networkmanager" # allow managing connections without sudo + ]; + }; + + # Decrypt hashed password + sops.secrets.initial_hashed_password = { + sopsFile = rtucekSopsFile; + neededForUsers = true; + }; + + # Audit access to age key + # + # Note: we can't use `security.audit.rules`, as these rules will be merged + # into systemd's `audit-rules-nixos.service` unit, which runs immediately + # after sysinit.target. + # + # However, this is too early, as at this time, LVM hasn't yet mounted the + # /home directory and therefore, fails to load the unit. + # + # The workaround is to load rules, referencing paths in /home in a separate in + # a separate systemd unit, depending on the `home.mount` target. + systemd.services.audit-rules-nixos-home-age = + let + auditrules = pkgs.writeTextFile { + name = "audit-home.rules"; + text = '' + -D -k secrets_dir_user + -a always,exit -F arch=b64 -F path=/home/rtucek/.config/sops/age/keys.txt -F perm=rwa -F key=secrets_dir_user + -a always,exit -F arch=b32 -F path=/home/rtucek/.config/sops/age/keys.txt -F perm=rwa -F key=secrets_dir_user + ''; + }; + in + { + description = "Load Audit Rules after LVM mount"; + wantedBy = [ "home.mount" ]; + after = [ "home.mount" ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + ExecStart = "${pkgs.audit}/bin/auditctl -R ${auditrules}"; + }; + }; + + # Make sure default shell is installed + programs.fish.enable = true; + + # home manager config + home-manager.users = { + rtucek = { + imports = [ + ../../../home + ]; + + home = { + stateVersion = "26.05"; + username = "rtucek"; + homeDirectory = "/home/rtucek"; + }; + + sops = { + defaultSopsFile = rtucekSopsFile; + }; + + programs = { + git = { + settings = [ + { + user = { + name = "Rudolf Tucek"; + email = "tucek.rudolf@gmail.com"; + }; + } + ]; + + signing = { + format = "openpgp"; + key = "0x49593BD010DE4723"; + signByDefault = true; + }; + }; + }; + }; + }; +} diff --git a/hosts/default.nix b/hosts/default.nix new file mode 100644 index 0000000..fc5def3 --- /dev/null +++ b/hosts/default.nix @@ -0,0 +1,43 @@ +{ self, inputs, ... }: +{ + flake.nixosConfigurations = + let + sys = "${self}/system"; + inherit (import sys) laptop; + + hmModules = [ + inputs.disko.nixosModules.disko + inputs.home-manager.nixosModules.home-manager + inputs.sops-nix.nixosModules.sops + ]; + + commonCfg = hmModules ++ [ + ./common + ]; + + specialArgs = { inherit inputs self; }; + in + { + qemu-nixos-btw = inputs.nixpkgs.lib.nixosSystem { + inherit specialArgs; + + modules = + laptop + ++ commonCfg + ++ [ + ./qemu-nixos-btw + ]; + }; + + dell-xps9360-nixos-btw = inputs.nixpkgs.lib.nixosSystem { + inherit specialArgs; + + modules = + laptop + ++ commonCfg + ++ [ + ./dell-xps9360-nixos-btw + ]; + }; + }; +} diff --git a/hosts/dell-xps9360-nixos-btw/default.nix b/hosts/dell-xps9360-nixos-btw/default.nix new file mode 100644 index 0000000..bb0a5f2 --- /dev/null +++ b/hosts/dell-xps9360-nixos-btw/default.nix @@ -0,0 +1,30 @@ +{ ... }: +{ + imports = [ + ./hardware-configuration.nix + ../common/users/rtucek.nix + ]; + + networking.hostName = "dell-xps9360-nixos-btw"; + sops.defaultSopsFile = ../../secrets/hosts/dell-xps9360-nixos-btw.yaml; + + home-manager.users.rtucek = { + wayland.windowManager.hyprland.settings = { + monitor = [ + { + output = "eDP-1"; + mode = "3200x1800@59.98200"; + position = "0x0"; + scale = 1.6; + } + ]; + }; + }; + + disko.devices.lvm_vg.volgroup0.lvs = { + # 100 GB of available disk space + lv_root.size = "100G"; + # 100 GB of available disk space + lv_home.size = "100G"; + }; +} diff --git a/hosts/dell-xps9360-nixos-btw/hardware-configuration.nix b/hosts/dell-xps9360-nixos-btw/hardware-configuration.nix new file mode 100644 index 0000000..b68d713 --- /dev/null +++ b/hosts/dell-xps9360-nixos-btw/hardware-configuration.nix @@ -0,0 +1,29 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ + config, + lib, + modulesPath, + ... +}: + +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ + "xhci_pci" + "nvme" + "uas" + "sd_mod" + "rtsx_pci_sdmmc" + ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/qemu-nixos-btw/default.nix b/hosts/qemu-nixos-btw/default.nix new file mode 100644 index 0000000..a8302ed --- /dev/null +++ b/hosts/qemu-nixos-btw/default.nix @@ -0,0 +1,17 @@ +{ ... }: +{ + imports = [ + ./hardware-configuration.nix + ../common/users/rtucek.nix + ]; + + networking.hostName = "qemu-nixos-btw"; + sops.defaultSopsFile = ../../secrets/hosts/qemu-nixos-btw.yaml; + + disko.devices.lvm_vg.volgroup0.lvs = { + # 50 % of available disk space + lv_root.size = "50%VG"; + # 25 % of available disk space + lv_home.size = "25%VG"; + }; +} diff --git a/hosts/qemu-nixos-btw/hardware-configuration.nix b/hosts/qemu-nixos-btw/hardware-configuration.nix new file mode 100644 index 0000000..0ade172 --- /dev/null +++ b/hosts/qemu-nixos-btw/hardware-configuration.nix @@ -0,0 +1,26 @@ +# 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. +{ + lib, + modulesPath, + ... +}: + +{ + imports = [ + (modulesPath + "/profiles/qemu-guest.nix") + ]; + + boot.initrd.availableKernelModules = [ + "ata_piix" + "nvme" + "floppy" + "sr_mod" + ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ ]; + boot.extraModulePackages = [ ]; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; +} diff --git a/networks/private.nix b/networks/private.nix new file mode 100644 index 0000000..f7d24b8 --- /dev/null +++ b/networks/private.nix @@ -0,0 +1,63 @@ +{ config, ... }: +{ + sops = { + secrets.private_networks = { + sopsFile = ../secrets/network/private.yaml; + reloadUnits = [ "NetworkManager.service" ]; + }; + }; + + networking.networkmanager.ensureProfiles = { + environmentFiles = [ + config.sops.secrets.private_networks.path + ]; + + profiles = { + home = { + connection = { + id = "Home"; + type = "wifi"; + }; + wifi = { + mode = "infrastructure"; + ssid = "$HOME_SSID"; + }; + wifi-security = { + auth-alg = "open"; + key-mgmt = "wpa-psk"; + psk = "$HOME_PSK"; + }; + ipv4 = { + method = "auto"; + }; + ipv6 = { + addr-gen-mode = "default"; + method = "auto"; + }; + }; + + mobile_hotspot = { + connection = { + id = "Pixel6 Mobile Hotspot"; + type = "wifi"; + }; + wifi = { + mode = "infrastructure"; + ssid = "$MOBILE_HOTSPOT_SSID"; + }; + wifi-security = { + auth-alg = "open"; + key-mgmt = "wpa-psk"; + psk = "$MOBILE_HOTSPOT_PSK"; + }; + ipv4 = { + method = "auto"; + }; + ipv6 = { + addr-gen-mode = "default"; + method = "auto"; + }; + }; + }; + }; +} diff --git a/nix-install.sh b/nix-install.sh new file mode 100755 index 0000000..9549af6 --- /dev/null +++ b/nix-install.sh @@ -0,0 +1,86 @@ +#/bin/bash + +set -Eeuo pipefail + +# Delete tmp dir +cleanup() { + [[ -n "${TEMP_DIR:-}" ]] && rm -rf "$TEMP_DIR" +} +trap cleanup EXIT + +# Check dependencies +require() { + command -v "$1" > /dev/null 2>&1 || { + echo "Missing dependency $1" + exit 1 + } +} +for CMD in sops nix mktemp install; do + require "$CMD" +done + +echo "=== NixOS Anywhere Installer ===" +echo + +# Interactive user prompt +read -rp "SSH destination host: " SSH_HOST +read -rp "SSH destination port [22]: " SSH_PORT +SSH_PORT=${SSH_PORT:-22} +read -rp "SSH user (requires sudo privileges): " SSH_USER +read -srp "SSH password: " SSH_PW +echo +read -rp "Nix flake: " FLAKE +read -srp "Full disk encryption password: " LUKS_PASSWORD +echo +read -srp "Full disk encryption password (repeat): " LUKS_PASSWORD_REPEAT +echo + +# Minimalistic validation +if [[ "$LUKS_PASSWORD" != "$LUKS_PASSWORD_REPEAT" ]]; then + echo "Full disk encryption passwords do not match" + exit 1 +fi + +HOST_SECRET="secrets/hosts/${FLAKE}.yaml" +HW_CONFIG="hosts/${FLAKE}/hardware-configuration.nix" +if [[ ! -f "$HOST_SECRET" ]]; then + echo "No host secret found:" + echo -e "\t$HOST_SECRET" + exit 1 +fi + +# Setup of secrets +temp=$(mktemp -d) +# Host secrets +install -d -m700 "$temp/secrets" +sops decrypt \ + --extract '["host_key"]' \ + --output "$temp/secrets/keys.txt" \ + "$HOST_SECRET" +chmod 600 "$temp/secrets/keys.txt" +# Setup user key +install -d -m700 "$temp/home/rtucek/.config/sops/age" +sops decrypt \ + --extract '["age_key"]' \ + --output "$temp/home/rtucek/.config/sops/age/keys.txt" \ + secrets/users/rtucek.yaml +chmod 600 "$temp/home/rtucek/.config/sops/age/keys.txt" + +echo +echo "Installing ${FLAKE}..." +echo + +echo "throw \"hardware-configuration.nix not yet auto-generated during setup\"" > $HW_CONFIG +SSHPASS="$SSH_PW" nix run github:nix-community/nixos-anywhere -- \ + --env-password \ + --extra-files "$temp" \ + --chown "/home/rtucek" "1000:100" \ + --disk-encryption-keys /tmp/disk.key <( echo "$LUKS_PASSWORD" ) \ + --generate-hardware-config nixos-generate-config "$HW_CONFIG" \ + --flake ".#${FLAKE}" \ + --target-host "${SSH_USER}@${SSH_HOST}" \ + --ssh-port "$SSH_PORT" + +echo +echo "Installation finished." +echo "hardware-configuration.nix generated in $HW_CONFIG" diff --git a/private_dot_gnupg/common.conf b/private_dot_gnupg/common.conf deleted file mode 100644 index 5add401..0000000 --- a/private_dot_gnupg/common.conf +++ /dev/null @@ -1 +0,0 @@ -use-keyboxd diff --git a/private_dot_gnupg/gpg-agent.conf b/private_dot_gnupg/gpg-agent.conf deleted file mode 100644 index e100b95..0000000 --- a/private_dot_gnupg/gpg-agent.conf +++ /dev/null @@ -1,10 +0,0 @@ -pinentry-program /usr/bin/pinentry - -# Cache GPG password -max-cache-ttl 60480000 -default-cache-ttl 60480000 - -# Support SSH emulation -enable-ssh-support -default-cache-ttl-ssh 60480000 -max-cache-ttl-ssh 60480000 diff --git a/private_dot_gnupg/gpg.conf.tmpl b/private_dot_gnupg/gpg.conf.tmpl deleted file mode 100644 index bbf67a7..0000000 --- a/private_dot_gnupg/gpg.conf.tmpl +++ /dev/null @@ -1,79 +0,0 @@ -# This is an implementation of the Riseup OpenPGP Best Practices -# Copied and modified from -# https://raw.githubusercontent.com/jessfraz/dotfiles/master/.gnupg/gpg.conf -# on the 2017-01-29 - -charset utf-8 - -{{- if .gpg.signingkey }} - -#----------------------------- -# default key -#----------------------------- - -# The default key to sign with. If this option is not used, the default key is -# the first key found in the secret keyring -default-key {{ .gpg.signingkey }} - -{{ end -}} - -#----------------------------- -# behavior -#----------------------------- - -# Disable inclusion of the version string in ASCII armored output -no-emit-version - -# Disable comment string in clear text signatures and ASCII armored messages -no-comments - -# Display long key IDs -keyid-format 0xlong - -# List all keys (or the specified ones) along with their fingerprints -with-fingerprint - -# Display the calculated validity of user IDs during key listings -list-options show-uid-validity -verify-options show-uid-validity - -# Try to use the GnuPG-Agent. With this option, GnuPG first tries to connect to -# the agent before it asks for a passphrase. -use-agent - -{{- if .gpg.keyserver }} - -#----------------------------- -# keyserver -#----------------------------- - -# This is the server that --recv-keys, --send-keys, and --search-keys will -# communicate with to receive keys from, send keys to, and search for keys on -keyserver {{ .gpg.keyserver }} - -{{ end -}} - -# When using --refresh-keys, if the key in question has a preferred keyserver -# URL, then disable use of that preferred keyserver to refresh the key from -keyserver-options no-honor-keyserver-url - -# When searching for a key with --search-keys, include keys that are marked on -# the keyserver as revoked -keyserver-options include-revoked - -#----------------------------- -# algorithm and ciphers -#----------------------------- - -# list of personal digest/cipher preferences. When multiple are supported by all -# recipients, choose the strongest one -personal-cipher-preferences AES256 AES192 AES CAST5 -personal-digest-preferences SHA512 SHA384 SHA256 SHA224 - -# message digest algorithm used when signing a key -cert-digest-algo SHA512 -s2k-digest-algo SHA512 - -# This preference list is used for new keys and becomes the default for -# "setpref" in the edit menu -default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed diff --git a/private_dot_ssh/config b/private_dot_ssh/config deleted file mode 100644 index 7937841..0000000 --- a/private_dot_ssh/config +++ /dev/null @@ -1,6 +0,0 @@ -WarnWeakCrypto no-pq-kex - -Host * - SetEnv TERM=xterm-256color - -Include config.d/* diff --git a/projects/symlink_dotfiles b/projects/symlink_dotfiles deleted file mode 100644 index dbcb50c..0000000 --- a/projects/symlink_dotfiles +++ /dev/null @@ -1 +0,0 @@ -../.local/share/chezmoi diff --git a/secrets/hosts/dell-xps9360-nixos-btw.yaml b/secrets/hosts/dell-xps9360-nixos-btw.yaml new file mode 100644 index 0000000..8fd8b41 --- /dev/null +++ b/secrets/hosts/dell-xps9360-nixos-btw.yaml @@ -0,0 +1,148 @@ +host_key: ENC[AES256_GCM,data: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,iv:RYx5EpBBo+7lg2ZZkUd2FFFl0GS99TMBNKmOuiwXt/o=,tag:2OCWKQqitlXnC2UBANXpig==,type:str] +sops: + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IEdBL0c4UTE2 + Tnk1cEpUa3Rpd1ZlTy9BbXRiKzk0cThMa0crUDE2cEh2UjQvb0FsZjh3L25tUkE2 + TDZkQnNuMElPNTBjWGl3M1lRdXFSeHVKMFRDSW0xY09mYlc3K1NiNnc0M1ZHa0NE + SVVMRTBLdFc0Z0p0dlJZSER6dTBSWnZ5VFIxWWk0bXBtaVJVWWN0ZTREWjllZzFX + dXNiNThOd3VOZFVUM0syd29kakxNK2g0cnYvMXhsRk9WbmtFUEk3bXh3dGplcnBG + OEZFaUQ4TW5uWE9lVHdESEhrTTVYekl2bjJIa1duUWRmM1BYc05LaS9rdjdWb0VP + UlJQcG5hWWdaWFBSZUVHQkdLT0JOSll3Yk9JVDJPV1BIQi9Zbi9zTHZIbUptY2Qy + blE4S08xcHVQbTFHM3RBeXpuR0pUeHZZazBpQ1FmQWRjeFFoT2hlZXp1SkJtQXhr + MkZRaTNFNVdyRU1GWmxDbXp5L2FIa3dCOFY1a2hPNGZjTmhmcXZ6MWV4WEFJWE1a + Qm5kazhjTzNJZ1BVWGo4NWtBa09GRUVBWE1rWFZQNVlmRzl4a1JRUERGdlo1am1z + NDlNUGR6d200Unp0ZXpScCtoOHZvR0dVdUNwN0VEelRYdEl2Y0sxbHdzMFc0NWlO + dGdXMkE1Q1ROVElrQVU4WWFjU0pxRE1vRmo5aWlzM1I0QVVOajJpalNBeDZZWWtz + Wmw3clhVT05jR2hJV3g0d2JVYmoyZllaSzB4Y3RHRW53cm9MeHlZU25iK0FnTFFh + cGUxV25NQTR4Q0YzdXJXSjRDUDc5cTA5REpuSEpIczg2NjQ3eWVpV01KMkRYVHho + UGNuZFBRYUtSbFpYN3h6WEp4S09MVkMzM3BYR1RMRSs4RXExeGs4OXo3Ukh5eWo0 + dWp6ejVJRnErc0VucEExZ05wWWNRd3ZjWWFDc091eEFSUVNaRmlld1dsYkU1NEVV + RnQzaWtNVjBWUW5iUFlReldOcFZxVC9OOGg5MUZXZFZOTGhYaW9Qd1JJVGkraHBP + MVFuMDZncFkzZGFIcStIdzg3c3U4RkQrUmFnSm03U0w5Q2Jnbk4yUG84REVZTnhy + ZDBCNVNXME9uakRVRlJlUlhtUFp3dk9senNxTy96VnhqSGZZWHJSVS80VXdFRERy + TEhoWkZkek1GbHpvZEZtL01iOVBsNE5xTGNQdld3c3NkQ3hORk9yeHdBVkQ0QUVB + VnFzWWtoWnJSSTZOcUxyVTExcmJOeThEWmRONFU2TjZnSHJ3eGdKOWQ4K3JTb1hM + V2NJSm91dUczYXRtNVNaa0M4dUF1U2xjTVBWckFOdGxlaGNTdGpHQW9jMEhzV29N + bldqanBsUDdtY2RCc21VZXZSR1VPa2NvQmNTWnJka043QVVKWE84L3M2WXdUS3R1 + K2VpbXZTVmROeHJvSjFscGs4bGFYd0R1Uk9iWStobkluT1NZK1E2UVJ5a1JwQVNQ + aUMwL21MS2VoZm1yZVpNR24xQm5XdTlnWmpDUzc0QlpqK2N6cHF6S041blNJeC9y + T1FVWnRyYU5NdE1Uayt0YTlhL1JESFBqblcrazkzQ2dEaXZPTUg1RUVidGRMTEVI + cURZTjBIQ1ppMUhham96OWMyVEx4SWNMcE9HMnZYVXA4R0dUdVhDSDVtOFBJa2w4 + dnAvOGxJWHkvR2FhK1pVUFlpQlk4eUFwMEhIVXJMVEJzMVh1Zm1BTTBscllqYUZq + emhES2U1eVNOMjdIYzdWbW5UM01kZnNhRmxUcVJOc2tWaTNKbEt0Rlo0cXBENit2 + WFdLbkxXcG5RKzF1empDa1FNeFlJQitRZWtabXVPWWlCYWh0dVNUZmhGMWRuV2pm + ZFZFcDk3WFA2eE55bi8vYzVDWEF2am8wZ1lBWSt6YkVXYUNHVytscitEWDJWdzAr + OURvWmJCdEN5YlBSWXdHT3JPYmtLbzZ2NVZvRjd4a2ZwK0JUVmQ5amp1c1VLUQor + OHpNSk5ZTUFLNlJJdnhsYlF3TzlCbGpqeXcwRVhrQ0xhZ2QvZVgxVTdFCi0tLSBw + Z1lVY3daQXFtdHRBVEdkdFJvQlFBQURIQUllUHVGVUN3MnhLZFUyWWRBCnf6mauZ + P2+Issu8HnQ9rURnLVnno2gNvpZuEPliIezzyPcgJWEP+1l86s8tjhBaDpwo/VkY + NBErETIKs9EH6VE= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq10dd9wceuvcn50w9nqec5fws670qz7eqhfw7teyptqfp02c6k05pjhrp6kgtfwyx4rv6gry4uwpanqvknsvn2x26zf8p9d2ccelq24uncr0hqev9yjm8wdeypgfspdn9vt0ulvx6jcsy293j2y7chsmse3wfd8qeg99fwnup9psuqewrzpwfdv0kcfjlu2skxx8nxcykxwaz2dny825e3wxphmn5c0vtxp4tjetzw8f98sxgfmv720sk94ezpg5fzw2a5k2eszvnpjqrcpw2ck5zxwuyprd598gaqezkj5jy0ry7eqx4su5rtxdemkphhwjppe0fsp3t7p3vezf3pzuhq3n3etxkcggsy62u94ufeclrchdswkl6gwp5ce65aevnu04aqxrsm0deuf8pgfaqxk3ys43ex2wz625a06s7kfcc8tagp8zk6c9cpqu7jg7sxtjf6faq4e8extucyxjjq42a92ancn8ae5gdgr2ea4wuqg2eurs662ufux35nhkutjqm7kxlglafwu92vefqn8lvn9gwm6jvcvtpvs6nngj7zf43fd0k3pqs8dzvvf0fc7ea3v3ct5q6zt0ptdkdpjnv2t9jcnh2vhxv3t9uk6rzjw5zqtraxp52w3345edj0fzugwdfqcd8jge75yufv6u47wz22qhqzucch2wkgj8lk266ep7e6mwvfv6efcgf4jy35kpmhm6fzwcdsxxlup5q2zxzdpg67xjslp9f6t96khpxepp50jgss4d2edermg68xkff8wahg72ayaats9dz5rukqphkahguf5hyq0dwtz6s90jlh0l3ajql7pfy64zkz6ftuu6u2578wnpmpkwta0es47d3sve9neqa89w708j4afc2raxdf2gaucl70jn7e039axgmzk069ha4p923rf3lwugys0v56tgfu79x5pcuw2zespxely7tyyhg9z4upquxynwpzcj7atq57yazfu74tv6cun0c265am8zahls5x6y5t4f4zpdgmggtst5cefyatmqehted0gw5sawprpdf6gg9nf4c84xmk575auu0mn35j2rgy8wdkhykkrdxtjah88gr2cmrr9ra8edw9fs6v3pzkh49rtk24qhh2505c4d2zrw8ashyedtapnmeyndpy8f8szlz5tc7w0jyxm69s9ysaq5cgkfst4ude8z3phshy5yk5f3yakuxkgv7gyp2hwgl3kl223wzhv40ukmpajyass46zrgtfxr8sr3gax24d3edekg3sf52vklktkgkx3wgctvu6l9xzr098zc5gvsf50xqw8dp3y96rx5nkswt6uw7glxpyyj9hzxkqhylnry7h79hlrualwsr6qh0nx8mc5q2mmv8sc3nx9ggnek8jc0x9qaq426ssf9y35qr6jf4fk40xex45hvx72zpr3g92j2yczrd4qnwvf9flp9ekg0nsp7ru5z7c0fzqz2uwsvjlly6zmqaq5awgt9lclp0rply9jy9tcgfsqchncxuarqfc4zzf3jrpg9dvxgvhyqsl034lv732d0rc44032w7gt3c8kpnypaj6f2gpf5qzyrjy9d26h326gzv8gy6glqrrhunfxk54gjw6ktrhy4fp8ez3jz8wv89z798dz6q2upgkuyf3hgpf42wgs427ufmvetpqc9v6p032yllpcnrrkxc5qrfj9spttawd5hf4gxg2xk67hwcy6g3u5rlqslth3yu8x25ah966nq7v339ytf33avuuxaer6yrhfdpft42cj5a8apcrw0z5ksgmn0qcgeq3p3wmqecnucswe7rga66rde9ax7wtldwzqa85m3mqj8vwspehqfdy8gn4nke4knf2zr9cjpx37jawu2p5gzzejqe26mgzjh90nv9mf2h3x6g8h6tzumyktdscdu5azuzmf9mvxv2n9aky + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGgwLzUxbnNt + WlVVdWRDVkpmd1AwNDNOSDVxempwemo4U3k3ZERxRzB2cU1WUGxoVmkzdjlRL3Vv + OUppdjZkUCt5TkpoZXFTRXVrcEdkcWgyMnY4WnlTR2FMUzdIUnRVNmNpakdyN1B2 + MDZrbzBEbG5wc1dveFVYNDdwbkovQlNGZWJhRjk3cDB6YXlwTU0rc2Z2bUFHTFBT + d2pVcGF3cktCbnRCOHRXb0NXQjFOVlYxamNGdmZzYVVHSGtYblpnbEc2REoralN0 + MDBZRW4vakpKTXR4U2FoeFg5S2pMWmxHVHdYQ0t1TlFSaXNMdlNOdlEyaUJKbHZC + dDVNc0xaWXVBZU5sdEQ2T013MWpTMjBPZ2xaR1VHWHlXTUVydWFMY3psOGZ5MHNI + RSt3d0pQWXNGa1JyT2RvS0hlYVN3UEZzdmZLNm1raWtNdjQ1OGdhcnBGZWZFdFo3 + cHZWN2pDSEF0RnhQaHZHMHl5c3VJdEhVOHFEcXhLYWZLSExJcHc5TEVQY2dGQ2Y1 + ai9jNnM1d1BYeFV5a2JwaDB4Z2YwRldkYUFVZDhnUXhrQ3JOUWprcnhDazJUMTRY + aFlyaWtYM2xOdjhCZ1UvTitwczJseUlCNmRLTHRzcDNaNUU4Y01sb3BCS201SVR2 + MUFtOS9Ndms1QnlCaTI3VXltVTQydHJJUis4ekZwR21vSC9BOWt3VVFWdVRCMTVJ + cWNTc3QwNmVVVnI3VzZod2VwazVpTGx6dHdBSDR5SUxlRjgzd01rZnloWGp5S1F2 + L1plVUhpT0dVdE5pVnRSTjd6Tm5OSTdpaUxHL1lSZ2lFWXpEaWgycDRYaWN4MTZj + bEdHM0dWQXlDekJTMWNZdjNTdGpzTVZSR1l2V0E3YVJtN3l4c0N1UmplUE1vZFNh + VllXTzZxcWRlbGFvRTBod1RMd1VXaVo5K1BpK3BkcjVFZmJrSnFQVm5LdnRPTjBI + RDREdXhzQ1hEQ2tTTHNwYTc3WmEwNCtJbTkzWTRIZHdsUWNEODRVYWlLcFJyMWZE + Mmo2cEJxeGxjNWpwcVR0R0VxMzlwNGp6T1daOWxmeU9GekhyaEg4ei9yYk5YOW1x + UWVWZTF0dGk3di9EaHBnUjB5SXNBTDJ4UUFSQU5NcXo1QlpodDBOS0U1YnQ4U0kx + d1NFOVNSNWRGcFlac0h2VmZoUzM0dUJTeHIwMVh1VmZFSUxTZXhWUWltanNncnFS + ZXdIeW81eW5rc0RHR2VZb0pJRkdvWmhyRXJsYkV5bjdMbXh0U1RhSFkxbElIcUZj + V0FycXNteDhhM1UrWlhTSEpJSFpHckFiSW4zR0M1YzQ4QklmQkVKcFdWNHBVbmRW + dmkyMlIyVURQNUxiMmJJMzJUTDlvYTBJM0kxa2V3RjdOd3pBMm1HRURDcHFNamw1 + QUlJajJlbXROUDhNWHlwaWlWdlVwZjdaeGRLMGpXQXhDaGhFM0xHTCtWM2EzT1hu + b1pQQ3BPRDJNY2xrSG1qbW5Cb0duSDZRWlZaQVFGWlg2OGFLK1FWbzBwWmFSa3Bv + L3F1QTVWa2hLRGlvWFdPTi94SmdNREpWdHlYSGJEb3lhQ043UmJmY0xMakowYWxD + VWNjbmgzbDNZVmlpRWxDbkNhMkl6Yk9UQU5GZVdvS21XUStLaE9BWFA1VjVXOElO + N3pnM3JTUXh2ODUra0l0WkVFWGtadi9kY0pVV0xKbkNnN0p2WDhhakZ0dURZL2tX + eHZQMVk1L3U2K0lWSlhjdWlNdE5PSlBXeURZZm5mbVgrQjJwN1RFMy9xa1JmeDJN + TWYySGpERkxaME1BUlUxTmJJRVdXeldzZTUrQytJaFYyem9TaXlWa0pLa2JyK1I0 + RlB0WWMybG56RWtlaTN1L2xYRkFaeXJXaDloeHZQWEp0SExweUNFeUtTYy9HdEx4 + aVpIcmo1cnRjOFh3QjdKOUgrTUpFYnJTRmNJVW12MUdoeFlBQVhKSjN4WTRNQQps + L1cwVzFyWVgxd29SMjlLSm5FdExIaTdBNkxhU2xiZkQyVjJNYzd3bTRvCi0tLSBh + NE5GUkljS25IWjRpWURTeDFlVkg4MzlUS3pUNXFjRW5jZ3lGbndDRnhNCgyTYMmb + ffhQRS6P12r4m0pX9KWIPvkiTdpfPWAppj0i/SmsRxJduxfKqL/snREMJfV5V2IO + 1gAs44on+45Dp0I= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IDJiOTV2U2J1 + Uk1aeHhtYWI1dFIzUEVDMFJmbGpyNFBPaUcxOFFTTzhEZUFWWVZkdm1UcmFaQkoy + ZWptNUE5QjlLd3lwMUsvQzY0bHc2YjVFWjRIQXc4ZnhQSmhlZnBOZzkyWmFHZFBR + SnpuQ2prODNBK2x2UFBlUXlrckpvd01HdEMrM3JTVk90S29yMDhISHdpemZsUFZw + aTNpd1NUY3g5aVRaZkVmc054d0pnOGg0QlhML3dsMEVpd2lrVnMxR05tLzZBQ2Vr + TXNVakxsTGMxZ2RjNDBaNkZiSjNiRGlJdjZ1SHh1VU9qMWNwY0VRWkltQ3U2WjZP + SXRHOE5YeUtZYVdiaXY1VGVETXlNUlJKVUorcUJrNnpmZjdyazVSYVY0SmpCUE1n + dVJMSnZJSUNKZ2J1bk1MVUJybVZITFpDckdTVDdpa3VYcFl1N1JCcDRpUFVjdnpI + ZHB4R1lTOW9pWFY5SnpWM3p0eExTYnFqcVlVM2twZ3JaMlZJQU1zOTVzWnU0YmRL + TGNQWHVzRTZtck5EL1NiSnNWZ3JkVVdJNHVSVkVxQVlzQXRoZ1RacnlTUTB6OEVN + R3JVclgwVWo3MHNwR0pFRWNYSENrbXZ5cEZIOGtsbVBKZ0R6dHZ5N1N2UW5TWXht + T0J3OEM4ZkFqRnAwVHVORktjdWRveTR3bHJOa1pDU1lwYVJzRHJwOWphenZkRlpK + R0FlU09jWFhvd29saHVXckQ0WDUwZWxtOHJpNzJGcGVQUlhSUUE3c290WEp2M01x + YjFJMFptWndaSzkrcDdqUkNQNUhESFlXeDJuSk84VVFXVVlNTDN2S1d4NmVwQjMv + b1F2T2wzamF3OEIrRnp0S2FZbGVQTHpIMDBFKzkzbmdmUVRnOG1mbytYeno2NDVC + VlFxanRkU1ZlQ2greUxOc3JnaGNETTg4RENWaS9YcDlRM0JMZGJscHdDdnRlSEFT + L1RKUmJlS1RJK0ZjZ25aQy9KblBXdGtmSDI3SUNIZTltMUFvQ3NUNW9YNUs2Rkw0 + MzBwN1Q1cDlpcUEwdFM1U2dsRFVFY3VvaVVLR003SlF0T3pRK2prcUJnS2lLUUVp + dm1aQytRYWhXeFYwQlRrWGZDNGcwSml0MFFKLzdwZVVYbC93OWVMb3g1S0lvNkov + ZHpNNFhrZHRBT2ZrSU03M2U4ZkxraWh3eUNhVnJMdkh1aDMyejZ2M2lJell5WHVD + TmNTd2FHRFZGUElSaElleGJRemdxUXp1Tm9oWjB0RXNZeWlzc1dVSlJoemJtdWhk + bHRidWY1QmszSWhBMXMrV05BLzdNNmhWbFgwU2ZIMG5sNFVYOW84b2tWTkFjanBU + by90enJkMTBSMmlVVVB6MURmOVUwMmg5dTVJK21MZ1RGZGgwbGJlVzgvbkVJbGps + UWxRTzA0NTNobGJuV0lJV1NBOFkyRmxWVXkwdTROM2JIZ1d0blhRZ3hVSDd4RHd6 + Qk5xRjBXclhjTE9Jb1lpK1UvUzgxWHFzNE5nQktqeGpuVTQ5Y25oVVR0aWRkOXpq + aTdvZ3FLS0hqdnc5bi9SZ3dLa2dhM0Q0OXMxT0p2VHJTVExjWE1PamZMWWxSVFU3 + bm8zYkhBUHZSOWlWcmZJTTBYREd6MTBpclk5MXNmNFdBUDVyZjZ0VUEzZHFiTUxK + VVNBNHdoWTlycWtKR2R4VzV4WlpQT2JLdldFSnorUnI1NXFFSFlMN0VtN0UyS2dC + dUJ5dUlWaXMyMTBNYTlhM1R0R09lcWVaeURlUWk2WlM5L2FqOHhBM3dQbExGVU9u + aFkwNW1LMkd4TWo5MDhWNFNRb2NZdkh4dmt5N2ovNGROQXplT0RxendvN0lWNTJJ + RGYxUGs1WVIxZnZadnJZTFZheHRYem9mTkE5QkYwaUQ4NEhLb0VqN2FVd1NlQkNU + MUZhSEt6TStoT052NFhFVDVLSU5zYytNRUxCaldNUTVoYWlNeUhnRVhWNzVLZwo1 + d2hlWVZsVk1mSUxpdGgrblhvaENiNmFTWndEcGQzYnhjMVhIeURSWVVZCi0tLSBt + WXRaRGEyODdRZFdnS2NZZiszZXk2ZzJtcVhrT1A1bmVkVDZDcTBabW04CpQgjEPq + DM4ESZwPuj9E8J3kHRLr+i9+Xe9rEwhXcdBcoNu494k1BOpIVXrCn50gA5uyhcYI + JRBR5gnwTWDH/mQ= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa + lastmodified: "2026-07-29T20:24:34Z" + mac: ENC[AES256_GCM,data:9Gxz+YmSpRYWljVIK8/QXGHBrHItsirBh/AVgQ1uTbDZMe/l08rHfmFQC8wfcyq2FY9vWREItqH05VBtBQ5KdMUrOmkGi3Kthm59EtINvWVQkQzDB03rllaO9HMuxLSi2X2zsIo5Ad8drgRQdbh2qZMlvWhFeGzOOEKLBHs8olo=,iv:v+p05e2gwL3yE+iE8Ep00jf9VfTXwjhV754SxQ+stZg=,tag:MWX2ljnrqQB5FnkoLTX9Xw==,type:str] + pgp: + - created_at: "2026-07-27T21:00:45Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + hQIMA9/PFHehMxwxAQ/9HUMtBKAOnqRGN0iFi6k13R1aa0uHiL5AP6ymBRWN+8bb + ToI06b888Pe73KEBBn9QctPWdPwRT1dzP0a62I1an2tSECNryZjs2vZoooFAZCcG + jp8tJUnHJnsbJbFgSX/iU+vLFj7O/VUCgIxMqupshB8dYVtbLBQaGqV6d31wx5Im + YhjsgrN3n/vto35u0kDEGXxqkue5wr3T5rwEy5LUgEYibM1Z5y9nJcIXSIzepiXR + 6fVsvIjwl7gDusJl76BEXZOmlqC3WXK+whx25CATRgnQ4GPxJM/fbMFxQz8oKQep + Aejkjmgm1A2SxyqY+j+n9gKSirAGl9lGbbjCTOgR03MPn3EW5zBo+P0hvRBLcihS + u3Lycptf6LCQKu7EIyJ0TPq62cbm9+H/ehBWOVnXN7dOoomfbTG7uEtXvvKeXaQN + Zyr9Wqrotag7cD2y0dY3s+s3cIdnRuwQoYzGd+OuPQWcgHt7jgZ0iV3lRvoVtMWk + yvkoyGaibtB+EemoAZ+M9CvLn4wycvluhOO2H75shXgr6b1nX21LE7qIDt1wzqN7 + S34NCQ5ZO4ix9Ki6F5aaHgbEo2ilDwpKOLZFtHt4lYTs8iBKIvih38x23OSYMspV + DJR2Lihqvd0vhypq9wIyLFysvhbuVv+uH9FvQ82h0eSPwbv1gVULqfn7KBwG2jbS + XgEaoBzusP2AMznwqPllA4tme5MhvU6JlB2GgAXWyNj6AC+pe1DZaJx0PMsAzUKi + GSWj8N87Ck8wNuXnVCXyIJY17iNUOcOCkYzXXCMS5VrXCeXD9MxehA7WIRxMlLE= + =2r9L + -----END PGP MESSAGE----- + fp: "0x416CF1EF9AAF90BC" + unencrypted_suffix: _unencrypted + version: 3.13.3 diff --git a/secrets/hosts/qemu-nixos-btw.yaml b/secrets/hosts/qemu-nixos-btw.yaml new file mode 100644 index 0000000..89977bc --- /dev/null +++ b/secrets/hosts/qemu-nixos-btw.yaml @@ -0,0 +1,148 @@ +host_key: ENC[AES256_GCM,data:TVx3hm9kO/oJDpi36tRBfmfykeQTRjCtSXwIPG963iEkftMkTkicoa9z43gnyM7Tp5PiAPOBNLle7LdtbaIku/qCagYuq7ev0YGrRriJUT45w3M4CgB5x7O+5DLL4s9X6YGoczQNuXDzIHFZTXjMXwilCc2fbGUqe+mVvQ4LPEsMXRgakMIv/pB/Ulahgv7KUcO391m7nj9PQ5rN6Q01pbB/qwos0X3t/pLjiuOdHpa2Rre3jJ6zQ5Cd0sdIwudB4u+70aoo8le/BoKB3+Y3t6Y+7ns6bh+IjcJTjB1BwCZoO2xg80C7R5W7Mx33akTNlQDTEC7wYeOmo31T2M0uNwleLspKL1+3RRgPVNgPrspY8ux5jusnsbIhhmqTF6bg2xgehS2Q9H1bxDwkU8nqNrP498nBifXViv3eimXC2bhpFdrpDdpYPmBj5+caXKQdblf4IGEcxwKhLTHAuMo8IvuCmAZ9wzAUcJ7Qo4vdNkIeQBhOY1rwkK60vETNwi+qm1faMw2PvMzulczqZGcBkbRx6lslXlqiuypUJKw2b30uQYsHv/rD0qCEqCA7yRvGm3S4aQ26RmIU//7QxvQCKKWChuGad/U6kKazhY0gUiouhCGwInIijozRYI0oLwpgTB32EiZ8M1lqSe6ryvM+UI7V84hBPa067Yl25OMBLB58NjdZBfESPLYrF18DsmJ7aBJoOzGDHbMEo4i6yc7fdVZppYK2r0U59v4Z6Czv+clCNPCSsSe+II+OQQlKM6+3zdB12Ys2rIteDTy+t1uW/KaOFffN2a9JDpfdwLX7X3IwEkpT8IdLEknQxm6XKNOumr7+e69Ta9rIU0aZpkqMCI+pmXwmNkhr0cvlG8X6TXyHtCYlsnXgpmUQxtH6wgtbsjxuzh7q7a1w12McpqAeZa3lycpgX4+ghGWSZVakcG22CEuq0QY2akMIVACbnDpPWsqF91GHm6x4/ivXaxnLnvReDOA/64t8uxGMMkqt16tFBupCNqXhITzhZqnvIQBkdKDibWPOtoMEe71k2KH1Xk/PEJ5Woa+lSiqvjctXRFfLByEwn1d44wSqGrXjGTlLDVbtiGwg76lbiHy77bby5yRgQa89jAz5e9Qmk2RQSyy1w27r8KJumZ4EMz22so3GNghM9xiMN/wQN5dSoeUhGj8MCsmc7EPli199+KhUC3c2TU6d3iCGFVN0rpxEE650mwPGFZACQYz8yu4eokDyzvUAU/SgwowQ0hVbtt3LJAgR4T7F6kiRoTNQgJu5ksKC7bcU2NEcTLyOVyjDjtvz7x+KpiyYXaZLlirctdlm5oDnz7Z4FP1n8BRe2TRyf0u0DICspDdY3ifhTBSmdN7reSuTBQSk5k1uxBhfE5p9u16zpc+2LzhHtVAomcfDtmDZIpdTYXkUZQwog+HUm2x6F1Y1M494KcWk053d8jrlsuHZ+ZmimuCwfdc61TPEvUSu9GhF4i3vJzoRcL27xwMHfI6Jy/sVRv0nURSBr+laoUxgZn0pBT56AE98Qn6CET8EjoPMZxuoObDyN8raQTJ9sxeXtHsXzMhrJsYPgCMKByc/+MJ/em+XBLcC3DR32tIEGnZVTX4lo9B7pQ+UrbBgBPimuMbtVncmQaYiPDin1KUqz7LJ3haJ3xbE4XjhSPmKSZJioN9G/biVw22ORJ4LUYjekkRPl67aFUkQfPJJhkkm5iziZdl1yujZi0Se8cfuZi18zCmTFuHtSEwsHuXNvDJLgOxE5RH1Mf68pbGyVMf1TzThvW8RPN7TztuGyHRg+HnitIez3PTRIARD5UYMUh0rz6WBgxUowEPtT4O8D8Ur/6qYnoAGZhx/YtQ86yOswxUxMJKk4OM1Eg2yqnyBnqg3NvS5+L3sKzjJmKXN3tvvTWBQgawMxd8MKHrv9bR6gSR89pMW18lmD/lFu+ADzoVlZHOErX8S1STl4RUHwjyola4Wt/5JWm2rT2R0bDDNjuEZd52liFfFRYADg9TlTn7cUUtFU0HIau0YMmWnpySS6OH3THIDvb4qEz0QfYeIh7UJUUr/pZy85ApRo+6VUar1UqVn+D8BnzqxOPMTA2nepgOxHFlCzNDPYQyeICmuh4eHERfRpSAr+wVd21LVr1hW0k5X/kgsfzpxGzn240UGnTTlgh+D1AlIDGQfk+P1oogl5QAJyowfoL+Exlz/uljukmTOEBP40BosNN5KJ467jdKaw9JSF7h+nMhvRNQoRnbiLkYTxJDhzoH8BFAofDGzYW42iSS7M2dxe55DDouy454tFXxxixnbxamMdD6ieshNxdkKPCu8Pdt8SyFOMsvspgH0Kg/YA5xCZQwmfxmgCPBGI0WRuyXovs8s1cpQeXJz2Z6fHhgNY6Q7CQS4xdzL+0Lc0ZnJDAqPemoMpobcLJsYpFBe/2t9wPa7m+feyn2xCFGl+BScLyPPvvUhd53gSmLYXoDJ1m1izzQYBC0OkKIu5klWe4SOmvL9xwitsRJT53GSe+UbmuacQYs+oTR6vNCyREDxcTKZb26rTq4TD0AVwAsJU/rI8ViqjuyuWj1T6WWQ18V10aWF7yyC50CJ68PvGGd15DN7Jf251z3hDsbqdS0nFlmbr4LZaouwIOhtyMDIunzmrA3KECC/EbngFF+lmNLbDbaM5YXb4MCBIyX2FCBLkxZev71vD4avMk1tRgHLHx2zbXicpIF/l0kZh8/aXeOmwyQVGYrDPxOSqHjn+RCH3qhHxP7lAjpZ91CcPo1rL258YDbWRrZB7GUhVSjrOhTrRQ==,iv:C2FoWnEUgam2oS6+eQwaNSMJXtf1v6gxYVVus6NhEIM=,tag:dJZ+LPF8Yro7Acilu2ScVQ==,type:str] +sops: + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IHRYb3RMZFpm + cHVpc2FKQVRsRHRZVWp2SHZjWGJRd2FBMjBHMHE0TXZmUUxRVW9yM2g1WnFMS1Jo + RW5LZzBOaFNUUHg1SjNhYjJCZW14UG1wMjhMd0t6V0pzaGdmTHhrVmw0aWJ2Znpz + aTFURUh6Ym8wZWQ1UlhiNDMrOVFmR01YdS9ZUWhITEs3RlB4ck1HWWwzK2c3TCtk + d2lWVzEzczhPTWFwTkVrSldrUnAzWnVPb2N5dFlXYjR0U2R4UXNaUGFWR3JyaEVH + UDd2cnhvaWM4WFNwS25FK056YUlKK1VMblJVbWZQTmZhblRUbGovOU9SM1YrWC8x + VDg1Z3dJdXpUY2xmQXJJYlZ2KzhUVUQzZHJIRHFEMmhKdkpXa0psbldOMStYZXQx + WnFJVldGZFVmY01meHE1V00vUW1pQ1I4OEMrdG80U0hxVm1hRDJHVG5SUWtMNVBm + YmZmRU4rdUJqN1dtNzhuZEVGMEhXNEsyc3hKQk14Nlh2RUJiYm1yaEJCdmdBZlRw + cGlKVkRBUTVPVUdzdXZ6ckRxdWwvNEdyTHFRZVNqQTlyNVBnbHp1aG5sL3h4UVBl + OFVFNlB3K3VrSnE3ekN5a3FGY0k3SFdpNE1uaGt1Y2lQNGtwOHBBejNOZUVEWnJr + STZyVFJxY3pQRER3dzlyVk9Ea3YyK3lsRWlwTlM3S2crVFZZbk9Ya1V2OFJsUHVC + OW5FaGdlQWRXaG1QKzk3TnE5MktDZEFFcmYzaWs1bEExV05lUDZ2RWg4S3dZYTQ5 + NTdmTkVuZ0sxWHhSQ05QOUZMRnNOWUFhV3J0c0hha0FGUThtSHZJRWIxb0FsVU5B + T0U5NUtPWlRtRWdEQTJjcUlJS0UxazFkUDVZMnhSZ1BuRnpGQVFXU3VFS3lnd0hB + ejVyaVdMOWYwNWdNVkV3Q0dHWDNVbUljL2VJaGNnalNaaGVXZVRRSDBoL0Z6YjBX + WDJZSzZveVh4VFhoWjNJMzB5elZLblJzMEFPQXFSYzhWcUlsdkJhbFVIZTMydVQv + azFvbTJxSnhXVXhsb0RpYzlKTEl2TjRoaHMrVTM0elVoZGNhekxpZHFJYTR4VFcy + Nk1YL21mVHNvcTNMMXJTU1lzd1J6WkFPWHdiZVUvbE0yTlg1WkMzZERwTG5rcS8r + UFlBdURtODN2aVBnaXoyc3VBTnZTK3JzMlBTWWFLbFJLYnFqaHh3Wkk0NzNVWFR1 + L2tXalJhdXdES0IrQUNPVjZ4dDBxNXRDcVBVME5GQ1JqMlhnVk4zVTdjeGt1WVFO + QjhvMFphSmhadjA2OHQvWjNzZVlZaXJneXh6cEl5dHpjZHEwNzVtUzZDK291UVRQ + UERHY0FEanB6TWN5WEpGbUlXNVk0clhCVDQ4Wmw5d09UdmtjZ0V5bWQra2dKY05K + V1FaejZLdEZQZG9jSkc3bk1oRHVoOHV0cElGazh1dXplNHpLQTZpeFVTN0d2dXFq + MDhhWHllTy9JZWpxbnJ0eThlWFFxT0c2ZURBbjB3cHg4YllqMDZSbm5WODVYb3lO + MVBSVWJuMmhORmozNHp3QmxPc3dIM0dxbjV5T3cvVGluYkFPV0l6TnBjY0JDUDJI + dXJiQXVuVmZuMXhaSE8wajdTRWRTSXEzdEpDZWtCUG94clN5bHpxQ2QyRmpmL3Z2 + SHo1eVB5MGhXRXAwMU5rWTYwWkJ4NUtOUm9YbGRGNFZuQVpHWDUvOGpxNVVhbzdH + VWhSbmVHMG5zZ3J2ZlZRNnZBRklVT2txc21waEJPK05BbVg0LzN0eGNYN003TUN6 + QnQ1YlJpbHNlMzV4dDdhWmxCQ28rMGEwWUFXWHd0NG1wQ3N2TDY3djZHV3pkVWRC + bzZ0SnhXUzNCTGpPc1djekZTWTIrdW1kbzdLYmk0ZjcydHcrYlk3UWVLRnJhT2F1 + Z2lKNnB4QzI4QUVWTFZVdmZ0R1JlakZPS2lCN1dZTVhPYzlPWnpiUXlHYVNHdwpD + RDF2SzVkbkRJcFdHT2k0bCtmQmQrMlYrV0VrQlJUaXA2cUlNM05VOVBRCi0tLSBD + YWUrTTQxeVZxTERGdy8yZ2tuUDlVSFlSWktMWjJCcFE2S0dHUUlsUENvCvD/76Cq + WcsqCyPio5cbyQRUISwjqWjSkC6WrLHe1gaxldtlsvrAxkfSP+MrmgEDsVHFtEG0 + bWzowgesvq3vSo4= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq10dd9wceuvcn50w9nqec5fws670qz7eqhfw7teyptqfp02c6k05pjhrp6kgtfwyx4rv6gry4uwpanqvknsvn2x26zf8p9d2ccelq24uncr0hqev9yjm8wdeypgfspdn9vt0ulvx6jcsy293j2y7chsmse3wfd8qeg99fwnup9psuqewrzpwfdv0kcfjlu2skxx8nxcykxwaz2dny825e3wxphmn5c0vtxp4tjetzw8f98sxgfmv720sk94ezpg5fzw2a5k2eszvnpjqrcpw2ck5zxwuyprd598gaqezkj5jy0ry7eqx4su5rtxdemkphhwjppe0fsp3t7p3vezf3pzuhq3n3etxkcggsy62u94ufeclrchdswkl6gwp5ce65aevnu04aqxrsm0deuf8pgfaqxk3ys43ex2wz625a06s7kfcc8tagp8zk6c9cpqu7jg7sxtjf6faq4e8extucyxjjq42a92ancn8ae5gdgr2ea4wuqg2eurs662ufux35nhkutjqm7kxlglafwu92vefqn8lvn9gwm6jvcvtpvs6nngj7zf43fd0k3pqs8dzvvf0fc7ea3v3ct5q6zt0ptdkdpjnv2t9jcnh2vhxv3t9uk6rzjw5zqtraxp52w3345edj0fzugwdfqcd8jge75yufv6u47wz22qhqzucch2wkgj8lk266ep7e6mwvfv6efcgf4jy35kpmhm6fzwcdsxxlup5q2zxzdpg67xjslp9f6t96khpxepp50jgss4d2edermg68xkff8wahg72ayaats9dz5rukqphkahguf5hyq0dwtz6s90jlh0l3ajql7pfy64zkz6ftuu6u2578wnpmpkwta0es47d3sve9neqa89w708j4afc2raxdf2gaucl70jn7e039axgmzk069ha4p923rf3lwugys0v56tgfu79x5pcuw2zespxely7tyyhg9z4upquxynwpzcj7atq57yazfu74tv6cun0c265am8zahls5x6y5t4f4zpdgmggtst5cefyatmqehted0gw5sawprpdf6gg9nf4c84xmk575auu0mn35j2rgy8wdkhykkrdxtjah88gr2cmrr9ra8edw9fs6v3pzkh49rtk24qhh2505c4d2zrw8ashyedtapnmeyndpy8f8szlz5tc7w0jyxm69s9ysaq5cgkfst4ude8z3phshy5yk5f3yakuxkgv7gyp2hwgl3kl223wzhv40ukmpajyass46zrgtfxr8sr3gax24d3edekg3sf52vklktkgkx3wgctvu6l9xzr098zc5gvsf50xqw8dp3y96rx5nkswt6uw7glxpyyj9hzxkqhylnry7h79hlrualwsr6qh0nx8mc5q2mmv8sc3nx9ggnek8jc0x9qaq426ssf9y35qr6jf4fk40xex45hvx72zpr3g92j2yczrd4qnwvf9flp9ekg0nsp7ru5z7c0fzqz2uwsvjlly6zmqaq5awgt9lclp0rply9jy9tcgfsqchncxuarqfc4zzf3jrpg9dvxgvhyqsl034lv732d0rc44032w7gt3c8kpnypaj6f2gpf5qzyrjy9d26h326gzv8gy6glqrrhunfxk54gjw6ktrhy4fp8ez3jz8wv89z798dz6q2upgkuyf3hgpf42wgs427ufmvetpqc9v6p032yllpcnrrkxc5qrfj9spttawd5hf4gxg2xk67hwcy6g3u5rlqslth3yu8x25ah966nq7v339ytf33avuuxaer6yrhfdpft42cj5a8apcrw0z5ksgmn0qcgeq3p3wmqecnucswe7rga66rde9ax7wtldwzqa85m3mqj8vwspehqfdy8gn4nke4knf2zr9cjpx37jawu2p5gzzejqe26mgzjh90nv9mf2h3x6g8h6tzumyktdscdu5azuzmf9mvxv2n9aky + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGQvYkp2Rnc1 + Mk8yZDZTcDRxaUxxTlZUTlNEMzgwQk41dXUvOGM5bEI4V0RpOTY0YTBJOTk3K1lT + SnY0bVVOSm5Za3h4eFhFYkU0N0RwWjg2MjJvK05VdWpkZG5KSnhOMkR4MmI4VUJM + N1RWNldTUTYyWTBwclhvdWxGRWhQYXUyNGorZWdkVkJkWDFPOUR2cTA2c0c3NTF2 + NGFnb0QrSWQrMlVCNmQ5QmVPSTNkQmVOcUtIZk9ubmUxOHR3a245L2dhdmp1bjg0 + TGlVV2RIdlRSelNLcVcvS2V6eWRlWll6QlJZUmkwdDI3S3d0bVJkcTUvY0h1OFhu + RjY3bUtVS3VnbGd0MXNWdit5Z3lSS3BkNFkxRVZuMy9HQkhBVFQxQVo5bjVOb0Ro + cFZ2eFJsY0tJcFM2YWc0Uys4c3VPMGZzU0ZMQkMrREZuZ20xK2REZDFBbWVWckFt + T3pHMzNPL2hsTS94Z1krM0tmbkI5ZS90R2ZMcTZTTklRdGplQ1llNkpvMVk3WjQr + RWl4NkhoZmNnQ1VmU1liK29wNy9yMjJXb2RPUXVTRlhwV1hCVmNkRk1IMXFnbDZX + aHhMUlJpSEplNEdER3dGWnBPTzN3OHh2YWxpU0Z1MnF2eVh0aWtWMlJ4bENmK2p2 + c2lTakpNeFJBSEJ5dHBKM05qR2hqNHZCWWpWWkVBN0w0RWNmNFZlNExhelU3OTlD + bUZDRUlibHBiaGk4eFhlRGpxYW1GbllTMWlUY2o5MU44R203WUxzUGJzL2FaT08x + bjl3M3ExNlM5N0EyQk5TdDdjc2RtL3JPYXd6QzN3c3NHUWZhcUNycGRNSFg2VFhU + dXdQSU84T0hTNmJEQXRicFJxWUtxUTJCU2lsNHdHTVZaeWNEb0gyb1l4REU4YWRY + VUZDWjVEUk5uSjRRVnloWkpJYnpqbHdaWHplZ2xFSHgxRE10Zk5md2R4dm5VVzcy + dTJ5UmpVRHQ2SkFIWnpGcEw1N1p2MUJmeCttMWViQUJROGxWdWtpTkd1bW5lQ3FF + cWdkamhjdlk2M2hKQ1Q4ckdtTys1TTlLc0R3b0QydjYycDZuOUhEWHViTlhCRDJt + NkRWZFJsNVBUY2dxV0xUcUR2RlhKY2o3Y3NqMTAzb2tvdTJlTnpmYXF6bDI3a1k1 + MU9uckFzYWtLa05PcHlxVFNYL0pqem81RkN0Q3dPT3MrOHZSR0xkVDA5UDFSUUV3 + ZVRkNVpzQmtib20zWGxSQjBXWklvbHV4ckhtQzlFeWtycXMzRTg2T0htNENuSG9l + VVAxcmxrZ1ZuMzBhMUhsYnU4YXhmd3FGK0pLOFdwNWJzRDFadUNZeVY0amc5dCt5 + eHNoa2I5dlBuWlAyRmFiMWRicnZXeFU5ZkF6TnVoT1lLc0tySFRWeTFiYytxR3lF + WUpSVzcyVTdJV0FhWGVmb0hPNS8wQi9XU0hxQ1pENHo4MXR1K3JuTVd6TldnSEIx + Nk1tbUtEMEU4c3FkQ1dZV3dCbjlLa0lrelAydjVqTWhTSFMwTkNWOTNpd3FnaWpr + ZjJSTElMODAwcFM3QWNXeHhseW5QZk5UcWY5ZmxveVZCalZtaEpvTXBrV2d1MGx4 + Ky92bEp4WnlTWi9nMGk0S2hjTmtmSXlkRGU1OFIxNGYwMnowRDRSaHY3dzNWN2lX + K0VBM3ByamhQV2Q4d1V1K1c2VXArY3FsTXliZEVpc2RRT3JxQ0tMUHZpYnFJUXBm + cDFXVFhVblNjaEhiNnkyOE9pRm5rSUNLRHRZOVA4czlFci9WOTFsbFVMbW1GbklY + blU5Nk9taXhxMURNWDMrUWR4UWVsQkdaWStnTGl2ZWNlREFHbEZBc2loYUd0c00z + cENHd09haVZidTQrNFpTdlpzTjBHRzRFbzdaUzBzNERyRnJLTDBwSERKNFgrTmFH + NG5vMERzTzFzMUVTaFFUcHJEOWM4bVNiNldsVHVOd04zZUNBbFFtM3hVMURKdwpr + MG54OFVWR2ZsaU9lL3JISkswUW12eXdsK05ONjV1RU1VYnpzOGpwd3l3Ci0tLSBh + NUwyWHN2alB5NWIyWGRQczBOak5QcEpCSmRYaHc0N0w5eEhrNFlQaWpNCoVdrGew + 8jBtrBpi6ANZpQ3qSZnJQpWO7w6CJjWlcagLIQWWghuWUZXHtXWjDBx+sulnhPAT + T8AwJV5RPJteQY8= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IHFRVlpCcjhl + WU10SnBPZWZ6K01KcTZIdjl3TGpkaVcxVUpWV3l6U1pVYVpDWXFQTVJNZnNkREZS + Qy9LSDY1RUlNcGVYSnUyZkZVNll3K3E0UUM2SnNOR1M2ckZhQy82czJvOWZoQWlS + S2I1Y1ZUSlJsNzNqZERsamltd3RndWMyZ0gxSXhJRHcyUkdPdzZmTWIrcGxteDB4 + RThhRlJoSm5zUEJKVytwa1pneHZoT3FwajU0Qy9kYmh1NzY5a2lIdTJPV1pTcnp0 + M1JjakdEYXhyZGE5UkNZU2MxU0doQW9DU3hYd25NM2U3RHRLRE00Nk9uU3ZQc1o5 + ZklXVlBEM01UdDdWMXVINXEwL2VtSUtKOHZMWmdGcGdGb09vaGlxZk05Zk9wMitr + eVZTMnlmYzh2ZzduT1dNMmtqeHpmd0VSL3phRm5uOHVBZjVUNzlhVGtjYnIxaktW + ZWh2SkVOVmNZNUZiY0NuRXJQSTliYXp6VEc3V29HMUpKV2JGUCt5dXVIZFJDYXkr + aGhTT3RlTjg1YW95RG1wdDFHTk41OFBJQlRsdy9hVEVkVGRhVU1HZGxBTzlPbG1M + Q0FaWDhONDhVWkN0RkpwbThOQzNHWnNlejdrSUsyQzRYeE11eGN6WXR2bmxqMzNM + YlYySkxBL0FEQTM0dTlSRXRiQk1ROWY1OGZqWW96aVFnVW5uL2dDTW5VcW90bGJu + aFJ5ck43VE9pQUVvY3JhRytGaXpIZEpCMUovRXV5ZlB3ODdpV2RDYWVhdGMvQmdI + NUhjOVVSaEtUZjlzak1sUm15OGhCNEI4WFFyL3dXR241c1F4Z3ZNUkFjeU54K0ZU + NkFTUlQ4Uk1zcnRreWlrOUtZMG85UXFQaE5xdnR6NkhEaTJaNDdEdFV0WTNLSk4z + S0N4Z2pPR2tyK0NBQkRVV1NtRTMzVW5lVXQraWJTVmpEU2VndC9uM1BqeWV4SXJ0 + ZkwwUzEySW03d2lhUEhHWnlIV2VvL3NrOTArVDI2MVR1N3hQNmdGdmVKNFplR2FW + bWN4bFFtU3NzOFcvVFBQM2VIajM1RlBXMlZFVVpHeXFHNmJDdm5WUVUrTmxIblBw + WWNlZEtNbGtOOXZHaWNUTk9sUWt6SG4yZU4yT0M4QXJFMmJGenVjRERMWXBKWjJz + YWtaN284QmFyczI4QlVFQ3VYZXZOQUd1Sk9SRXFneGNIMGd2SU1oMjBtd0d3aEgv + Q2VLbXhMSExXV2M2aU82SXJxdGFDb3Fha25sOVhhNWNOcEduMVlLNW03Wm5IcmlP + SWI4WXFwTjVYaTZYZjVhQnljOWk5cE5GTFFLdmFuc2h6TDkremoxZ2F1STY0WVpj + cXdHSUlXOGRWbkZQY0hCcU44aVRSaXFsQ2VsSmIwZnVtbmo0b3FCSVRVazY4cnVN + NXRQSmUxUlhWV2xKc2ppbEJtVEtkYU96WnNCM0FDUll2VUpmejNNZWxCOUt1eWxT + OWNlQXg3aWpuMkpkampZYXNDeXE2M01SdzFJMjVoOEdHS3hLSXZJWVZWTDJETlox + aUk0N1JidlJkcVY2Zk1QYWgzdEI4QTB0ZnRib0NRRkx6Q2Q4MzMvOGFZQ1dvOXhh + dTBvN2RKNjFvL1IzTUNWZjRLSnY5TWVETXVCQUdSNWRSeURKSExqcCtoUHZaRkRk + VWdad3Q0N0d1YWdhdG1VRXI5eTVtMWowWkZjTVA5UkZPclV1NUxGdkliTjE5WU4x + ekxsRUpaOFVqOHRuZFVzQnVPV2o4d1BpeWM4dHJ0UGJRSU1UQUdVaUh2TCswdFlW + Njltc1hXOFR3SmFWQWxjeGk2Y1QzK2QzanhXN01rMm4wb25OMGVnL1BveS9xVHZw + TjE3Mm8zVmZDK1FKVi9JTjNDZlRocm5LbStXZ0lmRHVIVWJsTnAwK01rVmRQc09u + Vy9TUEJlZDJhejJSRG9wNmppdnBqOWcxMjlsTGU0K0U0QnI3YzRNU3FxaUZQQQpK + dzlpN1VXdjdaWHNSNExlUmNFb2JSYVR5clBGaUhkNElNenlTOEExbVE4Ci0tLSBV + NWFMbDV1cUo3L3VYay9VTmt3NGRJc1RyUXZCbkd3YnNjSEtpeTY4MXIwCoEWfbH2 + ReZnNIHoCaDD5aDLSlhWujIj9Ba1IQvBSApQNc14nluM6Tkz5k4xqkLFK+rZGmkT + r3Y35STwhNry02g= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa + lastmodified: "2026-07-29T20:24:41Z" + mac: ENC[AES256_GCM,data:U8Glg/9RWTmmb595u8BY9inni7NNdn1TXGAO7i7B+y8G9miFEclOyJ+gLNHoWPJQ7k//AXRIu0L8krlH68Ba8xhmCGP2JVP2DnQtVmYeuQaV7T5IY0YNlRjvL4sjxGFr8e176TES2hF6v9i0ee1QSFIpjKIsV2Y383XB3MANYrU=,iv:ulEPR39LRcs8M1ec4V+zmcWIpq/iiD34ssdMN2sJYNs=,tag:OFyV+i70E+02zCZXg/Z2/w==,type:str] + pgp: + - created_at: "2026-07-27T21:01:04Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + hQIMA9/PFHehMxwxAQ//T26Y9AmryFz0ENPpudzv31q27lMViqb0NjuCzu13rnXj + P3aWvmkiZm9fQegDya2ApYNHTIYjUhAuiAuf1u7AmI9pXlN4OPtixnjDhJBvzX95 + MELJP843cVGYNtPUNBbb8K+17QGL7MFnFrTkFQ1fmKehFDfCmWAKSfhpENwCVxH1 + dP8SvYOa6qyDKbpJH/PnEEKKxVoS0gL9TuFY+8F9NbZQVmkfVvXgJ5fqhZC4AIwG + T+PTP67jRiPp/8SDn8/qeQRa7HTQ85VYN8B41J2QotgkU2GirjiSkkPhy+sl4PAS + GH62R4kKvW0BN0phVQLiVP+nEPjxzzs11KsXGp6XFvrkOkyie+cKgfgl2Dp/Dehh + YpZ0JJAiUSQL1IYtZO5+GpaNiSe+0qUPHSxJg5k4RqJZdhtBJ9p71pzqx4My1dIv + NKfkL+WkAtFY6L3+hjZfnLB4uEN1R//zg22S3OUoJd2sIVAL6M9o1GaztNoSfOIY + ecigzk9bmlMbk7x01XJFn/AbbHyuMsCiHzrw/XUR9Rtyv6KYaJ0QQnBnunoNozfo + 4YsiZrKdetyIYCcruMda5CGaFhESTYkWmu2FI5rhN85RdrlP+wkL8cjfBuITrf5o + MiqhrIxvxo3WCQWwOoufbf6ASqhV1YJC/+/+xqius/OuYAQs2Ejh/7N67do4pE/S + XgHVXOih9egz7kAsEmSQXZ7IbYenMlelaH/J/bzD6jupeyI/63OwExJbB4va8Uxd + wFnpg4OuucRx6Fhw6diGGTkSRvoLcAUgdW0o/hWXEkUkQC3ZpO8AmTSrwiYJtHk= + =5gSo + -----END PGP MESSAGE----- + fp: "0x416CF1EF9AAF90BC" + unencrypted_suffix: _unencrypted + version: 3.13.2 diff --git a/secrets/network/private.yaml b/secrets/network/private.yaml new file mode 100644 index 0000000..5c80445 --- /dev/null +++ b/secrets/network/private.yaml @@ -0,0 +1,148 @@ +private_networks: ENC[AES256_GCM,data:OsMQDZ1V92V5g2qm9l0ykoDyFkL08jE9lkBZ9UQueL2nO6pz0CwrybwR9fkkEsRSqlzjDPlfg0AtahP1YVfM8kEDrqaH8WyQJPpO8RTprlJoILtRAr6f2tLmAzlGHN+aDqTSIc/CG10HKg==,iv:V0jgZjm4KrF1UpMEEgOkuj0w1tJgxa35OTKUcFq5RRo=,tag:Pwx7sdGIqujrZhnb0T1sdw==,type:str] +sops: + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IHdPSExqaEc2 + OVByL284OC9xMEF5T1QxYUxpdHlaNm00ZmRaTERjallOWUdXejlqNXRvVnlicWIr + Y0kwRG9ZeWxYVXh2Z1orbDB0T1FuMUtwR0UveGdzSUVoZ01yZkFSQVhITy9BcGVy + angyK2JJcWYwbzd2Z29TV2xmTG5Kb1BtTS9sTHdGMFhyUThvVWxENHFxb1Z1RlJw + QSsxSzAxSEZ5djVUM2l2Njk4NWoybDdkbVpxejhBSndSUExoN2hVSkNCSjMza3lB + ZTdGZzgvTEFkMGFRVTY4aWdSNnlzR05aajFIZ3YwNWR5MHVTMmZYOVFXS1FMVWVN + OTQwQ1NtTmdZazIwcm1NbnRPaUE4ZE9kbEZFY20va0I1WFFKTEF5YzFrK2FZUGZR + RGtKNUU2Qm9oVFhKRlVUSUNqZ2lQYlh0TmZCWllFWE5MNmhtSnNOaWRxOHhvamIz + enpubU43clJSS2EwTmJkdUEzSCtNZnBRakpSOEIydTVQbVc0VnpqbEFDVG9rdTVw + NjlCSVFUU0kvZVMrZTBHWTRFQ2NzWi9lU2lNUE0xbEJQVnFrUnFSdW9nbTNVbnRV + eGNzRHhxWW1wVzVIZWptVWUyVVhOMS9vZVNxM3FuWUlOa2Z4S2NTbU9HaHVLSXJT + OVdwVGU0M0IvUFpvbGFla0kzM2dtazJ5ZXJXVnVaYm1mRWtpcFFtSkVTQ3pVcUMw + Um9IRm02YUdmMGkvbUk2akcvVTFRbFNSVHVJZGJGalBQd2N6Wlg4S2VQV0RVNFJK + L2xHbEJuUisyWGdJTzh3azBLNnlyTUJvTnBZRWxheG84aCsyQzNyb1B6UDNab0ZB + RUU0ZEZlVTNGMjNWblh1Q0NhbG1aK0JWM0I1clVqQVhNaXI1cXZNdmxTR0ZZN0NK + Y0l4YmNxbnV0VDVJTHp6SUNDTThnRndjTFJmc2Fmd1lCZHVNaTBmZkowWmxCYUxu + N2thYS9CL01taGVrTmNGdzBaMVFkNXJ0dzdac21Fa2VDTTN1YmVLdFRPUjF0akVn + UXI1L0dNMVU3QjQxMlNiK1lrOUhXYjY4cXdUZDd0SVZ2VkxOUmJGVThTN0tlazhY + LzQwekM3NG16Um1uZytuVE5ONmg1aEkwdHc3dXBIY3hNMmVhaDFyU3k5a1dKM0ww + eENxUXZQZEQxSUR1ZjdKT3dtK2xaemtxcGxqR253M3dCbUNabEpoUlFVbFhZY1Mr + bG1CbVg0YVpSMmJaUFZoT1UvblVjdjhuaGsxZ3VvaXJ4WXBsQzU5T2pBd3BJbUkv + bjBubUNud2lodCttbkxxejh4Sm51QkUxYUVheEhXTkhxY2tod1BybkQyZ0I0TE5F + ZXYyZ25LSDlpMXNQbGdTTjQrUXlVUkoreHF0TkJFVTU4dXMxajdqRUVaV1FIWmZt + UEVZRUUzMmRrUnNkcnNGaXNvRWFTcjNjRmRJSnVzR1lOQWRJRmpHWE8zbTB2UXFU + cUp4SmJZYW53RmdOQk1Fb1Y4Rzg1MzBoOFJHQ1FxS29qM2pMN3F0SDM1dkVIUEN6 + K1cxR0QvdmFWa0Zzc1pUQll4VUhRMVBvdVVQTk81a1J6YkZOWkEzS1RieCtvYTl1 + UGp0YU5oMFZZZXVYMFVUbVZIMFdoZGdxZzk4Q3c4aGNzTkJNeVY4Z3duaDFmZUhU + K3BOemN4Zmx5UzRMRWpJblUrRHgxK3lSNzZxSFJ2ZzJSenR4SmxiLzdGc1VEVE9k + NytMWnpVRFFzMFBZbnh0Szl3MlBQalE2M05Kb1VEa0NJVXdvYVZtcEc1M0gvUFhC + WW5VaFowNEFrdXR5N3BXclFycGVJMHFldFF3aGJPeGc4cmlZcm5DeDljaHZBSkVx + Ui82N0NJZWZ3QkIwdFhmeC9Ta3d4T2REZk0wb3g1NngzSXBSWDdsTGlRVUVMekhw + dWsyc2JkTUxoQjNSdTRBdDAwaXROZlJ4THJoTk81Tm9lMjBGZGxvRHc0WWlDUQp4 + ZFc5alE1ODR2cEZ2Wmd4S2RPekphUURkeTBhZ1BwcVdVNkNneXpZRFVRCi0tLSBa + Yk43YmJ4a2N3WC90UjJxalNmU2txMnZ2dThEb1BlVFRrVTdkSThOQytBCiJzqlsd + tz6knOuOFhe8CDg/ks0qJ+hndpxfFiuS8zF5Qxo/wr1WquS3C2Bf1hwyTdn6ln7T + 84NyjLuQmau+Z9k= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq10dd9wceuvcn50w9nqec5fws670qz7eqhfw7teyptqfp02c6k05pjhrp6kgtfwyx4rv6gry4uwpanqvknsvn2x26zf8p9d2ccelq24uncr0hqev9yjm8wdeypgfspdn9vt0ulvx6jcsy293j2y7chsmse3wfd8qeg99fwnup9psuqewrzpwfdv0kcfjlu2skxx8nxcykxwaz2dny825e3wxphmn5c0vtxp4tjetzw8f98sxgfmv720sk94ezpg5fzw2a5k2eszvnpjqrcpw2ck5zxwuyprd598gaqezkj5jy0ry7eqx4su5rtxdemkphhwjppe0fsp3t7p3vezf3pzuhq3n3etxkcggsy62u94ufeclrchdswkl6gwp5ce65aevnu04aqxrsm0deuf8pgfaqxk3ys43ex2wz625a06s7kfcc8tagp8zk6c9cpqu7jg7sxtjf6faq4e8extucyxjjq42a92ancn8ae5gdgr2ea4wuqg2eurs662ufux35nhkutjqm7kxlglafwu92vefqn8lvn9gwm6jvcvtpvs6nngj7zf43fd0k3pqs8dzvvf0fc7ea3v3ct5q6zt0ptdkdpjnv2t9jcnh2vhxv3t9uk6rzjw5zqtraxp52w3345edj0fzugwdfqcd8jge75yufv6u47wz22qhqzucch2wkgj8lk266ep7e6mwvfv6efcgf4jy35kpmhm6fzwcdsxxlup5q2zxzdpg67xjslp9f6t96khpxepp50jgss4d2edermg68xkff8wahg72ayaats9dz5rukqphkahguf5hyq0dwtz6s90jlh0l3ajql7pfy64zkz6ftuu6u2578wnpmpkwta0es47d3sve9neqa89w708j4afc2raxdf2gaucl70jn7e039axgmzk069ha4p923rf3lwugys0v56tgfu79x5pcuw2zespxely7tyyhg9z4upquxynwpzcj7atq57yazfu74tv6cun0c265am8zahls5x6y5t4f4zpdgmggtst5cefyatmqehted0gw5sawprpdf6gg9nf4c84xmk575auu0mn35j2rgy8wdkhykkrdxtjah88gr2cmrr9ra8edw9fs6v3pzkh49rtk24qhh2505c4d2zrw8ashyedtapnmeyndpy8f8szlz5tc7w0jyxm69s9ysaq5cgkfst4ude8z3phshy5yk5f3yakuxkgv7gyp2hwgl3kl223wzhv40ukmpajyass46zrgtfxr8sr3gax24d3edekg3sf52vklktkgkx3wgctvu6l9xzr098zc5gvsf50xqw8dp3y96rx5nkswt6uw7glxpyyj9hzxkqhylnry7h79hlrualwsr6qh0nx8mc5q2mmv8sc3nx9ggnek8jc0x9qaq426ssf9y35qr6jf4fk40xex45hvx72zpr3g92j2yczrd4qnwvf9flp9ekg0nsp7ru5z7c0fzqz2uwsvjlly6zmqaq5awgt9lclp0rply9jy9tcgfsqchncxuarqfc4zzf3jrpg9dvxgvhyqsl034lv732d0rc44032w7gt3c8kpnypaj6f2gpf5qzyrjy9d26h326gzv8gy6glqrrhunfxk54gjw6ktrhy4fp8ez3jz8wv89z798dz6q2upgkuyf3hgpf42wgs427ufmvetpqc9v6p032yllpcnrrkxc5qrfj9spttawd5hf4gxg2xk67hwcy6g3u5rlqslth3yu8x25ah966nq7v339ytf33avuuxaer6yrhfdpft42cj5a8apcrw0z5ksgmn0qcgeq3p3wmqecnucswe7rga66rde9ax7wtldwzqa85m3mqj8vwspehqfdy8gn4nke4knf2zr9cjpx37jawu2p5gzzejqe26mgzjh90nv9mf2h3x6g8h6tzumyktdscdu5azuzmf9mvxv2n9aky + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IDQ5Ryt5YytW + WDA0UkZsQ3hWMHFaSE9ZalFmSlFUcFNjV2luWW5LQTRaY0hRWmRCYWc2aElPSWVH + ZFByR1RoMktjbFFhK0JOeEppdUFWUW1oOWhHcndnTld1ejNTNXVhK2l0aWtXcnI0 + cnlvNWg3aVYramkzaHdTTmxGMDdQYW9vSE1uYzZTOGRpd0M0MVpvdW1VYWtCMjNy + MDNqWVpmbnVvRjRDVndHTFNGVjVUcUNkOExnenlndXM3blhhbXRwbzVhZXVoTjNM + N0RyZmJHM1VMbzJubFZ1dFVKRGd3YVcxVHc1ZkF6bW9lZ24xWlQ3SENJMmNGWEZC + RzNPRThXbmtndXhEQ2tkdVYxU1JUVHpKRkVmSTBVaENTT0NlbE1ZL2M2QmpqbUpV + SzArcFN2TUdjdVFESVJBZzRJbTA4ZXpUUm5jYVgxZzY1a1pmUHR6NkJobVRUelNO + WUtaUFRLN2l0ZzhBNmtEbUNjdkE1OUhnaldEYlFtbHlrdkJKNldVMjdxbnVva21j + V09hSHM1ZXlOV0V3ZzlpZWk1L01sdjIrZHNMbnROTHVFT0RYV0dxWDh6bHcwWTcr + OFFFekFsdFh4SFFwUGNicjVJZGJLYlZSaGZGeStNMlRqZThpdW5KNElsTExvSlkz + aThnT0ZOZklWQmZXdjI0am44R2ViRTNNeDg1bWVuY1VCU1cxK3ZEYTcrNFVVNjBL + cUp4OVRhWjdNb0pPZzJySWw3ZDlMSS9OY0lYdkt2Nis4VXRMYUNpVmVRYnViQTc3 + Y1FTQnpmbGFaTU5YOUdZZW52dUhFWkNhQitwNk1ZOC9JQXdkUjlTWjVjbCthSW94 + MGR6ekZ4R05BMlJxK1psN04rdHJtWUtFcVEwNEJJOFFCUGlCSmtMUlVXUE9sVGk0 + YUpST1hPYzU3RUlZblk3eHBaeG5pU3F3Q21BY21nSEE4cEpCQnl0cXkwTFhaR0RS + WHBJSjNtYnNGR2wyZG90TElZenJWMVJwVGhBYUg1V0pvdTBBbithYW1EWGg4N2d2 + SUlQbGJueE0zSVBNWVJrVU1CcHd5YmpTZnkxYWw2dmxFVWRQOVhMYUhNdDcvem5r + TFhYTkI2aTJiaDRUN1lFeVNjbVB3OUQ5S3JCYWZWQUN6M0pjVU1FU0dQVExkdDRQ + YloydTAvK29sempxMXk0Z21ZY3dmeERqdi9VSzJXa2M3TEI1TVJzUldoQUx4bDJJ + OE1RaVZsWkt3NmFyY1lQV05xbWRmVVMzclQzUktIVkhveC9EZFA5dENRTXV1dWFq + TmVsU2EzNFJmdkpWV25MejFkMWJJbEZBQjVnMEh6V0I5OHJCWGw2aFU1aFpPT0Yy + U3d0QWlWZERudEs2UG5LM1ptM3QwTmhaSUw5eXN0dUV5SVBvNEFaVks4MDdNc0hX + Qi9FZS9BMGtkVFlvY0JHcGxselRidmFyZWNVcW95dzhtVm5TdlFyS20rTkN4MTdO + K1hqQ3FvaE11M0RmWXZmaWFpdWhNZHViWVF2ZkRNYU1XVXJDRTlBWDJwait3NVVZ + bGhQMmJ5OXlOOWJ6Y3h0a0Jac25UQ3R3SnhDOWMreEpDd3luc2pTUW1CZU15L0JV + MEdMdDRDRjRhdnpENnB4aFlpMmE5emsrb0NhVUg0REp3NGdzOGJVT2NwV01YWFZh + UGVBdnI1bGd4akovTDBkYlNBNG0xUW5nWW5rdXV5a3dYSmcyYjJhL0V0MUVaWWtP + R3BUeWdJQXJIdXNGM2wyUmw0MTQwR1ROeUVKcjhTV0h4VnN5Vk15cmhRV3N5RWNQ + NENuYjg0aHo5MjllREZuaDE2dVp3UGtaTFMwelpxbmgyQXNQWGlBQlRycmRVeTIx + QWRlQm1JMDl3Kytsbi9Hb1N3diswd0ZRMTRlUUgzNUh3RC9lMDhISTB6NzBwSEIv + RW90c1JTQ3hUVENRZkJCb24xWUZRZUg1aklNdnpzK1ZJYXdmMUZaWHNSNk5Xdwp1 + V2p1S2NPdnFQUVZDS05TK2E0QnVjWlByKyt1dWNwOHNEY3lieVRVK2YwCi0tLSA1 + OWJaaHJaTWg3NlhBZmJUR0kzVkNiSTEyK0RXL21zd3JXcmNuZHRCUEtNCgNTqeH9 + +AB+XvVDEaS39gmwkPlfWxDF3Od69RUDt9QdPdojFPrPiS8t0BDuISTJSwR+em8P + lH3wXzZoJhY9vVk= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IFlNMGlvaVBt + REJWVk1OcWRDWTlGWDE4N05peW50ZWE0c1JzRnhLVjQ4Z24rTWR3bm1IakVmdC9l + NVlMVVJKdXpkYW96NUMvNEZRQURpYUJHbTVFbWhQUFNtTzFFdXFjRStQT1BPNDRD + aXhzTklXUllKdFNteDZyZFlnUWthcE96SjlXWVJLYzIzdlFTbEQybXlhWThqUXpU + TGxDbkRjanhDOS9EMEhBcElxQTRJdWR5RG1yUU1oaC9mSU5nSUV3djY4UTdXTjJG + ejJjVHJyUTczNSt6UGc1NXoxL0FLUkMvN1lKcVJBODJEdmR0QVJwanE5cG4xZEVz + Qm52eXAweElnUHkwR3orYktYNFdnczJWUjNGaWV6RGQxdk93WFVnRTdKWHVjTGpR + R3UvT05IdlpqN3Y3WFluTyt2VTNOYkZjQnZ2TTBQY3hnL05VdzF6NkJJbXp3YTl1 + S2dabGFMb0lTdzl0UTdnck92QmdYS0VYb0trN0poRHhsWEVpZlpFM0lNVVp6T2xZ + eWNrNFQ1WVRSZ2lTQUFwbk0rUUFtMlJjOWNMVTBqMmY1YXM2c2Y5eTE0a1BuTFRX + L0U5TjN5UGVpTWFubDludk1Fb3E3eE85aTNOUU5KMVcyWGsxeFJCaXBIWkZJbjEr + ZldhNGd2cnBkN1RHZDJvcVUwSytGOFBnKzZjMWZXakRsR05PSDdwZWdEMGNYdXNT + NzduSXV5UnFIWVVHS0pGdzBFNm40ZFZzcHhVNHRSWGp1L29FSm52RFZISnN4U3VW + RkhkVmNTZ1lNM0RRRU5BVUc3eXRZcWFQTGg3b1d5ZkhrVHJjOUVTUFdGN0xGS1Zs + d3ZyamRnYlFDWnFrTnhzTzFDRkRPY3IzOFJzZzd5UkpZR3RBS050REhldE1zN2l6 + MzBvLzdOUzhrWXgzdS9EUnpXTWo0M3dpanJjNkdUTUFteWpucUdnQ2VhTmhTN3BT + alhmcWtvTnlvZEFBU21LQTNZZDJCbnRqNkdRSGZXS1h1NHIxcmZEYndaQWRGa0NH + Z3FOZW9rUTI2MGNBbFRlekpBTUExM1JNSmhjNkZHdkJXSTdkYW93cXBVQm5xbUxC + RmZLU3ZyY0l1MWtzMTd6UGhyK1BFV0lTaFptS1o0T3p0YW9rY3AyNjFSamloME50 + Njk5a2N6ellxZDVCbXJ3Ymt3dElrS0lFS3dDZkt2RFpmRWFSQkEyQUtlTlJVMHdt + QzZkUjRveWZsMWlKa3I0akZ1WGJoSHRhc1ZPWWJ0ODgwa0hCUmx3aXZUUU1YbmhR + S3FpaDVlNTUwUDhhdEJoczJxQjNHa2dXcWljQUwwdnBkR0pmVG14RUwxU3gxT21a + Vnlsc1FINVNVdStJODA0UEZ1bzlieU9aQnhBczUwQ3J5UDZWT0xIRmRoaDVuVjRh + NTZoeTFtQnpsZm1aaCtNR0dIbzQwVC9LaXp6VGlmTXR2RjYrby80b3hhYjZ2MXgr + R2oyRzA5aTZBSnlRRTNuOFczckovQjdCRjRqU1NFenVta0hSbTZ4Q1YwdW1QS3dq + Y1B4UVVWcjFnZXozMGl4UXAzdWhvL3RDZEI2OWUvZ3RkNnd3ZTF5QkRmUllpc2Nx + WHlYWXZSTTRzRDZIZEJzYWhJZDBtaThUbzY1VUx4UFFURG9Ccm44aU5PaERReFRY + eGI3cXZFeUdOYzhiOXNLMVFhWU1vV1B0TUtZaDZoMlhRS01HSHFMZFBrd3ZmOGRO + aHFiSWoyWXkwT2syZDRCZEd4M1lNTUJRSUNxcXRtbzU5WFRVS3I0RDZ1WjhZNUxR + OEhybU5JNG1DbDFXMXhGYXYxL3VHbXdERG5yczZ0MlZBOUc3dzNOTWRNYkJWV3ky + cFZwdkpIYWx6STFOSmVCbElRZDlyZUtEejJ5cmVYRUhmeU53NkFwRW53NEZZR05P + QjBYbUE0QVBKTXR2VDZvQmFyRHNLZUQrODVyaHlmZUx6VkNkc3R0QVpwc09Vdwo4 + emoyeVAyZTR4SERPVVY5b0o1anM1VWVwaERoYkVJMDlONjJTcTZvS1ZFCi0tLSBF + RGFsWkZCcVBFeU5pemtqL1JlTkk5aGJQQkt4UXROWVRDNzdUU0Q2ZFlnCjRenXFF + 9TJ09wGA0itDALc/RqQ/OKMi/JB637LPIupVJ/2y0QLg8WIKiZPQWXifQfrjoPOJ + wIIZ7MYMkmfAlTE= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa + lastmodified: "2026-08-01T16:26:01Z" + mac: ENC[AES256_GCM,data:Tm7egPDqjEG0Sre8h7U88O+4T8UT1y+QXPGtpUACkanVgwcn0KwWPZyXFINZBmlkYh9262x8+WgSwu4XuC7vPcM+36Q4ouJma8/SZKt1EuLrYxGBUdZKuc0P8687nmvKccnVcN9GD29aTa8MxwSOrQx7j3TpqGpT/c8JxQp2n48=,iv:zVo540/GpTpntjn/S21vRVhXIRmZ2jru02IAzw327zQ=,tag:+c2BqM4RwfYERsJiYeCs7w==,type:str] + pgp: + - created_at: "2026-08-01T09:05:12Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + hQIMA9/PFHehMxwxAQ/9F+sgo+TZb10Lz98FICxYHt6K766bgccpnF2dKr0M7fWV + z7x0Q2aQRRf97nJiXvlXxBgxYLWUy0qQd7r7/otTvnjuSg05H0RrIY+j0uLNJWv8 + mIku2cpGEXbgSdNFtNvBd41J6aLhTJXaV0dW1YV59UX8nCaVuNS5bU6jrKqMJ7uH + 70TikpVzZtuduz+LlhDqg0MknD/Rsc5RnHdRu+QM/AEL8o3J7rQCM/bJReDRxHx9 + k7c7SZsQzflpi/qsQmJG4HyeTxcBBK2IOWNf8CKsjf5DPOzbDdzbC7tV5SLKBM82 + +y8GpLcoMGj3FTpaj2rhT63ECrpXVYS3AWH01YwaqFKJE0PrZXLopqxfD9Zf4K1q + RE4l0H6ukUXFsT1xu0aolL3K5agONtAfviKc+oQZog6TJ5Mi2HiSf6rqM0dy7KTD + Y6zHwWL78E/DPbD2HNPEX3cRtPRZH0QuZoPJsgxoaLCTV1+U5IqiYgW0ijC5u0LI + ZoMQ9/vzXwWud2Hj7LM+tDpSd+mUB24mGc8QXr1tZ2GUMnk8WkNdReOXXVWJq6fW + jXFFIdeuaeZcesHrLBf8OyEqwVM3yICbN9OnBhZOiwtlPOrs45boznCIPadeYmxn + qcTX4pDeq6E9NYK+M2NQpdLtT8eoUySsEB7Yql6CPLCYs4kLwqZUi2VWEPJnf6LS + XgFaiyi8AljK5xeFMpIPUVNA7Pkzg58fzGXFEmGsGAMN2+G5r8H5sqeBStu9Luj5 + vll/0aYHetRBR4Z/V0PQy8V07JmkTpPjiyD45J2hCJyRilhfxgjCQ2egerHFgPA= + =wmRX + -----END PGP MESSAGE----- + fp: "0x416CF1EF9AAF90BC" + unencrypted_suffix: _unencrypted + version: 3.13.3 diff --git a/secrets/users/rtucek.yaml b/secrets/users/rtucek.yaml new file mode 100644 index 0000000..d898b83 --- /dev/null +++ b/secrets/users/rtucek.yaml @@ -0,0 +1,152 @@ +#ENC[AES256_GCM,data:sBkNjW4ZPpmYDx3h0dQmhCphrkbNh9QwJt3G+czU2a+zOzDRllK1QxWs8Clv7WTm70yJ6Y/z0+54w7KYaqNOu8QFYqRrcF2zOdlWePU=,iv:dNGmOsAC2blrs9zj1byuV99sAsR8LRU/oJygCw+NVA8=,tag:t08DkXr3F+nRunZq4hCdhQ==,type:comment] +initial_hashed_password: ENC[AES256_GCM,data:TfTHh0ylGMpFEmPxkC3Fqj6UjeZjgdlRb/K6Cu/0OM5Px7rfivWTzv3EehP8Qtki82DveAx5ffbA2KJVfKJMVsxQw6oqgaxalQ==,iv:Pm+W9FyT+mMYAXwfY2xduLFqgzM+RCw0EfOW4RZ+3Y4=,tag:zxileTYtCPvng5xJq/bMnQ==,type:str] +age_key: ENC[AES256_GCM,data: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,iv:STuVuYAx3YBDFeknKYIEHAZVJZS6mak8pCVxJmhj2BA=,tag:sKjq2ILGpwRHYrUovhRNzQ==,type:str] +gpg_key: ENC[AES256_GCM,data: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,iv:HE15ts56IjfuQQt9h6+nNdli7GmWLtxiv0XLpYHBLVA=,tag:QxyqRZQhFBtQ2VxjCK06UA==,type:str] +sops: + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IFkzTXNQVDF5 + eVZaMjJhVWVGNkJpbkNOZFp1OXNXNFZSSkwrcGlHay9PdG93LzdLaUs2NmNaUDNy + SlVUS0JqWmh0SnpTYkJWVk1LdHU3ZE9mZEVYa2MyNnN5Vlg3clFpeHpsLzQ0Q0xP + Y3lJMzdYVG5QS0lvaldZeFRIcThrUmxMaTV1TkpManhzY05EZmlnWngyb2VsSlhQ + TU5rNnBWK08wVlYzcWE2UWZST0xDTVJiZmpBN1pPMVYwVHJWaFREbDBCVHpDbDNs + OUFYcENtaFF5WGFSWFVMUU5ub3FYYVBJdFE2clljZWVpYm1uOHV0MHVTbjRVT2FB + eWZ2NnB3Zm1YcE4yQWt3YTE0UW8yeUUwTE9MSEI1OVhOY2tSU0V5b2JPQmhIYUxK + WHh6cTB1NnRKYk45MExuN3R3amU5YWptZ2s2T1ZuWG1TMUUvdEZTVkJoczljcno2 + Slg5TXE4MkM4RTc1L3pXQlVsbmtKMWxQVXRPS1hFbVZVV0svcXlYMXhCMUZVMU5u + eSt4QWxQenozU2dBb2lMcGJCSlBFMElvam9uVDR3dzZ4NWdtWWErd21NMlVERkRV + WS9aK3RCbDZZYlg1bmt3bStDL3Zxbk5iVVBJZ3o3cHNoaU1ucGluUjc0UHUxUnFk + VTh2eEg1ZGgvV2hCVC9yQnN2UittWVJjWi9yazlmVHNDUFlNWnRoOE0zcjBkUHdz + WjV3cEx3TDdhRjlQbEIzS3V0K2pQSVdRa0NUc3R4OCs5WmlaNHhoNG9RREY5cHAy + QktFb3lFL3I5bG1YTmwwaW5CL0lLaHJhejYrb2xhWmQ1MjFDYUtNcDc4aXBjSnIw + SkZhbWN4UlBvRkV6Wk9GQTYvUm5HR0ZQdDNjVEJmTTJNeHZQQ0Q2eFFMV0txUW5p + Z25BblVjTzJuMGpvWnJiTytrYi9FVm9PK1JsdWpab1k2ZDIraHpsb3N6VXVoeTk2 + Nk5pMmtGYjZCd250RjJaUVVCa0pZTlJkVDhUZEV4QU9MVkw3N2dEQ3BFMDJyc0tu + ZGh1amhud090Y3JCbmN6Vjh6aHlWMUk0RHUyR3VZWUJJc0RkY2hnYUpuaDF0Wktt + SWdmYVM2Vi9WY0lMU0s1Q0gwUGgvZDl1eEJqZWxaMFExUkVadHBlbGFxdzgwU3Nm + bHkvKzAvMVpZcjQwRlBUZ0R1cWxuTTJUSUd5dStidTNRNXQ5ejlQYm5XY2UzQUVh + Yks5aVBsZ0dxWWFsK3JFRTY3TGdRcUhXb2JEemxua3lMRnpQYS9LZDVvQUlsV1h1 + ZndvT2xFeFUwZkhEVG9jSEJZZy9Gb2gxVDJIc2ZpdDBXNmZuWjN2blRrRi9maG85 + ZG9yc0VzSGdSR2U0MmRlb0d2U1lpOG9NZ2pzbEg5QWJYRHpwY2w1M0w0UGZtNEdJ + bDM2SU9tQ05PZ1JpMnBsOWsxYlV3YmZkc3grcGVvU0pORkNJU3g2dm5LV3ZXRVNZ + S2gzLzB0VzdDMVRrYmpqZjRwTHpFYTNnaDR6OU5tUDlIdDlDYVd4cysvMGtoSXhx + cHhheHk5b2paV2N4ZkxkUVJ6MXE0eTJNWlJLQzFFMFJpZW9wcGRvcVByZ0VZdUVK + c1FES3pPcHZZRHppbnZrZ21rbVBkb1FiWXk2UnI5cnJPNU1Dc0JvU0F4ZW5Ybjk3 + V3M1KzFTd2RndHVKYk1kQ3V0Tm9jbXcydkVNVjF6UVJlTmdycmxnQWdHWkluOFBX + RnRWcXhzdXN5QVkyQ3pIQkdVNGlwMWMrMXNiREFXNkJNQllrQUFlanFIUDh4Q1Y0 + ZlA0N2lMRy9yVjdBbnphVDR5OEppMkdWM2F1UE1PcVFLeE9aVUJiN0R0NDBNY25L + WnVvcEpNKyt4czRkUW9YWHYzTE5QQm9sS0ZmdWlkL3B4WlJFQ1JJcnVaYkpXZVJx + enlTTStpWjBtY0hyUXV6ZXRybmpWRlZBMWlpUU8wZDY4bGdMRXZIN3F3UkhJdwpl + QnQzU1NFRUFLaktNOXNHa0E3VjNiQ2s0S0E5Vy80am5ncG0rODhVUlpFCi0tLSBs + dWhweHRKL3ZSbnFkVFlRRjdNYi8wQTBNZy9vNjhUYzc0TUR3Qm5pWGtJCgrVmRFq + l7q96wfm5Hs05imwlYsOODk0OGxa4u9q8LPEGynvcwwLekNY8FZR2HP3kSZxM+K3 + fbGTG8j/kFYzmUo= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq10dd9wceuvcn50w9nqec5fws670qz7eqhfw7teyptqfp02c6k05pjhrp6kgtfwyx4rv6gry4uwpanqvknsvn2x26zf8p9d2ccelq24uncr0hqev9yjm8wdeypgfspdn9vt0ulvx6jcsy293j2y7chsmse3wfd8qeg99fwnup9psuqewrzpwfdv0kcfjlu2skxx8nxcykxwaz2dny825e3wxphmn5c0vtxp4tjetzw8f98sxgfmv720sk94ezpg5fzw2a5k2eszvnpjqrcpw2ck5zxwuyprd598gaqezkj5jy0ry7eqx4su5rtxdemkphhwjppe0fsp3t7p3vezf3pzuhq3n3etxkcggsy62u94ufeclrchdswkl6gwp5ce65aevnu04aqxrsm0deuf8pgfaqxk3ys43ex2wz625a06s7kfcc8tagp8zk6c9cpqu7jg7sxtjf6faq4e8extucyxjjq42a92ancn8ae5gdgr2ea4wuqg2eurs662ufux35nhkutjqm7kxlglafwu92vefqn8lvn9gwm6jvcvtpvs6nngj7zf43fd0k3pqs8dzvvf0fc7ea3v3ct5q6zt0ptdkdpjnv2t9jcnh2vhxv3t9uk6rzjw5zqtraxp52w3345edj0fzugwdfqcd8jge75yufv6u47wz22qhqzucch2wkgj8lk266ep7e6mwvfv6efcgf4jy35kpmhm6fzwcdsxxlup5q2zxzdpg67xjslp9f6t96khpxepp50jgss4d2edermg68xkff8wahg72ayaats9dz5rukqphkahguf5hyq0dwtz6s90jlh0l3ajql7pfy64zkz6ftuu6u2578wnpmpkwta0es47d3sve9neqa89w708j4afc2raxdf2gaucl70jn7e039axgmzk069ha4p923rf3lwugys0v56tgfu79x5pcuw2zespxely7tyyhg9z4upquxynwpzcj7atq57yazfu74tv6cun0c265am8zahls5x6y5t4f4zpdgmggtst5cefyatmqehted0gw5sawprpdf6gg9nf4c84xmk575auu0mn35j2rgy8wdkhykkrdxtjah88gr2cmrr9ra8edw9fs6v3pzkh49rtk24qhh2505c4d2zrw8ashyedtapnmeyndpy8f8szlz5tc7w0jyxm69s9ysaq5cgkfst4ude8z3phshy5yk5f3yakuxkgv7gyp2hwgl3kl223wzhv40ukmpajyass46zrgtfxr8sr3gax24d3edekg3sf52vklktkgkx3wgctvu6l9xzr098zc5gvsf50xqw8dp3y96rx5nkswt6uw7glxpyyj9hzxkqhylnry7h79hlrualwsr6qh0nx8mc5q2mmv8sc3nx9ggnek8jc0x9qaq426ssf9y35qr6jf4fk40xex45hvx72zpr3g92j2yczrd4qnwvf9flp9ekg0nsp7ru5z7c0fzqz2uwsvjlly6zmqaq5awgt9lclp0rply9jy9tcgfsqchncxuarqfc4zzf3jrpg9dvxgvhyqsl034lv732d0rc44032w7gt3c8kpnypaj6f2gpf5qzyrjy9d26h326gzv8gy6glqrrhunfxk54gjw6ktrhy4fp8ez3jz8wv89z798dz6q2upgkuyf3hgpf42wgs427ufmvetpqc9v6p032yllpcnrrkxc5qrfj9spttawd5hf4gxg2xk67hwcy6g3u5rlqslth3yu8x25ah966nq7v339ytf33avuuxaer6yrhfdpft42cj5a8apcrw0z5ksgmn0qcgeq3p3wmqecnucswe7rga66rde9ax7wtldwzqa85m3mqj8vwspehqfdy8gn4nke4knf2zr9cjpx37jawu2p5gzzejqe26mgzjh90nv9mf2h3x6g8h6tzumyktdscdu5azuzmf9mvxv2n9aky + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IElTVXQ3ODBP + WmQxVHpXSHlpWHNoU1RpWGppNml3dzBJYWphaG5jQ05oRUhHMmViOE5Da0paQ05y + eWdVRENQU2pxVlFFZWFPc2RvdUlXVXVpVHhRRXZWbzNQOUlnNlVDZmF3SVo0Q2dq + dnhySWJMa3liNkxONm5NNEw5ZEtQYmcyckFocWRVSzJZMThuSTFCL0NmTFlQeXJQ + VnI3ZndFdFFFZlhKSGpQSEkyVE81ei9yQkxUQUtxMFZsL1BjQUJVQ1I0YllDclha + a0VtaHN0eWtDUTRsU2FMUE1jU3luZERub1lHK3ViQU15V1RicjM0dFRqVzVHY0lY + YkxycStxVXJIeGl6NGFZbWxlUTI0SVBUdzcxVlVpS3dvQStPcHRNc09qNTdMWG1E + YkRxQlpSQ2NrdDI2aHZ1RzFXMC9MdURMS0pPVm0xWFErVW8rTldQeHZRYVVIQzdC + cktzckpqYkRyZXRTQjVrMEVmTkRCV2VTaXhEWkF4d2Z0SDV4YUEzYTZRVzA1Uk5l + QlVuNk5pS21rVjVWanV6eGw0ZkRRMmp1QkV5dzNHYmd2aWRiYU03bFNtZWhvMzdL + eFJyYm04UnY0NjZzNGJvbk5IekhHZlhNaVI0VFljbTJndzhwdTdVNHo4emQ0TXFk + M3VHK2JsbjM3SU9wTjlIb1N0Wm5RYW9SYUtnL3ZZdklXdFlmWXVjTWVxa1c1bWYv + dmRDMm5nR3ZGRXNhYTJDbldZbzY4ZnFzbmxka0Ivc3crNGFlNzNhUUYvYVpnUHBS + MDRvVEdrSTlFd3lNYTFSN1VBb3dZYkk2b1B1cTVoNGZDa01wbTVKYlVrOXZLTndw + MWp3L2pGU003ME5ieXR0WmJXd05WMCtCQlN0RElhR3RaSElHbjBwbVFGL0QzRmFI + UHRWbk1xUkc2emlaOWQ4MDk3bThuYTZMNzBGck1QaFQweHpTQVBlU0N1ajNWalZu + QWtJQWl0bVNnc2hEOVNLT1hPb1NqQnozN0xiZHhVSVI5bDVkQUJUSDkvUkh4d2c3 + Sy9WU05SRFNNUXlaQ2NkWmYwVFVhT2d5bGpBVUNOMmtLNXNBdjNwa0o5aXY0UEtX + N1RFUjJQVVQ4aitXRTVnVzdxMkI5WjE2SkRWVVJ1bkcxRlJ2c1A5R0lvVUNxREp0 + bnlxVWJMWndFZjNTYk45Ri9oMnJPemJXM2h1d2swa3R4QkVPeWJvZHFjTGVTcTdX + YjRQRTg3bGltKzVuTnUvdEZ1QzZRWFd2S3BLMS9SdVZrUEhZWWkzbXBMditTYUcw + WmE1ZVgwOE96ZEx6cCt2ZzBjdGozUUhob01PVjltcXNhRG1EcnNha3FHbHpCcWN0 + UG9BYXk0cmpGTmdJN3hlakhOeWNsWXh6eXpTdU43WTdhbWFlbDRKbm9JSnZXb3VI + eS9tSmx4cklIYllYUWx1anJCd1hjUmxmQ2wwdC96SmZnZ1BOVDhFSnFOYWNIZmxm + UC9uQTQ3ejVLT0lmREk1Qzk2UTczTTZyL1NYdTRIMWtJSjIrVTlXbE9VTWpjTjlG + TXM4T3J0RkJqdEF4elUzSGFBRWhsb0VacXRMVkxqeHpMTU9kbGsybS9WbGVGRFRF + aHM4aWU5VVE2WnFlZ0Jxc05oVHQ2MHYxNndVWGwyODVISkpLSzhmRVNvQjRUQ0gx + TTZEMUpUT0poV1JORG1vUnhRNXNvS2xabzFKckJMWnN2d1NjcWtrWHJtRlN6dStq + R2ZJVy9jYks1YXVKSFArZXR3RkNSRnpLbFJHTktMaFF4dTNmc2tGcTNKUFZNQTVy + dDAwdm96TGtGYW53MEJHSllldzEwR0ozbHVJbHJqVEVHZW50Z2c3NlFjYWovYUxi + M3FRSDJZZURYWlZUSTlidDcyRzhwWFFIN0VkSWt4NUFQZ0M5UDdUY0w4U1poNHZD + bHJaQm40YUhMZndMd3I5SUwvZ0ZZYzlFenIweXlyNmpnanFFZDZHU0p3MVJXZwpH + Q3VrZWh5SVNqNHFEY1VQL2IzbEdEQWVwa2lMc0J5QXlvalVaN0pIRmU4Ci0tLSBE + OVdUWmVsNmJIbDg1VVQ5YlJxL3RrQWpQcStsK3MxMjRNZStodFZONjJJCkl8cErH + RleZiYKXsYozA9R0mdy7mMVYLAsHBtLnh+pAfbmi9B30eMvCu8YpRd1ZMgoVEK6F + G8+gRR0Pv6XvRmE= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGd2TS9LbzNq + RUREUEpDNTdRYnBlMWhSWmREWUxiTDdmV0c3V2RLSk9SZExFUERycXZFYm9FVFFP + a3ZjZmNxUjRMUmQxalBiZWNIT3VPWWN1QllkSjZFMmpoQnFDenFsaXlVcUxHa3lL + V2tranN0WHZFSzVGTEhmWU1ZSU54NGNiVjZVR0V4dEIyRVFYdUhLQ1lmakMvdzJ6 + dEZSUHhUNzZnQ3NTMkxJS1J1am9KWjZiMXhaNWRRWEJXQ3I3S3BVQU5qN3V3aXJK + SGdyMXdRcDJNbnRJRENhbExZRDFkOFhBazNNakpFUGdaeWwrR0hUZzMrUHJERlBE + amlsUUY0RlRrMUpOdThIYXZBaUV3OTlXMHp6MFJPYjdxblhrZW13Z1hiMHJQQXU5 + aG0wOXMweTFnZ29KV0ZmT24yVFIvcFZGcnQ1VnNIb1p6a1Mza0pJbHVITkNtamZW + Vmx6NUxsK3AvZ2RoRkliaGJaWUE1RjlqZ29wanFmZldiZmt6UzFPRmpSV2JZSFI4 + c0FPUnNoTm9FbDBCZjNnY2VCRXhTeHZxblpNOVhnS3BZNE1CWHdtVHF6QTJIczVt + VzFQWjhmeFhKMHpMMjZTdnRpdnVCcStvWDZnYUdpYVRibTlmbDh6QTNJZnZLTk5v + OTlCdm04VWQ0ZWZUTzhjYnBGZ0F3bGsvR1AxY2w5emNsb0VQNkMxOGJ5RjNQQWpl + WFRwYUgyYkpQYWVGWUFqbmM3Z3dzbS91QlBya0JBMEV4U2lqSjJKWVhwdVhzUGlB + NDFZVm95OVYwcVlXZXltYmMrSFdLcENGVmRUVVZCWitGc05nM3IyRVlxd3ZXUTQx + YVdKSzhOdU01dEhCQ0psdGdhb0lMRGV4Z3dTSTRCeDhVZHR2SFJ3UVViS1VOeTlJ + dGVjMGdkdEJ5ZVFqd0JJdnRxcnlOOFY0clg2NTJEMXlxdDgrZCt2QWxjNU56RzRt + QkNsSzBjV3o1N2R6TStuVTJxZ2hsU0xWYjZBVHcrZmdLeXlPcnZYYVc5NWhFRlZP + Q2IzSjJjTzIzSlBwL1F3V0NjRlJMNFZqNVZ4cXI3czhobXc5K0xwOVlUNFcrWjY1 + SmxIU2Ivck0rSjhlV2ZOZWxzTlh0YXJaVktXUUhRaHczeVNUM2VPemU4dXVRVnZK + TWMxOGIvZU4yRXdaL2NSRFd4SWU3RGhJZGl4Ti9kbXNvR3hUWnBGT1ltcHR0NGlh + MXVNV2FqZHFENmZSS203Vm5VeTkzbEljS1dMelh4SVhvR0w3MmlOM3dkek1CTVRW + ZW1yNFVUZzhwekpKamR1UGMvM1dmUitPbGpMTFpmN3U2OWhwWmV2ZXM1RklZYlVF + OUYyVU9HVHlnK2RrT002TE1JeHN5R0hTeXJrSjJqSkRoMERxUzdsRmsyTWxRNnd2 + YnZPa1VBeGpoWTRUUVFKaXFRZ3h6QnNnaHJOWnJuQkd6N0xnMUh2ZlZMU1FsS1Iz + bFZUYVdXc3FTQVFONXF0S1NHZ3hncG00VWFrVCs3andnNVdWaUNwRUZUTTFmWEdp + bHhiZkVRNDBIWk0zT0YyQ0RHTjl5ek9qVUNjQXlUY0NZeW5PZUdoM0xzVnpxcHB0 + QVBhRlV4aWE4dmhNbHRaeVZDbm9EMUhObjN0MEI1VFdMdFNLUHdwckNyZGNZWGwr + OG9vNTZPcG5RZE4zMGQ2dXRvUTFZd3BFV0RRZW5wYmRXMXFjWU5SY0pEOTlHV2JP + ZCt6ZkdReHNmZDBBV1VLc290UmdrWmIzUkVJUnNsL0xvSjJtOHd1UmRUTmphYTlk + UkY2SGpnRi9oVDdRT1ZubEgyZGRxVTlVUjJFSGFBRUlFQ2NnVFV5ZGg0VzlJZVdZ + MCtNaGlLU1RUdlFvbUdwZHBqN09mTloyZFlSd25SQWY2T0grZk4rdG9VMGplekFl + R2YwZU1SdUpSSHYydk14Y25nRy9DaGZhemJ1MVk4MlNRcXN0SEZFM2ZDV1phZwpx + R2dqSXpkelpHeldUNmt1YjBGUmhCT25Gc3ZrczQ2NW84bDhUaDFuTFgwCi0tLSBE + THVGcTQ5dldvR1lMQXhmZHNZWTlMcnhaNFJNSUJUZUQwVmJ5S1ZHUjM0CudRMYEV + i4sx/18d2HJ1f6Lhf8tGPhw8YUXglZkIbEOBCoW8pSBbKzLBFr8XTg7kZceyCY72 + EClHlujjz7QFetg= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa + lastmodified: "2026-07-28T22:30:57Z" + mac: ENC[AES256_GCM,data:/vtQqVdSTwbwnUwi8LqhhHjxi3DiC/V/5id0HJ177GB8woL1qict4h1KlrJYGEKkZx3KBJxAsYjtipVGSaB1dXar7s7r7Wd1dEX9yfdHYWbHwshFH2L110UObiisrYEksWp2UYbh1cxEZP8K9sYXURcpKIrODTF9yk+dh3IEaNk=,iv:50qJdS3xxIcP0pUyBr67FteGR42KwOWliLQnXRvNLmo=,tag:nZ/P9l5b2Y9bWPycjU7GjA==,type:str] + pgp: + - created_at: "2026-07-27T21:01:06Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + hQIMA9/PFHehMxwxARAAtk7qngzvzTsUXQAbKXrJ2b7Xf8fmoBqQR4YJqyRAdFAe + 1rWgwpiJWvRgS5o3/rlb863wIIjnB9CgU8NOOHjoehV3IZSKRtk6262GLO+GFrxn + Erl5HEG1OkOIgYHfu/PVy8fEblCLBVHdXK9rTFBqnjIUgtzDdszawsakH6cRgZLO + YMZMcfGZZqcwnk6H1Rq9tGkLOQSHXqScIjMGgg/6fK2Th98oozDK5r/qWK7HNXJp + kguI5y4ZoT84aTDHodO+qkLxtenoN282XsypGpwY/t66AiCALAJvI/GbvYlBOWCz + 5EjpTAqv5uw8SgCV0RRX/sPf5Gq0KAaLMQb4YjpqLnxxSZtMjSHnG1FffIrbsIC0 + 8FhxxtGUhHzi3c8Dt0i2L3Gj/nYeSRt6ybVfmKy8feR02VVio/PBGDX8j0ZjfsOa + 75jA9AXCTomQ4INrcM+bA6ZbJ0v42StuIN4l2Qjl0nae4zkl8JllenAc2GeRBnw8 + OW4JM2OYHpl8clP9dmuAb8+0nzCg57CJ7lAkbpguHMTkguVBY53C5XSx+z9g74Rc + RKaji59Zwl2lY/qLCcnpeJhoccXqDcuAftuvjifoLZRCXRq93EmR7IEBvAtf0o46 + xADUmSdY7RDN/EZ0+fnn4qVbv6SarKYue8IpUQZwdXk2NHfTQuVeKtEDzoNgWB3S + XAEZ8La73b8jhbKvVGIklAx20s0zPm8B2X85Ju2DqComvJ/H/x6Xl622v52S1JMr + czQ97EInwWNFs3tvTHwTqf941amNEC5p+lRNw2ta3p4GuTiN8VOAavQT0XK2 + =efxl + -----END PGP MESSAGE----- + fp: "0x416CF1EF9AAF90BC" + shamir_threshold: 1 + unencrypted_suffix: _unencrypted + version: 3.13.3 diff --git a/system/core/boot.nix b/system/core/boot.nix new file mode 100644 index 0000000..de04057 --- /dev/null +++ b/system/core/boot.nix @@ -0,0 +1,35 @@ +{ pkgs, config, ... }: +{ + boot = { + bootspec.enableValidation = true; + + initrd = { + systemd.enable = true; + + # Managed via Disko + # supportedFilesystems = []; + }; + + # Default to latest and greatest kernel by default. + kernelPackages = pkgs.linuxPackages_latest; + + # Typical kernel parameters, which we'd usually pass via GRUB's + # `GRUB_CMDLINE_LINUX_DEFAULT`. + # + # Nothing at the moment... \o/ + # kernelParams = []; + + # Set console logging verbosity to KERN_ERR. + # see https://www.kernel.org/doc/html/next/core-api/printk-basics.html + consoleLogLevel = 3; + + # Use systemd-boot on UEFI instead of GRUB. + loader = { + efi.canTouchEfiVariables = true; + systemd-boot.enable = true; + }; + }; + + # Ensure cpupower is using the same version, as the current kernel. + environment.systemPackages = [ config.boot.kernelPackages.cpupower ]; +} diff --git a/system/core/default.nix b/system/core/default.nix new file mode 100644 index 0000000..1f82093 --- /dev/null +++ b/system/core/default.nix @@ -0,0 +1,13 @@ +{ ... }: +{ + imports = [ + ./boot.nix + ./i18n.nix + ./ram.nix + ./security + ./time.nix + ./users.nix + + ../nix + ]; +} diff --git a/system/core/i18n.nix b/system/core/i18n.nix new file mode 100644 index 0000000..606c5d1 --- /dev/null +++ b/system/core/i18n.nix @@ -0,0 +1,12 @@ +{ + i18n = { + defaultCharset = "UTF-8"; + defaultLocale = "en_US.UTF-8"; + extraLocales = [ + "de_AT.UTF-8/UTF-8" + ]; + + # allow switching keymap via `localectl set-keymap` + imperativeLocale = false; + }; +} diff --git a/system/core/ram.nix b/system/core/ram.nix new file mode 100644 index 0000000..f8ddd9c --- /dev/null +++ b/system/core/ram.nix @@ -0,0 +1,3 @@ +{ + zramSwap.enable = true; +} diff --git a/system/core/security/audit.nix b/system/core/security/audit.nix new file mode 100644 index 0000000..5feded8 --- /dev/null +++ b/system/core/security/audit.nix @@ -0,0 +1,18 @@ +{ ... }: +{ + security = { + audit = { + enable = true; + + rules = [ + # Host key + "-a always,exit -F arch=b32 -F path=/secrets -F key=secrets_dir_host" + "-a always,exit -F arch=b64 -F path=/secrets -F key=secrets_dir_host" + ]; + }; + + auditd = { + enable = true; + }; + }; +} diff --git a/system/core/security/default.nix b/system/core/security/default.nix new file mode 100644 index 0000000..8d9c522 --- /dev/null +++ b/system/core/security/default.nix @@ -0,0 +1,12 @@ +{ ... }: +{ + imports = [ + ./audit.nix + ./firewall.nix + ./pam.nix + ./sops.nix + ./ssh.nix + ./sudo.nix + ./sysctl.nix + ]; +} diff --git a/system/core/security/firewall.nix b/system/core/security/firewall.nix new file mode 100644 index 0000000..7cbeda0 --- /dev/null +++ b/system/core/security/firewall.nix @@ -0,0 +1,8 @@ +{ + # There's lots of network-related security config already done via ./sysctl.nix + + networking.firewall.enable = true; + + # Have iptables replaced with more modern nftables implementation. + networking.nftables.enable = true; +} diff --git a/system/core/security/pam.nix b/system/core/security/pam.nix new file mode 100644 index 0000000..6a50e10 --- /dev/null +++ b/system/core/security/pam.nix @@ -0,0 +1,11 @@ +{ ... }: +{ + security.pam = { + services = { + # Required for home manager's hyprlock a implementation. + hyprlock = { + enable = true; + }; + }; + }; +} diff --git a/system/core/security/sops.nix b/system/core/security/sops.nix new file mode 100644 index 0000000..cc6900a --- /dev/null +++ b/system/core/security/sops.nix @@ -0,0 +1,13 @@ +{ + sops = { + log = [ + "keyImport" + "secretChanges" + ]; + defaultSopsFormat = "yaml"; + age = { + keyFile = "/secrets/keys.txt"; + generateKey = false; + }; + }; +} diff --git a/system/core/security/ssh.nix b/system/core/security/ssh.nix new file mode 100644 index 0000000..4594de0 --- /dev/null +++ b/system/core/security/ssh.nix @@ -0,0 +1,23 @@ +{ lib, pkgs, ... }: +{ + # OpenSSH should generally be disabled by default and only activated when + # needed via systemd. + systemd.services.sshd.wantedBy = lib.mkForce [ ]; + + services.openssh = { + enable = true; + + allowSFTP = true; + + # Rely on the NixOS packaging team to have algorithms up2date. + enableRecommendedAlgorithms = true; + + # ... never ever ... + settings.PermitRootLogin = lib.mkForce "no"; + }; + + environment.systemPackages = [ + # In any case, install openssh anyways, since we'll need the ssh client. + pkgs.openssh + ]; +} diff --git a/system/core/security/sudo.nix b/system/core/security/sudo.nix new file mode 100644 index 0000000..37cb071 --- /dev/null +++ b/system/core/security/sudo.nix @@ -0,0 +1,11 @@ +{ + # Switch to sudo-rs + security.sudo.enable = false; + security.sudo-rs.enable = true; + + # Limit to %wheel group + security.sudo-rs.execWheelOnly = true; + + # Demand passwords + security.sudo-rs.wheelNeedsPassword = true; +} diff --git a/system/core/security/sysctl.nix b/system/core/security/sysctl.nix new file mode 100644 index 0000000..0bf75a8 --- /dev/null +++ b/system/core/security/sysctl.nix @@ -0,0 +1,49 @@ +{ + # All credit to... + # - @fufexan via https://github.com/fufexan/dotfiles/blob/main/system/core/security.nix + # - @hlissner via https://github.com/hlissner/dotfiles/blob/master/modules/security.nix + + boot.kernel.sysctl = { + # The Magic SysRq key is a key combo that allows users connected to the + # system console of a Linux kernel to perform some low-level commands. + # Disable it, since we don't need it, and is a potential security concern. + "kernel.sysrq" = 0; + + ## TCP hardening + # Prevent bogus ICMP errors from filling up logs. + "net.ipv4.icmp_ignore_bogus_error_responses" = 1; + # Reverse path filtering causes the kernel to do source validation of + # packets received from all interfaces. This can mitigate IP spoofing. + "net.ipv4.conf.default.rp_filter" = 1; + "net.ipv4.conf.all.rp_filter" = 1; + # Do not accept IP source route packets (we're not a router) + "net.ipv4.conf.all.accept_source_route" = 0; + "net.ipv6.conf.all.accept_source_route" = 0; + # Don't send ICMP redirects (again, we're not a router) + "net.ipv4.conf.all.send_redirects" = 0; + "net.ipv4.conf.default.send_redirects" = 0; + # Refuse ICMP redirects (MITM mitigations) + "net.ipv4.conf.all.accept_redirects" = 0; + "net.ipv4.conf.default.accept_redirects" = 0; + "net.ipv4.conf.all.secure_redirects" = 0; + "net.ipv4.conf.default.secure_redirects" = 0; + "net.ipv6.conf.all.accept_redirects" = 0; + "net.ipv6.conf.default.accept_redirects" = 0; + # Protects against SYN flood attacks + "net.ipv4.tcp_syncookies" = 1; + # Incomplete protection again TIME-WAIT assassination + "net.ipv4.tcp_rfc1337" = 1; + + ## TCP optimization + # TCP Fast Open is a TCP extension that reduces network latency by packing + # data in the sender’s initial TCP SYN. Setting 3 = enable TCP Fast Open for + # both incoming and outgoing connections: + "net.ipv4.tcp_fastopen" = 3; + # Bufferbloat mitigations + slight improvement in throughput & latency + "net.ipv4.tcp_congestion_control" = "bbr"; + "net.core.default_qdisc" = "cake"; + }; + + # make sure, kernel module is available for `net.ipv4.tcp_congestion_control` + boot.kernelModules = [ "tcp_bbr" ]; +} diff --git a/system/core/time.nix b/system/core/time.nix new file mode 100644 index 0000000..a178414 --- /dev/null +++ b/system/core/time.nix @@ -0,0 +1,8 @@ +{ lib, ... }: +{ + time.timeZone = lib.mkDefault "Europe/Vienna"; + + services = { + automatic-timezoned.enable = true; + }; +} diff --git a/system/core/users.nix b/system/core/users.nix new file mode 100644 index 0000000..6892236 --- /dev/null +++ b/system/core/users.nix @@ -0,0 +1,12 @@ +{ lib, ... }: +{ + services.userborn = { + enable = true; + }; + + # By default, we'd want to harden towards immutable users. + # If needed, this may be overridden. + users = { + mutableUsers = lib.mkDefault false; + }; +} diff --git a/system/default.nix b/system/default.nix new file mode 100644 index 0000000..abce26e --- /dev/null +++ b/system/default.nix @@ -0,0 +1,28 @@ +let + desktop = [ + ./core + + ./hardware/fwupd.nix + ./hardware/graphics.nix + ./hardware/sound.nix + + ./network + ./network/avahi.nix + + ./virtualisation + + ./programs + + ./services + ]; + + laptop = desktop ++ [ + ./hardware/bluetooth.nix + + ./services/blacklight.nix + ./services/power.nix + ]; +in +{ + inherit desktop laptop; +} diff --git a/system/hardware/bluetooth.nix b/system/hardware/bluetooth.nix new file mode 100644 index 0000000..3778ddd --- /dev/null +++ b/system/hardware/bluetooth.nix @@ -0,0 +1,7 @@ +{ + hardware.bluetooth = { + enable = true; + + powerOnBoot = true; + }; +} diff --git a/system/hardware/fwupd.nix b/system/hardware/fwupd.nix new file mode 100644 index 0000000..10dda7e --- /dev/null +++ b/system/hardware/fwupd.nix @@ -0,0 +1,5 @@ +{ + services.fwupd = { + enable = true; + }; +} diff --git a/system/hardware/graphics.nix b/system/hardware/graphics.nix new file mode 100644 index 0000000..4c63dba --- /dev/null +++ b/system/hardware/graphics.nix @@ -0,0 +1,5 @@ +{ + hardware.graphics = { + enable = true; + }; +} diff --git a/system/hardware/sound.nix b/system/hardware/sound.nix new file mode 100644 index 0000000..697467c --- /dev/null +++ b/system/hardware/sound.nix @@ -0,0 +1,16 @@ +{ pkgs, ... }: +{ + environment.systemPackages = [ + pkgs.hyprpwcenter + ]; + + services.pipewire = { + enable = true; + audio.enable = true; + + wireplumber.enable = true; + alsa.enable = true; + jack.enable = true; + pulse.enable = true; + }; +} diff --git a/system/network/avahi.nix b/system/network/avahi.nix new file mode 100644 index 0000000..890a58d --- /dev/null +++ b/system/network/avahi.nix @@ -0,0 +1,6 @@ +{ + services.avahi = { + enable = true; + nssmdns4 = true; + }; +} diff --git a/system/network/default.nix b/system/network/default.nix new file mode 100644 index 0000000..be23672 --- /dev/null +++ b/system/network/default.nix @@ -0,0 +1,34 @@ +{ pkgs, ... }: +{ + services.resolved = { + enable = true; + settings.Resolve = { + DNSOverTLS = "opportunistic"; + DNSSEC = "allow-downgrade"; + }; + }; + + networking = { + # /etc/resolv.conf to be managed via systemd-resolved + # resolvconf = { + # enable = true; + # }; + + nameservers = [ + # Cloudflare + "1.1.1.1" + "1.0.0.1" + # Google + "8.8.8.8" + ]; + + networkmanager = { + enable = true; + dns = "systemd-resolved"; + wifi.powersave = true; + plugins = [ + pkgs.networkmanager-openvpn + ]; + }; + }; +} diff --git a/system/nix/default.nix b/system/nix/default.nix new file mode 100644 index 0000000..2ad8082 --- /dev/null +++ b/system/nix/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./flakes.nix + ./store.nix + ]; +} diff --git a/system/nix/flakes.nix b/system/nix/flakes.nix new file mode 100644 index 0000000..cc960d1 --- /dev/null +++ b/system/nix/flakes.nix @@ -0,0 +1,34 @@ +{ + pkgs, + lib, + inputs, + config, + ... +}: +{ + # Require git for flakes + environment.systemPackages = [ + pkgs.git + ]; + + nix = + let + flakeInputs = lib.filterAttrs (_: v: lib.isType "flake" v) inputs; + in + { + # Pin the registry. + # This avoids downloading and evaling a new nixpkgs version every time. + registry = lib.mapAttrs (_: v: { flake = v; }) flakeInputs; + + # Set the path for channels compat + nixPath = lib.mapAttrsToList (key: _: "${key}=flake:${key}") config.nix.registry; + + settings = { + experimental-features = [ + "nix-command" + "flakes" + ]; + flake-registry = "/etc/nix/registry.json"; + }; + }; +} diff --git a/system/nix/store.nix b/system/nix/store.nix new file mode 100644 index 0000000..ff821d7 --- /dev/null +++ b/system/nix/store.nix @@ -0,0 +1,40 @@ +{ + system.stateVersion = "26.05"; + + nixpkgs = { + config.allowUnfree = true; + }; + + nix = { + gc = { + automatic = true; + dates = "weekly"; + options = "--delete-older-than 30d"; + persistent = true; + }; + + settings = { + auto-optimise-store = true; + + # for direnv GC roots + keep-derivations = true; + keep-outputs = true; + + trusted-users = [ + "root" + "@wheel" + ]; + + builders-use-substitutes = true; + substituters = [ + # high priority since it's almost always used + "https://cache.nixos.org?priority=10" + "https://nix-community.cachix.org" + ]; + trusted-public-keys = [ + "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" + "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" + ]; + }; + }; +} diff --git a/system/programs/database/default.nix b/system/programs/database/default.nix new file mode 100644 index 0000000..ca12663 --- /dev/null +++ b/system/programs/database/default.nix @@ -0,0 +1,7 @@ +{ + imports = [ + ./mysql.nix + ./postgres.nix + ./sqlite.nix + ]; +} diff --git a/system/programs/database/mysql.nix b/system/programs/database/mysql.nix new file mode 100644 index 0000000..68a9b12 --- /dev/null +++ b/system/programs/database/mysql.nix @@ -0,0 +1,8 @@ +{ pkgs, ... }: +{ + environment.systemPackages = [ + # We use the MariaDB fork instead of MySQL. + pkgs.mariadb + pkgs.mycli + ]; +} diff --git a/system/programs/database/postgres.nix b/system/programs/database/postgres.nix new file mode 100644 index 0000000..a2b7de7 --- /dev/null +++ b/system/programs/database/postgres.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: +{ + environment.systemPackages = [ + pkgs.postgresql + pkgs.pgcli + ]; +} diff --git a/system/programs/database/sqlite.nix b/system/programs/database/sqlite.nix new file mode 100644 index 0000000..942eaec --- /dev/null +++ b/system/programs/database/sqlite.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: +{ + environment.systemPackages = [ + pkgs.sqlite + pkgs.litecli + ]; +} diff --git a/system/programs/default.nix b/system/programs/default.nix new file mode 100644 index 0000000..8b24c55 --- /dev/null +++ b/system/programs/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./database + ./hyprland + ]; +} diff --git a/system/programs/hyprland/default.nix b/system/programs/hyprland/default.nix new file mode 100644 index 0000000..96fdc02 --- /dev/null +++ b/system/programs/hyprland/default.nix @@ -0,0 +1,19 @@ +{ pkgs, ... }: +{ + environment.systemPackages = [ + pkgs.hyprland + # For adwaita cursor theme + pkgs.adwaita-icon-theme + ]; + + environment.sessionVariables = { + XCURSOR_THEME = "Adwaita"; + XCURSOR_SIZE = "24"; + }; + + programs.hyprland = { + enable = true; + withUWSM = true; + xwayland.enable = true; + }; +} diff --git a/system/services/blacklight.nix b/system/services/blacklight.nix new file mode 100644 index 0000000..b43204e --- /dev/null +++ b/system/services/blacklight.nix @@ -0,0 +1,5 @@ +{ + hardware.brillo = { + enable = true; + }; +} diff --git a/system/services/dbus.nix b/system/services/dbus.nix new file mode 100644 index 0000000..011b7d6 --- /dev/null +++ b/system/services/dbus.nix @@ -0,0 +1,7 @@ +{ + services = { + dbus = { + implementation = "broker"; + }; + }; +} diff --git a/system/services/default.nix b/system/services/default.nix new file mode 100644 index 0000000..bb1ecfc --- /dev/null +++ b/system/services/default.nix @@ -0,0 +1,9 @@ +{ + imports = [ + ./dbus.nix + ./disks.nix + ./greetd.nix + ./monitoring.nix + ./smartcard.nix + ]; +} diff --git a/system/services/disks.nix b/system/services/disks.nix new file mode 100644 index 0000000..c53239b --- /dev/null +++ b/system/services/disks.nix @@ -0,0 +1,6 @@ +{ ... }: +{ + services.udisks2 = { + enable = true; + }; +} diff --git a/system/services/greetd.nix b/system/services/greetd.nix new file mode 100644 index 0000000..83aa43f --- /dev/null +++ b/system/services/greetd.nix @@ -0,0 +1,58 @@ +{ lib, pkgs, ... }: +{ + environment.systemPackages = [ + pkgs.hyprland + pkgs.regreet + ]; + + services.greetd = + let + session = { + command = "${lib.getBin pkgs.hyprland}/bin/start-hyprland -- -c /etc/greetd/hyprland.lua"; + user = "greeter"; + }; + in + { + enable = true; + restart = false; + + settings = { + terminal.vt = 1; + default_session = session; + }; + }; + + environment.etc = { + "greetd/hyprland.lua" = { + mode = "0644"; + text = '' + hl.on("hyprland.start", function() + hl.exec_cmd("${lib.getExe pkgs.regreet}; ${lib.getBin pkgs.hyprland}/bin/hyprctl dispatch 'hl.dsp.exit()'") + end) + hl.config({ + misc = { + disable_hyprland_logo = true, + disable_splash_rendering = true, + disable_hyprland_guiutils_check = true, + }, + }) + ''; + }; + }; + + programs.regreet = { + enable = true; + settings = { + commands = { + reboot = [ + "systemctl" + "reboot" + ]; + poweroff = [ + "systemctl" + "poweroff" + ]; + }; + }; + }; +} diff --git a/system/services/monitoring.nix b/system/services/monitoring.nix new file mode 100644 index 0000000..3b2ed51 --- /dev/null +++ b/system/services/monitoring.nix @@ -0,0 +1,10 @@ +{ pkgs, ... }: +{ + environment.systemPackages = [ + pkgs.osquery + ]; + + services.osquery = { + enable = true; + }; +} diff --git a/system/services/power.nix b/system/services/power.nix new file mode 100644 index 0000000..2b0ae94 --- /dev/null +++ b/system/services/power.nix @@ -0,0 +1,64 @@ +{ lib, pkgs, ... }: +let + find = "${lib.getExe pkgs.findutils}"; + xargs = "${lib.getBin pkgs.findutils}/bin/xargs"; + grep = "${lib.getExe pkgs.gnugrep}"; + sed = "${lib.getExe pkgs.gnused}"; + + # Prevent auto-suspension of connected mouse, keyboard and yubikey hardware + powertopPostScript = pkgs.writeShellScriptBin "powertop-post-script.sh" '' + DEVS="$( + ${find} -L /sys/bus/usb/devices/ -maxdepth 2 -type f -name 'product' -print0 \ + | ${xargs} -0 ${grep} -liE "mouse|keyboard|yubikey" \ + )" + + if [[ "$DEVS" == "" ]]; then + echo "no devices" + + exit 0 + fi + + while IFS= read -r DEV; do + DEV_POWER_CONTROL="$(echo "$DEV" | ${sed} "s/product/power\\/control/")" + echo "Keeping "$(cat "$DEV")" enabled ("$DEV")" + echo "on" >| "$DEV_POWER_CONTROL" + done <<< "$DEVS" + ''; +in +{ + environment.systemPackages = [ + pkgs.powertop + ]; + + powerManagement = { + enable = true; + + powertop = { + enable = true; + postStart = "${powertopPostScript}/bin/powertop-post-script.sh"; + }; + }; + + services = { + logind = { + enable = true; + + settings.Login = { + SleepOperation = "suspend-then-hibernate suspend"; + HandlePowerKey = "suspend"; + HandlePowerKeyLongPress = "poweroff"; + HandleLidSwitch = "suspend"; + HandleLidSwitchExternalPower = "suspend"; + HandleLidSwitchDocked = "suspend"; + }; + }; + + auto-cpufreq = { + enable = true; + }; + + upower = { + enable = true; + }; + }; +} diff --git a/system/services/smartcard.nix b/system/services/smartcard.nix new file mode 100644 index 0000000..8b58540 --- /dev/null +++ b/system/services/smartcard.nix @@ -0,0 +1,15 @@ +{ lib, ... }: +{ + programs.yubikey-manager.enable = true; + + # We will use GPG's scdaemon instead. + services.pcscd.enable = lib.mkForce false; + + # Add udev rules for smart cards + hardware.gpgSmartcards.enable = true; + + # With regards to SSH authentication, it's preferred to use GPG over the + # "traditional" SSH agent. + # As such, we're explicitly disabling openssh's ssh agent. + programs.ssh.startAgent = false; +} diff --git a/system/virtualisation/containers.nix b/system/virtualisation/containers.nix new file mode 100644 index 0000000..950544e --- /dev/null +++ b/system/virtualisation/containers.nix @@ -0,0 +1,10 @@ +{ pkgs, ... }: +{ + environment.systemPackages = [ + pkgs.nixos-container + ]; + + virtualisation.containers = { + enable = true; + }; +} diff --git a/system/virtualisation/default.nix b/system/virtualisation/default.nix new file mode 100644 index 0000000..0338bb7 --- /dev/null +++ b/system/virtualisation/default.nix @@ -0,0 +1,7 @@ +{ + imports = [ + ./containers.nix + ./docker.nix + ./podman.nix + ]; +} diff --git a/system/virtualisation/docker.nix b/system/virtualisation/docker.nix new file mode 100644 index 0000000..cf8f6be --- /dev/null +++ b/system/virtualisation/docker.nix @@ -0,0 +1,17 @@ +{ ... }: +{ + virtualisation.docker = { + enable = true; + + # Needed for having `--restart=always` flag working. + # Otherwise, systemd will only start docker on demand upon socket + # activation. + enableOnBoot = true; + + autoPrune = { + enable = true; + persistent = true; + dates = "weekly"; + }; + }; +} diff --git a/system/virtualisation/podman.nix b/system/virtualisation/podman.nix new file mode 100644 index 0000000..70b7be2 --- /dev/null +++ b/system/virtualisation/podman.nix @@ -0,0 +1,22 @@ +{ ... }: +{ + virtualisation.podman = { + enable = true; + + # Avoid conflicts with docker + dockerCompat = false; + dockerSocket.enable = false; + + autoPrune = { + enable = true; + dates = "weekly"; + }; + + defaultNetwork = { + settings = { + # Allow container-to-container DNS resolution + dns_enabled = true; + }; + }; + }; +}