Kieran's opinionated (and probably slightly dumb) nix config

Compare changes

Choose any two refs to compare.

Changed files
+2825 -19006
.github
dots
home-manager
machines
modules
moonlark
packages
secrets
.github/images/cool-retro-term.webp

This is a binary file and will not be displayed.

.github/images/github.png

This is a binary file and will not be displayed.

.github/images/github.webp

This is a binary file and will not be displayed.

.github/images/nautilus.png

This is a binary file and will not be displayed.

.github/images/nautilus.webp

This is a binary file and will not be displayed.

.github/images/neofetch.png

This is a binary file and will not be displayed.

.github/images/neofetch.webp

This is a binary file and will not be displayed.

.github/images/nix-update.webp

This is a binary file and will not be displayed.

.github/images/spotify.png

This is a binary file and will not be displayed.

.github/images/spotify.webp

This is a binary file and will not be displayed.

.github/images/zed.webp

This is a binary file and will not be displayed.

-46
.github/workflows/deploy.yaml
···
-
name: Deploy NixOS Configurations
-
-
on:
-
push:
-
branches:
-
- main
-
workflow_dispatch:
-
-
jobs:
-
deploy:
-
runs-on: ubuntu-latest
-
steps:
-
- uses: actions/checkout@v4
-
-
- name: Install Nix
-
uses: DeterminateSystems/determinate-nix-action@main
-
with:
-
extra-conf: |
-
extra-platforms = aarch64-linux
-
-
- name: Set up QEMU
-
uses: docker/setup-qemu-action@v3
-
with:
-
platforms: arm64
-
-
- name: Setup Tailscale
-
uses: tailscale/github-action@v3
-
with:
-
oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }}
-
oauth-secret: ${{ secrets.TS_OAUTH_SECRET }}
-
tags: tag:deploy
-
use-cache: "true"
-
-
- name: Configure SSH
-
run: |
-
mkdir -p ~/.ssh
-
echo "StrictHostKeyChecking accept-new" >> ~/.ssh/config
-
-
- name: Deploy all configurations
-
run: |
-
nix run github:serokell/deploy-rs -- \
-
--skip-checks \
-
--remote-build \
-
--ssh-user kierank \
-
--ssh-opts="-o StrictHostKeyChecking=accept-new" \
-
.
-2
.gitignore
···
-
.crush
-
.DS_Store
-25
LICENSE.md
···
-
The MIT License (MIT)
-
=====================
-
-
Copyright © `2025` `Kieran Klukas`
-
-
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.
+24 -267
README.md
···
# Kieran's Dots
-
![nix rebuild with flake update](.github/images/nix-update.webp)
+
![spotify with cava next to it](.github/images/spotify.png)
> [!CAUTION]
-
> These dots are highly prone to change / breakage.
-
>
-
> ~I am not a nix os expert (this is my first time touching nix), so I'm not sure if this will work or not. I'm just trying to get my dots up on github.~
-
>
-
> After `284` successful days of these dots being in constant operation, many many rebuilds, and `364` commits these dots have been rock solid and I have no complaints.
-
-
## The layout
-
-
```bash
-
~/dots # symlinked to /etc/nixos
-
├── dots # any config files that need to be symlinked go here, e.g. my hyprland config
-
│ └── wallpapers
-
├── machines
-
│ ├── atalanta # my macOS M4 machine
-
│ ├── ember # my dell r210 server (in my basement)
-
│ ├── moonlark # my framework 13 <dead>
-
│ ├── nest # shared tilde server through hc
-
│ ├── prattle # oracle cloud x86_64 server
-
│ ├── tacyon # rpi 5
-
│ └── terebithia # oracle cloud aarch64 server
-
├── modules
-
│ ├── home # home-manager modules
-
│ │ ├── aesthetics # theming and wallpapers
-
│ │ ├── apps # any app specific config
-
│ │ │ └── crush # vendored for now
-
│ │ ├── system # home-manager system configs
-
│ │ └── wm # window managers; just hyprland for now
-
│ │ └── hyprland
-
│ └── nixos # nixos modules
-
│ ├── apps # also app specific configs
-
│ └── system # pam and my fancy wifi module for now
-
└── secrets # keep your grubby hands (or paws) off my data
-
-
16 directories
-
```
+
> These dots are highly prone to change / breakage. I am not a nix os expert (this is my first time touching nix), so I'm not sure if this will work or not. I'm just trying to get my dots up on github. If you have any suggestions, please let me know.
## Installation
-
> [!WARNING]
-
> Also to note that this configuration will **not** work if you do not change any of the [secrets](./secrets) since they are encrypted.
-
-
You could either install a NixOS machine (rn there is just `moonlark`), use the home-manager instructions, or use nix-darwin for macOS.
-
-
### macOS with nix-darwin
-
-
For macOS machines, you can use nix-darwin:
-
-
1. Install Nix using the determinate systems installer:
-
-
```bash
-
curl -fsSL https://install.determinate.systems/nix | sh -s -- install
-
```
-
-
2. Clone the repository:
-
-
```bash
-
git clone git@github.com:taciturnaxolotl/dots.git
-
cd dots
-
```
-
-
3. Apply the configuration:
-
-
```bash
-
darwin-rebuild switch --flake .#atalanta
-
```
-
-
### Home Manager
-
-
Install nix via the determinate systems installer
-
-
```bash
-
curl -fsSL https://install.determinate.systems/nix | sh -s -- install --determinate
-
```
+
~~I have absolutely no idea~~ I kinda understand now?
-
then copy ssh keys and chmod them
-
+
1. Install NixOS via the [official guide](https://nixos.org/download.html)
+
2. `sudo -i`
+
3. Enable git with `sed -i 's/^{$/{\n programs.git.enable = true;/' /etc/nixos/configuration.nix` and then run `nixos-rebuild switch`
+
4. Download the disk config with `curl https://github.com/kcoderhtml/dots/raw/master/moonlark/disk-config.nix -o /tmp/disk-config.nix`
+
5. Run disko with `nix --experimental-features "nix-command flakes" run github:nix-community/disko -- --mode disko /tmp/disk-config.nix`
+
6. Mount disk with `mount | grep /mnt` and then `cd /mnt/etc/nixos`
+
7. Clone this repo to your `/mnt/etc/nixos` folder with `git clone https://github.com/kcoderhtml/dots.git .`
+
8. Add your ssh private key to `/mtn/etc/ssh/id_rsa`
+
9. install the flake: `nixos-install --flake .#moonlark --no-root-passwd`
+
10. Once it finishes run nix install and then reboot
```bash
-
scp .ssh/id_rsa* nest:/home/kierank/.ssh/
-
ssh nest chmod 600 ~/.ssh/id_rsa*
-
```
-
-
and then clone the repo
-
-
```bash
-
git clone git@github.com:taciturnaxolotl/dots.git
-
cd dots
-
```
-
-
and execute the machine profile
-
-
```bash
-
nix-shell -p home-manager
-
home-manager switch --flake .#nest
-
```
-
-
setup atuin and import previous shell history
-
-
```bash
-
atuin login
-
atuin import
-
```
-
-
### NixOS
-
-
> These instructions have been validated by installing on my friend's machine ([`Nat2-Dev/dots`](https://github.com/Nat2-Dev/dots))
-
-
#### Using nixos-anywhere (Recommended for remote installations)
-
-
> [!INFO]
-
> This only currently works with `prattle` and `terebithia` as they have the proper disko configs setup.
-
-
For remote installations (like Oracle Cloud), use [nixos-anywhere](https://github.com/nix-community/nixos-anywhere):
-
-
```bash
-
nix run github:nix-community/nixos-anywhere -- \
-
--flake .#prattle \
-
--generate-hardware-config nixos-facter ./machines/prattle/facter.json \
-
--build-on-remote \
-
root@<ip-address>
-
```
-
-
Replace `prattle` with your machine configuration and `<ip-address>` with your target machine's IP.
-
-
> **Note**: Make sure your SSH key is in the target machine's `authorized_keys` and the machine configuration has the correct network settings. The `--generate-hardware-config nixos-facter` flag will generate a comprehensive hardware report using [nixos-facter](https://github.com/numtide/nixos-facter) instead of the traditional `nixos-generate-config`.
-
-
#### Using the install script
-
-
```bash
-
curl -L https://raw.githubusercontent.com/taciturnaxolotl/dots/main/install.sh -o install.sh
-
chmod +x install.sh
-
./install.sh
-
```
-
-
#### The manual way
-
-
Install NixOS via the [official guide](https://nixos.org/download.html)
-
-
Connect to wifi
-
-
```bash
-
wpa_passphrase your-ESSID your-passphrase | sudo tee /etc/wpa_supplicant.conf
-
sudo systemctl restart wpa_supplicant
-
```
-
-
Check with `ping 1.1.1.1` if that doesn't work then use `wpa_cli`
-
-
```bash
-
sudo systemctl start wpa_supplicant
-
wpa_cli
-
-
add_network 0
-
-
set_network 0 ssid "put your ssid here"
-
-
set_network 0 psk "put your password here"
-
-
enable network 0
-
-
exit
-
```
-
-
Aquire root permissions while keeping your current context with
-
-
```bash
-
sudo -i
-
```
-
-
Enable git and rebuild your flake with the following
-
-
```bash
-
sed -i 's/^{$/{\n programs.git.enable = true;/' /etc/nixos/configuration.nix
-
nixos-rebuild switch
-
```
-
-
Download the disk configuration and run it
-
-
```bash
-
curl -L https://github.com/taciturnaxolotl/dots/raw/main/moonlark/disk-config.nix -o /tmp/disk-config.nix
-
nix --experimental-features "nix-command flakes" run github:nix-community/disko -- --mode destroy,format,mount /tmp/disk-config.nix
-
```
-
-
Run nixos generate config and cd into it
-
-
```bash
-
nixos-generate-config --root /mnt
-
cd /mnt/etc/nixos
-
```
-
-
Clone this repo to your `/mnt/etc/nixos` folder
-
-
```bash
-
rm *
-
git clone https://github.com/taciturnaxolotl/dots.git .
-
```
-
-
Add your ssh private key to `/mnt/etc/ssh/id_rsa`
-
-
install the flake, and umount the filesystem, and then reboot
-
-
```bash
-
nixos-install --flake .#moonlark --no-root-passwd
+
nixos-install
reboot
```
-
-
Pray to the nix gods that it works 🙏
-
-
If it worked then you should be able to login with the user `kierank` and the password `lolzthisaintsecure!`
-
-
You should immediately change the password
-
-
```bash
-
passwd kierank
-
```
-
-
Move the config to your local directory, link to `/etc/nixos`, and change permissions
-
-
```bash
-
sudo mv /etc/nixos ~/dots
-
sudo ln -s ~/dots /etc/nixos
-
sudo chown -R $(id -un):users ~/dots
-
sudo chown kierank -R ~/dots
-
sudo chown kierank -R ~/dots/.*
-
```
-
-
17. Setup the fingerprint reader and verify it works (you may need to swipe your finger across the fingerprint sensor instead of simply laying it there)
-
-
```bash
-
sudo fprintd-enroll -f right-index-finger kierank
-
sudo fprintd-verify kierank
-
```
-
-
Finally enable [atuin](https://atuin.sh/)
-
-
```bash
-
atuin login
-
atuin sync
-
```
-
-
## some odd things
-
-
for helix if you want the grammar to work you must run the following as per [this helix discussion](https://github.com/helix-editor/helix/discussions/10035#discussioncomment-13852637)
-
-
```bash
-
hx -g fetch
-
hx -g build
-
```
+
11. Pray to the nix gods that it works 🙏
+
12. If it worked then you should be able to login with the user `kierank` and the password `lolzthisaintsecure!`
+
13. Change the password with `passwd kierank`
+
14. Move the config to your local directory with `mkdir ~/etc; sudo mv /etc/nixos ~/etc`
+
15. Link the config back to `/etc/nixos` with `sudo ln -s ~/etc/nixos /etc`
+
16. Change the config permissions: `sudo chown -R $(id -un):users ~/etc/nixos`, `sudo chown kierank -R ~/etc/nixos`, and `sudo chown kierank -R ~/etc/nixos/.*`
+
17. Setup the fingerprint reader with `sudo fprintd-enroll -f right-index-finger kierank` and then verify it worked with `sudo fprintd-verify kierank` (you may need to swipe your finger across the fingerprint sensor instead of simply laying it there)
## Screenshots
-
<details>
<summary>I've stuck the rest of the screenshots in a spoiler to preserve space</summary>
-
<br/>
-
**Last updated: 2024-12-27**
-
-
![the github page of this repo](.github/images/github.webp)
-
![nautilus file manager](.github/images/nautilus.webp)
-
![neofetch](.github/images/neofetch.webp)
-
![spotify with cava next to it](.github/images/spotify.webp)
-
![zed with the hyprland config open](.github/images/zed.webp)
-
![cool-retro-term with neofetch](.github/images/cool-retro-term.webp)
-
+
![the github page of this repo](.github/images/github.png)
+
![nautilus file manager](.github/images/nautilus.png)
+
![neofetch](.github/images/neofetch.png)
</details>
## Credits
···
- [gtk with home manager](https://hoverbear.org/blog/declarative-gnome-configuration-in-nixos/)
- [setting up the proper portals](https://github.com/NixOS/nixpkgs/issues/274554)
- [tuigreet setup](https://github.com/sjcobb2022/nixos-config/blob/29077cee1fc82c5296908f0594e28276dacbe0b0/hosts/common/optional/greetd.nix)
-
-
## 📜 License
-
-
The code is licensed under `MIT`! That means MIT allows for free use, modification, and distribution of the software, requiring only that the original copyright notice and disclaimer are included in copies. All artwork and images are copyright reserved but may be used with proper attribution to the authors.
-
-
<p align="center">
-
<img src="https://raw.githubusercontent.com/taciturnaxolotl/carriage/master/.github/images/line-break.svg" />
-
</p>
-
-
<p align="center">
-
<i><code>&copy 2025-present <a href="https://github.com/taciturnaxolotl">Kieran Klukas</a></code></i>
-
</p>
-
-
<p align="center">
-
<a href="https://github.com/taciturnaxolotl/dots/blob/master/LICENSE.md"><img src="https://img.shields.io/static/v1.svg?style=for-the-badge&label=License&message=MIT&logoColor=d9e0ee&colorA=363a4f&colorB=b7bdf8"/></a>
-
</p>
-1
dots/README.md
···
-
all credit for the pier background goes to [github.com/acornitum](https://github.com/acornitum)
-51
dots/charge-alert.sh
···
-
#!/usr/bin/env bash
-
-
# Function to calculate temperature based on battery percentage
-
calculate_temperature() {
-
local bat_percent=$1
-
local temp
-
-
if [ "$bat_percent" -le 1 ]; then
-
temp=1000
-
elif [ "$bat_percent" -le 10 ]; then
-
# Linear interpolation between 1% (1000K) and 10% (4000K)
-
local range=$((4000 - 1000))
-
local factor=$(( (bat_percent - 1) * 100 / 9 ))
-
temp=$(( 1000 + (range * factor) / 100 ))
-
else
-
temp=6500 # Default temperature
-
fi
-
-
echo $temp
-
}
-
-
# Initialize variables
-
PREV_STATUS=""
-
-
# Main loop
-
while true; do
-
# Get battery percentage
-
battery_info=$(cat /sys/class/power_supply/BAT1/capacity)
-
percent=$(echo $battery_info | tr -d '\n')
-
-
# Check if the battery is charging
-
is_plugged=$(cat /sys/class/power_supply/BAT1/status)
-
-
# Create a status string to track changes
-
CURRENT_STATUS="${percent}_${is_plugged}"
-
-
# Only update if status has changed or first run
-
if [ "$CURRENT_STATUS" != "$PREV_STATUS" ] || [ -z "$PREV_STATUS" ]; then
-
if [ "$percent" -le 10 ] && [ "$is_plugged" != "Charging" ]; then
-
temp=$(calculate_temperature $percent)
-
hyprctl hyprsunset temperature $temp
-
else
-
# Reset to default temperature
-
hyprctl hyprsunset identity
-
fi
-
-
PREV_STATUS="$CURRENT_STATUS"
-
fi
-
-
sleep 5
-
done
-272
dots/copilot.sh
···
-
#!/bin/sh
-
-
# GitHub Copilot client ID
-
CLIENT_ID="Iv1.b507a08c87ecfe98"
-
-
# Token cache file location
-
CACHE_DIR="${HOME}/.config/crush/github-copilot"
-
CACHE_FILE="${CACHE_DIR}/bearer_token"
-
GITHUB_TOKEN_FILE="${CACHE_DIR}/github_token"
-
GITHUB_COPILOT_APPS_FILE="${HOME}/.config/github-copilot/apps.json"
-
-
# Function to extract OAuth token from GitHub Copilot apps.json
-
extract_oauth_token() {
-
local client_id="$1"
-
if [ -f "$GITHUB_COPILOT_APPS_FILE" ]; then
-
# Extract the oauth_token for our client ID (key format is "github.com:CLIENT_ID")
-
local oauth_token=$(grep -o "\"github.com:${client_id}\":{[^}]*\"oauth_token\":\"[^\"]*" "$GITHUB_COPILOT_APPS_FILE" | grep -o '"oauth_token":"[^"]*' | cut -d'"' -f4)
-
echo "$oauth_token"
-
fi
-
}
-
-
# Function to extract expiration from token
-
extract_expiration() {
-
local token="$1"
-
echo "$token" | grep -o 'exp=[0-9]*' | cut -d'=' -f2
-
}
-
-
# Function to check if token is valid
-
is_token_valid() {
-
local token="$1"
-
local exp=$(extract_expiration "$token")
-
-
if [ -z "$exp" ]; then
-
return 1
-
fi
-
-
local current_time=$(date +%s)
-
# Add 60 second buffer before expiration
-
local buffer_time=$((exp - 60))
-
-
if [ "$current_time" -lt "$buffer_time" ]; then
-
return 0
-
else
-
return 1
-
fi
-
}
-
-
# Function to exchange GitHub token for bearer token
-
exchange_github_token() {
-
local github_token="$1"
-
local bearer_response=$(curl -s -X GET "https://api.github.com/copilot_internal/v2/token" \
-
-H "Authorization: Token ${github_token}" \
-
-H "User-Agent: CRUSH/1.0")
-
-
local bearer_token=$(echo "$bearer_response" | grep -o '"token":"[^"]*' | cut -d'"' -f4)
-
echo "$bearer_token"
-
}
-
-
# Check for cached bearer token
-
if [ -f "$CACHE_FILE" ]; then
-
CACHED_TOKEN=$(cat "$CACHE_FILE")
-
if is_token_valid "$CACHED_TOKEN"; then
-
# Token is still valid, output and exit
-
echo "$CACHED_TOKEN"
-
exit 0
-
fi
-
fi
-
-
# Bearer token is expired/missing, try to use cached GitHub token
-
if [ -f "$GITHUB_TOKEN_FILE" ]; then
-
GITHUB_TOKEN=$(cat "$GITHUB_TOKEN_FILE")
-
if [ -n "$GITHUB_TOKEN" ]; then
-
# Try to exchange GitHub token for new bearer token
-
BEARER_TOKEN=$(exchange_github_token "$GITHUB_TOKEN")
-
if [ -n "$BEARER_TOKEN" ]; then
-
# Successfully got new bearer token, cache it
-
echo "$BEARER_TOKEN" > "$CACHE_FILE"
-
chmod 600 "$CACHE_FILE"
-
echo "$BEARER_TOKEN"
-
exit 0
-
fi
-
fi
-
fi
-
-
# Try to get OAuth token from GitHub Copilot apps.json
-
OAUTH_TOKEN=$(extract_oauth_token "$CLIENT_ID")
-
if [ -n "$OAUTH_TOKEN" ]; then
-
# Try to exchange OAuth token for new bearer token
-
BEARER_TOKEN=$(exchange_github_token "$OAUTH_TOKEN")
-
if [ -n "$BEARER_TOKEN" ]; then
-
# Successfully got new bearer token, cache it
-
mkdir -p "$CACHE_DIR"
-
echo "$BEARER_TOKEN" > "$CACHE_FILE"
-
chmod 600 "$CACHE_FILE"
-
echo "$OAUTH_TOKEN" > "$GITHUB_TOKEN_FILE"
-
chmod 600 "$GITHUB_TOKEN_FILE"
-
echo "$BEARER_TOKEN"
-
exit 0
-
fi
-
fi
-
-
# Step 1: Get device code
-
DEVICE_RESPONSE=$(curl -s -X POST "https://github.com/login/device/code" \
-
-H "Content-Type: application/x-www-form-urlencoded" \
-
-H "User-Agent: CRUSH/1.0" \
-
-H "Accept: application/json" \
-
-d "client_id=${CLIENT_ID}&scope=user:email read:user copilot")
-
-
# Extract values from response
-
DEVICE_CODE=$(echo "$DEVICE_RESPONSE" | grep -o '"device_code":"[^"]*' | cut -d'"' -f4)
-
USER_CODE=$(echo "$DEVICE_RESPONSE" | grep -o '"user_code":"[^"]*' | cut -d'"' -f4)
-
VERIFICATION_URI=$(echo "$DEVICE_RESPONSE" | grep -o '"verification_uri":"[^"]*' | cut -d'"' -f4)
-
INTERVAL=$(echo "$DEVICE_RESPONSE" | grep -o '"interval":[0-9]*' | cut -d':' -f2)
-
EXPIRES_IN=$(echo "$DEVICE_RESPONSE" | grep -o '"expires_in":[0-9]*' | cut -d':' -f2)
-
-
# Ensure minimum interval
-
if [ "$INTERVAL" -lt 5 ]; then
-
INTERVAL=5
-
fi
-
-
# Step 2: Create a temporary HTML file with the code
-
TEMP_HTML="/tmp/copilot_auth_$$.html"
-
cat > "$TEMP_HTML" << EOF
-
<!DOCTYPE html>
-
<html>
-
<head>
-
<title>GitHub Copilot Authentication</title>
-
<style>
-
body {
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
-
display: flex;
-
justify-content: center;
-
align-items: center;
-
height: 100vh;
-
margin: 0;
-
background-color: #f6f8fa;
-
}
-
.container {
-
text-align: center;
-
background: white;
-
padding: 40px;
-
border-radius: 8px;
-
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
-
max-width: 400px;
-
}
-
.code {
-
font-size: 32px;
-
font-weight: bold;
-
font-family: monospace;
-
background: #f3f4f6;
-
padding: 20px;
-
border-radius: 6px;
-
margin: 20px 0;
-
user-select: all;
-
cursor: pointer;
-
}
-
.button {
-
display: inline-block;
-
background: #2ea44f;
-
color: white;
-
padding: 12px 24px;
-
text-decoration: none;
-
border-radius: 6px;
-
font-weight: 500;
-
margin-top: 20px;
-
}
-
.button:hover {
-
background: #2c974b;
-
}
-
.info {
-
color: #586069;
-
margin-top: 20px;
-
font-size: 14px;
-
}
-
</style>
-
</head>
-
<body>
-
<div class="container">
-
<h1>GitHub Copilot Authentication</h1>
-
<p>Copy this code:</p>
-
<div class="code" onclick="navigator.clipboard.writeText('$USER_CODE')">$USER_CODE</div>
-
<a href="$VERIFICATION_URI" class="button" target="_blank" onclick="navigator.clipboard.writeText('$USER_CODE')">Copy Code & Continue to GitHub</a>
-
<p class="info">Click the button to copy the code and go to GitHub</p>
-
</div>
-
<script>
-
// Auto-close after 2 minutes
-
setTimeout(() => window.close(), 120000);
-
</script>
-
</body>
-
</html>
-
EOF
-
-
# Open the HTML file (suppress all output to avoid issues in POSIX shell)
-
if command -v xdg-open >/dev/null 2>&1; then
-
xdg-open "$TEMP_HTML" >/dev/null 2>&1 &
-
elif command -v open >/dev/null 2>&1; then
-
open "$TEMP_HTML" >/dev/null 2>&1 &
-
elif command -v start >/dev/null 2>&1; then
-
start "$TEMP_HTML" >/dev/null 2>&1 &
-
fi
-
-
# Step 3: Poll for token
-
POLL_COUNT=0
-
MAX_POLLS=60
-
GITHUB_TOKEN=""
-
-
# Initial delay
-
sleep 2
-
-
while [ $POLL_COUNT -lt $MAX_POLLS ] && [ -z "$GITHUB_TOKEN" ]; do
-
TOKEN_RESPONSE=$(curl -s -X POST "https://github.com/login/oauth/access_token" \
-
-H "Content-Type: application/x-www-form-urlencoded" \
-
-H "User-Agent: CRUSH/1.0" \
-
-H "Accept: application/json" \
-
-d "client_id=${CLIENT_ID}&device_code=${DEVICE_CODE}&grant_type=urn:ietf:params:oauth:grant-type:device_code")
-
-
# Check for access token
-
ACCESS_TOKEN=$(echo "$TOKEN_RESPONSE" | grep -o '"access_token":"[^"]*' | cut -d'"' -f4)
-
-
if [ -n "$ACCESS_TOKEN" ]; then
-
GITHUB_TOKEN="$ACCESS_TOKEN"
-
break
-
fi
-
-
# Check for errors
-
ERROR=$(echo "$TOKEN_RESPONSE" | grep -o '"error":"[^"]*' | cut -d'"' -f4)
-
-
case "$ERROR" in
-
"authorization_pending")
-
# Still waiting, continue
-
;;
-
"slow_down")
-
# Rate limiting
-
exit 1
-
;;
-
"expired_token")
-
# Token expired
-
exit 1
-
;;
-
*)
-
if [ -n "$ERROR" ]; then
-
exit 1
-
fi
-
;;
-
esac
-
-
POLL_COUNT=$((POLL_COUNT + 1))
-
sleep $INTERVAL
-
done
-
-
if [ -z "$GITHUB_TOKEN" ]; then
-
exit 1
-
fi
-
-
# Step 4: Exchange GitHub token for Copilot bearer token
-
BEARER_TOKEN=$(exchange_github_token "$GITHUB_TOKEN")
-
-
if [ -z "$BEARER_TOKEN" ]; then
-
exit 1
-
fi
-
-
# Create cache directory if it doesn't exist
-
mkdir -p "$CACHE_DIR"
-
-
# Cache both tokens
-
echo "$BEARER_TOKEN" > "$CACHE_FILE"
-
chmod 600 "$CACHE_FILE"
-
echo "$GITHUB_TOKEN" > "$GITHUB_TOKEN_FILE"
-
chmod 600 "$GITHUB_TOKEN_FILE"
-
-
# Output only the bearer token to stdout
-
echo "$BEARER_TOKEN"
-36
dots/dump-keybinds-mac.sh
···
-
#!/usr/bin/env bash
-
-
defaults export com.apple.symbolichotkeys - > /tmp/symbolichotkeys.plist
-
plutil -convert json -o /tmp/symbolichotkeys.json /tmp/symbolichotkeys.plist
-
cat /tmp/symbolichotkeys.json | \
-
jq -r '
-
.AppleSymbolicHotKeys
-
| to_entries
-
| map(
-
" \"" + .key + "\" = {\n" +
-
" enabled = " + (
-
if (.value.enabled == 1 or .value.enabled == true) then
-
"true"
-
else
-
"false"
-
end
-
) + ";\n" +
-
(
-
if (.value.value? and .value.value.parameters? and .value.value.type?) then
-
" value = {\n" +
-
" parameters = [ " + (
-
.value.value.parameters
-
| map(tostring)
-
| join(" ")
-
) + " ];\n" +
-
" type = \"" + .value.value.type + "\";\n" +
-
" };\n"
-
else
-
""
-
end
-
) +
-
" };\n"
-
)
-
| " AppleSymbolicHotKeys = {\n" + ( join("") ) + " };\n"
-
'
-
dots/face.jpeg

This is a binary file and will not be displayed.

-246
dots/hyprland.conf
···
-
# See https://wiki.hyprland.org/Configuring/Monitors/
-
monitor = eDP-1, preferred, 0x0, 1
-
monitor = DP-3, preferred, auto-left, 1
-
monitor = , addreserved, 52,0,0,0
-
monitor = , preferred, auto, 1
-
-
xwayland {
-
force_zero_scaling = true
-
}
-
-
# See https://wiki.hyprland.org/Configuring/Keywords/ for more
-
-
# Execute your favorite apps at launch
-
exec-once = hyprpaper
-
exec-once = hyprsunset
-
exec-once = sleep 1; chngwall
-
exec-once = ~/.config/hypr/charge-alert.sh
-
exec-once = lxsession
-
exec-once = wluma
-
exec-once = waybar
-
exec-once = hypridle
-
exec-once = udiskie
-
exec-once = nm-applet
-
exec-once = clipse -listen
-
exec-once = flare
-
-
exec-once=[workspace 7 silent] vesktop
-
exec-once=[workspace 8 silent] slack
-
exec-once=[workspace 1 silent] firefox
-
-
# Source a file (multi-file configs)
-
source = ~/.config/hypr/macchiato.conf
-
-
# For all categories, see https://wiki.hyprland.org/Configuring/Variables/
-
input {
-
kb_layout = us
-
-
follow_mouse = 1
-
-
touchpad {
-
natural_scroll = yes
-
}
-
-
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
-
}
-
-
general {
-
# See https://wiki.hyprland.org/Configuring/Variables/ for more
-
-
gaps_in = 2
-
gaps_out = 8
-
border_size = 2
-
col.inactive_border = $base
-
col.active_border = $blue
-
-
layout = dwindle
-
}
-
-
decoration {
-
# See https://wiki.hyprland.org/Configuring/Variables/ for more
-
-
rounding = 7
-
rounding_power = 4
-
-
shadow {
-
enabled = true
-
color = rgba(1a1a1aee)
-
}
-
-
dim_inactive = true
-
dim_strength = 0.2
-
-
active_opacity = 1.0
-
inactive_opacity = 0.8
-
fullscreen_opacity = 1.0
-
-
blur {
-
enabled = true
-
size = 6
-
passes = 2
-
new_optimizations = on
-
ignore_opacity = true
-
xray = true
-
}
-
}
-
-
windowrule = opacity 0.88 override 0.8 override 0.88 override, class:^(com\.mitchellh\.ghostty)$ # set opacity to 0.88 active, 0.8 inactive and 0.88 fullscreen for ghostty
-
windowrule = opacity 0.88 override 0.8 override 0.88 override, initialClass:^(dev\.zed\.Zed)$
-
windowrule = opacity 0.88 override 0.8 override 0.88 override, initialClass:^(spotify)$
-
windowrule = opacity 0.88 override 0.8 override 0.88 override, initialClass:^(Slack)$
-
windowrule = opacity 0.88 override 0.8 override 0.88 override, initialClass:^(org\.gnome\.Nautilus)$
-
windowrule = opacity 1.0 override, fullscreen:1
-
-
animations {
-
enabled = true
-
-
# Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
-
-
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
-
bezier = easeoutexpo, 0.19, 1, 0.22, 1
-
-
animation = windows, 1, 7, myBezier
-
animation = windowsOut, 1, 7, default, popin 80%
-
animation = border, 1, 10, default
-
animation = fade, 1, 7, default
-
animation = workspaces, 1, 10, easeoutexpo
-
}
-
-
dwindle {
-
# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
-
pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
-
preserve_split = yes # you probably want this
-
}
-
-
gestures {
-
# See https://wiki.hyprland.org/Configuring/Variables/ for more
-
workspace_swipe = on
-
workspace_swipe_create_new = true
-
workspace_swipe_distance = 150
-
workspace_swipe_cancel_ratio = 0.15
-
}
-
-
# Floating Windows
-
windowrule = float, title:^(Picture-in-Picture)$
-
windowrule = float, title:^(Open Files)$
-
windowrule = float, initialClass:^(zenity)$
-
windowrule = tile, initialClass:^(Aseprite)$
-
windowrule = tile, initialClass:^(System Identification)$
-
-
# clipse
-
windowrule = float, class:(clipse)
-
windowrule = noanim, class:(clipse)
-
windowrule = stayfocused, class:(eclipse)
-
windowrule = size 892 576, class:(clipse)
-
-
# raycast linux
-
windowrulev2 = float, title:^(raycast-hud-window)$
-
windowrulev2 = noanim, class:(raycast-linux)
-
windowrulev2 = stayfocused, class:(raycast-linux)
-
-
# Layer Rules
-
layerrule = animation fade,waybar
-
layerrule = blur,waybar
-
layerrule = ignorezero,waybar
-
-
-
# See https://wiki.hyprland.org/Configuring/Keywords/ for more
-
$mainMod = SUPER
-
-
# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
-
-
# Applications
-
bind = CTRL + SHIFT, B, exec, nautilus
-
bind = CTRL + SHIFT, F, exec, firefox
-
bind = CTRL + SHIFT, K, exec, export GTK_THEME=Adwaita:dark && kicad
-
bind = ALT, space, exec, flare
-
-
bind = $mainMod, RETURN, exec, ghostty
-
-
# System
-
bind = $mainMod, Q, killactive,
-
bind = $mainMod, X, exec, hyprctl kill
-
bind = $mainMod, M, exit
-
bind = $mainMod, L, exec, hyprlock
-
bind = $mainMod, ESC, exec, hyprlock
-
bind = $mainMod, V, togglefloating,
-
bind = $mainMod, S, exec, pgrep -x tofi-run && kill $(pgrep -x tofi-run) || tofi-run | xargs xargs hyprctl dispatch exec --
-
bind = CTRL + ALT, period, exec, pgrep -x tofi && kill $(pgrep -x tofi) || bash ~/.config/hypr/tofi-emoji.sh --width 1400
-
bind = $mainMod, P, pseudo, # dwindle
-
bind = $mainMod, J, togglesplit, # dwindle
-
bind = $mainMod, F, fullscreen
-
bind = SUPER SHIFT, V, exec, alacritty --class clipse -e 'clipse'
-
-
# Tools
-
bind=CTRL,PRINT,exec,grimblast copy area; notify-desktop "copied screenshot of selection to the clipboard"
-
bind=,PRINT,exec,grimblast copy output; notify-desktop "copied screenshot of screen to the clipboard"
-
bind=CTRL,XF86AudioMedia,exec,~/.config/hypr/hyprrec.sh
-
bind=,XF86AudioMedia,exec,~/.config/hypr/hyprrec.sh fullscreen
-
-
-
bind=CTRL + SHIFT, PRINT, exec, START_TIME=$(date +%s); bash ~/.config/hypr/prettify-ss.sh; notify-desktop "Prettified Screenshot" "Taking $(($(date +%s) - START_TIME))s"
-
-
bind=$mainMod, O, exec, hyprpicker -a -f hex
-
-
# Controls
-
bindel =,XF86MonBrightnessDown, exec, brightnessctl set 5%-; notify-desktop "brightness decreased 5%" "Curretly; $(echo "scale=1; 100 * $(brightnessctl g) / $(brightnessctl m)" | bc)%" -t 1200
-
bindel =,XF86MonBrightnessUp, exec, brightnessctl set 5%+; notify-desktop "brightness increased 5%" "Curretly; $(echo "scale=1; 100 * $(brightnessctl g) / $(brightnessctl m)" | bc)%" -t 1200
-
-
bindl =,XF86AudioPlay, exec, playerctl play-pause; notify-desktop "toggled media playback" -t 1800
-
bindl =,XF86AudioPrev, exec, playerctl previous; notify-desktop "Skipping back" -t 1800
-
bindl =,XF86AudioNext, exec, playerctl next
-
-
bindl=, XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle; notify-desktop "$(wpctl get-volume @DEFAULT_AUDIO_SINK@)" -t 800
-
-
bindel=, XF86AudioRaiseVolume, exec, wpctl set-volume -l 2.0 @DEFAULT_AUDIO_SINK@ 5%+; notify-desktop "$(wpctl get-volume @DEFAULT_AUDIO_SINK@)" -t 800
-
bindel=, XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-; notify-desktop "$(wpctl get-volume @DEFAULT_AUDIO_SINK@)" -t 800
-
-
bindel=, XF86RFKill, exec, notify-desktop "$(rfkill list | grep -q '^\s*Soft blocked: yes' && echo 'Airplane Mode is ON' || echo 'Airplane Mode is OFF')" -t 800
-
-
# 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
-
-
# Swap active window with the one next to it with mainMod + SHIFT + arrow keys
-
bind = SUPER SHIFT, left, swapwindow, l
-
bind = SUPER SHIFT, right, swapwindow, r
-
bind = SUPER SHIFT, up, swapwindow, u
-
bind = SUPER SHIFT, down, swapwindow, 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
-
-
# scratchpad
-
bind = $mainMod, grave, togglespecialworkspace
-
bind = $mainMod SHIFT, grave, movetoworkspace, special
-
-
# 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
-78
dots/hyprlock.conf
···
-
source = $HOME/.config/hypr/macchiato.conf
-
-
$accent = $blue
-
$accentAlpha = $blueAlpha
-
$font = FiraCode Nerd Font
-
-
# GENERAL
-
general {
-
disable_loading_bar = true
-
hide_cursor = true
-
}
-
-
# BACKGROUND
-
background {
-
monitor =
-
blur_passes = 0
-
color = $base
-
}
-
-
# TIME
-
label {
-
monitor =
-
text = cmd[update:30000] echo "$(date +"%R")"
-
color = $text
-
font_size = 90
-
font_family = $font
-
position = -30, 0
-
halign = right
-
valign = top
-
}
-
-
# DATE
-
label {
-
monitor =
-
text = cmd[update:43200000] echo "$(date +"%A, %d %B %Y")"
-
color = $text
-
font_size = 25
-
font_family = $font
-
position = -30, -150
-
halign = right
-
valign = top
-
}
-
-
# USER AVATAR
-
-
image {
-
monitor =
-
path = ~/.config/face.jpeg
-
size = 100
-
border_color = $accent
-
-
position = 0, 75
-
halign = center
-
valign = center
-
}
-
-
# INPUT FIELD
-
input-field {
-
monitor =
-
size = 300, 60
-
outline_thickness = 4
-
dots_size = 0.2
-
dots_spacing = 0.2
-
dots_center = true
-
outer_color = $accent
-
inner_color = $surface0
-
font_color = $text
-
fade_on_empty = false
-
placeholder_text = <span foreground="##$textAlpha"><i>󰌾 Logged in as </i><span foreground="##$accentAlpha">$USER</span></span>
-
hide_input = false
-
check_color = $accent
-
fail_color = $red
-
fail_text = <i>$FAIL <b>($ATTEMPTS)</b></i>
-
capslock_color = $yellow
-
position = 0, -35
-
halign = center
-
valign = center
-
}
-2
dots/hyprpaper.conf
···
-
preload=~/.config/wallpapers/frameworks.jpg
-
wallpaper=,~/.config/wallpapers/frameworks.jpg
-78
dots/hyprrec.sh
···
-
## Requirements:
-
## - `slurp`: to select an area
-
## - `notify-send`: to show notifications (provided by libnotify)
-
## - `wl-screenrec`: for screen recording
-
## - `ffmpeg`: for thumbnail generation
-
# If wl-screenrec is already running, stop recording.
-
if pgrep -x "wl-screenrec" > /dev/null; then
-
killall -s 2 wl-screenrec
-
exit 0
-
fi
-
-
# Set up file path for recording
-
FILE="$HOME/Downloads/screencast_$(date +%Y%m%d_%H%M%S).mp4"
-
-
# Get audio device information using wireplumber
-
MONITOR_DEVICE=""
-
DEFAULT_DEVICE=$(wpctl status | grep "Default Configured Devices" -A 2 | grep "Audio/Sink" | awk '{print $NF}')
-
-
if [ -n "$DEFAULT_DEVICE" ]; then
-
# Try to construct the monitor device name
-
MONITOR_DEVICE="${DEFAULT_DEVICE}.monitor"
-
-
# Check if the device exists by attempting to get its properties
-
wpctl inspect $(wpctl status | grep -A 1 "Built-in Audio Analog Stereo" | grep -o '[0-9]\+\.' | head -1 | tr -d '.') > /dev/null 2>&1
-
if [ $? -eq 0 ]; then
-
echo "Found audio device, will use monitor: $MONITOR_DEVICE"
-
AUDIO_ARGS="--audio --audio-device \"$MONITOR_DEVICE\""
-
else
-
echo "Couldn't confirm monitor device, falling back to default audio"
-
AUDIO_ARGS="--audio"
-
fi
-
else
-
echo "No default audio device found, falling back to default audio capture"
-
AUDIO_ARGS="--audio"
-
fi
-
-
# Process arguments to determine if full screen or area selection
-
if [ "$1" = "fullscreen" ]; then
-
# Full screen recording
-
notify-send -t 1000 -a "wl-screenrec" "Starting full screen recording"
-
ARGS=""
-
else
-
# Area selection
-
notify-send -t 1000 -a "wl-screenrec" "Select area or window to record"
-
# Get list of visible windows for slurp to highlight
-
WINDOWS="$(hyprctl clients -j | jq -r '.[] | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"')"
-
# Use slurp with window detection
-
GEOMETRY=$(echo "$WINDOWS" | slurp)
-
# Check if user canceled selection
-
if [ -z "$GEOMETRY" ]; then
-
notify-send -t 3000 -a "wl-screenrec" "Recording canceled"
-
exit 1
-
fi
-
notify-send -t 1000 -a "wl-screenrec" "Starting area recording"
-
ARGS="-g \"$GEOMETRY\""
-
fi
-
-
# Start recording with the selected parameters
-
touch /tmp/notify_result.txt
-
eval "wl-screenrec $ARGS $AUDIO_ARGS -f \"$FILE\"" && \
-
# Create a thumbnail from the recording
-
ffmpeg -i "$FILE" -ss 00:00:00 -vframes 1 -update 1 -frames:v 1 /tmp/screenrec_thumbnail.png -y && \
-
# Notify that recording is saved with clickable action
-
notify-send -a "wl-screenrec" "Recording saved to $FILE" \
-
-i "/tmp/screenrec_thumbnail.png" \
-
-A "default=Open" > /tmp/notify_result.txt
-
-
# Check if notification was clicked
-
if [ -f /tmp/notify_result.txt ] && grep -q "default" /tmp/notify_result.txt; then
-
if command -v xdg-open > /dev/null; then
-
xdg-open "$FILE"
-
elif command -v gdbus > /dev/null; then
-
gdbus call --session \
-
--dest org.freedesktop.FileManager1 \
-
--object-path /org/freedesktop/FileManager1 \
-
--method org.freedesktop.FileManager1.ShowItems "['file://$FILE']" ""
-
fi
-
fi
-795
dots/lxde-pi-rc.xml
···
-
<?xml version="1.0" encoding="UTF-8"?>
-
<!-- Do not edit this file, it will be overwritten on install.
-
Copy the file to $HOME/.config/openbox/ instead. -->
-
<openbox_config xmlns="http://openbox.org/3.4/rc">
-
<resistance>
-
<strength>10</strength>
-
<screen_edge_strength>20</screen_edge_strength>
-
</resistance>
-
<focus>
-
<focusNew>yes</focusNew>
-
<!-- always try to focus new windows when they appear. other rules do
-
apply -->
-
<followMouse>no</followMouse>
-
<!-- move focus to a window when you move the mouse into it -->
-
<focusLast>yes</focusLast>
-
<!-- focus the last used window when changing desktops, instead of the one
-
under the mouse pointer. when followMouse is enabled -->
-
<underMouse>no</underMouse>
-
<!-- move focus under the mouse, even when the mouse is not moving -->
-
<focusDelay>200</focusDelay>
-
<!-- when followMouse is enabled, the mouse must be inside the window for
-
this many milliseconds (1000 = 1 sec) before moving focus to it -->
-
<raiseOnFocus>no</raiseOnFocus>
-
<!-- when followMouse is enabled, and a window is given focus by moving the
-
mouse into it, also raise the window -->
-
<focusDesktop>yes</focusDesktop>
-
<!-- when no window on screen, focus the desktop to allow Orca keyboard
-
events to happen -->
-
</focus>
-
<placement>
-
<policy>Smart</policy>
-
<!-- 'Smart' or 'UnderMouse' -->
-
<center>yes</center>
-
<!-- whether to place windows in the center of the free area found or
-
the top left corner -->
-
<monitor>Any</monitor>
-
<!-- with Smart placement on a multi-monitor system, try to place new windows
-
on: 'Any' - any monitor, 'Mouse' - where the mouse is, 'Active' - where
-
the active window is -->
-
<primaryMonitor/>
-
</placement>
-
<theme>
-
<name>PiXflat</name>
-
<titleLayout>LIMC</titleLayout>
-
<!--
-
available characters are NDSLIMC, each can occur at most once.
-
N: window icon
-
L: window label (AKA title).
-
I: iconify
-
M: maximize
-
C: close
-
S: shade (roll up/down)
-
D: omnipresent (on all desktops).
-
-->
-
<keepBorder>yes</keepBorder>
-
<roundCorners>yes</roundCorners>
-
<invisibleHandles>yes</invisibleHandles>
-
<animateIconify>yes</animateIconify>
-
<font place="ActiveWindow">
-
<name>PibotoLt</name>
-
<size>12</size>
-
<!-- font size in points -->
-
<weight>Normal</weight>
-
<!-- 'bold' or 'normal' -->
-
<slant>Normal</slant>
-
<!-- 'italic' or 'normal' -->
-
</font>
-
<font place="InactiveWindow">
-
<name>PibotoLt</name>
-
<size>12</size>
-
<!-- font size in points -->
-
<weight>Normal</weight>
-
<!-- 'bold' or 'normal' -->
-
<slant>Normal</slant>
-
<!-- 'italic' or 'normal' -->
-
</font>
-
<font place="MenuHeader">
-
<name>PibotoLt</name>
-
<size>12</size>
-
<!-- font size in points -->
-
<weight>Normal</weight>
-
<!-- 'bold' or 'normal' -->
-
<slant>Normal</slant>
-
<!-- 'italic' or 'normal' -->
-
</font>
-
<font place="MenuItem">
-
<name>PibotoLt</name>
-
<size>12</size>
-
<!-- font size in points -->
-
<weight>Normal</weight>
-
<!-- 'bold' or 'normal' -->
-
<slant>Normal</slant>
-
<!-- 'italic' or 'normal' -->
-
</font>
-
<font place="ActiveOnScreenDisplay">
-
<name>PibotoLt</name>
-
<size>12</size>
-
<weight>Normal</weight>
-
<slant>Normal</slant>
-
</font>
-
<font place="InactiveOnScreenDisplay">
-
<name>PibotoLt</name>
-
<size>12</size>
-
<weight>Normal</weight>
-
<slant>Normal</slant>
-
</font>
-
</theme>
-
<desktops>
-
<!-- this stuff is only used at startup, pagers allow you to change them
-
during a session
-
-
these are default values to use when other ones are not already set
-
by other applications, or saved in your session
-
-
use obconf if you want to change these without having to log out
-
and back in -->
-
<number>1</number>
-
<firstdesk>1</firstdesk>
-
<names>
-
<!-- set names up here if you want to, like this:
-
<name>desktop 1</name>
-
<name>desktop 2</name>
-
-->
-
</names>
-
<popupTime>875</popupTime>
-
<!-- The number of milliseconds to show the popup for when switching
-
desktops. Set this to 0 to disable the popup. -->
-
</desktops>
-
<resize>
-
<drawContents>no</drawContents>
-
<popupShow>Nonpixel</popupShow>
-
<!-- 'Always', 'Never', or 'Nonpixel' (xterms and such) -->
-
<popupPosition>Center</popupPosition>
-
<!-- 'Center', 'Top', or 'Fixed' -->
-
<popupFixedPosition>
-
<!-- these are used if popupPosition is set to 'Fixed' -->
-
<x>10</x>
-
<!-- positive number for distance from left edge, negative number for
-
distance from right edge, or 'Center' -->
-
<y>10</y>
-
<!-- positive number for distance from top edge, negative number for
-
distance from bottom edge, or 'Center' -->
-
</popupFixedPosition>
-
</resize>
-
<!-- You can reserve a portion of your screen where windows will not cover when
-
they are maximized, or when they are initially placed.
-
Many programs reserve space automatically, but you can use this in other
-
cases. -->
-
<margins>
-
<top>0</top>
-
<bottom>0</bottom>
-
<left>0</left>
-
<right>0</right>
-
</margins>
-
<dock>
-
<position>TopLeft</position>
-
<!-- (Top|Bottom)(Left|Right|)|Top|Bottom|Left|Right|Floating -->
-
<floatingX>0</floatingX>
-
<floatingY>0</floatingY>
-
<noStrut>no</noStrut>
-
<stacking>Above</stacking>
-
<!-- 'Above', 'Normal', or 'Below' -->
-
<direction>Vertical</direction>
-
<!-- 'Vertical' or 'Horizontal' -->
-
<autoHide>no</autoHide>
-
<hideDelay>300</hideDelay>
-
<!-- in milliseconds (1000 = 1 second) -->
-
<showDelay>300</showDelay>
-
<!-- in milliseconds (1000 = 1 second) -->
-
<moveButton>Middle</moveButton>
-
<!-- 'Left', 'Middle', 'Right' -->
-
</dock>
-
<keyboard>
-
<chainQuitKey>C-g</chainQuitKey>
-
<!-- Keybindings for desktop switching -->
-
<keybind key="C-A-Left">
-
<action name="UnmaximizeFull"/>
-
<action name="MaximizeVert"/>
-
<action name="MoveResizeTo">
-
<width>50%</width>
-
</action>
-
<action name="MoveToEdge"><direction>west</direction></action>
-
</keybind>
-
<keybind key="C-A-Right">
-
<action name="UnmaximizeFull"/>
-
<action name="MaximizeVert"/>
-
<action name="MoveResizeTo">
-
<width>50%</width>
-
</action>
-
<action name="MoveToEdge"><direction>east</direction></action>
-
</keybind>
-
<keybind key="C-A-Down">
-
<action name="Unmaximize"/>
-
</keybind>
-
<keybind key="C-A-Up">
-
<action name="Maximize"/>
-
</keybind>
-
<keybind key="S-A-Left">
-
<action name="SendToDesktopLeft">
-
<dialog>no</dialog>
-
<wrap>no</wrap>
-
</action>
-
</keybind>
-
<keybind key="S-A-Right">
-
<action name="SendToDesktopRight">
-
<dialog>no</dialog>
-
<wrap>no</wrap>
-
</action>
-
</keybind>
-
<keybind key="S-A-Up">
-
<action name="SendToDesktopUp">
-
<dialog>no</dialog>
-
<wrap>no</wrap>
-
</action>
-
</keybind>
-
<keybind key="S-A-Down">
-
<action name="SendToDesktopDown">
-
<dialog>no</dialog>
-
<wrap>no</wrap>
-
</action>
-
</keybind>
-
<keybind key="C-A-d">
-
<action name="ToggleShowDesktop"/>
-
</keybind>
-
<!-- Keybindings for windows -->
-
<keybind key="A-F4">
-
<action name="Close"/>
-
</keybind>
-
<keybind key="Super-Q">
-
<action name="Close"/>
-
</keybind>
-
<keybind key="A-Escape">
-
<action name="Lower"/>
-
<action name="FocusToBottom"/>
-
<action name="Unfocus"/>
-
</keybind>
-
<keybind key="A-space">
-
<action name="ShowMenu">
-
<menu>client-menu</menu>
-
</action>
-
</keybind>
-
<!-- Keybindings for window switching -->
-
<keybind key="A-Tab">
-
<action name="NextWindow"/>
-
</keybind>
-
<keybind key="A-S-Tab">
-
<action name="PreviousWindow"/>
-
</keybind>
-
<keybind key="C-A-Tab">
-
<action name="NextWindow">
-
<panels>yes</panels>
-
<desktop>yes</desktop>
-
</action>
-
</keybind>
-
<!-- Keybindings for running applications -->
-
<keybind key="Print">
-
<action name="Execute">
-
<command>scrot</command>
-
</action>
-
</keybind>
-
<keybind key="C-A-T">
-
<action name="Execute">
-
<command>x-terminal-emulator</command>
-
</action>
-
</keybind>
-
<keybind key="Super-Enter">
-
<action name="Execute">
-
<command>alacritty</command>
-
</action>
-
</keybind>
-
<!--keybindings for LXPanel -->
-
<keybind key="Super_L">
-
<action name="Execute">
-
<command>lxpanelctl menu</command>
-
</action>
-
</keybind>
-
<keybind key="A-F2">
-
<action name="Execute">
-
<command>lxpanelctl run</command>
-
</action>
-
</keybind>
-
<keybind key="C-Escape">
-
<action name="Execute">
-
<command>lxpanelctl menu</command>
-
</action>
-
</keybind>
-
<keybind key="C-A-S">
-
<action name="Execute">
-
<command>lxpanelctl move</command>
-
</action>
-
</keybind>
-
<keybind key="C-A-B">
-
<action name="Execute">
-
<command>lxpanelctl command bluetooth menu</command>
-
</action>
-
</keybind>
-
<keybind key="C-A-W">
-
<action name="Execute">
-
<command>lxpanelctl command netman menu</command>
-
</action>
-
</keybind>
-
<keybind key="A-F11">
-
<action name="ToggleFullscreen"/>
-
</keybind>
-
<keybind key="C-A-M">
-
<action name="Execute">
-
<command>lxpanelctl command magnifier toggle</command>
-
</action>
-
</keybind>
-
<!-- Launch Task Manager with Ctrl+Shift+Escape -->
-
<keybind key="C-S-Escape">
-
<action name="Execute">
-
<command>lxtask</command>
-
</action>
-
</keybind>
-
<!-- Keybindings for audio volume media keys -->
-
<keybind key="XF86AudioRaiseVolume">
-
<action name="Execute">
-
<command>sh -c "lxpanelctl command volumepulse volu; lxpanelctl command volumealsabt volu"</command>
-
</action>
-
</keybind>
-
<keybind key="XF86AudioLowerVolume">
-
<action name="Execute">
-
<command>sh -c "lxpanelctl command volumepulse vold; lxpanelctl command volumealsabt vold"</command>
-
</action>
-
</keybind>
-
<keybind key="XF86AudioMute">
-
<action name="Execute">
-
<command>sh -c "lxpanelctl command volumepulse mute; lxpanelctl command volumealsabt mute"</command>
-
</action>
-
</keybind>
-
<!-- Keybindings for pitop -->
-
<keybind key="0xC6">
-
<action name="Execute">
-
<command>sh -c "if test -e /usr/bin/pt-brightness; then /usr/bin/pt-brightness -d; fi"</command>
-
</action>
-
</keybind>
-
<keybind key="0xC7">
-
<action name="Execute">
-
<command>sh -c "if test -e /usr/bin/pt-brightness; then /usr/bin/pt-brightness -i; fi"</command>
-
</action>
-
</keybind>
-
<keybind key="0xC8">
-
<action name="Execute">
-
<command>pcmanfm</command>
-
</action>
-
</keybind>
-
<keybind key="0xC9">
-
<action name="Execute">
-
<command>lxterminal</command>
-
</action>
-
</keybind>
-
<keybind key="C-A-End">
-
<action name="Execute">
-
<command>pishutdown</command>
-
</action>
-
</keybind>
-
<keybind key="C-A-Delete">
-
<action name="Execute">
-
<command>pishutdown</command>
-
</action>
-
</keybind>
-
<keybind key="XF86PowerOff">
-
<action name="Execute">
-
<command>pwrkey</command>
-
</action>
-
</keybind>
-
<keybind key="C-A-space">
-
<action name="Execute">
-
<command>gui-pkinst orca reboot</command>
-
</action>
-
</keybind>
-
</keyboard>
-
<mouse>
-
<dragThreshold>8</dragThreshold>
-
<!-- number of pixels the mouse must move before a drag begins -->
-
<doubleClickTime>200</doubleClickTime>
-
<!-- in milliseconds (1000 = 1 second) -->
-
<screenEdgeWarpTime>400</screenEdgeWarpTime>
-
<!-- Time before changing desktops when the pointer touches the edge of the
-
screen while moving a window, in milliseconds (1000 = 1 second).
-
Set this to 0 to disable warping -->
-
<context name="Frame">
-
<mousebind button="A-Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
</mousebind>
-
<mousebind button="A-Left" action="Click">
-
<action name="Unshade"/>
-
</mousebind>
-
<mousebind button="A-Left" action="Drag">
-
<action name="Move"/>
-
</mousebind>
-
<mousebind button="A-Right" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
<action name="Unshade"/>
-
</mousebind>
-
<mousebind button="A-Right" action="Drag">
-
<action name="Resize"/>
-
</mousebind>
-
<mousebind button="A-Middle" action="Press">
-
<action name="Lower"/>
-
<action name="FocusToBottom"/>
-
<action name="Unfocus"/>
-
</mousebind>
-
<mousebind button="A-Up" action="Click">
-
<action name="DesktopPrevious"/>
-
</mousebind>
-
<mousebind button="A-Down" action="Click">
-
<action name="DesktopNext"/>
-
</mousebind>
-
<mousebind button="C-A-Up" action="Click">
-
<action name="DesktopPrevious"/>
-
</mousebind>
-
<mousebind button="C-A-Down" action="Click">
-
<action name="DesktopNext"/>
-
</mousebind>
-
<mousebind button="A-S-Up" action="Click">
-
<action name="SendToDesktopPrevious"/>
-
</mousebind>
-
<mousebind button="A-S-Down" action="Click">
-
<action name="SendToDesktopNext"/>
-
</mousebind>
-
</context>
-
<context name="Titlebar">
-
<mousebind button="Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
</mousebind>
-
<mousebind button="Left" action="Drag">
-
<action name="Move"/>
-
</mousebind>
-
<mousebind button="Left" action="DoubleClick">
-
<action name="ToggleMaximizeFull"/>
-
</mousebind>
-
<mousebind button="Middle" action="Press">
-
<action name="Lower"/>
-
<action name="FocusToBottom"/>
-
<action name="Unfocus"/>
-
</mousebind>
-
<mousebind button="Right" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
<action name="ShowMenu">
-
<menu>client-menu</menu>
-
</action>
-
</mousebind>
-
</context>
-
<context name="Top">
-
<mousebind button="Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
<action name="Unshade"/>
-
</mousebind>
-
<mousebind button="Left" action="Drag">
-
<action name="Resize">
-
<edge>top</edge>
-
</action>
-
</mousebind>
-
</context>
-
<context name="Left">
-
<mousebind button="Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
</mousebind>
-
<mousebind button="Left" action="Drag">
-
<action name="Resize">
-
<edge>left</edge>
-
</action>
-
</mousebind>
-
</context>
-
<context name="Right">
-
<mousebind button="Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
</mousebind>
-
<mousebind button="Left" action="Drag">
-
<action name="Resize">
-
<edge>right</edge>
-
</action>
-
</mousebind>
-
</context>
-
<context name="Bottom">
-
<mousebind button="Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
</mousebind>
-
<mousebind button="Left" action="Drag">
-
<action name="Resize">
-
<edge>bottom</edge>
-
</action>
-
</mousebind>
-
<mousebind button="Middle" action="Press">
-
<action name="Lower"/>
-
<action name="FocusToBottom"/>
-
<action name="Unfocus"/>
-
</mousebind>
-
<mousebind button="Right" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
<action name="ShowMenu">
-
<menu>client-menu</menu>
-
</action>
-
</mousebind>
-
</context>
-
<context name="BLCorner">
-
<mousebind button="Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
</mousebind>
-
<mousebind button="Left" action="Drag">
-
<action name="Resize"/>
-
</mousebind>
-
</context>
-
<context name="BRCorner">
-
<mousebind button="Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
</mousebind>
-
<mousebind button="Left" action="Drag">
-
<action name="Resize"/>
-
</mousebind>
-
</context>
-
<context name="TLCorner">
-
<mousebind button="Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
<action name="Unshade"/>
-
</mousebind>
-
<mousebind button="Left" action="Drag">
-
<action name="Resize"/>
-
</mousebind>
-
</context>
-
<context name="TRCorner">
-
<mousebind button="Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
<action name="Unshade"/>
-
</mousebind>
-
<mousebind button="Left" action="Drag">
-
<action name="Resize"/>
-
</mousebind>
-
</context>
-
<context name="Client">
-
<mousebind button="Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
</mousebind>
-
<mousebind button="Middle" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
</mousebind>
-
<mousebind button="Right" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
</mousebind>
-
</context>
-
<context name="Icon">
-
<mousebind button="Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
<action name="Unshade"/>
-
<action name="ShowMenu">
-
<menu>client-menu</menu>
-
</action>
-
</mousebind>
-
<mousebind button="Right" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
<action name="ShowMenu">
-
<menu>client-menu</menu>
-
</action>
-
</mousebind>
-
</context>
-
<context name="AllDesktops">
-
<mousebind button="Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
<action name="Unshade"/>
-
</mousebind>
-
<mousebind button="Left" action="Click">
-
<action name="ToggleOmnipresent"/>
-
</mousebind>
-
</context>
-
<context name="Shade">
-
<mousebind button="Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
</mousebind>
-
<mousebind button="Left" action="Click">
-
<action name="ToggleShade"/>
-
</mousebind>
-
</context>
-
<context name="Iconify">
-
<mousebind button="Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
</mousebind>
-
<mousebind button="Left" action="Click">
-
<action name="Iconify"/>
-
</mousebind>
-
</context>
-
<context name="Maximize">
-
<mousebind button="Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
<action name="Unshade"/>
-
</mousebind>
-
<mousebind button="Middle" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
<action name="Unshade"/>
-
</mousebind>
-
<mousebind button="Right" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
<action name="Unshade"/>
-
</mousebind>
-
<mousebind button="Left" action="Click">
-
<action name="ToggleMaximizeFull"/>
-
</mousebind>
-
<mousebind button="Middle" action="Click">
-
<action name="ToggleMaximizeVert"/>
-
</mousebind>
-
<mousebind button="Right" action="Click">
-
<action name="ToggleMaximizeHorz"/>
-
</mousebind>
-
</context>
-
<context name="Close">
-
<mousebind button="Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
<action name="Unshade"/>
-
</mousebind>
-
<mousebind button="Left" action="Click">
-
<action name="Close"/>
-
</mousebind>
-
</context>
-
<context name="Desktop">
-
<mousebind button="Up" action="Click">
-
<action name="DesktopPrevious"/>
-
</mousebind>
-
<mousebind button="Down" action="Click">
-
<action name="DesktopNext"/>
-
</mousebind>
-
<mousebind button="A-Up" action="Click">
-
<action name="DesktopPrevious"/>
-
</mousebind>
-
<mousebind button="A-Down" action="Click">
-
<action name="DesktopNext"/>
-
</mousebind>
-
<mousebind button="C-A-Up" action="Click">
-
<action name="DesktopPrevious"/>
-
</mousebind>
-
<mousebind button="C-A-Down" action="Click">
-
<action name="DesktopNext"/>
-
</mousebind>
-
<mousebind button="Left" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
</mousebind>
-
<mousebind button="Right" action="Press">
-
<action name="Focus"/>
-
<action name="Raise"/>
-
</mousebind>
-
</context>
-
<context name="Root">
-
<!-- Menus -->
-
<mousebind button="Middle" action="Press">
-
<action name="ShowMenu">
-
<menu>client-list-combined-menu</menu>
-
</action>
-
</mousebind>
-
<mousebind button="Right" action="Press">
-
<action name="ShowMenu">
-
<menu>root-menu</menu>
-
</action>
-
</mousebind>
-
</context>
-
<context name="MoveResize">
-
<mousebind button="Up" action="Click">
-
<action name="DesktopPrevious"/>
-
</mousebind>
-
<mousebind button="Down" action="Click">
-
<action name="DesktopNext"/>
-
</mousebind>
-
<mousebind button="A-Up" action="Click">
-
<action name="DesktopPrevious"/>
-
</mousebind>
-
<mousebind button="A-Down" action="Click">
-
<action name="DesktopNext"/>
-
</mousebind>
-
</context>
-
</mouse>
-
<menu>
-
<!-- You can specify more than one menu file in here and they are all loaded,
-
just don't make menu ids clash or, well, it'll be kind of pointless -->
-
<!-- default menu file (or custom one in $HOME/.config/openbox/) -->
-
<file>/usr/share/lxde/openbox/menu.xml</file>
-
<hideDelay>200</hideDelay>
-
<!-- if a press-release lasts longer than this setting (in milliseconds), the
-
menu is hidden again -->
-
<middle>no</middle>
-
<!-- center submenus vertically about the parent entry -->
-
<submenuShowDelay>100</submenuShowDelay>
-
<!-- this one is easy, time to delay before showing a submenu after hovering
-
over the parent entry -->
-
<applicationIcons>yes</applicationIcons>
-
<!-- controls if icons appear in the client-list-(combined-)menu -->
-
<manageDesktops>no</manageDesktops>
-
<!-- show the manage desktops section in the client-list-(combined-)menu -->
-
</menu>
-
<applications>
-
<application name="panel">
-
<skip_taskbar>yes</skip_taskbar>
-
<layer>above</layer>
-
</application>
-
<application name="panel" type="dock">
-
<layer>below</layer>
-
</application>
-
-
<!--
-
# this is an example with comments through out. use these to make your
-
# own rules, but without the comments of course.
-
-
<application name="first element of window's WM_CLASS property (see xprop)"
-
class="second element of window's WM_CLASS property (see xprop)"
-
role="the window's WM_WINDOW_ROLE property (see xprop)">
-
# the name or the class can be set, or both. this is used to match
-
# windows when they appear. role can optionally be set as well, to
-
# further restrict your matches.
-
-
# the name, class, and role use simple wildcard matching such as those
-
# used by a shell. you can use * to match any characters and ? to match
-
# any single character.
-
-
# when multiple rules match a window, they will all be applied, in the
-
# order that they appear in this list
-
-
-
# each element can be left out or set to 'default' to specify to not
-
# change that attribute of the window
-
-
<decor>yes</decor>
-
# enable or disable window decorations
-
-
<shade>no</shade>
-
# make the window shaded when it appears, or not
-
-
<position>
-
# the position is only used if both an x and y coordinate are provided
-
# (and not set to 'default')
-
<x>center</x>
-
# a number like 50, or 'center' to center on screen. use a negative number
-
# to start from the right (or bottom for <y>), ie -50 is 50 pixels from the
-
# right edge (or bottom).
-
<y>200</y>
-
<monitor>1</monitor>
-
# specifies the monitor in a xinerama setup.
-
# 1 is the first head, or 'mouse' for wherever the mouse is
-
</position>
-
-
<focus>yes</focus>
-
# if the window should try be given focus when it appears. if this is set
-
# to yes it doesn't guarantee the window will be given focus. some
-
# restrictions may apply, but Openbox will try to
-
-
<desktop>1</desktop>
-
# 1 is the first desktop, 'all' for all desktops
-
-
<layer>normal</layer>
-
# 'above', 'normal', or 'below'
-
-
<iconic>no</iconic>
-
# make the window iconified when it appears, or not
-
-
<skip_pager>no</skip_pager>
-
# asks to not be shown in pagers
-
-
<skip_taskbar>no</skip_taskbar>
-
# asks to not be shown in taskbars. window cycling actions will also
-
# skip past such windows
-
-
<fullscreen>yes</fullscreen>
-
# make the window in fullscreen mode when it appears
-
-
<maximized>true</maximized>
-
# 'Horizontal', 'Vertical' or boolean (yes/no)
-
</application>
-
-
# end of the example
-
-->
-
</applications>
-
</openbox_config>
-78
dots/macchiato.conf
···
-
-
$rosewater = rgb(f4dbd6)
-
$rosewaterAlpha = f4dbd6
-
-
$flamingo = rgb(f0c6c6)
-
$flamingoAlpha = f0c6c6
-
-
$pink = rgb(f5bde6)
-
$pinkAlpha = f5bde6
-
-
$mauve = rgb(c6a0f6)
-
$mauveAlpha = c6a0f6
-
-
$red = rgb(ed8796)
-
$redAlpha = ed8796
-
-
$maroon = rgb(ee99a0)
-
$maroonAlpha = ee99a0
-
-
$peach = rgb(f5a97f)
-
$peachAlpha = f5a97f
-
-
$yellow = rgb(eed49f)
-
$yellowAlpha = eed49f
-
-
$green = rgb(a6da95)
-
$greenAlpha = a6da95
-
-
$teal = rgb(8bd5ca)
-
$tealAlpha = 8bd5ca
-
-
$sky = rgb(91d7e3)
-
$skyAlpha = 91d7e3
-
-
$sapphire = rgb(7dc4e4)
-
$sapphireAlpha = 7dc4e4
-
-
$blue = rgb(8aadf4)
-
$blueAlpha = 8aadf4
-
-
$lavender = rgb(b7bdf8)
-
$lavenderAlpha = b7bdf8
-
-
$text = rgb(cad3f5)
-
$textAlpha = cad3f5
-
-
$subtext1 = rgb(b8c0e0)
-
$subtext1Alpha = b8c0e0
-
-
$subtext0 = rgb(a5adcb)
-
$subtext0Alpha = a5adcb
-
-
$overlay2 = rgb(939ab7)
-
$overlay2Alpha = 939ab7
-
-
$overlay1 = rgb(8087a2)
-
$overlay1Alpha = 8087a2
-
-
$overlay0 = rgb(6e738d)
-
$overlay0Alpha = 6e738d
-
-
$surface2 = rgb(5b6078)
-
$surface2Alpha = 5b6078
-
-
$surface1 = rgb(494d64)
-
$surface1Alpha = 494d64
-
-
$surface0 = rgb(363a4f)
-
$surface0Alpha = 363a4f
-
-
$base = rgb(24273a)
-
$baseAlpha = 24273a
-
-
$mantle = rgb(1e2030)
-
$mantleAlpha = 1e2030
-
-
$crust = rgb(181926)
-
$crustAlpha = 181926
-47
dots/prettify-ss.sh
···
-
#!/bin/bash
-
-
# Define temporary files
-
TEMP_IMAGE=$(mktemp --suffix=.png)
-
SHADOWED_IMAGE=$(mktemp --suffix=.png)
-
MASK_IMAGE=$(mktemp --suffix=.png)
-
GRADIENT_IMAGE=$(mktemp --suffix=.png)
-
FINAL_IMAGE=$(mktemp --suffix=.png)
-
-
# Grab the clipboard image
-
wl-paste --type image/png > "$TEMP_IMAGE"
-
-
# Extract standout colors (3 dominant colors)
-
COLORS=$(magick "$TEMP_IMAGE" -colors 3 -unique-colors txt: | grep -oP '#[0-9A-Fa-f]{6}')
-
COLOR1=$(echo "$COLORS" | head -n 1)
-
COLOR2=$(echo "$COLORS" | tail -n 1 | head -n 1)
-
COLOR3=$(echo "$COLORS" | tail -n 1)
-
-
# Get original image dimensions
-
WIDTH=$(magick identify -format "%w" "$TEMP_IMAGE")
-
HEIGHT=$(magick identify -format "%h" "$TEMP_IMAGE")
-
-
# Create a gradient background with the specified colors
-
MARGIN_PERCENT=10
-
MARGIN_WIDTH=$((WIDTH * MARGIN_PERCENT / 100))
-
MARGIN_HEIGHT=$((HEIGHT * MARGIN_PERCENT / 100))
-
CANVAS_WIDTH=$((WIDTH + 2 * MARGIN_WIDTH))
-
CANVAS_HEIGHT=$((HEIGHT + 2 * MARGIN_HEIGHT))
-
magick -size "${CANVAS_WIDTH}x${CANVAS_HEIGHT}" gradient:"$COLOR1-$COLOR2" "$GRADIENT_IMAGE"
-
-
# Round the image by adding an alpha channel mask
-
magick -size "${WIDTH}x${HEIGHT}" xc:none -draw "roundrectangle 0,0,$WIDTH,$HEIGHT,15,15" "$MASK_IMAGE"
-
magick "$TEMP_IMAGE" -alpha Set "$MASK_IMAGE" -compose DstIn -composite "$TEMP_IMAGE"
-
-
# Add shadow to the image with an offset of +15+15
-
magick "$TEMP_IMAGE" -page +15+15 \( +clone -background black -shadow 60x10+15+15 \) +swap -background none -layers merge +repage "$SHADOWED_IMAGE"
-
-
# Overlay the shadowed image onto the gradient
-
magick "$GRADIENT_IMAGE" "$SHADOWED_IMAGE" -gravity center -composite "$FINAL_IMAGE"
-
-
# Copy the final image back to the clipboard
-
wl-copy < "$FINAL_IMAGE"
-
-
# Clean up temporary files
-
rm "$TEMP_IMAGE" "$MASK_IMAGE" "$SHADOWED_IMAGE" "$GRADIENT_IMAGE" "$FINAL_IMAGE"
-
-
-45
dots/sunpaperconfig
···
-
#################################################
-
# BASIC CONFIGURATION
-
#################################################
-
-
# Set your local latitude and longitude for sun calculations
-
# latitude="44.906658N"
-
# longitude="-86.033386W"
-
-
# Set full path to the wallpaper theme folder
-
# Theme folder names:grep
-
#
-
# Blake Watson & Sunpaper: Corporate-Synergy
-
# Apple: The-Beach The-Cliffs The-Lake The-Desert
-
# Louis Coyle: Lakeside
-
#
-
wallpaperPath="/home/kierank/.config/sunpaper/images/Lakeside"
-
-
#################################################
-
# Animate transitions with SWWW MODE
-
# requires (https://github.com/Horus645/swww)
-
# and Wayland
-
#################################################
-
#
-
# For smooth low memory animated transitions between
-
# images.
-
#
-
# This also resolves the gray flash in Sway whenever changing
-
# wallpaper. (https://github.com/swaywm/sway/issues/3693)
-
#
-
# enable this mode here with
-
# swww_enable="true"
-
swww_enable="true"
-
-
# swww should already be installed and configured.
-
# sunpaper will launch the swww daemon if it's not
-
# already started.
-
-
# swww takes two options for animation control of the
-
# transition between images: frame rate and step (more
-
# info: https://github.com/Horus645/swww/issues/51)
-
#
-
# swww_fps <1 to 255>
-
# swww_step <1 to 255>
-
swww_fps="24"
-
swww_step="1"
-1864
dots/tofi-emoji.sh
···
-
#!/bin/bash
-
-
## All credit goes to github.com/akselaase/tofi-emoji this is a barely modified version of their script
-
-
emoji=$(sed '1,/^### DATA ###$/d' $0 | tofi "$@" | cut -d ' ' -f 1 | tr -d '\n')
-
-
# Check if the command succeeded
-
if [ -n "$emoji" ]; then
-
echo -n $emoji | wtype -
-
echo -n $emoji | wl-copy
-
fi
-
-
exit
-
-
### DATA ###
-
😀 grinning face face smile happy joy :D grin
-
😃 grinning face with big eyes face happy joy haha :D :) smile funny
-
😄 grinning face with smiling eyes face happy joy funny haha laugh like :D :) smile
-
😁 beaming face with smiling eyes face happy smile joy kawaii
-
😆 grinning squinting face happy joy lol satisfied haha face glad XD laugh
-
😅 grinning face with sweat face hot happy laugh sweat smile relief
-
🤣 rolling on the floor laughing face rolling floor laughing lol haha rofl
-
😂 face with tears of joy face cry tears weep happy happytears haha
-
🙂 slightly smiling face face smile
-
🙃 upside down face face flipped silly smile
-
😉 winking face face happy mischievous secret ;) smile eye
-
😊 smiling face with smiling eyes face smile happy flushed crush embarrassed shy joy
-
😇 smiling face with halo face angel heaven halo
-
🥰 smiling face with hearts face love like affection valentines infatuation crush hearts adore
-
😍 smiling face with heart eyes face love like affection valentines infatuation crush heart
-
🤩 star struck face smile starry eyes grinning
-
😘 face blowing a kiss face love like affection valentines infatuation kiss
-
😗 kissing face love like face 3 valentines infatuation kiss
-
☺️ smiling face face blush massage happiness
-
😚 kissing face with closed eyes face love like affection valentines infatuation kiss
-
😙 kissing face with smiling eyes face affection valentines infatuation kiss
-
😋 face savoring food happy joy tongue smile face silly yummy nom delicious savouring
-
😛 face with tongue face prank childish playful mischievous smile tongue
-
😜 winking face with tongue face prank childish playful mischievous smile wink tongue
-
🤪 zany face face goofy crazy
-
😝 squinting face with tongue face prank playful mischievous smile tongue
-
🤑 money mouth face face rich dollar money
-
🤗 hugging face face smile hug
-
🤭 face with hand over mouth face whoops shock surprise
-
🤫 shushing face face quiet shhh
-
🤔 thinking face face hmmm think consider
-
🤐 zipper mouth face face sealed zipper secret
-
🤨 face with raised eyebrow face distrust scepticism disapproval disbelief surprise
-
😐 neutral face indifference meh :| neutral
-
😑 expressionless face face indifferent - - meh deadpan
-
😶 face without mouth face hellokitty
-
😏 smirking face face smile mean prank smug sarcasm
-
😒 unamused face indifference bored straight face serious sarcasm unimpressed skeptical dubious side eye
-
🙄 face with rolling eyes face eyeroll frustrated
-
😬 grimacing face face grimace teeth
-
🤥 lying face face lie pinocchio
-
😌 relieved face face relaxed phew massage happiness
-
😔 pensive face face sad depressed upset
-
😪 sleepy face face tired rest nap
-
🤤 drooling face face
-
😴 sleeping face face tired sleepy night zzz
-
😷 face with medical mask face sick ill disease
-
🤒 face with thermometer sick temperature thermometer cold fever
-
🤕 face with head bandage injured clumsy bandage hurt
-
🤢 nauseated face face vomit gross green sick throw up ill
-
🤮 face vomiting face sick
-
🤧 sneezing face face gesundheit sneeze sick allergy
-
🥵 hot face face feverish heat red sweating
-
🥶 cold face face blue freezing frozen frostbite icicles
-
🥴 woozy face face dizzy intoxicated tipsy wavy
-
😵 dizzy face spent unconscious xox dizzy
-
🤯 exploding head face shocked mind blown
-
🤠 cowboy hat face face cowgirl hat
-
🥳 partying face face celebration woohoo
-
😎 smiling face with sunglasses face cool smile summer beach sunglass
-
🤓 nerd face face nerdy geek dork
-
🧐 face with monocle face stuffy wealthy
-
😕 confused face face indifference huh weird hmmm :/
-
😟 worried face face concern nervous :(
-
🙁 slightly frowning face face frowning disappointed sad upset
-
☹️ frowning face face sad upset frown
-
😮 face with open mouth face surprise impressed wow whoa :O
-
😯 hushed face face woo shh
-
😲 astonished face face xox surprised poisoned
-
😳 flushed face face blush shy flattered
-
🥺 pleading face face begging mercy
-
😦 frowning face with open mouth face aw what
-
😧 anguished face face stunned nervous
-
😨 fearful face face scared terrified nervous oops huh
-
😰 anxious face with sweat face nervous sweat
-
😥 sad but relieved face face phew sweat nervous
-
😢 crying face face tears sad depressed upset :'(
-
😭 loudly crying face face cry tears sad upset depressed sob
-
😱 face screaming in fear face munch scared omg
-
😖 confounded face face confused sick unwell oops :S
-
😣 persevering face face sick no upset oops
-
😞 disappointed face face sad upset depressed :(
-
😓 downcast face with sweat face hot sad tired exercise
-
😩 weary face face tired sleepy sad frustrated upset
-
😫 tired face sick whine upset frustrated
-
🥱 yawning face tired sleepy
-
😤 face with steam from nose face gas phew proud pride
-
😡 pouting face angry mad hate despise
-
😠 angry face mad face annoyed frustrated
-
🤬 face with symbols on mouth face swearing cursing cussing profanity expletive
-
😈 smiling face with horns devil horns
-
👿 angry face with horns devil angry horns
-
💀 skull dead skeleton creepy death
-
☠️ skull and crossbones poison danger deadly scary death pirate evil
-
💩 pile of poo hankey shitface fail turd shit
-
🤡 clown face face
-
👹 ogre monster red mask halloween scary creepy devil demon japanese ogre
-
👺 goblin red evil mask monster scary creepy japanese goblin
-
👻 ghost halloween spooky scary
-
👽 alien UFO paul weird outer space
-
👾 alien monster game arcade play
-
🤖 robot computer machine bot
-
😺 grinning cat animal cats happy smile
-
😸 grinning cat with smiling eyes animal cats smile
-
😹 cat with tears of joy animal cats haha happy tears
-
😻 smiling cat with heart eyes animal love like affection cats valentines heart
-
😼 cat with wry smile animal cats smirk
-
😽 kissing cat animal cats kiss
-
🙀 weary cat animal cats munch scared scream
-
😿 crying cat animal tears weep sad cats upset cry
-
😾 pouting cat animal cats
-
🙈 see no evil monkey monkey animal nature haha
-
🙉 hear no evil monkey animal monkey nature
-
🙊 speak no evil monkey monkey animal nature omg
-
💋 kiss mark face lips love like affection valentines
-
💌 love letter email like affection envelope valentines
-
💘 heart with arrow love like heart affection valentines
-
💝 heart with ribbon love valentines
-
💖 sparkling heart love like affection valentines
-
💗 growing heart like love affection valentines pink
-
💓 beating heart love like affection valentines pink heart
-
💞 revolving hearts love like affection valentines
-
💕 two hearts love like affection valentines heart
-
💟 heart decoration purple-square love like
-
❣️ heart exclamation decoration love
-
💔 broken heart sad sorry break heart heartbreak
-
❤️ red heart love like valentines
-
🧡 orange heart love like affection valentines
-
💛 yellow heart love like affection valentines
-
💚 green heart love like affection valentines
-
💙 blue heart love like affection valentines
-
💜 purple heart love like affection valentines
-
🤎 brown heart coffee
-
🖤 black heart evil
-
🤍 white heart pure
-
💯 hundred points score perfect numbers century exam quiz test pass hundred
-
💢 anger symbol angry mad
-
💥 collision bomb explode explosion collision blown
-
💫 dizzy star sparkle shoot magic
-
💦 sweat droplets water drip oops
-
💨 dashing away wind air fast shoo fart smoke puff
-
🕳️ hole embarrassing
-
💣 bomb boom explode explosion terrorism
-
💬 speech balloon bubble words message talk chatting
-
👁️‍🗨️ eye in speech bubble info
-
🗨️ left speech bubble words message talk chatting
-
🗯️ right anger bubble caption speech thinking mad
-
💭 thought balloon bubble cloud speech thinking dream
-
💤 zzz sleepy tired dream
-
👋 waving hand hands gesture goodbye solong farewell hello hi palm
-
🤚 raised back of hand fingers raised backhand
-
🖐️ hand with fingers splayed hand fingers palm
-
✋ raised hand fingers stop highfive palm ban
-
🖖 vulcan salute hand fingers spock star trek
-
👌 ok hand fingers limbs perfect ok okay
-
🤏 pinching hand tiny small size
-
✌️ victory hand fingers ohyeah hand peace victory two
-
🤞 crossed fingers good lucky
-
🤟 love you gesture hand fingers gesture
-
🤘 sign of the horns hand fingers evil eye sign of horns rock on
-
🤙 call me hand hands gesture shaka
-
👈 backhand index pointing left direction fingers hand left
-
👉 backhand index pointing right fingers hand direction right
-
👆 backhand index pointing up fingers hand direction up
-
🖕 middle finger hand fingers rude middle flipping
-
👇 backhand index pointing down fingers hand direction down
-
☝️ index pointing up hand fingers direction up
-
👍 thumbs up thumbsup yes awesome good agree accept cool hand like +1
-
👎 thumbs down thumbsdown no dislike hand -1
-
✊ raised fist fingers hand grasp
-
👊 oncoming fist angry violence fist hit attack hand
-
🤛 left facing fist hand fistbump
-
🤜 right facing fist hand fistbump
-
👏 clapping hands hands praise applause congrats yay
-
🙌 raising hands gesture hooray yea celebration hands
-
👐 open hands fingers butterfly hands open
-
🤲 palms up together hands gesture cupped prayer
-
🤝 handshake agreement shake
-
🙏 folded hands please hope wish namaste highfive pray
-
✍️ writing hand lower left ballpoint pen stationery write compose
-
💅 nail polish beauty manicure finger fashion nail
-
🤳 selfie camera phone
-
💪 flexed biceps arm flex hand summer strong biceps
-
🦾 mechanical arm accessibility
-
🦿 mechanical leg accessibility
-
🦵 leg kick limb
-
🦶 foot kick stomp
-
👂 ear face hear sound listen
-
🦻 ear with hearing aid accessibility
-
👃 nose smell sniff
-
🧠 brain smart intelligent
-
🦷 tooth teeth dentist
-
🦴 bone skeleton
-
👀 eyes look watch stalk peek see
-
👁️ eye face look see watch stare
-
👅 tongue mouth playful
-
👄 mouth mouth kiss
-
👶 baby child boy girl toddler
-
🧒 child gender-neutral young
-
👦 boy man male guy teenager
-
👧 girl female woman teenager
-
🧑 person gender-neutral person
-
👱 person blond hair hairstyle
-
👨 man mustache father dad guy classy sir moustache
-
🧔 man beard person bewhiskered
-
👨‍🦰 man red hair hairstyle
-
👨‍🦱 man curly hair hairstyle
-
👨‍🦳 man white hair old elder
-
👨‍🦲 man bald hairless
-
👩 woman female girls lady
-
👩‍🦰 woman red hair hairstyle
-
🧑‍🦰 person red hair hairstyle
-
👩‍🦱 woman curly hair hairstyle
-
🧑‍🦱 person curly hair hairstyle
-
👩‍🦳 woman white hair old elder
-
🧑‍🦳 person white hair elder old
-
👩‍🦲 woman bald hairless
-
🧑‍🦲 person bald hairless
-
👱‍♀️ woman blond hair woman female girl blonde person
-
👱‍♂️ man blond hair man male boy blonde guy person
-
🧓 older person human elder senior gender-neutral
-
👴 old man human male men old elder senior
-
👵 old woman human female women lady old elder senior
-
🙍 person frowning worried
-
🙍‍♂️ man frowning male boy man sad depressed discouraged unhappy
-
🙍‍♀️ woman frowning female girl woman sad depressed discouraged unhappy
-
🙎 person pouting upset
-
🙎‍♂️ man pouting male boy man
-
🙎‍♀️ woman pouting female girl woman
-
🙅 person gesturing no decline
-
🙅‍♂️ man gesturing no male boy man nope
-
🙅‍♀️ woman gesturing no female girl woman nope
-
🙆 person gesturing ok agree
-
🙆‍♂️ man gesturing ok men boy male blue human man
-
🙆‍♀️ woman gesturing ok women girl female pink human woman
-
💁 person tipping hand information
-
💁‍♂️ man tipping hand male boy man human information
-
💁‍♀️ woman tipping hand female girl woman human information
-
🙋 person raising hand question
-
🙋‍♂️ man raising hand male boy man
-
🙋‍♀️ woman raising hand female girl woman
-
🧏 deaf person accessibility
-
🧏‍♂️ deaf man accessibility
-
🧏‍♀️ deaf woman accessibility
-
🙇 person bowing respectiful
-
🙇‍♂️ man bowing man male boy
-
🙇‍♀️ woman bowing woman female girl
-
🤦 person facepalming disappointed
-
🤦‍♂️ man facepalming man male boy disbelief
-
🤦‍♀️ woman facepalming woman female girl disbelief
-
🤷 person shrugging regardless
-
🤷‍♂️ man shrugging man male boy confused indifferent doubt
-
🤷‍♀️ woman shrugging woman female girl confused indifferent doubt
-
🧑‍⚕️ health worker hospital
-
👨‍⚕️ man health worker doctor nurse therapist healthcare man human
-
👩‍⚕️ woman health worker doctor nurse therapist healthcare woman human
-
🧑‍🎓 student learn
-
👨‍🎓 man student graduate man human
-
👩‍🎓 woman student graduate woman human
-
🧑‍🏫 teacher professor
-
👨‍🏫 man teacher instructor professor man human
-
👩‍🏫 woman teacher instructor professor woman human
-
🧑‍⚖️ judge law
-
👨‍⚖️ man judge justice court man human
-
👩‍⚖️ woman judge justice court woman human
-
🧑‍🌾 farmer crops
-
👨‍🌾 man farmer rancher gardener man human
-
👩‍🌾 woman farmer rancher gardener woman human
-
🧑‍🍳 cook food kitchen culinary
-
👨‍🍳 man cook chef man human
-
👩‍🍳 woman cook chef woman human
-
🧑‍🔧 mechanic worker technician
-
👨‍🔧 man mechanic plumber man human wrench
-
👩‍🔧 woman mechanic plumber woman human wrench
-
🧑‍🏭 factory worker labor
-
👨‍🏭 man factory worker assembly industrial man human
-
👩‍🏭 woman factory worker assembly industrial woman human
-
🧑‍💼 office worker business
-
👨‍💼 man office worker business manager man human
-
👩‍💼 woman office worker business manager woman human
-
🧑‍🔬 scientist chemistry
-
👨‍🔬 man scientist biologist chemist engineer physicist man human
-
👩‍🔬 woman scientist biologist chemist engineer physicist woman human
-
🧑‍💻 technologist computer
-
👨‍💻 man technologist coder developer engineer programmer software man human laptop computer
-
👩‍💻 woman technologist coder developer engineer programmer software woman human laptop computer
-
🧑‍🎤 singer song artist performer
-
👨‍🎤 man singer rockstar entertainer man human
-
👩‍🎤 woman singer rockstar entertainer woman human
-
🧑‍🎨 artist painting draw creativity
-
👨‍🎨 man artist painter man human
-
👩‍🎨 woman artist painter woman human
-
🧑‍✈️ pilot fly plane airplane
-
👨‍✈️ man pilot aviator plane man human
-
👩‍✈️ woman pilot aviator plane woman human
-
🧑‍🚀 astronaut outerspace
-
👨‍🚀 man astronaut space rocket man human
-
👩‍🚀 woman astronaut space rocket woman human
-
🧑‍🚒 firefighter fire
-
👨‍🚒 man firefighter fireman man human
-
👩‍🚒 woman firefighter fireman woman human
-
👮 police officer cop
-
👮‍♂️ man police officer man police law legal enforcement arrest 911
-
👮‍♀️ woman police officer woman police law legal enforcement arrest 911 female
-
🕵️ detective human spy detective
-
🕵️‍♂️ man detective crime
-
🕵️‍♀️ woman detective human spy detective female woman
-
💂 guard protect
-
💂‍♂️ man guard uk gb british male guy royal
-
💂‍♀️ woman guard uk gb british female royal woman
-
👷 construction worker labor build
-
👷‍♂️ man construction worker male human wip guy build construction worker labor
-
👷‍♀️ woman construction worker female human wip build construction worker labor woman
-
🤴 prince boy man male crown royal king
-
👸 princess girl woman female blond crown royal queen
-
👳 person wearing turban headdress
-
👳‍♂️ man wearing turban male indian hinduism arabs
-
👳‍♀️ woman wearing turban female indian hinduism arabs woman
-
👲 man with skullcap male boy chinese
-
🧕 woman with headscarf female hijab mantilla tichel
-
🤵 man in tuxedo couple marriage wedding groom
-
👰 bride with veil couple marriage wedding woman bride
-
🤰 pregnant woman baby
-
🤱 breast feeding nursing baby
-
👼 baby angel heaven wings halo
-
🎅 santa claus festival man male xmas father christmas
-
🤶 mrs claus woman female xmas mother christmas
-
🦸 superhero marvel
-
🦸‍♂️ man superhero man male good hero superpowers
-
🦸‍♀️ woman superhero woman female good heroine superpowers
-
🦹 supervillain marvel
-
🦹‍♂️ man supervillain man male evil bad criminal hero superpowers
-
🦹‍♀️ woman supervillain woman female evil bad criminal heroine superpowers
-
🧙 mage magic
-
🧙‍♂️ man mage man male mage sorcerer
-
🧙‍♀️ woman mage woman female mage witch
-
🧚 fairy wings magical
-
🧚‍♂️ man fairy man male
-
🧚‍♀️ woman fairy woman female
-
🧛 vampire blood twilight
-
🧛‍♂️ man vampire man male dracula
-
🧛‍♀️ woman vampire woman female
-
🧜 merperson sea
-
🧜‍♂️ merman man male triton
-
🧜‍♀️ mermaid woman female merwoman ariel
-
🧝 elf magical
-
🧝‍♂️ man elf man male
-
🧝‍♀️ woman elf woman female
-
🧞 genie magical wishes
-
🧞‍♂️ man genie man male
-
🧞‍♀️ woman genie woman female
-
🧟 zombie dead
-
🧟‍♂️ man zombie man male dracula undead walking dead
-
🧟‍♀️ woman zombie woman female undead walking dead
-
💆 person getting massage relax
-
💆‍♂️ man getting massage male boy man head
-
💆‍♀️ woman getting massage female girl woman head
-
💇 person getting haircut hairstyle
-
💇‍♂️ man getting haircut male boy man
-
💇‍♀️ woman getting haircut female girl woman
-
🚶 person walking move
-
🚶‍♂️ man walking human feet steps
-
🚶‍♀️ woman walking human feet steps woman female
-
🧍 person standing still
-
🧍‍♂️ man standing still
-
🧍‍♀️ woman standing still
-
🧎 person kneeling pray respectful
-
🧎‍♂️ man kneeling pray respectful
-
🧎‍♀️ woman kneeling respectful pray
-
🧑‍🦯 person with probing cane blind
-
👨‍🦯 man with probing cane blind
-
👩‍🦯 woman with probing cane blind
-
🧑‍🦼 person in motorized wheelchair disability accessibility
-
👨‍🦼 man in motorized wheelchair disability accessibility
-
👩‍🦼 woman in motorized wheelchair disability accessibility
-
🧑‍🦽 person in manual wheelchair disability accessibility
-
👨‍🦽 man in manual wheelchair disability accessibility
-
👩‍🦽 woman in manual wheelchair disability accessibility
-
🏃 person running move
-
🏃‍♂️ man running man walking exercise race running
-
🏃‍♀️ woman running woman walking exercise race running female
-
💃 woman dancing female girl woman fun
-
🕺 man dancing male boy fun dancer
-
🕴️ man in suit levitating suit business levitate hover jump
-
👯 people with bunny ears perform costume
-
👯‍♂️ men with bunny ears male bunny men boys
-
👯‍♀️ women with bunny ears female bunny women girls
-
🧖 person in steamy room relax spa
-
🧖‍♂️ man in steamy room male man spa steamroom sauna
-
🧖‍♀️ woman in steamy room female woman spa steamroom sauna
-
🧗 person climbing sport
-
🧗‍♂️ man climbing sports hobby man male rock
-
🧗‍♀️ woman climbing sports hobby woman female rock
-
🤺 person fencing sports fencing sword
-
🏇 horse racing animal betting competition gambling luck
-
⛷️ skier sports winter snow
-
🏂 snowboarder sports winter
-
🏌️ person golfing sports business
-
🏌️‍♂️ man golfing sport
-
🏌️‍♀️ woman golfing sports business woman female
-
🏄 person surfing sport sea
-
🏄‍♂️ man surfing sports ocean sea summer beach
-
🏄‍♀️ woman surfing sports ocean sea summer beach woman female
-
🚣 person rowing boat sport move
-
🚣‍♂️ man rowing boat sports hobby water ship
-
🚣‍♀️ woman rowing boat sports hobby water ship woman female
-
🏊 person swimming sport pool
-
🏊‍♂️ man swimming sports exercise human athlete water summer
-
🏊‍♀️ woman swimming sports exercise human athlete water summer woman female
-
⛹️ person bouncing ball sports human
-
⛹️‍♂️ man bouncing ball sport
-
⛹️‍♀️ woman bouncing ball sports human woman female
-
🏋️ person lifting weights sports training exercise
-
🏋️‍♂️ man lifting weights sport
-
🏋️‍♀️ woman lifting weights sports training exercise woman female
-
🚴 person biking sport move
-
🚴‍♂️ man biking sports bike exercise hipster
-
🚴‍♀️ woman biking sports bike exercise hipster woman female
-
🚵 person mountain biking sport move
-
🚵‍♂️ man mountain biking transportation sports human race bike
-
🚵‍♀️ woman mountain biking transportation sports human race bike woman female
-
🤸 person cartwheeling sport gymnastic
-
🤸‍♂️ man cartwheeling gymnastics
-
🤸‍♀️ woman cartwheeling gymnastics
-
🤼 people wrestling sport
-
🤼‍♂️ men wrestling sports wrestlers
-
🤼‍♀️ women wrestling sports wrestlers
-
🤽 person playing water polo sport
-
🤽‍♂️ man playing water polo sports pool
-
🤽‍♀️ woman playing water polo sports pool
-
🤾 person playing handball sport
-
🤾‍♂️ man playing handball sports
-
🤾‍♀️ woman playing handball sports
-
🤹 person juggling performance balance
-
🤹‍♂️ man juggling juggle balance skill multitask
-
🤹‍♀️ woman juggling juggle balance skill multitask
-
🧘 person in lotus position meditate
-
🧘‍♂️ man in lotus position man male meditation yoga serenity zen mindfulness
-
🧘‍♀️ woman in lotus position woman female meditation yoga serenity zen mindfulness
-
🛀 person taking bath clean shower bathroom
-
🛌 person in bed bed rest
-
🧑‍🤝‍🧑 people holding hands friendship
-
👭 women holding hands pair friendship couple love like female people human
-
👫 woman and man holding hands pair people human love date dating like affection valentines marriage
-
👬 men holding hands pair couple love like bromance friendship people human
-
💏 kiss pair valentines love like dating marriage
-
👩‍❤️‍💋‍👨 kiss woman man love
-
👨‍❤️‍💋‍👨 kiss man man pair valentines love like dating marriage
-
👩‍❤️‍💋‍👩 kiss woman woman pair valentines love like dating marriage
-
💑 couple with heart pair love like affection human dating valentines marriage
-
👩‍❤️‍👨 couple with heart woman man love
-
👨‍❤️‍👨 couple with heart man man pair love like affection human dating valentines marriage
-
👩‍❤️‍👩 couple with heart woman woman pair love like affection human dating valentines marriage
-
👪 family home parents child mom dad father mother people human
-
👨‍👩‍👦 family man woman boy love
-
👨‍👩‍👧 family man woman girl home parents people human child
-
👨‍👩‍👧‍👦 family man woman girl boy home parents people human children
-
👨‍👩‍👦‍👦 family man woman boy boy home parents people human children
-
👨‍👩‍👧‍👧 family man woman girl girl home parents people human children
-
👨‍👨‍👦 family man man boy home parents people human children
-
👨‍👨‍👧 family man man girl home parents people human children
-
👨‍👨‍👧‍👦 family man man girl boy home parents people human children
-
👨‍👨‍👦‍👦 family man man boy boy home parents people human children
-
👨‍👨‍👧‍👧 family man man girl girl home parents people human children
-
👩‍👩‍👦 family woman woman boy home parents people human children
-
👩‍👩‍👧 family woman woman girl home parents people human children
-
👩‍👩‍👧‍👦 family woman woman girl boy home parents people human children
-
👩‍👩‍👦‍👦 family woman woman boy boy home parents people human children
-
👩‍👩‍👧‍👧 family woman woman girl girl home parents people human children
-
👨‍👦 family man boy home parent people human child
-
👨‍👦‍👦 family man boy boy home parent people human children
-
👨‍👧 family man girl home parent people human child
-
👨‍👧‍👦 family man girl boy home parent people human children
-
👨‍👧‍👧 family man girl girl home parent people human children
-
👩‍👦 family woman boy home parent people human child
-
👩‍👦‍👦 family woman boy boy home parent people human children
-
👩‍👧 family woman girl home parent people human child
-
👩‍👧‍👦 family woman girl boy home parent people human children
-
👩‍👧‍👧 family woman girl girl home parent people human children
-
🗣️ speaking head user person human sing say talk
-
👤 bust in silhouette user person human
-
👥 busts in silhouette user person human group team
-
👣 footprints feet tracking walking beach
-
🐵 monkey face animal nature circus
-
🐒 monkey animal nature banana circus
-
🦍 gorilla animal nature circus
-
🦧 orangutan animal
-
🐶 dog face animal friend nature woof puppy pet faithful
-
🐕 dog animal nature friend doge pet faithful
-
🦮 guide dog animal blind
-
🐕‍🦺 service dog blind animal
-
🐩 poodle dog animal 101 nature pet
-
🐺 wolf animal nature wild
-
🦊 fox animal nature face
-
🦝 raccoon animal nature
-
🐱 cat face animal meow nature pet kitten
-
🐈 cat animal meow pet cats
-
🦁 lion animal nature
-
🐯 tiger face animal cat danger wild nature roar
-
🐅 tiger animal nature roar
-
🐆 leopard animal nature
-
🐴 horse face animal brown nature
-
🐎 horse animal gamble luck
-
🦄 unicorn animal nature mystical
-
🦓 zebra animal nature stripes safari
-
🦌 deer animal nature horns venison
-
🐮 cow face beef ox animal nature moo milk
-
🐂 ox animal cow beef
-
🐃 water buffalo animal nature ox cow
-
🐄 cow beef ox animal nature moo milk
-
🐷 pig face animal oink nature
-
🐖 pig animal nature
-
🐗 boar animal nature
-
🐽 pig nose animal oink
-
🐏 ram animal sheep nature
-
🐑 ewe animal nature wool shipit
-
🐐 goat animal nature
-
🐪 camel animal hot desert hump
-
🐫 two hump camel animal nature hot desert hump
-
🦙 llama animal nature alpaca
-
🦒 giraffe animal nature spots safari
-
🐘 elephant animal nature nose th circus
-
🦏 rhinoceros animal nature horn
-
🦛 hippopotamus animal nature
-
🐭 mouse face animal nature cheese wedge rodent
-
🐁 mouse animal nature rodent
-
🐀 rat animal mouse rodent
-
🐹 hamster animal nature
-
🐰 rabbit face animal nature pet spring magic bunny
-
🐇 rabbit animal nature pet magic spring
-
🐿️ chipmunk animal nature rodent squirrel
-
🦔 hedgehog animal nature spiny
-
🦇 bat animal nature blind vampire
-
🐻 bear animal nature wild
-
🐨 koala animal nature
-
🐼 panda animal nature panda
-
🦥 sloth animal
-
🦦 otter animal
-
🦨 skunk animal
-
🦘 kangaroo animal nature australia joey hop marsupial
-
🦡 badger animal nature honey
-
🐾 paw prints animal tracking footprints dog cat pet feet
-
🦃 turkey animal bird
-
🐔 chicken animal cluck nature bird
-
🐓 rooster animal nature chicken
-
🐣 hatching chick animal chicken egg born baby bird
-
🐤 baby chick animal chicken bird
-
🐥 front facing baby chick animal chicken baby bird
-
🐦 bird animal nature fly tweet spring
-
🐧 penguin animal nature
-
🕊️ dove animal bird
-
🦅 eagle animal nature bird
-
🦆 duck animal nature bird mallard
-
🦢 swan animal nature bird
-
🦉 owl animal nature bird hoot
-
🦩 flamingo animal
-
🦚 peacock animal nature peahen bird
-
🦜 parrot animal nature bird pirate talk
-
🐸 frog animal nature croak toad
-
🐊 crocodile animal nature reptile lizard alligator
-
🐢 turtle animal slow nature tortoise
-
🦎 lizard animal nature reptile
-
🐍 snake animal evil nature hiss python
-
🐲 dragon face animal myth nature chinese green
-
🐉 dragon animal myth nature chinese green
-
🦕 sauropod animal nature dinosaur brachiosaurus brontosaurus diplodocus extinct
-
🦖 t rex animal nature dinosaur tyrannosaurus extinct
-
🐳 spouting whale animal nature sea ocean
-
🐋 whale animal nature sea ocean
-
🐬 dolphin animal nature fish sea ocean flipper fins beach
-
🐟 fish animal food nature
-
🐠 tropical fish animal swim ocean beach nemo
-
🐡 blowfish animal nature food sea ocean
-
🦈 shark animal nature fish sea ocean jaws fins beach
-
🐙 octopus animal creature ocean sea nature beach
-
🐚 spiral shell nature sea beach
-
🐌 snail slow animal shell
-
🦋 butterfly animal insect nature caterpillar
-
🐛 bug animal insect nature worm
-
🐜 ant animal insect nature bug
-
🐝 honeybee animal insect nature bug spring honey
-
🐞 lady beetle animal insect nature ladybug
-
🦗 cricket animal cricket chirp
-
🕷️ spider animal arachnid
-
🕸️ spider web animal insect arachnid silk
-
🦂 scorpion animal arachnid
-
🦟 mosquito animal nature insect malaria
-
🦠 microbe amoeba bacteria germs virus
-
💐 bouquet flowers nature spring
-
🌸 cherry blossom nature plant spring flower
-
💮 white flower japanese spring
-
🏵️ rosette flower decoration military
-
🌹 rose flowers valentines love spring
-
🥀 wilted flower plant nature flower
-
🌺 hibiscus plant vegetable flowers beach
-
🌻 sunflower nature plant fall
-
🌼 blossom nature flowers yellow
-
🌷 tulip flowers plant nature summer spring
-
🌱 seedling plant nature grass lawn spring
-
🌲 evergreen tree plant nature
-
🌳 deciduous tree plant nature
-
🌴 palm tree plant vegetable nature summer beach mojito tropical
-
🌵 cactus vegetable plant nature
-
🌾 sheaf of rice nature plant
-
🌿 herb vegetable plant medicine weed grass lawn
-
☘️ shamrock vegetable plant nature irish clover
-
🍀 four leaf clover vegetable plant nature lucky irish
-
🍁 maple leaf nature plant vegetable ca fall
-
🍂 fallen leaf nature plant vegetable leaves
-
🍃 leaf fluttering in wind nature plant tree vegetable grass lawn spring
-
🍇 grapes fruit food wine
-
🍈 melon fruit nature food
-
🍉 watermelon fruit food picnic summer
-
🍊 tangerine food fruit nature orange
-
🍋 lemon fruit nature
-
🍌 banana fruit food monkey
-
🍍 pineapple fruit nature food
-
🥭 mango fruit food tropical
-
🍎 red apple fruit mac school
-
🍏 green apple fruit nature
-
🍐 pear fruit nature food
-
🍑 peach fruit nature food
-
🍒 cherries food fruit
-
🍓 strawberry fruit food nature
-
🥝 kiwi fruit fruit food
-
🍅 tomato fruit vegetable nature food
-
🥥 coconut fruit nature food palm
-
🥑 avocado fruit food
-
🍆 eggplant vegetable nature food aubergine
-
🥔 potato food tuber vegatable starch
-
🥕 carrot vegetable food orange
-
🌽 ear of corn food vegetable plant
-
🌶️ hot pepper food spicy chilli chili
-
🥒 cucumber fruit food pickle
-
🥬 leafy green food vegetable plant bok choy cabbage kale lettuce
-
🥦 broccoli fruit food vegetable
-
🧄 garlic food spice cook
-
🧅 onion cook food spice
-
🍄 mushroom plant vegetable
-
🥜 peanuts food nut
-
🌰 chestnut food squirrel
-
🍞 bread food wheat breakfast toast
-
🥐 croissant food bread french
-
🥖 baguette bread food bread french
-
🥨 pretzel food bread twisted
-
🥯 bagel food bread bakery schmear
-
🥞 pancakes food breakfast flapjacks hotcakes
-
🧇 waffle food breakfast
-
🧀 cheese wedge food chadder
-
🍖 meat on bone good food drumstick
-
🍗 poultry leg food meat drumstick bird chicken turkey
-
🥩 cut of meat food cow meat cut chop lambchop porkchop
-
🥓 bacon food breakfast pork pig meat
-
🍔 hamburger meat fast food beef cheeseburger mcdonalds burger king
-
🍟 french fries chips snack fast food
-
🍕 pizza food party
-
🌭 hot dog food frankfurter
-
🥪 sandwich food lunch bread
-
🌮 taco food mexican
-
🌯 burrito food mexican
-
🥙 stuffed flatbread food flatbread stuffed gyro
-
🧆 falafel food
-
🥚 egg food chicken breakfast
-
🍳 cooking food breakfast kitchen egg
-
🥘 shallow pan of food food cooking casserole paella
-
🍲 pot of food food meat soup
-
🥣 bowl with spoon food breakfast cereal oatmeal porridge
-
🥗 green salad food healthy lettuce
-
🍿 popcorn food movie theater films snack
-
🧈 butter food cook
-
🧂 salt condiment shaker
-
🥫 canned food food soup
-
🍱 bento box food japanese box
-
🍘 rice cracker food japanese
-
🍙 rice ball food japanese
-
🍚 cooked rice food china asian
-
🍛 curry rice food spicy hot indian
-
🍜 steaming bowl food japanese noodle chopsticks
-
🍝 spaghetti food italian noodle
-
🍠 roasted sweet potato food nature
-
🍢 oden food japanese
-
🍣 sushi food fish japanese rice
-
🍤 fried shrimp food animal appetizer summer
-
🍥 fish cake with swirl food japan sea beach narutomaki pink swirl kamaboko surimi ramen
-
🥮 moon cake food autumn
-
🍡 dango food dessert sweet japanese barbecue meat
-
🥟 dumpling food empanada pierogi potsticker
-
🥠 fortune cookie food prophecy
-
🥡 takeout box food leftovers
-
🦀 crab animal crustacean
-
🦞 lobster animal nature bisque claws seafood
-
🦐 shrimp animal ocean nature seafood
-
🦑 squid animal nature ocean sea
-
🦪 oyster food
-
🍦 soft ice cream food hot dessert summer
-
🍧 shaved ice hot dessert summer
-
🍨 ice cream food hot dessert
-
🍩 doughnut food dessert snack sweet donut
-
🍪 cookie food snack oreo chocolate sweet dessert
-
🎂 birthday cake food dessert cake
-
🍰 shortcake food dessert
-
🧁 cupcake food dessert bakery sweet
-
🥧 pie food dessert pastry
-
🍫 chocolate bar food snack dessert sweet
-
🍬 candy snack dessert sweet lolly
-
🍭 lollipop food snack candy sweet
-
🍮 custard dessert food
-
🍯 honey pot bees sweet kitchen
-
🍼 baby bottle food container milk
-
🥛 glass of milk beverage drink cow
-
☕ hot beverage beverage caffeine latte espresso coffee
-
🍵 teacup without handle drink bowl breakfast green british
-
🍶 sake wine drink drunk beverage japanese alcohol booze
-
🍾 bottle with popping cork drink wine bottle celebration
-
🍷 wine glass drink beverage drunk alcohol booze
-
🍸 cocktail glass drink drunk alcohol beverage booze mojito
-
🍹 tropical drink beverage cocktail summer beach alcohol booze mojito
-
🍺 beer mug relax beverage drink drunk party pub summer alcohol booze
-
🍻 clinking beer mugs relax beverage drink drunk party pub summer alcohol booze
-
🥂 clinking glasses beverage drink party alcohol celebrate cheers wine champagne toast
-
🥃 tumbler glass drink beverage drunk alcohol liquor booze bourbon scotch whisky glass shot
-
🥤 cup with straw drink soda
-
🧃 beverage box drink
-
🧉 mate drink tea beverage
-
🧊 ice water cold
-
🥢 chopsticks food
-
🍽️ fork and knife with plate food eat meal lunch dinner restaurant
-
🍴 fork and knife cutlery kitchen
-
🥄 spoon cutlery kitchen tableware
-
🔪 kitchen knife knife blade cutlery kitchen weapon
-
🏺 amphora vase jar
-
🌍 globe showing europe africa globe world international
-
🌎 globe showing americas globe world USA international
-
🌏 globe showing asia australia globe world east international
-
🌐 globe with meridians earth international world internet interweb i18n
-
🗺️ world map location direction
-
🗾 map of japan nation country japanese asia
-
🧭 compass magnetic navigation orienteering
-
🏔️ snow capped mountain photo nature environment winter cold
-
⛰️ mountain photo nature environment
-
🌋 volcano photo nature disaster
-
🗻 mount fuji photo mountain nature japanese
-
🏕️ camping photo outdoors tent
-
🏖️ beach with umbrella weather summer sunny sand mojito
-
🏜️ desert photo warm saharah
-
🏝️ desert island photo tropical mojito
-
🏞️ national park photo environment nature
-
🏟️ stadium photo place sports concert venue
-
🏛️ classical building art culture history
-
🏗️ building construction wip working progress
-
🧱 brick bricks
-
🏘️ houses buildings photo
-
🏚️ derelict house abandon evict broken building
-
🏠 house building home
-
🏡 house with garden home plant nature
-
🏢 office building building bureau work
-
🏣 japanese post office building envelope communication
-
🏤 post office building email
-
🏥 hospital building health surgery doctor
-
🏦 bank building money sales cash business enterprise
-
🏨 hotel building accomodation checkin
-
🏩 love hotel like affection dating
-
🏪 convenience store building shopping groceries
-
🏫 school building student education learn teach
-
🏬 department store building shopping mall
-
🏭 factory building industry pollution smoke
-
🏯 japanese castle photo building
-
🏰 castle building royalty history
-
💒 wedding love like affection couple marriage bride groom
-
🗼 tokyo tower photo japanese
-
🗽 statue of liberty american newyork
-
⛪ church building religion christ
-
🕌 mosque islam worship minaret
-
🛕 hindu temple religion
-
🕍 synagogue judaism worship temple jewish
-
⛩️ shinto shrine temple japan kyoto
-
🕋 kaaba mecca mosque islam
-
⛲ fountain photo summer water fresh
-
⛺ tent photo camping outdoors
-
🌁 foggy photo mountain
-
🌃 night with stars evening city downtown
-
🏙️ cityscape photo night life urban
-
🌄 sunrise over mountains view vacation photo
-
🌅 sunrise morning view vacation photo
-
🌆 cityscape at dusk photo evening sky buildings
-
🌇 sunset photo good morning dawn
-
🌉 bridge at night photo sanfrancisco
-
♨️ hot springs bath warm relax
-
🎠 carousel horse photo carnival
-
🎡 ferris wheel photo carnival londoneye
-
🎢 roller coaster carnival playground photo fun
-
💈 barber pole hair salon style
-
🎪 circus tent festival carnival party
-
🚂 locomotive transportation vehicle train
-
🚃 railway car transportation vehicle
-
🚄 high speed train transportation vehicle
-
🚅 bullet train transportation vehicle speed fast public travel
-
🚆 train transportation vehicle
-
🚇 metro transportation blue-square mrt underground tube
-
🚈 light rail transportation vehicle
-
🚉 station transportation vehicle public
-
🚊 tram transportation vehicle
-
🚝 monorail transportation vehicle
-
🚞 mountain railway transportation vehicle
-
🚋 tram car transportation vehicle carriage public travel
-
🚌 bus car vehicle transportation
-
🚍 oncoming bus vehicle transportation
-
🚎 trolleybus bart transportation vehicle
-
🚐 minibus vehicle car transportation
-
🚑 ambulance health 911 hospital
-
🚒 fire engine transportation cars vehicle
-
🚓 police car vehicle cars transportation law legal enforcement
-
🚔 oncoming police car vehicle law legal enforcement 911
-
🚕 taxi uber vehicle cars transportation
-
🚖 oncoming taxi vehicle cars uber
-
🚗 automobile red transportation vehicle
-
🚘 oncoming automobile car vehicle transportation
-
🚙 sport utility vehicle transportation vehicle
-
🚚 delivery truck cars transportation
-
🚛 articulated lorry vehicle cars transportation express
-
🚜 tractor vehicle car farming agriculture
-
🏎️ racing car sports race fast formula f1
-
🏍️ motorcycle race sports fast
-
🛵 motor scooter vehicle vespa sasha
-
🦽 manual wheelchair accessibility
-
🦼 motorized wheelchair accessibility
-
🛺 auto rickshaw move transportation
-
🚲 bicycle sports bicycle exercise hipster
-
🛴 kick scooter vehicle kick razor
-
🛹 skateboard board
-
🚏 bus stop transportation wait
-
🛣️ motorway road cupertino interstate highway
-
🛤️ railway track train transportation
-
🛢️ oil drum barrell
-
⛽ fuel pump gas station petroleum
-
🚨 police car light police ambulance 911 emergency alert error pinged law legal
-
🚥 horizontal traffic light transportation signal
-
🚦 vertical traffic light transportation driving
-
🛑 stop sign stop
-
🚧 construction wip progress caution warning
-
⚓ anchor ship ferry sea boat
-
⛵ sailboat ship summer transportation water sailing
-
🛶 canoe boat paddle water ship
-
🚤 speedboat ship transportation vehicle summer
-
🛳️ passenger ship yacht cruise ferry
-
⛴️ ferry boat ship yacht
-
🛥️ motor boat ship
-
🚢 ship transportation titanic deploy
-
✈️ airplane vehicle transportation flight fly
-
🛩️ small airplane flight transportation fly vehicle
-
🛫 airplane departure airport flight landing
-
🛬 airplane arrival airport flight boarding
-
🪂 parachute fly glide
-
💺 seat sit airplane transport bus flight fly
-
🚁 helicopter transportation vehicle fly
-
🚟 suspension railway vehicle transportation
-
🚠 mountain cableway transportation vehicle ski
-
🚡 aerial tramway transportation vehicle ski
-
🛰️ satellite communication gps orbit spaceflight NASA ISS
-
🚀 rocket launch ship staffmode NASA outer space outer space fly
-
🛸 flying saucer transportation vehicle ufo
-
🛎️ bellhop bell service
-
🧳 luggage packing travel
-
⌛ hourglass done time clock oldschool limit exam quiz test
-
⏳ hourglass not done oldschool time countdown
-
⌚ watch time accessories
-
⏰ alarm clock time wake
-
⏱️ stopwatch time deadline
-
⏲️ timer clock alarm
-
🕰️ mantelpiece clock time
-
🕛 twelve o clock time noon midnight midday late early schedule
-
🕧 twelve thirty time late early schedule
-
🕐 one o clock time late early schedule
-
🕜 one thirty time late early schedule
-
🕑 two o clock time late early schedule
-
🕝 two thirty time late early schedule
-
🕒 three o clock time late early schedule
-
🕞 three thirty time late early schedule
-
🕓 four o clock time late early schedule
-
🕟 four thirty time late early schedule
-
🕔 five o clock time late early schedule
-
🕠 five thirty time late early schedule
-
🕕 six o clock time late early schedule dawn dusk
-
🕡 six thirty time late early schedule
-
🕖 seven o clock time late early schedule
-
🕢 seven thirty time late early schedule
-
🕗 eight o clock time late early schedule
-
🕣 eight thirty time late early schedule
-
🕘 nine o clock time late early schedule
-
🕤 nine thirty time late early schedule
-
🕙 ten o clock time late early schedule
-
🕥 ten thirty time late early schedule
-
🕚 eleven o clock time late early schedule
-
🕦 eleven thirty time late early schedule
-
🌑 new moon nature twilight planet space night evening sleep
-
🌒 waxing crescent moon nature twilight planet space night evening sleep
-
🌓 first quarter moon nature twilight planet space night evening sleep
-
🌔 waxing gibbous moon nature night sky gray twilight planet space evening sleep
-
🌕 full moon nature yellow twilight planet space night evening sleep
-
🌖 waning gibbous moon nature twilight planet space night evening sleep waxing gibbous moon
-
🌗 last quarter moon nature twilight planet space night evening sleep
-
🌘 waning crescent moon nature twilight planet space night evening sleep
-
🌙 crescent moon night sleep sky evening magic
-
🌚 new moon face nature twilight planet space night evening sleep
-
🌛 first quarter moon face nature twilight planet space night evening sleep
-
🌜 last quarter moon face nature twilight planet space night evening sleep
-
🌡️ thermometer weather temperature hot cold
-
☀️ sun weather nature brightness summer beach spring
-
🌝 full moon face nature twilight planet space night evening sleep
-
🌞 sun with face nature morning sky
-
🪐 ringed planet outerspace
-
⭐ star night yellow
-
🌟 glowing star night sparkle awesome good magic
-
🌠 shooting star night photo
-
🌌 milky way photo space stars
-
☁️ cloud weather sky
-
⛅ sun behind cloud weather nature cloudy morning fall spring
-
⛈️ cloud with lightning and rain weather lightning
-
🌤️ sun behind small cloud weather
-
🌥️ sun behind large cloud weather
-
🌦️ sun behind rain cloud weather
-
🌧️ cloud with rain weather
-
🌨️ cloud with snow weather
-
🌩️ cloud with lightning weather thunder
-
🌪️ tornado weather cyclone twister
-
🌫️ fog weather
-
🌬️ wind face gust air
-
🌀 cyclone weather swirl blue cloud vortex spiral whirlpool spin tornado hurricane typhoon
-
🌈 rainbow nature happy unicorn face photo sky spring
-
🌂 closed umbrella weather rain drizzle
-
☂️ umbrella weather spring
-
☔ umbrella with rain drops rainy weather spring
-
⛱️ umbrella on ground weather summer
-
⚡ high voltage thunder weather lightning bolt fast
-
❄️ snowflake winter season cold weather christmas xmas
-
☃️ snowman winter season cold weather christmas xmas frozen
-
⛄ snowman without snow winter season cold weather christmas xmas frozen without snow
-
☄️ comet space
-
🔥 fire hot cook flame
-
💧 droplet water drip faucet spring
-
🌊 water wave sea water wave nature tsunami disaster
-
🎃 jack o lantern halloween light pumpkin creepy fall
-
🎄 christmas tree festival vacation december xmas celebration
-
🎆 fireworks photo festival carnival congratulations
-
🎇 sparkler stars night shine
-
🧨 firecracker dynamite boom explode explosion explosive
-
✨ sparkles stars shine shiny cool awesome good magic
-
🎈 balloon party celebration birthday circus
-
🎉 party popper party congratulations birthday magic circus celebration tada
-
🎊 confetti ball festival party birthday circus
-
🎋 tanabata tree plant nature branch summer
-
🎍 pine decoration plant nature vegetable panda pine decoration
-
🎎 japanese dolls japanese toy kimono
-
🎏 carp streamer fish japanese koinobori carp banner
-
🎐 wind chime nature ding spring bell
-
🎑 moon viewing ceremony photo japan asia tsukimi
-
🧧 red envelope gift
-
🎀 ribbon decoration pink girl bowtie
-
🎁 wrapped gift present birthday christmas xmas
-
🎗️ reminder ribbon sports cause support awareness
-
🎟️ admission tickets sports concert entrance
-
🎫 ticket event concert pass
-
🎖️ military medal award winning army
-
🏆 trophy win award contest place ftw ceremony
-
🏅 sports medal award winning
-
🥇 1st place medal award winning first
-
🥈 2nd place medal award second
-
🥉 3rd place medal award third
-
⚽ soccer ball sports football
-
⚾ baseball sports balls
-
🥎 softball sports balls
-
🏀 basketball sports balls NBA
-
🏐 volleyball sports balls
-
🏈 american football sports balls NFL
-
🏉 rugby football sports team
-
🎾 tennis sports balls green
-
🥏 flying disc sports frisbee ultimate
-
🎳 bowling sports fun play
-
🏏 cricket game sports
-
🏑 field hockey sports
-
🏒 ice hockey sports
-
🥍 lacrosse sports ball stick
-
🏓 ping pong sports pingpong
-
🏸 badminton sports
-
🥊 boxing glove sports fighting
-
🥋 martial arts uniform judo karate taekwondo
-
🥅 goal net sports
-
⛳ flag in hole sports business flag hole summer
-
⛸️ ice skate sports
-
🎣 fishing pole food hobby summer
-
🤿 diving mask sport ocean
-
🎽 running shirt play pageant
-
🎿 skis sports winter cold snow
-
🛷 sled sleigh luge toboggan
-
🥌 curling stone sports
-
🎯 direct hit game play bar target bullseye
-
🪀 yo yo toy
-
🪁 kite wind fly
-
🎱 pool 8 ball pool hobby game luck magic
-
🔮 crystal ball disco party magic circus fortune teller
-
🧿 nazar amulet bead charm
-
🎮 video game play console PS4 controller
-
🕹️ joystick game play
-
🎰 slot machine bet gamble vegas fruit machine luck casino
-
🎲 game die dice random tabletop play luck
-
🧩 puzzle piece interlocking puzzle piece
-
🧸 teddy bear plush stuffed
-
♠️ spade suit poker cards suits magic
-
♥️ heart suit poker cards magic suits
-
♦️ diamond suit poker cards magic suits
-
♣️ club suit poker cards magic suits
-
♟️ chess pawn expendable
-
🃏 joker poker cards game play magic
-
🀄 mahjong red dragon game play chinese kanji
-
🎴 flower playing cards game sunset red
-
🎭 performing arts acting theater drama
-
🖼️ framed picture photography
-
🎨 artist palette design paint draw colors
-
🧵 thread needle sewing spool string
-
🧶 yarn ball crochet knit
-
👓 glasses fashion accessories eyesight nerdy dork geek
-
🕶️ sunglasses face cool accessories
-
🥽 goggles eyes protection safety
-
🥼 lab coat doctor experiment scientist chemist
-
🦺 safety vest protection
-
👔 necktie shirt suitup formal fashion cloth business
-
👕 t shirt fashion cloth casual shirt tee
-
👖 jeans fashion shopping
-
🧣 scarf neck winter clothes
-
🧤 gloves hands winter clothes
-
🧥 coat jacket
-
🧦 socks stockings clothes
-
👗 dress clothes fashion shopping
-
👘 kimono dress fashion women female japanese
-
🥻 sari dress
-
🩱 one piece swimsuit fashion
-
🩲 briefs clothing
-
🩳 shorts clothing
-
👙 bikini swimming female woman girl fashion beach summer
-
👚 woman s clothes fashion shopping bags female
-
👛 purse fashion accessories money sales shopping
-
👜 handbag fashion accessory accessories shopping
-
👝 clutch bag bag accessories shopping
-
🛍️ shopping bags mall buy purchase
-
🎒 backpack student education bag backpack
-
👞 man s shoe fashion male
-
👟 running shoe shoes sports sneakers
-
🥾 hiking boot backpacking camping hiking
-
🥿 flat shoe ballet slip-on slipper
-
👠 high heeled shoe fashion shoes female pumps stiletto
-
👡 woman s sandal shoes fashion flip flops
-
🩰 ballet shoes dance
-
👢 woman s boot shoes fashion
-
👑 crown king kod leader royalty lord
-
👒 woman s hat fashion accessories female lady spring
-
🎩 top hat magic gentleman classy circus
-
🎓 graduation cap school college degree university graduation cap hat legal learn education
-
🧢 billed cap cap baseball
-
⛑️ rescue worker s helmet construction build
-
📿 prayer beads dhikr religious
-
💄 lipstick female girl fashion woman
-
💍 ring wedding propose marriage valentines diamond fashion jewelry gem engagement
-
💎 gem stone blue ruby diamond jewelry
-
🔇 muted speaker sound volume silence quiet
-
🔈 speaker low volume sound volume silence broadcast
-
🔉 speaker medium volume volume speaker broadcast
-
🔊 speaker high volume volume noise noisy speaker broadcast
-
📢 loudspeaker volume sound
-
📣 megaphone sound speaker volume
-
📯 postal horn instrument music
-
🔔 bell sound notification christmas xmas chime
-
🔕 bell with slash sound volume mute quiet silent
-
🎼 musical score treble clef compose
-
🎵 musical note score tone sound
-
🎶 musical notes music score
-
🎙️ studio microphone sing recording artist talkshow
-
🎚️ level slider scale
-
🎛️ control knobs dial
-
🎤 microphone sound music PA sing talkshow
-
🎧 headphone music score gadgets
-
📻 radio communication music podcast program
-
🎷 saxophone music instrument jazz blues
-
🎸 guitar music instrument
-
🎹 musical keyboard piano instrument compose
-
🎺 trumpet music brass
-
🎻 violin music instrument orchestra symphony
-
🪕 banjo music instructment
-
🥁 drum music instrument drumsticks snare
-
📱 mobile phone technology apple gadgets dial
-
📲 mobile phone with arrow iphone incoming
-
☎️ telephone technology communication dial telephone
-
📞 telephone receiver technology communication dial
-
📟 pager bbcall oldschool 90s
-
📠 fax machine communication technology
-
🔋 battery power energy sustain
-
🔌 electric plug charger power
-
💻 laptop technology laptop screen display monitor
-
🖥️ desktop computer technology computing screen
-
🖨️ printer paper ink
-
⌨️ keyboard technology computer type input text
-
🖱️ computer mouse click
-
🖲️ trackball technology trackpad
-
💽 computer disk technology record data disk 90s
-
💾 floppy disk oldschool technology save 90s 80s
-
💿 optical disk technology dvd disk disc 90s
-
📀 dvd cd disk disc
-
🧮 abacus calculation
-
🎥 movie camera film record
-
🎞️ film frames movie
-
📽️ film projector video tape record movie
-
🎬 clapper board movie film record
-
📺 television technology program oldschool show television
-
📷 camera gadgets photography
-
📸 camera with flash photography gadgets
-
📹 video camera film record
-
📼 videocassette record video oldschool 90s 80s
-
🔍 magnifying glass tilted left search zoom find detective
-
🔎 magnifying glass tilted right search zoom find detective
-
🕯️ candle fire wax
-
💡 light bulb light electricity idea
-
🔦 flashlight dark camping sight night
-
🏮 red paper lantern light paper halloween spooky
-
🪔 diya lamp lighting
-
📔 notebook with decorative cover classroom notes record paper study
-
📕 closed book read library knowledge textbook learn
-
📖 open book book read library knowledge literature learn study
-
📗 green book read library knowledge study
-
📘 blue book read library knowledge learn study
-
📙 orange book read library knowledge textbook study
-
📚 books literature library study
-
📓 notebook stationery record notes paper study
-
📒 ledger notes paper
-
📃 page with curl documents office paper
-
📜 scroll documents ancient history paper
-
📄 page facing up documents office paper information
-
📰 newspaper press headline
-
🗞️ rolled up newspaper press headline
-
📑 bookmark tabs favorite save order tidy
-
🔖 bookmark favorite label save
-
🏷️ label sale tag
-
💰 money bag dollar payment coins sale
-
💴 yen banknote money sales japanese dollar currency
-
💵 dollar banknote money sales bill currency
-
💶 euro banknote money sales dollar currency
-
💷 pound banknote british sterling money sales bills uk england currency
-
💸 money with wings dollar bills payment sale
-
💳 credit card money sales dollar bill payment shopping
-
🧾 receipt accounting expenses
-
💹 chart increasing with yen green-square graph presentation stats
-
💱 currency exchange money sales dollar travel
-
💲 heavy dollar sign money sales payment currency buck
-
✉️ envelope letter postal inbox communication
-
📧 e mail communication inbox
-
📨 incoming envelope email inbox
-
📩 envelope with arrow email communication
-
📤 outbox tray inbox email
-
📥 inbox tray email documents
-
📦 package mail gift cardboard box moving
-
📫 closed mailbox with raised flag email inbox communication
-
📪 closed mailbox with lowered flag email communication inbox
-
📬 open mailbox with raised flag email inbox communication
-
📭 open mailbox with lowered flag email inbox
-
📮 postbox email letter envelope
-
🗳️ ballot box with ballot election vote
-
✏️ pencil stationery write paper writing school study
-
✒️ black nib pen stationery writing write
-
🖋️ fountain pen stationery writing write
-
🖊️ pen stationery writing write
-
🖌️ paintbrush drawing creativity art
-
🖍️ crayon drawing creativity
-
📝 memo write documents stationery pencil paper writing legal exam quiz test study compose
-
💼 briefcase business documents work law legal job career
-
📁 file folder documents business office
-
📂 open file folder documents load
-
🗂️ card index dividers organizing business stationery
-
📅 calendar calendar schedule
-
📆 tear off calendar schedule date planning
-
🗒️ spiral notepad memo stationery
-
🗓️ spiral calendar date schedule planning
-
📇 card index business stationery
-
📈 chart increasing graph presentation stats recovery business economics money sales good success
-
📉 chart decreasing graph presentation stats recession business economics money sales bad failure
-
📊 bar chart graph presentation stats
-
📋 clipboard stationery documents
-
📌 pushpin stationery mark here
-
📍 round pushpin stationery location map here
-
📎 paperclip documents stationery
-
🖇️ linked paperclips documents stationery
-
📏 straight ruler stationery calculate length math school drawing architect sketch
-
📐 triangular ruler stationery math architect sketch
-
✂️ scissors stationery cut
-
🗃️ card file box business stationery
-
🗄️ file cabinet filing organizing
-
🗑️ wastebasket bin trash rubbish garbage toss
-
🔒 locked security password padlock
-
🔓 unlocked privacy security
-
🔏 locked with pen security secret
-
🔐 locked with key security privacy
-
🔑 key lock door password
-
🗝️ old key lock door password
-
🔨 hammer tools build create
-
🪓 axe tool chop cut
-
⛏️ pick tools dig
-
⚒️ hammer and pick tools build create
-
🛠️ hammer and wrench tools build create
-
🗡️ dagger weapon
-
⚔️ crossed swords weapon
-
🔫 pistol violence weapon pistol revolver
-
🏹 bow and arrow sports
-
🛡️ shield protection security
-
🔧 wrench tools diy ikea fix maintainer
-
🔩 nut and bolt handy tools fix
-
⚙️ gear cog
-
🗜️ clamp tool
-
⚖️ balance scale law fairness weight
-
🦯 probing cane accessibility
-
🔗 link rings url
-
⛓️ chains lock arrest
-
🧰 toolbox tools diy fix maintainer mechanic
-
🧲 magnet attraction magnetic
-
⚗️ alembic distilling science experiment chemistry
-
🧪 test tube chemistry experiment lab science
-
🧫 petri dish bacteria biology culture lab
-
🧬 dna biologist genetics life
-
🔬 microscope laboratory experiment zoomin science study
-
🔭 telescope stars space zoom science astronomy
-
📡 satellite antenna communication future radio space
-
💉 syringe health hospital drugs blood medicine needle doctor nurse
-
🩸 drop of blood period hurt harm wound
-
💊 pill health medicine doctor pharmacy drug
-
🩹 adhesive bandage heal
-
🩺 stethoscope health
-
🚪 door house entry exit
-
🛏️ bed sleep rest
-
🛋️ couch and lamp read chill
-
🪑 chair sit furniture
-
🚽 toilet restroom wc washroom bathroom potty
-
🚿 shower clean water bathroom
-
🛁 bathtub clean shower bathroom
-
🪒 razor cut
-
🧴 lotion bottle moisturizer sunscreen
-
🧷 safety pin diaper
-
🧹 broom cleaning sweeping witch
-
🧺 basket laundry
-
🧻 roll of paper roll
-
🧼 soap bar bathing cleaning lather
-
🧽 sponge absorbing cleaning porous
-
🧯 fire extinguisher quench
-
🛒 shopping cart trolley
-
🚬 cigarette kills tobacco cigarette joint smoke
-
⚰️ coffin vampire dead die death rip graveyard cemetery casket funeral box
-
⚱️ funeral urn dead die death rip ashes
-
🗿 moai rock easter island moai
-
🏧 atm sign money sales cash blue-square payment bank
-
🚮 litter in bin sign blue-square sign human info
-
🚰 potable water blue-square liquid restroom cleaning faucet
-
♿ wheelchair symbol blue-square disabled accessibility
-
🚹 men s room toilet restroom wc blue-square gender male
-
🚺 women s room purple-square woman female toilet loo restroom gender
-
🚻 restroom blue-square toilet refresh wc gender
-
🚼 baby symbol orange-square child
-
🚾 water closet toilet restroom blue-square
-
🛂 passport control custom blue-square
-
🛃 customs passport border blue-square
-
🛄 baggage claim blue-square airport transport
-
🛅 left luggage blue-square travel
-
⚠️ warning exclamation wip alert error problem issue
-
🚸 children crossing school warning danger sign driving yellow-diamond
-
⛔ no entry limit security privacy bad denied stop circle
-
🚫 prohibited forbid stop limit denied disallow circle
-
🚳 no bicycles cyclist prohibited circle
-
🚭 no smoking cigarette blue-square smell smoke
-
🚯 no littering trash bin garbage circle
-
🚱 non potable water drink faucet tap circle
-
🚷 no pedestrians rules crossing walking circle
-
📵 no mobile phones iphone mute circle
-
🔞 no one under eighteen 18 drink pub night minor circle
-
☢️ radioactive nuclear danger
-
☣️ biohazard danger
-
⬆️ up arrow blue-square continue top direction
-
↗️ up right arrow blue-square point direction diagonal northeast
-
➡️ right arrow blue-square next
-
↘️ down right arrow blue-square direction diagonal southeast
-
⬇️ down arrow blue-square direction bottom
-
↙️ down left arrow blue-square direction diagonal southwest
-
⬅️ left arrow blue-square previous back
-
↖️ up left arrow blue-square point direction diagonal northwest
-
↕️ up down arrow blue-square direction way vertical
-
↔️ left right arrow shape direction horizontal sideways
-
↩️ right arrow curving left back return blue-square undo enter
-
↪️ left arrow curving right blue-square return rotate direction
-
⤴️ right arrow curving up blue-square direction top
-
⤵️ right arrow curving down blue-square direction bottom
-
🔃 clockwise vertical arrows sync cycle round repeat
-
🔄 counterclockwise arrows button blue-square sync cycle
-
🔙 back arrow arrow words return
-
🔚 end arrow words arrow
-
🔛 on arrow arrow words
-
🔜 soon arrow arrow words
-
🔝 top arrow words blue-square
-
🛐 place of worship religion church temple prayer
-
⚛️ atom symbol science physics chemistry
-
🕉️ om hinduism buddhism sikhism jainism
-
✡️ star of david judaism
-
☸️ wheel of dharma hinduism buddhism sikhism jainism
-
☯️ yin yang balance
-
✝️ latin cross christianity
-
☦️ orthodox cross suppedaneum religion
-
☪️ star and crescent islam
-
☮️ peace symbol hippie
-
🕎 menorah hanukkah candles jewish
-
🔯 dotted six pointed star purple-square religion jewish hexagram
-
♈ aries sign purple-square zodiac astrology
-
♉ taurus purple-square sign zodiac astrology
-
♊ gemini sign zodiac purple-square astrology
-
♋ cancer sign zodiac purple-square astrology
-
♌ leo sign purple-square zodiac astrology
-
♍ virgo sign zodiac purple-square astrology
-
♎ libra sign purple-square zodiac astrology
-
♏ scorpio sign zodiac purple-square astrology scorpio
-
♐ sagittarius sign zodiac purple-square astrology
-
♑ capricorn sign zodiac purple-square astrology
-
♒ aquarius sign purple-square zodiac astrology
-
♓ pisces purple-square sign zodiac astrology
-
⛎ ophiuchus sign purple-square constellation astrology
-
🔀 shuffle tracks button blue-square shuffle music random
-
🔁 repeat button loop record
-
🔂 repeat single button blue-square loop
-
▶️ play button blue-square right direction play
-
⏩ fast forward button blue-square play speed continue
-
⏭️ next track button forward next blue-square
-
⏯️ play or pause button blue-square play pause
-
◀️ reverse button blue-square left direction
-
⏪ fast reverse button play blue-square
-
⏮️ last track button backward
-
🔼 upwards button blue-square triangle direction point forward top
-
⏫ fast up button blue-square direction top
-
🔽 downwards button blue-square direction bottom
-
⏬ fast down button blue-square direction bottom
-
⏸️ pause button pause blue-square
-
⏹️ stop button blue-square
-
⏺️ record button blue-square
-
⏏️ eject button blue-square
-
🎦 cinema blue-square record film movie curtain stage theater
-
🔅 dim button sun afternoon warm summer
-
🔆 bright button sun light
-
📶 antenna bars blue-square reception phone internet connection wifi bluetooth bars
-
📳 vibration mode orange-square phone
-
📴 mobile phone off mute orange-square silence quiet
-
♀️ female sign woman women lady girl
-
♂️ male sign man boy men
-
⚕️ medical symbol health hospital
-
♾️ infinity forever
-
♻️ recycling symbol arrow environment garbage trash
-
⚜️ fleur de lis decorative scout
-
🔱 trident emblem weapon spear
-
📛 name badge fire forbid
-
🔰 japanese symbol for beginner badge shield
-
⭕ hollow red circle circle round
-
✅ check mark button green-square ok agree vote election answer tick
-
☑️ check box with check ok agree confirm black-square vote election yes tick
-
✔️ check mark ok nike answer yes tick
-
✖️ multiplication sign math calculation
-
❌ cross mark no delete remove cancel red
-
❎ cross mark button x green-square no deny
-
➕ plus sign math calculation addition more increase
-
➖ minus sign math calculation subtract less
-
➗ division sign divide math calculation
-
➰ curly loop scribble draw shape squiggle
-
➿ double curly loop tape cassette
-
〽️ part alternation mark graph presentation stats business economics bad
-
✳️ eight spoked asterisk star sparkle green-square
-
✴️ eight pointed star orange-square shape polygon
-
❇️ sparkle stars green-square awesome good fireworks
-
‼️ double exclamation mark exclamation surprise
-
⁉️ exclamation question mark wat punctuation surprise
-
❓ question mark doubt confused
-
❔ white question mark doubts gray huh confused
-
❕ white exclamation mark surprise punctuation gray wow warning
-
❗ exclamation mark heavy exclamation mark danger surprise punctuation wow warning
-
〰️ wavy dash draw line moustache mustache squiggle scribble
-
©️ copyright ip license circle law legal
-
®️ registered alphabet circle
-
™️ trade mark trademark brand law legal
-
#️⃣ keycap symbol blue-square twitter
-
*️⃣ keycap star keycap
-
0️⃣ keycap 0 0 numbers blue-square null
-
1️⃣ keycap 1 blue-square numbers 1
-
2️⃣ keycap 2 numbers 2 prime blue-square
-
3️⃣ keycap 3 3 numbers prime blue-square
-
4️⃣ keycap 4 4 numbers blue-square
-
5️⃣ keycap 5 5 numbers blue-square prime
-
6️⃣ keycap 6 6 numbers blue-square
-
7️⃣ keycap 7 7 numbers blue-square prime
-
8️⃣ keycap 8 8 blue-square numbers
-
9️⃣ keycap 9 blue-square numbers 9
-
🔟 keycap 10 numbers 10 blue-square
-
🔠 input latin uppercase alphabet words blue-square
-
🔡 input latin lowercase blue-square alphabet
-
🔢 input numbers numbers blue-square
-
🔣 input symbols blue-square music note ampersand percent glyphs characters
-
🔤 input latin letters blue-square alphabet
-
🅰️ a button red-square alphabet letter
-
🆎 ab button red-square alphabet
-
🅱️ b button red-square alphabet letter
-
🆑 cl button alphabet words red-square
-
🆒 cool button words blue-square
-
🆓 free button blue-square words
-
ℹ️ information blue-square alphabet letter
-
🆔 id button purple-square words
-
Ⓜ️ circled m alphabet blue-circle letter
-
🆕 new button blue-square words start
-
🆖 ng button blue-square words shape icon
-
🅾️ o button alphabet red-square letter
-
🆗 ok button good agree yes blue-square
-
🅿️ p button cars blue-square alphabet letter
-
🆘 sos button help red-square words emergency 911
-
🆙 up button blue-square above high
-
🆚 vs button words orange-square
-
🈁 japanese here button blue-square here katakana japanese destination
-
🈂️ japanese service charge button japanese blue-square katakana
-
🈷️ japanese monthly amount button chinese month moon japanese orange-square kanji
-
🈶 japanese not free of charge button orange-square chinese have kanji
-
🈯 japanese reserved button chinese point green-square kanji
-
🉐 japanese bargain button chinese kanji obtain get circle
-
🈹 japanese discount button cut divide chinese kanji pink-square
-
🈚 japanese free of charge button nothing chinese kanji japanese orange-square
-
🈲 japanese prohibited button kanji japanese chinese forbidden limit restricted red-square
-
🉑 japanese acceptable button ok good chinese kanji agree yes orange-circle
-
🈸 japanese application button chinese japanese kanji orange-square
-
🈴 japanese passing grade button japanese chinese join kanji red-square
-
🈳 japanese vacancy button kanji japanese chinese empty sky blue-square
-
㊗️ japanese congratulations button chinese kanji japanese red-circle
-
㊙️ japanese secret button privacy chinese sshh kanji red-circle
-
🈺 japanese open for business button japanese opening hours orange-square
-
🈵 japanese no vacancy button full chinese japanese red-square kanji
-
🔴 red circle shape error danger
-
🟠 orange circle round
-
🟡 yellow circle round
-
🟢 green circle round
-
🔵 blue circle shape icon button
-
🟣 purple circle round
-
🟤 brown circle round
-
⚫ black circle shape button round
-
⚪ white circle shape round
-
🟥 red square
-
🟧 orange square
-
🟨 yellow square
-
🟩 green square
-
🟦 blue square
-
🟪 purple square
-
🟫 brown square
-
⬛ black large square shape icon button
-
⬜ white large square shape icon stone button
-
◼️ black medium square shape button icon
-
◻️ white medium square shape stone icon
-
◾ black medium small square icon shape button
-
◽ white medium small square shape stone icon button
-
▪️ black small square shape icon
-
▫️ white small square shape icon
-
🔶 large orange diamond shape jewel gem
-
🔷 large blue diamond shape jewel gem
-
🔸 small orange diamond shape jewel gem
-
🔹 small blue diamond shape jewel gem
-
🔺 red triangle pointed up shape direction up top
-
🔻 red triangle pointed down shape direction bottom
-
💠 diamond with a dot jewel blue gem crystal fancy
-
🔘 radio button input old music circle
-
🔳 white square button shape input
-
🔲 black square button shape input frame
-
🏁 chequered flag contest finishline race gokart
-
🚩 triangular flag mark milestone place
-
🎌 crossed flags japanese nation country border
-
🏴 black flag pirate
-
🏳️ white flag losing loser lost surrender give up fail
-
🏳️‍🌈 rainbow flag flag rainbow pride gay lgbt glbt queer homosexual lesbian bisexual transgender
-
🏴‍☠️ pirate flag skull crossbones flag banner
-
🇦🇨 flag ascension island
-
🇦🇩 flag andorra ad flag nation country banner andorra
-
🇦🇪 flag united arab emirates united arab emirates flag nation country banner united arab emirates
-
🇦🇫 flag afghanistan af flag nation country banner afghanistan
-
🇦🇬 flag antigua barbuda antigua barbuda flag nation country banner antigua barbuda
-
🇦🇮 flag anguilla ai flag nation country banner anguilla
-
🇦🇱 flag albania al flag nation country banner albania
-
🇦🇲 flag armenia am flag nation country banner armenia
-
🇦🇴 flag angola ao flag nation country banner angola
-
🇦🇶 flag antarctica aq flag nation country banner antarctica
-
🇦🇷 flag argentina ar flag nation country banner argentina
-
🇦🇸 flag american samoa american ws flag nation country banner american samoa
-
🇦🇹 flag austria at flag nation country banner austria
-
🇦🇺 flag australia au flag nation country banner australia
-
🇦🇼 flag aruba aw flag nation country banner aruba
-
🇦🇽 flag aland islands Åland islands flag nation country banner aland islands
-
🇦🇿 flag azerbaijan az flag nation country banner azerbaijan
-
🇧🇦 flag bosnia herzegovina bosnia herzegovina flag nation country banner bosnia herzegovina
-
🇧🇧 flag barbados bb flag nation country banner barbados
-
🇧🇩 flag bangladesh bd flag nation country banner bangladesh
-
🇧🇪 flag belgium be flag nation country banner belgium
-
🇧🇫 flag burkina faso burkina faso flag nation country banner burkina faso
-
🇧🇬 flag bulgaria bg flag nation country banner bulgaria
-
🇧🇭 flag bahrain bh flag nation country banner bahrain
-
🇧🇮 flag burundi bi flag nation country banner burundi
-
🇧🇯 flag benin bj flag nation country banner benin
-
🇧🇱 flag st barthelemy saint barthélemy flag nation country banner st barthelemy
-
🇧🇲 flag bermuda bm flag nation country banner bermuda
-
🇧🇳 flag brunei bn darussalam flag nation country banner brunei
-
🇧🇴 flag bolivia bo flag nation country banner bolivia
-
🇧🇶 flag caribbean netherlands bonaire flag nation country banner caribbean netherlands
-
🇧🇷 flag brazil br flag nation country banner brazil
-
🇧🇸 flag bahamas bs flag nation country banner bahamas
-
🇧🇹 flag bhutan bt flag nation country banner bhutan
-
🇧🇻 flag bouvet island norway
-
🇧🇼 flag botswana bw flag nation country banner botswana
-
🇧🇾 flag belarus by flag nation country banner belarus
-
🇧🇿 flag belize bz flag nation country banner belize
-
🇨🇦 flag canada ca flag nation country banner canada
-
🇨🇨 flag cocos islands cocos keeling islands flag nation country banner cocos islands
-
🇨🇩 flag congo kinshasa congo democratic republic flag nation country banner congo kinshasa
-
🇨🇫 flag central african republic central african republic flag nation country banner central african republic
-
🇨🇬 flag congo brazzaville congo flag nation country banner congo brazzaville
-
🇨🇭 flag switzerland ch flag nation country banner switzerland
-
🇨🇮 flag cote d ivoire ivory coast flag nation country banner cote d ivoire
-
🇨🇰 flag cook islands cook islands flag nation country banner cook islands
-
🇨🇱 flag chile flag nation country banner chile
-
🇨🇲 flag cameroon cm flag nation country banner cameroon
-
🇨🇳 flag china china chinese prc flag country nation banner china
-
🇨🇴 flag colombia co flag nation country banner colombia
-
🇨🇵 flag clipperton island
-
🇨🇷 flag costa rica costa rica flag nation country banner costa rica
-
🇨🇺 flag cuba cu flag nation country banner cuba
-
🇨🇻 flag cape verde cabo verde flag nation country banner cape verde
-
🇨🇼 flag curacao curaçao flag nation country banner curacao
-
🇨🇽 flag christmas island christmas island flag nation country banner christmas island
-
🇨🇾 flag cyprus cy flag nation country banner cyprus
-
🇨🇿 flag czechia cz flag nation country banner czechia
-
🇩🇪 flag germany german nation flag country banner germany
-
🇩🇬 flag diego garcia
-
🇩🇯 flag djibouti dj flag nation country banner djibouti
-
🇩🇰 flag denmark dk flag nation country banner denmark
-
🇩🇲 flag dominica dm flag nation country banner dominica
-
🇩🇴 flag dominican republic dominican republic flag nation country banner dominican republic
-
🇩🇿 flag algeria dz flag nation country banner algeria
-
🇪🇦 flag ceuta melilla
-
🇪🇨 flag ecuador ec flag nation country banner ecuador
-
🇪🇪 flag estonia ee flag nation country banner estonia
-
🇪🇬 flag egypt eg flag nation country banner egypt
-
🇪🇭 flag western sahara western sahara flag nation country banner western sahara
-
🇪🇷 flag eritrea er flag nation country banner eritrea
-
🇪🇸 flag spain spain flag nation country banner spain
-
🇪🇹 flag ethiopia et flag nation country banner ethiopia
-
🇪🇺 flag european union european union flag banner
-
🇫🇮 flag finland fi flag nation country banner finland
-
🇫🇯 flag fiji fj flag nation country banner fiji
-
🇫🇰 flag falkland islands falkland islands malvinas flag nation country banner falkland islands
-
🇫🇲 flag micronesia micronesia federated states flag nation country banner micronesia
-
🇫🇴 flag faroe islands faroe islands flag nation country banner faroe islands
-
🇫🇷 flag france banner flag nation france french country france
-
🇬🇦 flag gabon ga flag nation country banner gabon
-
🇬🇧 flag united kingdom united kingdom great britain northern ireland flag nation country banner british UK english england union jack united kingdom
-
🇬🇩 flag grenada gd flag nation country banner grenada
-
🇬🇪 flag georgia ge flag nation country banner georgia
-
🇬🇫 flag french guiana french guiana flag nation country banner french guiana
-
🇬🇬 flag guernsey gg flag nation country banner guernsey
-
🇬🇭 flag ghana gh flag nation country banner ghana
-
🇬🇮 flag gibraltar gi flag nation country banner gibraltar
-
🇬🇱 flag greenland gl flag nation country banner greenland
-
🇬🇲 flag gambia gm flag nation country banner gambia
-
🇬🇳 flag guinea gn flag nation country banner guinea
-
🇬🇵 flag guadeloupe gp flag nation country banner guadeloupe
-
🇬🇶 flag equatorial guinea equatorial gn flag nation country banner equatorial guinea
-
🇬🇷 flag greece gr flag nation country banner greece
-
🇬🇸 flag south georgia south sandwich islands south georgia sandwich islands flag nation country banner south georgia south sandwich islands
-
🇬🇹 flag guatemala gt flag nation country banner guatemala
-
🇬🇺 flag guam gu flag nation country banner guam
-
🇬🇼 flag guinea bissau gw bissau flag nation country banner guinea bissau
-
🇬🇾 flag guyana gy flag nation country banner guyana
-
🇭🇰 flag hong kong sar china hong kong flag nation country banner hong kong sar china
-
🇭🇲 flag heard mcdonald islands
-
🇭🇳 flag honduras hn flag nation country banner honduras
-
🇭🇷 flag croatia hr flag nation country banner croatia
-
🇭🇹 flag haiti ht flag nation country banner haiti
-
🇭🇺 flag hungary hu flag nation country banner hungary
-
🇮🇨 flag canary islands canary islands flag nation country banner canary islands
-
🇮🇩 flag indonesia flag nation country banner indonesia
-
🇮🇪 flag ireland ie flag nation country banner ireland
-
🇮🇱 flag israel il flag nation country banner israel
-
🇮🇲 flag isle of man isle man flag nation country banner isle of man
-
🇮🇳 flag india in flag nation country banner india
-
🇮🇴 flag british indian ocean territory british indian ocean territory flag nation country banner british indian ocean territory
-
🇮🇶 flag iraq iq flag nation country banner iraq
-
🇮🇷 flag iran iran islamic republic flag nation country banner iran
-
🇮🇸 flag iceland is flag nation country banner iceland
-
🇮🇹 flag italy italy flag nation country banner italy
-
🇯🇪 flag jersey je flag nation country banner jersey
-
🇯🇲 flag jamaica jm flag nation country banner jamaica
-
🇯🇴 flag jordan jo flag nation country banner jordan
-
🇯🇵 flag japan japanese nation flag country banner japan
-
🇰🇪 flag kenya ke flag nation country banner kenya
-
🇰🇬 flag kyrgyzstan kg flag nation country banner kyrgyzstan
-
🇰🇭 flag cambodia kh flag nation country banner cambodia
-
🇰🇮 flag kiribati ki flag nation country banner kiribati
-
🇰🇲 flag comoros km flag nation country banner comoros
-
🇰🇳 flag st kitts nevis saint kitts nevis flag nation country banner st kitts nevis
-
🇰🇵 flag north korea north korea nation flag country banner north korea
-
🇰🇷 flag south korea south korea nation flag country banner south korea
-
🇰🇼 flag kuwait kw flag nation country banner kuwait
-
🇰🇾 flag cayman islands cayman islands flag nation country banner cayman islands
-
🇰🇿 flag kazakhstan kz flag nation country banner kazakhstan
-
🇱🇦 flag laos lao democratic republic flag nation country banner laos
-
🇱🇧 flag lebanon lb flag nation country banner lebanon
-
🇱🇨 flag st lucia saint lucia flag nation country banner st lucia
-
🇱🇮 flag liechtenstein li flag nation country banner liechtenstein
-
🇱🇰 flag sri lanka sri lanka flag nation country banner sri lanka
-
🇱🇷 flag liberia lr flag nation country banner liberia
-
🇱🇸 flag lesotho ls flag nation country banner lesotho
-
🇱🇹 flag lithuania lt flag nation country banner lithuania
-
🇱🇺 flag luxembourg lu flag nation country banner luxembourg
-
🇱🇻 flag latvia lv flag nation country banner latvia
-
🇱🇾 flag libya ly flag nation country banner libya
-
🇲🇦 flag morocco ma flag nation country banner morocco
-
🇲🇨 flag monaco mc flag nation country banner monaco
-
🇲🇩 flag moldova moldova republic flag nation country banner moldova
-
🇲🇪 flag montenegro me flag nation country banner montenegro
-
🇲🇫 flag st martin
-
🇲🇬 flag madagascar mg flag nation country banner madagascar
-
🇲🇭 flag marshall islands marshall islands flag nation country banner marshall islands
-
🇲🇰 flag north macedonia macedonia flag nation country banner north macedonia
-
🇲🇱 flag mali ml flag nation country banner mali
-
🇲🇲 flag myanmar mm flag nation country banner myanmar
-
🇲🇳 flag mongolia mn flag nation country banner mongolia
-
🇲🇴 flag macao sar china macao flag nation country banner macao sar china
-
🇲🇵 flag northern mariana islands northern mariana islands flag nation country banner northern mariana islands
-
🇲🇶 flag martinique mq flag nation country banner martinique
-
🇲🇷 flag mauritania mr flag nation country banner mauritania
-
🇲🇸 flag montserrat ms flag nation country banner montserrat
-
🇲🇹 flag malta mt flag nation country banner malta
-
🇲🇺 flag mauritius mu flag nation country banner mauritius
-
🇲🇻 flag maldives mv flag nation country banner maldives
-
🇲🇼 flag malawi mw flag nation country banner malawi
-
🇲🇽 flag mexico mx flag nation country banner mexico
-
🇲🇾 flag malaysia my flag nation country banner malaysia
-
🇲🇿 flag mozambique mz flag nation country banner mozambique
-
🇳🇦 flag namibia na flag nation country banner namibia
-
🇳🇨 flag new caledonia new caledonia flag nation country banner new caledonia
-
🇳🇪 flag niger ne flag nation country banner niger
-
🇳🇫 flag norfolk island norfolk island flag nation country banner norfolk island
-
🇳🇬 flag nigeria flag nation country banner nigeria
-
🇳🇮 flag nicaragua ni flag nation country banner nicaragua
-
🇳🇱 flag netherlands nl flag nation country banner netherlands
-
🇳🇴 flag norway no flag nation country banner norway
-
🇳🇵 flag nepal np flag nation country banner nepal
-
🇳🇷 flag nauru nr flag nation country banner nauru
-
🇳🇺 flag niue nu flag nation country banner niue
-
🇳🇿 flag new zealand new zealand flag nation country banner new zealand
-
🇴🇲 flag oman om symbol flag nation country banner oman
-
🇵🇦 flag panama pa flag nation country banner panama
-
🇵🇪 flag peru pe flag nation country banner peru
-
🇵🇫 flag french polynesia french polynesia flag nation country banner french polynesia
-
🇵🇬 flag papua new guinea papua new guinea flag nation country banner papua new guinea
-
🇵🇭 flag philippines ph flag nation country banner philippines
-
🇵🇰 flag pakistan pk flag nation country banner pakistan
-
🇵🇱 flag poland pl flag nation country banner poland
-
🇵🇲 flag st pierre miquelon saint pierre miquelon flag nation country banner st pierre miquelon
-
🇵🇳 flag pitcairn islands pitcairn flag nation country banner pitcairn islands
-
🇵🇷 flag puerto rico puerto rico flag nation country banner puerto rico
-
🇵🇸 flag palestinian territories palestine palestinian territories flag nation country banner palestinian territories
-
🇵🇹 flag portugal pt flag nation country banner portugal
-
🇵🇼 flag palau pw flag nation country banner palau
-
🇵🇾 flag paraguay py flag nation country banner paraguay
-
🇶🇦 flag qatar qa flag nation country banner qatar
-
🇷🇪 flag reunion réunion flag nation country banner reunion
-
🇷🇴 flag romania ro flag nation country banner romania
-
🇷🇸 flag serbia rs flag nation country banner serbia
-
🇷🇺 flag russia russian federation flag nation country banner russia
-
🇷🇼 flag rwanda rw flag nation country banner rwanda
-
🇸🇦 flag saudi arabia flag nation country banner saudi arabia
-
🇸🇧 flag solomon islands solomon islands flag nation country banner solomon islands
-
🇸🇨 flag seychelles sc flag nation country banner seychelles
-
🇸🇩 flag sudan sd flag nation country banner sudan
-
🇸🇪 flag sweden se flag nation country banner sweden
-
🇸🇬 flag singapore sg flag nation country banner singapore
-
🇸🇭 flag st helena saint helena ascension tristan cunha flag nation country banner st helena
-
🇸🇮 flag slovenia si flag nation country banner slovenia
-
🇸🇯 flag svalbard jan mayen
-
🇸🇰 flag slovakia sk flag nation country banner slovakia
-
🇸🇱 flag sierra leone sierra leone flag nation country banner sierra leone
-
🇸🇲 flag san marino san marino flag nation country banner san marino
-
🇸🇳 flag senegal sn flag nation country banner senegal
-
🇸🇴 flag somalia so flag nation country banner somalia
-
🇸🇷 flag suriname sr flag nation country banner suriname
-
🇸🇸 flag south sudan south sd flag nation country banner south sudan
-
🇸🇹 flag sao tome principe sao tome principe flag nation country banner sao tome principe
-
🇸🇻 flag el salvador el salvador flag nation country banner el salvador
-
🇸🇽 flag sint maarten sint maarten dutch flag nation country banner sint maarten
-
🇸🇾 flag syria syrian arab republic flag nation country banner syria
-
🇸🇿 flag eswatini sz flag nation country banner eswatini
-
🇹🇦 flag tristan da cunha
-
🇹🇨 flag turks caicos islands turks caicos islands flag nation country banner turks caicos islands
-
🇹🇩 flag chad td flag nation country banner chad
-
🇹🇫 flag french southern territories french southern territories flag nation country banner french southern territories
-
🇹🇬 flag togo tg flag nation country banner togo
-
🇹🇭 flag thailand th flag nation country banner thailand
-
🇹🇯 flag tajikistan tj flag nation country banner tajikistan
-
🇹🇰 flag tokelau tk flag nation country banner tokelau
-
🇹🇱 flag timor leste timor leste flag nation country banner timor leste
-
🇹🇲 flag turkmenistan flag nation country banner turkmenistan
-
🇹🇳 flag tunisia tn flag nation country banner tunisia
-
🇹🇴 flag tonga to flag nation country banner tonga
-
🇹🇷 flag turkey turkey flag nation country banner turkey
-
🇹🇹 flag trinidad tobago trinidad tobago flag nation country banner trinidad tobago
-
🇹🇻 flag tuvalu flag nation country banner tuvalu
-
🇹🇼 flag taiwan tw flag nation country banner taiwan
-
🇹🇿 flag tanzania tanzania united republic flag nation country banner tanzania
-
🇺🇦 flag ukraine ua flag nation country banner ukraine
-
🇺🇬 flag uganda ug flag nation country banner uganda
-
🇺🇲 flag u s outlying islands
-
🇺🇳 flag united nations un flag banner
-
🇺🇸 flag united states united states america flag nation country banner united states
-
🇺🇾 flag uruguay uy flag nation country banner uruguay
-
🇺🇿 flag uzbekistan uz flag nation country banner uzbekistan
-
🇻🇦 flag vatican city vatican city flag nation country banner vatican city
-
🇻🇨 flag st vincent grenadines saint vincent grenadines flag nation country banner st vincent grenadines
-
🇻🇪 flag venezuela ve bolivarian republic flag nation country banner venezuela
-
🇻🇬 flag british virgin islands british virgin islands bvi flag nation country banner british virgin islands
-
🇻🇮 flag u s virgin islands virgin islands us flag nation country banner u s virgin islands
-
🇻🇳 flag vietnam viet nam flag nation country banner vietnam
-
🇻🇺 flag vanuatu vu flag nation country banner vanuatu
-
🇼🇫 flag wallis futuna wallis futuna flag nation country banner wallis futuna
-
🇼🇸 flag samoa ws flag nation country banner samoa
-
🇽🇰 flag kosovo xk flag nation country banner kosovo
-
🇾🇪 flag yemen ye flag nation country banner yemen
-
🇾🇹 flag mayotte yt flag nation country banner mayotte
-
🇿🇦 flag south africa south africa flag nation country banner south africa
-
🇿🇲 flag zambia zm flag nation country banner zambia
-
🇿🇼 flag zimbabwe zw flag nation country banner zimbabwe
-
🏴󠁧󠁢󠁥󠁮󠁧󠁿 flag england flag english
-
🏴󠁧󠁢󠁳󠁣󠁴󠁿 flag scotland flag scottish
-
🏴󠁧󠁢󠁷󠁬󠁳󠁿 flag wales flag welsh
-
🥲 smiling face with tear sad cry pretend
-
🥸 disguised face pretent brows glasses moustache
-
🤌 pinched fingers size tiny small
-
🫀 anatomical heart health heartbeat
-
🫁 lungs breathe
-
🥷 ninja ninjutsu skills japanese
-
🤵‍♂️ man in tuxedo formal fashion
-
🤵‍♀️ woman in tuxedo formal fashion
-
👰‍♂️ man with veil wedding marriage
-
👰‍♀️ woman with veil wedding marriage
-
👩‍🍼 woman feeding baby birth food
-
👨‍🍼 man feeding baby birth food
-
🧑‍🍼 person feeding baby birth food
-
🧑‍🎄 mx claus christmas
-
🫂 people hugging care
-
🐈‍⬛ black cat superstition luck
-
🦬 bison ox
-
🦣 mammoth elephant tusks
-
🦫 beaver animal rodent
-
🐻‍❄️ polar bear animal arctic
-
🦤 dodo animal bird
-
🪶 feather bird fly
-
🦭 seal animal creature sea
-
🪲 beetle insect
-
🪳 cockroach insect pests
-
🪰 fly insect
-
🪱 worm animal
-
🪴 potted plant greenery house
-
🫐 blueberries fruit
-
🫒 olive fruit
-
🫑 bell pepper fruit plant
-
🫓 flatbread flour food
-
🫔 tamale food masa
-
🫕 fondue cheese pot food
-
🫖 teapot drink hot
-
🧋 bubble tea taiwan boba milk tea straw
-
🪨 rock stone
-
🪵 wood nature timber trunk
-
🛖 hut house structure
-
🛻 pickup truck car transportation
-
🛼 roller skate footwear sports
-
🪄 magic wand supernature power
-
🪅 pinata mexico candy celebration
-
🪆 nesting dolls matryoshka toy
-
🪡 sewing needle stitches
-
🪢 knot rope scout
-
🩴 thong sandal footwear summer
-
🪖 military helmet army protection
-
🪗 accordion music
-
🪘 long drum music
-
🪙 coin money currency
-
🪃 boomerang weapon
-
🪚 carpentry saw cut chop
-
🪛 screwdriver tools
-
🪝 hook tools
-
🪜 ladder tools
-
🛗 elevator lift
-
🪞 mirror reflection
-
🪟 window scenery
-
🪠 plunger toilet
-
🪤 mouse trap cheese
-
🪣 bucket water container
-
🪥 toothbrush hygiene dental
-
🪦 headstone death rip grave
-
🪧 placard announcement
-
⚧️ transgender symbol lgbtq
-
🏳️‍⚧️ transgender flag lgbtq
-
😶‍🌫️ face in clouds shower steam dream
-
😮‍💨 face exhaling relieve relief tired sigh
-
😵‍💫 face with spiral eyes sick ill confused nauseous nausea
-
❤️‍🔥 heart on fire passionate enthusiastic
-
❤️‍🩹 mending heart broken heart bandage wounded
-
🧔‍♂️ man beard facial hair
-
🧔‍♀️ woman beard facial hair
-
🫠 melting face hot heat
-
🫢 face with open eyes and hand over mouth silence secret shock surprise
-
🫣 face with peeking eye scared frightening embarrassing
-
🫡 saluting face respect salute
-
🫥 dotted line face invisible lonely isolation depression
-
🫤 face with diagonal mouth skeptic confuse frustrated indifferent
-
🥹 face holding back tears touched gratitude
-
🫱 rightwards hand palm offer
-
🫲 leftwards hand palm offer
-
🫳 palm down hand palm drop
-
🫴 palm up hand lift offer demand
-
🫰 hand with index finger and thumb crossed heart love money expensive
-
🫵 index pointing at the viewer you recruit
-
🫶 heart hands love appreciation support
-
🫦 biting lip flirt sexy pain worry
-
🫅 person with crown royalty power
-
🫃 pregnant man baby belly
-
🫄 pregnant person baby belly
-
🧌 troll mystical monster
-
🪸 coral ocean sea reef
-
🪷 lotus flower calm meditation
-
🪹 empty nest bird
-
🪺 nest with eggs bird
-
🫘 beans food
-
🫗 pouring liquid cup water
-
🫙 jar container sauce
-
🛝 playground slide fun park
-
🛞 wheel car transport
-
🛟 ring buoy life saver life preserver
-
🪬 hamsa religion protection
-
🪩 mirror ball disco dance party
-
🪫 low battery drained dead
-
🩼 crutch accessibility assist
-
🩻 x-ray skeleton medicine
-
🫧 bubbles soap fun carbonation sparkling
-
🪪 identification card document
-
🟰 heavy equals sign math
-144
dots/update-crush-models.sh
···
-
#!/usr/bin/env bash
-
-
set -euo pipefail
-
-
# Configuration
-
COPILOT_TOKEN=$(bash ~/.config/crush/copilot.sh)
-
ANTHROPIC_TOKEN=$(bunx anthropic-api-key)
-
-
# Colors for output
-
RED='\033[0;31m'
-
GREEN='\033[0;32m'
-
YELLOW='\033[1;33m'
-
BLUE='\033[0;34m'
-
NC='\033[0m' # No Color
-
-
echo -e "${GREEN}Fetching latest models from APIs...${NC}"
-
-
# Fetch Copilot models
-
echo " → Fetching Copilot models..."
-
COPILOT_MODELS=$(curl -s https://api.githubcopilot.com/models \
-
-H "Authorization: Bearer $COPILOT_TOKEN" \
-
-H "Editor-Version: CRUSH/1.0" \
-
-H "Editor-Plugin-Version: CRUSH/1.0" \
-
-H "Copilot-Integration-Id: vscode-chat")
-
-
# Fetch Anthropic models
-
echo " → Fetching Anthropic models..."
-
ANTHROPIC_MODELS=$(curl -s https://api.anthropic.com/v1/models \
-
-H "Authorization: Bearer $ANTHROPIC_TOKEN" \
-
-H "anthropic-version: 2023-06-01" \
-
-H "anthropic-beta: oauth-2025-04-20")
-
-
# Extract model-picker enabled Copilot models
-
echo -e "\n${GREEN}Copilot models (model_picker_enabled):${NC}"
-
echo "$COPILOT_MODELS" | jq -r '.data[] | select(.model_picker_enabled == true) | " ✓ \(.id) - \(.name)"'
-
-
# Extract all Anthropic models
-
echo -e "\n${GREEN}Anthropic models:${NC}"
-
echo "$ANTHROPIC_MODELS" | jq -r '.data[] | " ✓ \(.id) - \(.display_name)"'
-
-
# Generate Copilot models Nix config
-
generate_copilot_models() {
-
echo "$COPILOT_MODELS" | jq -r '.data[] | select(.model_picker_enabled == true) |
-
(if .capabilities.supports.tool_calls then true else false end) as $can_reason |
-
(if .capabilities.supports.vision then true else false end) as $supports_attachments |
-
" {\n" +
-
" id = \"\(.id)\";\n" +
-
" name = \"Copilot: \(.name)\";\n" +
-
" cost_per_1m_in = 0;\n" +
-
" cost_per_1m_out = 0;\n" +
-
" cost_per_1m_in_cached = 0;\n" +
-
" cost_per_1m_out_cached = 0;\n" +
-
" context_window = \(.capabilities.limits.max_context_window_tokens);\n" +
-
" default_max_tokens = \(.capabilities.limits.max_output_tokens);\n" +
-
" can_reason = \($can_reason);\n" +
-
" has_reasoning_efforts = false;\n" +
-
" supports_attachments = \($supports_attachments);\n" +
-
" }"'
-
}
-
-
# Generate Anthropic models Nix config with pricing
-
generate_anthropic_models() {
-
echo "$ANTHROPIC_MODELS" | jq -r '.data[] |
-
# Determine pricing based on model family
-
(if (.id | contains("opus-4")) then
-
{in: 15.0, out: 75.0, in_cached: 1.5, out_cached: 75.0}
-
elif (.id | contains("sonnet-4")) then
-
{in: 3.0, out: 15.0, in_cached: 0.225, out_cached: 15.0}
-
elif (.id | contains("3-7-sonnet")) then
-
{in: 2.5, out: 12.0, in_cached: 0.187, out_cached: 12.0}
-
elif (.id | contains("3-5-sonnet")) then
-
{in: 3.0, out: 15.0, in_cached: 0.225, out_cached: 15.0}
-
elif (.id | contains("3-5-haiku")) then
-
{in: 0.8, out: 4.0, in_cached: 0.06, out_cached: 4.0}
-
elif (.id | contains("3-haiku")) then
-
{in: 0.25, out: 1.25, in_cached: 0.03, out_cached: 1.25}
-
elif (.id | contains("3-opus")) then
-
{in: 15.0, out: 75.0, in_cached: 1.5, out_cached: 75.0}
-
else
-
{in: 3.0, out: 15.0, in_cached: 0.225, out_cached: 15.0}
-
end) as $pricing |
-
-
# Determine context window and max tokens
-
(if (.id | test("claude-sonnet-4-5"))
-
then {context: 200000, max_tokens: 64000}
-
elif (.id | test("claude-sonnet-4-"))
-
then {context: 200000, max_tokens: 64000}
-
elif (.id | test("claude-3-7-sonnet"))
-
then {context: 200000, max_tokens: 64000}
-
elif (.id | test("claude-opus-4-1"))
-
then {context: 200000, max_tokens: 32000}
-
elif (.id | test("claude-opus-4-"))
-
then {context: 200000, max_tokens: 32000}
-
elif (.id | test("claude-3-5-haiku"))
-
then {context: 200000, max_tokens: 8192}
-
elif (.id | test("claude-3-haiku"))
-
then {context: 200000, max_tokens: 4096}
-
else
-
{context: 200000, max_tokens: 8192}
-
end) as $limits |
-
-
# Determine has_reasoning_efforts
-
(if (.id | contains("opus-4")) then true else false end) as $has_reasoning |
-
-
" {\n" +
-
" id = \"\(.id)\";\n" +
-
" name = \"\(.display_name)\";\n" +
-
" cost_per_1m_in = \($pricing.in);\n" +
-
" cost_per_1m_out = \($pricing.out);\n" +
-
" cost_per_1m_in_cached = \($pricing.in_cached);\n" +
-
" cost_per_1m_out_cached = \($pricing.out_cached);\n" +
-
" context_window = \($limits.context);\n" +
-
" default_max_tokens = \($limits.max_tokens);\n" +
-
" can_reason = true;\n" +
-
" has_reasoning_efforts = \($has_reasoning);\n" +
-
" supports_attachments = true;\n" +
-
" }"'
-
}
-
-
# Generate formatted model arrays
-
COPILOT_MODELS_NIX=$(generate_copilot_models)
-
ANTHROPIC_MODELS_NIX=$(generate_anthropic_models)
-
-
# Output results
-
echo -e "\n${BLUE}═══════════════════════════════════════════════════════════${NC}"
-
echo -e "${YELLOW}COPILOT MODELS${NC}"
-
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
-
echo -e "\nPaste this into your copilot.models array:\n"
-
echo " models = ["
-
echo "$COPILOT_MODELS_NIX"
-
echo " ];"
-
-
echo -e "\n${BLUE}═══════════════════════════════════════════════════════════${NC}"
-
echo -e "${YELLOW}ANTHROPIC MODELS${NC}"
-
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
-
echo -e "\nPaste this into your claude-pro.models array:\n"
-
echo " models = ["
-
echo "$ANTHROPIC_MODELS_NIX"
-
echo " ];"
-
-
echo -e "\n${BLUE}═══════════════════════════════════════════════════════════${NC}"
-
echo -e "\n${GREEN}Summary:${NC}"
-
echo " • Copilot models: $(echo "$COPILOT_MODELS" | jq '[.data[] | select(.model_picker_enabled == true)] | length')"
-
echo " • Anthropic models: $(echo "$ANTHROPIC_MODELS" | jq '.data | length')"
-309
dots/user.js
···
-
//
-
/* You may copy+paste this file and use it as it is.
-
*
-
* If you make changes to your about:config while the program is running, the
-
* changes will be overwritten by the user.js when the application restarts.
-
*
-
* To make lasting changes to preferences, you will have to edit the user.js.
-
*/
-
-
/****************************************************************************
-
* Betterfox *
-
* "Ad meliora" *
-
* version: 129 *
-
* url: https://github.com/yokoffing/Betterfox *
-
****************************************************************************/
-
-
/****************************************************************************
-
* SECTION: FASTFOX *
-
****************************************************************************/
-
/** GENERAL ***/
-
user_pref("content.notify.interval", 100000);
-
-
/** GFX ***/
-
user_pref("gfx.canvas.accelerated.cache-items", 4096);
-
user_pref("gfx.canvas.accelerated.cache-size", 512);
-
user_pref("gfx.content.skia-font-cache-size", 20);
-
-
/** DISK CACHE ***/
-
user_pref("browser.cache.jsbc_compression_level", 3);
-
-
/** MEDIA CACHE ***/
-
user_pref("media.memory_cache_max_size", 65536);
-
user_pref("media.cache_readahead_limit", 7200);
-
user_pref("media.cache_resume_threshold", 3600);
-
-
/** IMAGE CACHE ***/
-
user_pref("image.mem.decode_bytes_at_a_time", 32768);
-
-
/** NETWORK ***/
-
user_pref("network.http.max-connections", 1800);
-
user_pref("network.http.max-persistent-connections-per-server", 10);
-
user_pref("network.http.max-urgent-start-excessive-connections-per-host", 5);
-
user_pref("network.http.pacing.requests.enabled", false);
-
user_pref("network.dnsCacheExpiration", 3600);
-
user_pref("network.ssl_tokens_cache_capacity", 10240);
-
-
/** SPECULATIVE LOADING ***/
-
user_pref("network.dns.disablePrefetch", true);
-
user_pref("network.dns.disablePrefetchFromHTTPS", true);
-
user_pref("network.prefetch-next", false);
-
user_pref("network.predictor.enabled", false);
-
user_pref("network.predictor.enable-prefetch", false);
-
-
/** EXPERIMENTAL ***/
-
user_pref("layout.css.grid-template-masonry-value.enabled", true);
-
user_pref("dom.enable_web_task_scheduling", true);
-
user_pref("dom.security.sanitizer.enabled", true);
-
-
/****************************************************************************
-
* SECTION: SECUREFOX *
-
****************************************************************************/
-
/** TRACKING PROTECTION ***/
-
user_pref("browser.contentblocking.category", "strict");
-
user_pref(
-
"urlclassifier.trackingSkipURLs",
-
"*.reddit.com, *.twitter.com, *.twimg.com, *.tiktok.com"
-
);
-
user_pref(
-
"urlclassifier.features.socialtracking.skipURLs",
-
"*.instagram.com, *.twitter.com, *.twimg.com"
-
);
-
user_pref("network.cookie.sameSite.noneRequiresSecure", true);
-
user_pref("browser.download.start_downloads_in_tmp_dir", true);
-
user_pref("browser.helperApps.deleteTempFileOnExit", true);
-
user_pref("browser.uitour.enabled", false);
-
user_pref("privacy.globalprivacycontrol.enabled", true);
-
-
/** OCSP & CERTS / HPKP ***/
-
user_pref("security.OCSP.enabled", 0);
-
user_pref("security.remote_settings.crlite_filters.enabled", true);
-
user_pref("security.pki.crlite_mode", 2);
-
-
/** SSL / TLS ***/
-
user_pref("security.ssl.treat_unsafe_negotiation_as_broken", true);
-
user_pref("browser.xul.error_pages.expert_bad_cert", true);
-
user_pref("security.tls.enable_0rtt_data", false);
-
-
/** DISK AVOIDANCE ***/
-
user_pref("browser.privatebrowsing.forceMediaMemoryCache", true);
-
user_pref("browser.sessionstore.interval", 60000);
-
-
/** SHUTDOWN & SANITIZING ***/
-
user_pref("privacy.history.custom", true);
-
-
/** SEARCH / URL BAR ***/
-
user_pref("browser.urlbar.trimHttps", true);
-
user_pref("browser.urlbar.untrimOnUserInteraction.featureGate", true);
-
user_pref("browser.search.separatePrivateDefault.ui.enabled", true);
-
user_pref("browser.urlbar.update2.engineAliasRefresh", true);
-
user_pref("browser.search.suggest.enabled", false);
-
user_pref("browser.urlbar.quicksuggest.enabled", false);
-
user_pref("browser.urlbar.suggest.quicksuggest.sponsored", false);
-
user_pref("browser.urlbar.suggest.quicksuggest.nonsponsored", false);
-
user_pref("browser.urlbar.groupLabels.enabled", false);
-
user_pref("browser.formfill.enable", false);
-
user_pref("security.insecure_connection_text.enabled", true);
-
user_pref("security.insecure_connection_text.pbmode.enabled", true);
-
user_pref("network.IDN_show_punycode", true);
-
-
/** HTTPS-FIRST POLICY ***/
-
user_pref("dom.security.https_first", true);
-
-
/** PASSWORDS ***/
-
user_pref("signon.formlessCapture.enabled", false);
-
user_pref("signon.privateBrowsingCapture.enabled", false);
-
user_pref("network.auth.subresource-http-auth-allow", 1);
-
user_pref("editor.truncate_user_pastes", false);
-
-
/** MIXED CONTENT + CROSS-SITE ***/
-
user_pref("security.mixed_content.block_display_content", true);
-
user_pref("pdfjs.enableScripting", false);
-
user_pref("extensions.postDownloadThirdPartyPrompt", false);
-
-
/** HEADERS / REFERERS ***/
-
user_pref("network.http.referer.XOriginTrimmingPolicy", 2);
-
-
/** CONTAINERS ***/
-
user_pref("privacy.userContext.ui.enabled", true);
-
-
/** WEBRTC ***/
-
user_pref("media.peerconnection.ice.proxy_only_if_behind_proxy", true);
-
user_pref("media.peerconnection.ice.default_address_only", true);
-
-
/** SAFE BROWSING ***/
-
user_pref("browser.safebrowsing.downloads.remote.enabled", false);
-
-
/** MOZILLA ***/
-
user_pref("permissions.default.desktop-notification", 2);
-
user_pref("permissions.default.geo", 2);
-
user_pref("permissions.manager.defaultsUrl", "");
-
user_pref("webchannel.allowObject.urlWhitelist", "");
-
-
/** TELEMETRY ***/
-
user_pref("datareporting.policy.dataSubmissionEnabled", false);
-
user_pref("datareporting.healthreport.uploadEnabled", false);
-
user_pref("toolkit.telemetry.unified", false);
-
user_pref("toolkit.telemetry.enabled", false);
-
user_pref("toolkit.telemetry.server", "data:,");
-
user_pref("toolkit.telemetry.archive.enabled", false);
-
user_pref("toolkit.telemetry.newProfilePing.enabled", false);
-
user_pref("toolkit.telemetry.shutdownPingSender.enabled", false);
-
user_pref("toolkit.telemetry.updatePing.enabled", false);
-
user_pref("toolkit.telemetry.bhrPing.enabled", false);
-
user_pref("toolkit.telemetry.firstShutdownPing.enabled", false);
-
user_pref("toolkit.telemetry.coverage.opt-out", true);
-
user_pref("toolkit.coverage.opt-out", true);
-
user_pref("toolkit.coverage.endpoint.base", "");
-
user_pref("browser.newtabpage.activity-stream.feeds.telemetry", false);
-
user_pref("browser.newtabpage.activity-stream.telemetry", false);
-
-
/** EXPERIMENTS ***/
-
user_pref("app.shield.optoutstudies.enabled", false);
-
user_pref("app.normandy.enabled", false);
-
user_pref("app.normandy.api_url", "");
-
-
/** CRASH REPORTS ***/
-
user_pref("breakpad.reportURL", "");
-
user_pref("browser.tabs.crashReporting.sendReport", false);
-
user_pref("browser.crashReports.unsubmittedCheck.autoSubmit2", false);
-
-
/** DETECTION ***/
-
user_pref("captivedetect.canonicalURL", "");
-
user_pref("network.captive-portal-service.enabled", false);
-
user_pref("network.connectivity-service.enabled", false);
-
-
/****************************************************************************
-
* SECTION: PESKYFOX *
-
****************************************************************************/
-
/** MOZILLA UI ***/
-
user_pref("browser.privatebrowsing.vpnpromourl", "");
-
user_pref("extensions.getAddons.showPane", false);
-
user_pref("extensions.htmlaboutaddons.recommendations.enabled", false);
-
user_pref("browser.discovery.enabled", false);
-
user_pref("browser.shell.checkDefaultBrowser", false);
-
user_pref(
-
"browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons",
-
false
-
);
-
user_pref(
-
"browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features",
-
false
-
);
-
user_pref("browser.preferences.moreFromMozilla", false);
-
user_pref("browser.aboutConfig.showWarning", false);
-
user_pref("browser.aboutwelcome.enabled", false);
-
user_pref("browser.tabs.tabmanager.enabled", false);
-
user_pref("browser.profiles.enabled", true);
-
-
/** THEME ADJUSTMENTS ***/
-
user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true);
-
user_pref("browser.compactmode.show", true);
-
user_pref("browser.display.focus_ring_on_anything", true);
-
user_pref("browser.display.focus_ring_style", 0);
-
user_pref("browser.display.focus_ring_width", 0);
-
user_pref("layout.css.prefers-color-scheme.content-override", 2);
-
user_pref("browser.privateWindowSeparation.enabled", false); // WINDOWS
-
user_pref(
-
"browser.newtabpage.activity-stream.newtabWallpapers.v2.enabled",
-
true
-
);
-
-
/** COOKIE BANNER HANDLING ***/
-
user_pref("cookiebanners.service.mode", 1);
-
user_pref("cookiebanners.service.mode.privateBrowsing", 1);
-
-
/** FULLSCREEN NOTICE ***/
-
user_pref("full-screen-api.transition-duration.enter", "0 0");
-
user_pref("full-screen-api.transition-duration.leave", "0 0");
-
user_pref("full-screen-api.warning.delay", -1);
-
user_pref("full-screen-api.warning.timeout", 0);
-
-
/** URL BAR ***/
-
user_pref("browser.urlbar.suggest.calculator", true);
-
user_pref("browser.urlbar.unitConversion.enabled", true);
-
user_pref("browser.urlbar.trending.featureGate", false);
-
-
/** NEW TAB PAGE ***/
-
user_pref("browser.newtabpage.activity-stream.feeds.topsites", false);
-
user_pref("browser.newtabpage.activity-stream.feeds.section.topstories", false);
-
-
/** POCKET ***/
-
user_pref("extensions.pocket.enabled", false);
-
-
/** DOWNLOADS ***/
-
user_pref("browser.download.manager.addToRecentDocs", false);
-
-
/** PDF ***/
-
user_pref("browser.download.open_pdf_attachments_inline", true);
-
-
/** TAB BEHAVIOR ***/
-
user_pref("browser.bookmarks.openInTabClosesMenu", false);
-
user_pref("browser.menu.showViewImageInfo", true);
-
user_pref("findbar.highlightAll", true);
-
user_pref("layout.word_select.eat_space_to_next_word", false);
-
-
/****************************************************************************
-
* START: MY OVERRIDES *
-
****************************************************************************/
-
// visit https://github.com/yokoffing/Betterfox/wiki/Common-Overrides
-
// visit https://github.com/yokoffing/Betterfox/wiki/Optional-Hardening
-
// Enter your personal overrides below this line:
-
-
// PREF: preferred color scheme for websites and sub-pages
-
// Dark (0), Light (1), System (2), Browser (3)
-
user_pref("layout.css.prefers-color-scheme.content-override", 0);
-
-
user_pref("browser.download.useDownloadDir", true); // DEFAULT
-
user_pref("browser.download.always_ask_before_handling_new_types", true);
-
-
// PREF: restore search engine suggestions
-
user_pref("browser.search.suggest.enabled", true);
-
-
// PREF: disable Firefox Sync
-
user_pref("identity.fxaccounts.enabled", false);
-
-
// PREF: disable the Firefox View tour from popping up
-
user_pref("browser.firefox-view.feature-tour", '{"screen":"","complete":true}');
-
-
// PREF: do not allow embedded tweets, Instagram, Reddit, and Tiktok posts
-
user_pref("urlclassifier.trackingSkipURLs", "");
-
user_pref("urlclassifier.features.socialtracking.skipURLs", "");
-
-
// PREF: enable HTTPS-Only Mode
-
// Warn me before loading sites that don't support HTTPS
-
// in both Normal and Private Browsing windows.
-
user_pref("dom.security.https_only_mode", true);
-
user_pref("dom.security.https_only_mode_error_page_user_suggestions", true);
-
-
// PREF: enforce certificate pinning
-
// [ERROR] MOZILLA_PKIX_ERROR_KEY_PINNING_FAILURE
-
// 1 = allow user MiTM (such as your antivirus) (default)
-
// 2 = strict
-
user_pref("security.cert_pinning.enforcement_level", 2);
-
-
// PREF: delete cookies, cache, and site data on shutdown
-
user_pref("privacy.sanitize.sanitizeOnShutdown", true);
-
user_pref("privacy.clearOnShutdown_v2.cache", true); // DEFAULT
-
user_pref("privacy.clearOnShutdown_v2.cookiesAndStorage", true); // DEFAULT
-
user_pref("privacy.clearOnShutdown_v2.historyFormDataAndDownloads", false);
-
-
// PREF: enforce DNS-over-HTTPS (DoH)
-
user_pref("network.trr.mode", 2);
-
user_pref("network.trr.max-fails", 5);
-
/****************************************************************************
-
* SECTION: SMOOTHFOX *
-
****************************************************************************/
-
// visit https://github.com/yokoffing/Betterfox/blob/main/Smoothfox.js
-
// Enter your scrolling overrides below this line:
-
-
/****************************************************************************************
-
* OPTION: SHARPEN SCROLLING *
-
****************************************************************************************/
-
// credit: https://github.com/black7375/Firefox-UI-Fix
-
// only sharpen scrolling
-
user_pref("apz.overscroll.enabled", true); // DEFAULT NON-LINUX
-
-
/****************************************************************************
-
* END: BETTERFOX *
-
****************************************************************************/
dots/wallpapers/acon-forest.jpg

This is a binary file and will not be displayed.

dots/wallpapers/acon-fsh.jpg

This is a binary file and will not be displayed.

dots/wallpapers/acon-gradient-clouds.jpg

This is a binary file and will not be displayed.

dots/wallpapers/acon-pier.jpg

This is a binary file and will not be displayed.

dots/wallpapers/acon-rocks.jpg

This is a binary file and will not be displayed.

dots/wallpapers/acon-star.jpg

This is a binary file and will not be displayed.

dots/wallpapers/annie-athena.jpg

This is a binary file and will not be displayed.

dots/wallpapers/candy-stained-glass.jpg

This is a binary file and will not be displayed.

dots/wallpapers/highway.jpg

This is a binary file and will not be displayed.

dots/wallpapers/kailing-canyon.jpg

This is a binary file and will not be displayed.

dots/wallpapers/kailing-comet.jpg

This is a binary file and will not be displayed.

dots/wallpapers/kailing-shooting-star.jpg

This is a binary file and will not be displayed.

dots/wallpapers/kailing-swirls.jpg

This is a binary file and will not be displayed.

dots/wallpapers/tongyu-catcat.jpg

This is a binary file and will not be displayed.

dots/wallpapers/tongyu-waves.jpg

This is a binary file and will not be displayed.

dots/wallpapers/yessa-cat.jpg

This is a binary file and will not be displayed.

+308 -1043
flake.lock
···
{
"nodes": {
-
"actor-typeahead-src": {
-
"flake": false,
-
"locked": {
-
"lastModified": 1762835797,
-
"narHash": "sha256-heizoWUKDdar6ymfZTnj3ytcEv/L4d4fzSmtr0HlXsQ=",
-
"ref": "refs/heads/main",
-
"rev": "677fe7f743050a4e7f09d4a6f87bbf1325a06f6b",
-
"revCount": 6,
-
"type": "git",
-
"url": "https://tangled.org/@jakelazaroff.com/actor-typeahead"
-
},
-
"original": {
-
"type": "git",
-
"url": "https://tangled.org/@jakelazaroff.com/actor-typeahead"
-
}
-
},
"agenix": {
"inputs": {
"darwin": "darwin",
···
"systems": "systems"
},
"locked": {
-
"lastModified": 1762618334,
-
"narHash": "sha256-wyT7Pl6tMFbFrs8Lk/TlEs81N6L+VSybPfiIgzU8lbQ=",
+
"lastModified": 1720546205,
+
"narHash": "sha256-boCXsjYVxDviyzoEyAk624600f3ZBo/DKtUdvMTpbGY=",
"owner": "ryantm",
"repo": "agenix",
-
"rev": "fcdea223397448d35d9b31f798479227e80183f6",
+
"rev": "de96bd907d5fbc3b14fc33ad37d1b9a3cb15edc6",
"type": "github"
},
"original": {
···
"type": "github"
}
},
-
"battleship-arena": {
+
"aquamarine": {
"inputs": {
+
"hyprutils": [
+
"hyprnix",
+
"hyprutils"
+
],
+
"hyprwayland-scanner": [
+
"hyprnix",
+
"hyprwayland-scanner"
+
],
"nixpkgs": [
+
"hyprnix",
"nixpkgs"
+
],
+
"systems": [
+
"hyprnix",
+
"systems"
]
},
"locked": {
-
"lastModified": 1765226744,
-
"narHash": "sha256-3uCn0DQPlyYufnTeugp4qZbdddv4q2a+y9hXdgH/iOU=",
-
"owner": "taciturnaxolotl",
-
"repo": "battleship-arena",
-
"rev": "20d9604ef8fdd7e30244ef6e7d4cde541c4a0863",
+
"lastModified": 1722705009,
+
"narHash": "sha256-U/FTS7uJVPy9jEcHdPfnIhq7e14TXOoxX9xlKltoQdY=",
+
"owner": "hyprwm",
+
"repo": "aquamarine",
+
"rev": "a70fc6a2fd53fc82f0cbb464fd8e91f00511cfc1",
"type": "github"
},
"original": {
-
"owner": "taciturnaxolotl",
-
"repo": "battleship-arena",
+
"owner": "hyprwm",
+
"repo": "aquamarine",
"type": "github"
}
},
-
"catppuccin": {
+
"bird-nix-lib": {
"inputs": {
"nixpkgs": [
+
"hyprnix",
"nixpkgs"
+
],
+
"systems": [
+
"hyprnix",
+
"systems"
]
},
"locked": {
-
"lastModified": 1754083786,
-
"narHash": "sha256-aLE9rNBMnayFIDpMG3EyCT4i1KDKnPDj63mh17nX4hs=",
-
"owner": "catppuccin",
-
"repo": "nix",
-
"rev": "f518f96a60aceda4cd487437b25eaa48d0f1b97d",
+
"lastModified": 1718015582,
+
"narHash": "sha256-VzK23WKktlJdTcoOh+rXKhSPYRWkl9ShIZh4tB44UV4=",
+
"owner": "spikespaz",
+
"repo": "bird-nix-lib",
+
"rev": "95948f65ac043078661910cb23a123b4b2b9fb8c",
"type": "github"
},
"original": {
-
"owner": "catppuccin",
-
"repo": "nix",
-
"rev": "f518f96a60aceda4cd487437b25eaa48d0f1b97d",
+
"owner": "spikespaz",
+
"repo": "bird-nix-lib",
"type": "github"
}
},
-
"catppuccin-vsc": {
-
"inputs": {
-
"nixpkgs": "nixpkgs_2"
-
},
+
"catppuccin": {
"locked": {
-
"lastModified": 1763921090,
-
"narHash": "sha256-2WprxeG8rOxqnWr4nIA59arkUqH1Up6ZsbruMyis7QE=",
+
"lastModified": 1721784420,
+
"narHash": "sha256-bgF6fN4Qgk7NErFKGuuqWXcLORsiykTYyqMUFRiAUBY=",
"owner": "catppuccin",
-
"repo": "vscode",
-
"rev": "bbe095f1c147152e45a8dc2399212fd8301af904",
+
"repo": "nix",
+
"rev": "8bdb55cc1c13f572b6e4307a3c0d64f1ae286a4f",
"type": "github"
},
"original": {
"owner": "catppuccin",
-
"repo": "vscode",
-
"type": "github"
-
}
-
},
-
"cedarlogic": {
-
"inputs": {
-
"flake-utils": "flake-utils",
-
"nixpkgs": [
-
"nixpkgs"
-
]
-
},
-
"locked": {
-
"lastModified": 1759865868,
-
"narHash": "sha256-Z3nWsQnDZswsIYP2nXwkB0fKWgsmHVmBLLkWMC8GZpI=",
-
"owner": "taciturnaxolotl",
-
"repo": "CedarLogic",
-
"rev": "122eac61a1e7273fadf524bd2b7b1364598df824",
-
"type": "github"
-
},
-
"original": {
-
"owner": "taciturnaxolotl",
-
"repo": "CedarLogic",
-
"type": "github"
-
}
-
},
-
"claude-desktop": {
-
"inputs": {
-
"flake-utils": "flake-utils_2",
-
"nixpkgs": [
-
"nixpkgs"
-
]
-
},
-
"locked": {
-
"lastModified": 1764098187,
-
"narHash": "sha256-H6JjWXhKqxZ8QLMoqndZx9e5x0Sv5AiipSmqvIxIbgo=",
-
"owner": "k3d3",
-
"repo": "claude-desktop-linux-flake",
-
"rev": "b2b040cb68231d2118906507d9cc8fd181ca6308",
-
"type": "github"
-
},
-
"original": {
-
"owner": "k3d3",
-
"repo": "claude-desktop-linux-flake",
+
"repo": "nix",
"type": "github"
}
},
-
"ctfd-alerts": {
+
"catppuccin-vsc": {
"inputs": {
-
"nixpkgs": [
-
"nixpkgs"
-
]
+
"nixpkgs": "nixpkgs_2"
},
"locked": {
-
"lastModified": 1758312668,
-
"narHash": "sha256-ChN8Upf1TCMSJ0a7keuVCZr3DJIm3YPOFLZauVlQc+Y=",
-
"owner": "taciturnaxolotl",
-
"repo": "ctfd-alerts",
-
"rev": "db05e69b7ae683d83aac019cc632346b25e941e2",
-
"type": "github"
+
"lastModified": 1713966373,
+
"narHash": "sha256-8bMRH+z426e6zWcS15QZsQ8moSAKbEDjtBnAE10+DW8=",
+
"rev": "4b857d9b86cbb393e121f0f2544a6efb549dbbf4",
+
"revCount": 482,
+
"type": "tarball",
+
"url": "https://api.flakehub.com/f/pinned/catppuccin/vscode/3.14.0/018f15b6-7a7e-7bae-80f2-cf902f1db7fe/source.tar.gz"
},
"original": {
-
"owner": "taciturnaxolotl",
-
"repo": "ctfd-alerts",
-
"type": "github"
+
"type": "tarball",
+
"url": "https://flakehub.com/f/catppuccin/vscode/%2A.tar.gz"
}
},
"darwin": {
···
]
},
"locked": {
-
"lastModified": 1744478979,
-
"narHash": "sha256-dyN+teG9G82G+m+PX/aSAagkC+vUv0SgUw3XkPhQodQ=",
+
"lastModified": 1700795494,
+
"narHash": "sha256-gzGLZSiOhf155FW7262kdHo2YDeugp3VuIFb4/GGng0=",
"owner": "lnl7",
"repo": "nix-darwin",
-
"rev": "43975d782b418ebf4969e9ccba82466728c2851b",
+
"rev": "4b9b83d5a92e8c1fbfd8eb27eda375908c11ec4d",
"type": "github"
},
"original": {
···
"type": "github"
}
},
-
"deploy-rs": {
-
"inputs": {
-
"flake-compat": "flake-compat",
-
"nixpkgs": [
-
"nixpkgs"
-
],
-
"utils": "utils"
-
},
-
"locked": {
-
"lastModified": 1762286984,
-
"narHash": "sha256-9I2H9x5We6Pl+DBYHjR1s3UT8wgwcpAH03kn9CqtdQc=",
-
"owner": "serokell",
-
"repo": "deploy-rs",
-
"rev": "9c870f63e28ec1e83305f7f6cb73c941e699f74f",
-
"type": "github"
-
},
-
"original": {
-
"owner": "serokell",
-
"repo": "deploy-rs",
-
"type": "github"
-
}
-
},
"disko": {
"inputs": {
"nixpkgs": [
···
]
},
"locked": {
-
"lastModified": 1765326679,
-
"narHash": "sha256-fTLX9kDwLr9Y0rH/nG+h1XG5UU+jBcy0PFYn5eneRX8=",
+
"lastModified": 1721735625,
+
"narHash": "sha256-4T0FK0b3Q7Dd7oj79M7GhA9+YqKxxGT0iN+h8yqdP7s=",
"owner": "nix-community",
"repo": "disko",
-
"rev": "d64e5cdca35b5fad7c504f615357a7afe6d9c49e",
+
"rev": "4698b1ef375e9c904037e0b2049aa73d39ac1b2d",
"type": "github"
},
"original": {
···
"flake-compat": {
"flake": false,
"locked": {
-
"lastModified": 1733328505,
-
"narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
+
"lastModified": 1696426674,
+
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"owner": "edolstra",
"repo": "flake-compat",
-
"rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
+
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"type": "github"
},
"original": {
···
"type": "github"
}
},
-
"flake-compat_3": {
-
"flake": false,
-
"locked": {
-
"lastModified": 1751685974,
-
"narHash": "sha256-NKw96t+BgHIYzHUjkTK95FqYRVKB8DHpVhefWSz/kTw=",
-
"rev": "549f2762aebeff29a2e5ece7a7dc0f955281a1d1",
-
"type": "tarball",
-
"url": "https://git.lix.systems/api/v1/repos/lix-project/flake-compat/archive/549f2762aebeff29a2e5ece7a7dc0f955281a1d1.tar.gz?rev=549f2762aebeff29a2e5ece7a7dc0f955281a1d1"
-
},
-
"original": {
-
"type": "tarball",
-
"url": "https://git.lix.systems/lix-project/flake-compat/archive/main.tar.gz"
-
}
-
},
-
"flake-parts": {
-
"inputs": {
-
"nixpkgs-lib": "nixpkgs-lib"
-
},
-
"locked": {
-
"lastModified": 1741352980,
-
"narHash": "sha256-+u2UunDA4Cl5Fci3m7S643HzKmIDAe+fiXrLqYsR2fs=",
-
"owner": "hercules-ci",
-
"repo": "flake-parts",
-
"rev": "f4330d22f1c5d2ba72d3d22df5597d123fdb60a9",
-
"type": "github"
-
},
-
"original": {
-
"owner": "hercules-ci",
-
"repo": "flake-parts",
-
"type": "github"
-
}
-
},
-
"flake-parts_2": {
-
"inputs": {
-
"nixpkgs-lib": [
-
"nixvim",
-
"nixvim",
-
"nixpkgs"
-
]
-
},
-
"locked": {
-
"lastModified": 1738453229,
-
"narHash": "sha256-7H9XgNiGLKN1G1CgRh0vUL4AheZSYzPm+zmZ7vxbJdo=",
-
"owner": "hercules-ci",
-
"repo": "flake-parts",
-
"rev": "32ea77a06711b758da0ad9bd6a844c5740a87abd",
-
"type": "github"
-
},
-
"original": {
-
"owner": "hercules-ci",
-
"repo": "flake-parts",
-
"type": "github"
-
}
-
},
-
"flake-parts_3": {
-
"inputs": {
-
"nixpkgs-lib": [
-
"nur",
-
"nixpkgs"
-
]
-
},
-
"locked": {
-
"lastModified": 1733312601,
-
"narHash": "sha256-4pDvzqnegAfRkPwO3wmwBhVi/Sye1mzps0zHWYnP88c=",
-
"owner": "hercules-ci",
-
"repo": "flake-parts",
-
"rev": "205b12d8b7cd4802fbcb8e8ef6a0f1408781a4f9",
-
"type": "github"
-
},
-
"original": {
-
"owner": "hercules-ci",
-
"repo": "flake-parts",
-
"type": "github"
-
}
-
},
"flake-utils": {
"inputs": {
-
"systems": "systems_2"
-
},
-
"locked": {
-
"lastModified": 1731533236,
-
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
-
"owner": "numtide",
-
"repo": "flake-utils",
-
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
-
"type": "github"
-
},
-
"original": {
-
"owner": "numtide",
-
"repo": "flake-utils",
-
"type": "github"
-
}
-
},
-
"flake-utils_2": {
-
"inputs": {
"systems": "systems_3"
},
"locked": {
-
"lastModified": 1731533236,
-
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
-
"owner": "numtide",
-
"repo": "flake-utils",
-
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
-
"type": "github"
-
},
-
"original": {
-
"owner": "numtide",
-
"repo": "flake-utils",
-
"type": "github"
-
}
-
},
-
"flake-utils_3": {
-
"inputs": {
-
"systems": "systems_5"
-
},
-
"locked": {
-
"lastModified": 1731533236,
-
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
-
"owner": "numtide",
-
"repo": "flake-utils",
-
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
-
"type": "github"
-
},
-
"original": {
-
"owner": "numtide",
-
"repo": "flake-utils",
-
"type": "github"
-
}
-
},
-
"flake-utils_4": {
-
"inputs": {
-
"systems": "systems_6"
-
},
-
"locked": {
-
"lastModified": 1731533236,
-
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
-
"owner": "numtide",
-
"repo": "flake-utils",
-
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
-
"type": "github"
-
},
-
"original": {
-
"owner": "numtide",
-
"repo": "flake-utils",
-
"type": "github"
-
}
-
},
-
"flake-utils_5": {
-
"inputs": {
-
"systems": "systems_7"
-
},
-
"locked": {
-
"lastModified": 1731533236,
-
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
+
"lastModified": 1710146030,
+
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
"owner": "numtide",
"repo": "flake-utils",
-
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
+
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
"type": "github"
},
"original": {
···
"type": "github"
}
},
-
"flake-utils_6": {
-
"inputs": {
-
"systems": "systems_9"
-
},
-
"locked": {
-
"lastModified": 1694529238,
-
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
-
"owner": "numtide",
-
"repo": "flake-utils",
-
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
-
"type": "github"
-
},
-
"original": {
-
"owner": "numtide",
-
"repo": "flake-utils",
-
"type": "github"
-
}
-
},
-
"flake-utils_7": {
-
"inputs": {
-
"systems": "systems_10"
-
},
-
"locked": {
-
"lastModified": 1731533236,
-
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
-
"owner": "numtide",
-
"repo": "flake-utils",
-
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
-
"type": "github"
-
},
-
"original": {
-
"owner": "numtide",
-
"repo": "flake-utils",
-
"type": "github"
-
}
-
},
-
"flare": {
-
"inputs": {
-
"flake-utils": "flake-utils_3",
-
"nixpkgs": [
-
"nixpkgs"
-
]
-
},
-
"locked": {
-
"lastModified": 1754248266,
-
"narHash": "sha256-WiCCjfyrdUIHFtEigika1nKpxYTZahovbxcZfBzIFYw=",
-
"owner": "ByteAtATime",
-
"repo": "flare",
-
"rev": "c593d2c88ece3efeca2f07933079947dc3249bac",
-
"type": "github"
-
},
-
"original": {
-
"owner": "ByteAtATime",
-
"ref": "feat/nix",
-
"repo": "flare",
-
"type": "github"
-
}
-
},
-
"frc-nix": {
-
"inputs": {
-
"flake-utils": "flake-utils_4",
-
"nix-github-actions": "nix-github-actions",
-
"nixpkgs": [
-
"nixpkgs"
-
]
-
},
-
"locked": {
-
"lastModified": 1764827700,
-
"narHash": "sha256-9xpbmlCXEYU3rWv23OT4qcW0lyeelud0ZrNRicqoTkQ=",
-
"owner": "frc4451",
-
"repo": "frc-nix",
-
"rev": "2a52c5c29093d1cd9494ac0e5b7c70ef970ef7ff",
-
"type": "github"
-
},
-
"original": {
-
"owner": "frc4451",
-
"repo": "frc-nix",
-
"type": "github"
-
}
-
},
-
"gitignore": {
-
"inputs": {
-
"nixpkgs": [
-
"nixvim",
-
"pre-commit-hooks",
-
"nixpkgs"
-
]
-
},
-
"locked": {
-
"lastModified": 1709087332,
-
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
-
"owner": "hercules-ci",
-
"repo": "gitignore.nix",
-
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
-
"type": "github"
-
},
-
"original": {
-
"owner": "hercules-ci",
-
"repo": "gitignore.nix",
-
"type": "github"
-
}
-
},
-
"gitignore_2": {
-
"inputs": {
-
"nixpkgs": [
-
"wakatime-ls",
-
"nixpkgs"
-
]
-
},
-
"locked": {
-
"lastModified": 1762808025,
-
"narHash": "sha256-XmjITeZNMTQXGhhww6ed/Wacy2KzD6svioyCX7pkUu4=",
-
"owner": "hercules-ci",
-
"repo": "gitignore.nix",
-
"rev": "cb5e3fdca1de58ccbc3ef53de65bd372b48f567c",
-
"type": "github"
-
},
-
"original": {
-
"owner": "hercules-ci",
-
"repo": "gitignore.nix",
-
"type": "github"
-
}
-
},
-
"gomod2nix": {
-
"inputs": {
-
"flake-utils": "flake-utils_6",
-
"nixpkgs": [
-
"tangled",
-
"nixpkgs"
-
]
-
},
-
"locked": {
-
"lastModified": 1754078208,
-
"narHash": "sha256-YVoIFDCDpYuU3riaDEJ3xiGdPOtsx4sR5eTzHTytPV8=",
-
"owner": "nix-community",
-
"repo": "gomod2nix",
-
"rev": "7f963246a71626c7fc70b431a315c4388a0c95cf",
-
"type": "github"
-
},
-
"original": {
-
"owner": "nix-community",
-
"repo": "gomod2nix",
-
"type": "github"
-
}
-
},
"hardware": {
"locked": {
-
"lastModified": 1764440730,
-
"narHash": "sha256-ZlJTNLUKQRANlLDomuRWLBCH5792x+6XUJ4YdFRjtO4=",
+
"lastModified": 1721839713,
+
"narHash": "sha256-apTv16L9h5ONS2VTPbKEgwAOVmWGku0MsfprjgwBFHo=",
"owner": "NixOS",
"repo": "nixos-hardware",
-
"rev": "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3",
+
"rev": "a7432ebaefc9a400dcda399d48b949230378d784",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1745494811,
-
"narHash": "sha256-YZCh2o9Ua1n9uCvrvi5pRxtuVNml8X2a03qIFfRKpFs=",
+
"lastModified": 1703113217,
+
"narHash": "sha256-7ulcXOk63TIT2lVDSExj7XzFx09LpdSAPtvgtM7yQPE=",
"owner": "nix-community",
"repo": "home-manager",
-
"rev": "abfad3d2958c9e6300a883bd443512c55dfeb1be",
+
"rev": "3bfaacf46133c037bb356193bd2f1765d9dc82c1",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1765384171,
-
"narHash": "sha256-FuFtkJrW1Z7u+3lhzPRau69E0CNjADku1mLQQflUORo=",
+
"lastModified": 1720042825,
+
"narHash": "sha256-A0vrUB6x82/jvf17qPCpxaM+ulJnD8YZwH9Ci0BsAzE=",
"owner": "nix-community",
"repo": "home-manager",
-
"rev": "44777152652bc9eacf8876976fa72cc77ca8b9d8",
+
"rev": "e1391fb22e18a36f57e6999c7a9f966dc80ac073",
"type": "github"
},
"original": {
"owner": "nix-community",
-
"ref": "release-25.11",
+
"ref": "release-24.05",
"repo": "home-manager",
"type": "github"
}
},
-
"htmx-src": {
-
"flake": false,
-
"locked": {
-
"narHash": "sha256-nm6avZuEBg67SSyyZUhjpXVNstHHgUxrtBHqJgowU08=",
-
"type": "file",
-
"url": "https://unpkg.com/htmx.org@2.0.4/dist/htmx.min.js"
-
},
-
"original": {
-
"type": "file",
-
"url": "https://unpkg.com/htmx.org@2.0.4/dist/htmx.min.js"
-
}
-
},
-
"htmx-ws-src": {
-
"flake": false,
-
"locked": {
-
"narHash": "sha256-2fg6KyEJoO24q0fQqbz9RMaYNPQrMwpZh29tkSqdqGY=",
-
"type": "file",
-
"url": "https://cdn.jsdelivr.net/npm/htmx-ext-ws@2.0.2"
-
},
-
"original": {
-
"type": "file",
-
"url": "https://cdn.jsdelivr.net/npm/htmx-ext-ws@2.0.2"
-
}
-
},
-
"hyprland-contrib": {
+
"hyprcursor": {
"inputs": {
+
"hyprlang": [
+
"hyprnix",
+
"hyprlang"
+
],
"nixpkgs": [
+
"hyprnix",
"nixpkgs"
+
],
+
"systems": [
+
"hyprnix",
+
"systems"
]
},
"locked": {
-
"lastModified": 1765113580,
-
"narHash": "sha256-b8YOwGDFprkQJjXsKGuSNS1pWe8w4cUW36YxlUelNpU=",
+
"lastModified": 1722623071,
+
"narHash": "sha256-sLADpVgebpCBFXkA1FlCXtvEPu1tdEsTfqK1hfeHySE=",
"owner": "hyprwm",
-
"repo": "contrib",
-
"rev": "db18f83bebbc2cf43a21dbb26cd99aabe672d923",
+
"repo": "hyprcursor",
+
"rev": "912d56025f03d41b1ad29510c423757b4379eb1c",
"type": "github"
},
"original": {
"owner": "hyprwm",
-
"repo": "contrib",
+
"repo": "hyprcursor",
"type": "github"
}
},
-
"ibm-plex-mono-src": {
-
"flake": false,
+
"hyprland": {
+
"inputs": {
+
"aquamarine": [
+
"hyprnix",
+
"aquamarine"
+
],
+
"hyprcursor": [
+
"hyprnix",
+
"hyprcursor"
+
],
+
"hyprlang": [
+
"hyprnix",
+
"hyprlang"
+
],
+
"hyprutils": [
+
"hyprnix",
+
"hyprutils"
+
],
+
"hyprwayland-scanner": [
+
"hyprnix",
+
"hyprwayland-scanner"
+
],
+
"nixpkgs": [
+
"hyprnix",
+
"nixpkgs"
+
],
+
"systems": [
+
"hyprnix",
+
"systems"
+
],
+
"xdph": [
+
"hyprnix",
+
"xdg-desktop-portal-hyprland"
+
]
+
},
"locked": {
-
"lastModified": 1731402384,
-
"narHash": "sha256-OwUmrPfEehLDz0fl2ChYLK8FQM2p0G1+EMrGsYEq+6g=",
-
"type": "tarball",
-
"url": "https://github.com/IBM/plex/releases/download/@ibm/plex-mono@1.1.0/ibm-plex-mono.zip"
+
"lastModified": 1722707408,
+
"narHash": "sha256-hyTuWhcid8UklJBC4Yh3dpf7Xhx4oJDyM/3n10E1wSk=",
+
"ref": "refs/heads/main",
+
"rev": "51ffd7fa6f186419276e5d3d5fe141a3fdb3c55c",
+
"revCount": 5048,
+
"submodules": true,
+
"type": "git",
+
"url": "https://github.com/hyprwm/Hyprland"
},
"original": {
-
"type": "tarball",
-
"url": "https://github.com/IBM/plex/releases/download/@ibm/plex-mono@1.1.0/ibm-plex-mono.zip"
+
"submodules": true,
+
"type": "git",
+
"url": "https://github.com/hyprwm/Hyprland"
}
},
-
"import-tree": {
+
"hyprland-contrib": {
+
"inputs": {
+
"nixpkgs": "nixpkgs_3"
+
},
"locked": {
-
"lastModified": 1763762820,
-
"narHash": "sha256-ZvYKbFib3AEwiNMLsejb/CWs/OL/srFQ8AogkebEPF0=",
-
"owner": "vic",
-
"repo": "import-tree",
-
"rev": "3c23749d8013ec6daa1d7255057590e9ca726646",
+
"lastModified": 1720709712,
+
"narHash": "sha256-78j/cY+AXoMIqqiNc1vWx237EPfpERAcYsb57ABUbwQ=",
+
"owner": "hyprwm",
+
"repo": "contrib",
+
"rev": "65d42dcbfde2229a75ccdb195c318dfe241f9ade",
"type": "github"
},
"original": {
-
"owner": "vic",
-
"repo": "import-tree",
+
"owner": "hyprwm",
+
"repo": "contrib",
"type": "github"
}
},
-
"indigo": {
-
"flake": false,
+
"hyprland-protocols": {
+
"inputs": {
+
"nixpkgs": [
+
"hyprnix",
+
"nixpkgs"
+
],
+
"systems": [
+
"hyprnix",
+
"systems"
+
]
+
},
"locked": {
-
"lastModified": 1753693716,
-
"narHash": "sha256-DMIKnCJRODQXEHUxA+7mLzRALmnZhkkbHlFT2rCQYrE=",
-
"owner": "oppiliappan",
-
"repo": "indigo",
-
"rev": "5f170569da9360f57add450a278d73538092d8ca",
+
"lastModified": 1721326555,
+
"narHash": "sha256-zCu4R0CSHEactW9JqYki26gy8h9f6rHmSwj4XJmlHgg=",
+
"owner": "hyprwm",
+
"repo": "hyprland-protocols",
+
"rev": "5a11232266bf1a1f5952d5b179c3f4b2facaaa84",
"type": "github"
},
"original": {
-
"owner": "oppiliappan",
-
"repo": "indigo",
+
"owner": "hyprwm",
+
"repo": "hyprland-protocols",
"type": "github"
}
},
-
"inter-fonts-src": {
-
"flake": false,
-
"locked": {
-
"lastModified": 1731687360,
-
"narHash": "sha256-5vdKKvHAeZi6igrfpbOdhZlDX2/5+UvzlnCQV6DdqoQ=",
-
"type": "tarball",
-
"url": "https://github.com/rsms/inter/releases/download/v4.1/Inter-4.1.zip"
-
},
-
"original": {
-
"type": "tarball",
-
"url": "https://github.com/rsms/inter/releases/download/v4.1/Inter-4.1.zip"
-
}
-
},
-
"ixx": {
+
"hyprlang": {
"inputs": {
-
"flake-utils": [
-
"nixvim",
-
"nixvim",
-
"nuschtosSearch",
-
"flake-utils"
+
"hyprutils": [
+
"hyprnix",
+
"hyprutils"
],
"nixpkgs": [
-
"nixvim",
-
"nixvim",
-
"nuschtosSearch",
+
"hyprnix",
"nixpkgs"
+
],
+
"systems": [
+
"hyprnix",
+
"systems"
]
},
"locked": {
-
"lastModified": 1729958008,
-
"narHash": "sha256-EiOq8jF4Z/zQe0QYVc3+qSKxRK//CFHMB84aYrYGwEs=",
-
"owner": "NuschtOS",
-
"repo": "ixx",
-
"rev": "9fd01aad037f345350eab2cd45e1946cc66da4eb",
+
"lastModified": 1721324361,
+
"narHash": "sha256-BiJKO0IIdnSwHQBSrEJlKlFr753urkLE48wtt0UhNG4=",
+
"owner": "hyprwm",
+
"repo": "hyprlang",
+
"rev": "adbefbf49664a6c2c8bf36b6487fd31e3eb68086",
"type": "github"
},
"original": {
-
"owner": "NuschtOS",
-
"ref": "v0.0.6",
-
"repo": "ixx",
+
"owner": "hyprwm",
+
"repo": "hyprlang",
"type": "github"
}
},
-
"lucide-src": {
-
"flake": false,
+
"hyprnix": {
+
"inputs": {
+
"aquamarine": "aquamarine",
+
"bird-nix-lib": "bird-nix-lib",
+
"hyprcursor": "hyprcursor",
+
"hyprland": "hyprland",
+
"hyprland-protocols": "hyprland-protocols",
+
"hyprlang": "hyprlang",
+
"hyprutils": "hyprutils",
+
"hyprwayland-scanner": "hyprwayland-scanner",
+
"nixpkgs": "nixpkgs_4",
+
"systems": "systems_2",
+
"xdg-desktop-portal-hyprland": "xdg-desktop-portal-hyprland"
+
},
"locked": {
-
"lastModified": 1754044466,
-
"narHash": "sha256-+exBR2OToB1iv7ZQI2S4B0lXA/QRvC9n6U99UxGpJGs=",
-
"type": "tarball",
-
"url": "https://github.com/lucide-icons/lucide/releases/download/0.536.0/lucide-icons-0.536.0.zip"
+
"lastModified": 1722829543,
+
"narHash": "sha256-fUY2Z3GsiS2ID9LLiB7sCarkdlTjLVzORg+RItuqSOs=",
+
"owner": "hyprland-community",
+
"repo": "hyprnix",
+
"rev": "c061b6086210e635a906837947ccd5bbfce50c28",
+
"type": "github"
},
"original": {
-
"type": "tarball",
-
"url": "https://github.com/lucide-icons/lucide/releases/download/0.536.0/lucide-icons-0.536.0.zip"
+
"owner": "hyprland-community",
+
"ref": "rewrite",
+
"repo": "hyprnix",
+
"type": "github"
}
},
-
"nix-darwin": {
+
"hyprutils": {
"inputs": {
"nixpkgs": [
+
"hyprnix",
"nixpkgs"
+
],
+
"systems": [
+
"hyprnix",
+
"systems"
]
},
"locked": {
-
"lastModified": 1765066094,
-
"narHash": "sha256-0YSU35gfRFJzx/lTGgOt6ubP8K6LeW0vaywzNNqxkl4=",
-
"owner": "nix-darwin",
-
"repo": "nix-darwin",
-
"rev": "688427b1aab9afb478ca07989dc754fa543e03d5",
+
"lastModified": 1722098849,
+
"narHash": "sha256-D3wIZlBNh7LuZ0NaoCpY/Pvu+xHxIVtSN+KkWZYvvVs=",
+
"owner": "hyprwm",
+
"repo": "hyprutils",
+
"rev": "5dcbbc1e3de40b2cecfd2007434d86e924468f1f",
"type": "github"
},
"original": {
-
"owner": "nix-darwin",
-
"ref": "nix-darwin-25.11",
-
"repo": "nix-darwin",
+
"owner": "hyprwm",
+
"repo": "hyprutils",
"type": "github"
}
},
-
"nix-github-actions": {
+
"hyprwayland-scanner": {
"inputs": {
"nixpkgs": [
-
"frc-nix",
+
"hyprnix",
"nixpkgs"
+
],
+
"systems": [
+
"hyprnix",
+
"systems"
]
},
"locked": {
-
"lastModified": 1737420293,
-
"narHash": "sha256-F1G5ifvqTpJq7fdkT34e/Jy9VCyzd5XfJ9TO8fHhJWE=",
-
"owner": "nix-community",
-
"repo": "nix-github-actions",
-
"rev": "f4158fa080ef4503c8f4c820967d946c2af31ec9",
+
"lastModified": 1721324119,
+
"narHash": "sha256-SOOqIT27/X792+vsLSeFdrNTF+OSRp5qXv6Te+fb2Qg=",
+
"owner": "hyprwm",
+
"repo": "hyprwayland-scanner",
+
"rev": "a048a6cb015340bd82f97c1f40a4b595ca85cc30",
"type": "github"
},
"original": {
-
"owner": "nix-community",
-
"repo": "nix-github-actions",
+
"owner": "hyprwm",
+
"repo": "hyprwayland-scanner",
"type": "github"
}
},
"nix-vscode-extensions": {
"inputs": {
-
"nixpkgs": "nixpkgs_3"
+
"flake-compat": "flake-compat",
+
"flake-utils": "flake-utils",
+
"nixpkgs": "nixpkgs_5"
},
"locked": {
-
"lastModified": 1765418662,
-
"narHash": "sha256-8SSYagIUn+m9CKUYddq3DN1xkh04KCO0itB/LMgEgpc=",
+
"lastModified": 1722302960,
+
"narHash": "sha256-byZl18UZCHy3vLhxrXp8THzlzmwNfil93ZQLY30i7/Q=",
"owner": "nix-community",
"repo": "nix-vscode-extensions",
-
"rev": "0f6679daa3f5bc2b09827b67f49caf0ac8e3a4c8",
+
"rev": "e1a1e6cabd0140ed353e173290e6d92510f5fd66",
"type": "github"
},
"original": {
···
"type": "github"
}
},
-
"nixos-facter-modules": {
+
"nixos-hardware": {
"locked": {
-
"lastModified": 1765442039,
-
"narHash": "sha256-k3lYQ+A1F7aTz8HnlU++bd9t/x/NP2A4v9+x6opcVg0=",
-
"owner": "numtide",
-
"repo": "nixos-facter-modules",
-
"rev": "9dd775ee92de63f14edd021d59416e18ac2c00f1",
-
"type": "github"
+
"lastModified": 1721413321,
+
"narHash": "sha256-0GdiQScDceUrVGbxYpV819LHesK3szHOhJ09e6sgES4=",
+
"path": "/nix/store/r4aydq3av3gh49gw7k0wcp3wdxkll0ni-source",
+
"rev": "ab165a8a6cd12781d76fe9cbccb9e975d0fb634f",
+
"type": "path"
},
"original": {
-
"owner": "numtide",
-
"repo": "nixos-facter-modules",
-
"type": "github"
+
"id": "nixos-hardware",
+
"type": "indirect"
}
},
"nixpkgs": {
"locked": {
-
"lastModified": 1754028485,
-
"narHash": "sha256-IiiXB3BDTi6UqzAZcf2S797hWEPCRZOwyNThJIYhUfk=",
+
"lastModified": 1703013332,
+
"narHash": "sha256-+tFNwMvlXLbJZXiMHqYq77z/RfmpfpiI3yjL6o/Zo9M=",
"owner": "NixOS",
"repo": "nixpkgs",
-
"rev": "59e69648d345d6e8fef86158c555730fa12af9de",
+
"rev": "54aac082a4d9bb5bbc5c4e899603abfb76a3f6d6",
"type": "github"
},
"original": {
"owner": "NixOS",
-
"ref": "nixos-25.05",
+
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
-
"nixpkgs-lib": {
-
"locked": {
-
"lastModified": 1740877520,
-
"narHash": "sha256-oiwv/ZK/2FhGxrCkQkB83i7GnWXPPLzoqFHpDD3uYpk=",
-
"owner": "nix-community",
-
"repo": "nixpkgs.lib",
-
"rev": "147dee35aab2193b174e4c0868bd80ead5ce755c",
-
"type": "github"
-
},
-
"original": {
-
"owner": "nix-community",
-
"repo": "nixpkgs.lib",
-
"type": "github"
-
}
-
},
"nixpkgs-unstable": {
"locked": {
-
"lastModified": 1765186076,
-
"narHash": "sha256-hM20uyap1a0M9d344I692r+ik4gTMyj60cQWO+hAYP8=",
+
"lastModified": 1722185531,
+
"narHash": "sha256-veKR07psFoJjINLC8RK4DiLniGGMgF3QMlS4tb74S6k=",
"owner": "nixos",
"repo": "nixpkgs",
-
"rev": "addf7cf5f383a3101ecfba091b98d0a1263dc9b8",
+
"rev": "52ec9ac3b12395ad677e8b62106f0b98c1f8569d",
"type": "github"
},
"original": {
···
},
"nixpkgs_2": {
"locked": {
-
"lastModified": 1732837521,
-
"narHash": "sha256-jNRNr49UiuIwaarqijgdTR2qLPifxsVhlJrKzQ8XUIE=",
+
"lastModified": 1712963716,
+
"narHash": "sha256-WKm9CvgCldeIVvRz87iOMi8CFVB1apJlkUT4GGvA0iM=",
"owner": "NixOS",
"repo": "nixpkgs",
-
"rev": "970e93b9f82e2a0f3675757eb0bfc73297cc6370",
+
"rev": "cfd6b5fc90b15709b780a5a1619695a88505a176",
"type": "github"
},
"original": {
···
},
"nixpkgs_3": {
"locked": {
-
"lastModified": 1759770925,
-
"narHash": "sha256-CZwkCtzTNclqlhuwDsVtGoRumTpqCUK0xSnFIMgd8ls=",
-
"owner": "nixos",
+
"lastModified": 1712163089,
+
"narHash": "sha256-Um+8kTIrC19vD4/lUCN9/cU9kcOsD1O1m+axJqQPyMM=",
+
"owner": "NixOS",
"repo": "nixpkgs",
-
"rev": "674c2b09c59a220204350ced584cadaacee30038",
+
"rev": "fd281bd6b7d3e32ddfa399853946f782553163b5",
"type": "github"
},
"original": {
-
"owner": "nixos",
+
"owner": "NixOS",
+
"ref": "nixos-unstable",
"repo": "nixpkgs",
-
"rev": "674c2b09c59a220204350ced584cadaacee30038",
"type": "github"
}
},
"nixpkgs_4": {
"locked": {
-
"lastModified": 1765311797,
-
"narHash": "sha256-mSD5Ob7a+T2RNjvPvOA1dkJHGVrNVl8ZOrAwBjKBDQo=",
+
"lastModified": 1722421184,
+
"narHash": "sha256-/DJBI6trCeVnasdjUo9pbnodCLZcFqnVZiLUfqLH4jA=",
"owner": "nixos",
"repo": "nixpkgs",
-
"rev": "09eb77e94fa25202af8f3e81ddc7353d9970ac1b",
+
"rev": "9f918d616c5321ad374ae6cb5ea89c9e04bf3e58",
"type": "github"
},
"original": {
"owner": "nixos",
-
"ref": "nixos-25.11",
+
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_5": {
"locked": {
-
"lastModified": 1741246872,
-
"narHash": "sha256-Q6pMP4a9ed636qilcYX8XUguvKl/0/LGXhHcRI91p0U=",
-
"owner": "nixos",
-
"repo": "nixpkgs",
-
"rev": "10069ef4cf863633f57238f179a0297de84bd8d3",
-
"type": "github"
-
},
-
"original": {
-
"owner": "nixos",
-
"ref": "nixos-unstable",
-
"repo": "nixpkgs",
-
"type": "github"
-
}
-
},
-
"nixpkgs_6": {
-
"locked": {
-
"lastModified": 1738797219,
-
"narHash": "sha256-KRwX9Z1XavpgeSDVM/THdFd6uH8rNm/6R+7kIbGa+2s=",
+
"lastModified": 1713805509,
+
"narHash": "sha256-YgSEan4CcrjivCNO5ZNzhg7/8ViLkZ4CB/GrGBVSudo=",
"owner": "NixOS",
"repo": "nixpkgs",
-
"rev": "1da52dd49a127ad74486b135898da2cef8c62665",
+
"rev": "1e1dc66fe68972a76679644a5577828b6a7e8be4",
"type": "github"
},
"original": {
···
"type": "github"
}
},
-
"nixpkgs_7": {
+
"nixpkgs_6": {
"locked": {
-
"lastModified": 1730768919,
-
"narHash": "sha256-8AKquNnnSaJRXZxc5YmF/WfmxiHX6MMZZasRP6RRQkE=",
-
"owner": "NixOS",
-
"repo": "nixpkgs",
-
"rev": "a04d33c0c3f1a59a2c1cb0c6e34cd24500e5a1dc",
-
"type": "github"
-
},
-
"original": {
-
"owner": "NixOS",
-
"ref": "nixpkgs-unstable",
-
"repo": "nixpkgs",
-
"type": "github"
-
}
-
},
-
"nixpkgs_8": {
-
"locked": {
-
"lastModified": 1764635402,
-
"narHash": "sha256-6rYcajRLe2C5ZYnV1HYskJl+QAkhvseWTzbdQiTN9OI=",
+
"lastModified": 1721686456,
+
"narHash": "sha256-nw/BnNzATDPfzpJVTnY8mcSKKsz6BJMEFRkJ332QSN0=",
"owner": "nixos",
"repo": "nixpkgs",
-
"rev": "5f53b0d46d320352684242d000b36dcfbbf7b0bc",
+
"rev": "575f3027caa1e291d24f1e9fb0e3a19c2f26d96b",
"type": "github"
},
"original": {
"owner": "nixos",
+
"ref": "nixos-24.05",
"repo": "nixpkgs",
-
"type": "github"
-
}
-
},
-
"nixvim": {
-
"inputs": {
-
"flake-parts": "flake-parts",
-
"nixpkgs": "nixpkgs_5",
-
"nixvim": "nixvim_2",
-
"pre-commit-hooks": "pre-commit-hooks"
-
},
-
"locked": {
-
"lastModified": 1758568990,
-
"narHash": "sha256-5Nn3M61UBidkxIoLS10th0FQhpfWpcF1xPTikPTTgeA=",
-
"owner": "taciturnaxolotl",
-
"repo": "nixvim",
-
"rev": "2b8ef114f234a0596eb7601248a4efed38280093",
-
"type": "github"
-
},
-
"original": {
-
"owner": "taciturnaxolotl",
-
"repo": "nixvim",
-
"type": "github"
-
}
-
},
-
"nixvim_2": {
-
"inputs": {
-
"flake-parts": "flake-parts_2",
-
"nixpkgs": "nixpkgs_6",
-
"nuschtosSearch": "nuschtosSearch"
-
},
-
"locked": {
-
"lastModified": 1741098523,
-
"narHash": "sha256-gXDSXDr6tAb+JgxGMvcEjKC9YO8tVOd8hMMZHJLyQ6Q=",
-
"owner": "nix-community",
-
"repo": "nixvim",
-
"rev": "03065fd4708bfdf47dd541d655392a60daa25ded",
-
"type": "github"
-
},
-
"original": {
-
"owner": "nix-community",
-
"repo": "nixvim",
-
"type": "github"
-
}
-
},
-
"nur": {
-
"inputs": {
-
"flake-parts": "flake-parts_3",
-
"nixpkgs": [
-
"nixpkgs"
-
]
-
},
-
"locked": {
-
"lastModified": 1765470296,
-
"narHash": "sha256-bURojPUn8jloR046JNZf6qrYNmEPfFEoDaLTKoP9pg4=",
-
"owner": "nix-community",
-
"repo": "NUR",
-
"rev": "441a70568483c0c48b338cca2030e3d9c7aef3ba",
-
"type": "github"
-
},
-
"original": {
-
"owner": "nix-community",
-
"repo": "NUR",
-
"type": "github"
-
}
-
},
-
"nuschtosSearch": {
-
"inputs": {
-
"flake-utils": "flake-utils_5",
-
"ixx": "ixx",
-
"nixpkgs": [
-
"nixvim",
-
"nixvim",
-
"nixpkgs"
-
]
-
},
-
"locked": {
-
"lastModified": 1738508923,
-
"narHash": "sha256-4DaDrQDAIxlWhTjH6h/+xfG05jt3qDZrZE/7zDLQaS4=",
-
"owner": "NuschtOS",
-
"repo": "search",
-
"rev": "86e2038290859006e05ca7201425ea5b5de4aecb",
-
"type": "github"
-
},
-
"original": {
-
"owner": "NuschtOS",
-
"repo": "search",
-
"type": "github"
-
}
-
},
-
"pre-commit-hooks": {
-
"inputs": {
-
"flake-compat": "flake-compat_2",
-
"gitignore": "gitignore",
-
"nixpkgs": "nixpkgs_7"
-
},
-
"locked": {
-
"lastModified": 1741350116,
-
"narHash": "sha256-QKp83UTH0hGc7TYkQdX5JdagvBnP5169WyxXkMrkPqY=",
-
"owner": "cachix",
-
"repo": "pre-commit-hooks.nix",
-
"rev": "ca78dfc9652483f3ae52cfe70fdfbfe664451e2b",
-
"type": "github"
-
},
-
"original": {
-
"owner": "cachix",
-
"repo": "pre-commit-hooks.nix",
"type": "github"
}
},
"root": {
"inputs": {
"agenix": "agenix",
-
"battleship-arena": "battleship-arena",
"catppuccin": "catppuccin",
"catppuccin-vsc": "catppuccin-vsc",
-
"cedarlogic": "cedarlogic",
-
"claude-desktop": "claude-desktop",
-
"ctfd-alerts": "ctfd-alerts",
-
"deploy-rs": "deploy-rs",
"disko": "disko",
-
"flare": "flare",
-
"frc-nix": "frc-nix",
"hardware": "hardware",
"home-manager": "home-manager_2",
"hyprland-contrib": "hyprland-contrib",
-
"import-tree": "import-tree",
-
"nix-darwin": "nix-darwin",
+
"hyprnix": "hyprnix",
"nix-vscode-extensions": "nix-vscode-extensions",
-
"nixos-facter-modules": "nixos-facter-modules",
-
"nixpkgs": "nixpkgs_4",
+
"nixos-hardware": "nixos-hardware",
+
"nixpkgs": "nixpkgs_6",
"nixpkgs-unstable": "nixpkgs-unstable",
-
"nixvim": "nixvim",
-
"nur": "nur",
-
"soapdump": "soapdump",
-
"spicetify-nix": "spicetify-nix",
-
"tangled": "tangled",
-
"terminal-wakatime": "terminal-wakatime",
-
"wakatime-ls": "wakatime-ls",
-
"zmx": "zmx"
+
"spicetify-nix": "spicetify-nix"
}
},
-
"rust-overlay": {
+
"spicetify-nix": {
"inputs": {
+
"flake-compat": "flake-compat_2",
"nixpkgs": [
-
"wakatime-ls",
"nixpkgs"
]
},
"locked": {
-
"lastModified": 1764557621,
-
"narHash": "sha256-kX5PoY8hQZ80+amMQgOO9t8Tc1JZ70gYRnzaVD4AA+o=",
-
"owner": "oxalica",
-
"repo": "rust-overlay",
-
"rev": "93316876c2229460a5d6f5f052766cc4cef538ce",
-
"type": "github"
-
},
-
"original": {
-
"owner": "oxalica",
-
"repo": "rust-overlay",
-
"type": "github"
-
}
-
},
-
"soapdump": {
-
"inputs": {
-
"nixpkgs": [
-
"nixpkgs"
-
]
-
},
-
"locked": {
-
"lastModified": 1757803066,
-
"narHash": "sha256-Bu+mICGedn+V0mo8ysdV9y1Qc+D5ENphfxUTjNz4Q4c=",
-
"owner": "taciturnaxolotl",
-
"repo": "soapdump",
-
"rev": "b2ff538becb73f41cf7dad636e9d79d7fa82f3a4",
-
"type": "github"
-
},
-
"original": {
-
"owner": "taciturnaxolotl",
-
"repo": "soapdump",
-
"type": "github"
-
}
-
},
-
"spicetify-nix": {
-
"inputs": {
-
"nixpkgs": [
-
"nixpkgs"
-
],
-
"systems": "systems_8"
-
},
-
"locked": {
-
"lastModified": 1765082296,
-
"narHash": "sha256-EcefoixU9ht+P6QB/TfjLY9E3MdJVfeSec6G8Ges0pA=",
+
"lastModified": 1721794305,
+
"narHash": "sha256-Sb4v/LAc8Pl0sOZf/LwT3QFZp+MAdtHF3cHswuxQDtQ=",
"owner": "Gerg-L",
"repo": "spicetify-nix",
-
"rev": "ac4927ea1ec7e7ea3635a1d8b933106a596c4356",
+
"rev": "8056338fca46716159d5d54f59ed04d6cf7b771f",
"type": "github"
},
"original": {
···
"type": "github"
}
},
-
"sqlite-lib-src": {
-
"flake": false,
-
"locked": {
-
"lastModified": 1706631843,
-
"narHash": "sha256-bJoMjirsBjm2Qk9KPiy3yV3+8b/POlYe76/FQbciHro=",
-
"type": "tarball",
-
"url": "https://sqlite.org/2024/sqlite-amalgamation-3450100.zip"
-
},
-
"original": {
-
"type": "tarball",
-
"url": "https://sqlite.org/2024/sqlite-amalgamation-3450100.zip"
-
}
-
},
"systems": {
"locked": {
"lastModified": 1681028828,
···
"type": "github"
}
},
-
"systems_10": {
-
"locked": {
-
"lastModified": 1681028828,
-
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
-
"owner": "nix-systems",
-
"repo": "default",
-
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
-
"type": "github"
-
},
-
"original": {
-
"owner": "nix-systems",
-
"repo": "default",
-
"type": "github"
-
}
-
},
"systems_2": {
+
"flake": false,
"locked": {
-
"lastModified": 1681028828,
-
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+
"lastModified": 1689347949,
+
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
"owner": "nix-systems",
-
"repo": "default",
-
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+
"repo": "default-linux",
+
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
"type": "github"
},
"original": {
"owner": "nix-systems",
-
"repo": "default",
+
"repo": "default-linux",
"type": "github"
}
},
···
"type": "github"
}
},
-
"systems_4": {
-
"locked": {
-
"lastModified": 1681028828,
-
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
-
"owner": "nix-systems",
-
"repo": "default",
-
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
-
"type": "github"
-
},
-
"original": {
-
"owner": "nix-systems",
-
"repo": "default",
-
"type": "github"
-
}
-
},
-
"systems_5": {
-
"locked": {
-
"lastModified": 1681028828,
-
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
-
"owner": "nix-systems",
-
"repo": "default",
-
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
-
"type": "github"
-
},
-
"original": {
-
"owner": "nix-systems",
-
"repo": "default",
-
"type": "github"
-
}
-
},
-
"systems_6": {
-
"locked": {
-
"lastModified": 1681028828,
-
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
-
"owner": "nix-systems",
-
"repo": "default",
-
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
-
"type": "github"
-
},
-
"original": {
-
"owner": "nix-systems",
-
"repo": "default",
-
"type": "github"
-
}
-
},
-
"systems_7": {
-
"locked": {
-
"lastModified": 1681028828,
-
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
-
"owner": "nix-systems",
-
"repo": "default",
-
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
-
"type": "github"
-
},
-
"original": {
-
"owner": "nix-systems",
-
"repo": "default",
-
"type": "github"
-
}
-
},
-
"systems_8": {
-
"locked": {
-
"lastModified": 1681028828,
-
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
-
"owner": "nix-systems",
-
"repo": "default",
-
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
-
"type": "github"
-
},
-
"original": {
-
"owner": "nix-systems",
-
"repo": "default",
-
"type": "github"
-
}
-
},
-
"systems_9": {
-
"locked": {
-
"lastModified": 1681028828,
-
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
-
"owner": "nix-systems",
-
"repo": "default",
-
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
-
"type": "github"
-
},
-
"original": {
-
"owner": "nix-systems",
-
"repo": "default",
-
"type": "github"
-
}
-
},
-
"tangled": {
+
"xdg-desktop-portal-hyprland": {
"inputs": {
-
"actor-typeahead-src": "actor-typeahead-src",
-
"flake-compat": "flake-compat_3",
-
"gomod2nix": "gomod2nix",
-
"htmx-src": "htmx-src",
-
"htmx-ws-src": "htmx-ws-src",
-
"ibm-plex-mono-src": "ibm-plex-mono-src",
-
"indigo": "indigo",
-
"inter-fonts-src": "inter-fonts-src",
-
"lucide-src": "lucide-src",
-
"nixpkgs": [
-
"nixpkgs"
+
"hyprland-protocols": [
+
"hyprnix",
+
"hyprland-protocols"
],
-
"sqlite-lib-src": "sqlite-lib-src"
-
},
-
"locked": {
-
"lastModified": 1765368304,
-
"narHash": "sha256-Q3JC5+FYtsKJU70WIhGhsAYWzu0CvUmmbdYhcFe46Pg=",
-
"ref": "refs/heads/master",
-
"rev": "a53d124ea4746109c1933f7adc72f0bde1309890",
-
"revCount": 1731,
-
"type": "git",
-
"url": "https://tangled.org/tangled.org/core"
-
},
-
"original": {
-
"type": "git",
-
"url": "https://tangled.org/tangled.org/core"
-
}
-
},
-
"terminal-wakatime": {
-
"inputs": {
-
"nixpkgs": [
-
"nixpkgs"
-
]
-
},
-
"locked": {
-
"lastModified": 1751031844,
-
"narHash": "sha256-B8cFGcUq25hUEPQYaAAV9EKZ+xaRByDXP85e+xA1n34=",
-
"owner": "taciturnaxolotl",
-
"repo": "terminal-wakatime",
-
"rev": "dbc9e7ce7f6ace6c883028f8b7c725542ee10c77",
-
"type": "github"
-
},
-
"original": {
-
"owner": "taciturnaxolotl",
-
"repo": "terminal-wakatime",
-
"type": "github"
-
}
-
},
-
"utils": {
-
"inputs": {
-
"systems": "systems_4"
-
},
-
"locked": {
-
"lastModified": 1731533236,
-
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
-
"owner": "numtide",
-
"repo": "flake-utils",
-
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
-
"type": "github"
-
},
-
"original": {
-
"owner": "numtide",
-
"repo": "flake-utils",
-
"type": "github"
-
}
-
},
-
"wakatime-ls": {
-
"inputs": {
-
"gitignore": "gitignore_2",
+
"hyprlang": [
+
"hyprnix",
+
"hyprlang"
+
],
"nixpkgs": [
+
"hyprnix",
"nixpkgs"
],
-
"rust-overlay": "rust-overlay"
-
},
-
"locked": {
-
"lastModified": 1764772399,
-
"narHash": "sha256-iZmN5d42tOsmssuFzOf3saUUeXbrwraQmDgh5czuMis=",
-
"owner": "mrnossiom",
-
"repo": "wakatime-ls",
-
"rev": "b8b9c1e612f198d767a64142f34c33ffbd347fae",
-
"type": "github"
-
},
-
"original": {
-
"owner": "mrnossiom",
-
"repo": "wakatime-ls",
-
"type": "github"
-
}
-
},
-
"zig2nix": {
-
"inputs": {
-
"flake-utils": "flake-utils_7",
-
"nixpkgs": "nixpkgs_8"
-
},
-
"locked": {
-
"lastModified": 1764678235,
-
"narHash": "sha256-NNQWR3DAufaH7fs6ZplfAv1xPHEc0Ne3Z0v4MNHCqSw=",
-
"owner": "Cloudef",
-
"repo": "zig2nix",
-
"rev": "8b6ec85bccdf6b91ded19e9ef671205937e271e6",
-
"type": "github"
-
},
-
"original": {
-
"owner": "Cloudef",
-
"repo": "zig2nix",
-
"type": "github"
-
}
-
},
-
"zmx": {
-
"inputs": {
-
"zig2nix": "zig2nix"
+
"systems": [
+
"hyprnix",
+
"systems"
+
]
},
"locked": {
-
"lastModified": 1765397837,
-
"narHash": "sha256-nMlS9SA8MLJHJ0X/zEg3eG18mLw5vvZpZBbTbVcGFTI=",
-
"owner": "neurosnap",
-
"repo": "zmx",
-
"rev": "a22dba538a31480ed450b389f397e15880a1c53a",
+
"lastModified": 1722365976,
+
"narHash": "sha256-Khdm+mDzYA//XaU0M+hftod+rKr5q9SSHSEuiQ0/9ow=",
+
"owner": "hyprwm",
+
"repo": "xdg-desktop-portal-hyprland",
+
"rev": "7f2a77ddf60390248e2a3de2261d7102a13e5341",
"type": "github"
},
"original": {
-
"owner": "neurosnap",
-
"repo": "zmx",
+
"owner": "hyprwm",
+
"repo": "xdg-desktop-portal-hyprland",
"type": "github"
}
}
+48 -254
flake.nix
···
inputs = {
# Nixpkgs
-
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
+
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05";
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
# NixOS hardware configuration
hardware.url = "github:NixOS/nixos-hardware/master";
# Home manager
-
home-manager.url = "github:nix-community/home-manager/release-25.11";
+
home-manager.url = "github:nix-community/home-manager/release-24.05";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
-
# Nix-Darwin
-
nix-darwin.url = "github:nix-darwin/nix-darwin/nix-darwin-25.11";
-
nix-darwin.inputs.nixpkgs.follows = "nixpkgs";
+
# hyprland nix
+
hyprnix.url = "github:hyprland-community/hyprnix/rewrite";
+
hyprland-contrib = {
+
url = "github:hyprwm/contrib";
+
};
disko.url = "github:nix-community/disko";
disko.inputs.nixpkgs.follows = "nixpkgs";
-
-
nixos-facter-modules.url = "github:numtide/nixos-facter-modules";
-
+
# agenix
agenix.url = "github:ryantm/agenix";
···
inputs.nixpkgs.follows = "nixpkgs";
};
-
catppuccin = {
-
url = "github:catppuccin/nix?rev=f518f96a60aceda4cd487437b25eaa48d0f1b97d";
-
inputs.nixpkgs.follows = "nixpkgs";
-
};
-
-
catppuccin-vsc = {
-
url = "github:catppuccin/vscode";
-
};
+
# catppuccin
+
catppuccin.url = "github:catppuccin/nix";
+
catppuccin-vsc.url = "https://flakehub.com/f/catppuccin/vscode/\*.tar.gz";
nix-vscode-extensions.url = "github:nix-community/nix-vscode-extensions";
-
-
frc-nix = {
-
url = "github:frc4451/frc-nix";
-
inputs.nixpkgs.follows = "nixpkgs";
-
};
-
-
claude-desktop = {
-
url = "github:k3d3/claude-desktop-linux-flake";
-
inputs.nixpkgs.follows = "nixpkgs";
-
};
-
-
hyprland-contrib = {
-
url = "github:hyprwm/contrib";
-
inputs.nixpkgs.follows = "nixpkgs";
-
};
-
-
nixvim.url = "github:taciturnaxolotl/nixvim";
-
-
terminal-wakatime = {
-
url = "github:taciturnaxolotl/terminal-wakatime";
-
inputs.nixpkgs.follows = "nixpkgs";
-
};
-
-
ctfd-alerts = {
-
url = "github:taciturnaxolotl/ctfd-alerts";
-
inputs.nixpkgs.follows = "nixpkgs";
-
};
-
-
flare = {
-
url = "github:ByteAtATime/flare/feat/nix";
-
inputs.nixpkgs.follows = "nixpkgs";
-
};
-
-
import-tree.url = "github:vic/import-tree";
-
-
nur = {
-
url = "github:nix-community/NUR";
-
inputs.nixpkgs.follows = "nixpkgs";
-
};
-
-
cedarlogic = {
-
url = "github:taciturnaxolotl/CedarLogic";
-
inputs.nixpkgs.follows = "nixpkgs";
-
};
-
-
soapdump = {
-
url = "github:taciturnaxolotl/soapdump";
-
inputs.nixpkgs.follows = "nixpkgs";
-
};
-
-
wakatime-ls = {
-
url = "github:mrnossiom/wakatime-ls";
-
inputs.nixpkgs.follows = "nixpkgs";
-
};
-
-
deploy-rs = {
-
url = "github:serokell/deploy-rs";
-
inputs.nixpkgs.follows = "nixpkgs";
-
};
-
-
tangled = {
-
url = "git+https://tangled.org/tangled.org/core";
-
inputs.nixpkgs.follows = "nixpkgs";
-
};
-
-
battleship-arena = {
-
url = "github:taciturnaxolotl/battleship-arena";
-
inputs.nixpkgs.follows = "nixpkgs";
-
};
-
-
zmx = {
-
url = "github:neurosnap/zmx";
-
};
};
-
outputs =
-
{
-
self,
-
nixpkgs,
-
nixpkgs-unstable,
-
agenix,
-
home-manager,
-
nur,
-
nix-darwin,
-
deploy-rs,
-
tangled,
-
...
-
}@inputs:
-
let
-
outputs = inputs.self.outputs;
-
unstable-overlays = {
-
nixpkgs.overlays = [
-
(final: prev: {
-
unstable = import nixpkgs-unstable {
-
system = final.stdenv.hostPlatform.system;
-
config.allowUnfree = true;
-
};
-
-
bambu-studio = prev.bambu-studio.overrideAttrs (oldAttrs: {
-
version = "01.00.01.50";
-
src = prev.fetchFromGitHub {
-
owner = "bambulab";
-
repo = "BambuStudio";
-
rev = "v01.00.01.50";
-
hash = "sha256-7mkrPl2CQSfc1lRjl1ilwxdYcK5iRU//QGKmdCicK30=";
-
};
-
});
-
-
zmx-binary = prev.callPackage ./packages/zmx.nix { };
-
})
-
];
-
};
-
in
-
{
-
# NixOS configuration entrypoint
-
# Available through 'nixos-rebuild --flake .#hostname'
-
nixosConfigurations = {
-
moonlark = nixpkgs.lib.nixosSystem {
-
specialArgs = { inherit inputs outputs; };
-
modules = [
-
inputs.disko.nixosModules.disko
-
{ disko.devices.disk.disk1.device = "/dev/vda"; }
-
agenix.nixosModules.default
-
unstable-overlays
-
./machines/moonlark
-
nur.modules.nixos.default
-
];
-
};
-
-
prattle = nixpkgs.lib.nixosSystem {
-
specialArgs = { inherit inputs outputs; };
-
modules = [
-
inputs.disko.nixosModules.disko
-
agenix.nixosModules.default
-
inputs.nixos-facter-modules.nixosModules.facter
-
{ config.facter.reportPath = ./machines/prattle/facter.json; }
-
unstable-overlays
-
./machines/prattle
-
nur.modules.nixos.default
-
];
-
};
-
-
terebithia = nixpkgs.lib.nixosSystem {
-
specialArgs = { inherit inputs outputs; };
-
modules = [
-
inputs.disko.nixosModules.disko
-
agenix.nixosModules.default
-
inputs.nixos-facter-modules.nixosModules.facter
-
{ config.facter.reportPath = ./machines/terebithia/facter.json; }
-
unstable-overlays
-
./machines/terebithia
-
nur.modules.nixos.default
-
];
-
};
-
};
-
-
# Standalone home-manager configurations
-
# Available through 'home-manager --flake .#hostname'
-
homeConfigurations = {
-
"tacyon" = home-manager.lib.homeManagerConfiguration {
-
pkgs = nixpkgs.legacyPackages.aarch64-linux;
-
extraSpecialArgs = {
-
inherit inputs outputs;
-
nixpkgs-unstable = nixpkgs-unstable;
+
outputs = {
+
self,
+
nixpkgs,
+
nixpkgs-unstable,
+
agenix,
+
home-manager,
+
nixos-hardware,
+
hyprland-contrib,
+
...
+
} @ inputs: let
+
inherit (self) outputs;
+
system = "x86_64-linux";
+
unstable-overlays = {
+
nixpkgs.overlays = [
+
(final: prev: {
+
unstable = import nixpkgs-unstable {
+
inherit system;
+
config.allowUnfree = true;
};
-
modules = [
-
./machines/tacyon
-
unstable-overlays
-
];
-
};
+
})
+
];
+
};
+
in {
+
# NixOS configuration entrypoint
+
# Available through 'nixos-rebuild --flake .#your-hostname'
+
nixosConfigurations = {
+
moonlark = nixpkgs.lib.nixosSystem {
+
system = "x86_64-linux";
-
"nest" = home-manager.lib.homeManagerConfiguration {
-
pkgs = nixpkgs.legacyPackages.x86_64-linux;
-
extraSpecialArgs = {
-
inherit inputs outputs;
-
nixpkgs-unstable = nixpkgs-unstable;
-
system = "x86_64-linux";
-
};
-
modules = [
-
./machines/nest
-
unstable-overlays
-
];
-
};
+
specialArgs = {inherit inputs outputs;};
-
"ember" = home-manager.lib.homeManagerConfiguration {
-
pkgs = nixpkgs.legacyPackages.x86_64-linux;
-
extraSpecialArgs = {
-
inherit inputs outputs;
-
nixpkgs-unstable = nixpkgs-unstable;
-
};
-
modules = [
-
./machines/ember
-
unstable-overlays
-
];
-
-
};
-
"john" = home-manager.lib.homeManagerConfiguration {
-
pkgs = nixpkgs.legacyPackages.x86_64-linux;
-
extraSpecialArgs = {
-
inherit inputs outputs;
-
nixpkgs-unstable = nixpkgs-unstable;
-
system = "x86_64-linux";
-
};
-
modules = [
-
./machines/john
-
unstable-overlays
-
];
-
};
+
# > Our main nixos configuration file <
+
modules = [
+
inputs.disko.nixosModules.disko
+
{ disko.devices.disk.disk1.device = "/dev/vda"; }
+
agenix.nixosModules.default
+
./moonlark/configuration.nix
+
unstable-overlays
+
];
};
-
-
# Darwin configurations
-
# Available through 'darwin-rebuild switch --flake .#hostname'
-
darwinConfigurations = {
-
atalanta = nix-darwin.lib.darwinSystem {
-
system = "aarch64-darwin";
-
specialArgs = { inherit inputs outputs; };
-
modules = [
-
home-manager.darwinModules.home-manager
-
agenix.darwinModules.default
-
unstable-overlays
-
nur.modules.darwin.default
-
./machines/atalanta
-
];
-
};
-
};
-
-
formatter.x86_64-linux = nixpkgs.legacyPackages.x86_64-linux.nixfmt-tree;
-
formatter.aarch64-darwin = nixpkgs.legacyPackages.aarch64-darwin.nixfmt-tree;
-
-
# Deploy-rs configurations
-
deploy.nodes = {
-
# NixOS servers
-
terebithia = {
-
hostname = "terebithia";
-
profiles.system = {
-
sshUser = "kierank";
-
user = "root";
-
path = deploy-rs.lib.aarch64-linux.activate.nixos self.nixosConfigurations.terebithia;
-
};
-
};
-
};
-
-
# Validation checks
-
checks = builtins.mapAttrs (system: deployLib: deployLib.deployChecks self.deploy) deploy-rs.lib;
};
+
};
}
home-manager/dots/face.png

This is a binary file and will not be displayed.

+197
home-manager/dots/hyprland.conf
···
+
+
# See https://wiki.hyprland.org/Configuring/Monitors/
+
monitor = ,preferred,auto,1
+
monitor = ,addreserved,52,0,0,0
+
+
xwayland {
+
force_zero_scaling = true
+
}
+
+
# See https://wiki.hyprland.org/Configuring/Keywords/ for more
+
+
# Execute your favorite apps at launch
+
exec-once = sunpaper -d
+
exec-once = wluma
+
exec-once = waybar
+
exec-once = hypridle
+
exec-once = udiskie
+
+
exec-once=[workspace 8 silent] slack
+
exec-once=[workspace 9 silent] spotify
+
exec-once=[workspace 1 silent] firefox
+
+
# Source a file (multi-file configs)
+
source = ~/.config/hypr/themes/frappe.conf
+
+
# For all categories, see https://wiki.hyprland.org/Configuring/Variables/
+
input {
+
kb_layout = us
+
+
follow_mouse = 1
+
+
touchpad {
+
natural_scroll = yes
+
}
+
+
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
+
}
+
+
general {
+
# See https://wiki.hyprland.org/Configuring/Variables/ for more
+
+
gaps_in = 2
+
gaps_out = 8
+
border_size = 2
+
col.inactive_border = $base
+
col.active_border = $blue
+
+
layout = dwindle
+
}
+
+
decoration {
+
# See https://wiki.hyprland.org/Configuring/Variables/ for more
+
+
rounding = 7
+
+
drop_shadow = true
+
shadow_render_power = 3
+
col.shadow = rgba(1a1a1aee)
+
+
dim_inactive = true
+
dim_strength = 0.2
+
}
+
+
decoration:blur {
+
size = 3
+
passes = 1
+
}
+
+
animations {
+
enabled = true
+
+
# Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
+
+
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
+
+
animation = windows, 1, 7, myBezier
+
animation = windowsOut, 1, 7, default, popin 80%
+
animation = border, 1, 10, default
+
animation = fade, 1, 7, default
+
animation = workspaces, 1, 6, default
+
}
+
+
dwindle {
+
# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
+
pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
+
preserve_split = yes # you probably want this
+
}
+
+
gestures {
+
# See https://wiki.hyprland.org/Configuring/Variables/ for more
+
workspace_swipe = on
+
workspace_swipe_create_new = true
+
}
+
+
# Floating Windows
+
windowrulev2 = float, class:^(Rofi)$
+
# Positioning Windows
+
windowrule = center, ^(Rofi)$
+
+
# Tiled Windows
+
windowrulev2 = tile, class:^(Spotify)$
+
+
# Example windowrule v2
+
# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$
+
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
+
+
# Layer Rules
+
layerrule = animation fade,waybar
+
layerrule = blur,waybar
+
layerrule = ignorezero,waybar
+
+
+
# See https://wiki.hyprland.org/Configuring/Keywords/ for more
+
$mainMod = SUPER
+
+
# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
+
+
# Terminal
+
bind = $mainMod, RETURN, exec, xfce4-terminal
+
+
# Applications
+
bind = CTRL + SHIFT, B, exec, nautilus
+
bind = CTRL + SHIFT, F, exec, firefox
+
bind = CTRL + SHIFT, S, exec, spotify
+
bind = CTRL + SHIFT, L, exec, slack
+
bind = CTRL + SHIFT, O, exec, obs
+
bind = CTRL + SHIFT, K, exec, export GTK_THEME=Adwaita:dark && kicad
+
+
bind = $mainMod, RETURN, exec, alacritty
+
+
# System
+
bind = $mainMod, Q, killactive,
+
bind = $mainMod, M, exit
+
bind = $mainMod, L, exec, hyprlock
+
bind = $mainMod, ESC, exec, hyprlock
+
bind = $mainMod, V, togglefloating,
+
bind = $mainMod, S, exec, tofi-run | xargs xargs hyprctl dispatch exec --
+
bind = $mainMod, P, pseudo, # dwindle
+
bind = $mainMod, J, togglesplit, # dwindle
+
+
# Tools
+
bind=CTRL,PRINT,exec,grimblast copy area; notify-desktop "copied screenshot of selection to the clipboard"
+
bind=ALT,PRINT,exec,grimblast copy active; notify-desktop "copied screenshot of active window to clipboard"
+
bind=,PRINT,exec,grimblast copy output; notify-desktop "copied screenshot of screen to the clipboard"
+
+
bind=$mainMod, O, exec, hyprpicker -a -f hex
+
+
# Controls
+
bindel =,XF86MonBrightnessDown, exec, brightnessctl set 5%-; notify-desktop "brightness decreased 5%" "Curretly; $(echo "scale=1; 100 * $(brightnessctl g) / $(brightnessctl m)" | bc)%" -t 1200
+
bindel =,XF86MonBrightnessUp, exec, brightnessctl set 5%+; notify-desktop "brightness increased 5%" "Curretly; $(echo "scale=1; 100 * $(brightnessctl g) / $(brightnessctl m)" | bc)%" -t 1200
+
+
bindl =,XF86AudioPlay, exec, playerctl play-pause; notify-desktop "toggled media playback" -t 1800
+
bindl =,XF86AudioPrev, exec, playerctl previous; notify-desktop "Skipping back" -t 1800
+
bindl =,XF86AudioNext, exec, playerctl next
+
+
bindl=, XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle; notify-desktop "$(wpctl get-volume @DEFAULT_AUDIO_SINK@)" -t 800
+
+
bindel=, XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+; notify-desktop "$(wpctl get-volume @DEFAULT_AUDIO_SINK@)" -t 800
+
bindel=, XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-; notify-desktop "$(wpctl get-volume @DEFAULT_AUDIO_SINK@)" -t 800
+
+
# 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
+
+
# 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
+78
home-manager/dots/hyprlock.conf
···
+
source = $HOME/.config/hypr/macchiato.conf
+
+
$accent = $blue
+
$accentAlpha = $blueAlpha
+
$font = FiraCode Nerd Font
+
+
# GENERAL
+
general {
+
disable_loading_bar = true
+
hide_cursor = true
+
}
+
+
# BACKGROUND
+
background {
+
monitor =
+
blur_passes = 0
+
color = $base
+
}
+
+
# TIME
+
label {
+
monitor =
+
text = cmd[update:30000] echo "$(date +"%R")"
+
color = $text
+
font_size = 90
+
font_family = $font
+
position = -30, 0
+
halign = right
+
valign = top
+
}
+
+
# DATE
+
label {
+
monitor =
+
text = cmd[update:43200000] echo "$(date +"%A, %d %B %Y")"
+
color = $text
+
font_size = 25
+
font_family = $font
+
position = -30, -150
+
halign = right
+
valign = top
+
}
+
+
# USER AVATAR
+
+
image {
+
monitor =
+
path = ~/.config/face.png
+
size = 100
+
border_color = $accent
+
+
position = 0, 75
+
halign = center
+
valign = center
+
}
+
+
# INPUT FIELD
+
input-field {
+
monitor =
+
size = 300, 60
+
outline_thickness = 4
+
dots_size = 0.2
+
dots_spacing = 0.2
+
dots_center = true
+
outer_color = $accent
+
inner_color = $surface0
+
font_color = $text
+
fade_on_empty = false
+
placeholder_text = <span foreground="##$textAlpha"><i>󰌾 Logged in as </i><span foreground="##$accentAlpha">$USER</span></span>
+
hide_input = false
+
check_color = $accent
+
fail_color = $red
+
fail_text = <i>$FAIL <b>($ATTEMPTS)</b></i>
+
capslock_color = $yellow
+
position = 0, -35
+
halign = center
+
valign = center
+
}
+78
home-manager/dots/macchiato.conf
···
+
+
$rosewater = rgb(f4dbd6)
+
$rosewaterAlpha = f4dbd6
+
+
$flamingo = rgb(f0c6c6)
+
$flamingoAlpha = f0c6c6
+
+
$pink = rgb(f5bde6)
+
$pinkAlpha = f5bde6
+
+
$mauve = rgb(c6a0f6)
+
$mauveAlpha = c6a0f6
+
+
$red = rgb(ed8796)
+
$redAlpha = ed8796
+
+
$maroon = rgb(ee99a0)
+
$maroonAlpha = ee99a0
+
+
$peach = rgb(f5a97f)
+
$peachAlpha = f5a97f
+
+
$yellow = rgb(eed49f)
+
$yellowAlpha = eed49f
+
+
$green = rgb(a6da95)
+
$greenAlpha = a6da95
+
+
$teal = rgb(8bd5ca)
+
$tealAlpha = 8bd5ca
+
+
$sky = rgb(91d7e3)
+
$skyAlpha = 91d7e3
+
+
$sapphire = rgb(7dc4e4)
+
$sapphireAlpha = 7dc4e4
+
+
$blue = rgb(8aadf4)
+
$blueAlpha = 8aadf4
+
+
$lavender = rgb(b7bdf8)
+
$lavenderAlpha = b7bdf8
+
+
$text = rgb(cad3f5)
+
$textAlpha = cad3f5
+
+
$subtext1 = rgb(b8c0e0)
+
$subtext1Alpha = b8c0e0
+
+
$subtext0 = rgb(a5adcb)
+
$subtext0Alpha = a5adcb
+
+
$overlay2 = rgb(939ab7)
+
$overlay2Alpha = 939ab7
+
+
$overlay1 = rgb(8087a2)
+
$overlay1Alpha = 8087a2
+
+
$overlay0 = rgb(6e738d)
+
$overlay0Alpha = 6e738d
+
+
$surface2 = rgb(5b6078)
+
$surface2Alpha = 5b6078
+
+
$surface1 = rgb(494d64)
+
$surface1Alpha = 494d64
+
+
$surface0 = rgb(363a4f)
+
$surface0Alpha = 363a4f
+
+
$base = rgb(24273a)
+
$baseAlpha = 24273a
+
+
$mantle = rgb(1e2030)
+
$mantleAlpha = 1e2030
+
+
$crust = rgb(181926)
+
$crustAlpha = 181926
+45
home-manager/dots/sunpaperconfig
···
+
#################################################
+
# BASIC CONFIGURATION
+
#################################################
+
+
# Set your local latitude and longitude for sun calculations
+
# latitude="44.906658N"
+
# longitude="-86.033386W"
+
+
# Set full path to the wallpaper theme folder
+
# Theme folder names:grep
+
#
+
# Blake Watson & Sunpaper: Corporate-Synergy
+
# Apple: The-Beach The-Cliffs The-Lake The-Desert
+
# Louis Coyle: Lakeside
+
#
+
wallpaperPath="$SUNPAPERDIR/share/images/Lakeside"
+
+
#################################################
+
# Animate transitions with SWWW MODE
+
# requires (https://github.com/Horus645/swww)
+
# and Wayland
+
#################################################
+
#
+
# For smooth low memory animated transitions between
+
# images.
+
#
+
# This also resolves the gray flash in Sway whenever changing
+
# wallpaper. (https://github.com/swaywm/sway/issues/3693)
+
#
+
# enable this mode here with
+
# swww_enable="true"
+
swww_enable="true"
+
+
# swww should already be installed and configured.
+
# sunpaper will launch the swww daemon if it's not
+
# already started.
+
+
# swww takes two options for animation control of the
+
# transition between images: frame rate and step (more
+
# info: https://github.com/Horus645/swww/issues/51)
+
#
+
# swww_fps <1 to 255>
+
# swww_step <1 to 255>
+
swww_fps="4"
+
swww_step="1"
+444
home-manager/home.nix
···
+
# This is your home-manager configuration file
+
# Use this to configure your home environment (it replaces ~/.config/nixpkgs/home.nix)
+
{
+
inputs,
+
lib,
+
config,
+
pkgs,
+
...
+
}: {
+
# You can import other home-manager modules here
+
imports = [
+
# If you want to use home-manager modules from other flakes (such as nix-colors):
+
# inputs.nix-colors.homeManagerModule
+
+
# You can also split up your configuration and import pieces of it here:
+
# ./nvim.nix
+
+
# spicetify
+
inputs.spicetify-nix.homeManagerModules.default
+
+
# catpuccin
+
inputs.catppuccin.homeManagerModules.catppuccin
+
+
# inputs.Hyprnix.homeManagerModules.hyprland
+
+
# ./hyprland.nix
+
./hyprland
+
+
./waybar.nix
+
+
./neovim.nix
+
];
+
+
nixpkgs = {
+
overlays = [
+
inputs.nix-vscode-extensions.overlays.default
+
inputs.catppuccin-vsc.overlays.default
+
];
+
# Configure your nixpkgs instance
+
config = {
+
# Disable if you don't want unfree packages
+
allowUnfree = true;
+
# Workaround for https://github.com/nix-community/home-manager/issues/2942
+
allowUnfreePredicate = _: true;
+
};
+
};
+
+
home = {
+
username = "kierank";
+
homeDirectory = "/home/kierank";
+
};
+
+
# Add stuff for your user as you see fit:
+
# programs.neovim.enable = true;
+
# home.packages = with pkgs; [ steam ];
+
+
# Enable home-manager and git
+
programs.home-manager.enable = true;
+
+
# catppuccin
+
catppuccin = {
+
enable = true;
+
accent = "green";
+
flavor = "macchiato";
+
pointerCursor = {
+
enable = true;
+
accent = "blue";
+
flavor = "macchiato";
+
};
+
};
+
+
dconf.settings = {
+
"org/gnome/desktop/interface" = {
+
color-scheme = "prefer-dark";
+
};
+
};
+
+
xdg.portal = {
+
enable = true;
+
extraPortals = with pkgs; [ xdg-desktop-portal-gtk ];
+
configPackages = with pkgs; [ xdg-desktop-portal-gtk ];
+
};
+
+
gtk = {
+
enable = true;
+
catppuccin = {
+
enable = true;
+
tweaks = [ "normal" ];
+
};
+
};
+
+
+
qt = {
+
style.name = "kvantum";
+
platformTheme.name = "kvantum";
+
enable = true;
+
};
+
+
services.udiskie = {
+
enable = true;
+
settings = {
+
program_options = {
+
udisks_version = 2;
+
tray = false;
+
};
+
notifications = {
+
device_unmounted = false;
+
device_added = -1;
+
device_removed = -1;
+
device_mounted = -1;
+
};
+
};
+
};
+
+
# git config
+
programs.git = {
+
enable = true;
+
userName = "Kieran Klukas";
+
userEmail = "92754843+kcoderhtml@users.noreply.github.com";
+
aliases = {
+
c = "commit";
+
p = "push";
+
};
+
extraConfig = {
+
commit.gpgsign = true;
+
gpg.format = "ssh";
+
gpg.ssh.allowedSignersFile = "~/.ssh/allowedSigners";
+
user.signingKey = "~/.ssh/id_rsa.pub";
+
pull.rebase = true;
+
};
+
};
+
+
programs.spicetify =
+
let
+
spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system};
+
in
+
{
+
enable = true;
+
enabledExtensions = with spicePkgs.extensions; [
+
adblock
+
hidePodcasts
+
shuffle # shuffle+ (special characters are sanitized out of extension names)
+
];
+
theme = spicePkgs.themes.catppuccin;
+
colorScheme = "macchiato";
+
};
+
+
programs.starship = {
+
enable = true;
+
enableZshIntegration = true;
+
# Configuration written to ~/.config/starship.toml
+
settings = {
+
add_newline = false;
+
+
# Change command timeout from 500 to 1000 ms
+
command_timeout = 1000;
+
+
format = lib.concatStrings [
+
"\n"
+
"$env_var"
+
"$all$character"
+
];
+
+
character = {
+
success_symbol = "[](bold purple)";
+
error_symbol = "[](bold red)";
+
};
+
+
username = {
+
style_user = "green";
+
style_root = "red";
+
format = "[󱄅 $user]($style) ";
+
disabled = false;
+
show_always = true;
+
};
+
+
hostname = {
+
ssh_only = false;
+
format = "on [$hostname](bold yellow) ";
+
disabled = false;
+
};
+
+
directory = {
+
truncation_length = 1;
+
truncation_symbol = "…/";
+
home_symbol = " ~";
+
read_only_style = "197";
+
read_only = "  ";
+
format = "at [$path]($style)[$read_only]($read_only_style) ";
+
};
+
+
git_branch = {
+
symbol = "󰊢 ";
+
format = "via [$symbol$branch]($style) ";
+
truncation_length = 6;
+
truncation_symbol = "…/";
+
style = "bold green";
+
};
+
+
git_status = {
+
format = "[《$all_status$ahead_behind》]($style) ";
+
style = "bold green";
+
conflicted = " ";
+
up_to_date = " ";
+
untracked = " ";
+
ahead = "⇡$count ";
+
diverged = "⇡$ahead_count⇣$behind_count ";
+
behind = "⇣$count ";
+
stashed = "󱑿 ";
+
modified = " ";
+
staged = "[⟨++$count⟩ ](green)";
+
renamed = "󱅄 ";
+
deleted = " ";
+
};
+
+
docker_context = {
+
symbol = " ";
+
disabled = false;
+
};
+
+
python = {
+
symbol = "󰌠 ";
+
python_binary = "python3";
+
disabled = false;
+
};
+
+
nodejs = {
+
symbol = " ";
+
detect_files = ["package.json" ".node-version" "!bunfig.toml" "!bun.lockb"];
+
disabled = false;
+
};
+
+
bun = {
+
symbol = "󰟈 ";
+
disabled = false;
+
};
+
};
+
};
+
+
programs.zsh = {
+
enable = true;
+
enableCompletion = true;
+
syntaxHighlighting.enable = true;
+
+
shellAliases = {
+
ll = "ls -l";
+
la = "ls -la";
+
update = "sudo nixos-rebuild switch";
+
gc = "git commit";
+
gp = "git push";
+
rr = "rm -Rf";
+
ghrpc = "gh repo create -c";
+
};
+
initExtra = ''
+
#ssh auto reconnect
+
assh() {
+
local host=$1
+
local port=$2
+
while true; do
+
ssh -p $port -o "BatchMode yes" $host || sleep 1
+
done
+
}
+
'';
+
history = {
+
size = 10000;
+
path = "${config.xdg.dataHome}/zsh/history";
+
};
+
+
oh-my-zsh = {
+
enable = true;
+
plugins = [ "git" "sudo" "docker" "git" "command-not-found" "colored-man-pages" ];
+
};
+
+
plugins = [
+
{
+
# will source zsh-autosuggestions.plugin.zsh
+
name = "zsh-autosuggestions";
+
src = pkgs.fetchFromGitHub {
+
owner = "zsh-users";
+
repo = "zsh-autosuggestions";
+
rev = "v0.7.0";
+
sha256 = "sha256-KLUYpUu4DHRumQZ3w59m9aTW6TBKMCXl2UcKi4uMd7w=";
+
};
+
}
+
{
+
# will source zsh-sytax-highlighting
+
name = "zsh-sytax-highlighting";
+
src = pkgs.fetchFromGitHub {
+
owner = "zsh-users";
+
repo = "zsh-syntax-highlighting";
+
rev = "0.8.0";
+
sha256 = "sha256-iJdWopZwHpSyYl5/FQXEW7gl/SrKaYDEtTH9cGP7iPo=";
+
};
+
}
+
];
+
};
+
+
programs.zoxide = {
+
enable = true;
+
enableZshIntegration = true;
+
};
+
+
# alacritty
+
programs.alacritty = {
+
enable = true;
+
settings = {
+
live_config_reload = true;
+
cursor = {
+
unfocused_hollow = true;
+
style = {
+
blinking = "On";
+
};
+
};
+
window = {
+
opacity = 0.75;
+
padding = {
+
x = 12;
+
y = 12;
+
};
+
};
+
font = {
+
size = 13;
+
normal = {
+
family = "JetBrainsMono Nerd Font";
+
};
+
};
+
colors = {
+
primary = {
+
background = lib.mkForce "#1E2128";
+
};
+
};
+
};
+
};
+
+
services.mako = {
+
enable = true;
+
defaultTimeout = 4000;
+
margin = "58,6";
+
font = "Fira Sans 12";
+
borderRadius = 5;
+
};
+
+
programs.tofi = {
+
enable = true;
+
catppuccin.enable = false;
+
settings = {
+
font = "Fira Sans";
+
font-size = 24;
+
+
prompt-text = ''"> "'';
+
placeholder-text = "search for something";
+
hide-cursor = true;
+
+
corner-radius = 10;
+
outline-width = 3;
+
border-width = 0;
+
padding-left = "4%";
+
padding-top = "2%";
+
padding-right = 0;
+
padding-bottom = 0;
+
+
outline-color = "#1E2030";
+
text-color = "#cad3f5";
+
prompt-color = "#ed8796";
+
placeholder-color = "#8087A2";
+
selection-color = "#eed49f";
+
background-color = "#24273a";
+
+
width = "35%";
+
height = "15%";
+
};
+
};
+
+
programs.vscode = {
+
enable = true;
+
extensions = with pkgs.vscode-marketplace; [
+
ms-vscode.live-server
+
formulahendry.auto-rename-tag
+
edwinkofler.vscode-assorted-languages
+
golang.go
+
catppuccin.catppuccin-vsc-icons
+
eamodio.gitlens
+
yzhang.markdown-all-in-one
+
github.vscode-github-actions
+
yoavbls.pretty-ts-errors
+
esbenp.prettier-vscode
+
vsciot-vscode.vscode-arduino
+
ms-vscode.cpptools
+
ms-vscode.vscode-serial-monitor
+
prisma.prisma
+
ms-azuretools.vscode-docker
+
astro-build.astro-vscode
+
github.copilot
+
github.copilot-chat
+
dotjoshjohnson.xml
+
johnpapa.vscode-cloak
+
mikestead.dotenv
+
]
+
++ [(pkgs.catppuccin-vsc.override {
+
accent = "blue";
+
})];
+
+
userSettings = {
+
"editor.semanticHighlighting.enabled" = true;
+
"terminal.integrated.minimumContrastRatio" = 1;
+
"window.titleBarStyle" = "custom";
+
+
"gopls" = {
+
"ui.semanticTokens" = true;
+
};
+
"workbench.colorTheme" = "Catppuccin Macchiato";
+
"workbench.iconTheme" = "catppuccin-macchiato";
+
"catppuccin.accentColor" = "blue";
+
"editor.fontFamily" = "'FiraCode Nerd Font', 'monospace', monospace";
+
"git.autofetch" = true;
+
"git.confirmSync" = false;
+
"github.copilot.editor.enableAutoCompletions" = false;
+
+
"editor.formatOnSave" = true;
+
+
"[json]" = {
+
"editor.defaultFormatter" = "esbenp.prettier-vscode";
+
};
+
"[javascript]" = {
+
"editor.defaultFormatter" = "esbenp.prettier-vscode";
+
};
+
};
+
};
+
+
programs.obs-studio = {
+
enable = true;
+
plugins = with pkgs.obs-studio-plugins; [
+
wlrobs
+
obs-backgroundremoval
+
obs-pipewire-audio-capture
+
];
+
};
+
+
# Nicely reload system units when changing configs
+
systemd.user.startServices = "sd-switch";
+
+
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
+
home.stateVersion = "23.05";
+
}
+100
home-manager/hyprland/config.nix
···
+
{ lib, ... }:
+
{
+
wayland.windowManager.hyprland = {
+
# <https://wiki.hyprland.org/Configuring/Variables/#general>
+
config.general = {
+
border_size = 2;
+
gaps_inside = 5;
+
gaps_outside = 10;
+
resize_on_border = true;
+
extend_border_grab_area = 10;
+
};
+
+
# <https://wiki.hyprland.org/Configuring/Variables/#decoration>
+
config.decoration = {
+
rounding = 0;
+
shadow_range = 8;
+
shadow_render_power = 2;
+
blur = {
+
size = 3; # 8
+
passes = 2; # 1
+
ignore_opacity = true; # false
+
xray = true; # false
+
noise = 6.5e-2; # 0.0117
+
contrast = 0.75; # 0.8916
+
brightness = 0.8; # 0.8172
+
};
+
};
+
+
# <https://wiki.hyprland.org/Configuring/Variables/#input>
+
config.input = let
+
DISABLED = 0;
+
LOOSE = 2;
+
in {
+
follow_mouse = LOOSE;
+
float_switch_override_focus = DISABLED;
+
touchpad = {
+
natural_scroll = true;
+
};
+
};
+
+
# <https://wiki.hyprland.org/Configuring/Variables/#binds>
+
config.binds = let LONGEST_SHARED_SIDE = 1;
+
in {
+
pass_mouse_when_bound = false;
+
focus_preferred_method = LONGEST_SHARED_SIDE;
+
};
+
+
config.gestures = {
+
workspace_swipe = {
+
enable = true;
+
invert = false;
+
min_speed_to_force = 20;
+
cancel_ratio = 0.65;
+
create_new = false;
+
forever = true;
+
};
+
};
+
+
# <https://wiki.hyprland.org/Configuring/Variables/#misc>
+
config.misc = let FULLSCREEN_ONLY = 2;
+
in {
+
disable_hyprland_logo = true; # false
+
disable_splash_rendering = true; # false
+
force_default_wallpaper = 0; # disable weeb stuff
+
variable_framerate = true;
+
variable_refresh = FULLSCREEN_ONLY;
+
disable_autoreload = true; # false # nix takes care of that
+
+
# works well with swayidle
+
key_press_enables_dpms = true;
+
mouse_move_enables_dpms = true;
+
};
+
+
config.group = {
+
insert_after_current = true;
+
focus_removed_window = true;
+
+
# These features are not polished yet:
+
# <https://github.com/hyprwm/Hyprland/issues/2415>
+
# @MightyPlaza is working on this, but not doing it how we expect.
+
# <https://github.com/hyprwm/Hyprland/pull/3197>
+
groupbar = rec {
+
font_size = 9;
+
gradients = false;
+
render_titles = true;
+
scrolling = true;
+
};
+
};
+
+
# <https://wiki.hyprland.org/Configuring/Dwindle-Layout/>
+
config.dwindle = let ALWAYS_EAST = 2;
+
in {
+
force_split = ALWAYS_EAST; # 0
+
preserve_split = true; # false
+
# no_gaps_when_only = true;
+
};
+
+
# <https://wiki.hyprland.org/Configuring/Animations/#curves>
+
};
+
}
+28
home-manager/hyprland/default.nix
···
+
{ self, config, lib, pkgs, inputs, ... }: {
+
imports = [
+
inputs.hyprnix.homeManagerModules.hyprland
+
./config.nix
+
./windowrules.nix
+
./keybinds.nix
+
../waybar.nix
+
];
+
+
wayland.windowManager.hyprland = {
+
enable = true;
+
package = pkgs.hyprland;
+
reloadConfig = true;
+
systemdIntegration = true;
+
recommendedEnvironment = true;
+
+
fufexan.enable = true;
+
+
xwayland.enable = true;
+
+
config.exec_once = [
+
# polkit agent, raises to root access with gui
+
"${lib.getExe pkgs.lxqt.lxqt-policykit}"
+
# allow apps with risen perms after agent to connect to local xwayland
+
"${lib.getExe pkgs.xorg.xhost} +local:"
+
];
+
};
+
}
+224
home-manager/hyprland/keybinds.nix
···
+
# Converted with regex from hyprland config
+
# search: ^(\s*)(bind[rwelm]*) = (|\w+), (|\$?\w+), (.+)$ /gm
+
# replace: $1$2."$3, $4" = "$5";
+
+
{ config, pkgs, lib, ... }: {
+
# <https://wiki.hyprland.org/Configuring/Dispatchers/>
+
wayland.windowManager.hyprland.keyBinds = let
+
MOUSE_LMB = "mouse:272";
+
MOUSE_RMB = "mouse:273";
+
# MOUSE_MMB = "mouse:274";
+
MOUSE_EX1 = "mouse:275";
+
MOUSE_EX2 = "mouse:276";
+
+
# Collections of keybinds common across multiple submaps are collected into
+
# groups, which can be merged together granularly.
+
groups = {
+
# Exit the submap and restore normal binds.
+
submapReset = {
+
bind.", escape" = "submap, reset";
+
bind."CTRL, C" = "submap, reset";
+
};
+
+
# Self-explanatory.
+
launchPrograms = {
+
# Launch the program with a shortcut.
+
bind."SUPER, E" = "exec, dolphin";
+
bind."SUPER, Enter" = "exec, foot";
+
};
+
+
# Kill the active window.
+
killWindow = { bind."SUPER, Q" = "killactive,"; };
+
+
# Either window focus or window movement.
+
moveFocusOrWindow = with groups;
+
lib.mkMerge [ moveFocus moveWindow mouseMoveWindow ];
+
+
# Focus on another window, in the specified direction.
+
moveFocus = {
+
bind."SUPER, left" = "movefocus, l";
+
bind."SUPER, right" = "movefocus, r";
+
bind."SUPER, up" = "movefocus, u";
+
bind."SUPER, down" = "movefocus, d";
+
};
+
+
# Swap the active window with another, in the specified direction.
+
moveWindow = {
+
bind."SUPER_SHIFT, left" = "movewindow, l";
+
bind."SUPER_SHIFT, right" = "movewindow, r";
+
bind."SUPER_SHIFT, up" = "movewindow, u";
+
bind."SUPER_SHIFT, down" = "movewindow, d";
+
};
+
+
# Translate the dragged window by mouse movement.
+
mouseMoveWindow = {
+
bindm."SUPER, ${MOUSE_LMB}" = "movewindow";
+
bindm.", ${MOUSE_EX2}" = "movewindow";
+
};
+
+
# Toggle between vertical and horizontal split for
+
# the active window and an adjacent one.
+
toggleSplit = { bind."SUPER, tab" = "togglesplit,"; };
+
+
# Resize a window with the mouse.
+
mouseResizeWindow = {
+
bindm."SUPER, ${MOUSE_RMB}" = "resizewindow";
+
bindm.", ${MOUSE_EX1}" = "resizewindow";
+
};
+
+
# Switch to the next/previous tab in the active group.
+
changeGroupActive = {
+
bind."ALT, tab" = "changegroupactive, f";
+
bind."ALT, grave" = "changegroupactive, b";
+
};
+
+
# Switch to another workspace.
+
switchWorkspace = with groups;
+
lib.mkMerge [ switchWorkspaceAbsolute switchWorkspaceRelative ];
+
+
# Switch to a workspace by absolute identifier.
+
switchWorkspaceAbsolute = {
+
# Switch to a primary workspace by index.
+
bind."SUPER, 1" = "workspace, 1";
+
bind."SUPER, 2" = "workspace, 2";
+
bind."SUPER, 3" = "workspace, 3";
+
bind."SUPER, 4" = "workspace, 4";
+
bind."SUPER, 5" = "workspace, 5";
+
bind."SUPER, 6" = "workspace, 6";
+
bind."SUPER, 7" = "workspace, 7";
+
bind."SUPER, 8" = "workspace, 8";
+
bind."SUPER, 9" = "workspace, 9";
+
bind."SUPER, 0" = "workspace, 10";
+
+
# Switch to an alternate workspace by index.
+
bind."SUPER_ALT, 1" = "workspace, 11";
+
bind."SUPER_ALT, 2" = "workspace, 12";
+
bind."SUPER_ALT, 3" = "workspace, 13";
+
bind."SUPER_ALT, 4" = "workspace, 14";
+
bind."SUPER_ALT, 5" = "workspace, 15";
+
bind."SUPER_ALT, 6" = "workspace, 16";
+
bind."SUPER_ALT, 7" = "workspace, 17";
+
bind."SUPER_ALT, 8" = "workspace, 18";
+
bind."SUPER_ALT, 9" = "workspace, 19";
+
bind."SUPER_ALT, 0" = "workspace, 20";
+
+
# TODO Bind the special workspace to `XF86Favorites`.
+
# TODO Create a bind for "insert after current workspace".
+
};
+
+
# Switch to workspaces relative to the current one.
+
switchWorkspaceRelative = {
+
# Switch to the next/previous used workspace with page keys.
+
bind."SUPER, page_down" = "workspace, m+1";
+
bind."SUPER, page_up" = "workspace, m-1";
+
+
# Switch to the next/previous used workspace
+
# with the right and left square brackets,
+
# while holding super and shift.
+
bind."SUPER, bracketright " = "workspace, m+1";
+
bind."SUPER, bracketleft" = "workspace, m-1";
+
+
# Switch to the next/previous used workspace with the mouse wheel.
+
bind."SUPER, mouse_up" = "workspace, m+1";
+
bind."SUPER, mouse_down" = "workspace, m-1";
+
};
+
+
# Send a window to another workspace.
+
sendWindow = with groups;
+
lib.mkMerge [ sendWindowAbsolute sendWindowRelative ];
+
+
# Send a window to a workspace by absolute identifier.
+
sendWindowAbsolute = {
+
# Move the active window or group to a primary workspace by index.
+
bind."SUPER_SHIFT, 1" = "movetoworkspacesilent, 1";
+
bind."SUPER_SHIFT, 2" = "movetoworkspacesilent, 2";
+
bind."SUPER_SHIFT, 3" = "movetoworkspacesilent, 3";
+
bind."SUPER_SHIFT, 4" = "movetoworkspacesilent, 4";
+
bind."SUPER_SHIFT, 5" = "movetoworkspacesilent, 5";
+
bind."SUPER_SHIFT, 6" = "movetoworkspacesilent, 6";
+
bind."SUPER_SHIFT, 7" = "movetoworkspacesilent, 7";
+
bind."SUPER_SHIFT, 8" = "movetoworkspacesilent, 8";
+
bind."SUPER_SHIFT, 9" = "movetoworkspacesilent, 9";
+
bind."SUPER_SHIFT, 0" = "movetoworkspacesilent, 10";
+
+
# Move the active window or group to an alternate workspace by index.
+
bind."SUPER_ALT_SHIFT, 1" = "movetoworkspacesilent, 11";
+
bind."SUPER_ALT_SHIFT, 2" = "movetoworkspacesilent, 12";
+
bind."SUPER_ALT_SHIFT, 3" = "movetoworkspacesilent, 13";
+
bind."SUPER_ALT_SHIFT, 4" = "movetoworkspacesilent, 14";
+
bind."SUPER_ALT_SHIFT, 5" = "movetoworkspacesilent, 15";
+
bind."SUPER_ALT_SHIFT, 6" = "movetoworkspacesilent, 16";
+
bind."SUPER_ALT_SHIFT, 7" = "movetoworkspacesilent, 17";
+
bind."SUPER_ALT_SHIFT, 8" = "movetoworkspacesilent, 18";
+
bind."SUPER_ALT_SHIFT, 9" = "movetoworkspacesilent, 19";
+
bind."SUPER_ALT_SHIFT, 0" = "movetoworkspacesilent, 20";
+
};
+
+
# Send windows to other workspaces, relative to the current one.
+
sendWindowRelative = {
+
# Move the active window or group to the next/previous
+
# workspace with page keys, while holding super and shift.
+
bind."SUPER_SHIFT, page_down" = "movetoworkspace, r+1";
+
bind."SUPER_SHIFT, page_up" = "movetoworkspace, r-1";
+
+
# Move the active window or group to the next/previous
+
# workspace with the right and left square brackets,
+
# while holding super and shift.
+
bind."SUPER_SHIFT, bracketright" = "movetoworkspace, r+1";
+
bind."SUPER_SHIFT, bracketleft" = "movetoworkspace, r-1";
+
+
# Move the active window or group to the next/previous
+
# workspace with the mouse wheel while holding super and shift.
+
bind."SUPER_SHIFT, mouse_up" = "movetoworkspace, r+1";
+
bind."SUPER_SHIFT, mouse_down" = "movetoworkspace, r-1";
+
};
+
};
+
in lib.mkMerge [
+
### ACTIVE WINDOW ACTIONS ###
+
groups.killWindow
+
{
+
# Toggle full-screen for the active window.
+
bind."SUPER_SHIFT, F" = "fullscreen, 0";
+
+
# Float/unfloat the active window.
+
bind."SUPER, F" = "togglefloating,";
+
}
+
### MISCELLANEOUS ###
+
{
+
# Lock the session immediately.
+
bind."SUPER, l" = "exec, loginctl lock-session";
+
+
# Kill the window manager.
+
bind."SUPER_SHIFT, M" = "exit,";
+
+
# Forcefully kill a program after selecting its window with the mouse.
+
bind."SUPER_SHIFT, Q" = "exec, hyprctl kill";
+
+
# Select a region and take a screenshot, saving to the clipboard.
+
bind."SUPER_SHIFT, print" = "exec, prtsc -c -m r -D -b 00000066";
+
+
# Bypass all binds for the window manager and pass key combinations
+
# directly to the active window.
+
bind."SUPER_SHIFT, K" = "submap, passthru";
+
submap.passthru = { bind."SUPER_SHIFT, K" = "submap, reset"; };
+
}
+
### PROGRAM LAUNCHING ###
+
groups.launchPrograms
+
{
+
# Open Rofi to launch a program.
+
bind."SUPER, Space" = "exec, rofi -show drun -show-icons";
+
# Open Rofi to run a command.
+
bind."SUPER, R" = "exec, rofi -show run";
+
}
+
### WINDOW FOCUS & MOVEMENT ###
+
groups.moveFocusOrWindow
+
### WINDOW RESIZING ###
+
groups.toggleSplit
+
groups.mouseResizeWindow
+
+
### WORKSPACE SWITCHING ###
+
groups.switchWorkspace
+
### WORKSPACE WINDOW MOVEMENT ###
+
groups.sendWindow
+
];
+
}
+132
home-manager/hyprland/windowrules.nix
···
+
# <https://wiki.hyprland.org/Configuring/Window-Rules/#window-rules-v2>
+
{ lib, ... }:
+
let
+
# I recommend using this factory function for creating window rules.
+
rule = rules: attrs: attrs // { inherit rules; };
+
in {
+
wayland.windowManager.hyprland.layerRules = [{
+
namespace = [ "rofi" "notification" ];
+
rules = [ "blur" "ignorezero" ];
+
}];
+
+
wayland.windowManager.hyprland.windowRules = let
+
### SYSTEM CONTROL ###
+
printerConfig.class = [ "system-config-printer" ];
+
audioControl.class = [ "pavucontrol-qt" ];
+
wifiControl.class = [ "org.twosheds.iwgtk" "iwgtk" ];
+
bluetoothControl = {
+
class = [ ".*blueman-manager.*" ];
+
title = [ "Bluetooth Devices" ];
+
};
+
kvantumConfig.class = [ "kvantummanager" ];
+
+
### SYSTEM MODALS ###
+
filePickerPortal = {
+
# I'm guessing that almost all portal interfaces are going to be modals
+
class =
+
[ "xdg-desktop-portal-gtk" "org.freedesktop.impl.portal.desktop.kde" ];
+
# title = ["Open Files.+Portal"];
+
};
+
polkitAgent.class = [ "lxqt-policykit-agent" ];
+
mountDialog.class = [ "udiskie" ];
+
+
### DESKTOP APPLICATIONS ###
+
vscode = {
+
title = [ ".*Visual Studio Code" ];
+
# class = ["code-url-handler"];
+
};
+
discord = {
+
class = [ "vesktop" "ArmCord" "WebCord" "discord" ];
+
title = [
+
"(\\[\\d+\\] )?Discord |.*"
+
".*ArmCord"
+
"(\\[\\d+\\] )?WebCord.*"
+
".*Discord"
+
];
+
};
+
tidal.class = [ "tidal-hifi" ];
+
calculator.class = [ "qalculate-gtk" ];
+
# obsStudio = {
+
# class = [ "com.obsproject.Studio" ];
+
# title = [ "OBS\\s[\\d\\.]+.*" ];
+
# };
+
steam = {
+
class = [ "Steam" ];
+
# title = ["Steam"];
+
};
+
minecraft = {
+
class = [ "Minecraft.+" ];
+
title = [ "Minecraft.+" ];
+
};
+
virtManagerConsole = {
+
class = [ "virt-manager" ];
+
title = [ ".+on.+" ];
+
};
+
+
### DESKTOP APPLICATION MODALS ###
+
discordModal = {
+
class = [ "WebCord" ];
+
title = [ "WebCord.+Settings" ];
+
};
+
tidalModal = {
+
class = [ "tidal-hifi" ];
+
title = [ "Tidal Hi-Fi settings" ];
+
};
+
keePassModal = {
+
class = [ "org.keepassxc.KeePassXC" ];
+
title = [
+
"Unlock Database.+KeePassXC"
+
"Generate Password"
+
"KeePassXC.+Browser Access Request"
+
];
+
};
+
firefoxModal = {
+
class = [ "firefox" ];
+
title = [ "Extension.+Mozilla Firefox.*" "Picture-in-Picture" ];
+
};
+
lxImageModal = {
+
class = [ "lximage-qt" ];
+
title = [ "Print" ];
+
};
+
fileZillaModal = {
+
class = [ "filezilla" ];
+
title = [ "Site Manager" ];
+
};
+
in lib.concatLists [
+
[
+
(rule [ "size 740 460" ] filePickerPortal)
+
(rule [ "size 950 700" ] kvantumConfig)
+
]
+
# Because it can be shown and hidden with a systray icon.
+
(map (rule [ "float" "pin" "move 10% 10%" "size 80% 80%" ]) [ tidal ])
+
#
+
(map (rule [ "idleinhibit focus" ]) [ minecraft virtManagerConsole ])
+
(map (rule [ "float" ]) [
+
kvantumConfig
+
keePassModal
+
lxImageModal
+
firefoxModal
+
fileZillaModal
+
discordModal
+
tidalModal
+
])
+
# Barely translucent
+
(map (rule [ "opacity 0.97 0.97" ]) [ ])
+
(map (rule [ "opacity 0.97 0.97" "float" ]) [
+
printerConfig
+
audioControl
+
bluetoothControl
+
polkitAgent
+
mountDialog
+
])
+
# More translucent
+
(map (rule [ "opacity 0.92 0.92" ]) [ vscode steam tidal discord ])
+
(map (rule [ "opacity 0.92 0.92" "float" ]) [
+
filePickerPortal
+
wifiControl
+
])
+
# Super translucent
+
(map (rule [ "opacity 0.87 0.87" ]) [ ])
+
(map (rule [ "opacity 0.87 0.87" "float" ]) [ calculator ])
+
];
+
}
+47
home-manager/hyprland.nix
···
+
{
+
inputs,
+
lib,
+
config,
+
pkgs,
+
...
+
}: {
+
xdg.configFile."sunpaper/config".source = ./dots/sunpaperconfig;
+
xdg.configFile."hypr/hyprland.conf".source = ./dots/hyprland.conf;
+
xdg.configFile."hypr/hyprlock.conf".source = ./dots/hyprlock.conf;
+
xdg.configFile."hypr/macchiato.conf".source = ./dots/macchiato.conf;
+
xdg.configFile."face.png".source = ./dots/face.png;
+
+
programs.hyprlock.enable = true;
+
services.hypridle = {
+
enable = true;
+
settings= {
+
general = {
+
after_sleep_cmd = "hyprctl dispatch dpms on";
+
before_sleep_cmd = "hyprlock";
+
ignore_dbus_inhibit = false;
+
lock_cmd = "pidof hyprlock || hyprlock";
+
};
+
+
listener = [
+
{
+
timeout = 30;
+
on-timeout = "kill $(pidof wluma); brightnessctl -s set 10";
+
on-resume = "brightnessctl -r; wluma &";
+
}
+
{
+
timeout = 45;
+
on-timeout = "loginctl lock-session";
+
}
+
{
+
timeout = 90;
+
on-timeout = "hyprctl dispatch dpms off";
+
on-resume = "hyprctl dispatch dpms on";
+
}
+
{
+
timeout = 150;
+
on-timeout = "systemctl suspend";
+
}
+
];
+
};
+
};
+
}
+126
home-manager/neovim.nix
···
+
{ config, lib, pkgs, ... }:
+
+
{
+
programs.neovim = {
+
enable = true;
+
extraPackages = with pkgs; [
+
# LazyVim
+
lua-language-server
+
gopls
+
stylua
+
# Telescope
+
ripgrep
+
];
+
+
plugins = with pkgs.vimPlugins; [
+
lazy-nvim
+
];
+
+
defaultEditor = true;
+
viAlias = true;
+
vimAlias = true;
+
+
extraLuaConfig =
+
let
+
plugins = with pkgs.vimPlugins; [
+
# LazyVim
+
LazyVim
+
bufferline-nvim
+
cmp-buffer
+
cmp-nvim-lsp
+
cmp-path
+
cmp_luasnip
+
conform-nvim
+
dashboard-nvim
+
dressing-nvim
+
flash-nvim
+
friendly-snippets
+
gitsigns-nvim
+
indent-blankline-nvim
+
lualine-nvim
+
neo-tree-nvim
+
neoconf-nvim
+
neodev-nvim
+
noice-nvim
+
nui-nvim
+
nvim-cmp
+
nvim-lint
+
nvim-lspconfig
+
nvim-notify
+
nvim-spectre
+
nvim-treesitter
+
nvim-treesitter-context
+
nvim-treesitter-textobjects
+
nvim-ts-autotag
+
nvim-ts-context-commentstring
+
nvim-web-devicons
+
persistence-nvim
+
plenary-nvim
+
telescope-fzf-native-nvim
+
telescope-nvim
+
todo-comments-nvim
+
tokyonight-nvim
+
trouble-nvim
+
vim-illuminate
+
vim-startuptime
+
which-key-nvim
+
{ name = "LuaSnip"; path = luasnip; }
+
{ name = "catppuccin"; path = catppuccin-nvim; }
+
{ name = "mini.ai"; path = mini-nvim; }
+
{ name = "mini.bufremove"; path = mini-nvim; }
+
{ name = "mini.comment"; path = mini-nvim; }
+
{ name = "mini.indentscope"; path = mini-nvim; }
+
{ name = "mini.pairs"; path = mini-nvim; }
+
{ name = "mini.surround"; path = mini-nvim; }
+
];
+
mkEntryFromDrv = drv:
+
if lib.isDerivation drv then
+
{ name = "${lib.getName drv}"; path = drv; }
+
else
+
drv;
+
lazyPath = pkgs.linkFarm "lazy-plugins" (builtins.map mkEntryFromDrv plugins);
+
in
+
''
+
require("lazy").setup({
+
defaults = {
+
lazy = true,
+
},
+
dev = {
+
-- reuse files from pkgs.vimPlugins.*
+
path = "${lazyPath}",
+
patterns = { "." },
+
-- fallback to download
+
fallback = true,
+
},
+
spec = {
+
{ "LazyVim/LazyVim", import = "lazyvim.plugins" },
+
-- The following configs are needed for fixing lazyvim on nix
+
-- force enable telescope-fzf-native.nvim
+
{ "nvim-telescope/telescope-fzf-native.nvim", enabled = true },
+
-- disable mason.nvim, use programs.neovim.extraPackages
+
{ "williamboman/mason-lspconfig.nvim", enabled = false },
+
{ "williamboman/mason.nvim", enabled = false },
+
-- import/override with your plugins
+
{ import = "plugins" },
+
-- treesitter handled by xdg.configFile."nvim/parser", put this line at the end of spec to clear ensure_installed
+
{ "nvim-treesitter/nvim-treesitter", opts = { ensure_installed = {} } },
+
},
+
})
+
'';
+
};
+
+
# https://github.com/nvim-treesitter/nvim-treesitter#i-get-query-error-invalid-node-type-at-position
+
xdg.configFile."nvim/parser".source =
+
let
+
parsers = pkgs.symlinkJoin {
+
name = "treesitter-parsers";
+
paths = (pkgs.vimPlugins.nvim-treesitter.withPlugins (plugins: with plugins; [
+
c
+
lua
+
])).dependencies;
+
};
+
in
+
"${parsers}/parser";
+
+
# Normal LazyVim config here, see https://github.com/LazyVim/starter/tree/main/lua
+
}
+481
home-manager/waybar.nix
···
+
{
+
outputs,
+
config,
+
lib,
+
pkgs,
+
inputs,
+
...
+
}: let
+
commonDeps = with pkgs; [coreutils gnugrep systemd];
+
# Function to simplify making waybar outputs
+
mkScript = {
+
name ? "script",
+
deps ? [],
+
script ? "",
+
}:
+
lib.getExe (pkgs.writeShellApplication {
+
inherit name;
+
text = script;
+
runtimeInputs = commonDeps ++ deps;
+
});
+
# Specialized for JSON outputs
+
mkScriptJson = {
+
name ? "script",
+
deps ? [],
+
pre ? "",
+
text ? "",
+
tooltip ? "",
+
alt ? "",
+
class ? "",
+
percentage ? "",
+
}:
+
mkScript {
+
inherit name;
+
deps = [pkgs.jq] ++ deps;
+
script = ''
+
${pre}
+
jq -cn \
+
--arg text "${text}" \
+
--arg tooltip "${tooltip}" \
+
--arg alt "${alt}" \
+
--arg class "${class}" \
+
--arg percentage "${percentage}" \
+
'{text:$text,tooltip:$tooltip,alt:$alt,class:$class,percentage:$percentage}'
+
'';
+
};
+
+
hyprlandCfg = config.wayland.windowManager.hyprland;
+
in {
+
# Let it try to start a few more times
+
systemd.user.services.waybar = {
+
Unit.StartLimitBurst = 30;
+
};
+
programs.waybar = {
+
enable = true;
+
package = pkgs.waybar.overrideAttrs (oa: {
+
mesonFlags = (oa.mesonFlags or []) ++ ["-Dexperimental=true"];
+
});
+
systemd.enable = true;
+
settings = {
+
primary = {
+
exclusive = false;
+
passthrough = false;
+
height = 46;
+
margin = "6";
+
position = "top";
+
modules-left =
+
[
+
"custom/menu"
+
"custom/currentplayer"
+
"custom/player"
+
"hyprland/workspaces"
+
"hyprland/submap"
+
];
+
+
modules-center = [
+
"cpu"
+
"memory"
+
"disk"
+
"clock"
+
"pulseaudio"
+
"battery"
+
"idle_inhibitor"
+
# "custom/unread-mail"
+
];
+
+
modules-right = [
+
# "custom/gammastep" TODO: currently broken for some reason
+
"network"
+
"bluetooth"
+
"tray"
+
"privacy"
+
"custom/webcam"
+
"custom/hostname"
+
];
+
+
clock = {
+
interval = 1;
+
format = "{:%d/%m %H:%M:%S}";
+
format-alt = "{:%Y-%m-%d %H:%M:%S %z}";
+
on-click-left = "mode";
+
tooltip-format = ''
+
<big>{:%Y %B}</big>
+
<tt><small>{calendar}</small></tt>'';
+
};
+
+
cpu = {
+
format = " {usage}%";
+
};
+
+
memory = {
+
format = " {}%";
+
interval = 5;
+
};
+
+
disk = {
+
interval = 5;
+
unit = "GB";
+
format = "󰋊 {percentage_used}%";
+
};
+
+
pulseaudio = {
+
format = "{icon} {volume}%";
+
format-muted = " 0%";
+
format-icons = {
+
headphone = "󰋋 ";
+
headset = "󰋎 ";
+
portable = " ";
+
default = [
+
" "
+
" "
+
" "
+
];
+
};
+
on-click = lib.getExe pkgs.pavucontrol;
+
};
+
+
idle_inhibitor = {
+
format = "{icon}";
+
format-icons = {
+
activated = "󰅶 ";
+
deactivated = "󰾫 ";
+
};
+
tooltip-format-activated =
+
"Caffinated! device will not sleep.";
+
tooltip-format-deactivated =
+
"no caffeine :( device will sleep when not in use.";
+
};
+
+
battery = {
+
interval = 5;
+
bat = "BAT1";
+
# full-at = 94;
+
format = "{icon} {capacity}%";
+
format-icons = [ "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹" ];
+
states = {
+
battery-10 = 10;
+
battery-20 = 20;
+
battery-30 = 30;
+
battery-40 = 40;
+
battery-50 = 50;
+
battery-60 = 60;
+
battery-70 = 70;
+
battery-80 = 80;
+
battery-90 = 90;
+
battery-100 = 100;
+
};
+
# <https://github.com/Alexays/Waybar/issues/1938>
+
# the wiki lies about this, does not match
+
# /sys/class/power_supply/BAT0/status
+
format-plugged = "󰚥 AC";
+
format-charging-battery-10 = "󰢜 {capacity}%";
+
format-charging-battery-20 = "󰂆 {capacity}%";
+
format-charging-battery-30 = "󰂇 {capacity}%";
+
format-charging-battery-40 = "󰂈 {capacity}%";
+
format-charging-battery-50 = "󰢝 {capacity}%";
+
format-charging-battery-60 = "󰂉 {capacity}%";
+
format-charging-battery-70 = "󰢞 {capacity}%";
+
format-charging-battery-80 = "󰂊 {capacity}%";
+
format-charging-battery-90 = "󰂋 {capacity}%";
+
format-charging-battery-100 = "󰂅 {capacity}%";
+
};
+
+
"hyprland/workspaces" = {
+
format = "{icon} {windows}";
+
window-rewrite-default = " ";
+
window-rewrite-seperator = "";
+
window-rewrite = {
+
"title<.*github.*>" = "󰊤";
+
"title<.*youtube.*>" = "";
+
"title<*Gmail*>" = "󰊫";
+
"class<firefox>" = "";
+
"class<com.obsproject.Studio>" = "";
+
"title<OBS*>" = "";
+
"alacritty" = "";
+
"code" = "󰨞";
+
"slack" = "󰒱";
+
"initialtitle<Spotify*>" = "󰓇";
+
"class<org.gnome.Nautilus>" = "󰉓";
+
"class<kicad>" = "";
+
};
+
};
+
+
network = {
+
interval = 3;
+
format-wifi = "{icon} {essid}";
+
format-icons = [ "󰤟" "󰤢" "󰤥" "󰤨" ];
+
format-ethernet = "󰈁 Connected";
+
format-disconnected = "󱐤 ";
+
tooltip-format = ''
+
{ifname}
+
{ipaddr}/{cidr}
+
Up: {bandwidthUpBits}
+
Down: {bandwidthDownBits}'';
+
on-click = mkScript {
+
deps = [pkgs.wpa_supplicant pkgs.notify-desktop];
+
script = ''wpa_cli reconnect; notify-desktop "reconnecting to wifi" -t 1200'';
+
};
+
};
+
+
bluetooth = {
+
format-on = "󰂯";
+
format-off = "󰂲";
+
format-disabled = "󰂲";
+
format-connected = "󰂱 {num_connections}";
+
format-connected-battery = "󰂱 {device_alias} ({device_battery_percentage}%) ({num_connections})";
+
on-click = "overskride";
+
};
+
+
"custom/menu" = {
+
interval = 1;
+
return-type = "json";
+
exec = mkScriptJson {
+
deps = lib.optional hyprlandCfg.enable hyprlandCfg.package;
+
text = " ";
+
tooltip = ''$(grep PRETTY_NAME /etc/os-release | cut -d '"' -f2)'';
+
class = let
+
isFullScreen =
+
if hyprlandCfg.enable
+
then "hyprctl activewindow -j | jq -e '.fullscreen' &>/dev/null"
+
else "false";
+
in "$(if ${isFullScreen}; then echo fullscreen; fi)";
+
};
+
};
+
+
"custom/hostname" = {
+
exec = mkScript {script = ''echo "$USER@$HOSTNAME"'';};
+
on-click = mkScript {script = "systemctl --user restart waybar";};
+
};
+
+
"custom/unread-mail" = {
+
interval = 5;
+
return-type = "json";
+
exec = mkScriptJson {
+
deps = [pkgs.findutils pkgs.procps];
+
pre = ''
+
count=$(find ~/Mail/*/Inbox/new -type f | wc -l)
+
if pgrep mbsync &>/dev/null; then
+
status="syncing"
+
else
+
if [ "$count" == "0" ]; then
+
status="read"
+
else
+
status="unread"
+
fi
+
fi
+
'';
+
text = "$count";
+
alt = "$status";
+
};
+
format = "{icon} ({})";
+
format-icons = {
+
"read" = "󰇯";
+
"unread" = "󰇮";
+
"syncing" = "󰁪";
+
};
+
};
+
+
"custom/currentplayer" = {
+
interval = 2;
+
return-type = "json";
+
exec = mkScriptJson {
+
deps = [pkgs.playerctl];
+
pre = ''
+
player="$(playerctl status -f "{{playerName}}" 2>/dev/null || echo "No player active" | cut -d '.' -f1)"
+
count="$(playerctl -l 2>/dev/null | wc -l)"
+
if ((count > 1)); then
+
more=" +$((count - 1))"
+
else
+
more=""
+
fi
+
'';
+
alt = "$player";
+
tooltip = "$player ($count available)";
+
text = "$more";
+
};
+
format = "{icon}{}";
+
format-icons = {
+
"No player active" = " ";
+
"Celluloid" = "󰎁 ";
+
"spotify" = "󰓇 ";
+
"ncspot" = "󰓇 ";
+
"qutebrowser" = "󰖟 ";
+
"firefox" = " ";
+
"discord" = " 󰙯 ";
+
"sublimemusic" = " ";
+
"kdeconnect" = "󰄡 ";
+
"chromium" = " ";
+
};
+
};
+
+
privacy = {
+
"icon-spacing" = 0;
+
"icon-size" = 18;
+
"transition-duration" = 250;
+
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;
+
}
+
];
+
};
+
+
"custom/webcam" = {
+
return-type = "json";
+
interval = 2;
+
exec = mkScript {
+
deps = [pkgs.jq pkgs.psmisc];
+
script = ''
+
# get programs using the video0 endpoint
+
ps -eo user,pid,cmd -q "$(fuser /dev/video0 2>/dev/null | xargs)" |\
+
# omit the column headings and the first line which is wireplumber
+
sed -n "1,2!p" |\
+
# just get the pid and program columns
+
awk '{print $2 " " $3}' |\
+
# filter out the program path
+
awk -F "/" '{print "{\"tooltip\": \"" $1 " " $NF "\"}"}' |\
+
jq -s 'if length > 0 then {text: "󰄀 ", tooltip: (map(.tooltip) | join("\r"))} else {text: "", tooltip: ""} end' |\
+
jq --unbuffered --compact-output
+
'';
+
};
+
};
+
+
"custom/player" = {
+
exec-if = mkScript {
+
deps = [pkgs.playerctl];
+
script = "playerctl status 2>/dev/null";
+
};
+
exec = let
+
format = ''{"text": "{{title}} - {{artist}}", "alt": "{{status}}", "tooltip": "{{title}} - {{artist}} ({{album}})"}'';
+
in
+
mkScript {
+
deps = [pkgs.playerctl];
+
script = "playerctl metadata --format '${format}' 2>/dev/null";
+
};
+
return-type = "json";
+
interval = 2;
+
max-length = 30;
+
format = "{icon} {}";
+
format-icons = {
+
"Playing" = "󰐊";
+
"Paused" = "󰏤 ";
+
"Stopped" = "󰓛";
+
};
+
on-click = mkScript {
+
deps = [pkgs.playerctl];
+
script = "playerctl play-pause";
+
};
+
};
+
};
+
};
+
# Cheatsheet:
+
# x -> all sides
+
# x y -> vertical, horizontal
+
# x y z -> top, horizontal, bottom
+
# w x y z -> top, right, bottom, left
+
style = let
+
inherit (inputs.nix-colors.lib.conversions) hexToRGBString;
+
inherit (config.colorscheme) colors;
+
toRGBA = color: opacity: "rgba(${hexToRGBString "," (lib.removePrefix "#" color)},${opacity})";
+
in
+
/*
+
css
+
*/
+
''
+
* {
+
font-family: Fira Sans, FiraCode Nerd Font;
+
font-size: 12pt;
+
padding: 0;
+
margin: 0 0.4em;
+
}
+
+
window#waybar {
+
padding: 0;
+
border-radius: 0.5em;
+
background-color: shade(@surface0, 0.7);
+
color: @surface2
+
}
+
.modules-left {
+
margin-left: -0.65em;
+
}
+
.modules-right {
+
margin-right: -0.65em;
+
}
+
+
#workspaces button {
+
background-color: @surface0;
+
color: @surface2;
+
padding-left: 0.2em;
+
padding-right: 0.2em;
+
margin-left: 0.25em;
+
margin-right: 0.25em;
+
margin-top: 0.4em;
+
margin-bottom: 0.4em;
+
}
+
#workspaces button.hidden {
+
background-color: @surface0;
+
color: @surface2;
+
}
+
#workspaces button.focused,
+
#workspaces button.active {
+
background-color: shade(@blue, 0.7);
+
color: @green;
+
}
+
+
#workspaces button:hover {
+
background-color: @surface3;
+
color: @surface1;
+
}
+
+
#privacy-item {
+
margin-left: 0.1em;
+
margin-right: 0.1em;
+
}
+
+
#clock {
+
padding-right: 1em;
+
padding-left: 1em;
+
border-radius: 0.5em;
+
}
+
+
#custom-menu {
+
background-color: @surface3;
+
color: @blue;
+
padding-right: 1.5em;
+
padding-left: 1em;
+
margin-right: 0;
+
border-radius: 0.5em;
+
}
+
#custom-menu.fullscreen {
+
background-color: @blue;
+
color: @green;
+
}
+
#custom-hostname {
+
background-color: @surface3;
+
color: @blue;
+
padding-right: 1em;
+
padding-left: 1em;
+
margin-left: 0;
+
border-radius: 0.5em;
+
}
+
#custom-currentplayer {
+
padding-right: 0;
+
}
+
#custom-gpu, #cpu, #memory {
+
margin-left: 0.05em;
+
margin-right: 0.55em;
+
}
+
'';
+
};
+
}
-140
install.sh
···
-
#!/usr/bin/env bash
-
-
# NixOS Installation Script
-
# This script automates the post-network setup installation process
-
-
set -e # Exit on any error
-
-
echo "==== NixOS Installation Automation ===="
-
echo "This script will automate the installation process after network setup."
-
echo "Make sure you have already set up network connectivity before running this script."
-
-
# Verify network connectivity
-
echo -n "Checking network connectivity... "
-
if ping -c 1 1.1.1.1 &> /dev/null; then
-
echo "Success!"
-
else
-
echo "Failed!"
-
echo "Error: No internet connection detected. Please set up your network first."
-
echo "You can use the following commands to connect to WiFi:"
-
echo " sudo systemctl start wpa_supplicant"
-
echo " wpa_cli"
-
echo " > add_network 0"
-
echo " > set_network 0 ssid \"your SSID\""
-
echo " > set_network 0 psk \"your password\""
-
echo " > enable network 0"
-
echo " > exit"
-
exit 1
-
fi
-
-
# Get sudo privileges and maintain them
-
echo "Acquiring root permissions..."
-
sudo -v
-
# Keep sudo privileges active
-
while true; do sudo -v; sleep 60; done &
-
KEEP_SUDO_PID=$!
-
-
# Function to clean up the background sudo process on exit
-
cleanup() {
-
kill $KEEP_SUDO_PID 2>/dev/null
-
}
-
trap cleanup EXIT
-
-
# Check if git is already enabled in the configuration
-
echo "Checking git configuration..."
-
if grep -q "programs.git.enable = true" /etc/nixos/configuration.nix; then
-
echo "Git is already enabled in configuration.nix"
-
else
-
echo "Enabling git..."
-
sudo sed -i 's/^{$/{\n programs.git.enable = true;/' /etc/nixos/configuration.nix
-
sudo nixos-rebuild switch
-
fi
-
-
# Download and run the disk configuration
-
echo "Downloading and running disk configuration..."
-
curl -L https://github.com/taciturnaxolotl/dots/raw/main/moonlark/disk-config.nix -o /tmp/disk-config.nix
-
sudo nix --experimental-features "nix-command flakes" run github:nix-community/disko -- --mode destroy,format,mount /tmp/disk-config.nix
-
-
# Generate NixOS configuration
-
echo "Generating NixOS configuration..."
-
sudo nixos-generate-config --root /mnt
-
cd /mnt/etc/nixos
-
-
# Check if repository already exists
-
echo "Setting up configuration..."
-
if [ -d ".git" ]; then
-
echo "Configuration already exists, pulling latest changes..."
-
sudo git pull
-
else
-
# Clone the repository to the NixOS configuration directory
-
echo "Cloning nixos repository..."
-
sudo rm -f *
-
sudo git clone https://github.com/taciturnaxolotl/dots.git .
-
fi
-
-
# Prompt user for SSH key setup
-
echo ""
-
echo "SSH Key Setup"
-
read -p "Do you want to add an SSH private key? (y/n): " add_ssh_key
-
if [[ "$add_ssh_key" =~ ^[Yy]$ ]]; then
-
echo "How would you like to add your SSH key?"
-
echo "1) From a local file"
-
echo "2) From a URL"
-
read -p "Enter your choice (1/2): " ssh_key_method
-
-
sudo mkdir -p /mnt/etc/ssh/
-
-
if [[ "$ssh_key_method" == "1" ]]; then
-
echo "Please enter the path to your SSH private key:"
-
read ssh_key_path
-
-
if [ -f "$ssh_key_path" ]; then
-
sudo cp "$ssh_key_path" /mnt/etc/ssh/id_rsa
-
sudo chmod 600 /mnt/etc/ssh/id_rsa
-
echo "SSH key added from local file!"
-
else
-
echo "Warning: SSH key file not found. Proceeding without SSH key."
-
fi
-
elif [[ "$ssh_key_method" == "2" ]]; then
-
echo "Please enter the URL to download your SSH private key:"
-
read ssh_key_url
-
-
echo "Downloading SSH key from URL..."
-
if curl -s "$ssh_key_url" -o /tmp/downloaded_ssh_key; then
-
sudo mv /tmp/downloaded_ssh_key /mnt/etc/ssh/id_rsa
-
sudo chmod 600 /mnt/etc/ssh/id_rsa
-
echo "SSH key successfully downloaded and added!"
-
else
-
echo "Warning: Failed to download SSH key from URL. Proceeding without SSH key."
-
fi
-
else
-
echo "Invalid choice. Proceeding without SSH key."
-
fi
-
else
-
echo "Proceeding without SSH key."
-
fi
-
-
# Prompt for hostname configuration
-
echo ""
-
echo "Hostname Configuration"
-
echo "Available configurations in this repo:"
-
echo "1) moonlark (default)"
-
read -p "Which configuration would you like to use? (Press Enter for moonlark): " hostname_choice
-
hostname=${hostname_choice:-moonlark}
-
-
# Install the flake
-
echo "Installing the flake for configuration: $hostname"
-
sudo nixos-install --flake .#${hostname} --no-root-passwd
-
-
echo "Installation complete! The system will now reboot."
-
echo ""
-
echo "After reboot, you'll need to complete these post-installation tasks:"
-
echo "1. Change your password"
-
echo "2. Move config to local directory: sudo mv /etc/nixos ~/dots"
-
echo "3. Link to /etc/nixos: sudo ln -s ~/dots /etc"
-
echo "4. Change permissions: sudo chown -R \$(id -un):users ~/dots"
-
echo "5. Setup fingerprint reader (optional): sudo fprintd-enroll -f right-index-finger \$(whoami)"
-
-
read -p "Press Enter to unmount and reboot..."
-
sudo umount -R /mnt
-
sudo reboot
-228
machines/atalanta/default.nix
···
-
{
-
inputs,
-
pkgs,
-
...
-
}:
-
{
-
imports = [
-
./home-manager.nix
-
];
-
-
# Set host platform for Apple Silicon
-
nixpkgs = {
-
hostPlatform = "aarch64-darwin";
-
config = {
-
allowUnfree = true;
-
};
-
};
-
-
# Enable nix-darwin
-
nix.settings.experimental-features = [
-
"nix-command"
-
"flakes"
-
];
-
-
# switch to lix
-
nix.package = pkgs.lixPackageSets.stable.lix;
-
-
# Set hostname
-
networking.hostName = "atalanta";
-
-
# Define user
-
users.users.kierank = {
-
name = "kierank";
-
home = "/Users/kierank";
-
};
-
-
system.primaryUser = "kierank";
-
-
ids.gids.nixbld = 350;
-
-
# Install packages
-
environment.systemPackages = [
-
# nix stuff
-
pkgs.nixd
-
pkgs.nil
-
pkgs.nixfmt-rfc-style
-
inputs.agenix.packages.aarch64-darwin.default
-
# dev_langs
-
pkgs.nodejs_22
-
pkgs.unstable.bun
-
pkgs.python3
-
pkgs.go
-
pkgs.gopls
-
pkgs.gotools
-
pkgs.go-tools
-
pkgs.gcc
-
pkgs.rustc
-
pkgs.cargo
-
pkgs.jdk
-
pkgs.ruby
-
pkgs.cmake
-
pkgs.unstable.biome
-
pkgs.unstable.apktool
-
pkgs.nodePackages_latest.prisma
-
pkgs.unstable.zola
-
pkgs.mill
-
pkgs.clang
-
pkgs.clang-tools
-
pkgs.ninja
-
# tools
-
pkgs.calc
-
pkgs.nh
-
pkgs.rustscan
-
pkgs.vhs
-
inputs.soapdump.packages.${pkgs.stdenv.hostPlatform.system}.default
-
];
-
-
programs.direnv.enable = true;
-
-
# import the secret
-
age.identityPaths = [
-
"/Users/kierank/.ssh/id_rsa"
-
];
-
age.secrets = {
-
wakatime = {
-
file = ../../secrets/wakatime.age;
-
path = "/Users/kierank/.wakatime.cfg";
-
owner = "kierank";
-
};
-
bluesky = {
-
file = ../../secrets/bluesky.age;
-
owner = "kierank";
-
};
-
crush = {
-
file = ../../secrets/crush.age;
-
owner = "kierank";
-
};
-
context7 = {
-
file = ../../secrets/context7.age;
-
owner = "kierank";
-
};
-
frp-auth-token = {
-
file = ../../secrets/frp-auth-token.age;
-
owner = "kierank";
-
};
-
};
-
-
environment.variables = {
-
EDITOR = "nvim";
-
SYSTEMD_EDITOR = "nvim";
-
VISUAL = "nvim";
-
};
-
-
# nothing but finder in the doc
-
system.defaults.dock = {
-
persistent-apps = [ ];
-
-
tilesize = 47;
-
show-recents = false;
-
};
-
-
# allow using apple watch or touch id for sudo
-
security.pam.services.sudo_local.touchIdAuth = true;
-
security.pam.services.sudo_local.watchIdAuth = true;
-
-
system.defaults = {
-
finder.FXPreferredViewStyle = "Nlsv";
-
finder.AppleShowAllExtensions = true;
-
# expand the save dialogs
-
NSGlobalDomain.NSNavPanelExpandedStateForSaveMode = true;
-
NSGlobalDomain.NSNavPanelExpandedStateForSaveMode2 = true;
-
LaunchServices.LSQuarantine = false; # disables "Are you sure?" for new apps
-
loginwindow.GuestEnabled = false;
-
-
NSGlobalDomain."com.apple.trackpad.scaling" = 0.875;
-
-
CustomSystemPreferences = {
-
"com.apple.DiskArbitration.diskarbitrationd" = {
-
DADisableEjectNotification = true;
-
};
-
};
-
-
CustomUserPreferences = {
-
"com.apple.driver.AppleBluetoothMultitouch.mouse" = {
-
MouseButtonMode = "TwoButton";
-
};
-
"com.apple.WindowManager" = {
-
EnableTiledWindowMargins = false;
-
};
-
"com.apple.desktopservices" = {
-
# Avoid creating .DS_Store files on network or USB volumes
-
DSDontWriteNetworkStores = true;
-
DSDontWriteUSBStores = true;
-
};
-
"com.apple.AdLib" = {
-
allowApplePersonalizedAdvertising = false;
-
};
-
"com.apple.SoftwareUpdate" = {
-
AutomaticCheckEnabled = true;
-
# Check for software updates daily, not just once per week
-
ScheduleFrequency = 1;
-
# Download newly available updates in background
-
AutomaticDownload = 1;
-
# Install System data files & security updates
-
CriticalUpdateInstall = 1;
-
};
-
# keybindings
-
# Script to export symbolic hotkey configs from MacOS
-
# https://gist.github.com/sawadashota/8e7ce32234e0f07a03e955f22ec4c0f9
-
# Screenshot selected area to file with Cmd+Option+Shift+4
-
"com.apple.symbolichotkeys" = {
-
AppleSymbolicHotKeys = {
-
# Screenshot selected area with Option+Cmd+Shift+4
-
"30" = {
-
enabled = true;
-
value = {
-
parameters = [
-
52
-
21
-
1703936
-
];
-
type = "standard";
-
};
-
};
-
# Screenshot selected area to clipboard with Cmd+Shift+4
-
"31" = {
-
enabled = true;
-
value = {
-
parameters = [
-
52
-
21
-
1179648
-
];
-
type = "standard";
-
};
-
};
-
# Fullscreen screenshot Option+Cmd+Shift+3
-
"28" = {
-
enabled = true;
-
value = {
-
parameters = [
-
51
-
20
-
1703936
-
];
-
type = "standard";
-
};
-
};
-
# Fullscreen screenshot to clipboard Cmd+Shift+3
-
"29" = {
-
enabled = true;
-
value = {
-
parameters = [
-
51
-
20
-
1179648
-
];
-
type = "standard";
-
};
-
};
-
};
-
};
-
};
-
};
-
-
# Used for backwards compatibility, please read the changelog before changing
-
system.stateVersion = 4;
-
}
-183
machines/atalanta/home/default.nix
···
-
{
-
inputs,
-
pkgs,
-
osConfig,
-
...
-
}:
-
{
-
imports = [
-
(inputs.import-tree ../../../modules/home)
-
];
-
-
home = {
-
username = "kierank";
-
homeDirectory = "/Users/kierank";
-
packages = with pkgs; [
-
inputs.nixvim.packages.${pkgs.stdenv.hostPlatform.system}.default
-
vesktop
-
];
-
};
-
-
atelier = {
-
shell = {
-
enable = true;
-
};
-
terminal = {
-
ghostty = {
-
enable = true;
-
windowDecoration = true;
-
};
-
};
-
apps = {
-
halloy.enable = true;
-
crush.enable = true;
-
helix = {
-
enable = true;
-
swift = true;
-
};
-
};
-
bore = {
-
enable = true;
-
authTokenFile = osConfig.age.secrets.frp-auth-token.path;
-
};
-
ssh = {
-
enable = true;
-
-
zmx = {
-
enable = true;
-
hosts = [ "t.*" "p.*" "e.*" "j.*" ];
-
};
-
-
hosts = {
-
# Dynamic zmx sessions per server
-
"t.*" = {
-
hostname = "150.136.15.177"; # terebithia
-
};
-
-
"p.*" = {
-
hostname = "150.136.63.103"; # prattle
-
};
-
-
"e.*" = {
-
hostname = "192.168.0.94"; # ember
-
};
-
-
"j.*" = {
-
hostname = "john.cedarville.edu";
-
user = "klukas";
-
};
-
-
# Regular hosts
-
john = {
-
hostname = "john.cedarville.edu";
-
user = "klukas";
-
zmx = true;
-
};
-
-
bandit = {
-
hostname = "bandit.labs.overthewire.org";
-
port = 2220;
-
};
-
-
kali = {
-
user = "kali";
-
};
-
-
terebithia = {
-
hostname = "150.136.15.177";
-
zmx = true;
-
};
-
-
prattle = {
-
hostname = "150.136.63.103";
-
zmx = true;
-
};
-
-
ember = {
-
hostname = "192.168.0.94";
-
zmx = true;
-
};
-
-
remarkable = {
-
hostname = "10.11.99.01";
-
user = "root";
-
};
-
};
-
-
extraConfig = ''
-
IdentityFile ~/.ssh/id_rsa
-
'';
-
};
-
};
-
-
programs.zsh.initContent = ''
-
eval "$(/usr/libexec/path_helper)"
-
export PATH="$HOME/.cargo/bin:$PATH"
-
-
# MITM proxy management functions
-
MITM_SERVICE="Wi-Fi" # Change to "Ethernet" if needed
-
MITM_CERT="$HOME/.mitmproxy/mitmproxy-ca-cert.pem"
-
-
mitmup() {
-
# Generate mitmproxy CA certificate if it doesn't exist
-
if [ ! -f "$MITM_CERT" ]; then
-
echo "Generating mitmproxy CA certificate..."
-
(timeout 0.1 mitmproxy --set confdir="$HOME/.mitmproxy" 2>/dev/null; true)
-
fi
-
-
networksetup -setwebproxy "$MITM_SERVICE" localhost 8080 &&
-
networksetup -setsecurewebproxy "$MITM_SERVICE" localhost 8080 &&
-
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain "$MITM_CERT" &&
-
echo "mitmproxy enabled and cert added"
-
}
-
-
mitmdown() {
-
networksetup -setwebproxystate "$MITM_SERVICE" off &&
-
networksetup -setsecurewebproxystate "$MITM_SERVICE" off &&
-
sudo security delete-certificate -c mitmproxy /Library/Keychains/System.keychain &&
-
echo "mitmproxy disabled and cert removed"
-
}
-
-
mitmstatus() {
-
GREEN='\033[0;32m'
-
RED='\033[0;31m'
-
NC='\033[0m' # No Color
-
-
echo "========== Proxy Status =========="
-
for proto in webproxy securewebproxy; do
-
proxy_status=$(networksetup -get''${proto} "$MITM_SERVICE")
-
enabled=$(echo "$proxy_status" | grep "Enabled: Yes")
-
PROTO_UPPER=$(echo "$proto" | tr '[:lower:]' '[:upper:]')
-
if [ -n "$enabled" ]; then
-
echo -e "''${PROTO_UPPER} : ''${GREEN}ENABLED''${NC}"
-
else
-
echo -e "''${PROTO_UPPER} : ''${RED}DISABLED''${NC}"
-
fi
-
echo "$proxy_status" | grep -E "Server:|Port:"
-
done
-
-
echo "========== mitmproxy Certificate =========="
-
if security find-certificate -c mitmproxy /Library/Keychains/System.keychain > /dev/null 2>&1; then
-
echo -e "mitmproxy certificate: ''${GREEN}PRESENT''${NC}"
-
else
-
echo -e "mitmproxy certificate: ''${RED}NOT PRESENT''${NC}"
-
fi
-
-
echo "========== mitmproxy Process =========="
-
if pgrep -f mitmproxy > /dev/null; then
-
echo -e "mitmproxy process: ''${GREEN}RUNNING''${NC}"
-
else
-
echo -e "mitmproxy process: ''${RED}NOT RUNNING''${NC}"
-
fi
-
echo "==========================================="
-
}
-
-
-
'';
-
-
# Let Home Manager install and manage itself
-
programs.home-manager.enable = true;
-
-
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
-
home.stateVersion = "23.05";
-
}
-22
machines/atalanta/home-manager.nix
···
-
{
-
inputs,
-
outputs,
-
...
-
}:
-
{
-
imports = [
-
# Import home-manager's Darwin module
-
inputs.home-manager.darwinModules.home-manager
-
];
-
-
home-manager = {
-
useGlobalPkgs = true;
-
extraSpecialArgs = {
-
inherit inputs outputs;
-
};
-
users = {
-
# Import your home-manager configuration
-
kierank = import ./home;
-
};
-
};
-
}
-49
machines/ember/default.nix
···
-
{
-
inputs,
-
pkgs,
-
...
-
}:
-
{
-
imports = [
-
(inputs.import-tree ../../modules/home)
-
../../modules/home/system/nixpkgs.nix.disabled
-
];
-
-
nixpkgs.enable = true;
-
-
home = {
-
username = "kierank";
-
homeDirectory = "/home/kierank";
-
-
packages = with pkgs; [
-
# apps
-
iodine
-
mosh
-
browsh
-
firefox
-
-
# langs
-
go
-
];
-
};
-
-
atelier = {
-
shell.enable = true;
-
apps = {
-
helix.enable = true;
-
};
-
ssh = {
-
enable = true;
-
zmx.enable = true;
-
};
-
};
-
-
# Enable home-manager
-
programs.home-manager.enable = true;
-
-
# Nicely reload system units when changing configs
-
systemd.user.startServices = "sd-switch";
-
-
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
-
home.stateVersion = "23.05";
-
}
-469
machines/moonlark/default.nix
···
-
# This is your system's configuration file.
-
# Use this to configure your system environment (it replaces /etc/nixos/configuration.nix)
-
{
-
inputs,
-
lib,
-
config,
-
pkgs,
-
...
-
}:
-
{
-
imports = [
-
inputs.hardware.nixosModules.framework-11th-gen-intel
-
-
./hardware-configuration.nix
-
./home-manager.nix
-
./disk-config.nix
-
-
(inputs.import-tree ../../modules/nixos)
-
];
-
-
nixpkgs = {
-
config = {
-
allowUnfree = true;
-
};
-
};
-
-
nix =
-
let
-
flakeInputs = lib.filterAttrs (_: lib.isType "flake") inputs;
-
in
-
{
-
settings = {
-
# Enable flakes and new 'nix' command
-
experimental-features = "nix-command flakes";
-
# Opinionated: disable global registry
-
flake-registry = "";
-
# Workaround for https://github.com/NixOS/nix/issues/9574
-
nix-path = config.nix.nixPath;
-
trusted-users = [
-
"kierank"
-
];
-
};
-
# Opinionated: disable channels
-
channel.enable = false;
-
-
optimise.automatic = true;
-
-
# Opinionated: make flake registry and nix path match flake inputs
-
registry = lib.mapAttrs (_: flake: { inherit flake; }) flakeInputs;
-
nixPath = lib.mapAttrsToList (n: _: "${n}=flake:${n}") flakeInputs;
-
};
-
-
time.timeZone = "America/New_York";
-
-
# grouped for readability
-
environment.systemPackages = [
-
# core
-
pkgs.coreutils
-
pkgs.calc
-
pkgs.screen
-
pkgs.xdg-user-dirs
-
pkgs.libnotify
-
pkgs.notify-desktop
-
pkgs.bc
-
pkgs.jq
-
pkgs.psmisc
-
# terminals
-
pkgs.alacritty
-
pkgs.unstable.ghostty
-
# cli_utils
-
pkgs.glow
-
pkgs.clipse
-
pkgs.direnv
-
pkgs.nix-output-monitor
-
pkgs.nixpkgs-review
-
pkgs.nix-prefetch
-
pkgs.arduino-cli
-
pkgs.zsh
-
pkgs.gum
-
# networking
-
pkgs.xh
-
pkgs.curl
-
pkgs.wget
-
pkgs.dogdns
-
pkgs.inetutils
-
pkgs.mosh
-
pkgs.ngrok
-
pkgs.networkmanagerapplet
-
pkgs.networkmanager-iodine
-
pkgs.iodine
-
# nix_tools
-
inputs.nixvim.packages.x86_64-linux.default
-
pkgs.nixd
-
pkgs.nil
-
pkgs.nixfmt-rfc-style
-
inputs.agenix.packages.x86_64-linux.default
-
pkgs.lix
-
# security
-
pkgs.openssl
-
pkgs.gpgme
-
pkgs.gnupg
-
pkgs.unstable.mitmproxy
-
pkgs.caido
-
# editors
-
pkgs.unstable.zed-editor
-
pkgs.arduino-ide
-
# browsers
-
pkgs.firefox
-
(pkgs.chromium.override { enableWideVine = true; })
-
# wayland
-
pkgs.swww
-
pkgs.wluma
-
pkgs.brightnessctl
-
pkgs.hyprpaper
-
pkgs.hyprsunset
-
pkgs.wl-clipboard
-
pkgs.grim
-
pkgs.slurp
-
pkgs.wtype
-
pkgs.mako
-
pkgs.unstable.hyprpicker
-
pkgs.wl-screenrec
-
inputs.hyprland-contrib.packages.${pkgs.stdenv.hostPlatform.system}.grimblast
-
pkgs.playerctl
-
pkgs.libnotify
-
pkgs.notify-desktop
-
pkgs.lxde.lxsession
-
# gnome
-
pkgs.gnome-online-accounts
-
pkgs.gnome-online-accounts-gtk
-
pkgs.gnome-disk-utility
-
pkgs.baobab
-
pkgs.simple-scan
-
pkgs.file-roller
-
pkgs.font-manager
-
pkgs.nautilus
-
pkgs.loupe
-
pkgs.totem
-
pkgs.overskride
-
# dev_langs
-
pkgs.nodejs_22
-
pkgs.unstable.bun
-
pkgs.python3
-
pkgs.go
-
pkgs.gopls
-
pkgs.gotools
-
pkgs.go-tools
-
pkgs.gcc
-
pkgs.rustc
-
pkgs.cargo
-
pkgs.jdk
-
pkgs.ruby
-
pkgs.cmake
-
pkgs.unstable.biome
-
pkgs.unstable.apktool
-
pkgs.nodePackages_latest.prisma
-
pkgs.unstable.zola
-
pkgs.mill
-
pkgs.clang
-
pkgs.clang-tools
-
pkgs.ninja
-
# media
-
pkgs.ffmpeg
-
pkgs.video-trimmer
-
pkgs.pitivi
-
pkgs.audacity
-
pkgs.unstable.amberol
-
pkgs.zoom-us
-
# graphics
-
pkgs.imagemagick
-
pkgs.inkscape
-
pkgs.blender
-
pkgs.exiftool
-
pkgs.unstable.aseprite
-
pkgs.godot_4
-
pkgs.unstable.kikit
-
pkgs.openboardview
-
pkgs.qflipper
-
# office
-
pkgs.slack
-
pkgs.libreoffice
-
pkgs.unstable.zotero
-
# gaming
-
pkgs.prismlauncher
-
pkgs.vesktop
-
pkgs.cava
-
pkgs.gobang
-
pkgs.love
-
#frc
-
inputs.frc-nix.packages.${pkgs.stdenv.hostPlatform.system}.elastic-dashboard
-
inputs.frc-nix.packages.${pkgs.stdenv.hostPlatform.system}.pathplanner
-
inputs.frc-nix.packages.${pkgs.stdenv.hostPlatform.system}.roborioteamnumbersetter
-
inputs.frc-nix.packages.${pkgs.stdenv.hostPlatform.system}.sysid
-
inputs.frc-nix.packages.${pkgs.stdenv.hostPlatform.system}.wpilib-utility
-
inputs.frc-nix.packages.${pkgs.stdenv.hostPlatform.system}.advantagescope
-
# misc
-
pkgs.invoice
-
pkgs.pop
-
pkgs.vhs
-
pkgs.torrential
-
inputs.flare.packages.x86_64-linux.default
-
pkgs.unstable.ollama
-
pkgs.unstable.claude-code
-
pkgs.udiskie
-
pkgs.neofetch
-
pkgs.unstable.kicad-testing
-
pkgs.zenity
-
pkgs.atproto-goat
-
inputs.cedarlogic.packages.${pkgs.stdenv.hostPlatform.system}.cedarlogic
-
pkgs.unstable.betaflight-configurator
-
];
-
-
programs.nh = {
-
enable = true;
-
clean.enable = true;
-
clean.extraArgs = "--keep-since 4d --keep 3";
-
flake = "/home/kierank/dots";
-
};
-
-
fonts.packages =
-
with pkgs;
-
[
-
fira
-
comic-neue
-
]
-
++ builtins.filter lib.attrsets.isDerivation (builtins.attrValues pkgs.nerd-fonts);
-
-
# import the secret
-
age.identityPaths = [
-
"/home/kierank/.ssh/id_rsa"
-
"/etc/ssh/id_rsa"
-
"/mnt/etc/ssh/id_rsa"
-
];
-
age.secrets = {
-
wifi = {
-
file = ../../secrets/wifi.age;
-
owner = "kierank";
-
};
-
resend = {
-
file = ../../secrets/resend.age;
-
owner = "kierank";
-
};
-
wakatime = {
-
file = ../../secrets/wakatime.age;
-
path = "/home/kierank/.wakatime.cfg";
-
owner = "kierank";
-
};
-
bluesky = {
-
file = ../../secrets/bluesky.age;
-
owner = "kierank";
-
};
-
iodine = {
-
file = ../../secrets/iodine.age;
-
owner = "kierank";
-
};
-
};
-
-
environment.sessionVariables = {
-
XDG_CACHE_HOME = "$HOME/.cache";
-
XDG_CONFIG_HOME = "$HOME/.config";
-
XDG_DATA_HOME = "$HOME/.local/share";
-
XDG_STATE_HOME = "$HOME/.local/state";
-
NIXOS_OZONE_WL = "1";
-
PRISMA_QUERY_ENGINE_LIBRARY = "${pkgs.prisma-engines}/lib/libquery_engine.node";
-
PRISMA_QUERY_ENGINE_BINARY = "${pkgs.prisma-engines}/bin/query-engine";
-
PRISMA_SCHEMA_ENGINE_BINARY = "${pkgs.prisma-engines}/bin/schema-engine";
-
RESEND_API_KEY = "$(${pkgs.coreutils}/bin/cat ${config.age.secrets.resend.path})";
-
POP_FROM = "me@dunkirk.sh";
-
EDITOR = "nvim";
-
SYSTEMD_EDITOR = "nvim";
-
VISUAL = "nvim";
-
};
-
-
atelier = {
-
authentication.enable = true;
-
apps.tuigreet = {
-
enable = true;
-
command = "Hyprland";
-
};
-
network.wifi = {
-
enable = true;
-
hostName = "moonlark";
-
nameservers = [
-
"1.1.1.1"
-
"1.0.0.1"
-
"8.8.8.8"
-
"9.9.9.9"
-
];
-
envFile = config.age.secrets.wifi.path;
-
profiles = {
-
"KlukasNet".pskVar = "psk_home";
-
"Everseen".pskVar = "psk_hotspot";
-
"SAAC Sanctuary".pskVar = "psk_church";
-
"MVNU-student" = { };
-
"Status Solutions Guest".pskVar = "psk_robotics";
-
"FRC-1317-CECE".psk = "digitalfusion";
-
"1317-fortress-of-awesomeness" = { };
-
"PAST PD".pskVar = "psk_past";
-
"Heartland".psk = "beourguest";
-
"WPL_Public_AccessII" = { };
-
"Yowzaford".pskVar = "psk_rhoda";
-
"cu-events".psk = "freesmile82";
-
"QargoCoffee-Guest".psk = "Lavazza@7";
-
"Fulton".psk = "9064405930";
-
"TP-LINK_ECF0".psk = "ad1066AD!";
-
"eduroam" = {
-
eduroam = true;
-
identity = "kieranklukas@cedarville.edu";
-
pskVar = "psk_cedarville";
-
};
-
};
-
};
-
};
-
-
services.iodine.clients = {
-
t1 = {
-
server = "t1.dunkirk.sh";
-
passwordFile = config.age.secrets.iodine.path;
-
};
-
};
-
-
virtualisation = {
-
libvirtd.enable = true;
-
virtualbox = {
-
host.enable = true;
-
host.enableExtensionPack = true;
-
};
-
docker.enable = true;
-
};
-
-
programs.nix-ld.enable = true;
-
-
programs.zsh.enable = true;
-
-
programs.direnv.enable = true;
-
-
# TODO: Configure your system-wide user settings (groups, etc), add more users as needed.
-
users.users = {
-
kierank = {
-
# You can skip setting a root password by passing '--no-root-passwd' to nixos-install.
-
# Be sure to change it (using passwd) after rebooting!
-
initialPassword = "lolzthisaintsecure!";
-
isNormalUser = true;
-
shell = pkgs.zsh;
-
openssh.authorizedKeys.keys = [
-
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzEEjvbL/ttqmYoDjxYQmDIq36BabROJoXgQKeh9liBxApwp+2PmgxROzTg42UrRc9pyrkq5kVfxG5hvkqCinhL1fMiowCSEs2L2/Cwi40g5ZU+QwdcwI8a4969kkI46PyB19RHkxg54OUORiIiso/WHGmqQsP+5wbV0+4riSnxwn/JXN4pmnE//stnyAyoiEZkPvBtwJjKb3Ni9n3eNLNs6gnaXrCtaygEZdebikr9kS2g9mM696HvIFgM6cdR/wZ7DcLbG3IdTXuHN7PC3xxL+Y4ek5iMreQIPmuvs4qslbthPGYoYbYLUQiRa9XO5s/ksIj5Z14f7anHE6cuTQVpvNWdGDOigyIVS5qU+4ZF7j+rifzOXVL48gmcAvw/uV68m5Wl/p0qsC/d8vI3GYwEsWG/EzpAlc07l8BU2LxWgN+d7uwBFaJV9VtmUDs5dcslsh8IbzmtC9gq3OLGjklxTfIl6qPiL8U33oc/UwqzvZUrI2BlbagvIZYy6rP+q0= kierank@mockingjay"
-
];
-
extraGroups = [
-
"wheel"
-
"networkmanager"
-
"audio"
-
"video"
-
"docker"
-
"plugdev"
-
"input"
-
"dialout"
-
"docker"
-
"libvirtd"
-
"vboxusers"
-
];
-
};
-
root.openssh.authorizedKeys.keys = [
-
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzEEjvbL/ttqmYoDjxYQmDIq36BabROJoXgQKeh9liBxApwp+2PmgxROzTg42UrRc9pyrkq5kVfxG5hvkqCinhL1fMiowCSEs2L2/Cwi40g5ZU+QwdcwI8a4969kkI46PyB19RHkxg54OUORiIiso/WHGmqQsP+5wbV0+4riSnxwn/JXN4pmnE//stnyAyoiEZkPvBtwJjKb3Ni9n3eNLNs6gnaXrCtaygEZdebikr9kS2g9mM696HvIFgM6cdR/wZ7DcLbG3IdTXuHN7PC3xxL+Y4ek5iMreQIPmuvs4qslbthPGYoYbYLUQiRa9XO5s/ksIj5Z14f7anHE6cuTQVpvNWdGDOigyIVS5qU+4ZF7j+rifzOXVL48gmcAvw/uV68m5Wl/p0qsC/d8vI3GYwEsWG/EzpAlc07l8BU2LxWgN+d7uwBFaJV9VtmUDs5dcslsh8IbzmtC9gq3OLGjklxTfIl6qPiL8U33oc/UwqzvZUrI2BlbagvIZYy6rP+q0= kierank@mockingjay"
-
];
-
};
-
-
programs.steam = {
-
enable = true;
-
remotePlay.openFirewall = true; # Open ports in the firewall for Steam Remote Play
-
dedicatedServer.openFirewall = true; # Open ports in the firewall for Source Dedicated Server
-
localNetworkGameTransfers.openFirewall = true; # Open ports in the firewall for Steam Local Network Game Transfers
-
};
-
-
programs.hyprland.enable = true;
-
services.hypridle.enable = true;
-
-
programs.xwayland.enable = lib.mkForce true;
-
-
services.udev.packages = [
-
pkgs.qFlipper
-
pkgs.via
-
];
-
-
# enable cups
-
services.printing.enable = true;
-
services.avahi = {
-
enable = true;
-
nssmdns4 = true;
-
openFirewall = true;
-
};
-
-
# enable bluetooth
-
hardware.bluetooth.enable = true;
-
-
# enable pipewire
-
# rtkit is optional but recommended
-
security.rtkit.enable = true;
-
services.pipewire = {
-
enable = true;
-
alsa.enable = true;
-
alsa.support32Bit = true;
-
pulse.enable = true;
-
# If you want to use JACK applications, uncomment this
-
jack.enable = true;
-
};
-
-
# This setups a SSH server. Very important if you're setting up a headless system.
-
# Feel free to remove if you don't need it.
-
services.openssh = {
-
enable = true;
-
settings = {
-
# Opinionated: forbid root login through SSH.
-
PermitRootLogin = "no";
-
# Opinionated: use keys only.
-
# Remove if you want to SSH using passwords
-
PasswordAuthentication = false;
-
};
-
};
-
-
networking.firewall = {
-
enable = true;
-
allowedTCPPorts = [
-
4455
-
51820
-
];
-
allowedUDPPorts = [
-
4455
-
51820
-
];
-
};
-
-
services.tailscale = {
-
enable = true;
-
useRoutingFeatures = "client";
-
};
-
-
services.devmon.enable = true;
-
services.gvfs.enable = true;
-
services.udisks2.enable = true;
-
-
services.logind.extraConfig = ''
-
# don't shutdown when power button is short-pressed
-
HandlePowerKey=ignore
-
HandlePowerKeyLongPress=poweroff
-
'';
-
-
# Requires at least 5.16 for working wi-fi and bluetooth.
-
# https://community.frame.work/t/using-the-ax210-with-linux-on-the-framework-laptop/1844/89
-
boot = {
-
kernelPackages = lib.mkIf (lib.versionOlder pkgs.linux.version "5.16") (
-
lib.mkDefault pkgs.linuxPackages_latest
-
);
-
loader.grub = {
-
# no need to set devices, disko will add all devices that have a EF02 partition to the list already
-
device = "nodev";
-
efiSupport = true;
-
efiInstallAsRemovable = true;
-
};
-
supportedFilesystems = [ "ntfs" ];
-
extraModprobeConfig = ''
-
options kvm_intel nested=1
-
options kvm_intel emulate_invalid_guest_state=0
-
options kvm ignore_msrs=1
-
'';
-
};
-
-
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
-
system.stateVersion = "23.05";
-
}
-32
machines/moonlark/disk-config.nix
···
-
{
-
disko.devices = {
-
disk = {
-
main = {
-
device = "/dev/nvme0n1";
-
type = "disk";
-
content = {
-
type = "gpt";
-
partitions = {
-
ESP = {
-
type = "EF00";
-
size = "500M";
-
content = {
-
type = "filesystem";
-
format = "vfat";
-
mountpoint = "/boot";
-
};
-
};
-
root = {
-
size = "100%";
-
content = {
-
type = "filesystem";
-
format = "ext4";
-
mountpoint = "/";
-
};
-
};
-
};
-
};
-
};
-
};
-
};
-
}
-36
machines/moonlark/hardware-configuration.nix
···
-
# 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"
-
"thunderbolt"
-
"nvme"
-
"usb_storage"
-
"sd_mod"
-
];
-
boot.initrd.kernelModules = [ ];
-
boot.kernelModules = [ "kvm-intel" ];
-
boot.extraModulePackages = [ ];
-
-
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
-
# (the default) this is the recommended approach. When using systemd-networkd it's
-
# still possible to use this option, but it's recommended to use it in conjunction
-
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
-
networking.useDHCP = lib.mkDefault true;
-
# networking.interfaces.wlp170s0.useDHCP = lib.mkDefault true;
-
-
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
-
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
-
}
-38
machines/moonlark/home/default.nix
···
-
{ inputs, ... }:
-
{
-
imports = [
-
(inputs.import-tree ../../../modules/home)
-
];
-
-
home = {
-
username = "kierank";
-
homeDirectory = "/home/kierank";
-
};
-
-
atelier = {
-
shell = {
-
enable = true;
-
};
-
terminal = {
-
alacritty.enable = true;
-
ghostty.enable = true;
-
};
-
apps = {
-
irssi.enable = true;
-
qutebrowser.enable = true;
-
spotify.enable = true;
-
crush.enable = true;
-
};
-
theming.enable = true;
-
wm.hyprland.enable = true;
-
};
-
-
# Enable home-manager and git
-
programs.home-manager.enable = true;
-
-
# Nicely reload system units when changing configs
-
systemd.user.startServices = "sd-switch";
-
-
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
-
home.stateVersion = "23.05";
-
}
-18
machines/moonlark/home-manager.nix
···
-
{ inputs, outputs, ... }:
-
{
-
imports = [
-
# Import home-manager's NixOS module
-
inputs.home-manager.nixosModules.home-manager
-
];
-
-
home-manager = {
-
useGlobalPkgs = true;
-
extraSpecialArgs = {
-
inherit inputs outputs;
-
};
-
users = {
-
# Import your home-manager configuration
-
kierank = import ./home;
-
};
-
};
-
}
-44
machines/nest/default.nix
···
-
{
-
pkgs,
-
inputs,
-
system,
-
...
-
}:
-
{
-
imports = [
-
(inputs.import-tree ../../modules/home)
-
../../modules/home/system/nixpkgs.nix.disabled
-
];
-
-
nixpkgs.enable = true;
-
-
home = {
-
username = "kierank";
-
homeDirectory = "/home/kierank";
-
-
packages = with pkgs; [
-
neofetch
-
inputs.nixvim.packages.${system}.default
-
];
-
};
-
-
atelier = {
-
shell.enable = true;
-
apps = {
-
helix.enable = true;
-
};
-
ssh = {
-
enable = true;
-
zmx.enable = true;
-
};
-
};
-
-
# Enable home-manager
-
programs.home-manager.enable = true;
-
-
# Nicely reload system units when changing configs
-
systemd.user.startServices = "sd-switch";
-
-
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
-
home.stateVersion = "23.05";
-
}
-207
machines/prattle/default.nix
···
-
{
-
inputs,
-
lib,
-
config,
-
pkgs,
-
...
-
}:
-
{
-
imports = [
-
./disk-config.nix
-
./home-manager.nix
-
-
(inputs.import-tree ../../modules/nixos)
-
];
-
-
nixpkgs = {
-
hostPlatform = "x86_64-linux";
-
config = {
-
allowUnfree = true;
-
};
-
};
-
-
nix =
-
let
-
flakeInputs = lib.filterAttrs (_: lib.isType "flake") inputs;
-
in
-
{
-
settings = {
-
experimental-features = "nix-command flakes";
-
flake-registry = "";
-
nix-path = config.nix.nixPath;
-
trusted-users = [
-
"kierank"
-
];
-
# Limit resource usage
-
max-jobs = 1;
-
cores = 1;
-
};
-
channel.enable = false;
-
# Disable automatic optimization to save CPU/memory
-
optimise.automatic = false;
-
registry = lib.mapAttrs (_: flake: { inherit flake; }) flakeInputs;
-
nixPath = lib.mapAttrsToList (n: _: "${n}=flake:${n}") flakeInputs;
-
# Enable automatic GC to free up disk space
-
gc = {
-
automatic = true;
-
dates = "weekly";
-
options = "--delete-older-than 7d";
-
};
-
};
-
-
time.timeZone = "America/New_York";
-
-
environment.systemPackages = with pkgs; [
-
# core essentials only
-
vim
-
curl
-
inputs.agenix.packages.x86_64-linux.default
-
];
-
-
age.identityPaths = [
-
"/home/kierank/.ssh/id_rsa"
-
"/etc/ssh/id_rsa"
-
];
-
age.secrets = {
-
wakatime = {
-
file = ../../secrets/wakatime.age;
-
path = "/home/kierank/.wakatime.cfg";
-
owner = "kierank";
-
};
-
cloudflare = {
-
file = ../../secrets/cloudflare.age;
-
owner = "caddy";
-
};
-
};
-
-
environment.sessionVariables = {
-
XDG_CACHE_HOME = "$HOME/.cache";
-
XDG_CONFIG_HOME = "$HOME/.config";
-
XDG_DATA_HOME = "$HOME/.local/share";
-
XDG_STATE_HOME = "$HOME/.local/state";
-
EDITOR = "vim";
-
SYSTEMD_EDITOR = "vim";
-
VISUAL = "vim";
-
};
-
-
atelier = {
-
authentication.enable = true;
-
};
-
-
networking = {
-
hostName = "prattle";
-
# Use systemd-networkd instead of NetworkManager (lighter)
-
useDHCP = true;
-
networkmanager.enable = false;
-
};
-
-
# Use bash instead of zsh to save memory
-
programs.bash.enableCompletion = true;
-
-
users.users = {
-
kierank = {
-
initialPassword = "changeme";
-
isNormalUser = true;
-
shell = pkgs.bashInteractive;
-
openssh.authorizedKeys.keys = [
-
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzEEjvbL/ttqmYoDjxYQmDIq36BabROJoXgQKeh9liBxApwp+2PmgxROzTg42UrRc9pyrkq5kVfxG5hvkqCinhL1fMiowCSEs2L2/Cwi40g5ZU+QwdcwI8a4969kkI46PyB19RHkxg54OUORiIiso/WHGmqQsP+5wbV0+4riSnxwn/JXN4pmnE//stnyAyoiEZkPvBtwJjKb3Ni9n3eNLNs6gnaXrCtaygEZdebikr9kS2g9mM696HvIFgM6cdR/wZ7DcLbG3IdTXuHN7PC3xxL+Y4ek5iMreQIPmuvs4qslbthPGYoYbYLUQiRa9XO5s/ksIj5Z14f7anHE6cuTQVpvNWdGDOigyIVS5qU+4ZF7j+rifzOXVL48gmcAvw/uV68m5Wl/p0qsC/d8vI3GYwEsWG/EzpAlc07l8BU2LxWgN+d7uwBFaJV9VtmUDs5dcslsh8IbzmtC9gq3OLGjklxTfIl6qPiL8U33oc/UwqzvZUrI2BlbagvIZYy6rP+q0= kierank@mockingjay"
-
];
-
extraGroups = [
-
"wheel"
-
];
-
};
-
root.openssh.authorizedKeys.keys = [
-
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzEEjvbL/ttqmYoDjxYQmDIq36BabROJoXgQKeh9liBxApwp+2PmgxROzTg42UrRc9pyrkq5kVfxG5hvkqCinhL1fMiowCSEs2L2/Cwi40g5ZU+QwdcwI8a4969kkI46PyB19RHkxg54OUORiIiso/WHGmqQsP+5wbV0+4riSnxwn/JXN4pmnE//stnyAyoiEZkPvBtwJjKb3Ni9n3eNLNs6gnaXrCtaygEZdebikr9kS2g9mM696HvIFgM6cdR/wZ7DcLbG3IdTXuHN7PC3xxL+Y4ek5iMreQIPmuvs4qslbthPGYoYbYLUQiRa9XO5s/ksIj5Z14f7anHE6cuTQVpvNWdGDOigyIVS5qU+4ZF7j+rifzOXVL48gmcAvw/uV68m5Wl/p0qsC/d8vI3GYwEsWG/EzpAlc07l8BU2LxWgN+d7uwBFaJV9VtmUDs5dcslsh8IbzmtC9gq3OLGjklxTfIl6qPiL8U33oc/UwqzvZUrI2BlbagvIZYy6rP+q0= kierank@mockingjay"
-
];
-
};
-
-
# Allow passwordless sudo for wheel group (needed for deploy-rs)
-
security.sudo.wheelNeedsPassword = false;
-
-
services.openssh = {
-
enable = true;
-
openFirewall = true;
-
settings = {
-
PermitRootLogin = "no";
-
PasswordAuthentication = false;
-
};
-
};
-
-
networking.firewall = {
-
enable = true;
-
allowedTCPPorts = [ 22 80 443 ];
-
logRefusedConnections = false;
-
rejectPackets = true;
-
# Disable firewall logging to reduce overhead
-
logReversePathDrops = false;
-
};
-
-
services.tailscale = {
-
enable = true;
-
useRoutingFeatures = "client";
-
};
-
-
services.caddy = {
-
enable = true;
-
package = pkgs.caddy.withPlugins {
-
plugins = [ "github.com/caddy-dns/cloudflare@v0.2.2" ];
-
hash = "sha256-ea8PC/+SlPRdEVVF/I3c1CBprlVp1nrumKM5cMwJJ3U=";
-
};
-
email = "me@dunkirk.sh";
-
globalConfig = ''
-
acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}
-
'';
-
virtualHosts."status.dunkirk.sh" = {
-
extraConfig = ''
-
tls {
-
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
-
}
-
header {
-
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
-
}
-
reverse_proxy localhost:3001 {
-
header_up X-Forwarded-Proto {scheme}
-
header_up X-Forwarded-For {remote}
-
}
-
'';
-
};
-
extraConfig = ''
-
# Default response for unhandled domains
-
:80 {
-
respond "404 - Looks like this pin is unobtainable" 404
-
}
-
:443 {
-
respond "404 - Looks like this pin is unobtainable" 404
-
}
-
'';
-
};
-
-
systemd.services.caddy.serviceConfig = {
-
EnvironmentFile = config.age.secrets.cloudflare.path;
-
};
-
-
services.uptime-kuma = {
-
enable = true;
-
settings = {
-
PORT = "3001";
-
};
-
};
-
-
boot.loader.systemd-boot.enable = true;
-
boot.loader.efi.canTouchEfiVariables = true;
-
boot.kernelParams = [ "console=ttyS0" ];
-
-
# Memory and resource optimizations
-
zramSwap = {
-
enable = true;
-
memoryPercent = 50; # Use 50% of RAM for compressed swap
-
};
-
-
# Reduce system logging overhead
-
services.journald.extraConfig = ''
-
SystemMaxUse=100M
-
MaxRetentionSec=7day
-
'';
-
-
system.stateVersion = "23.05";
-
}
-32
machines/prattle/disk-config.nix
···
-
{
-
disko.devices = {
-
disk = {
-
main = {
-
type = "disk";
-
device = "/dev/sda";
-
content = {
-
type = "gpt";
-
partitions = {
-
boot = {
-
size = "512M";
-
type = "EF00";
-
content = {
-
type = "filesystem";
-
format = "vfat";
-
mountpoint = "/boot";
-
};
-
};
-
root = {
-
size = "100%";
-
content = {
-
type = "filesystem";
-
format = "ext4";
-
mountpoint = "/";
-
};
-
};
-
};
-
};
-
};
-
};
-
};
-
}
-1696
machines/prattle/facter.json
···
-
{
-
"version": 1,
-
"system": "x86_64-linux",
-
"virtualisation": "kvm",
-
"hardware": {
-
"bios": {
-
"apm_info": {
-
"supported": false,
-
"enabled": false,
-
"version": 0,
-
"sub_version": 0,
-
"bios_flags": 0
-
},
-
"vbe_info": {
-
"version": 0,
-
"video_memory": 0
-
},
-
"pnp": false,
-
"pnp_id": 0,
-
"lba_support": false,
-
"low_memory_size": 0,
-
"smbios_version": 520
-
},
-
"bridge": [
-
{
-
"index": 7,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 1
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0001",
-
"name": "ISA bridge",
-
"value": 1
-
},
-
"vendor": {
-
"hex": "8086",
-
"name": "Intel Corporation",
-
"value": 32902
-
},
-
"sub_vendor": {
-
"hex": "1af4",
-
"value": 6900
-
},
-
"device": {
-
"hex": "7000",
-
"value": 28672
-
},
-
"sub_device": {
-
"hex": "1100",
-
"value": 4352
-
},
-
"model": "Intel ISA bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:01.0",
-
"sysfs_bus_id": "0000:00:01.0",
-
"detail": {
-
"function": 0,
-
"command": 3,
-
"header_type": 0,
-
"secondary_bus": 0,
-
"irq": 0,
-
"prog_if": 0
-
},
-
"module_alias": "pci:v00008086d00007000sv00001AF4sd00001100bc06sc01i00"
-
},
-
{
-
"index": 9,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 0
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "Host bridge",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "8086",
-
"name": "Intel Corporation",
-
"value": 32902
-
},
-
"sub_vendor": {
-
"hex": "1af4",
-
"value": 6900
-
},
-
"device": {
-
"hex": "1237",
-
"value": 4663
-
},
-
"sub_device": {
-
"hex": "1100",
-
"value": 4352
-
},
-
"revision": {
-
"hex": "0002",
-
"value": 2
-
},
-
"model": "Intel Host bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:00.0",
-
"sysfs_bus_id": "0000:00:00.0",
-
"detail": {
-
"function": 0,
-
"command": 3,
-
"header_type": 0,
-
"secondary_bus": 0,
-
"irq": 0,
-
"prog_if": 0
-
},
-
"module_alias": "pci:v00008086d00001237sv00001AF4sd00001100bc06sc00i00"
-
},
-
{
-
"index": 10,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 1
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0080",
-
"name": "Bridge",
-
"value": 128
-
},
-
"vendor": {
-
"hex": "8086",
-
"name": "Intel Corporation",
-
"value": 32902
-
},
-
"sub_vendor": {
-
"hex": "1af4",
-
"value": 6900
-
},
-
"device": {
-
"hex": "7113",
-
"value": 28947
-
},
-
"sub_device": {
-
"hex": "1100",
-
"value": 4352
-
},
-
"revision": {
-
"hex": "0003",
-
"value": 3
-
},
-
"model": "Intel Bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:01.3",
-
"sysfs_bus_id": "0000:00:01.3",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 9,
-
"triggered": 0,
-
"enabled": true
-
}
-
],
-
"detail": {
-
"function": 3,
-
"command": 3,
-
"header_type": 0,
-
"secondary_bus": 0,
-
"irq": 9,
-
"prog_if": 0
-
},
-
"driver": "piix4_smbus",
-
"driver_module": "i2c_piix4",
-
"drivers": [
-
"piix4_smbus"
-
],
-
"driver_modules": [
-
"i2c_piix4"
-
],
-
"module_alias": "pci:v00008086d00007113sv00001AF4sd00001100bc06sc80i00"
-
}
-
],
-
"cpu": [
-
{
-
"architecture": "x86_64",
-
"vendor_name": "AuthenticAMD",
-
"family": 23,
-
"model": 1,
-
"stepping": 2,
-
"features": [
-
"fpu",
-
"vme",
-
"de",
-
"pse",
-
"tsc",
-
"msr",
-
"pae",
-
"mce",
-
"cx8",
-
"apic",
-
"sep",
-
"mtrr",
-
"pge",
-
"mca",
-
"cmov",
-
"pat",
-
"pse36",
-
"clflush",
-
"mmx",
-
"fxsr",
-
"sse",
-
"sse2",
-
"ht",
-
"syscall",
-
"nx",
-
"mmxext",
-
"fxsr_opt",
-
"pdpe1gb",
-
"rdtscp",
-
"lm",
-
"rep_good",
-
"nopl",
-
"xtopology",
-
"cpuid",
-
"extd_apicid",
-
"tsc_known_freq",
-
"pni",
-
"pclmulqdq",
-
"ssse3",
-
"fma",
-
"cx16",
-
"sse4_1",
-
"sse4_2",
-
"x2apic",
-
"movbe",
-
"popcnt",
-
"tsc_deadline_timer",
-
"aes",
-
"xsave",
-
"avx",
-
"f16c",
-
"rdrand",
-
"hypervisor",
-
"lahf_lm",
-
"cmp_legacy",
-
"svm",
-
"cr8_legacy",
-
"abm",
-
"sse4a",
-
"misalignsse",
-
"3dnowprefetch",
-
"osvw",
-
"topoext",
-
"perfctr_core",
-
"ssbd",
-
"ibpb",
-
"vmmcall",
-
"fsgsbase",
-
"tsc_adjust",
-
"bmi1",
-
"avx2",
-
"smep",
-
"bmi2",
-
"rdseed",
-
"adx",
-
"smap",
-
"clflushopt",
-
"sha_ni",
-
"xsaveopt",
-
"xsavec",
-
"xgetbv1",
-
"clzero",
-
"xsaveerptr",
-
"virt_ssbd",
-
"arat",
-
"npt",
-
"nrip_save",
-
"vgif",
-
"overflow_recov",
-
"succor",
-
"arch_capabilities"
-
],
-
"bugs": [
-
"sysret_ss_attrs",
-
"null_seg",
-
"spectre_v1",
-
"spectre_v2",
-
"spec_store_bypass",
-
"retbleed",
-
"smt_rsb",
-
"srso",
-
"div0",
-
"ibpb_no_ret"
-
],
-
"bogo": 3992.5,
-
"cache": 512,
-
"units": 2,
-
"physical_id": 0,
-
"siblings": 2,
-
"cores": 1,
-
"fpu": true,
-
"fpu_exception": true,
-
"cpuid_level": 13,
-
"write_protect": false,
-
"tlb_size": 1024,
-
"clflush_size": 64,
-
"cache_alignment": 64,
-
"address_sizes": {
-
"physical": "0x28",
-
"virtual": "0x30"
-
}
-
}
-
],
-
"disk": [
-
{
-
"index": 18,
-
"attached_to": 14,
-
"class_list": [
-
"disk",
-
"scsi",
-
"block_device"
-
],
-
"bus_type": {
-
"hex": "0084",
-
"name": "SCSI",
-
"value": 132
-
},
-
"slot": {
-
"bus": 0,
-
"number": 0
-
},
-
"base_class": {
-
"hex": "0106",
-
"name": "Mass Storage Device",
-
"value": 262
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "Disk",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "0000",
-
"name": "ORACLE",
-
"value": 0
-
},
-
"device": {
-
"hex": "0000",
-
"name": "BlockVolume",
-
"value": 0
-
},
-
"revision": {
-
"hex": "0000",
-
"name": "1.0",
-
"value": 0
-
},
-
"model": "ORACLE BlockVolume",
-
"sysfs_id": "/class/block/sda",
-
"sysfs_bus_id": "0:0:0:1",
-
"sysfs_device_link": "/devices/pci0000:00/0000:00:04.0/virtio1/host0/target0:0:0/0:0:0:1",
-
"unix_device_name": "/dev/sda",
-
"unix_device_number": {
-
"type": 98,
-
"major": 8,
-
"minor": 0,
-
"range": 16
-
},
-
"unix_device_names": [
-
"/dev/disk/by-id/scsi-36031c628421d4d309553ce9700b81f0d",
-
"/dev/disk/by-id/wwn-0x6031c628421d4d309553ce9700b81f0d",
-
"/dev/disk/by-path/pci-0000:00:04.0-scsi-0:0:0:1",
-
"/dev/sda"
-
],
-
"unix_device_name2": "/dev/sg0",
-
"unix_device_number2": {
-
"type": 99,
-
"major": 21,
-
"minor": 0,
-
"range": 1
-
},
-
"rom_id": "0x80",
-
"resources": [
-
{
-
"type": "disk_geo",
-
"cylinders": 47694,
-
"heads": 64,
-
"sectors": 32,
-
"size": "0x0",
-
"geo_type": "logical"
-
},
-
{
-
"type": "size",
-
"unit": "sectors",
-
"value_1": 97677312,
-
"value_2": 512
-
}
-
],
-
"driver": "virtio_scsi",
-
"driver_module": "virtio_scsi",
-
"drivers": [
-
"sd",
-
"virtio_scsi"
-
],
-
"driver_modules": [
-
"sd_mod",
-
"virtio_scsi"
-
]
-
}
-
],
-
"graphics_card": [
-
{
-
"index": 13,
-
"attached_to": 0,
-
"class_list": [
-
"graphics_card",
-
"pci"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 2
-
},
-
"base_class": {
-
"hex": "0003",
-
"name": "Display controller",
-
"value": 3
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "VGA compatible controller",
-
"value": 0
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "VGA",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1234",
-
"value": 4660
-
},
-
"sub_vendor": {
-
"hex": "1af4",
-
"value": 6900
-
},
-
"device": {
-
"hex": "1111",
-
"value": 4369
-
},
-
"sub_device": {
-
"hex": "1100",
-
"value": 4352
-
},
-
"revision": {
-
"hex": "0002",
-
"value": 2
-
},
-
"model": "VGA compatible controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:02.0",
-
"sysfs_bus_id": "0000:00:02.0",
-
"resources": [
-
{
-
"type": "mem",
-
"base": 2147483648,
-
"range": 16777216,
-
"enabled": true,
-
"access": "read_only",
-
"prefetch": "no"
-
},
-
{
-
"type": "mem",
-
"base": 2164334592,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
},
-
{
-
"type": "mem",
-
"base": 786432,
-
"range": 131072,
-
"enabled": false,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 0,
-
"command": 3,
-
"header_type": 0,
-
"secondary_bus": 0,
-
"irq": 0,
-
"prog_if": 0
-
},
-
"driver": "bochs-drm",
-
"driver_module": "bochs",
-
"drivers": [
-
"bochs-drm"
-
],
-
"driver_modules": [
-
"bochs"
-
],
-
"module_alias": "pci:v00001234d00001111sv00001AF4sd00001100bc03sc00i00"
-
}
-
],
-
"hub": [
-
{
-
"index": 19,
-
"attached_to": 6,
-
"class_list": [
-
"usb",
-
"hub"
-
],
-
"bus_type": {
-
"hex": "0086",
-
"name": "USB",
-
"value": 134
-
},
-
"slot": {
-
"bus": 0,
-
"number": 0
-
},
-
"base_class": {
-
"hex": "010a",
-
"name": "Hub",
-
"value": 266
-
},
-
"vendor": {
-
"hex": "1d6b",
-
"name": "Linux 6.14.10 uhci_hcd",
-
"value": 7531
-
},
-
"device": {
-
"hex": "0001",
-
"name": "UHCI Host Controller",
-
"value": 1
-
},
-
"revision": {
-
"hex": "0000",
-
"name": "6.14",
-
"value": 0
-
},
-
"serial": "0000:00:01.2",
-
"model": "Linux 6.14.10 uhci_hcd UHCI Host Controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/usb1/1-0:1.0",
-
"sysfs_bus_id": "1-0:1.0",
-
"resources": [
-
{
-
"type": "baud",
-
"speed": 12000000,
-
"bits": 0,
-
"stop_bits": 0,
-
"parity": 0,
-
"handshake": 0
-
}
-
],
-
"detail": {
-
"device_class": {
-
"hex": "0009",
-
"name": "hub",
-
"value": 9
-
},
-
"device_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"device_protocol": 0,
-
"interface_class": {
-
"hex": "0009",
-
"name": "hub",
-
"value": 9
-
},
-
"interface_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"interface_protocol": 0,
-
"interface_number": 0,
-
"interface_alternate_setting": 0
-
},
-
"hotplug": "usb",
-
"driver": "hub",
-
"driver_module": "usbcore",
-
"drivers": [
-
"hub"
-
],
-
"driver_modules": [
-
"usbcore"
-
],
-
"module_alias": "usb:v1D6Bp0001d0614dc09dsc00dp00ic09isc00ip00in00"
-
}
-
],
-
"memory": [
-
{
-
"index": 5,
-
"attached_to": 0,
-
"class_list": [
-
"memory"
-
],
-
"base_class": {
-
"hex": "0101",
-
"name": "Internally Used Class",
-
"value": 257
-
},
-
"sub_class": {
-
"hex": "0002",
-
"name": "Main Memory",
-
"value": 2
-
},
-
"model": "Main Memory",
-
"resources": [
-
{
-
"type": "mem",
-
"base": 0,
-
"range": 1004576768,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "unknown"
-
},
-
{
-
"type": "phys_mem",
-
"range": 1006632960
-
}
-
]
-
}
-
],
-
"monitor": [
-
{
-
"index": 16,
-
"attached_to": 13,
-
"class_list": [
-
"monitor"
-
],
-
"base_class": {
-
"hex": "0100",
-
"name": "Monitor",
-
"value": 256
-
},
-
"sub_class": {
-
"hex": "0002",
-
"name": "LCD Monitor",
-
"value": 2
-
},
-
"vendor": {
-
"hex": "4914",
-
"value": 18708
-
},
-
"device": {
-
"hex": "1234",
-
"name": "QEMU Monitor",
-
"value": 4660
-
},
-
"serial": "0",
-
"model": "QEMU Monitor",
-
"resources": [
-
{
-
"type": "monitor",
-
"width": 1024,
-
"height": 768,
-
"vertical_frequency": 60,
-
"interlaced": false
-
},
-
{
-
"type": "monitor",
-
"width": 1280,
-
"height": 800,
-
"vertical_frequency": 60,
-
"interlaced": false
-
},
-
{
-
"type": "monitor",
-
"width": 1600,
-
"height": 1200,
-
"vertical_frequency": 60,
-
"interlaced": false
-
},
-
{
-
"type": "monitor",
-
"width": 1920,
-
"height": 1080,
-
"vertical_frequency": 60,
-
"interlaced": false
-
},
-
{
-
"type": "monitor",
-
"width": 2048,
-
"height": 1152,
-
"vertical_frequency": 60,
-
"interlaced": false
-
},
-
{
-
"type": "monitor",
-
"width": 640,
-
"height": 480,
-
"vertical_frequency": 60,
-
"interlaced": false
-
},
-
{
-
"type": "monitor",
-
"width": 800,
-
"height": 600,
-
"vertical_frequency": 60,
-
"interlaced": false
-
},
-
{
-
"type": "size",
-
"unit": "mm",
-
"value_1": 325,
-
"value_2": 203
-
}
-
],
-
"detail": {
-
"manufacture_year": 2014,
-
"manufacture_week": 42,
-
"vertical_sync": {
-
"min": 50,
-
"max": 125
-
},
-
"horizontal_sync": {
-
"min": 30,
-
"max": 160
-
},
-
"horizontal_sync_timings": {
-
"disp": 1280,
-
"sync_start": 1600,
-
"sync_end": 1638,
-
"total": 1728
-
},
-
"vertical_sync_timings": {
-
"disp": 800,
-
"sync_start": 804,
-
"sync_end": 808,
-
"total": 828
-
},
-
"clock": 107300,
-
"width": 1280,
-
"height": 800,
-
"width_millimetres": 325,
-
"height_millimetres": 203,
-
"horizontal_flag": 45,
-
"vertical_flag": 45,
-
"vendor": "",
-
"name": "QEMU Monitor"
-
},
-
"driver_info": {
-
"type": "display",
-
"width": 2048,
-
"height": 1152,
-
"vertical_sync": {
-
"min": 50,
-
"max": 125
-
},
-
"horizontal_sync": {
-
"min": 30,
-
"max": 160
-
},
-
"bandwidth": 0,
-
"horizontal_sync_timings": {
-
"disp": 1280,
-
"sync_start": 1600,
-
"sync_end": 1638,
-
"total": 1728
-
},
-
"vertical_sync_timings": {
-
"disp": 800,
-
"sync_start": 804,
-
"sync_end": 808,
-
"total": 828
-
},
-
"horizontal_flag": 45,
-
"vertical_flag": 45
-
}
-
}
-
],
-
"mouse": [
-
{
-
"index": 20,
-
"attached_to": 19,
-
"class_list": [
-
"mouse",
-
"usb"
-
],
-
"bus_type": {
-
"hex": "0086",
-
"name": "USB",
-
"value": 134
-
},
-
"slot": {
-
"bus": 0,
-
"number": 0
-
},
-
"base_class": {
-
"hex": "0105",
-
"name": "Mouse",
-
"value": 261
-
},
-
"sub_class": {
-
"hex": "0003",
-
"name": "USB Mouse",
-
"value": 3
-
},
-
"vendor": {
-
"hex": "0627",
-
"name": "QEMU",
-
"value": 1575
-
},
-
"device": {
-
"hex": "0001",
-
"name": "QEMU USB Tablet",
-
"value": 1
-
},
-
"serial": "28754-0000:00:01.2-1",
-
"compat_vendor": "Unknown",
-
"compat_device": "Generic USB Mouse",
-
"model": "QEMU USB Tablet",
-
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/usb1/1-1/1-1:1.0",
-
"sysfs_bus_id": "1-1:1.0",
-
"unix_device_name": "/dev/input/mice",
-
"unix_device_number": {
-
"type": 99,
-
"major": 13,
-
"minor": 63,
-
"range": 1
-
},
-
"unix_device_names": [
-
"/dev/input/mice"
-
],
-
"unix_device_name2": "/dev/input/mouse0",
-
"unix_device_number2": {
-
"type": 99,
-
"major": 13,
-
"minor": 32,
-
"range": 1
-
},
-
"resources": [
-
{
-
"type": "baud",
-
"speed": 12000000,
-
"bits": 0,
-
"stop_bits": 0,
-
"parity": 0,
-
"handshake": 0
-
}
-
],
-
"detail": {
-
"device_class": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"device_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"device_protocol": 0,
-
"interface_class": {
-
"hex": "0003",
-
"name": "hid",
-
"value": 3
-
},
-
"interface_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"interface_protocol": 0,
-
"interface_number": 0,
-
"interface_alternate_setting": 0
-
},
-
"hotplug": "usb",
-
"driver": "usbhid",
-
"driver_module": "usbhid",
-
"drivers": [
-
"usbhid"
-
],
-
"driver_modules": [
-
"usbhid"
-
],
-
"driver_info": {
-
"type": "mouse",
-
"db_entry_0": [
-
"explorerps/2",
-
"exps2"
-
],
-
"xf86": "explorerps/2",
-
"gpm": "exps2",
-
"buttons": -1,
-
"wheels": -1
-
},
-
"module_alias": "usb:v0627p0001d0000dc00dsc00dp00ic03isc00ip00in00"
-
}
-
],
-
"network_controller": [
-
{
-
"index": 15,
-
"attached_to": 11,
-
"class_list": [
-
"network_controller"
-
],
-
"bus_type": {
-
"hex": "008f",
-
"name": "Virtio",
-
"value": 143
-
},
-
"slot": {
-
"bus": 0,
-
"number": 0
-
},
-
"base_class": {
-
"hex": "0002",
-
"name": "Network controller",
-
"value": 2
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "Ethernet controller",
-
"value": 0
-
},
-
"vendor": "Virtio",
-
"device": "Ethernet Card 0",
-
"model": "Virtio Ethernet Card 0",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.0/virtio0",
-
"sysfs_bus_id": "virtio0",
-
"unix_device_name": "ens3",
-
"unix_device_names": [
-
"ens3"
-
],
-
"resources": [
-
{
-
"type": "hwaddr",
-
"address": 48
-
},
-
{
-
"type": "phwaddr",
-
"address": 48
-
}
-
],
-
"driver": "virtio_net",
-
"driver_module": "virtio_net",
-
"drivers": [
-
"virtio_net"
-
],
-
"driver_modules": [
-
"virtio_net"
-
],
-
"module_alias": "virtio:d00000001v0000108E"
-
}
-
],
-
"network_interface": [
-
{
-
"index": 21,
-
"attached_to": 0,
-
"class_list": [
-
"network_interface"
-
],
-
"base_class": {
-
"hex": "0107",
-
"name": "Network Interface",
-
"value": 263
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "Loopback",
-
"value": 0
-
},
-
"model": "Loopback network interface",
-
"sysfs_id": "/class/net/lo",
-
"unix_device_name": "lo",
-
"unix_device_names": [
-
"lo"
-
]
-
},
-
{
-
"index": 22,
-
"attached_to": 15,
-
"class_list": [
-
"network_interface"
-
],
-
"base_class": {
-
"hex": "0107",
-
"name": "Network Interface",
-
"value": 263
-
},
-
"sub_class": {
-
"hex": "0001",
-
"name": "Ethernet",
-
"value": 1
-
},
-
"model": "Ethernet network interface",
-
"sysfs_id": "/class/net/ens3",
-
"sysfs_device_link": "/devices/pci0000:00/0000:00:03.0/virtio0",
-
"unix_device_name": "ens3",
-
"unix_device_names": [
-
"ens3"
-
],
-
"resources": [
-
{
-
"type": "hwaddr",
-
"address": 48
-
},
-
{
-
"type": "phwaddr",
-
"address": 48
-
}
-
],
-
"driver": "virtio_net",
-
"driver_module": "virtio_net",
-
"drivers": [
-
"virtio_net"
-
],
-
"driver_modules": [
-
"virtio_net"
-
]
-
}
-
],
-
"pci": [
-
{
-
"index": 11,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"unknown"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 3
-
},
-
"base_class": {
-
"hex": "0002",
-
"name": "Network controller",
-
"value": 2
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "Ethernet controller",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1af4",
-
"value": 6900
-
},
-
"sub_vendor": {
-
"hex": "108e",
-
"value": 4238
-
},
-
"device": {
-
"hex": "1000",
-
"value": 4096
-
},
-
"sub_device": {
-
"hex": "0001",
-
"value": 1
-
},
-
"model": "Ethernet controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.0",
-
"sysfs_bus_id": "0000:00:03.0",
-
"resources": [
-
{
-
"type": "io",
-
"base": 49216,
-
"range": 32,
-
"enabled": true,
-
"access": "read_write"
-
},
-
{
-
"type": "irq",
-
"base": 10,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 2164330496,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
},
-
{
-
"type": "mem",
-
"base": 34359738368,
-
"range": 16384,
-
"enabled": true,
-
"access": "read_only",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 0,
-
"command": 1031,
-
"header_type": 0,
-
"secondary_bus": 0,
-
"irq": 10,
-
"prog_if": 0
-
},
-
"driver": "virtio-pci",
-
"driver_module": "virtio_pci",
-
"drivers": [
-
"virtio-pci"
-
],
-
"driver_modules": [
-
"virtio_pci"
-
],
-
"module_alias": "pci:v00001AF4d00001000sv0000108Esd00000001bc02sc00i00"
-
}
-
],
-
"storage_controller": [
-
{
-
"index": 8,
-
"attached_to": 0,
-
"class_list": [
-
"storage_controller",
-
"pci"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 4
-
},
-
"base_class": {
-
"hex": "0001",
-
"name": "Mass storage controller",
-
"value": 1
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "SCSI storage controller",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1af4",
-
"value": 6900
-
},
-
"sub_vendor": {
-
"hex": "108e",
-
"value": 4238
-
},
-
"device": {
-
"hex": "1004",
-
"value": 4100
-
},
-
"sub_device": {
-
"hex": "0008",
-
"value": 8
-
},
-
"model": "SCSI storage controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.0",
-
"sysfs_bus_id": "0000:00:04.0",
-
"resources": [
-
{
-
"type": "io",
-
"base": 49152,
-
"range": 64,
-
"enabled": true,
-
"access": "read_write"
-
},
-
{
-
"type": "irq",
-
"base": 11,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 2164326400,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
},
-
{
-
"type": "mem",
-
"base": 34359754752,
-
"range": 16384,
-
"enabled": true,
-
"access": "read_only",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 0,
-
"command": 1031,
-
"header_type": 0,
-
"secondary_bus": 0,
-
"irq": 11,
-
"prog_if": 0
-
},
-
"driver": "virtio-pci",
-
"driver_module": "virtio_pci",
-
"drivers": [
-
"virtio-pci"
-
],
-
"driver_modules": [
-
"virtio_pci"
-
],
-
"module_alias": "pci:v00001AF4d00001004sv0000108Esd00000008bc01sc00i00"
-
},
-
{
-
"index": 12,
-
"attached_to": 0,
-
"class_list": [
-
"storage_controller",
-
"pci"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 1
-
},
-
"base_class": {
-
"hex": "0001",
-
"name": "Mass storage controller",
-
"value": 1
-
},
-
"sub_class": {
-
"hex": "0001",
-
"name": "IDE interface",
-
"value": 1
-
},
-
"pci_interface": {
-
"hex": "0080",
-
"value": 128
-
},
-
"vendor": {
-
"hex": "8086",
-
"name": "Intel Corporation",
-
"value": 32902
-
},
-
"sub_vendor": {
-
"hex": "1af4",
-
"value": 6900
-
},
-
"device": {
-
"hex": "7010",
-
"value": 28688
-
},
-
"sub_device": {
-
"hex": "1100",
-
"value": 4352
-
},
-
"model": "Intel IDE interface",
-
"sysfs_id": "/devices/pci0000:00/0000:00:01.1",
-
"sysfs_bus_id": "0000:00:01.1",
-
"resources": [
-
{
-
"type": "io",
-
"base": 1014,
-
"range": 1,
-
"enabled": true,
-
"access": "read_write"
-
},
-
{
-
"type": "io",
-
"base": 368,
-
"range": 8,
-
"enabled": true,
-
"access": "read_write"
-
},
-
{
-
"type": "io",
-
"base": 49280,
-
"range": 16,
-
"enabled": true,
-
"access": "read_write"
-
},
-
{
-
"type": "io",
-
"base": 496,
-
"range": 8,
-
"enabled": true,
-
"access": "read_write"
-
},
-
{
-
"type": "io",
-
"base": 886,
-
"range": 1,
-
"enabled": true,
-
"access": "read_write"
-
}
-
],
-
"detail": {
-
"function": 1,
-
"command": 7,
-
"header_type": 0,
-
"secondary_bus": 0,
-
"irq": 0,
-
"prog_if": 128
-
},
-
"driver": "ata_piix",
-
"driver_module": "ata_piix",
-
"drivers": [
-
"ata_piix"
-
],
-
"driver_modules": [
-
"ata_piix"
-
],
-
"module_alias": "pci:v00008086d00007010sv00001AF4sd00001100bc01sc01i80"
-
}
-
],
-
"system": {
-
"form_factor": "desktop"
-
},
-
"unknown": [
-
{
-
"index": 14,
-
"attached_to": 8,
-
"class_list": [
-
"unknown"
-
],
-
"base_class": {
-
"hex": "0000",
-
"name": "Unclassified device",
-
"value": 0
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "Unclassified device",
-
"value": 0
-
},
-
"vendor": "Virtio",
-
"device": "",
-
"model": "Virtio Unclassified device",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.0/virtio1",
-
"sysfs_bus_id": "virtio1",
-
"driver": "virtio_scsi",
-
"driver_module": "virtio_scsi",
-
"drivers": [
-
"virtio_scsi"
-
],
-
"driver_modules": [
-
"virtio_scsi"
-
],
-
"module_alias": "virtio:d00000008v0000108E"
-
},
-
{
-
"index": 17,
-
"attached_to": 0,
-
"class_list": [
-
"unknown"
-
],
-
"base_class": {
-
"hex": "0007",
-
"name": "Communication controller",
-
"value": 7
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "Serial controller",
-
"value": 0
-
},
-
"pci_interface": {
-
"hex": "0002",
-
"name": "16550",
-
"value": 2
-
},
-
"device": {
-
"hex": "0000",
-
"name": "16550A",
-
"value": 0
-
},
-
"model": "16550A",
-
"unix_device_name": "/dev/ttyS0",
-
"unix_device_names": [
-
"/dev/ttyS0"
-
],
-
"resources": [
-
{
-
"type": "io",
-
"base": 1016,
-
"range": 0,
-
"enabled": true,
-
"access": "read_write"
-
},
-
{
-
"type": "irq",
-
"base": 4,
-
"triggered": 0,
-
"enabled": true
-
}
-
]
-
}
-
],
-
"usb_controller": [
-
{
-
"index": 6,
-
"attached_to": 0,
-
"class_list": [
-
"usb_controller",
-
"pci"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 1
-
},
-
"base_class": {
-
"hex": "000c",
-
"name": "Serial bus controller",
-
"value": 12
-
},
-
"sub_class": {
-
"hex": "0003",
-
"name": "USB Controller",
-
"value": 3
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "UHCI",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "8086",
-
"name": "Intel Corporation",
-
"value": 32902
-
},
-
"sub_vendor": {
-
"hex": "1af4",
-
"value": 6900
-
},
-
"device": {
-
"hex": "7020",
-
"value": 28704
-
},
-
"sub_device": {
-
"hex": "1100",
-
"value": 4352
-
},
-
"revision": {
-
"hex": "0001",
-
"value": 1
-
},
-
"model": "Intel USB Controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:01.2",
-
"sysfs_bus_id": "0000:00:01.2",
-
"resources": [
-
{
-
"type": "io",
-
"base": 49248,
-
"range": 32,
-
"enabled": true,
-
"access": "read_write"
-
},
-
{
-
"type": "irq",
-
"base": 11,
-
"triggered": 0,
-
"enabled": true
-
}
-
],
-
"detail": {
-
"function": 2,
-
"command": 7,
-
"header_type": 0,
-
"secondary_bus": 0,
-
"irq": 11,
-
"prog_if": 0
-
},
-
"driver": "uhci_hcd",
-
"driver_module": "uhci_hcd",
-
"drivers": [
-
"uhci_hcd"
-
],
-
"driver_modules": [
-
"uhci_hcd"
-
],
-
"driver_info": {
-
"type": "module",
-
"db_entry_0": [
-
"uhci-hcd"
-
],
-
"active": true,
-
"modprobe": true,
-
"names": [
-
"uhci-hcd"
-
],
-
"module_args": [
-
""
-
],
-
"conf": ""
-
},
-
"module_alias": "pci:v00008086d00007020sv00001AF4sd00001100bc0Csc03i00"
-
}
-
]
-
},
-
"smbios": {
-
"bios": {
-
"handle": 0,
-
"vendor": "EFI Development Kit II / OVMF",
-
"version": "1.6.4",
-
"date": "02/27/2023",
-
"features": null,
-
"start_address": "0xe8000",
-
"rom_size": 65536
-
},
-
"chassis": [
-
{
-
"handle": 768,
-
"manufacturer": "QEMU",
-
"version": "pc-i440fx-7.2",
-
"chassis_type": {
-
"hex": "0001",
-
"name": "Other",
-
"value": 1
-
},
-
"lock_present": false,
-
"bootup_state": {
-
"hex": "0003",
-
"name": "Safe",
-
"value": 3
-
},
-
"power_state": {
-
"hex": "0003",
-
"name": "Safe",
-
"value": 3
-
},
-
"thermal_state": {
-
"hex": "0003",
-
"name": "Safe",
-
"value": 3
-
},
-
"security_state": {
-
"hex": "0002",
-
"name": "Unknown",
-
"value": 2
-
},
-
"oem": "0x0"
-
}
-
],
-
"memory_array": [
-
{
-
"handle": 4096,
-
"location": {
-
"hex": "0001",
-
"name": "Other",
-
"value": 1
-
},
-
"usage": {
-
"hex": "0003",
-
"name": "System memory",
-
"value": 3
-
},
-
"ecc": {
-
"hex": "0006",
-
"name": "Multi-bit",
-
"value": 6
-
},
-
"max_size": "0x100000",
-
"error_handle": 65534,
-
"slots": 1
-
}
-
],
-
"memory_array_mapped_address": [
-
{
-
"handle": 4864,
-
"array_handle": 4096,
-
"start_address": "0x0",
-
"end_address": "0x40000000",
-
"part_width": 1
-
}
-
],
-
"memory_device": [
-
{
-
"handle": 4352,
-
"location": "DIMM 0",
-
"bank_location": "",
-
"manufacturer": "QEMU",
-
"part_number": "",
-
"array_handle": 4096,
-
"error_handle": 65534,
-
"width": 0,
-
"ecc_bits": 0,
-
"size": 1048576,
-
"form_factor": {
-
"hex": "0009",
-
"name": "DIMM",
-
"value": 9
-
},
-
"set": 0,
-
"memory_type": {
-
"hex": "0007",
-
"name": "RAM",
-
"value": 7
-
},
-
"memory_type_details": [
-
"Other"
-
],
-
"speed": 0
-
}
-
],
-
"processor": [
-
{
-
"handle": 1024,
-
"socket": "CPU 0",
-
"socket_type": {
-
"hex": "0001",
-
"name": "Other",
-
"value": 1
-
},
-
"socket_populated": true,
-
"manufacturer": "QEMU",
-
"version": "pc-i440fx-7.2",
-
"part": "",
-
"processor_type": {
-
"hex": "0003",
-
"name": "CPU",
-
"value": 3
-
},
-
"processor_family": {
-
"hex": "0001",
-
"name": "Other",
-
"value": 1
-
},
-
"processor_status": {
-
"hex": "0001",
-
"name": "Enabled",
-
"value": 1
-
},
-
"clock_ext": 0,
-
"clock_max": 2000,
-
"cache_handle_l1": 0,
-
"cache_handle_l2": 0,
-
"cache_handle_l3": 0
-
}
-
],
-
"system": {
-
"handle": 256,
-
"manufacturer": "QEMU",
-
"product": "Standard PC (i440FX + PIIX, 1996)",
-
"version": "pc-i440fx-7.2",
-
"wake_up": {
-
"hex": "0006",
-
"name": "Power Switch",
-
"value": 6
-
}
-
}
-
}
-
}
-24
machines/prattle/home/default.nix
···
-
{ inputs, ... }:
-
{
-
imports = [
-
(inputs.import-tree ../../../modules/home)
-
];
-
-
home = {
-
username = "kierank";
-
homeDirectory = "/home/kierank";
-
};
-
-
atelier = {
-
ssh = {
-
enable = true;
-
zmx.enable = true;
-
};
-
};
-
-
programs.home-manager.enable = true;
-
-
systemd.user.startServices = "sd-switch";
-
-
home.stateVersion = "23.05";
-
}
-16
machines/prattle/home-manager.nix
···
-
{ inputs, outputs, ... }:
-
{
-
imports = [
-
inputs.home-manager.nixosModules.home-manager
-
];
-
-
home-manager = {
-
useGlobalPkgs = true;
-
extraSpecialArgs = {
-
inherit inputs outputs;
-
};
-
users = {
-
kierank = import ./home;
-
};
-
};
-
}
-64
machines/tacyon/default.nix
···
-
{
-
pkgs,
-
inputs,
-
...
-
}:
-
{
-
imports = [
-
(inputs.import-tree ../../modules/home)
-
../../modules/home/system/nixpkgs.nix.disabled
-
];
-
-
nixpkgs.enable = true;
-
-
home = {
-
username = "pi";
-
homeDirectory = "/home/pi";
-
-
packages = with pkgs; [
-
inputs.nixvim.packages.${pkgs.stdenv.hostPlatform.system}.default
-
-
# languages
-
go
-
gopls
-
gotools
-
go-tools
-
-
# my apps
-
inputs.ctfd-alerts.packages.${pkgs.stdenv.hostPlatform.system}.default
-
-
# Fonts
-
fira
-
fira-code
-
fira-code-symbols
-
noto-fonts
-
noto-fonts-cjk-sans
-
noto-fonts-emoji
-
liberation_ttf
-
comic-neue
-
-
# Nerd Fonts (individual packages)
-
nerd-fonts.fira-code
-
nerd-fonts.jetbrains-mono
-
nerd-fonts.ubuntu-mono
-
];
-
};
-
-
atelier = {
-
shell.enable = true;
-
theming.enable = true;
-
};
-
-
fonts.fontconfig.enable = true;
-
-
# Enable home-manager
-
programs.home-manager.enable = true;
-
-
# Nicely reload system units when changing configs
-
systemd.user.startServices = "sd-switch";
-
-
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
-
home.stateVersion = "23.05";
-
-
home.file.".config/openbox/lxde-pi-rc.xml".source = ../../dots/lxde-pi-rc.xml;
-
}
-372
machines/terebithia/default.nix
···
-
{
-
inputs,
-
lib,
-
config,
-
pkgs,
-
...
-
}:
-
{
-
imports = [
-
./disk-config.nix
-
./home-manager.nix
-
-
(inputs.import-tree ../../modules/nixos)
-
inputs.tangled.nixosModules.knot
-
inputs.tangled.nixosModules.spindle
-
];
-
-
nixpkgs = {
-
hostPlatform = "aarch64-linux";
-
config = {
-
allowUnfree = true;
-
};
-
};
-
-
nix =
-
let
-
flakeInputs = lib.filterAttrs (_: lib.isType "flake") inputs;
-
in
-
{
-
settings = {
-
experimental-features = "nix-command flakes";
-
flake-registry = "";
-
nix-path = config.nix.nixPath;
-
trusted-users = [
-
"kierank"
-
];
-
};
-
channel.enable = false;
-
optimise.automatic = true;
-
registry = lib.mapAttrs (_: flake: { inherit flake; }) flakeInputs;
-
nixPath = lib.mapAttrsToList (n: _: "${n}=flake:${n}") flakeInputs;
-
};
-
-
time.timeZone = "America/New_York";
-
-
environment.systemPackages = with pkgs; [
-
# core
-
coreutils
-
screen
-
bc
-
jq
-
psmisc
-
# cli_utils
-
direnv
-
zsh
-
gum
-
vim
-
# networking
-
xh
-
curl
-
wget
-
dogdns
-
inetutils
-
mosh
-
# nix_tools
-
inputs.nixvim.packages.aarch64-linux.default
-
nixd
-
nil
-
nixfmt-rfc-style
-
inputs.agenix.packages.aarch64-linux.default
-
# security
-
openssl
-
gpgme
-
gnupg
-
# dev_langs
-
nodejs_22
-
unstable.bun
-
python3
-
go
-
gopls
-
gotools
-
go-tools
-
gcc
-
# misc
-
neofetch
-
git
-
];
-
-
programs.nh = {
-
enable = true;
-
clean.enable = true;
-
clean.extraArgs = "--keep-since 4d --keep 3";
-
flake = "/home/kierank/dots";
-
};
-
-
age.identityPaths = [
-
"/home/kierank/.ssh/id_rsa"
-
"/etc/ssh/id_rsa"
-
];
-
age.secrets = {
-
wakatime = {
-
file = ../../secrets/wakatime.age;
-
path = "/home/kierank/.wakatime.cfg";
-
owner = "kierank";
-
};
-
cachet = {
-
file = ../../secrets/cachet.age;
-
owner = "cachet";
-
};
-
hn-alerts = {
-
file = ../../secrets/hn-alerts.age;
-
owner = "hn-alerts";
-
};
-
emojibot = {
-
file = ../../secrets/emojibot.age;
-
owner = "emojibot";
-
};
-
cloudflare = {
-
file = ../../secrets/cloudflare.age;
-
owner = "caddy";
-
};
-
github-knot-sync = {
-
file = ../../secrets/github-knot-sync.age;
-
owner = "git";
-
};
-
battleship-arena = {
-
file = ../../secrets/battleship-arena.age;
-
owner = "battleship-arena";
-
};
-
frp-auth-token = {
-
file = ../../secrets/frp-auth-token.age;
-
};
-
};
-
-
environment.sessionVariables = {
-
XDG_CACHE_HOME = "$HOME/.cache";
-
XDG_CONFIG_HOME = "$HOME/.config";
-
XDG_DATA_HOME = "$HOME/.local/share";
-
XDG_STATE_HOME = "$HOME/.local/state";
-
EDITOR = "nvim";
-
SYSTEMD_EDITOR = "nvim";
-
VISUAL = "nvim";
-
};
-
-
atelier = {
-
authentication.enable = true;
-
};
-
-
networking = {
-
hostName = "terebithia";
-
networkmanager.enable = true;
-
};
-
-
programs.zsh.enable = true;
-
programs.direnv.enable = true;
-
-
users.users = {
-
kierank = {
-
initialPassword = "changeme";
-
isNormalUser = true;
-
shell = pkgs.zsh;
-
openssh.authorizedKeys.keys = [
-
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzEEjvbL/ttqmYoDjxYQmDIq36BabROJoXgQKeh9liBxApwp+2PmgxROzTg42UrRc9pyrkq5kVfxG5hvkqCinhL1fMiowCSEs2L2/Cwi40g5ZU+QwdcwI8a4969kkI46PyB19RHkxg54OUORiIiso/WHGmqQsP+5wbV0+4riSnxwn/JXN4pmnE//stnyAyoiEZkPvBtwJjKb3Ni9n3eNLNs6gnaXrCtaygEZdebikr9kS2g9mM696HvIFgM6cdR/wZ7DcLbG3IdTXuHN7PC3xxL+Y4ek5iMreQIPmuvs4qslbthPGYoYbYLUQiRa9XO5s/ksIj5Z14f7anHE6cuTQVpvNWdGDOigyIVS5qU+4ZF7j+rifzOXVL48gmcAvw/uV68m5Wl/p0qsC/d8vI3GYwEsWG/EzpAlc07l8BU2LxWgN+d7uwBFaJV9VtmUDs5dcslsh8IbzmtC9gq3OLGjklxTfIl6qPiL8U33oc/UwqzvZUrI2BlbagvIZYy6rP+q0= kierank@mockingjay"
-
];
-
extraGroups = [
-
"wheel"
-
"networkmanager"
-
"services"
-
];
-
};
-
root.openssh.authorizedKeys.keys = [
-
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzEEjvbL/ttqmYoDjxYQmDIq36BabROJoXgQKeh9liBxApwp+2PmgxROzTg42UrRc9pyrkq5kVfxG5hvkqCinhL1fMiowCSEs2L2/Cwi40g5ZU+QwdcwI8a4969kkI46PyB19RHkxg54OUORiIiso/WHGmqQsP+5wbV0+4riSnxwn/JXN4pmnE//stnyAyoiEZkPvBtwJjKb3Ni9n3eNLNs6gnaXrCtaygEZdebikr9kS2g9mM696HvIFgM6cdR/wZ7DcLbG3IdTXuHN7PC3xxL+Y4ek5iMreQIPmuvs4qslbthPGYoYbYLUQiRa9XO5s/ksIj5Z14f7anHE6cuTQVpvNWdGDOigyIVS5qU+4ZF7j+rifzOXVL48gmcAvw/uV68m5Wl/p0qsC/d8vI3GYwEsWG/EzpAlc07l8BU2LxWgN+d7uwBFaJV9VtmUDs5dcslsh8IbzmtC9gq3OLGjklxTfIl6qPiL8U33oc/UwqzvZUrI2BlbagvIZYy6rP+q0= kierank@mockingjay"
-
];
-
};
-
-
# Allow passwordless sudo for wheel group (needed for deploy-rs)
-
security.sudo.wheelNeedsPassword = false;
-
-
services.openssh = {
-
enable = true;
-
openFirewall = true;
-
settings = {
-
PermitRootLogin = "no";
-
PasswordAuthentication = false;
-
};
-
};
-
-
networking.firewall = {
-
enable = true;
-
allowedTCPPorts = [
-
22
-
80
-
443
-
];
-
logRefusedConnections = false;
-
rejectPackets = true;
-
};
-
-
services.tailscale = {
-
enable = true;
-
useRoutingFeatures = "client";
-
};
-
-
services.caddy = {
-
enable = true;
-
package = pkgs.caddy.withPlugins {
-
plugins = [ "github.com/caddy-dns/cloudflare@v0.2.2" ];
-
hash = "sha256-ea8PC/+SlPRdEVVF/I3c1CBprlVp1nrumKM5cMwJJ3U=";
-
};
-
email = "me@dunkirk.sh";
-
globalConfig = ''
-
acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}
-
'';
-
virtualHosts."knot.dunkirk.sh" = {
-
extraConfig = ''
-
tls {
-
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
-
}
-
header {
-
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
-
}
-
reverse_proxy localhost:5555 {
-
header_up X-Forwarded-Proto {scheme}
-
header_up X-Forwarded-For {remote}
-
}
-
'';
-
};
-
virtualHosts."spindle.dunkirk.sh" = {
-
extraConfig = ''
-
tls {
-
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
-
}
-
header {
-
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
-
}
-
reverse_proxy localhost:6555 {
-
header_up X-Forwarded-Proto {scheme}
-
header_up X-Forwarded-For {remote}
-
}
-
'';
-
};
-
virtualHosts."emojibot.dunkirk.sh" = {
-
extraConfig = ''
-
tls {
-
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
-
}
-
header {
-
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
-
}
-
reverse_proxy localhost:3002 {
-
header_up X-Forwarded-Proto {scheme}
-
header_up X-Forwarded-For {remote}
-
}
-
'';
-
};
-
virtualHosts."battleship.dunkirk.sh" = {
-
extraConfig = ''
-
tls {
-
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
-
}
-
header {
-
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
-
}
-
reverse_proxy localhost:8081 {
-
header_up X-Forwarded-Proto {scheme}
-
header_up X-Forwarded-For {remote}
-
}
-
'';
-
};
-
extraConfig = ''
-
# Default response for unhandled domains
-
:80 {
-
respond "404 - Looks like this bridge doesn't have an end" 404
-
}
-
:443 {
-
respond "404 - Looks like this bridge doesn't have an end" 404
-
}
-
'';
-
};
-
-
systemd.services.caddy.serviceConfig = {
-
EnvironmentFile = config.age.secrets.cloudflare.path;
-
};
-
-
atelier.services.cachet = {
-
enable = true;
-
domain = "cachet.dunkirk.sh";
-
secretsFile = config.age.secrets.cachet.path;
-
};
-
-
atelier.services.hn-alerts = {
-
enable = true;
-
domain = "hn.dunkirk.sh";
-
secretsFile = config.age.secrets.hn-alerts.path;
-
};
-
-
atelier.services.emojibot = {
-
enable = true;
-
domain = "emojibot.dunkirk.sh";
-
secretsFile = config.age.secrets.emojibot.path;
-
};
-
-
atelier.services.battleship-arena = {
-
enable = true;
-
domain = "battleship.dunkirk.sh";
-
sshPort = 2222;
-
package = inputs.battleship-arena.packages.aarch64-linux.default;
-
secretsFile = config.age.secrets.battleship-arena.path;
-
};
-
-
services.tangled.knot = {
-
enable = true;
-
package = inputs.tangled.packages.aarch64-linux.knot;
-
appviewEndpoint = "https://tangled.org";
-
server = {
-
owner = "did:plc:krxbvxvis5skq7jj6eot23ul";
-
hostname = "knot.dunkirk.sh";
-
listenAddr = "127.0.0.1:5555";
-
};
-
};
-
-
services.tangled.spindle = {
-
enable = true;
-
package = inputs.tangled.packages.aarch64-linux.spindle;
-
server = {
-
owner = "did:plc:krxbvxvis5skq7jj6eot23ul";
-
hostname = "spindle.dunkirk.sh";
-
listenAddr = "127.0.0.1:6555";
-
};
-
};
-
-
atelier.services.knot-sync = {
-
enable = true;
-
secretsFile = config.age.secrets.github-knot-sync.path;
-
};
-
-
atelier.services.frps = {
-
enable = true;
-
domain = "bore.dunkirk.sh";
-
authTokenFile = config.age.secrets.frp-auth-token.path;
-
};
-
-
services.n8n = {
-
enable = true;
-
environment = {
-
N8N_HOST = "n8n.dunkirk.sh";
-
N8N_PROTOCOL = "https";
-
WEBHOOK_URL = "https://n8n.dunkirk.sh";
-
};
-
};
-
-
services.caddy.virtualHosts."n8n.dunkirk.sh" = {
-
extraConfig = ''
-
tls {
-
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
-
}
-
header {
-
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
-
}
-
reverse_proxy localhost:5678 {
-
header_up X-Forwarded-Proto {scheme}
-
header_up X-Forwarded-For {remote}
-
}
-
'';
-
};
-
-
boot.loader.systemd-boot.enable = true;
-
boot.loader.efi.canTouchEfiVariables = true;
-
boot.kernelParams = [ "console=ttyS0" ];
-
-
system.stateVersion = "23.05";
-
}
-32
machines/terebithia/disk-config.nix
···
-
{
-
disko.devices = {
-
disk = {
-
main = {
-
type = "disk";
-
device = "/dev/sda";
-
content = {
-
type = "gpt";
-
partitions = {
-
boot = {
-
size = "512M";
-
type = "EF00";
-
content = {
-
type = "filesystem";
-
format = "vfat";
-
mountpoint = "/boot";
-
};
-
};
-
root = {
-
size = "100%";
-
content = {
-
type = "filesystem";
-
format = "ext4";
-
mountpoint = "/";
-
};
-
};
-
};
-
};
-
};
-
};
-
};
-
}
-3449
machines/terebithia/facter.json
···
-
{
-
"version": 1,
-
"system": "aarch64-linux",
-
"virtualisation": "kvm",
-
"hardware": {
-
"bridge": [
-
{
-
"index": 7,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 3
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.1",
-
"sysfs_bus_id": "0000:00:03.1",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 48,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318775296,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 1,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 2,
-
"irq": 48,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 8,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 4
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.4",
-
"sysfs_bus_id": "0000:00:04.4",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 45,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318820352,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 4,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 13,
-
"irq": 45,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 9,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 5
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:05.7",
-
"sysfs_bus_id": "0000:00:05.7",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 46,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318865408,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 7,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 24,
-
"irq": 46,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 10,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 4
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.2",
-
"sysfs_bus_id": "0000:00:04.2",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 45,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318812160,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 2,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 11,
-
"irq": 45,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 12,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 5
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:05.5",
-
"sysfs_bus_id": "0000:00:05.5",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 46,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318857216,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 5,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 22,
-
"irq": 46,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 13,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 4
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.0",
-
"sysfs_bus_id": "0000:00:04.0",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 45,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318803968,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 0,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 9,
-
"irq": 45,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 14,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 3
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.6",
-
"sysfs_bus_id": "0000:00:03.6",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 48,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318795776,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 6,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 7,
-
"irq": 48,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 15,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 5
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:05.3",
-
"sysfs_bus_id": "0000:00:05.3",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 46,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318849024,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 3,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 20,
-
"irq": 46,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 16,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 3
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.4",
-
"sysfs_bus_id": "0000:00:03.4",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 48,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318787584,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 4,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 5,
-
"irq": 48,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 17,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 5
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:05.1",
-
"sysfs_bus_id": "0000:00:05.1",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 46,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318840832,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 1,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 18,
-
"irq": 46,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 18,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 4
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.7",
-
"sysfs_bus_id": "0000:00:04.7",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 45,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318832640,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 7,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 16,
-
"irq": 45,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 19,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 3
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.2",
-
"sysfs_bus_id": "0000:00:03.2",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 48,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318779392,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 2,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 3,
-
"irq": 48,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 20,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 0
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "Host bridge",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1af4",
-
"value": 6900
-
},
-
"device": {
-
"hex": "0008",
-
"value": 8
-
},
-
"sub_device": {
-
"hex": "1100",
-
"value": 4352
-
},
-
"model": "Host bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:00.0",
-
"sysfs_bus_id": "0000:00:00.0",
-
"detail": {
-
"function": 0,
-
"command": 0,
-
"header_type": 0,
-
"secondary_bus": 0,
-
"irq": 0,
-
"prog_if": 0
-
},
-
"module_alias": "pci:v00001B36d00000008sv00001AF4sd00001100bc06sc00i00"
-
},
-
{
-
"index": 22,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 4
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.5",
-
"sysfs_bus_id": "0000:00:04.5",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 45,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318824448,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 5,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 14,
-
"irq": 45,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 23,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 3
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.0",
-
"sysfs_bus_id": "0000:00:03.0",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 48,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318771200,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 0,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 1,
-
"irq": 48,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 24,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 4
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.3",
-
"sysfs_bus_id": "0000:00:04.3",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 45,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318816256,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 3,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 12,
-
"irq": 45,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 26,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 5
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:05.6",
-
"sysfs_bus_id": "0000:00:05.6",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 46,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318861312,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 6,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 23,
-
"irq": 46,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 27,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 4
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.1",
-
"sysfs_bus_id": "0000:00:04.1",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 45,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318808064,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 1,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 10,
-
"irq": 45,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 28,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 3
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.7",
-
"sysfs_bus_id": "0000:00:03.7",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 48,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318799872,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 7,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 8,
-
"irq": 48,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 29,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 5
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:05.4",
-
"sysfs_bus_id": "0000:00:05.4",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 46,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318853120,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 4,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 21,
-
"irq": 46,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 30,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 3
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.5",
-
"sysfs_bus_id": "0000:00:03.5",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 48,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318791680,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 5,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 6,
-
"irq": 48,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 31,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 5
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:05.2",
-
"sysfs_bus_id": "0000:00:05.2",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 46,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318844928,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 2,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 19,
-
"irq": 46,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 33,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 3
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:03.3",
-
"sysfs_bus_id": "0000:00:03.3",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 48,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318783488,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 3,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 4,
-
"irq": 48,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 34,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 5
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:05.0",
-
"sysfs_bus_id": "0000:00:05.0",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 46,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318836736,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 0,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 17,
-
"irq": 46,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
},
-
{
-
"index": 35,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"bridge"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 4
-
},
-
"base_class": {
-
"hex": "0006",
-
"name": "Bridge",
-
"value": 6
-
},
-
"sub_class": {
-
"hex": "0004",
-
"name": "PCI bridge",
-
"value": 4
-
},
-
"pci_interface": {
-
"hex": "0000",
-
"name": "Normal decode",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"device": {
-
"hex": "000c",
-
"value": 12
-
},
-
"sub_device": {
-
"hex": "0000",
-
"value": 0
-
},
-
"model": "PCI bridge",
-
"sysfs_id": "/devices/pci0000:00/0000:00:04.6",
-
"sysfs_bus_id": "0000:00:04.6",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 45,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318828544,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 6,
-
"command": 1030,
-
"header_type": 1,
-
"secondary_bus": 15,
-
"irq": 45,
-
"prog_if": 0
-
},
-
"driver": "pcieport",
-
"driver_module": "pcieportdrv",
-
"drivers": [
-
"pcieport"
-
],
-
"driver_modules": [
-
"pcieportdrv"
-
],
-
"module_alias": "pci:v00001B36d0000000Csv00001B36sd00000000bc06sc04i00"
-
}
-
],
-
"cpu": [
-
{
-
"architecture": "aarch64",
-
"vendor_name": "ARM Limited",
-
"family": 3,
-
"model": 1,
-
"stepping": 0,
-
"features": [
-
"fp",
-
"asimd",
-
"evtstrm",
-
"aes",
-
"pmull",
-
"sha1",
-
"sha2",
-
"crc32",
-
"atomics",
-
"fphp",
-
"asimdhp",
-
"cpuid",
-
"asimdrdm",
-
"lrcpc",
-
"dcpop",
-
"asimddp"
-
],
-
"bogo": 50,
-
"physical_id": 0,
-
"fpu": false,
-
"fpu_exception": false,
-
"write_protect": false,
-
"address_sizes": {
-
"physical": "0x0",
-
"virtual": "0x0"
-
}
-
}
-
],
-
"disk": [
-
{
-
"index": 40,
-
"attached_to": 37,
-
"class_list": [
-
"disk",
-
"scsi",
-
"block_device"
-
],
-
"bus_type": {
-
"hex": "0084",
-
"name": "SCSI",
-
"value": 132
-
},
-
"slot": {
-
"bus": 0,
-
"number": 0
-
},
-
"base_class": {
-
"hex": "0106",
-
"name": "Mass Storage Device",
-
"value": 262
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "Disk",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "0000",
-
"name": "ORACLE",
-
"value": 0
-
},
-
"device": {
-
"hex": "0000",
-
"name": "BlockVolume",
-
"value": 0
-
},
-
"revision": {
-
"hex": "0000",
-
"name": "1.0",
-
"value": 0
-
},
-
"model": "ORACLE BlockVolume",
-
"sysfs_id": "/class/block/sda",
-
"sysfs_bus_id": "0:0:0:1",
-
"sysfs_device_link": "/devices/pci0000:00/0000:00:05.7/0000:18:00.0/virtio2/host0/target0:0:0/0:0:0:1",
-
"unix_device_name": "/dev/sda",
-
"unix_device_number": {
-
"type": 98,
-
"major": 8,
-
"minor": 0,
-
"range": 16
-
},
-
"unix_device_names": [
-
"/dev/disk/by-id/scsi-3603b6fa6f58b438fb2a97299de94a79f",
-
"/dev/disk/by-id/wwn-0x603b6fa6f58b438fb2a97299de94a79f",
-
"/dev/disk/by-path/pci-0000:18:00.0-scsi-0:0:0:1",
-
"/dev/sda"
-
],
-
"unix_device_name2": "/dev/sg0",
-
"unix_device_number2": {
-
"type": 99,
-
"major": 21,
-
"minor": 0,
-
"range": 1
-
},
-
"resources": [
-
{
-
"type": "disk_geo",
-
"cylinders": 19581,
-
"heads": 255,
-
"sectors": 63,
-
"size": "0x0",
-
"geo_type": "logical"
-
},
-
{
-
"type": "size",
-
"unit": "sectors",
-
"value_1": 314572800,
-
"value_2": 512
-
}
-
],
-
"driver": "virtio_scsi",
-
"driver_module": "virtio_scsi",
-
"drivers": [
-
"sd",
-
"virtio_scsi"
-
],
-
"driver_modules": [
-
"virtio_scsi"
-
]
-
}
-
],
-
"graphics_card": [
-
{
-
"index": 11,
-
"attached_to": 0,
-
"class_list": [
-
"graphics_card",
-
"pci"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 1
-
},
-
"base_class": {
-
"hex": "0003",
-
"name": "Display controller",
-
"value": 3
-
},
-
"sub_class": {
-
"hex": "0080",
-
"name": "Display controller",
-
"value": 128
-
},
-
"vendor": {
-
"hex": "1af4",
-
"value": 6900
-
},
-
"sub_vendor": {
-
"hex": "108e",
-
"value": 4238
-
},
-
"device": {
-
"hex": "1050",
-
"value": 4176
-
},
-
"sub_device": {
-
"hex": "1100",
-
"value": 4352
-
},
-
"revision": {
-
"hex": "0001",
-
"value": 1
-
},
-
"model": "Display controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:01.0",
-
"sysfs_bus_id": "0000:00:01.0",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 46,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318767104,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
},
-
{
-
"type": "mem",
-
"base": 549806145536,
-
"range": 16384,
-
"enabled": true,
-
"access": "read_only",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 0,
-
"command": 1030,
-
"header_type": 0,
-
"secondary_bus": 0,
-
"irq": 46,
-
"prog_if": 0
-
},
-
"driver": "virtio-pci",
-
"driver_module": "virtio_pci",
-
"drivers": [
-
"virtio-pci"
-
],
-
"driver_modules": [
-
"virtio_pci"
-
],
-
"module_alias": "pci:v00001AF4d00001050sv0000108Esd00001100bc03sc80i00"
-
}
-
],
-
"hub": [
-
{
-
"index": 43,
-
"attached_to": 32,
-
"class_list": [
-
"usb",
-
"hub"
-
],
-
"bus_type": {
-
"hex": "0086",
-
"name": "USB",
-
"value": 134
-
},
-
"slot": {
-
"bus": 0,
-
"number": 0
-
},
-
"base_class": {
-
"hex": "010a",
-
"name": "Hub",
-
"value": 266
-
},
-
"vendor": {
-
"hex": "1d6b",
-
"name": "Linux 6.14.10 xhci-hcd",
-
"value": 7531
-
},
-
"device": {
-
"hex": "0002",
-
"name": "xHCI Host Controller",
-
"value": 2
-
},
-
"revision": {
-
"hex": "0000",
-
"name": "6.14",
-
"value": 0
-
},
-
"serial": "0000:00:02.0",
-
"model": "Linux 6.14.10 xhci-hcd xHCI Host Controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:02.0/usb1/1-0:1.0",
-
"sysfs_bus_id": "1-0:1.0",
-
"resources": [
-
{
-
"type": "baud",
-
"speed": 480000000,
-
"bits": 0,
-
"stop_bits": 0,
-
"parity": 0,
-
"handshake": 0
-
}
-
],
-
"detail": {
-
"device_class": {
-
"hex": "0009",
-
"name": "hub",
-
"value": 9
-
},
-
"device_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"device_protocol": 1,
-
"interface_class": {
-
"hex": "0009",
-
"name": "hub",
-
"value": 9
-
},
-
"interface_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"interface_protocol": 0,
-
"interface_number": 0,
-
"interface_alternate_setting": 0
-
},
-
"hotplug": "usb",
-
"driver": "hub",
-
"driver_module": "usbcore",
-
"drivers": [
-
"hub"
-
],
-
"driver_modules": [
-
"usbcore"
-
],
-
"module_alias": "usb:v1D6Bp0002d0614dc09dsc00dp01ic09isc00ip00in00"
-
},
-
{
-
"index": 45,
-
"attached_to": 32,
-
"class_list": [
-
"usb",
-
"hub"
-
],
-
"bus_type": {
-
"hex": "0086",
-
"name": "USB",
-
"value": 134
-
},
-
"slot": {
-
"bus": 0,
-
"number": 0
-
},
-
"base_class": {
-
"hex": "010a",
-
"name": "Hub",
-
"value": 266
-
},
-
"vendor": {
-
"hex": "1d6b",
-
"name": "Linux 6.14.10 xhci-hcd",
-
"value": 7531
-
},
-
"device": {
-
"hex": "0003",
-
"name": "xHCI Host Controller",
-
"value": 3
-
},
-
"revision": {
-
"hex": "0000",
-
"name": "6.14",
-
"value": 0
-
},
-
"serial": "0000:00:02.0",
-
"model": "Linux 6.14.10 xhci-hcd xHCI Host Controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:02.0/usb2/2-0:1.0",
-
"sysfs_bus_id": "2-0:1.0",
-
"detail": {
-
"device_class": {
-
"hex": "0009",
-
"name": "hub",
-
"value": 9
-
},
-
"device_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"device_protocol": 3,
-
"interface_class": {
-
"hex": "0009",
-
"name": "hub",
-
"value": 9
-
},
-
"interface_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"interface_protocol": 0,
-
"interface_number": 0,
-
"interface_alternate_setting": 0
-
},
-
"hotplug": "usb",
-
"driver": "hub",
-
"driver_module": "usbcore",
-
"drivers": [
-
"hub"
-
],
-
"driver_modules": [
-
"usbcore"
-
],
-
"module_alias": "usb:v1D6Bp0003d0614dc09dsc00dp03ic09isc00ip00in00"
-
}
-
],
-
"keyboard": [
-
{
-
"index": 41,
-
"attached_to": 43,
-
"class_list": [
-
"keyboard",
-
"usb"
-
],
-
"bus_type": {
-
"hex": "0086",
-
"name": "USB",
-
"value": 134
-
},
-
"slot": {
-
"bus": 0,
-
"number": 0
-
},
-
"base_class": {
-
"hex": "0108",
-
"name": "Keyboard",
-
"value": 264
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "Keyboard",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "0627",
-
"name": "QEMU",
-
"value": 1575
-
},
-
"device": {
-
"hex": "0001",
-
"name": "QEMU USB Keyboard",
-
"value": 1
-
},
-
"serial": "68284-0000:00:02.0-2",
-
"model": "QEMU USB Keyboard",
-
"sysfs_id": "/devices/pci0000:00/0000:00:02.0/usb1/1-2/1-2:1.0",
-
"sysfs_bus_id": "1-2:1.0",
-
"unix_device_name": "/dev/input/event2",
-
"unix_device_number": {
-
"type": 99,
-
"major": 13,
-
"minor": 66,
-
"range": 1
-
},
-
"unix_device_names": [
-
"/dev/input/by-id/usb-QEMU_QEMU_USB_Keyboard_68284-0000:00:02.0-2-event-kbd",
-
"/dev/input/by-path/pci-0000:00:02.0-usb-0:2:1.0-event-kbd",
-
"/dev/input/by-path/pci-0000:00:02.0-usbv2-0:2:1.0-event-kbd",
-
"/dev/input/event2"
-
],
-
"resources": [
-
{
-
"type": "baud",
-
"speed": 480000000,
-
"bits": 0,
-
"stop_bits": 0,
-
"parity": 0,
-
"handshake": 0
-
}
-
],
-
"detail": {
-
"device_class": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"device_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"device_protocol": 0,
-
"interface_class": {
-
"hex": "0003",
-
"name": "hid",
-
"value": 3
-
},
-
"interface_subclass": {
-
"hex": "0001",
-
"name": "audio",
-
"value": 1
-
},
-
"interface_protocol": 1,
-
"interface_number": 0,
-
"interface_alternate_setting": 0
-
},
-
"hotplug": "usb",
-
"driver": "usbhid",
-
"driver_module": "usbhid",
-
"drivers": [
-
"usbhid"
-
],
-
"driver_modules": [
-
"usbhid"
-
],
-
"driver_info": {
-
"type": "keyboard",
-
"xkb_rules": "xfree86"
-
},
-
"module_alias": "usb:v0627p0001d0000dc00dsc00dp00ic03isc01ip01in00"
-
}
-
],
-
"memory": [
-
{
-
"index": 6,
-
"attached_to": 0,
-
"class_list": [
-
"memory"
-
],
-
"base_class": {
-
"hex": "0101",
-
"name": "Internally Used Class",
-
"value": 257
-
},
-
"sub_class": {
-
"hex": "0002",
-
"name": "Main Memory",
-
"value": 2
-
},
-
"model": "Main Memory",
-
"resources": [
-
{
-
"type": "mem",
-
"base": 0,
-
"range": 25128050688,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "unknown"
-
},
-
{
-
"type": "phys_mem",
-
"range": 25769803776
-
}
-
]
-
}
-
],
-
"monitor": [
-
{
-
"index": 39,
-
"attached_to": 11,
-
"class_list": [
-
"monitor"
-
],
-
"base_class": {
-
"hex": "0100",
-
"name": "Monitor",
-
"value": 256
-
},
-
"sub_class": {
-
"hex": "0002",
-
"name": "LCD Monitor",
-
"value": 2
-
},
-
"vendor": {
-
"hex": "4914",
-
"value": 18708
-
},
-
"device": {
-
"hex": "1234",
-
"name": "QEMU Monitor",
-
"value": 4660
-
},
-
"serial": "0",
-
"model": "QEMU Monitor",
-
"resources": [
-
{
-
"type": "monitor",
-
"width": 1024,
-
"height": 768,
-
"vertical_frequency": 60,
-
"interlaced": false
-
},
-
{
-
"type": "monitor",
-
"width": 1280,
-
"height": 800,
-
"vertical_frequency": 60,
-
"interlaced": false
-
},
-
{
-
"type": "monitor",
-
"width": 1600,
-
"height": 1200,
-
"vertical_frequency": 60,
-
"interlaced": false
-
},
-
{
-
"type": "monitor",
-
"width": 1920,
-
"height": 1080,
-
"vertical_frequency": 60,
-
"interlaced": false
-
},
-
{
-
"type": "monitor",
-
"width": 2048,
-
"height": 1152,
-
"vertical_frequency": 60,
-
"interlaced": false
-
},
-
{
-
"type": "monitor",
-
"width": 640,
-
"height": 480,
-
"vertical_frequency": 60,
-
"interlaced": false
-
},
-
{
-
"type": "monitor",
-
"width": 800,
-
"height": 600,
-
"vertical_frequency": 60,
-
"interlaced": false
-
},
-
{
-
"type": "size",
-
"unit": "mm",
-
"value_1": 325,
-
"value_2": 203
-
}
-
],
-
"detail": {
-
"manufacture_year": 2014,
-
"manufacture_week": 42,
-
"vertical_sync": {
-
"min": 50,
-
"max": 125
-
},
-
"horizontal_sync": {
-
"min": 30,
-
"max": 160
-
},
-
"horizontal_sync_timings": {
-
"disp": 1280,
-
"sync_start": 1600,
-
"sync_end": 1638,
-
"total": 1728
-
},
-
"vertical_sync_timings": {
-
"disp": 800,
-
"sync_start": 804,
-
"sync_end": 808,
-
"total": 828
-
},
-
"clock": 107300,
-
"width": 1280,
-
"height": 800,
-
"width_millimetres": 325,
-
"height_millimetres": 203,
-
"horizontal_flag": 45,
-
"vertical_flag": 45,
-
"vendor": "",
-
"name": "QEMU Monitor"
-
},
-
"driver_info": {
-
"type": "display",
-
"width": 2048,
-
"height": 1152,
-
"vertical_sync": {
-
"min": 50,
-
"max": 125
-
},
-
"horizontal_sync": {
-
"min": 30,
-
"max": 160
-
},
-
"bandwidth": 0,
-
"horizontal_sync_timings": {
-
"disp": 1280,
-
"sync_start": 1600,
-
"sync_end": 1638,
-
"total": 1728
-
},
-
"vertical_sync_timings": {
-
"disp": 800,
-
"sync_start": 804,
-
"sync_end": 808,
-
"total": 828
-
},
-
"horizontal_flag": 45,
-
"vertical_flag": 45
-
}
-
}
-
],
-
"mouse": [
-
{
-
"index": 42,
-
"attached_to": 43,
-
"class_list": [
-
"mouse",
-
"usb"
-
],
-
"bus_type": {
-
"hex": "0086",
-
"name": "USB",
-
"value": 134
-
},
-
"slot": {
-
"bus": 0,
-
"number": 0
-
},
-
"base_class": {
-
"hex": "0105",
-
"name": "Mouse",
-
"value": 261
-
},
-
"sub_class": {
-
"hex": "0003",
-
"name": "USB Mouse",
-
"value": 3
-
},
-
"vendor": {
-
"hex": "0627",
-
"name": "QEMU",
-
"value": 1575
-
},
-
"device": {
-
"hex": "0001",
-
"name": "QEMU USB Mouse",
-
"value": 1
-
},
-
"serial": "89126-0000:00:02.0-3",
-
"compat_vendor": "Unknown",
-
"compat_device": "Generic USB Mouse",
-
"model": "QEMU USB Mouse",
-
"sysfs_id": "/devices/pci0000:00/0000:00:02.0/usb1/1-3/1-3:1.0",
-
"sysfs_bus_id": "1-3:1.0",
-
"unix_device_name": "/dev/input/mice",
-
"unix_device_number": {
-
"type": 99,
-
"major": 13,
-
"minor": 63,
-
"range": 1
-
},
-
"unix_device_names": [
-
"/dev/input/mice"
-
],
-
"unix_device_name2": "/dev/input/mouse1",
-
"unix_device_number2": {
-
"type": 99,
-
"major": 13,
-
"minor": 33,
-
"range": 1
-
},
-
"resources": [
-
{
-
"type": "baud",
-
"speed": 480000000,
-
"bits": 0,
-
"stop_bits": 0,
-
"parity": 0,
-
"handshake": 0
-
}
-
],
-
"detail": {
-
"device_class": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"device_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"device_protocol": 0,
-
"interface_class": {
-
"hex": "0003",
-
"name": "hid",
-
"value": 3
-
},
-
"interface_subclass": {
-
"hex": "0001",
-
"name": "audio",
-
"value": 1
-
},
-
"interface_protocol": 2,
-
"interface_number": 0,
-
"interface_alternate_setting": 0
-
},
-
"hotplug": "usb",
-
"driver": "usbhid",
-
"driver_module": "usbhid",
-
"drivers": [
-
"usbhid"
-
],
-
"driver_modules": [
-
"usbhid"
-
],
-
"driver_info": {
-
"type": "mouse",
-
"db_entry_0": [
-
"explorerps/2",
-
"exps2"
-
],
-
"xf86": "explorerps/2",
-
"gpm": "exps2",
-
"buttons": -1,
-
"wheels": -1
-
},
-
"module_alias": "usb:v0627p0001d0000dc00dsc00dp00ic03isc01ip02in00"
-
},
-
{
-
"index": 44,
-
"attached_to": 43,
-
"class_list": [
-
"mouse",
-
"usb"
-
],
-
"bus_type": {
-
"hex": "0086",
-
"name": "USB",
-
"value": 134
-
},
-
"slot": {
-
"bus": 0,
-
"number": 0
-
},
-
"base_class": {
-
"hex": "0105",
-
"name": "Mouse",
-
"value": 261
-
},
-
"sub_class": {
-
"hex": "0003",
-
"name": "USB Mouse",
-
"value": 3
-
},
-
"vendor": {
-
"hex": "0627",
-
"name": "QEMU",
-
"value": 1575
-
},
-
"device": {
-
"hex": "0001",
-
"name": "QEMU USB Tablet",
-
"value": 1
-
},
-
"serial": "28754-0000:00:02.0-1",
-
"compat_vendor": "Unknown",
-
"compat_device": "Generic USB Mouse",
-
"model": "QEMU USB Tablet",
-
"sysfs_id": "/devices/pci0000:00/0000:00:02.0/usb1/1-1/1-1:1.0",
-
"sysfs_bus_id": "1-1:1.0",
-
"unix_device_name": "/dev/input/mice",
-
"unix_device_number": {
-
"type": 99,
-
"major": 13,
-
"minor": 63,
-
"range": 1
-
},
-
"unix_device_names": [
-
"/dev/input/mice"
-
],
-
"unix_device_name2": "/dev/input/mouse0",
-
"unix_device_number2": {
-
"type": 99,
-
"major": 13,
-
"minor": 32,
-
"range": 1
-
},
-
"resources": [
-
{
-
"type": "baud",
-
"speed": 480000000,
-
"bits": 0,
-
"stop_bits": 0,
-
"parity": 0,
-
"handshake": 0
-
}
-
],
-
"detail": {
-
"device_class": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"device_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"device_protocol": 0,
-
"interface_class": {
-
"hex": "0003",
-
"name": "hid",
-
"value": 3
-
},
-
"interface_subclass": {
-
"hex": "0000",
-
"name": "per_interface",
-
"value": 0
-
},
-
"interface_protocol": 0,
-
"interface_number": 0,
-
"interface_alternate_setting": 0
-
},
-
"hotplug": "usb",
-
"driver": "usbhid",
-
"driver_module": "usbhid",
-
"drivers": [
-
"usbhid"
-
],
-
"driver_modules": [
-
"usbhid"
-
],
-
"driver_info": {
-
"type": "mouse",
-
"db_entry_0": [
-
"explorerps/2",
-
"exps2"
-
],
-
"xf86": "explorerps/2",
-
"gpm": "exps2",
-
"buttons": -1,
-
"wheels": -1
-
},
-
"module_alias": "usb:v0627p0001d0000dc00dsc00dp00ic03isc00ip00in00"
-
}
-
],
-
"network_controller": [
-
{
-
"index": 36,
-
"attached_to": 25,
-
"class_list": [
-
"network_controller"
-
],
-
"bus_type": {
-
"hex": "008f",
-
"name": "Virtio",
-
"value": 143
-
},
-
"slot": {
-
"bus": 0,
-
"number": 0
-
},
-
"base_class": {
-
"hex": "0002",
-
"name": "Network controller",
-
"value": 2
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "Ethernet controller",
-
"value": 0
-
},
-
"vendor": "Virtio",
-
"device": "Ethernet Card 0",
-
"model": "Virtio Ethernet Card 0",
-
"sysfs_id": "/devices/pci0000:00/0000:00:06.0/virtio1",
-
"sysfs_bus_id": "virtio1",
-
"unix_device_name": "enp0s6",
-
"unix_device_names": [
-
"enp0s6"
-
],
-
"resources": [
-
{
-
"type": "hwaddr",
-
"address": 48
-
},
-
{
-
"type": "phwaddr",
-
"address": 48
-
}
-
],
-
"driver": "virtio_net",
-
"drivers": [
-
"virtio_net"
-
],
-
"module_alias": "virtio:d00000001v0000108E"
-
}
-
],
-
"network_interface": [
-
{
-
"index": 46,
-
"attached_to": 0,
-
"class_list": [
-
"network_interface"
-
],
-
"base_class": {
-
"hex": "0107",
-
"name": "Network Interface",
-
"value": 263
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "Loopback",
-
"value": 0
-
},
-
"model": "Loopback network interface",
-
"sysfs_id": "/class/net/lo",
-
"unix_device_name": "lo",
-
"unix_device_names": [
-
"lo"
-
]
-
},
-
{
-
"index": 47,
-
"attached_to": 36,
-
"class_list": [
-
"network_interface"
-
],
-
"base_class": {
-
"hex": "0107",
-
"name": "Network Interface",
-
"value": 263
-
},
-
"sub_class": {
-
"hex": "0001",
-
"name": "Ethernet",
-
"value": 1
-
},
-
"model": "Ethernet network interface",
-
"sysfs_id": "/class/net/enp0s6",
-
"sysfs_device_link": "/devices/pci0000:00/0000:00:06.0/virtio1",
-
"unix_device_name": "enp0s6",
-
"unix_device_names": [
-
"enp0s6"
-
],
-
"resources": [
-
{
-
"type": "hwaddr",
-
"address": 48
-
},
-
{
-
"type": "phwaddr",
-
"address": 48
-
}
-
],
-
"driver": "virtio_net",
-
"drivers": [
-
"virtio_net"
-
]
-
}
-
],
-
"pci": [
-
{
-
"index": 25,
-
"attached_to": 0,
-
"class_list": [
-
"pci",
-
"unknown"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 6
-
},
-
"base_class": {
-
"hex": "0002",
-
"name": "Network controller",
-
"value": 2
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "Ethernet controller",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1af4",
-
"value": 6900
-
},
-
"sub_vendor": {
-
"hex": "108e",
-
"value": 4238
-
},
-
"device": {
-
"hex": "1041",
-
"value": 4161
-
},
-
"sub_device": {
-
"hex": "1100",
-
"value": 4352
-
},
-
"revision": {
-
"hex": "0001",
-
"value": 1
-
},
-
"model": "Ethernet controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:06.0",
-
"sysfs_bus_id": "0000:00:06.0",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 47,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 318869504,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
},
-
{
-
"type": "mem",
-
"base": 549806178304,
-
"range": 16384,
-
"enabled": true,
-
"access": "read_only",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 0,
-
"command": 1030,
-
"header_type": 0,
-
"secondary_bus": 0,
-
"irq": 47,
-
"prog_if": 0
-
},
-
"driver": "virtio-pci",
-
"driver_module": "virtio_pci",
-
"drivers": [
-
"virtio-pci"
-
],
-
"driver_modules": [
-
"virtio_pci"
-
],
-
"module_alias": "pci:v00001AF4d00001041sv0000108Esd00001100bc02sc00i00"
-
}
-
],
-
"storage_controller": [
-
{
-
"index": 21,
-
"attached_to": 9,
-
"class_list": [
-
"storage_controller",
-
"pci"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 24,
-
"number": 0
-
},
-
"base_class": {
-
"hex": "0001",
-
"name": "Mass storage controller",
-
"value": 1
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "SCSI storage controller",
-
"value": 0
-
},
-
"vendor": {
-
"hex": "1af4",
-
"value": 6900
-
},
-
"sub_vendor": {
-
"hex": "108e",
-
"value": 4238
-
},
-
"device": {
-
"hex": "1048",
-
"value": 4168
-
},
-
"sub_device": {
-
"hex": "1100",
-
"value": 4352
-
},
-
"revision": {
-
"hex": "0001",
-
"value": 1
-
},
-
"model": "SCSI storage controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:05.7/0000:18:00.0",
-
"sysfs_bus_id": "0000:18:00.0",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 46,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 316669952,
-
"range": 4096,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
},
-
{
-
"type": "mem",
-
"base": 549804048384,
-
"range": 16384,
-
"enabled": true,
-
"access": "read_only",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 0,
-
"command": 1030,
-
"header_type": 0,
-
"secondary_bus": 0,
-
"irq": 46,
-
"prog_if": 0
-
},
-
"driver": "virtio-pci",
-
"driver_module": "virtio_pci",
-
"drivers": [
-
"virtio-pci"
-
],
-
"driver_modules": [
-
"virtio_pci"
-
],
-
"module_alias": "pci:v00001AF4d00001048sv0000108Esd00001100bc01sc00i00"
-
}
-
],
-
"system": {},
-
"unknown": [
-
{
-
"index": 37,
-
"attached_to": 21,
-
"class_list": [
-
"unknown"
-
],
-
"base_class": {
-
"hex": "0000",
-
"name": "Unclassified device",
-
"value": 0
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "Unclassified device",
-
"value": 0
-
},
-
"vendor": "Virtio",
-
"device": "",
-
"model": "Virtio Unclassified device",
-
"sysfs_id": "/devices/pci0000:00/0000:00:05.7/0000:18:00.0/virtio2",
-
"sysfs_bus_id": "virtio2",
-
"driver": "virtio_scsi",
-
"driver_module": "virtio_scsi",
-
"drivers": [
-
"virtio_scsi"
-
],
-
"driver_modules": [
-
"virtio_scsi"
-
],
-
"module_alias": "virtio:d00000008v0000108E"
-
},
-
{
-
"index": 38,
-
"attached_to": 11,
-
"class_list": [
-
"unknown"
-
],
-
"base_class": {
-
"hex": "0000",
-
"name": "Unclassified device",
-
"value": 0
-
},
-
"sub_class": {
-
"hex": "0000",
-
"name": "Unclassified device",
-
"value": 0
-
},
-
"vendor": "Virtio",
-
"device": "",
-
"model": "Virtio Unclassified device",
-
"sysfs_id": "/devices/pci0000:00/0000:00:01.0/virtio0",
-
"sysfs_bus_id": "virtio0",
-
"driver": "virtio_gpu",
-
"driver_module": "virtio_gpu",
-
"drivers": [
-
"virtio_gpu"
-
],
-
"driver_modules": [
-
"virtio_gpu"
-
],
-
"module_alias": "virtio:d00000010v0000108E"
-
}
-
],
-
"usb_controller": [
-
{
-
"index": 32,
-
"attached_to": 0,
-
"class_list": [
-
"usb_controller",
-
"pci"
-
],
-
"bus_type": {
-
"hex": "0004",
-
"name": "PCI",
-
"value": 4
-
},
-
"slot": {
-
"bus": 0,
-
"number": 2
-
},
-
"base_class": {
-
"hex": "000c",
-
"name": "Serial bus controller",
-
"value": 12
-
},
-
"sub_class": {
-
"hex": "0003",
-
"name": "USB Controller",
-
"value": 3
-
},
-
"pci_interface": {
-
"hex": "0030",
-
"value": 48
-
},
-
"vendor": {
-
"hex": "1b36",
-
"value": 6966
-
},
-
"sub_vendor": {
-
"hex": "1af4",
-
"value": 6900
-
},
-
"device": {
-
"hex": "000d",
-
"value": 13
-
},
-
"sub_device": {
-
"hex": "1100",
-
"value": 4352
-
},
-
"revision": {
-
"hex": "0001",
-
"value": 1
-
},
-
"model": "USB Controller",
-
"sysfs_id": "/devices/pci0000:00/0000:00:02.0",
-
"sysfs_bus_id": "0000:00:02.0",
-
"resources": [
-
{
-
"type": "irq",
-
"base": 47,
-
"triggered": 0,
-
"enabled": true
-
},
-
{
-
"type": "mem",
-
"base": 549806161920,
-
"range": 16384,
-
"enabled": true,
-
"access": "read_write",
-
"prefetch": "no"
-
}
-
],
-
"detail": {
-
"function": 0,
-
"command": 1030,
-
"header_type": 0,
-
"secondary_bus": 0,
-
"irq": 47,
-
"prog_if": 48
-
},
-
"driver": "xhci_hcd",
-
"driver_module": "xhci_pci",
-
"drivers": [
-
"xhci_hcd"
-
],
-
"driver_modules": [
-
"xhci_pci"
-
],
-
"module_alias": "pci:v00001B36d0000000Dsv00001AF4sd00001100bc0Csc03i30"
-
}
-
]
-
},
-
"smbios": {}
-
}
-31
machines/terebithia/home/default.nix
···
-
{ inputs, ... }:
-
{
-
imports = [
-
(inputs.import-tree ../../../modules/home)
-
];
-
-
home = {
-
username = "kierank";
-
homeDirectory = "/home/kierank";
-
};
-
-
atelier = {
-
shell = {
-
enable = true;
-
};
-
apps = {
-
helix.enable = true;
-
irssi.enable = true;
-
};
-
ssh = {
-
enable = true;
-
zmx.enable = true;
-
};
-
};
-
-
programs.home-manager.enable = true;
-
-
systemd.user.startServices = "sd-switch";
-
-
home.stateVersion = "23.05";
-
}
-16
machines/terebithia/home-manager.nix
···
-
{ inputs, outputs, ... }:
-
{
-
imports = [
-
inputs.home-manager.nixosModules.home-manager
-
];
-
-
home-manager = {
-
useGlobalPkgs = true;
-
extraSpecialArgs = {
-
inherit inputs outputs;
-
};
-
users = {
-
kierank = import ./home;
-
};
-
};
-
}
-46
modules/home/aesthetics/theming.nix
···
-
{
-
lib,
-
inputs,
-
config,
-
...
-
}:
-
{
-
imports = [
-
inputs.catppuccin.homeModules.catppuccin
-
];
-
-
options.atelier.theming.enable = lib.mkEnableOption "Enable Catppuccin and GTK/QT themeing";
-
config = lib.mkIf config.atelier.theming.enable {
-
catppuccin = {
-
enable = true;
-
accent = "green";
-
flavor = "macchiato";
-
cursors = {
-
enable = true;
-
accent = "blue";
-
flavor = "macchiato";
-
};
-
gtk = {
-
enable = true;
-
tweaks = [ "normal" ];
-
};
-
qutebrowser.enable = true;
-
};
-
-
dconf.settings = {
-
"org/gnome/desktop/interface" = {
-
color-scheme = "prefer-dark";
-
};
-
};
-
-
gtk = {
-
enable = true;
-
};
-
-
qt = {
-
style.name = "kvantum";
-
platformTheme.name = "kvantum";
-
enable = true;
-
};
-
};
-
}
-45
modules/home/aesthetics/wallpapers.nix
···
-
{
-
lib,
-
config,
-
pkgs,
-
...
-
}:
-
{
-
options.atelier.wallpapers.enable = lib.mkEnableOption "symlink a bunch of wallpapers";
-
config = lib.mkIf config.atelier.wallpapers.enable {
-
home.packages = with pkgs; [
-
(writeShellScriptBin "chngwall" ''
-
#!/usr/bin/env bash
-
-
WALLPAPER_DIR="$HOME/.config/wallpapers"
-
CURRENT_WALL=$(hyprctl hyprpaper listloaded)
-
-
# Get a random wallpaper that is not the current one
-
WALLPAPER=$(find -L "$WALLPAPER_DIR" -type f ! -name "$(basename "$CURRENT_WALL")" | shuf -n 1)
-
-
# Apply the selected wallpaper
-
hyprctl hyprpaper reload ,"$WALLPAPER"
-
'')
-
];
-
-
xdg.configFile."wallpapers/acon-pier.jpg".source = ../../../dots/wallpapers/acon-pier.jpg;
-
xdg.configFile."wallpapers/acon-forest.jpg".source = ../../../dots/wallpapers/acon-forest.jpg;
-
xdg.configFile."wallpapers/acon-gradient-clouds.jpg".source =
-
../../../dots/wallpapers/acon-gradient-clouds.jpg;
-
xdg.configFile."wallpapers/acon-fsh.jpg".source = ../../../dots/wallpapers/acon-fsh.jpg;
-
xdg.configFile."wallpapers/tongyu-waves.jpg".source = ../../../dots/wallpapers/tongyu-waves.jpg;
-
xdg.configFile."wallpapers/acon-rocks.jpg".source = ../../../dots/wallpapers/acon-rocks.jpg;
-
xdg.configFile."wallpapers/kailing-comet.jpg".source = ../../../dots/wallpapers/kailing-comet.jpg;
-
xdg.configFile."wallpapers/acon-star.jpg".source = ../../../dots/wallpapers/acon-star.jpg;
-
xdg.configFile."wallpapers/kailing-canyon.jpg".source = ../../../dots/wallpapers/kailing-canyon.jpg;
-
xdg.configFile."wallpapers/kailing-swirls.jpg".source = ../../../dots/wallpapers/kailing-swirls.jpg;
-
xdg.configFile."wallpapers/highway.jpg".source = ../../../dots/wallpapers/highway.jpg;
-
xdg.configFile."wallpapers/kailing-shooting-star.jpg".source =
-
../../../dots/wallpapers/kailing-shooting-star.jpg;
-
xdg.configFile."wallpapers/yessa-cat.jpg".source = ../../../dots/wallpapers/yessa-cat.jpg;
-
xdg.configFile."wallpapers/annie-athena.jpg".source = ../../../dots/wallpapers/annie-athena.jpg;
-
xdg.configFile."wallpapers/candy-stained-glass.jpg".source =
-
../../../dots/wallpapers/candy-stained-glass.jpg;
-
xdg.configFile."wallpapers/tongyu-catcat.jpg".source = ../../../dots/wallpapers/tongyu-catcat.jpg;
-
};
-
}
-40
modules/home/apps/alacritty.nix
···
-
{ lib, config, ... }:
-
{
-
options.atelier.terminal.alacritty.enable = lib.mkEnableOption "Enable Alacritty terminal config";
-
config = lib.mkIf config.atelier.terminal.alacritty.enable {
-
catppuccin.alacritty.flavor = "mocha";
-
programs.alacritty = {
-
enable = true;
-
settings = {
-
general.live_config_reload = true;
-
cursor = {
-
unfocused_hollow = true;
-
style = {
-
blinking = "On";
-
};
-
};
-
window = {
-
opacity = 0.88;
-
padding = {
-
x = 12;
-
y = 12;
-
};
-
};
-
font = {
-
size = 13;
-
normal = {
-
family = "JetBrainsMono Nerd Font";
-
};
-
};
-
colors = {
-
normal = {
-
magenta = lib.mkForce "#db87c5";
-
};
-
primary = {
-
foreground = lib.mkForce "#ABB2BF";
-
};
-
};
-
};
-
};
-
};
-
}
-107
modules/home/apps/bore/bore.1.md
···
-
% BORE(1) bore 1.0
-
% Kieran Klukas
-
% December 2024
-
-
# NAME
-
-
bore - secure tunneling service for exposing local services to the internet
-
-
# SYNOPSIS
-
-
**bore** [*SUBDOMAIN*] [*PORT*] [**--label** *LABEL*] [**--save**]
-
-
**bore** **--list** | **-l**
-
-
**bore** **--saved** | **-s**
-
-
# DESCRIPTION
-
-
**bore** is a tunneling service that uses frp (fast reverse proxy) to expose local services to the internet via bore.dunkirk.sh. It provides a simple CLI for creating and managing HTTP tunnels with optional labels and persistent configuration.
-
-
# OPTIONS
-
-
**-l**, **--list**
-
: List all active tunnels on the bore server.
-
-
**-s**, **--saved**
-
: List all saved tunnel configurations from bore.toml in the current directory.
-
-
**--label** *LABEL*
-
: Assign a label/tag to the tunnel for organization and identification.
-
-
**--save**
-
: Save the tunnel configuration to bore.toml in the current directory for future use.
-
-
# ARGUMENTS
-
-
*SUBDOMAIN*
-
: The subdomain to use for the tunnel (e.g., "myapp" creates myapp.bore.dunkirk.sh). Must contain only lowercase letters, numbers, and hyphens.
-
-
*PORT*
-
: The local port to expose (e.g., 8000 for localhost:8000).
-
-
# CONFIGURATION
-
-
Tunnel configurations can be saved to a **bore.toml** file in the current directory. This file uses TOML format and can be committed to repositories.
-
-
## bore.toml Format
-
-
```toml
-
[myapp]
-
port = 8000
-
-
[api]
-
port = 3000
-
label = "dev"
-
```
-
-
When running **bore** without arguments in a directory with bore.toml, you'll be prompted to choose between creating a new tunnel or using a saved configuration.
-
-
# EXAMPLES
-
-
Create a simple tunnel:
-
```
-
$ bore myapp 8000
-
```
-
-
Create a tunnel with a label:
-
```
-
$ bore api 3000 --label dev
-
```
-
-
Save a tunnel configuration:
-
```
-
$ bore frontend 5173 --label local --save
-
```
-
-
List active tunnels:
-
```
-
$ bore --list
-
```
-
-
List saved configurations:
-
```
-
$ bore --saved
-
```
-
-
Interactive mode (choose saved or new):
-
```
-
$ bore
-
```
-
-
# FILES
-
-
**bore.toml**
-
: Local tunnel configuration file (current directory)
-
-
# SEE ALSO
-
-
Dashboard: https://bore.dunkirk.sh
-
-
# BUGS
-
-
Report bugs at: https://github.com/yourusername/dots/issues
-
-
# AUTHORS
-
-
Kieran Klukas <crush@charm.land>
-32
modules/home/apps/bore/completions/bore.bash
···
-
# bash completion for bore
-
-
_bore_completion() {
-
local cur prev opts
-
COMPREPLY=()
-
cur="${COMP_WORDS[COMP_CWORD]}"
-
prev="${COMP_WORDS[COMP_CWORD-1]}"
-
opts="--list --saved --label --save -l -s"
-
-
# Complete flags
-
if [[ ${cur} == -* ]]; then
-
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
-
return 0
-
fi
-
-
# Complete label value after --label or -l
-
if [[ ${prev} == "--label" ]] || [[ ${prev} == "-l" ]]; then
-
# Could potentially read from bore.toml for label suggestions
-
return 0
-
fi
-
-
# Complete saved tunnel names as first argument
-
if [[ ${COMP_CWORD} -eq 1 ]] && [[ -f "bore.toml" ]]; then
-
local tunnels=$(grep '^\[' bore.toml | sed 's/^\[\(.*\)\]$/\1/')
-
COMPREPLY=( $(compgen -W "${tunnels}" -- ${cur}) )
-
return 0
-
fi
-
-
return 0
-
}
-
-
complete -F _bore_completion bore
-20
modules/home/apps/bore/completions/bore.fish
···
-
# fish completion for bore
-
-
# Helper function to get saved tunnel names
-
function __bore_saved_tunnels
-
if test -f bore.toml
-
grep '^\[' bore.toml | sed 's/^\[\(.*\)\]$/\1/'
-
end
-
end
-
-
# Complete flags
-
complete -c bore -s l -l list -d 'List active tunnels'
-
complete -c bore -s s -l saved -d 'List saved tunnels from bore.toml'
-
complete -c bore -l label -d 'Assign a label to the tunnel' -r
-
complete -c bore -l save -d 'Save tunnel configuration to bore.toml'
-
-
# Complete subdomain from saved tunnels (first argument)
-
complete -c bore -n '__fish_is_first_token' -a '(__bore_saved_tunnels)' -d 'Saved tunnel'
-
-
# Port is always a number (second argument)
-
complete -c bore -n 'test (count (commandline -opc)) -eq 2' -d 'Local port'
-40
modules/home/apps/bore/completions/bore.zsh
···
-
#compdef bore
-
-
_bore() {
-
local -a tunnels
-
local curcontext="$curcontext" state line
-
typeset -A opt_args
-
-
# Read saved tunnels from bore.toml if it exists
-
if [[ -f "bore.toml" ]]; then
-
tunnels=(${(f)"$(grep '^\[' bore.toml | sed 's/^\[\(.*\)\]$/\1/')"})
-
fi
-
-
_arguments -C \
-
'1: :->subdomain' \
-
'2: :->port' \
-
'--list[List active tunnels]' \
-
'-l[List active tunnels]' \
-
'--saved[List saved tunnels from bore.toml]' \
-
'-s[List saved tunnels from bore.toml]' \
-
'--label[Assign a label to the tunnel]:label:' \
-
'--save[Save tunnel configuration to bore.toml]' \
-
&& return 0
-
-
case $state in
-
subdomain)
-
if [[ ${#tunnels[@]} -gt 0 ]]; then
-
_describe 'saved tunnels' tunnels
-
else
-
_message 'subdomain (e.g., myapp)'
-
fi
-
;;
-
port)
-
_message 'local port (e.g., 8000)'
-
;;
-
esac
-
-
return 0
-
}
-
-
_bore "$@"
-355
modules/home/apps/bore/default.nix
···
-
{
-
config,
-
lib,
-
pkgs,
-
...
-
}:
-
let
-
cfg = config.atelier.bore;
-
-
boreScript = pkgs.writeShellScript "bore" ''
-
CONFIG_FILE="bore.toml"
-
-
# Check for flags
-
if [ "$1" = "--list" ] || [ "$1" = "-l" ]; then
-
${pkgs.gum}/bin/gum style --bold --foreground 212 "Active tunnels"
-
echo
-
-
tunnels=$(${pkgs.curl}/bin/curl -s https://${cfg.domain}/api/proxy/http)
-
-
if ! echo "$tunnels" | ${pkgs.jq}/bin/jq -e '.proxies | length > 0' >/dev/null 2>&1; then
-
${pkgs.gum}/bin/gum style --foreground 117 "No active tunnels"
-
exit 0
-
fi
-
-
# Filter only online tunnels with valid conf
-
echo "$tunnels" | ${pkgs.jq}/bin/jq -r '.proxies[] | select(.status == "online" and .conf != null) | "\(.name) → https://\(.conf.subdomain).${cfg.domain}"' | while read -r line; do
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ $line"
-
done
-
exit 0
-
fi
-
-
if [ "$1" = "--saved" ] || [ "$1" = "-s" ]; then
-
if [ ! -f "$CONFIG_FILE" ]; then
-
${pkgs.gum}/bin/gum style --foreground 117 "No bore.toml found in current directory"
-
exit 0
-
fi
-
-
${pkgs.gum}/bin/gum style --bold --foreground 212 "Saved tunnels in bore.toml"
-
echo
-
-
# Parse TOML and show tunnels
-
while IFS= read -r line; do
-
if [[ "$line" =~ ^\[([^]]+)\] ]]; then
-
current_tunnel="''${BASH_REMATCH[1]}"
-
elif [[ "$line" =~ ^port[[:space:]]*=[[:space:]]*([0-9]+) ]]; then
-
port="''${BASH_REMATCH[1]}"
-
elif [[ "$line" =~ ^label[[:space:]]*=[[:space:]]*\"([^\"]+)\" ]]; then
-
label="''${BASH_REMATCH[1]}"
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ $current_tunnel → localhost:$port [$label]"
-
label=""
-
elif [[ -z "$line" ]] && [[ -n "$current_tunnel" ]] && [[ -n "$port" ]]; then
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ $current_tunnel → localhost:$port"
-
current_tunnel=""
-
port=""
-
fi
-
done < "$CONFIG_FILE"
-
-
# Handle last entry if file doesn't end with blank line
-
if [[ -n "$current_tunnel" ]] && [[ -n "$port" ]]; then
-
if [[ -n "$label" ]]; then
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ $current_tunnel → localhost:$port [$label]"
-
else
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ $current_tunnel → localhost:$port"
-
fi
-
fi
-
exit 0
-
fi
-
-
# Get subdomain
-
if [ -n "$1" ]; then
-
subdomain="$1"
-
else
-
# Check if we have a bore.toml in current directory
-
if [ -f "$CONFIG_FILE" ]; then
-
# Count tunnels in TOML
-
tunnel_count=$(${pkgs.gnugrep}/bin/grep -c '^\[' "$CONFIG_FILE" 2>/dev/null || echo "0")
-
-
if [ "$tunnel_count" -gt 0 ]; then
-
${pkgs.gum}/bin/gum style --bold --foreground 212 "Creating bore tunnel"
-
echo
-
-
# Show choice between new or saved
-
choice=$(${pkgs.gum}/bin/gum choose "New tunnel" "Use saved tunnel")
-
-
if [ "$choice" = "Use saved tunnel" ]; then
-
# Extract tunnel names from TOML
-
saved_names=$(${pkgs.gnugrep}/bin/grep '^\[' "$CONFIG_FILE" | ${pkgs.gnused}/bin/sed 's/^\[\(.*\)\]$/\1/')
-
subdomain=$(echo "$saved_names" | ${pkgs.gum}/bin/gum choose)
-
-
if [ -z "$subdomain" ]; then
-
${pkgs.gum}/bin/gum style --foreground 196 "No tunnel selected"
-
exit 1
-
fi
-
-
# Parse TOML for this tunnel's config
-
in_section=false
-
while IFS= read -r line; do
-
if [[ "$line" =~ ^\[([^]]+)\] ]]; then
-
if [[ "''${BASH_REMATCH[1]}" = "$subdomain" ]]; then
-
in_section=true
-
else
-
in_section=false
-
fi
-
elif [[ "$in_section" = true ]]; then
-
if [[ "$line" =~ ^port[[:space:]]*=[[:space:]]*([0-9]+) ]]; then
-
port="''${BASH_REMATCH[1]}"
-
elif [[ "$line" =~ ^label[[:space:]]*=[[:space:]]*\"([^\"]+)\" ]]; then
-
label="''${BASH_REMATCH[1]}"
-
fi
-
fi
-
done < "$CONFIG_FILE"
-
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ Loaded from bore.toml: $subdomain → localhost:$port''${label:+ [$label]}"
-
else
-
# New tunnel
-
subdomain=$(${pkgs.gum}/bin/gum input --placeholder "myapp" --prompt "Subdomain: ")
-
if [ -z "$subdomain" ]; then
-
${pkgs.gum}/bin/gum style --foreground 196 "No subdomain provided"
-
exit 1
-
fi
-
fi
-
else
-
${pkgs.gum}/bin/gum style --bold --foreground 212 "Creating bore tunnel"
-
echo
-
subdomain=$(${pkgs.gum}/bin/gum input --placeholder "myapp" --prompt "Subdomain: ")
-
if [ -z "$subdomain" ]; then
-
${pkgs.gum}/bin/gum style --foreground 196 "No subdomain provided"
-
exit 1
-
fi
-
fi
-
else
-
${pkgs.gum}/bin/gum style --bold --foreground 212 "Creating bore tunnel"
-
echo
-
subdomain=$(${pkgs.gum}/bin/gum input --placeholder "myapp" --prompt "Subdomain: ")
-
if [ -z "$subdomain" ]; then
-
${pkgs.gum}/bin/gum style --foreground 196 "No subdomain provided"
-
exit 1
-
fi
-
fi
-
fi
-
-
# Validate subdomain
-
if ! echo "$subdomain" | ${pkgs.gnugrep}/bin/grep -qE '^[a-z0-9-]+$'; then
-
${pkgs.gum}/bin/gum style --foreground 196 "Invalid subdomain (use only lowercase letters, numbers, and hyphens)"
-
exit 1
-
fi
-
-
# Get port (skip if loaded from saved config)
-
if [ -z "$port" ]; then
-
if [ -n "$2" ]; then
-
port="$2"
-
else
-
port=$(${pkgs.gum}/bin/gum input --placeholder "8000" --prompt "Local port: ")
-
if [ -z "$port" ]; then
-
${pkgs.gum}/bin/gum style --foreground 196 "No port provided"
-
exit 1
-
fi
-
fi
-
fi
-
-
# Validate port
-
if ! echo "$port" | ${pkgs.gnugrep}/bin/grep -qE '^[0-9]+$'; then
-
${pkgs.gum}/bin/gum style --foreground 196 "Invalid port (must be a number)"
-
exit 1
-
fi
-
-
# Get optional label and save flag (skip if loaded from saved config)
-
save_config=false
-
if [ -z "$label" ]; then
-
shift 2 2>/dev/null || true
-
while [[ $# -gt 0 ]]; do
-
case "$1" in
-
--label|-l)
-
label="$2"
-
shift 2
-
;;
-
--save)
-
save_config=true
-
shift
-
;;
-
*)
-
shift
-
;;
-
esac
-
done
-
-
# Prompt for label if not provided via flag and not loaded from saved config
-
if [ -z "$label" ]; then
-
echo
-
# Allow multiple labels selection
-
labels=$(${pkgs.gum}/bin/gum choose --no-limit --header "Labels (select multiple):" "dev" "prod" "custom")
-
-
if [ -n "$labels" ]; then
-
# Check if custom was selected
-
if echo "$labels" | ${pkgs.gnugrep}/bin/grep -q "custom"; then
-
custom_label=$(${pkgs.gum}/bin/gum input --placeholder "my-label" --prompt "Custom label: ")
-
if [ -z "$custom_label" ]; then
-
${pkgs.gum}/bin/gum style --foreground 196 "No custom label provided"
-
exit 1
-
fi
-
# Replace 'custom' with the actual custom label
-
labels=$(echo "$labels" | ${pkgs.gnused}/bin/sed "s/custom/$custom_label/")
-
fi
-
# Join labels with comma
-
label=$(echo "$labels" | ${pkgs.coreutils}/bin/tr '\n' ',' | ${pkgs.gnused}/bin/sed 's/,$//')
-
fi
-
fi
-
fi
-
-
# Check if local port is accessible
-
if ! ${pkgs.netcat}/bin/nc -z 127.0.0.1 "$port" 2>/dev/null; then
-
${pkgs.gum}/bin/gum style --foreground 214 "! Warning: Nothing listening on localhost:$port"
-
fi
-
-
# Save configuration if requested
-
if [ "$save_config" = true ]; then
-
# Check if tunnel already exists in TOML
-
if [ -f "$CONFIG_FILE" ] && ${pkgs.gnugrep}/bin/grep -q "^\[$subdomain\]" "$CONFIG_FILE"; then
-
# Update existing entry
-
${pkgs.gnused}/bin/sed -i "/^\[$subdomain\]/,/^\[/{
-
s/^port[[:space:]]*=.*/port = $port/
-
''${label:+s/^label[[:space:]]*=.*/label = \"$label\"/}
-
}" "$CONFIG_FILE"
-
else
-
# Append new entry
-
{
-
echo ""
-
echo "[$subdomain]"
-
echo "port = $port"
-
if [ -n "$label" ]; then
-
echo "label = \"$label\""
-
fi
-
} >> "$CONFIG_FILE"
-
fi
-
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ Configuration saved to bore.toml"
-
echo
-
fi
-
-
# Create config file
-
config_file=$(${pkgs.coreutils}/bin/mktemp)
-
trap "${pkgs.coreutils}/bin/rm -f $config_file" EXIT
-
-
# Encode label into proxy name if provided (format: subdomain[label1,label2])
-
proxy_name="$subdomain"
-
if [ -n "$label" ]; then
-
proxy_name="''${subdomain}[''${label}]"
-
fi
-
-
${pkgs.coreutils}/bin/cat > $config_file <<EOF
-
serverAddr = "${cfg.serverAddr}"
-
serverPort = ${toString cfg.serverPort}
-
-
auth.method = "token"
-
auth.tokenSource.type = "file"
-
auth.tokenSource.file.path = "${cfg.authTokenFile}"
-
-
[[proxies]]
-
name = "$proxy_name"
-
type = "http"
-
localIP = "127.0.0.1"
-
localPort = $port
-
subdomain = "$subdomain"
-
EOF
-
-
# Start tunnel
-
public_url="https://$subdomain.${cfg.domain}"
-
echo
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ Tunnel configured"
-
${pkgs.gum}/bin/gum style --foreground 117 " Local: localhost:$port"
-
${pkgs.gum}/bin/gum style --foreground 117 " Public: $public_url"
-
echo
-
${pkgs.gum}/bin/gum style --foreground 214 "Connecting to ${cfg.serverAddr}:${toString cfg.serverPort}..."
-
-
exec ${pkgs.frp}/bin/frpc -c $config_file
-
'';
-
-
bore = pkgs.stdenv.mkDerivation {
-
pname = "bore";
-
version = "1.0";
-
-
dontUnpack = true;
-
-
nativeBuildInputs = with pkgs; [ pandoc installShellFiles ];
-
-
manPageSrc = ./bore.1.md;
-
bashCompletionSrc = ./completions/bore.bash;
-
zshCompletionSrc = ./completions/bore.zsh;
-
fishCompletionSrc = ./completions/bore.fish;
-
-
buildPhase = ''
-
# Convert markdown man page to man format
-
${pkgs.pandoc}/bin/pandoc -s -t man $manPageSrc -o bore.1
-
'';
-
-
installPhase = ''
-
mkdir -p $out/bin
-
-
# Install binary
-
cp ${boreScript} $out/bin/bore
-
chmod +x $out/bin/bore
-
-
# Install man page
-
installManPage bore.1
-
-
# Install completions
-
installShellCompletion --bash --name bore $bashCompletionSrc
-
installShellCompletion --zsh --name _bore $zshCompletionSrc
-
installShellCompletion --fish --name bore.fish $fishCompletionSrc
-
'';
-
-
meta = with lib; {
-
description = "Secure tunneling service CLI";
-
homepage = "https://bore.dunkirk.sh";
-
license = licenses.mit;
-
maintainers = [ ];
-
};
-
};
-
in
-
{
-
options.atelier.bore = {
-
enable = lib.mkEnableOption "bore tunneling service";
-
-
serverAddr = lib.mkOption {
-
type = lib.types.str;
-
default = "bore.dunkirk.sh";
-
description = "bore server address";
-
};
-
-
serverPort = lib.mkOption {
-
type = lib.types.port;
-
default = 7000;
-
description = "bore server port";
-
};
-
-
domain = lib.mkOption {
-
type = lib.types.str;
-
default = "bore.dunkirk.sh";
-
description = "Domain for public tunnel URLs";
-
};
-
-
authTokenFile = lib.mkOption {
-
type = lib.types.nullOr lib.types.path;
-
default = null;
-
description = "Path to file containing authentication token";
-
};
-
};
-
-
config = lib.mkIf cfg.enable {
-
home.packages = [
-
pkgs.frp
-
bore
-
];
-
};
-
}
-301
modules/home/apps/crush/_crush-options.nix
···
-
{ lib }:
-
lib.mkOption {
-
type = lib.types.submodule {
-
options = {
-
providers = lib.mkOption {
-
type = lib.types.attrsOf (
-
lib.types.submodule {
-
options = {
-
name = lib.mkOption {
-
type = lib.types.str;
-
description = "Human-readable name for the provider";
-
};
-
base_url = lib.mkOption {
-
type = lib.types.str;
-
default = "";
-
description = "Base URL for the provider's API";
-
};
-
type = lib.mkOption {
-
type = lib.types.enum [
-
"openai"
-
"anthropic"
-
"gemini"
-
"azure"
-
"vertexai"
-
];
-
default = "openai";
-
description = "Provider type that determines the API format";
-
};
-
api_key = lib.mkOption {
-
type = lib.types.str;
-
default = "";
-
description = "API key for authentication with the provider";
-
};
-
disable = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
description = "Whether this provider is disabled";
-
};
-
system_prompt_prefix = lib.mkOption {
-
type = lib.types.str;
-
default = "";
-
description = "Custom prefix to add to system prompts for this provider";
-
};
-
extra_headers = lib.mkOption {
-
type = lib.types.attrsOf lib.types.str;
-
default = { };
-
description = "Additional HTTP headers to send with requests";
-
};
-
extra_body = lib.mkOption {
-
type = lib.types.attrsOf lib.types.anything;
-
default = { };
-
description = "Additional fields to include in request bodies";
-
};
-
models = lib.mkOption {
-
type = lib.types.listOf (
-
lib.types.submodule {
-
options = {
-
id = lib.mkOption {
-
type = lib.types.str;
-
description = "Model ID";
-
};
-
name = lib.mkOption {
-
type = lib.types.str;
-
description = "Model display name";
-
};
-
cost_per_1m_in = lib.mkOption {
-
type = lib.types.number;
-
default = 0;
-
};
-
cost_per_1m_out = lib.mkOption {
-
type = lib.types.number;
-
default = 0;
-
};
-
cost_per_1m_in_cached = lib.mkOption {
-
type = lib.types.number;
-
default = 0;
-
};
-
cost_per_1m_out_cached = lib.mkOption {
-
type = lib.types.number;
-
default = 0;
-
};
-
context_window = lib.mkOption {
-
type = lib.types.int;
-
default = 128000;
-
};
-
default_max_tokens = lib.mkOption {
-
type = lib.types.int;
-
default = 8192;
-
};
-
can_reason = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
};
-
has_reasoning_efforts = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
};
-
default_reasoning_effort = lib.mkOption {
-
type = lib.types.str;
-
default = "";
-
};
-
supports_attachments = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
};
-
};
-
}
-
);
-
default = [ ];
-
description = "List of models available from this provider";
-
};
-
};
-
}
-
);
-
default = { };
-
description = "AI provider configurations";
-
};
-
-
lsp = lib.mkOption {
-
type = lib.types.attrsOf (
-
lib.types.submodule {
-
options = {
-
command = lib.mkOption {
-
type = lib.types.str;
-
description = "Command to execute for the LSP server";
-
};
-
args = lib.mkOption {
-
type = lib.types.listOf lib.types.str;
-
default = [ ];
-
description = "Arguments to pass to the LSP server command";
-
};
-
options = lib.mkOption {
-
type = lib.types.attrsOf lib.types.anything;
-
default = { };
-
description = "LSP server-specific configuration options";
-
};
-
enabled = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
description = "Whether this LSP server is disabled";
-
};
-
};
-
}
-
);
-
default = { };
-
description = "Language Server Protocol configurations";
-
};
-
-
mcp = lib.mkOption {
-
type = lib.types.attrsOf (
-
lib.types.submodule {
-
options = {
-
command = lib.mkOption {
-
type = lib.types.str;
-
default = "";
-
description = "Command to execute for stdio MCP servers";
-
};
-
env = lib.mkOption {
-
type = lib.types.attrsOf lib.types.str;
-
default = { };
-
description = "Environment variables to set for the MCP server";
-
};
-
args = lib.mkOption {
-
type = lib.types.listOf lib.types.str;
-
default = [ ];
-
description = "Arguments to pass to the MCP server command";
-
};
-
type = lib.mkOption {
-
type = lib.types.enum [
-
"stdio"
-
"sse"
-
"http"
-
];
-
default = "stdio";
-
description = "Type of MCP connection";
-
};
-
url = lib.mkOption {
-
type = lib.types.str;
-
default = "";
-
description = "URL for HTTP or SSE MCP servers";
-
};
-
disabled = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
description = "Whether this MCP server is disabled";
-
};
-
headers = lib.mkOption {
-
type = lib.types.attrsOf lib.types.str;
-
default = { };
-
description = "HTTP headers for HTTP/SSE MCP servers";
-
};
-
};
-
}
-
);
-
default = { };
-
description = "Model Context Protocol server configurations";
-
};
-
-
options = lib.mkOption {
-
type = lib.types.submodule {
-
options = {
-
context_paths = lib.mkOption {
-
type = lib.types.listOf lib.types.str;
-
default = [ ];
-
description = "Paths to files containing context information for the AI";
-
};
-
tui = lib.mkOption {
-
type = lib.types.submodule {
-
options = {
-
compact_mode = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
description = "Enable compact mode for the TUI interface";
-
};
-
};
-
};
-
default = { };
-
description = "Terminal user interface options";
-
};
-
debug = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
description = "Enable debug logging";
-
};
-
debug_lsp = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
description = "Enable debug logging for LSP servers";
-
};
-
disable_auto_summarize = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
description = "Disable automatic conversation summarization";
-
};
-
data_directory = lib.mkOption {
-
type = lib.types.str;
-
default = ".crush";
-
description = "Directory for storing application data (relative to working directory)";
-
};
-
};
-
};
-
default = { };
-
description = "General application options";
-
};
-
-
permissions = lib.mkOption {
-
type = lib.types.submodule {
-
options = {
-
allowed_tools = lib.mkOption {
-
type = lib.types.listOf lib.types.str;
-
default = [ ];
-
description = "List of tools that don't require permission prompts";
-
};
-
};
-
};
-
default = { };
-
description = "Permission settings for tool usage";
-
};
-
-
models = lib.mkOption {
-
type = lib.types.attrsOf (
-
lib.types.submodule {
-
options = {
-
model = lib.mkOption {
-
type = lib.types.str;
-
description = "The model ID as used by the provider API";
-
};
-
provider = lib.mkOption {
-
type = lib.types.str;
-
description = "The model provider ID that matches a key in the providers config";
-
};
-
reasoning_effort = lib.mkOption {
-
type = lib.types.enum [
-
"low"
-
"medium"
-
"high"
-
];
-
default = "";
-
description = "Reasoning effort level for OpenAI models that support it";
-
};
-
max_tokens = lib.mkOption {
-
type = lib.types.int;
-
default = 0;
-
description = "Maximum number of tokens for model responses";
-
};
-
think = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
description = "Enable thinking mode for Anthropic models that support reasoning";
-
};
-
};
-
}
-
);
-
default = { };
-
description = "Model configurations";
-
};
-
};
-
};
-
default = { };
-
description = "Crush configuration options";
-
}
-24
modules/home/apps/crush/crush-module.nix
···
-
{
-
config,
-
lib,
-
pkgs,
-
inputs,
-
...
-
}:
-
{
-
imports = [
-
inputs.nur.modules.homeManager.default
-
];
-
-
options.programs.crush = {
-
enable = lib.mkEnableOption "Enable crush";
-
settings = import ./_crush-options.nix { inherit lib; };
-
};
-
-
config = lib.mkIf config.programs.crush.enable {
-
home.packages = [ pkgs.nur.repos.charmbracelet.crush ];
-
home.file.".config/crush/crush.json" = lib.mkIf (config.programs.crush.settings != { }) {
-
text = builtins.toJSON config.programs.crush.settings;
-
};
-
};
-
}
-335
modules/home/apps/crush.nix
···
-
{
-
lib,
-
config,
-
...
-
}:
-
{
-
options.atelier.apps.crush.enable = lib.mkEnableOption "Enable Crush config";
-
config = lib.mkIf config.atelier.apps.crush.enable {
-
programs.crush = {
-
enable = true;
-
settings = {
-
mcp = {
-
context7 = {
-
type = "http";
-
url = "https://mcp.context7.com/mcp";
-
headers = {
-
CONTEXT7_API_KEY = "$(cat /run/agenix/context7)";
-
};
-
};
-
sequential-thinking = {
-
command = "bunx";
-
args = [
-
"-y"
-
"@modelcontextprotocol/server-sequential-thinking"
-
];
-
};
-
};
-
providers = {
-
copilot = {
-
name = "Copilot";
-
type = "openai";
-
base_url = "https://api.githubcopilot.com";
-
api_key = "$(bash ~/.config/crush/copilot.sh)";
-
extra_headers = {
-
"Editor-Version" = "CRUSH/1.0";
-
"Editor-Plugin-Version" = "CRUSH/1.0";
-
"Copilot-Integration-Id" = "vscode-chat";
-
};
-
models = [
-
{
-
id = "gpt-4.1";
-
name = "Copilot: GPT-4.1";
-
cost_per_1m_in = 0;
-
cost_per_1m_out = 0;
-
cost_per_1m_in_cached = 0;
-
cost_per_1m_out_cached = 0;
-
context_window = 128000;
-
default_max_tokens = 16384;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = true;
-
}
-
{
-
id = "gpt-5-mini";
-
name = "Copilot: GPT-5 mini";
-
cost_per_1m_in = 0;
-
cost_per_1m_out = 0;
-
cost_per_1m_in_cached = 0;
-
cost_per_1m_out_cached = 0;
-
context_window = 264000;
-
default_max_tokens = 64000;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = true;
-
}
-
{
-
id = "gpt-5";
-
name = "Copilot: GPT-5";
-
cost_per_1m_in = 0;
-
cost_per_1m_out = 0;
-
cost_per_1m_in_cached = 0;
-
cost_per_1m_out_cached = 0;
-
context_window = 400000;
-
default_max_tokens = 128000;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = true;
-
}
-
{
-
id = "gpt-4o";
-
name = "Copilot: GPT-4o";
-
cost_per_1m_in = 0;
-
cost_per_1m_out = 0;
-
cost_per_1m_in_cached = 0;
-
cost_per_1m_out_cached = 0;
-
context_window = 128000;
-
default_max_tokens = 4096;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = true;
-
}
-
{
-
id = "grok-code-fast-1";
-
name = "Copilot: Grok Code Fast 1";
-
cost_per_1m_in = 0;
-
cost_per_1m_out = 0;
-
cost_per_1m_in_cached = 0;
-
cost_per_1m_out_cached = 0;
-
context_window = 128000;
-
default_max_tokens = 64000;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = false;
-
}
-
{
-
id = "gpt-5-codex";
-
name = "Copilot: GPT-5-Codex (Preview)";
-
cost_per_1m_in = 0;
-
cost_per_1m_out = 0;
-
cost_per_1m_in_cached = 0;
-
cost_per_1m_out_cached = 0;
-
context_window = 400000;
-
default_max_tokens = 128000;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = true;
-
}
-
{
-
id = "claude-3.5-sonnet";
-
name = "Copilot: Claude Sonnet 3.5";
-
cost_per_1m_in = 0;
-
cost_per_1m_out = 0;
-
cost_per_1m_in_cached = 0;
-
cost_per_1m_out_cached = 0;
-
context_window = 90000;
-
default_max_tokens = 8192;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = true;
-
}
-
{
-
id = "claude-sonnet-4";
-
name = "Copilot: Claude Sonnet 4";
-
cost_per_1m_in = 0;
-
cost_per_1m_out = 0;
-
cost_per_1m_in_cached = 0;
-
cost_per_1m_out_cached = 0;
-
context_window = 216000;
-
default_max_tokens = 16000;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = true;
-
}
-
{
-
id = "claude-sonnet-4.5";
-
name = "Copilot: Claude Sonnet 4.5";
-
cost_per_1m_in = 0;
-
cost_per_1m_out = 0;
-
cost_per_1m_in_cached = 0;
-
cost_per_1m_out_cached = 0;
-
context_window = 144000;
-
default_max_tokens = 16000;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = true;
-
}
-
{
-
id = "claude-haiku-4.5";
-
name = "Copilot: Claude Haiku 4.5";
-
cost_per_1m_in = 0;
-
cost_per_1m_out = 0;
-
cost_per_1m_in_cached = 0;
-
cost_per_1m_out_cached = 0;
-
context_window = 144000;
-
default_max_tokens = 16000;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = true;
-
}
-
{
-
id = "gemini-2.5-pro";
-
name = "Copilot: Gemini 2.5 Pro";
-
cost_per_1m_in = 0;
-
cost_per_1m_out = 0;
-
cost_per_1m_in_cached = 0;
-
cost_per_1m_out_cached = 0;
-
context_window = 128000;
-
default_max_tokens = 64000;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = true;
-
}
-
];
-
};
-
hyper = {
-
name = "Charm Hyper";
-
base_url = "https://hyper.charm.sh/api/v1/openai/";
-
api_key = "$(cat /run/agenix/crush)";
-
type = "openai";
-
models = [
-
{
-
name = "Qwen 3 Coder";
-
id = "qwen3_coder";
-
context_window = 118000;
-
default_max_tokens = 20000;
-
}
-
];
-
};
-
claude-pro = {
-
name = "Claude Pro";
-
type = "anthropic";
-
base_url = "https://api.anthropic.com";
-
api_key = "Bearer $(bunx anthropic-api-key)";
-
system_prompt_prefix = "You are Claude Code, Anthropic's official CLI for Claude.";
-
extra_headers = {
-
"anthropic-version" = "2023-06-01";
-
"anthropic-beta" = "oauth-2025-04-20";
-
};
-
models = [
-
{
-
id = "claude-haiku-4-5-20251001";
-
name = "Claude Haiku 4.5";
-
cost_per_1m_in = 3.0;
-
cost_per_1m_out = 15.0;
-
cost_per_1m_in_cached = 0.225;
-
cost_per_1m_out_cached = 15.0;
-
context_window = 200000;
-
default_max_tokens = 8192;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = true;
-
}
-
{
-
id = "claude-sonnet-4-5-20250929";
-
name = "Claude Sonnet 4.5";
-
cost_per_1m_in = 3.0;
-
cost_per_1m_out = 15.0;
-
cost_per_1m_in_cached = 0.225;
-
cost_per_1m_out_cached = 15.0;
-
context_window = 200000;
-
default_max_tokens = 64000;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = true;
-
}
-
{
-
id = "claude-opus-4-1-20250805";
-
name = "Claude Opus 4.1";
-
cost_per_1m_in = 15.0;
-
cost_per_1m_out = 75.0;
-
cost_per_1m_in_cached = 1.5;
-
cost_per_1m_out_cached = 75.0;
-
context_window = 200000;
-
default_max_tokens = 32000;
-
can_reason = true;
-
has_reasoning_efforts = true;
-
supports_attachments = true;
-
}
-
{
-
id = "claude-opus-4-20250514";
-
name = "Claude Opus 4";
-
cost_per_1m_in = 15.0;
-
cost_per_1m_out = 75.0;
-
cost_per_1m_in_cached = 1.5;
-
cost_per_1m_out_cached = 75.0;
-
context_window = 200000;
-
default_max_tokens = 32000;
-
can_reason = true;
-
has_reasoning_efforts = true;
-
supports_attachments = true;
-
}
-
{
-
id = "claude-sonnet-4-20250514";
-
name = "Claude Sonnet 4";
-
cost_per_1m_in = 3.0;
-
cost_per_1m_out = 15.0;
-
cost_per_1m_in_cached = 0.225;
-
cost_per_1m_out_cached = 15.0;
-
context_window = 200000;
-
default_max_tokens = 64000;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = true;
-
}
-
{
-
id = "claude-3-7-sonnet-20250219";
-
name = "Claude Sonnet 3.7";
-
cost_per_1m_in = 2.5;
-
cost_per_1m_out = 12.0;
-
cost_per_1m_in_cached = 0.187;
-
cost_per_1m_out_cached = 12.0;
-
context_window = 200000;
-
default_max_tokens = 64000;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = true;
-
}
-
{
-
id = "claude-3-5-haiku-20241022";
-
name = "Claude Haiku 3.5";
-
cost_per_1m_in = 0.8;
-
cost_per_1m_out = 4.0;
-
cost_per_1m_in_cached = 0.06;
-
cost_per_1m_out_cached = 4.0;
-
context_window = 200000;
-
default_max_tokens = 8192;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = true;
-
}
-
{
-
id = "claude-3-haiku-20240307";
-
name = "Claude Haiku 3";
-
cost_per_1m_in = 0.25;
-
cost_per_1m_out = 1.25;
-
cost_per_1m_in_cached = 0.03;
-
cost_per_1m_out_cached = 1.25;
-
context_window = 200000;
-
default_max_tokens = 4096;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = true;
-
}
-
{
-
id = "claude-3-opus-20240229";
-
name = "Claude Opus 3";
-
cost_per_1m_in = 15.0;
-
cost_per_1m_out = 75.0;
-
cost_per_1m_in_cached = 1.5;
-
cost_per_1m_out_cached = 75.0;
-
context_window = 200000;
-
default_max_tokens = 8192;
-
can_reason = true;
-
has_reasoning_efforts = false;
-
supports_attachments = true;
-
}
-
];
-
};
-
};
-
};
-
};
-
-
xdg.configFile."crush/copilot.sh".source = ../../../dots/copilot.sh;
-
};
-
}
-24
modules/home/apps/ghostty.nix
···
-
{ lib, config, ... }:
-
{
-
options.atelier.terminal.ghostty = {
-
enable = lib.mkEnableOption "Enable Ghostty terminal config";
-
windowDecoration = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
description = "Enable window decorations for Ghostty";
-
};
-
};
-
-
config = lib.mkIf config.atelier.terminal.ghostty.enable {
-
home.file.".config/ghostty/config".text = ''
-
foreground = "#a7b1d3"
-
mouse-hide-while-typing = true
-
resize-overlay = "never"
-
theme = "Catppuccin Macchiato"
-
window-decoration = ${if config.atelier.terminal.ghostty.windowDecoration then "true" else "false"}
-
window-padding-x = 12
-
window-padding-y = 12
-
keybind = ctrl+shift+w=close_surface
-
'';
-
};
-
}
-175
modules/home/apps/git.nix
···
-
{
-
lib,
-
config,
-
pkgs,
-
...
-
}:
-
{
-
options.atelier.shell.git.enable = lib.mkEnableOption {
-
description = "Enable global Git configuration";
-
};
-
config = lib.mkIf config.atelier.shell.git.enable {
-
programs.git = {
-
enable = true;
-
includes = [
-
{
-
path = pkgs.writeText "git-user-config" ''
-
[user]
-
name = Kieran Klukas
-
email = kieranklukas@cedarville.edu
-
signingKey = ~/.ssh/id_ed25519_cedarville.pub
-
[core]
-
sshCommand = ssh -i ~/.ssh/id_ed25519_cedarville
-
'';
-
condition = "gitdir:~/code/school/";
-
}
-
];
-
settings = {
-
user = {
-
name = "Kieran Klukas";
-
email = "me@dunkirk.sh";
-
signingKey = "~/.ssh/id_rsa.pub";
-
};
-
alias = {
-
c = "commit";
-
p = "push";
-
ch = "checkout";
-
pushfwl = "push --force-with-lease --force-if-includes";
-
};
-
branch.sort = "-committerdate";
-
pager.branch = false;
-
column.ui = "auto";
-
commit.gpgsign = true;
-
gpg.format = "ssh";
-
gpg.ssh.allowedSignersFile = "~/.ssh/allowedSigners";
-
pull.rebase = true;
-
push.autoSetupRemote = true;
-
init.defaultBranch = "main";
-
};
-
};
-
programs.delta = {
-
enable = true;
-
enableGitIntegration = true;
-
};
-
programs.gh.enable = true;
-
programs.lazygit = {
-
enable = true;
-
settings = {
-
gui.theme = {
-
lightTheme = false;
-
activeBorderColor = [
-
"blue"
-
"bold"
-
];
-
inactiveBorderColor = [ "black" ];
-
selectedLineBgColor = [ "default" ];
-
};
-
};
-
};
-
programs.gh-dash = {
-
enable = true;
-
settings = {
-
prSections = [
-
{
-
title = "Mine";
-
filters = "is:open author:@me updated:>={{ nowModify \"-3w\" }} sort:updated-desc archived:false";
-
layout.author.hidden = true;
-
}
-
{
-
title = "Review";
-
filters = "sort:updated-desc is:pr is:open review-requested:taciturnaxolotl archived:false";
-
}
-
{
-
title = "All";
-
filters = "sort:updated-desc is:pr is:open user:@me archived:false";
-
}
-
];
-
issuesSections = [
-
{
-
title = "Open";
-
filters = "user:@me is:open archived:false -author:@me sort:updated-desc";
-
}
-
{
-
title = "Assigned";
-
filters = "is:issue state:open archived:false assignee:@me sort:updated-desc ";
-
}
-
{
-
title = "Creator";
-
filters = "author:@me is:open archived:false";
-
}
-
{
-
title = "Hackclub";
-
filters = "is:issue org:hackclub archived:false involves:@me sort:updated-desc is:open";
-
}
-
{
-
title = "All";
-
filters = "is:issue involves:@me archived:false sort:updated-desc is:open";
-
}
-
];
-
pager.diff = "diffnav";
-
defaults = {
-
view = "prs";
-
refetchIntervalMinutes = 5;
-
layout.prs = {
-
repoName = {
-
grow = true;
-
width = 10;
-
hidden = false;
-
};
-
base.hidden = true;
-
};
-
preview = {
-
open = true;
-
width = 84;
-
};
-
prsLimit = 20;
-
issuesLimit = 20;
-
};
-
repoPaths = {
-
"taciturnaxolotl/*" = "~/code/personal/*";
-
"hackclub/*" = "~/code/hackclub/*";
-
};
-
keybindings = {
-
universal = [
-
{
-
key = "g";
-
name = "lazygit";
-
command = "cd {{.RepoPath}} && lazygit";
-
}
-
];
-
prs = [
-
{
-
key = "O";
-
builtin = "checkout";
-
}
-
{
-
key = "m";
-
command = "gh pr merge --admin --repo {{.RepoName}} {{.PrNumber}}";
-
}
-
{
-
key = "C";
-
name = "code review";
-
command = "tmux new-window -c {{.RepoPath}} 'nvim -c \":silent Octo pr edit {{.PrNumber}}\"'";
-
}
-
{
-
key = "a";
-
name = "lazygit add";
-
command = "cd {{.RepoPath}} && git add -A && lazygit";
-
}
-
{
-
key = "v";
-
name = "approve";
-
command = "gh pr review --repo {{.RepoName}} --approve --body \"$(gum input --prompt='Approval Comment: ')\" {{.PrNumber}}";
-
}
-
];
-
};
-
theme = {
-
ui = {
-
sectionsShowCount = true;
-
table.compact = false;
-
};
-
};
-
};
-
};
-
};
-
}
-46
modules/home/apps/halloy.nix
···
-
{lib, config, ...}:
-
{
-
options.atelier.apps.halloy.enable = lib.mkEnableOption "Enable halloy config";
-
config = lib.mkIf config.atelier.apps.halloy.enable {
-
programs.halloy = {
-
enable = true;
-
settings = {
-
theme = "ferra";
-
buffer.channel.topic = {
-
enabled = true;
-
};
-
servers = {
-
liberachat = {
-
nickname = "taciturnaxolotl";
-
realname = "kieran klukas";
-
username = "kierank";
-
server = "irc.libera.chat";
-
channels = ["#tangled" "#halloy"];
-
};
-
hackclub = {
-
nickname = "krn";
-
nick_password = "Extrude1-Herbal-Map";
-
realname = "kieran klukas";
-
username = "taciturnaxolotl";
-
server = "irc.hackclub.com";
-
port = 6667;
-
use_tls = false;
-
chathistory = true;
-
channels = [
-
"#lounge"
-
"#hq"
-
"#krn-rambles"
-
"#neon"
-
"#neighborhood"
-
"#meta"
-
"#fraud-land"
-
];
-
channel-keys = {
-
fraud-land = "fraudpheus";
-
};
-
};
-
};
-
};
-
};
-
};
-
}
-310
modules/home/apps/helix.nix
···
-
{
-
lib,
-
config,
-
pkgs,
-
inputs,
-
...
-
}:
-
{
-
options.atelier.apps.helix = {
-
enable = lib.mkEnableOption "Enable helix config";
-
swift = lib.mkEnableOption "Enable Swift support";
-
};
-
-
config = lib.mkIf config.atelier.apps.helix.enable {
-
programs.helix = {
-
enable = true;
-
package = pkgs.evil-helix;
-
extraPackages =
-
with pkgs;
-
[
-
clang-tools # clangd
-
cmake-language-server # neocmakelsp
-
omnisharp-roslyn # OmniSharp
-
gopls
-
jdt-language-server # jdtls
-
typescript-language-server
-
unstable.biome
-
lua-language-server
-
nil # nix
-
nodePackages.intelephense
-
python313Packages.python-lsp-server # pylsp
-
ruby-lsp
-
rust-analyzer
-
nodePackages.bash-language-server
-
taplo
-
vscode-langservers-extracted
-
kotlin-language-server
-
harper
-
inputs.wakatime-ls.packages.${pkgs.stdenv.hostPlatform.system}.default
-
]
-
++ lib.optionals config.atelier.apps.helix.swift [
-
sourcekit-lsp
-
unstable.sourcekit-lsp
-
];
-
settings = {
-
theme = "catppuccin_macchiato";
-
editor = {
-
line-number = "relative";
-
mouse = true;
-
rulers = [ 120 ];
-
true-color = true;
-
completion-replace = true;
-
end-of-line-diagnostics = "hint";
-
color-modes = true;
-
inline-diagnostics.cursor-line = "warning";
-
file-picker.hidden = false;
-
indent-guides = {
-
render = true;
-
character = "╎";
-
skip-levels = 0;
-
};
-
soft-wrap.enable = false;
-
auto-save = {
-
idle-timeout = 300000;
-
};
-
cursor-shape = {
-
normal = "block";
-
insert = "bar";
-
select = "underline";
-
};
-
statusline = {
-
left = [
-
"mode"
-
"spinner"
-
"version-control"
-
"spacer"
-
"separator"
-
"file-name"
-
"read-only-indicator"
-
"file-modification-indicator"
-
];
-
center = [ ];
-
right = [
-
"diagnostics"
-
"workspace-diagnostics"
-
"position"
-
"total-line-numbers"
-
"position-percentage"
-
"file-encoding"
-
"file-line-ending"
-
"file-type"
-
"register"
-
"selections"
-
];
-
separator = "│";
-
};
-
};
-
};
-
languages = {
-
language-server = {
-
harper-ls = {
-
command = "${pkgs.harper}/bin/harper-ls";
-
args = [ "--stdio" ];
-
};
-
biome = {
-
command = "${pkgs.unstable.biome}/bin/biome";
-
args = [ "lsp-proxy" ];
-
};
-
wakatime = {
-
command = "wakatime-ls";
-
};
-
};
-
language = [
-
{
-
name = "c";
-
language-servers = [
-
"clangd"
-
"harper-ls"
-
"wakatime"
-
];
-
}
-
{
-
name = "cmake";
-
language-servers = [
-
"neocmakelsp"
-
"harper-ls"
-
"wakatime"
-
];
-
}
-
{
-
name = "cpp";
-
language-servers = [
-
"clangd"
-
"harper-ls"
-
"wakatime"
-
];
-
}
-
{
-
name = "c-sharp";
-
language-servers = [
-
"OmniSharp"
-
"harper-ls"
-
"wakatime"
-
];
-
}
-
{
-
name = "go";
-
language-servers = [
-
"gopls"
-
"harper-ls"
-
"wakatime"
-
];
-
}
-
{
-
name = "java";
-
language-servers = [
-
"jdtls"
-
"harper-ls"
-
"wakatime"
-
];
-
}
-
{
-
name = "javascript";
-
language-servers = [
-
{
-
name = "typescript-language-server";
-
except-features = [ "format" ];
-
}
-
"biome"
-
"harper-ls"
-
"wakatime"
-
];
-
auto-format = true;
-
}
-
{
-
name = "jsx";
-
language-servers = [
-
{
-
name = "typescript-language-server";
-
except-features = [ "format" ];
-
}
-
"biome"
-
"harper-ls"
-
"wakatime"
-
];
-
auto-format = true;
-
}
-
{
-
name = "lua";
-
language-servers = [
-
"lua-language-server"
-
"harper-ls"
-
"wakatime"
-
];
-
}
-
{
-
name = "nix";
-
language-servers = [
-
"nil"
-
"harper-ls"
-
"wakatime"
-
];
-
}
-
{
-
name = "php";
-
language-servers = [
-
"intelephense"
-
"harper-ls"
-
"wakatime"
-
];
-
}
-
{
-
name = "python";
-
language-servers = [
-
"pylsp"
-
"harper-ls"
-
"wakatime"
-
];
-
}
-
{
-
name = "ruby";
-
language-servers = [
-
"ruby-lsp"
-
"harper-ls"
-
"wakatime"
-
];
-
}
-
{
-
name = "rust";
-
language-servers = [
-
"rust-analyzer"
-
"harper-ls"
-
"wakatime"
-
];
-
}
-
{
-
name = "bash";
-
language-servers = [
-
"bash-language-server"
-
"harper-ls"
-
"wakatime"
-
];
-
}
-
{
-
name = "toml";
-
language-servers = [
-
"taplo"
-
"harper-ls"
-
"wakatime"
-
];
-
}
-
{
-
name = "typescript";
-
language-servers = [
-
{
-
name = "typescript-language-server";
-
except-features = [ "format" ];
-
}
-
"biome"
-
"harper-ls"
-
"wakatime"
-
];
-
auto-format = true;
-
}
-
{
-
name = "tsx";
-
language-servers = [
-
{
-
name = "typescript-language-server";
-
except-features = [ "format" ];
-
}
-
"biome"
-
"harper-ls"
-
"wakatime"
-
];
-
auto-format = true;
-
}
-
{
-
name = "json";
-
language-servers = [
-
{
-
name = "vscode-json-language-server";
-
except-features = [ "format" ];
-
}
-
"biome"
-
"wakatime"
-
];
-
}
-
{
-
name = "kotlin";
-
language-servers = [
-
"kotlin-language-server"
-
"harper-ls"
-
"wakatime"
-
];
-
}
-
] ++ lib.optionals config.atelier.apps.helix.swift [
-
{
-
name = "swift";
-
language-servers = [
-
"sourcekit-lsp"
-
"harper-ls"
-
"wakatime"
-
];
-
}
-
];
-
};
-
};
-
};
-
}
-25
modules/home/apps/irssi.nix
···
-
{ lib, config, ... }:
-
{
-
options.atelier.apps.irssi.enable = lib.mkEnableOption "Enable irssi config";
-
config = lib.mkIf config.atelier.apps.irssi.enable {
-
programs.irssi = {
-
enable = true;
-
extraConfig = ''
-
settings = {
-
core = {
-
real_name = "kieran klukas";
-
user_name = "kierank";
-
nick = "taciturnaxolotl";
-
};
-
"fe-common/core" = { theme = "override"; };
-
};
-
'';
-
};
-
home.file."/home/kierank/.irssi/override.theme".text = ''
-
abstracts = {
-
sb_background = "%0%w";
-
window_border = "%0%w";
-
};
-
'';
-
};
-
}
-48
modules/home/apps/qutebrowser.nix
···
-
{ lib, config, ... }:
-
{
-
options.atelier.apps.qutebrowser.enable = lib.mkEnableOption "Enable Qutebrowser config";
-
config = lib.mkIf config.atelier.apps.qutebrowser.enable {
-
programs.qutebrowser = {
-
enable = true;
-
settings = {
-
colors.webpage = {
-
darkmode.enabled = true;
-
preferred_color_scheme = "dark";
-
};
-
content.blocking = {
-
enabled = true;
-
hosts.lists = [
-
"https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts"
-
];
-
method = "both";
-
};
-
url.default_page = "http://ember:8081/";
-
url.start_pages = [ "http://ember:8081/" ];
-
};
-
extraConfig = ''
-
config.bind("<Space>ff", "cmd-set-text -s :open")
-
config.bind("<Space>fw", "cmd-set-text -s :open -t")
-
config.bind("<Space>fb", "cmd-set-text -s :tab-focus")
-
config.bind("<Space>fo", "history -t")
-
config.bind("<Space><Return>", "bookmark-list --jump")
-
config.bind("<Space>bc", "tab-clone")
-
config.bind("<Space>bZ", "tab-only")
-
config.bind("<Space>p", "tab-pin")
-
config.bind("<Space>r", "reload")
-
config.bind("<Space>yy", "yank")
-
config.bind("<Space>yd", "yank domain")
-
config.bind("<Space>ym", "yank inline [{title}]({url:yank})")
-
config.bind("<Space>yn", "yank inline ({url:yank})[{title}]")
-
config.bind("<Space>yt", "yank title")
-
config.bind("<Ctrl-c>", "tab-close")
-
config.bind("<Ctrl-C>", "tab-close -o")
-
config.bind("<Space>i", "config-cycle content.images true false")
-
config.bind("<Space>j", "config-cycle content.javascript.enabled true false")
-
config.bind("<Ctrl-V>", "fake-key -g <Ctrl-v>")
-
config.bind("<ctrl-alt-c>", "config-cycle tabs.show always never")
-
-
c.url.searchengines = { "DEFAULT": "https://s.dunkirk.sh/?q={}" }
-
'';
-
};
-
};
-
}
-30
modules/home/apps/spotify.nix
···
-
{
-
lib,
-
pkgs,
-
config,
-
inputs,
-
...
-
}:
-
{
-
imports = [
-
inputs.spicetify-nix.homeManagerModules.default
-
];
-
-
options.atelier.apps.spotify.enable = lib.mkEnableOption "Enable Spotify config (spicetify)";
-
config = lib.mkIf config.atelier.apps.spotify.enable {
-
programs.spicetify =
-
let
-
spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.stdenv.hostPlatform.system};
-
in
-
{
-
enable = true;
-
enabledExtensions = with spicePkgs.extensions; [
-
adblock
-
hidePodcasts
-
shuffle
-
];
-
theme = spicePkgs.themes.text;
-
colorScheme = "CatppuccinMocha";
-
};
-
};
-
}
-183
modules/home/apps/ssh.nix
···
-
{
-
config,
-
lib,
-
pkgs,
-
inputs,
-
...
-
}:
-
with lib;
-
let
-
cfg = config.atelier.ssh;
-
in
-
{
-
options.atelier.ssh = {
-
enable = mkEnableOption "SSH configuration";
-
-
zmx = {
-
enable = mkEnableOption "zmx integration for persistent sessions";
-
hosts = mkOption {
-
type = types.listOf types.str;
-
default = [ ];
-
description = "List of host patterns to enable zmx auto-attach (e.g., 'd.*')";
-
};
-
};
-
-
extraConfig = mkOption {
-
type = types.lines;
-
default = "";
-
description = "Extra SSH configuration";
-
};
-
-
hosts = mkOption {
-
type = types.attrsOf (
-
types.submodule {
-
options = {
-
hostname = mkOption {
-
type = types.nullOr types.str;
-
default = null;
-
description = "Hostname or IP address";
-
};
-
-
port = mkOption {
-
type = types.nullOr types.int;
-
default = null;
-
description = "SSH port";
-
};
-
-
user = mkOption {
-
type = types.nullOr types.str;
-
default = null;
-
description = "Username for SSH connection";
-
};
-
-
identityFile = mkOption {
-
type = types.nullOr types.str;
-
default = null;
-
description = "Path to SSH identity file";
-
};
-
-
forwardAgent = mkOption {
-
type = types.nullOr types.bool;
-
default = null;
-
description = "Enable SSH agent forwarding";
-
};
-
-
extraOptions = mkOption {
-
type = types.attrsOf types.str;
-
default = { };
-
description = "Additional SSH options for this host";
-
};
-
-
zmx = mkOption {
-
type = types.bool;
-
default = false;
-
description = "Enable zmx persistent sessions for this host";
-
};
-
};
-
}
-
);
-
default = { };
-
description = "SSH host configurations";
-
};
-
};
-
-
config = mkIf cfg.enable {
-
# zmx provides pre-built binaries that we download instead of building from source
-
# This avoids the zig2nix dependency which causes issues in CI
-
home.packages =
-
(optionals cfg.zmx.enable [
-
pkgs.zmx-binary
-
pkgs.autossh
-
]);
-
-
programs.ssh = {
-
enable = true;
-
enableDefaultConfig = false;
-
-
matchBlocks =
-
let
-
# Convert atelier.ssh.hosts to SSH matchBlocks
-
hostConfigs = mapAttrs (
-
name: hostCfg:
-
{
-
hostname = mkIf (hostCfg.hostname != null) hostCfg.hostname;
-
port = mkIf (hostCfg.port != null) hostCfg.port;
-
user = mkIf (hostCfg.user != null) hostCfg.user;
-
identityFile = mkIf (hostCfg.identityFile != null) hostCfg.identityFile;
-
forwardAgent = mkIf (hostCfg.forwardAgent != null) hostCfg.forwardAgent;
-
extraOptions = hostCfg.extraOptions // (
-
if hostCfg.zmx then
-
{
-
RemoteCommand = "export PATH=$HOME/.nix-profile/bin:$PATH; zmx attach %n";
-
RequestTTY = "yes";
-
ControlPath = "~/.ssh/cm-%r@%h:%p";
-
ControlMaster = "auto";
-
ControlPersist = "10m";
-
}
-
else
-
{ }
-
);
-
}
-
) cfg.hosts;
-
-
# Create zmx pattern hosts if enabled
-
zmxPatternHosts = if cfg.zmx.enable then
-
listToAttrs (
-
map (pattern:
-
let
-
patternHost = cfg.hosts.${pattern} or {};
-
in {
-
name = pattern;
-
value = {
-
hostname = mkIf (patternHost.hostname or null != null) patternHost.hostname;
-
port = mkIf (patternHost.port or null != null) patternHost.port;
-
user = mkIf (patternHost.user or null != null) patternHost.user;
-
extraOptions = {
-
RemoteCommand = "export PATH=$HOME/.nix-profile/bin:$PATH; zmx attach %k";
-
RequestTTY = "yes";
-
ControlPath = "~/.ssh/cm-%r@%h:%p";
-
ControlMaster = "auto";
-
ControlPersist = "10m";
-
};
-
};
-
}) cfg.zmx.hosts
-
)
-
else
-
{ };
-
-
# Default match block for extraConfig
-
defaultBlock = if cfg.extraConfig != "" then
-
{
-
"*" = { };
-
}
-
else
-
{ };
-
in
-
defaultBlock // hostConfigs // zmxPatternHosts;
-
-
extraConfig = cfg.extraConfig;
-
};
-
-
# Add shell aliases for easier zmx usage
-
programs.zsh.shellAliases = mkIf cfg.zmx.enable {
-
zmls = "zmx list";
-
zmk = "zmx kill";
-
zma = "zmx attach";
-
ash = "autossh -M 0 -q";
-
};
-
-
programs.bash.shellAliases = mkIf cfg.zmx.enable {
-
zmls = "zmx list";
-
zmk = "zmx kill";
-
zma = "zmx attach";
-
ash = "autossh -M 0 -q";
-
};
-
-
programs.fish.shellAliases = mkIf cfg.zmx.enable {
-
zmls = "zmx list";
-
zmk = "zmx kill";
-
zma = "zmx attach";
-
ash = "autossh -M 0 -q";
-
};
-
};
-
}
-43
modules/home/apps/tofi.nix
···
-
{
-
lib,
-
config,
-
...
-
}:
-
{
-
options.atelier.apps.tofi.enable = lib.mkEnableOption "Enable tofi config";
-
-
config = lib.mkIf config.atelier.apps.tofi.enable {
-
catppuccin.tofi.enable = false;
-
-
# tofi config
-
programs.tofi = {
-
enable = true;
-
settings = {
-
font = "Fira Sans";
-
font-size = 24;
-
-
prompt-text = ''"> "'';
-
placeholder-text = "search for something";
-
hide-cursor = true;
-
-
corner-radius = 10;
-
outline-width = 3;
-
border-width = 0;
-
padding-left = "4%";
-
padding-top = "2%";
-
padding-right = 0;
-
padding-bottom = 0;
-
-
outline-color = "#1E2030";
-
text-color = "#cad3f5";
-
prompt-color = "#ed8796";
-
placeholder-color = "#8087A2";
-
selection-color = "#eed49f";
-
background-color = "#24273a";
-
-
width = "35%";
-
height = "15%";
-
};
-
};
-
};
-
}
-26
modules/home/system/nixpkgs.nix.disabled
···
-
{
-
lib,
-
pkgs,
-
config,
-
inputs,
-
...
-
}:
-
{
-
options.nixpkgs.enable = lib.mkEnableOption "Enable custom nixpkgs overlays/config";
-
config = lib.mkIf config.nixpkgs.enable {
-
nixpkgs = {
-
overlays = [
-
(final: prev: {
-
unstable = import inputs.nixpkgs-unstable {
-
inherit (pkgs.stdenv.hostPlatform) system;
-
config.allowUnfree = true;
-
};
-
})
-
];
-
config = {
-
allowUnfree = true;
-
allowUnfreePredicate = _: true;
-
};
-
};
-
};
-
}
-637
modules/home/system/shell.nix
···
-
{
-
lib,
-
pkgs,
-
config,
-
inputs,
-
...
-
}:
-
let
-
tangled-setup = pkgs.writeShellScriptBin "tangled-setup" ''
-
# Configuration
-
default_plc_id="did:plc:krxbvxvis5skq7jj6eot23ul"
-
default_github_username="taciturnaxolotl"
-
default_knot_host="knot.dunkirk.sh"
-
-
# Verify git repository
-
if ! ${pkgs.git}/bin/git rev-parse --is-inside-work-tree &>/dev/null; then
-
${pkgs.gum}/bin/gum style --foreground 196 "Not a git repository"
-
exit 1
-
fi
-
-
repo_name=$(basename "$(${pkgs.git}/bin/git rev-parse --show-toplevel)")
-
${pkgs.gum}/bin/gum style --bold --foreground 212 "Configuring tangled remotes for: $repo_name"
-
echo
-
-
# Check current remotes
-
origin_url=$(${pkgs.git}/bin/git remote get-url origin 2>/dev/null)
-
github_url=$(${pkgs.git}/bin/git remote get-url github 2>/dev/null)
-
origin_is_knot=false
-
github_username="$default_github_username"
-
-
# Extract GitHub username from existing origin if it's GitHub
-
if [[ "$origin_url" == *"github.com"* ]]; then
-
github_username=$(echo "$origin_url" | ${pkgs.gnused}/bin/sed -E 's/.*github\.com[:/]([^/]+)\/.*$/\1/')
-
fi
-
-
# Check if origin points to knot
-
if [[ "$origin_url" == *"$default_knot_host"* ]]; then
-
origin_is_knot=true
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ Origin → knot ($origin_url)"
-
elif [[ -n "$origin_url" ]]; then
-
${pkgs.gum}/bin/gum style --foreground 214 "! Origin → $origin_url (not knot)"
-
else
-
${pkgs.gum}/bin/gum style --foreground 214 "! Origin not configured"
-
fi
-
-
# Check github remote
-
if [[ -n "$github_url" ]]; then
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ GitHub → $github_url"
-
else
-
${pkgs.gum}/bin/gum style --foreground 214 "! GitHub remote not configured"
-
fi
-
-
echo
-
-
# Configure origin remote if needed
-
if [[ "$origin_is_knot" = false ]]; then
-
should_migrate=true
-
if [[ -n "$origin_url" ]]; then
-
${pkgs.gum}/bin/gum confirm "Migrate origin from $origin_url to knot?" || should_migrate=false
-
fi
-
-
if [[ "$should_migrate" = true ]]; then
-
plc_id=$(${pkgs.gum}/bin/gum input --placeholder "$default_plc_id" --prompt "PLC ID: " --value "$default_plc_id")
-
plc_id=''${plc_id:-$default_plc_id}
-
-
if ${pkgs.git}/bin/git remote get-url origin &>/dev/null; then
-
${pkgs.git}/bin/git remote remove origin
-
fi
-
${pkgs.git}/bin/git remote add origin "git@$default_knot_host:''${plc_id}/''${repo_name}"
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ Configured origin → git@$default_knot_host:''${plc_id}/''${repo_name}"
-
fi
-
fi
-
-
# Configure github remote if needed
-
if [[ -z "$github_url" ]]; then
-
username=$(${pkgs.gum}/bin/gum input --placeholder "$github_username" --prompt "GitHub username: " --value "$github_username")
-
username=''${username:-$github_username}
-
-
${pkgs.git}/bin/git remote add github "git@github.com:''${username}/''${repo_name}.git"
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ Configured github → git@github.com:''${username}/''${repo_name}.git"
-
fi
-
-
echo
-
-
# Configure default push remote
-
current_remote=$(${pkgs.git}/bin/git config --get branch.main.remote 2>/dev/null)
-
if [[ -z "$current_remote" ]]; then
-
if ${pkgs.gum}/bin/gum confirm "Set origin (knot) as default push remote?"; then
-
${pkgs.git}/bin/git config branch.main.remote origin
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ Default push remote → origin"
-
fi
-
elif [[ "$current_remote" != "origin" ]]; then
-
${pkgs.gum}/bin/gum style --foreground 117 "Current default: $current_remote"
-
if ${pkgs.gum}/bin/gum confirm "Change default push remote to origin (knot)?"; then
-
${pkgs.git}/bin/git config branch.main.remote origin
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ Default push remote → origin"
-
fi
-
else
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ Default push remote is origin"
-
fi
-
'';
-
-
assh = pkgs.writeShellScriptBin "assh" ''
-
# SSH auto-reconnect
-
host=$1
-
port=$2
-
-
if [[ -z "$host" || -z "$port" ]]; then
-
${pkgs.gum}/bin/gum style --foreground 196 "Usage: assh <host> <port>"
-
exit 1
-
fi
-
-
${pkgs.gum}/bin/gum style --foreground 212 "Connecting to $host:$port (auto-reconnect enabled)..."
-
-
while true; do
-
${pkgs.openssh}/bin/ssh -p "$port" -o "BatchMode yes" "$host" || {
-
${pkgs.gum}/bin/gum style --foreground 214 "Connection lost. Reconnecting in 1s..."
-
sleep 1
-
}
-
done
-
'';
-
-
hackatime-summary = pkgs.writeShellScriptBin "hackatime-summary" ''
-
# Hackatime summary
-
user_id=""
-
use_waka=false
-
-
# Parse arguments
-
while [[ $# -gt 0 ]]; do
-
case "$1" in
-
--waka)
-
use_waka=true
-
shift
-
;;
-
*)
-
user_id="$1"
-
shift
-
;;
-
esac
-
done
-
-
if [[ -z "$user_id" ]]; then
-
user_id=$(${pkgs.gum}/bin/gum input --placeholder "Enter user ID" --prompt "User ID: ")
-
if [[ -z "$user_id" ]]; then
-
${pkgs.gum}/bin/gum style --foreground 196 "No user ID provided"
-
exit 1
-
fi
-
fi
-
-
if [[ "$use_waka" = true ]]; then
-
host="waka.hackclub.com"
-
else
-
host="hackatime.hackclub.com"
-
fi
-
-
${pkgs.gum}/bin/gum spin --spinner dot --title "Fetching summary from $host for $user_id..." -- \
-
${pkgs.curl}/bin/curl -s -X 'GET' \
-
"https://$host/api/summary?user=''${user_id}&interval=month" \
-
-H 'accept: application/json' \
-
-H 'Authorization: Bearer 2ce9e698-8a16-46f0-b49a-ac121bcfd608' \
-
> /tmp/hackatime-$$.json
-
-
${pkgs.gum}/bin/gum style --bold --foreground 212 "Summary for $user_id"
-
echo
-
-
# Extract and display total time
-
total_seconds=$(${pkgs.jq}/bin/jq -r '
-
if (.categories | length) > 0 then
-
(.categories | map(.total) | add)
-
elif (.projects | length) > 0 then
-
(.projects | map(.total) | add)
-
else
-
0
-
end
-
' /tmp/hackatime-$$.json)
-
-
if [[ "$total_seconds" -gt 0 ]]; then
-
hours=$((total_seconds / 3600))
-
minutes=$(((total_seconds % 3600) / 60))
-
seconds=$((total_seconds % 60))
-
${pkgs.gum}/bin/gum style --foreground 35 "Total time: ''${hours}h ''${minutes}m ''${seconds}s"
-
else
-
${pkgs.gum}/bin/gum style --foreground 214 "No activity recorded"
-
fi
-
-
echo
-
-
# Top projects
-
${pkgs.gum}/bin/gum style --bold "Top Projects:"
-
${pkgs.jq}/bin/jq -r '
-
if (.projects | length) > 0 then
-
.projects | sort_by(-.total) | .[0:10] | .[] |
-
" \(.key): \((.total / 3600 | floor))h \(((.total % 3600) / 60) | floor)m"
-
else
-
" No projects"
-
end
-
' /tmp/hackatime-$$.json
-
-
echo
-
-
# Top languages
-
${pkgs.gum}/bin/gum style --bold "Top Languages:"
-
${pkgs.jq}/bin/jq -r '
-
if (.languages | length) > 0 then
-
.languages | sort_by(-.total) | .[0:10] | .[] |
-
" \(.key): \((.total / 3600 | floor))h \(((.total % 3600) / 60) | floor)m"
-
else
-
" No languages"
-
end
-
' /tmp/hackatime-$$.json
-
-
rm -f /tmp/hackatime-$$.json
-
'';
-
-
now = pkgs.writeShellScriptBin "now" ''
-
# Post AtProto status updates
-
message=""
-
prompt_message=true
-
-
# Parse arguments
-
while [[ $# -gt 0 ]]; do
-
case "$1" in
-
-m|--message)
-
message="$2"
-
prompt_message=false
-
shift 2
-
;;
-
*)
-
${pkgs.gum}/bin/gum style --foreground 196 "Usage: now [-m|--message \"your message\"]"
-
exit 1
-
;;
-
esac
-
done
-
-
# Load account information from agenix secrets
-
if [[ -f "/run/agenix/bluesky" ]]; then
-
source "/run/agenix/bluesky"
-
else
-
${pkgs.gum}/bin/gum style --foreground 196 "Error: Bluesky credentials file not found at /run/agenix/bluesky"
-
exit 1
-
fi
-
-
# Prompt for message if none provided
-
if [[ "$prompt_message" = true ]]; then
-
message=$(${pkgs.gum}/bin/gum input --placeholder "What's happening?" --prompt "$ACCOUNT1 is: ")
-
if [[ -z "$message" ]]; then
-
${pkgs.gum}/bin/gum style --foreground 214 "No message provided. Aborting."
-
exit 1
-
fi
-
fi
-
-
${pkgs.gum}/bin/gum spin --spinner dot --title "Posting to Bluesky..." -- /bin/bash <<EOF
-
# Generate JWT for ACCOUNT1
-
account1_response=\$(${pkgs.curl}/bin/curl -s -X POST \
-
-H "Content-Type: application/json" \
-
-d '{
-
"identifier": "'$ACCOUNT1'",
-
"password": "'$ACCOUNT1_PASSWORD'"
-
}' \
-
"https://bsky.social/xrpc/com.atproto.server.createSession")
-
-
account1_jwt=\$(echo "\$account1_response" | ${pkgs.jq}/bin/jq -r '.accessJwt')
-
-
if [[ -z "\$account1_jwt" || "\$account1_jwt" == "null" ]]; then
-
echo "Failed to authenticate account $ACCOUNT1" >&2
-
echo "Response: \$account1_response" >&2
-
exit 1
-
fi
-
-
# Generate JWT for ACCOUNT2
-
account2_response=\$(${pkgs.curl}/bin/curl -s -X POST \
-
-H "Content-Type: application/json" \
-
-d '{
-
"identifier": "'$ACCOUNT2'",
-
"password": "'$ACCOUNT2_PASSWORD'"
-
}' \
-
"https://bsky.social/xrpc/com.atproto.server.createSession")
-
-
account2_jwt=\$(echo "\$account2_response" | ${pkgs.jq}/bin/jq -r '.accessJwt')
-
-
if [[ -z "\$account2_jwt" || "\$account2_jwt" == "null" ]]; then
-
echo "Failed to authenticate account $ACCOUNT2" >&2
-
echo "Response: \$account2_response" >&2
-
exit 1
-
fi
-
-
# Post to ACCOUNT1 as a.status.updates
-
account1_post_response=\$(${pkgs.curl}/bin/curl -s -X POST \
-
-H "Content-Type: application/json" \
-
-H "Authorization: Bearer \$account1_jwt" \
-
-d '{
-
"collection": "a.status.update",
-
"repo": "'$ACCOUNT1'",
-
"record": {
-
"\$type": "a.status.update",
-
"text": "'"$message"'",
-
"createdAt": "'\$(date -u +"%Y-%m-%dT%H:%M:%SZ")'"
-
}
-
}' \
-
"https://bsky.social/xrpc/com.atproto.repo.createRecord")
-
-
if [[ \$(echo "\$account1_post_response" | ${pkgs.jq}/bin/jq -r 'has("error")') == "true" ]]; then
-
echo "Error posting to $ACCOUNT1:" >&2
-
echo "\$account1_post_response" | ${pkgs.jq}/bin/jq >&2
-
exit 1
-
fi
-
-
# Post to ACCOUNT2 as normal post
-
account2_post_response=\$(${pkgs.curl}/bin/curl -s -X POST \
-
-H "Content-Type: application/json" \
-
-H "Authorization: Bearer \$account2_jwt" \
-
-d '{
-
"collection": "app.bsky.feed.post",
-
"repo": "'$ACCOUNT2'",
-
"record": {
-
"\$type": "app.bsky.feed.post",
-
"text": "'"$message"'",
-
"createdAt": "'\$(date -u +"%Y-%m-%dT%H:%M:%SZ")'"
-
}
-
}' \
-
"https://bsky.social/xrpc/com.atproto.repo.createRecord")
-
-
if [[ \$(echo "\$account2_post_response" | ${pkgs.jq}/bin/jq -r 'has("error")') == "true" ]]; then
-
echo "Error posting to $ACCOUNT2:" >&2
-
echo "\$account2_post_response" | ${pkgs.jq}/bin/jq >&2
-
exit 1
-
fi
-
EOF
-
-
if [[ $? -eq 0 ]]; then
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ Posted successfully!"
-
else
-
${pkgs.gum}/bin/gum style --foreground 196 "✗ Failed to post"
-
exit 1
-
fi
-
'';
-
-
ghostty-setup = pkgs.writeShellScriptBin "ghostty-setup" ''
-
# Copy Ghostty terminfo to remote host
-
target="$1"
-
-
if [[ -z "$target" ]]; then
-
target=$(${pkgs.gum}/bin/gum input --placeholder "user@host" --prompt "Remote host: ")
-
if [[ -z "$target" ]]; then
-
${pkgs.gum}/bin/gum style --foreground 196 "No target provided"
-
exit 1
-
fi
-
fi
-
-
${pkgs.gum}/bin/gum style --bold --foreground 212 "Setting up Ghostty on $target"
-
echo
-
-
${pkgs.gum}/bin/gum spin --spinner dot --title "Copying SSH key to $target..." -- \
-
${pkgs.openssh}/bin/ssh-copy-id "$target" 2>&1
-
-
if [[ $? -ne 0 ]]; then
-
${pkgs.gum}/bin/gum style --foreground 196 "✗ SSH key copy failed"
-
exit 2
-
fi
-
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ SSH key copied"
-
-
${pkgs.gum}/bin/gum spin --spinner dot --title "Installing xterm-ghostty terminfo on $target..." -- \
-
bash -c "${pkgs.ncurses}/bin/infocmp -x xterm-ghostty | ${pkgs.openssh}/bin/ssh '$target' 'tic -x -'" 2>&1
-
-
if [[ $? -ne 0 ]]; then
-
${pkgs.gum}/bin/gum style --foreground 196 "✗ Terminfo transfer failed"
-
exit 3
-
fi
-
-
${pkgs.gum}/bin/gum style --foreground 35 "✓ Terminfo installed"
-
echo
-
${pkgs.gum}/bin/gum style --foreground 35 --bold "Done! Ghostty is ready on $target"
-
'';
-
in
-
{
-
options.atelier.shell.enable = lib.mkEnableOption "Custom shell config";
-
config = lib.mkIf config.atelier.shell.enable {
-
programs.oh-my-posh = {
-
enable = true;
-
enableZshIntegration = true;
-
settings = {
-
upgrade = {
-
notice = false;
-
interval = "2w";
-
auto = false;
-
};
-
version = 2;
-
final_space = true;
-
console_title_template = "{{ .Shell }} in {{ .Folder }}";
-
blocks = [
-
{
-
type = "prompt";
-
alignment = "left";
-
newline = true;
-
segments = [
-
{
-
type = "session";
-
background = "transparent";
-
foreground = "yellow";
-
template = "{{ if .SSHSession }}{{.HostName}} {{ end }}";
-
}
-
{
-
type = "text";
-
style = "plain";
-
background = "transparent";
-
foreground = "green";
-
template = "{{ if .Env.ZMX_SESSION }}[{{ .Env.ZMX_SESSION }}] {{ end }}";
-
}
-
{
-
type = "path";
-
style = "plain";
-
background = "transparent";
-
foreground = "blue";
-
template = "{{ .Path }} ";
-
properties = {
-
style = "full";
-
};
-
}
-
{
-
type = "git";
-
style = "plain";
-
foreground = "p:grey";
-
background = "transparent";
-
template = "{{if not .Detached}}{{ .HEAD }}{{else}}@{{ printf \"%.7s\" .Commit.Sha }}{{end}}{{ if .Staging.Changed }} ({{ .Staging.String }}){{ end }}{{ if .Working.Changed }}*{{ end }} <cyan>{{ if .BranchStatus }}{{ .BranchStatus }}{{ end }}</>";
-
properties = {
-
branch_icon = "";
-
branch_identical_icon = "";
-
branch_gone_icon = "";
-
branch_ahead_icon = "⇡";
-
branch_behind_icon = "⇣";
-
commit_icon = "@";
-
fetch_status = true;
-
};
-
}
-
];
-
}
-
{
-
type = "rprompt";
-
overflow = "hidden";
-
segments = [
-
{
-
type = "executiontime";
-
style = "plain";
-
foreground = "yellow";
-
background = "transparent";
-
template = "{{ .FormattedMs }}";
-
properties = {
-
threshold = 3000;
-
};
-
}
-
{
-
type = "nix-shell";
-
style = "plain";
-
foreground = "red";
-
background = "transparent";
-
template = ''{{if ne .Type "unknown" }} {{ .Type }}{{ end }}'';
-
}
-
];
-
}
-
{
-
type = "prompt";
-
alignment = "left";
-
newline = true;
-
segments = [
-
{
-
type = "text";
-
style = "plain";
-
foreground_templates = [
-
"{{if gt .Code 0}}red{{end}}"
-
"{{if eq .Code 0}}{{if .Env.SSH_CONNECTION}}cyan{{else}}magenta{{end}}{{end}}"
-
];
-
background = "transparent";
-
template = "❯";
-
}
-
];
-
}
-
];
-
transient_prompt = {
-
foreground_templates = [
-
"{{if gt .Code 0}}red{{end}}"
-
"{{if eq .Code 0}}{{if .Env.SSH_CONNECTION}}cyan{{else}}magenta{{end}}{{end}}"
-
];
-
background = "transparent";
-
template = "❯ ";
-
};
-
secondary_prompt = {
-
foreground = "p:gray";
-
background = "transparent";
-
template = "❯❯ ";
-
};
-
palette = {
-
grey = "#6c6c6c";
-
};
-
};
-
};
-
-
programs.zsh = {
-
enable = true;
-
enableCompletion = true;
-
syntaxHighlighting.enable = true;
-
-
shellAliases = {
-
cat = "bat";
-
ls = "eza";
-
ll = "eza -l";
-
la = "eza -la";
-
gc = "git commit";
-
gp = "git push";
-
rr = "rm -Rf";
-
ghrpc = "gh repo create -c";
-
goops = "git commit --amend --no-edit && git push --force-with-lease";
-
vi = "nvim";
-
vim = "nvim";
-
};
-
initContent = ''
-
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Za-z}'
-
zstyle ':completion:*' list-colors "''${(s.:.)LS_COLORS}"
-
zstyle ':completion:*' menu no
-
zstyle ':fzf-tab:complete:cd:*' fzf-preview 'ls --color $realpath'
-
zstyle ':fzf-tab:complete:__zoxide_z:*' fzf-preview 'ls --color $realpath'
-
-
eval "$(terminal-wakatime init)"
-
'';
-
history = {
-
size = 10000;
-
path = "${config.xdg.dataHome}/zsh/history";
-
ignoreDups = true;
-
ignoreAllDups = true;
-
ignoreSpace = true;
-
expireDuplicatesFirst = true;
-
share = true;
-
extended = true;
-
append = true;
-
};
-
-
oh-my-zsh = {
-
enable = true;
-
plugins = [
-
"git"
-
"sudo"
-
"docker"
-
"git"
-
"command-not-found"
-
"colored-man-pages"
-
];
-
};
-
-
plugins = [
-
{
-
# will source zsh-autosuggestions.plugin.zsh
-
name = "zsh-autosuggestions";
-
src = pkgs.fetchFromGitHub {
-
owner = "zsh-users";
-
repo = "zsh-autosuggestions";
-
rev = "v0.7.0";
-
sha256 = "sha256-KLUYpUu4DHRumQZ3w59m9aTW6TBKMCXl2UcKi4uMd7w=";
-
};
-
}
-
{
-
# will source zsh-sytax-highlighting
-
name = "zsh-sytax-highlighting";
-
src = pkgs.fetchFromGitHub {
-
owner = "zsh-users";
-
repo = "zsh-syntax-highlighting";
-
rev = "0.8.0";
-
sha256 = "sha256-iJdWopZwHpSyYl5/FQXEW7gl/SrKaYDEtTH9cGP7iPo=";
-
};
-
}
-
{
-
# fzf tab completion
-
name = "fzf-tab";
-
src = pkgs.fetchFromGitHub {
-
owner = "aloxaf";
-
repo = "fzf-tab";
-
rev = "v1.1.2";
-
sha256 = "sha256-Qv8zAiMtrr67CbLRrFjGaPzFZcOiMVEFLg1Z+N6VMhg=";
-
};
-
}
-
];
-
};
-
-
programs.zoxide = {
-
enable = true;
-
enableZshIntegration = true;
-
};
-
programs.fzf = {
-
enable = true;
-
enableZshIntegration = true;
-
colors = {
-
bg = lib.mkForce "";
-
};
-
};
-
programs.atuin = {
-
enable = true;
-
settings = {
-
auto_sync = true;
-
sync_frequency = "5m";
-
sync_address = "https://api.atuin.sh";
-
search_mode = "fuzzy";
-
update_check = false;
-
style = "auto";
-
sync.records = true;
-
dotfiles.enabled = false;
-
};
-
};
-
programs.yazi = {
-
enable = true;
-
enableZshIntegration = true;
-
};
-
-
home.packages = with pkgs; [
-
tangled-setup
-
assh
-
hackatime-summary
-
now
-
ghostty-setup
-
pkgs.unstable.wakatime-cli
-
inputs.terminal-wakatime.packages.${pkgs.stdenv.hostPlatform.system}.default
-
unzip
-
dog
-
dust
-
wget
-
curl
-
jq
-
fd
-
eza
-
bat
-
ripgrep
-
ripgrep-all
-
neofetch
-
glow
-
];
-
-
atelier.shell.git.enable = lib.mkDefault true;
-
};
-
}
-57
modules/home/wm/hyprland/default.nix
···
-
{
-
lib,
-
pkgs,
-
config,
-
...
-
}:
-
{
-
options.atelier.wm.hyprland.enable = lib.mkEnableOption "Enable Hyprland config";
-
config = lib.mkIf config.atelier.wm.hyprland.enable {
-
atelier.apps.tofi.enable = true;
-
programs.hyprlock.enable = true;
-
-
atelier.wallpapers.enable = true;
-
-
xdg.configFile."hypr/macchiato.conf".source = ../../../../dots/macchiato.conf;
-
xdg.configFile."hypr/hyprland.conf".source = ../../../../dots/hyprland.conf;
-
xdg.configFile."hypr/prettify-ss.sh".source = ../../../../dots/prettify-ss.sh;
-
xdg.configFile."hypr/tofi-emoji.sh".source = ../../../../dots/tofi-emoji.sh;
-
xdg.configFile."hypr/hyprlock.conf".source = ../../../../dots/hyprlock.conf;
-
xdg.configFile."face.jpeg".source = ../../../../dots/face.jpeg;
-
xdg.configFile."hypr/hyprpaper.conf".source = ../../../../dots/hyprpaper.conf;
-
xdg.configFile."hypr/hyprrec.sh".source = ../../../../dots/hyprrec.sh;
-
xdg.configFile."hypr/charge-alert.sh".source = ../../../../dots/charge-alert.sh;
-
-
xdg.portal = {
-
enable = true;
-
extraPortals = with pkgs; [ xdg-desktop-portal-gtk ];
-
configPackages = with pkgs; [ xdg-desktop-portal-gtk ];
-
};
-
-
services.mako = {
-
enable = true;
-
settings = {
-
default-timeout = 4000;
-
margin = "58,6";
-
font = "Fira Sans 12";
-
border-radius = 5;
-
};
-
};
-
-
services.udiskie = {
-
enable = true;
-
settings = {
-
program_options = {
-
udisks_version = 2;
-
tray = false;
-
};
-
notifications = {
-
device_unmounted = false;
-
device_added = -1;
-
device_removed = -1;
-
device_mounted = -1;
-
};
-
};
-
};
-
};
-
}
-41
modules/home/wm/hyprland/hypridle.nix
···
-
{
-
lib,
-
config,
-
...
-
}:
-
{
-
config = lib.mkIf config.atelier.wm.hyprland.enable {
-
services.hypridle = {
-
enable = true;
-
settings = {
-
general = {
-
after_sleep_cmd = "hyprctl dispatch dpms on";
-
before_sleep_cmd = "hyprlock";
-
ignore_dbus_inhibit = false;
-
lock_cmd = "pidof hyprlock || hyprlock";
-
};
-
-
listener = [
-
{
-
timeout = 30;
-
on-timeout = "kill $(pidof wluma); brightnessctl -s set 10";
-
on-resume = "brightnessctl -r; wluma &";
-
}
-
{
-
timeout = 45;
-
on-timeout = "loginctl lock-session";
-
}
-
{
-
timeout = 90;
-
on-timeout = "hyprctl dispatch dpms off";
-
on-resume = "hyprctl dispatch dpms on";
-
}
-
{
-
timeout = 150;
-
on-timeout = "systemctl suspend";
-
}
-
];
-
};
-
};
-
};
-
}
-405
modules/home/wm/hyprland/waybar.nix
···
-
{
-
lib,
-
pkgs,
-
config,
-
...
-
}:
-
let
-
commonDeps = with pkgs; [
-
coreutils
-
gnugrep
-
systemd
-
];
-
# Function to simplify making waybar outputs
-
mkScript =
-
{
-
name ? "script",
-
deps ? [ ],
-
script ? "",
-
}:
-
lib.getExe (
-
pkgs.writeShellApplication {
-
inherit name;
-
text = script;
-
runtimeInputs = commonDeps ++ deps;
-
}
-
);
-
# Specialized for JSON outputs
-
mkScriptJson =
-
{
-
name ? "script",
-
deps ? [ ],
-
pre ? "",
-
text ? "",
-
tooltip ? "",
-
alt ? "",
-
class ? "",
-
percentage ? "",
-
}:
-
mkScript {
-
inherit name;
-
deps = [ pkgs.jq ] ++ deps;
-
script = ''
-
${pre}
-
jq -cn \
-
--arg text "${text}" \
-
--arg tooltip "${tooltip}" \
-
--arg alt "${alt}" \
-
--arg class "${class}" \
-
--arg percentage "${percentage}" \
-
'{text:$text,tooltip:$tooltip,alt:$alt,class:$class,percentage:$percentage}'
-
'';
-
};
-
in
-
{
-
config = lib.mkIf config.atelier.wm.hyprland.enable {
-
# Let it try to start a few more times
-
systemd.user.services.waybar = {
-
Unit.StartLimitBurst = 30;
-
};
-
programs.waybar = {
-
enable = true;
-
package = pkgs.waybar.overrideAttrs (oa: {
-
mesonFlags = (oa.mesonFlags or [ ]) ++ [ "-Dexperimental=true" ];
-
});
-
systemd.enable = true;
-
settings = {
-
primary = {
-
exclusive = false;
-
passthrough = false;
-
height = 46;
-
margin = "6";
-
position = "top";
-
modules-left = [
-
"custom/os"
-
"hyprland/workspaces"
-
"hyprland/submap"
-
];
-
-
modules-center = [
-
"cpu"
-
"memory"
-
"disk"
-
"clock"
-
"pulseaudio"
-
"battery"
-
"idle_inhibitor"
-
];
-
-
modules-right = [
-
"network"
-
"bluetooth"
-
"tray"
-
"privacy"
-
"custom/webcam"
-
"custom/hostname"
-
];
-
-
clock = {
-
interval = 1;
-
format = "{:%d/%m %H:%M:%S}";
-
format-alt = "{:%Y-%m-%d %H:%M:%S %z}";
-
on-click-left = "mode";
-
tooltip-format = ''
-
<big>{:%Y %B}</big>
-
<tt><small>{calendar}</small></tt>'';
-
};
-
-
cpu = {
-
format = " {usage}%";
-
};
-
-
memory = {
-
format = " {}%";
-
interval = 5;
-
};
-
-
disk = {
-
interval = 5;
-
unit = "GB";
-
format = "󰋊 {percentage_used}%";
-
};
-
-
pulseaudio = {
-
format = "{icon} {volume}%";
-
format-muted = " 0%";
-
format-icons = {
-
headphone = "󰋋 ";
-
headset = "󰋎 ";
-
portable = " ";
-
default = [
-
" "
-
" "
-
" "
-
];
-
};
-
on-click = lib.getExe pkgs.pavucontrol;
-
};
-
-
idle_inhibitor = {
-
format = "{icon}";
-
format-icons = {
-
activated = "󰅶 ";
-
deactivated = "󰾫 ";
-
};
-
tooltip-format-activated = "Caffinated! device will not sleep.";
-
tooltip-format-deactivated = "no caffeine :( device will sleep when not in use.";
-
};
-
-
battery = {
-
interval = 5;
-
bat = "BAT1";
-
# full-at = 94;
-
format = "{icon} {capacity}%";
-
format-icons = [
-
"󰁺"
-
"󰁻"
-
"󰁼"
-
"󰁽"
-
"󰁾"
-
"󰁿"
-
"󰂀"
-
"󰂁"
-
"󰂂"
-
"󰁹"
-
];
-
states = {
-
battery-10 = 10;
-
battery-20 = 20;
-
battery-30 = 30;
-
battery-40 = 40;
-
battery-50 = 50;
-
battery-60 = 60;
-
battery-70 = 70;
-
battery-80 = 80;
-
battery-90 = 90;
-
battery-100 = 100;
-
};
-
# <https://github.com/Alexays/Waybar/issues/1938>
-
# the wiki lies about this, does not match
-
# /sys/class/power_supply/BAT0/status
-
format-plugged = "󰚥 AC";
-
format-charging-battery-10 = "󰢜 {capacity}%";
-
format-charging-battery-20 = "󰂆 {capacity}%";
-
format-charging-battery-30 = "󰂇 {capacity}%";
-
format-charging-battery-40 = "󰂈 {capacity}%";
-
format-charging-battery-50 = "󰢝 {capacity}%";
-
format-charging-battery-60 = "󰂉 {capacity}%";
-
format-charging-battery-70 = "󰢞 {capacity}%";
-
format-charging-battery-80 = "󰂊 {capacity}%";
-
format-charging-battery-90 = "󰂋 {capacity}%";
-
format-charging-battery-100 = "󰂅 {capacity}%";
-
};
-
-
"hyprland/workspaces" = {
-
format = "{icon} {windows}";
-
window-rewrite-default = " ";
-
window-rewrite-seperator = "";
-
window-rewrite = {
-
"title<.*github.*>" = "󰊤 ";
-
"title<.*youtube.*>" = " ";
-
"title<*Gmail*>" = "󰊫 ";
-
"class<firefox>" = " ";
-
"obs" = " ";
-
"alacritty" = " ";
-
"class<com.mitchellh.ghostty>" = "󰊠 ";
-
"foot" = " ";
-
"code" = "󰨞 ";
-
"slack" = "󰒱 ";
-
"spotify" = "󰓇 ";
-
"class<org.gnome.Nautilus>" = "󰉓 ";
-
"class<kicad>" = " ";
-
"class<dev.zed.Zed>" = " ";
-
"class<chromium-browser>" = " ";
-
"class<vesktop>" = " ";
-
};
-
};
-
-
network = {
-
interval = 3;
-
format-wifi = "{icon} {essid}";
-
format-icons = [
-
"󰤟"
-
"󰤢"
-
"󰤥"
-
"󰤨"
-
];
-
format-ethernet = "󰈁 Connected";
-
format-disconnected = "󱐤 ";
-
tooltip-format = ''
-
{ifname}
-
{ipaddr}/{cidr}
-
Up: {bandwidthUpBits}
-
Down: {bandwidthDownBits}'';
-
on-click = mkScript {
-
deps = [
-
pkgs.wpa_supplicant
-
pkgs.notify-desktop
-
];
-
script = ''wpa_cli reconnect; notify-desktop "reconnecting to wifi" -t 1200'';
-
};
-
};
-
-
bluetooth = {
-
format-on = "󰂯";
-
format-off = "󰂲";
-
format-disabled = "󰂲";
-
format-connected = "󰂱 {num_connections}";
-
format-connected-battery = "󰂱 {device_alias} ({device_battery_percentage}%) ({num_connections})";
-
on-click = "overskride";
-
};
-
-
"custom/os" = {
-
interval = 1;
-
return-type = "json";
-
exec = mkScriptJson {
-
text = " ";
-
tooltip = ''$(grep PRETTY_NAME /etc/os-release | cut -d '"' -f2)'';
-
};
-
};
-
-
"custom/hostname" = {
-
exec = mkScript { script = ''echo "$USER@$HOSTNAME"''; };
-
on-click = mkScript { script = "systemctl --user restart waybar"; };
-
};
-
-
privacy = {
-
"icon-spacing" = 0;
-
"icon-size" = 18;
-
"transition-duration" = 250;
-
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;
-
}
-
];
-
};
-
-
"custom/webcam" = {
-
return-type = "json";
-
interval = 2;
-
exec = mkScript {
-
deps = [
-
pkgs.jq
-
pkgs.psmisc
-
];
-
script = ''
-
# get programs using the video0 endpoint
-
PIDS=$(fuser /dev/video0 2>/dev/null || echo "")
-
if [ -n "$PIDS" ]; then
-
# Using pgrep instead of grepping ps output
-
for pid in $PIDS; do
-
process_info=$(ps -p "$pid" -o pid,cmd --no-headers)
-
if [ -n "$process_info" ]; then
-
echo "$process_info" | awk '{command=$2; for(i=3;i<=NF;i++) command=command" "$i; print "{\"tooltip\": \""command"\"}"}'
-
fi
-
done | grep -v "grep" |\
-
jq -s 'if length > 0 then {text: "󰄀 ", tooltip: (map(.tooltip) | join("\r"))} else {text: "", tooltip: ""} end'
-
else
-
echo '{"text": "", "tooltip": ""}'
-
fi | jq --unbuffered --compact-output
-
'';
-
};
-
};
-
};
-
};
-
-
# Cheatsheet:
-
# x -> all sides
-
# x y -> vertical, horizontal
-
# x y z -> top, horizontal, bottom
-
# w x y z -> top, right, bottom, left
-
style =
-
# css
-
''
-
* {
-
font-family: Fira Sans, FiraCode Nerd Font;
-
font-size: 12pt;
-
padding: 0;
-
margin: 0 0.4em;
-
}
-
-
window#waybar {
-
padding: 0;
-
border-radius: 0.5em;
-
background-color: shade(@surface0, 0.7);
-
color: @surface2
-
}
-
.modules-left {
-
margin-left: -0.65em;
-
}
-
.modules-right {
-
margin-right: -0.65em;
-
}
-
-
#workspaces button {
-
background-color: @surface0;
-
color: @surface2;
-
padding-left: 0.2em;
-
padding-right: 0.2em;
-
margin-left: 0.25em;
-
margin-right: 0.25em;
-
margin-top: 0.4em;
-
margin-bottom: 0.4em;
-
}
-
#workspaces button.hidden {
-
background-color: @surface0;
-
color: @surface2;
-
}
-
#workspaces button.focused,
-
#workspaces button.active {
-
background-color: shade(@blue, 0.7);
-
color: @green;
-
}
-
-
#workspaces button:hover {
-
background-color: @surface3;
-
color: @surface1;
-
}
-
-
#privacy-item {
-
margin-left: 0.1em;
-
margin-right: 0.1em;
-
}
-
-
#clock {
-
padding-right: 1em;
-
padding-left: 1em;
-
border-radius: 0.5em;
-
}
-
-
#custom-os {
-
background-color: @surface3;
-
color: @blue;
-
padding-right: 1em;
-
padding-left: 1em;
-
margin-right: 0;
-
border-radius: 0.5em;
-
}
-
#custom-hostname {
-
background-color: @surface3;
-
color: @blue;
-
padding-right: 1em;
-
padding-left: 1em;
-
margin-left: 0;
-
border-radius: 0.5em;
-
}
-
#custom-gpu, #cpu, #memory {
-
margin-left: 0.05em;
-
margin-right: 0.55em;
-
}
-
'';
-
};
-
};
-
}
-296
modules/nixos/apps/tuigreet.nix
···
-
{
-
lib,
-
config,
-
pkgs,
-
...
-
}:
-
let
-
cfg = config.atelier.apps.tuigreet;
-
tuigreetBin = "${pkgs.greetd.tuigreet}/bin/tuigreet";
-
msg = cfg.greeting;
-
baseArgs =
-
[ ]
-
++ lib.optionals cfg.time [ "--time" ]
-
++ lib.optionals cfg.issue [ "--issue" ]
-
++ lib.optionals (msg != null && msg != "") [
-
"-g"
-
msg
-
]
-
++ lib.optionals (cfg.timeFormat != null) [
-
"--time-format"
-
cfg.timeFormat
-
]
-
++ lib.optionals (cfg.width != null) [
-
"--width"
-
(toString cfg.width)
-
]
-
++ lib.optionals (cfg.theme != null) [
-
"--theme"
-
cfg.theme
-
]
-
++ lib.optionals cfg.asterisks [ "--asterisks" ]
-
++ lib.optionals (cfg.asterisksChar != null) [
-
"--asterisks-char"
-
cfg.asterisksChar
-
]
-
++ lib.optionals (cfg.windowPadding != null) [
-
"--window-padding"
-
(toString cfg.windowPadding)
-
]
-
++ lib.optionals (cfg.containerPadding != null) [
-
"--container-padding"
-
(toString cfg.containerPadding)
-
]
-
++ lib.optionals (cfg.promptPadding != null) [
-
"--prompt-padding"
-
(toString cfg.promptPadding)
-
]
-
++ lib.optionals (cfg.greetAlign != null) [
-
"--greet-align"
-
cfg.greetAlign
-
]
-
++ lib.optionals cfg.remember [ "--remember" ]
-
++ lib.optionals cfg.rememberSession [ "--remember-session" ]
-
++ lib.optionals cfg.rememberUserSession [ "--remember-user-session" ]
-
++ lib.optionals cfg.userMenu [ "--user-menu" ]
-
++ lib.optionals (cfg.userMenuMinUid != null) [
-
"--user-menu-min-uid"
-
(toString cfg.userMenuMinUid)
-
]
-
++ lib.optionals (cfg.userMenuMaxUid != null) [
-
"--user-menu-max-uid"
-
(toString cfg.userMenuMaxUid)
-
]
-
++ lib.concatMap (e: [
-
"--env"
-
e
-
]) cfg.env
-
++ lib.optionals (cfg.sessions != null && cfg.sessions != [ ]) [
-
"--sessions"
-
(lib.concatStringsSep ":" cfg.sessions)
-
]
-
++ lib.optionals (cfg.xsessions != null && cfg.xsessions != [ ]) [
-
"--xsessions"
-
(lib.concatStringsSep ":" cfg.xsessions)
-
]
-
++ lib.optionals (cfg.sessionWrapper != null && cfg.sessionWrapper != [ ]) [
-
"--session-wrapper"
-
(lib.escapeShellArg (lib.concatStringsSep " " cfg.sessionWrapper))
-
]
-
++ lib.optionals (cfg.xsessionWrapper != null && cfg.xsessionWrapper != [ ]) [
-
"--xsession-wrapper"
-
(lib.escapeShellArg (lib.concatStringsSep " " cfg.xsessionWrapper))
-
]
-
++ lib.optionals cfg.noXsessionWrapper [ "--no-xsession-wrapper" ]
-
++ lib.optionals (cfg.powerShutdown != null && cfg.powerShutdown != [ ]) [
-
"--power-shutdown"
-
(lib.escapeShellArg (lib.concatStringsSep " " cfg.powerShutdown))
-
]
-
++ lib.optionals (cfg.powerReboot != null && cfg.powerReboot != [ ]) [
-
"--power-reboot"
-
(lib.escapeShellArg (lib.concatStringsSep " " cfg.powerReboot))
-
]
-
++ lib.optionals cfg.powerNoSetsid [ "--power-no-setsid" ]
-
++ lib.optionals (cfg.kbCommand != null) [
-
"--kb-command"
-
(toString cfg.kbCommand)
-
]
-
++ lib.optionals (cfg.kbSessions != null) [
-
"--kb-sessions"
-
(toString cfg.kbSessions)
-
]
-
++ lib.optionals (cfg.kbPower != null) [
-
"--kb-power"
-
(toString cfg.kbPower)
-
]
-
++ cfg.extraArgs;
-
cmd = lib.concatStringsSep " " (
-
[ tuigreetBin ]
-
++ baseArgs
-
++ [
-
"--cmd"
-
cfg.command
-
]
-
++ lib.optional (cfg.debugFile != null) ("--debug " + cfg.debugFile)
-
);
-
in
-
{
-
options.atelier.apps.tuigreet = {
-
enable = lib.mkEnableOption "Enable greetd with tuigreet";
-
-
command = lib.mkOption {
-
type = lib.types.str;
-
default = "Hyprland";
-
description = "Command to launch after login (e.g., Hyprland, niri, sway, etc.)";
-
};
-
-
extraArgs = lib.mkOption {
-
type = lib.types.listOf lib.types.str;
-
default = [ ];
-
description = "Extra arguments passed to tuigreet (appended).";
-
};
-
-
greeting = lib.mkOption {
-
type = lib.types.nullOr lib.types.str;
-
default = "WARNING: UNAUTHORIZED ACCESS WILL RESULT IN TERMINATION OF SESSION. IDENTIFY YOURSELF";
-
description = "Greeting text shown above login prompt (-g/--greeting).";
-
};
-
-
time = lib.mkOption {
-
type = lib.types.bool;
-
default = true;
-
description = "Show time";
-
};
-
issue = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
description = "Show /etc/issue";
-
};
-
timeFormat = lib.mkOption {
-
type = lib.types.nullOr lib.types.str;
-
default = null;
-
};
-
width = lib.mkOption {
-
type = lib.types.nullOr lib.types.ints.positive;
-
default = null;
-
};
-
theme = lib.mkOption {
-
type = lib.types.nullOr lib.types.str;
-
default = null;
-
};
-
asterisks = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
};
-
asterisksChar = lib.mkOption {
-
type = lib.types.nullOr lib.types.str;
-
default = null;
-
};
-
windowPadding = lib.mkOption {
-
type = lib.types.nullOr lib.types.ints.unsigned;
-
default = null;
-
};
-
containerPadding = lib.mkOption {
-
type = lib.types.nullOr lib.types.ints.unsigned;
-
default = null;
-
};
-
promptPadding = lib.mkOption {
-
type = lib.types.nullOr lib.types.ints.unsigned;
-
default = null;
-
};
-
greetAlign = lib.mkOption {
-
type = lib.types.nullOr (
-
lib.types.enum [
-
"left"
-
"center"
-
"right"
-
]
-
);
-
default = null;
-
};
-
-
remember = lib.mkOption {
-
type = lib.types.bool;
-
default = true;
-
};
-
rememberSession = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
};
-
rememberUserSession = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
};
-
userMenu = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
};
-
userMenuMinUid = lib.mkOption {
-
type = lib.types.nullOr lib.types.ints.positive;
-
default = null;
-
};
-
userMenuMaxUid = lib.mkOption {
-
type = lib.types.nullOr lib.types.ints.positive;
-
default = null;
-
};
-
-
env = lib.mkOption {
-
type = lib.types.listOf lib.types.str;
-
default = [ ];
-
};
-
sessions = lib.mkOption {
-
type = lib.types.listOf lib.types.str;
-
default = [ ];
-
};
-
xsessions = lib.mkOption {
-
type = lib.types.listOf lib.types.str;
-
default = [ ];
-
};
-
-
sessionWrapper = lib.mkOption {
-
type = lib.types.listOf lib.types.str;
-
default = [ ];
-
};
-
xsessionWrapper = lib.mkOption {
-
type = lib.types.listOf lib.types.str;
-
default = [ ];
-
};
-
noXsessionWrapper = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
};
-
-
powerShutdown = lib.mkOption {
-
type = lib.types.listOf lib.types.str;
-
default = [ ];
-
};
-
powerReboot = lib.mkOption {
-
type = lib.types.listOf lib.types.str;
-
default = [ ];
-
};
-
powerNoSetsid = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
};
-
-
kbCommand = lib.mkOption {
-
type = lib.types.nullOr (lib.types.ints.between 1 12);
-
default = null;
-
};
-
kbSessions = lib.mkOption {
-
type = lib.types.nullOr (lib.types.ints.between 1 12);
-
default = null;
-
};
-
kbPower = lib.mkOption {
-
type = lib.types.nullOr (lib.types.ints.between 1 12);
-
default = null;
-
};
-
-
debugFile = lib.mkOption {
-
type = lib.types.nullOr lib.types.str;
-
default = null;
-
};
-
};
-
-
config = lib.mkIf cfg.enable {
-
services.greetd = {
-
enable = true;
-
settings = {
-
default_session = {
-
command = cmd;
-
user = "greeter";
-
};
-
};
-
};
-
-
systemd.services.greetd.serviceConfig = {
-
Type = "idle";
-
StandardInput = "tty";
-
StandardOutput = "tty";
-
StandardError = "journal";
-
TTYReset = true;
-
TTYVHangup = true;
-
TTYVTDisallocate = true;
-
};
-
};
-
}
-212
modules/nixos/services/README.md
···
-
# NixOS Service Modules
-
-
This directory contains reusable NixOS service modules for deploying applications.
-
-
## Architecture
-
-
Each service module follows a common pattern for deploying TypeScript/Bun applications:
-
-
### Directory Structure
-
- **Data Directory**: `/var/lib/<service-name>/`
-
- `app/` - Git repository clone
-
- `data/` - Application data (databases, uploads, etc.)
-
-
### Systemd Service Pattern
-
-
1. **ExecStartPre** (runs as root with `+` prefix):
-
- Creates data directories
-
- Sets ownership to service user
-
- Ensures proper permissions
-
-
2. **preStart** (runs as service user):
-
- Clones git repository if needed
-
- Pulls latest changes (if `autoUpdate` enabled)
-
- Runs `bun install`
-
- Initializes database if needed
-
-
3. **ExecStart** (runs as service user):
-
- Starts the application with `bun start`
-
-
### Common Options
-
-
All service modules support:
-
-
```nix
-
atelier.services.<service-name> = {
-
enable = true; # Enable the service
-
domain = "app.example.com"; # Domain for Caddy reverse proxy
-
port = 3000; # Port the app listens on
-
dataDir = "/var/lib/<service>"; # Data storage location
-
secretsFile = path; # agenix secrets file
-
repository = "https://..."; # Git repository URL
-
autoUpdate = true; # Git pull on service restart
-
};
-
```
-
-
### Secrets Management
-
-
Secrets are managed using [agenix](https://github.com/ryantm/agenix):
-
-
1. Add secret to `secrets/secrets.nix`:
-
```nix
-
"service-name.age".publicKeys = [ kierank ];
-
```
-
-
2. Create and encrypt the secret:
-
```bash
-
agenix -e secrets/service-name.age
-
```
-
-
3. Add environment variables (one per line):
-
```
-
DATABASE_URL=postgres://...
-
API_KEY=xxxxx
-
SECRET_TOKEN=yyyyy
-
```
-
-
4. Reference in machine config:
-
```nix
-
age.secrets.service-name = {
-
file = ../../secrets/service-name.age;
-
owner = "service-name";
-
};
-
-
atelier.services.service-name = {
-
secretsFile = config.age.secrets.service-name.path;
-
};
-
```
-
-
### Reverse Proxy (Caddy)
-
-
Each service automatically configures a Caddy virtual host with:
-
- Cloudflare DNS challenge for TLS
-
- Reverse proxy to the application port
-
-
## GitHub Actions Deployment
-
-
Services can be deployed via GitHub Actions using SSH over Tailscale.
-
-
### Prerequisites
-
-
1. **Tailscale OAuth Client**:
-
- Create at https://login.tailscale.com/admin/settings/oauth
-
- Required scope: `auth_keys` (to authenticate ephemeral nodes)
-
- Add to GitHub repo secrets:
-
- `TS_OAUTH_CLIENT_ID`
-
- `TS_OAUTH_SECRET`
-
-
2. **SSH Access**:
-
- Add the service user to Tailscale SSH ACLs
-
- Example in `tailscale.com/admin/acls`:
-
```json
-
"ssh": [
-
{
-
"action": "accept",
-
"src": ["tag:ci"],
-
"dst": ["tag:server"],
-
"users": ["cachet", "hn-alerts", "root"]
-
}
-
]
-
```
-
-
### Workflow Template
-
-
Create `.github/workflows/deploy-<service>.yaml`:
-
-
```yaml
-
name: Deploy <Service Name>
-
-
on:
-
push:
-
branches:
-
- main
-
workflow_dispatch:
-
-
jobs:
-
deploy:
-
runs-on: ubuntu-latest
-
steps:
-
- uses: actions/checkout@v3
-
-
- name: Setup Tailscale
-
uses: tailscale/github-action@v3
-
with:
-
oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }}
-
oauth-secret: ${{ secrets.TS_OAUTH_SECRET }}
-
tags: tag:ci
-
use-cache: "true"
-
-
- name: Configure SSH
-
run: |
-
mkdir -p ~/.ssh
-
echo "StrictHostKeyChecking no" >> ~/.ssh/config
-
-
- name: Deploy to server
-
run: |
-
ssh <service-user>@<hostname> << 'EOF'
-
cd /var/lib/<service>/app
-
git fetch --all
-
git reset --hard origin/main
-
bun install
-
sudo /run/current-system/sw/bin/systemctl restart <service>.service
-
EOF
-
-
- name: Wait for service to start
-
run: sleep 10
-
-
- name: Health check
-
run: |
-
HEALTH_URL="https://<domain>/health"
-
MAX_RETRIES=6
-
RETRY_DELAY=5
-
-
for i in $(seq 1 $MAX_RETRIES); do
-
echo "Health check attempt $i/$MAX_RETRIES..."
-
-
RESPONSE=$(curl -s -w "\n%{http_code}" "$HEALTH_URL" || echo "000")
-
HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
-
BODY=$(echo "$RESPONSE" | sed '$d')
-
-
if [ "$HTTP_CODE" = "200" ]; then
-
echo "✅ Service is healthy"
-
echo "$BODY"
-
exit 0
-
fi
-
-
echo "❌ Health check failed with HTTP $HTTP_CODE"
-
echo "$BODY"
-
-
if [ $i -lt $MAX_RETRIES ]; then
-
echo "Retrying in ${RETRY_DELAY}s..."
-
sleep $RETRY_DELAY
-
fi
-
done
-
-
echo "❌ Health check failed after $MAX_RETRIES attempts"
-
exit 1
-
```
-
-
### Deployment Flow
-
-
1. Push to `main` branch triggers workflow
-
2. GitHub Actions runner joins Tailscale network
-
3. SSH to service user on target server
-
4. Git pull latest changes
-
5. Install dependencies
-
6. Restart systemd service
-
7. Verify health check endpoint
-
-
## Creating a New Service Module
-
-
1. Copy an existing module (e.g., `cachet.nix` or `hn-alerts.nix`)
-
2. Update service name, user, and group
-
3. Adjust environment variables as needed
-
4. Add database initialization if required
-
5. Configure secrets in `secrets/secrets.nix`
-
6. Import in machine config
-
7. Create GitHub Actions workflow (if needed)
-
-
## Example Services
-
-
- **cachet** - Slack emoji/profile cache
-
- **hn-alerts** - Hacker News monitoring and alerts
-162
modules/nixos/services/battleship-arena.nix
···
-
{ config, lib, pkgs, ... }:
-
-
with lib;
-
-
let
-
cfg = config.atelier.services.battleship-arena;
-
in
-
{
-
options.atelier.services.battleship-arena = {
-
enable = mkEnableOption "battleship-arena service";
-
-
domain = mkOption {
-
type = types.str;
-
default = "battleship.dunkirk.sh";
-
description = "Domain name for the web interface";
-
};
-
-
sshPort = mkOption {
-
type = types.port;
-
default = 2222;
-
description = "SSH port for battleship arena";
-
};
-
-
webPort = mkOption {
-
type = types.port;
-
default = 8081;
-
description = "Web interface port";
-
};
-
-
uploadDir = mkOption {
-
type = types.str;
-
default = "/var/lib/battleship-arena/submissions";
-
description = "Directory for uploaded submissions";
-
};
-
-
resultsDb = mkOption {
-
type = types.str;
-
default = "/var/lib/battleship-arena/results.db";
-
description = "Path to results database";
-
};
-
-
adminPasscode = mkOption {
-
type = types.str;
-
default = "battleship-admin-override";
-
description = "Admin passcode for batch uploads";
-
};
-
-
secretsFile = mkOption {
-
type = types.nullOr types.path;
-
default = null;
-
description = "Path to agenix secrets file containing BATTLESHIP_ADMIN_PASSCODE";
-
};
-
-
package = mkOption {
-
type = types.package;
-
description = "The battleship-arena package to use";
-
};
-
};
-
-
config = mkIf cfg.enable {
-
users.users.battleship-arena = {
-
isSystemUser = true;
-
group = "battleship-arena";
-
home = "/var/lib/battleship-arena";
-
createHome = true;
-
};
-
-
users.groups.battleship-arena = {};
-
-
systemd.services.battleship-arena = {
-
description = "Battleship Arena SSH/Web Service";
-
after = [ "network.target" ];
-
wantedBy = [ "multi-user.target" ];
-
-
environment = {
-
BATTLESHIP_HOST = "0.0.0.0";
-
BATTLESHIP_SSH_PORT = toString cfg.sshPort;
-
BATTLESHIP_WEB_PORT = toString cfg.webPort;
-
BATTLESHIP_UPLOAD_DIR = cfg.uploadDir;
-
BATTLESHIP_RESULTS_DB = cfg.resultsDb;
-
BATTLESHIP_ADMIN_PASSCODE = cfg.adminPasscode;
-
BATTLESHIP_EXTERNAL_URL = "https://${cfg.domain}";
-
BATTLESHIP_ENGINE_PATH = "/var/lib/battleship-arena/battleship-engine";
-
CPLUS_INCLUDE_PATH = "/var/lib/battleship-arena/battleship-engine/include";
-
};
-
-
path = [ pkgs.gcc pkgs.coreutils ];
-
-
serviceConfig = {
-
Type = "simple";
-
User = "battleship-arena";
-
Group = "battleship-arena";
-
WorkingDirectory = "/var/lib/battleship-arena";
-
ExecStart = "${cfg.package}/bin/battleship-arena";
-
Restart = "always";
-
RestartSec = "10s";
-
-
# Load secrets if provided
-
EnvironmentFile = mkIf (cfg.secretsFile != null) cfg.secretsFile;
-
-
# Security hardening
-
NoNewPrivileges = true;
-
PrivateTmp = true;
-
ProtectSystem = "strict";
-
ProtectHome = true;
-
ReadWritePaths = [ "/var/lib/battleship-arena" ];
-
};
-
-
preStart = ''
-
mkdir -p ${cfg.uploadDir}
-
mkdir -p $(dirname ${cfg.resultsDb})
-
chown -R battleship-arena:battleship-arena ${cfg.uploadDir}
-
chmod -R u+rwX ${cfg.uploadDir}
-
-
# Generate SSH host key if it doesn't exist
-
if [ ! -f /var/lib/battleship-arena/.ssh/battleship_arena ]; then
-
mkdir -p /var/lib/battleship-arena/.ssh
-
${pkgs.openssh}/bin/ssh-keygen -t ed25519 -f /var/lib/battleship-arena/.ssh/battleship_arena -N ""
-
chown -R battleship-arena:battleship-arena /var/lib/battleship-arena/.ssh
-
fi
-
-
# Copy battleship-engine to writable directory
-
chmod -R u+w /var/lib/battleship-arena/battleship-engine 2>/dev/null || true
-
rm -rf /var/lib/battleship-arena/battleship-engine
-
cp -r ${cfg.package}/share/battleship-arena/battleship-engine /var/lib/battleship-arena/
-
chown -R battleship-arena:battleship-arena /var/lib/battleship-arena/battleship-engine
-
chmod -R u+rwX /var/lib/battleship-arena/battleship-engine
-
'';
-
};
-
-
# Service to recalculate Glicko-2 ratings (manual trigger only)
-
# Ratings automatically recalculate after each round-robin
-
# Use: sudo systemctl start battleship-arena-recalculate
-
systemd.services.battleship-arena-recalculate = {
-
description = "Recalculate Battleship Arena Glicko-2 Ratings";
-
-
environment = {
-
BATTLESHIP_RESULTS_DB = cfg.resultsDb;
-
};
-
-
serviceConfig = {
-
Type = "oneshot";
-
User = "battleship-arena";
-
Group = "battleship-arena";
-
WorkingDirectory = "/var/lib/battleship-arena";
-
ExecStart = "${cfg.package}/bin/battleship-arena recalculate-ratings";
-
};
-
};
-
-
# Allow battleship-arena user to create transient systemd units for sandboxing
-
security.polkit.extraConfig = ''
-
polkit.addRule(function(action, subject) {
-
if (action.id == "org.freedesktop.systemd1.manage-units" &&
-
subject.user == "battleship-arena") {
-
return polkit.Result.YES;
-
}
-
});
-
'';
-
-
networking.firewall.allowedTCPPorts = [ cfg.sshPort ];
-
};
-
}
-97
modules/nixos/services/bore/404.html
···
-
<!DOCTYPE html>
-
<html lang="en">
-
-
<head>
-
<meta charset="UTF-8">
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-
<title>404 - bore</title>
-
<link rel="icon"
-
href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🚇</text></svg>">
-
<style>
-
* {
-
margin: 0;
-
padding: 0;
-
box-sizing: border-box;
-
}
-
-
body {
-
font-family: 'SF Mono', 'Monaco', monospace;
-
background: #0d1117;
-
color: #e6edf3;
-
min-height: 100vh;
-
display: flex;
-
align-items: center;
-
justify-content: center;
-
padding: 2rem;
-
}
-
-
.container {
-
text-align: center;
-
max-width: 600px;
-
}
-
-
.error-code {
-
font-size: 8rem;
-
font-weight: 700;
-
color: #8b949e;
-
line-height: 1;
-
margin-bottom: 1rem;
-
}
-
-
.emoji {
-
font-size: 4rem;
-
margin-bottom: 2rem;
-
opacity: 0.5;
-
}
-
-
h1 {
-
font-size: 2rem;
-
margin-bottom: 1rem;
-
color: #e6edf3;
-
}
-
-
p {
-
color: #8b949e;
-
font-size: 1rem;
-
margin-bottom: 2rem;
-
line-height: 1.6;
-
}
-
-
.countdown {
-
color: #14b8a6;
-
font-size: 1.2rem;
-
font-weight: 600;
-
font-variant-numeric: tabular-nums;
-
}
-
</style>
-
</head>
-
-
<body>
-
<div class="container">
-
<div class="emoji">🚇</div>
-
<div class="error-code">404</div>
-
<h1>wrong stop!</h1>
-
<p>this tunnel doesn't go anywhere. maybe it was never built, or perhaps it collapsed?</p>
-
<p>redirecting in <span class="countdown" id="countdown">5.000</span>s</p>
-
</div>
-
-
<script>
-
let timeLeft = 5000; // 5 seconds in milliseconds
-
const countdownEl = document.getElementById('countdown');
-
const startTime = Date.now();
-
-
const interval = setInterval(() => {
-
const elapsed = Date.now() - startTime;
-
timeLeft = Math.max(0, 5000 - elapsed);
-
-
countdownEl.textContent = (timeLeft / 1000).toFixed(3);
-
-
if (timeLeft <= 0) {
-
clearInterval(interval);
-
window.location.href = 'https://bore.dunkirk.sh';
-
}
-
}, 10); // Update every 10ms for smooth countdown
-
</script>
-
</body>
-
-
</html>
-32
modules/nixos/services/bore/README.md
···
-
# Bore
-
-
![screenshot](https://hc-cdn.hel1.your-objectstorage.com/s/v3/7652f29dacb8f76d_screenshot_2025-12-09_at_16.57.47.png)
-
-
Bore is a lightweight wrapper around `frp` which provides a dashboard and a nice `gum` based cli. If you would like to run this in your own nix flake then simplify vendor this folder and `./modules/home/bore` and import the folders into the appropriate home manager and nixos configurations.
-
-
```nix
-
atelier = {
-
bore = {
-
enable = true;
-
authTokenFile = osConfig.age.secrets.bore.path
-
};
-
}
-
```
-
-
and be sure to have a definition for your agenix secret in the osConfig as well:
-
-
```nix
-
age = {
-
identityPaths = [
-
"path/to/ssh/key"
-
];
-
secrets = {
-
bore = {
-
file = ./path/to/bore.age;
-
owner = "username";
-
};
-
};
-
}
-
```
-
-
The secret file is just a oneline file with the key in it. If you do end up deploying this feel free to email me and let me know! I would love to hear about your setup!
-169
modules/nixos/services/bore/bore.nix
···
-
{
-
config,
-
lib,
-
pkgs,
-
...
-
}:
-
let
-
cfg = config.atelier.services.frps;
-
in
-
{
-
options.atelier.services.frps = {
-
enable = lib.mkEnableOption "frp server for tunneling services";
-
-
bindAddr = lib.mkOption {
-
type = lib.types.str;
-
default = "0.0.0.0";
-
description = "Address to bind frp server to";
-
};
-
-
bindPort = lib.mkOption {
-
type = lib.types.port;
-
default = 7000;
-
description = "Port for frp control connection";
-
};
-
-
vhostHTTPPort = lib.mkOption {
-
type = lib.types.port;
-
default = 7080;
-
description = "Port for HTTP virtual host traffic";
-
};
-
-
authToken = lib.mkOption {
-
type = lib.types.nullOr lib.types.str;
-
default = null;
-
description = "Authentication token for clients (deprecated: use authTokenFile)";
-
};
-
-
authTokenFile = lib.mkOption {
-
type = lib.types.nullOr lib.types.path;
-
default = null;
-
description = "Path to file containing authentication token";
-
};
-
-
domain = lib.mkOption {
-
type = lib.types.str;
-
example = "bore.dunkirk.sh";
-
description = "Base domain for subdomains (e.g., *.bore.dunkirk.sh)";
-
};
-
-
enableCaddy = lib.mkOption {
-
type = lib.types.bool;
-
default = true;
-
description = "Automatically configure Caddy reverse proxy for wildcard domain";
-
};
-
};
-
-
config = lib.mkIf cfg.enable {
-
assertions = [
-
{
-
assertion = cfg.authToken != null || cfg.authTokenFile != null;
-
message = "Either authToken or authTokenFile must be set for frps";
-
}
-
];
-
-
# Open firewall port for frp control connection
-
networking.firewall.allowedTCPPorts = [ cfg.bindPort ];
-
-
# frp server service
-
systemd.services.frps =
-
let
-
tokenConfig =
-
if cfg.authTokenFile != null then
-
''
-
auth.tokenSource.type = "file"
-
auth.tokenSource.file.path = "${cfg.authTokenFile}"
-
''
-
else
-
''auth.token = "${cfg.authToken}"'';
-
-
configFile = pkgs.writeText "frps.toml" ''
-
bindAddr = "${cfg.bindAddr}"
-
bindPort = ${toString cfg.bindPort}
-
vhostHTTPPort = ${toString cfg.vhostHTTPPort}
-
-
# Dashboard and Prometheus metrics
-
webServer.addr = "127.0.0.1"
-
webServer.port = 7400
-
enablePrometheus = true
-
-
# Authentication token - clients need this to connect
-
auth.method = "token"
-
${tokenConfig}
-
-
# Subdomain support for *.${cfg.domain}
-
subDomainHost = "${cfg.domain}"
-
-
# Custom 404 page
-
custom404Page = "${./404.html}"
-
-
# Logging
-
log.to = "console"
-
log.level = "info"
-
'';
-
in
-
{
-
description = "frp server for ${cfg.domain} tunneling";
-
after = [ "network.target" ];
-
wantedBy = [ "multi-user.target" ];
-
serviceConfig = {
-
Type = "simple";
-
Restart = "on-failure";
-
RestartSec = "5s";
-
ExecStart = "${pkgs.frp}/bin/frps -c ${configFile}";
-
};
-
};
-
-
# Automatically configure Caddy for wildcard domain
-
services.caddy = lib.mkIf cfg.enableCaddy {
-
# Dashboard for base domain
-
virtualHosts."${cfg.domain}" = {
-
extraConfig = ''
-
tls {
-
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
-
}
-
header {
-
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
-
}
-
-
# Proxy /api/* to frps dashboard
-
handle /api/* {
-
reverse_proxy localhost:7400
-
}
-
-
# Serve dashboard HTML
-
handle {
-
root * ${./.}
-
try_files dashboard.html
-
file_server
-
}
-
'';
-
};
-
-
# Wildcard subdomain proxy to frps
-
virtualHosts."*.${cfg.domain}" = {
-
extraConfig = ''
-
tls {
-
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
-
}
-
header {
-
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
-
}
-
reverse_proxy localhost:${toString cfg.vhostHTTPPort} {
-
header_up X-Forwarded-Proto {scheme}
-
header_up X-Forwarded-For {remote}
-
header_up Host {host}
-
}
-
handle_errors {
-
@404 expression {http.error.status_code} == 404
-
handle @404 {
-
root * ${./.}
-
rewrite * /404.html
-
file_server
-
}
-
}
-
'';
-
};
-
};
-
};
-
}
-13
modules/nixos/services/bore/bore.toml.example
···
-
# bore tunnel configuration
-
# Save this file as "bore.toml" in your project directory
-
-
[myapp]
-
port = 8000
-
-
[api]
-
port = 3000
-
label = "dev"
-
-
[frontend]
-
port = 5173
-
label = "local"
-626
modules/nixos/services/bore/dashboard.html
···
-
<!DOCTYPE html>
-
<html lang="en">
-
-
<head>
-
<meta charset="UTF-8">
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-
<title>bore</title>
-
<meta name="description" content="bore - secure tunneling service for exposing local services to the internet">
-
<meta property="og:title" content="bore - tunnel dashboard">
-
<meta property="og:description" content="secure tunneling service powered by frp on bore.dunkirk.sh">
-
<meta property="og:type" content="website">
-
<meta property="og:url" content="https://bore.dunkirk.sh">
-
<meta name="twitter:card" content="summary">
-
<meta name="twitter:title" content="bore - tunnel dashboard">
-
<meta name="twitter:description" content="secure tunneling service powered by frp on bore.dunkirk.sh">
-
<link rel="icon"
-
href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🚇</text></svg>">
-
<style>
-
* {
-
margin: 0;
-
padding: 0;
-
box-sizing: border-box;
-
}
-
-
body {
-
font-family: 'SF Mono', 'Monaco', monospace;
-
background: #0d1117;
-
color: #e6edf3;
-
padding: 2rem;
-
line-height: 1.5;
-
min-height: 100vh;
-
display: flex;
-
flex-direction: column;
-
}
-
-
body.loading .container {
-
opacity: 0;
-
}
-
-
.loading-bar {
-
position: fixed;
-
top: 0;
-
left: 0;
-
width: 100%;
-
height: 3px;
-
background: transparent;
-
z-index: 9999;
-
overflow: hidden;
-
}
-
-
.loading-bar::before {
-
content: '';
-
position: absolute;
-
top: 0;
-
left: 0;
-
width: 100%;
-
height: 100%;
-
background: linear-gradient(90deg, #14b8a6, #fb923c);
-
animation: loading 1.5s ease-in-out infinite;
-
}
-
-
body:not(.loading) .loading-bar {
-
display: none;
-
}
-
-
@keyframes loading {
-
0% {
-
transform: translateX(-100%);
-
}
-
50% {
-
transform: translateX(0%);
-
}
-
100% {
-
transform: translateX(100%);
-
}
-
}
-
-
.container {
-
max-width: 1200px;
-
margin: 0 auto;
-
flex: 1;
-
width: 100%;
-
opacity: 1;
-
transition: opacity 0.3s ease-in-out;
-
}
-
-
header {
-
margin-bottom: 3rem;
-
}
-
-
h1 {
-
font-size: 2.5rem;
-
background: linear-gradient(135deg, #14b8a6, #fb923c);
-
-webkit-background-clip: text;
-
-webkit-text-fill-color: transparent;
-
margin-bottom: 0.5rem;
-
}
-
-
.subtitle {
-
color: #8b949e;
-
font-size: 0.95rem;
-
}
-
-
.stats {
-
display: grid;
-
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
-
gap: 1rem;
-
margin-bottom: 2rem;
-
}
-
-
.stat-card {
-
background: #161b22;
-
border: 1px solid #30363d;
-
border-radius: 0;
-
padding: 1.5rem;
-
}
-
-
.stat-label {
-
color: #8b949e;
-
font-size: 0.85rem;
-
margin-bottom: 0.5rem;
-
}
-
-
.stat-value {
-
font-size: 2rem;
-
font-weight: 600;
-
color: #14b8a6;
-
}
-
-
.stat-value.orange {
-
color: #fb923c;
-
}
-
-
.section {
-
background: #161b22;
-
border: 1px solid #30363d;
-
border-radius: 0;
-
padding: 1.5rem;
-
margin-bottom: 2rem;
-
}
-
-
h2 {
-
color: #14b8a6;
-
font-size: 1.2rem;
-
margin-bottom: 1.5rem;
-
display: flex;
-
align-items: center;
-
gap: 0.5rem;
-
}
-
-
.tunnel-list {
-
display: flex;
-
flex-direction: column;
-
gap: 1rem;
-
}
-
-
.tunnel {
-
background: #0d1117;
-
border: 1px solid #30363d;
-
border-radius: 0;
-
padding: 1rem;
-
display: grid;
-
grid-template-columns: 1fr auto;
-
gap: 1rem;
-
align-items: center;
-
}
-
-
.tunnel-icon {
-
display: none;
-
}
-
-
.tunnel-info {
-
flex: 1;
-
}
-
-
.tunnel-name {
-
color: #e6edf3;
-
font-weight: 600;
-
margin-bottom: 0.25rem;
-
display: flex;
-
align-items: center;
-
gap: 0.5rem;
-
}
-
-
.tunnel-label {
-
display: inline-block;
-
padding: 0.125rem 0.5rem;
-
font-size: 0.7rem;
-
font-weight: 500;
-
border-radius: 0;
-
margin-left: 0.25rem;
-
border: 1px solid;
-
}
-
-
.tunnel-url {
-
color: #8b949e;
-
font-size: 0.85rem;
-
}
-
-
.tunnel-url a {
-
color: #14b8a6;
-
text-decoration: none;
-
}
-
-
.tunnel-url a:hover {
-
text-decoration: underline;
-
}
-
-
.tunnel-status {
-
padding: 0.25rem 0.75rem;
-
border-radius: 0;
-
font-size: 0.8rem;
-
font-weight: 500;
-
}
-
-
.status-online {
-
background: rgba(20, 184, 166, 0.2);
-
color: #14b8a6;
-
border: 1px solid #14b8a6;
-
}
-
-
.empty-state {
-
text-align: center;
-
padding: 3rem 1rem;
-
color: #8b949e;
-
}
-
-
.empty-icon {
-
font-size: 3rem;
-
margin-bottom: 1rem;
-
opacity: 0.5;
-
}
-
-
code {
-
background: #0d1117;
-
padding: 0.2rem 0.5rem;
-
border-radius: 0;
-
color: #fb923c;
-
font-size: 0.9rem;
-
}
-
-
.usage {
-
background: #0d1117;
-
padding: 1rem;
-
border-radius: 0;
-
margin-top: 1rem;
-
}
-
-
.usage pre {
-
color: #8b949e;
-
font-size: 0.9rem;
-
overflow-x: auto;
-
}
-
-
.last-updated {
-
text-align: center;
-
color: #8b949e;
-
font-size: 0.8rem;
-
margin-top: 2rem;
-
padding: 2rem 0;
-
}
-
-
.last-updated a {
-
color: #14b8a6;
-
text-decoration: none;
-
}
-
-
.last-updated a:hover {
-
text-decoration: underline;
-
}
-
-
.offline-tunnels {
-
margin-top: 1.5rem;
-
padding-top: 1.5rem;
-
border-top: 1px solid #30363d;
-
}
-
-
.offline-tunnel {
-
padding: 0.5rem 0;
-
color: #8b949e;
-
font-size: 0.85rem;
-
display: flex;
-
justify-content: space-between;
-
align-items: center;
-
}
-
-
.offline-tunnel-name {
-
opacity: 0.6;
-
}
-
-
.offline-tunnel-stats {
-
font-size: 0.75rem;
-
opacity: 0.5;
-
}
-
</style>
-
</head>
-
-
<body class="loading">
-
<div class="loading-bar"></div>
-
<main class="container">
-
<header>
-
<h1>🚇 bore</h1>
-
<p class="subtitle">fancy tunnels @ terebithia</p>
-
</header>
-
-
<div class="stats">
-
<div class="stat-card">
-
<div class="stat-label">active tunnels</div>
-
<div class="stat-value" id="activeTunnels">—</div>
-
</div>
-
<div class="stat-card">
-
<div class="stat-label">active connections</div>
-
<div class="stat-value" id="totalConnections">—</div>
-
</div>
-
<div class="stat-card">
-
<div class="stat-label">server status</div>
-
<div class="stat-value orange" id="serverStatus">—</div>
-
</div>
-
<div class="stat-card">
-
<div class="stat-label">total upload</div>
-
<div class="stat-value" id="totalUpload">—</div>
-
</div>
-
<div class="stat-card">
-
<div class="stat-label">total download</div>
-
<div class="stat-value" id="totalDownload">—</div>
-
</div>
-
</div>
-
-
<section class="section">
-
<h2>~boreholes</h2>
-
<div class="tunnel-list" id="tunnelList">
-
<div class="empty-state">
-
<div class="empty-icon">🚇</div>
-
<p>no active tunnels</p>
-
</div>
-
</div>
-
</section>
-
</main>
-
-
<footer class="last-updated">
-
last updated: <span id="lastUpdated">never</span><br>
-
made with ♥︎ by <a href="https://dunkirk.sh" target="_blank">kieran klukas</a>
-
</footer>
-
-
<script>
-
let fetchFailCount = 0;
-
const MAX_FAIL_COUNT = 3;
-
let lastProxiesState = null;
-
-
// Predefined color palette for labels
-
const labelColors = [
-
{ color: '#a78bfa', bg: 'rgba(167, 139, 250, 0.2)' }, // purple
-
{ color: '#f472b6', bg: 'rgba(244, 114, 182, 0.2)' }, // pink
-
{ color: '#facc15', bg: 'rgba(250, 204, 21, 0.2)' }, // yellow
-
{ color: '#60a5fa', bg: 'rgba(96, 165, 250, 0.2)' }, // blue
-
{ color: '#f87171', bg: 'rgba(248, 113, 113, 0.2)' }, // red
-
{ color: '#38bdf8', bg: 'rgba(56, 189, 248, 0.2)' }, // sky
-
{ color: '#c084fc', bg: 'rgba(192, 132, 252, 0.2)' }, // violet
-
{ color: '#fb7185', bg: 'rgba(251, 113, 133, 0.2)' }, // rose
-
];
-
-
// Hash string to index
-
function stringToColorIndex(str) {
-
let hash = 0;
-
for (let i = 0; i < str.length; i++) {
-
hash = str.charCodeAt(i) + ((hash << 5) - hash);
-
}
-
return Math.abs(hash) % labelColors.length;
-
}
-
-
// Get label color and styles
-
function getLabelStyle(label) {
-
const trimmedLabel = label.trim();
-
if (trimmedLabel === 'prod') {
-
return {
-
color: '#22c55e',
-
bgColor: 'rgba(34, 197, 94, 0.2)',
-
borderColor: '#22c55e'
-
};
-
}
-
-
if (trimmedLabel === 'dev') {
-
return {
-
color: '#fb923c',
-
bgColor: 'rgba(251, 146, 60, 0.2)',
-
borderColor: '#fb923c'
-
};
-
}
-
-
const colorIndex = stringToColorIndex(trimmedLabel);
-
const colorScheme = labelColors[colorIndex];
-
return {
-
color: colorScheme.color,
-
bgColor: colorScheme.bg,
-
borderColor: colorScheme.color
-
};
-
}
-
-
async function fetchStats() {
-
try {
-
// Fetch server info
-
const serverResponse = await fetch('/api/serverinfo');
-
if (!serverResponse.ok) throw new Error('API unavailable');
-
const serverData = await serverResponse.json();
-
-
// Fetch HTTP proxies (tunnels)
-
const proxiesResponse = await fetch('/api/proxy/http');
-
const proxiesData = await proxiesResponse.json();
-
-
// Reset fail count on success
-
fetchFailCount = 0;
-
-
// Update stats
-
document.getElementById('activeTunnels').textContent = serverData.clientCounts || 0;
-
document.getElementById('serverStatus').textContent = 'online';
-
document.getElementById('totalConnections').textContent = serverData.curConns || 0;
-
document.getElementById('totalUpload').textContent = formatBytes(serverData.totalTrafficOut || 0);
-
document.getElementById('totalDownload').textContent = formatBytes(serverData.totalTrafficIn || 0);
-
-
// Update page title
-
const tunnelCount = serverData.clientCounts || 0;
-
const totalTraffic = formatBytes((serverData.totalTrafficIn || 0) + (serverData.totalTrafficOut || 0));
-
document.title = tunnelCount > 0
-
? `bore - ${tunnelCount} active • ${totalTraffic}`
-
: 'bore';
-
-
// Check if tunnel list structure changed
-
const proxies = proxiesData.proxies || [];
-
const currentState = JSON.stringify(proxies.map(p => ({ name: p.name, status: p.status })));
-
-
if (currentState !== lastProxiesState) {
-
// Structure changed, rebuild DOM
-
lastProxiesState = currentState;
-
renderTunnelList(proxies);
-
} else {
-
// Structure unchanged, just update data
-
updateTunnelData(proxies);
-
}
-
-
document.getElementById('lastUpdated').textContent = new Date().toLocaleTimeString();
-
-
// Remove loading class after first successful fetch
-
document.body.classList.remove('loading');
-
} catch (error) {
-
fetchFailCount++;
-
document.getElementById('serverStatus').textContent = 'offline';
-
console.error('Failed to fetch stats:', error);
-
-
// Reload page if failed multiple times (server might have updated)
-
if (fetchFailCount >= MAX_FAIL_COUNT) {
-
console.log('Multiple fetch failures detected, reloading page...');
-
window.location.reload();
-
}
-
}
-
}
-
-
function renderTunnelList(proxies) {
-
const tunnelList = document.getElementById('tunnelList');
-
const onlineTunnels = proxies.filter(p => p.status === 'online');
-
const offlineTunnels = proxies.filter(p => p.status !== 'online');
-
-
if (onlineTunnels.length === 0 && offlineTunnels.length === 0) {
-
tunnelList.innerHTML = `
-
<div class="empty-state">
-
<div class="empty-icon">🚇</div>
-
<p>no active tunnels</p>
-
</div>
-
`;
-
} else {
-
let html = '';
-
-
// Render online tunnels
-
if (onlineTunnels.length > 0) {
-
html += onlineTunnels.map(proxy => {
-
const subdomain = proxy.conf?.subdomain || 'unknown';
-
const url = `https://${subdomain}.bore.dunkirk.sh`;
-
-
// Parse labels from proxy name (format: subdomain[label1,label2])
-
const labelMatch = proxy.name.match(/\[([^\]]+)\]$/);
-
const labels = labelMatch ? labelMatch[1].split(',') : [];
-
const displayName = labels.length > 0 ? proxy.name.replace(/\[[^\]]+\]$/, '') : proxy.name;
-
-
const labelHtml = labels.map(label => {
-
const trimmedLabel = label.trim();
-
const style = getLabelStyle(trimmedLabel);
-
return `<span class="tunnel-label" style="color: ${style.color}; background: ${style.bgColor}; border-color: ${style.borderColor};">${trimmedLabel}</span>`;
-
}).join('');
-
-
return `
-
<div class="tunnel" data-tunnel="${proxy.name}">
-
<div class="tunnel-info">
-
<div class="tunnel-name">
-
${displayName || 'unnamed'}
-
${labelHtml}
-
</div>
-
<div class="tunnel-url">
-
<a href="${url}" target="_blank">${url}</a>
-
</div>
-
<div style="color: #8b949e; font-size: 0.75rem; margin-top: 0.25rem;">
-
started: <span data-start-time="${proxy.lastStartTime || ''}"></span> • traffic in: <span data-traffic-in="${proxy.name}">0 B</span> • out: <span data-traffic-out="${proxy.name}">0 B</span>
-
</div>
-
</div>
-
<div class="tunnel-status status-online">online</div>
-
</div>
-
`;
-
}).join('');
-
}
-
-
// Render offline tunnels
-
if (offlineTunnels.length > 0) {
-
html += '<div class="offline-tunnels">';
-
html += '<div style="color: #8b949e; font-size: 0.85rem; margin-bottom: 0.75rem;">recently disconnected</div>';
-
html += offlineTunnels.map(proxy => {
-
// Parse labels from proxy name (format: subdomain[label1,label2])
-
const labelMatch = proxy.name.match(/\[([^\]]+)\]$/);
-
const labels = labelMatch ? labelMatch[1].split(',').map(l => l.trim()) : [];
-
const displayName = labels.length > 0 ? proxy.name.replace(/\[[^\]]+\]$/, '') : proxy.name;
-
const labelStr = labels.length > 0 ? ` [${labels.join(', ')}]` : '';
-
-
if (!proxy.conf) {
-
return `
-
<div class="offline-tunnel" data-tunnel="${proxy.name}">
-
<span class="offline-tunnel-name">${displayName || 'unnamed'}${labelStr}</span>
-
<span class="offline-tunnel-stats">in: <span data-traffic-in="${proxy.name}">0 B</span> • out: <span data-traffic-out="${proxy.name}">0 B</span></span>
-
</div>
-
`;
-
}
-
-
const subdomain = proxy.conf.subdomain || 'unknown';
-
const url = `https://${subdomain}.bore.dunkirk.sh`;
-
return `
-
<div class="offline-tunnel" data-tunnel="${proxy.name}">
-
<span class="offline-tunnel-name">${displayName || 'unnamed'}${labelStr} → ${url}</span>
-
<span class="offline-tunnel-stats">in: <span data-traffic-in="${proxy.name}">0 B</span> • out: <span data-traffic-out="${proxy.name}">0 B</span></span>
-
</div>
-
`;
-
}).join('');
-
html += '</div>';
-
}
-
-
tunnelList.innerHTML = html;
-
-
// Update all relative times
-
updateRelativeTimes();
-
-
-
}
-
-
// Update data
-
updateTunnelData(proxies);
-
}
-
-
function updateTunnelData(proxies) {
-
proxies.forEach(proxy => {
-
const trafficInEl = document.querySelector(`[data-traffic-in="${proxy.name}"]`);
-
const trafficOutEl = document.querySelector(`[data-traffic-out="${proxy.name}"]`);
-
-
if (trafficInEl) trafficInEl.textContent = formatBytes(proxy.todayTrafficIn || 0);
-
if (trafficOutEl) trafficOutEl.textContent = formatBytes(proxy.todayTrafficOut || 0);
-
-
-
});
-
-
// Update relative times
-
updateRelativeTimes();
-
}
-
-
function formatBytes(bytes) {
-
if (bytes === 0) return '0 B';
-
const k = 1024;
-
const sizes = ['B', 'KB', 'MB', 'GB'];
-
const i = Math.floor(Math.log(bytes) / Math.log(k));
-
return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];
-
}
-
-
function formatTime(timeStr) {
-
// Input format: "12-08 20:15:20" (MM-DD HH:MM:SS)
-
const [datePart, timePart] = timeStr.split(' ');
-
const [month, day] = datePart.split('-');
-
const [hour, minute, second] = timePart.split(':');
-
-
const now = new Date();
-
const inputDate = new Date(now.getFullYear(), parseInt(month) - 1, parseInt(day), parseInt(hour), parseInt(minute), parseInt(second));
-
-
const diffInSeconds = (now.getTime() - inputDate.getTime()) / 1000;
-
const diffInMinutes = Math.round(diffInSeconds / 60);
-
const diffInHours = Math.round(diffInMinutes / 60);
-
-
if (diffInSeconds < 60) {
-
return 'just now';
-
} else if (diffInHours < 1) {
-
return diffInMinutes === 1 ? '1 minute ago' : `${diffInMinutes} minutes ago`;
-
} else if (now.toDateString() === inputDate.toDateString()) {
-
return 'today';
-
} else if (
-
new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1).toDateString() ===
-
inputDate.toDateString()
-
) {
-
return 'yesterday';
-
} else {
-
return inputDate.toLocaleTimeString([], {
-
month: 'numeric',
-
day: 'numeric',
-
hour: 'numeric',
-
minute: 'numeric',
-
});
-
}
-
}
-
-
function updateRelativeTimes() {
-
document.querySelectorAll('[data-start-time]').forEach(element => {
-
const timeStr = element.getAttribute('data-start-time');
-
element.textContent = formatTime(timeStr);
-
});
-
}
-
-
// Fetch immediately and then every 5 seconds
-
fetchStats();
-
setInterval(fetchStats, 5000);
-
-
// Update relative times every 10 seconds
-
setInterval(updateRelativeTimes, 10000);
-
</script>
-
</body>
-
-
</html>
-131
modules/nixos/services/cachet.nix
···
-
{
-
config,
-
lib,
-
pkgs,
-
...
-
}:
-
let
-
cfg = config.atelier.services.cachet;
-
in
-
{
-
options.atelier.services.cachet = {
-
enable = lib.mkEnableOption "Cachet Slack emoji/profile cache";
-
-
domain = lib.mkOption {
-
type = lib.types.str;
-
description = "Domain to serve cachet on";
-
};
-
-
port = lib.mkOption {
-
type = lib.types.port;
-
default = 3000;
-
description = "Port to run cachet on";
-
};
-
-
dataDir = lib.mkOption {
-
type = lib.types.path;
-
default = "/var/lib/cachet";
-
description = "Directory to store cachet data";
-
};
-
-
secretsFile = lib.mkOption {
-
type = lib.types.path;
-
description = "Path to secrets file containing SLACK_TOKEN, SLACK_SIGNING_SECRET, BEARER_TOKEN";
-
};
-
-
repository = lib.mkOption {
-
type = lib.types.str;
-
default = "https://github.com/taciturnaxolotl/cachet.git";
-
description = "Git repository URL (optional, for auto-deployment)";
-
};
-
-
autoUpdate = lib.mkEnableOption "Automatically git pull on service restart";
-
};
-
-
config = lib.mkIf cfg.enable {
-
users.groups.services = { };
-
-
users.users.cachet = {
-
isSystemUser = true;
-
group = "cachet";
-
extraGroups = [ "services" ];
-
home = cfg.dataDir;
-
createHome = true;
-
shell = pkgs.bash;
-
};
-
-
users.groups.cachet = { };
-
-
security.sudo.extraRules = [
-
{
-
users = [ "cachet" ];
-
commands = [
-
{
-
command = "/run/current-system/sw/bin/systemctl restart cachet.service";
-
options = [ "NOPASSWD" ];
-
}
-
];
-
}
-
];
-
-
systemd.services.cachet = {
-
description = "Cachet Slack emoji/profile cache";
-
wantedBy = [ "multi-user.target" ];
-
after = [ "network.target" ];
-
path = [ pkgs.git ];
-
-
preStart = ''
-
if [ ! -d ${cfg.dataDir}/app/.git ]; then
-
${pkgs.git}/bin/git clone ${cfg.repository} ${cfg.dataDir}/app
-
fi
-
-
cd ${cfg.dataDir}/app
-
'' + lib.optionalString cfg.autoUpdate ''
-
${pkgs.git}/bin/git pull
-
'' + ''
-
-
if [ ! -f src/index.ts ]; then
-
echo "No code found at ${cfg.dataDir}/app/src/index.ts"
-
exit 1
-
fi
-
-
echo "Installing dependencies..."
-
${pkgs.unstable.bun}/bin/bun install
-
'';
-
-
serviceConfig = {
-
Type = "simple";
-
User = "cachet";
-
Group = "cachet";
-
EnvironmentFile = cfg.secretsFile;
-
Environment = [
-
"NODE_ENV=production"
-
"PORT=${toString cfg.port}"
-
"DATABASE_PATH=${cfg.dataDir}/data/cachet.db"
-
];
-
ExecStart = "${pkgs.bash}/bin/bash -c 'cd ${cfg.dataDir}/app && ${pkgs.unstable.bun}/bin/bun run src/index.ts'";
-
Restart = "always";
-
RestartSec = "10s";
-
};
-
-
serviceConfig.ExecStartPre = [
-
"+${pkgs.writeShellScript "cachet-setup" ''
-
mkdir -p ${cfg.dataDir}/data
-
mkdir -p ${cfg.dataDir}/app
-
chown -R cachet:services ${cfg.dataDir}
-
chmod -R g+rwX ${cfg.dataDir}
-
''}"
-
];
-
};
-
-
services.caddy.virtualHosts.${cfg.domain} = {
-
extraConfig = ''
-
tls {
-
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
-
}
-
-
reverse_proxy localhost:${toString cfg.port}
-
'';
-
};
-
};
-
}
-139
modules/nixos/services/emojibot.nix
···
-
{
-
config,
-
lib,
-
pkgs,
-
...
-
}:
-
let
-
cfg = config.atelier.services.emojibot;
-
in
-
{
-
options.atelier.services.emojibot = {
-
enable = lib.mkEnableOption "Emojibot Slack emoji management service";
-
-
domain = lib.mkOption {
-
type = lib.types.str;
-
description = "Domain to serve emojibot on";
-
};
-
-
port = lib.mkOption {
-
type = lib.types.port;
-
default = 3002;
-
description = "Port to run emojibot on";
-
};
-
-
dataDir = lib.mkOption {
-
type = lib.types.path;
-
default = "/var/lib/emojibot";
-
description = "Directory to store emojibot data";
-
};
-
-
secretsFile = lib.mkOption {
-
type = lib.types.path;
-
description = ''
-
Path to secrets file containing:
-
- SLACK_SIGNING_SECRET
-
- SLACK_BOT_TOKEN
-
- SLACK_APP_TOKEN
-
- SLACK_BOT_USER_TOKEN (get from browser, see emojibot README)
-
- SLACK_COOKIE (get from browser, see emojibot README)
-
- SLACK_WORKSPACE (e.g. "myworkspace" for myworkspace.slack.com)
-
- SLACK_CHANNEL (channel ID where emojis are posted)
-
- ADMINS (comma-separated list of slack user IDs)
-
'';
-
};
-
-
repository = lib.mkOption {
-
type = lib.types.str;
-
default = "https://github.com/taciturnaxolotl/emojibot.git";
-
description = "Git repository URL (optional, for auto-deployment)";
-
};
-
-
autoUpdate = lib.mkEnableOption "Automatically git pull on service restart";
-
};
-
-
config = lib.mkIf cfg.enable {
-
users.groups.services = { };
-
-
users.users.emojibot = {
-
isSystemUser = true;
-
group = "emojibot";
-
extraGroups = [ "services" ];
-
home = cfg.dataDir;
-
createHome = true;
-
shell = pkgs.bash;
-
};
-
-
users.groups.emojibot = { };
-
-
security.sudo.extraRules = [
-
{
-
users = [ "emojibot" ];
-
commands = [
-
{
-
command = "/run/current-system/sw/bin/systemctl restart emojibot.service";
-
options = [ "NOPASSWD" ];
-
}
-
];
-
}
-
];
-
-
systemd.services.emojibot = {
-
description = "Emojibot Slack emoji management service";
-
wantedBy = [ "multi-user.target" ];
-
after = [ "network.target" ];
-
path = [ pkgs.git ];
-
-
preStart = ''
-
if [ ! -d ${cfg.dataDir}/app/.git ]; then
-
${pkgs.git}/bin/git clone ${cfg.repository} ${cfg.dataDir}/app
-
fi
-
-
cd ${cfg.dataDir}/app
-
'' + lib.optionalString cfg.autoUpdate ''
-
${pkgs.git}/bin/git pull
-
'' + ''
-
-
if [ ! -f src/index.ts ]; then
-
echo "No code found at ${cfg.dataDir}/app/src/index.ts"
-
exit 1
-
fi
-
-
echo "Installing dependencies..."
-
${pkgs.unstable.bun}/bin/bun install
-
'';
-
-
serviceConfig = {
-
Type = "simple";
-
User = "emojibot";
-
Group = "emojibot";
-
EnvironmentFile = cfg.secretsFile;
-
Environment = [
-
"NODE_ENV=production"
-
"PORT=${toString cfg.port}"
-
];
-
ExecStart = "${pkgs.bash}/bin/bash -c 'cd ${cfg.dataDir}/app && ${pkgs.unstable.bun}/bin/bun run src/index.ts'";
-
Restart = "always";
-
RestartSec = "10s";
-
};
-
-
serviceConfig.ExecStartPre = [
-
"+${pkgs.writeShellScript "emojibot-setup" ''
-
mkdir -p ${cfg.dataDir}/app
-
chown -R emojibot:services ${cfg.dataDir}
-
chmod -R g+rwX ${cfg.dataDir}
-
''}"
-
];
-
};
-
-
services.caddy.virtualHosts.${cfg.domain} = {
-
extraConfig = ''
-
tls {
-
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
-
}
-
-
reverse_proxy localhost:${toString cfg.port}
-
'';
-
};
-
};
-
}
-124
modules/nixos/services/hn-alerts.nix
···
-
{
-
config,
-
lib,
-
pkgs,
-
...
-
}:
-
let
-
cfg = config.atelier.services.hn-alerts;
-
in
-
{
-
options.atelier.services.hn-alerts = {
-
enable = lib.mkEnableOption "HN Alerts Hacker News monitoring service";
-
-
domain = lib.mkOption {
-
type = lib.types.str;
-
description = "Domain to serve hn-alerts on";
-
};
-
-
port = lib.mkOption {
-
type = lib.types.port;
-
default = 3001;
-
description = "Port to run hn-alerts on";
-
};
-
-
dataDir = lib.mkOption {
-
type = lib.types.path;
-
default = "/var/lib/hn-alerts";
-
description = "Directory to store hn-alerts data";
-
};
-
-
secretsFile = lib.mkOption {
-
type = lib.types.path;
-
description = "Path to secrets file containing SLACK_BOT_TOKEN, SLACK_SIGNING_SECRET, SLACK_CHANNEL, SENTRY_DSN, DATABASE_URL";
-
};
-
-
repository = lib.mkOption {
-
type = lib.types.str;
-
default = "https://github.com/taciturnaxolotl/hn-alerts.git";
-
description = "Git repository URL (optional, for auto-deployment)";
-
};
-
-
autoUpdate = lib.mkEnableOption "Automatically git pull on service restart";
-
};
-
-
config = lib.mkIf cfg.enable {
-
users.groups.services = { };
-
-
users.users.hn-alerts = {
-
isSystemUser = true;
-
group = "hn-alerts";
-
extraGroups = [ "services" ];
-
home = cfg.dataDir;
-
createHome = true;
-
shell = pkgs.bash;
-
};
-
-
users.groups.hn-alerts = { };
-
-
security.sudo.extraRules = [
-
{
-
users = [ "hn-alerts" ];
-
commands = [
-
{
-
command = "/run/current-system/sw/bin/systemctl restart hn-alerts.service";
-
options = [ "NOPASSWD" ];
-
}
-
];
-
}
-
];
-
-
systemd.services.hn-alerts = {
-
description = "HN Alerts Hacker News monitoring service";
-
wantedBy = [ "multi-user.target" ];
-
after = [ "network.target" ];
-
path = [ pkgs.git ];
-
-
preStart = ''
-
if [ ! -d ${cfg.dataDir}/app/.git ]; then
-
${pkgs.git}/bin/git clone ${cfg.repository} ${cfg.dataDir}/app
-
fi
-
-
cd ${cfg.dataDir}/app
-
'' + lib.optionalString cfg.autoUpdate ''
-
${pkgs.git}/bin/git pull
-
'' + ''
-
-
if [ ! -f src/index.ts ]; then
-
echo "No code found at ${cfg.dataDir}/app/src/index.ts"
-
exit 1
-
fi
-
-
echo "Installing dependencies..."
-
${pkgs.unstable.bun}/bin/bun install
-
-
echo "Initializing database..."
-
${pkgs.unstable.bun}/bin/bun run db:push
-
'';
-
-
serviceConfig = {
-
Type = "simple";
-
User = "hn-alerts";
-
Group = "hn-alerts";
-
EnvironmentFile = cfg.secretsFile;
-
Environment = [
-
"NODE_ENV=production"
-
"PORT=${toString cfg.port}"
-
];
-
ExecStart = "${pkgs.bash}/bin/bash -c 'cd ${cfg.dataDir}/app && ${pkgs.unstable.bun}/bin/bun start'";
-
Restart = "always";
-
RestartSec = "10s";
-
};
-
};
-
-
services.caddy.virtualHosts.${cfg.domain} = {
-
extraConfig = ''
-
tls {
-
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
-
}
-
-
reverse_proxy localhost:${toString cfg.port}
-
'';
-
};
-
};
-
}
-185
modules/nixos/services/knot-sync.nix
···
-
{
-
config,
-
lib,
-
pkgs,
-
...
-
}:
-
-
let
-
cfg = config.atelier.services.knot-sync;
-
in
-
{
-
options.atelier.services.knot-sync = {
-
enable = lib.mkEnableOption "Knot to GitHub sync service";
-
-
repoDir = lib.mkOption {
-
type = lib.types.str;
-
default = "/home/git/did:plc:krxbvxvis5skq7jj6eot23ul";
-
description = "Directory containing git repositories";
-
};
-
-
githubUsername = lib.mkOption {
-
type = lib.types.str;
-
default = "taciturnaxolotl";
-
description = "GitHub username";
-
};
-
-
secretsFile = lib.mkOption {
-
type = lib.types.path;
-
description = "Path to secrets file containing GITHUB_TOKEN";
-
};
-
-
logFile = lib.mkOption {
-
type = lib.types.str;
-
default = "/home/git/knot-sync.log";
-
description = "Log file location";
-
};
-
-
interval = lib.mkOption {
-
type = lib.types.str;
-
default = "*/5 * * * *";
-
description = "Cron schedule for sync (default: every 5 minutes)";
-
};
-
};
-
-
config = lib.mkIf cfg.enable {
-
systemd.services.knot-sync = {
-
description = "Sync Knot repositories to GitHub";
-
serviceConfig = {
-
Type = "oneshot";
-
User = "git";
-
EnvironmentFile = cfg.secretsFile;
-
ExecStart = pkgs.writeShellScript "knot-sync" ''
-
set -euo pipefail
-
-
# Variables
-
REPO_DIR="${cfg.repoDir}"
-
GITHUB_USERNAME="${cfg.githubUsername}"
-
LOG_FILE="${cfg.logFile}"
-
-
# Log function
-
log() { echo "$(date +'%Y-%m-%d %H:%M:%S'): $1" >> "$LOG_FILE"; }
-
-
# Create the post-receive hook template
-
cat <<'EOF' > /tmp/post-receive.template
-
#!${pkgs.bash}/bin/bash
-
# post-receive hook to sync to GitHub - AUTOGENERATED
-
-
# Load environment variables from secrets file
-
if [ -f "${cfg.secretsFile}" ]; then
-
source "${cfg.secretsFile}"
-
fi
-
-
# Variables
-
GITHUB_USERNAME="${cfg.githubUsername}"
-
LOG_FILE="${cfg.logFile}"
-
REPO_NAME=$(basename $(pwd))
-
-
# Log function
-
log() { echo "$(date +'%Y-%m-%d %H:%M:%S'): $1" >> "''${LOG_FILE}"; }
-
-
# Check for nosync marker
-
if [ -f "$(pwd)/.nosync" ]; then
-
log "Skipping sync for $REPO_NAME (nosync marker present)"
-
exit 0
-
fi
-
-
# Function to sync to GitHub
-
sync_to_github() {
-
log "Syncing $REPO_NAME to GitHub"
-
expected_url="https://''${GITHUB_USERNAME}:''${GITHUB_TOKEN}@github.com/''${GITHUB_USERNAME}/''${REPO_NAME}.git"
-
current_url=$(${pkgs.git}/bin/git remote get-url origin 2>/dev/null || echo "")
-
-
if [ -z "$current_url" ]; then
-
log "Adding origin remote"
-
${pkgs.git}/bin/git remote add origin "$expected_url"
-
elif [ "$current_url" != "$expected_url" ]; then
-
log "Updating origin remote URL"
-
${pkgs.git}/bin/git remote set-url origin "$expected_url"
-
fi
-
-
# Mirror push everything (refs, tags, branches)
-
if ${pkgs.git}/bin/git push --mirror origin 2>&1 | tee -a "''${LOG_FILE}"; then
-
log "Sync succeeded for $REPO_NAME"
-
return 0
-
else
-
log "Sync failed for $REPO_NAME"
-
return 1
-
fi
-
}
-
-
# Main
-
while read oldrev newrev refname; do
-
log "Received push for ref '$refname' (old revision: $oldrev, new revision: $newrev)"
-
sync_to_github
-
done
-
EOF
-
-
HOOK_TEMPLATE="/tmp/post-receive.template"
-
-
# Create the post-receive hook
-
create_hook() {
-
local new_repo_path="$1"
-
local hook_path="$new_repo_path/hooks/post-receive.d/forward"
-
local nosync_marker="$new_repo_path/.nosync"
-
-
# Skip if .nosync marker exists
-
if [ -f "$nosync_marker" ]; then
-
log "Skipping $new_repo_path (nosync marker present)"
-
return 0
-
fi
-
-
if [ -d "$new_repo_path" ] && [ ! -f "$hook_path" ]; then
-
# Check that it's a git repository, specifically a bare repo
-
if [ -f "$new_repo_path/config" ]; then
-
# Create hooks directory if it doesn't exist
-
mkdir -p "$(dirname "$hook_path")"
-
# Create hook from the template file, substituting variables.
-
if cat "$HOOK_TEMPLATE" > "$hook_path" && chmod +x "$hook_path"; then
-
log "Created hook for $new_repo_path"
-
# Check if repo has any commits before pushing
-
if (cd "$new_repo_path" && ${pkgs.git}/bin/git rev-parse HEAD >/dev/null 2>&1); then
-
# Auto push by simulating a post-receive hook trigger
-
log "Triggering initial push for $new_repo_path"
-
(cd "$new_repo_path" && \
-
echo "0000000000000000000000000000000000000000 $(${pkgs.git}/bin/git rev-parse HEAD) refs/heads/main" | \
-
"$hook_path")
-
fi
-
else
-
log "Hook creation failed for $new_repo_path"
-
fi
-
fi
-
fi
-
}
-
-
# Keep track of hooks created
-
hooks_created=0
-
-
# Find all directories that look like bare Git repos without a post-receive hook
-
${pkgs.findutils}/bin/find "$REPO_DIR" -mindepth 1 -maxdepth 1 -type d \! -name ".*" -print0 |
-
while IFS= read -r -d $'\0' repo_path; do
-
create_hook "$repo_path"
-
if [ $? -eq 0 ]; then
-
hooks_created=$((hooks_created + 1))
-
fi
-
done
-
-
# Only log completion if hooks were actually created
-
if [ $hooks_created -gt 0 ]; then
-
log "Sync job complete - Created $hooks_created hooks"
-
fi
-
'';
-
};
-
};
-
-
systemd.paths.knot-sync = {
-
description = "Watch for new Knot repositories";
-
wantedBy = [ "multi-user.target" ];
-
pathConfig = {
-
PathModified = cfg.repoDir;
-
Unit = "knot-sync.service";
-
MakeDirectory = true;
-
};
-
};
-
};
-
}
-99
modules/nixos/system/authentication.nix
···
-
{
-
lib,
-
config,
-
pkgs,
-
...
-
}:
-
let
-
cfg = config.atelier.authentication;
-
in
-
{
-
options.atelier.authentication.enable = lib.mkEnableOption "Enable authentication stack (polkit, keyring, PAM with fprintd)";
-
-
config = lib.mkIf cfg.enable {
-
services.fprintd.enable = true;
-
security.polkit.enable = true;
-
services.gnome.gnome-keyring.enable = true;
-
programs.dconf.enable = true;
-
-
environment.systemPackages = [
-
pkgs.polkit_gnome
-
pkgs.fprintd
-
];
-
-
systemd.user.services.polkit-gnome-authentication-agent-1 = {
-
description = "polkit-gnome-authentication-agent-1";
-
wantedBy = [ "graphical-session.target" ];
-
wants = [ "graphical-session.target" ];
-
after = [ "graphical-session.target" ];
-
serviceConfig = {
-
Type = "simple";
-
ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1";
-
Restart = "on-failure";
-
RestartSec = 1;
-
TimeoutStopSec = 10;
-
};
-
};
-
-
security.pam.services.hyprlock = lib.mkIf (config.services.fprintd.enable) {
-
text = ''
-
# Account management.
-
account required pam_unix.so # unix (order 10900)
-
-
# Authentication management.
-
auth sufficient pam_unix.so try_first_pass likeauth nullok
-
auth sufficient ${pkgs.fprintd}/lib/security/pam_fprintd.so
-
auth required pam_deny.so # deny
-
-
# Password management.
-
password sufficient pam_unix.so nullok yescrypt # unix
-
-
# Session management.
-
session required pam_env.so conffile=/etc/pam/environment readenv=0 # env (order 10100)
-
session required pam_unix.so # unix (order 10200)
-
'';
-
};
-
-
security.pam.services.sudo = lib.mkIf (config.services.fprintd.enable) {
-
text = ''
-
# Account management.
-
account required pam_unix.so # unix (order 10900)
-
-
# Authentication management.
-
auth sufficient pam_unix.so try_first_pass likeauth nullok
-
auth sufficient ${pkgs.fprintd}/lib/security/pam_fprintd.so
-
auth required pam_deny.so # deny
-
-
# Password management.
-
password sufficient pam_unix.so nullok yescrypt # unix
-
-
# Session management.
-
session required pam_env.so conffile=/etc/pam/environment readenv=0 # env (order 10100)
-
session required pam_unix.so # unix (order 10200)
-
'';
-
};
-
-
security.pam.services.su = lib.mkIf (config.services.fprintd.enable) {
-
text = ''
-
# Account management.
-
account required pam_unix.so # unix (order 10900)
-
-
# Authentication management.
-
auth sufficient pam_rootok.so # rootok (order 10200)
-
auth required pam_faillock.so # faillock (order 10400)
-
auth sufficient pam_unix.so try_first_pass likeauth nullok
-
auth sufficient ${pkgs.fprintd}/lib/security/pam_fprintd.so
-
auth required pam_deny.so # deny
-
-
# Password management.
-
password sufficient pam_unix.so nullok yescrypt # unix
-
-
# Session management.
-
session required pam_env.so conffile=/etc/pam/environment readenv=0 # env (order 10100)
-
session required pam_unix.so # unix (order 10200)
-
session required pam_unix.so # unix (order 10200)
-
session optional pam_xauth.so systemuser=99 xauthpath=${pkgs.xorg.xauth}/bin/xauth # xauth (order 12100)
-
'';
-
};
-
};
-
}
-182
modules/nixos/system/wifi.nix
···
-
# simple network manager
-
#
-
# This module provides a simpler way to declare wifi profiles with network manager.
-
# - you can pass the PSK via environment variable, direct value, or file.
-
# - profiles are defined in `atelier.network.wifi.profiles`.
-
# - eduroam networks are supported with the `eduroam = true` flag.
-
#
-
# Example usage:
-
# atelier.network.wifi = {
-
# enable = true;
-
# profiles = {
-
# "MySSID" = { psk = "supersecret"; };
-
# "eduroam" = {
-
# eduroam = true;
-
# identity = "user@university.edu";
-
# psk = "password";
-
# };
-
# };
-
# };
-
-
{
-
lib,
-
config,
-
pkgs,
-
...
-
}:
-
let
-
cfg = config.atelier.network.wifi;
-
mkProfile =
-
name:
-
{
-
pskVar ? null,
-
psk ? null,
-
pskFile ? null,
-
eduroam ? false,
-
identity ? null,
-
}:
-
let
-
base = {
-
connection = {
-
id = name;
-
type = "wifi";
-
};
-
ipv4.method = "auto";
-
ipv6 = {
-
addr-gen-mode = "stable-privacy";
-
method = "auto";
-
};
-
wifi = {
-
mode = "infrastructure";
-
ssid = name;
-
};
-
};
-
sec =
-
if eduroam then
-
if pskVar != null then
-
{
-
wifi-security = {
-
key-mgmt = "wpa-eap";
-
password = "$" + pskVar;
-
identity = identity;
-
phase2-auth = "mschapv2";
-
};
-
}
-
else if psk != null then
-
{
-
wifi-security = {
-
key-mgmt = "wpa-eap";
-
password = psk;
-
identity = identity;
-
phase2-auth = "mschapv2";
-
};
-
}
-
else if pskFile != null then
-
{
-
wifi-security = {
-
key-mgmt = "wpa-eap";
-
password = "$(" + pkgs.coreutils + "/bin/cat " + pskFile + ")";
-
identity = identity;
-
phase2-auth = "mschapv2";
-
};
-
}
-
else
-
{ }
-
else if pskVar != null then
-
{
-
wifi-security = {
-
key-mgmt = "wpa-psk";
-
psk = "$" + pskVar;
-
};
-
}
-
else if psk != null then
-
{
-
wifi-security = {
-
key-mgmt = "wpa-psk";
-
psk = psk;
-
};
-
}
-
else if pskFile != null then
-
{
-
wifi-security = {
-
key-mgmt = "wpa-psk";
-
psk = "$(" + pkgs.coreutils + "/bin/cat " + pskFile + ")";
-
};
-
}
-
else
-
{ };
-
in
-
base // sec;
-
in
-
{
-
options.atelier.network.wifi = {
-
enable = lib.mkEnableOption "Enable NetworkManager with simplified Wi-Fi profiles";
-
hostName = lib.mkOption {
-
type = lib.types.str;
-
default = lib.mkDefault (config.networking.hostName or "nixos");
-
};
-
nameservers = lib.mkOption {
-
type = lib.types.listOf lib.types.str;
-
default = lib.mkDefault [ ];
-
};
-
envFile = lib.mkOption {
-
type = lib.types.nullOr lib.types.path;
-
default = null;
-
description = "Single environment file with PSK variables (used once).";
-
};
-
-
profiles = lib.mkOption {
-
type = lib.types.attrsOf (
-
lib.types.submodule (
-
{ name, ... }:
-
{
-
options = {
-
pskVar = lib.mkOption {
-
type = lib.types.nullOr lib.types.str;
-
default = null;
-
description = "Variable name in envFile providing PSK";
-
};
-
psk = lib.mkOption {
-
type = lib.types.nullOr lib.types.str;
-
default = null;
-
};
-
pskFile = lib.mkOption {
-
type = lib.types.nullOr lib.types.path;
-
default = null;
-
};
-
eduroam = lib.mkOption {
-
type = lib.types.bool;
-
default = false;
-
description = "Enable eduroam configuration";
-
};
-
identity = lib.mkOption {
-
type = lib.types.nullOr lib.types.str;
-
default = null;
-
description = "Identity for eduroam authentication";
-
};
-
};
-
}
-
)
-
);
-
default = { };
-
description = "Map of SSID -> { pskVar | psk | pskFile | eduroam config }.";
-
};
-
};
-
-
config = lib.mkIf cfg.enable {
-
networking = {
-
hostName = lib.mkIf (cfg.hostName != "") cfg.hostName;
-
nameservers = lib.mkIf (cfg.nameservers != [ ]) cfg.nameservers;
-
useDHCP = false;
-
dhcpcd.enable = false;
-
networkmanager = {
-
enable = true;
-
dns = "none";
-
ensureProfiles = {
-
environmentFiles = lib.optional (cfg.envFile != null) cfg.envFile;
-
profiles = lib.mapAttrs mkProfile cfg.profiles;
-
};
-
};
-
};
-
};
-
}
+284
moonlark/configuration.nix
···
+
+
# This is your system's configuration file.
+
# Use this to configure your system environment (it replaces /etc/nixos/configuration.nix)
+
{
+
inputs,
+
lib,
+
config,
+
pkgs,
+
pkgs-unstable,
+
...
+
}: {
+
# You can import other NixOS modules here
+
imports = [
+
# If you want to use modules from other flakes (such as nixos-hardware):
+
inputs.hardware.nixosModules.framework-11th-gen-intel
+
+
# Import your generated (nixos-generate-config) hardware configuration
+
./hardware-configuration.nix
+
+
# Import home-manager's configuration
+
./home-manager.nix
+
+
# Import disko's configuration
+
./disk-config.nix
+
+
# hpyrland config
+
# ./hyprland
+
+
./pam.nix
+
+
# tuigreet
+
./greetd.nix
+
];
+
+
nixpkgs = {
+
# Configure your nixpkgs instance
+
config = {
+
# Disable if you don't want unfree packages
+
allowUnfree = true;
+
};
+
};
+
+
nix = let
+
flakeInputs = lib.filterAttrs (_: lib.isType "flake") inputs;
+
in {
+
settings = {
+
# Enable flakes and new 'nix' command
+
experimental-features = "nix-command flakes";
+
# Opinionated: disable global registry
+
flake-registry = "";
+
# Workaround for https://github.com/NixOS/nix/issues/9574
+
nix-path = config.nix.nixPath;
+
};
+
# Opinionated: disable channels
+
channel.enable = false;
+
+
# Opinionated: make flake registry and nix path match flake inputs
+
registry = lib.mapAttrs (_: flake: {inherit flake;}) flakeInputs;
+
nixPath = lib.mapAttrsToList (n: _: "${n}=flake:${n}") flakeInputs;
+
};
+
+
time = {
+
timeZone = "America/New_York";
+
hardwareClockInLocalTime = true;
+
};
+
+
services.automatic-timezoned.enable = true;
+
+
environment.systemPackages = map lib.lowPrio [
+
pkgs.curl
+
pkgs.wget
+
pkgs.dogdns
+
inputs.agenix.packages.x86_64-linux.default
+
pkgs.wpa_supplicant_gui
+
pkgs.overskride
+
pkgs.alacritty
+
pkgs.zsh
+
pkgs.starship
+
pkgs.gh
+
pkgs.swww
+
pkgs.sunwait
+
pkgs.sunpaper
+
pkgs.wluma
+
pkgs.brightnessctl
+
inputs.hyprland-contrib.packages.${pkgs.system}.grimblast
+
pkgs.mako
+
pkgs.hyprpicker
+
pkgs.notify-desktop
+
pkgs.bc
+
pkgs.wl-clipboard
+
pkgs.psmisc
+
pkgs.jq
+
pkgs.playerctl
+
pkgs.firefox
+
pkgs.slack
+
pkgs.gnome.nautilus
+
pkgs.gnome.totem
+
pkgs.loupe
+
pkgs.gnome.simple-scan
+
pkgs.gnome.file-roller
+
pkgs.polkit_gnome
+
pkgs.fprintd
+
pkgs.gitMinimal
+
pkgs.github-desktop
+
pkgs.udiskie
+
pkgs.neofetch
+
pkgs.cava
+
pkgs.go
+
pkgs.unstable.bun
+
pkgs.pitivi
+
pkgs.unstable.arduino-ide
+
pkgs.unstable.arduino-cli
+
pkgs.lazygit
+
pkgs.vhs
+
pkgs.lightworks
+
pkgs.ffmpeg
+
pkgs.ngrok
+
pkgs.openssl
+
pkgs.unstable.nodePackages_latest.prisma
+
pkgs.nodejs_22
+
pkgs.invoice
+
pkgs.pop
+
pkgs.gum
+
pkgs.unstable.netlify-cli
+
pkgs.unstable.kicad
+
];
+
+
services.gnome.gnome-keyring.enable = true;
+
programs.dconf.enable = true;
+
+
systemd = {
+
user.services.polkit-gnome-authentication-agent-1 = {
+
description = "polkit-gnome-authentication-agent-1";
+
wantedBy = [ "graphical-session.target" ];
+
wants = [ "graphical-session.target" ];
+
after = [ "graphical-session.target" ];
+
serviceConfig = {
+
Type = "simple";
+
ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1";
+
Restart = "on-failure";
+
RestartSec = 1;
+
TimeoutStopSec = 10;
+
};
+
};
+
};
+
+
fonts.packages = with pkgs; [
+
nerdfonts
+
fira
+
];
+
+
# import the secret
+
age.identityPaths = [ "/home/kierank/.ssh/id_rsa" "/etc/ssh/id_rsa" "/mnt/etc/ssh/id_rsa" ];
+
age.secrets = {
+
wifi = {
+
file = ../secrets/wifi.age;
+
owner = "kierank";
+
};
+
resend = {
+
file = ../secrets/resend.age;
+
owner = "kierank";
+
};
+
};
+
+
environment.sessionVariables = {
+
XDG_CACHE_HOME = "$HOME/.cache";
+
XDG_CONFIG_HOME = "$HOME/.config";
+
XDG_DATA_HOME = "$HOME/.local/share";
+
SUNPAPERDIR = "${lib.getExe pkgs.sunpaper}";
+
XDG_STATE_HOME = "$HOME/.local/state";
+
NIXOS_OZONE_WL = "1";
+
PRISMA_QUERY_ENGINE_LIBRARY = "${pkgs.prisma-engines}/lib/libquery_engine.node";
+
PRISMA_QUERY_ENGINE_BINARY = "${pkgs.prisma-engines}/bin/query-engine";
+
PRISMA_SCHEMA_ENGINE_BINARY = "${pkgs.prisma-engines}/bin/schema-engine";
+
RESEND_API_KEY = ''$(${pkgs.coreutils}/bin/cat ${config.age.secrets.resend.path})'';
+
POP_FROM = "me@dunkirk.sh";
+
};
+
+
# setup the network
+
networking = {
+
hostName = "moonlark";
+
wireless = {
+
environmentFile = config.age.secrets.wifi.path;
+
userControlled.enable = true;
+
enable = true;
+
networks = {
+
"KlukasNet".psk = "@PSK_HOME@";
+
"Everseen".psk = "@PSK_HOTSPOT@";
+
};
+
};
+
};
+
+
programs.zsh.enable = true;
+
# TODO: Configure your system-wide user settings (groups, etc), add more users as needed.
+
users.users = {
+
kierank = {
+
# You can skip setting a root password by passing '--no-root-passwd' to nixos-install.
+
# Be sure to change it (using passwd) after rebooting!
+
initialPassword = "lolzthisaintsecure!";
+
isNormalUser = true;
+
shell = pkgs.zsh;
+
openssh.authorizedKeys.keys = [
+
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzEEjvbL/ttqmYoDjxYQmDIq36BabROJoXgQKeh9liBxApwp+2PmgxROzTg42UrRc9pyrkq5kVfxG5hvkqCinhL1fMiowCSEs2L2/Cwi40g5ZU+QwdcwI8a4969kkI46PyB19RHkxg54OUORiIiso/WHGmqQsP+5wbV0+4riSnxwn/JXN4pmnE//stnyAyoiEZkPvBtwJjKb3Ni9n3eNLNs6gnaXrCtaygEZdebikr9kS2g9mM696HvIFgM6cdR/wZ7DcLbG3IdTXuHN7PC3xxL+Y4ek5iMreQIPmuvs4qslbthPGYoYbYLUQiRa9XO5s/ksIj5Z14f7anHE6cuTQVpvNWdGDOigyIVS5qU+4ZF7j+rifzOXVL48gmcAvw/uV68m5Wl/p0qsC/d8vI3GYwEsWG/EzpAlc07l8BU2LxWgN+d7uwBFaJV9VtmUDs5dcslsh8IbzmtC9gq3OLGjklxTfIl6qPiL8U33oc/UwqzvZUrI2BlbagvIZYy6rP+q0= kierank@mockingjay"
+
];
+
extraGroups = ["wheel" "networkmanager" "audio" "video" "docker" "plugdev" "input"];
+
};
+
root.openssh.authorizedKeys.keys = [
+
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzEEjvbL/ttqmYoDjxYQmDIq36BabROJoXgQKeh9liBxApwp+2PmgxROzTg42UrRc9pyrkq5kVfxG5hvkqCinhL1fMiowCSEs2L2/Cwi40g5ZU+QwdcwI8a4969kkI46PyB19RHkxg54OUORiIiso/WHGmqQsP+5wbV0+4riSnxwn/JXN4pmnE//stnyAyoiEZkPvBtwJjKb3Ni9n3eNLNs6gnaXrCtaygEZdebikr9kS2g9mM696HvIFgM6cdR/wZ7DcLbG3IdTXuHN7PC3xxL+Y4ek5iMreQIPmuvs4qslbthPGYoYbYLUQiRa9XO5s/ksIj5Z14f7anHE6cuTQVpvNWdGDOigyIVS5qU+4ZF7j+rifzOXVL48gmcAvw/uV68m5Wl/p0qsC/d8vI3GYwEsWG/EzpAlc07l8BU2LxWgN+d7uwBFaJV9VtmUDs5dcslsh8IbzmtC9gq3OLGjklxTfIl6qPiL8U33oc/UwqzvZUrI2BlbagvIZYy6rP+q0= kierank@mockingjay"
+
];
+
};
+
+
programs.hyprland.enable = true;
+
services.hypridle.enable = true;
+
+
# enable cups
+
services.printing.enable = true;
+
services.avahi = {
+
enable = true;
+
nssmdns4 = true;
+
openFirewall = true;
+
};
+
+
+
# enable bluetooth
+
hardware.bluetooth.enable = true;
+
+
# enable pipewire
+
# rtkit is optional but recommended
+
security.rtkit.enable = true;
+
services.pipewire = {
+
enable = true;
+
alsa.enable = true;
+
alsa.support32Bit = true;
+
pulse.enable = true;
+
# If you want to use JACK applications, uncomment this
+
jack.enable = true;
+
};
+
+
# This setups a SSH server. Very important if you're setting up a headless system.
+
# Feel free to remove if you don't need it.
+
services.openssh = {
+
enable = true;
+
settings = {
+
# Opinionated: forbid root login through SSH.
+
PermitRootLogin = "no";
+
# Opinionated: use keys only.
+
# Remove if you want to SSH using passwords
+
PasswordAuthentication = false;
+
};
+
};
+
+
networking.firewall = {
+
enable = true;
+
allowedTCPPorts = [ 4455 ];
+
allowedUDPPorts = [ 4455 ];
+
};
+
+
+
services.devmon.enable = true;
+
services.gvfs.enable = true;
+
services.udisks2.enable = true;
+
+
services.logind.extraConfig = ''
+
# don't shutdown when power button is short-pressed
+
HandlePowerKey=ignore
+
HandlePowerKeyLongPress=poweroff
+
'';
+
+
# Requires at least 5.16 for working wi-fi and bluetooth.
+
# https://community.frame.work/t/using-the-ax210-with-linux-on-the-framework-laptop/1844/89
+
boot = {
+
kernelPackages = lib.mkIf (lib.versionOlder pkgs.linux.version "5.16") (lib.mkDefault pkgs.linuxPackages_latest);
+
loader.grub = {
+
# no need to set devices, disko will add all devices that have a EF02 partition to the list already
+
device = "nodev";
+
efiSupport = true;
+
efiInstallAsRemovable = true;
+
};
+
supportedFilesystems = [ "ntfs" ];
+
};
+
+
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
+
system.stateVersion = "23.05";
+
}
+32
moonlark/disk-config.nix
···
+
{
+
disko.devices = {
+
disk = {
+
main = {
+
device = "/dev/nvme0n1";
+
type = "disk";
+
content = {
+
type = "gpt";
+
partitions = {
+
ESP = {
+
type = "EF00";
+
size = "500M";
+
content = {
+
type = "filesystem";
+
format = "vfat";
+
mountpoint = "/boot";
+
};
+
};
+
root = {
+
size = "100%";
+
content = {
+
type = "filesystem";
+
format = "ext4";
+
mountpoint = "/";
+
};
+
};
+
};
+
};
+
};
+
};
+
};
+
}
+36
moonlark/greetd.nix
···
+
{ pkgs, ... }:
+
let
+
tuigreet = "${pkgs.greetd.tuigreet}/bin/tuigreet";
+
in
+
{
+
services.greetd = {
+
enable = true;
+
settings = {
+
default_session = {
+
command = "${tuigreet} --time -g 'WARNING: UNAUTHORIZED ACCESS WILL RESULT IN TERMINATION OF SESSION. IDENTIFY YOURSELF' --remember --cmd Hyprland";
+
user = "greeter";
+
};
+
};
+
};
+
+
# this is a life saver.
+
# literally no documentation about this anywhere.
+
# might be good to write about this...
+
# https://www.reddit.com/r/NixOS/comments/u0cdpi/tuigreet_with_xmonad_how/
+
systemd.services.greetd.serviceConfig = {
+
Type = "idle";
+
StandardInput = "tty";
+
StandardOutput = "tty";
+
StandardError = "journal"; # Without this errors will spam on screen
+
# Without these bootlogs will spam on screen
+
TTYReset = true;
+
TTYVHangup = true;
+
TTYVTDisallocate = true;
+
};
+
+
#environment.etc."greetd/environments".text = ''
+
# Hyprland
+
# fish
+
# bash
+
#'';
+
}
+25
moonlark/hardware-configuration.nix
···
+
# Do not modify this file! It was generated by ‘nixos-generate-config’
+
# and may be overwritten by future invocations. Please make changes
+
# to /etc/nixos/configuration.nix instead.
+
{ config, lib, pkgs, modulesPath, ... }:
+
+
{
+
imports =
+
[ (modulesPath + "/installer/scan/not-detected.nix")
+
];
+
+
boot.initrd.availableKernelModules = [ "xhci_pci" "thunderbolt" "nvme" "usb_storage" "sd_mod" ];
+
boot.initrd.kernelModules = [ ];
+
boot.kernelModules = [ "kvm-intel" ];
+
boot.extraModulePackages = [ ];
+
+
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
+
# (the default) this is the recommended approach. When using systemd-networkd it's
+
# still possible to use this option, but it's recommended to use it in conjunction
+
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
+
networking.useDHCP = lib.mkDefault true;
+
# networking.interfaces.wlp170s0.useDHCP = lib.mkDefault true;
+
+
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
+
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
+
}
+14
moonlark/home-manager.nix
···
+
{ inputs, outputs, ... }: {
+
imports = [
+
# Import home-manager's NixOS module
+
inputs.home-manager.nixosModules.home-manager
+
];
+
+
home-manager = {
+
extraSpecialArgs = { inherit inputs outputs; };
+
users = {
+
# Import your home-manager configuration
+
kierank = import ../home-manager/home.nix;
+
};
+
};
+
}
+68
moonlark/pam.nix
···
+
{
+
lib,
+
config,
+
pkgs,
+
...
+
}: {
+
services.fprintd.enable = true;
+
security.pam.services.hyprlock = lib.mkIf (config.services.fprintd.enable) {
+
text = ''
+
# Account management.
+
account required pam_unix.so # unix (order 10900)
+
+
# Authentication management.
+
auth sufficient pam_unix.so try_first_pass likeauth nullok
+
auth sufficient ${pkgs.fprintd}/lib/security/pam_fprintd.so
+
auth required pam_deny.so # deny
+
+
# Password management.
+
password sufficient pam_unix.so nullok yescrypt # unix
+
+
# Session management.
+
session required pam_env.so conffile=/etc/pam/environment readenv=0 # env (order 10100)
+
session required pam_unix.so # unix (order 10200)
+
'';
+
};
+
+
security.pam.services.sudo = lib.mkIf (config.services.fprintd.enable) {
+
text = ''
+
# Account management.
+
account required pam_unix.so # unix (order 10900)
+
+
# Authentication management.
+
auth sufficient pam_unix.so try_first_pass likeauth nullok
+
auth sufficient ${pkgs.fprintd}/lib/security/pam_fprintd.so
+
auth required pam_deny.so # deny
+
+
# Password management.
+
password sufficient pam_unix.so nullok yescrypt # unix
+
+
# Session management.
+
session required pam_env.so conffile=/etc/pam/environment readenv=0 # env (order 10100)
+
session required pam_unix.so # unix (order 10200)
+
'';
+
};
+
+
security.pam.services.su = lib.mkIf (config.services.fprintd.enable) {
+
text = ''
+
# Account management.
+
account required pam_unix.so # unix (order 10900)
+
+
# Authentication management.
+
auth sufficient pam_rootok.so # rootok (order 10200)
+
auth required pam_faillock.so # faillock (order 10400)
+
auth sufficient pam_unix.so try_first_pass likeauth nullok
+
auth sufficient ${pkgs.fprintd}/lib/security/pam_fprintd.so
+
auth required pam_deny.so # deny
+
+
# Password management.
+
password sufficient pam_unix.so nullok yescrypt # unix
+
+
# Session management.
+
session required pam_env.so conffile=/etc/pam/environment readenv=0 # env (order 10100)
+
session required pam_unix.so # unix (order 10200)
+
session required pam_unix.so # unix (order 10200)
+
session optional pam_xauth.so systemuser=99 xauthpath=${pkgs.xorg.xauth}/bin/xauth # xauth (order 12100)
+
'';
+
};
+
}
-48
packages/zmx.nix
···
-
{ pkgs, lib, stdenv, fetchurl, autoPatchelfHook }:
-
-
stdenv.mkDerivation rec {
-
pname = "zmx";
-
version = "0.1.0";
-
-
src = fetchurl {
-
url = if stdenv.isLinux then
-
(if stdenv.isAarch64 then
-
"https://zmx.sh/a/zmx-${version}-linux-aarch64.tar.gz"
-
else
-
"https://zmx.sh/a/zmx-${version}-linux-x86_64.tar.gz")
-
else if stdenv.isDarwin then
-
(if stdenv.isAarch64 then
-
"https://zmx.sh/a/zmx-${version}-macos-aarch64.tar.gz"
-
else
-
"https://zmx.sh/a/zmx-${version}-macos-x86_64.tar.gz")
-
else throw "Unsupported platform";
-
-
hash = if stdenv.isLinux && stdenv.isAarch64 then
-
"sha256-sv83lR4DLJE+gsMtqCk6VCFdo5n4lhI0P1loxAf0iOg="
-
else if stdenv.isLinux then
-
"sha256-c+wCUcm7DEO55wXuHq0aP0Kn908jj1FM5Z+JQJnKE0M="
-
else if stdenv.isDarwin && stdenv.isAarch64 then
-
"sha256-dM6MFikdbpN+n8BK6fLbzyJfi88xetCWL9H5VfGB07o="
-
else
-
"sha256-B52NC8NEjVPDNSG11qPb0uRNExB66bllnK7ivXMJbHk=";
-
};
-
-
nativeBuildInputs = lib.optionals stdenv.isLinux [ autoPatchelfHook ];
-
-
sourceRoot = ".";
-
-
installPhase = ''
-
runHook preInstall
-
mkdir -p $out/bin
-
cp zmx $out/bin/
-
chmod +x $out/bin/zmx
-
runHook postInstall
-
'';
-
-
meta = with lib; {
-
description = "Session persistence for terminal processes";
-
homepage = "https://zmx.sh";
-
license = licenses.mit;
-
platforms = platforms.unix;
-
};
-
}
-84
post-install.sh
···
-
#!/usr/bin/env bash
-
-
# NixOS Post-Installation Script
-
# This script automates the post-installation tasks after the first reboot
-
-
set -e # Exit on any error
-
-
echo "==== NixOS Post-Installation Setup ===="
-
echo "This script will automate the post-installation tasks."
-
-
# Function to print current step
-
print_step() {
-
echo -e "\n\033[1;34m==== $1 ====\033[0m"
-
}
-
-
# Change password if needed
-
print_step "Password Management"
-
read -p "Do you want to change your password? (y/n): " change_password
-
if [[ "$change_password" =~ ^[Yy]$ ]]; then
-
passwd
-
echo "Password changed successfully!"
-
fi
-
-
# Move config to local directory and fix permissions
-
print_step "Setting up configuration files"
-
if [ -L "/etc/nixos" ]; then
-
echo "Configuration is already properly set up."
-
else
-
echo "Moving configuration to home directory..."
-
sudo mv /etc/nixos ~/dots
-
sudo ln -s ~/dots /etc/
-
echo "Fixing permissions..."
-
sudo chown -R $(id -un):users ~/dots
-
sudo chown -R $(id -un) ~/dots/.*
-
echo "Configuration files moved and linked successfully!"
-
fi
-
-
# Setup fingerprint reader (optional)
-
print_step "Fingerprint Reader Setup"
-
read -p "Do you want to set up the fingerprint reader? (y/n): " setup_fingerprint
-
if [[ "$setup_fingerprint" =~ ^[Yy]$ ]]; then
-
echo "Setting up fingerprint reader..."
-
echo "You may need to swipe your finger across the fingerprint sensor instead of simply laying it there."
-
sudo fprintd-enroll -f right-index-finger $(whoami)
-
echo "Verifying fingerprint..."
-
sudo fprintd-verify $(whoami)
-
else
-
echo "Skipping fingerprint reader setup."
-
fi
-
-
# Git configuration
-
print_step "Git Configuration"
-
read -p "Do you want to configure Git? (y/n): " setup_git
-
if [[ "$setup_git" =~ ^[Yy]$ ]]; then
-
read -p "Enter your Git taciturnaxolotl: " git_user
-
read -p "Enter your Git email: " git_email
-
-
git config --global user.name "$git_user"
-
git config --global user.email "$git_email"
-
-
echo "Git configuration complete!"
-
fi
-
-
# Rebuild system
-
print_step "Rebuilding system"
-
read -p "Do you want to rebuild the system to apply all changes? (y/n): " rebuild_system
-
if [[ "$rebuild_system" =~ ^[Yy]$ ]]; then
-
echo "Rebuilding system..."
-
cd ~/dots
-
-
# Get the hostname to use for the rebuild
-
hostname=$(hostname)
-
echo "Current hostname: $hostname"
-
-
sudo nixos-rebuild switch --flake .#${hostname}
-
echo "System rebuilt successfully!"
-
else
-
echo "Skipping system rebuild."
-
fi
-
-
print_step "Post-installation complete!"
-
echo "Your NixOS setup is now complete! You may need to restart some applications or services for all changes to take effect."
-
echo "To rebuild your system in the future, run: cd ~/dots && sudo nixos-rebuild switch --flake .#$(hostname)"
-
echo "Enjoy your new NixOS installation!"
secrets/battleship-arena.age

This is a binary file and will not be displayed.

-23
secrets/bluesky.age
···
-
age-encryption.org/v1
-
-> ssh-rsa DqcG0Q
-
Pge+V9a56y8YOA2Fz7MaiCSqcX2TeRlz62BoLTdhilyPc1GduRy7cuVDOLEVxa3x
-
53qj2JeB4xRpTM8bVzUR4AavOxFLcDaGGe+FbbwvpCIMMECY80KZ9QfDs3X41UIJ
-
bjoTn0yPhu+hunNYAAfmuVEZQ6OhG8cfGJKIzGKf2TIksbIlfywGhOruTlugBl8n
-
PwK7rS0p2cGRtr4bECchPn5kFqIDERpQEcCZmuh6sGmp54Kmo7aZu3cpzHyl/oM/
-
RtChCUTkUu4tGTjc52LdSSWKC8beVN0MLIn0X+Q3yIp9tBZ5ivZR6CX4OGaAEOqq
-
BuiMeZt4hh61NoAL5fsF5nEbAogE7WkedJw7qEyUy7YxGAEk+Djo8+CbniVzVCOv
-
SmLCNhzbeSUxjp8OR6TWKXNpUG4TQwihzV8ube4eg848U4UOBTGGFvI7OmfoPeLF
-
QNATwMOQIAP43UqP01Z13gwKNHLN6x3SIG0lD0m4h9i0icfjv5xi9PLL+bx36OGt
-
-
-> ssh-rsa DqcG0Q
-
H7u1sn3dQfYRkkYWx2MI+1jyAvbWRN7hzonZwpQaojZiyn2pV7CMTtW3E33obKAU
-
SGbx5cn8/DWhNRg1/1Mw/d5mTDmesnu/rknOhYpTa1du6jWMymLL40MPD0hDgvNw
-
LmKI3cElDqJ+ITHhg3iKwH0OuAeT8iN3c5k9nmaHj7C7r8AClgQUcnt+XloA9YFU
-
thulreu9yxc3owKOobzcu8ZdyFDwX4Qyl+lmfzZIFZC1cW8gjPa99cPYua3Ai++A
-
myS3sB7xpwdVNK89m1O/qbTQyl9PdqHrkBaknNvpmJ+DPCQTKk7NrtYuioFCyBod
-
5+GxmP2qEhwkhWh5hRtI0qjvPxV7YzqUBMbBkafbjBDlyUOmCf8oVrR8sv45pdQw
-
7FpyCoquVR5IiEpFDjr8dRRYwbzSxT0BW6f7ZAmIwquPOrhet2ObKRkveyye01QO
-
PgNw5P4Xg6f8aKFANI3k6yPrY/2JyoHoqjLVBVov+08jKf5uqRNtLMhjnQ1QHPND
-
-
--- T/3m+ZxB3rLlgVKpPtvZTO2yrdNWs6vgFlKYmz4IIaI
-
0�Q��\7��s�Hv�*��܌����::��P8�7�r���e�A��&L`��?��x���V2���Dax��mH���.H䂠5LF]g��(Y�8 ��_SȊ��oW햸G�w��j ��v�k|����[�EǻM⏙@��й� Z�j�wJ�
secrets/cachet.age

This is a binary file and will not be displayed.

secrets/cloudflare.age

This is a binary file and will not be displayed.

-13
secrets/context7.age
···
-
age-encryption.org/v1
-
-> ssh-rsa DqcG0Q
-
e03DRMRMDI6LCR+XT2n+EtefyS+4QSjNyFQ84ehZl4fu0ZAsSaPicWSIJWxCM1ny
-
D6SPJG7Ucll47iTX+Z3IFfr9jj4fI9G+iltoKUYy8SuOlINjE8k2b8J8+4qnbIkz
-
wWrqP6VABT2wcudvYMqXwaAn+W/RBDZO7YDlMqBra5w5EUhiOwdJecAXMUP01hH5
-
DNuKwR9HVTEOcm23BgerexFYoXC+/VtCTqLt2c13NkIBuY7XwLznpz5RxyJr8nSc
-
9cqObb7rvwPtlSzhpMihmEsrrhDTdsZFMCH/mFjxw6jlt4TNqX9EYgdrgWeUY0db
-
iiQzoD7zYRmVu6+b0VDCR4qVjjx7qJCUAHVJGMXVQ8zZ7VaEcLOs+GwkJOi6Ds3+
-
L1IgntlBwFXB23EMt9nKMkqSwbrTnyoL8HOhHLkDNPnagOCqMon+qLOsZfKoNSBC
-
uMYO81sApaQ7sWv3U70PzCPunCk5uyeTH5+L+myhBdLJMqJXGBvIuhat5suunxjA
-
-
--- lYbv0hQZlIU5UiHiweDvJQfJNZpfz77h7qHUF0PFvBY
-
��rY1Iq�خ���q�E ��B�< �����Nn���U�bmũ肃���HF��@��ϭ�Z��I(��M��J/~�
-13
secrets/crush.age
···
-
age-encryption.org/v1
-
-> ssh-rsa DqcG0Q
-
pXxvBC3KC0KrKcLNiAR4OpgTm45dqZur0YzNB9lMU9Wapc89sXc0iFRClIo9wOwK
-
239l5rvUN44nSAangwU5ch6kRZHezXwr52kgkEKKTWHK16hO9lXTpxhRH5XP9RA3
-
2hfdDy8SABxpfAi1utmY/6CCX7z+DMIYCKnjKjfiFJhvAljMXHRj7TG39qicrdtA
-
DAtqDgDflMpkb7gENdqwlwS53VV8AYRUicenJGuH0XT8xs0HYp71g+mJZFLmqdMg
-
Uwh7Hrt2sfWf9sydJm49ob0nfyqpmygQh+wy1FmRRG+4HYxQQXLswYPmsU+o+v39
-
pwg6ixzBWCojWnG3VQagmzpHiAU58JidYAxbkR3MMeaKbMlsY2OaRl9VuxcQJ9cg
-
ONaEHZvIfotLVa4arH/DHc8IyFAwVdWx8SRS6ahMYt3l7iNXVRHNIzoxbpGocraK
-
uMeLhCaG+ZeLRkdXNiOps50O7C5Y89+FfWv/qYk0wnHtFinBV3GcXrAzmaHue2nF
-
-
--- sIuSUqv8QbgqVt8GnCtTYhg7Q1HUrEtjT0v48eHeXuE
-
��W��^B- �b�՚G�!oϦ���������UqN#��G��Dm� {�ziU ��4d��I�*q$�ŀ,��J�0
secrets/emojibot.age

This is a binary file and will not be displayed.

-13
secrets/frp-auth-token.age
···
-
age-encryption.org/v1
-
-> ssh-rsa DqcG0Q
-
O9AWztjhnwqJ/hh/jmHu0E+7DTK27ZB7A4eJBowY2hoMrEPabrGBPhZlLoTlSk6x
-
8GTzzdC4cU6jBBwJm3CrrVgxRlIBL23Vz0AWOKfyoFUraYZxDsoifeNAqQ/hgQ1Y
-
BntX55o5z5UhE7M1Dwa57haRnBD/2K2TRQR3BNrFGjHUhiiC4ovavULf3/Ac9trh
-
+umeYLBLK7pPQGhGytrVIIOmGdRq4ZzV8bfUsZyaJiVO5VACshsQWkx0Pj4szKXk
-
/gRerjo2P8yZJ7kg+aRn7cD6WdcpCMQZVbKgtIbe5BE15AzCdxprgQBz4N0Uthox
-
J53hLGvAOgHYdR8CHebymxBNMFdaYBPjBwhHyAlTi5TrPy5S9XtyBEg6h0mHeo+L
-
kSlUacifevkE4qZM5pVVf29YCvAPEC6VlQLAb3m4bppnpg2NBZJQo8iXNP88G53X
-
3axYCAufQttqcUe97yzcHYqXin8UXN8yJXjFNBXPtQ3ScVuSPWO+2V9pyDPRZhk8
-
-
--- 1JfGe2s3sQu5LP07sNvuBwqGUOiOQnrtQXp9+pE4ms8
-
(I ��Pfc�h,X��d�� ��x��O��p��p�F���'`�����u�
-13
secrets/github-knot-sync.age
···
-
age-encryption.org/v1
-
-> ssh-rsa DqcG0Q
-
eG7RPDx4xt/jE8lDjJ/whTT6ekS5ccZgLLzEqvJZ1bOsZm7ycfKRUjs5mZoNn8/Y
-
n6Rk6FyhTXSb0HrhCpSOSH23nCHwMFK/1H/pKdFpXTJAdx2LkX4VRI807/XjPHK4
-
Iyy0E1xL53RepvC6JPHmmW/Z7h/yamvP8MDE4Mds7oiBZYf/0Whdfw+PlKA5Xy7s
-
0xAQgQlODwSSwlNdtwgf0i1tcEkhDC1ts2o8/2NSoLj3s2348RAkv2n8yV0eu1bh
-
9UaeCOuyUxhCOYta7vWNp9xLy6MQuqptT2MNAjjYGHMZ0i5xH0lnvU1twqvN52Kf
-
wGuzKLw//qz13XWWgMaPbLz6L38j4gvl7eWd51vRQGX9Z9QDOHpu7iFcyY6bUeLh
-
3n9Quin11JrFl2Fx2qqDi8aILua9/Oq4bPchPURqbTUnZ+SR/aRFgN3aFVHmC0gL
-
l0BGhkCTFmb9+FrhILhmyKiln4dTaGigMhaSs9GuuXZ85FmCKjkp+6eRDDWP4WS9
-
-
--- T+md4gE0kZczI05P8evIAnS6wGnFPnMoTpaQM5DS1ao
-
mn̂�;�צ$`_�p�vR�1�7Fl�ç����� �+!����3�-�EYG��Q�*���������V�Զ����a�F��O����'}H��b���IHG�Z)t�����$�lXv�����F~sw%]G��H�s�LTv(�
secrets/hn-alerts.age

This is a binary file and will not be displayed.

secrets/iodine.age

This is a binary file and will not be displayed.

+6 -42
secrets/secrets.nix
···
let
kierank = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzEEjvbL/ttqmYoDjxYQmDIq36BabROJoXgQKeh9liBxApwp+2PmgxROzTg42UrRc9pyrkq5kVfxG5hvkqCinhL1fMiowCSEs2L2/Cwi40g5ZU+QwdcwI8a4969kkI46PyB19RHkxg54OUORiIiso/WHGmqQsP+5wbV0+4riSnxwn/JXN4pmnE//stnyAyoiEZkPvBtwJjKb3Ni9n3eNLNs6gnaXrCtaygEZdebikr9kS2g9mM696HvIFgM6cdR/wZ7DcLbG3IdTXuHN7PC3xxL+Y4ek5iMreQIPmuvs4qslbthPGYoYbYLUQiRa9XO5s/ksIj5Z14f7anHE6cuTQVpvNWdGDOigyIVS5qU+4ZF7j+rifzOXVL48gmcAvw/uV68m5Wl/p0qsC/d8vI3GYwEsWG/EzpAlc07l8BU2LxWgN+d7uwBFaJV9VtmUDs5dcslsh8IbzmtC9gq3OLGjklxTfIl6qPiL8U33oc/UwqzvZUrI2BlbagvIZYy6rP+q0=";
+
users = [ kierank ];
+
+
moonlark = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzEEjvbL/ttqmYoDjxYQmDIq36BabROJoXgQKeh9liBxApwp+2PmgxROzTg42UrRc9pyrkq5kVfxG5hvkqCinhL1fMiowCSEs2L2/Cwi40g5ZU+QwdcwI8a4969kkI46PyB19RHkxg54OUORiIiso/WHGmqQsP+5wbV0+4riSnxwn/JXN4pmnE//stnyAyoiEZkPvBtwJjKb3Ni9n3eNLNs6gnaXrCtaygEZdebikr9kS2g9mM696HvIFgM6cdR/wZ7DcLbG3IdTXuHN7PC3xxL+Y4ek5iMreQIPmuvs4qslbthPGYoYbYLUQiRa9XO5s/ksIj5Z14f7anHE6cuTQVpvNWdGDOigyIVS5qU+4ZF7j+rifzOXVL48gmcAvw/uV68m5Wl/p0qsC/d8vI3GYwEsWG/EzpAlc07l8BU2LxWgN+d7uwBFaJV9VtmUDs5dcslsh8IbzmtC9gq3OLGjklxTfIl6qPiL8U33oc/UwqzvZUrI2BlbagvIZYy6rP+q0=";
+
systems = [ moonlark ];
in
{
-
"wifi.age".publicKeys = [
-
kierank
-
];
-
"resend.age".publicKeys = [
-
kierank
-
];
-
"wakatime.age".publicKeys = [
-
kierank
-
];
-
"bluesky.age".publicKeys = [
-
kierank
-
];
-
"iodine.age".publicKeys = [
-
kierank
-
];
-
"crush.age".publicKeys = [
-
kierank
-
];
-
"context7.age".publicKeys = [
-
kierank
-
];
-
"cloudflare.age".publicKeys = [
-
kierank
-
];
-
"cachet.age".publicKeys = [
-
kierank
-
];
-
"hn-alerts.age".publicKeys = [
-
kierank
-
];
-
"github-knot-sync.age".publicKeys = [
-
kierank
-
];
-
"emojibot.age".publicKeys = [
-
kierank
-
];
-
"battleship-arena.age".publicKeys = [
-
kierank
-
];
-
"frp-auth-token.age".publicKeys = [
-
kierank
-
];
+
"wifi.age".publicKeys = [ kierank moonlark ];
+
"resend.age".publicKeys = [ kierank moonlark ];
}
-14
secrets/wakatime.age
···
-
age-encryption.org/v1
-
-> ssh-rsa DqcG0Q
-
qXw3jNnNgKgOF1O9wTUoZfRUxOmd2rg6W3LBPQfdEb33MEk2lchTAf3xAszNzdJY
-
Q8G0xwO3GYCXxC2L7N8WN1QpXu9ddbAxN9v0PmCoDZfu4k8+QTnvQemtlNk5VOyz
-
PQUJpMFm+1I+TYJeo2krkKbkUNfu+2bB/bq6oIKEwCWNB9wXKTSZgYxix99O8eQa
-
3KGL40KA01kkxwamQIO6W5gKNR3UipNKf2JVPBMenN2E6vg7izJaA6Udvf11eYQ1
-
Y2KYDt7SLpfz9NA+R+c3JE6vCLiEqu1Mv632ehjger6M0UQk6GJq/s5Eh9uYLsN3
-
QeZqgOwKSpkxHD75QM+99JrMO5CJDTfk+OLUS+HfsiLVWun3JXyl4lMQH0tB9xk/
-
7REZFef1TofWIDfjgf+xHRPUpaQQqd/0ffyBoNRbXV9EMUC4FcPflrUfcqDuKsV4
-
taFdp2lB1ucN0vCCXoirO/FdgOKNZ1RcnX4IgCqWwqznzyQi7iHuUMDGrVvrTyEH
-
-
--- uN0vT6nH7JLi0IowMHSVGNAxNBHf5zp+pkeXFA87Sho
-
�Tઇ�f�.T�ў��W/(mA�M�������7`sz�W1����[����aI���� W��� ��<�b
-
��>@��qU}�.�+��] M�Yjt���i�|�@��Qt�ZRX�ɘMr�iiN�\@��Q�/O�0Z�fJ������c/* ������Z�ꦲ�`T�YgaC����
secrets/wifi.age

This is a binary file and will not be displayed.