Compare commits
6 Commits
main
...
nova-incor
Author | SHA1 | Date | |
---|---|---|---|
8452ef7ea6 | |||
2769723008 | |||
8bf68245b1 | |||
4f46e48abc | |||
711c6eef87 | |||
9a4eea5444 |
4
.git-crypt/.gitattributes
vendored
Normal file
4
.git-crypt/.gitattributes
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# Do not edit this file. To specify the files to encrypt, create your own
|
||||||
|
# .gitattributes file in the directory where your files are.
|
||||||
|
* !filter !diff
|
||||||
|
*.gpg binary
|
Binary file not shown.
12
.gitattributes
vendored
Normal file
12
.gitattributes
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# Encrypt sensitive keys
|
||||||
|
secrets/keys/gpg/private.key filter=git-crypt diff=git-crypt
|
||||||
|
secrets/keys/ssh/id_ed25519 filter=git-crypt diff=git-crypt
|
||||||
|
secrets/keys/ssh/*_rsa filter=git-crypt diff=git-crypt
|
||||||
|
|
||||||
|
# Don't encrypt public keys
|
||||||
|
secrets/keys/gpg/public.key !filter !diff
|
||||||
|
secrets/keys/ssh/*.pub !filter !diff
|
||||||
|
|
||||||
|
# Don't encrypt configuration files
|
||||||
|
*.nix !filter !diff
|
||||||
|
.gitattributes !filter !diff
|
@ -14,5 +14,3 @@ ignore-tree-and-content:
|
|||||||
ignore-content:
|
ignore-content:
|
||||||
- "README.md"
|
- "README.md"
|
||||||
- "LICENSE"
|
- "LICENSE"
|
||||||
- "documentation"
|
|
||||||
|
|
||||||
|
159
README.md
Normal file
159
README.md
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
# NixOS Configuration Structure
|
||||||
|
|
||||||
|
This repository contains a NixOS configuration managed through a flake-driven approach. Each directory serves a specific purpose in the overall configuration structure.
|
||||||
|
|
||||||
|
## Directory Structure Overview
|
||||||
|
|
||||||
|
### `flake.nix`
|
||||||
|
The entry point and source of truth for the entire configuration. This file:
|
||||||
|
- Defines system configurations
|
||||||
|
- Sets up home-manager configurations
|
||||||
|
- Enables profiles
|
||||||
|
- Manages input sources
|
||||||
|
- Configures the Nix environment
|
||||||
|
|
||||||
|
### `lib/`
|
||||||
|
Library functions and utilities that power the configuration system.
|
||||||
|
|
||||||
|
- `conds.nix`: Condition checking helpers for configuration logic
|
||||||
|
- `default.nix`: Main library entry point that re-exports all functions
|
||||||
|
- `mkHome.nix`: Home-manager configuration builder
|
||||||
|
- `mkHost.nix`: NixOS host configuration builder
|
||||||
|
- `secrets.nix`: Secret management helper functions
|
||||||
|
- `utils.nix`: General utility functions used throughout the configuration
|
||||||
|
|
||||||
|
### `profiles/`
|
||||||
|
Profile definitions that enable specific sets of modules and configurations.
|
||||||
|
|
||||||
|
- `core/`: System-level profiles
|
||||||
|
- `minimal.nix`: Basic system setup
|
||||||
|
- `workstation.nix`: Desktop/laptop configuration
|
||||||
|
- `server.nix`: Server-specific setup
|
||||||
|
|
||||||
|
- `home/`: Home-manager profiles
|
||||||
|
- `desktop.nix`: Desktop environment configuration
|
||||||
|
- `development.nix`: Development tools and settings
|
||||||
|
- `gaming.nix`: Gaming-related configuration
|
||||||
|
|
||||||
|
Profiles are enabled through the flake.nix and determine which modules are activated.
|
||||||
|
|
||||||
|
### `modules/`
|
||||||
|
Module definitions that implement actual functionality. Modules are enabled by profiles.
|
||||||
|
|
||||||
|
- `core/`: System-level modules
|
||||||
|
- `age.nix`: Age encryption setup
|
||||||
|
- `desktop.nix`: Desktop environment fundamentals
|
||||||
|
- `filesystem.nix`: Filesystem configurations
|
||||||
|
- `home-manager.nix`: Home-manager integration
|
||||||
|
- `networking.nix`: Network configuration
|
||||||
|
- `nix.nix`: Nix package manager settings
|
||||||
|
- `security/`: Security-related modules
|
||||||
|
- `user.nix`: User management
|
||||||
|
- `xdg.nix`: XDG base directory support
|
||||||
|
|
||||||
|
- `home/`: Home-manager modules
|
||||||
|
- `comms/`: Communication tools
|
||||||
|
- `development/`: Development environments
|
||||||
|
- `firefox/`: Browser configuration
|
||||||
|
- `media/`: Media applications
|
||||||
|
- `terminal/`: Terminal emulators
|
||||||
|
- `theme/`: Theming configuration
|
||||||
|
- `virtualization/`: Virtualization tools
|
||||||
|
|
||||||
|
### `system/`
|
||||||
|
System-level configurations that are used by modules.
|
||||||
|
|
||||||
|
- `boot/`: Boot-related configurations
|
||||||
|
- `quietboot.nix`: Silent boot configuration
|
||||||
|
- `systemd-boot.nix`: Systemd-boot setup
|
||||||
|
|
||||||
|
- `desktop/`: Desktop environment configurations
|
||||||
|
- `appimage.nix`: AppImage support
|
||||||
|
- `plasma6.nix`: KDE Plasma 6 configuration
|
||||||
|
|
||||||
|
- `hardware/`: Hardware-specific settings
|
||||||
|
- `bluetooth.nix`: Bluetooth configuration
|
||||||
|
- `hardware-acceleration.nix`: GPU acceleration
|
||||||
|
- `qmk.nix`: QMK keyboard firmware
|
||||||
|
- `rgb.nix`: RGB lighting control
|
||||||
|
|
||||||
|
- `locales/`: Language and locale settings
|
||||||
|
- `us-english.nix`: US English locale configuration
|
||||||
|
|
||||||
|
- `services/`: System services
|
||||||
|
- `flatpak.nix`: Flatpak support
|
||||||
|
- `printing.nix`: Printer configuration
|
||||||
|
- `sunshine.nix`: Sunshine streaming
|
||||||
|
- `syncthing.nix`: Syncthing file sync
|
||||||
|
- `tailscale.nix`: Tailscale VPN
|
||||||
|
|
||||||
|
- `shell/`: Shell configurations
|
||||||
|
- `aliases.nix`: Shell aliases
|
||||||
|
- `atuin.nix`: Shell history database
|
||||||
|
- `zsh.nix`: Zsh configuration
|
||||||
|
- `tmux.nix`: Tmux terminal multiplexer
|
||||||
|
|
||||||
|
### `secrets/`
|
||||||
|
Secret management using age encryption.
|
||||||
|
|
||||||
|
- `encrypted/`: Encrypted secret files
|
||||||
|
- `identities/`: Age identities for decryption
|
||||||
|
- `users/`: User-specific secret configurations
|
||||||
|
- `${username}/`: Per-user secret definitions
|
||||||
|
|
||||||
|
### `hosts/`
|
||||||
|
Host-specific configurations created via mkHost.
|
||||||
|
|
||||||
|
- `${hostname}/`
|
||||||
|
- `hardware-configuration.nix`: Hardware-specific settings
|
||||||
|
- `default.nix`: Host-specific overrides
|
||||||
|
|
||||||
|
### `users/`
|
||||||
|
User-specific configurations created via mkHome.
|
||||||
|
|
||||||
|
- `${username}/`
|
||||||
|
- `config/`: User-specific configurations
|
||||||
|
- `dotfiles/`: User dotfiles
|
||||||
|
- `${hostname}.nix`: Host-specific user settings
|
||||||
|
|
||||||
|
### `pkgs/`
|
||||||
|
Custom package definitions and overlays.
|
||||||
|
|
||||||
|
- `default.nix`: Entry point for custom packages
|
||||||
|
- `overlays/`: Nixpkgs overlays
|
||||||
|
- `default.nix`: Main overlay entry point
|
||||||
|
- `modifications/`: Modified existing packages
|
||||||
|
- `custom/`: Custom package definitions
|
||||||
|
- `patches/`: Package patches for existing packages
|
||||||
|
|
||||||
|
The pkgs directory serves several purposes:
|
||||||
|
- Define custom packages not available in nixpkgs
|
||||||
|
- Modify existing packages from nixpkgs
|
||||||
|
- Create overlays for system-wide package modifications
|
||||||
|
- Store patches for package modifications
|
||||||
|
|
||||||
|
Package definitions here can be used throughout the configuration by:
|
||||||
|
1. Being imported through overlays in flake.nix
|
||||||
|
2. Direct reference in module configurations
|
||||||
|
3. Usage in home-manager configurations
|
||||||
|
4. Integration with development environments
|
||||||
|
|
||||||
|
## Configuration Flow
|
||||||
|
|
||||||
|
1. `flake.nix` initiates configuration
|
||||||
|
2. `lib` functions build configurations
|
||||||
|
3. Profiles enable appropriate modules
|
||||||
|
4. Modules implement functionality using system configurations
|
||||||
|
5. Secrets are applied where needed
|
||||||
|
6. Host-specific configurations override as needed
|
||||||
|
7. User configurations are applied through home-manager
|
||||||
|
|
||||||
|
## Important Notes
|
||||||
|
|
||||||
|
- Configurations should flow from the flake.nix
|
||||||
|
- Profiles should enable modules, not implement functionality
|
||||||
|
- Modules should be composable and configurable
|
||||||
|
- System configurations should be reusable
|
||||||
|
- Secrets should be managed through age/agenix
|
||||||
|
- Host configurations should only contain necessary overrides
|
||||||
|
- User configurations should be host-aware
|
@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"users/jeirmeister/programs/shell/terminals/kitty.nix": "{ config, pkgs, ... }:\n\n{\n programs.kitty = {\n enable = true;\n settings = {\n font_family = \"JetBrains Mono\";\n font_size = 12;\n window_padding_width = 4;\n background_opacity = \"0.95\";\n hide_window_decorations = \"yes\";\n tab_bar_style = \"powerline\";\n \n # Dracula theme colors\n foreground = \"#F8F8F2\";\n background = \"#282A36\";\n selection_foreground = \"#ffffff\";\n selection_background = \"#44475a\";\n url_color = \"#8be9fd\";\n cursor = \"#f8f8f2\";\n\n # black\n color0 = \"#21222c\";\n color8 = \"#6272a4\";\n\n # red\n color1 = \"#ff5555\";\n color9 = \"#ff6e6e\";\n\n # green\n color2 = \"#50fa7b\";\n color10 = \"#69ff94\";\n\n # yellow\n color3 = \"#f1fa8c\";\n color11 = \"#ffffa5\";\n\n # blue\n color4 = \"#bd93f9\";\n color12 = \"#d6acff\";\n\n # magenta\n color5 = \"#ff79c6\";\n color13 = \"#ff92df\";\n\n # cyan\n color6 = \"#8be9fd\";\n color14 = \"#a4ffff\";\n\n # white\n color7 = \"#f8f8f2\";\n color15 = \"#ffffff\";\n\n # tab bar\n active_tab_foreground = \"#282a36\";\n active_tab_background = \"#f8f8f2\";\n inactive_tab_foreground = \"#282a36\";\n inactive_tab_background = \"#6272a4\";\n };\n };\n}"
|
|
||||||
}
|
|
32
config.sh
32
config.sh
@ -1,32 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# README # ------
|
|
||||||
# Configure the config.json file in this same directory for an AI chatbot to
|
|
||||||
# Assist in making direct changes to files.
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
# Make sure jq is available
|
|
||||||
if ! command -v jq &> /dev/null; then
|
|
||||||
echo "Error: jq is required but not installed"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Make sure config.json exists
|
|
||||||
if [ ! -f "config.json" ]; then
|
|
||||||
echo "Error: config.json not found in current directory"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Creating directories and files..."
|
|
||||||
|
|
||||||
# Process each key in the JSON configuration
|
|
||||||
for file in $(jq -r 'keys[]' config.json); do
|
|
||||||
# Create directory if it doesn't exist
|
|
||||||
dir=$(dirname "$file")
|
|
||||||
mkdir -p "$dir"
|
|
||||||
|
|
||||||
# Write content to file
|
|
||||||
jq -r --arg file "$file" '.[$file]' config.json > "$file"
|
|
||||||
echo "Created: $file"
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "Configuration files have been created successfully!"
|
|
@ -1,38 +0,0 @@
|
|||||||
# NixOS Steam Deck Recovery Procedures
|
|
||||||
|
|
||||||
This documentation covers recovery procedures for NixOS on Steam Deck. It was created based on real recovery scenarios and provides practical solutions for common issues.
|
|
||||||
|
|
||||||
## Quick Reference
|
|
||||||
|
|
||||||
1. Boot Issues
|
|
||||||
- [Boot Recovery Guide](./boot-recovery.md)
|
|
||||||
- Common root causes: filesystem mounts, hardware configuration
|
|
||||||
|
|
||||||
2. Network Issues
|
|
||||||
- [Network Recovery Guide](./network-recovery.md)
|
|
||||||
- Essential for rebuilding with Jovian packages
|
|
||||||
|
|
||||||
3. Filesystem Issues
|
|
||||||
- [Filesystem Troubleshooting](./filesystem-issues.md)
|
|
||||||
- Handling mount points and permissions
|
|
||||||
|
|
||||||
## Emergency Recovery Steps
|
|
||||||
|
|
||||||
1. Boot into emergency mode
|
|
||||||
2. Establish network connectivity
|
|
||||||
3. Fix configuration issues
|
|
||||||
4. Rebuild system
|
|
||||||
5. Verify and reboot
|
|
||||||
|
|
||||||
## Prevention Strategies
|
|
||||||
|
|
||||||
1. Maintain separate configurations:
|
|
||||||
- Main configuration
|
|
||||||
- Minimal fallback configuration
|
|
||||||
- Hardware-specific configuration
|
|
||||||
|
|
||||||
2. Regular backups of working configurations
|
|
||||||
|
|
||||||
3. Testing changes in VM before applying
|
|
||||||
|
|
||||||
4. Maintaining recovery tools and scripts
|
|
@ -1,19 +0,0 @@
|
|||||||
# Recovery Scripts
|
|
||||||
|
|
||||||
This directory contains scripts for automating common recovery tasks.
|
|
||||||
|
|
||||||
## Available Scripts
|
|
||||||
|
|
||||||
1. `network-recovery.sh`
|
|
||||||
- Automates network setup in emergency environment
|
|
||||||
- Handles both ethernet and wifi configurations
|
|
||||||
- Usage: `sudo ./network-recovery.sh`
|
|
||||||
|
|
||||||
## Script Development Guidelines
|
|
||||||
|
|
||||||
1. All scripts should:
|
|
||||||
- Include clear documentation
|
|
||||||
- Handle errors gracefully
|
|
||||||
- Provide status feedback
|
|
||||||
- Support both automatic and interactive modes
|
|
||||||
- Create backups before making changes
|
|
@ -1,146 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Colors for output
|
|
||||||
RED='\033[0;31m'
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
NC='\033[0m' # No Color
|
|
||||||
|
|
||||||
# Function to print status messages
|
|
||||||
print_status() {
|
|
||||||
echo -e "${GREEN}[*]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
print_error() {
|
|
||||||
echo -e "${RED}[!]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
print_warning() {
|
|
||||||
echo -e "${YELLOW}[!]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Find ethernet interface
|
|
||||||
find_interface() {
|
|
||||||
local interface=$(ip link show | grep enp | cut -d: -f2 | tr -d ' ' | head -n1)
|
|
||||||
if [ -z "$interface" ]; then
|
|
||||||
print_error "No ethernet interface found"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
echo "$interface"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Prompt for network configuration
|
|
||||||
get_network_config() {
|
|
||||||
local default_interface=$(find_interface)
|
|
||||||
|
|
||||||
echo "Current network interfaces:"
|
|
||||||
ip link show
|
|
||||||
|
|
||||||
read -p "Enter interface name [$default_interface]: " interface
|
|
||||||
interface=${interface:-$default_interface}
|
|
||||||
|
|
||||||
read -p "Enter static IP address (e.g., 10.0.0.68): " static_ip
|
|
||||||
read -p "Enter gateway IP address (e.g., 10.0.0.1): " gateway_ip
|
|
||||||
|
|
||||||
# Validate IP addresses
|
|
||||||
if [[ ! $static_ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
||||||
print_error "Invalid static IP format"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if [[ ! $gateway_ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
||||||
print_error "Invalid gateway IP format"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Configure network
|
|
||||||
setup_network() {
|
|
||||||
print_status "Setting up network interface $interface..."
|
|
||||||
|
|
||||||
# Clear any existing IP addresses
|
|
||||||
ip addr flush dev $interface
|
|
||||||
|
|
||||||
# Bring up interface
|
|
||||||
ip link set $interface up
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
print_error "Failed to bring up interface"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Add IP address
|
|
||||||
ip addr add $static_ip/24 dev $interface
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
print_error "Failed to set IP address"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Remove any existing default routes
|
|
||||||
ip route del default 2>/dev/null
|
|
||||||
|
|
||||||
# Add default route
|
|
||||||
ip route add default via $gateway_ip dev $interface
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
print_error "Failed to add default route"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Configure DNS
|
|
||||||
print_status "Configuring DNS..."
|
|
||||||
echo "nameserver $gateway_ip" > /etc/resolv.conf
|
|
||||||
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
|
|
||||||
echo "nameserver 8.8.4.4" >> /etc/resolv.conf
|
|
||||||
|
|
||||||
# Disable IPv6
|
|
||||||
print_status "Disabling IPv6..."
|
|
||||||
sysctl -w net.ipv6.conf.all.disable_ipv6=1
|
|
||||||
sysctl -w net.ipv6.conf.default.disable_ipv6=1
|
|
||||||
sysctl -w net.ipv6.conf.lo.disable_ipv6=1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test connectivity
|
|
||||||
test_connectivity() {
|
|
||||||
print_status "Testing connectivity..."
|
|
||||||
|
|
||||||
# Test local network
|
|
||||||
print_status "Pinging gateway..."
|
|
||||||
if ! ping -c 1 $gateway_ip >/dev/null 2>&1; then
|
|
||||||
print_error "Cannot ping gateway"
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test DNS resolution
|
|
||||||
print_status "Testing DNS resolution..."
|
|
||||||
if ! ping -c 1 github.com >/dev/null 2>&1; then
|
|
||||||
print_warning "DNS resolution failed"
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
print_status "Network setup complete and functional!"
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# Main execution
|
|
||||||
main() {
|
|
||||||
if [[ $EUID -ne 0 ]]; then
|
|
||||||
print_error "This script must be run as root"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
print_status "NixOS Network Recovery Script"
|
|
||||||
print_status "==============================="
|
|
||||||
|
|
||||||
get_network_config
|
|
||||||
setup_network
|
|
||||||
test_connectivity
|
|
||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
print_status "You should now be able to run nixos-rebuild"
|
|
||||||
else
|
|
||||||
print_error "Network setup completed but connectivity test failed"
|
|
||||||
print_warning "Check your network settings and try again"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Run main function
|
|
||||||
main "$@"
|
|
@ -1,51 +0,0 @@
|
|||||||
# Common Issues and Solutions
|
|
||||||
|
|
||||||
## Network Configuration Issues
|
|
||||||
|
|
||||||
### Symptoms
|
|
||||||
- Unable to fetch packages
|
|
||||||
- No internet connectivity in emergency mode
|
|
||||||
|
|
||||||
### Solution
|
|
||||||
1. Use network-recovery.sh script
|
|
||||||
2. Manual network configuration:
|
|
||||||
```bash
|
|
||||||
ip link set INTERFACE up
|
|
||||||
ip addr add IP_ADDRESS/24 dev INTERFACE
|
|
||||||
ip route add default via GATEWAY
|
|
||||||
echo "nameserver 8.8.8.8" > /etc/resolv.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
## Filesystem Mount Issues
|
|
||||||
|
|
||||||
### Symptoms
|
|
||||||
- Read-only filesystem errors
|
|
||||||
- Unable to modify configuration
|
|
||||||
- Failed mounts during boot
|
|
||||||
|
|
||||||
### Solution
|
|
||||||
1. Identify problematic mounts:
|
|
||||||
```bash
|
|
||||||
mount | grep ro
|
|
||||||
lsblk -f
|
|
||||||
```
|
|
||||||
2. Remount filesystems:
|
|
||||||
```bash
|
|
||||||
mount -o remount,rw /
|
|
||||||
mount -o remount,rw /nix/store
|
|
||||||
```
|
|
||||||
3. Check/modify hardware-configuration.nix
|
|
||||||
|
|
||||||
## DBus Issues
|
|
||||||
|
|
||||||
### Symptoms
|
|
||||||
- Failed to connect to bus
|
|
||||||
- Service startup failures
|
|
||||||
|
|
||||||
### Solution
|
|
||||||
1. Setup minimal DBus environment:
|
|
||||||
```bash
|
|
||||||
mkdir -p /run/dbus
|
|
||||||
mount -t tmpfs tmpfs /run
|
|
||||||
dbus-daemon --system --fork
|
|
||||||
```
|
|
@ -1,29 +0,0 @@
|
|||||||
# Jovian NixOS Specific Issues
|
|
||||||
|
|
||||||
## Package Fetching Issues
|
|
||||||
|
|
||||||
### Symptoms
|
|
||||||
- Unable to fetch Jovian packages
|
|
||||||
- Build failures related to Jovian components
|
|
||||||
|
|
||||||
### Solution
|
|
||||||
1. Ensure network connectivity
|
|
||||||
2. Verify Jovian configuration:
|
|
||||||
```nix
|
|
||||||
jovian = {
|
|
||||||
hardware.has.amd.gpu = true;
|
|
||||||
devices.steamdeck.enable = true;
|
|
||||||
};
|
|
||||||
```
|
|
||||||
3. Check Jovian cache availability
|
|
||||||
|
|
||||||
## Hardware Detection Issues
|
|
||||||
|
|
||||||
### Symptoms
|
|
||||||
- Missing Steam Deck specific features
|
|
||||||
- Hardware not properly recognized
|
|
||||||
|
|
||||||
### Solution
|
|
||||||
1. Verify hardware configuration
|
|
||||||
2. Check kernel modules
|
|
||||||
3. Review Jovian hardware settings
|
|
76
flake.nix
Normal file
76
flake.nix
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
{
|
||||||
|
description = "Jeirmeister's NixOS Configuration";
|
||||||
|
|
||||||
|
nixConfig = {
|
||||||
|
extra-substituters = [
|
||||||
|
"https://nix-gaming.cachix.org"
|
||||||
|
"https://nix-community.cachix.org"
|
||||||
|
];
|
||||||
|
extra-trusted-public-keys = [
|
||||||
|
"nix-gaming.cachix.org-1:nbjlureqMbRAxR1gJ/f3hxemL9svXaZF/Ees8vCUUs4="
|
||||||
|
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
# Core dependencies
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
|
nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-23.11";
|
||||||
|
|
||||||
|
home-manager = {
|
||||||
|
url = "github:nix-community/home-manager";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
# System dependencies
|
||||||
|
systems.url = "github:nix-systems/default";
|
||||||
|
|
||||||
|
# Additional tools
|
||||||
|
agenix = {
|
||||||
|
url = "github:ryantm/agenix";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Gaming-specific inputs
|
||||||
|
nix-gaming = {
|
||||||
|
url = "github:fufexan/nix-gaming";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, home-manager, ... } @ inputs:
|
||||||
|
let
|
||||||
|
lib = nixpkgs.lib.extend
|
||||||
|
(final: prev: import ./lib { inherit inputs self; lib = final; });
|
||||||
|
|
||||||
|
# Helper function to create specialized system configs
|
||||||
|
mkSystem = hostName: system: username:
|
||||||
|
lib.mkHost {
|
||||||
|
inherit system username hostName;
|
||||||
|
extraModules = [
|
||||||
|
# Add your host-specific modules here
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Helper function to create home-manager configs
|
||||||
|
mkHome = username: hostName:
|
||||||
|
lib.mkHome {
|
||||||
|
inherit username hostName;
|
||||||
|
profiles = [ "desktop" "development" "gaming" ];
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
# NixOS configurations
|
||||||
|
nixosConfigurations = {
|
||||||
|
steamnix = mkSystem "steamnix" "x86_64-linux" "jeirmeister";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Home-manager configurations
|
||||||
|
homeConfigurations = {
|
||||||
|
"jeirmeister@steamnix" = mkHome "jeirmeister" "steamnix";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Formatter configuration
|
||||||
|
formatter = lib.forEachSystem (system: nixpkgs.legacyPackages.${system}.nixfmt);
|
||||||
|
};
|
||||||
|
}
|
31
home.nix
31
home.nix
@ -1,31 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
let
|
|
||||||
customPackages = import ./users/jeirmeister/packages { inherit pkgs; };
|
|
||||||
in
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./users/jeirmeister/programs
|
|
||||||
];
|
|
||||||
|
|
||||||
home = {
|
|
||||||
username = "jeirmeister";
|
|
||||||
homeDirectory = "/home/jeirmeister";
|
|
||||||
stateVersion = "24.05";
|
|
||||||
|
|
||||||
packages = with pkgs; [
|
|
||||||
fortune
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
programs.home-manager.enable = true;
|
|
||||||
|
|
||||||
nixpkgs = {
|
|
||||||
config = {
|
|
||||||
allowUnfree = true;
|
|
||||||
permittedInsecurePackages = [
|
|
||||||
"openssl-1.1.1w"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
0
hosts/common/default.nix
Normal file
0
hosts/common/default.nix
Normal file
0
hosts/default.nix
Normal file
0
hosts/default.nix
Normal file
@ -52,9 +52,15 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
nix.settings = {
|
nix.settings = {
|
||||||
experimental-features = [ "nix-command" "flakes" ];
|
experimental-features = [
|
||||||
|
"nix-command"
|
||||||
|
"flakes"
|
||||||
|
];
|
||||||
substituters = [ "cache.nixos.org" ];
|
substituters = [ "cache.nixos.org" ];
|
||||||
allowed-users = [ "@wheel" "jeirmeister" ];
|
allowed-users = [
|
||||||
|
"@wheel"
|
||||||
|
"jeirmeister"
|
||||||
|
];
|
||||||
auto-optimise-store = true;
|
auto-optimise-store = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -86,7 +92,10 @@ in
|
|||||||
services.xserver = {
|
services.xserver = {
|
||||||
enable = true;
|
enable = true;
|
||||||
xkb.layout = "us";
|
xkb.layout = "us";
|
||||||
videoDrivers = [ "displaylink" "modesetting" ];
|
videoDrivers = [
|
||||||
|
"displaylink"
|
||||||
|
"modesetting"
|
||||||
|
];
|
||||||
desktopManager.plasma6 = {
|
desktopManager.plasma6 = {
|
||||||
enable = true;
|
enable = true;
|
||||||
extraSessionCommands = ''
|
extraSessionCommands = ''
|
||||||
@ -174,8 +183,8 @@ in
|
|||||||
|
|
||||||
groups = {
|
groups = {
|
||||||
steamos.gid = 1000;
|
steamos.gid = 1000;
|
||||||
gamepad = {};
|
gamepad = { };
|
||||||
render = {};
|
render = { };
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -209,17 +218,17 @@ in
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
# TODO: Incorporate this part later
|
# TODO: Incorporate this part later
|
||||||
# Immersed Video Service
|
# Immersed Video Service
|
||||||
# immersed-video = {
|
# immersed-video = {
|
||||||
# description = "Load v4l2loopback module for Immersed";
|
# description = "Load v4l2loopback module for Immersed";
|
||||||
# wantedBy = [ "multi-user.target" ];
|
# wantedBy = [ "multi-user.target" ];
|
||||||
# after = [ "systemd-modules-load.service" ];
|
# after = [ "systemd-modules-load.service" ];
|
||||||
# requires = [ "systemd-modules-load.service" ];
|
# requires = [ "systemd-modules-load.service" ];
|
||||||
# serviceConfig = {
|
# serviceConfig = {
|
||||||
# Type = "oneshot";
|
# Type = "oneshot";
|
||||||
# RemainAfterExit = true;
|
# RemainAfterExit = true;
|
||||||
# ExecStartPre = "${pkgs.kmod}/bin/modprobe -r v4l2loopback || true";
|
# ExecStartPre = "${pkgs.kmod}/bin/modprobe -r v4l2loopback || true";
|
||||||
# ExecStart = "${pkgs.kmod}/bin/modprobe v4l2loopback exclusive_caps=1 video_nr=0 card_label='Immersed Virtual Camera'";
|
# ExecStart = "${pkgs.kmod}/bin/modprobe v4l2loopback exclusive_caps=1 video_nr=0 card_label='Immersed Virtual Camera'";
|
||||||
# ExecStop = "${pkgs.kmod}/bin/rmmod v4l2loopback || true";
|
# ExecStop = "${pkgs.kmod}/bin/rmmod v4l2loopback || true";
|
||||||
# };
|
# };
|
||||||
# };
|
# };
|
77
hosts/steamnix/default.nix
Normal file
77
hosts/steamnix/default.nix
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
jovianNixosRev = "f6423d86bec22c25a576b23262495c5536b0d069";
|
||||||
|
jovianNixos = builtins.fetchTarball {
|
||||||
|
url = "https://github.com/Jovian-Experiments/Jovian-NixOS/archive/${jovianNixosRev}.tar.gz";
|
||||||
|
sha256 = "sha256:1frd1dfqd97idwf1rj29ab0wvyfa2nx2h3bp9hkbmfa1m802avmb";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
../common
|
||||||
|
./hardware-configuration.nix
|
||||||
|
(jovianNixos + "/modules")
|
||||||
|
];
|
||||||
|
|
||||||
|
# Configure host type
|
||||||
|
hostConfigs = {
|
||||||
|
hostType = "steamdeck";
|
||||||
|
hasGaming = true;
|
||||||
|
hasVR = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Steam Deck Specific Configuration
|
||||||
|
jovian = {
|
||||||
|
hardware.has.amd.gpu = true;
|
||||||
|
devices.steamdeck = {
|
||||||
|
enable = true;
|
||||||
|
enableControllerUdevRules = true;
|
||||||
|
enableDefaultStage1Modules = true;
|
||||||
|
enablePerfControlUdevRules = true;
|
||||||
|
enableOsFanControl = true;
|
||||||
|
enableSoundSupport = true;
|
||||||
|
enableXorgRotation = true;
|
||||||
|
enableKernelPatches = true;
|
||||||
|
enableFwupdBiosUpdates = false;
|
||||||
|
autoUpdate = false;
|
||||||
|
};
|
||||||
|
steam.enable = false;
|
||||||
|
workarounds.ignoreMissingKernelModules = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Hardware and Display Configuration
|
||||||
|
hardware.video = {
|
||||||
|
displaylink.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
services = {
|
||||||
|
xserver = {
|
||||||
|
enable = true;
|
||||||
|
xkb.layout = "us";
|
||||||
|
videoDrivers = [ "displaylink" "modesetting" ];
|
||||||
|
|
||||||
|
desktopManager.plasma6 = {
|
||||||
|
enable = true;
|
||||||
|
extraSessionCommands = ''
|
||||||
|
${pkgs.xorg.xrandr}/bin/xrandr --setprovideroutputsource 2 0;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
displayManager = {
|
||||||
|
sddm = {
|
||||||
|
enable = true;
|
||||||
|
wayland = true;
|
||||||
|
};
|
||||||
|
sessionCommands = ''
|
||||||
|
${lib.getBin pkgs.xorg.xrandr}/bin/xrandr --setprovideroutputsource 2 0
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
pipewire = {
|
||||||
|
enable = true;
|
||||||
|
alsa.enable = true;
|
||||||
|
pulse.enable = true;
|
||||||
|
};
|
||||||
|
};
|
@ -1,28 +1,43 @@
|
|||||||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
# and may be overwritten by future invocations. Please make changes
|
# and may be overwritten by future invocations. Please make changes
|
||||||
# to /etc/nixos/configuration.nix instead.
|
# to /etc/nixos/configuration.nix instead.
|
||||||
{ config, lib, modulesPath, ... }:
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
modulesPath,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
{
|
{
|
||||||
imports =
|
imports = [
|
||||||
[ (modulesPath + "/installer/scan/not-detected.nix")
|
(modulesPath + "/installer/scan/not-detected.nix")
|
||||||
];
|
];
|
||||||
|
|
||||||
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "usb_storage" "usbhid" "sd_mod" "sdhci_pci" ];
|
boot.initrd.availableKernelModules = [
|
||||||
|
"nvme"
|
||||||
|
"xhci_pci"
|
||||||
|
"usb_storage"
|
||||||
|
"usbhid"
|
||||||
|
"sd_mod"
|
||||||
|
"sdhci_pci"
|
||||||
|
];
|
||||||
boot.initrd.kernelModules = [ ];
|
boot.initrd.kernelModules = [ ];
|
||||||
boot.kernelModules = [ "kvm-amd" ];
|
boot.kernelModules = [ "kvm-amd" ];
|
||||||
boot.extraModulePackages = [ ];
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
fileSystems."/" =
|
fileSystems."/" = {
|
||||||
{ device = "/dev/disk/by-uuid/f3cc4aae-428e-435d-b9f7-333f7dad06b2";
|
device = "/dev/disk/by-uuid/f3cc4aae-428e-435d-b9f7-333f7dad06b2";
|
||||||
fsType = "ext4";
|
fsType = "ext4";
|
||||||
};
|
};
|
||||||
|
|
||||||
fileSystems."/boot" =
|
fileSystems."/boot" = {
|
||||||
{ device = "/dev/disk/by-uuid/580E-5E90";
|
device = "/dev/disk/by-uuid/580E-5E90";
|
||||||
fsType = "vfat";
|
fsType = "vfat";
|
||||||
options = [ "fmask=0077" "dmask=0077" ];
|
options = [
|
||||||
};
|
"fmask=0077"
|
||||||
|
"dmask=0077"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
swapDevices = [ ];
|
swapDevices = [ ];
|
||||||
|
|
7
lib/conds.nix
Normal file
7
lib/conds.nix
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{ lib }:
|
||||||
|
{
|
||||||
|
defaultStateVersion = "24.05";
|
||||||
|
runsDesktop = config: config.modules.desktop.enable;
|
||||||
|
isWayland = config: config.modules.desktop.wayland.enable;
|
||||||
|
isX11 = config: config.modules.desktop.x11.enable;
|
||||||
|
}
|
51
lib/default.nix
Normal file
51
lib/default.nix
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
{ self, inputs, lib }:
|
||||||
|
let
|
||||||
|
# Helper functions for internal use
|
||||||
|
internals = {
|
||||||
|
sys = import inputs.systems;
|
||||||
|
# Add standard lib function sets
|
||||||
|
inherit (lib) types mkOption;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Define pkgsFor before using it
|
||||||
|
pkgsFor = lib.genAttrs internals.sys (system: import inputs.nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
overlays = builtins.attrValues self.overlays;
|
||||||
|
config.allowUnfree = true;
|
||||||
|
});
|
||||||
|
in
|
||||||
|
{
|
||||||
|
# Re-export all our functions
|
||||||
|
inherit (import ./mkHost.nix { inherit self inputs lib; }) mkHost;
|
||||||
|
inherit (import ./mkHome.nix { inherit self inputs lib; }) mkHome;
|
||||||
|
inherit (import ./utils.nix { inherit lib; })
|
||||||
|
mkOpt
|
||||||
|
mkBoolOpt
|
||||||
|
enable
|
||||||
|
disable
|
||||||
|
enableIf
|
||||||
|
mkModule;
|
||||||
|
inherit (import ./conds.nix { inherit lib; })
|
||||||
|
defaultStateVersion
|
||||||
|
runsDesktop
|
||||||
|
isWayland
|
||||||
|
isX11;
|
||||||
|
inherit (import ./secrets.nix { inherit lib; })
|
||||||
|
mkSecretFile
|
||||||
|
mkSecretIdentities;
|
||||||
|
|
||||||
|
# System-wide utilities
|
||||||
|
inherit pkgsFor;
|
||||||
|
forEachSystem = fn: lib.genAttrs internals.sys (system: fn pkgsFor.${system});
|
||||||
|
|
||||||
|
# Add mkModule helper function
|
||||||
|
utilMods = {
|
||||||
|
mkModule = config: name: module:
|
||||||
|
lib.mkIf config.modules.${name}.enable module;
|
||||||
|
|
||||||
|
mkEnabledModule = config: name: module: {
|
||||||
|
options.modules.${name}.enable = lib.mkEnableOption "Enable ${name} configurations";
|
||||||
|
config = lib.mkIf config.modules.${name}.enable module;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
34
lib/mkHome.nix
Normal file
34
lib/mkHome.nix
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
{ self, inputs, lib }:
|
||||||
|
let
|
||||||
|
inherit (lib) mkOption types;
|
||||||
|
in {
|
||||||
|
mkHome = { username, hostname, profiles ? [] }:
|
||||||
|
let
|
||||||
|
system = "x86_64-linux"; # You can make this configurable if needed
|
||||||
|
pkgs = import inputs.nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
config.allowUnfree = true;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
inputs.home-manager.lib.homeManagerConfiguration {
|
||||||
|
inherit pkgs;
|
||||||
|
|
||||||
|
extraSpecialArgs = {
|
||||||
|
inherit username hostname;
|
||||||
|
};
|
||||||
|
|
||||||
|
modules = [
|
||||||
|
# Base home-manager configuration
|
||||||
|
../users/${username}/home.nix
|
||||||
|
|
||||||
|
# Basic home configuration
|
||||||
|
{
|
||||||
|
home = {
|
||||||
|
inherit username;
|
||||||
|
homeDirectory = "/home/${username}";
|
||||||
|
stateVersion = "24.05";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
] ++ (map (profile: ../profiles/${profile}) profiles);
|
||||||
|
};
|
||||||
|
}
|
50
lib/mkHost.nix
Normal file
50
lib/mkHost.nix
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
{ self, inputs, lib }:
|
||||||
|
let
|
||||||
|
inherit (lib) mkOption types;
|
||||||
|
in {
|
||||||
|
mkHost = { hostname, username, system ? "x86_64-linux", profiles ? [] }:
|
||||||
|
let
|
||||||
|
pkgs = import inputs.nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
config.allowUnfree = true;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
inputs.nixpkgs.lib.nixosSystem {
|
||||||
|
inherit system;
|
||||||
|
|
||||||
|
specialArgs = {
|
||||||
|
inherit inputs self hostname username;
|
||||||
|
};
|
||||||
|
|
||||||
|
modules = [
|
||||||
|
# Include host-specific configuration
|
||||||
|
../hosts/${hostname}/configuration.nix
|
||||||
|
|
||||||
|
# Include home-manager as a module
|
||||||
|
inputs.home-manager.nixosModules.home-manager
|
||||||
|
{
|
||||||
|
home-manager = {
|
||||||
|
useGlobalPkgs = true;
|
||||||
|
useUserPackages = true;
|
||||||
|
extraSpecialArgs = {
|
||||||
|
inherit username hostname;
|
||||||
|
};
|
||||||
|
users.${username} = {
|
||||||
|
imports = [
|
||||||
|
../users/${username}/home.nix
|
||||||
|
] ++ (map (profile: ../profiles/${profile}) profiles);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
# Basic system configuration
|
||||||
|
{
|
||||||
|
networking.hostName = hostname;
|
||||||
|
system.stateVersion = "24.05";
|
||||||
|
|
||||||
|
# Allow unfree packages
|
||||||
|
nixpkgs.config.allowUnfree = true;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
15
lib/secrets.nix
Normal file
15
lib/secrets.nix
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{ lib }:
|
||||||
|
let
|
||||||
|
internals.agePath = ../secrets;
|
||||||
|
in {
|
||||||
|
mkSecretFile = { user, source, destination ? null, owner ? null, group ? null }:
|
||||||
|
lib.filterAttrs (n: v: v != null) {
|
||||||
|
file = lib.path.append (internals.agePath + "/${user}") source;
|
||||||
|
path = destination;
|
||||||
|
inherit owner group;
|
||||||
|
};
|
||||||
|
|
||||||
|
mkSecretIdentities = identity:
|
||||||
|
lib.lists.forEach identity (x:
|
||||||
|
lib.path.append (internals.agePath + "/identities") x);
|
||||||
|
}
|
37
lib/utils.nix
Normal file
37
lib/utils.nix
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
{ lib }:
|
||||||
|
let
|
||||||
|
# Helper functions
|
||||||
|
mkEnableAttrs = value: elems: builtins.listToAttrs (map
|
||||||
|
(name: {
|
||||||
|
inherit name;
|
||||||
|
value.enable = value;
|
||||||
|
})
|
||||||
|
elems);
|
||||||
|
in
|
||||||
|
{
|
||||||
|
# Option helpers
|
||||||
|
mkOpt = type: default: lib.mkOption { inherit type default; };
|
||||||
|
mkBoolOpt = default: lib.mkOption { type = lib.types.bool; inherit default; };
|
||||||
|
|
||||||
|
# Module management
|
||||||
|
mkModule = config: name: module:
|
||||||
|
lib.mkIf config.modules.${name}.enable module;
|
||||||
|
|
||||||
|
enable = elems: mkEnableAttrs true elems;
|
||||||
|
disable = elems: mkEnableAttrs false elems;
|
||||||
|
enableIf = cond: elems: if cond then (mkEnableAttrs true elems) else (mkEnableAttrs false elems);
|
||||||
|
|
||||||
|
# Import helpers
|
||||||
|
concatImports = { paths ? [ ], include ? [ ], exclude ? [ ] }:
|
||||||
|
let
|
||||||
|
isExcluded = path: builtins.elem path exclude;
|
||||||
|
validPath = path: lib.pathExists path && !isExcluded path;
|
||||||
|
in
|
||||||
|
lib.flatten (map
|
||||||
|
(path:
|
||||||
|
if validPath path
|
||||||
|
then path
|
||||||
|
else [ ]
|
||||||
|
)
|
||||||
|
(paths ++ include));
|
||||||
|
}
|
9
modules/core/_security/default.nix
Normal file
9
modules/core/_security/default.nix
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./gpg.nix
|
||||||
|
./ssh.nix
|
||||||
|
./hardening.nix
|
||||||
|
];
|
||||||
|
}
|
45
modules/core/_security/gpg.nix
Normal file
45
modules/core/_security/gpg.nix
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
lib.utilMods.mkModule config "security.gpg" {
|
||||||
|
programs.gpg = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
# Modern cipher preferences
|
||||||
|
personal-cipher-preferences = "AES256 AES192 AES";
|
||||||
|
personal-digest-preferences = "SHA512 SHA384 SHA256";
|
||||||
|
personal-compress-preferences = "ZLIB BZIP2 ZIP Uncompressed";
|
||||||
|
default-preference-list = "SHA512 SHA384 SHA256 AES256 AES192 AES ZLIB BZIP2 ZIP Uncompressed";
|
||||||
|
|
||||||
|
# Security settings
|
||||||
|
require-cross-certification = true;
|
||||||
|
no-emit-version = true;
|
||||||
|
no-comments = true;
|
||||||
|
keyid-format = "0xlong";
|
||||||
|
with-fingerprint = true;
|
||||||
|
list-options = "show-uid-validity";
|
||||||
|
verify-options = "show-uid-validity";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.gpg-agent = {
|
||||||
|
enable = true;
|
||||||
|
enableSshSupport = true;
|
||||||
|
defaultCacheTtl = 1800;
|
||||||
|
maxCacheTtl = 7200;
|
||||||
|
extraConfig = ''
|
||||||
|
allow-preset-passphrase
|
||||||
|
allow-loopback-pinentry
|
||||||
|
enable-ssh-support
|
||||||
|
write-env-file
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
# Ensure proper GPG directory permissions on activation
|
||||||
|
home.activation.fixGpgPerms = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
|
||||||
|
if [ -d "$HOME/.gnupg" ]; then
|
||||||
|
chmod 700 "$HOME/.gnupg"
|
||||||
|
find "$HOME/.gnupg" -type f -exec chmod 600 {} \;
|
||||||
|
find "$HOME/.gnupg" -type d -exec chmod 700 {} \;
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
}
|
53
modules/core/_security/hardening.nix
Normal file
53
modules/core/_security/hardening.nix
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
{ config, lib, ... }:
|
||||||
|
|
||||||
|
lib.utilMods.mkModule config "security.hardening" {
|
||||||
|
# TCP hardening from your original config
|
||||||
|
boot.kernelModules = [ "tcp_bbr" ];
|
||||||
|
boot.kernel.sysctl = {
|
||||||
|
# Prevent bogus ICMP errors from filling up logs
|
||||||
|
"net.ipv4.icmp_ignore_bogus_error_responses" = 1;
|
||||||
|
# Reverse path filtering for IP spoofing mitigation
|
||||||
|
"net.ipv4.conf.default.rp_filter" = 1;
|
||||||
|
"net.ipv4.conf.all.rp_filter" = 1;
|
||||||
|
# Disable IP source routing (we're not a router)
|
||||||
|
"net.ipv4.conf.all.accept_source_route" = 0;
|
||||||
|
"net.ipv6.conf.all.accept_source_route" = 0;
|
||||||
|
# Disable ICMP redirects
|
||||||
|
"net.ipv4.conf.all.send_redirects" = 0;
|
||||||
|
"net.ipv4.conf.default.send_redirects" = 0;
|
||||||
|
# MITM mitigations
|
||||||
|
"net.ipv4.conf.all.accept_redirects" = 0;
|
||||||
|
"net.ipv4.conf.default.accept_redirects" = 0;
|
||||||
|
"net.ipv4.conf.all.secure_redirects" = 0;
|
||||||
|
"net.ipv4.conf.default.secure_redirects" = 0;
|
||||||
|
"net.ipv6.conf.all.accept_redirects" = 0;
|
||||||
|
"net.ipv6.conf.default.accept_redirects" = 0;
|
||||||
|
# SYN flood protection
|
||||||
|
"net.ipv4.tcp_syncookies" = 1;
|
||||||
|
# TIME-WAIT assassination protection
|
||||||
|
"net.ipv4.tcp_rfc1337" = 1;
|
||||||
|
|
||||||
|
## TCP optimization
|
||||||
|
# Enable TCP Fast Open
|
||||||
|
"net.ipv4.tcp_fastopen" = 3;
|
||||||
|
# Bufferbloat mitigations
|
||||||
|
"net.ipv4.tcp_congestion_control" = "bbr";
|
||||||
|
"net.core.default_qdisc" = "cake";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Make /tmp volatile
|
||||||
|
boot.tmp.cleanOnBoot = true;
|
||||||
|
|
||||||
|
# Basic security settings
|
||||||
|
security = {
|
||||||
|
# Prevent replacing the running kernel image
|
||||||
|
protectKernelImage = true;
|
||||||
|
# Allow terminal users to execute programs
|
||||||
|
pam.loginLimits = [{
|
||||||
|
domain = "@users";
|
||||||
|
item = "nofile";
|
||||||
|
type = "soft";
|
||||||
|
value = 4096;
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
}
|
38
modules/core/_security/ssh.nix
Normal file
38
modules/core/_security/ssh.nix
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
lib.utilMods.mkModule config "security.ssh" {
|
||||||
|
services.openssh = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
# Security hardening
|
||||||
|
PasswordAuthentication = false;
|
||||||
|
PermitRootLogin = "no";
|
||||||
|
# Automatically remove stale sockets
|
||||||
|
StreamLocalBindUnlink = "yes";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.ssh = {
|
||||||
|
startAgent = true;
|
||||||
|
extraConfig = ''
|
||||||
|
AddKeysToAgent yes
|
||||||
|
UseKeychain yes
|
||||||
|
IdentitiesOnly yes
|
||||||
|
HashKnownHosts yes
|
||||||
|
'';
|
||||||
|
|
||||||
|
# For better security
|
||||||
|
serverAliveInterval = 60;
|
||||||
|
serverAliveCountMax = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Ensure SSH directory exists with correct permissions
|
||||||
|
home.file.".ssh/.keep".text = "";
|
||||||
|
home.activation.sshPermissions = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
|
||||||
|
chmod 700 ~/.ssh
|
||||||
|
if [ -f ~/.ssh/id_ed25519 ]; then
|
||||||
|
chmod 600 ~/.ssh/id_ed25519
|
||||||
|
chmod 644 ~/.ssh/id_ed25519.pub
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
}
|
66
modules/core/age.nix
Normal file
66
modules/core/age.nix
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
inputs,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
cfg = config.variables;
|
||||||
|
pcscdCfg = pkgs.writeText "reader.conf" "";
|
||||||
|
pcscdPkg = pkgs.pcsclite;
|
||||||
|
pcscdPluginEnv = pkgs.buildEnv {
|
||||||
|
name = "pcscd-plugins";
|
||||||
|
paths = map (p: "${p}/pcsc/drivers") [pkgs.ccid];
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{imports = with inputs; [agenix.nixosModules.default];}
|
||||||
|
// {
|
||||||
|
options.variables.userIdentityPaths = lib.mkOption {
|
||||||
|
default = [];
|
||||||
|
type = lib.types.listOf lib.types.path;
|
||||||
|
description = "List of secret identity paths for the user";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkMerge [
|
||||||
|
(lib.mkIf (cfg.userIdentityPaths != []) {
|
||||||
|
age.identityPaths = lib.mkOptionDefault cfg.userIdentityPaths;
|
||||||
|
hm.age.identityPaths = lib.mkOptionDefault cfg.userIdentityPaths;
|
||||||
|
})
|
||||||
|
|
||||||
|
{
|
||||||
|
home-manager.sharedModules = with inputs; [
|
||||||
|
agenix.homeManagerModules.default
|
||||||
|
];
|
||||||
|
environment.systemPackages = with pkgs; [agenix age age-plugin-yubikey];
|
||||||
|
|
||||||
|
age.ageBin = "PATH=$PATH:${lib.makeBinPath [pkgs.age-plugin-yubikey]} ${pkgs.age}/bin/age";
|
||||||
|
|
||||||
|
services.pcscd.enable = lib.mkForce true;
|
||||||
|
# TODO: Figure out why this is broken
|
||||||
|
#systemd.services.pcscd.serviceConfig.ExecStart = mkForce [
|
||||||
|
# "${pcscdPkg}/bin/pcscd -f -c ${pcscdCfg}"
|
||||||
|
#];
|
||||||
|
|
||||||
|
# HACK: Start pcscd before decrypting secrets
|
||||||
|
boot.initrd.systemd = {
|
||||||
|
enable = lib.mkDefault true;
|
||||||
|
packages = [(lib.getBin pcscdPkg)];
|
||||||
|
storePaths = [
|
||||||
|
"${pcscdPkg}/bin/pcscd"
|
||||||
|
"${pcscdCfg}"
|
||||||
|
"${pcscdPluginEnv}"
|
||||||
|
];
|
||||||
|
|
||||||
|
sockets.pcscd.wantedBy = ["sockets.target"];
|
||||||
|
services.pcscd = {
|
||||||
|
environment.PCSCLITE_HP_DROPDIR = pcscdPluginEnv;
|
||||||
|
after = ["rollback.service"];
|
||||||
|
serviceConfig.ExecStart = [
|
||||||
|
""
|
||||||
|
"${pcscdPkg}/bin/pcscd -f -c ${pcscdCfg}"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
26
modules/core/default.nix
Normal file
26
modules/core/default.nix
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
options.modules = {
|
||||||
|
core = lib.mkOption {
|
||||||
|
type = lib.types.submodule {
|
||||||
|
options = {
|
||||||
|
profile = lib.mkOption {
|
||||||
|
type = lib.types.enum [ "minimal" "workstation" "server" ];
|
||||||
|
default = "minimal";
|
||||||
|
description = "The core profile to use for this system";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
# Import the selected profile
|
||||||
|
imports = [ ../profiles/core/${config.modules.core.profile}.nix ];
|
||||||
|
|
||||||
|
# Common core settings that apply to all profiles
|
||||||
|
nix.settings.auto-optimise-store = true;
|
||||||
|
boot.tmp.cleanOnBoot = true;
|
||||||
|
};
|
||||||
|
}
|
144
modules/core/desktop.nix
Normal file
144
modules/core/desktop.nix
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
cfg = config.modules.desktop;
|
||||||
|
waylandEnv = {
|
||||||
|
NIXOS_OZONE_WL = "1";
|
||||||
|
MOZ_ENABLE_WAYLAND = "1";
|
||||||
|
GDK_BACKEND = "wayland,x11";
|
||||||
|
SDL_VIDEODRIVER = "x11";
|
||||||
|
CLUTTER_BACKEND = "wayland";
|
||||||
|
# QT_QPA_PLATFORM = "wayland";
|
||||||
|
# LIBSEAT_BACKEND = "logind";
|
||||||
|
XDG_SESSION_TYPE = "wayland";
|
||||||
|
#WLR_NO_HARDWARE_CURSORS = "1";
|
||||||
|
# _JAVA_AWT_WM_NONREPARENTING = "1";
|
||||||
|
# GDK_SCALE = "2";
|
||||||
|
# ELECTRON_OZONE_PLATFORM_HINT = "wayland";
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
options.modules.desktop = {
|
||||||
|
enable = lib.mkEnableOption "Enable desktop configurations";
|
||||||
|
x11.enable = lib.mkEnableOption "Enable X11 integration" // {default = true;};
|
||||||
|
wayland.enable = lib.mkEnableOption "Enable wayland integration";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable (lib.mkMerge [
|
||||||
|
# X11 Configs
|
||||||
|
(lib.mkIf cfg.x11.enable {
|
||||||
|
# Enable the X11 windowing system.
|
||||||
|
services.xserver = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
# Configure keymap in X11
|
||||||
|
xkb = {
|
||||||
|
layout = "us";
|
||||||
|
variant = "";
|
||||||
|
options = "terminate:ctrl_alt_bksp,caps:ctrl_modifier";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Remove xterm terminal
|
||||||
|
excludePackages = with pkgs; [xterm];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Install installation
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
# X11
|
||||||
|
xorg.xkbutils
|
||||||
|
xorg.xkill
|
||||||
|
xorg.libxcb
|
||||||
|
];
|
||||||
|
})
|
||||||
|
# Wayland Configs
|
||||||
|
(lib.mkIf cfg.wayland.enable {
|
||||||
|
environment = {
|
||||||
|
# NOTE This will break stuff if there is a non-wayland user on the same machine,
|
||||||
|
# but application launchers need this.
|
||||||
|
sessionVariables = waylandEnv;
|
||||||
|
# Install necessary wayland protocol packages
|
||||||
|
systemPackages = with pkgs; [
|
||||||
|
#xorg.xeyes
|
||||||
|
kdePackages.xwaylandvideobridge
|
||||||
|
libsForQt5.qt5.qtwayland
|
||||||
|
qt6.qtwayland
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
hm.home.sessionVariables = waylandEnv;
|
||||||
|
})
|
||||||
|
|
||||||
|
# Common
|
||||||
|
{
|
||||||
|
modules.fonts.enable = true;
|
||||||
|
services = {
|
||||||
|
# Enable touchpad support
|
||||||
|
libinput.enable = true;
|
||||||
|
# Enable color management service
|
||||||
|
colord.enable = true;
|
||||||
|
# Enable pipewire
|
||||||
|
pipewire = {
|
||||||
|
enable = true;
|
||||||
|
alsa = {
|
||||||
|
enable = true;
|
||||||
|
support32Bit = true;
|
||||||
|
};
|
||||||
|
pulse.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
#Notifications
|
||||||
|
libnotify
|
||||||
|
|
||||||
|
#PDF
|
||||||
|
poppler
|
||||||
|
|
||||||
|
# Enable guestures for touchpad
|
||||||
|
libinput-gestures
|
||||||
|
# Install audio configuration tools (Especially important for VR)
|
||||||
|
pavucontrol
|
||||||
|
pulseaudio
|
||||||
|
];
|
||||||
|
|
||||||
|
# Enable the RealtimeKit system service
|
||||||
|
security.rtkit.enable = true;
|
||||||
|
|
||||||
|
# Disable PulseAudio
|
||||||
|
hardware.pulseaudio.enable = lib.mkForce false;
|
||||||
|
|
||||||
|
# Enable networking
|
||||||
|
networking.networkmanager.enable = true;
|
||||||
|
|
||||||
|
# Enable for GTK
|
||||||
|
programs.dconf.enable = true;
|
||||||
|
|
||||||
|
xdg.portal = {
|
||||||
|
enable = true;
|
||||||
|
xdgOpenUsePortal = true;
|
||||||
|
wlr.enable = true;
|
||||||
|
extraPortals = with pkgs; [xdg-desktop-portal-gtk];
|
||||||
|
};
|
||||||
|
|
||||||
|
hm.xdg = {
|
||||||
|
/*
|
||||||
|
portal = {
|
||||||
|
enable = true;
|
||||||
|
xdgOpenUsePortal = true;
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
# Don't generate config at the usual place.
|
||||||
|
# Allow desktop applications to write their file association
|
||||||
|
# preferences to this file.
|
||||||
|
configFile."mimeapps.list".enable = false;
|
||||||
|
# Home-manager also writes xdg-mime-apps configuration to the
|
||||||
|
# "deprecated" location. Desktop applications will look in this
|
||||||
|
# list for associations, if no association was found in the
|
||||||
|
# previous config file.
|
||||||
|
dataFile."applications/mimeapps.list".force = true;
|
||||||
|
mimeApps.enable = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
}
|
24
modules/core/filesystem.nix
Executable file
24
modules/core/filesystem.nix
Executable file
@ -0,0 +1,24 @@
|
|||||||
|
{pkgs, ...}: {
|
||||||
|
services.usbmuxd.enable = true;
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
libimobiledevice
|
||||||
|
ifuse # optional, to mount using 'ifuse'
|
||||||
|
gvfs
|
||||||
|
usbmuxd
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.supportedFilesystems = [
|
||||||
|
"btrfs"
|
||||||
|
"ext2"
|
||||||
|
"ext3"
|
||||||
|
"ext4"
|
||||||
|
"exfat"
|
||||||
|
"f2fs"
|
||||||
|
"fat8"
|
||||||
|
"fat16"
|
||||||
|
"fat32"
|
||||||
|
"ntfs"
|
||||||
|
"xfs"
|
||||||
|
];
|
||||||
|
}
|
108
modules/core/home-manager.nix
Normal file
108
modules/core/home-manager.nix
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
self,
|
||||||
|
inputs,
|
||||||
|
stateVersion,
|
||||||
|
hostname,
|
||||||
|
username,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
hm-config = config.hm;
|
||||||
|
activationScript = let
|
||||||
|
commands = builtins.concatStringsSep "\n" (
|
||||||
|
map (file: ''rm -fv "${file}" && echo Deleted "${file}"'') hm-config.nukeFiles
|
||||||
|
);
|
||||||
|
in ''
|
||||||
|
#!/run/current-system/sw/bin/bash
|
||||||
|
set -o errexit
|
||||||
|
set -o nounset
|
||||||
|
|
||||||
|
echo "[home-nuker] Nuking files so Home Manager can get its will"
|
||||||
|
|
||||||
|
${commands}
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = with inputs; [
|
||||||
|
home-manager.nixosModules.home-manager
|
||||||
|
# Let us use hm as shorthand for home-manager config
|
||||||
|
(lib.mkAliasOptionModule ["hm"] ["home-manager" "users" username])
|
||||||
|
];
|
||||||
|
}
|
||||||
|
// lib.utilMods.mkEnabledModule config "core.homeManager" {
|
||||||
|
# Home file nuking script that deletes stuff just before we run home-manager's activation scripts
|
||||||
|
system.userActivationScripts.home-conflict-file-nuker = lib.mkIf (hm-config.nukeFiles != []) activationScript;
|
||||||
|
|
||||||
|
home-manager = {
|
||||||
|
useGlobalPkgs = true;
|
||||||
|
useUserPackages = true;
|
||||||
|
extraSpecialArgs = {inherit self inputs stateVersion hostname username;};
|
||||||
|
backupFileExtension = ".bak";
|
||||||
|
sharedModules = with inputs;
|
||||||
|
[
|
||||||
|
#agenix.homeManagerModules.default
|
||||||
|
nix-index-database.hmModules.nix-index
|
||||||
|
plasma-manager.homeManagerModules.plasma-manager
|
||||||
|
#stylix.homeManagerModules.stylix
|
||||||
|
]
|
||||||
|
# Import modules specific and user configs for home-manager
|
||||||
|
# TODO: Maybe make ./config in users be available to NixOS too and just pass any Home-Manager configs via hm?
|
||||||
|
++ lib.utils.concatImports {
|
||||||
|
paths = [
|
||||||
|
../home
|
||||||
|
../../users/${username}/config
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Import specific stuff for the user
|
||||||
|
users.${username} = import ../../users/${username}/${config.networking.hostName}.nix;
|
||||||
|
};
|
||||||
|
|
||||||
|
hm = {
|
||||||
|
nix.settings = config.nix.settings;
|
||||||
|
|
||||||
|
programs = {
|
||||||
|
home-manager.enable = true;
|
||||||
|
emacs.enable = lib.mkDefault true;
|
||||||
|
git.enable = lib.mkDefault true;
|
||||||
|
ssh.enable = lib.mkDefault true;
|
||||||
|
gpg.enable = lib.mkDefault true;
|
||||||
|
};
|
||||||
|
|
||||||
|
home = {
|
||||||
|
inherit username stateVersion;
|
||||||
|
inherit (config.variables.user) homeDirectory;
|
||||||
|
preferXdgDirectories = true;
|
||||||
|
|
||||||
|
sessionVariables = {
|
||||||
|
FLAKE = "${hm-config.home.homeDirectory}/Documents/NixConfig";
|
||||||
|
XDG_BIN_HOME = "${hm-config.home.homeDirectory}/.local/bin";
|
||||||
|
|
||||||
|
ANDROID_USER_HOME = "${hm-config.xdg.dataHome}/android";
|
||||||
|
CUDA_CACHE_PATH = "${hm-config.xdg.cacheHome}/nv";
|
||||||
|
TLDR_CACHE_DIR = "${hm-config.xdg.cacheHome}/tldr";
|
||||||
|
};
|
||||||
|
sessionPath = ["${hm-config.home.sessionVariables.XDG_BIN_HOME}"];
|
||||||
|
shellAliases.wget = ''wget --hsts-file="${hm-config.xdg.dataHome}/wget-hsts"'';
|
||||||
|
};
|
||||||
|
|
||||||
|
# (De)activate wanted systemd units when changing configs
|
||||||
|
systemd.user.startServices = "sd-switch";
|
||||||
|
|
||||||
|
# Enable HTML help page
|
||||||
|
manual.html.enable = true;
|
||||||
|
|
||||||
|
news.display = "silent";
|
||||||
|
|
||||||
|
# Make sure XDG is enabled
|
||||||
|
xdg.enable = true;
|
||||||
|
|
||||||
|
xresources.path = lib.mkForce "${hm-config.xdg.configHome}/.Xresources";
|
||||||
|
|
||||||
|
gtk = {
|
||||||
|
enable = true;
|
||||||
|
gtk2.configLocation = lib.mkForce "${hm-config.xdg.configHome}/gtk-2.0/gtkrc";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
194
modules/core/ld.nix
Normal file
194
modules/core/ld.nix
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
# Taken from https://github.com/ywmaa/dotfiles/blob/main/nix-config/dynamic_binaries_support.nix
|
||||||
|
{pkgs, ...}: {
|
||||||
|
# allow running binaries
|
||||||
|
services.envfs.enable = true;
|
||||||
|
programs.nix-ld.enable = true;
|
||||||
|
programs.nix-ld.libraries = with pkgs; [
|
||||||
|
# Needed for operating system detection until
|
||||||
|
# https://github.com/ValveSoftware/steam-for-linux/issues/5909 is resolved
|
||||||
|
lsb-release
|
||||||
|
# Errors in output without those
|
||||||
|
pciutils
|
||||||
|
# Games' dependencies
|
||||||
|
xorg.xrandr
|
||||||
|
which
|
||||||
|
# Needed by gdialog, including in the steam-runtime
|
||||||
|
perl
|
||||||
|
# Open URLs
|
||||||
|
xdg-utils
|
||||||
|
iana-etc
|
||||||
|
# Steam Play / Proton
|
||||||
|
python3
|
||||||
|
|
||||||
|
# It tries to execute xdg-user-dir and spams the log with command not founds
|
||||||
|
xdg-user-dirs
|
||||||
|
|
||||||
|
# electron based launchers need newer versions of these libraries than what runtime provides
|
||||||
|
sqlite
|
||||||
|
# Godot + Blender
|
||||||
|
stdenv.cc.cc
|
||||||
|
# Blender
|
||||||
|
libdecor
|
||||||
|
# Godot Engine
|
||||||
|
libunwind
|
||||||
|
# Others
|
||||||
|
xorg.libXcomposite
|
||||||
|
xorg.libXtst
|
||||||
|
xorg.libXrandr
|
||||||
|
xorg.libXext
|
||||||
|
xorg.libX11
|
||||||
|
xorg.libXfixes
|
||||||
|
xorg.libxkbfile
|
||||||
|
libGL
|
||||||
|
libva
|
||||||
|
libva-utils
|
||||||
|
#pipewire.lib
|
||||||
|
ocamlPackages.alsa
|
||||||
|
alsa-lib
|
||||||
|
libpulseaudio
|
||||||
|
# steamwebhelper
|
||||||
|
harfbuzz
|
||||||
|
libthai
|
||||||
|
pango
|
||||||
|
brotli
|
||||||
|
fuse3
|
||||||
|
icu
|
||||||
|
libglvnd
|
||||||
|
libnotify
|
||||||
|
libxml2
|
||||||
|
openssl
|
||||||
|
pipewire
|
||||||
|
pulseaudio
|
||||||
|
systemd
|
||||||
|
x264
|
||||||
|
libplist
|
||||||
|
|
||||||
|
lsof # friends options won't display "Launch Game" without it
|
||||||
|
file # called by steam's setup.sh
|
||||||
|
|
||||||
|
# dependencies for mesa drivers, needed inside pressure-vessel
|
||||||
|
mesa
|
||||||
|
mesa.llvmPackages.llvm.lib
|
||||||
|
vulkan-loader
|
||||||
|
expat
|
||||||
|
wayland
|
||||||
|
xorg.libxcb
|
||||||
|
xorg.libXdamage
|
||||||
|
xorg.libxshmfence
|
||||||
|
xorg.libXxf86vm
|
||||||
|
libelf
|
||||||
|
(lib.getLib elfutils)
|
||||||
|
|
||||||
|
# Without these it silently fails
|
||||||
|
xorg.libXinerama
|
||||||
|
xorg.libXcursor
|
||||||
|
xorg.libXrender
|
||||||
|
xorg.libXScrnSaver
|
||||||
|
xorg.libXi
|
||||||
|
xorg.libSM
|
||||||
|
xorg.libICE
|
||||||
|
gnome2.GConf
|
||||||
|
curlWithGnuTls
|
||||||
|
nspr
|
||||||
|
nss
|
||||||
|
cups
|
||||||
|
libcap
|
||||||
|
SDL2
|
||||||
|
libusb1
|
||||||
|
dbus
|
||||||
|
dbus-glib
|
||||||
|
gsettings-desktop-schemas
|
||||||
|
ffmpeg
|
||||||
|
libudev0-shim
|
||||||
|
|
||||||
|
# Verified games requirements
|
||||||
|
fontconfig
|
||||||
|
freetype
|
||||||
|
xorg.libXt
|
||||||
|
xorg.libXmu
|
||||||
|
libogg
|
||||||
|
libvorbis
|
||||||
|
SDL
|
||||||
|
SDL2_image
|
||||||
|
glew110
|
||||||
|
libidn
|
||||||
|
tbb
|
||||||
|
zlib
|
||||||
|
|
||||||
|
# SteamVR
|
||||||
|
procps
|
||||||
|
usbutils
|
||||||
|
udev
|
||||||
|
|
||||||
|
# Other things from runtime
|
||||||
|
glib
|
||||||
|
gtk2
|
||||||
|
gtk3
|
||||||
|
bzip2
|
||||||
|
flac
|
||||||
|
freeglut
|
||||||
|
libjpeg
|
||||||
|
libpng
|
||||||
|
libpng12
|
||||||
|
libsamplerate
|
||||||
|
libmikmod
|
||||||
|
libtheora
|
||||||
|
libtiff
|
||||||
|
pixman
|
||||||
|
speex
|
||||||
|
SDL_image
|
||||||
|
SDL_ttf
|
||||||
|
SDL_mixer
|
||||||
|
SDL2_ttf
|
||||||
|
SDL2_mixer
|
||||||
|
libappindicator-gtk2
|
||||||
|
libappindicator-gtk3
|
||||||
|
libdbusmenu-gtk2
|
||||||
|
libindicator-gtk2
|
||||||
|
libcaca
|
||||||
|
libcanberra
|
||||||
|
libgcrypt
|
||||||
|
libvpx
|
||||||
|
librsvg
|
||||||
|
xorg.libXft
|
||||||
|
libvdpau
|
||||||
|
|
||||||
|
# required by coreutils stuff to run correctly
|
||||||
|
# Steam ends up with LD_LIBRARY_PATH=<bunch of runtime stuff>:/usr/lib:<etc>
|
||||||
|
# which overrides DT_RUNPATH in our binaries, so it tries to dynload the
|
||||||
|
# very old versions of stuff from the runtime.
|
||||||
|
# FIXME: how do we even fix this correctly
|
||||||
|
attr
|
||||||
|
|
||||||
|
# Not formally in runtime but needed by some games
|
||||||
|
at-spi2-atk
|
||||||
|
at-spi2-core # CrossCode
|
||||||
|
gst_all_1.gstreamer
|
||||||
|
gst_all_1.gst-plugins-ugly
|
||||||
|
gst_all_1.gst-plugins-base
|
||||||
|
json-glib # paradox launcher (Stellaris)
|
||||||
|
libdrm
|
||||||
|
libxkbcommon # paradox launcher
|
||||||
|
libxcrypt # Alien Isolation, XCOM 2, Company of Heroes 2
|
||||||
|
mono
|
||||||
|
xorg.xkeyboardconfig
|
||||||
|
xorg.libpciaccess
|
||||||
|
icu # dotnet runtime, e.g. Stardew Valley
|
||||||
|
|
||||||
|
# screeps dependencies
|
||||||
|
atk
|
||||||
|
cairo
|
||||||
|
gdk-pixbuf
|
||||||
|
|
||||||
|
# Prison Architect
|
||||||
|
libGLU
|
||||||
|
libuuid
|
||||||
|
libbsd
|
||||||
|
|
||||||
|
# Loop Hero
|
||||||
|
libidn2
|
||||||
|
libpsl
|
||||||
|
nghttp2.lib
|
||||||
|
rtmpdump
|
||||||
|
];
|
||||||
|
}
|
18
modules/core/networking.nix
Normal file
18
modules/core/networking.nix
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
_: {
|
||||||
|
networking.firewall.enable = true;
|
||||||
|
systemd.network.wait-online.enable = false;
|
||||||
|
systemd.services.NetworkManager-wait-online.enable = false;
|
||||||
|
|
||||||
|
# Enable mDNS
|
||||||
|
services.avahi = {
|
||||||
|
enable = true;
|
||||||
|
nssmdns4 = true;
|
||||||
|
# for a WiFi printer
|
||||||
|
openFirewall = true;
|
||||||
|
# Make user systemd service work with avahi
|
||||||
|
publish = {
|
||||||
|
enable = true;
|
||||||
|
userServices = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
83
modules/core/nix.nix
Normal file
83
modules/core/nix.nix
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
self,
|
||||||
|
lib,
|
||||||
|
inputs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
# Config Nixpkgs
|
||||||
|
nixpkgs = {
|
||||||
|
overlays = builtins.attrValues self.overlays;
|
||||||
|
config = {
|
||||||
|
allowUnfree = true;
|
||||||
|
joypixels.acceptLicense = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
nix = {
|
||||||
|
# Makes `nix run` commands use unfree
|
||||||
|
registry = lib.mkForce {
|
||||||
|
nixpkgs.flake = inputs.nixpkgs;
|
||||||
|
nixpkgs-stable.flake = inputs.nixpkgs-stable;
|
||||||
|
|
||||||
|
# Allow running unfree packages with nix3 commands via `nix run unfree#steam`
|
||||||
|
unfree.flake = pkgs.callPackage lib.mkUnfreeNixpkgs {path = inputs.nixpkgs;};
|
||||||
|
unfree-stable.flake = pkgs.callPackage lib.mkUnfreeNixpkgs {path = inputs.nixpkgs-stable;};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Disable channels
|
||||||
|
channel.enable = false;
|
||||||
|
# Force latest nix version
|
||||||
|
package = pkgs.nixVersions.nix_2_23;
|
||||||
|
|
||||||
|
# Perform nix store optimisation weekly to maintain low disk usage
|
||||||
|
optimise = {
|
||||||
|
automatic = true;
|
||||||
|
dates = ["weekly"]; # Optional; allows customizing optimisation schedule
|
||||||
|
};
|
||||||
|
|
||||||
|
# Perform garbage collection weekly to maintain low disk usage
|
||||||
|
gc = {
|
||||||
|
automatic = true;
|
||||||
|
dates = "weekly";
|
||||||
|
# Delete generations that are more than 14 days old
|
||||||
|
options = "--delete-older-than 14d";
|
||||||
|
};
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
# Make sure flakes is enabled
|
||||||
|
experimental-features = ["nix-command" "flakes"];
|
||||||
|
|
||||||
|
# No warnings if git isn't pushed
|
||||||
|
warn-dirty = false;
|
||||||
|
|
||||||
|
# Force XDG Base Directory paths
|
||||||
|
use-xdg-base-directories = true;
|
||||||
|
|
||||||
|
# for Nix path
|
||||||
|
nix-path = ["nixpkgs=${pkgs.path}"];
|
||||||
|
|
||||||
|
# Make root and any user in the wheel group trusted
|
||||||
|
trusted-users = ["root" "@wheel"];
|
||||||
|
|
||||||
|
substituters = [
|
||||||
|
"https://nix-community.cachix.org"
|
||||||
|
"https://nix-gaming.cachix.org"
|
||||||
|
];
|
||||||
|
trusted-public-keys = [
|
||||||
|
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
|
||||||
|
"nix-gaming.cachix.org-1:nbjlureqMbRAxR1gJ/f3hxemL9svXaZF/Ees8vCUUs4="
|
||||||
|
];
|
||||||
|
|
||||||
|
# Reasonable defaults, see https://jackson.dev/post/nix-reasonable-defaults/
|
||||||
|
connect-timeout = 5;
|
||||||
|
log-lines = 25;
|
||||||
|
min-free = 128000000; # 128MB
|
||||||
|
max-free = 1000000000; # 1GB
|
||||||
|
fallback = true; # If binary cache fails, it's okay
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
documentation.nixos.enable = false; # Apparently speeds up rebuild time
|
||||||
|
}
|
42
modules/core/security.nix
Executable file
42
modules/core/security.nix
Executable file
@ -0,0 +1,42 @@
|
|||||||
|
_: {
|
||||||
|
# Make /tmp clean itself on remote. /tmp should be volatile storage!
|
||||||
|
boot.tmp.cleanOnBoot = true;
|
||||||
|
|
||||||
|
boot.kernelModules = ["tcp_bbr"];
|
||||||
|
|
||||||
|
## TCP hardening
|
||||||
|
boot.kernel.sysctl = {
|
||||||
|
# Prevent bogus ICMP errors from filling up logs.
|
||||||
|
"net.ipv4.icmp_ignore_bogus_error_responses" = 1;
|
||||||
|
# Reverse path filtering causes the kernel to do source validation of
|
||||||
|
# packets received from all interfaces. This can mitigate IP spoofing.
|
||||||
|
"net.ipv4.conf.default.rp_filter" = 1;
|
||||||
|
"net.ipv4.conf.all.rp_filter" = 1;
|
||||||
|
# Do not accept IP source route packets (we're not a router)
|
||||||
|
"net.ipv4.conf.all.accept_source_route" = 0;
|
||||||
|
"net.ipv6.conf.all.accept_source_route" = 0;
|
||||||
|
# Don't send ICMP redirects (again, we're on a router)
|
||||||
|
"net.ipv4.conf.all.send_redirects" = 0;
|
||||||
|
"net.ipv4.conf.default.send_redirects" = 0;
|
||||||
|
# Refuse ICMP redirects (MITM mitigations)
|
||||||
|
"net.ipv4.conf.all.accept_redirects" = 0;
|
||||||
|
"net.ipv4.conf.default.accept_redirects" = 0;
|
||||||
|
"net.ipv4.conf.all.secure_redirects" = 0;
|
||||||
|
"net.ipv4.conf.default.secure_redirects" = 0;
|
||||||
|
"net.ipv6.conf.all.accept_redirects" = 0;
|
||||||
|
"net.ipv6.conf.default.accept_redirects" = 0;
|
||||||
|
# Protects against SYN flood attacks
|
||||||
|
"net.ipv4.tcp_syncookies" = 1;
|
||||||
|
# Incomplete protection again TIME-WAIT assassination
|
||||||
|
"net.ipv4.tcp_rfc1337" = 1;
|
||||||
|
|
||||||
|
## TCP optimization
|
||||||
|
# TCP Fast Open is a TCP extension that reduces network latency by packing
|
||||||
|
# data in the sender’s initial TCP SYN. Setting 3 = enable TCP Fast Open for
|
||||||
|
# both incoming and outgoing connections:
|
||||||
|
"net.ipv4.tcp_fastopen" = 3;
|
||||||
|
# Bufferbloat mitigations + slight improvement in throughput & latency
|
||||||
|
"net.ipv4.tcp_congestion_control" = "bbr";
|
||||||
|
"net.core.default_qdisc" = "cake";
|
||||||
|
};
|
||||||
|
}
|
59
modules/core/user.nix
Normal file
59
modules/core/user.nix
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
options,
|
||||||
|
username,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
internals = {
|
||||||
|
cfg = config.variables.user;
|
||||||
|
hostname = config.networking.hostName;
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
options.variables.user = {
|
||||||
|
fullName = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "";
|
||||||
|
example = "John Doe";
|
||||||
|
description = ''
|
||||||
|
Your first and last name.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
emailAddress = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "";
|
||||||
|
example = "johndoe@example.com";
|
||||||
|
description = ''
|
||||||
|
Your email address.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
homeDirectory = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
description = ''
|
||||||
|
The directory for the user's folders. This should only be set if it's in a non-default location.
|
||||||
|
'';
|
||||||
|
default = "/home/${username}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
#users.mutableUsers = false; # Makes it so we can only do password stuff via nixos, safer for not bricking system
|
||||||
|
|
||||||
|
users.users.${username} = {
|
||||||
|
isNormalUser = true;
|
||||||
|
description = internals.cfg.fullName;
|
||||||
|
};
|
||||||
|
|
||||||
|
time = {
|
||||||
|
hardwareClockInLocalTime = lib.mkDefault true;
|
||||||
|
# Set UTC as default timezone, users can override if they want to
|
||||||
|
timeZone = lib.mkDefault "UTC";
|
||||||
|
};
|
||||||
|
|
||||||
|
assertions = [
|
||||||
|
#{assertion = options.variables.user.fullName.isDefined;}
|
||||||
|
#{assertion = options.variables.user.emailaddress.isDefined;}
|
||||||
|
{assertion = options.variables.user.homeDirectory.isDefined;}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
16
modules/core/xdg.nix
Normal file
16
modules/core/xdg.nix
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
environment.sessionVariables = {
|
||||||
|
XDG_CACHE_HOME = "$HOME/.cache";
|
||||||
|
XDG_CONFIG_HOME = "$HOME/.config";
|
||||||
|
XDG_DATA_HOME = "$HOME/.local/share";
|
||||||
|
XDG_STATE_HOME = "$HOME/.local/state";
|
||||||
|
|
||||||
|
ANDROID_USER_HOME = "$XDG_DATA_HOME/android";
|
||||||
|
CUDA_CACHE_PATH = "$XDG_CACHE_HOME/nv";
|
||||||
|
TLDR_CACHE_DIR = "$XDG_CACHE_HOME/tldr";
|
||||||
|
};
|
||||||
|
}
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./aliases
|
./sublime.nix
|
||||||
./zsh.nix
|
./vscode
|
||||||
];
|
];
|
||||||
}
|
}
|
47
modules/home/_editors/_sublime.nix
Normal file
47
modules/home/_editors/_sublime.nix
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
# Install Sublime Text through home.packages
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
sublime4 # Or sublime3 if you prefer
|
||||||
|
];
|
||||||
|
|
||||||
|
# Sublime settings live in a specific directory
|
||||||
|
home.file = {
|
||||||
|
".config/sublime-text/Packages/User/Preferences.sublime-settings".text = builtins.toJSON {
|
||||||
|
# Your sublime settings here
|
||||||
|
font_size = 12;
|
||||||
|
font_face = "FiraCode Nerd Font";
|
||||||
|
theme = "Adaptive.sublime-theme";
|
||||||
|
color_scheme = "Packages/Color Scheme - Default/Monokai.sublime-color-scheme";
|
||||||
|
ignored_packages = [ "Vintage" ];
|
||||||
|
rulers = [
|
||||||
|
80
|
||||||
|
120
|
||||||
|
];
|
||||||
|
tab_size = 2;
|
||||||
|
translate_tabs_to_spaces = true;
|
||||||
|
ensure_newline_at_eof_on_save = true;
|
||||||
|
trim_trailing_white_space_on_save = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Key bindings
|
||||||
|
".config/sublime-text/Packages/User/Default (Linux).sublime-keymap".text = builtins.toJSON [
|
||||||
|
{
|
||||||
|
keys = [ "ctrl+shift+f" ];
|
||||||
|
command = "reindent";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
# Package Control settings
|
||||||
|
".config/sublime-text/Packages/User/Package Control.sublime-settings".text = builtins.toJSON {
|
||||||
|
installed_packages = [
|
||||||
|
"Package Control"
|
||||||
|
"SideBarEnhancements"
|
||||||
|
"A File Icon"
|
||||||
|
"Dracula Color Scheme"
|
||||||
|
"GitGutter"
|
||||||
|
"MarkdownEditing"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
19
modules/home/_editors/_vscode/_default.nix
Normal file
19
modules/home/_editors/_vscode/_default.nix
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
userSettings = import ./settings.nix { inherit pkgs; };
|
||||||
|
extensions = import ./extensions.nix { inherit pkgs; };
|
||||||
|
in
|
||||||
|
{
|
||||||
|
programs.vscode = {
|
||||||
|
enable = true;
|
||||||
|
extensions = extensions;
|
||||||
|
userSettings = userSettings;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Your other configurations like home.packages etc.
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
nixpkgs-fmt
|
||||||
|
nil
|
||||||
|
];
|
||||||
|
}
|
11
modules/home/_editors/_vscode/_extensions.nix
Normal file
11
modules/home/_editors/_vscode/_extensions.nix
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{ pkgs, ... }:
|
||||||
|
with pkgs.vscode-extensions;
|
||||||
|
[
|
||||||
|
ms-vsliveshare.vsliveshare
|
||||||
|
ms-python.python
|
||||||
|
rust-lang.rust-analyzer
|
||||||
|
ms-azuretools.vscode-docker
|
||||||
|
pkief.material-icon-theme
|
||||||
|
dracula-theme.theme-dracula
|
||||||
|
jnoortheen.nix-ide
|
||||||
|
]
|
54
modules/home/_editors/_vscode/_settings.nix
Normal file
54
modules/home/_editors/_vscode/_settings.nix
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
|
# Set the default integrated terminal to zsh
|
||||||
|
"terminal.integrated.shell.linux" = "${pkgs.zsh}/bin/zsh";
|
||||||
|
"terminal.integrated.defaultProfile.linux" = "zsh";
|
||||||
|
|
||||||
|
# Existing settings
|
||||||
|
"editor.fontSize" = 14;
|
||||||
|
"editor.fontFamily" = "FiraCode Nerd Font";
|
||||||
|
"editor.formatOnSave" = true;
|
||||||
|
"files.autoSave" = "onWindowChange";
|
||||||
|
"workbench.colorTheme" = "Dracula";
|
||||||
|
"editor.minimap.enabled" = false;
|
||||||
|
"editor.rulers" = [
|
||||||
|
80
|
||||||
|
120
|
||||||
|
];
|
||||||
|
"files.trimTrailingWhitespace" = true;
|
||||||
|
"editor.bracketPairColorization.enabled" = true;
|
||||||
|
|
||||||
|
# Git settings (unchanged)
|
||||||
|
"git.enabled" = true;
|
||||||
|
"git.autofetch" = true;
|
||||||
|
"git.confirmSync" = false;
|
||||||
|
"git.enableSmartCommit" = true;
|
||||||
|
"git.path" = "${pkgs.git}/bin/git";
|
||||||
|
"git.openRepositoryInParentFolders" = "never";
|
||||||
|
|
||||||
|
# GitLens settings (unchanged)
|
||||||
|
"gitlens.hovers.currentLine.over" = "line";
|
||||||
|
"gitlens.currentLine.enabled" = true;
|
||||||
|
"gitlens.hovers.enabled" = true;
|
||||||
|
"gitlens.mode.active" = "zen";
|
||||||
|
|
||||||
|
# Credential manager integration (unchanged)
|
||||||
|
"git.terminalAuthentication" = true;
|
||||||
|
"git.credential.helper" = "${pkgs.git-credential-manager}/bin/git-credential-manager";
|
||||||
|
|
||||||
|
# Nix configuration
|
||||||
|
"nix.enableLanguageServer" = true;
|
||||||
|
"nix.serverPath" = "nil";
|
||||||
|
"nix.serverSettings" = {
|
||||||
|
"nil" = {
|
||||||
|
"formatting" = {
|
||||||
|
"command" = [ "${pkgs.nixpkgs-fmt}/bin/nixpkgs-fmt" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
"[nix]" = {
|
||||||
|
"editor.defaultFormatter" = "jnoortheen.nix-ide";
|
||||||
|
"editor.formatOnSave" = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
25
modules/home/comms/discord.nix
Normal file
25
modules/home/comms/discord.nix
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
osConfig,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
lib.utilMods.mkModule config "discord" {
|
||||||
|
home.packages = with pkgs;
|
||||||
|
if (lib.conds.isWayland osConfig)
|
||||||
|
then [discord-wayland vesktop]
|
||||||
|
else [discord];
|
||||||
|
|
||||||
|
# make vesktop autostart properly
|
||||||
|
xdg.configFile."autostart/vesktop.desktop".text = ''
|
||||||
|
[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
Version=1.0
|
||||||
|
Name=Vencord
|
||||||
|
Comment=Vencord autostart script
|
||||||
|
Exec=sh -c "${pkgs.vesktop}/bin/vesktop --start-minimized"
|
||||||
|
Terminal=false
|
||||||
|
StartupNotify=false
|
||||||
|
'';
|
||||||
|
}
|
18
modules/home/comms/messengers.nix
Normal file
18
modules/home/comms/messengers.nix
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
# Communication
|
||||||
|
signal-desktop
|
||||||
|
telegram-desktop
|
||||||
|
whatsapp-for-linux
|
||||||
|
|
||||||
|
# Productivity
|
||||||
|
zoom-us
|
||||||
|
obsidian
|
||||||
|
bitwarden-desktop
|
||||||
|
todoist-electron
|
||||||
|
obs-studio
|
||||||
|
|
||||||
|
];
|
||||||
|
}
|
47
modules/home/defaults.nix
Normal file
47
modules/home/defaults.nix
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
osConfig,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
cfg = config.variables;
|
||||||
|
in {
|
||||||
|
options.variables = {
|
||||||
|
defaultTerminal = lib.mkOption {
|
||||||
|
default =
|
||||||
|
if osConfig.modules.desktop.enable
|
||||||
|
then (throw "defaultTerminal not set")
|
||||||
|
else null;
|
||||||
|
type = lib.types.str;
|
||||||
|
};
|
||||||
|
|
||||||
|
defaultBrowser = lib.mkOption {
|
||||||
|
default =
|
||||||
|
if osConfig.modules.desktop.enable
|
||||||
|
then (throw "defaultBrowser not set")
|
||||||
|
else null;
|
||||||
|
type = lib.types.str;
|
||||||
|
};
|
||||||
|
|
||||||
|
defaultTextEditor = lib.mkOption {
|
||||||
|
default = "";
|
||||||
|
type = lib.types.str;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkMerge [
|
||||||
|
(lib.mkIf ((lib.conds.runsDesktop osConfig) && cfg.defaultTerminal != null) {
|
||||||
|
home.sessionVariables.TERMINAL = cfg.defaultTerminal;
|
||||||
|
|
||||||
|
modules.${cfg.defaultTerminal}.enable = true;
|
||||||
|
})
|
||||||
|
|
||||||
|
(lib.mkIf ((lib.conds.runsDesktop osConfig) && cfg.defaultBrowser != null) {
|
||||||
|
modules.${cfg.defaultBrowser}.enable = true;
|
||||||
|
})
|
||||||
|
|
||||||
|
(lib.mkIf (cfg.defaultTextEditor != null) {
|
||||||
|
modules.${cfg.defaultTextEditor}.enable = true;
|
||||||
|
})
|
||||||
|
];
|
||||||
|
}
|
@ -2,9 +2,8 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./direnv.nix
|
./env
|
||||||
./common
|
|
||||||
./languages
|
./languages
|
||||||
|
./tools
|
||||||
];
|
];
|
||||||
|
}
|
||||||
}
|
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./vr
|
./paths.nix
|
||||||
|
./versions.nix
|
||||||
];
|
];
|
||||||
}
|
}
|
@ -40,4 +40,4 @@
|
|||||||
message = "XDG Base Directory support must be enabled";
|
message = "XDG Base Directory support must be enabled";
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
}
|
}
|
@ -7,4 +7,4 @@
|
|||||||
GO_VERSION = "1.21";
|
GO_VERSION = "1.21";
|
||||||
RUST_VERSION = "stable";
|
RUST_VERSION = "stable";
|
||||||
};
|
};
|
||||||
}
|
}
|
0
modules/home/development/_languages/_default.nix
Normal file
0
modules/home/development/_languages/_default.nix
Normal file
@ -12,4 +12,4 @@
|
|||||||
GOPATH = "${config.home.sessionVariables.GO_PATH}";
|
GOPATH = "${config.home.sessionVariables.GO_PATH}";
|
||||||
GOBIN = "${config.home.sessionVariables.GO_PATH}/bin";
|
GOBIN = "${config.home.sessionVariables.GO_PATH}/bin";
|
||||||
};
|
};
|
||||||
}
|
}
|
26
modules/home/development/_languages/_javascript.nix
Normal file
26
modules/home/development/_languages/_javascript.nix
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
nodePackages.npm
|
||||||
|
nodePackages.node-gyp
|
||||||
|
nodePackages.node-pre-gyp
|
||||||
|
nodePackages.pnpm
|
||||||
|
yarn
|
||||||
|
];
|
||||||
|
|
||||||
|
home.file.".npmrc".text = ''
|
||||||
|
prefix=${config.home.sessionVariables.NODE_PACKAGES_DIR}
|
||||||
|
'';
|
||||||
|
|
||||||
|
|
||||||
|
home.file.".pnpmrc".text = ''
|
||||||
|
pnpm-version=8.9.0
|
||||||
|
store-dir=${config.home.sessionVariables.XDG_DATA_HOME}/pnpm
|
||||||
|
'';
|
||||||
|
|
||||||
|
|
||||||
|
home.file.".yarnrc".text = ''
|
||||||
|
cache-folder "${config.home.sessionVariables.XDG_CACHE_HOME}/yarn"
|
||||||
|
'';
|
||||||
|
}
|
39
modules/home/development/_languages/_python/_default.nix
Normal file
39
modules/home/development/_languages/_python/_default.nix
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
pythonVersion = builtins.replaceStrings [ "." ] [ "" ] config.home.sessionVariables.PYTHON_VERSION;
|
||||||
|
pythonPackages = pkgs."python${pythonVersion}Packages";
|
||||||
|
|
||||||
|
# import custom packages
|
||||||
|
repo-to-text = pkgs.callPackage ./repo-to-text.nix { };
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.sessionVariables = {
|
||||||
|
PYTHONDONTWRITEBYTECODE = 1;
|
||||||
|
PYTHONIOENCODING = "UTF-8";
|
||||||
|
VIRTUAL_ENV_DISABLE_PROMPT = 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
home.packages = with pythonPackages; [
|
||||||
|
pip
|
||||||
|
setuptools
|
||||||
|
wheel
|
||||||
|
black
|
||||||
|
pylint
|
||||||
|
mypy
|
||||||
|
pytest
|
||||||
|
pytest-cov
|
||||||
|
|
||||||
|
# Time tracking
|
||||||
|
toggl-cli
|
||||||
|
|
||||||
|
# Add other Python CLI tools
|
||||||
|
httpie # HTTP client
|
||||||
|
youtube-dl # Video downloader
|
||||||
|
|
||||||
|
# Custom CLI tools
|
||||||
|
repo-to-text
|
||||||
|
];
|
||||||
|
|
||||||
|
}
|
@ -1,7 +1,8 @@
|
|||||||
{ lib
|
{
|
||||||
, python311Packages
|
lib,
|
||||||
, fetchPypi
|
python311Packages,
|
||||||
, tree
|
fetchPypi,
|
||||||
|
tree,
|
||||||
}:
|
}:
|
||||||
|
|
||||||
python311Packages.buildPythonPackage rec {
|
python311Packages.buildPythonPackage rec {
|
||||||
@ -31,7 +32,7 @@ python311Packages.buildPythonPackage rec {
|
|||||||
description = "Convert directory/repository structure and contents into a single text file";
|
description = "Convert directory/repository structure and contents into a single text file";
|
||||||
homepage = "https://github.com/kirill-markin/repo-to-text";
|
homepage = "https://github.com/kirill-markin/repo-to-text";
|
||||||
license = licenses.mit;
|
license = licenses.mit;
|
||||||
maintainers = [];
|
maintainers = [ ];
|
||||||
};
|
};
|
||||||
|
|
||||||
postInstall = ''
|
postInstall = ''
|
@ -1,16 +1,30 @@
|
|||||||
{ config, pkgs, ... }:
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
home.packages = with pkgs; [
|
|
||||||
rustup
|
|
||||||
];
|
|
||||||
|
|
||||||
home.sessionVariables = {
|
home.sessionVariables = {
|
||||||
RUSTUP_HOME = "${config.home.sessionVariables.XDG_DATA_HOME}/rustup";
|
RUSTUP_HOME = "${config.home.sessionVariables.XDG_DATA_HOME}/rustup";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
cargo-edit
|
||||||
|
cargo-watch
|
||||||
|
cargo-audit
|
||||||
|
cargo-tarpaulin
|
||||||
|
rustup
|
||||||
|
];
|
||||||
|
|
||||||
|
home.file.".cargo/config.toml".text = ''
|
||||||
|
[build]
|
||||||
|
target-dir = "target"
|
||||||
|
|
||||||
|
[cargo-new]
|
||||||
|
vcs = "git"
|
||||||
|
'';
|
||||||
|
|
||||||
|
|
||||||
home.file.".rustup/settings.toml".text = ''
|
home.file.".rustup/settings.toml".text = ''
|
||||||
default_toolchain = "${config.home.sessionVariables.RUST_VERSION}"
|
default_toolchain = "${config.home.sessionVariables.RUST_VERSION}"
|
||||||
profile = "default"
|
profile = "default"
|
||||||
'';
|
'';
|
||||||
}
|
}
|
17
modules/home/development/_tools/_default.nix
Normal file
17
modules/home/development/_tools/_default.nix
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./git.nix
|
||||||
|
./direnv.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
git
|
||||||
|
git-credential-manager
|
||||||
|
gh
|
||||||
|
gotty
|
||||||
|
git-crypt
|
||||||
|
sops
|
||||||
|
];
|
||||||
|
}
|
@ -6,4 +6,4 @@
|
|||||||
nix-direnv.enable = true;
|
nix-direnv.enable = true;
|
||||||
enableZshIntegration = true;
|
enableZshIntegration = true;
|
||||||
};
|
};
|
||||||
}
|
}
|
48
modules/home/development/_tools/_git.nix
Normal file
48
modules/home/development/_tools/_git.nix
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
{
|
||||||
|
programs.git = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.git;
|
||||||
|
lfs.enable = true;
|
||||||
|
userName = "jeirmeister";
|
||||||
|
userEmail = "jeir@jeirslab.xyz";
|
||||||
|
|
||||||
|
# Enable commit and tag signing with specific GPG key
|
||||||
|
signing = {
|
||||||
|
key = "0x33A40DF62D35C4A7"; # Your specific key ID
|
||||||
|
signByDefault = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
extraConfig = {
|
||||||
|
init.defaultBranch = "main";
|
||||||
|
pull.rebase = false;
|
||||||
|
|
||||||
|
# GPG program configuration
|
||||||
|
gpg = {
|
||||||
|
program = "${pkgs.gnupg}/bin/gpg2";
|
||||||
|
format = "openpgp";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Credential configuration
|
||||||
|
credential = {
|
||||||
|
helper = lib.mkForce "${pkgs.git-credential-manager}/bin/git-credential-manager";
|
||||||
|
credentialStore = "plaintext";
|
||||||
|
interactive = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Enable GPG signing for commits and tags
|
||||||
|
commit.gpgSign = true;
|
||||||
|
tag.gpgSign = true;
|
||||||
|
|
||||||
|
safe.directory = "*";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
xdg.enable = true;
|
||||||
|
}
|
15
modules/home/development/c.nix
Normal file
15
modules/home/development/c.nix
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
lib.utilMods.mkModule config "c" {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
# :editor format
|
||||||
|
clang-tools
|
||||||
|
# :tools lsp
|
||||||
|
omnisharp-roslyn
|
||||||
|
gcc
|
||||||
|
];
|
||||||
|
}
|
19
modules/home/development/java.nix
Normal file
19
modules/home/development/java.nix
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
lib.utilMods.mkModule config "java" {
|
||||||
|
programs.java.enable = true;
|
||||||
|
|
||||||
|
home.sessionVariables.JDTLS_PATH = "${pkgs.jdt-language-server}/share/java";
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
# :tools lsp
|
||||||
|
java-language-server
|
||||||
|
|
||||||
|
# :lang java
|
||||||
|
jdt-language-server
|
||||||
|
];
|
||||||
|
}
|
12
modules/home/development/latex.nix
Normal file
12
modules/home/development/latex.nix
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
lib.utilMods.mkModule config "latex" {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
# :editor format
|
||||||
|
texlive.combined.scheme-medium #LaTex
|
||||||
|
];
|
||||||
|
}
|
14
modules/home/development/lua.nix
Normal file
14
modules/home/development/lua.nix
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
lib.utilMods.mkModule config "lua" {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
# :editor format
|
||||||
|
nodePackages.lua-fmt
|
||||||
|
# :tools lsp :lang lua
|
||||||
|
lua-language-server
|
||||||
|
];
|
||||||
|
}
|
14
modules/home/development/markdown.nix
Normal file
14
modules/home/development/markdown.nix
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
lib.utilMods.mkModule config "markdown" {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
# :lang markdown
|
||||||
|
proselint
|
||||||
|
pandoc
|
||||||
|
grip
|
||||||
|
];
|
||||||
|
}
|
27
modules/home/development/nix.nix
Normal file
27
modules/home/development/nix.nix
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
alejandra-quiet = pkgs.writeShellScriptBin "alejandra-quiet" ''alejandra --quiet "$@"'';
|
||||||
|
in
|
||||||
|
lib.utilMods.mkModule config "nix" {
|
||||||
|
programs.nix-index-database.comma.enable = true;
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
nh # Nice wrapper for NixOS and HM
|
||||||
|
alejandra # Nix formatter
|
||||||
|
nix-output-monitor # Monitor Nix compilation
|
||||||
|
nvd # Nix/NixOS package version diff tool
|
||||||
|
nixpkgs-review # Review nixpkgs
|
||||||
|
nurl # Automated prefetch tool for
|
||||||
|
nix-init # Automatically create nix packages from URLs
|
||||||
|
nix-inspect # View nix configurations
|
||||||
|
nil # Nix LSP
|
||||||
|
deadnix # Deadcode finder for NIx
|
||||||
|
statix # Anti-pattern detector
|
||||||
|
|
||||||
|
alejandra-quiet # Wrapper for Emacs
|
||||||
|
];
|
||||||
|
}
|
31
modules/home/development/python.nix
Normal file
31
modules/home/development/python.nix
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
lib.utilMods.mkModule config "python" {
|
||||||
|
programs.pyenv.enable = true;
|
||||||
|
|
||||||
|
home.sessionVariables.PYENV_ROOT = "${config.xdg.dataHome}/pyenv";
|
||||||
|
|
||||||
|
home.sessionPath = ["${config.home.sessionVariables.PYENV_ROOT}/bin"];
|
||||||
|
|
||||||
|
home.packages = with pkgs; let
|
||||||
|
myPythonPackages = ps:
|
||||||
|
with ps; [
|
||||||
|
debugpy
|
||||||
|
pyflakes
|
||||||
|
isort
|
||||||
|
pytest
|
||||||
|
black
|
||||||
|
pip
|
||||||
|
pipx
|
||||||
|
];
|
||||||
|
in [
|
||||||
|
# :lang python, debugger, formatter
|
||||||
|
(python312.withPackages myPythonPackages)
|
||||||
|
pyright
|
||||||
|
pipenv
|
||||||
|
];
|
||||||
|
}
|
9
modules/home/development/rust.nix
Normal file
9
modules/home/development/rust.nix
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
lib.utilMods.mkModule config "rust" {
|
||||||
|
home.packages = with pkgs; [rustup];
|
||||||
|
}
|
16
modules/home/development/web.nix
Normal file
16
modules/home/development/web.nix
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
lib.utilMods.mkModule config "web" {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
# :editor format
|
||||||
|
html-tidy
|
||||||
|
|
||||||
|
# :lang web
|
||||||
|
stylelint
|
||||||
|
jsbeautifier
|
||||||
|
];
|
||||||
|
}
|
7
modules/home/firefox/default.nix
Normal file
7
modules/home/firefox/default.nix
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
_: {
|
||||||
|
imports = [
|
||||||
|
./firefox.nix
|
||||||
|
./floorp.nix
|
||||||
|
./zen.nix
|
||||||
|
];
|
||||||
|
}
|
13
modules/home/firefox/extensions.nix
Normal file
13
modules/home/firefox/extensions.nix
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{pkgs, ...}:
|
||||||
|
with pkgs.nur.repos.rycee.firefox-addons; [
|
||||||
|
ublock-origin
|
||||||
|
sponsorblock
|
||||||
|
return-youtube-dislikes
|
||||||
|
darkreader
|
||||||
|
#bypass-paywalls-clean
|
||||||
|
plasma-integration
|
||||||
|
enhancer-for-youtube
|
||||||
|
indie-wiki-buddy
|
||||||
|
stylus
|
||||||
|
canvasblocker
|
||||||
|
]
|
62
modules/home/firefox/firefox.nix
Normal file
62
modules/home/firefox/firefox.nix
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
username,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
lib.utilMods.mkModule config "firefox" {
|
||||||
|
xdg.mimeApps = let
|
||||||
|
defaultApplications = {
|
||||||
|
"default-web-browser" = ["firefox.desktop"];
|
||||||
|
"text/html" = ["firefox.desktop"];
|
||||||
|
"x-scheme-handler/http" = ["firefox.desktop"];
|
||||||
|
"x-scheme-handler/https" = ["firefox.desktop"];
|
||||||
|
"x-scheme-handler/about" = ["firefox.desktop"];
|
||||||
|
"x-scheme-handler/unknown" = ["firefox.desktop"];
|
||||||
|
"application/xhtml+xml" = ["firefox.desktop"];
|
||||||
|
"text/xml" = ["firefox.desktop"];
|
||||||
|
};
|
||||||
|
in
|
||||||
|
lib.mkIf (config.variables.defaultBrowser == "firefox") {
|
||||||
|
enable = true;
|
||||||
|
inherit defaultApplications;
|
||||||
|
associations.added = defaultApplications;
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.firefox.enable = true;
|
||||||
|
|
||||||
|
programs.firefox.nativeMessagingHosts = with pkgs; [fx-cast-bridge];
|
||||||
|
|
||||||
|
programs.firefox.profiles."${username}" = {
|
||||||
|
extensions = import ./extensions.nix {inherit pkgs;};
|
||||||
|
|
||||||
|
search = {
|
||||||
|
force = true;
|
||||||
|
default = "Ecosia";
|
||||||
|
engines = import ./searchEngines.nix {inherit lib pkgs;};
|
||||||
|
};
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
"widget.use-xdg-desktop-portal.file-picker" = 1;
|
||||||
|
"browser.disableResetPrompt" = true;
|
||||||
|
"browser.download.panel.shown" = true;
|
||||||
|
"browser.download.useDownloadDir" = true;
|
||||||
|
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
|
||||||
|
"browser.shell.checkDefaultBrowser" = true;
|
||||||
|
"browser.shell.defaultBrowserCheckCount" = 1;
|
||||||
|
"browser.startup.homepage" = "https://google.com";
|
||||||
|
"browser.bookmarks.showMobileBookmarks" = true;
|
||||||
|
"dom.security.https_only_mode" = true;
|
||||||
|
"identity.fxaccounts.enabled" = true;
|
||||||
|
"privacy.trackingprotection.enabled" = true;
|
||||||
|
"signon.rememberSignons" = false;
|
||||||
|
"browser.newtabpage.pinned" = lib.singleton {
|
||||||
|
title = "NixOS";
|
||||||
|
url = "https://nixos.org";
|
||||||
|
};
|
||||||
|
"browser.uiCustomization.state" = '' {"placements":{"widget-overflow-fixed-list":[],"unified-extensions-area":["privacy_privacy_com-browser-action","enhancerforyoutube_maximerf_addons_mozilla_org-browser-action","jid1-93cwpmrbvpjrqa_jetpack-browser-action","sponsorblocker_ajay_app-browser-action","_762f9885-5a13-4abd-9c77-433dcd38b8fd_-browser-action","_25cddbee-458b-4e9f-984d-dbf35511f124_-browser-action","canvasblocker_kkapsner_de-browser-action","_2e5ff8c8-32fe-46d0-9fc8-6b8986621f3c_-browser-action","_74145f27-f039-47ce-a470-a662b129930a_-browser-action","_7a7a4a92-a2a0-41d1-9fd7-1e92480d612d_-browser-action","_cb31ec5d-c49a-4e5a-b240-16c767444f62_-browser-action"],"nav-bar":["back-button","forward-button","stop-reload-button","home-button","firefox-view-button","urlbar-container","fxa-toolbar-menu-button","downloads-button","library-button","keepassxc-browser_keepassxc_org-browser-action","ublock0_raymondhill_net-browser-action","addon_darkreader_org-browser-action","plasma-browser-integration_kde_org-browser-action","_testpilot-containers-browser-action","unified-extensions-button","reset-pbm-toolbar-button","_3c078156-979c-498b-8990-85f7987dd929_-browser-action","browserpass_maximbaz_com-browser-action"],"toolbar-menubar":["menubar-items"],"TabsToolbar":["tabbrowser-tabs","new-tab-button","alltabs-button"],"PersonalToolbar":["import-button","personal-bookmarks"]},"seen":["save-to-pocket-button","developer-button","ublock0_raymondhill_net-browser-action","_testpilot-containers-browser-action","privacy_privacy_com-browser-action","addon_darkreader_org-browser-action","enhancerforyoutube_maximerf_addons_mozilla_org-browser-action","jid1-93cwpmrbvpjrqa_jetpack-browser-action","keepassxc-browser_keepassxc_org-browser-action","plasma-browser-integration_kde_org-browser-action","sponsorblocker_ajay_app-browser-action","_762f9885-5a13-4abd-9c77-433dcd38b8fd_-browser-action","browserpass_maximbaz_com-browser-action","_25cddbee-458b-4e9f-984d-dbf35511f124_-browser-action","canvasblocker_kkapsner_de-browser-action","_2e5ff8c8-32fe-46d0-9fc8-6b8986621f3c_-browser-action","_3c078156-979c-498b-8990-85f7987dd929_-browser-action","_74145f27-f039-47ce-a470-a662b129930a_-browser-action","_7a7a4a92-a2a0-41d1-9fd7-1e92480d612d_-browser-action","_cb31ec5d-c49a-4e5a-b240-16c767444f62_-browser-action"],"dirtyAreaCache":["nav-bar","PersonalToolbar","toolbar-menubar","TabsToolbar","widget-overflow-fixed-list","unified-extensions-area"],"currentVersion":20,"newElementCount":7}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
40
modules/home/firefox/floorp.nix
Normal file
40
modules/home/firefox/floorp.nix
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
username,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
lib.utilMods.mkModule config "floorp" {
|
||||||
|
xdg.mimeApps = let
|
||||||
|
defaultApplications = {
|
||||||
|
"default-web-browser" = ["floorp.desktop"];
|
||||||
|
"text/html" = ["floorp.desktop"];
|
||||||
|
"x-scheme-handler/http" = ["floorp.desktop"];
|
||||||
|
"x-scheme-handler/https" = ["floorp.desktop"];
|
||||||
|
"x-scheme-handler/about" = ["floorp.desktop"];
|
||||||
|
"x-scheme-handler/unknown" = ["floorp.desktop"];
|
||||||
|
"application/xhtml+xml" = ["floorp.desktop"];
|
||||||
|
"text/xml" = ["floorp.desktop"];
|
||||||
|
};
|
||||||
|
in
|
||||||
|
lib.mkIf (config.variables.defaultBrowser == "floorp") {
|
||||||
|
enable = true;
|
||||||
|
inherit defaultApplications;
|
||||||
|
associations.added = defaultApplications;
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.floorp.enable = true;
|
||||||
|
|
||||||
|
programs.floorp.nativeMessagingHosts = with pkgs; [fx-cast-bridge kdePackages.plasma-browser-integration];
|
||||||
|
|
||||||
|
programs.floorp.profiles."${username}" = {
|
||||||
|
extensions = import ./extensions.nix {inherit pkgs;};
|
||||||
|
|
||||||
|
search = {
|
||||||
|
force = true;
|
||||||
|
default = "Ecosia";
|
||||||
|
engines = import ./searchEngines.nix {inherit lib pkgs;};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
71
modules/home/firefox/searchEngines.nix
Normal file
71
modules/home/firefox/searchEngines.nix
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
nix-icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
|
||||||
|
in {
|
||||||
|
"Ecosia" = {
|
||||||
|
iconUpdateURL = "https://www.ecosia.org/static/icons/favicon.ico";
|
||||||
|
updateInterval = 24 * 60 * 60 * 1000; # Every day
|
||||||
|
definedAliases = ["@e" "@ecosia"];
|
||||||
|
urls = lib.singleton {template = "https://www.ecosia.org/search?q={searchTerms}";};
|
||||||
|
};
|
||||||
|
|
||||||
|
"Nix Packages" = {
|
||||||
|
inherit nix-icon;
|
||||||
|
definedAliases = lib.singleton "@np";
|
||||||
|
urls = lib.singleton {template = "https://search.nixos.org/packages?type=packages&query={searchTerms}";};
|
||||||
|
};
|
||||||
|
|
||||||
|
"NixOS Options" = {
|
||||||
|
inherit nix-icon;
|
||||||
|
definedAliases = lib.singleton "@no";
|
||||||
|
urls = lib.singleton {template = "https://search.nixos.org/options?type=packages&query={searchTerms}";};
|
||||||
|
};
|
||||||
|
|
||||||
|
"NixOS Wiki" = {
|
||||||
|
inherit nix-icon;
|
||||||
|
definedAliases = lib.singleton "@nw";
|
||||||
|
urls = lib.singleton {template = "https://wiki.nixos.org/w/index.php?search={searchTerms}";};
|
||||||
|
};
|
||||||
|
|
||||||
|
"Nixpkgs PR Tracker" = {
|
||||||
|
inherit nix-icon;
|
||||||
|
definedAliases = ["@nprt"];
|
||||||
|
urls = lib.singleton {template = "https://nixpk.gs/pr-tracker.html?pr={searchTerms}";};
|
||||||
|
};
|
||||||
|
|
||||||
|
# All these after all from llakala
|
||||||
|
"Noogle" = {
|
||||||
|
inherit nix-icon;
|
||||||
|
definedAliases = ["@nog"];
|
||||||
|
urls = lib.singleton {template = "https://noogle.dev/q?term={searchTerms}";};
|
||||||
|
};
|
||||||
|
|
||||||
|
"Nixpkgs" = {
|
||||||
|
iconUpdateURL = "https://github.com/favicon.ico";
|
||||||
|
definedAliases = ["@npkgs"];
|
||||||
|
urls = lib.singleton {
|
||||||
|
template = "https://github.com/search";
|
||||||
|
# Thanks to xunuwu on github for being a reference to use of these functions
|
||||||
|
params = lib.attrsToList {
|
||||||
|
"type" = "code";
|
||||||
|
"q" = "repo:NixOS/nixpkgs lang:nix {searchTerms}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
"Github Nix Code" = {
|
||||||
|
iconUpdateURL = "https://github.com/favicon.ico";
|
||||||
|
definedAliases = ["@ghn"];
|
||||||
|
urls = lib.singleton {
|
||||||
|
template = "https://github.com/search";
|
||||||
|
# Thanks to xunuwu on github for being a reference to use of these functions
|
||||||
|
params = lib.attrsToList {
|
||||||
|
"type" = "code";
|
||||||
|
"q" = "lang:nix NOT is:fork {searchTerms}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
454
modules/home/media/gaming.nix
Normal file
454
modules/home/media/gaming.nix
Normal file
@ -0,0 +1,454 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
username,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
cfg = config.modules.gaming;
|
||||||
|
hm-config = config.hm;
|
||||||
|
in
|
||||||
|
lib.utilMods.mkModule' config "gaming" {
|
||||||
|
minecraft-server.enable = lib.mkEnableOption "Enable minecraft server configs";
|
||||||
|
vr.enable = lib.mkEnableOption "Enable virual reality configs";
|
||||||
|
} (lib.mkMerge [
|
||||||
|
# Minecraft
|
||||||
|
(lib.mkIf cfg.minecraft-server.enable {
|
||||||
|
# Allow Minecraft server ports
|
||||||
|
networking.firewall.allowedTCPPorts = [25565 24454];
|
||||||
|
|
||||||
|
hm.home.packages = with pkgs; [prismlauncher flite orca];
|
||||||
|
hm.programs.java.enable = true;
|
||||||
|
hm.home.shellAliases = {
|
||||||
|
start-minecraft-server = "cd ~/Games/MinecraftServer-1.21.x/ && ./run.sh --nogui && cd || cd";
|
||||||
|
start-minecraft-fabric-server = "cd ~/Games/MinecraftFabricServer-1.20.1/ && java -Xmx8G -jar ./fabric-server-mc.1.20.1-loader.0.15.7-launcher.1.0.0.jar nogui && cd || cd";
|
||||||
|
};
|
||||||
|
})
|
||||||
|
# VR
|
||||||
|
(lib.mkIf cfg.vr.enable {
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
android-tools
|
||||||
|
android-udev-rules
|
||||||
|
BeatSaberModManager
|
||||||
|
helvum
|
||||||
|
];
|
||||||
|
|
||||||
|
# Enable ALVR module on NixOS
|
||||||
|
programs.alvr.enable = true;
|
||||||
|
programs.alvr.openFirewall = true;
|
||||||
|
|
||||||
|
# Fixes issue with SteamVR not starting
|
||||||
|
system.activationScripts.fixSteamVR = "${pkgs.libcap}/bin/setcap CAP_SYS_NICE+ep /home/${username}/.local/share/Steam/steamapps/common/SteamVR/bin/linux64/vrcompositor-launcher";
|
||||||
|
|
||||||
|
hm.xdg.desktopEntries = {
|
||||||
|
"BeatSaberModManager" = {
|
||||||
|
name = "Beat Saber ModManager";
|
||||||
|
genericName = "Game";
|
||||||
|
exec = "BeatSaberModManager";
|
||||||
|
icon = "${pkgs.BeatSaberModManager}/lib/BeatSaberModManager/Resources/Icons/Icon.ico";
|
||||||
|
type = "Application";
|
||||||
|
categories = ["Game"];
|
||||||
|
startupNotify = true;
|
||||||
|
comment = "Beat Saber ModManager is a mod manager for Beat Saber";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
})
|
||||||
|
|
||||||
|
# Common
|
||||||
|
{
|
||||||
|
# Enable Steam hardware compatibility
|
||||||
|
hardware.steam-hardware.enable = true;
|
||||||
|
|
||||||
|
# Fixes SteamLink/Remote play crashing
|
||||||
|
environment.systemPackages = with pkgs; [protontricks keyutils goverlay ludusavi libcanberra protonup-qt];
|
||||||
|
|
||||||
|
environment.sessionVariables.ICED_BACKEND = "tiny-skia";
|
||||||
|
hardware.graphics = {
|
||||||
|
enable = true;
|
||||||
|
enable32Bit = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.gamemode = {
|
||||||
|
enable = true;
|
||||||
|
enableRenice = true;
|
||||||
|
settings = {
|
||||||
|
general = {
|
||||||
|
softrealtime = "off";
|
||||||
|
inhibit_screensaver = 1;
|
||||||
|
};
|
||||||
|
custom = {
|
||||||
|
start = "''${pkgs.libnotify}/bin/notify-send 'GameMode started'";
|
||||||
|
end = "''${pkgs.libnotify}/bin/notify-send 'GameMode ended'";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.steam = {
|
||||||
|
enable = true;
|
||||||
|
# Make Steam folder spawn in ~/.config instead of /home/USER
|
||||||
|
package = pkgs.steam.override {
|
||||||
|
extraEnv.HOME = "/home/${username}/.config";
|
||||||
|
extraLibraries = pkgs: [pkgs.xorg.libxcb];
|
||||||
|
};
|
||||||
|
remotePlay.openFirewall = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
xdg.mime = {
|
||||||
|
defaultApplications."x-scheme-handler/steam" = "steam.desktop";
|
||||||
|
addedAssociations."x-scheme-handler/steam" = "steam.desktop";
|
||||||
|
};
|
||||||
|
|
||||||
|
hm.xdg = {
|
||||||
|
userDirs.extraConfig.XDG_GAME_DIR = "${hm-config.home.homeDirectory}/Games";
|
||||||
|
|
||||||
|
mimeApps = {
|
||||||
|
defaultApplications."x-scheme-handler/steam" = "steam.desktop";
|
||||||
|
associations.added."x-scheme-handler/steam" = "steam.desktop";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
hm.programs.mangohud = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
### From https://github.com/flightlessmango/MangoHud/blob/master/data/MangoHud.conf
|
||||||
|
### MangoHud configuration file
|
||||||
|
### Uncomment any options you wish to enable. Default options are left uncommented
|
||||||
|
### Use some_parameter=0 to disable a parameter (only works with on/off parameters)
|
||||||
|
### Everything below can be used / overridden with the environment variable MANGOHUD_CONFIG instead
|
||||||
|
|
||||||
|
################ INFORMATIONAL #################
|
||||||
|
## prints possible options on stdout
|
||||||
|
# help = true;
|
||||||
|
|
||||||
|
################ PERFORMANCE #################
|
||||||
|
|
||||||
|
### Limit the application FPS. Comma-separated list of one or more FPS values (e.g. 0,30,60). 0 means unlimited (unless VSynced)
|
||||||
|
# fps_limit = 0;
|
||||||
|
|
||||||
|
### early = wait before present, late = wait after present
|
||||||
|
# fps_limit_method = "";
|
||||||
|
|
||||||
|
### VSync [0-3] 0 = adaptive; 1 = off; 2 = mailbox; 3 = on
|
||||||
|
# vsync = -1;
|
||||||
|
|
||||||
|
### OpenGL VSync [0-N] 0 = off; >=1 = wait for N v-blanks, N > 1 acts as a FPS limiter (FPS = display refresh rate / N)
|
||||||
|
# gl_vsync = -2;
|
||||||
|
|
||||||
|
### Mip-map LoD bias. Negative values will increase texture sharpness (and aliasing)
|
||||||
|
## Positive values will increase texture blurriness (-16 to 16)
|
||||||
|
# picmip = -17;
|
||||||
|
|
||||||
|
### Anisotropic filtering level. Improves sharpness of textures viewed at an angle (0 to 16)
|
||||||
|
# af = -1;
|
||||||
|
|
||||||
|
### Force bicubic filtering
|
||||||
|
# bicubic = true;
|
||||||
|
|
||||||
|
### Force trilinear filtering
|
||||||
|
# trilinear = true;
|
||||||
|
|
||||||
|
### Disable linear texture filtering. Makes textures look blocky
|
||||||
|
# retro = true;
|
||||||
|
|
||||||
|
################### VISUAL ###################
|
||||||
|
|
||||||
|
### Legacy layout
|
||||||
|
# legacy_layout = 0;
|
||||||
|
|
||||||
|
### pre defined presets
|
||||||
|
# -1 = default
|
||||||
|
# 0 = no display
|
||||||
|
# 1 = fps only
|
||||||
|
# 2 = horizontal view
|
||||||
|
# 3 = extended
|
||||||
|
# 4 = high detailed information
|
||||||
|
# preset = -1;
|
||||||
|
|
||||||
|
### Enable most of the toggleable parameters (currently excludes `histogram`)
|
||||||
|
# full = true;
|
||||||
|
|
||||||
|
### Show FPS only. ***Not meant to be used with other display params***
|
||||||
|
# fps_only = true;
|
||||||
|
|
||||||
|
### Display custom centered text, useful for a header
|
||||||
|
# custom_text_center = "";
|
||||||
|
|
||||||
|
### Display the current system time
|
||||||
|
# time = true;
|
||||||
|
|
||||||
|
### Time formatting examples
|
||||||
|
## %H:%M
|
||||||
|
## [ %T %F ]
|
||||||
|
## %X # locally formatted time, because of limited glyph range, missing characters may show as '?' (e.g. Japanese)
|
||||||
|
# time_format = "%T";
|
||||||
|
|
||||||
|
### Display MangoHud version
|
||||||
|
# version = true;
|
||||||
|
|
||||||
|
### Display the current GPU information
|
||||||
|
## Note: gpu_mem_clock and gpu_mem_temp also need "vram" to be enabled
|
||||||
|
gpu_stats = true;
|
||||||
|
gpu_temp = true;
|
||||||
|
# gpu_junction_temp = true;
|
||||||
|
# gpu_core_clock = true;
|
||||||
|
# gpu_mem_temp = true;
|
||||||
|
# gpu_mem_clock = true;
|
||||||
|
# gpu_power = true;
|
||||||
|
# gpu_text = "";
|
||||||
|
gpu_load_change = true;
|
||||||
|
#gpu_load_value = [ "60" "90" ];
|
||||||
|
#gpu_load_color = [ "39F900" "FDFD09" "B22222" ];
|
||||||
|
## GPU fan in rpm (only works on AMD GPUs)
|
||||||
|
# gpu_fan = true;
|
||||||
|
# gpu_voltage = true; # (only works on AMD GPUs)
|
||||||
|
|
||||||
|
### Display the current CPU information
|
||||||
|
cpu_stats = true;
|
||||||
|
cpu_temp = true;
|
||||||
|
# cpu_power = true;
|
||||||
|
# cpu_text = "";
|
||||||
|
# cpu_mhz = true;
|
||||||
|
cpu_load_change = true;
|
||||||
|
#cpu_load_value = [ "60" "90" ];
|
||||||
|
#cpu_load_color = [ "39F900" "FDFD09" "B22222" ];
|
||||||
|
|
||||||
|
### Display the current CPU load & frequency for each core
|
||||||
|
# core_load = true;
|
||||||
|
# core_load_change = true;
|
||||||
|
|
||||||
|
### Display IO read and write for the app (not system)
|
||||||
|
# io_read = true;
|
||||||
|
# io_write = true;
|
||||||
|
|
||||||
|
### Display system vram / ram / swap space usage
|
||||||
|
vram = true;
|
||||||
|
ram = true;
|
||||||
|
# swap = true;
|
||||||
|
|
||||||
|
### Display per process memory usage
|
||||||
|
## Show resident memory and other types, if enabled
|
||||||
|
# procmem = true;
|
||||||
|
# procmem_shared = true;
|
||||||
|
# procmem_virt = true;
|
||||||
|
|
||||||
|
### Display battery information
|
||||||
|
# battery = true;
|
||||||
|
# battery_icon = true;
|
||||||
|
# gamepad_battery = true;
|
||||||
|
# gamepad_battery_icon = true;
|
||||||
|
# battery_watt = true;
|
||||||
|
# battery_time = true;
|
||||||
|
|
||||||
|
### Display FPS and frametime
|
||||||
|
fps = true;
|
||||||
|
# fps_sampling_period = 500;
|
||||||
|
# fps_color_change = true;
|
||||||
|
# fps_value = ["30" "60"];
|
||||||
|
# fps_color=["22222" "FDFD09" "39F900"];
|
||||||
|
frametime = true;
|
||||||
|
# frame_count = true;
|
||||||
|
|
||||||
|
### Display GPU throttling status based on Power, current, temp or "other"
|
||||||
|
## Only shows if throttling is currently happening
|
||||||
|
throttling_status = true;
|
||||||
|
|
||||||
|
### Display miscellaneous information
|
||||||
|
# engine_version = true;
|
||||||
|
# engine_short_names = true;
|
||||||
|
# gpu_name = true;
|
||||||
|
# vulkan_driver = true;
|
||||||
|
# wine = true;
|
||||||
|
# exec_name = true;
|
||||||
|
|
||||||
|
### Display loaded MangoHud architecture
|
||||||
|
# arch = true;
|
||||||
|
|
||||||
|
### Display the frametime line graph
|
||||||
|
frame_timing = true;
|
||||||
|
# histogram = true;
|
||||||
|
|
||||||
|
### Display GameMode / vkBasalt running status
|
||||||
|
# gamemode = true;
|
||||||
|
# vkbasalt = true;
|
||||||
|
|
||||||
|
### Gamescope related options
|
||||||
|
## Display the status of FSR (only works in gamescope)
|
||||||
|
# fsr = true;
|
||||||
|
## Hides the sharpness info for the `fsr` option (only available in gamescope)
|
||||||
|
# hide_fsr_sharpness = true;
|
||||||
|
## Shows the graph of gamescope app frametimes and latency (only on gamescope obviously)
|
||||||
|
# debug = true;
|
||||||
|
|
||||||
|
### graphs displays one or more graphs that you chose
|
||||||
|
## seperated by ",", available graphs are
|
||||||
|
## gpu_load,cpu_load,gpu_core_clock,gpu_mem_clock,vram,ram,cpu_temp,gpu_temp
|
||||||
|
# graphs = [""];
|
||||||
|
|
||||||
|
### mangoapp related options
|
||||||
|
## Enables mangoapp to be displayed above the Steam UI
|
||||||
|
# mangoapp_steam = true;
|
||||||
|
|
||||||
|
### Steam Deck options
|
||||||
|
## Shows the Steam Deck fan rpm
|
||||||
|
# fan = true;
|
||||||
|
|
||||||
|
### Display current FPS limit
|
||||||
|
show_fps_limit = true;
|
||||||
|
|
||||||
|
### Display the current resolution
|
||||||
|
# resolution = true;
|
||||||
|
|
||||||
|
### Display custom text
|
||||||
|
# custom_text = "";
|
||||||
|
### Display output of Bash command in next column
|
||||||
|
# exec = "";
|
||||||
|
|
||||||
|
### Display media player metadata
|
||||||
|
# media_player = true;
|
||||||
|
## for example spotify
|
||||||
|
# media_player_name = "";
|
||||||
|
## Format metadata, lines are delimited by ; (wip)
|
||||||
|
## example: {title};{artist};{album}
|
||||||
|
## example: Track:;{title};By:;{artist};From:;{album}
|
||||||
|
# media_player_format = ["title" "artist" "album"];
|
||||||
|
|
||||||
|
### Change the hud font size
|
||||||
|
# font_size = 24;
|
||||||
|
# font_scale = 1.0;
|
||||||
|
# font_size_text = 24;
|
||||||
|
# font_scale_media_player = 0.55;
|
||||||
|
# no_small_font = true;
|
||||||
|
|
||||||
|
### Change default font (set location to TTF/OTF file)
|
||||||
|
## Set font for the whole hud
|
||||||
|
# font_file = "";
|
||||||
|
|
||||||
|
## Set font only for text like media player metadata
|
||||||
|
# font_file_text = "";
|
||||||
|
|
||||||
|
## Set font glyph ranges. Defaults to Latin-only. Don't forget to set font_file/font_file_text to font that supports these
|
||||||
|
## Probably don't enable all at once because of memory usage and hardware limits concerns
|
||||||
|
## If you experience crashes or text is just squares, reduce glyph range or reduce font size
|
||||||
|
# font_glyph_ranges = ["korean" "chinese" "chinese_simplified" "japanese" "cyrillic" "thai" "vietnamese" "latin_ext_a" "latin_ext_b"];
|
||||||
|
|
||||||
|
### Outline text
|
||||||
|
text_outline = true;
|
||||||
|
# text_outline_color = 000000;
|
||||||
|
# text_outline_thickness = 1.5;
|
||||||
|
|
||||||
|
### Change the hud position
|
||||||
|
# position = "top-left";
|
||||||
|
|
||||||
|
### Change the corner roundness
|
||||||
|
# round_corners = 0;
|
||||||
|
|
||||||
|
### Remove margins around MangoHud
|
||||||
|
# hud_no_margin = true;
|
||||||
|
|
||||||
|
### Display compact version of MangoHud
|
||||||
|
# hud_compact = true;
|
||||||
|
|
||||||
|
### Display MangoHud in a horizontal position
|
||||||
|
# horizontal = true;
|
||||||
|
# horizontal_stretch = true;
|
||||||
|
|
||||||
|
### Disable / hide the hud by default
|
||||||
|
# no_display = true;
|
||||||
|
|
||||||
|
### Hud position offset
|
||||||
|
# offset_x = 0;
|
||||||
|
# offset_y = 0;
|
||||||
|
|
||||||
|
### Hud dimensions
|
||||||
|
# width = 0;
|
||||||
|
# height = 140;
|
||||||
|
# table_columns = 3;
|
||||||
|
# cellpadding_y = -0.085;
|
||||||
|
|
||||||
|
### Hud transparency / alpha
|
||||||
|
# background_alpha = 0.5;
|
||||||
|
# alpha = 1.0;
|
||||||
|
|
||||||
|
### FCAT overlay
|
||||||
|
### This enables an FCAT overlay to perform frametime analysis on the final image stream.
|
||||||
|
### Enable the overlay
|
||||||
|
# fcat = true;
|
||||||
|
### Set the width of the FCAT overlay.
|
||||||
|
### 24 is a performance optimization on AMD GPUs that should not have adverse effects on nVidia GPUs.
|
||||||
|
### A minimum of 20 pixels is recommended by nVidia.
|
||||||
|
# fcat_overlay_width = 24;
|
||||||
|
### Set the screen edge, this can be useful for special displays that don't update from top edge to bottom. This goes from 0 (left side) to 3 (top edge), counter-clockwise.
|
||||||
|
# fcat_screen_edge = 0;
|
||||||
|
|
||||||
|
### Color customization
|
||||||
|
# text_color = "FFFFFF";
|
||||||
|
# gpu_color = "2E9762";
|
||||||
|
# cpu_color = "2E97CB";
|
||||||
|
# vram_color = "AD64C1";
|
||||||
|
# ram_color = "C26693";
|
||||||
|
# engine_color = "EB5B5B";
|
||||||
|
# io_color = "A491D3";
|
||||||
|
# frametime_color = "00FF00";
|
||||||
|
# background_color = "020202";
|
||||||
|
# media_player_color = "FFFFFF";
|
||||||
|
# wine_color = "EB5B5B";
|
||||||
|
# battery_color = "FF9078";
|
||||||
|
|
||||||
|
### Specify GPU with PCI bus ID for AMDGPU and NVML stats
|
||||||
|
### Set to 'domain:bus:slot.function'
|
||||||
|
# pci_dev = "0:0a:0.0";
|
||||||
|
|
||||||
|
### Blacklist
|
||||||
|
# blacklist = "";
|
||||||
|
|
||||||
|
### Control over socket
|
||||||
|
### Enable and set socket name, '%p' is replaced with process id
|
||||||
|
## example: mangohud
|
||||||
|
## example: mangohud-%p
|
||||||
|
# control = -1;
|
||||||
|
|
||||||
|
################ WORKAROUNDS #################
|
||||||
|
### Options starting with "gl_*" are for OpenGL
|
||||||
|
### Specify what to use for getting display size. Options are "viewport", "scissorbox" or disabled. Defaults to using glXQueryDrawable
|
||||||
|
# gl_size_query = "viewport";
|
||||||
|
|
||||||
|
### (Re)bind given framebuffer before MangoHud gets drawn. Helps with Crusader Kings III
|
||||||
|
# gl_bind_framebuffer = 0;
|
||||||
|
|
||||||
|
### Don't swap origin if using GL_UPPER_LEFT. Helps with Ryujinx
|
||||||
|
# gl_dont_flip = 1;
|
||||||
|
|
||||||
|
################ INTERACTION #################
|
||||||
|
|
||||||
|
### Change toggle keybinds for the hud & logging
|
||||||
|
toggle_hud = "Shift_R+F12";
|
||||||
|
# toggle_hud_position = "Shift_R+F11";
|
||||||
|
# toggle_fps_limit = "Shift_L+F1";
|
||||||
|
toggle_logging = "Shift_L+F2";
|
||||||
|
# reload_cfg = "Shift_L+F4";
|
||||||
|
# upload_log = "Shift_L+F3";
|
||||||
|
|
||||||
|
#################### LOG #####################
|
||||||
|
### Automatically start the log after X seconds
|
||||||
|
# autostart_log = "";
|
||||||
|
### Set amount of time in seconds that the logging will run for
|
||||||
|
# log_duration = "";
|
||||||
|
### Change the default log interval, 0 is default
|
||||||
|
# log_interval = 0;
|
||||||
|
### Set location of the output files (required for logging)
|
||||||
|
output_folder = "${hm-config.xdg.stateHome}/mangologs";
|
||||||
|
### Permit uploading logs directly to FlightlessMango.com
|
||||||
|
## set to 1 to enable
|
||||||
|
# permit_upload = 0;
|
||||||
|
### Define a '+'-separated list of percentiles shown in the benchmark results
|
||||||
|
### Use "AVG" to get a mean average. Default percentiles are 97+AVG+1+0.1
|
||||||
|
## example: ['97', 'AVG', '1', '0.1']
|
||||||
|
# benchmark_percentiles = ["97" "AVG"];
|
||||||
|
## Adds more headers and information such as versioning to the log. This format is not supported on flightlessmango.com (yet)
|
||||||
|
# log_versioning = true;
|
||||||
|
## Enable automatic uploads of logs to flightlessmango.com
|
||||||
|
# upload_logs = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
])
|
16
modules/home/media/obs-studio.nix
Normal file
16
modules/home/media/obs-studio.nix
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
lib.utilMods.mkModule config "obs-studio" {
|
||||||
|
# Makes OBS Virtual Camera feature function
|
||||||
|
boot.extraModulePackages = with config.boot.kernelPackages; [v4l2loopback];
|
||||||
|
|
||||||
|
hm.programs.obs-studio.enable = true;
|
||||||
|
hm.programs.obs-studio.plugins = with pkgs.obs-studio-plugins; [
|
||||||
|
obs-vkcapture
|
||||||
|
obs-pipewire-audio-capture
|
||||||
|
];
|
||||||
|
}
|
136
modules/home/terminal/kitty.nix
Normal file
136
modules/home/terminal/kitty.nix
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
lib.utilMods.mkModule config "kitty" {
|
||||||
|
#modules.fonts.enable = true;
|
||||||
|
|
||||||
|
xdg.mimeApps = let
|
||||||
|
defaultApplications = {
|
||||||
|
"mimetype" = "kitty.desktop";
|
||||||
|
"application/x-terminal-emulator" = "kitty.desktop";
|
||||||
|
"x-terminal-emulator" = "kitty.desktop";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
lib.mkIf (config.variables.defaultTerminal == "kitty") {
|
||||||
|
enable = true;
|
||||||
|
inherit defaultApplications;
|
||||||
|
associations.added = defaultApplications;
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.kitty.enable = true;
|
||||||
|
|
||||||
|
programs.kitty.environment = {
|
||||||
|
COLORTERM = "truecolor";
|
||||||
|
WINIT_X11_SCALE_FACTOR = "1";
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.kitty.settings = {
|
||||||
|
# Advanced {{{
|
||||||
|
term = "xterm-256color";
|
||||||
|
#shell = "${pkgs.zsh}/bin/zsh --login --interactive";
|
||||||
|
#kitty_mod = "ctrl+shift";
|
||||||
|
#startup_session = "default.conf";
|
||||||
|
repaint_delay = 0;
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# Terminal Bell {{{
|
||||||
|
enable_audio_bell = "yes";
|
||||||
|
visual_bell_duration = "0.0";
|
||||||
|
bell_on_tab = "🔔 ";
|
||||||
|
linux_bell_theme = "__ocean";
|
||||||
|
bell_path = "${pkgs.kdePackages.ocean-sound-theme}/share/sounds/ocean/stereo/bell-window-system.oga";
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# Cursor {{{
|
||||||
|
cursor_shape = "block";
|
||||||
|
cursor_blink_interval = "0.5";
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# Scrollback {{{
|
||||||
|
scrollback_lines = 5000;
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# Mouse {{{
|
||||||
|
show_hyperlink_targets = "yes";
|
||||||
|
copy_on_select = "yes";
|
||||||
|
paste_actions = "quote-urls-at-prompt,confirm-if-large";
|
||||||
|
focus_follows_mouse = "yes";
|
||||||
|
mouse_hide_wait = 0;
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# Window Layout {{{
|
||||||
|
remember_window_size = "yes";
|
||||||
|
# FIXME: Add fonts for machine types
|
||||||
|
/*
|
||||||
|
initial_window_width =
|
||||||
|
if (config.variables.machine.buildType == "laptop")
|
||||||
|
then 1000
|
||||||
|
else 1920;
|
||||||
|
initial_window_height =
|
||||||
|
if (config.variables.machine.buildType == "laptop")
|
||||||
|
then 700
|
||||||
|
else 1080;
|
||||||
|
*/
|
||||||
|
|
||||||
|
enabled_layouts = "tall:bias=65;full_size=1;mirrored=false";
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# Color Scheme {{{
|
||||||
|
dynamic_background_opacity = "yes";
|
||||||
|
# }}}
|
||||||
|
};
|
||||||
|
programs.kitty.keybindings = {
|
||||||
|
#: Window management {{{
|
||||||
|
#: New window
|
||||||
|
#"kitty_mod+enter" = "new_window";
|
||||||
|
#"f7" = "focus_visible_window";
|
||||||
|
#"f8" = "swap_with_window";
|
||||||
|
|
||||||
|
#"ctrl+left" = "resize_window narrower";
|
||||||
|
#"ctrl+right" = "resize_window wider";
|
||||||
|
#"ctrl+up" = "resize_window taller";
|
||||||
|
#"ctrl+down" = "resize_window shorter";
|
||||||
|
|
||||||
|
# reset all windows in the tab to default sizes
|
||||||
|
#"kitty_mod+z" = "resize_window reset";
|
||||||
|
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
#: Tab Management {{{
|
||||||
|
#"ctrl+t" = "new_tab";
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# Font Sizes {{{
|
||||||
|
#: Increase font size
|
||||||
|
"ctrl+equal" = "change_font_size all +1.0";
|
||||||
|
|
||||||
|
#: Decrease font size
|
||||||
|
"ctrl+minus" = "change_font_size all -1.0";
|
||||||
|
|
||||||
|
"ctrl+0" = "change_font_size all 0";
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
#: Miscellaneous {{{
|
||||||
|
#: Show documentation
|
||||||
|
"f9" = "show_kitty_doc overview";
|
||||||
|
|
||||||
|
#: Toggle fullscreen
|
||||||
|
"f11" = "toggle_fullscreen";
|
||||||
|
|
||||||
|
#: Toggle maximized
|
||||||
|
"f10" = "toggle_maximized";
|
||||||
|
|
||||||
|
#: Edit config file
|
||||||
|
#"f2" = "launch --type=tab emacsclient -nw ~/.config/kitty/kitty.conf";
|
||||||
|
|
||||||
|
#: Reload kitty.conf
|
||||||
|
"f5" = "combine : load_config_file : launch --type=overlay --hold --allow-remote-control kitty @ send-text 'kitty config reloaded'";
|
||||||
|
#"ctrl+r" = "combine : load_config_file : launch --type=overlay --hold --allow-remote-control kitty @ send-text 'kitty config reloaded'";
|
||||||
|
#: Debug kitty configuration
|
||||||
|
"f6" = "debug_config";
|
||||||
|
# }}}
|
||||||
|
};
|
||||||
|
}
|
23
modules/home/terminal/konsole.nix
Normal file
23
modules/home/terminal/konsole.nix
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
lib.utilMods.mkModule config "konsole" {
|
||||||
|
xdg.mimeApps = let
|
||||||
|
defaultApplications = {
|
||||||
|
"mimetype" = "konsole.desktop";
|
||||||
|
"application/x-terminal-emulator" = "konsole.desktop";
|
||||||
|
"x-terminal-emulator" = "konsole.desktop";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
lib.mkIf (config.variables.defaultTerminal == "konsole") {
|
||||||
|
enable = true;
|
||||||
|
inherit defaultApplications;
|
||||||
|
associations.added = defaultApplications;
|
||||||
|
};
|
||||||
|
|
||||||
|
# DefaultThemed profile is considered the Stylix module
|
||||||
|
programs.konsole.enable = true;
|
||||||
|
}
|
115
modules/home/theme/common.nix
Normal file
115
modules/home/theme/common.nix
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib) types mkOption literalExpression mkIf mkMerge mkBefore;
|
||||||
|
cfg = config.theme;
|
||||||
|
cfgapp = cfg.app;
|
||||||
|
|
||||||
|
iconThemeModule = types.submodule {
|
||||||
|
options = {
|
||||||
|
package = mkOption {
|
||||||
|
type = types.nullOr types.package;
|
||||||
|
default = null;
|
||||||
|
example = literalExpression "pkgs.papirus-icon-theme";
|
||||||
|
description = ''
|
||||||
|
Package providing the theme. This package will be installed to your profile. If 'null', then the theme is assumed to be already available in your profile.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
name = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "";
|
||||||
|
example = "Papirus-Dark";
|
||||||
|
description = "The symbolic name of the theme within the package without any spaces.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
appModule = types.submodule {
|
||||||
|
options = {
|
||||||
|
rio.name = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "";
|
||||||
|
example = "3024 Night";
|
||||||
|
description = ''
|
||||||
|
The name of the theme within the package to use for Rio.
|
||||||
|
|
||||||
|
See theme names: https://github.com/raphamorim/rio-terminal-themes/tree/main/themes
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
options.theme = {
|
||||||
|
packages = mkOption {
|
||||||
|
type = types.listOf types.package;
|
||||||
|
default = [];
|
||||||
|
example = literalExpression "with pkgs; [ dracula-theme ]";
|
||||||
|
description = ''
|
||||||
|
Packages providing the theme. The list of packages will be installed to your profile. If empty, then the theme is assumed to be already available in your profile.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
name = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "";
|
||||||
|
example = "Dracula";
|
||||||
|
description = "The name of the theme within the package.";
|
||||||
|
};
|
||||||
|
nameSymbolic = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "";
|
||||||
|
example = "dracula";
|
||||||
|
description = "The symbolic name of the theme within the package without any spaces.";
|
||||||
|
};
|
||||||
|
iconTheme = mkOption {
|
||||||
|
type = types.nullOr iconThemeModule;
|
||||||
|
default = {};
|
||||||
|
description = "Icon configuration options.";
|
||||||
|
};
|
||||||
|
app = mkOption {
|
||||||
|
type = types.nullOr appModule;
|
||||||
|
default = {};
|
||||||
|
description = "App theme configuration options.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg != null) (mkMerge [
|
||||||
|
# Configure rio
|
||||||
|
(mkIf (cfgapp != null && config.programs.rio.enable) {
|
||||||
|
xdg.configFile."rio/themes/${cfgapp.rio.name}.toml".source =
|
||||||
|
fetchGit {
|
||||||
|
url = "https://github.com/raphamorim/rio-terminal-themes";
|
||||||
|
rev = "9d76eb416c1cc46f959f236fdfa5479a19c0a070";
|
||||||
|
}
|
||||||
|
+ "/themes/${cfgapp.rio.name}.toml";
|
||||||
|
programs.rio.settings = mkBefore {
|
||||||
|
# It makes Rio look for the specified theme in the themes folder
|
||||||
|
# (macos and linux: ~/.config/rio/themes/dracula.toml)
|
||||||
|
# (windows: C:\Users\USER\AppData\Local\rio\themes\dracula.toml)
|
||||||
|
theme = "${cfgapp.rio.name}";
|
||||||
|
};
|
||||||
|
})
|
||||||
|
# Configure gtk theme
|
||||||
|
(mkIf config.gtk.enable {
|
||||||
|
gtk = {
|
||||||
|
iconTheme = mkIf (cfg.iconTheme != null) {
|
||||||
|
inherit (cfg.iconTheme) name;
|
||||||
|
inherit (cfg.iconTheme) package;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
})
|
||||||
|
|
||||||
|
{
|
||||||
|
nukeFiles = ["${config.home.homeDirectory}/.config/gtk-2.0/gtkrc" "${config.home.homeDirectory}/.config/gtk-3.0/gtk.css" "${config.home.homeDirectory}/.config/gtk-4.0/gtk.css" "${config.home.homeDirectory}/.gtkrc-2.0"];
|
||||||
|
programs.plasma.workspace.iconTheme = "${cfg.iconTheme.name}";
|
||||||
|
# Install the packages
|
||||||
|
home.packages = with pkgs; (mkMerge
|
||||||
|
[
|
||||||
|
(mkIf (cfg.packages != []) cfg.packages)
|
||||||
|
(mkIf (cfg.iconTheme.package != null) [cfg.iconTheme.package])
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
}
|
64
modules/home/theme/konsole.mustache
Normal file
64
modules/home/theme/konsole.mustache
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
[Background]
|
||||||
|
Color={{base00-rgb-r}},{{base00-rgb-g}},{{base00-rgb-b}}
|
||||||
|
|
||||||
|
[BackgroundIntense]
|
||||||
|
Color={{base03-rgb-r}},{{base03-rgb-g}},{{base03-rgb-b}}
|
||||||
|
|
||||||
|
[Color0]
|
||||||
|
Color={{base00-rgb-r}},{{base00-rgb-g}},{{base00-rgb-b}}
|
||||||
|
|
||||||
|
[Color0Intense]
|
||||||
|
Color={{base03-rgb-r}},{{base03-rgb-g}},{{base03-rgb-b}}
|
||||||
|
|
||||||
|
[Color1]
|
||||||
|
Color={{base08-rgb-r}},{{base08-rgb-g}},{{base08-rgb-b}}
|
||||||
|
|
||||||
|
[Color1Intense]
|
||||||
|
Color={{base08-rgb-r}},{{base08-rgb-g}},{{base08-rgb-b}}
|
||||||
|
|
||||||
|
[Color2]
|
||||||
|
Color={{base0B-rgb-r}},{{base0B-rgb-g}},{{base0B-rgb-b}}
|
||||||
|
|
||||||
|
[Color2Intense]
|
||||||
|
Color={{base0B-rgb-r}},{{base0B-rgb-g}},{{base0B-rgb-b}}
|
||||||
|
|
||||||
|
[Color3]
|
||||||
|
Color={{base0A-rgb-r}},{{base0A-rgb-g}},{{base0A-rgb-b}}
|
||||||
|
|
||||||
|
[Color3Intense]
|
||||||
|
Color={{base0A-rgb-r}},{{base0A-rgb-g}},{{base0A-rgb-b}}
|
||||||
|
|
||||||
|
[Color4]
|
||||||
|
Color={{base0D-rgb-r}},{{base0D-rgb-g}},{{base0D-rgb-b}}
|
||||||
|
|
||||||
|
[Color4Intense]
|
||||||
|
Color={{base0D-rgb-r}},{{base0D-rgb-g}},{{base0D-rgb-b}}
|
||||||
|
|
||||||
|
[Color5]
|
||||||
|
Color={{base0E-rgb-r}},{{base0E-rgb-g}},{{base0E-rgb-b}}
|
||||||
|
|
||||||
|
[Color5Intense]
|
||||||
|
Color={{base0E-rgb-r}},{{base0E-rgb-g}},{{base0E-rgb-b}}
|
||||||
|
|
||||||
|
[Color6]
|
||||||
|
Color={{base0C-rgb-r}},{{base0C-rgb-g}},{{base0C-rgb-b}}
|
||||||
|
|
||||||
|
[Color6Intense]
|
||||||
|
Color={{base0C-rgb-r}},{{base0C-rgb-g}},{{base0C-rgb-b}}
|
||||||
|
|
||||||
|
[Color7]
|
||||||
|
Color={{base05-rgb-r}},{{base05-rgb-g}},{{base05-rgb-b}}
|
||||||
|
|
||||||
|
[Color7Intense]
|
||||||
|
Color={{base07-rgb-r}},{{base07-rgb-g}},{{base07-rgb-b}}
|
||||||
|
|
||||||
|
[Foreground]
|
||||||
|
Color={{base05-rgb-r}},{{base05-rgb-g}},{{base05-rgb-b}}
|
||||||
|
|
||||||
|
[ForegroundIntense]
|
||||||
|
Color={{base07-rgb-r}},{{base07-rgb-g}},{{base07-rgb-b}}
|
||||||
|
|
||||||
|
[General]
|
||||||
|
Description=Base16 {{scheme-name}}
|
||||||
|
Opacity=1
|
||||||
|
Wallpaper=
|
165
modules/home/theme/stylix.nix
Normal file
165
modules/home/theme/stylix.nix
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
osConfig,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
cfg = config.theme.stylix;
|
||||||
|
c = config.lib.stylix.colors.withHashtag;
|
||||||
|
f = config.stylix.fonts;
|
||||||
|
in {
|
||||||
|
options.theme.stylix = {
|
||||||
|
enable = lib.mkEnableOption "Enable Stylix" // {default = osConfig.stylix.enable;};
|
||||||
|
};
|
||||||
|
|
||||||
|
config =
|
||||||
|
lib.mkIf cfg.enable
|
||||||
|
(lib.mkMerge [
|
||||||
|
(lib.mkIf (config.variables.defaultTerminal == "konsole") {
|
||||||
|
programs.konsole = {
|
||||||
|
defaultProfile = "DefaultThemed";
|
||||||
|
profiles.DefaultThemed = {
|
||||||
|
name = "DefaultThemed";
|
||||||
|
colorScheme = "Stylix";
|
||||||
|
font = {
|
||||||
|
name = "${config.stylix.fonts.monospace.name}";
|
||||||
|
size = config.stylix.fonts.sizes.terminal;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
xdg = {
|
||||||
|
dataFile = {
|
||||||
|
"konsole/Stylix.colorscheme".source = config.lib.stylix.colors {
|
||||||
|
template = builtins.readFile ./konsole.mustache;
|
||||||
|
extension = ".colorscheme";
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
"yakuake/skins/Dracula".source = fetchGit {
|
||||||
|
url = "https://github.com/dracula/yakuake";
|
||||||
|
rev = "591a705898763167dd5aca2289d170f91a85aa56";
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
};
|
||||||
|
};
|
||||||
|
})
|
||||||
|
{
|
||||||
|
nukeFiles = ["${config.home.homeDirectory}/.config/gtk-2.0/gtkrc" "${config.home.homeDirectory}/.config/gtk-3.0/gtk.css" "${config.home.homeDirectory}/.config/gtk-4.0/gtk.css" "${config.home.homeDirectory}/.gtkrc-2.0"];
|
||||||
|
|
||||||
|
gtk = lib.mkIf (config.stylix.polarity == "dark") {
|
||||||
|
enable = true;
|
||||||
|
theme.name = lib.mkForce "adw-gtk3-dark";
|
||||||
|
gtk3.extraConfig = {gtk-application-prefer-dark-theme = true;};
|
||||||
|
gtk4.extraConfig = {gtk-application-prefer-dark-theme = true;};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs = {
|
||||||
|
rio.settings = {
|
||||||
|
window.opacity = config.stylix.opacity.terminal;
|
||||||
|
fonts = {
|
||||||
|
size = f.sizes.terminal + 3; # Make it larger because fonts are really tiny using default stylix font size
|
||||||
|
family = "${f.monospace.name}";
|
||||||
|
emoji = {
|
||||||
|
family = "${f.emoji.name}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
plasma = {
|
||||||
|
overrideConfig = true;
|
||||||
|
workspace.cursor = {
|
||||||
|
theme = "${config.stylix.cursor.name}";
|
||||||
|
inherit (config.stylix.cursor) size;
|
||||||
|
};
|
||||||
|
fonts = let
|
||||||
|
general = {
|
||||||
|
family = "${f.sansSerif.name}";
|
||||||
|
pointSize = f.sizes.applications;
|
||||||
|
};
|
||||||
|
small = {
|
||||||
|
inherit (general) family;
|
||||||
|
pointSize = f.sizes.desktop;
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
inherit general small;
|
||||||
|
fixedWidth = {
|
||||||
|
family = "${f.monospace.name}";
|
||||||
|
pointSize = f.sizes.terminal;
|
||||||
|
};
|
||||||
|
toolbar = small;
|
||||||
|
menu = small;
|
||||||
|
windowTitle = small;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
zsh.syntaxHighlighting.styles = {
|
||||||
|
## General
|
||||||
|
### Diffs
|
||||||
|
### Markup
|
||||||
|
## Classes
|
||||||
|
# Comments
|
||||||
|
comment = "fg=${c.base04}";
|
||||||
|
## Constants
|
||||||
|
## Entitites
|
||||||
|
## Functions/methods
|
||||||
|
alias = "fg=${c.base0B}";
|
||||||
|
suffix-alias = "fg=${c.base0B}";
|
||||||
|
global-alias = "fg=${c.base0B}";
|
||||||
|
function = "fg=${c.base0B}";
|
||||||
|
command = "fg=${c.base0B}";
|
||||||
|
precommand = "fg=${c.base0B},italic";
|
||||||
|
autodirectory = "fg=${c.base09},italic";
|
||||||
|
single-hyphen-option = "fg=${c.base09}";
|
||||||
|
double-hyphen-option = "fg=${c.base09}";
|
||||||
|
back-quoted-argument = "fg=${c.base0E}";
|
||||||
|
## Keywords
|
||||||
|
## Built ins
|
||||||
|
builtin = "fg=${c.base0B}";
|
||||||
|
reserved-word = "fg=${c.base0B}";
|
||||||
|
hashed-command = "fg=${c.base0B}";
|
||||||
|
## Punctuation
|
||||||
|
commandseparator = "fg=${c.base08}";
|
||||||
|
command-substitution-delimiter = "fg=${c.base05}";
|
||||||
|
command-substitution-delimiter-unquoted = "fg=${c.base05}";
|
||||||
|
process-substitution-delimiter = "fg=${c.base05}";
|
||||||
|
back-quoted-argument-delimiter = "fg=${c.base08}";
|
||||||
|
back-double-quoted-argument = "fg=${c.base08}";
|
||||||
|
back-dollar-quoted-argument = "fg=${c.base08}";
|
||||||
|
## Serializable / Configuration Languages
|
||||||
|
## Storage
|
||||||
|
## Strings
|
||||||
|
command-substitution-quoted = "fg=${c.base0A}";
|
||||||
|
command-substitution-delimiter-quoted = "fg=${c.base0A}";
|
||||||
|
single-quoted-argument = "fg=${c.base0A}";
|
||||||
|
single-quoted-argument-unclosed = "fg=${c.base08},bold";
|
||||||
|
double-quoted-argument = "fg=${c.base0A}";
|
||||||
|
double-quoted-argument-unclosed = "fg=${c.base08},bold";
|
||||||
|
rc-quote = "fg=${c.base0A}";
|
||||||
|
## Variables
|
||||||
|
dollar-quoted-argument = "fg=${c.base05}";
|
||||||
|
dollar-quoted-argument-unclosed = "fg=${c.base08},bold";
|
||||||
|
dollar-double-quoted-argument = "fg=${c.base05}";
|
||||||
|
assign = "fg=${c.base05}";
|
||||||
|
named-fd = "fg=${c.base05}";
|
||||||
|
numeric-fd = "fg=${c.base05}";
|
||||||
|
## No category relevant in spec
|
||||||
|
unknown-token = "fg=${c.base08},bold";
|
||||||
|
path = "fg=${c.base05}";
|
||||||
|
path_pathseparator = "fg=${c.base08}";
|
||||||
|
path_prefix = "fg=${c.base05}";
|
||||||
|
path_prefix_pathseparator = "fg=${c.base08}";
|
||||||
|
globbing = "fg=${c.base05}";
|
||||||
|
history-expansion = "fg=${c.base0E}";
|
||||||
|
#command-substitution ="fg=?";
|
||||||
|
#command-substitution-unquoted ="fg=?";
|
||||||
|
#process-substitution ="fg=?";
|
||||||
|
#arithmetic-expansion ="fg=?";
|
||||||
|
back-quoted-argument-unclosed = "fg=${c.base08},bold";
|
||||||
|
redirection = "fg=${c.base05}";
|
||||||
|
arg0 = "fg=${c.base05}";
|
||||||
|
default = "fg=${c.base05}";
|
||||||
|
cursor = "fg=${c.base05}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
}
|
36
modules/home/virtualization/virtualization.nix
Executable file
36
modules/home/virtualization/virtualization.nix
Executable file
@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
lib.utilMods.mkModule config "virtualization" {
|
||||||
|
# Enable dconf (System Management Tool)
|
||||||
|
#programs.dconf.enable = true;
|
||||||
|
|
||||||
|
# Install necessary packages
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
virt-manager
|
||||||
|
virt-viewer
|
||||||
|
#spice
|
||||||
|
#spice-gtk
|
||||||
|
#spice-protocol
|
||||||
|
win-virtio
|
||||||
|
win-spice
|
||||||
|
guestfs-tools
|
||||||
|
libguestfs
|
||||||
|
];
|
||||||
|
|
||||||
|
# Manage the virutalisation services
|
||||||
|
virtualisation.spiceUSBRedirection.enable = true;
|
||||||
|
virtualisation.libvirtd = {
|
||||||
|
enable = true;
|
||||||
|
qemu.swtpm.enable = true;
|
||||||
|
qemu.ovmf = {
|
||||||
|
enable = true;
|
||||||
|
packages = with pkgs; [OVMFFull.fd];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.spice-vdagentd.enable = true;
|
||||||
|
}
|
10
modules/home/virtualization/waydroid.nix
Normal file
10
modules/home/virtualization/waydroid.nix
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
lib.utilMods.mkModule config "waydroid" {
|
||||||
|
virtualisation.waydroid.enable = true;
|
||||||
|
environment.systemPackages = with pkgs; [nur.repos.ataraxiasjel.waydroid-script];
|
||||||
|
}
|
0
profiles/default.nix
Normal file
0
profiles/default.nix
Normal file
22
profiles/home/default.nix
Normal file
22
profiles/home/default.nix
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./comms
|
||||||
|
./development
|
||||||
|
./firefox
|
||||||
|
./media
|
||||||
|
./terminal
|
||||||
|
./theme
|
||||||
|
./virtualization
|
||||||
|
./defaults.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
options.modules.home = {
|
||||||
|
profile = lib.mkOption {
|
||||||
|
type = lib.types.enum [ "minimal" "desktop" "gaming" "development" ];
|
||||||
|
default = "minimal";
|
||||||
|
description = "The home configuration profile to use";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
22
profiles/home/desktop.nix
Normal file
22
profiles/home/desktop.nix
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./minimal.nix
|
||||||
|
../../modules/home/firefox
|
||||||
|
../../modules/home/theme
|
||||||
|
../../modules/home/terminal
|
||||||
|
];
|
||||||
|
|
||||||
|
modules = {
|
||||||
|
firefox.enable = true;
|
||||||
|
theme = {
|
||||||
|
enable = true;
|
||||||
|
stylix.enable = config.stylix.enable;
|
||||||
|
};
|
||||||
|
terminal = {
|
||||||
|
kitty.enable = config.variables.defaultTerminal == "kitty";
|
||||||
|
konsole.enable = config.variables.defaultTerminal == "konsole";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
23
profiles/home/development.nix
Normal file
23
profiles/home/development.nix
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./desktop.nix
|
||||||
|
../../modules/home/development
|
||||||
|
];
|
||||||
|
|
||||||
|
modules = {
|
||||||
|
development = {
|
||||||
|
enable = true;
|
||||||
|
languages = {
|
||||||
|
python.enable = true;
|
||||||
|
rust.enable = true;
|
||||||
|
nix.enable = true;
|
||||||
|
};
|
||||||
|
tools = {
|
||||||
|
git.enable = true;
|
||||||
|
direnv.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
17
profiles/home/gaming.nix
Normal file
17
profiles/home/gaming.nix
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./desktop.nix
|
||||||
|
../../modules/home/media/gaming.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
modules = {
|
||||||
|
gaming = {
|
||||||
|
enable = true;
|
||||||
|
steam.enable = true;
|
||||||
|
minecraft.enable = false; # Enable as needed
|
||||||
|
vr.enable = false; # Enable as needed
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
11
profiles/home/minimal.nix
Normal file
11
profiles/home/minimal.nix
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
../../modules/home/terminal/shell-basics.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
modules = {
|
||||||
|
terminal.basics.enable = true;
|
||||||
|
};
|
||||||
|
}
|
9
profiles/minimal.nix
Normal file
9
profiles/minimal.nix
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
../../modules/core/nix.nix
|
||||||
|
../../modules/core/user.nix
|
||||||
|
../../modules/core/security/hardening.nix
|
||||||
|
];
|
||||||
|
}
|
18
profiles/server.nix
Normal file
18
profiles/server.nix
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./minimal.nix
|
||||||
|
../../modules/core/security/ssh.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
modules = {
|
||||||
|
security = {
|
||||||
|
ssh.enable = true;
|
||||||
|
hardening = {
|
||||||
|
enable = true;
|
||||||
|
server = true; # Enable additional server hardening
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
18
profiles/workstation.nix
Normal file
18
profiles/workstation.nix
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./minimal.nix
|
||||||
|
../../modules/core/desktop.nix
|
||||||
|
../../modules/core/security/gpg.nix
|
||||||
|
../../modules/core/security/ssh.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
modules = {
|
||||||
|
desktop.enable = true;
|
||||||
|
security = {
|
||||||
|
gpg.enable = true;
|
||||||
|
ssh.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
7519
repo_overview.txt
Normal file
7519
repo_overview.txt
Normal file
File diff suppressed because it is too large
Load Diff
34
secrets/default.nix
Normal file
34
secrets/default.nix
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
{ config, pkgs, lib, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./users
|
||||||
|
];
|
||||||
|
|
||||||
|
options = {
|
||||||
|
variables.secrets = {
|
||||||
|
identityPaths = lib.mkOption {
|
||||||
|
type = lib.types.listOf lib.types.path;
|
||||||
|
default = [ ];
|
||||||
|
description = "List of paths to age identities for secret decryption";
|
||||||
|
};
|
||||||
|
|
||||||
|
userKeys = lib.mkOption {
|
||||||
|
type = lib.types.attrsOf (lib.types.listOf lib.types.str);
|
||||||
|
default = {
|
||||||
|
jeirmeister = [
|
||||||
|
"0x33A40DF62D35C4A7" # Your GPG key ID
|
||||||
|
];
|
||||||
|
};
|
||||||
|
description = "User GPG keys for secret encryption";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
age = {
|
||||||
|
identityPaths = config.variables.secrets.identityPaths;
|
||||||
|
secrets = import ./secrets.nix { inherit config pkgs lib; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
36
secrets/secrets.nix
Normal file
36
secrets/secrets.nix
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
{ config, lib, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (lib) filterAttrs mapAttrs;
|
||||||
|
|
||||||
|
# Reusable keys definitions
|
||||||
|
users = {
|
||||||
|
jeirmeister = [
|
||||||
|
"0x33A40DF62D35C4A7" # GPG key
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
systems = {
|
||||||
|
steamnix = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJuZYkDQGN6k+uxu3npJ/PN5hwVU9c4HPU5kJCVVitGt root@steamnix";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Helper functions
|
||||||
|
allUsers = lib.flatten (builtins.attrValues users);
|
||||||
|
allSystems = builtins.attrValues systems;
|
||||||
|
|
||||||
|
# Common recipient sets
|
||||||
|
commonRecipients = allUsers ++ allSystems;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
# User passwords
|
||||||
|
"jeirmeister/passwd".publicKeys = users.jeirmeister ++ allSystems;
|
||||||
|
|
||||||
|
# SSH keys
|
||||||
|
"jeirmeister/ssh/id_ed25519".publicKeys = users.jeirmeister ++ [ systems.steamnix ];
|
||||||
|
|
||||||
|
# GPG keys
|
||||||
|
"jeirmeister/gpg/private".publicKeys = users.jeirmeister ++ [ systems.steamnix ];
|
||||||
|
|
||||||
|
# Application secrets
|
||||||
|
"jeirmeister/borg".publicKeys = users.jeirmeister;
|
||||||
|
}
|
7
secrets/users/default.nix
Normal file
7
secrets/users/default.nix
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{ config, lib, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./jeirmeister.nix
|
||||||
|
];
|
||||||
|
}
|
31
secrets/users/jeirmeister.nix
Normal file
31
secrets/users/jeirmeister.nix
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
{ config, lib, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
secrets = config.age.secrets;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
age.secrets = {
|
||||||
|
# SSH keys
|
||||||
|
"jeirmeister/ssh/id_ed25519" = {
|
||||||
|
file = ../encrypted/jeirmeister/ssh/id_ed25519.age;
|
||||||
|
owner = "jeirmeister";
|
||||||
|
group = "users";
|
||||||
|
mode = "0600";
|
||||||
|
};
|
||||||
|
|
||||||
|
# GPG keys
|
||||||
|
"jeirmeister/gpg/private" = {
|
||||||
|
file = ../encrypted/jeirmeister/gpg/private.age;
|
||||||
|
owner = "jeirmeister";
|
||||||
|
group = "users";
|
||||||
|
mode = "0600";
|
||||||
|
};
|
||||||
|
|
||||||
|
# System passwords
|
||||||
|
"jeirmeister/passwd" = {
|
||||||
|
file = ../encrypted/jeirmeister/passwd.age;
|
||||||
|
mode = "0440";
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
BIN
secrets/users/jeirmeister/_keys/_gpg/_private.key
Normal file
BIN
secrets/users/jeirmeister/_keys/_gpg/_private.key
Normal file
Binary file not shown.
BIN
secrets/users/jeirmeister/_keys/_gpg/_public.key
Normal file
BIN
secrets/users/jeirmeister/_keys/_gpg/_public.key
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user