{
    "version": 2,
    "url": "https://ullrutvikling.no/?portfolio=ringveien",
    "final_url": "https://ullrutvikling.no/?portfolio=ringveien",
    "redirects": [],
    "mode": "full",
    "language": "en",
    "scanned_at": "2026-10-13T08:33:18+02:00",
    "duration_ms": 2750.18,
    "overall_score": 71.1,
    "category_scores": {
        "bot_access": 98.6,
        "content": 75,
        "technical": 76.7,
        "structured_data": 0,
        "meta": 56.3,
        "performance": 93.8
    },
    "checks": [
        {
            "id": "robots_txt",
            "category": "bot_access",
            "title": "robots.txt",
            "status": "warning",
            "severity": "info",
            "value": "No robots.txt – all bots are allowed.",
            "recommendation": "Add a robots.txt at the root of the domain. It gives you control over which bots get access and should point to your sitemap (Sitemap: https://…/sitemap.xml).",
            "duration_ms": 1764.91,
            "data": []
        },
        {
            "id": "bot_oai_searchbot",
            "category": "bot_access",
            "title": "OAI-SearchBot · OpenAI (ChatGPT search)",
            "status": "pass",
            "severity": "critical",
            "value": "robots.txt: allowed · server: responds normally (HTTP 200)",
            "recommendation": null,
            "duration_ms": 1995.11,
            "data": {
                "bot": "OAI-SearchBot",
                "vendor": "OpenAI (ChatGPT search)",
                "purpose": "search",
                "robots": "allowed",
                "robots_has_own_group": false,
                "server": "ok",
                "server_detail": "HTTP 200"
            }
        },
        {
            "id": "bot_claude_searchbot",
            "category": "bot_access",
            "title": "Claude-SearchBot · Anthropic (Claude)",
            "status": "pass",
            "severity": "critical",
            "value": "robots.txt: allowed · server: responds normally (HTTP 200)",
            "recommendation": null,
            "duration_ms": 1995.11,
            "data": {
                "bot": "Claude-SearchBot",
                "vendor": "Anthropic (Claude)",
                "purpose": "search",
                "robots": "allowed",
                "robots_has_own_group": false,
                "server": "ok",
                "server_detail": "HTTP 200"
            }
        },
        {
            "id": "bot_perplexitybot",
            "category": "bot_access",
            "title": "PerplexityBot · Perplexity",
            "status": "pass",
            "severity": "critical",
            "value": "robots.txt: allowed · server: responds normally (HTTP 200)",
            "recommendation": null,
            "duration_ms": 1995.11,
            "data": {
                "bot": "PerplexityBot",
                "vendor": "Perplexity",
                "purpose": "search",
                "robots": "allowed",
                "robots_has_own_group": false,
                "server": "ok",
                "server_detail": "HTTP 200"
            }
        },
        {
            "id": "bot_googlebot",
            "category": "bot_access",
            "title": "Googlebot · Google (Search, AI Overviews, Gemini)",
            "status": "pass",
            "severity": "critical",
            "value": "robots.txt: allowed · server: not tested",
            "recommendation": null,
            "duration_ms": 1995.11,
            "data": {
                "bot": "Googlebot",
                "vendor": "Google (Search, AI Overviews, Gemini)",
                "purpose": "search",
                "robots": "allowed",
                "robots_has_own_group": false,
                "server": "not_tested",
                "server_detail": ""
            }
        },
        {
            "id": "bot_bingbot",
            "category": "bot_access",
            "title": "Bingbot · Microsoft (Bing + Copilot)",
            "status": "pass",
            "severity": "critical",
            "value": "robots.txt: allowed · server: not tested",
            "recommendation": null,
            "duration_ms": 1995.11,
            "data": {
                "bot": "Bingbot",
                "vendor": "Microsoft (Bing + Copilot)",
                "purpose": "search",
                "robots": "allowed",
                "robots_has_own_group": false,
                "server": "not_tested",
                "server_detail": ""
            }
        },
        {
            "id": "bot_applebot",
            "category": "bot_access",
            "title": "Applebot · Apple (Siri/Spotlight)",
            "status": "pass",
            "severity": "critical",
            "value": "robots.txt: allowed · server: not tested",
            "recommendation": null,
            "duration_ms": 1995.11,
            "data": {
                "bot": "Applebot",
                "vendor": "Apple (Siri/Spotlight)",
                "purpose": "search",
                "robots": "allowed",
                "robots_has_own_group": false,
                "server": "not_tested",
                "server_detail": ""
            }
        },
        {
            "id": "bot_chatgpt_user",
            "category": "bot_access",
            "title": "ChatGPT-User · OpenAI (ChatGPT)",
            "status": "pass",
            "severity": "warning",
            "value": "robots.txt: allowed · server: responds normally (HTTP 200)",
            "recommendation": null,
            "duration_ms": 1995.11,
            "data": {
                "bot": "ChatGPT-User",
                "vendor": "OpenAI (ChatGPT)",
                "purpose": "user",
                "robots": "allowed",
                "robots_has_own_group": false,
                "server": "ok",
                "server_detail": "HTTP 200"
            }
        },
        {
            "id": "bot_claude_user",
            "category": "bot_access",
            "title": "Claude-User · Anthropic (Claude)",
            "status": "pass",
            "severity": "warning",
            "value": "robots.txt: allowed · server: responds normally (HTTP 200)",
            "recommendation": null,
            "duration_ms": 1995.11,
            "data": {
                "bot": "Claude-User",
                "vendor": "Anthropic (Claude)",
                "purpose": "user",
                "robots": "allowed",
                "robots_has_own_group": false,
                "server": "ok",
                "server_detail": "HTTP 200"
            }
        },
        {
            "id": "bot_perplexity_user",
            "category": "bot_access",
            "title": "Perplexity-User · Perplexity",
            "status": "pass",
            "severity": "warning",
            "value": "robots.txt: allowed · server: responds normally (HTTP 200)",
            "recommendation": null,
            "duration_ms": 1995.11,
            "data": {
                "bot": "Perplexity-User",
                "vendor": "Perplexity",
                "purpose": "user",
                "robots": "allowed",
                "robots_has_own_group": false,
                "server": "ok",
                "server_detail": "HTTP 200"
            }
        },
        {
            "id": "bot_gptbot",
            "category": "bot_access",
            "title": "GPTBot · OpenAI",
            "status": "pass",
            "severity": "info",
            "value": "robots.txt: allowed · server: responds normally (HTTP 200)",
            "recommendation": null,
            "duration_ms": 1995.11,
            "data": {
                "bot": "GPTBot",
                "vendor": "OpenAI",
                "purpose": "training",
                "robots": "allowed",
                "robots_has_own_group": false,
                "server": "ok",
                "server_detail": "HTTP 200"
            }
        },
        {
            "id": "bot_claudebot",
            "category": "bot_access",
            "title": "ClaudeBot · Anthropic",
            "status": "pass",
            "severity": "info",
            "value": "robots.txt: allowed · server: responds normally (HTTP 200)",
            "recommendation": null,
            "duration_ms": 1995.11,
            "data": {
                "bot": "ClaudeBot",
                "vendor": "Anthropic",
                "purpose": "training",
                "robots": "allowed",
                "robots_has_own_group": false,
                "server": "ok",
                "server_detail": "HTTP 200"
            }
        },
        {
            "id": "bot_google_extended",
            "category": "bot_access",
            "title": "Google-Extended · Google (Gemini training)",
            "status": "pass",
            "severity": "info",
            "value": "robots.txt: allowed · server: not tested",
            "recommendation": null,
            "duration_ms": 1995.11,
            "data": {
                "bot": "Google-Extended",
                "vendor": "Google (Gemini training)",
                "purpose": "training",
                "robots": "allowed",
                "robots_has_own_group": false,
                "server": "not_tested",
                "server_detail": ""
            }
        },
        {
            "id": "bot_applebot_extended",
            "category": "bot_access",
            "title": "Applebot-Extended · Apple (Apple Intelligence training)",
            "status": "pass",
            "severity": "info",
            "value": "robots.txt: allowed · server: not tested",
            "recommendation": null,
            "duration_ms": 1995.11,
            "data": {
                "bot": "Applebot-Extended",
                "vendor": "Apple (Apple Intelligence training)",
                "purpose": "training",
                "robots": "allowed",
                "robots_has_own_group": false,
                "server": "not_tested",
                "server_detail": ""
            }
        },
        {
            "id": "bot_ccbot",
            "category": "bot_access",
            "title": "CCBot · Common Crawl",
            "status": "pass",
            "severity": "info",
            "value": "robots.txt: allowed · server: responds normally (HTTP 200)",
            "recommendation": null,
            "duration_ms": 1995.11,
            "data": {
                "bot": "CCBot",
                "vendor": "Common Crawl",
                "purpose": "training",
                "robots": "allowed",
                "robots_has_own_group": false,
                "server": "ok",
                "server_detail": "HTTP 200"
            }
        },
        {
            "id": "bot_meta_externalagent",
            "category": "bot_access",
            "title": "Meta-ExternalAgent · Meta",
            "status": "pass",
            "severity": "info",
            "value": "robots.txt: allowed · server: responds normally (HTTP 200)",
            "recommendation": null,
            "duration_ms": 1995.11,
            "data": {
                "bot": "Meta-ExternalAgent",
                "vendor": "Meta",
                "purpose": "training",
                "robots": "allowed",
                "robots_has_own_group": false,
                "server": "ok",
                "server_detail": "HTTP 200"
            }
        },
        {
            "id": "bot_amazonbot",
            "category": "bot_access",
            "title": "Amazonbot · Amazon",
            "status": "pass",
            "severity": "info",
            "value": "robots.txt: allowed · server: responds normally (HTTP 200)",
            "recommendation": null,
            "duration_ms": 1995.11,
            "data": {
                "bot": "Amazonbot",
                "vendor": "Amazon",
                "purpose": "training",
                "robots": "allowed",
                "robots_has_own_group": false,
                "server": "ok",
                "server_detail": "HTTP 200"
            }
        },
        {
            "id": "bot_bytespider",
            "category": "bot_access",
            "title": "Bytespider · ByteDance",
            "status": "info",
            "severity": "info",
            "value": "robots.txt: allowed · server: blocked (HTTP 403)",
            "recommendation": "The server rejects Bytespider even if robots.txt may allow it. Check your firewall/CDN: Cloudflare (Security → Bots / \"Block AI bots\"), Wordfence, Imunify360, ModSecurity or the Plesk firewall. Note: some firewalls only block fake bots (by IP), so confirm in the firewall log that genuine Bytespider traffic gets through.",
            "duration_ms": 1995.11,
            "data": {
                "bot": "Bytespider",
                "vendor": "ByteDance",
                "purpose": "training",
                "robots": "allowed",
                "robots_has_own_group": false,
                "server": "blocked",
                "server_detail": "HTTP 403"
            }
        },
        {
            "id": "indexing_directives",
            "category": "bot_access",
            "title": "Indexing directives (meta robots / X-Robots-Tag)",
            "status": "pass",
            "severity": "critical",
            "value": "No blocking directives (<meta name=\"robots\"> = \"max-image-preview:large\").",
            "recommendation": null,
            "duration_ms": 17.7,
            "data": {
                "found": [
                    {
                        "source": "<meta name=\"robots\">",
                        "scope": "*",
                        "directives": [
                            "max-image-preview:large"
                        ]
                    }
                ]
            }
        },
        {
            "id": "sitemap_present",
            "category": "technical",
            "title": "Sitemap",
            "status": "fail",
            "severity": "warning",
            "value": "No sitemap found (checked robots.txt, /sitemap.xml, /sitemap_index.xml and /wp-sitemap.xml).",
            "recommendation": "Create an XML sitemap (in WordPress: Yoast/Rank Math, or the built-in /wp-sitemap.xml) and declare it in robots.txt with \"Sitemap: https://…\".",
            "duration_ms": 34.12,
            "data": []
        },
        {
            "id": "tech_https",
            "category": "technical",
            "title": "HTTPS",
            "status": "warning",
            "severity": "info",
            "value": "The page uses HTTPS. http:// redirects to https://. Missing HSTS header.",
            "recommendation": "HSTS (Strict-Transport-Security) tells browsers to always open the site over https. It can be enabled under SSL/TLS Certificates in Plesk.",
            "duration_ms": 1844.3,
            "data": []
        },
        {
            "id": "tech_host_variant",
            "category": "technical",
            "title": "www / non-www",
            "status": "pass",
            "severity": "warning",
            "value": "www.ullrutvikling.no redirects to ullrutvikling.no.",
            "recommendation": null,
            "duration_ms": 1844.3,
            "data": []
        },
        {
            "id": "tech_mixed_content",
            "category": "technical",
            "title": "Mixed content",
            "status": "pass",
            "severity": "warning",
            "value": "No resources are loaded over insecure http.",
            "recommendation": null,
            "duration_ms": 1844.3,
            "data": []
        },
        {
            "id": "tech_viewport",
            "category": "technical",
            "title": "Mobile view (viewport)",
            "status": "pass",
            "severity": "critical",
            "value": "viewport=\"width=device-width,initial-scale=1\"",
            "recommendation": null,
            "duration_ms": 1844.3,
            "data": []
        },
        {
            "id": "tech_images_alt",
            "category": "technical",
            "title": "Image alt text",
            "status": "warning",
            "severity": "info",
            "value": "10 images: 0 without alt attribute, 8 with empty alt (decorative). 8 of the images with empty alt look like content images.",
            "recommendation": "8 images from the media library have empty alt (alt=\"\"). That means \"purely decorative\", but photos of staff, properties and products are content and should have a short description, e.g. the person's name. Add alt text in the media library, or check that the theme actually uses it.",
            "duration_ms": 1844.3,
            "data": {
                "lists": [
                    {
                        "key": "empty_alt_content",
                        "label": "Empty alt, but look like content images (8)",
                        "items": [
                            {
                                "url": "https://ullrutvikling.no/wp-content/uploads/2026/07/Ringveien_01-uai-1920x1080.jpg",
                                "note": ""
                            },
                            {
                                "url": "https://ullrutvikling.no/wp-content/uploads/2026/07/Ringveien_02-uai-1920x1080.jpg",
                                "note": ""
                            },
                            {
                                "url": "https://ullrutvikling.no/wp-content/uploads/2026/08/eiendommer-01-uai-776x1165.jpg",
                                "note": ""
                            },
                            {
                                "url": "https://ullrutvikling.no/wp-content/uploads/2026/07/N3_01-uai-1600x1280.jpg",
                                "note": ""
                            },
                            {
                                "url": "https://ullrutvikling.no/wp-content/uploads/2026/07/NK2a_01-uai-1600x1280.jpg",
                                "note": ""
                            },
                            {
                                "url": "https://ullrutvikling.no/wp-content/uploads/2026/08/ullr-eiendom-7-uai-853x1280.jpg",
                                "note": ""
                            },
                            {
                                "url": "https://ullrutvikling.no/wp-content/uploads/2026/08/ullr-scaled.png",
                                "note": "used 2 times"
                            }
                        ]
                    }
                ]
            }
        },
        {
            "id": "tech_images_dimensions",
            "category": "technical",
            "title": "Image dimensions in HTML",
            "status": "pass",
            "severity": "info",
            "value": "0 of 10 images lack width/height.",
            "recommendation": null,
            "duration_ms": 1844.3,
            "data": {
                "lists": []
            }
        },
        {
            "id": "tech_links_internal",
            "category": "technical",
            "title": "Internal links",
            "status": "pass",
            "severity": "warning",
            "value": "18 internal and 2 external links.",
            "recommendation": null,
            "duration_ms": 1844.3,
            "data": []
        },
        {
            "id": "tech_links_text",
            "category": "technical",
            "title": "Link text",
            "status": "warning",
            "severity": "info",
            "value": "4 links without text.",
            "recommendation": "Link text tells search engines and AI what the target page is about. Use e.g. \"See bathroom prices\" instead of \"Read more\". Icon-only links need an aria-label.",
            "duration_ms": 1844.3,
            "data": []
        },
        {
            "id": "llms_txt",
            "category": "bot_access",
            "title": "llms.txt",
            "status": "info",
            "severity": "info",
            "value": "llms.txt does not exist.",
            "recommendation": "Optional: /llms.txt is a proposed standard (llmstxt.org) summarising the site and linking to key pages in Markdown. Limited effect so far, but little work.",
            "duration_ms": 1764.52,
            "data": []
        },
        {
            "id": "content_raw_html",
            "category": "content",
            "title": "Content without JavaScript",
            "status": "warning",
            "severity": "warning",
            "value": "Main content: 107 words (whole page: 265 words, text share 1.7 %).",
            "recommendation": "Little text in the main content. AI services cite pages that answer questions concretely and thoroughly – consider more descriptive text (services, prices, area, contact info, FAQ).",
            "duration_ms": 55.7,
            "data": {
                "main_words": 107,
                "all_words": 265,
                "text_ratio": 0.017,
                "spa_signals": []
            }
        },
        {
            "id": "heading_h1_count",
            "category": "content",
            "title": "H1 heading",
            "status": "pass",
            "severity": "warning",
            "value": "One H1: \"Ringveien\"",
            "recommendation": null,
            "duration_ms": 18.19,
            "data": []
        },
        {
            "id": "heading_order",
            "category": "content",
            "title": "Heading hierarchy",
            "status": "warning",
            "severity": "info",
            "value": "Skipped levels: h2 → h4",
            "recommendation": "Use heading levels in order (H2 under H1, H3 under H2). It helps AI split the content into meaningful sections.",
            "duration_ms": 18.19,
            "data": []
        },
        {
            "id": "language_html_lang",
            "category": "content",
            "title": "Language (lang attribute)",
            "status": "pass",
            "severity": "warning",
            "value": "Language: nb-NO",
            "recommendation": null,
            "duration_ms": 17.83,
            "data": []
        },
        {
            "id": "language_hreflang",
            "category": "content",
            "title": "hreflang",
            "status": "info",
            "severity": "info",
            "value": "No hreflang (fine for single-language sites).",
            "recommendation": null,
            "duration_ms": 17.83,
            "data": []
        },
        {
            "id": "content_freshness",
            "category": "content",
            "title": "Last updated",
            "status": "warning",
            "severity": "info",
            "value": "No publish or update date found.",
            "recommendation": "Provide dateModified/datePublished in JSON-LD (done automatically by Yoast/Rank Math on posts). AI services prefer content they can see is up to date.",
            "duration_ms": 18.82,
            "data": []
        },
        {
            "id": "meta_title",
            "category": "meta",
            "title": "Page title (<title>)",
            "status": "pass",
            "severity": "warning",
            "value": "\"Ringveien – ULLR\" (16 characters)",
            "recommendation": null,
            "duration_ms": 19.04,
            "data": []
        },
        {
            "id": "meta_description",
            "category": "meta",
            "title": "Meta description",
            "status": "fail",
            "severity": "critical",
            "value": "Missing meta description.",
            "recommendation": "Write a 50–160 character description summarising the page.",
            "duration_ms": 19.04,
            "data": []
        },
        {
            "id": "meta_canonical",
            "category": "meta",
            "title": "Canonical",
            "status": "pass",
            "severity": "warning",
            "value": "Self-referencing: https://ullrutvikling.no/?portfolio=ringveien",
            "recommendation": null,
            "duration_ms": 19.04,
            "data": []
        },
        {
            "id": "meta_og_tags",
            "category": "meta",
            "title": "Open Graph",
            "status": "warning",
            "severity": "info",
            "value": "Missing: og:title, og:description, og:image",
            "recommendation": "Add Open Graph tags. They are used for sharing and by many AI agents that fetch previews.",
            "duration_ms": 19.04,
            "data": []
        },
        {
            "id": "schema_org_present",
            "category": "structured_data",
            "title": "JSON-LD",
            "status": "fail",
            "severity": "critical",
            "value": "No JSON-LD on the page.",
            "recommendation": "Add structured data, at least Organization (or LocalBusiness) and WebSite. Yoast/Rank Math do most of this automatically once company info is filled in.",
            "duration_ms": 0.02,
            "data": []
        },
        {
            "id": "performance_response_time",
            "category": "performance",
            "title": "Response time",
            "status": "pass",
            "severity": "critical",
            "value": "The server responded in 388 ms.",
            "recommendation": null,
            "duration_ms": 17.48,
            "data": []
        },
        {
            "id": "performance_html_size",
            "category": "performance",
            "title": "HTML size",
            "status": "pass",
            "severity": "warning",
            "value": "HTML: 101.5 KB",
            "recommendation": null,
            "duration_ms": 17.48,
            "data": []
        },
        {
            "id": "performance_compression",
            "category": "performance",
            "title": "Compression",
            "status": "pass",
            "severity": "warning",
            "value": "Compressed with gzip.",
            "recommendation": null,
            "duration_ms": 17.48,
            "data": []
        },
        {
            "id": "performance_resource_count",
            "category": "performance",
            "title": "Number of resources",
            "status": "warning",
            "severity": "info",
            "value": "26 resources: 12 JS, 5 CSS and 9 images (7 of the images load only on scroll). 19 are fetched on first view.",
            "recommendation": "12 JavaScript files, of which 12 block rendering (no async/defer). Remove unused plugins, and combine/defer scripts (e.g. with LiteSpeed Cache, WP Rocket or Autoptimize).",
            "duration_ms": 17.48,
            "data": {
                "js": 12,
                "js_blocking": 12,
                "css": 5,
                "images_eager": 2,
                "images_lazy": 7,
                "initial": 19
            }
        }
    ],
    "page_meta": {
        "title": "Ringveien – ULLR",
        "description": "",
        "h1": "Ringveien",
        "lang": "nb-NO",
        "canonical": "https://ullrutvikling.no/?portfolio=ringveien",
        "hreflang": [],
        "words": 107,
        "simhash": "a463bbf490912857",
        "links_internal": [
            "https://ullrutvikling.no/",
            "https://ullrutvikling.no/?page_id=81",
            "https://ullrutvikling.no/?page_id=79",
            "https://ullrutvikling.no/?page_id=83",
            "https://ullrutvikling.no/?portfolio=gardermoen-naeringspark-fkn2",
            "https://ullrutvikling.no/?portfolio=gardermoen-naeringspark-n3",
            "https://ullrutvikling.no/?portfolio=gardermoen-naeringspark-nk2a",
            "https://ullrutvikling.no/?portfolio=gamle-nordkisa-skole"
        ],
        "links_external": [
            "https://wonderful-roentgen.65-21-190-2.plesk.page/?page_id=79",
            "https://ohmy.no/"
        ]
    },
    "id": "ullrutvikling.no__20261013-083318-0e52bca0c6aa8e20"
}