A static site generated blog where articles are written in markdown and rendered as beautiful HTML pages. Powered by C# and GitHub Actions.
- Markdown-Based: Write posts in simple, readable markdown
- Static Site Generation: Fast, secure, and easy to host
- C# Powered: Built with .NET and the Markdig library
- Automated Deployment: GitHub Actions builds and publishes automatically
- RSS Feed: Keep readers updated with new content
- Clean Design: Minimal, responsive, and accessible interface
- Agentic Support: Copilot agent instructions for content creation
- Create a new markdown file in the
posts/directory - Use the naming convention:
YYYY-MM-DD-descriptive-slug.md - Add frontmatter with title, date, and tags
- Write your content in markdown
---
title: Your Post Title
date: 2026-02-25
tags: tag1, tag2, tag3
image: post-slug.png
---
# Main Heading
Your content here...
## Section Heading
More content...Featured Images: Each post should include a featured image. Use the @image-generator Copilot agent to create AI-generated images using HuggingFace Inference API. Images are saved to posts/images/ with the post slug as filename.
See posts/2026-02-25-welcome.md for a complete example.
- .NET 10 SDK or later
# Restore dependencies
dotnet restore
# Build the solution
dotnet build
# Generate the static site
dotnet run --project src/SiteGenerator/SiteGenerator.csprojThe generated site will be in the output/ directory.
To preview the site locally, you can use any static web server:
# Using Python
cd output
python -m http.server 8000
# Using Node.js
cd output
npx http-server
# Using .NET
cd output
dotnet serveThen open http://localhost:8000 in your browser.
The blog automatically deploys to GitHub Pages when you push to the main branch.
Every build runs comprehensive quality checks:
- Unit Tests: xUnit tests verify core site generator functionality
- E2E Tests: Playwright tests validate the generated site
- Link Checking: All links are validated using lychee
- HTML Validation: HTML is validated using html-validate
- Accessibility Testing: Automated accessibility checks using pa11y-ci
- Security Scanning: CodeQL and dependency review protect against vulnerabilities
- Go to your repository Settings > Pages
- Set Source to "GitHub Actions"
- The workflow will automatically build and deploy on push
You can also manually trigger deployment:
- Go to Actions tab in your repository
- Select "Build and Deploy" workflow
- Click "Run workflow"
Vibeblogging/
βββ .copilot/
β βββ agents/ # Agentic instruction files
β βββ blog-post-writer.md
β βββ content-manager.md
β βββ image-generator.md
βββ .github/
β βββ workflows/
β βββ deploy.yml # GitHub Actions workflow
βββ posts/ # Markdown blog posts
β βββ images/ # Blog post featured images
β βββ 2026-02-25-welcome.md
βββ scripts/ # Utility scripts
β βββ generate_blog_image.py # HuggingFace API image generator
β βββ run-a11y-tests.sh
βββ src/
β βββ SiteGenerator/ # C# static site generator
β βββ Program.cs
β βββ SiteGenerator.csproj
βββ templates/ # HTML templates
β βββ index.html # Homepage template
β βββ post.html # Post page template
β βββ styles.css # Site styles
βββ output/ # Generated static site (gitignored)
βββ .gitignore
βββ README.md
βββ Vibeblogging.sln
This repository includes Copilot agent instruction files to assist with content creation:
- blog-post-writer.md: Guidelines for writing engaging blog posts
- content-manager.md: Instructions for managing and organizing content
- image-generator.md: AI-powered image generation using HuggingFace Inference API
Blog posts can include AI-generated featured images created using HuggingFace Inference API:
Setup:
- Create a free account at HuggingFace.co
- Generate an API token at HuggingFace Settings
- Set the
HUGGINGFACE_API_KEYenvironment variable - Use the
@image-generatoragent to generate images
Style: Images are generated in a "pseudo realistic cell-shaded" style with focus and blur effects, featuring everyday scenes or objects (such as office items, household objects, or empty spaces) suitable for technical blog posts.
Manual Usage:
python scripts/generate_blog_image.py \
--title "Your Post Title" \
--content "Brief description of themes" \
--scene "A creative scene description with everyday objects" \
--output "post-slug.png"See scripts/README.md for detailed documentation.
These files help Copilot understand the blog structure and provide better assistance when creating or editing content.
Edit files in the templates/ directory:
index.html: Homepage layoutpost.html: Individual post layoutstyles.css: Site-wide styling
Modify src/SiteGenerator/Program.cs to customize:
- Markdown processing
- HTML generation
- RSS feed format
- Slug generation
- Post metadata handling
- Use descriptive titles (50-60 characters ideal)
- Include 2-5 relevant tags per post
- Structure content with clear headings
- Write in a conversational, engaging tone
- Use code blocks with syntax highlighting
- Keep paragraphs concise (3-4 sentences)
- Proofread before publishing
dotnet testdotnet formatContributions are welcome! Feel free to:
- Add new features to the site generator
- Improve templates and styling
- Submit blog posts
- Report bugs or suggest improvements
For questions or issues, please open an issue in the GitHub repository.
Built with β€οΈ using C# and .NET