Skip to content

Content

yCENzh edited this page Sep 19, 2026 · 1 revision

Content

Four collections, all under shirones/content/:

Collection Directory Files Purpose
posts shirones/content/posts/ .md, .mdx Articles
moments shirones/content/moments/ .md Short-form feed
spec shirones/content/spec/ .md, .mdx Standalone pages (About, and similar)
series shirones/content/series/ .md Series definitions

Subdirectories are fine; the loaders glob recursively.

Posts

---
title: Rendering pipelines
published: 2026-03-02
updated: 2026-03-09
description: What actually happens between a commit and a painted frame.
image: /covers/pipelines.png
category: graphics
tags: [rendering, webgpu]
series: rendering-internals
seriesOrder: 3
---

title and published are required. Everything else has a default.

Field Type Default Notes
title string — required
published date — required
publishedAt date — alias, if you prefer the longer name
updated date —
updatedAt date — alias
description string "" used for cards, RSS and meta tags
image string "" cover image path
category string | null "" one per post
tags string[] []
pinned boolean false floats to the top of lists
draft boolean false excluded from production builds
comment boolean true per-post comment switch
lang string ""
series string "" the slug of a series; see below
seriesOrder integer — position within the series
encrypted boolean false see Encrypting a post
password string | number — coerced to a string
passwordHint string ""
hideHomeContent boolean true
alias string — legacy URL, redirected to the real one
permalink string — overrides the generated path

The remaining fields in the schema (prevUrl, nextUrl, prevTitle, prevSlug, nextTitle, nextSlug) are filled in by the theme at build time to drive the previous/next footer. Ignore them.

series is trimmed, so series: " rendering " and series: "rendering" are the same series.

Series

A series is a page that collects posts. Define it in shirones/content/series/:

---
title: Rendering internals
status: ongoing
defaultCategory: graphics
---

An optional overview. The markdown body of a series entry is rendered on the
series page, so this is where a preamble goes.
Field Type Default
title string — (required)
status "ongoing" | "completed" "ongoing"
defaultCategory string ""

The filename is the slug. series/rendering-internals.md is referenced from posts as series: rendering-internals, and lives at /series/rendering-internals/.

Posts are ordered by seriesOrder when it is set. Posts in a series that do not set it fall back to their publish date.

Moments

Short entries with optional images. No title — the body is the content.

---
published: 2026-03-14
location: Frankfurt
mood: tired
tags: [travel]
images:
  - src: /moments/2026-03-14-1.jpg
    alt: A platform at night
  - src: /moments/2026-03-14-2.jpg
---

Missed the last train. Worth it.
Field Type Default
published date — (required)
pinned boolean false
location string ""
mood string ""
tags string[] []
images { src, alt? }[] []
draft boolean false

alt defaults to "" but write one anyway — the moments gallery renders it.

Spec pages

spec is for pages that are neither posts nor moments: About, now, colophon. The schema is empty, so any frontmatter you like is accepted and the filename decides the route.

shirones/content/spec/about.md renders at /about/.

Encrypting a post

---
title: Private notes
published: 2026-03-01
encrypted: true
password: hunter2
passwordHint: the usual
---

The body is encrypted at build time and the page ships a password prompt. password accepts a string or a number and is coerced to a string, so password: 1234 works but the visitor types 1234.

This is obfuscation in a static site, not security. Anyone determined can read the ciphertext, and the routine that reverses it ships in the client bundle because the browser has to run it. Fine for keeping casual readers out of a personal note; not fine for anything that matters.

Permalinks and aliases

permalink overrides the generated path:

---
title: Old post
published: 2024-01-01
permalink: /writing/old-post/
---

alias keeps an old URL alive after you move something. The theme emits a redirect from the alias to the real path, so bookmarks and inbound links survive a reorganisation.

Drafts

draft: true excludes an entry from production builds but keeps it in astro dev, so you can read a draft before publishing it.

Trailing slashes

The integration forces trailingSlash: "always". This is not configurable, and it is not cosmetic: Astro's config resolution appends a trailing slash to image.endpoint.route during resolveConfig, which produces a /_image/ route that the dev router then fails to match. The integration sets both the trailing-slash policy and the image endpoint route explicitly so the pair stays consistent. If you set trailingSlash yourself in astro.config.mjs, the integration's value wins.

Next

Clone this wiki locally