Tenrankai has always treated blog posts the way it treats photos: plain files in a folder, synced however you like. Today’s update keeps that philosophy and makes the posts system dramatically more capable — on the reading side and, for the first time, on the writing side.

Categories and Labels

Posts can now carry category labels in their frontmatter:

+++
title = "Shooting the Oregon Coast"
summary = "A weekend with fog, basalt, and a 10-stop ND filter"
date = "2026-07-01"
categories = ["Travel", "Photo Gear"]
+++

Categories show up as chips on the index and on every post, and the index gains a filter bar with per-category counts. Every category gets its own clean URL (/blog/category/photo-gear), and pagination keeps the filter active as you browse.

RSS Feeds

Readers can now subscribe: every posts system serves an RSS 2.0 feed at /blog/feed.xml, and every category has its own feed at /blog/category/photo-gear/feed.xml. Feeds carry the full post content with proper absolute URLs, respect the permission system, and are discoverable via <link rel="alternate"> tags and a subscribe link at the bottom of the index. Post pages also carry full article:* Open Graph metadata — published and modified times, author, section, and one tag per category — for richer link unfurls.

An Index That Flows

The posts index is now a magazine-style feed. The newest post renders as a full-width featured card, and every card can carry a hero image, category labels, the publication date, an estimated reading time, and the summary.

Hero images come from a new optional hero_image frontmatter field — either a plain URL or a gallery reference like gallery:main:vacation/beach.jpg — and when you don’t set one, Tenrankai automatically uses the first image in the post.

Social Tie-Ins

Every post now ships with rich Open Graph and Twitter Card metadata, including og:image driven by the hero image, so links unfurl properly on social platforms and in chat apps.

Readers also get a share bar at the end of each post: native device sharing where available, plus one-click sharing to Bluesky, X, Facebook, LinkedIn, Mastodon (it remembers your instance), email, and a copy-link button.

Posts Meet Permissions

Posts directories now use the same role-based permission system as galleries. Drop a _folder.md with a [permissions] table anywhere in your posts tree and the nearest ancestor’s rules apply to everything beneath it — perfect for members-only sections or draft areas. Restricted posts disappear entirely for readers without access: from the index, the category counts, the sitemap, and direct URLs.

Write Posts in Your Browser

The biggest change: you no longer need shell access to publish. Users with can_edit_content see a + New post button on the index and an Edit button on every post, opening a full editor with title, auto-generated URL slug, summary, categories, hero image, and a markdown editor with both rich-text and raw modes.

Behind it is a small JSON API (/api/posts/{name}/source) gated by the same permissions, and everything is written back as ordinary markdown files through the storage abstraction — so web editing works with local folders and S3 alike, and your SyncThing workflow keeps working exactly as before. Edit in the browser at your desk, edit the files on your laptop in the field; it’s all just files.

Upgrading

The new features are entirely opt-in: existing posts render as before, and categories / hero_image are optional. If you maintain custom posts_index.html.liquid or post_detail.html.liquid templates, take a look at the updated stock templates for the new categories, hero_image, reading_time_minutes, and can_edit template variables.

See the core concepts guide for the full post format, the permissions guide for posts permissions and the editor, and the API reference for the new endpoints.