Case study / Developer environments
Make the setup repeatable.
Give engineers their time back.
- Problem
- Technical workstation setup took roughly a week, and troubleshooting repeatedly pulled in other engineers.
- My contribution
- I built Ansible automation for toolchains, machine configuration, applications, databases, and development data.
- What changed
- Engineers could run a shared setup instead of reconstructing the environment manually. It remained in use throughout my time at Volt.
- Outcome
- Technical setup: ~1 week → under 20 minutes, observed repeatedly on the team’s similar MacBooks. External accounts and permissions excluded.
The broader platform and developer-experience effort also reduced time to first PR from roughly one week to roughly one day.
01 / The repeated problem
One setup problem.
Two engineers interrupted.
Volt’s polyglot system required compatible language tooling, PostgreSQL, Redis, Docker, AWS tooling, and dependencies. Getting a workstation ready could take approximately a week.
When something failed, the next step was often another developer: “How did you get this working?” or “What does node --version give you?” The problem consumed two people’s attention, and the answer could remain in that conversation for the next engineer to rediscover.
Older utility repositories made the dependency on individual machines especially visible. An ad-hoc customer request could end up with whichever developer still had the project working locally. Tribal knowledge had become part of the engineering system.
02 / What I built
Put the setup knowledge into automation.
I used Ansible to configure developer workstations. Starting with a new Mac and a small number of initial preferences, a developer could run the setup instead of reconstructing the environment manually.
Getting the tools installed was only the beginning. Toolchain versions and architecture compatibility had to line up before application setup could work.
- Prepare the runtime and database. Configure toolchains, initialize PostgreSQL, create the required users, and build and enable the PLV8 extension.
- Prepare the applications. Check out repositories, install application dependencies, and run application setup.
- Make the environment usable. Restore development data and configure and start the supporting PostgreSQL, Redis, and nginx services.
Conceptual setup flow
- New Mac and initial preferences
- Run the Ansible setup
- Technically configured development environment
03 / Observed result
~1 week → <20 minutes
An automation project that kept working.
The implementation remained in use throughout my time at Volt. The scope was the workstation and the software needed to work with the system.
It was one of my most successful projects. The useful result was straightforward: engineers no longer had to perform the same manual technical setup before they could work on the system.
04 / Maintenance & lessons
Successful automation still needs care.
As this particular Ansible implementation grew, I encountered complexity around procedural configuration and idempotency: making changes reliable across existing machine states and repeated runs took care.
I also wanted consistency without controlling irrelevant choices. Runtime versions and dependencies mattered to the system. Whether a developer preferred Vim or Emacs did not. The platform should own what must be consistent and preserve autonomy elsewhere.
05 / Beyond workstation setup
The workstation and the project are different scopes.
I used nix-darwin and Home Manager for my personal workstation configuration at Volt and loved it. Separately, I built Nix project environments in the monorepo that the whole engineering team used.
That work addressed moving between projects, loading configuration, running services, and producing Linux builds.