Why I am building tech.hwmoon.com as a static engineering blog
The platform decision behind HWMOON Tech Lab: Astro, Azure Static Web Apps, Markdown content, and a layout optimized for engineering notes.
tech.hwmoon.com is meant to be a personal engineering blog, but I do not want it to feel like a throwaway side page. The goal is to keep the publishing stack simple while making the writing surface strong enough for cloud notes, migration logs, troubleshooting records, and technical essays.
The decision is to use the same broad platform family as the news site: Astro + Markdown + Azure Static Web Apps.
Design principle
The blog should be boring in the right places.
- Static HTML first
- Markdown for posts
- No database for ordinary content
- Git history as the editorial log
- Azure Static Web Apps for hosting
- Terraform for DNS and cloud resources
That gives me a small, reproducible stack. The site can move between subscriptions or tenants without depending on hidden platform state.
Why Astro
Astro is a good fit because most technical posts are content-heavy pages. I do not need a large client-side application to render a document about DNS, CI/CD, or infrastructure decisions.
The useful parts are:
- Content collections with schema validation
- Static route generation
- Markdown rendering
- Component-based layouts
- Low JavaScript by default
The last point matters. A technical blog should load fast, be readable on mobile, and remain easy for search engines and link previews to understand.
Why a separate subdomain
The HWMOON domain can support multiple properties with different jobs.
| Subdomain | Role |
|---|---|
news.hwmoon.com | IT briefing and publisher-style content |
tech.hwmoon.com | Personal technical writing and build logs |
compass.hwmoon.com | Existing NAS-hosted WordPress service |
Keeping tech separate avoids mixing personal engineering notes with the news product. It also makes analytics, sitemap, Search Console, and future AdSense decisions cleaner.
Content model
The blog content model is intentionally small.
const postSchema = z.object({
title: z.string(),
description: z.string(),
publishedDate: z.string(),
category: z.string(),
tags: z.array(z.string()),
difficulty: z.enum(["beginner", "intermediate", "advanced"]),
readTime: z.string(),
featured: z.boolean(),
draft: z.boolean()
});
The schema is not there to make writing harder. It prevents silent quality drift. Every published post should have enough metadata for cards, archives, SEO, and structured data.
Layout direction
The site uses the same calm, professional tone as the news platform, but the information structure is different.
The news site is optimized for article volume and scanning. The tech blog is optimized for long-form reading, code blocks, checklists, and reference-style posts.
That changes the layout:
- Home highlights a few posts and topic lanes
- Post detail pages give code blocks real visual weight
- Category pages collect related build notes
- Footer links point back to the wider HWMOON ecosystem
Deployment shape
The intended production path is:
Git repository
-> Azure DevOps pipeline
-> npm install
-> astro build
-> Azure Static Web Apps deploy
-> tech.hwmoon.com
DNS can stay in Azure DNS. The tech record should point to the Static Web Apps default hostname after the Static Web App is created and the custom domain is configured.
What this unlocks
This gives me a place to publish the work behind the work:
- Azure DNS and domain setup
- Synology NAS operations
- Terraform module decisions
- CI/CD agent migration notes
- Search Console and AdSense preparation
- Static publishing architecture
- Practical AI automation experiments
The important part is not just documenting commands. The useful posts explain why a decision was made, what failed, what changed, and how I would rebuild it later.