Panduan Gatsby SEO

cara mengoptimalkan sebuah Gatsby situs untuk penelusuran — Gatsby's four rendering paths (SSG, DSG, SSR, client-hanya) dan apa setiap berarti untuk crawlability, modern Head API vs legacy react-helmet, sitemaps, canonicals, image SEO, React-bundle CWV cost, dan Netlify-era maintenance risk.

Pertama kali diterbitkan: 26 Jun 2026 · Terakhir diperbarui: 8 Agu 2026 · Advanced
Bahasa
1 sinyal bukti di halaman ini

Gatsby memiliki four rendering options: SSG ( default — halaman pre-dirender untuk static HTML di gatsby bangun), DSG (deferred static generation pada pertama permintaan), SSR (rendering sisi server per permintaan melalui Gatsby Functions), dan client-hanya routes (dirender entirely di browser). sebagian besar Gatsby situs lean pada SSG, yang memberikan crawler fully dirender HTML pada pertama fetch dengan Tidak rendering queue untuk tunggu pada — sebuah strong SEO baseline, far better daripada sebuah pure client-side React app. tetapi itu baseline tidak universal: DSG dan SSR halaman generate HTML di luar bangun langkah dan perlu mereka own production memeriksa, dan client-hanya routes tidak seharusnya menjadi assumed untuk expose route-spesifik konten di awal HTML di semua. Whichever path menyajikan sebuah halaman, Gatsby masih ships penuh React runtime (~200KB+) dan hydrates ini client-side — sebuah Core Web Vitals cost, tidak sebuah crawlability satu. saat ini cara untuk manage metadata adalah dibangun-di Gatsby Head API (v4.19+), yang berfungsi di seluruh semua four rendering paths dan replaces gatsby-plugin-react-helmet. recurring pitfalls adalah double tag canonical, draft/orphan halaman leaking ke sitemaps, missing teks alt, production-hanya sitemap gotcha, DSG/SSR/client-hanya routes needing jelas sitemap dan production-perilaku memeriksa, dan sebuah kerangka kerja milik siapa maintenance memiliki slowed sharply since Netlify's 2023 acquisition.

TL;DR — Gatsby memiliki four rendering options — SSG ( default), DSG, SSR, dan client-hanya routes — dan mereka jangan semua put konten di mentah HTML yang sama cara. SSG pre-renders untuk static HTML di bangun time (gatsby build), so konten adalah di mentah HTML sebelum pertama crawler permintaan — Tidak Web rendering Service, Tidak rendering queue. DSG defers generation untuk pertama permintaan; SSR generates per permintaan pada sebuah server; client-hanya routes render tidak ada apa pun route-spesifik until browser berjalan JavaScript. Whichever path menyajikan sebuah halaman, Gatsby hydrates sebuah penuh React bundle (~200KB+) pada client, yang adalah sebuah Core Web Vitals cost, tidak sebuah crawlability satu. saat ini metadata approach adalah dibangun-di Gatsby Head API (v4.19+), yang berfungsi di seluruh semua four rendering paths dan replaces gatsby-plugin-react-helmet. recurring failure modes adalah double canonical tags (Head API + react-helmet keduanya firing), draft/orphan halaman leaking ke sitemaps, production-hanya sitemap gotcha, missing teks alt pada GatsbyImage, trailing-slash inconsistency, dan DSG/SSR/client-hanya routes itu tidak pernah mendapat sebuah production periksa. dan elephant di room: since Netlify’s 2023 acquisition, Gatsby’s maintenance memiliki slowed sharply.

Gatsby’s four rendering options — dan mengapa mereka penting untuk SEO

Google memproses JavaScript halaman di three phases — crawling, lalu rendering, lalu pengindeksan — dan rendering happens di sebuah terpisah lulus dari sebuah queue menggunakan headless Chromium. Google’s own guidance adalah blunt tentang mengapa Anda tidak seharusnya lean pada itu: “Server-side atau pre-rendering adalah masih a great idea karena it membuat Anda website lebih cepat untuk users dan crawlers, dan tidak all bots dapat jalankan JavaScript.” (terjemahan) “server-side atau pre-rendering adalah masih sebuah great idea karena ini membuat Anda situs web lebih cepat untuk pengguna dan crawler, dan tidak semua bot dapat jalankan JavaScript.”

