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.