Deploy your own copy of Volks-Typo with these services:
A striking Astro blog theme that explores the aesthetic tension between Bauhaus modernism and WW2-era monumental design. Volks-Typo creates a "dissonant harmony" that is visually compelling, highly functional, and conceptually rich.
Seamless dark mode support with carefully crafted contrast and visibility
@jdrhyne β’ Personal blog: jdrhyne.me (Still under construction π§)
β Unique Design Philosophy - Bauhaus functionalism meets monumental aesthetics
β Dark Mode Toggle - Seamless theme switching with localStorage persistence and FOUC prevention
β MDX Support - Full support for both Markdown and MDX content files
β Reading Time Display - Automatic calculation and display of estimated reading time
β Table of Contents - Auto-generated TOC with scroll spy navigation
β Ultra-Minimalist - Clean, focused design with purposeful use of space
β Responsive Layout - Mobile-first with elegant desktop sidebar
β Minimal JavaScript - Essential JS only for enhanced features, ensuring fast performance
β Full Blog Support - Categories, tags, archives, and recent posts
β SEO Optimized - Built-in meta tags and structured data
β Accessibility First - Semantic HTML and ARIA attributes
β Self-Hosted Fonts - No external dependencies for privacy
β Type-Safe - Full TypeScript support
β Comprehensive Testing - Playwright test suite with visual regression testing
β Easy Configuration - Single config file for all settings
Professional dark mode with optimized contrast for all UI elements
Category tags with perfect visibility in both light and dark themes
- Live Demo: https://jdrhyne.github.io/volks-typo/
- Latest Release: v1.1.2
- All Releases: View on GitHub
- Changelog: CHANGELOG.md
- Framework: Astro with MDX integration
- Type Checking: TypeScript
- Styling: Scoped CSS with CSS Variables and Dark Mode support
- Fonts: Self-hosted via @fontsource
- Icons: Minimal SVG icons
- Testing: Playwright for browser automation and visual regression testing
- Node.js 18.14.1 or higher
- Git
# npm
npm create astro@latest -- --template jdrhyne/volks-typo
# pnpm
pnpm create astro@latest --template jdrhyne/volks-typo
# yarn
yarn create astro --template jdrhyne/volks-typo
- Clone this repository:
git clone https://github.com/jdrhyne/volks-typo.git my-blog
cd my-blog
- Install dependencies:
npm install
# or
pnpm install
# or
yarn install
- Start the development server:
npm run dev
# or
pnpm run dev
# or
yarn dev
- Open your browser at
http://localhost:4321
volks-typo/
βββ public/
β βββ favicon.svg # Site favicon
β βββ site-title.svg # Fraktur-style site title
β βββ scripts/
β βββ theme-init.js # Dark mode initialization script
βββ src/
β βββ components/
β β βββ Footer.astro # Site footer with social links
β β βββ Header.astro # Site header with navigation
β β βββ Layout.astro # Main layout wrapper
β β βββ Sidebar.astro # Desktop sidebar component
β β βββ ThemeToggle.astro # Dark mode toggle button
β β βββ TableOfContents.astro # Auto-generated TOC component
β βββ content/
β β βββ blog/ # Blog content directory
β β βββ *.md # Markdown blog posts
β β βββ *.mdx # MDX blog posts with JSX
β βββ pages/
β β βββ index.astro # Homepage
β β βββ about.astro # About page
β β βββ blog.astro # Blog listing page
β β βββ blog/
β β β βββ [...slug].astro # Dynamic blog post pages
β β βββ categories.astro # Categories listing
β β βββ contact.astro # Contact page
β βββ styles/
β β βββ global.css # Global styles with dark mode support
β βββ utils/
β β βββ reading-time.ts # Reading time calculation utilities
β β βββ table-of-contents.ts # TOC generation utilities
β βββ config.ts # Site configuration
βββ tests/
β βββ features.spec.js # Playwright feature tests
β βββ features.spec.js-snapshots/ # Visual regression baselines
βββ astro.config.mjs # Astro configuration with MDX
βββ playwright.config.js # Playwright test configuration
βββ package.json
βββ tsconfig.json # TypeScript configuration
All site configuration is centralized in src/config.ts
:
export const config = {
title: "Volks-Typo",
description: "A blog exploring the intersection of design, typography, and history",
author: {
name: "Your Name",
bio: "Writer, designer, and explorer of aesthetic tensions.",
avatar: "/avatar.jpg"
},
social: {
github: "https://github.com/yourusername",
twitter: "https://twitter.com/yourusername",
instagram: "https://instagram.com/yourusername",
linkedin: "https://linkedin.com/in/yourusername",
email: "your.email@example.com"
},
siteUrl: "https://yourdomain.com"
};
Volks-Typo uses a modern, clean typography system focused on readability and strong hierarchy:
- Primary Headings: Oswald - Bold, condensed sans-serif for maximum impact
- Secondary Headings: Roboto Condensed - Clean, professional condensed font
- Body Text: Work Sans - Highly readable sans-serif optimized for web
- Code/Monospace: JetBrains Mono - Developer-friendly monospace font
- Site Title: Custom SVG with distinctive styling
The theme uses a clean, professional monotone palette with strategic red accents:
Monotone Base
- White (
#ffffff
) - Primary background - Light Gray (
#f5f5f5
) - Surface backgrounds, cards - Medium Gray (
#888888
) - Muted text, borders - Dark Gray (
#333333
) - Secondary text - Black (
#000000
) - Primary text, maximum contrast
Accent Color
- Red (
#dc2626
) - Primary accent for headings, links, and interactive elements
- Mobile/Tablet: Single column, full-width content
- Desktop (1024px+): Two-column layout with left sidebar
- Grid: 8-point grid system for consistent spacing
- Max Width: 1200px container for optimal reading
Fully responsive design with mobile-optimized dark mode
The dark mode toggle appears automatically in the header. Users can switch themes, and their preference is saved in localStorage. The theme initializes without FOUC (Flash of Unstyled Content).
Features:
- π One-click theme switching with smooth transitions
- πΎ Persistent theme preference across sessions
- π¨ Carefully optimized contrast for all UI elements
- π± Works seamlessly on all devices
- β‘ No flash of unstyled content on page load
- βΏ Maintains accessibility standards in both themes
Blog listing with optimized dark mode styling
Create blog posts using either .md
or .mdx
files in src/content/blog/
. MDX files support all Markdown syntax plus JSX components:
---
title: "My MDX Post"
date: "2025-07-12"
---
# Regular Markdown
<div style={{color: 'red'}}>
This is JSX in MDX!
</div>
Reading time is automatically calculated and displayed on blog posts and listings. Based on ~200 words per minute for technical content.
TOC is auto-generated for blog posts with headings (H2-H4). It includes scroll spy functionality to highlight the current section.
Run the comprehensive Playwright test suite with npm run test:features
. Tests cover dark mode functionality, MDX rendering, reading time display, TOC navigation, and visual regression testing.
Create blog posts as Markdown or MDX files in src/content/blog/
:
---
title: "The Intersection of Function and Form"
date: "2024-01-15"
author: "Your Name"
excerpt: "Exploring how Bauhaus principles shaped modern design thinking"
categories: ["Design", "History"]
tags: ["bauhaus", "modernism", "typography"]
image: "/images/bauhaus-poster.jpg"
draft: false
---
Your content here...
Field | Type | Required | Description |
---|---|---|---|
title |
string | Yes | Post title |
date |
string | Yes | Publication date (YYYY-MM-DD) |
author |
string | No | Author name (defaults to config) |
excerpt |
string | No | Brief description for listings |
categories |
array | No | Post categories |
tags |
array | No | Post tags |
image |
string | No | Featured image path |
draft |
boolean | No | Hide from listings if true |
All commands are run from the root of the project:
Command | Action |
---|---|
npm install |
Install dependencies |
npm run dev |
Start local dev server at localhost:4321 |
npm run build |
Build production site to ./dist/ |
npm run preview |
Preview your build locally |
npm run astro ... |
Run CLI commands like astro add |
npm run check |
Check TypeScript types |
npm run lint |
Run ESLint |
npm run test:features |
Run Playwright feature tests |
Volks-Typo can be deployed to any static hosting service. The theme now supports environment-based configuration for different deployment scenarios.
The theme uses environment variables to configure the deployment:
- Copy
.env.example
to.env
- Set the appropriate values based on your deployment target
# No configuration needed - works out of the box!
npm run build
Or set environment variables in your deployment platform:
SITE=https://your-site.netlify.app
# Leave BASE_PATH empty for root domain deployments
# Set in .env or as environment variables
SITE=https://yourusername.github.io
BASE_PATH=/your-repo-name/
npm run build
# Set in .env
SITE=http://localhost:4321
BASE_PATH=/volks-typo/
npm run dev
# Standard build
npm run build
# Build with custom environment
SITE=https://example.com BASE_PATH=/blog/ npm run build
Volks-Typo is optimized for speed and efficiency:
- Zero JavaScript - Pure HTML and CSS
- Minimal CSS - ~20KB gzipped total
- Self-hosted fonts - No external requests
- Optimized images - Using Astro's Image component
- Static generation - Fast page loads
Edit CSS variables in src/styles/global.css
:
:root {
/* Monotone Palette */
--color-white: #ffffff;
--color-light-gray: #f5f5f5;
--color-medium-gray: #888888;
--color-dark-gray: #333333;
--color-black: #000000;
/* Accent Color */
--color-accent-red: #dc2626;
}
Modify font families in src/styles/global.css
:
:root {
--font-heading-primary: 'Oswald', sans-serif;
--font-heading-secondary: 'Roboto Condensed', sans-serif;
--font-body: 'Work Sans', sans-serif;
--font-mono: 'JetBrains Mono', monospace;
}
The theme uses CSS Grid for layouts. Key files:
src/components/Layout.astro
- Main grid containersrc/components/Sidebar.astro
- Desktop sidebarsrc/styles/global.css
- Responsive breakpoints
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add some amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Design philosophy inspired by the Bauhaus movement, WW2-era monumental aesthetics, and street & subway signage from Vienna π¦πΉ
- Built with Astro
- Typography powered by Fontsource
- Changelog: CHANGELOG.md - Detailed version history and release notes
- Releases: GitHub Releases - Download specific versions
- Issues: GitHub Issues - Bug reports and feature requests
- Discussions: GitHub Discussions - Community support
- Author: @jdrhyne β’ Personal blog: jdrhyne.me (under construction π§)
Volks-Typo by @jdrhyne β’ MIT License