Skip to content

SEO Guidelines — Absolutely Plausible

Internal Standard

The Absolutely Plausible SEO playbook. Applies to every public-facing AP property. Foundational, honest, OSS-friendly. No black-hat. No bullshit.

Created: 2026-05-14 · Owner: Luiz · Review: Quarterly


Scope

Applies to (public-facing):

  • robotfantome.com (personal portfolio + music)
  • absolutelyplausible.com (AP public site — when built)
  • Any future public AP property (client landing pages where AP owns the SEO scope, AP-owned tools/products)

Does NOT apply to (internal / private):

  • ops.absolutelyplausible.com (this site — gated, intentionally noindexed)
  • evolution-kart-workspace (private repo, no public surface)
  • hackFatura (retired/private; no public SEO surface)
  • Any client property where AP is operations partner but doesn't own SEO scope (different conversation per client; e.g., Shopify on thekartdepot.com has its own SEO settings inside the platform)

Philosophy

  1. SEO is editorial, not magic. Write things people actually want to read. Make them findable. The rest is plumbing.
  2. Privacy-respecting analytics by default. No Google Analytics 4 unless a real reason forces it. Use Cloudflare Web Analytics (free, no cookies, no consent banner) or self-host Plausible.
  3. Open-source first, even in tools. Sitemap generators, Schema.org builders, performance audits — all open-source or web-standard.
  4. No tracking the user doesn't need. Every script costs page load + privacy. Justify each one.
  5. Honest content beats keyword stuffing. Google's E-E-A-T (Experience, Expertise, Authoritativeness, Trust) rewards real expertise. Luiz has it. Write like it.
  6. Don't fake the brand for ranking. Robot Fantôme is a punk music project. AP is a small business. Don't pretend to be an enterprise. Authenticity ranks.

Per-property quick-win checklist

Run this on every public site before declaring "SEO done":

  • <title> on every page (unique, ≤60 chars, primary keyword/topic early)
  • <meta name="description"> on every page (≤160 chars, compelling, includes the topic)
  • One <h1> per page that matches the title intent
  • Logical <h2>/<h3> hierarchy (no skipping levels)
  • All images have meaningful alt="" text (or alt="" if decorative)
  • <link rel="canonical"> on every page
  • robots.txt exists and is correct (allow all by default; block intentionally)
  • sitemap.xml exists and is referenced from robots.txt
  • Open Graph tags: og:title, og:description, og:image (1200×630), og:url, og:type
  • Twitter Card tags: twitter:card (summary_large_image)
  • Structured data (application/ld+json) where it adds value (Person, Organization, Article)
  • Mobile-responsive (test on a real phone, not just devtools)
  • HTTPS enforced
  • No broken internal links (404 page exists and is helpful)
  • Page weight < 1 MB total on first load where possible
  • Core Web Vitals: LCP < 2.5s, INP < 200ms, CLS < 0.1
  • Registered in Google Search Console + Bing Webmaster Tools
  • Analytics set up (Cloudflare or Plausible — not GA4 by default)

Technical SEO standards

<title> and meta description

<title>Page Topic — Site Name</title>
<meta name="description" content="One clear sentence describing what's on this page, written for humans first, that happens to include the topic naturally.">

Rules: - Each page's title is unique. No duplicates across the site. - Format: Specific Topic — Brand Name. Brand name on the right. - Description reads like a sentence a real person would say, not a keyword stuff.

Canonical URL

Every page declares its canonical URL — protects against duplicate content issues from query strings, trailing slashes, etc.

<link rel="canonical" href="https://robotfantome.com/about/">

robots.txt

Default for public sites:

User-agent: *
Allow: /

Sitemap: https://robotfantome.com/sitemap.xml

For internal sites (already in place on ops.absolutelyplausible.com):

User-agent: *
Disallow: /

sitemap.xml

Most static-site generators produce this automatically:

