A developer's blog built on the AstroPaper theme, featuring automatic date management, modern tooling, and a focus on developer experience.
- Type-safe markdown with frontmatter validation
- Automatic date management with Git hooks
- Featured post rotation with smart selection
- Interactive post creation with CLI tools
- Draft posts & pagination support
- Fuzzy search functionality
- Dynamic OG image generation
- RSS feed & sitemap generation
- Pre-commit hooks for automatic date updates
- Modern tooling (ESLint, Prettier, Husky, lint-staged)
- Cross-platform compatibility (macOS/Linux/Windows)
- CLI tools for post management
- TypeScript support throughout
- Super fast performance (Lighthouse 100)
- Responsive design (mobile to desktop)
- Accessible (Keyboard/VoiceOver tested)
- SEO-friendly with meta tags
- Light & dark mode support
# Interactive mode - prompts for all details
pnpm new-post
# Command line mode
pnpm new-post "My Post Title" --tags "javascript,tutorial" --featured --publishedDates are automatically managed via Git hooks, but you can also run manually:
# Update dates for changed files
pnpm update-dates
# Force update all posts
pnpm update-dates:force
# Preview changes without writing
pnpm update-dates --dry-runFor more details, see Date Management Documentation.
/
βββ .husky/ # Git hooks for automation
β βββ pre-commit # Automatic date management
βββ docs/ # Documentation
β βββ DATE_MANAGEMENT.md # Date system docs
βββ public/ # Static assets
β βββ assets/
β βββ pagefind/ # Generated search index
βββ scripts/ # Automation scripts
β βββ new-post.js # Post creation CLI
β βββ update-post-dates.js # Date management
βββ src/
β βββ components/ # Reusable UI components
β βββ data/
β β βββ blog/ # Blog posts (markdown)
β βββ layouts/ # Page layouts
β βββ pages/ # Astro pages/routes
β βββ styles/ # Global styles
β βββ utils/ # Helper functions
βββ date-manager.config.json # Optional config
βββ .lintstagedrc # Lint-staged config
βββ package.json # Dependencies & scripts- Blog posts:
src/data/blog/- All markdown blog posts - Scripts:
scripts/- CLI tools for post management - Documentation:
docs/- Project documentation
- Date Management System - Automatic date management with Git hooks
- Theme Configuration - Customize the blog theme
- Adding Posts - Manual post creation guide
- Color Schemes - Customize colors and themes
Framework - Astro - Static site generation
Language - TypeScript - Type safety
Styling - TailwindCSS - Utility-first CSS
Package Manager - pnpm - Fast, efficient package management
Linting - ESLint - Code quality
Formatting - Prettier - Code formatting
Git Hooks - Husky - Pre-commit automation
Staged Files - lint-staged - Run linters on staged files
Frontmatter - gray-matter - Parse markdown frontmatter
YAML Processing - yaml - YAML parsing and generation
Search - Pagefind - Static search
Icons - Tabler Icons - Clean SVG icons
Interactive Prompts - prompts - CLI user input
Date Management - Custom scripts with Git integration
Post Creation - Interactive and command-line post generation
Clone and set up the project:
# Clone the repository
git clone https://github.com/your-username/keif.github.io.git
cd keif.github.io
# Install dependencies
pnpm install
# Set up Git hooks
npx husky init
# Start development server
pnpm devThe blog will be available at http://localhost:4321.
# .env (optional)
PUBLIC_GOOGLE_SITE_VERIFICATION=your-google-site-verification-valueCustomize the date management system by creating date-manager.config.json:
{
"contentGlob": "src/data/blog/**/*.{md,mdx}",
"defaultAuthor": "Your Name",
"blogDir": "src/data/blog"
}| Command | Action |
|---|---|
pnpm install |
Install dependencies |
pnpm dev |
Start dev server at localhost:4321 |
pnpm build |
Build for production to ./dist/ |
pnpm preview |
Preview production build locally |
| Command | Action |
|---|---|
pnpm new-post |
Create a new blog post (interactive) |
pnpm new-post "Title" --published --tags "tag1,tag2" |
Create post with CLI args |
pnpm update-dates |
Update dates for changed files |
pnpm update-dates:force |
Update dates for all posts |
pnpm update-dates --dry-run |
Preview date changes |
pnpm rotate-featured |
Randomize featured posts (6 posts) |
pnpm rotate-featured:dry-run |
Preview featured post rotation |
| Command | Action |
|---|---|
pnpm format:check |
Check code format with Prettier |
pnpm format |
Format code with Prettier |
pnpm lint |
Lint code with ESLint |
pnpm sync |
Generate TypeScript types for Astro |
This blog setup includes several enhancements over the standard AstroPaper theme:
- Pre-commit hooks automatically update
modDatetimewhen posts are modified - New posts automatically get
pubDatetimeset during creation - ISO 8601 format with milliseconds for precise timestamps
- Cross-platform support (Windows, macOS, Linux)
- Smart selection combining recent posts with random older content
- Configurable count (default: 6 featured posts)
- Directory exclusions (skips _releases/, examples/ folders)
- Dry-run mode to preview changes before applying
- Interactive CLI for creating posts with prompts
- Command-line flags for automated post creation
- Dry-run mode to preview changes before applying
- Modern tooling with ESLint, Prettier, Husky, and lint-staged
- Git hooks ensure dates are always current
- Lint-staged keeps code clean on commit
- Type safety throughout with TypeScript
- Comprehensive documentation for all features
Licensed under the MIT License, Copyright Β© 2025
Built on AstroPaper by Sat Naing π¨π»βπ»
Enhanced with automatic date management and modern developer tooling.