Sam's Blog
Setting Up My Minimalist Programming Environment (2025 Edition)
13 min read
Share:

Setting Up My Minimalist Programming Environment (2025 Edition)

A detailed walkthrough of my minimalist programming setup for 2025, focusing on efficiency, speed, and simplicity.

In the bustling world of IT, the concept of a minimalist programmer stands out as a rarity. Being a minimalist programmer is a rare but rewarding path. Most developers surround themselves with an arsenal of tools, gadgets, and applications, thinking that more options lead to better results. But often, too many choices can complicate things. When everything is on the table, deciding what’s best becomes overwhelming—a classic case of decision fatigue. That’s where minimalism steps in. It’s not about rigid rules or restrictions; it’s a mindset. Being minimalist means focusing on what you truly need, appreciating what you have, and letting go of unnecessary clutter. This approach isn’t just about simplifying your work—it makes life less stressful and more enjoyable.

As a programmer, my journey with minimalism naturally extends to my development environment. I’ve worked with both macOS and Linux, but Linux has always been my go-to. After years of using it, I’ve found Linux to be the most powerful, flexible, and user-friendly operating system out there. It’s not that other operating systems don’t work—they do. But Linux offers something unique. It’s open-source, secure, highly customizable, and backed by a passionate global community. Whether you’re a beginner or an experienced developer, Linux has something for everyone. Linux excels at getting things done efficiently. It’s perfect for competitive programming, business applications, and everything in between. Its strength lies in its simplicity—it gives you just the tools you need and lets you customize the rest. No unnecessary distractions, just pure functionality.

For me, Linux embodies the essence of minimalism. It strips away the excess and focuses on efficiency, allowing me to streamline my workflow and eliminate distractions. In a field where complexity often gets in the way, Linux simplifies the process, letting me stay productive and focused on what truly matters. Minimalism as a programmer isn’t about doing less—it’s about doing more with less. By focusing on the essentials—both in tools and mindset—you can work smarter, achieve more, and enjoy a stress-free approach to problem-solving.

In this blog post, I’ll share my minimalist programming setup, breaking it into two key areas: CLI (Command-Line Interface) tools and GUI (Graphical User Interface) applications. Each tool I use has a purpose and plays a crucial role in keeping my workflow efficient and distraction-free. Let’s explore how a minimalist approach, paired with a powerful tech stack, can enhance productivity and create a clean, distraction-free environment for your work.


The Hardware and Operating System

At the core of my minimalist setup is the System76 Lemur Pro, a lightweight yet powerful laptop designed with developers in mind. I primarily run Pop!_OS, a Linux distribution optimized for productivity, but I also work with Arch Linux from time to time, especially with a custom Hyprland setup. Pop!_OS provides a seamless and stable experience, perfectly balancing performance and ease of use. It boasts a clean and intuitive interface, alongside exceptional hardware integration, making it my go-to operating system for day-to-day development work.

Why Pop!_OS?
Pop!_OS is made for developers who want an efficient, streamlined experience. It comes preloaded with a wide range of development tools, and its intuitive interface keeps everything organized. The most compelling feature for me is its tiling window manager, which enables me to keep my workspace organized without the clutter of traditional window management. It’s a minimalist’s dream—providing just what’s needed to work efficiently without any unnecessary distractions.

While I do occasionally switch to my MacBook Pro M1 running macOS for certain tasks, the System76 Lemur Pro with Pop!_OS remains my primary machine for development.


First Boot of Pop!_OS

After installing Pop!_OS, the first step is to check for available updates to ensure your system is up-to-date with the latest software and security patches. You can either use the Software Updater tool or the Terminal for this process. If you’re new to the terminal, I recommend using it as it’s an efficient way to handle updates.

To check for updates using the terminal, run the following command:

sudo apt-get update && sudo apt-get upgrade

You will be prompted to enter your user password to begin the update process. Once entered, the updates will begin installing, and the duration will vary depending on your system’s configuration and the number of updates.


Removing Unnecessary Packages

When you opt for the “Normal Installation” during the Pop!_OS setup, it can result in the installation of some unneeded packages, including basic games and other software you might not require. While many unnecessary programs were removed in Pop!_OS 20.04, there are still a few lingering around. To get rid of them, you can use the following command:

sudo apt purge gnome-sudoku* gnome-mines* gnome-mahjongg* aisleriot* --auto-remove

If you don’t want to remove specific software from this list, simply omit it from the command. Keep in mind that certain applications on Ubuntu can be completely redundant. For instance, many users dislike Snap and prefer to remove it from their system entirely. If you’re also looking to remove and block Snap from Ubuntu, check out my article on how to do so.