Generator How
MkDocs (Material) sitemap.xml is auto-generated. Add site_url in mkdocs.yml.
Astro Use @astrojs/sitemap integration
Hand-rolled HTML Generate via xml-sitemaps.com or a build script

Verify the file exists at /sitemap.xml and is reachable.

Core Web Vitals

Three metrics Google actually uses for ranking:

Metric Target What it measures
LCP (Largest Contentful Paint) < 2.5s Time until the biggest above-the-fold element renders
INP (Interaction to Next Paint) < 200ms Responsiveness when the user clicks/taps
CLS (Cumulative Layout Shift) < 0.1 Visual stability (things don't jump around as they load)

Test with PageSpeed Insights on every public site quarterly. Mobile score matters more than desktop.

Common fixes: - LCP slow? → optimize hero image (WebP/AVIF, loading="eager" for above-fold) - INP poor? → reduce JavaScript on the page, defer non-critical scripts - CLS bad? → set explicit width/height on images and embeds


On-page SEO standards

Heading hierarchy

<h1>Main topic of the page</h1>
  <h2>Major section</h2>
    <h3>Sub-section</h3>
  <h2>Another major section</h2>

Rules: - One <h1> per page - Don't skip levels (no <h3> directly inside an <h1>) - Headings describe content, not aesthetic ("Latest projects" not "Cool stuff")

Image alt text

  • Decorative images: alt="" (empty, but the attribute MUST be present)
  • Informative images: alt="Concise description of what the image shows"
  • Don't stuff keywords. Describe the image.

Internal linking

  • Link related pages to each other (/strategy/timeline/projects)
  • Use descriptive anchor text ("see the AP brand guide", not "click here")
  • Don't over-link. Each link should genuinely help the reader.

URL structure

Good: robotfantome.com/projects/dj-pallet-table/ Bad: robotfantome.com/p?id=42&cat=3

Rules: - Lowercase - Hyphens (not underscores) - Words, not IDs - Stable (don't change URLs — set up 301 redirects if you must)


Open Graph + social cards

When a link to your site is shared on LinkedIn / Twitter / WhatsApp / Slack, these tags control how it renders. Critical for any content you want shared.

<!-- Open Graph (Facebook, LinkedIn, WhatsApp, most platforms) -->
<meta property="og:title" content="Page Topic — Site Name">
<meta property="og:description" content="One clear sentence.">
<meta property="og:image" content="https://robotfantome.com/og/page-name.png">
<meta property="og:url" content="https://robotfantome.com/page-name/">
<meta property="og:type" content="website">

<!-- Twitter (X) -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Page Topic — Site Name">
<meta name="twitter:description" content="One clear sentence.">
<meta name="twitter:image" content="https://robotfantome.com/og/page-name.png">

Image specs

  • Open Graph image: 1200×630 px, < 1 MB, PNG or JPG
  • Include the page title overlaid on a branded background (cool paper + steel-blue/indigo/violet accents, Share Tech Mono — see Brand)
  • Test with opengraph.xyz before shipping

One-time setup

Build a default OG image for each property. Per-page custom images for headline content (case studies, big posts) — not required for every page.


Structured data (Schema.org)

JSON-LD blocks that help search engines understand what a page is about. Add to the <head>.

Person (for robotfantome.com homepage / about)

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Person",
  "name": "Luiz Wagner Mestrinho",
  "url": "https://robotfantome.com",
  "image": "https://robotfantome.com/assets/images/wags-circle.jpg",
  "jobTitle": "Founder, Absolutely Plausible",
  "worksFor": {
    "@type": "Organization",
    "name": "Absolutely Plausible",
    "url": "https://absolutelyplausible.com"
  },
  "sameAs": [
    "https://www.linkedin.com/in/mestrinho",
    "https://github.com/wmestrinho",
    "https://www.instagram.com/absolutelyplausible"
  ]
}
</script>

Organization (for absolutelyplausible.com)

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Absolutely Plausible",
  "url": "https://absolutelyplausible.com",
  "logo": "https://absolutelyplausible.com/logo.png",
  "founder": "Luiz Wagner Mestrinho",
  "foundingDate": "2014-07",
  "areaServed": "US",
  "sameAs": [
    "https://www.instagram.com/absolutelyplausible",
    "https://github.com/wmestrinho"
  ]
}
</script>

