Write with Issues, build with Actions, ship with Pages. A fully automated static blog template.
Overview
Easy-blogging turns GitHub Issues into polished static pages. Any Issue with the target label is rendered by a GitHub Actions workflow, committed back to the repository, and served via GitHub Pages. No frameworks or heavy tooling are required, making it ideal for lightweight personal blogs.
Highlights
- Issues become posts: Issue title = post title; body supports Markdown, fenced code blocks, tables, and TOC.
- Author & label guardrails: The workflow checks
BLOG_OWNERandBLOG_LABELbefore generating pages, so only approved Issues are published. - Hands-free publishing: Generates
_posts,list.html, andindex.html, commits changes, then triggers the Pages deploy workflow automatically. - Consistent design:
style.cssprovides a dark, glassy aesthetic with cards, buttons, and article layout including navigation and dates. - Minimal dependencies: Only the
markdownpackage is required; the rest is pure Python and static assets.
Repository layout
/blog-repo
├── /_posts # Generated post HTML files (written by the workflow)
├── /assets # Placeholder for static assets
├── /config/author.json # Avatar, name, bio, CTA text
├── /scripts/generate_blog.py
├── /markdown.py # Lightweight Markdown converter (no external deps)
├── /index.html # Home page (author info + CTA)
├── /list.html # Post list page
├── /style.css # Shared styles (Vercel-inspired)
└── .github/workflows/
├── blog-post-generator.yml # Issue-to-page pipeline
└── static.yml # Pages deployment on push
Quick start
- Fork and enable Pages: Set GitHub Pages to serve from the
mainbranch (or your default branch). - Configure variables (optional) under Repository Settings → Variables:
BLOG_LABEL: Label to collect posts, defaultblog-post.BLOG_OWNER: GitHub username allowed to create post Issues, default is the repo owner.- Customize author info: Update
config/author.jsonwith avatar URL, display name, bio, and CTA text. - Make an initial push to
mainso Pages can complete the first deployment. - Publish a post: Open an Issue with the
BLOG_LABEL; the title becomes the post title and the body is the content. - Let automation work: The workflow renders/updates pages and commits them; GitHub Pages then serves the updated site.
Workflows
- Blog post generator (
.github/workflows/blog-post-generator.yml) - Triggers: Issue open/edit/label/reopen/delete, or manual
workflow_dispatch. - Steps:
- Optionally close Issues not opened by
BLOG_OWNER. - Install dependencies and run
scripts/generate_blog.pyto render static pages from eligible Issues. - Commit and push changes if any, then dispatch the Pages deploy workflow.
- Optionally close Issues not opened by
- Deploy static content to Pages (
.github/workflows/static.yml) - Triggers: Pushes to
mainor manual dispatch. - Purpose: Uploads the repository as a Pages artifact and deploys it to GitHub Pages.
Customization
- Styling: Edit
style.cssto tweak colors, typography, and card visuals. - Home content: Adjust avatar, name, bio, and CTA text in
config/author.json. - Author config details:
author.jsonships withname,tagline,bio,avatar, andcta_text. The generator reloads these values and rewritesindex.htmlevery time a post build runs, so changing the config alone won't alter the live site until the next post publish (or a manual run ofscripts/generate_blog.py). - Assets: Place images and media under
/assetsand reference them directly in posts. - Local preview:
pip install -r requirements.txt, then runpython scripts/generate_blog.pywithGITHUB_TOKEN,BLOG_LABEL, andBLOG_OWNERset to fetch Issues.
Enjoy blogging with a zero-fuss pipeline!