NJVERSE // BOOT
>NJVERSE OS v3.14 — BOOT SEQUENCE INITIATED
>loading kernel modules...
>mounting /sys/identity... OK
>applying user preferences...
>spawning interface threads...
>connecting BKK :: 13.7563°N, 100.5018°E
>SYSTEM READY
~/ / posts / 0x06
POST 0x06//tools2025.11.05 // 7 min read

i replaced my entire CI with 80 lines of bash. it slaps.

yaml is not a programming language. and yet. here we are. a brief manifesto + the actual 80 lines.

NJ
Nattapong Jaisabai
Software Engineer · published 2025.11.05

i used to write CI pipelines in yaml. eight hundred lines of indented despair. nested anchors. shell snippets escaped six times. a job called 'maybe-deploy-if-tuesday'. then one day, on a long flight, i deleted all of it.

the manifesto, in one breath

"yaml is a configuration format. it is not, despite appearances, a programming language. when you find yourself programming in yaml you are not in the configuration business anymore. you are in the suffering business."

the entire ci, in 80 lines

#!/usr/bin/env bash
set -euo pipefail

stage() { echo; echo "::: $1"; }

stage "lint"     && shellcheck ./**/*.sh && ruff check .
stage "test"     && go test ./... && pytest -q
stage "build"    && make release
stage "sign"     && cosign sign-blob --yes dist/*.tar.gz
stage "publish"  && gh release create "v$(cat VERSION)" dist/*
# (80 lines once you handle caching, retries, and matrix builds)

of course it's not 80 lines anymore. it's 142. it does parallel matrix runs, caches between stages with a local mtime check, retries with backoff, and posts a summary to slack. it's still bash. it's still legible.

what you give up

the cloud provider's marketplace. nice green checkmarks in PRs (we have a tiny pr-status binary that does this, also 40 lines). free spinners. the ability to say 'yeah we use circleci'. all worth it. all worth it.

EOF · 0x06 · last edit 2025.11.05// thanks for reading.
← PREVIOUS
notes on running an LLM on a potato
2025.10.02 · //ml //llm · 12 min
NEXT →
reverse-engineering my smart toaster (it's worse than you think)
2025.12.18 · //iot · 14 min
← back to all posts