sebuah Gatsby situs tidak universally bangun-time static HTML — Gatsby mendukung four distinct rendering paths, chosen per halaman atau template Evidence for this claim gatsby build writes production output, including generated HTML, to the public directory. Scope: Gatsby production builds. Confidence: high · Verified: Gatsby CLI: build :

  • SSG (Static situs Generation) — default. gatsby build emits fully dirender static HTML ke /public untuk halaman. Googlebot’s pertama-wave mentah-HTML fetch sudah berisi menyelesaikan konten — text, tautan, metadata. ini adalah safe, rendah-risk path, dan ini adalah apa sebagian besar Gatsby halaman gunakan.
  • DSG (Deferred Static Generation). Generation adalah deferred until halaman’s pertama permintaan alih-alih happening untuk setiap halaman di bangun time — berguna untuk situs dengan huge angka dari rendah-traffic halaman di mana sebuah penuh bangun akan menjadi slow. bangun alone melakukan tidak tell Anda apa sebuah crawler sees; halaman’s HTML tidak exist until sesuatu permintaan ini, so pertama-permintaan dan cached perilaku perlu mereka own periksa, tidak hanya sebuah bangun log.
  • SSR (rendering sisi server). halaman adalah dirender per permintaan, menggunakan permintaan-time data, melalui Gatsby Functions. Karena ini berjalan di permintaan time, SSR halaman perlu production memeriksa sebuah bangun-time halaman tidak: respons status, caching headers, timeout perilaku, dan apa sebuah crawler sees pada sebuah empty atau error respons — none dari itu adalah terlihat dari sebuah successful local bangun.
  • Client-hanya routes. ini render entirely di browser dan jangan mendapatkan route-spesifik konten di awal HTML — yang sama profile sebagai sebuah plain client-side React app. jangan assume Google (atau apa pun crawler) sees apa pun halaman-spesifik di sini until JavaScript berjalan; treat ini sebagai JS-dependent oleh design, yang adalah fine untuk gated/authenticated konten tetapi wrong untuk apa pun Anda ingin terindeks dengan konten.

React hydration (ReactDOMClient.hydrateRoot()) happens client-side pada top dari whichever dari ini produced HTML, purely untuk tambahkan interactivity — itu bagian adalah yang sama regardless dari rendering path, dan adalah sebuah terpisah concern dari yang path generated halaman (lebih pada hydration cost di bawah).

Contrast SSG/DSG/SSR dengan sebuah pure client-side React app, yang menyajikan sebuah empty <div id="root"> dan bergantung pada browser (atau renderer) untuk bangun halaman. sebagian besar Gatsby halaman ship bermakna HTML oleh default — itu’s indexability win, dan ini adalah nyata, tetapi ini adalah sebuah per-halaman property, tidak sebuah kerangka kerja jaminan. rendering options dan image tooling jangan jaminan Core Web Vitals, pengindeksan, atau rankings pada mereka own; verify sebenarnya production output untuk whichever path sebuah route menggunakan.

catch dengan SSG/DSG/SSR alike adalah sebuah performa satu, tidak sebuah crawlability satu: Gatsby ships penuh React runtime untuk setiap halaman dan re-hydrates ini. Lebih pada itu, dan Astro perbandingan, di bawah.

Gatsby Head API vs gatsby-plugin-react-helmet

ini adalah single sebagian besar penting “adalah Anda melakukan it itu modern way?” (terjemahan) “adalah Anda melakukan ini modern cara?” pertanyaan di Gatsby SEO.

** legacy approach — gatsby-plugin-react-helmet.** untuk tahun, standard cara untuk set <title>, deskripsi meta, dan lainnya head tags adalah react-helmet library plus ini plugin. plugin’s job adalah untuk memberikan react-helmet SSR mendukung — tanpa ini, Anda judul/meta tags akan hanya muncul setelah JS execution, tidak di mentah HTML, yang defeats poin. ini berfungsi, tetapi ini memiliki known issues dengan React Hooks dan concurrent rendering, plus sebuah background-tab judul bug Anda patch dengan defer={false}.

** modern approach — Gatsby Head API (v4.19+).** Gatsby now memiliki sebuah dibangun-di cara untuk tambahkan head elements: sebuah named Head export dari apa pun halaman atau template file. Evidence for this claim Gatsby pages and templates can export a named Head function to add head elements. Scope: Gatsby Head API. Confidence: high · Verified: Gatsby: Head API

