# Seogard — Full documentation > Technical SEO monitoring with a raw HTML vs JavaScript rendering comparison. Checks run during crawls triggered manually, on a schedule or through a CI/CD webhook. Cloud requires an account and includes a 14-day trial without a credit card; self-hosting is also available. ## Overview Seogard is a **continuous SEO and GEO monitoring tool** published by SAVEPNP (SAS, RCS Créteil 912 784 030, 25 rue Camille Blanc, 94400 Vitry-sur-Seine, France). Available self-hosted for free (source available under BSL 1.1) or as a managed Cloud (B2B only). Seogard checks pages during each crawl and can notify the team by email when the crawl detects a regression, according to the zone settings. It does not guarantee detection before a search engine visits the page. Seogard compares the raw HTML returned by the server with the DOM rendered by Chromium. Google can also render JavaScript. The comparison identifies technical differences to investigate; it does not reveal Google’s index, establish a ranking penalty or measure AI citations. ## The problem Seogard solves Modern sites are complex: SSR, CSR, JavaScript frameworks, microservices, CI/CD with daily deploys. Every production deploy can silently break SEO-critical elements: - Meta titles and descriptions disappear - Main content disappears from the server HTML and depends on JavaScript rendering - Pages accidentally switch to noindex - Canonicals change or disappear - Pages start returning 404 or 500 errors The scanner page includes a controlled before/after demonstration, tested with the crawler, for a title mismatch and main content missing from raw HTML. This demonstrates the checks, not traffic recovery or a customer outcome. ## Who it is for Web professionals who depend on SEO, whatever the site size. Cloud is for professionals only (B2B). With the free self-hosted version, any developer can use it. With Cloud at EUR 0.01 per monitored page per month, the price naturally scales with volume — you only pay for pages actually monitored each month. - **Blogs and brochure sites**: free monitoring self-hosted, or a few euros per month on Cloud. - **E-commerce**: product catalogs, product pages, categories. A meta regression directly impacts revenue. - **Media and publishers**: articles, sections, author pages. SEO is the main traffic source. - **SaaS**: marketing sites with many landing pages. - **Enterprises**: organizations where dev and SEO teams are separate, and frequent deploys make manual monitoring impossible. ## Detailed features ### 72 SEO and GEO detection rules Seogard ships 72 detection rules (monitoring + recommendations + GEO) covering the most common and most costly regressions: **Meta and content:** - Missing or changed title - Missing or changed meta description - Missing or changed canonical - Missing, duplicated or changed H1 - Missing or changed hreflang - Missing Open Graph and Twitter Cards **Indexing:** - Accidentally added noindex - Changed robots meta - Changed X-Robots-Tag **Status codes:** - Page switching to 404, 500, 503 - Soft 404 (page returning 200 with error-page content) - Unexpected redirects **SSR vs CSR:** - SSR content significantly different from CSR content - Failed SSR rendering (empty content) - SSR title different from CSR title - SSR meta description different from CSR **Performance and structure:** - Sharp page-weight increase (performance regression) - Removed or changed Schema.org markup ### SSR vs CSR comparison Seogard performs a dual analysis of every page: 1. **Raw HTTP fetch (SSR)**: fetches the HTML exactly as the server sends it, before JavaScript execution 2. **JavaScript render (CSR)**: uses a headless browser (Playwright/Chromium) to execute JavaScript and capture the final DOM Comparing the two can identify missing server-rendered content or metadata differences. Interpret the result alongside rendering errors and the page’s intended behavior. Use Search Console separately to inspect Google’s crawl and indexing information. ### Web performance When rendering succeeds, Seogard records synthetic performance measurements from its Chromium session: - **Core Web Vitals**: LCP (content display) and CLS (visual stability), measured with the official web-vitals library. - **TTFB**: server response time. - **Page weight**: total downloaded weight + breakdown (HTML, JS, CSS, images, fonts). LCP, CLS and TTFB are **monitored and displayed** (latest measurement + 30-day trend). These synthetic readings are not a substitute for real-user Core Web Vitals. Page weight is the performance metric with a regression rule; results can vary with the resources served during a crawl. ### Crawl frequency After adding a site, Seogard discovers pages via the sitemap and runs a full initial crawl. Crawls then trigger in three combinable modes: on every deploy (CI/CD webhook), on a schedule (daily to monthly, per zone) and on demand. Every crawled page is analyzed as raw HTML (SSR) and JavaScript render (CSR) to detect gaps. ### Zones — monitoring per site section A site can be split into zones, each zone being a set of pages defined by URL pattern (e.g. /blog, /products, /checkout). The default zone covers the whole site. Each zone has its own configuration: enabled/disabled SEO/GEO rules, scheduled crawl frequency, CI/CD gate strictness, notifications and per-member access. The deploy webhook targets a specific zone and crawls only it, speeding up CI feedback. You can apply stricter monitoring to critical pages (checkout funnel, category pages) than to the rest of the site. ### Built-in CI/CD webhook Seogard integrates with your CI/CD pipeline: a POST webhook triggers a crawl on every deploy, with a GET endpoint to poll the verdict (pass/fail). 3 strictness levels: strict, standard, relaxed. ### Crawl notifications - **Email**: notifications after a crawl, subject to notification settings - **Severity levels**: critical (immediate action), warning (watch), info (non-critical change) - **Diff highlighting**: every alert shows exactly what changed (before/after) with highlighted differences ### Dashboard The dashboard gives a real-time overview: - All your sites with their SEO health - Crawl history with live progress - Alerts grouped by severity with diff highlighting - Crawled pages with their latest status ## Technical architecture Seogard is built with: - **Nuxt 4** (Vue 3) for the frontend and API - **MongoDB** for the database - **Playwright** (headless Chromium) for CSR rendering - **Redis** for the crawl queue Crawl duration depends on the number of pages, server responses, JavaScript rendering and worker capacity. No fixed completion time is promised. The full source code is available on GitHub for the self-hosted version. ## Pricing 3 plans: | Plan | Price | Details | |------|-------|---------| | Self-hosted | Free forever | Full source code, your infrastructure, your data, GitHub community, free updates | | Cloud | EUR 0.01 per monitored page per month | Managed infrastructure, zero maintenance, email/webhook alerts, priority support, built-in CI/CD webhook, no commitment. You only pay for pages actually monitored — re-crawling the same pages costs nothing extra. 14-day free trial, no credit card. | | On-premise | Custom quote | Deployment in your infrastructure, guaranteed SLA, dedicated account manager, SSO/SAML, team training | **Cloud price examples:** - 1,000 pages: EUR 10/month - 5,000 pages: EUR 50/month - 10,000 pages: EUR 100/month - 50,000 pages: EUR 500/month ## Use cases 1. **Pre-production checks**: run a crawl before going live to check the enabled rules against the current crawl and available baseline 2. **Post-deploy**: trigger a crawl and inspect detected regressions 3. **Continuous monitoring**: daily monitoring for enterprises with frequent deploys 4. **Self-hosted**: host Seogard on your own infrastructure, keep full control of your data ## Positioning Seogard stands out with: - **Raw HTML and JavaScript rendering comparison** — during crawls, when rendering succeeds - **Free self-hosted** — source available under BSL 1.1 (becomes Apache 2.0 in 2029) - Exclusive focus on regressions (not a generalist suite) - Crawl notifications with highlighted before/after differences - 72 detection rules specific to SEO and GEO regressions - Built-in CI/CD webhook (3 levels: strict / standard / relaxed) - Transparent usage-based pricing: you only pay for monitored pages (Cloud), or nothing (self-hosted) ## Technical SEO & GEO training (French) The training program is in preparation. No course is currently available. Published SEO rule guides and the controlled SSR demonstration can already be read without an account. Using the scanner requires an account and starts a 14-day Cloud trial. - Training (French): https://seogard.io/fr/formations ## Content in French (/fr/) - Site (French): https://seogard.io/fr - Training: https://seogard.io/fr/formations - Monitoring tool page: https://seogard.io/fr/outils/monitoring - Audit tool page: https://seogard.io/fr/outils/audit - SEO scanner (account required, 14-day trial): https://seogard.io/fr/scanner - SEO & GEO rules reference (each rule explained): https://seogard.io/fr/docs/rules - Noindex ajouté: https://seogard.io/fr/docs/rules/noindex-ajoute - Code HTTP modifié: https://seogard.io/fr/docs/rules/code-http-modifie - Canonical manquant: https://seogard.io/fr/docs/rules/canonical-manquant - Canonical modifié: https://seogard.io/fr/docs/rules/canonical-modifie - Meta title supprimé: https://seogard.io/fr/docs/rules/meta-title-supprime - Soft 404 détecté: https://seogard.io/fr/docs/rules/soft-404 - Redirection vers la homepage: https://seogard.io/fr/docs/rules/redirection-vers-la-homepage - Page redirigée: https://seogard.io/fr/docs/rules/page-redirigee - Redirection JavaScript: https://seogard.io/fr/docs/rules/redirection-javascript - Redirection cassée: https://seogard.io/fr/docs/rules/redirection-cassee - Redirection temporaire sur page retirée: https://seogard.io/fr/docs/rules/redirection-temporaire-302 - Suppression sans 410 ni 301: https://seogard.io/fr/docs/rules/suppression-sans-410-ni-301 - Page noindex déclarée au sitemap: https://seogard.io/fr/docs/rules/page-noindex-declaree-au-sitemap - SSR cassé: https://seogard.io/fr/docs/rules/ssr-casse - Écart SSR/CSR: https://seogard.io/fr/docs/rules/ecart-ssr-csr - H1 supprimé: https://seogard.io/fr/docs/rules/h1-supprime - H1 multiples: https://seogard.io/fr/docs/rules/h1-multiples - H1 modifié: https://seogard.io/fr/docs/rules/h1-modifie - Viewport supprimé: https://seogard.io/fr/docs/rules/viewport-supprime - Contenu trop mince: https://seogard.io/fr/docs/rules/contenu-trop-mince - Contenu supprimé: https://seogard.io/fr/docs/rules/contenu-supprime - Hreflang supprimé: https://seogard.io/fr/docs/rules/hreflang-supprime - Hreflang modifié: https://seogard.io/fr/docs/rules/hreflang-modifie - Ressources HTTP sur page HTTPS: https://seogard.io/fr/docs/rules/ressources-http-sur-page-https - Meta description supprimée: https://seogard.io/fr/docs/rules/meta-description-supprimee - Données structurées supprimées: https://seogard.io/fr/docs/rules/donnees-structurees-supprimees - JSON-LD invalide: https://seogard.io/fr/docs/rules/json-ld-invalide - og:image supprimé: https://seogard.io/fr/docs/rules/og-image-supprime - og:title supprimé: https://seogard.io/fr/docs/rules/og-title-supprime - Meta refresh détecté: https://seogard.io/fr/docs/rules/meta-refresh-detecte - Robots.txt modifié: https://seogard.io/fr/docs/rules/robots-txt-modifie - Hiérarchie des titres cassée: https://seogard.io/fr/docs/rules/hierarchie-des-titres-cassee - Attribut lang supprimé: https://seogard.io/fr/docs/rules/attribut-lang-supprime - Attribut lang modifié: https://seogard.io/fr/docs/rules/attribut-lang-modifie - Volume de contenu modifié: https://seogard.io/fr/docs/rules/volume-de-contenu-modifie - Charset supprimé: https://seogard.io/fr/docs/rules/charset-supprime - Title SSR ≠ CSR: https://seogard.io/fr/docs/rules/title-different-ssr-csr - Description SSR ≠ CSR: https://seogard.io/fr/docs/rules/description-differente-ssr-csr - Meta title modifié: https://seogard.io/fr/docs/rules/meta-title-modifie - Meta description modifiée: https://seogard.io/fr/docs/rules/meta-description-modifiee - Crawler bloqué (anti-bot): https://seogard.io/fr/docs/rules/crawler-bloque-anti-bot - Analyse incomplète du site: https://seogard.io/fr/docs/rules/analyse-incomplete-du-site - /llms.txt supprimé: https://seogard.io/fr/docs/rules/llms-txt-supprime - Nouveau blocage de crawlers IA de citation: https://seogard.io/fr/docs/rules/nouveau-blocage-crawlers-ia - robots.txt bloque Googlebot: https://seogard.io/fr/docs/rules/robots-txt-bloque-googlebot - FAQ schema supprimé: https://seogard.io/fr/docs/rules/faq-schema-supprime - Auteur supprimé (JSON-LD): https://seogard.io/fr/docs/rules/auteur-json-ld-supprime - Images sans alt: https://seogard.io/fr/docs/rules/images-sans-alt - Longueur du title: https://seogard.io/fr/docs/rules/longueur-du-title - Longueur de la description: https://seogard.io/fr/docs/rules/longueur-de-la-description - H1 manquant: https://seogard.io/fr/docs/rules/h1-manquant - H1 absent du HTML brut (rempli par JavaScript): https://seogard.io/fr/docs/rules/h1-absent-du-html-brut - Contenu visible seulement après JavaScript: https://seogard.io/fr/docs/rules/contenu-absent-du-html-brut - Title absent du HTML brut (rempli par JavaScript): https://seogard.io/fr/docs/rules/title-absent-du-html-brut - Meta description absente du HTML brut (remplie par JavaScript): https://seogard.io/fr/docs/rules/description-absente-du-html-brut - Liens internes absents du HTML brut (injectés par JavaScript): https://seogard.io/fr/docs/rules/liens-internes-absents-du-html-brut - JSON-LD absent du HTML brut (injecté par JavaScript): https://seogard.io/fr/docs/rules/json-ld-absent-du-html-brut - Images sans alt absentes du HTML brut (injectées par JavaScript): https://seogard.io/fr/docs/rules/alt-images-absent-du-html-brut - Balises sémantiques absentes du HTML brut: https://seogard.io/fr/docs/rules/balises-semantiques-absentes-du-html-brut - Favicon manquant: https://seogard.io/fr/docs/rules/favicon-manquant - Structure sémantique: https://seogard.io/fr/docs/rules/structure-semantique - Données structurées manquantes: https://seogard.io/fr/docs/rules/donnees-structurees-manquantes - Open Graph manquant: https://seogard.io/fr/docs/rules/open-graph-manquant - Liens internes insuffisants: https://seogard.io/fr/docs/rules/liens-internes-insuffisants - /llms.txt manquant: https://seogard.io/fr/docs/rules/llms-txt-manquant - Crawlers IA de citation bloqués (robots.txt): https://seogard.io/fr/docs/rules/crawlers-ia-bloques-robots-txt - Données structurées incomplètes: https://seogard.io/fr/docs/rules/donnees-structurees-incompletes - FAQ schema manquant: https://seogard.io/fr/docs/rules/faq-schema-manquant - Signaux de citation faibles: https://seogard.io/fr/docs/rules/signaux-de-citation-faibles - Structure de contenu (GEO): https://seogard.io/fr/docs/rules/structure-de-contenu-geo - Poids de page en hausse: https://seogard.io/fr/docs/rules/poids-de-page-en-hausse - Page trop lourde: https://seogard.io/fr/docs/rules/page-trop-lourde - Terms (CGU): https://seogard.io/fr/legal/cgu - Sales terms (CGV): https://seogard.io/fr/legal/cgv - Privacy: https://seogard.io/fr/legal/privacy ## Content in English (/en/) - Site (English): https://seogard.io/en - Continuous SEO monitoring: https://seogard.io/en/tools/monitoring - Technical SEO audit tool: https://seogard.io/en/tools/audit - SSR checker (account required, 14-day trial): https://seogard.io/en/scanner - SEO & GEO rules reference (each rule explained): https://seogard.io/en/docs/rules - Noindex added: https://seogard.io/en/docs/rules/noindex-added - HTTP status code changed: https://seogard.io/en/docs/rules/http-status-code-changed - Canonical missing: https://seogard.io/en/docs/rules/missing-canonical-tag - Canonical changed: https://seogard.io/en/docs/rules/canonical-tag-changed - Meta title removed: https://seogard.io/en/docs/rules/missing-meta-title - Soft 404 detected: https://seogard.io/en/docs/rules/soft-404 - Redirect to homepage: https://seogard.io/en/docs/rules/redirect-to-homepage - Page redirected: https://seogard.io/en/docs/rules/page-redirected - JavaScript redirect: https://seogard.io/en/docs/rules/javascript-redirect - Broken redirect: https://seogard.io/en/docs/rules/broken-redirect - Temporary redirect on removed page: https://seogard.io/en/docs/rules/temporary-302-redirect - Removal without 410 or 301: https://seogard.io/en/docs/rules/page-removed-without-410-or-301 - Noindex page declared in sitemap: https://seogard.io/en/docs/rules/noindex-page-in-sitemap - Broken SSR: https://seogard.io/en/docs/rules/broken-ssr - SSR/CSR gap: https://seogard.io/en/docs/rules/ssr-csr-content-mismatch - H1 removed: https://seogard.io/en/docs/rules/h1-removed - Multiple H1 tags: https://seogard.io/en/docs/rules/multiple-h1-tags - H1 changed: https://seogard.io/en/docs/rules/h1-changed - Viewport removed: https://seogard.io/en/docs/rules/viewport-meta-removed - Thin content: https://seogard.io/en/docs/rules/thin-content - Content removed: https://seogard.io/en/docs/rules/content-removed - Hreflang removed: https://seogard.io/en/docs/rules/hreflang-removed - Hreflang changed: https://seogard.io/en/docs/rules/hreflang-changed - HTTP resources on HTTPS page: https://seogard.io/en/docs/rules/mixed-content-https - Meta description removed: https://seogard.io/en/docs/rules/missing-meta-description - Structured data removed: https://seogard.io/en/docs/rules/structured-data-removed - Invalid JSON-LD: https://seogard.io/en/docs/rules/invalid-json-ld - OG image removed: https://seogard.io/en/docs/rules/og-image-removed - OG title removed: https://seogard.io/en/docs/rules/og-title-removed - Meta refresh detected: https://seogard.io/en/docs/rules/meta-refresh-redirect - robots.txt changed: https://seogard.io/en/docs/rules/robots-txt-changed - Broken heading hierarchy: https://seogard.io/en/docs/rules/broken-heading-hierarchy - Lang attribute removed: https://seogard.io/en/docs/rules/lang-attribute-removed - Lang attribute changed: https://seogard.io/en/docs/rules/lang-attribute-changed - Content length changed: https://seogard.io/en/docs/rules/content-length-changed - Charset removed: https://seogard.io/en/docs/rules/charset-removed - SSR/CSR title mismatch: https://seogard.io/en/docs/rules/ssr-csr-title-mismatch - SSR/CSR description mismatch: https://seogard.io/en/docs/rules/ssr-csr-description-mismatch - Meta title changed: https://seogard.io/en/docs/rules/meta-title-changed - Meta description changed: https://seogard.io/en/docs/rules/meta-description-changed - Crawler blocked (anti-bot): https://seogard.io/en/docs/rules/crawler-blocked-by-waf - Incomplete site analysis: https://seogard.io/en/docs/rules/incomplete-site-analysis - llms.txt removed: https://seogard.io/en/docs/rules/llms-txt-removed - New AI citation crawler blocking: https://seogard.io/en/docs/rules/new-ai-crawler-blocking - robots.txt blocks Googlebot: https://seogard.io/en/docs/rules/robots-txt-blocks-googlebot - FAQ schema removed: https://seogard.io/en/docs/rules/faq-schema-removed - Author removed (JSON-LD): https://seogard.io/en/docs/rules/author-removed-from-json-ld - Images without alt: https://seogard.io/en/docs/rules/images-missing-alt-text - Title length: https://seogard.io/en/docs/rules/title-length - Description length: https://seogard.io/en/docs/rules/meta-description-length - Missing H1: https://seogard.io/en/docs/rules/missing-h1 - H1 missing from raw HTML (JS-only): https://seogard.io/en/docs/rules/h1-missing-from-raw-html - Content visible only after JavaScript: https://seogard.io/en/docs/rules/content-missing-from-raw-html - Title missing from raw HTML (JS-only): https://seogard.io/en/docs/rules/title-missing-from-raw-html - Description missing from raw HTML (JS-only): https://seogard.io/en/docs/rules/description-missing-from-raw-html - Internal links missing from raw HTML (JS-only): https://seogard.io/en/docs/rules/internal-links-missing-from-raw-html - JSON-LD missing from raw HTML (JS-only): https://seogard.io/en/docs/rules/json-ld-missing-from-raw-html - JS-injected images without alt: https://seogard.io/en/docs/rules/image-alt-missing-from-raw-html - Semantic tags missing from raw HTML: https://seogard.io/en/docs/rules/semantic-tags-missing-from-raw-html - Missing favicon: https://seogard.io/en/docs/rules/missing-favicon - Semantic structure: https://seogard.io/en/docs/rules/semantic-html-structure - Missing structured data: https://seogard.io/en/docs/rules/missing-structured-data - Missing Open Graph: https://seogard.io/en/docs/rules/missing-open-graph-tags - Too few internal links: https://seogard.io/en/docs/rules/too-few-internal-links - Missing llms.txt: https://seogard.io/en/docs/rules/missing-llms-txt - AI citation crawlers blocked (robots.txt): https://seogard.io/en/docs/rules/ai-crawlers-blocked-robots-txt - Incomplete structured data: https://seogard.io/en/docs/rules/incomplete-structured-data - Missing FAQ schema: https://seogard.io/en/docs/rules/missing-faq-schema - Weak citation signals: https://seogard.io/en/docs/rules/weak-citation-signals - Content structure (GEO): https://seogard.io/en/docs/rules/geo-content-structure - Page weight increase: https://seogard.io/en/docs/rules/page-weight-increase - Heavy page: https://seogard.io/en/docs/rules/heavy-page ## Links - GitHub: https://github.com/seogard-software/seogard - Short version: https://seogard.io/llms.txt ## Legal information - **Publisher**: SAVEPNP, SAS with a capital of EUR 1,000 - **RCS**: Créteil 912 784 030 — SIRET 912 784 030 00021 - **VAT**: FR04912784030 - **Head office**: 25 rue Camille Blanc, 94400 Vitry-sur-Seine, France - **Director**: Aadil TALBI - **B2B service only**: for professionals only - **Terms (French)**: https://seogard.io/fr/legal/cgu - **Sales terms (French)**: https://seogard.io/fr/legal/cgv - **Privacy (French)**: https://seogard.io/fr/legal/privacy - **Contact**: legal@seogard.io