Catalog / observatoire-photo.paris
61

SEO audit for observatoire-photo.paris

Observatoire photo participatif des paysages parisiens

ecommerce

Health 61/100 (fair) · 9 pages crawled · generated 2026-08-26

Download Markdown report (feed to ChatGPT / Claude / Cursor)

Cliquez sur Rechercher pour parcourir la carte

Screenshot of observatoire-photo.paris
9
pages crawled
8
indexable pages
1
errors
45
warnings
132
notices
0
orphan pages
0
broken links
Category breakdown
CategoryScoreErrorsWarningsNotices
Crawlability 89 1 0 1
Duplicate 60 0 12 7
Canonical 73 0 8 0
Agent Readiness 77 0 7 14
Images 77 0 7 8
Links 77 0 7 7
Content 97 0 1 8
Headings 97 0 1 7
Meta Description 97 0 1 7
Performance 97 0 1 27
Cache 100 0 0 8
Mobile 100 0 0 1
Security 100 0 0 11
Sitemap 100 0 0 8
Social 100 0 0 9
Structured Data 100 0 0 8
Titles 100 0 0 1
Findings

Errors (1 rules)

error Client error (4xx) response

Rule status.4xx · Crawlability · 1 occurrence(s)

Warnings (11 rules)

warning Control has no accessible name

Rule agent.control_no_name · Agent Readiness · 7 occurrence(s)

warning Thin content (low word count)

Rule content.thin · Content · 1 occurrence(s)

warning Duplicate page content

Rule duplicate.content · Duplicate · 2 occurrence(s)

warning Near-duplicate page content

Rule duplicate.near · Duplicate · 5 occurrence(s)

warning Duplicate <title> across pages

Rule duplicate.title · Duplicate · 5 occurrence(s)

warning Missing <h1>

Rule h1.missing · Headings · 1 occurrence(s)

warning Images missing alt text

Rule images.missing_alt · Images · 7 occurrence(s)

warning Internal link points to a redirect

Rule links.redirect_target · Links · 7 occurrence(s)

warning Missing meta description

Rule meta_desc.missing · Meta Description · 1 occurrence(s)

warning Render-blocking script in <head> (no defer/async)

Rule perf.render_blocking · Performance · 1 occurrence(s)

Notices (23 rules)

notice Heading levels skip a level

Rule agent.heading_skip · Agent Readiness · 7 occurrence(s)

notice No main landmark for AI agents

Rule agent.no_main_landmark · Agent Readiness · 7 occurrence(s)

notice Page served uncached (no-store/private or CDN bypass)

Rule cache.not_cacheable · Cache · 8 occurrence(s)

notice Low text-to-HTML ratio

Rule content.low_ratio · Content · 1 occurrence(s)

notice Duplicate meta description across pages

Rule duplicate.meta_desc · Duplicate · 7 occurrence(s)

  • https://observatoire-photo.paris/ — meta description shared by 7 pages: https://observatoire-photo.paris/resetting/request, https://observatoire-photo.paris/map, https://observatoire-photo.paris/elements/add
  • https://observatoire-photo.paris/about — meta description shared by 7 pages: https://observatoire-photo.paris/, https://observatoire-photo.paris/resetting/request, https://observatoire-photo.paris/map
  • https://observatoire-photo.paris/annuaire — meta description shared by 7 pages: https://observatoire-photo.paris/, https://observatoire-photo.paris/resetting/request, https://observatoire-photo.paris/map
  • https://observatoire-photo.paris/elements/add — meta description shared by 7 pages: https://observatoire-photo.paris/, https://observatoire-photo.paris/resetting/request, https://observatoire-photo.paris/map
  • https://observatoire-photo.paris/map — meta description shared by 7 pages: https://observatoire-photo.paris/, https://observatoire-photo.paris/resetting/request, https://observatoire-photo.paris/elements/add
  • https://observatoire-photo.paris/resetting/request — meta description shared by 7 pages: https://observatoire-photo.paris/, https://observatoire-photo.paris/map, https://observatoire-photo.paris/elements/add
  • https://observatoire-photo.paris/user/mon-espace — meta description shared by 7 pages: https://observatoire-photo.paris/, https://observatoire-photo.paris/resetting/request, https://observatoire-photo.paris/map

notice Multiple <h1> elements

Rule h1.multiple · Headings · 7 occurrence(s)

notice Missing html lang attribute

Rule i18n.lang_missing · Mobile · 1 occurrence(s)

notice Likely hero image lacks fetchpriority=high