export const Head = () => (
  <>
    <title>Page Title</title>
    <meta name="description" content="..." />
  </>
)

ini menerima berguna props — location.pathname, params, data (dari halaman’s GraphQL kueri), dan pageContext — dan ini deduplicates tags itu share sebuah id prop (terakhir satu wins), though berjalan dua berbeda head-tag mechanisms di setelah (Head API plus sebuah leftover react-helmet panggil) dapat masih conflict bahkan dengan deduplication. ini berfungsi hanya di halaman files dan templates, tidak di arbitrary components. advantages di atas react-helmet: Tidak ketiga-party bundle, Tidak Provider wrapper, deterministic tag order dengan React 18 streaming. gunakan Head API untuk semua baru projects, dan plan sebuah migration untuk existing ones.

Head API berfungsi yang sama cara di seluruh semua four rendering paths — SSG, DSG, SSR, dan client-hanya routes semua mendukung sebuah Head export. Apa differs adalah ketika -nya output lands di HTML sebuah crawler dapat fetch: pada SSG ini adalah baked di di bangun time; pada DSG dan SSR ini adalah generated di pertama-permintaan atau per-permintaan time; pada sebuah client-hanya route ini tidak di awal HTML di semua. jangan assume “I added a Head export” (terjemahan) “Saya menambahkan export Head” adalah equivalent untuk “ini adalah di itu mentah HTML untuk setiap route” (terjemahan) “ini adalah di HTML mentah untuk setiap route” — periksa sebenarnya production output (view-source: atau curl) untuk whichever path setiap route menggunakan, tidak hanya satu representative halaman.

** “meta tags di DevTools tetapi tidak di sumber” (terjemahan) “meta tags di DevTools tetapi tidak di sumber” bug.** sebuah classic Gatsby SEO symptom: Anda judul/meta tags tampilkan up di Chrome DevTools tetapi adalah missing dari view-source:. penyebab adalah itu DevTools menampilkan hydrated DOM (setelah JS berjalan), sementara view-sumber menampilkan mentah HTML. jika Anda tags hanya muncul di DevTools, Anda SEO component adalah rendering client-side alih-alih menjadi baked ke Gatsby’s static output — biasanya karena ini adalah digunakan sebagai sebuah regular component alih-alih sebagai (atau di dalam) halaman’s Head export. selalu verify di mentah HTML, tidak DevTools.

Wiring up sebuah SEO component ( GraphQL data layer)

Gatsby’s data layer adalah GraphQL, dan ini adalah bagaimana Anda feed metadata ke Anda halaman.

  • useStaticQuery pulls global defaults dari siteMetadata (judul, deskripsi, siteUrl) didefinisikan di gatsby-config.js.
  • halaman-tingkat GraphQL kueri lulus sebuah data prop straight untuk Head export — Tidak extra wiring needed.
  • standard pattern adalah prop || siteMetadata fallback: gunakan per-halaman nilai jika ini ada, jika tidak situs default.

sebuah Head export itu takes halaman data looks like:

export const Head = ({ data }) => (
  <>
    <title>{data.post.title}</title>
    <meta name="description" content={data.post.excerpt} />
  </>
)

Sitemaps: gatsby-plugin-sitemap (dan -nya traps)

Install gatsby-plugin-sitemap dan configure ini di gatsby-config.js. sebuah sedikit hal trip orang up:

  • ini generates sitemap-index.xml, tidak /sitemap.xml. Submit indeks URL di Google Search Console — jangan submit /sitemap.xml dan expect ini untuk resolve.
  • ini hanya berjalan di production membangun. ini melakukan tidak ada apa pun di gatsby develop. untuk test ini, jalankan gatsby build && gatsby serve. Orang file “my sitemap adalah missing” (terjemahan) “my sitemap adalah missing” reports itu adalah benar-benar hanya “I never ran a production build.” (terjemahan) “I tidak pernah ran sebuah production bangun.”
  • createLinkInHead: true oleh default menambahkan sitemap reference untuk HTML head secara otomatis.
  • ini selalu excludes /dev-404-page, /404, dan /offline-plugin-app-shell-fallback.
  • <priority> dan <changefreq> adalah ignored oleh Google — plugin docs say so secara langsung. Focus pada sebuah accurate <lastmod> alih-alih.
  • entryLimit defaults untuk 45 000 URLs per file.

Excluding drafts adalah Anda job. Gatsby membangun semuanya ini menemukan, so draft konten sails straight ke sitemap unless Anda filter ini. melakukan itu di gatsby-node.js dengan sebuah GraphQL filter (e.g. excluding entries tanpa sebuah publish date), tidak oleh hiding ini di sebuah React component — oleh lalu ini adalah sudah dibangun dan listed.

DSG, SSR, dan client-hanya routes perlu sebuah jelas sitemap decision. gatsby-plugin-sitemap reflects apa ini dapat see di bangun time. sebuah SSG halaman adalah straightforward — ini ada sebagai sebuah static file, so ini adalah naturally sitemap-eligible. sebuah DSG halaman’s HTML tidak exist namun di bangun time (ini generates pada pertama permintaan), sebuah SSR halaman tidak pernah memiliki fixed HTML di semua, dan sebuah client-hanya route memiliki Tidak route-spesifik konten untuk indeks di pertama place. jangan assume apa pun dari ini adalah di sitemap (atau seharusnya menjadi) hanya karena route ada — decide, halaman oleh halaman, apakah ini belongs, dan verify generated sitemap-index.xml sebenarnya reflects itu decision alih-alih sebuah bangun-time guess.

robots.txt: gatsby-plugin-robots-txt

gatsby-plugin-robots-txt generates robots.txt di bangun time. berguna detail untuk SEO adalah environment awareness: ini membaca process.env.GATSBY_ACTIVE_ENV lalu process.env.NODE_ENV, so Anda dapat sajikan berbeda aturan per environment. classic gunakan adalah blocking crawler pada Netlify preview/branch deploys so Anda staging URLs jangan mendapatkan accidentally terindeks, sementara leaving production open.

Canonical URLs (dan double-canonical bug)

Dua viable approaches:

  1. gatsby-plugin-canonical-urls menambahkan sebuah <link rel="canonical"> untuk setiap halaman. Set stripQueryString: true so /blog?tag=foo dan /blog jangan mendapatkan treated sebagai terpisah canonicalized halaman — recommended untuk sebagian besar situs.
  2. ** Head API**, setting canonicals yourself dari location.pathname:
export const Head = ({ location }) => (
  <link rel="canonical" href={`https://example.com${location.pathname}`} />
)

** double canonical bug.** ini adalah sebuah known, easy-untuk-hit issue: jika Anda gunakan gatsby-plugin-canonical-urls dan sebuah react-helmet tag canonical di yang sama time, Anda emit dua <link rel="canonical"> tags. Pick satu mechanism. (jika Anda’re pada react-helmet, gatsby-plugin-react-helmet-canonical-urls adalah helmet-aware option; pada Head API, atur canonical di sana dan drop plugin.)

Trailing slashes. Gatsby halaman dapat menjadi reachable dengan dan tanpa sebuah trailing slash, dan Gatsby’s <Link> component menggunakan client-side History API routing — yang bypasses server-side 301 redirects Anda’d biasanya gunakan untuk normalize trailing slashes. Decide pada satu form, enforce ini di host/CDN tingkat, dan pertahankan canonicals consistent dengan ini.

Image SEO: gatsby-plugin-image

gatsby-plugin-image adalah genuinely satu dari Gatsby’s strengths. Dua components:

  • StaticImage — untuk images milik siapa path adalah known dan hardcoded di bangun time.
  • GatsbyImage — untuk dynamic images coming dari GraphQL.

Apa ini melakukan secara otomatis: multiple sizes, WebP/AVIF formats, lazy memuat, dan breakpoints (750/1080/1366/1920px). ini juga generates placeholders (blurred, dominant color, atau traced SVG) itu reserve space dan mencegah Cumulative Layout Shift — sebuah Core Web Vitals metric. Karena dimensions adalah set, Anda hindari CLS, dan modern formats plus lazy memuat help LCP.

** satu hal ini melakukan tidak melakukan adalah tulis teks alt.** itu’s pada Anda, setiap time — missing teks alt pada GatsbyImage adalah satu dari paling umum Gatsby SEO oversights. (Migrating dari old gatsby-image package? ada sebuah codemod: npx gatsby-codemods gatsby-plugin-image.)

