SEO Guidelines — Absolutely Plausible¶
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.comhas its own SEO settings inside the platform)
Philosophy¶
- SEO is editorial, not magic. Write things people actually want to read. Make them findable. The rest is plumbing.
- 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.
- Open-source first, even in tools. Sitemap generators, Schema.org builders, performance audits — all open-source or web-standard.
- No tracking the user doesn't need. Every script costs page load + privacy. Justify each one.
- Honest content beats keyword stuffing. Google's E-E-A-T (Experience, Expertise, Authoritativeness, Trust) rewards real expertise. Luiz has it. Write like it.
- 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 (oralt=""if decorative) -
<link rel="canonical">on every page -
robots.txtexists and is correct (allow all by default; block intentionally) -
sitemap.xmlexists and is referenced fromrobots.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 (
404page 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.
robots.txt¶
Default for public sites:
For internal sites (already in place on ops.absolutelyplausible.com):
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¶
- Lead with the answer. First paragraph states what the page is about and what the reader will get.
- Show experience. Specific stories, real numbers, dates, named people (with permission). "I shipped X in Y days with Z stack" beats "we build software."
- Update old content. A page that worked two years ago still ranks — but only if it's still accurate. Refresh dates, links, screenshots.
- No AI sludge. Don't ship AI-generated text without editing. Google rewards expertise; AP HAS expertise; let it show through.
- 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:
- Audit the current state — run the quick-win checklist against the live site. Take screenshots of what's missing.
- Add baseline tags — title, description, canonical, OG, Twitter cards. Set a default OG image.
- Add
robots.txt+sitemap.xml— verify both reachable. - Add Schema.org Person to homepage.
- Register Google Search Console + Bing Webmaster Tools — submit sitemap.
- Enable Cloudflare Web Analytics if not already.
- Run PageSpeed Insights — capture baseline scores, identify quick wins.
- 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.