A modern, fast blog built with Astro focusing on software development, productivity, and technology insights.
- β‘ Ultra-Fast Performance: Built with Astro 5 for optimal performance and static site generation
- π Advanced Search: Powered by Pagefind with keyboard shortcuts (
/to search) and mobile-optimized interface β οΈ Smart Content Dating: Automatic disclaimer system for potentially outdated technical content- π·οΈ Smart Tag System: Browse and filter posts by topics and categories
- π± Responsive Design: Beautiful, modern UI with Tailwind CSS and mobile-first approach
- π Wiki-Style Linking: Seamless internal linking between posts with custom remark plugins
- π‘ RSS & Sitemap: Stay updated with RSS feeds and SEO-optimized sitemaps
- β¨οΈ Keyboard Navigation: Power user shortcuts for search and navigation
- π Obsidian Integration: Complete content workflow with bidirectional sync
- πΌοΈ Image Optimization: Automatic image processing and optimization through Astro
- π¨ Enhanced Typography: Rich typography support with Tailwind Typography
- π Code Copy Feature: One-click copy functionality for code blocks
- π View Transitions: Smooth page transitions with Astro's ViewTransitions API
Modern Astro project with content collections and integrated tooling:
kevinjalbert.com/
βββ src/
β βββ components/ # Reusable Astro components
β βββ layouts/ # Page layouts
β βββ pages/ # File-based routing
β βββ styles/ # Global CSS and Tailwind
β βββ utils/ # Utility functions
β βββ config/ # Configuration files
β βββ content/ # Content collections (synced from Obsidian)
βββ scripts/ # Content sync and utility scripts
βββ integrations/ # Custom Astro plugins
βββ test/ # Test files
βββ public/ # Static assets
βββ [config files] # Astro, Tailwind, and test configuration
All commands are run from the root of the project, from a terminal:
| Command | Action |
|---|---|
npm install |
Install dependencies |
npm run dev |
Start development server |
npm run build |
Build site + generate search index with Pagefind |
npm run preview |
Preview the built site locally |
npm run sync |
Pull content from Obsidian vault |
npm run sync:push |
Push content back to Obsidian vault |
npm run test |
Run tests in watch mode |
npm run test:run |
Run tests once |
npm run check-dated |
Analyze content aging and disclaimer system |
npm run check-links |
Run comprehensive link validation (all types) |
npm run check-links:self |
Prevent absolute/relative links to own site |
npm run check-links:internal |
Validate internal links via astro-broken-links-checker |
npm run check-links:external |
Check external links with markdown-link-check |
Note: The search functionality requires a production build (
npm run build) to work properly as it depends on Pagefind indexing.
Core: Astro + TypeScript with strict mode Styling: Tailwind CSS with Typography plugin Search: Pagefind for fast, client-side search Content: Obsidian integration with wiki-style linking via remark plugins Testing: Vitest with TypeScript support Quality: Automatic sitemap, RSS feeds, and broken link checking
- Install dependencies:
npm install - Sync content from Obsidian:
npm run sync - Start development:
npm run dev - Build for production:
npm run build
The project features seamless integration with Obsidian for content creation through automated sync scripts:
# Pull content from Obsidian to project (standard workflow)
npm run sync
# Push content from project back to Obsidian (if needed)
npm run sync:pushWorkflow: Create and edit in Obsidian β Sync to project β Develop with hot reloading β Build with search indexing β Deploy
The blog includes an intelligent system for automatically flagging potentially outdated technical content to maintain reader trust and content quality.
- Dynamic Detection: Client-side JavaScript automatically evaluates post age and technology tags
- Age Buckets: Different technologies have different aging thresholds
- Real-time Aging: Content automatically ages into disclaimers without requiring site rebuilds
- Manual Overrides: Support for frontmatter flags
forceShowDatedDisclaimerandforceHideDatedDisclaimer
The system is configured via src/config/dated-content.json with tag-based aging rules:
{
"ageBuckets": [
{
"ageInMonths": 6,
"tags": ["ai", "chatgpt", "whisper"]
},
{
"ageInMonths": 24,
"tags": ["rails", "ruby", "tools"]
}
]
}Use the built-in audit tool to maintain the system:
npm run check-datedThis command provides:
- Analysis of posts by age bucket
- Detection of unused configuration tags
- Identification of post tags not in any bucket
- Manual override analysis
- Summary statistics
# Force show disclaimer (overrides automatic detection)
forceShowDatedDisclaimer: true
# Force hide disclaimer (prevents automatic detection)
forceHideDatedDisclaimer: trueNote: Zod validation prevents both flags from being true simultaneously.
Test Framework: Vitest with TypeScript support
Coverage: Wikilinks plugin and core functionality
Commands: npm run test (watch) or npm run test:run (single run)
The project includes comprehensive link checking with three distinct approaches:
- Self Links (
check-links:self): Prevents absolute links to own domain and relative markdown links to maintain consistent linking patterns - Internal Links (
check-links:internal): Validates internal links using astro-broken-links-checker during build - External Links (
check-links:external): Checks external URLs using markdown-link-check
Run npm run check-links for complete validation or use individual commands for targeted checking.
Search: Press / to search, mobile-optimized interface
Content Discovery: Tag browsing at /tags, RSS feed at /rss.xml
Enhanced Content: Reading time calculation, wiki-style [[linking]]
Performance: Mobile-first responsive design with smooth transitions
Give a βοΈ if this project helped you!
This project is MIT licensed.