惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
D
Docker
F
Fortinet All Blogs
MongoDB | Blog
MongoDB | Blog
月光博客
月光博客
罗磊的独立博客
N
Netflix TechBlog - Medium
Y
Y Combinator Blog
博客园 - 司徒正美
T
Tailwind CSS Blog
C
Check Point Blog
V
V2EX
Microsoft Azure Blog
Microsoft Azure Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Proofpoint News Feed
L
LangChain Blog
D
DataBreaches.Net
酷 壳 – CoolShell
酷 壳 – CoolShell
有赞技术团队
有赞技术团队
腾讯CDC
Last Week in AI
Last Week in AI
Jina AI
Jina AI
博客园 - Franky
量子位

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Why I Built a Markdown-First CMS Instead of Another Headl...
Thorsten Marx ㋡ · 2026-06-26 · via DEV Community

Thorsten Marx ㋡

To answer that question, I need to go back a bit. It all started in 2020, when I needed a CMS for a few personal projects. Up until that point I had mostly worked with WordPress, but it didn't feel like the right fit for what I had in mind. So I started an evaluation phase, looking at various systems.

After a while I found several options that covered parts of my requirements, but none of them were quite what I wanted overall. That's when I decided to just build a CMS myself — the system I actually wanted to work with.

Headless CMS were already gaining momentum back then, and I even spent some time building a headless prototype. But for the things I wanted to build, headless was clearly overkill and would have added significantly more work per project. Don't get me wrong: headless CMS are great, just not the right solution for every problem. That pushed me towards a more traditional approach.

My goals for the first version were:

  • a lean and fast system
  • content in Markdown, so I could write using any editor I liked without having to build a UI
  • content and configuration versioned in Git
  • installation that's as simple as possible
  • a setup that's attractive for developers, both for plugin and project development

Lightweight system, simple installation

The system needed to be as simple to handle as possible. Installation should not require running through a complex wizard, and there should be no database involved.

Installing CondationCMS is accordingly short:

wget https://github.com/CondationCMS/cms-server/releases/download/v8.2.0/condation-server-linux-x64-2026.06.tar.gz
tar xfvz condation-server-linux-x64-2026.06.tar.gz
cd condation-server
./server.sh server start

That's it. The CMS is running and the test site is available at http://localhost:2020.

It starts in DEV mode and will need some configuration before going to production, but depending on your internet speed the whole thing is up in under five minutes.

Content in Markdown, versioned in Git

Creating content should be as straightforward as possible: create a file in your editor of choice, add front matter and Markdown content, done.

---
title: Page title
---

# Page content

Here is some content!

A big advantage here is that content is easy to create and can be managed directly in Git. And it goes beyond just the content itself: site configuration, defined image resolutions, module configuration, and project extensions all live in the same repository. Everything that belongs to the project gets versioned together, which makes deployment significantly simpler and keeps the project portable.

A system that's attractive for developers

Through the integration of the GraalJS engine, small extensions can be implemented directly inside the project as an Extension.

For example, a new shortcode can be defined and then used in Markdown:

import { $hooks } from 'system/hooks.mjs';
// register component via js extensions
$hooks.registerAction("system/content/shortCodes", ({shortCodes}) => {
    shortCodes.put(
            "hello",
            ({name}) => `Hello ${name}`
    )
    return null;
})

Extensions are plain JavaScript files, always part of the project, and automatically included in Git. They work well for small, project-specific solutions that you don't need to share across projects.

When things get more complex, there are modules — what other systems usually call plugins. Modules are written in Java and offer everything extensions do, plus access to the full Java ecosystem. If you need to integrate a third-party library or build something that should be reusable across multiple sites, a module is the right tool.

Providing that same shortcode via a module looks like this:

// register component via java module
@ShortCode("hello")
public String hello_shortcode (String name) {
    return "Hello " + name;
}

Modules are installed globally on the server and can then be activated per site.

Looking back at those five goals from 2020 — lean, Markdown-based, Git-versioned, easy to install, developer-friendly — CondationCMS hits all of them. It's the system I wanted back then, and it's still the one I'd reach for today. If any of this sounds like what you've been looking for, the best way to find out is to give it a try.