Post

Personal Desktop Documentation

Personal Desktop Documentation

Overview

This post documents my personal desktop setup. It’s divided into two main sections:

Why I Switched and What I Learned

  • Why I switched from Windows to Linux
  • How I made the transition
  • My reflections after the switch

My Workflow in NixOS

  • How I set up my environment
  • The software and tools I use in my daily workflow

Quick note: My desktop is a Dell with an RTX 3060 Ti, 64GB RAM, an Intel i7-11700 (the slowest part of my rig), and a 1TB NVMe SSD.


Switching to Linux

Why I Switched from Windows

I was a Windows user for as long as I can remember. It was familiar and convenient, but over time I felt increasingly boxed in. Windows felt bloated: I never knew exactly where my data lived, why RAM usage was so high at idle, or why so many background processes were running.

As I dove deeper into coding, I wanted more control over my system, both to learn my environment and to boost my productivity. I realized that my development setup is a key part of my workflow, and understanding it could benefit me not just now but also in the future, especially if I start my own projects or even a company.

In short, I switched to Linux to reduce bloat, gain control, and truly understand the environment I work in.

How I Made the Switch

I started with Arch Linux. It was straightforward to install, clean, and gave me the flexibility I wanted. But soon I wanted something even more customizable, something that let me version-control my entire system and share it easily.

That’s when I found NixOS. With NixOS, my entire system configuration lives in code, stored on GitHub, making it both reproducible and portable. It also means that if I ever need to reinstall, I can rebuild my system in minutes. I won’t go into the details of installing NixOS (there are plenty of great guides online), but in Part 2, I’ll cover how I set up my environment and the software I use.

Reflections

Was it worth it? Absolutely, though it took an entire month to get everything dialed in. My goal was to set up my system once and leave it alone, and I’ve mostly succeeded. Not only has it made me more productive and secure, knowing my config is backed up and reproducible, but it’s also given me a deeper understanding of how computers and open-source communities work.

One unexpected benefit of installing each piece of software manually is that I truly learned how to use each tool, how it works under the hood, and even how I might recreate it myself someday. Working with config files taught me that, at its core, everything is a file: from terminal history and shell usage to how my custom clipboard manager (Clipse) stores everything I copy in a file and retrieves it on demand. It made me understand how processes interact, how an LSP (Language Server Protocol) works, and how to design a project for others to use, whether open-source or a product I’m preparing for a client.

It’s eye-opening to see how much the world relies on open-source software. I also realized that open-source can be a business model in itself. This sparked my interest in licenses, monetization strategies, and how projects like Linus’s or others have turned open-source into viable businesses. Now, I see opportunities I hadn’t noticed before, maybe even ideas for my own projects, whether open-source or not.

After one month of experimenting with my OS setup for my desktop, I can confidently say that I’ve found the system that works for me, and I’m done switching. Now, it’s time to focus on building software, not just tinkering with the tools. You should do the same: pick your setup, master it, and start creating.


My Workflow in NixOS

So I’m just going to list the software I use and why or what it does for me.

First, for system software:

  • VSCode — I keep this around in case my main editor can’t handle certain tasks. I use it mostly for debugging or occasionally for extensions, but it’s just a backup tool.
  • Pipewire — My sound server that lets me route audio between apps and devices. It works great on NixOS, and honestly, the sound even feels better than on Windows.
  • Hyprland — My dynamic tiling window manager. It’s fast, customizable, and lets me manage workspaces and windows efficiently. I’ve customized keybindings and themes to match my style.

Second, for user software:

  • btop — A modern resource monitor with a sleek UI. I use it to check CPU, RAM, and disk usage quickly.
  • clipse — My custom clipboard manager. It stores everything I copy in a file and lets me recall it instantly.
  • imv — A lightweight image viewer that’s fast and simple.
  • mpv — A media player that can handle pretty much anything I throw at it.
  • fish — My main shell. It’s fast, user-friendly, and has excellent autocompletion.
  • rclone (gdrive) — For syncing my files with Google Drive.
  • git — My go-to tool for version control and managing my code.
  • gtk — For customizing the look of GTK-based apps to match my theme.
  • kitty — My terminal emulator. GPU-accelerated, fast, and supports ligatures.
  • librewolf — My privacy-focused browser, based on Firefox.
  • neovim (nvf) — My main code editor. Lightweight, extensible, and highly customizable.
  • rofi — My app launcher. Keyboard-driven and super customizable.
  • starship — My terminal prompt. It’s minimal and shows useful info like Git branches, etc. Make everything look nice and clean.
  • swww — A lightweight tool to manage background images, integrates seamlessly with Hyprland.

