
Makefile Over GitHub Actions → Total Control Problem We became slaves to...
I became a slave to platforms. GitHub Actions, CI/CD pipelines, cloud services—they all promise convenience but deliver dependency. You push code, wait for workflows, hope they succeed. You're not in control; the platform is.
Today, I deleted .github/workflows/. All of it. Gone.
Why? Because I realized something fundamental: Platforms are just interfaces. Logic should be mine.
# .github/workflows/publish.yml
name: Publish Packages
on:
push:
branches: [main]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- run: npm publish
Problems:
# Makefile
publish:
@for dir in $$(fd package.json packages/ -x dirname {}); do \
pkg=$$(jq -r '.name' $$dir/package.json); \
version=$$(jq -r '.version' $$dir/package.json); \
published=$$(npm view $$pkg version 2>/dev/null || echo "0.0.0"); \
if [ "$$version" != "$$published" ]; then \
echo "Publishing $$pkg@$$version..."; \
(cd $$dir && npm publish); \
fi \
done
Benefits:
This connects to my core principle: Zero Documentation -> Living Code
Now extended: Zero Platform Dependency -> Total Control
Developer -> GitHub -> Actions -> npm
↑ ↑ ↑
Interface Platform Service
Each arrow is a dependency. Each dependency is a potential failure point.
Developer -> Makefile -> Direct Execution
↑ ↑
Logic Control
No intermediaries. No waiting. No surprises.
Here's my actual Makefile that replaced all GitHub Actions:
.PHONY: help readme publish publish-all list clean test
# Generate README dynamically from packages
readme:
@echo "# vibe-coding" > README.md
@echo "" >> README.md
@echo "| Command | Package | Description |" >> README.md
@echo "|---------|---------|-------------|" >> README.md
@for dir in $$(fd package.json packages/ -x dirname {} | sort); do \
name=$$(basename $$dir); \
pkg=$$(jq -r '.name' $$dir/package.json); \
desc=$$(jq -r '.description' $$dir/package.json); \
echo "| [\`$$name\`](packages/$$name) | \`$$pkg\` | $$desc |" >> README.md; \
done
# Version bump all packages
bump:
@for dir in $$(fd package.json packages/ -x dirname {}); do \
pkg=$$(jq -r '.name' $$dir/package.json); \
old=$$(jq -r '.version' $$dir/package.json); \
new=$$(echo $$old | awk -F. '{print $$1"."$$2"."$$3+1}'); \
jq ".version = \"$$new\"" $$dir/package.json > $$dir/package.json.tmp && \
mv $$dir/package.json.tmp $$dir/package.json; \
echo "$$pkg: $$old -> $$new"; \
done
# Test all tools
test:
@for dir in $$(fd package.json packages/ -x dirname {}); do \
name=$$(basename $$dir); \
echo "Testing $$name..."; \
(cd $$dir && bun run ./index.ts -h) || true; \
done
Make is 48 years old (1976). It survived because it follows Unix philosophy:
GitHub Actions is 5 years old. It won't survive 48 years. Make will.
make test # Test locally
make publish # Publish locally
# No pushing to GitHub to test workflows
Works on:
makemake -n publish # See what will run without executing
You can't do this with GitHub Actions.
This is part of a larger realization:
What does the platform actually do? Write it yourself.
Every cloud service can be replaced with:
Instead of a static README that gets outdated:
readme:
@for package in packages/*; do \
echo "- [$$(basename $$package)]($$package)" >> README.md; \
done
Instead of GitHub Actions:
publish: readme
@git diff --exit-code || (git add -A && git commit -m "auto: update" && git push)
@make publish-npm
Instead of CI/CD:
watch:
@fswatch -o . | xargs -n1 -I{} make test
I returned to basics:
Each tool does one thing well. Each tool is under my control.
Deleting .github/workflows/ was liberating. I'm no longer waiting for runners, debugging YAML, or tied to GitHub's infrastructure.
The Makefile is my declaration of independence. It's code I control, logic I own, and automation that works everywhere.
Stop configuring platforms. Start writing Makefiles.
The best workflow is no workflow—just make.
Part of the Zero Documentation -> Living Code philosophy. See also: @yemreak/culture - my tool for discovering patterns from code instead of reading documentation.
Read the original: Makefile Over GitHub Actions -> Total Control
cursorCursor Automations in 2026: wire event-triggered coding agents to Slack, CI, and...
aiThe specs exist. The AI just can't see them. I've always been the type who builds hobby...
amazonbedrockConnect Claude Code, Cursor and Codex to Amazon Bedrock's new console (2026) Summary. On 5...
aiThere is a weird uncanny valley with LLM-generated UI right now. The code functions perfectly, but if...
aiI went down a rabbit hole this morning reading the late-2025 Juejin AI roundups side by side, and the...
mcpInstall guide and config at curatedmcp.com Zendesk MCP: Let Claude Handle Your Support...
Workflows from the Neura Market marketplace related to this Cursor resource