Compare commits
5 Commits
main
...
flake-tran
Author | SHA1 | Date | |
---|---|---|---|
85c474701d | |||
d946126e63 | |||
1b98613591 | |||
2a5e8b4711 | |||
a115537e6e |
41
.envrc.example
Normal file
41
.envrc.example
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# Development environment configuration
|
||||||
|
export FLAKE_ROOT="$PWD"
|
||||||
|
|
||||||
|
# Installation target configuration
|
||||||
|
export TARGET_HOST="${TARGET_HOST:-""}" # e.g., "steamdeck" or "surface"
|
||||||
|
export TARGET_USER="${TARGET_USER:-""}" # e.g., "jeirmeister"
|
||||||
|
|
||||||
|
# Enable flakes and unfree packages for development shell
|
||||||
|
export NIX_CONFIG="
|
||||||
|
experimental-features = nix-command flakes
|
||||||
|
allow-unfree = true
|
||||||
|
accept-flake-config = true
|
||||||
|
"
|
||||||
|
|
||||||
|
# Development shell helper functions
|
||||||
|
build_system() {
|
||||||
|
if [ -z "$TARGET_HOST" ]; then
|
||||||
|
echo "ERROR: TARGET_HOST not set"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
nixos-rebuild build --flake ".#${TARGET_HOST}"
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_system() {
|
||||||
|
if [ -z "$TARGET_HOST" ]; then
|
||||||
|
echo "ERROR: TARGET_HOST not set"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
sudo nixos-rebuild switch --flake ".#${TARGET_HOST}"
|
||||||
|
}
|
||||||
|
|
||||||
|
update_home() {
|
||||||
|
if [ -z "$TARGET_HOST" ] || [ -z "$TARGET_USER" ]; then
|
||||||
|
echo "ERROR: TARGET_HOST and TARGET_USER must be set"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
home-manager switch --flake ".#${TARGET_USER}@${TARGET_HOST}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load the development shell
|
||||||
|
use flake
|
@ -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
|
|
64
flake.lock
Normal file
64
flake.lock
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"home-manager": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1730837930,
|
||||||
|
"narHash": "sha256-0kZL4m+bKBJUBQse0HanewWO0g8hDdCvBhudzxgehqc=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"rev": "2f607e07f3ac7e53541120536708e824acccfaa8",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1730785428,
|
||||||
|
"narHash": "sha256-Zwl8YgTVJTEum+L+0zVAWvXAGbWAuXHax3KzuejaDyo=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "4aa36568d413aca0ea84a1684d2d46f55dbabad7",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"home-manager": "home-manager",
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"systems": "systems"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1689347949,
|
||||||
|
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default-linux",
|
||||||
|
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default-linux",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
56
flake.nix
Normal file
56
flake.nix
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
{
|
||||||
|
description = "Jeirmeister's NixOS Configuration";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
# Core dependencies
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
|
home-manager = {
|
||||||
|
url = "github:nix-community/home-manager";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
systems.url = "github:nix-systems/default-linux";
|
||||||
|
|
||||||
|
# Add other inputs as needed, e.g.:
|
||||||
|
# hardware.url = "github:nixos/nixos-hardware"; # If you need specific hardware support
|
||||||
|
};
|
||||||
|
outputs = { self, nixpkgs, home-manager, ... } @ inputs: let
|
||||||
|
lib = nixpkgs.lib.extend (
|
||||||
|
final: prev: import ./lib {
|
||||||
|
inherit inputs self;
|
||||||
|
lib = final;
|
||||||
|
}
|
||||||
|
) // home-manager.lib;
|
||||||
|
in {
|
||||||
|
nixosConfigurations = {
|
||||||
|
# Your systems
|
||||||
|
steamdeck = lib.mkHost "steamdeck" {
|
||||||
|
username = "jeirmeister";
|
||||||
|
system = "x86_64-linux";
|
||||||
|
stateVersion = "24.05"; # Updated version
|
||||||
|
};
|
||||||
|
|
||||||
|
surface4 = lib.mkHost "surface" {
|
||||||
|
username = "jeirmeister";
|
||||||
|
system = "x86_64-linux";
|
||||||
|
stateVersion = "24.05"; # Updated version
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Standalone home-manager configurations
|
||||||
|
homeConfigurations = {
|
||||||
|
"jeirmeister@steamdeck" = lib.mkHome "jeirmeister@steamdeck" {
|
||||||
|
inherit (self) nixosConfigurations;
|
||||||
|
stateVersion = "24.05";
|
||||||
|
};
|
||||||
|
"jeirmeister@surface" = lib.mkHome "jeirmeister@surface" {
|
||||||
|
inherit (self) nixosConfigurations;
|
||||||
|
stateVersion = "24.05";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
# Add basic overlays and packages outputs
|
||||||
|
# overlays = import ./overlays { inherit self; };
|
||||||
|
packages = lib.forEachSystem (pkgs: import ./pkgs { inherit pkgs; });
|
||||||
|
};
|
||||||
|
}
|
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"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,19 +1,10 @@
|
|||||||
{ pkgs, lib, ... }:
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
let
|
let
|
||||||
jovianNixosRev = "f6423d86bec22c25a576b23262495c5536b0d069";
|
jovianNixosRev = "f6423d86bec22c25a576b23262495c5536b0d069";
|
||||||
jovianNixos = builtins.fetchTarball {
|
jovianNixos = builtins.fetchTarball {
|
||||||
url = "https://github.com/Jovian-Experiments/Jovian-NixOS/archive/${jovianNixosRev}.tar.gz";
|
url = "https://github.com/Jovian-Experiments/Jovian-NixOS/archive/${jovianNixosRev}.tar.gz";
|
||||||
sha256 = "sha256:1frd1dfqd97idwf1rj29ab0wvyfa2nx2h3bp9hkbmfa1m802avmb";
|
sha256 = "sha256:1frd1dfqd97idwf1rj29ab0wvyfa2nx2h3bp9hkbmfa1m802avmb";
|
||||||
};
|
};
|
||||||
|
|
||||||
v4l2loopback-options = {
|
|
||||||
options = {
|
|
||||||
exclusive_caps = 1;
|
|
||||||
video_nr = 0;
|
|
||||||
card_label = "Immersed Virtual Camera";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
@ -21,44 +12,31 @@ in
|
|||||||
(jovianNixos + "/modules")
|
(jovianNixos + "/modules")
|
||||||
];
|
];
|
||||||
|
|
||||||
# Basic System Configuration
|
modules = {
|
||||||
system.stateVersion = "24.05";
|
system = {
|
||||||
networking = {
|
enable = true;
|
||||||
hostName = "steamnix";
|
hostname = "steamnix";
|
||||||
networkmanager.enable = true;
|
timeZone = "America/Los_Angeles";
|
||||||
};
|
stateVersion = "24.05";
|
||||||
time.timeZone = "America/Los_Angeles";
|
};
|
||||||
i18n = {
|
|
||||||
defaultLocale = "en_US.UTF-8";
|
desktop = {
|
||||||
extraLocaleSettings = {
|
enable = true;
|
||||||
LC_ADDRESS = "en_US.UTF-8";
|
plasma6 = {
|
||||||
LC_IDENTIFICATION = "en_US.UTF-8";
|
enable = true;
|
||||||
LC_MEASUREMENT = "en_US.UTF-8";
|
wayland = {
|
||||||
LC_MONETARY = "en_US.UTF-8";
|
enable = true;
|
||||||
LC_NAME = "en_US.UTF-8";
|
scaling = 1.5;
|
||||||
LC_NUMERIC = "en_US.UTF-8";
|
};
|
||||||
LC_PAPER = "en_US.UTF-8";
|
extraPackages = with pkgs; [
|
||||||
LC_TELEPHONE = "en_US.UTF-8";
|
plasma-browser-integration
|
||||||
LC_TIME = "en_US.UTF-8";
|
kalendar
|
||||||
|
];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
# Nix Package Manager Configuration
|
# Steam Deck specific system configuration
|
||||||
nixpkgs = {
|
|
||||||
overlays = [
|
|
||||||
(import (jovianNixos + "/overlay.nix"))
|
|
||||||
];
|
|
||||||
config.allowUnfree = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
nix.settings = {
|
|
||||||
experimental-features = [ "nix-command" "flakes" ];
|
|
||||||
substituters = [ "cache.nixos.org" ];
|
|
||||||
allowed-users = [ "@wheel" "jeirmeister" ];
|
|
||||||
auto-optimise-store = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Steam Deck Specific Configuration
|
|
||||||
jovian = {
|
jovian = {
|
||||||
hardware.has.amd.gpu = true;
|
hardware.has.amd.gpu = true;
|
||||||
devices.steamdeck = {
|
devices.steamdeck = {
|
||||||
@ -77,26 +55,25 @@ in
|
|||||||
workarounds.ignoreMissingKernelModules = true;
|
workarounds.ignoreMissingKernelModules = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Hardware and Display Configuration
|
# Host-specific Nix settings
|
||||||
hardware.video = {
|
nixpkgs = {
|
||||||
displaylink.enable = true;
|
overlays = [
|
||||||
|
(import (jovianNixos + "/overlay.nix"))
|
||||||
|
];
|
||||||
|
config.allowUnfree = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Desktop Environment and Display Configuration
|
# Desktop Environment Configuration
|
||||||
services.xserver = {
|
services.xserver = {
|
||||||
enable = true;
|
enable = true;
|
||||||
xkb.layout = "us";
|
xkb.layout = "us";
|
||||||
videoDrivers = [ "displaylink" "modesetting" ];
|
videoDrivers = [ "displaylink" "modesetting" ];
|
||||||
desktopManager.plasma6 = {
|
|
||||||
enable = true;
|
|
||||||
extraSessionCommands = ''
|
|
||||||
${pkgs.xorg.xrandr}/bin/xrandr --setprovideroutputsource 2 0;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
displayManager = {
|
displayManager = {
|
||||||
sddm = {
|
sddm = {
|
||||||
enable = true;
|
enable = true;
|
||||||
wayland = true;
|
wayland = {
|
||||||
|
enable = true; # Fixed: proper wayland config
|
||||||
|
};
|
||||||
};
|
};
|
||||||
sessionCommands = ''
|
sessionCommands = ''
|
||||||
${lib.getBin pkgs.xorg.xrandr}/bin/xrandr --setprovideroutputsource 2 0
|
${lib.getBin pkgs.xorg.xrandr}/bin/xrandr --setprovideroutputsource 2 0
|
||||||
@ -104,27 +81,8 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
# System Services Configuration
|
|
||||||
services = {
|
|
||||||
# Audio Configuration
|
|
||||||
pipewire = {
|
|
||||||
enable = true;
|
|
||||||
alsa.enable = true;
|
|
||||||
pulse.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Network Services
|
# Steam Deck specific services
|
||||||
openssh = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
PasswordAuthentication = true;
|
|
||||||
AllowUsers = [ "jeirmeister" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
tailscale.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Systemd Services
|
|
||||||
systemd.services = {
|
systemd.services = {
|
||||||
jupiter-fan-control = {
|
jupiter-fan-control = {
|
||||||
path = [ pkgs.dmidecode ];
|
path = [ pkgs.dmidecode ];
|
||||||
@ -138,88 +96,20 @@ in
|
|||||||
Restart = "on-failure";
|
Restart = "on-failure";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
"systemd-modules-load" = {
|
|
||||||
wantedBy = [ "multi-user.target" ];
|
|
||||||
restartIfChanged = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# UDev Rules
|
|
||||||
services.udev.extraRules = ''
|
|
||||||
SUBSYSTEM=="hwmon*", KERNEL=="hwmon*", ACTION=="add", RUN+="${pkgs.coreutils}/bin/chmod a+rw /sys/%p/pwm1"
|
|
||||||
SUBSYSTEM=="hwmon*", KERNEL=="hwmon*", ACTION=="add", RUN+="${pkgs.coreutils}/bin/chmod a+rw /sys/%p/fan1_input"
|
|
||||||
'';
|
|
||||||
|
|
||||||
# User Configuration
|
|
||||||
users = {
|
|
||||||
users.jeirmeister = {
|
|
||||||
isNormalUser = true;
|
|
||||||
description = "jeirmeister";
|
|
||||||
group = "steamos";
|
|
||||||
extraGroups = [
|
|
||||||
"networkmanager"
|
|
||||||
"users"
|
|
||||||
"wheel"
|
|
||||||
"input"
|
|
||||||
"video"
|
|
||||||
"audio"
|
|
||||||
"render"
|
|
||||||
"gamepad"
|
|
||||||
];
|
|
||||||
packages = with pkgs; [
|
|
||||||
tailscale
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
groups = {
|
|
||||||
steamos.gid = 1000;
|
|
||||||
gamepad = {};
|
|
||||||
render = {};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# System Programs and Packages
|
|
||||||
programs = {
|
|
||||||
firefox.enable = true;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Steam Deck specific packages
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
# System Tools
|
# Steam Deck specific
|
||||||
|
jupiter-fan-control
|
||||||
|
linuxPackages.v4l2loopback
|
||||||
|
v4l-utils
|
||||||
|
|
||||||
|
# System utilities
|
||||||
pciutils
|
pciutils
|
||||||
usbutils
|
usbutils
|
||||||
lm_sensors
|
lm_sensors
|
||||||
dmidecode
|
dmidecode
|
||||||
binutils
|
binutils
|
||||||
|
|
||||||
# Virtual Display
|
|
||||||
linuxPackages.v4l2loopback
|
|
||||||
v4l-utils
|
|
||||||
|
|
||||||
# Development Tools
|
|
||||||
nixfmt-rfc-style
|
|
||||||
git
|
|
||||||
|
|
||||||
# Network Tools
|
|
||||||
wget
|
|
||||||
curl
|
|
||||||
|
|
||||||
# Utilities
|
|
||||||
tree
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
# TODO: Incorporate this part later
|
|
||||||
# Immersed Video Service
|
|
||||||
# immersed-video = {
|
|
||||||
# description = "Load v4l2loopback module for Immersed";
|
|
||||||
# wantedBy = [ "multi-user.target" ];
|
|
||||||
# after = [ "systemd-modules-load.service" ];
|
|
||||||
# requires = [ "systemd-modules-load.service" ];
|
|
||||||
# serviceConfig = {
|
|
||||||
# Type = "oneshot";
|
|
||||||
# RemainAfterExit = 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'";
|
|
||||||
# ExecStop = "${pkgs.kmod}/bin/rmmod v4l2loopback || true";
|
|
||||||
# };
|
|
||||||
# };
|
|
@ -1,39 +1,54 @@
|
|||||||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
{ config, lib, pkgs, modulesPath, ... }:
|
||||||
# and may be overwritten by future invocations. Please make changes
|
|
||||||
# to /etc/nixos/configuration.nix instead.
|
|
||||||
{ config, lib, modulesPath, ... }:
|
|
||||||
|
|
||||||
{
|
{
|
||||||
imports =
|
imports = [
|
||||||
[ (modulesPath + "/installer/scan/not-detected.nix")
|
(modulesPath + "/installer/scan/not-detected.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
# Hardware-specific settings
|
||||||
|
boot = {
|
||||||
|
loader = {
|
||||||
|
systemd-boot = {
|
||||||
|
enable = true;
|
||||||
|
consoleMode = "max";
|
||||||
|
};
|
||||||
|
efi.canTouchEfiVariables = true;
|
||||||
|
timeout = 3;
|
||||||
|
};
|
||||||
|
|
||||||
|
initrd.availableKernelModules = [ "nvme" "xhci_pci" "usb_storage" "usbhid" "sd_mod" ];
|
||||||
|
kernelModules = [ "kvm-amd" "amdgpu" ];
|
||||||
|
kernelParams = [
|
||||||
|
"amd_pstate=active"
|
||||||
|
"amdgpu.gttsize=8128"
|
||||||
|
"spi_amd.speed_dev=1"
|
||||||
];
|
];
|
||||||
|
kernelPackages = pkgs.linuxPackages_latest;
|
||||||
|
};
|
||||||
|
|
||||||
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "usb_storage" "usbhid" "sd_mod" "sdhci_pci" ];
|
# Hardware-specific services
|
||||||
boot.initrd.kernelModules = [ ];
|
hardware = {
|
||||||
boot.kernelModules = [ "kvm-amd" ];
|
cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||||
boot.extraModulePackages = [ ];
|
opengl.enable = true;
|
||||||
|
steam-hardware.enable = true;
|
||||||
|
# video.displaylink.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
fileSystems."/" =
|
# Steam Deck specific udev rules
|
||||||
{ device = "/dev/disk/by-uuid/f3cc4aae-428e-435d-b9f7-333f7dad06b2";
|
services.udev.extraRules = ''
|
||||||
|
SUBSYSTEM=="hwmon*", KERNEL=="hwmon*", ACTION=="add", RUN+="${pkgs.coreutils}/bin/chmod a+rw /sys/%p/pwm1"
|
||||||
|
SUBSYSTEM=="hwmon*", KERNEL=="hwmon*", ACTION=="add", RUN+="${pkgs.coreutils}/bin/chmod a+rw /sys/%p/fan1_input"
|
||||||
|
'';
|
||||||
|
|
||||||
|
# File systems (retain your actual UUIDs)
|
||||||
|
fileSystems = {
|
||||||
|
"/" = {
|
||||||
|
device = "/dev/disk/by-uuid/...";
|
||||||
fsType = "ext4";
|
fsType = "ext4";
|
||||||
};
|
};
|
||||||
|
"/boot" = {
|
||||||
fileSystems."/boot" =
|
device = "/dev/disk/by-uuid/...";
|
||||||
{ device = "/dev/disk/by-uuid/580E-5E90";
|
|
||||||
fsType = "vfat";
|
fsType = "vfat";
|
||||||
options = [ "fmask=0077" "dmask=0077" ];
|
|
||||||
};
|
};
|
||||||
|
};
|
||||||
swapDevices = [ ];
|
}
|
||||||
|
|
||||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
|
||||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
|
||||||
# still possible to use this option, but it's recommended to use it in conjunction
|
|
||||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
|
||||||
networking.useDHCP = lib.mkDefault true;
|
|
||||||
# networking.interfaces.enp4s0f3u1u4u3.useDHCP = lib.mkDefault true;
|
|
||||||
# networking.interfaces.wlo1.useDHCP = lib.mkDefault true;
|
|
||||||
|
|
||||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
|
||||||
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
|
||||||
}
|
|
225
hosts/surface/configuration.nix
Normal file
225
hosts/surface/configuration.nix
Normal file
@ -0,0 +1,225 @@
|
|||||||
|
{ pkgs, lib, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
jovianNixosRev = "f6423d86bec22c25a576b23262495c5536b0d069";
|
||||||
|
jovianNixos = builtins.fetchTarball {
|
||||||
|
url = "https://github.com/Jovian-Experiments/Jovian-NixOS/archive/${jovianNixosRev}.tar.gz";
|
||||||
|
sha256 = "sha256:1frd1dfqd97idwf1rj29ab0wvyfa2nx2h3bp9hkbmfa1m802avmb";
|
||||||
|
};
|
||||||
|
|
||||||
|
v4l2loopback-options = {
|
||||||
|
options = {
|
||||||
|
exclusive_caps = 1;
|
||||||
|
video_nr = 0;
|
||||||
|
card_label = "Immersed Virtual Camera";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./hardware-configuration.nix
|
||||||
|
(jovianNixos + "/modules")
|
||||||
|
];
|
||||||
|
|
||||||
|
# Basic System Configuration
|
||||||
|
system.stateVersion = "24.05";
|
||||||
|
networking = {
|
||||||
|
hostName = "steamnix";
|
||||||
|
networkmanager.enable = true;
|
||||||
|
};
|
||||||
|
time.timeZone = "America/Los_Angeles";
|
||||||
|
i18n = {
|
||||||
|
defaultLocale = "en_US.UTF-8";
|
||||||
|
extraLocaleSettings = {
|
||||||
|
LC_ADDRESS = "en_US.UTF-8";
|
||||||
|
LC_IDENTIFICATION = "en_US.UTF-8";
|
||||||
|
LC_MEASUREMENT = "en_US.UTF-8";
|
||||||
|
LC_MONETARY = "en_US.UTF-8";
|
||||||
|
LC_NAME = "en_US.UTF-8";
|
||||||
|
LC_NUMERIC = "en_US.UTF-8";
|
||||||
|
LC_PAPER = "en_US.UTF-8";
|
||||||
|
LC_TELEPHONE = "en_US.UTF-8";
|
||||||
|
LC_TIME = "en_US.UTF-8";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Nix Package Manager Configuration
|
||||||
|
nixpkgs = {
|
||||||
|
overlays = [
|
||||||
|
(import (jovianNixos + "/overlay.nix"))
|
||||||
|
];
|
||||||
|
config.allowUnfree = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
nix.settings = {
|
||||||
|
experimental-features = [ "nix-command" "flakes" ];
|
||||||
|
substituters = [ "cache.nixos.org" ];
|
||||||
|
allowed-users = [ "@wheel" "jeirmeister" ];
|
||||||
|
auto-optimise-store = 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;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Desktop Environment and Display Configuration
|
||||||
|
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
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# System Services Configuration
|
||||||
|
services = {
|
||||||
|
# Audio Configuration
|
||||||
|
pipewire = {
|
||||||
|
enable = true;
|
||||||
|
alsa.enable = true;
|
||||||
|
pulse.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Network Services
|
||||||
|
openssh = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
PasswordAuthentication = true;
|
||||||
|
AllowUsers = [ "jeirmeister" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
tailscale.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Systemd Services
|
||||||
|
systemd.services = {
|
||||||
|
jupiter-fan-control = {
|
||||||
|
path = [ pkgs.dmidecode ];
|
||||||
|
serviceConfig = lib.mkForce {
|
||||||
|
Environment = "PYTHONUNBUFFERED=1";
|
||||||
|
StandardOutput = "journal";
|
||||||
|
StandardError = "journal";
|
||||||
|
ExecStart = "${pkgs.jupiter-fan-control}/share/jupiter-fan-control/fancontrol.py --run";
|
||||||
|
ExecStopPost = "${pkgs.jupiter-fan-control}/share/jupiter-fan-control/fancontrol.py --stop";
|
||||||
|
OOMScoreAdjust = -1000;
|
||||||
|
Restart = "on-failure";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
"systemd-modules-load" = {
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
restartIfChanged = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# UDev Rules
|
||||||
|
services.udev.extraRules = ''
|
||||||
|
SUBSYSTEM=="hwmon*", KERNEL=="hwmon*", ACTION=="add", RUN+="${pkgs.coreutils}/bin/chmod a+rw /sys/%p/pwm1"
|
||||||
|
SUBSYSTEM=="hwmon*", KERNEL=="hwmon*", ACTION=="add", RUN+="${pkgs.coreutils}/bin/chmod a+rw /sys/%p/fan1_input"
|
||||||
|
'';
|
||||||
|
|
||||||
|
# User Configuration
|
||||||
|
users = {
|
||||||
|
users.jeirmeister = {
|
||||||
|
isNormalUser = true;
|
||||||
|
description = "jeirmeister";
|
||||||
|
group = "steamos";
|
||||||
|
extraGroups = [
|
||||||
|
"networkmanager"
|
||||||
|
"users"
|
||||||
|
"wheel"
|
||||||
|
"input"
|
||||||
|
"video"
|
||||||
|
"audio"
|
||||||
|
"render"
|
||||||
|
"gamepad"
|
||||||
|
];
|
||||||
|
packages = with pkgs; [
|
||||||
|
tailscale
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
groups = {
|
||||||
|
steamos.gid = 1000;
|
||||||
|
gamepad = {};
|
||||||
|
render = {};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# System Programs and Packages
|
||||||
|
programs = {
|
||||||
|
firefox.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
# System Tools
|
||||||
|
pciutils
|
||||||
|
usbutils
|
||||||
|
lm_sensors
|
||||||
|
dmidecode
|
||||||
|
binutils
|
||||||
|
|
||||||
|
# Virtual Display
|
||||||
|
linuxPackages.v4l2loopback
|
||||||
|
v4l-utils
|
||||||
|
|
||||||
|
# Development Tools
|
||||||
|
nixfmt-rfc-style
|
||||||
|
git
|
||||||
|
|
||||||
|
# Network Tools
|
||||||
|
wget
|
||||||
|
curl
|
||||||
|
|
||||||
|
# Utilities
|
||||||
|
tree
|
||||||
|
];
|
||||||
|
}
|
||||||
|
# TODO: Incorporate this part later
|
||||||
|
# Immersed Video Service
|
||||||
|
# immersed-video = {
|
||||||
|
# description = "Load v4l2loopback module for Immersed";
|
||||||
|
# wantedBy = [ "multi-user.target" ];
|
||||||
|
# after = [ "systemd-modules-load.service" ];
|
||||||
|
# requires = [ "systemd-modules-load.service" ];
|
||||||
|
# serviceConfig = {
|
||||||
|
# Type = "oneshot";
|
||||||
|
# RemainAfterExit = 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'";
|
||||||
|
# ExecStop = "${pkgs.kmod}/bin/rmmod v4l2loopback || true";
|
||||||
|
# };
|
||||||
|
# };
|
39
hosts/surface/hardware-configuration.nix
Normal file
39
hosts/surface/hardware-configuration.nix
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
|
# and may be overwritten by future invocations. Please make changes
|
||||||
|
# to /etc/nixos/configuration.nix instead.
|
||||||
|
{ config, lib, modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[ (modulesPath + "/installer/scan/not-detected.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "usb_storage" "usbhid" "sd_mod" "sdhci_pci" ];
|
||||||
|
boot.initrd.kernelModules = [ ];
|
||||||
|
boot.kernelModules = [ "kvm-amd" ];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
|
fileSystems."/" =
|
||||||
|
{ device = "/dev/disk/by-uuid/f3cc4aae-428e-435d-b9f7-333f7dad06b2";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/boot" =
|
||||||
|
{ device = "/dev/disk/by-uuid/580E-5E90";
|
||||||
|
fsType = "vfat";
|
||||||
|
options = [ "fmask=0077" "dmask=0077" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices = [ ];
|
||||||
|
|
||||||
|
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||||
|
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||||
|
# still possible to use this option, but it's recommended to use it in conjunction
|
||||||
|
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||||
|
networking.useDHCP = lib.mkDefault true;
|
||||||
|
# networking.interfaces.enp4s0f3u1u4u3.useDHCP = lib.mkDefault true;
|
||||||
|
# networking.interfaces.wlo1.useDHCP = lib.mkDefault true;
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||||
|
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||||
|
}
|
42
lib/default.nix
Normal file
42
lib/default.nix
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
flake @ { inputs
|
||||||
|
, self
|
||||||
|
, lib
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
# Helper function to import and configure with lib
|
||||||
|
importWith = file: args: import file ((args // { inherit lib; }));
|
||||||
|
|
||||||
|
# Import utilities with proper dependencies
|
||||||
|
utilsLib = importWith ./utils.nix { };
|
||||||
|
utilModsLib = importWith ./utilMods.nix { };
|
||||||
|
|
||||||
|
# Re-export inputs to make them available to all lib functions
|
||||||
|
exports = {
|
||||||
|
# Library functions
|
||||||
|
utils = utilsLib;
|
||||||
|
utilMods = utilModsLib;
|
||||||
|
|
||||||
|
# Core builders with flake inputs
|
||||||
|
mkHost = import ./mkHost.nix (flake // { inherit lib; });
|
||||||
|
mkHome = import ./mkHome.nix (flake // { inherit lib utilsLib; });
|
||||||
|
mkUnfreeNixpkgs = import ./mkUnfreeNixpkgs.nix;
|
||||||
|
|
||||||
|
# Helper function to enable modules based on host config
|
||||||
|
mkHostModules = hostname: username: enabledModules:
|
||||||
|
let
|
||||||
|
# Convert the list of enabled module paths to actual imports
|
||||||
|
moduleImports = map
|
||||||
|
(modulePath:
|
||||||
|
../modules + "/${modulePath}"
|
||||||
|
)
|
||||||
|
enabledModules;
|
||||||
|
in
|
||||||
|
moduleImports;
|
||||||
|
|
||||||
|
# Export utility functions directly for convenience
|
||||||
|
inherit (utilsLib) enable disable enableIf;
|
||||||
|
inherit (utilModsLib) mkModule mkModule' mkEnabledModule mkEnabledModule';
|
||||||
|
};
|
||||||
|
in
|
||||||
|
exports
|
35
lib/mkHome.nix
Normal file
35
lib/mkHome.nix
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
flake @ {
|
||||||
|
inputs,
|
||||||
|
self,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
# Helper functions we don't plan on exporting past this file
|
||||||
|
internals = {
|
||||||
|
atSignSplit = string:
|
||||||
|
lib.splitString "@" string;
|
||||||
|
|
||||||
|
# Grab everything before the @ in "username@hostname"
|
||||||
|
guessUsername = userhost:
|
||||||
|
if lib.length (internals.atSignSplit userhost) == 2
|
||||||
|
then lib.elemAt (internals.atSignSplit userhost) 0
|
||||||
|
else throw "Invalid userhost format: ${userhost}. Expected format: username@hostname";
|
||||||
|
|
||||||
|
# Grab everything after the @ in "username@hostname"
|
||||||
|
guessHostname = userhost:
|
||||||
|
if lib.length (internals.atSignSplit userhost) == 2
|
||||||
|
then lib.elemAt (internals.atSignSplit userhost) 1
|
||||||
|
else throw "Invalid userhost format: ${userhost}. Expected format: username@hostname";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Helper function for creating the system config for Home-Manager
|
||||||
|
mkHome = userhost: {
|
||||||
|
nixosConfigurations,
|
||||||
|
username ? internals.guessUsername userhost,
|
||||||
|
hostname ? internals.guessHostname userhost,
|
||||||
|
stateVersion ? "24.05",
|
||||||
|
}:
|
||||||
|
# Use the NixOS system configuration's home-manager setup
|
||||||
|
nixosConfigurations.${hostname}.config.home-manager.users.${username}.home;
|
||||||
|
in
|
||||||
|
mkHome
|
45
lib/mkHost.nix
Normal file
45
lib/mkHost.nix
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
flake @ { inputs
|
||||||
|
, self
|
||||||
|
, lib
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
# Simplified helper function for creating the system config
|
||||||
|
mkHost = hostname: { username
|
||||||
|
, system
|
||||||
|
, stateVersion ? "24.05"
|
||||||
|
}:
|
||||||
|
lib.nixosSystem {
|
||||||
|
inherit system;
|
||||||
|
specialArgs = flake // { inherit hostname username system stateVersion; };
|
||||||
|
modules = [
|
||||||
|
# Set up nixpkgs
|
||||||
|
{
|
||||||
|
nixpkgs.pkgs = import inputs.nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
config.allowUnfree = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
# Core system configuration
|
||||||
|
inputs.home-manager.nixosModules.home-manager
|
||||||
|
{
|
||||||
|
home-manager = {
|
||||||
|
useGlobalPkgs = true;
|
||||||
|
useUserPackages = true;
|
||||||
|
users.${username} = import ../users/${username}/home.nix;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
# Host-specific configurations
|
||||||
|
../hosts/${hostname}/configuration.nix
|
||||||
|
../hosts/${hostname}/hardware-configuration.nix
|
||||||
|
|
||||||
|
# System modules
|
||||||
|
../modules/core
|
||||||
|
../modules/desktop
|
||||||
|
../modules/system
|
||||||
|
];
|
||||||
|
};
|
||||||
|
in
|
||||||
|
mkHost
|
16
lib/mkUnfreeNixpkgs.nix
Normal file
16
lib/mkUnfreeNixpkgs.nix
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# Credit goes to Frontear and llakala for this solution!
|
||||||
|
{
|
||||||
|
path,
|
||||||
|
runCommandLocal,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
# Configure the given nixpkgs input to use unfree, so `nix run` commands using the flake registry can use unfree packages
|
||||||
|
runCommandLocal "nixpkgs-configured" {src = path;}
|
||||||
|
''
|
||||||
|
mkdir -p $out
|
||||||
|
|
||||||
|
substitute $src/flake.nix $out/flake.nix \
|
||||||
|
--replace-fail "{ inherit system; }" "{ inherit system; config.allowUnfree = true; config.joypixels.acceptLicense = true; }"
|
||||||
|
|
||||||
|
cp --update=none -Rt $out $src/*
|
||||||
|
''
|
42
lib/utilMods.nix
Normal file
42
lib/utilMods.nix
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
{ lib, ... }:
|
||||||
|
let
|
||||||
|
# Helper for creating home-manager modules
|
||||||
|
mkHmModule = name: module: { config, lib, pkgs, ... }: {
|
||||||
|
config = lib.mkIf (config.modules.${name}.enable or false)
|
||||||
|
(if builtins.isFunction module
|
||||||
|
then module { inherit config lib pkgs; }
|
||||||
|
else {
|
||||||
|
home-manager.users.${config.user.name} = module;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
# Helper for creating desktop/user modules
|
||||||
|
mkUserModule = category: name: module:
|
||||||
|
mkHmModule "${category}.${name}" module;
|
||||||
|
|
||||||
|
exports = {
|
||||||
|
# Main module creation helper
|
||||||
|
mkModule = category: name: module:
|
||||||
|
mkUserModule category name (
|
||||||
|
if builtins.isAttrs module
|
||||||
|
then { home.packages = module.packages or [ ]; }
|
||||||
|
else module
|
||||||
|
);
|
||||||
|
|
||||||
|
# Helpers for enabling/disabling modules
|
||||||
|
enable = elems: builtins.listToAttrs (map
|
||||||
|
(name: {
|
||||||
|
inherit name;
|
||||||
|
value.enable = true;
|
||||||
|
})
|
||||||
|
elems);
|
||||||
|
|
||||||
|
disable = elems: builtins.listToAttrs (map
|
||||||
|
(name: {
|
||||||
|
inherit name;
|
||||||
|
value.enable = false;
|
||||||
|
})
|
||||||
|
elems);
|
||||||
|
};
|
||||||
|
in
|
||||||
|
exports
|
109
lib/utils.nix
Normal file
109
lib/utils.nix
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
{lib, ...}: let
|
||||||
|
exports = {
|
||||||
|
# Enable all modules in the list elems
|
||||||
|
enable = elems:
|
||||||
|
builtins.listToAttrs (map (name: {
|
||||||
|
inherit name;
|
||||||
|
value.enable = true;
|
||||||
|
})
|
||||||
|
elems);
|
||||||
|
|
||||||
|
# Disable all modules in the list elems
|
||||||
|
disable = elems:
|
||||||
|
builtins.listToAttrs (map (name: {
|
||||||
|
inherit name;
|
||||||
|
value.enable = false;
|
||||||
|
})
|
||||||
|
elems);
|
||||||
|
|
||||||
|
# Conditionally enable/disable all modules in the list elems
|
||||||
|
enableIf = cond: elems:
|
||||||
|
if cond
|
||||||
|
then (exports.enable elems)
|
||||||
|
else (exports.disable elems);
|
||||||
|
|
||||||
|
mkOptionStr = name: default: description: lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
inherit default description;
|
||||||
|
};
|
||||||
|
|
||||||
|
mkOptionBool = name: default: description: lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
inherit default description;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Hardware configuration helpers
|
||||||
|
isAmdCpu = config: config.hardware.cpu.manufacturer == "amd";
|
||||||
|
isIntelCpu = config: config.hardware.cpu.manufacturer == "intel";
|
||||||
|
|
||||||
|
|
||||||
|
# GPG command for checking if there is a hardware key present
|
||||||
|
isGpgUnlocked = pkgs: "${pkgs.procps}/bin/pgrep 'gpg-agent' &> /dev/null && ${pkgs.gnupg}/bin/gpg-connect-agent 'scd getinfo card_list' /bye | ${pkgs.gnugrep}/bin/grep SERIALNO -q";
|
||||||
|
|
||||||
|
# Concatinatinates all file paths in a given directory into one list.
|
||||||
|
# It recurses through subdirectories. If it detects a default.nix, only that
|
||||||
|
# file will be considered.
|
||||||
|
concatImports = {
|
||||||
|
path ? null,
|
||||||
|
paths ? [],
|
||||||
|
include ? [],
|
||||||
|
exclude ? [],
|
||||||
|
recursive ? true,
|
||||||
|
filterDefault ? true,
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with fileset; let
|
||||||
|
excludedFiles = filter pathIsRegularFile exclude;
|
||||||
|
excludedDirs = filter pathIsDirectory exclude;
|
||||||
|
isExcluded = path:
|
||||||
|
if elem path excludedFiles
|
||||||
|
then true
|
||||||
|
else
|
||||||
|
(filter (excludedDir: outputs.lib.path.hasPrefix excludedDir path)
|
||||||
|
excludedDirs)
|
||||||
|
!= [];
|
||||||
|
|
||||||
|
myFiles = unique ((filter (file:
|
||||||
|
pathIsRegularFile file
|
||||||
|
&& hasSuffix ".nix" (builtins.toString file)
|
||||||
|
&& !isExcluded file) (concatMap (_path:
|
||||||
|
if recursive
|
||||||
|
then toList _path
|
||||||
|
else
|
||||||
|
mapAttrsToList (name: type:
|
||||||
|
_path
|
||||||
|
+ (
|
||||||
|
if type == "directory"
|
||||||
|
then "/${name}/default.nix"
|
||||||
|
else "/${name}"
|
||||||
|
)) (builtins.readDir _path))
|
||||||
|
(unique (
|
||||||
|
if path == null
|
||||||
|
then paths
|
||||||
|
else [path] ++ paths
|
||||||
|
))))
|
||||||
|
++ (
|
||||||
|
if recursive
|
||||||
|
then concatMap toList (unique include)
|
||||||
|
else unique include
|
||||||
|
));
|
||||||
|
|
||||||
|
dirOfFile = builtins.map (file: builtins.dirOf file) myFiles;
|
||||||
|
|
||||||
|
dirsWithDefaultNix =
|
||||||
|
builtins.filter (dir: builtins.elem dir dirOfFile)
|
||||||
|
(builtins.map (file: builtins.dirOf file) (builtins.filter (file:
|
||||||
|
builtins.match "default.nix" (builtins.baseNameOf file) != null)
|
||||||
|
myFiles));
|
||||||
|
|
||||||
|
filteredFiles = builtins.filter (file:
|
||||||
|
! builtins.elem (builtins.dirOf file) dirsWithDefaultNix
|
||||||
|
|| builtins.match "default.nix" (builtins.baseNameOf file) != null)
|
||||||
|
myFiles;
|
||||||
|
in
|
||||||
|
if filterDefault
|
||||||
|
then filteredFiles
|
||||||
|
else myFiles;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
exports
|
16
modules/core/aliases/default.nix
Normal file
16
modules/core/aliases/default.nix
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
options.modules.core.aliases = {
|
||||||
|
enable = lib.mkEnableOption "shell aliases";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf config.modules.core.aliases.enable {
|
||||||
|
programs.zsh.shellAliases = {
|
||||||
|
ll = "ls -la";
|
||||||
|
update = "sudo nixos-rebuild switch";
|
||||||
|
hm = "home-manager";
|
||||||
|
hms = "home-manager switch";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
16
modules/core/default.nix
Normal file
16
modules/core/default.nix
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./aliases
|
||||||
|
./direnv.nix
|
||||||
|
./git.nix
|
||||||
|
./gpg.nix
|
||||||
|
./ssh.nix
|
||||||
|
./zsh.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
options.modules.core = {
|
||||||
|
enable = lib.mkEnableOption "core configuration";
|
||||||
|
};
|
||||||
|
}
|
15
modules/core/direnv.nix
Normal file
15
modules/core/direnv.nix
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
options.modules.core.direnv = {
|
||||||
|
enable = lib.mkEnableOption "direnv configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf config.modules.core.direnv.enable {
|
||||||
|
programs.direnv = {
|
||||||
|
enable = true;
|
||||||
|
nix-direnv.enable = true;
|
||||||
|
enableZshIntegration = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
21
modules/core/git.nix
Normal file
21
modules/core/git.nix
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
options.modules.core.git = {
|
||||||
|
enable = lib.mkEnableOption "git configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf config.modules.core.git.enable {
|
||||||
|
programs.git = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.git;
|
||||||
|
lfs.enable = true;
|
||||||
|
credential = {
|
||||||
|
helper = "${pkgs.git-credential-manager}/bin/git-credential-manager";
|
||||||
|
credentialStore = "plaintext";
|
||||||
|
interactive = false;
|
||||||
|
};
|
||||||
|
safe.directory = "*";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
41
modules/core/gpg.nix
Normal file
41
modules/core/gpg.nix
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
options.modules.core.gpg = {
|
||||||
|
enable = lib.mkEnableOption "gpg configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf config.modules.core.gpg.enable {
|
||||||
|
programs.gpg = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
trust-model = "tofu+pgp";
|
||||||
|
tofu-default-policy = "auto";
|
||||||
|
keyserver-options = "auto-key-retrieve";
|
||||||
|
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";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.gpg-agent = {
|
||||||
|
enable = true;
|
||||||
|
enableSshSupport = true;
|
||||||
|
defaultCacheTtl = 1800;
|
||||||
|
maxCacheTtl = 7200;
|
||||||
|
pinentryPackage = pkgs.pinentry-qt;
|
||||||
|
extraConfig = ''
|
||||||
|
allow-preset-passphrase
|
||||||
|
allow-loopback-pinentry
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
gnupg
|
||||||
|
pinentry-qt
|
||||||
|
paperkey
|
||||||
|
pgpdump
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
23
modules/core/ssh.nix
Normal file
23
modules/core/ssh.nix
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
options.modules.core.ssh = {
|
||||||
|
enable = lib.mkEnableOption "ssh configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf config.modules.core.ssh.enable {
|
||||||
|
programs.ssh = {
|
||||||
|
enable = true;
|
||||||
|
extraConfig = ''
|
||||||
|
AddKeysToAgent yes
|
||||||
|
UseKeychain yes
|
||||||
|
IdentitiesOnly yes
|
||||||
|
HashKnownHosts yes
|
||||||
|
'';
|
||||||
|
serverAliveInterval = 60;
|
||||||
|
serverAliveCountMax = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
home.file."${config.home.sessionVariables.XDG_DATA_HOME}/ssh/.keep".text = "";
|
||||||
|
};
|
||||||
|
}
|
18
modules/core/zsh.nix
Normal file
18
modules/core/zsh.nix
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
options.modules.core.zsh = {
|
||||||
|
enable = lib.mkEnableOption "zsh configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf config.modules.core.zsh.enable {
|
||||||
|
programs.zsh = {
|
||||||
|
enable = true;
|
||||||
|
initExtra = ''
|
||||||
|
export PATH=$HOME/.nix-profile/bin:$PATH
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
home.sessionVariables.SHELL = "${pkgs.zsh}/bin/zsh";
|
||||||
|
};
|
||||||
|
}
|
16
modules/desktop/appimage.nix
Normal file
16
modules/desktop/appimage.nix
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
options.modules.desktop.appimage = {
|
||||||
|
enable = lib.mkEnableOption "appimage support";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf config.modules.desktop.appimage.enable {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
appimage-run
|
||||||
|
zlib
|
||||||
|
fuse
|
||||||
|
fuse3
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
21
modules/desktop/browsers/default.nix
Normal file
21
modules/desktop/browsers/default.nix
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# modules/desktop/browsers/default.nix
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (lib.utilMods) mkModule;
|
||||||
|
in
|
||||||
|
mkModule "desktop" "browsers" {
|
||||||
|
packages = with pkgs; [
|
||||||
|
(lib.mkIf config.modules.desktop.browsers.floorp.enable floorp)
|
||||||
|
(lib.mkIf config.modules.desktop.browsers.chromium.enable ungoogled-chromium)
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# modules/desktop/productivity/obsidian.nix
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (lib.utilMods) mkModule;
|
||||||
|
in mkModule "desktop" "productivity.obsidian" {
|
||||||
|
packages = [ pkgs.obsidian ];
|
||||||
|
};
|
32
modules/desktop/communication/default.nix
Normal file
32
modules/desktop/communication/default.nix
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
home-manager.users.${config.user.name} = { # Use home-manager.users path
|
||||||
|
|
||||||
|
options.modules.desktop.communication = {
|
||||||
|
enable = lib.mkEnableOption "communication apps";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf config.modules.desktop.communication.enable {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
# Signal
|
||||||
|
signal-cli
|
||||||
|
signal-export
|
||||||
|
signal-desktop
|
||||||
|
|
||||||
|
# Telegram
|
||||||
|
telegram-desktop
|
||||||
|
telegram-bot-api
|
||||||
|
tg
|
||||||
|
tdl
|
||||||
|
|
||||||
|
# WhatsApp
|
||||||
|
whatsapp-for-linux
|
||||||
|
whatsapp-chat-exporter
|
||||||
|
|
||||||
|
# Video conferencing
|
||||||
|
zoom-us
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
27
modules/desktop/default.nix
Normal file
27
modules/desktop/default.nix
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (lib.utilMods) mkModule;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./browsers
|
||||||
|
./communication
|
||||||
|
./development
|
||||||
|
./gaming
|
||||||
|
./multiplexers
|
||||||
|
./productivity
|
||||||
|
./terminals
|
||||||
|
./plasma6
|
||||||
|
./appimage.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
options.modules.desktop = {
|
||||||
|
enable = lib.mkEnableOption "desktop environment";
|
||||||
|
};
|
||||||
|
|
||||||
|
# All desktop modules will automatically be wrapped in home-manager configuration
|
||||||
|
config = lib.mkIf config.modules.desktop.enable {
|
||||||
|
home-manager.enable = true;
|
||||||
|
};
|
||||||
|
}
|
17
modules/desktop/development/default.nix
Normal file
17
modules/desktop/development/default.nix
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# modules/desktop/development/default.nix
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./editors
|
||||||
|
];
|
||||||
|
options.modules.desktop.development = {
|
||||||
|
enable = lib.mkEnableOption "development tools";
|
||||||
|
|
||||||
|
vscode.enable = lib.mkEnableOption "VSCode";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf config.modules.desktop.development.enable {
|
||||||
|
# Base development packages will be configured in tools.nix
|
||||||
|
};
|
||||||
|
}
|
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./sublime.nix
|
|
||||||
./vscode.nix
|
./vscode.nix
|
||||||
];
|
];
|
||||||
}
|
}
|
61
modules/desktop/development/editors/vscode.nix
Normal file
61
modules/desktop/development/editors/vscode.nix
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
config = lib.mkIf config.modules.desktop.development.vscode.enable {
|
||||||
|
home-manager.users.${config.user.name} = { # Use home-manager.users path
|
||||||
|
programs.vscode = {
|
||||||
|
enable = true;
|
||||||
|
extensions = 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
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
userSettings = {
|
||||||
|
"editor.fontSize" = 14;
|
||||||
|
"editor.fontFamily" = "FiraCode Nerd Font";
|
||||||
|
"editor.formatOnSave" = true;
|
||||||
|
"files.autoSave" = "onFocusChange";
|
||||||
|
"workbench.colorTheme" = "Dracula";
|
||||||
|
"editor.minimap.enabled" = false;
|
||||||
|
"editor.rulers" = [ 80 120 ];
|
||||||
|
"files.trimTrailingWhitespace" = true;
|
||||||
|
"editor.bracketPairColorization.enabled" = true;
|
||||||
|
|
||||||
|
"git.enabled" = true;
|
||||||
|
"git.autofetch" = true;
|
||||||
|
"git.confirmSync" = false;
|
||||||
|
"git.enableSmartCommit" = true;
|
||||||
|
"git.path" = "${pkgs.git}/bin/git";
|
||||||
|
"git.openRepositoryInParentFolders" = "never";
|
||||||
|
|
||||||
|
"gitlens.hovers.currentLine.over" = "line";
|
||||||
|
"gitlens.currentLine.enabled" = true;
|
||||||
|
"gitlens.hovers.enabled" = true;
|
||||||
|
"gitlens.mode.active" = "zen";
|
||||||
|
|
||||||
|
"git.terminalAuthentication" = true;
|
||||||
|
"git.credential.helper" = "${pkgs.git-credential-manager}/bin/git-credential-manager";
|
||||||
|
|
||||||
|
"nix.enableLanguageServer" = true;
|
||||||
|
"nix.serverPath" = "nil";
|
||||||
|
"nix.formatterPath" = "${pkgs.nixpkgs-fmt}/bin/nixpkgs-fmt";
|
||||||
|
"[nix]" = {
|
||||||
|
"editor.defaultFormatter" = "jnoortheen.nix-ide";
|
||||||
|
"editor.formatOnSave" = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
nixpkgs-fmt
|
||||||
|
nil
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
19
modules/desktop/gaming/default.nix
Normal file
19
modules/desktop/gaming/default.nix
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./vr
|
||||||
|
];
|
||||||
|
|
||||||
|
options.modules.desktop.gaming = {
|
||||||
|
enable = lib.mkEnableOption "gaming support";
|
||||||
|
steam.enable = lib.mkEnableOption "Steam gaming platform";
|
||||||
|
vr.enable = lib.mkEnableOption "VR support";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf config.modules.desktop.gaming.enable {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
(lib.mkIf config.modules.desktop.gaming.steam.enable steam)
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
46
modules/desktop/gaming/vr/default.nix
Normal file
46
modules/desktop/gaming/vr/default.nix
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
config = lib.mkIf config.modules.desktop.gaming.vr.enable {
|
||||||
|
home-manager.users.${config.user.name} = { # Use home-manager.users path
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
immersed
|
||||||
|
];
|
||||||
|
|
||||||
|
systemd.user.services.immersed = {
|
||||||
|
Unit = {
|
||||||
|
Description = "Immersed VR Client";
|
||||||
|
After = [ "graphical-session.target" "network.target" ];
|
||||||
|
PartOf = [ "graphical-session.target" ];
|
||||||
|
Requires = [ "network.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
Service = {
|
||||||
|
Type = "simple";
|
||||||
|
ExecStartPre = "${pkgs.coreutils}/bin/sleep 2";
|
||||||
|
ExecStart = "${pkgs.immersed}/bin/immersed";
|
||||||
|
Environment = [
|
||||||
|
"DISPLAY=:0"
|
||||||
|
"XDG_CURRENT_DESKTOP=KDE"
|
||||||
|
"QT_QPA_PLATFORM=xcb"
|
||||||
|
"XDG_RUNTIME_DIR=/run/user/1000"
|
||||||
|
"XDG_SESSION_TYPE=x11"
|
||||||
|
];
|
||||||
|
Restart = "on-failure";
|
||||||
|
RestartSec = 5;
|
||||||
|
StandardOutput = "journal";
|
||||||
|
StandardError = "journal";
|
||||||
|
DevicePolicy = "auto";
|
||||||
|
};
|
||||||
|
|
||||||
|
Install = {
|
||||||
|
WantedBy = [ "graphical-session.target" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
home.file.".local/share/immersed/.keep".text = "";
|
||||||
|
home.file.".config/immersed/.keep".text = "";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
12
modules/desktop/multiplexers/default.nix
Normal file
12
modules/desktop/multiplexers/default.nix
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./tmux.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
options.modules.desktop.multiplexers = {
|
||||||
|
enable = lib.mkEnableOption "terminal multiplexers";
|
||||||
|
tmux.enable = lib.mkEnableOption "tmux";
|
||||||
|
};
|
||||||
|
}
|
29
modules/desktop/multiplexers/tmux.nix
Normal file
29
modules/desktop/multiplexers/tmux.nix
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
config = lib.mkIf config.modules.desktop.multiplexers.tmux.enable {
|
||||||
|
home-manager.users.${config.user.name} = { # Use home-manager.users path
|
||||||
|
|
||||||
|
programs.tmux = {
|
||||||
|
enable = true;
|
||||||
|
clock24 = true;
|
||||||
|
baseIndex = 1;
|
||||||
|
escapeTime = 0;
|
||||||
|
terminal = "screen-256color";
|
||||||
|
historyLimit = 10000;
|
||||||
|
keyMode = "vi";
|
||||||
|
customPaneNavigationAndResize = true;
|
||||||
|
extraConfig = ''
|
||||||
|
set -g mouse on
|
||||||
|
set -g prefix C-a
|
||||||
|
unbind C-b
|
||||||
|
bind C-a send-prefix
|
||||||
|
bind | split-window -h -c "#{pane_current_path}"
|
||||||
|
bind - split-window -v -c "#{pane_current_path}"
|
||||||
|
unbind '"'
|
||||||
|
unbind %
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
108
modules/desktop/plasma6/default.nix
Normal file
108
modules/desktop/plasma6/default.nix
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.modules.desktop.plasma6;
|
||||||
|
in {
|
||||||
|
options.modules.desktop.plasma6 = {
|
||||||
|
enable = lib.mkEnableOption "KDE Plasma 6 desktop environment";
|
||||||
|
|
||||||
|
wayland = {
|
||||||
|
enable = lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
default = true;
|
||||||
|
description = "Enable Wayland support for Plasma";
|
||||||
|
};
|
||||||
|
|
||||||
|
scaling = lib.mkOption {
|
||||||
|
type = lib.types.float;
|
||||||
|
default = 1.0;
|
||||||
|
description = "Global scaling factor for Wayland";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
extraPackages = lib.mkOption {
|
||||||
|
type = lib.types.listOf lib.types.package;
|
||||||
|
default = [];
|
||||||
|
description = "Additional KDE/Plasma packages to install";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.xserver = {
|
||||||
|
enable = true;
|
||||||
|
displayManager = {
|
||||||
|
sddm = {
|
||||||
|
enable = true;
|
||||||
|
wayland = {
|
||||||
|
enable = cfg.wayland.enable; # Fixed: wayland is an attribute set
|
||||||
|
};
|
||||||
|
};
|
||||||
|
defaultSession = "plasma";
|
||||||
|
};
|
||||||
|
|
||||||
|
desktopManager.plasma6.enable = true;
|
||||||
|
};
|
||||||
|
environment.sessionVariables = lib.mkIf cfg.wayland.enable {
|
||||||
|
NIXOS_OZONE_WL = "1";
|
||||||
|
MOZ_ENABLE_WAYLAND = "1";
|
||||||
|
QT_QPA_PLATFORM = "wayland;xcb";
|
||||||
|
QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
|
||||||
|
GDK_BACKEND = "wayland,x11";
|
||||||
|
XDG_SESSION_TYPE = "wayland";
|
||||||
|
QT_SCALE_FACTOR = toString cfg.wayland.scaling;
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
kate
|
||||||
|
konsole
|
||||||
|
dolphin
|
||||||
|
ark
|
||||||
|
okular
|
||||||
|
spectacle
|
||||||
|
plasma-pa
|
||||||
|
plasma-nm
|
||||||
|
kdeconnect
|
||||||
|
wayland
|
||||||
|
plasma5Packages.kwayland
|
||||||
|
plasma5Packages.kwayland-integration
|
||||||
|
qt6.qtwayland
|
||||||
|
] ++ cfg.extraPackages;
|
||||||
|
|
||||||
|
services = {
|
||||||
|
power-profiles-daemon.enable = true;
|
||||||
|
upower.enable = true;
|
||||||
|
accounts-daemon.enable = true;
|
||||||
|
gnome.gnome-keyring.enable = true;
|
||||||
|
gvfs.enable = true;
|
||||||
|
udisks2.enable = true;
|
||||||
|
pipewire = {
|
||||||
|
enable = true;
|
||||||
|
alsa.enable = true;
|
||||||
|
pulse.enable = true;
|
||||||
|
jack.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
security = {
|
||||||
|
rtkit.enable = true;
|
||||||
|
polkit.enable = true;
|
||||||
|
pam.services.sddm.enableKwallet = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
fonts.packages = with pkgs; [
|
||||||
|
noto-fonts
|
||||||
|
noto-fonts-cjk
|
||||||
|
noto-fonts-emoji
|
||||||
|
liberation_ttf
|
||||||
|
fira-code
|
||||||
|
fira-code-symbols
|
||||||
|
];
|
||||||
|
|
||||||
|
xdg.portal = {
|
||||||
|
enable = true;
|
||||||
|
extraPortals = with pkgs; [
|
||||||
|
xdg-desktop-portal-kde
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
14
modules/desktop/productivity/bitwarden.nix
Normal file
14
modules/desktop/productivity/bitwarden.nix
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
config = lib.mkIf config.modules.desktop.productivity.bitwarden.enable {
|
||||||
|
home-manager.users.${config.user.name} = { # Use home-manager.users path
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
bitwarden-desktop
|
||||||
|
bitwarden-cli
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
16
modules/desktop/productivity/default.nix
Normal file
16
modules/desktop/productivity/default.nix
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
# ./obsidian.nix
|
||||||
|
./bitwarden.nix
|
||||||
|
# ./todoist.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
options.modules.desktop.productivity = {
|
||||||
|
enable = lib.mkEnableOption "productivity tools";
|
||||||
|
# obsidian.enable = lib.mkEnableOption "Obsidian";
|
||||||
|
bitwarden.enable = lib.mkEnableOption "Bitwarden";
|
||||||
|
# todoist.enable = lib.mkEnableOption "Todoist";
|
||||||
|
};
|
||||||
|
}
|
9
modules/desktop/productivity/obsidian.nix
Normal file
9
modules/desktop/productivity/obsidian.nix
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
config = lib.mkIf config.modules.desktop.productivity.obsidian.enable {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
obsidian
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
13
modules/desktop/productivity/todoist.nix
Normal file
13
modules/desktop/productivity/todoist.nix
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
config = lib.mkIf config.modules.desktop.productivity.todoist.enable {
|
||||||
|
home-manager.users.${config.user.name} = { # Use home-manager.users path
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
todoist
|
||||||
|
todoist-electron
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
12
modules/desktop/terminals/default.nix
Normal file
12
modules/desktop/terminals/default.nix
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./kitty.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
options.modules.desktop.terminals = {
|
||||||
|
enable = lib.mkEnableOption "terminal emulators";
|
||||||
|
kitty.enable = lib.mkEnableOption "kitty terminal";
|
||||||
|
};
|
||||||
|
}
|
52
modules/desktop/terminals/kitty.nix
Normal file
52
modules/desktop/terminals/kitty.nix
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
config = lib.mkIf config.modules.desktop.terminals.kitty.enable {
|
||||||
|
home-manager.users.${config.user.name} = { # Use home-manager.users path
|
||||||
|
|
||||||
|
programs.kitty = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
font_family = "JetBrains Mono";
|
||||||
|
font_size = 12;
|
||||||
|
window_padding_width = 4;
|
||||||
|
background_opacity = "0.95";
|
||||||
|
hide_window_decorations = "yes";
|
||||||
|
tab_bar_style = "powerline";
|
||||||
|
|
||||||
|
# Dracula theme colors
|
||||||
|
foreground = "#F8F8F2";
|
||||||
|
background = "#282A36";
|
||||||
|
selection_foreground = "#ffffff";
|
||||||
|
selection_background = "#44475a";
|
||||||
|
url_color = "#8be9fd";
|
||||||
|
cursor = "#f8f8f2";
|
||||||
|
|
||||||
|
# Colors
|
||||||
|
color0 = "#21222c";
|
||||||
|
color8 = "#6272a4";
|
||||||
|
color1 = "#ff5555";
|
||||||
|
color9 = "#ff6e6e";
|
||||||
|
color2 = "#50fa7b";
|
||||||
|
color10 = "#69ff94";
|
||||||
|
color3 = "#f1fa8c";
|
||||||
|
color11 = "#ffffa5";
|
||||||
|
color4 = "#bd93f9";
|
||||||
|
color12 = "#d6acff";
|
||||||
|
color5 = "#ff79c6";
|
||||||
|
color13 = "#ff92df";
|
||||||
|
color6 = "#8be9fd";
|
||||||
|
color14 = "#a4ffff";
|
||||||
|
color7 = "#f8f8f2";
|
||||||
|
color15 = "#ffffff";
|
||||||
|
|
||||||
|
# Tab bar
|
||||||
|
active_tab_foreground = "#282a36";
|
||||||
|
active_tab_background = "#f8f8f2";
|
||||||
|
inactive_tab_foreground = "#282a36";
|
||||||
|
inactive_tab_background = "#6272a4";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
148
modules/system/default.nix
Normal file
148
modules/system/default.nix
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
# modules/system/default.nix
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.modules.system;
|
||||||
|
in {
|
||||||
|
options.modules.system = {
|
||||||
|
# Base system options
|
||||||
|
enable = lib.mkEnableOption "system configuration";
|
||||||
|
|
||||||
|
# System identification
|
||||||
|
stateVersion = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "24.05";
|
||||||
|
description = "The NixOS state version for this system";
|
||||||
|
};
|
||||||
|
|
||||||
|
hostname = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
description = "The hostname of this system";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Locale and time
|
||||||
|
timeZone = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "America/Los_Angeles";
|
||||||
|
description = "The timezone for this system";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Nix specific options
|
||||||
|
nix = {
|
||||||
|
autoGc = lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
default = true;
|
||||||
|
description = "Enable automatic garbage collection";
|
||||||
|
};
|
||||||
|
|
||||||
|
gcDays = lib.mkOption {
|
||||||
|
type = lib.types.int;
|
||||||
|
default = 7;
|
||||||
|
description = "Days between automatic garbage collection";
|
||||||
|
};
|
||||||
|
|
||||||
|
extraOptions = lib.mkOption {
|
||||||
|
type = lib.types.attrs;
|
||||||
|
default = {};
|
||||||
|
description = "Additional Nix settings";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Security options
|
||||||
|
security = {
|
||||||
|
sudo.askPass = lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
default = true;
|
||||||
|
description = "Whether sudo should ask for a password";
|
||||||
|
};
|
||||||
|
|
||||||
|
polkit.enable = lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
default = true;
|
||||||
|
description = "Enable polkit for privilege escalation";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
# Basic system configuration
|
||||||
|
system.stateVersion = cfg.stateVersion;
|
||||||
|
networking.hostName = cfg.hostname;
|
||||||
|
time.timeZone = cfg.timeZone;
|
||||||
|
|
||||||
|
# Locale settings
|
||||||
|
i18n = {
|
||||||
|
defaultLocale = "en_US.UTF-8";
|
||||||
|
supportedLocales = [
|
||||||
|
"en_US.UTF-8/UTF-8"
|
||||||
|
"C.UTF-8/UTF-8"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Nix configuration
|
||||||
|
nix = {
|
||||||
|
settings = {
|
||||||
|
experimental-features = [ "nix-command" "flakes" ];
|
||||||
|
allowed-users = [ "@wheel" ];
|
||||||
|
auto-optimise-store = true;
|
||||||
|
warn-dirty = false;
|
||||||
|
} // cfg.nix.extraOptions;
|
||||||
|
|
||||||
|
gc = lib.mkIf cfg.nix.autoGc {
|
||||||
|
automatic = true;
|
||||||
|
dates = "weekly";
|
||||||
|
options = "--delete-older-than ${toString cfg.nix.gcDays}d";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Security configuration
|
||||||
|
security = {
|
||||||
|
sudo.wheelNeedsPassword = cfg.security.sudo.askPass;
|
||||||
|
polkit.enable = cfg.security.polkit.enable;
|
||||||
|
rtkit.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Essential system packages
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
# Basic utilities
|
||||||
|
coreutils
|
||||||
|
curl
|
||||||
|
wget
|
||||||
|
git
|
||||||
|
vim
|
||||||
|
|
||||||
|
# System utilities
|
||||||
|
htop
|
||||||
|
lsof
|
||||||
|
tree
|
||||||
|
file
|
||||||
|
which
|
||||||
|
|
||||||
|
# Hardware utilities
|
||||||
|
pciutils
|
||||||
|
usbutils
|
||||||
|
lshw
|
||||||
|
];
|
||||||
|
|
||||||
|
# Basic system services
|
||||||
|
services = {
|
||||||
|
# Time synchronization
|
||||||
|
timesyncd.enable = true;
|
||||||
|
|
||||||
|
# USB device management
|
||||||
|
udev.enable = true;
|
||||||
|
|
||||||
|
# DBus
|
||||||
|
dbus = {
|
||||||
|
enable = true;
|
||||||
|
packages = with pkgs; [ dconf ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# System-wide environment settings
|
||||||
|
environment.sessionVariables = {
|
||||||
|
NIXOS_OZONE_WL = "1"; # For Electron apps
|
||||||
|
XDG_SESSION_TYPE = lib.mkDefault "wayland";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
14
pkgs/common/default.nix
Normal file
14
pkgs/common/default.nix
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{ config, pkgs, lib, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
# Helper function to conditionally import language support
|
||||||
|
importIf = cond: path: if cond then [ path ] else [ ];
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
(importIf config.languages.python.enable ../languages/python) ++
|
||||||
|
(importIf config.languages.rust.enable ../languages/rust) ++
|
||||||
|
(importIf config.languages.go.enable ../languages/go) ++
|
||||||
|
(importIf config.languages.javascript.enable ../languages/javascript) ++
|
||||||
|
[ ./paths.nix ./versions.nix ];
|
||||||
|
}
|
@ -1,6 +1,9 @@
|
|||||||
{ config, pkgs, ... }:
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
|
imports = [
|
||||||
|
./tools.nix
|
||||||
|
];
|
||||||
home.packages = with pkgs; [
|
home.packages = with pkgs; [
|
||||||
go
|
go
|
||||||
gopls
|
gopls
|
||||||
@ -12,4 +15,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";
|
||||||
};
|
};
|
||||||
}
|
}
|
38
pkgs/languages/javascript/default.nix
Normal file
38
pkgs/languages/javascript/default.nix
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
nodeVersion =
|
||||||
|
if builtins.getEnv "NODE_VERSION" != ""
|
||||||
|
then builtins.getEnv "NODE_VERSION"
|
||||||
|
else "20";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
# Node.js
|
||||||
|
pkgs."nodejs_${nodeVersion}"
|
||||||
|
|
||||||
|
# Package managers and tools
|
||||||
|
nodePackages.npm
|
||||||
|
nodePackages.node-gyp
|
||||||
|
nodePackages.node-pre-gyp
|
||||||
|
nodePackages.pnpm
|
||||||
|
yarn
|
||||||
|
];
|
||||||
|
|
||||||
|
home.sessionVariables = {
|
||||||
|
NODE_PATH = "${config.home.sessionVariables.NODE_PACKAGES_DIR}/lib/node_modules";
|
||||||
|
};
|
||||||
|
|
||||||
|
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"
|
||||||
|
'';
|
||||||
|
}
|
@ -1,10 +1,10 @@
|
|||||||
{ pkgs, ... }:
|
{ pkgs, ... }:
|
||||||
|
|
||||||
let
|
let
|
||||||
pythonVersion = builtins.replaceStrings ["."] [""]
|
pythonVersion = builtins.replaceStrings [ "." ] [ "" ]
|
||||||
(if builtins.getEnv "PYTHON_VERSION" != ""
|
(if builtins.getEnv "PYTHON_VERSION" != ""
|
||||||
then builtins.getEnv "PYTHON_VERSION"
|
then builtins.getEnv "PYTHON_VERSION"
|
||||||
else "311");
|
else "311");
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
home.packages = [
|
home.packages = [
|
||||||
@ -19,4 +19,4 @@ in
|
|||||||
PYTHONIOENCODING = "UTF-8";
|
PYTHONIOENCODING = "UTF-8";
|
||||||
VIRTUAL_ENV_DISABLE_PROMPT = 1;
|
VIRTUAL_ENV_DISABLE_PROMPT = 1;
|
||||||
};
|
};
|
||||||
}
|
}
|
3
pkgs/languages/rust/cargo.nix
Normal file
3
pkgs/languages/rust/cargo.nix
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{ }
|
@ -3,6 +3,10 @@
|
|||||||
{
|
{
|
||||||
home.packages = with pkgs; [
|
home.packages = with pkgs; [
|
||||||
rustup
|
rustup
|
||||||
|
cargo-edit
|
||||||
|
cargo-watch
|
||||||
|
cargo-audit
|
||||||
|
cargo-tarpaulin
|
||||||
];
|
];
|
||||||
|
|
||||||
home.sessionVariables = {
|
home.sessionVariables = {
|
||||||
@ -13,4 +17,13 @@
|
|||||||
default_toolchain = "${config.home.sessionVariables.RUST_VERSION}"
|
default_toolchain = "${config.home.sessionVariables.RUST_VERSION}"
|
||||||
profile = "default"
|
profile = "default"
|
||||||
'';
|
'';
|
||||||
}
|
|
||||||
|
|
||||||
|
home.file.".cargo/config.toml".text = ''
|
||||||
|
[build]
|
||||||
|
target-dir = "target"
|
||||||
|
|
||||||
|
[cargo-new]
|
||||||
|
vcs = "git"
|
||||||
|
'';
|
||||||
|
}
|
3
pkgs/languages/rust/toolchain.nix
Normal file
3
pkgs/languages/rust/toolchain.nix
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{ }
|
11
pkgs/packages/default.nix
Normal file
11
pkgs/packages/default.nix
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# NOTE TO CLAUDE: I think that here we want to impliment the ability to declare in our users/[user]/[host].nix file which custom packages we want to install
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
repo-to-text = pkgs.callPackage ./repo-to-text.nix { };
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.packages = [
|
||||||
|
repo-to-text
|
||||||
|
];
|
||||||
|
}
|
72
shell.nix
Normal file
72
shell.nix
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
{ pkgs ? import <nixpkgs> { } }:
|
||||||
|
|
||||||
|
let
|
||||||
|
# Import core module configurations
|
||||||
|
coreModule = import ./modules/core {
|
||||||
|
inherit pkgs;
|
||||||
|
config = { };
|
||||||
|
lib = pkgs.lib;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Development shell tools on top of core tools
|
||||||
|
extraPackages = with pkgs; [
|
||||||
|
# Nix tools
|
||||||
|
nixos-install-tools
|
||||||
|
nixos-generate-config
|
||||||
|
nix-prefetch-git
|
||||||
|
nixpkgs-fmt
|
||||||
|
nil # Nix LSP
|
||||||
|
|
||||||
|
# System tools
|
||||||
|
gparted
|
||||||
|
parted
|
||||||
|
cryptsetup
|
||||||
|
|
||||||
|
# Installation tools
|
||||||
|
git
|
||||||
|
curl
|
||||||
|
wget
|
||||||
|
rsync
|
||||||
|
|
||||||
|
# Hardware info
|
||||||
|
lshw
|
||||||
|
dmidecode
|
||||||
|
pciutils
|
||||||
|
usbutils
|
||||||
|
|
||||||
|
# Disk utilities
|
||||||
|
gptfdisk
|
||||||
|
hdparm
|
||||||
|
|
||||||
|
# Network tools
|
||||||
|
iw
|
||||||
|
wirelesstools
|
||||||
|
ethtool
|
||||||
|
|
||||||
|
# Debugging tools
|
||||||
|
htop
|
||||||
|
btop
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
pkgs.mkShell {
|
||||||
|
# Combine core packages with extra development tools
|
||||||
|
packages = coreModule.home.packages ++ extraPackages;
|
||||||
|
|
||||||
|
# Shell environment setup
|
||||||
|
shellHook = ''
|
||||||
|
# Source environment variables if .envrc exists
|
||||||
|
if [ -f .envrc ]; then
|
||||||
|
source .envrc
|
||||||
|
else
|
||||||
|
echo "Warning: .envrc file not found. Copy .envrc.example to .envrc and modify as needed."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Print available tools
|
||||||
|
echo "NixOS configuration development shell loaded with the following tools:"
|
||||||
|
echo "- Core tools from modules/core"
|
||||||
|
echo "- Installation and development tools"
|
||||||
|
echo ""
|
||||||
|
echo "Use 'nix develop' or 'nix-shell' to enter this environment"
|
||||||
|
'';
|
||||||
|
}
|
11
users/jeirmeister/config/default.nix
Normal file
11
users/jeirmeister/config/default.nix
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./git.nix
|
||||||
|
./gpg.nix
|
||||||
|
./ssh.nix
|
||||||
|
./tailscale.nix
|
||||||
|
./zsh.nix
|
||||||
|
];
|
||||||
|
}
|
13
users/jeirmeister/config/git.nix
Normal file
13
users/jeirmeister/config/git.nix
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{ config, pkgs, lib, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
programs.git = {
|
||||||
|
userName = "jeirmeister";
|
||||||
|
userEmail = "jeir@jeirslab.xyz";
|
||||||
|
|
||||||
|
extraConfig = {
|
||||||
|
init.defaultBranch = "main";
|
||||||
|
pull.rebase = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
18
users/jeirmeister/config/gpg.nix
Normal file
18
users/jeirmeister/config/gpg.nix
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
programs.gpg = {
|
||||||
|
settings = {
|
||||||
|
keyserver = "hkps://keys.openpgp.org";
|
||||||
|
};
|
||||||
|
# If you have specific public keys to trust, add them here
|
||||||
|
publicKeys = [
|
||||||
|
{
|
||||||
|
# source = ./path/to/key.pub;
|
||||||
|
# trust = "ultimate";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
programs.ssh = {
|
programs.ssh = {
|
||||||
enable = true;
|
|
||||||
|
|
||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
AddKeysToAgent yes
|
AddKeysToAgent yes
|
||||||
UseKeychain yes
|
UseKeychain yes
|
||||||
@ -35,4 +33,4 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
home.file."${config.home.sessionVariables.XDG_DATA_HOME}/ssh/.keep".text = "";
|
home.file."${config.home.sessionVariables.XDG_DATA_HOME}/ssh/.keep".text = "";
|
||||||
}
|
}
|
93
users/jeirmeister/config/tailscale.nix
Normal file
93
users/jeirmeister/config/tailscale.nix
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
{ config
|
||||||
|
, pkgs
|
||||||
|
, lib
|
||||||
|
, ...
|
||||||
|
}: {
|
||||||
|
# Enable the Tailscale service
|
||||||
|
services.tailscale = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
# Package to use (optional, defaults to pkgs.tailscale)
|
||||||
|
package = pkgs.tailscale;
|
||||||
|
|
||||||
|
# Authentication key for automated setup (optional)
|
||||||
|
# authKeyFile = "/path/to/tailscale/authkey";
|
||||||
|
|
||||||
|
# Interface name (optional, defaults to "tailscale0")
|
||||||
|
# interfaceName = "tailscale0";
|
||||||
|
|
||||||
|
# Port for the tailscale daemon (optional, defaults to 41641)
|
||||||
|
# port = 41641;
|
||||||
|
|
||||||
|
# Additional daemon arguments (optional)
|
||||||
|
extraUpFlags = [
|
||||||
|
"--hostname=steamnix"
|
||||||
|
"--advertise-tags=tag:nixos"
|
||||||
|
# "--advertise-exit-node"
|
||||||
|
# "--accept-dns=true"
|
||||||
|
# "--accept-routes=true"
|
||||||
|
# "--shields-up"
|
||||||
|
];
|
||||||
|
|
||||||
|
# systemd service configuration (optional)
|
||||||
|
serviceConfig = {
|
||||||
|
# Restart policy
|
||||||
|
Restart = "always";
|
||||||
|
RestartSec = "5";
|
||||||
|
|
||||||
|
# Security settings
|
||||||
|
ProtectSystem = "strict";
|
||||||
|
ProtectHome = true;
|
||||||
|
PrivateTmp = true;
|
||||||
|
|
||||||
|
# Resource limits
|
||||||
|
MemoryMax = "512M";
|
||||||
|
TasksMax = 4096;
|
||||||
|
|
||||||
|
# Network settings
|
||||||
|
NetworkNamespacePath = "";
|
||||||
|
|
||||||
|
# Additional environment variables
|
||||||
|
# Environment = [
|
||||||
|
# "TS_DEBUG_LOG_PATH=/var/log/tailscale/debug.log"
|
||||||
|
# "TS_NO_LOGS_NO_SUPPORT=true"
|
||||||
|
# ];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Tailscale configuration files location (optional)
|
||||||
|
stateDir = "/var/lib/tailscale";
|
||||||
|
|
||||||
|
# Routes configuration (optional)
|
||||||
|
routes = {
|
||||||
|
# Enable exit node functionality
|
||||||
|
exitNode = false;
|
||||||
|
|
||||||
|
# Enable subnet routing
|
||||||
|
# advertiseRoutes = [
|
||||||
|
# "10.0.0.0/24"
|
||||||
|
# "192.168.1.0/24"
|
||||||
|
# ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Additional recommended networking settings
|
||||||
|
networking = {
|
||||||
|
# Enable IP forwarding for Tailscale subnet routing
|
||||||
|
firewall = {
|
||||||
|
enable = true;
|
||||||
|
allowedTCPPorts = [ 41641 ]; # Tailscale port
|
||||||
|
checkReversePath = "loose"; # Important for Tailscale
|
||||||
|
trustedInterfaces = [ "tailscale0" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Enable IPv4 forwarding
|
||||||
|
nat = {
|
||||||
|
enable = true;
|
||||||
|
enableIPv6 = true;
|
||||||
|
externalInterface = "eth0";
|
||||||
|
internalInterfaces = [ "tailscale0" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = [ pkgs.tailscale ];
|
||||||
|
}
|
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
programs.zsh = {
|
programs.zsh = {
|
||||||
enable = true;
|
|
||||||
autosuggestion.enable = true;
|
autosuggestion.enable = true;
|
||||||
enableCompletion = true;
|
enableCompletion = true;
|
||||||
syntaxHighlighting.enable = true;
|
syntaxHighlighting.enable = true;
|
||||||
@ -24,4 +23,4 @@
|
|||||||
home.sessionVariables = {
|
home.sessionVariables = {
|
||||||
SHELL = "${pkgs.zsh}/bin/zsh";
|
SHELL = "${pkgs.zsh}/bin/zsh";
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -1,8 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./floorp.nix
|
|
||||||
./ungoogled-chromium.nix
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
# Signal
|
|
||||||
signal-cli
|
|
||||||
signal-export
|
|
||||||
signal-desktop
|
|
||||||
|
|
||||||
# Telegram
|
|
||||||
telegram-desktop
|
|
||||||
telegram-bot-api
|
|
||||||
tg
|
|
||||||
tdl
|
|
||||||
|
|
||||||
# WhatsApp
|
|
||||||
whatsapp-for-linux
|
|
||||||
whatsapp-chat-exporter
|
|
||||||
|
|
||||||
# Video conferencing
|
|
||||||
zoom-us
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./browsers
|
|
||||||
./communication
|
|
||||||
./development
|
|
||||||
./gaming
|
|
||||||
./productivity
|
|
||||||
./shell
|
|
||||||
./system
|
|
||||||
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./editors
|
|
||||||
./env
|
|
||||||
./tools.nix
|
|
||||||
./docs.nix
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
tldr
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
sublime4
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,66 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
{
|
|
||||||
programs.vscode = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
extensions = with pkgs.vscode-extensions; [
|
|
||||||
# Existing extensions
|
|
||||||
ms-vsliveshare.vsliveshare
|
|
||||||
ms-python.python
|
|
||||||
rust-lang.rust-analyzer
|
|
||||||
ms-azuretools.vscode-docker
|
|
||||||
pkief.material-icon-theme
|
|
||||||
dracula-theme.theme-dracula
|
|
||||||
|
|
||||||
# Add Nix support
|
|
||||||
jnoortheen.nix-ide # Comprehensive Nix IDE support
|
|
||||||
# or alternatively: bbenoist.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
userSettings = {
|
|
||||||
# Existing settings
|
|
||||||
"editor.fontSize" = 14;
|
|
||||||
"editor.fontFamily" = "FiraCode Nerd Font";
|
|
||||||
"editor.formatOnSave" = true;
|
|
||||||
"files.autoSave" = "onFocusChange";
|
|
||||||
"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 formatting settings
|
|
||||||
"nix.enableLanguageServer" = true;
|
|
||||||
"nix.serverPath" = "nil";
|
|
||||||
"nix.formatterPath" = "${pkgs.nixpkgs-fmt}/bin/nixpkgs-fmt";
|
|
||||||
"[nix]" = {
|
|
||||||
"editor.defaultFormatter" = "jnoortheen.nix-ide";
|
|
||||||
"editor.formatOnSave" = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Ensure nixpkgs-fmt is available in the environment
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
nixpkgs-fmt
|
|
||||||
nil # Nix language server
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
# Add to common/default.nix
|
|
||||||
{ config, pkgs, lib, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [ ./paths.nix ./versions.nix ];
|
|
||||||
|
|
||||||
# Helper function for path concatenation
|
|
||||||
_module.args.pathJoin = fragments:
|
|
||||||
lib.concatStringsSep "/" fragments;
|
|
||||||
|
|
||||||
programs.zsh.initExtra = lib.concatStrings [
|
|
||||||
''
|
|
||||||
# Environment Setup
|
|
||||||
${builtins.concatStringsSep "\n" (map (path: "export PATH=\"${path}:$PATH\"") config.home.sessionPath)}
|
|
||||||
''
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./direnv.nix
|
|
||||||
./common
|
|
||||||
./languages
|
|
||||||
];
|
|
||||||
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
programs.direnv = {
|
|
||||||
enable = true;
|
|
||||||
nix-direnv.enable = true;
|
|
||||||
enableZshIntegration = true;
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./go
|
|
||||||
./javascript
|
|
||||||
./python
|
|
||||||
./rust
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./tools.nix
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./node.nix
|
|
||||||
./package-managers
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
let
|
|
||||||
nodeVersion = if builtins.getEnv "NODE_VERSION" != ""
|
|
||||||
then builtins.getEnv "NODE_VERSION"
|
|
||||||
else "20";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
home.packages = [
|
|
||||||
pkgs."nodejs_${nodeVersion}"
|
|
||||||
];
|
|
||||||
|
|
||||||
home.sessionVariables = {
|
|
||||||
NODE_PATH = "${config.home.sessionVariables.NODE_PACKAGES_DIR}/lib/node_modules";
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./npm.nix
|
|
||||||
./pnpm.nix
|
|
||||||
./yarn.nix
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
nodePackages.npm
|
|
||||||
nodePackages.node-gyp
|
|
||||||
nodePackages.node-pre-gyp
|
|
||||||
];
|
|
||||||
|
|
||||||
home.file.".npmrc".text = ''
|
|
||||||
prefix=${config.home.sessionVariables.NODE_PACKAGES_DIR}
|
|
||||||
'';
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [ nodePackages.pnpm ];
|
|
||||||
|
|
||||||
home.file.".pnpmrc".text = ''
|
|
||||||
pnpm-version=8.9.0
|
|
||||||
store-dir=${config.home.sessionVariables.XDG_DATA_HOME}/pnpm
|
|
||||||
'';
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [ yarn ];
|
|
||||||
|
|
||||||
home.file.".yarnrc".text = ''
|
|
||||||
cache-folder "${config.home.sessionVariables.XDG_CACHE_HOME}/yarn"
|
|
||||||
'';
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
{ pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./base.nix
|
|
||||||
./package-managers
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
# Add to env/languages/python/package-managers/default.nix
|
|
||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./pipenv.nix
|
|
||||||
./poetry
|
|
||||||
];
|
|
||||||
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [ pipenv ];
|
|
||||||
|
|
||||||
home.sessionVariables = {
|
|
||||||
PIPENV_VENV_IN_PROJECT = "1";
|
|
||||||
WORKON_HOME = "${config.home.sessionVariables.VIRTUALENV_HOME}";
|
|
||||||
PIP_NO_CACHE_DIR = "off";
|
|
||||||
PIPENV_SKIP_LOCK = "1";
|
|
||||||
PIPENV_IGNORE_VIRTUALENVS = "1";
|
|
||||||
PIPENV_MAX_DEPTH = "5";
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,32 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
let
|
|
||||||
poetry2nix = import (pkgs.fetchFromGitHub {
|
|
||||||
owner = "nix-community";
|
|
||||||
repo = "poetry2nix";
|
|
||||||
rev = "1.0.0";
|
|
||||||
sha256 = "15mdb0lr7027qpm9s1v1d9sdb8abmcdrpqsv4zvinif8a8liqxkq";
|
|
||||||
}) { inherit pkgs; };
|
|
||||||
in
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
poetry
|
|
||||||
|
|
||||||
];
|
|
||||||
imports = [
|
|
||||||
./packages
|
|
||||||
];
|
|
||||||
|
|
||||||
home.sessionVariables = {
|
|
||||||
POETRY_VIRTUALENVS_IN_PROJECT = "true";
|
|
||||||
POETRY_CACHE_DIR = "${config.home.sessionVariables.XDG_CACHE_HOME}/pypoetry";
|
|
||||||
};
|
|
||||||
|
|
||||||
home.file.".config/pypoetry/config.toml".text = ''
|
|
||||||
[virtualenvs]
|
|
||||||
in-project = true
|
|
||||||
path = "${config.home.sessionVariables.VIRTUALENV_HOME}/poetry"
|
|
||||||
create = true
|
|
||||||
clear = false
|
|
||||||
'';
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
let
|
|
||||||
repo-to-text = pkgs.callPackage ./repo-to-text.nix {};
|
|
||||||
in
|
|
||||||
{
|
|
||||||
home.packages = [
|
|
||||||
repo-to-text
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,18 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
cargo-edit
|
|
||||||
cargo-watch
|
|
||||||
cargo-audit
|
|
||||||
cargo-tarpaulin
|
|
||||||
];
|
|
||||||
|
|
||||||
home.file.".cargo/config.toml".text = ''
|
|
||||||
[build]
|
|
||||||
target-dir = "target"
|
|
||||||
|
|
||||||
[cargo-new]
|
|
||||||
vcs = "git"
|
|
||||||
'';
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./cargo.nix
|
|
||||||
./toolchain.nix
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
git
|
|
||||||
gh
|
|
||||||
gnumake
|
|
||||||
gcc
|
|
||||||
cmake
|
|
||||||
# Python development tools
|
|
||||||
python311Packages.black
|
|
||||||
python311Packages.pylint
|
|
||||||
python311Packages.mypy
|
|
||||||
python311Packages.pytest
|
|
||||||
python311Packages.pytest-cov
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./vr
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,42 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
immersed
|
|
||||||
];
|
|
||||||
|
|
||||||
systemd.user.services.immersed = {
|
|
||||||
Unit = {
|
|
||||||
Description = "Immersed VR Client";
|
|
||||||
After = [ "graphical-session.target" "network.target" ];
|
|
||||||
PartOf = [ "graphical-session.target" ];
|
|
||||||
Requires = [ "network.target" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
Service = {
|
|
||||||
Type = "simple";
|
|
||||||
ExecStartPre = "${pkgs.coreutils}/bin/sleep 2"; # Give the video device time to initialize
|
|
||||||
ExecStart = "${pkgs.immersed}/bin/immersed";
|
|
||||||
Environment = [
|
|
||||||
"DISPLAY=:0"
|
|
||||||
"XDG_CURRENT_DESKTOP=KDE" # Since you're using Plasma
|
|
||||||
"QT_QPA_PLATFORM=xcb" # Force X11 mode for better compatibility
|
|
||||||
"XDG_RUNTIME_DIR=/run/user/1000"
|
|
||||||
"XDG_SESSION_TYPE=x11" # Force X11 mode
|
|
||||||
];
|
|
||||||
Restart = "on-failure";
|
|
||||||
RestartSec = 5;
|
|
||||||
StandardOutput = "journal";
|
|
||||||
StandardError = "journal";
|
|
||||||
DevicePolicy = "auto";
|
|
||||||
};
|
|
||||||
|
|
||||||
Install = {
|
|
||||||
WantedBy = [ "graphical-session.target" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Create required directories
|
|
||||||
home.file.".local/share/immersed/.keep".text = "";
|
|
||||||
home.file.".config/immersed/.keep".text = "";
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
bitwarden-desktop
|
|
||||||
bitwarden-cli
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./obsidian.nix
|
|
||||||
./bitwarden.nix
|
|
||||||
./todoist.nix
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
obsidian
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
todoist
|
|
||||||
todoist-electron
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./terminals
|
|
||||||
./multiplexers
|
|
||||||
./shells
|
|
||||||
./utilities
|
|
||||||
];
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user