Technical SEO for devs who hate marketing
I’m not a marketer. If you’re reading this, you probably aren’t either. But your clients will want their site to show up on Google. That’s just reality.
The good news? Most of the SEO that actually matters is technical. It’s code. It’s our language.
I spent years ignoring this. Built beautiful, fast, functional sites. Then discovered nobody could find them on Google because meta tags were missing. Frustrating because the fix was trivial.
What actually matters
Forget about “content is king” conversations. For developers, the real thing is making sure the site is semantically correct and Google can read everything.
Meta tags are the starting point. The title tag shows up as that blue link in Google. If you don’t set it, the browser invents something bad. I’ve seen:
<title>Untitled Document</title>
The meta description is that gray text below. 155 characters max. Google cuts after. Use it or Google pulls random text from the page.
What I see in my projects is most devs leaving these tags blank. Then the client complains the site doesn’t rank.
Open Graph is another one. When someone shares your site on LinkedIn or WhatsApp, where does that image and title come from? From og:image and og:title tags. Without them, it looks terrible.
In Astro, it’s one line in your layout:
<meta property="og:title" content={title} />
<meta property="og:description" content={excerpt} />
<meta property="og:image" content={image} />
Done. Your client is happy when they share.
Sitemap and robots.txt
A sitemap.xml is basically a list of all pages on your site. You put it at /sitemap.xml and you’re done. Google finds it automatically. Astro generates it for you if you configure it.
robots.txt is more interesting. It’s where you tell Google: “hey, don’t crawl this”. Useful for hiding admin pages, terms of service that don’t need to rank, or large files that waste crawl budget.
The most important thing? Disallow: nothing. You want Google to crawl your site. Leave the defaults. I’ve seen projects with robots.txt blocking everything. That was a manual mistake.
Schema.org is where the gold is
This is structured HTML. You mark up data inside the page so machines (and AI) understand context. Price, hours, address. When you see Google results with stars or business hours, that came from Schema.
For a dental clinic, I do it like this:
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Clinic X",
"address": "Street Y, 123",
"telephone": "+55 11 9999",
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Monday",
"opens": "09:00",
"closes": "18:00"
}
]
}
Drop that in a
For articles, use ArticleSchema. For recipes, RecipeSchema. Every content type has its Schema. Google Search Console shows if your Schemas are correct.
Heading hierarchy
This is simple but widely ignored. A page has one H1. Just one. Then use H2, H3 as needed. Don’t skip from H1 to H3.
Why? Google reads the structure. If hierarchy is wrong, it can’t tell what sections are main topics. Seems basic but Search Console flags it as an error.
My pattern: one H1 per page (the title), then H2 for main sections, H3 for subsections. Clean and semantic.
Internal links are underrated
When you link one page of your site to another inside an article, Google understands that linked page is important. You pass “link equity” to it.
In my blogs, when I talk about Astro, I link to my earlier post comparing Astro vs Next. This helps Google understand that page is relevant for the topic.
But be careful. Links need to make sense for the reader. Forced links destroy experience and Google penalizes sites with cheap link spam.
Alt text on images
Alt text is that text showing if an image fails to load. But it’s also how Google understands what an image contains.
I write descriptively. Instead of “image-1.png”, I write “Supabase dashboard with patient table”. Now Google knows the image is relevant for Supabase searches.
Accessibility for free. Your site gets better for screen readers and for Google.
Core Web Vitals still matter
SEO isn’t just crawlability. Google uses speed as a ranking signal. Lighthouse score, Largest Contentful Paint, layout shifts. This all matters.
In Astro with Vercel, it usually comes out green. But if you’re using heavy unoptimized images, it drops.
I use Astro’s component, not
. It optimizes everything automatically. WebP format, lazy loading, responsive images.
Checklist to do today
- Add meta description to all pages
- Implement og:image, og:title, og:description
- Generate sitemap.xml (Astro does it automatically)
- Add basic robots.txt (or use the default)
- Implement relevant Schema.org (LocalBusiness, Article, etc)
- Review heading hierarchy on main pages
- Add descriptive alt text to images
- Run Lighthouse and fix performance warnings
SEO isn’t magic. It’s engineering. And you already know how to do it.
Difference between on-page, technical and off-page
SEO divides into 3:
On-page: Meta tags, heading hierarchy, well-written content. On the page itself.
Technical: Core Web Vitals, sitemap, URL structure, mobile-friendly, sitemap. Your app structure.
Off-page: Backlinks, brand mentions, social signals. Outside your control (mostly).
As a dev, you control 100% of on-page and technical. Off-page is marketing/PR work.
Canonical tags: too important to ignore
Canonical is a tag that says: “this page is the original version, not a copy”.
Without canonical:
example.com/product-123
example.com/product-123?utm_source=email
example.com/product-123?utm_medium=social
Google thinks they’re 3 different pages. Traffic dilutes.
With canonical on the last:
<link rel="canonical" href="https://example.com/product-123" />
Google understands it’s the same page. Traffic concentrates on the original.
Every page with query parameters needs a canonical.
XML Sitemap vs HTML sitemap
XML sitemap is for Google. Pure file of URLs. Put at /sitemap.xml and you’re done.
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://yoursite.com/</loc>
<lastmod>2026-04-05</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://yoursite.com/blog/post-1</loc>
<lastmod>2026-04-05</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
</urlset>
HTML sitemap is for users. List of links for navigation. Both help SEO but serve different functions.
Astro generates XML sitemap automatically if you configure it.
Advanced robots.txt
Basic:
User-agent: *
Allow: /
Sitemap: https://yoursite.com/sitemap.xml
Advanced (if running Supabase queries):
User-agent: *
Disallow: /admin/
Disallow: /api/
Disallow: /user-dashboard/
Allow: /
Crawl-delay: 1
Sitemap: https://yoursite.com/sitemap.xml
Disallow: /api/ is important. Google doesn’t need to crawl API routes, saves quota.
Crawl-delay: 1 says: “crawl, but wait 1 second between requests”. Doesn’t kill your server.
Verify indexation in Search Console
Go to Search Console, Coverage tab. Google shows:
- Valid pages (indexed)
- Pages with warnings (indexed but with problem)
- Pages with errors (not indexed)
- Excluded (you blocked in robots.txt)
If many pages are in “errors”, something’s wrong. Could be missing meta description, bad heading hierarchy, too-short content.
Saw a site with 50% of pages not indexed. Culprit: missing H1 on half the pages. Simple fix, Google indexed everything.
Caching and SEO
Good caching positively affects SEO.
With Vercel, automatic Cache-Control is good. But if you’re on your own server, handle this:
Cache-Control: public, max-age=3600, s-maxage=86400
max-age is browser cache (1h). s-maxage is CDN cache (24h).
Google respects cache headers. If your site is cached well, indexing is more efficient.
Annual technical SEO monitoring
Not a checklist you do once. It’s continuous monitoring.
Every quarter:
- Run Lighthouse audit
- Check Core Web Vitals in Search Console
- Verify Coverage (indexed pages)
- Count internal links
- Audit alt text on images
Simple script:
// Audit script you run every quarter
const links = document.querySelectorAll('a[href^="/"]').length;
const images = document.querySelectorAll('img[alt=""]').length;
const h1 = document.querySelectorAll('h1').length;
console.log(`Total internal links: ${links}`);
console.log(`Images without alt: ${images}`);
console.log(`H1 on page: ${h1}`);
Simple, but shows if something broke.
- Implement canonical on query param pages
- Generate XML sitemap
- Create robots.txt with /api/ disallow
- Add meta description to all pages
- Audit alt text (0 images without it)
- Check Coverage in Search Console
- Run Lighthouse and note scores
- Schedule quarterly audit
Read also: Technical SEO for developers | Schema.org in Astro | GEO: optimize for AI search
Technical SEO done right is the foundation for marketing later.