Back to blog
Performance

Technical SEO for devs who hate marketing

By Flávio Emanuel · · 8 min read

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.

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.

Next step

Need a dev who truly delivers?

Whether it's a one-time project, team reinforcement, or a long-term partnership. Let's talk.

Chat on WhatsApp

I reply within 2 hours during business hours.