Freshening Up 17 Jun 2021

It being 2021, I have decided to air out the website and tune it up. With a working development and deployment pipeline, my intention is to start doing regular updates.

  • Site updates
  • What's been going on?
  • Elixir

Site Updates

My old deployment was a static website built in Jekyll, deployed to S3 with an AWS CloudFront endpoint to serve traffic. Because I want to serve traffic from a www subdomain, I had to do extra work to redirect traffic from my root domain. This involved a tiny EC2 instance running nginx. SSL certificates were always a problem, and when I did not check in on my site for a while, I'd regularly come back to find that https:// had started giving warnings.

I've moved the website to Zola, hosted in DigitalOcean App Platform and proxied by CloudFlare.

  • A lot of my problems with deployment had to do with DNS and certs
    • CloudFlare allows for CNAME root domain records. They solve the problems around this by flattening responses to DNS requests, returning the resolved A record(s).
    • CloudFlare wants websites to be secure, so provides SSL certs with management for free.
    • CloudFlare provides the ability to redirect requests with 301 HTTP status codes, so I can redirect my root domain to www.
  • Zola installs as a single binary on multiple platforms. No more fighting with dependencies!
  • Deploying a static site to DO App Platform is free, and is less work than keeping my S3 auth credentials up to date and secure.
  • I have not written Ruby in 3 years. Keeping Ruby and Jekyll up to date was a burden that I was not excited about.

DigitalOcean Issues

App Platform auto-detected my static site as Hugo. There's not a lot of information about the Linux distribution used by the build, but I was able to get around this by using Docker for the deployment build step.

The Dockerfile is simple:

FROM alpine:latest


COPY . .

RUN apk add zola --repository
RUN zola build

And the app spec can be changed as follows:

name: <app-name>
region: nyc
  - dockerfile_path: ./Dockerfile
      branch: main
      repo: <organization>/<repo>
    name: <app-name>
    output_dir: /app/public
      - path: /
    source_dir: /

What's Going On?

My previous, most recent blog post was in 2016, shortly after I left my position at Wanelo. I had recently begun contracting at Pivotal on CloudFoundry, and I was just starting to come to terms with the degree of my burnout.

I was unexcited about computers, deeply suspicious of the tech industry's role in disenfranchising communities, and SO SO tired of hearing about the new amazing social media toaster that was about to revolutionize toast-making—they just needed someone, a senior engineer, DEAR GOD ANYONE who could help sort out their 15 microservices written in 17 languages, before they launched to their first customer.


Five years later, and I feel like my life and career have been both anticlimactic and a whirlwind, all at the same time. I've traveled to Indonesia twice. I learned to scuba dive, and then forgot. I was the CTO of a startup for five months—and quit because I lost faith in the product within my first week on the job, but didn't feel capable of quitting on my first day. I wrote a firmware updater in Elixir, as well as the binary data protocol (in firmware written in C) for a hardware device that was the backbone of another startup. I wrote the data pipeline software that powered Covid-19 contact tracing for the state of New York (the good one—the pipeline the solved most of the problems you may have read about in the news).

I'm repeatedly reminded that process beats product.

OH RIGHT and there was that pandemic.


Most of my software development in the past few years has been in Elixir programming language. I think that it's pretty neat. It's like someone took all the things that I loved about Ruby, but made them work on runtime special-built for scalability and reliability—oh, wait, that's exactly what happened.

Random projects that might be interesting to others:

  • Gestalt - Helpers to mock return values from Application.get_env/3 or System.get_env/1 in tests.
  • Medic - Support scripts and a runner for checks (with suggested remedies) to help set up a project for development.
  • AbsintheGraphqlWS - A custom WebSocket transport to handle GraphQL subscriptions using the GraphQL over WebSockets protocol
  • Geometrics - Shims, helpers, and event handlers to get OpenTelemetry working in a Phoenix app, with traces propagating into JavaScript.
  • Honcho - foreman, but in Elixir.