Pages define the routes of the site. The project uses static site generation (SSG) for optimal performance and hosting flexibility.
Each collection has a top-level index page that lists all its entries:
Each collection follows the same routing pattern:
[collection]/[...id].astro: Individual content pages generated from collections[collection]/tags/[tag].astro: Tag-specific pages showing all content with a given tag[collection]/tags/index.astro: Tag listings for each collectionThis applies to all five collections: muses, short_form, long_form, zeitweilig, and authors.
Dynamic routes are generated from content collections defined in content.config.ts using getStaticPaths():
---
import { getCollection } from "astro:content";
export async function getStaticPaths() {
const posts = await getCollection("short_form");
return posts.map((post) => ({
params: { id: post.id },
props: { post },
}));
}
const { post } = Astro.props;
---
Most of this boilerplate is handled by the shared helpers in collections.ts - buildDetailPaths() and buildTagPaths().
Each collection directory generates an RSS feed via collections.ts’s generateRss() helper:
/long_form/rss.xml/short_form/rss.xml/muses/rss.xml/zeitweilig/rss.xml/authors/rss.xmlThe RSS link icon in the header is conditionally shown by rss.ts based on the current path.
as const so TypeScript narrows its elements to literal collection names. Accumulator arrays in reduce() calls are explicitly typed (CollectionEntry<…>[]) and post-filter results use non-null assertions where the filter guarantees a value.Each page incorporates components and layouts to maintain consistency. Pages typically: