# Blog content

- Source-of-truth (admin): SQLite (`CMS_DB_PATH`, default: `content/cms.sqlite`)
- Posts (optional mirror): `content/blog/posts/*.md`
- Images (optional mirror): `content/blog/images/*` (optionally mirrored to `public/blog/images/*`; disabled by default via `CMS_WRITE_IMAGES_TO_DISK=false`)

## Admin UI

For local content management, use:

- Admin page: `/admin`
- Credentials: stored in DB table `admin_users`; first login can bootstrap the initial admin account.

The admin UI can:

- Create / edit / delete posts
- Upload images
- Insert images inline in the rich text body
- Pick a cover image from a dropdown
- Store post content in a local SQLite db (default: `content/cms.sqlite`) and optionally mirror posts back to `content/blog/posts/*.md`
- Store uploaded images in SQLite and serve them at `/blog/images/<file>`

## Post format

Each post is a Markdown file with optional frontmatter:

```md
---
title: Your title
date: 2026-02-08
excerpt: One sentence summary used in cards/SEO.
coverImage: your-image.svg
tags: RL, Simulation, AgentOps
---

# Heading

Body...
```
