Braxton J. Schafer

Senior Systems Engineer, DevTools ·Cloudflare

Verona, WI

I build the platforms other engineers build on, and I do my best work on messy problems. Unclear ownership? A giant migration? Weird failures that no one wants to dig into? Those are all my bread and butter.

At Cloudflare I'm leading the rebuild of how the company ships software: a net-new GitLab deployment on Kubernetes replacing Bitbucket as company-wide source control, a new CI runner orchestrator built as a Kubernetes controller, a standardized component model for pipelines, and the observability layer on top of it all. Before that I built and ran three bare-metal Kubernetes clusters of roughly 500 nodes each, which were the de facto internal platform for developers.

GitLab migration (x2!)Switching source control used by all engineers

Cloudflare · DevTools | Epic · Platform Engineer

Epic used a Subversion monorepo for all shipped code. The company had built a ton of custom tooling and systems around it and largely abstracted it away from developers.

I led the migration effort to not only convert to Git, but to stand up a brand-new cloud-native hybrid GitLab cluster scaled to support 5,000 active developers.

Cloudflare was using a singleton Bitbucket instance that couldn’t scale or be resilient. We needed something that could be resilient, highly available, and support our swift engineering organization.

I led the buildout of GitLab, fully on Kubernetes, distributed across three primary sites and built for scale.

Reimplementing GitLab's runner manager as a Kubernetes controllerA cloud-native replacement for upstream's legacy manager, in Go

Cloudflare · DevTools

The problem: GitLab’s stock runner manager was designed back in the day when your CI runner was one big server running all the time. While it doesn’t not support running jobs as Kubernetes pods, it struggles. The runner manager is one stateful app, and it fails in a wide variety of fun ways.

The design. A ground-up reimplementation in Go as a Kubernetes controller. Job capacity is handled as a first-class constraint. The reconciler resolves the legacy problem of “the manager got confused, all jobs are orphaned”. Controller restarts don’t interrupt running jobs; all jobs talk directly to GitLab now.

Monitoring CI health and failuresAlerting that tells platform failures from user error

Cloudflare · DevTools

The problem. Red pipelines are an inevitability, but telling at a glance what happened (or if there’s a bigger problem) shouldn’t have to be. If the platform doesn’t have a good feedback loop, that means that infrastructure regressions get found by annoyed engineers when things break, instead of by us.

What I built. The observability layer for the new CI platform:

  • Per-project and per-component pipeline metrics. A regression is attributed to the component that caused it instead of averaged into a platform-wide number that never moves.
  • Queue-depth and error dashboards. Capacity starvation and correctness failures look identical from a single job’s perspective and have to be separated at the fleet level.
  • Alerting that distinguishes platform failure from user-caused job failure. An alert that fires on someone’s failing test suite is worse than no alert, because it trains people to ignore the channel.
  • Health-gated rollouts of CI component changes. A bad shared component gets stopped by a health signal instead of by the volume of complaints.

Why it matters. Pretty dashboards aren’t the point. What matters is that the team can now change shared CI components at all: you can’t roll out to every pipeline in the company without a signal telling you when you’re breaking them.

CDK8S as the org-wide standard for Kubernetes infrastructureEliminating manifest duplication across clusters

Cloudflare · DevTools & Kubernetes Platform

The problem. Kubernetes YAML doesn’t compose. Run the same workload across several clusters and you end up with several near-identical manifest trees that drift apart one urgent fix at a time, until nobody can say what’s actually deployed where. Templating engines mostly move the problem into a language that’s harder to debug. Plus, who likes dealing with whitespace issues?

The approach. Drove CDK8S adoption across engineering as the standard for codifying Kubernetes infrastructure: manifests as real, typed, testable code, where shared behavior is a construct rather than a copied block, and a change lands in one place.

The hard part. Almost none of it was technical. Adoption isn’t a rollout; it’s a series of individual teams deciding the switch is worth it, so the standard has to be good enough that people choose it on their own, and the migration incremental enough that nobody has to stop shipping to do it. Most of the effort went into making the default easy, not into the abstractions.

Outcome. CDK8S is the standard for codifying Kubernetes infrastructure across engineering, and cross-cluster manifest duplication is gone.

Making AI useful for a platform teamOne source of truth for skills and agents, in any harness

Cloudflare · DevTools

AI tools took the world by storm, but they came on so suddenly that there was no cohesive design or usage for them. I noticed two main problems:

  1. Skills, agents, and config accumulates on each person’s machine, and upstream skills ended up stale.
  2. The moat between per-engineer usage and techniques was massive.

I solved the first problem by building tooling to support syncing AI configs from any Git source, and keeping them up to date. As we allowed different harnesses, it added support to keep everything in sync between any harness an engineer chose to use.

