Case study · 2020–now

Palmetto

A migration linter for Postgres

Palmetto — summary

Problem
A safe-looking schema change locked a production table during checkout traffic.
Role
Open-source author
Years
2020–now
Stack
Go · Postgres · GitHub Actions
Repository stars
1,400
Contributors
23
CI installations
60+ companies

Palmetto.md

This case study is sample content. Replace it with verified work before production deployment.

Turn the post-mortem into a guardrail

The first version parsed migration files and explained which statements could take strong locks. It deliberately used the same language as the Postgres documentation, with a short operational translation beside it.

Useful warnings, not maximal warnings

Rules included enough context to avoid becoming background noise: estimated table size, server version, transaction boundaries, and whether a safer expansion-and-contraction path existed.

Keep the tool boring

One binary, stable output, and exit codes designed for CI made adoption easy. The project earned trust because teams could see the reasoning and suppress a rule locally with a written explanation.

Make the hard choice visible.

A durable decision leaves enough context for the next person to understand the tradeoff, not merely the outcome.

Go to

↑ ↓ moveEnter openEsc close