This guide is helpful if you’re looking to clean up and fine-tune your Ubuntu setup. It’s common for users to wonder what steps to take after installing a new operating system, and this article can guide you through the essential changes for an optimized Ubuntu experience.


Installing Essential Packages

For various programming tasks, certain essential packages are necessary. You can install these packages manually using terminal commands, or you can save time by running a bash script that installs them all at once.

Here’s a bash script to help you install multiple packages at once:

#!/bin/bash
sudo apt-get -y update
sudo apt-get -y upgrade

# Install necessary packages
sudo apt-get install -y libcurl4-openssl-dev
sudo apt-get install -y libssl-dev
sudo apt-get install -y curl
sudo apt-get install -y git
sudo apt-get install -y nodejs
sudo apt-get install -y npm
sudo apt-get install -y mlocate
sudo apt-get install -y apt-transport-https
sudo apt-get install -y make
sudo apt-get install -y default-jre
sudo apt-get install -y ruby-full
sudo apt-get install -y libxml2 libxml2-dev libxslt1-dev ruby-dev build-essential libgmp-dev zlib1g-dev libffi-dev python-dev python-setuptools libldns-dev
sudo apt-get install -y python3-pip
sudo apt-get install -y python-pip
sudo apt-get install -y openssh-server

# Completion message
echo -e "\n\n\n\n\n\n\n\n\n\n\nDone! All tools are set up in ~/tools"
echo "Copy the script and name it whatever.sh. Thank you!"

To run this script:

  1. First, give it permission to execute:

    chmod +x whatever.sh
  2. Then execute it:

    ./whatever.sh

This will automatically install all the essential packages you need for your development environment. You can also modify the script to suit your needs by removing any packages you don’t want to install.

This script is an efficient way to get up and running with the essential tools, but if you prefer to install them manually or skip certain packages, feel free to modify it according to your preferences.


Other CLI Tools I Use

1. stow

Why stow?
stow is a symlink farm manager that simplifies dotfile management across multiple machines. I use it to keep my configuration files (e.g., NeoVim, tmux, git) in sync and version-controlled.

Installation:

sudo apt-get install stow

2. procs

Why procs?
procs is a modern replacement for the ps command. It provides a clean, color-coded interface for monitoring system processes. I use it to keep an eye on resource usage and manage running processes efficiently.

Installation:

sudo apt-get install procs

3. tokei

Why tokei?
tokei is a code analysis tool that counts lines of code, comments, and blanks in a project. It’s a quick way to assess the size and complexity of a codebase, which is helpful for tracking progress and identifying areas for refactoring.

Installation:

sudo apt-get install tokei

4. lsd

Why lsd?
lsd is a modern replacement for the ls command. It provides colorful, icon-rich file listings, making it easier to navigate directories at a glance. It’s a small but impactful upgrade to my workflow.

Installation:

sudo apt-get install lsd

5. ripgrep

Why ripgrep?
ripgrep is a recursive text search tool that’s faster and more efficient than traditional tools like grep. I use it to search through codebases and logs.

Installation:

sudo apt-get install ripgrep

6. fzf

Why fzf?
fzf (fuzzy finder) is a lightning-fast tool for searching files, directories, and commands. It’s integrated into NeoVim and tmux, allowing me to quickly navigate through large codebases and switch between sessions with ease.

Installation:

sudo apt-get install fzf

7. devtodo

Why devtodo?
devtodo is a simple command-line task manager. It helps me keep track of tasks and stay organized without needing a bulky GUI application.

Installation:

sudo apt-get install devtodo

The Text Editor: NeoVim

Why NeoVim?
For text editing, NeoVim is the only tool I use. It’s a modern version of the classic Vim—light, fast, and super customizable. With the right plugins, NeoVim becomes more than just an editor; it turns into a complete development environment.

I’ve set up NeoVim to be as simple as possible, keeping only the essential plugins and keybindings. This makes it quick and distraction-free, which is important for staying focused. The way NeoVim works, allowing me to navigate and edit text with minimal hand movement, makes it efficient and boosts my productivity. Plus, the Lua configuration makes it easy to adjust and personalize as needed.

I also create my own remaps and option setups tailored to my workflow. This ensures I can work as efficiently and fast as possible, with everything exactly where I need it.

With my minimalist setup, I can use Vim on my MBP M1 for 10–15 hours without issue. If I switch to other text editors or IDEs, I usually get only 7–9 hours of battery life. On my System76 Lemur Pro, NeoVim easily lasts for 6–7 hours. The other editors and IDEs tend to make my laptop run hotter—so much so that I could probably cook chicken or rice with all that extra heat!