The second problem involves fostering a sharing culture. With the tooling to support sharing skills, we can then share mindset. I do this both asynchronously via frequent internal blogposts sharing tips and tricks, and synchronous sessions letting engineers share their AI-related wins and get input on their struggles.

A one-line Kubernetes fix that saved 600 hours a year600 engineer-hours a year, recovered

Cloudflare · published on the Cloudflare Blog

The symptom. Our Atlantis instance took about 30 minutes to restart. Restarts happen constantly (credential rotations, onboarding), roughly 100 times a month. Everyone had absorbed the delay as the cost of doing business and scheduled around it.

The root cause. Not Atlantis-related at all. By default, Kubernetes recursively chowns every file on a volume to match the pod’s fsGroup on each mount; on a large persistent volume, that walk causes the entire startup time. fsGroupChangePolicy has existed since Kubernetes 1.20 and takes a second value, OnRootMismatch, which checks just the root directory’s ownership and skips the walk when it already matches.

The fix. One line in the pod spec. Restarts went from ~30 minutes to ~30 seconds. At roughly 100 restarts a month that was over 50 hours of blocked engineering time every month: a little over 600 engineer-hours a year, returned by a single field.

Why it’s worth remembering. The fix was trivial, but deciding to investigate the problem is the interesting bit: noticing that a 30-minute restart had been accepted as normal, not knowing the flag. I wrote it up so the next person wouldn’t have to rediscover it.

CloudflareMar 2022 – Present · 4 yrs 6 mos
Senior Systems Engineer, DevToolsJan 2025 – Present

Leading the rebuild of company-wide CI/CD: build infrastructure, a standardized pipeline component model, observability, and artifact management.

Systems Engineer, Kubernetes PlatformMar 2022 – Dec 2024

Built and operated three bare-metal Kubernetes clusters at roughly 500 nodes each, running as the de facto internal platform.

Octospin, LLC(concurrent, contract)2020 – 2023
Software Architect

Built the backend from nothing in C# WebAPI, with development, staging, and production infrastructure on DigitalOcean managed as Terraform. Worked directly with the executive team throughout.

Epic SystemsSep 2015 – Mar 2022 · 6 yrs 6 mos
UNIX / Platform EngineerJan 2019 – Mar 2022

Ran monitoring and configuration management for thousands of Linux servers (Zabbix, Prometheus, Puppet, Ansible) and built GitOps Kubernetes infrastructure on VMware Tanzu and Flux v2. Architected the Splunk deployment and the tooling that made it usable for DevOps workflows.

A million-revision Subversion monorepo, moved to GitEpic's entire source history, migrated to hybrid-cloud GitLab

Epic Systems

The problem. Epic’s source repository was a Subversion monorepo at the million-revision scale: the accumulated history of the entire codebase, and the thing every developer used every day. Moving it meant moving everyone at once, without losing history and without a window where nobody could ship.

What made it hard. Not the conversion mechanics. A repository that old encodes years of conventions that exist only as habits: directory layouts that imply branching semantics Git has no equivalent for, tooling that shells out to svn in places nobody remembers, and a mental model of “revision” that stops being true the moment you land on Git. The hard part was everything around the data, not the data.

What I did. Architected and managed the migration onto Git hosted on hybrid-cloud GitLab, then built the DevOps tooling on the far side (GitLab, Artifactory, and Terraform) so the destination was a platform rather than just a new place to put files. It’s the same problem I’m on now at Cloudflare, one company earlier: the technical work is tractable, and the real difficulty is moving a whole organization through a change none of them asked for.

Desktop Support EngineerSep 2015 – Jan 2019

Led the Apple administration team across hundreds of Mac and iOS devices via Jamf Pro and custom tooling. Served on the Security Operations Council, recommending information security policy.

Ripon College2012 – 2015
A.B. Computer Science (honors), Spanish minor, cum laude

Studied abroad in Seville, Spain · Placed in ACM and MICS programming competitions

Platform & Infrastructure
  • Kubernetes at scale
  • Custom controllers (controller-runtime)
  • Bare-metal Kubernetes
  • ClusterAPI
  • CDK8S
  • ArgoCD / GitOps
  • Terraform
  • Linux
CI/CD & Developer Tooling
  • GitLab & GitLab CI
  • Pipeline component design
  • Build infrastructure
  • Artifact & package registries
  • Large-scale VCS migration
  • Developer experience
Observability
  • Prometheus
  • Grafana
  • Loki
  • Splunk
  • Alerting design
  • Health-gated rollouts
Languages
  • Go
  • C#
  • Python
  • TypeScript
  • Bash
  • Rust
  • SQL
  • C / C++
Configuration Management
  • Ansible
  • Puppet
  • Salt
Practice
  • Postmortem culture
  • Technical mentorship
  • Technical writing
  • Open-source contribution
  • Test-driven development
  • Defensive security