AstroBlog

astro-ataraxia-theme — Astro Blog Template

By inakicalvo

Ataraxia is an Astro-based blog theme that uses plain CSS custom properties instead of Tailwind, built around the Atkinson Hyperlegible font and WCAG 2.2 AA accessibility, offering dark mode, tag pages, pagination, table of contents, RSS, and MDX support.

Explore the design

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

3 previews
Desktop homepage1 / 3
Desktop captureTop of page

Actual screenshot captured by the server browser.

All pages & views 3

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-10-02View source

What stands out

A quick read of the recorded project description.

01

Does not use Tailwind; theme colors and styles are centralized in CSS custom properties in src/styles/global.css

02

Uses the Atkinson Hyperlegible variable font, loaded locally via Astro's native fonts API, supporting weights 100–900

03

Built around accessibility: keyboard navigation, skip links, ARIA labels and landmarks, focus indicators; the README claims WCAG 2.2 AA compliance

04

Content collections with Zod validation; posts support tags, heroImage, and draft fields, with drafts excluded from production builds

05

Includes tag pages and a tag cloud, collapsible table of contents, reading time, pagination, breadcrumbs, RSS, and sitemap

06

Supports Markdown and MDX, with images processed via Sharp

Template Details

Ataraxia is a blog theme for Astro, positioned as "quiet, accessible, and reading-focused." It does not use Tailwind; colors and theme variables are centralized in CSS custom properties in src/styles/global.css, while components and pages each import their own stylesheets from src/styles/components/ and src/styles/pages/, with selectors primarily using class names. The font is Atkinson Hyperlegible variable font, loaded locally from src/assets/fonts/ via Astro's native fonts API fontProviders.local(), and exposed as --font-atkinson and --font-atkinson-mono variables, supporting weights 100–900.

On the content side, it uses Astro content collections with Zod validation; posts live in src/content/blog/ and support Markdown and MDX. Each post requires at least one tag, with optional heroImage and draft fields; drafts are filtered out in production builds and visible in development. The theme includes tag pages and a tag cloud, an auto-generated collapsible table of contents based on headings, reading time estimation, blog index pagination, breadcrumb navigation, RSS feed, and sitemap, and outputs canonical and OpenGraph metadata via BaseHead.astro. Site title, description, author, and posts per page are configured in src/consts.ts, and the production URL is set in the site field of astro.config.mjs.

The theme is built on Astro's official blog starter template and Bear Blog's minimalist design approach, and the repository is MIT licensed. The Astro v7 and WCAG 2.2 AA claims noted in the README come from the project's own description and were not independently verified in this material; licenses for third-party assets such as demo images and fonts must be confirmed separately.

AstroBlog

Is it right for your project?

Use Cases

  • Building a personal blog focused on text reading, with minimal interface distraction and clear typography
  • A static blog site needing dark mode, tag categorization, pagination, and RSS subscription
  • Maintaining theme styles with plain CSS custom properties rather than Tailwind utility classes
  • A site needing better readability fonts and keyboard-accessible navigation for low-vision readers
  • Writing posts with Astro content collections and MDX, and needing local draft preview

Suitable For

  • Developers familiar with Astro and content collections who are willing to edit CSS and Astro components directly
  • Individual authors who prefer a minimalist blog theme without Tailwind dependencies
  • Users who need to deploy the blog to static hosting platforms such as Netlify, Vercel, Cloudflare Pages, or GitHub Pages
  • Users who value accessibility and reading experience and are willing to verify third-party asset licenses themselves

Getting started & customization

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

  1. 1

    Create a project with npm create astro@latest -- --template inakicalvo/astro-ataraxia-theme, or clone the repository and run npm install

  2. 2

    Set SITE_TITLE, SITE_DESCRIPTION, SITE_AUTHOR, and POSTS_PER_PAGE in src/consts.ts

  3. 3

    Change site in astro.config.mjs to your production domain so canonical, RSS, and sitemap are generated correctly

  4. 4

    Place posts in src/content/blog/; each must include title, description, pubDate, and at least one tags entry, with optional heroImage and draft

  5. 5

    The build command is npm run build, outputting to ./dist/; use npm run dev for local development and npm run preview to preview the build

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 the code of this version and does not imply that external services or third-party assets are free.

Must comply with when using

  • You may use, modify, commercialize, and distribute the code of this version for free.
  • When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full 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.
View Original Text Basis

Compiled by DeepSeek based on repository license and README ·2026-10-02. 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
More documented · 87 / 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-19
Screenshot last checked
2026-10-02

A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.

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.

Automatically checked against source and license rules; no manual editorial review.

Inspect the recorded source material

SHA-256: 97f97bca3b5478c4386838faa53b4f5160011c1ba6c271f6d725b7930806a58a

2026-10-02T09:50:31.429Z

Source file / repository
# Ataraxia 🏛️

**A calm, accessible Astro blog theme. No Tailwind, no clutter — just your words.**

