AstroBlog

tessera-plain — Astro Blog Template

By HeviSlav

Plain is a minimalist blog theme for Astro with a single-column layout, serif typeface, and light/dark theme support, with no client-side JavaScript beyond the theme toggle.

Explore the design

Compare the page layouts and mobile experience. Open any screenshot for a closer look.

1 previews
Author preview
Author-provided preview

Preview provided in the project README.

One original preview is available. Open the full image to inspect the design.

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-10-13View source

What stands out

A quick read of the recorded project description.

01

Single-column text layout, body width 65 to 70 characters, using a self-hosted Newsreader serif font

02

Light/dark theme follows the system by default, with a persistent toggle and no flash on load

03

No client-side JavaScript except the theme toggle; all pages are static HTML

04

Supports Markdown and MDX, including footnotes, tables, diagrams, and code blocks that switch with the theme

05

Built-in paginated home page, tag pages, about page, 404 page, full-text RSS, sitemap, and Open Graph tags

06

Includes semantic landmarks, skip links, visible focus rings, and reduced-motion support

Template Details

Plain is a minimalist blog theme written for Astro, positioned as a static blog for writers. Pages use a single-column text layout, with body text width kept between 65 and 70 characters, using a self-hosted Newsreader serif font, with no cards, hero images, shadows, or gradients. The light/dark theme follows the system by default and provides a persistent toggle button with no flash on load; apart from that toggle button there is no client-side JavaScript, and every page is static HTML.

For content, posts support Markdown or MDX, with footnotes, tables, diagrams, and code blocks, and code blocks switch with the page theme. The site includes a paginated home page, tag pages, an about page written in Markdown, and a 404 page, and provides full-text RSS, a sitemap, robots.txt, and Open Graph tags per page. For accessibility it includes semantic landmarks, skip links, visible focus rings, respect for reduced motion, and contrast above 4.5:1 in both themes. Styles are based on Tailwind 4 with hand-written prose styles, without typography plugins, icon packs, or font packages.

Configuration is centralized in src/config.ts, where you can adjust language, site title, description, production URL, author, header navigation, footer links, copyright name, posts per page, and the footer credit toggle. Colors are placed as CSS variables at the top of src/styles/global.css, with one set each for light and dark; prose styles are also under .prose in the same file. Fonts load from public/fonts/; to change fonts, replace the @font-face rules and --font-serif.

The build output is static files and can be deployed to any static host. Note: Plain assumes the site is at the domain root; if deployed under a subpath, you need to set base in astro.config.mjs and prefix links. The code is MIT licensed, and the Newsreader font is separately licensed under the SIL Open Font License. Third-party assets such as demo images, fonts, and icons need to be checked against their respective licenses.

AstroBlog

Is it right for your project?

Use Cases

  • Writing a text-focused personal blog and wanting a simple page structure with no extra decoration
  • Needing static output and deployment to static hosts such as Cloudflare Pages, Netlify, Vercel, or GitHub Pages
  • Wanting posts to support Markdown or MDX and to use footnotes, tables, diagrams, and code blocks
  • Needing basic SEO and subscription capabilities such as full-text RSS, a sitemap, and Open Graph tags
  • Needing to switch between light and dark themes and have the theme follow system preference

Suitable For

  • Personal bloggers focused on text writing
  • Writers who prefer a minimalist single-column layout
  • Users using Astro who want content managed in Markdown or MDX
  • Developers who need a static site and choose their own static hosting

Getting started & customization

Use these recorded setup notes alongside the repository instructions for your chosen version.

  1. 1

    After installing dependencies, run npm install and npm run dev; the local address is http://localhost:4321

  2. 2

    npm run build outputs to dist/, npm run preview previews that directory, and npm run check runs astro check

  3. 3

    Posts go in src/content/blog/; the file name determines the URL; updated and draft are optional fields, and drafts are visible only in development mode

  4. 4

    Site information, navigation, pagination count, and the footer credit toggle are configured in src/config.ts; colors and prose styles are in src/styles/global.css

  5. 5

    When deploying under a subpath, set base in astro.config.mjs and prefix links; before deployment, change url in src/config.ts to the actual address

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

This entry covers the free version under the MIT license in the public repository; the free scope is that version's code and does not mean external services or third-party assets are free.

Must comply with when using

  • You may use, modify, commercialize, and distribute this version's code for free.
  • When distributing copies or substantial portions of the code, retain the original author's copyright notice and the complete MIT license notice.
  • The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.

Additional costs & items to verify

  • Demo images, fonts, icons, and other third-party assets must be checked against their respective licenses and cannot be judged solely by the code's MIT license.
  • External services such as domains, hosting, databases, payments, or AI may incur separate charges.
  • Deployment limitation: Plain assumes the site is at the domain root; if deployed under a subpath, you need to set base in astro.config.mjs and prefix links, otherwise links will break.
  • Font asset licensing is separate: the Newsreader font is separately licensed under the SIL Open Font License; when using or replacing fonts, you must comply with that font license, which differs from the code's MIT license.
  • Commercial background note: Plain itself is free, but it is maintained by a studio that also develops paid premium themes; premium themes such as Meridian mentioned in the README are paid products and are not part of this free project.
