Building this blog: Astro 7, Bear, and a pile of static files
How blog.humbleha.us works: an Astro 7 static build, posts written in Bear on a Mac or phone, and a sync script that turns tags into published pages.
This blog is the newest thing in the lab, and fittingly, its first post is about how it was built.
The shape of it
The whole site is static HTML. There’s no server rendering, no database, no JavaScript framework running in your browser — the only scripts that ship are a theme toggle, a search box, and a couple of copy buttons. Everything else is plain markup generated at build time by Astro 7, which landed in June 2026 with a Rust compiler and the Rolldown bundler, so builds are quick even as the post count grows.
Hosting is Netlify, same as the main site, with DNS on Cloudflare. Deploys happen from the Mac with one command.
Writing happens in Bear
The part I care most about: posts are written in Bear, not in a CMS. Bear syncs between the Mac and the phone, so drafting can happen anywhere.
The publishing mechanic is just tags:
- A note tagged
#blog.humbleha.us/draftis a draft. Nothing happens. - Swap it to
#blog.humbleha.us/publish/build-logs(or another category) and the next publish run picks it up. - The tag root is the blog’s domain, so more blogs can share the same Bear library later without stepping on each other.
A sync script reads Bear’s local database read-only, converts tagged notes into markdown files with SEO frontmatter, copies any images across, and pins each post’s URL to the note’s internal ID — so retitling a note never breaks a link.
The SEO plumbing
Every post gets a generated social card (the 1200×630 image you see when a link is shared), canonical URLs, JSON-LD structured data, an RSS feed, a sitemap, and an llms.txt for the agentic web. None of that requires thinking about at write time — the build does it.
There’s also a growing set of pages generated from data rather than prose — starting with one page for every live experiment and app in the lab, built straight from the same catalogue file the main site uses.
Why not just add a blog to the main site?
Isolation. The main site has its own deploy pipeline, performance gates, and a lot of moving parts. The blog shares none of that — it can’t break the lab, and the lab can’t break it. Two small systems beat one big one.
More build logs to come. If you want them as they land, the RSS feed is on the homepage.