My computer setup
Go to file
Lucas Dohmen 772754bf7e
Update pnpm
2023-11-30 09:10:14 +01:00
tilde Update pnpm 2023-11-30 09:10:14 +01:00
LICENSE Switch back from online accounts to nextcloud-desktop 2023-11-30 08:45:43 +01:00 Switch back from online accounts to nextcloud-desktop 2023-11-30 08:45:43 +01:00


Distro: Debian Desktop: Gnome Editor: vim Multiplexer: tmux Shell: fish

My dotfiles describe my entire computer. They contain most of the configuration of my applications (both on the command line and on the GUI), but also the setup and update process as scripts. I'm using Debian as my Linux distribution of choice. The content of tilde are the files in ~. I'm using Solarized Light as my color scheme and Martian Mono (Standard Width) as my monospace font. This is how my work environment looks like:



exogenesis is a shell script that sets up a fresh (minimal) install of Debian for me. When I run it again on an existing machine, it will add what I added since the last time I ran it and update packages. It takes care of:

  • Adding APT repositories
  • Installing and updating APT and flatpak packages
  • Linking my dotfiles
  • Setting the shell to Fish
  • Adding the user to the docker group
  • Install nix


I'm using fish as my shell. After using ZSH for many years, I noticed that it does many things I needed to configure in ZSH by default, and switched to it. The only thing I configured is that I use fzf because I really missed Ctrl+r for reverse searching and I like the incremental search.

The prompt is a tiny arrow (or a ✦ when there are jobs in the background) that is green when the last status exit was 0, and red otherwise. In the right prompt, I display the pwd and the current git status. I have a few aliases, scripts (see tilde/exe), and functions:

  • With the j function I can jump to my Code projects
  • To start or continue working on a project, I use my tiny s function which starts (or attaches to) a tmux session for a project with the correct start directory.
  • backup🐚 does the backup using borgmatic for offsite backups to BorgBase
  • battery🐚 shows the current battery status
  • churn🐚 shows the frequency of change of the files in a git repo
  • compressability🐟 shows the size of a file, and its GZIPed and brotlied size
  • decrypt-pdf🐟 removes the password from a PDF
  • each💎 calls a command for each path provided
  • electric-monk↩️ runs gitkeeper for each project (replacement for an old gem of mine)
  • exogenesis🐚 is described above, it uses the following helpers:
    • add-apt-source🐚 adds a source for apt including the key
    • add-to-groups🐚 adds the current user to a list of groups
    • change-shell🐚 changes the shell for the current user
    • install-binary🐚 installs a binary from an URL to /usr/local/bin
    • link-dotfiles🐚 links the provided paths as dotfiles in the home directory
  • gb🐟 is a prettier git branch
  • gitkeeper🐟 fetches and then checks if there is unpushed work on a repo
  • gl🐟 is a prettier git log
    • tiggy [experimental version of gl] replacement for tig
  • history-analysis💎 shows the commands that you ran most in your (fish) shell
  • l↩️ lists all files with details, ll↩️ only the visible ones
  • list-projects↩️ lists all projects in the Code directory
  • mdoutline💎 shows the outline of a Markdown document (only works correctly, if you don't use the 'underline' variant for headlines)
  • postgres🐋 and redis🐋 start a temporary PostgreSQL or Redis instance
  • serve🐋 serve the current directory via nginx
  • timestamp🐚 prints a timestamp
  • tree↩️ prints the folder structure as a tree
  • webm🐟 converts a video to WebM using ffmpeg

(↩️ is an alias. 🐚 means it is written in sh, 🐟 in fish, 💎 in Ruby. 🐋 is a thin wrapper around a container)


I'm doing all my programming and most of my writing in vim. My vim is very close to the default configuration, but I'm using tpope/vim-sensible to set a few reasonable defaults. Instead of configuring spaces, tabs and similar things, I use editorconfig to follow the convention of the projects. Additional language support is loaded on demand via sheerun/vim-polyglot.

To jump to files, I use a fuzzy file finder (junegunn/fzf) that I've bound to Ctrl+P. I use ripgrep as the source for its suggestions which pays attention to .gitignore. I can't remember the last time I opened a file without it.

I use Tim Pope plugins for commenting (tpope/vim-commentary) as well as quoting/parenthesizing (tpope/vim-surround) and make both repeatable (tpope/vim-repeat).

Finally, I'm using w0rp/ale for formatting, linting feedback and LSP support. Code is formatted automatically with prettier or a similar tool if it is available for the programming language. I show a 😺 in lines with linting errors, with details on hovering. The linters are autodetected, and I have quite a few installed. When pressing tab (and I'm not at the beginning of a line, where I actually want to insert a tab) I run the omnifunc provided by ALE to ask the according language server for a completion.


