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:

  1. Open my code editor
  2. Write a Markdown file
  3. Commit
  4. 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:

  1. Build Astro
  2. Generate static site
  3. SSH into the server
  4. Run rsync to 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.