Skip to main content Skip to navigation menu

Uses

This page describes the hardware, software and services I use daily for software development, content creation, and running my business.

Last updated: 27th July 2026.

Hardware

Laptop

Lenovo ThinkPad T480

My main development machine - a ThinkPad T480 running NixOS with i3 window manager. I've been a ThinkPad user for years and appreciate their repairability, durability and Linux compatibility.

Keyboard

Keychron K2 HE Wireless Mechanical Gaming Keyboard

I'm currently using the Keychron K2 HE, a compact 84-key wireless mechanical keyboard with Gateron magnetic switches. It offers adjustable actuation points and low-latency connectivity, making it suitable for both coding and general use.

Homelab Servers

2x Lenovo ThinkCentre M710q

  • home01 - Private services (Jellyfin, Immich, Home Assistant, Paperless-ngx, Audiobookshelf)
  • home02 - Public services (Caddy reverse proxy, Forgejo, Nextcloud, PeerTube)

Both servers run NixOS and are configured declaratively via my infra repository.

Software

Operating System

NixOS with Home Manager

I use NixOS on all my machines - laptops and servers. Everything is configured declaratively using Nix, making my systems reproducible and easy to manage. My complete configuration is public in my infra repository.

Window Manager

i3

A tiling window manager that lets me organise my workspace efficiently using keyboard shortcuts. Perfect for managing multiple terminal windows, browsers, and development tools simultaneously.

Editor

Neovim (via Nixvim)

I've been a full-time Neovim user since July 2021. My configuration is written entirely in Nix using Nixvim, making it reproducible across all my machines.

Key plugins I use:

  • LSP - Phpactor (PHP), nixd (Nix), cssls/tailwindcss (CSS), ts_ls (TypeScript/JavaScript)
  • Completion - nvim-cmp with LSP, buffer, and path sources
  • Fuzzy finding - Telescope with ripgrep
  • Git - vim-fugitive, gitsigns
  • Testing - vim-test for running PHPUnit and other test frameworks
  • Formatting - none-ls with phpcbf, php-cs-fixer, prettier
  • Databases - vim-dadbod for database queries
  • HTTP - rest.nvim for API testing
  • Editing - mini.nvim suite (surround, operators, move, etc.)

Read more: How I use Neovim for writing PHP

Terminal

Alacritty with tmux

Alacritty is a GPU-accelerated terminal emulator that's fast and configurable via YAML. I use tmux for session management and splitting panes.

Shell

Zsh with custom configuration

Configured via Nix with:

  • Custom aliases and abbreviations (using zsh-abbr)
  • Starship prompt
  • fzf for fuzzy history search
  • direnv for automatic environment activation

Browser

Firefox (primary) and qutebrowser

Firefox for general browsing and qutebrowser (a keyboard-focused browser) for distraction-free reading and navigation.

Version Control

Git with Forgejo

All my repositories are self-hosted on Forgejo at git.oliverdavies.uk, with mirrors on GitHub for public projects.

Development Tools

Languages & Runtimes

  • PHP - Primary language for Drupal and general web development
  • Nix - For system configuration and package management
  • TypeScript/JavaScript - For front-end work
  • Bash/Nushell - For scripting and automation

Static Analysis & Quality Tools

  • PHPStan - Static analysis for PHP
  • PHPCS - Coding standards checking
  • Mago - Additional PHP analysis
  • Rector - Automated PHP refactoring

Testing

  • PHPUnit - PHP unit and integration testing
  • Pest - Alternative PHP testing framework
  • Behat - Behaviour-driven development

CSS Framework

Tailwind CSS

I use Tailwind CSS for most projects. I've rebuilt several UIs with Tailwind, given talks about it, and written extensively about utility-first CSS.

Static Site Generators

Sculpin (this website)

This website is built with Sculpin, a PHP-based static site generator. I've been using Sculpin since 2015 and recently added it to nixpkgs.

Containerisation

Docker and Podman

For local development and some homelab services. Docker for compatibility with common tools, Podman for rootless containers.

CI/CD

Forgejo Actions and GitHub Actions

Self-hosted CI/CD via Forgejo Actions for private projects, GitHub Actions for public open-source work.

Services & Platforms

Hosting

Self-hosted on home02 server

All my websites, Git repositories, and public services are self-hosted and exposed via Cloudflare Tunnel (no open inbound ports). Static sites are served by Caddy.

Email

Fastmail

For personal and business email with custom domains.

DNS & CDN

Cloudflare

Domain management, DNS, and Cloudflare Tunnel for secure access to self-hosted services.

Monitoring

Uptime Kuma

Self-hosted uptime monitoring for all my services.

Grafana with Prometheus and Loki

For metrics collection (via node_exporter) and log aggregation on my homelab servers.

Backups

Rsync with encrypted LUKS volumes

Nightly automated backups between homelab servers for media and important data.

Cloud Storage

Nextcloud

Self-hosted on home02 for file sync and sharing.

Password Management

Configured via Nix with agenix for secrets management across my infrastructure.

Content Creation

Podcast

Beyond Blocks - /podcast

Recording and editing details managed through self-hosted infrastructure.

Screencasts

Self-hosted on PeerTube at my instance.

Blog

This website, built with Sculpin and automatically deployed via Forgejo Actions to my Caddy server.

Presentations

rst2pdf

I write presentation slides in reStructuredText and generate PDFs using rst2pdf. The entire process is managed with Nix.

Read more: Building and presenting slide decks with rst2pdf

Agentic Engineering

AI-Assisted Development

Claude (Anthropic) via OpenCode

I've recently adopted AI-assisted development using Claude (currently Claude Sonnet 4.5) through the OpenCode CLI tool. This has become an integral part of my workflow for both my website and infrastructure repositories.

How I use it:

  • Code refactoring - Extracting reusable components, improving structure and maintainability
  • Problem-solving - Debugging complex issues, exploring different approaches
  • Documentation - Generating comprehensive docs, analysing codebases
  • Learning - Understanding new tools, libraries, and best practices
  • Automation - Creating scripts for repetitive tasks, link checking, tag analysis

Recent examples on this website:

  • Migrated 1,968 redirects from CSV to static HTML pages
  • Refactored Sculpin bundle configuration to reduce duplication
  • Created reusable card components for presentations and podcasts
  • Analysed and consolidated 274 blog post tags
  • Built broken link checker and categorised 160 issues

I treat AI as a collaborative pair programmer - it handles boilerplate, suggests improvements, and helps explore solutions whilst I maintain architectural decisions and code quality standards.

The key is using AI to augment my capabilities, not replace my judgement. I review all changes, test thoroughly, and ensure the code aligns with my preferences and project conventions.

Why This Stack?

Reproducibility

Everything is defined in code using Nix. I can rebuild any of my machines from scratch by cloning my infra repository and running nixos-rebuild. This also means I can easily test changes in virtual machines before applying them to production.

Ownership

I own my data and control my infrastructure. All my websites, Git repositories, files, photos, and media are self-hosted. This gives me complete control over my content and reduces dependence on third-party services.

Open Source

Where possible, I use and contribute to open-source software. My configurations are public, I maintain open-source projects, and I actively contribute to tools I use.

Simplicity

Despite the seemingly complex stack, Nix makes it simple. I have a single source of truth for all my configurations, and I can manage everything from laptops to servers using the same tools and patterns.

Learn More


Inspired by uses.tech - a collection of /uses pages from various developers.