Hi, I’m Will Hutchinson

Welcome to my website! Hopefully you enjoy my posts :)

How We Migrated Macro to Doppler and Made Configuration Safer

As Macro has grown, so has the number of services we run to deliver the product experience our users expect. One recurring headache has been keeping each service’s configuration requirements synchronized with the environment variables provided to its container at runtime.

Environment Desync

A very common pattern (and one that we originally adopted) is to use infrastructure as code to orchestrate all the environment variable values required by our services. We originally followed this pattern using Pulumi and TypeScript. It became quite easy to add a new required config value to our Rust service and forget to update the Pulumi infra to provide this. A typical flow would be: we would deploy to development, learn that the deployment had failed, and dig through the logs to identify the missing environment variable. The same failure could then occur in production if the corresponding configuration change was not applied there.

[Read more]

How We Made Sharing Easy at Macro

Access management is one of the hardest systems we’ve built at Macro - and the one we’ve rewritten the most, finally landing on something that is the most complex technically and the easiest to understand for the user.


This is one part of a multi-part piece on how we design the Macro file system (MFS). Our focus in this article is on the access management (sharing and collaboration) system.


Some background on the Macro Filesystem

Macro Filesystem (“MFS”) is a unique problem because - unlike a single-purpose software (for example, Linear for tasks, Slack for chat, and so on) — Macro needs a flexible schema that can work for these different content types. Every entity in Macro lives in one workspace under one access model.

[Read more]