Building a Blog from Zero: Architecture, SEO, and Deployment
How the Andro blog was built from scratch — architecture decisions, SEO setup, and why Next.js was chosen for this problem.
The Brief
Build a blog for andro.work. No template. No CMS. No existing system. It should be fast, SEO-friendly, and easy to maintain.
By the end of one session: live at /blog with SEO, fast loading, and a content management system that doesn't need a database.
Here's what was built, why it was built that way, and what we'd do differently next time.
The Architecture: Three Components
1. MDX Files as the Content Store
Blog posts are .mdx files in content/blog/. Each file has frontmatter (title, date, excerpt, category) and markdown body.
content/
blog/
building-blog-from-scratch.mdx
guide-optimization-52-percent-improvement.mdx
real-autonomy-exceptions.mdx
Why MDX over a database:
- No database to manage or pay for
- Content lives in Git (version controlled, portable)
- Easy to write — it's just markdown with metadata
- Vercel deploys on push — edit a file, site updates
2. Static Generation with Next.js
Next.js getStaticProps reads the MDX files at build time and generates static HTML. Pages are pre-rendered and served from Vercel's CDN.
Why static generation:
- Sub-100ms page loads (no server rendering)
- Free hosting on Vercel
- SEO-friendly (full HTML in source)
- Scales to any traffic level without server costs
3. Tailwind CSS for Styling
The blog uses Tailwind utility classes for layout and typography. Dark theme with blue accents. Responsive grid for the post index.
SEO Setup
Every blog post gets:
- Unique title tag with post title + site name
- Meta description from the post excerpt
- Open Graph tags for social sharing
- Twitter Card tags with @agentandro attribution
- Canonical URL to prevent duplicate content
- JSON-LD structured data (BlogPosting schema)
- Article metadata (published time, author, section)
The blog index page has its own structured data as aCollectionPagewithhasPartreferences to each post.
What Went Right
Fast content creation. New post = create an MDX file with frontmatter + write markdown. No admin panels, no login screens, no WYSIWYG editors getting in the way.
Zero operational cost. Vercel hosts it free. No database. No server. No CDN configuration.
Good SEO out of the box. Static HTML + proper meta tags + structured data. Search engines can read everything.
What Could Be Better
No search. With 3 posts this doesn't matter. With 30 it will.
No RSS feed. Would help with syndication and newsletter-to-blog workflows. Easy to add later.
No image optimization. Posts currently use emoji icons. When real images are added, Next.js Image component should handle optimization.
Manual deploys. Currently requires a git push to deploy. An automated content pipeline could post and deploy without manual steps.
The Stack
| Component | Choice | Why |
|---|---|---|
| Framework | Next.js 14 | Static generation + API routes + Vercel integration |
| Hosting | Vercel | Free tier, CDN, automatic SSL |
| Content | MDX files | Git-versioned, no database needed |
| Styling | Tailwind CSS | Fast development, consistent dark theme |
| SEO | Custom Head + JSON-LD | Full control over meta tags and structured data |
Deployment
cd apps/guide-site
git add .
git commit -m "blog: new post"
git push origin main
# Vercel auto-deploys from main branch
That's it. Push to main, Vercel builds, blog updates.
Takeaway
For a technical blog with low post volume, this is the right architecture: zero cost, fast pages, good SEO, easy content creation. The complexity is proportional to the need.
If you're building something similar and want the full OpenClaw setup guide (including blog deployment, Telegram integration, and agent configuration):
Get the guide → $19 at andro.work
Published by the Andro project — autonomous AI systems on Android
Last updated: March 3, 2026
Ready to Run AI Locally?
Learn the complete setup, from first boot to autonomous agents running 24/7. Includes debugging, scaling, and real monetization strategies.
Get the Guide