The Terminal Multiplexer: tmux

Why tmux?

tmux is my terminal multiplexer of choice. It allows me to create multiple terminal sessions, split windows, and detach/reattach sessions. This is incredibly useful when working on multiple projects or when I need to switch between tasks without losing my place.

I’ve configured tmux to use a minimalist status bar, with only the essential information displayed. The keybindings are optimized for speed, and I’ve integrated it with NeoVim for a seamless workflow. For example, I can switch between NeoVim and tmux panes without leaving the keyboard, which is a huge time-saver. The ability to detach and reattach sessions is also invaluable when working remotely or on different machines, as it allows me to pick up right where I left off.


Application Launcher: ULauncher

Why ULauncher?

ULauncher is an incredibly fast and highly customizable application launcher that plays a key role in streamlining my workflow. With just a few keystrokes, I can quickly launch applications, search the web, and run commands—all from one place. It’s a productivity powerhouse that seamlessly integrates into my minimalist setup.

What I love about ULauncher is its ability to eliminate the need to dig through menus or file directories to find what I need. Whether I’m opening a tool, looking up information, or executing a command, ULauncher helps me get things done faster. This not only saves time but keeps me focused on the task at hand, without the distraction of unnecessary clicks or navigation.

The best part? ULauncher is highly customizable, so I can adjust the interface and functionality to fit my personal preferences. Whether it’s setting up custom shortcuts or tweaking the look and feel, ULauncher offers the flexibility to enhance my productivity even further. For me, it’s an essential tool that’s made a huge difference in how I work.


Web Browser: Brave

Why Brave?

Brave is my browser of choice because it’s designed for both privacy and performance. It blocks unwanted ads and trackers by default, giving me a faster, cleaner browsing experience. This not only improves page load times but also keeps my data safe without needing extra extensions or complicated setups.

One of the features I appreciate most is Brave’s built-in privacy features, like blocking third-party cookies and trackers, ensuring that my browsing habits remain private. It’s the perfect fit for my minimalist approach, as it offers a streamlined, no-fuss interface that keeps distractions at bay.

Additionally, Brave has a reward system where you can earn BAT (Basic Attention Tokens) by choosing to view privacy-respecting ads. This unique feature gives me an added incentive to use Brave while supporting creators in a way that doesn’t compromise my privacy or slow me down.

Overall, Brave combines speed, privacy, and a sleek interface, making it the ideal browser for a focused, distraction-free browsing experience.


Terminal Emulator: WezTerm

Why WezTerm?

WezTerm is a next-gen terminal emulator that stands out for its blend of speed, flexibility, and impressive performance. It draws inspiration from terminals like Alacritty and Kitty but adds a level of customization and fine-tuning that perfectly fits my minimalist setup.

What I love about WezTerm is how seamlessly it integrates into my workflow. The speed is lightning-fast, making sure there’s no lag while I’m working. Plus, it’s lightweight—without sacrificing features—and it has a highly customizable interface. I can tweak things like keybindings, fonts, and color schemes to match my preferences and create an environment that’s efficient and pleasant to work in.

The best part? WezTerm supports advanced features like ligatures (which give my code a cleaner, more readable appearance) and GPU acceleration, ensuring smooth rendering even when handling resource-intensive tasks. Whether I’m running multiple processes or dealing with heavy-duty commands, WezTerm keeps up without skipping a beat.

Overall, it’s the perfect terminal emulator for my workflow. It combines the power of modern technology with the simplicity I need, making it a vital part of my minimal, yet highly effective, setup.


Shell: Bash

Why Bash?

While shells like zsh, fish, and others have gained popularity, I’ve stuck with Bash for its simplicity, lightweight design, and broad support. It’s a shell I’m comfortable with, and I’ve tailored it to suit my needs with custom aliases, functions, and environment variables to make my workflow as smooth and efficient as possible.

Bash comes with a vast ecosystem of scripts and tools, all of which are well-documented and widely compatible. This extensive support ensures that I can work on any system—whether it’s a personal machine or a new one—without the need to learn a new shell or adjust to a new environment. It’s simple, fast, and versatile, and its familiarity allows me to get to work quickly without a steep learning curve.


Conclusion

This minimalist programming environment is the result of years of experimentation and refinement. By focusing on the essentials—both in tools and mindset—I’ve created a setup that is fast, efficient, and distraction-free. Each tool serves a specific purpose, and together, they form a cohesive and productive workflow.

As we move into 2025, this setup will continue to evolve, but the principles of minimalism and efficiency will remain at its core. By focusing on the tools that truly matter, I can ensure that my programming environment remains a powerful ally in my quest for productivity and success.