When you're shipping code, documentation lives in markdown files or internal wikis. When you're building an engineering blog, it lives in the search index. SEO for your engineering blog isn't about gaming algorithms—it's about making sure the technical content your team writes gets discovered by the developers who need it. We built expona.dev with four practices that let us compete for search visibility without compromising on speed or developer experience.
Series hubs — The connective tissue for discovery
An engineering blog works best as a collection of interconnected articles, not isolated posts. We run themed series—like this 100-day Technical SEO guide—and the hub page is the entry point. Every series needs one canonical page that links to all its articles in order. This serves three purposes at once.
First, it creates a crawlable path. Search engines see the hub, follow links to every article in sequence, and understand the relationship between them. You're not just publishing 100 scattered posts; you're publishing a cohesive resource. Second, it gives readers a single landing page to bookmark. Someone finds your series hub for "Kafka in production" and now they have all ten articles in one place. Third, it concentrates internal link equity. Links to the hub will naturally accumulate, and the hub distributes that authority to every article in the series through its own links.
On expona.dev, each series hub is a simple table of contents with article titles, publication dates, and a short description of what the series covers. The hub itself is a regular blog post with a canonical URL—not a special template. Here's what the structure looks like:
<h1>100-Day Technical SEO for Developers: Complete Guide</h1>
<p>A complete 100-article series on search optimization for engineering teams...</p>
<h2>All articles</h2>
<ol>
<li><a href="/day-01-why-developers-ignore-seo">Day 1: Why developers ignore SEO</a></li>
<li><a href="/day-02-crawlability-foundations">Day 2: Crawlability foundations</a></li>
<li><a href="/day-03-robots-and-sitemaps">Day 3: Robots and sitemaps</a></li>
<!-- ... more articles ... -->
</ol>The key is making the hub page itself valuable. Don't just list links—include a summary of what each article covers and why someone would want to read it. This page will rank for broad terms like "technical SEO for developers" and funnel readers into the series.
Consistent metadata — The title tag that does the work
Every article needs three pieces of metadata: a meta title (the link text in search results), a meta description (the snippet), and an OG image (for social sharing). These aren't optional. They're the only thing most people see before deciding whether to click.
Your meta title should include your target keyword, but it needs to sound like it's written for humans. "Day 92: SEO for your engineering blog" works because it's scannable and it contains the phrase we want to rank for. Avoid stuffing keywords or repeating your publication name—it wastes characters. You get roughly 60 characters before truncation, so every word counts.
The meta description is your sales pitch. You have 160 characters. On expona.dev, we write descriptions that answer the reader's implicit question: "Will this article teach me something useful in the next five minutes?" Bad: "This article discusses SEO for blogs." Better: "How we set up expona.dev for search with series hubs, metadata, performance, and internal links."
Here's how we manage this in our publishing workflow. Every article includes a front-matter block with metadata fields that get rendered into the page head:
---
title: "SEO for your engineering blog"
metaTitle: "Day 92: SEO for your engineering blog | Expona"
metaDescription: "How we set up expona.dev for search with series hubs, metadata, performance, and internal links."
ogImage: "https://expona.dev/images/day-92-og.jpg"
seriesHub: "100-day-technical-seo"
seriesPosition: 92
nextArticle: "/day-93-measuring-seo-impact"
relatedArticles:
- "/day-05-internal-linking-strategy"
- "/day-21-core-web-vitals"
---The OG image matters more than developers typically assume. When an article gets shared on Twitter, Slack, or LinkedIn, the image is often the first thing people see. A consistent, readable OG image for each article increases click-through rates on social platforms. We keep them simple: the day number, article title, and the Expona logo. Tools like Cloudinary or Satori can generate these programmatically, one per article.
Fast pages — Static rendering and minimal JavaScript
Core Web Vitals are a ranking factor. A slow blog post won't rank, no matter how good it is. We render every article as static HTML at build time. There's no database lookup, no API call, no runtime overhead. The page is ready to serve immediately.
Static rendering also means we control exactly what the browser loads. Our articles have no interactive ads, no tracking pixels, no third-party overlays. The JavaScript bundle for a typical article is under 15 KB—mostly syntax highlighting and the navigation menu. Compare that to a typical WordPress blog, which often ships 300+ KB of JavaScript.
Image optimization is where most engineering blogs leak performance. A screenshot or diagram can easily be 1-2 MB uncompressed. We run every image through a build-time process that generates WebP variants, multiple sizes, and lazy-loading attributes:
<figure>
<picture>
<source srcset="image-800w.webp 800w, image-1200w.webp 1200w" type="image/webp">
<source srcset="image-800w.png 800w, image-1200w.png 1200w" type="image/png">
<img
src="image-1200w.png"
alt="Architecture diagram showing tunnels and edge nodes"
loading="lazy"
width="1200"
height="675"
>
</picture>
</figure>This approach gives us pages that load in under 1 second on 4G, even with multiple high-resolution diagrams. That speed boost translates to both ranking improvements and better user engagement—readers are more likely to stay on a fast page and read to the end.
Internal links — Connecting articles to guide readers and crawlers
Internal links serve two audiences: search engines and your readers. For search engines, they establish site architecture and distribute ranking authority. For readers, they reduce friction—when someone finishes an article, the next logical resource should be one click away.
We use three types of internal links on expona.dev:
- Series navigation: Every article in the 100-day series links to the previous and next article. This creates a clear crawlable path and makes it natural for readers to keep reading.
- Hub links: Every article links back to its series hub. The hub is the authoritative page for the topic, and pointing back to it reinforces that relationship.
- Related articles: At the end of each post, we include links to 2-3 related articles from other series. If someone reads "Day 05: Internal Linking Strategy" and then reads "Day 92: SEO for your engineering blog," that's a signal that both articles are relevant to SEO practitioners.
The HTML structure is straightforward. After the main article content:
<nav aria-label="Series navigation">
<ul>
<li><a href="/day-91-measuring-search-visibility">← Previous: Day 91</a></li>
<li><a href="/100-day-technical-seo">Series Hub</a></li>
<li><a href="/day-93-measuring-seo-impact">Next: Day 93 →</a></li>
</ul>
</nav>
<aside>
<h3>Related reading</h3>
<ul>
<li><a href="/day-05-internal-linking-strategy">Day 5: Internal linking strategy</a></li>
<li><a href="/day-21-core-web-vitals">Day 21: Core Web Vitals for engineering blogs</a></li>
</ul>
</aside>Use descriptive anchor text. "Click here" tells search engines nothing. "Day 91: Measuring search visibility" tells them exactly what they'll find. This also improves accessibility for screen reader users.
Common mistakes
Mistake 1: Thin series hubs. A hub page that just lists links with no additional context doesn't add value. Search engines can recognize when a page is thin, and readers won't use it as a reference. Your hub should have an introduction that explains why the series matters, a breakdown of what each article covers, and maybe a quick-start section for people who don't want to read all 100 articles.
Mistake 2: Duplicate meta descriptions. If you reuse the same meta description across multiple articles, you're wasting an opportunity. Each description should be unique and targeted to that specific article. Tools can automate this—generate a description from your opening paragraph or use a template that changes based on the day or topic.
Mistake 3: Linking everywhere. Not every sentence needs a link. Too many links dilute their value and distract readers. Link to other articles only when the connection is genuinely useful. If you're mentioning a concept defined in another article, link to it. If you're just name-dropping a related topic, don't.
Mistake 4: Ignoring alt text. Every image needs an alt attribute that describes what the image shows. This helps screen readers, helps search engines understand your content, and gives you another opportunity to use relevant keywords naturally. "Image" is not alt text. "Architecture diagram showing secure tunnel between local development environment and cloud API" is.
Key takeaways
- Build series around a hub page that links to every article in order. The hub becomes the authoritative page for your topic and funnels readers into a cohesive narrative.
- Write unique, human-readable meta titles and descriptions for every post. Include your target keyword, but prioritize clarity. These are your only chance to convince someone to click from search results.
- Render articles as static HTML and optimize images aggressively. Fast pages rank better and keep readers engaged. Most engineering blogs ship bloated JavaScript that doesn't improve the reading experience.
- Link articles together purposefully. Series navigation guides both readers and crawlers. Related-article links build topical authority across your blog.
- Measure what matters. Track which series get the most organic traffic, which articles rank for which keywords, and how internal links affect overall site performance. Use that data to shape future series.






Comments
Loading comments…