A modern, performant personal blog built with Astro v5.0, featuring the elegant Everforest color theme, responsive design, and a sophisticated content management system.
This repository contains a fully-featured blog platform with:
- Modern Stack: Astro 5.0 SSG with selective React hydration for optimal performance
- Beautiful Themes: Custom Everforest theme with smooth light/dark mode transitions
- Content Management: Organized blog posts with categories and automatic routing
- Developer Experience: TypeScript, hot reload, and comprehensive error handling
- Performance: Static generation, optimized assets, and minimal JavaScript
| Light Mode (Everforest Light) | Dark Mode (Everforest Dark) |
|---|---|
![]() |
![]() |
- Node.js 18+ (check with
node --version) - npm or yarn (npm comes with Node.js)
- Git (for cloning the repository)
# Clone the repository
git clone https://github.com/withLinda/withLinda.dev.git
cd withLinda.dev
# Install dependencies
npm install
# Start development server
npm run dev
# Open http://localhost:4321 in your browser| Command | Description |
|---|---|
npm run dev |
Start development server at http://localhost:4321 |
npm run build |
Build for production (includes type checking) |
npm run preview |
Preview production build locally |
npm run astro sync |
Sync content types (run after adding new content) |
npm run astro check |
Type check all TypeScript files |
-
Choose a category folder in
src/content/blog/:src/content/blog/ ├── Love-the-storm-that-taught-you-to-build-better-shelters/ ├── Mastery-sleeps-in-fragments-until-curiosity-fuses-them-awake/ └── a-powerful-river-cant-be-dammed-only-redirected/ -
Create a new
.mdfile with a descriptive filename (becomes the URL):# Example: creating a new post about TypeScript touch src/content/blog/mastery/typescript-tips-2025.md -
Add frontmatter and content:
--- title: "Essential TypeScript Tips for 2025" description: "Modern TypeScript patterns and best practices" pubDate: 2025-01-22 tags: ["typescript", "programming", "web-dev"] author: "Linda" --- # Essential TypeScript Tips for 2025 Your content here... ## Code Examples ```typescript // Code blocks are automatically highlighted const greeting: string = "Hello, World!";
-
Sync content types (required for new posts):
npm run astro sync
-
View your post at
http://localhost:4321/blog/[category]/[filename]
---
title: "Your Post Title" # Displayed as heading
description: "Brief summary" # Used for SEO and previews
pubDate: 2025-01-22 # Publication date (YYYY-MM-DD)
------
updatedDate: 2025-01-23 # Last update date
tags: ["astro", "web-dev"] # Post tags (array)
author: "Linda" # Author name
----
Create a new folder in
src/content/blog/with a URL-safe name:mkdir src/content/blog/your-new-category
-
Add the display name in
src/config.ts:export const CATEGORY_NAMES: Record<string, string> = { 'your-new-category': 'Your New Category Display Name', // ... existing categories }
-
Add posts to the new category folder
The site uses a sophisticated color system based on the Everforest palette:
src/styles/
├── global.css # Main entry point
└── themes/
├── everforest-base.css # Color definitions
├── everforest-light.css # Light mode overrides
├── everforest-dark.css # Dark mode overrides
├── body-backgrounds.css # Background patterns & orbs
├── layout-backgrounds.css # Layout-specific styles
└── post-cards.css # Blog card styles
- Light mode adjustments: Edit
src/styles/themes/everforest-light.css - Dark mode adjustments: Edit
src/styles/themes/everforest-dark.css - Base colors: Modify
src/styles/themes/everforest-base.css
// Use semantic color variables in Tailwind classes
<div className="bg-everforest-bg text-everforest-fg">
<h1 className="text-everforest-yellow">Title</h1>
<p className="text-everforest-text">Content</p>
</div>- Framework: Astro 5.13 - Static Site Generator
- UI Components: React 18.3 - For interactive components
- Styling: Tailwind CSS v4.1 - Utility-first CSS
- Language: TypeScript 5.6 - Type safety
- Syntax Highlighting: Shiki - Beautiful code blocks
- Icons: React Icons - Icon library
withLinda.dev/
├── src/
│ ├── components/ # UI components
│ │ ├── *.astro # Static components (SSG)
│ │ └── *.tsx # Interactive React components
│ ├── content/
│ │ └── blog/ # Blog posts (organized by category)
│ ├── layouts/
│ │ └── BlogPost.astro # Blog post template
│ ├── pages/
│ │ ├── index.astro # Homepage
│ │ ├── about.md # About page (Markdown)
│ │ └── blog/
│ │ └── [...id].astro # Dynamic blog routes
│ ├── styles/ # Global styles and themes
│ ├── utils/ # Utility functions
│ ├── config.ts # Site configuration
│ └── content.config.ts # Content schema (Zod validation)
├── public/ # Static assets
├── astro.config.mjs # Astro configuration
├── tsconfig.json # TypeScript configuration
├── postcss.config.js # PostCSS for Tailwind v4
└── package.json # Dependencies
Server-rendered at build time, no client JavaScript:
BaseHead- Meta tags and SEOHeader- Navigation barFooter- Site footerBody- Layout wrapper with animationsContent- Main content container
Hydrated on the client for interactivity:
ThemeToggleButton- Light/dark mode switcherMobileMenu- Responsive navigationCopyCodeButton- Code block copy functionality
<!-- Load immediately (critical UI) -->
<ThemeToggleButton client:load />
<!-- Load when visible (below fold) -->
<MobileMenu client:visible />
<!-- Load when browser is idle -->
<CopyCodeButton client:idle /># Type check and build
npm run build
# Preview production build locally
npm run previewThe build output is in the dist/ folder, ready for deployment.
# Install Vercel CLI
npm i -g vercel
# Deploy
vercel --prod- Push to GitHub
- Connect repository to Netlify
- Build command:
npm run build - Publish directory:
dist
# Add to package.json scripts
"deploy": "npm run build && gh-pages -d dist"
# Deploy
npm run deployCreate a .env file for local development:
# Site URL (optional, for sitemap)
PUBLIC_SITE_URL=https://withlinda.dev- Start dev server:
npm run dev - Make changes: Edit files, see live updates
- Add content: Create posts, run
npm run astro sync - Type check:
npm run astro check - Build:
npm run build
# Static component
touch src/components/MyComponent.astro
# Interactive component
touch src/components/MyComponent.tsx- Theme colors: Edit files in
src/styles/themes/ - Global utilities: Add to
src/styles/global.css - Component styles: Use Tailwind classes
# Check for updates
npm outdated
# Update all dependencies
npm update
# Update specific package
npm install package-name@latest- Run
npm run astro syncafter adding new content - Check frontmatter is valid YAML
- Ensure file has
.mdor.mdxextension
- Tailwind v4 uses
@import 'tailwindcss'(not@tailwind) - Restart dev server if hot reload fails
- Check color variable names match Everforest system
# Type check
npm run astro check
# Clean install
rm -rf node_modules package-lock.json
npm install- Must be
.tsxfile (not.astro) - Needs client directive (
client:load, etc.) - Check browser console for errors
- Everforest Color Scheme
- Color palette available in
src/styles/themes/everforest-base.css
This project is open source and available under the MIT License.
Contributions, issues, and feature requests are welcome! Feel free to check the issues page.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Built with ❤️ using Astro • Styled with Tailwind CSS • Themed with Everforest