data terstruktur (JSON-LD)

Google’s preferred structured-data format adalah JSON-LD, dan bersih cara untuk tambahkan ini di modern Gatsby adalah melalui Head API dengan sebuah script tag:

export const Head = ({ data }) => (
  <script type="application/ld+json">
    {JSON.stringify({
      "@context": "https://schema.org",
      "@type": "Article",
      "headline": data.post.title,
    })}
  </script>
)

gatsby-plugin-next-seo offers pre-dibangun JSON-LD components jika Anda’d rather tidak hand-roll them. Satu frequent confusion untuk jelas up: gatsby-plugin-manifest adalah tidak sebuah structured-data plugin — ini generates PWA web app manifest (icons, theme color), tidak ada apa pun untuk melakukan dengan schema.

React bundle dan Core Web Vitals

Di sini’s Gatsby’s nyata weakness relative untuk zero-JS generators.

  • Penuh hydration ( Gatsby 1–4 default) hydrates entire React tree dan ships sebuah 200KB+ React runtime untuk setiap halaman. HTML adalah pre-dirender, so ini tidak hurt crawlability — tetapi ini absolutely memengaruhi muat speed dan CWV.
  • Sebagian hydration (Gatsby 5, experimental) hydrates hanya components marked "use client" dan leaves rest sebagai static HTML, cutting JS shipped dan secara langsung improving TTI dan CWV. limitations adalah nyata: production membangun hanya, masih beta, dan incompatible dengan emotion, styled-components, dan gatsby-plugin-offline.

takeaway: Gatsby’s JS payload adalah sebuah performa masalah, tidak sebuah indexability satu. Googlebot masih renders JS untuk assess halaman-experience sinyal, so bundle dapat cost Anda pada CWV bahkan though Anda konten indeks fine.

Gatsby vs Astro untuk SEO

jika Anda’re choosing sebuah static kerangka kerja hari ini, ini adalah perbandingan itu penting sebagian besar untuk SEO.

DimensionGatsbyAstro
JS shipped untuk browser200KB+ (penuh React runtime)~5KB (interactive islands hanya)
rendering modelSSG → SPA (penuh hydration)SSG → MPA (zero hydration oleh default)
bangun speed (40 halaman)2–3 minutesdi bawah 10 seconds
SEO plugin ecosystemMature (gatsby-plugin-*)Growing
crawl-budget impactLebih tinggi (lebih JS untuk Google untuk render)Lebih rendah
kerangka kerja futureUncertain (Netlify kepemilikan, slowed activity)Active, growing

Keduanya pre-render dapat diindeks HTML — itu’s sebuah wash. perbedaan adalah JS tax: Astro’s islands ship sebuah fraction dari JavaScript, yang sebuah Vaihe perbandingan frames sebagai “Reduced JavaScript execution conserves anggaran crawling dan accelerates halaman scanning.” (terjemahan) “Reduced JavaScript execution conserves anggaran crawling dan accelerates halaman scanning.” (Satu historical caveat pada lainnya side: Astro’s image menangani lacked automatic width/height di time dari itu perbandingan, yang produced Lighthouse warnings — periksa saat ini Astro docs, sebagai ini dapat menjadi resolved.)

untuk context pada bagaimana seluruh field compares, see static situs generators hub.

honest bagian: Gatsby’s maintenance trajectory

I tidak akan sugarcoat ini, dan I tidak akan catastrophize ini either.