View Original Text Basis

Permission is hereby granted, free of charge

Original License Text

Plain assumes it lives at the root of a domain, so a project site under a subpath also needs `base` in `astro.config.mjs` and prefixed links

Original README

The Newsreader font is licensed separately under the SIL Open Font License, see `public/fonts/OFL.txt`.

Original README

Plain is free and maintained by [Tessera](https://tessera.hevislav.workers.dev), a small studio that also makes premium Astro themes.

Original README
https://github.com/HeviSlav/tessera-plain/blob/main/LICENSEhttps://github.com/HeviSlav/tessera-plain/blob/main/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-13. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.

Project checks & description sources

Template Information

Source platforms
GitHub
Documentation and maintenance reference score
Partly documented · 68 / 100
Technologies
Astro
Website type
Blog
How this score is calculated

Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.

What to verify for this project

Repository update recorded
2026-09-13
Screenshot last checked
2026-10-13

No demo link is recorded. Use the repository instructions to evaluate the project locally; the screenshot alone cannot establish interactive behavior.

The catalog identifies Astro as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.

Use a selection guide →

How this description was prepared

AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.

Review declaration: [email protected] · 2026-10-13

Inspect the recorded source material

SHA-256: 2bf83661deccff8acb526db51b8e2b8829696d2593b22bff8ea874f0c76995e0

2026-10-13T01:22:15.253Z

Source file / repository
# Plain

A minimalist blog theme for [Astro](https://astro.build), made for people who write. One column of text set in a serif face, generous line height, and almost no chrome: no cards, no hero, no shadows, no gradients. Dark mode follows the system and can be toggled. The only client side JavaScript is the theme toggle, and every page is static HTML.

![The front page of Plain in light mode](preview/home-light-1440x900.png)

## Features

- One text column, 65 to 70 characters wide, set in Newsreader (self hosted, SIL Open Font License)
- Light and dark themes: system preference by default, a toggle that persists, no flash on load
- Posts in Markdown or MDX with footnotes, tables, figures and code blocks that switch theme with the page
- Front page with pagination, tag pages, an about page written in Markdown, a 404 page
- RSS feed with full post content, sitemap, robots.txt and Open Graph tags on every page
- Semantic landmarks, skip link, visible focus rings, reduced motion respected, contrast above 4.5:1 in both themes
- Hand written prose styles on Tailwind 4, no typography plugin, no icon or font packages

## Quick start

```sh
npm install
npm run dev
```

Open `http://localhost:4321`. `npm run build` writes the site to `dist/`, `npm run preview` serves that folder, and `npm run check` runs `astro check`.

## Writing a post

Add a Markdown file to `src/content/blog/`. The file name becomes the URL, so `src/content/blog/paper-again.md` is served at `/blog/paper-again/`.

```md
---
title: "Paper again"
description: "One line shown in the post list, in search results and in the feed."
date: 2026-04-05
updated: 2026-04-20
tags: [reading, attention]
draft: false
---

The post starts here. Footnotes[^1], tables, code blocks and raw HTML all work.

[^1]: Footnotes are rendered by GitHub flavored Markdown.
```

`updated` and `draft` are optional. Draft posts are visible while running `npm run dev` and left out of the build. For a figure with a caption, write the HTML directly:

```html
<figure>
  <img src="/images/notebook.svg" alt="What the picture shows" width="800" height="500" loading="lazy">
  <figcaption>The caption.</figcaption>
</figure>
```

Images go in `public/images/`. Give every image a width and height so the page does not shift while it loads.

The about page is `src/content/pages/about.md`.

## Configuration

Everything you are likely to change lives in `src/config.ts`: language, site title, description, production URL, author, header navigation, footer links, copyright name, posts per page, and the `credit` switch for the "Made with Plain" line in the footer.

Colors live at the top of `src/styles/global.css` as CSS variables, one set for light and one for dark. Prose styles are in the same file under `.prose`. The font is loaded from `public/fonts/`; swap the `@font-face` rules and the `--font-serif` stack to use another face.

`npm run og` regenerates `public/og.png`, the image used for link previews. It is a plain mark with no text, so it works for any site title.

## Deployment

The build is static, so any host that serves files works. Set `url` in `src/config.ts` to the address you deploy to; it is used for canonical links, the sitemap and the RSS feed.

- Cloudflare Pages: build command `npm run build`, output directory `dist`
- Netlify: build command `npm run build`, publish directory `dist`
- Vercel: framework preset Astro, or build command `npm run build` with output directory `dist`
- GitHub Pages: use the official [Astro action](https://docs.astro.build/en/guides/deploy/github/); Plain assumes it lives at the root of a domain, so a project site under a subpath also needs `base` in `astro.config.mjs` and prefixed links

## License

MIT. The Newsreader font is licensed separately under the SIL Open Font License, see `public/fonts/OFL.txt`.

## More themes

Plain is free and maintained by [Tessera](https://tessera.hevislav.workers.dev), a small studio that also makes premium Astro themes. If you need more than a blog, have a look at [Meridian](https://meridian-demo.hevislav.workers.dev), an editorial marketing site theme for SaaS and startups.
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.