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.
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
- My infra repository - Complete NixOS and Home Manager configurations
- Blog posts about Nix
- Blog posts about Neovim
- Talks and presentations
Inspired by uses.tech - a collection of /uses pages from various developers.