Netlify acquired Gatsby Inc. di February 2023. Gatsby Cloud adalah sunset dan customers adalah moved untuk Netlify; Netlify stated acquisition akan “tidak impact Gatsby JS.” (terjemahan) “tidak impact Gatsby JS.” Since lalu, activity memiliki slowed markedly. sebuah widely-baca community GitHub discussion (#39062) argues Gatsby adalah effectively abandoned — minimal commits, Tidak React 19 mendukung, sebuah 2024 roadmap itu tidak delivered, dan telemetry service shut down. Maintainers memiliki dibingkai saat ini state sebagai security memperbaiki, limited dependency memperbarui, dan rendah-hanging-fruit bug memperbaiki.

Apa itu berarti untuk SEO tim. untuk sebuah existing Gatsby situs, none dari ini adalah sebuah emergency — ini membangun, ini indeks, ini berfungsi. risk adalah ecosystem decay di atas time: SEO bergantung pada plugins (gatsby-plugin-sitemap, image, canonical-urls), dan aging plugins (e.g. gatsby-source-shopify facing API deprecation) dapat eventually break di cara itu diam-diam degrade pengindeksan. untuk sebuah baru project, weigh itu seriously — kerangka kerja orang adalah migrating untuk adalah Astro dan Berikutnya.js.

Production checklist: verify setiap rendering path

sebuah local gatsby develop session atau bahkan sebuah bersih gatsby build log tidak prove apa sebuah crawler sebenarnya menerima. Karena SSG, DSG, SSR, dan client-hanya routes setiap generate HTML differently, periksa production perilaku per path alih-alih assuming satu representative halaman covers semua dari them:

  • Mentah HTML konten. untuk setiap rendering path di gunakan, fetch sebuah nyata production URL dengan curl -s <url> atau view-source: — tidak DevTools — dan konfirmasi konten, judul, dan meta tags sebuah crawler akan see adalah sebenarnya di sana.
  • Metadata (Head export output). Konfirmasi Head export’s tags land di itu mentah HTML untuk path di pertanyaan. ini adalah di mana DSG/SSR differ sebagian besar dari SSG: tags exist di Anda sumber either cara, tetapi hanya sebuah production fetch proves mereka dibuat ini ke respons.
  • HTTP status. periksa respons kode status pada production, terutama untuk SSR dan DSG routes — sebuah halaman itu renders fine locally dapat 500 di production pada pertama permintaan atau di bawah muat di cara sebuah bangun tidak pernah surfaces.
  • Caching perilaku. SSG output adalah sebuah static file dengan predictable caching. DSG caches setelah pertama permintaan — konfirmasi kedua permintaan adalah fast dan correct, tidak hanya pertama. SSR respons bergantung pada Anda caching headers dan hosting layer; verify stale atau per-permintaan konten tidak disajikan untuk wrong pengunjung.
  • Failure dan empty-state perilaku. untuk SSR dan DSG halaman backed oleh permintaan-time atau pertama-permintaan data, periksa apa sebuah crawler sees jika itu data fetch fails atau mengembalikan empty — sebuah unhandled error state adalah tidak yang sama halaman Anda tested locally dengan baik data.
  • Sitemap generation dan exclusions. Re-konfirmasi ini hanya happens pada sebuah production bangun (gatsby build && gatsby serve, tidak pernah gatsby develop), dan itu exclusions Anda expect — drafts, client-hanya routes, apa pun Anda decided tidak seharusnya menjadi listed — adalah sebenarnya absent dari generated sitemap-index.xml, tidak hanya absent dari Anda intent.

None dari ini adalah opsional per rendering path — sebuah berfungsi gatsby build proves SSG output, tidak DSG, SSR, atau client-hanya perilaku.

umum Gatsby SEO mistakes

  1. masih menggunakan gatsby-plugin-react-helmet — legacy; migrate untuk Head API.
  2. Meta tags di DevTools tetapi tidak di halaman sumber — SEO component adalah rendering client-side; periksa view-source:, tidak DevTools.
  3. Draft konten di sitemaps — filter drafts di gatsby-node.js dengan GraphQL, tidak di sebuah React component.
  4. Orphan halaman dari src/pages — Gatsby auto-routes semuanya di sana; stale files bangun dan land di sitemap.
  5. Double tag canonicalgatsby-plugin-canonical-urls + react-helmet keduanya firing.
  6. Trailing-slash inconsistency<Link> client-routing bypasses server-side trailing-slash redirects.
  7. Tidak stripping kueri strings dari canonicals — set stripQueryString: true.
  8. teks alt omitted pada GatsbyImage — ini tidak auto-generated.
  9. Submitting /sitemap.xml — nyata file adalah /sitemap-index.xml.
  10. Testing sitemap di gatsby develop — ini hanya generates pada gatsby build.
  11. Noindex toggled oleh React state — Google dapat memiliki sudah processed mentah HTML; dan ketika ini sees noindex di mentah HTML ini dapat skip rendering entirely. pertahankan noindex decisions di static HTML atau server headers.

untuk JavaScript-rendering fundamentals behind semua dari ini, see parent JavaScript SEO hub.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.