
/ 6 min read
Designing a Linux-First Development Workflow
Why Linux-First?
After years of experimenting with different development environments, I’ve settled on a Linux-first workflow that prioritizes speed, keyboard-driven navigation, and minimal distractions. This setup has transformed how I code, making context switching nearly instant and keeping me in the flow state longer.
The Stack
My development environment is built on four core components:
- Hyprland - Dynamic tiling Wayland compositor
- Ghostty - GPU-accelerated terminal emulator
- tmux - Terminal multiplexer for session management
- Neovim - Modal text editor with Lazy.nvim plugin manager
Hyprland: The Foundation
Hyprland is a dynamic tiling Wayland compositor that provides smooth animations, powerful window management, and extensive customization. Unlike traditional desktop environments, Hyprland is keyboard-first by design.
Why Hyprland?
- Tiling by default - Windows automatically organize themselves
- Wayland native - Better performance and security than X11
- Smooth animations - Makes window management feel natural
- Highly configurable - Every keybinding and behavior is customizable
Key Features I Use
# Workspace switching (Super + 1-9)bind = SUPER, 1, workspace, 1bind = SUPER, 2, workspace, 2
# Move windows between workspacesbind = SUPER SHIFT, 1, movetoworkspace, 1
# Window focus (Vim-style)bind = SUPER, h, movefocus, lbind = SUPER, l, movefocus, rbind = SUPER, k, movefocus, ubind = SUPER, j, movefocus, dI organize workspaces by context:
- Workspace 1: Code (Neovim + tmux)
- Workspace 2: Browser (documentation, testing)
- Workspace 3: Communication (Discord, Matrix)
- Workspace 4: System monitoring
Ghostty: The Terminal
Ghostty is a GPU-accelerated terminal emulator that’s blazingly fast and highly configurable. It handles rendering with ease, even with complex tmux layouts and Neovim UI elements.
Why Ghostty?
- GPU acceleration - Smooth scrolling and rendering
- Native performance - Written in Zig for speed
- True color support - Beautiful syntax highlighting
- Ligature support - Programming fonts look great
Configuration Highlights
# Font configurationfont-family = "JetBrainsMono Nerd Font"font-size = 12
# Themetheme = "catppuccin-mocha"
# Performanceshell-integration = truetmux: Session Management
tmux is the glue that holds my terminal workflow together. It provides session persistence, window management, and the ability to detach/reattach sessions.
My tmux Workflow
# Create project-specific sessionstmux new -s project-name
# Split panes for different tasksCtrl-b % # Vertical splitCtrl-b " # Horizontal split
# Navigate panes (Vim-style)Ctrl-b h/j/k/lKey Configuration
# Remap prefix to Ctrl-aset -g prefix C-aunbind C-b
# Enable mouse supportset -g mouse on
# Start windows at 1, not 0set -g base-index 1setw -g pane-base-index 1
# Vi mode for copysetw -g mode-keys viI use tmux sessions for different projects, making it easy to switch contexts without losing my place.
Neovim: The Editor
Neovim with Lazy.nvim is the heart of my development workflow. It’s fast, extensible, and once you learn the keybindings, incredibly efficient.
Why Neovim + Lazy.nvim?
- Modal editing - Different modes for different tasks
- Lazy loading - Plugins load only when needed
- LSP integration - Native language server support
- Extensible - Lua configuration is powerful and fast
- Community - Massive plugin ecosystem
Essential Plugins
-- Plugin managerrequire("lazy").setup({ -- File explorer "nvim-tree/nvim-tree.lua",
-- Fuzzy finder "nvim-telescope/telescope.nvim",
-- LSP configuration "neovim/nvim-lspconfig",
-- Autocompletion "hrsh7th/nvim-cmp",
-- Syntax highlighting "nvim-treesitter/nvim-treesitter",
-- Git integration "lewis6991/gitsigns.nvim",
-- Status line "nvim-lualine/lualine.nvim",})My Workflow
- Open project -
nvim .in project root - Find files -
<leader>ff(Telescope) - Search text -
<leader>fg(Telescope grep) - Navigate code - LSP go-to-definition, references
- Git operations - Gitsigns for hunks, Fugitive for commits
Dotfiles Management with GNU Stow
The secret to maintaining this setup across multiple machines and distros is GNU Stow. It’s a symlink farm manager that makes dotfiles management trivial.
Why Stow?
- Simple - Just symlinks, no complex scripts
- Selective - Install only what you need
- Reversible - Easy to unstow configurations
- Distro-agnostic - Works everywhere
My Dotfiles Structure
~/dotfiles/├── hyprland/│ └── .config/│ └── hypr/├── ghostty/│ └── .config/│ └── ghostty/├── tmux/│ └── .tmux.conf├── nvim/│ └── .config/│ └── nvim/├── zsh/│ └── .zshrc└── scripts/ └── scripts/Using Stow
Install configurations:
cd ~/dotfiles
# Install specific configstow nvimstow tmuxstow hyprland
# Install everythingstow */Remove configurations:
# Remove specific configstow -D nvim
# Remove everythingstow -D */Distro Hopping Made Easy
When switching distros, my setup process is:
- Install base system
- Clone dotfiles -
git clone https://github.com/bhavesh-7/dotfiles ~/dotfiles - Install dependencies - Hyprland, Neovim, tmux, Ghostty, stow
- Stow configs -
cd ~/dotfiles && stow */ - Done - Fully configured environment in minutes
No manual copying, no broken symlinks, no missing configs. Everything just works.
The Complete Workflow
Here’s how it all comes together:
- Boot into Hyprland - Instant login to tiling compositor
- Launch Ghostty - GPU-accelerated terminal
- Start tmux session -
tmux new -s project - Open Neovim -
nvim .in project directory - Code - Everything is keyboard-driven, no mouse needed
Typical Development Session
# Create new project sessiontmux new -s myproject
# Split terminalCtrl-a % # Vertical split for code + terminal
# Left pane: Neovimnvim .
# Right pane: Development servernpm run dev
# Switch between panes with Ctrl-a h/l# Switch workspaces with Super + 1-9# Everything stays running, even if I disconnectBenefits of This Setup
Speed
- No mouse - Keyboard navigation is faster
- Instant context switching - Workspaces and tmux sessions
- Fast startup - Everything loads in milliseconds
- GPU acceleration - Smooth rendering everywhere
Focus
- Minimal distractions - No notification popups or animations
- Full screen - Tiling maximizes screen real estate
- Single task - One workspace, one focus
- Flow state - Stay in the zone longer
Portability
- Dotfiles in git - Version controlled configuration
- Stow for deployment - Install anywhere in seconds
- Distro agnostic - Works on Fedora, Arch, Ubuntu, Debian
- Session persistence - tmux keeps everything running
Getting Started
Want to try this workflow? Here’s how:
1. Install Dependencies
# Fedorasudo dnf install hyprland neovim tmux stow
# Archsudo pacman -S hyprland neovim tmux stow
# Ubuntu (Hyprland requires PPA or build from source)sudo apt install neovim tmux stow2. Install Ghostty
Follow instructions at ghostty.org
3. Clone My Dotfiles
git clone https://github.com/bhavesh-7/dotfiles ~/dotfilescd ~/dotfiles4. Stow Configurations
# Start with basicsstow zshstow tmuxstow nvim
# Add Hyprland when readystow hyprland5. Learn the Keybindings
- Hyprland - Super key for everything
- tmux - Ctrl-a prefix (or Ctrl-b default)
- Neovim - Start with
vimtutor, then customize
Tips for Beginners
- Start small - Don’t install everything at once
- Learn one tool - Master tmux before adding Neovim
- Customize gradually - Copy configs, then modify
- Use cheatsheets - Keep keybindings handy
- Be patient - Modal editing has a learning curve
Conclusion
This Linux-first workflow has made me a faster, more focused developer. The keyboard-driven nature keeps me in flow, the tiling window manager maximizes screen space, and the dotfiles management with Stow makes it portable across machines.
If you’re tired of slow, mouse-heavy development environments, give this setup a try. It takes time to learn, but the productivity gains are worth it.
Resources
This entire blog post was written in Neovim, inside tmux, running in Ghostty, on Hyprland. The workflow works.