Rule images.hero_no_fetchpriority · Performance · 3 occurrence(s)

  • https://observatoire-photo.paris/ — the likely hero/LCP image (caue75-2026-o4p-intro-04.png) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
  • https://observatoire-photo.paris/about — the likely hero/LCP image (o4p-logo-principal01.png) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
  • https://observatoire-photo.paris/admin/resetting/request — the likely hero/LCP image (gogo-bot.png) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.

notice Images without width/height (layout shift / CLS)

Rule images.missing_dimensions · Images · 8 occurrence(s)

notice Internal link has no anchor text / accessible name

Rule links.no_anchor_text · Links · 7 occurrence(s)

  • https://observatoire-photo.paris/ — 3 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
  • https://observatoire-photo.paris/about — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
  • https://observatoire-photo.paris/annuaire — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
  • https://observatoire-photo.paris/elements/add — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
  • https://observatoire-photo.paris/map — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
  • https://observatoire-photo.paris/resetting/request — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.
  • https://observatoire-photo.paris/user/mon-espace — 2 internal link(s) have no anchor text, aria-label, or image alt — they pass no keyword signal and are unusable to screen readers. Add descriptive text or an aria-label.

notice Legacy <meta name=keywords> tag present (Google ignores it)

Rule meta.keywords_present · Content · 7 occurrence(s)

notice Missing Open Graph tags

Rule og.missing · Social · 1 occurrence(s)

notice Legacy image format (jpg/png/gif) with no next-gen fallback

Rule perf.images_legacy_format · Performance · 8 occurrence(s)

  • https://observatoire-photo.paris/ — 4 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
  • https://observatoire-photo.paris/about — 11 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
  • https://observatoire-photo.paris/admin/resetting/request — 1 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
  • https://observatoire-photo.paris/annuaire — 2 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
  • https://observatoire-photo.paris/elements/add — 2 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
  • https://observatoire-photo.paris/map — 2 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
  • https://observatoire-photo.paris/resetting/request — 2 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
  • https://observatoire-photo.paris/user/mon-espace — 2 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.

notice No ETag header (no conditional GET for unchanged pages)

Rule perf.no_etag · Performance · 8 occurrence(s)

  • https://observatoire-photo.paris/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://observatoire-photo.paris/about — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://observatoire-photo.paris/admin/resetting/request — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://observatoire-photo.paris/annuaire — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://observatoire-photo.paris/elements/add — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://observatoire-photo.paris/map — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://observatoire-photo.paris/resetting/request — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://observatoire-photo.paris/user/mon-espace — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.

notice No Last-Modified header (no conditional GET for unchanged pages)

Rule perf.no_last_modified · Performance · 8 occurrence(s)

  • https://observatoire-photo.paris/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://observatoire-photo.paris/about — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://observatoire-photo.paris/admin/resetting/request — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://observatoire-photo.paris/annuaire — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://observatoire-photo.paris/elements/add — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://observatoire-photo.paris/map — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://observatoire-photo.paris/resetting/request — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://observatoire-photo.paris/user/mon-espace — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.

notice URL redirects to another URL

Rule redirect.single · Crawlability · 1 occurrence(s)

notice Missing recommended security headers

Rule security.missing_headers · Security · 9 occurrence(s)

notice target=_blank link without rel=noopener (tab-napping)

Rule security.unsafe_cross_origin_links · Security · 2 occurrence(s)

  • https://observatoire-photo.paris/ — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".
  • https://observatoire-photo.paris/about — 19 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".

notice Indexable page not listed in sitemap

Rule sitemap.orphan_not_listed · Sitemap · 8 occurrence(s)

notice Title is very short

Rule title.too_short · Titles · 1 occurrence(s)

Pages (showing 9 of 9)
URLStatusIndexableWordsIn-links
https://observatoire-photo.paris/
Observatoire photo participatif des paysages parisiens
200 yes 4882 7
https://observatoire-photo.paris/about
Observatoire photo participatif des paysages parisiens - À propos
200 yes 5809 7
https://observatoire-photo.paris/elements/add
Observatoire photo participatif des paysages parisiens - Ajouter une photo
200 yes 5061 7
https://observatoire-photo.paris/map
Observatoire photo participatif des paysages parisiens - La carte
200 yes 4782 7
https://observatoire-photo.paris/resetting/request
Observatoire photo participatif des paysages parisiens
200 yes 4795 7
https://observatoire-photo.paris/user/mon-espace
Observatoire photo participatif des paysages parisiens
200 yes 4786 7
https://observatoire-photo.paris/annuaire
Observatoire photo participatif des paysages parisiens - La carte
200 yes 4782 1
https://observatoire-photo.paris/admin/resetting/request
Admin
200 yes 13 1
https://observatoire-photo.paris/admin/dashboard
Admin
401 no 13 9

Audit your own site — free

157 checks, internal PageRank, render-diff. No signup, results in ~30s.

Scan your site →