Hyprland-specific user software:

  • hyprshot — A screenshot utility for quick captures with support for selecting regions and uploading.
  • hyprlock — A simple and sleek lock screen, which I use with greetd for login management.
  • hypridle — Handles idle time detection and hooks for things like screen dimming or locking.
  • hyprpicker — Lets me pick colors from anywhere on the screen, great for design and theming.
  • hyprpolkitagent — A polkit authentication agent for managing permissions on the desktop.
  • swaync — My notification daemon. Handles notifications in a clean and consistent way.
  • uwsm (Universal Wayland Session Manager) — A lightweight Wayland session manager that helps coordinate login and session management. For example, it lets me safely reboot the system or exit an application gracefully once I’ve attached it to a session, ensuring a clean environment every time.

Neovim Setup

Neovim is a cornerstone of my workflow, a highly customizable, efficient editor that scales with my needs. Whether I’m doing quick edits or deep coding sessions, Neovim adapts seamlessly.

To keep things organized and optimized, I maintain two distinct Neovim configurations, each designed for different contexts and levels of usage:

  1. Base Config This setup is for quick, lightweight editing tasks, when I just need a fast, no-frills editor that’s more powerful than nano but without extra distractions or complexity.

  2. Advanced Config This is my full-featured development environment that replaces heavier editors like VSCode. It includes custom plugins, sophisticated keybindings, language server integrations, debugging tools, and more, everything I need for productive coding.

Base Config

My base config focuses on simplicity and efficiency. It enables essential features like syntax highlighting, relative line numbers, and clipboard integration. Tabs are set to 2 spaces with soft tab stops, and autoindentation is enabled to keep editing smooth.

Keybindings are adjusted to use j, k, l, and ; instead of the traditional h, j, k, l for cursor movement, which feels more natural for my typing style.

The only inconvenience with moving to jkl; is that most other software defaults to the standard hjkl keys. For example, my clipboard manager doesn’t support custom keybindings properly because its config is broken (open source, after all :D). So for that, I have to stick to using hjkl or, more often, just the arrow keys. Despite this, I find jkl; faster overall for editing within Neovim.

The configuration includes:

  • LSP enabled with automatic formatting on save.
  • Support for filetype-specific formatting (e.g., Prettierd for JS/TS).
  • A clean and stylish Catppuccin theme with a transparent background.
  • Git integration with gitsigns for inline version control.
  • A statusline powered by lualine reflecting the current mode and Git status.

This setup avoids extra plugins or heavy customizations, making it lightweight and ready for quick edits or script tweaking.

Advanced Config

This setup builds on everything in the base config plus adds a comprehensive suite of plugins and tools to enhance development productivity, diagnostics, language support, debugging, and workflow management.

Language Support & Formatting:

  • Treesitter is enabled for robust syntax highlighting, indentation, and incremental parsing with support for multiple languages including C/C++ (clang), HTML, CSS (formatted via prettierd), TypeScript (also formatted and linted with eslint_d), Lua (using stylua), Python, Bash, SQL, Java, Kotlin, Typst (a markup language alternative), and Go. Rust and Zig support are disabled but can be enabled as needed.
  • This ensures accurate and up-to-date code analysis, formatting, and highlighting across a broad range of languages, improving readability and maintainability.

LSP and Diagnostics:

  • Language Server Protocol (LSP) support is extended with features like Trouble.nvim for a better diagnostics list, and utilities like nvim-docs-view and otter-nvim to enhance documentation and code understanding.
  • Diagnostics are enhanced via nvim-lint with linting after save, providing immediate feedback on code quality. Diagnostic display is customized with underlines, signs, and virtual text that formats messages neatly.

Debugging:

  • nvim-dap with UI enabled and auto-start ensures a powerful debugging experience right inside Neovim, allowing you to set breakpoints, step through code, and inspect variables interactively.

Code Assistance:

  • GitHub Copilot is enabled to provide AI-assisted code suggestions with inline completions and a suggestion panel, tailored for smoother coding workflows and faster prototyping.
  • However, the traditional nvim-cmp completion plugin is disabled in favor of the lighter blink-cmp for autocompletion, balancing assistance with performance.

Git and Version Control:

  • Integration with gitsigns and diffview-nvim lets you view inline git changes and file histories directly in the editor, speeding up code reviews and version management.

Project Management & Navigation:

  • project-nvim keeps track of your workspace projects for quick switching and management.
  • harpoon plugin helps you quickly navigate between frequently used files, improving workflow efficiency.

UI and Visuals:

  • The setup includes UI enhancements like nvim-web-devicons for filetype icons and fidget-nvim to show LSP progress indicators unobtrusively.
  • Colorizer is enabled to highlight color codes in files (CSS, Tailwind, etc.) with live updates and multiple color formats supported, making visual debugging easier.

Search & File Management:

  • Telescope provides an extensive fuzzy finder for files, projects, live grep, and todo comments, with custom ignore patterns to keep results relevant and fast.

Utility Plugins:

  • todo-comments.nvim highlights and searches TODO and similar annotations for better task tracking.
  • comment-nvim offers efficient commenting support with toggles for lines and blocks, helping keep code readable and organized.

I’ve documented all my keybinds for both hyprland and neovim in this article.

This post is licensed under CC BY 4.0 by the author.