Article (for long-form posts on robotfantome.com)

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "DJ Pallet Table — Behind the Build",
  "image": "https://robotfantome.com/og/dj-pallet-table.png",
  "datePublished": "2026-05-20",
  "author": {
    "@type": "Person",
    "name": "Luiz Wagner Mestrinho"
  }
}
</script>

Validate

Always validate after adding: validator.schema.org or Rich Results Test.


Content guidelines

  1. Lead with the answer. First paragraph states what the page is about and what the reader will get.
  2. Show experience. Specific stories, real numbers, dates, named people (with permission). "I shipped X in Y days with Z stack" beats "we build software."
  3. Update old content. A page that worked two years ago still ranks — but only if it's still accurate. Refresh dates, links, screenshots.
  4. No AI sludge. Don't ship AI-generated text without editing. Google rewards expertise; AP HAS expertise; let it show through.
  5. Length matches intent. Quick reference: short. Deep tutorial: long. Don't pad.

Analytics & measurement

Tools to set up (free)

Tool What it does Cost
Google Search Console What queries bring people to your site, indexing health, manual actions Free
Bing Webmaster Tools Same for Bing/DuckDuckGo/Yahoo (often forgotten) Free
Cloudflare Web Analytics Privacy-respecting traffic data, no cookies Free (already on Cloudflare)
PageSpeed Insights Core Web Vitals snapshots Free

Do NOT use by default

  • Google Analytics 4 — heavy script, GDPR/cookie consent overhead, doesn't justify itself for an AP-scale site. If a client needs it for their site, that's their call.
  • Hotjar / FullStory / etc. — session recording / heatmap tools. Privacy cost too high for AP brand.

Measurement cadence

  • Weekly: Cloudflare Analytics — traffic trend, top pages, top referrers (5 min)
  • Monthly: Search Console — top queries, click-through rate, indexing issues (15 min)
  • Quarterly: PageSpeed Insights + manual audit using the per-property checklist (30 min)

Per-site implementation status

Site Title/Meta Sitemap OG tags Schema.org Analytics Mobile Search Console Overall
robotfantome.com Audit pending
absolutelyplausible.com Not yet built
ops.absolutelyplausible.com N/A N/A N/A N/A N/A N/A N/A Internal — out of scope

Audit each site quarterly; update this table. First audit target: robotfantome.com.


First implementation target: robotfantome.com

The plan:

  1. Audit the current state — run the quick-win checklist against the live site. Take screenshots of what's missing.
  2. Add baseline tags — title, description, canonical, OG, Twitter cards. Set a default OG image.
  3. Add robots.txt + sitemap.xml — verify both reachable.
  4. Add Schema.org Person to homepage.
  5. Register Google Search Console + Bing Webmaster Tools — submit sitemap.
  6. Enable Cloudflare Web Analytics if not already.
  7. Run PageSpeed Insights — capture baseline scores, identify quick wins.
  8. Update this doc's status table with the audit results.

Estimated time: ~2–3 focused hours total. Worth doing in one batched session.


Tools (all free / OSS)

Need Tool
OG image preview opengraph.xyz
Schema validation validator.schema.org
Rich Results test search.google.com/test/rich-results
Performance audit pagespeed.web.dev
Crawler emulator bing.com/webmasters/tools/markup-validator
Local Lighthouse Chrome DevTools → Lighthouse tab (built-in)
Sitemap generator xml-sitemaps.com (last resort — most generators produce this automatically)
SERP preview serpsim.com

Update this doc as standards evolve and tools come online. SEO is a discipline, not a one-time project.