<!-- TODO: add a real screenshot or short GIF of the homepage/blog index here, light and dark side by side, e.g. ![Ataraxia theme screenshot](./screenshot.png) -->

[![Astro](https://img.shields.io/badge/Astro-v7-BC52EE)](https://astro.build)
[![TypeScript](https://img.shields.io/badge/TypeScript-strict-3178C6)](https://www.typescriptlang.org/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)

[Live demo](https://astro-ataraxia-theme.netlify.app/) · [Astro themes page](https://astro.build/themes/details/ataraxia-astro-theme/)

```bash
npm create astro@latest -- --template inakicalvo/astro-ataraxia-theme
```

[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/inakicalvo/astro-ataraxia-theme)
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/inakicalvo/astro-ataraxia-theme)

## Why Ataraxia?

- **No Tailwind.** Plain CSS custom properties — colors live in one file, no utility-class soup.
- **WCAG 2.2 AA**, built around Atkinson Hyperlegible, the typeface designed by the Braille Institute for
  low-vision readers.
- **Made for reading**. Generous spacing, careful typography, and no visual noise around your content.

## ✨ Features

- ✅ **Astro v7** - Built with the latest Astro features
- ✅ **Dark Mode** - Toggle between light and dark themes with smooth transitions
- ✅ **Accessible** - WCAG 2.2 AA compliant with keyboard navigation and screen reader support
- ✅ **Atkinson Hyperlegible Fonts** - Variable fonts optimized for readability
- ✅ **Tag System** - Organize posts by tags with dedicated tag pages
- ✅ **Reading Time** - Estimated reading time on every post
- ✅ **Table of Contents** - Auto-generated from post headings, collapsible
- ✅ **Pagination** - Built-in pagination for the blog index
- ✅ **Draft Posts** - Mark posts as drafts to preview locally without publishing
- ✅ **Responsive Design** - Mobile-first with hamburger navigation
- ✅ **Content Collections** - Type-safe blog posts with Zod validation
- ✅ **SEO Optimized** - Canonical URLs, OpenGraph data, and sitemap
- ✅ **RSS Feed** - Auto-generated RSS feed for subscribers
- ✅ **MDX Support** - Enhanced markdown with component support
- ✅ **Breadcrumb Navigation** - Clear navigation paths
- ✅ **Performance** - Optimized images with Sharp
- ✅ **Minimal Styling** - Clean design based on Astro Starter Kit: Blog and Bear Blog

## 🎨 Theme Features

### Dark Mode

- Automatic system preference detection
- Manual toggle with localStorage persistence
- Smooth color transitions
- Sun/moon icons with rotation animations

### Typography

- **Atkinson Hyperlegible** variable fonts for optimal readability
- Support for weights 100-900
- Italic variants included
- Monospace variant for code blocks

### Tag System

- Required tags for all blog posts
- Dedicated tag pages for filtering
- Tag cloud with post counts
- Reusable `TagList` component

### Accessibility

- Keyboard navigation support
- Skip links for main content
- ARIA labels and landmarks
- Sufficient color contrast ratios
- Focus indicators on all interactive elements
- Screen reader friendly

<!-- TODO: run a Lighthouse audit and note the score here, and name the screen readers you actually tested with (e.g. VoiceOver, NVDA) once you have real results. -->

## 🧞 Commands

All commands are run from the root of the project:

| Command                   | Action                                           |
| :------------------------ | :----------------------------------------------- |
| `npm install`             | Installs dependencies                            |
| `npm run dev`             | Starts local dev server at `localhost:4321`      |
| `npm run build`           | Build your production site to `./dist/`          |
| `npm run preview`         | Preview your build locally, before deploying     |
| `npm run astro ...`       | Run CLI commands like `astro add`, `astro check` |
| `npm run astro -- --help` | Get help using the Astro CLI                     |

## 📝 Creating Blog Posts

1. Create a new `.md` or `.mdx` file in `src/content/blog/`
2. Add the required frontmatter:

```markdown
---
title: 'Your Post Title'
description: 'A brief description of your post'
pubDate: 'Oct 03 2025'
tags: ['astro', 'blogging']  # At least one tag required
heroImage: '../../assets/your-image.jpg'  # Optional
draft: true  # Optional - excluded from production builds, visible in dev
---

Your content here...
```

3. The file name becomes the URL slug (e.g., `my-post.md` → `/blog/my-post/`)

## ⚙️ Configuration

Edit `src/consts.ts` to customize your site:

```typescript
export const SITE_TITLE = 'Your Site Title';
export const SITE_DESCRIPTION = 'Your site description';
export const SITE_AUTHOR = 'Your Name';
export const POSTS_PER_PAGE = 6;
```

Update `astro.config.mjs` for your production URL:

```javascript
export default defineConfig({
  site: 'https://your-site.com',
  // ...
});
```

## 🎨 Customization

### Colors

Edit CSS variables in `src/styles/global.css`:

- Light theme: `:root` selector
- Dark theme: `[data-theme="dark"]` selector

### Component and page styles

Components and pages carry no `<style>` blocks. Each one imports its own stylesheet from `src/styles/components/` or `src/styles/pages/` (e.g. `Header.astro` imports `src/styles/components/header.css`). Because these files are plain global CSS, selectors are class-based (`.site-header`, `.post-card`, …) rather than bare element selectors.

### Fonts

Fonts use Astro's native `fonts` API (`fontProviders.local()`) in `astro.config.mjs`, sourced from `src/assets/fonts/` and exposed as the `--font-atkinson` / `--font-atkinson-mono` CSS variables. Variable fonts support any weight from 100-900.

### Navigation

Add or remove links in `src/components/Header.astro`

## 🚀 Project Structure

```text
├── public/
│   └── favicon.svg
├── src/
│   ├── assets/
│   │   └── fonts/            # Atkinson Hyperlegible variable fonts
│   ├── components/
│   │   ├── BaseHead.astro    # SEO and meta tags
│   │   ├── Breadcrumb.astro  # Navigation breadcrumbs
│   │   ├── Footer.astro      # Site footer
│   │   ├── FormattedDate.astro
│   │   ├── Header.astro      # Responsive header with navigation
│   │   ├── HeaderLink.astro
│   │   ├── MetaItem.astro    # Icon + label pair for post metadata
│   │   ├── Pagination.astro  # Prev/next + page-number nav
│   │   ├── PostCard.astro    # Post preview card
│   │   ├── PostMeta.astro    # Layout wrapper for MetaItem rows
│   │   ├── TableOfContents.astro # Collapsible per-post TOC
│   │   ├── TagList.astro     # Display post tags
│   │   └── ThemeToggle.astro # Dark/light mode toggle
│   ├── content/
│   │   └── blog/             # Markdown/MDX blog posts
│   ├── layouts/
│   │   └── BlogPost.astro    # Blog post layout
│   ├── pages/
│   │   ├── about.astro
│   │   ├── index.astro
│   │   ├── rss.xml.js        # RSS feed
│   │   ├── blog/
│   │   │   ├── [...slug].astro  # Dynamic blog post routes
│   │   │   └── [...page].astro  # Paginated blog list
│   │   └── tags/
│   │       ├── [tag].astro      # Tag filter pages
│   │       └── index.astro      # All tags page
│   ├── styles/
│   │   ├── global.css        # Global styles and CSS variables
│   │   ├── components/       # One stylesheet per component (header.css, post-card.css, pagination.css, …)
│   │   └── pages/             # One stylesheet per page/layout (blog-post.css, tag.css, …)
│   ├── utils/
│   │   ├── posts.ts          # Published-posts query (filters drafts in prod)
│   │   ├── readingTime.ts    # Word-count based reading time estimate
│   │   └── slugify.ts        # URL slug generation
│   ├── consts.ts             # Site configuration
│   └── content.config.ts     # Content collection schema
├── astro.config.mjs
├── package.json
└── tsconfig.json
```

## 📦 Dependencies

- **Astro** - Static site generator
- **@astrojs/mdx** - MDX support
- **@astrojs/rss** - RSS feed generation
- **@astrojs/sitemap** - Sitemap generation
- **astro-icon** - Icon component
- **@iconify-json/mdi** - Material Design Icons
- **@iconify-json/simple-icons** - Brand icons (e.g. the footer's GitHub link)
- **sharp** - Image optimization

## 🌐 Deployment

Build your site with `npm run build`. The output will be in the `./dist/` directory, ready to deploy to your favorite hosting platform:

[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/inakicalvo/astro-ataraxia-theme)
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/inakicalvo/astro-ataraxia-theme)

- [Netlify](https://www.netlify.com/)
- [Vercel](https://vercel.com/)
- [Cloudflare Pages](https://pages.cloudflare.com/)
- [GitHub Pages](https://pages.github.com/)

## 📑 Learn More

- [Astro Documentation](https://docs.astro.build)
- [Astro Discord](https://astro.build/chat)
- [Content Collections Guide](https://docs.astro.build/en/guides/content-collections/)
- [Astro Pagination Guide](https://docs.astro.build/en/guides/routing/#pagination)

## 🌍 Sites using Ataraxia

<!-- TODO: add real sites built with this theme here as they appear -->

- _None yet — [open a PR](https://github.com/inakicalvo/astro-ataraxia-theme/pulls) to add yours!_

## 🫶 Credit

This theme is inspired by and built upon:

- [Astro Starter Kit: Blog](https://github.com/withastro/astro/tree/main/examples/blog) - Official Astro blog starter
- [Bear Blog](https://github.com/HermanMartinus/bearblog/) - Minimal blog design
- The philosophical concept of **Ataraxia** (ἀταραξία) - tranquility and freedom from worry

## 📄 License

[MIT](./LICENSE) © 2026 Iñaki Calvo. Feel free to use this theme for your projects!

---

If this theme helped you, consider giving it a ⭐ on GitHub!
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.