Before pushing, test your site locally:
python3 serve.pyThen open http://localhost:8000 in your browser.
- Changes to HTML/CSS are reflected instantly
- No build step needed
- Press
Ctrl+Cto stop the server
Posts are written as Markdown files in /posts/markdown/ and automatically converted to HTML.
-
Create a new
.mdfile in/posts/markdown/:/posts/markdown/2026-01-12-your-post-title.md -
Write in Markdown:
# Your Post Title Opening paragraph. ## Section heading Body content with **bold** and `code`. - List items - Another item
-
Convert all markdown to HTML:
python3 convert.py
That's it. The script will:
- Convert all
.mdfiles in/posts/markdown/to HTML - Use your post template automatically
- Update
/posts/index.htmlwith links to all posts (newest first) - Estimate read time
For live editing, watch the markdown directory:
python3 convert.py --watchOr use the shell wrapper:
## Setup (one time)
### 1. Install pandoc
```bash
brew install pandocpip install watchdogAfter converting posts:
git add posts/markdown/ posts/*.html posts/index.html
git commit -m "Update blog posts"
git push/posts/
├─ index.html ← Blog listing (auto-updated)
├─ template.html ← Post template (used for all posts)
├─ convert.py ← Conversion script
├─ WORKFLOW.md ← This file
├─ 2026-01-12-post-one.html
├─ 2026-01-12-post-two.html
└─ markdown/
├─ 2026-01-12-post-one.md
└─ 2026-01-12-post-two.md
The conversion script automatically:
- Extracts title from the first
# Headingin your markdown - Extracts description from the first paragraph (used in blog index)
- Extracts date from filename (e.g.,
2026-01-12in2026-01-12-title.md) - Estimates read time based on word count
You don't need to add any frontmatter—just write markdown the normal way.
- Use
# Titlefor the main heading - Use
## Sectionsfor subsections - Use
### Subsectionsfor nested headings - Use
**bold**and_italic_for emphasis - Use
`code`for inline code - Use triple backticks for code blocks
That's it. Write your post, run python3 convert.py, and you're done.