AgBlogger

A self-hosted, Markdown-first blogging platform. Write in any editor, organize with labels, cross-post to social media, and synchronize between your computer and server.


Features

  • Write in Markdown — posts are Markdown .md files you can create in any text editor. AgBlogger also provides a convenient web editor with instant preview.
  • Organize with labels — group your posts with labels and browse them in a visual label map.
  • Share to social media — publish a post to Bluesky, Mastodon, X (Twitter), and Facebook in one click.
  • Search and discovery — find posts by title, content, or labels.
  • Sync from your computer — keep a folder on your computer in sync with your blog, so you always have a local backup.
  • Email subscriptions — readers subscribe to get new posts in their inbox.
  • Track analytics — see view counts on posts and browse traffic stats in the admin dashboard.

Quick start

Deploy

Requirements: just and uv on your computer, Docker on your computer and server.

Download and extract the latest release source from the releases page, then:

cd agblogger-X.Y.Z
just deploy                                        # interactive setup wizard
rsync -av dist/deploy/ user@your-server:~/agblogger/ # copy bundle to server

Then on the server:

cd ~/agblogger
bash setup.sh    # starts everything, including HTTPS

Your blog is live at https://your-domain. Log in with the admin credentials you provided during setup.

See the deployment guide for managing the server, updates, and alternative deployment methods.

Web editor

Log in and write posts in the built-in web editor: Markdown on the left, an instant preview on the right, with a formatting toolbar, labels, and image uploads. See the editor guide.

Sync tool

The sync tool keeps a local folder of Markdown files in sync with your blog. Download it from the releases page.

agblogger init --dir ~/blog --server https://your-server.com   # one-time setup

Write posts as index.md files in dedicated post folders inside the posts/ folder, e.g., in posts/my-first-post/index.md:

---
labels:
  - "#cooking"
---

# My First Post

Post content here. The title is extracted from the first `#` heading.
Dates are filled in automatically on sync.

Then sync:

agblogger status --dir ~/blog   # preview changes
agblogger sync --dir ~/blog     # push and pull

See the sync tool guide for post format details, conflict handling, and authentication.

Cross-posting

Connect social accounts under Admin → Social in the web UI, then cross-post from any published post’s editor. See the cross-posting guide.

Email subscriptions

Add a Resend API key under Admin → Subscriptions and enable the feature — readers get a Subscribe button in the header, and new posts are emailed to subscribers automatically. See the subscriptions guide.

Analytics

View traffic stats and per-post view counts under Admin → Analytics. Powered by a self-hosted, cookie-free GoatCounter sidecar. See the analytics guide.