I use nix-shell basically as a really awesome version manager for Ruby, Node, Rust...

Other commandline tools

  • asciinema for recording things in the terminal
  • adr-tools for managing decision records
  • borgmatic for backups
  • brotli for compression
  • curl for HTTP shenanigans
  • direnv to load and unload environment variables depending on the current directory
  • docker and docker compose mainly to run databases and reverse proxies locally
    • trying out podman and podman-compose as a replacement
    • trying out buildah as a container builder
  • exa is a replacement for ls and tree
  • ffmpeg for converting video and audio
  • fzf as a fuzzy selector for all kinds of things
  • git (with LFS) is the only version control system I use. It has two amazing companions: tig and delta
  • gpg and scdaemon for signing commits and encrypting my backups with my YubiKey
  • htop as a replacement for top to see how my cores and RAM are doing
  • jq is like sed for JSON data, but I mostly use it for pretty printing
  • libvips for command line image manipulation (resizing, changing the format etc.)
  • ncspot to listen to music
  • neofetch for those screenshots, you know
  • pandoc to convert between Markdown and... other formats like Microsoft Word
  • pgcli to peek into PostgreSQL databases
  • qalc as a command line calculator
  • ripgrep is a replacement for grep, find and parts of sed that is so fast, that I can't really believe it
  • shellcheck to get feedback about shell scripts
  • tmux is the terminal multiplexer I use. I configured it with some more vim-like bindings and a nice status bar with the current time and battery charge.
  • wl-clipboard gives command line access to the clipboard


Even though I enjoy to use the command line for most things, there are certain things where I use a GUI 😉 The core of my GUI is Gnome (Core, but already using Loupe instead of eog).

  • Firefox: Main Browser
  • Chrome 💔:
    • The browser I use for my work collaboration tools (Google Workspace, Slack, Trello, Miro)
    • We use endpoint verification to check if all work computers are up to date which is why this needs to be Chrome...
  • Thunderbird: Personal Email & Calendar
  • kitty: Terminal Emulator
  • mpv: Play videos
  • NewsFlash: Beautiful RSS Reader - I use FreshRSS as the backend
  • Inkscape: Edit/Create Vector Images
  • tenacity: Edit/Create Sound
  • 1Password 💔: Password Management
  • Nextcloud Desktop: Sync important files
  • Boxes: Windows Emulation
  • LibreOffice: Office
  • Signal: Chat
  • Zoom 💔: Video Chat
  • gufw: GUI for configuring the firewall ufw
  • Minecraft 💔 as a nerd zen garden
  • Steam 💔 for playing Turing Complete (mostly, I play on the Switch and Xbox)

💔 is non-free software. I try to avoid it on my machine, but it is no always possible.

Programming Languages

These are the programming languages I use:

  • Ruby
  • JavaScript/TypeScript (Node, Browser or Deno)
  • CSS

I also have two years of professional experience with Go, but don't like it. Out of frustration about Go, I started playing with Rust. In general, I like to play around with different languages (like Clojure or C#), I even wrote my own little language a while ago 😄