Single-column text layout, body width 65 to 70 characters, using a self-hosted Newsreader serif font
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.
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.
What stands out
A quick read of the recorded project description.
Light/dark theme follows the system by default, with a persistent toggle and no flash on load
No client-side JavaScript except the theme toggle; all pages are static HTML
Supports Markdown and MDX, including footnotes, tables, diagrams, and code blocks that switch with the theme
Built-in paginated home page, tag pages, about page, 404 page, full-text RSS, sitemap, and Open Graph tags
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.
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
After installing dependencies, run npm install and npm run dev; the local address is http://localhost:4321
- 2
npm run build outputs to dist/, npm run preview previews that directory, and npm run check runs astro check
- 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
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
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
License & source material
Usage conditions & limitations
Free to use · keep license noticeThis 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
https://github.com/HeviSlav/tessera-plain/blob/main/LICENSEhttps://github.com/HeviSlav/tessera-plain/blob/main/README.mdPlain is free and maintained by [Tessera](https://tessera.hevislav.workers.dev), a small studio that also makes premium Astro themes.
Original README
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.  ## 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.
Explore similar templates
Compare previews and descriptions within the same stack and category.

astrowind
AstroWind is a free, open-source Astro starter theme using Astro and Tailwind CSS, released under the MIT license.
Astro · Blog

astro-paper
AstroPaper is a minimal, responsive, accessible, and SEO-friendly Astro blog theme. Articles are stored as Markdown/MDX in src/content/posts/, with subdirectories affecting URLs.
Astro · Blog

fuwari
Fuwari is a static blog template built with Astro and Tailwind CSS for personal blogs. It manages posts as Markdown files in src/content/posts/, with frontmatter for title, date, description, cover, tags, categories, draft status, and language.
Astro · Blog

Firefly
Firefly is a clean personal blog theme forked from Astro and Fuwari, offering four background modes, single/double sidebar and list/grid layouts, Pagefind client-side full-text search, and a six-language UI.
Astro · Blog

astro-theme-cactus
Astro Cactus is an Astro-based blog and portfolio theme that uses Markdown/MDX content collections to manage posts, notes, and tags, with frontmatter type-checked by a schema.
Astro · Portfolio

astrofy
Astrofy is a free and open-source personal portfolio website template built with Astro and TailwindCSS, with built-in blog, CV timeline, project showcase, store, and RSS feed modules.
Astro · Portfolio
