commit 61adc10c49133b40e1af6473fbee24f4f3bce624 Author: Sayuop Date: Wed Nov 19 08:42:21 2025 +0100 Initial NixOS config diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..21d65d4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +# Hardware configuration is machine-specific +# Uncomment if you don't want to track it +# hardware-configuration.nix + +# Flake lock file - comment out if you want reproducible builds +# flake.lock + +# Result symlinks from nix build +result +result-* + +# Editor files +.vscode/ +.idea/ +*.swp +*.swo +*~ +.DS_Store + +# Temporary files +*.tmp diff --git a/KEYBINDINGS.md b/KEYBINDINGS.md new file mode 100644 index 0000000..58ad87b --- /dev/null +++ b/KEYBINDINGS.md @@ -0,0 +1,151 @@ +# Hyprland Keybindings Cheat Sheet + +## Modifier Key +**SUPER** = Windows/Command Key + +--- + +## 🚀 Launch Applications + +| Keybinding | Action | +|------------|--------| +| `SUPER + Return` | Open Terminal (Kitty) | +| `SUPER + D` | Application Launcher (Wofi) | +| `SUPER + E` | File Manager (Thunar) | + +--- + +## 🊟 Window Management + +| Keybinding | Action | +|------------|--------| +| `SUPER + Q` | Close Window | +| `SUPER + V` | Toggle Floating | +| `SUPER + F` | Toggle Fullscreen | +| `SUPER + P` | Toggle Pseudo-tiling | +| `SUPER + J` | Toggle Split Direction | +| `SUPER + M` | Exit Hyprland | + +--- + +## 🧭 Navigation + +| Keybinding | Action | +|------------|--------| +| `SUPER + ↑` | Focus Up | +| `SUPER + ↓` | Focus Down | +| `SUPER + ←` | Focus Left | +| `SUPER + →` | Focus Right | + +--- + +## ðŸ”Ē Workspaces + +### Switch Workspace +| Keybinding | Action | +|------------|--------| +| `SUPER + 1` | Workspace 1 | +| `SUPER + 2` | Workspace 2 | +| `SUPER + 3` | Workspace 3 | +| `SUPER + 4` | Workspace 4 | +| `SUPER + 5` | Workspace 5 | +| `SUPER + 6` | Workspace 6 | +| `SUPER + 7` | Workspace 7 | +| `SUPER + 8` | Workspace 8 | +| `SUPER + 9` | Workspace 9 | +| `SUPER + 0` | Workspace 10 | + +### Move Window to Workspace +| Keybinding | Action | +|------------|--------| +| `SUPER + SHIFT + 1` | Move to Workspace 1 | +| `SUPER + SHIFT + 2` | Move to Workspace 2 | +| ... | ... | +| `SUPER + SHIFT + 0` | Move to Workspace 10 | + +### Scroll Workspaces +| Keybinding | Action | +|------------|--------| +| `SUPER + Mouse Wheel Up` | Next Workspace | +| `SUPER + Mouse Wheel Down` | Previous Workspace | + +--- + +## ðŸ–ąïļ Mouse Actions + +| Keybinding | Action | +|------------|--------| +| `SUPER + Left Click + Drag` | Move Window | +| `SUPER + Right Click + Drag` | Resize Window | + +--- + +## ðŸ“ļ Screenshots + +| Keybinding | Action | +|------------|--------| +| `SUPER + SHIFT + S` | Screenshot (to clipboard) | +| `Print` | Screenshot (save to ~/Pictures) | + +--- + +## 🔊 Media Controls + +| Keybinding | Action | +|------------|--------| +| `Volume Up Key` | Increase Volume | +| `Volume Down Key` | Decrease Volume | +| `Mute Key` | Toggle Mute | +| `Mic Mute Key` | Toggle Microphone Mute | + +--- + +## 🔆 Brightness + +| Keybinding | Action | +|------------|--------| +| `Brightness Up Key` | Increase Brightness | +| `Brightness Down Key` | Decrease Brightness | + +--- + +## ðŸ’Ą Tips + +1. **First Time?** Press `SUPER + Return` to open a terminal +2. **Find Apps?** Press `SUPER + D` to search for applications +3. **Need Help?** Most settings are in `~/.config/nixos/home/hyprland.nix` +4. **Customize?** Edit the config and run `update` in terminal +5. **Stuck?** Press `SUPER + M` to exit Hyprland + +--- + +## 🛠ïļ Useful Commands + +```bash +# Reload Hyprland config (from terminal) +hyprctl reload + +# Check Hyprland info +hyprctl version + +# List all windows +hyprctl clients + +# View logs +cat /tmp/hypr/$(ls -t /tmp/hypr/ | head -n 1)/hyprland.log +``` + +--- + +## ðŸŽĻ Customization + +To change keybindings, edit: `~/.config/nixos/home/hyprland.nix` + +Then rebuild: +```bash +update # or: sudo nixos-rebuild switch --flake ~/.config/nixos#HOSTNAME +``` + +--- + +**Pro Tip:** Print this cheat sheet or keep it handy while you learn Hyprland! 📄 diff --git a/PROJECT_OVERVIEW.md b/PROJECT_OVERVIEW.md new file mode 100644 index 0000000..21c35bd --- /dev/null +++ b/PROJECT_OVERVIEW.md @@ -0,0 +1,234 @@ +# NixOS + Hyprland Configuration - Project Overview + +## ðŸŽŊ What This Is + +This is a complete, production-ready NixOS configuration featuring Hyprland as a Wayland compositor. Everything is declared in code, making your entire operating system reproducible from a fresh install with a single command. + +## ðŸ“Ķ What You're Getting + +### Core System +- **NixOS** with Flakes enabled for reproducible builds +- **Hyprland** - Modern Wayland compositor with beautiful animations +- **Home Manager** - Declarative user environment management +- **Full Wayland Support** with XWayland fallback + +### Desktop Environment +- **Waybar** - Highly customizable status bar +- **Wofi** - Application launcher +- **Dunst** - Notification daemon +- **Hyprpaper** - Wallpaper manager +- **SWWW** - Alternative animated wallpaper daemon + +### Tools & Applications +- **Kitty & Alacritty** - Modern GPU-accelerated terminals +- **ZSH** with Oh-My-Zsh - Enhanced shell experience +- **Firefox** - Web browser +- **VSCode** - Code editor +- **Thunar** - File manager +- **Modern CLI tools** - ripgrep, fd, bat, eza, fzf, etc. + +### System Features +- PipeWire audio system +- NetworkManager for networking +- Bluetooth support +- Printing support (CUPS) +- SSH server +- Graphics drivers setup + +## 📁 File Structure Explained + +``` +nixos-config/ +├── flake.nix # Main entry point - defines all inputs and outputs +├── configuration.nix # System-wide settings (bootloader, networking, users) +├── hardware-configuration.nix # Auto-generated hardware-specific settings +│ +├── modules/ +│ ├── system.nix # System packages and essential services +│ └── hyprland.nix # Hyprland system-level configuration +│ +├── home/ +│ ├── home.nix # User packages and general home-manager config +│ ├── hyprland.nix # Hyprland user settings, keybindings, appearance +│ └── waybar.nix # Status bar configuration and styling +│ +├── bootstrap.sh # Automated setup script for fresh installs +├── README.md # Comprehensive documentation +├── SETUP.md # Quick setup guide +└── KEYBINDINGS.md # Keyboard shortcuts reference +``` + +## 🚀 Quick Start Workflow + +### 1. Push to Your Git Server +```bash +cd nixos-config +git init +git add . +git commit -m "Initial NixOS configuration" +git remote add origin https://git.cribdev.com/YOUR-USERNAME/nixos-config.git +git push -u origin main +``` + +### 2. Fresh Install (On New Machine) +```bash +# One command to rule them all +nix-shell -p git --run "bash <(curl -s https://git.cribdev.com/raw/YOUR-USERNAME/nixos-config/main/bootstrap.sh)" +``` + +### 3. What the Bootstrap Does +1. Installs git temporarily +2. Clones your configuration +3. Copies hardware-configuration.nix +4. Prompts for hostname and username +5. Updates configuration files +6. Optionally builds the system immediately + +### 4. Result +After reboot, you have a fully configured system with Hyprland! + +## 🔧 Customization Points + +### Before First Push + +1. **Edit `flake.nix`:** + - Change hostname from "myhost" + - Change username from "yourusername" + +2. **Edit `configuration.nix`:** + - Set your timezone (currently Europe/Oslo) + - Adjust locale settings + - Configure your user account + +3. **Edit `home/home.nix`:** + - Set git username and email + - Add/remove packages you want + +4. **Edit `home/hyprland.nix`:** + - Customize keybindings + - Adjust colors and appearance + - Configure monitor settings + +5. **Edit `bootstrap.sh`:** + - Update the GIT_REPO variable with your actual git URL + +### After Installation + +You can always modify the configuration and rebuild: +```bash +cd ~/.config/nixos +# Make your changes +sudo nixos-rebuild switch --flake .#HOSTNAME +``` + +Or use the convenient alias after first build: +```bash +update +``` + +## ðŸŽĻ Ricing Capabilities + +This configuration includes extensive customization options: + +### Visual Customization +- **Window Decorations**: Rounded corners, borders, shadows +- **Animations**: Smooth transitions and effects +- **Colors**: Fully customizable color schemes +- **Transparency**: Blur effects and opacity settings +- **Status Bar**: Custom Waybar themes + +### Included Ricing Tools +- Hyprpaper (wallpapers) +- SWWW (animated wallpapers) +- Waybar (customizable bar) +- Dunst (notification styling) +- Wofi (launcher themes) +- GTK/Qt theme support + +### Where to Customize +- **Colors**: `home/hyprland.nix` (general section) +- **Waybar Style**: `home/waybar.nix` (style section) +- **Animations**: `home/hyprland.nix` (animations section) +- **Terminal**: `home/home.nix` (kitty settings) + +## 🔑 Key Features + +### Declarative +Everything is code. No hidden state. Reproducible across machines. + +### Atomic Updates +Changes are atomic - either they work completely or rollback automatically. + +### Rollback Capability +Every build creates a generation. Easy to rollback if something breaks. + +### Reproducible +Same configuration = same system, regardless of when/where you build. + +### Version Controlled +Your entire OS is in git. Fork it, branch it, merge configurations. + +## 📚 Next Steps + +1. **Personalize** the configuration files +2. **Push** to your git server +3. **Install** NixOS on target machine +4. **Run** bootstrap script +5. **Enjoy** your custom system! + +## 🐛 Troubleshooting + +### Common Issues + +**Hyprland won't start** +- Check logs: `journalctl -xe` +- Verify GPU drivers in `hardware-configuration.nix` + +**Monitor configuration wrong** +- Edit `home/hyprland.nix` monitor settings +- Use `hyprctl monitors` to see detected monitors + +**Packages not found** +- Update flake: `nix flake update` +- Rebuild: `sudo nixos-rebuild switch --flake .#HOSTNAME` + +**Need different keyboard layout** +- Edit `home/hyprland.nix` input section +- Change `kb_layout` value + +## 🎓 Learning Resources + +- [NixOS Manual](https://nixos.org/manual/nixos/stable/) +- [Hyprland Wiki](https://wiki.hyprland.org/) +- [Home Manager Docs](https://nix-community.github.io/home-manager/) +- [NixOS Search](https://search.nixos.org/) - Find packages + +## 🌟 Why This Approach? + +**Traditional Linux Setup:** +- Install OS +- Install packages one by one +- Configure everything manually +- Hope you documented it +- Pray when setting up a new machine + +**This NixOS Setup:** +- Install NixOS (minimal) +- Run one command +- Get coffee ☕ +- Everything configured automatically +- Reproducible on any machine + +## ðŸ’Ą Pro Tips + +1. **Always commit changes** before rebuilding +2. **Test on a VM first** for major changes +3. **Keep hardware-configuration.nix** separate per machine +4. **Use branches** for experimental configurations +5. **Document** your customizations in comments + +--- + +**You now have a fully declarative, reproducible, version-controlled operating system! 🎉** + +Any questions or issues? Check the README.md for detailed information. diff --git a/README.md b/README.md new file mode 100644 index 0000000..aa0f94e --- /dev/null +++ b/README.md @@ -0,0 +1,244 @@ +# NixOS Configuration with Hyprland + +A fully declarative NixOS configuration featuring Hyprland as the Wayland compositor with extensive ricing capabilities. + +## Features + +- **Hyprland**: Modern Wayland compositor with beautiful animations +- **Home Manager**: User-level package and dotfile management +- **Flakes**: Reproducible, declarative configuration +- **Full Wayland Support**: Native Wayland applications and XWayland compatibility +- **Ricing Tools**: Waybar, Hyprpaper, Dunst, and more for customization +- **Development Ready**: Includes essential development tools + +## Quick Start (Fresh Install) + +On a fresh NixOS installation, run: + +```bash +nix-shell -p git --run "bash <(curl -s https://git.cribdev.com/raw/your-username/nixos-config/main/bootstrap.sh)" +``` + +Or manually: + +```bash +# Install git +nix-shell -p git + +# Clone this repository +git clone https://git.cribdev.com/your-username/nixos-config ~/.config/nixos + +# Copy hardware configuration +sudo cp /etc/nixos/hardware-configuration.nix ~/.config/nixos/ + +# Edit configuration files (see below) +cd ~/.config/nixos + +# Build and apply +sudo nixos-rebuild switch --flake .#myhost +``` + +## Configuration Structure + +``` +nixos-config/ +├── flake.nix # Main flake configuration +├── configuration.nix # System-level configuration +├── hardware-configuration.nix # Auto-generated hardware config +├── bootstrap.sh # Bootstrap script for fresh installs +├── modules/ +│ ├── system.nix # System packages and services +│ └── hyprland.nix # Hyprland-specific configuration +└── home/ + ├── home.nix # Home Manager user configuration + ├── hyprland.nix # Hyprland user settings and keybindings + └── waybar.nix # Waybar status bar configuration +``` + +## Before First Build + +Edit these files with your information: + +### 1. `flake.nix` +- Replace `myhost` with your hostname +- Replace `yourusername` with your username + +### 2. `configuration.nix` +- Set your `networking.hostName` +- Set your `time.timeZone` +- Adjust locale settings if needed +- Update username in `users.users.yourusername` + +### 3. `home/home.nix` +- Update `home.username` and `home.homeDirectory` +- Configure Git with your name and email +- Adjust package list to your needs + +### 4. `home/hyprland.nix` +- Configure monitor settings +- Customize keybindings +- Adjust animations and appearance + +## Included Software + +### System Tools +- NetworkManager for networking +- PipeWire for audio +- Bluetooth support +- SSH server +- CUPS for printing + +### Desktop Environment +- Hyprland (Wayland compositor) +- Waybar (status bar) +- Wofi (application launcher) +- Dunst (notifications) +- Hyprpaper/SWWW (wallpapers) + +### Terminal & Shell +- Kitty & Alacritty terminals +- Zsh with Oh-My-Zsh +- Modern CLI tools (eza, bat, ripgrep, fd, fzf) + +### Applications +- Firefox browser +- VSCode editor +- Thunar file manager +- MPV media player +- And more... + +## Hyprland Keybindings + +Default modifier key: `SUPER` (Windows key) + +### Basic +- `SUPER + Return` - Launch terminal (Kitty) +- `SUPER + D` - Launch application launcher (Wofi) +- `SUPER + Q` - Close active window +- `SUPER + M` - Exit Hyprland +- `SUPER + E` - Open file manager (Thunar) +- `SUPER + V` - Toggle floating mode +- `SUPER + F` - Toggle fullscreen + +### Window Management +- `SUPER + Arrow Keys` - Move focus +- `SUPER + 1-9` - Switch to workspace +- `SUPER + SHIFT + 1-9` - Move window to workspace +- `SUPER + Mouse Left` - Move window +- `SUPER + Mouse Right` - Resize window + +### Screenshots +- `SUPER + SHIFT + S` - Screenshot selection to clipboard +- `Print` - Screenshot selection to ~/Pictures + +### Media Keys +- Volume up/down/mute +- Brightness up/down +- All media keys supported + +## Customization + +### Themes and Appearance + +The configuration uses the Catppuccin color scheme by default. To customize: + +1. **Waybar**: Edit `home/waybar.nix` - Change colors in the `style` section +2. **Hyprland**: Edit `home/hyprland.nix` - Modify colors in `general` and `decoration` sections +3. **Terminal**: Edit `home/home.nix` - Change Kitty theme and appearance + +### Wallpapers + +Place your wallpapers in `~/wallpapers/`. The default wallpaper should be `~/wallpapers/default.jpg`. + +To change wallpapers on the fly: +```bash +hyprctl hyprpaper wallpaper "monitor,~/wallpapers/your-wallpaper.jpg" +``` + +### Additional Packages + +To add more packages: + +**System-wide**: Edit `modules/system.nix` and add to `environment.systemPackages` +**User-level**: Edit `home/home.nix` and add to `home.packages` + +## Updating the System + +```bash +# Update flake inputs +nix flake update + +# Rebuild with new configuration +sudo nixos-rebuild switch --flake ~/.config/nixos#myhost + +# Or use the alias (after first build) +update +``` + +## Maintenance + +### Garbage Collection +```bash +# Remove old generations older than 7 days +sudo nix-collect-garbage --delete-older-than 7d + +# Clean home-manager generations +home-manager expire-generations -7d +``` + +### Rollback +```bash +# List generations +sudo nix-env --list-generations --profile /nix/var/nix/profiles/system + +# Rollback to previous generation +sudo nixos-rebuild switch --rollback +``` + +## Troubleshooting + +### Black screen after login +- Check if Hyprland is starting: `journalctl -xe` +- Verify graphics drivers are installed +- Check `hardware-configuration.nix` for GPU settings + +### Waybar not appearing +- Restart Waybar: `killall waybar && waybar &` +- Check logs: `journalctl --user -u waybar` + +### No audio +- Check PipeWire status: `systemctl --user status pipewire` +- Verify audio device: `wpctl status` + +### Monitor configuration +Edit `home/hyprland.nix` and adjust the `monitor` setting: +```nix +monitor = "DP-1,1920x1080@144,0x0,1"; +``` + +## Useful Commands + +```bash +# Check Hyprland version +hyprctl version + +# List all windows +hyprctl clients + +# Reload Hyprland config +hyprctl reload + +# View Hyprland logs +cat /tmp/hypr/$(ls -t /tmp/hypr/ | head -n 1)/hyprland.log +``` + +## Resources + +- [NixOS Manual](https://nixos.org/manual/nixos/stable/) +- [Home Manager Manual](https://nix-community.github.io/home-manager/) +- [Hyprland Wiki](https://wiki.hyprland.org/) +- [NixOS Wiki](https://nixos.wiki/) + +## License + +Feel free to use and modify this configuration for your own needs. diff --git a/SETUP.md b/SETUP.md new file mode 100644 index 0000000..1e51813 --- /dev/null +++ b/SETUP.md @@ -0,0 +1,149 @@ +# Quick Setup Guide + +## Initial Setup on Fresh NixOS Installation + +### Method 1: One-Line Bootstrap (Recommended) + +```bash +nix-shell -p git --run "bash <(curl -s https://git.cribdev.com/raw/YOUR-USERNAME/nixos-config/main/bootstrap.sh)" +``` + +Replace `YOUR-USERNAME` with your actual git username. + +### Method 2: Manual Setup + +1. **Install git temporarily:** + ```bash + nix-shell -p git + ``` + +2. **Clone your configuration:** + ```bash + git clone https://git.cribdev.com/YOUR-USERNAME/nixos-config ~/.config/nixos + cd ~/.config/nixos + ``` + +3. **Copy hardware configuration:** + ```bash + sudo cp /etc/nixos/hardware-configuration.nix ~/.config/nixos/ + ``` + +4. **Edit configuration files:** + - Open `flake.nix` and replace: + - `myhost` with your hostname + - `yourusername` with your username + + - Open `configuration.nix` and set: + - `networking.hostName` + - `time.timeZone` + - User account details + + - Open `home/home.nix` and set: + - Git username and email + - Any other personal preferences + +5. **Build and apply:** + ```bash + sudo nixos-rebuild switch --flake ~/.config/nixos#YOURHOSTNAME + ``` + +6. **Reboot:** + ```bash + reboot + ``` + +## Post-Installation + +### Add a Wallpaper +```bash +mkdir -p ~/wallpapers +# Copy your wallpaper to ~/wallpapers/default.jpg +``` + +### Test Hyprland +After reboot, you should be greeted with a login manager. Log in and Hyprland should start automatically. + +### Useful First Commands +```bash +# Open terminal: SUPER + Return +# Open app launcher: SUPER + D +# Open file manager: SUPER + E +``` + +## Pushing to Your Git Server + +### First Time Setup + +1. **Initialize git (if not already done):** + ```bash + cd ~/.config/nixos + git init + git add . + git commit -m "Initial NixOS configuration" + ``` + +2. **Add your remote:** + ```bash + git remote add origin https://git.cribdev.com/YOUR-USERNAME/nixos-config.git + ``` + +3. **Push to your server:** + ```bash + git push -u origin main + ``` + +### Updating Your Configuration + +After making changes: + +```bash +cd ~/.config/nixos +git add . +git commit -m "Description of changes" +git push +``` + +## Troubleshooting + +### "Hardware configuration not found" +Generate it with: +```bash +sudo nixos-generate-config --show-hardware-config > ~/.config/nixos/hardware-configuration.nix +``` + +### "Flake inputs need to be updated" +```bash +cd ~/.config/nixos +nix flake update +sudo nixos-rebuild switch --flake .#YOURHOSTNAME +``` + +### Hyprland doesn't start +Check logs: +```bash +journalctl -xe +cat /tmp/hypr/*/hyprland.log +``` + +## What You Get + +✅ Full Wayland desktop with Hyprland +✅ Beautiful animations and effects +✅ Waybar status bar +✅ Wofi application launcher +✅ Dunst notifications +✅ Screenshot tools (grim + slurp) +✅ Modern terminal (Kitty) +✅ Essential CLI tools +✅ Development environment ready +✅ Fully reproducible system + +## Next Steps + +- Customize Waybar appearance in `home/waybar.nix` +- Adjust Hyprland settings in `home/hyprland.nix` +- Add more packages in `home/home.nix` or `modules/system.nix` +- Set up your wallpapers +- Configure your applications + +Enjoy your new NixOS + Hyprland setup! 🎉 diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100644 index 0000000..268b003 --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,99 @@ +#!/usr/bin/env bash +# Bootstrap script for NixOS with Hyprland configuration +# Run this on a fresh NixOS install to pull and apply your configuration + +set -e + +echo "================================================" +echo "NixOS Hyprland Configuration Bootstrap" +echo "================================================" +echo "" + +# Configuration variables +GIT_REPO="https://git.cribdev.com/crib/nixos-config.git" +CONFIG_DIR="$HOME/.config/nixos" +HOSTNAME=$(hostname) + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +echo -e "${YELLOW}Step 1: Installing Git (if not already installed)${NC}" +if ! command -v git &> /dev/null; then + nix-shell -p git --run "echo 'Git temporarily available'" +fi + +echo "" +echo -e "${YELLOW}Step 2: Cloning configuration from ${GIT_REPO}${NC}" +if [ -d "$CONFIG_DIR" ]; then + echo -e "${RED}Configuration directory already exists at $CONFIG_DIR${NC}" + read -p "Do you want to remove it and clone fresh? (y/N): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + rm -rf "$CONFIG_DIR" + else + echo "Aborting..." + exit 1 + fi +fi + +mkdir -p "$HOME/.config" +git clone "$GIT_REPO" "$CONFIG_DIR" + +echo "" +echo -e "${YELLOW}Step 3: Copying hardware configuration${NC}" +if [ -f /etc/nixos/hardware-configuration.nix ]; then + cp /etc/nixos/hardware-configuration.nix "$CONFIG_DIR/hardware-configuration.nix" + echo -e "${GREEN}Hardware configuration copied${NC}" +else + echo -e "${RED}Warning: /etc/nixos/hardware-configuration.nix not found!${NC}" + echo "You'll need to generate it with: nixos-generate-config" +fi + +echo "" +echo -e "${YELLOW}Step 4: Updating hostname in configuration${NC}" +echo "Current hostname: $HOSTNAME" +read -p "Press enter to use this hostname, or type a new one: " NEW_HOSTNAME +if [ ! -z "$NEW_HOSTNAME" ]; then + HOSTNAME="$NEW_HOSTNAME" +fi + +# Update hostname in flake.nix and configuration.nix +sed -i "s/myhost/$HOSTNAME/g" "$CONFIG_DIR/flake.nix" +sed -i "s/myhost/$HOSTNAME/g" "$CONFIG_DIR/configuration.nix" + +echo "" +echo -e "${YELLOW}Step 5: Update username${NC}" +read -p "Enter your username: " USERNAME +sed -i "s/yourusername/$USERNAME/g" "$CONFIG_DIR/flake.nix" +sed -i "s/yourusername/$USERNAME/g" "$CONFIG_DIR/configuration.nix" +sed -i "s/yourusername/$USERNAME/g" "$CONFIG_DIR/home/home.nix" + +echo "" +echo -e "${YELLOW}Step 6: Creating wallpapers directory${NC}" +mkdir -p "$HOME/wallpapers" +echo "Place your wallpaper at ~/wallpapers/default.jpg" + +echo "" +echo -e "${GREEN}Configuration ready!${NC}" +echo "" +echo "Next steps:" +echo "1. Review the configuration files in $CONFIG_DIR" +echo "2. Edit configuration.nix to set your timezone and locale" +echo "3. Edit home/home.nix to configure your git name/email" +echo "4. Run: sudo nixos-rebuild switch --flake $CONFIG_DIR#$HOSTNAME" +echo "" +echo -e "${YELLOW}Would you like to build now? (y/N):${NC}" +read -p "" -n 1 -r +echo +if [[ $REPLY =~ ^[Yy]$ ]]; then + echo "Building NixOS configuration..." + sudo nixos-rebuild switch --flake "$CONFIG_DIR#$HOSTNAME" + echo "" + echo -e "${GREEN}Build complete! Please reboot your system.${NC}" +else + echo "You can build later with:" + echo "sudo nixos-rebuild switch --flake $CONFIG_DIR#$HOSTNAME" +fi diff --git a/configuration.nix b/configuration.nix new file mode 100644 index 0000000..b9d6ddc --- /dev/null +++ b/configuration.nix @@ -0,0 +1,51 @@ +{ config, pkgs, inputs, ... }: + +{ + imports = [ + ./hardware-configuration.nix + ./modules/system.nix + ./modules/hyprland.nix + ]; + + # Bootloader + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + + # Networking + networking.hostName = "myhost"; # Change this to your hostname + networking.networkmanager.enable = true; + + # Time zone + time.timeZone = "Europe/Oslo"; # Adjust to your timezone + + # Locale + i18n.defaultLocale = "en_US.UTF-8"; + i18n.extraLocaleSettings = { + LC_ADDRESS = "nb_NO.UTF-8"; + LC_IDENTIFICATION = "nb_NO.UTF-8"; + LC_MEASUREMENT = "nb_NO.UTF-8"; + LC_MONETARY = "nb_NO.UTF-8"; + LC_NAME = "nb_NO.UTF-8"; + LC_NUMERIC = "nb_NO.UTF-8"; + LC_PAPER = "nb_NO.UTF-8"; + LC_TELEPHONE = "nb_NO.UTF-8"; + LC_TIME = "nb_NO.UTF-8"; + }; + + # Enable flakes + nix.settings.experimental-features = [ "nix-command" "flakes" ]; + + # User account + users.users.crib = { + isNormalUser = true; + description = "Your Name"; + extraGroups = [ "networkmanager" "wheel" "video" "audio" ]; + shell = pkgs.zsh; + }; + + # Allow unfree packages + nixpkgs.config.allowUnfree = true; + + # System version + system.stateVersion = "24.05"; # Don't change this +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..52de2b8 --- /dev/null +++ b/flake.nix @@ -0,0 +1,35 @@ +{ + description = "NixOS Configuration with Hyprland"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + hyprland.url = "github:hyprwm/Hyprland"; + }; + + outputs = { self, nixpkgs, home-manager, hyprland, ... }@inputs: { + nixosConfigurations = { + # Replace 'myhost' with your hostname + cribnix = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + specialArgs = { inherit inputs; }; + modules = [ + ./configuration.nix + + home-manager.nixosModules.home-manager + { + home-manager.useGlobalPkgs = true; + home-manager.useUserPackages = true; + home-manager.users.crib = import ./home/home.nix; + home-manager.extraSpecialArgs = { inherit inputs; }; + } + ]; + }; + }; + }; +} \ No newline at end of file diff --git a/hardware-configuration.nix b/hardware-configuration.nix new file mode 100644 index 0000000..6e70b89 --- /dev/null +++ b/hardware-configuration.nix @@ -0,0 +1,41 @@ +# This is a template hardware configuration file +# On a fresh install, this will be replaced by the actual hardware configuration +# generated by nixos-generate-config or copied from /etc/nixos/hardware-configuration.nix + +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + # This is a placeholder - it will be replaced during bootstrap + # Your actual hardware configuration will be generated based on your system + + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usb_storage" "sd_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = { + device = "/dev/disk/by-label/nixos"; + fsType = "ext4"; + }; + + fileSystems."/boot" = { + device = "/dev/disk/by-label/boot"; + fsType = "vfat"; + }; + + swapDevices = [ ]; + + # Enable GPU support (uncomment what matches your hardware) + # hardware.opengl.extraPackages = with pkgs; [ + # intel-media-driver # For Intel GPUs + # vaapiIntel # For Intel GPUs + # vaapiVdpau # For AMD/NVIDIA + # ]; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/home/home.nix b/home/home.nix new file mode 100644 index 0000000..6df6afb --- /dev/null +++ b/home/home.nix @@ -0,0 +1,83 @@ +{ config, pkgs, inputs, ... }: + +{ + # Home Manager needs a bit of information about you and the paths it should manage + home.username = "yourusername"; + home.homeDirectory = "/home/yourusername"; + + # Packages to install for this user + home.packages = with pkgs; [ + # Browsers + firefox + + # Communication + discord + + # Media + mpv + + # Text editors + vscode + + # Terminal tools + neofetch + + # Additional ricing tools + cava # Audio visualizer + cmatrix # Matrix effect + pipes # Animated pipes + ]; + + # Import Hyprland home config + imports = [ + ./hyprland.nix + ./waybar.nix + ]; + + # Git configuration + programs.git = { + enable = true; + userName = "crib"; + userEmail = "haugseth.martin@gmail.com"; + }; + + # ZSH configuration + programs.zsh = { + enable = true; + enableCompletion = true; + autosuggestion.enable = true; + syntaxHighlighting.enable = true; + + shellAliases = { + ll = "eza -la"; + ls = "eza"; + cat = "bat"; + vim = "nvim"; + update = "sudo nixos-rebuild switch --flake ~/.config/nixos#myhost"; + }; + + oh-my-zsh = { + enable = true; + theme = "robbyrussell"; + plugins = [ "git" "sudo" "docker" "kubectl" ]; + }; + }; + + # Kitty terminal configuration + programs.kitty = { + enable = true; + theme = "Tokyo Night"; + font.name = "JetBrainsMono Nerd Font"; + font.size = 12; + settings = { + background_opacity = "0.9"; + confirm_os_window_close = 0; + }; + }; + + # This value determines the Home Manager release + home.stateVersion = "24.05"; + + # Let Home Manager install and manage itself + programs.home-manager.enable = true; +} diff --git a/home/hyprland.nix b/home/hyprland.nix new file mode 100644 index 0000000..53db17b --- /dev/null +++ b/home/hyprland.nix @@ -0,0 +1,194 @@ +{ config, pkgs, ... }: + +{ + wayland.windowManager.hyprland = { + enable = true; + xwayland.enable = true; + + settings = { + # Monitor configuration + monitor = ",preferred,auto,1"; + + # Startup applications + exec-once = [ + "waybar" + "dunst" + "hyprpaper" + "nm-applet --indicator" + "blueman-applet" + ]; + + # Environment variables + env = [ + "XCURSOR_SIZE,24" + "QT_QPA_PLATFORMTHEME,qt5ct" + ]; + + # Input configuration + input = { + kb_layout = "us"; + follow_mouse = 1; + + touchpad = { + natural_scroll = true; + }; + + sensitivity = 0; + }; + + # General settings + general = { + gaps_in = 5; + gaps_out = 10; + border_size = 2; + "col.active_border" = "rgba(33ccffee) rgba(00ff99ee) 45deg"; + "col.inactive_border" = "rgba(595959aa)"; + + layout = "dwindle"; + + allow_tearing = false; + }; + + # Decoration + decoration = { + rounding = 10; + + blur = { + enabled = true; + size = 3; + passes = 1; + vibrancy = 0.1696; + }; + + drop_shadow = true; + shadow_range = 4; + shadow_render_power = 3; + "col.shadow" = "rgba(1a1a1aee)"; + }; + + # Animations + animations = { + enabled = true; + + bezier = "myBezier, 0.05, 0.9, 0.1, 1.05"; + + animation = [ + "windows, 1, 7, myBezier" + "windowsOut, 1, 7, default, popin 80%" + "border, 1, 10, default" + "borderangle, 1, 8, default" + "fade, 1, 7, default" + "workspaces, 1, 6, default" + ]; + }; + + # Layout + dwindle = { + pseudotile = true; + preserve_split = true; + }; + + master = { + new_status = "master"; + }; + + # Gestures + gestures = { + workspace_swipe = true; + }; + + # Misc + misc = { + force_default_wallpaper = 0; + disable_hyprland_logo = true; + }; + + # Window rules + windowrulev2 = [ + "suppressevent maximize, class:.*" + "float, class:^(pavucontrol)$" + "float, class:^(blueman-manager)$" + ]; + + # Keybindings + "$mainMod" = "SUPER"; + + bind = [ + # Program launches + "$mainMod, Return, exec, kitty" + "$mainMod, Q, killactive," + "$mainMod, M, exit," + "$mainMod, E, exec, thunar" + "$mainMod, V, togglefloating," + "$mainMod, D, exec, wofi --show drun" + "$mainMod, P, pseudo," + "$mainMod, J, togglesplit," + "$mainMod, F, fullscreen," + + # Screenshot + "$mainMod SHIFT, S, exec, grim -g \"$(slurp)\" - | wl-copy" + ", Print, exec, grim -g \"$(slurp)\" ~/Pictures/screenshot_$(date +%Y%m%d_%H%M%S).png" + + # Move focus + "$mainMod, left, movefocus, l" + "$mainMod, right, movefocus, r" + "$mainMod, up, movefocus, u" + "$mainMod, down, movefocus, d" + + # Switch workspaces + "$mainMod, 1, workspace, 1" + "$mainMod, 2, workspace, 2" + "$mainMod, 3, workspace, 3" + "$mainMod, 4, workspace, 4" + "$mainMod, 5, workspace, 5" + "$mainMod, 6, workspace, 6" + "$mainMod, 7, workspace, 7" + "$mainMod, 8, workspace, 8" + "$mainMod, 9, workspace, 9" + "$mainMod, 0, workspace, 10" + + # Move active window to workspace + "$mainMod SHIFT, 1, movetoworkspace, 1" + "$mainMod SHIFT, 2, movetoworkspace, 2" + "$mainMod SHIFT, 3, movetoworkspace, 3" + "$mainMod SHIFT, 4, movetoworkspace, 4" + "$mainMod SHIFT, 5, movetoworkspace, 5" + "$mainMod SHIFT, 6, movetoworkspace, 6" + "$mainMod SHIFT, 7, movetoworkspace, 7" + "$mainMod SHIFT, 8, movetoworkspace, 8" + "$mainMod SHIFT, 9, movetoworkspace, 9" + "$mainMod SHIFT, 0, movetoworkspace, 10" + + # Scroll through workspaces + "$mainMod, mouse_down, workspace, e+1" + "$mainMod, mouse_up, workspace, e-1" + ]; + + # Mouse bindings + bindm = [ + "$mainMod, mouse:272, movewindow" + "$mainMod, mouse:273, resizewindow" + ]; + + # Volume and brightness keys + bindel = [ + ", XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+" + ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" + ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + ", XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle" + ", XF86MonBrightnessUp, exec, brightnessctl s 10%+" + ", XF86MonBrightnessDown, exec, brightnessctl s 10%-" + ]; + }; + }; + + # Hyprpaper configuration + services.hyprpaper = { + enable = true; + settings = { + preload = [ "~/wallpapers/default.jpg" ]; + wallpaper = [ ",~/wallpapers/default.jpg" ]; + splash = false; + }; + }; +} diff --git a/home/waybar.nix b/home/waybar.nix new file mode 100644 index 0000000..45fda7c --- /dev/null +++ b/home/waybar.nix @@ -0,0 +1,175 @@ +{ config, pkgs, ... }: + +{ + programs.waybar = { + enable = true; + + settings = { + mainBar = { + layer = "top"; + position = "top"; + height = 30; + + modules-left = [ "hyprland/workspaces" "hyprland/window" ]; + modules-center = [ "clock" ]; + modules-right = [ "pulseaudio" "network" "cpu" "memory" "battery" "tray" ]; + + "hyprland/workspaces" = { + format = "{icon}"; + on-click = "activate"; + format-icons = { + "1" = "ó°ē "; + "2" = "ó°ēĒ"; + "3" = "ó°ēĪ"; + "4" = "ó°ēĶ"; + "5" = "ó°ēĻ"; + "6" = "ó°ēŠ"; + "7" = "ó°ēŽ"; + "8" = "ó°ēŪ"; + "9" = "ó°ē°"; + "10" = "ó°ŋŽ"; + }; + }; + + "hyprland/window" = { + format = "{}"; + separate-outputs = true; + }; + + clock = { + format = "󰃰 {:%H:%M}"; + format-alt = "󰃰 {:%A, %B %d, %Y (%R)}"; + tooltip-format = "{calendar}"; + calendar = { + mode = "year"; + mode-mon-col = 3; + weeks-pos = "right"; + on-scroll = 1; + format = { + months = "{}"; + days = "{}"; + weeks = "W{}"; + weekdays = "{}"; + today = "{}"; + }; + }; + }; + + pulseaudio = { + format = "{icon} {volume}%"; + format-muted = "󰝟 Muted"; + format-icons = { + headphone = ""; + hands-free = ""; + headset = ""; + phone = ""; + portable = ""; + car = ""; + default = [ "" "" "" ]; + }; + on-click = "pavucontrol"; + }; + + network = { + format-wifi = " {essid}"; + format-ethernet = "󰈀 Wired"; + format-disconnected = "ó°Ī­ Disconnected"; + tooltip-format = "{ifname} via {gwaddr}"; + tooltip-format-wifi = "{essid} ({signalStrength}%)"; + on-click = "nm-connection-editor"; + }; + + cpu = { + format = " {usage}%"; + tooltip = false; + }; + + memory = { + format = " {}%"; + tooltip-format = "RAM: {used:0.1f}G / {total:0.1f}G"; + }; + + battery = { + states = { + warning = 30; + critical = 15; + }; + format = "{icon} {capacity}%"; + format-charging = "󰂄 {capacity}%"; + format-plugged = " {capacity}%"; + format-icons = [ "󰂎" "󰁚" "ó°ŧ" "󰁞" "ó°―" "ó°ū" "ó°ŋ" "󰂀" "󰂁" "󰂂" "ó°đ" ]; + }; + + tray = { + icon-size = 18; + spacing = 10; + }; + }; + }; + + style = '' + * { + border: none; + border-radius: 0; + font-family: "JetBrainsMono Nerd Font"; + font-size: 13px; + min-height: 0; + } + + window#waybar { + background: rgba(30, 30, 46, 0.9); + color: #cdd6f4; + } + + #workspaces button { + padding: 0 10px; + color: #cdd6f4; + background: transparent; + border-bottom: 3px solid transparent; + } + + #workspaces button.active { + color: #89b4fa; + border-bottom: 3px solid #89b4fa; + } + + #workspaces button:hover { + background: rgba(137, 180, 250, 0.2); + } + + #window { + margin: 0 10px; + color: #cdd6f4; + } + + #clock, + #battery, + #cpu, + #memory, + #network, + #pulseaudio, + #tray { + padding: 0 10px; + margin: 0 2px; + background: rgba(49, 50, 68, 0.8); + border-radius: 5px; + } + + #battery.charging { + color: #a6e3a1; + } + + #battery.warning:not(.charging) { + color: #f9e2af; + } + + #battery.critical:not(.charging) { + color: #f38ba8; + } + + #pulseaudio.muted { + color: #f38ba8; + } + ''; + }; +} diff --git a/modules/hyprland.nix b/modules/hyprland.nix new file mode 100644 index 0000000..4152233 --- /dev/null +++ b/modules/hyprland.nix @@ -0,0 +1,79 @@ +{ config, pkgs, inputs, ... }: + +{ + # Import Hyprland module + imports = [ inputs.hyprland.nixosModules.default ]; + + # Enable Hyprland + programs.hyprland = { + enable = true; + xwayland.enable = true; + }; + + # Hyprland-related packages + environment.systemPackages = with pkgs; [ + # Core Hyprland tools + hyprpaper # Wallpaper utility + hyprpicker # Color picker + hypridle # Idle daemon + hyprlock # Screen locker + + # Wayland essentials + waybar # Status bar + wofi # Application launcher + dunst # Notification daemon + swww # Wallpaper daemon (alternative to hyprpaper) + + # Screenshot and recording + grim # Screenshot tool + slurp # Region selector + wl-clipboard # Clipboard utilities + + # File manager + thunar + + # Image viewer + imv + + # PDF viewer + zathura + + # Audio control + pavucontrol + + # Network management + networkmanagerapplet + + # Brightness control + brightnessctl + + # Additional tools for ricing + jq # JSON processor (for scripts) + socat # Socket tools + wlogout # Logout menu + nwg-look # GTK theme config + qt5ct # Qt5 config + qt6ct # Qt6 config + ]; + + # Enable XDG Desktop Portal for Hyprland + xdg.portal = { + enable = true; + extraPortals = with pkgs; [ + xdg-desktop-portal-hyprland + xdg-desktop-portal-gtk + ]; + }; + + # Security - for screen locking + security.pam.services.hyprlock = {}; + + # Fonts for better UI + fonts.packages = with pkgs; [ + noto-fonts + noto-fonts-cjk + noto-fonts-emoji + font-awesome + (nerdfonts.override { fonts = [ "JetBrainsMono" "FiraCode" "DroidSansMono" ]; }) + ]; +} diff --git a/modules/system.nix b/modules/system.nix new file mode 100644 index 0000000..2604e2d --- /dev/null +++ b/modules/system.nix @@ -0,0 +1,89 @@ +{ config, pkgs, ... }: + +{ + # Essential system packages + environment.systemPackages = with pkgs; [ + # System utilities + wget + curl + git + vim + neovim + htop + btop + killall + unzip + zip + p7zip + + # Network tools + networkmanagerapplet + + # File managers + ranger + lf + + # Terminal + kitty + alacritty + + # Shell + zsh + oh-my-zsh + + # Development + gcc + gnumake + cmake + + # Misc utilities + ripgrep + fd + fzf + bat + eza + tldr + tree + ]; + + # Enable sound + sound.enable = true; + hardware.pulseaudio.enable = false; + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + jack.enable = true; + }; + + # Enable CUPS for printing + services.printing.enable = true; + + # Enable OpenGL + hardware.opengl = { + enable = true; + driSupport = true; + driSupport32Bit = true; + }; + + # Enable Bluetooth + hardware.bluetooth.enable = true; + services.blueman.enable = true; + + # Enable SSH + services.openssh.enable = true; + + # Enable ZSH + programs.zsh.enable = true; + + # Enable dconf (required for some applications) + programs.dconf.enable = true; + + # XDG portals for Wayland + xdg.portal = { + enable = true; + extraPortals = [ pkgs.xdg-desktop-portal-gtk ]; + }; +}