-
Step 1 · Pick your writing setup (hand-written vs generator)
Choose first: raw HTML / static generator (Hugo, VitePress) / hosted platform
The core of a blog is writing, not fighting with tooling. Decide which of these you want:
- Hand-written HTML: one .html per post, you maintain the index page yourself. Zero dependencies, fully transparent — and painful once you have many posts.
- Static generator (recommended for beginners): write Markdown, let the tool produce HTML, indexes, archives and RSS. Popular options: Hugo (Go, fastest builds), VitePress (Vue ecosystem, ideal for docs-style blogs), 11ty (flexible).
- Hosted platform: Medium, dev.to, Hashnode. Easy, but the traffic and the readers aren't yours.
My advice: if you want something that compounds, pick Hugo or VitePress — write
.mdlocally and build the site with one command. Don't spend three days choosing tools. The tool doesn't matter; the writing does.Checklist
- One writing setup chosen
- The tool runs and produces an empty site
- You know Markdown is your writing format
-
Step 2 · Set up the local writing workflow
Directory conventions + front matter + images + categories and tags
Once the setup is chosen, build the skeleton:
- Directory conventions:
content/holds your.mdposts,public/ordist/is the build output (never edit it by hand), and site name / author / navigation live in the config. - Front matter: each
.mdstarts with metadata — title, date, category, tags, cover image. The generator uses it to group posts automatically. - Images: put post images in
static/img/and reference them with relative paths. Don't hotlink an external image host — when that host dies, your posts break. - Categories and tags: few and broad categories (tech / life / notes), many and specific tags (nginx, docker, interviews).
Write one "Hello World" post and run the whole pipeline once. That beats planning ten outlines.
Checklist
- There is a .md with front matter under content/
- The build produced the matching HTML under public/
- Images display correctly
- Directory conventions:
-
Step 3 · Auto-generate index, archive and tag pages
One command builds lists, categories, tags and RSS
The best part of a generator: configure once, get everything.
Build command (Hugo example):
hugo(for local preview usehugo server -D, it reloads as you save)It generates for you:
- Home page post list, newest first
- Category and tag pages, aggregated from front matter
- Archive pages grouped by year and month
- RSS: on by default, usually at
/index.xml— that's your subscription feed
If you hand-write instead, you still need an index page and an RSS file — generate the RSS XML with a script rather than typing it. The output is plain static files, so any static host will serve them.
Checklist
- The home page lists posts after building
- /categories/ and /tags/ are reachable
- The RSS file exists and is valid
-
Step 4 · Add RSS + third-party comments
Keep readers: RSS feed + backend-free comments (Giscus and friends)
A blog isn't only writing — it's keeping people.
RSS: the
/index.xmlyou generated is the feed. Put an RSS icon linking to it and readers can subscribe in Feedly or Inoreader. To aggregate or convert feeds, self-host RSSHub.Comments (no backend of your own):
- Giscus: backed by GitHub Discussions, free, ad-free, looks best; the repo must be public.
- Disqus: quick to embed, but ad-supported, slow, and flaky in some regions.
- Waline: self-hostable, ships with an admin panel.
I'd use Giscus: fill in a few repo settings and you're done in minutes. Readers can talk to you, and you maintain no database.
Checklist
- The page shows an RSS entry point
- Clicking it opens /index.xml
- The comment box loads and can submit
-
Step 5 · Deploy + SEO + distribution
Ship it, enable HTTPS, get indexed, turn readers into an asset
You've written locally — now put it online.
Deploy: upload
public/to your server (control panel or plain Nginx), or push to GitHub Pages / Vercel. Vercel connects to the repo and rebuilds on every push; it's the least friction for beginners.SEO: give every post a meta description and a proper title; submit your sitemap to Google Search Console; add alt text to images.
Distribution: a blog is a long-term asset. Link your other products at the end of posts (sparingly), and capture readers through RSS and email.
Backup: your
.mdsource files *are* the asset. Keep them in Git and push to GitHub — that's an automatic backup, and more reliable than tarballs.Checklist
- The blog is reachable online
- HTTPS shows no certificate warning
- The sitemap has been submitted
- Source files are under Git