Publishing without a CMS: my code-first workflow (SSH, rsync & CI/CD)
How this blog is published without an admin panel: code, commits, SSH and rsync.
This blog is not “published”, it is deployed
I don’t use a traditional CMS.
No admin dashboard.
No “Publish” button.
No database.
To write an article, I simply:
- Open my code editor
- Write a Markdown file
- Commit
- Push
Everything else is automated.
Real workflow
Creating a post looks like this:
src/content/blog/en/my-article.md
Content:
---
title: "Article title"
date: "2025-12-05"
description: "Short summary"
---
No friction. No UI. Just text.
I never leave my editor.
Minimal CI/CD: SSH + rsync
Deployment is not based on magic platforms.
It relies on two simple, trustworthy tools:
- SSH for server access
- rsync for file synchronization
My CI/CD pipeline:
- Build Astro
- Generate static site
- SSH into the server
- Run
rsyncto production
Core logic example:
rsync -az --delete dist/ user@server:/var/www/portfolio
Result:
- No containers for this site
- No unnecessary orchestration
- Fast, readable, traceable deployments
Why this choice
I intentionally use SSH + rsync because:
- No cloud dependency
- No vendor lock-in
- Full control over the process
- Easy debugging
This is the same philosophy I apply to more complex infrastructures: simplicity, traceability, reproducibility.
The real CMS is Git
Versioning content is more powerful than any admin UI.
Each article is:
- versioned
- diffable
- reversible
- reviewable
A git log is better than a badly designed CMS history.
Publishing without leaving my editor
The real comfort is this:
I code. I write. I commit. I push.
Build and deployment are entirely automated.
Conclusion
This blog is a demonstration of my approach:
- Content is code
- Infrastructure is controlled
- Deployment is simple
- No unnecessary interfaces
One editor. One terminal. One server.
That’s all I need.