{
    "ready": true,
    "site": {
        "id": 0,
        "domain": "benbrougher.tech",
        "display_name": "Home",
        "primary_country_code": "",
        "category_name": "Personal: Portfolios & CVs"
    },
    "metrics": {
        "global_rank": 33327,
        "country_rank": 17628,
        "category_rank": 53,
        "daily_pageviews_per_visitor": 3.88,
        "daily_time_on_site_seconds": 338,
        "bounce_rate": 32.2,
        "search_visits_percent": 38.11,
        "total_sites_linking_in": 1,
        "monthly_unique_visitors": 88,
        "recorded_at": "2026-03-19 04:51:34"
    },
    "audit": {
        "score": 85
    },
    "traffic_sources": {
        "direct_percent": 28.61,
        "search_percent": 33.07,
        "social_percent": 10.62,
        "referral_percent": 12.53,
        "email_percent": 6.21,
        "paid_percent": 8.96
    },
    "seo_profile": {
        "backlinks_total": 1,
        "referring_domains": 1,
        "dofollow_backlinks_percent": 100,
        "organic_keywords": 20,
        "indexed_pages": 21,
        "page_speed_score": 92,
        "mobile_friendliness_score": 85,
        "authority_score": 19,
        "spam_risk_score": 27
    },
    "crawl_report": {
        "robots_status": 200,
        "sitemap_status": 404,
        "sitemap_total_urls": 0,
        "crawl_blocked": false,
        "crawl_blocked_by": "",
        "crawl_blocked_reason": "",
        "notes": [
            "Sitemap could not be confirmed."
        ],
        "created_at": "2026-03-19 04:51:34"
    },
    "keywords": [
        {
            "keyword": "Home",
            "position": 28,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 10:51:22",
            "is_estimated": true
        },
        {
            "keyword": "Home personal: portfolios & cvs",
            "position": 30,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 10:51:22",
            "is_estimated": true
        },
        {
            "keyword": "Home reviews",
            "position": 32,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 10:51:22",
            "is_estimated": true
        },
        {
            "keyword": "benbrougher",
            "position": 34,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 10:51:22",
            "is_estimated": true
        },
        {
            "keyword": "tech",
            "position": 36,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 10:51:22",
            "is_estimated": true
        },
        {
            "keyword": "about",
            "position": 38,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 10:51:22",
            "is_estimated": true
        },
        {
            "keyword": "about me",
            "position": 40,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 10:51:22",
            "is_estimated": true
        },
        {
            "keyword": "contact",
            "position": 42,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 10:51:22",
            "is_estimated": true
        }
    ],
    "rating": {
        "overall": 64,
        "label": "Healthy",
        "breakdown": [
            {
                "label": "Technical foundation",
                "score": 14,
                "max": 18
            },
            {
                "label": "Authority & trust",
                "score": 6,
                "max": 30
            },
            {
                "label": "Reach & market presence",
                "score": 3,
                "max": 18
            },
            {
                "label": "Search visibility",
                "score": 2,
                "max": 12
            },
            {
                "label": "Engagement & retention",
                "score": 9,
                "max": 10
            },
            {
                "label": "Channels & diversification",
                "score": 5,
                "max": 6
            },
            {
                "label": "Registry stability",
                "score": 3,
                "max": 6
            },
            {
                "label": "Quality system",
                "score": 78,
                "max": 100
            },
            {
                "label": "Reputation system",
                "score": 34,
                "max": 100
            },
            {
                "label": "Safety system",
                "score": 100,
                "max": 100
            },
            {
                "label": "Evidence confidence",
                "score": 100,
                "max": 100
            },
            {
                "label": "External intelligence",
                "score": 50,
                "max": 100
            }
        ],
        "authority_score": 19,
        "quality_score": 78,
        "reputation_score": 34,
        "safety_score": 100,
        "confidence_score": 100,
        "fraud_score": 0,
        "authority_signals": {
            "backlinks": 1,
            "referring_domains": 1,
            "organic_keywords": 20,
            "indexed_pages": 21,
            "monthly_visitors": 88,
            "global_rank": 33327,
            "engagement_score": 79,
            "crawl_quality_score": 95,
            "brand_completeness_score": 70,
            "link_diversity_score": 92,
            "technical_reliability_score": 83,
            "whois_score": 45,
            "whois_age_years": 0,
            "whois_stability_score": 100,
            "spam_penalty": 0
        },
        "whois_signals": {
            "age_years": 0,
            "days_to_expiry": null,
            "days_since_last_registry_update": null,
            "stability_score": 100,
            "registrar_changes": 0,
            "ownership_changes": 0,
            "nameserver_changes": 0,
            "status_changes": 0,
            "history_entries": 1,
            "privacy_protected": false,
            "dnssec_enabled": false,
            "has_registrant_country": false,
            "registrant_country": "",
            "nameserver_count": 0,
            "status_count": 0
        }
    },
    "authority_score": 19,
    "trust_score": 58,
    "domain_tags": {
        "primary_tag": "T",
        "primary_tag_score": 76,
        "primary_candidate": "T",
        "primary_candidate_score": 76,
        "tag_codes": "T,Uncertain",
        "tags": [
            {
                "code": "T",
                "label": "Trusted",
                "tone": "good",
                "description": "Strong trust, stability, and low-risk signals were detected.",
                "reason": "Low spam indicators plus strong trust, quality, registry, and stability signals were detected. Internal scoring already considers this domain high-confidence and low-risk, so paid intelligence is skipped unless someone forces a refresh.",
                "message": "The site shows a reasonably trustworthy and stable profile.",
                "priority": 76,
                "score": 76,
                "match_percent": 76,
                "threshold_band": "strong"
            },
            {
                "code": "Uncertain",
                "label": "Uncertain",
                "tone": "unknown",
                "description": "External checks stayed inconclusive, so the model avoided a harder verdict.",
                "reason": "External checks stayed inconclusive, so the system kept an uncertainty buffer.",
                "message": "The evidence is materially mixed or partially corroborated, so the model is avoiding a harder verdict.",
                "priority": 68,
                "score": 68,
                "match_percent": 68,
                "threshold_band": "strong"
            }
        ],
        "tag_breakdown": [
            {
                "code": "T",
                "label": "Trusted",
                "tone": "good",
                "description": "Strong trust, stability, and low-risk signals were detected.",
                "reason": "Low spam indicators plus strong trust, quality, registry, and stability signals were detected. Internal scoring already considers this domain high-confidence and low-risk, so paid intelligence is skipped unless someone forces a refresh.",
                "message": "The site shows a reasonably trustworthy and stable profile.",
                "priority": 76,
                "score": 76,
                "match_percent": 76,
                "threshold_band": "strong"
            },
            {
                "code": "Uncertain",
                "label": "Uncertain",
                "tone": "unknown",
                "description": "External checks stayed inconclusive, so the model avoided a harder verdict.",
                "reason": "External checks stayed inconclusive, so the system kept an uncertainty buffer.",
                "message": "The evidence is materially mixed or partially corroborated, so the model is avoiding a harder verdict.",
                "priority": 68,
                "score": 68,
                "match_percent": 68,
                "threshold_band": "strong"
            },
            {
                "code": "Infra",
                "label": "Risky infrastructure",
                "tone": "caution",
                "description": "The hosting / registrar / nameserver neighbourhood looks unusually risky.",
                "reason": "The infrastructure neighbourhood looks riskier than normal.",
                "message": "Infrastructure risk does not currently stand out.",
                "priority": 2,
                "score": 2,
                "match_percent": 2,
                "threshold_band": "none"
            },
            {
                "code": "C",
                "label": "Caution",
                "tone": "caution",
                "description": "Signals are mixed or weak, so this domain should be treated carefully.",
                "reason": "Review carefully: mixed trust signals. Internal scoring already considers this domain high-confidence and low-risk, so paid intelligence is skipped unless someone forces a refresh.",
                "message": "The current crawl does not show a meaningful caution match.",
                "priority": 0,
                "score": 0,
                "match_percent": 0,
                "threshold_band": "none"
            },
            {
                "code": "Crypto",
                "label": "Crypto drainer risk",
                "tone": "toxic",
                "description": "Wallet-connect or seed-phrase theft patterns were detected.",
                "reason": "Wallet-connect or seed-phrase theft patterns were detected.",
                "message": "No meaningful crypto-drainer signals were detected.",
                "priority": 0,
                "score": 0,
                "match_percent": 0,
                "threshold_band": "none"
            }
        ],
        "nsfw_score": 0,
        "trust_score": 59,
        "manual": {
            "has_changes": false,
            "verified_status": "",
            "tag_codes": "",
            "rating_delta": 0,
            "authority_delta": 0,
            "trust_delta": 0,
            "note": "",
            "adjusted_by": 0,
            "adjusted_at": "",
            "lock_scores": false,
            "lock_flags": false
        },
        "summary": "Trusted (76% match) because low spam indicators plus strong trust, quality, registry, and stability signals were detected. internal scoring already considers this domain high-confidence and low-risk, so paid intelligence is skipped unless someone forces a refresh.",
        "external_intel": {
            "domain": "benbrougher.tech",
            "candidate_tag": "",
            "checked_at": "2026-03-19T04:51:34+00:00",
            "status": "fresh",
            "snapshot_version": 8,
            "summary": "Internal scoring already considers this domain high-confidence and low-risk, so paid intelligence is skipped unless someone forces a refresh.",
            "search_intelligence": {
                "queries": [
                    "site:trustpilot.com \"benbrougher.tech\" -site:benbrougher.tech -site:www.benbrougher.tech",
                    "site:bbb.org \"benbrougher.tech\" -site:benbrougher.tech -site:www.benbrougher.tech",
                    "site:linkedin.com \"benbrougher.tech\" -site:benbrougher.tech -site:www.benbrougher.tech",
                    "site:crunchbase.com \"benbrougher.tech\" -site:benbrougher.tech -site:www.benbrougher.tech"
                ],
                "focused_queries": [
                    "site:trustpilot.com \"benbrougher.tech\" -site:benbrougher.tech -site:www.benbrougher.tech",
                    "site:bbb.org \"benbrougher.tech\" -site:benbrougher.tech -site:www.benbrougher.tech"
                ],
                "relaxed_queries": [
                    "site:wikipedia.org \"benbrougher.tech\"",
                    "site:en.wikipedia.org \"benbrougher.tech\"",
                    "site:wikipedia.org \"benbrougher\"",
                    "site:en.wikipedia.org \"benbrougher\"",
                    "benbrougher company profile",
                    "benbrougher reviews",
                    "benbrougher wikipedia",
                    "benbrougher linkedin",
                    "benbrougher crunchbase"
                ],
                "providers": [
                    "brave"
                ],
                "provider_result_counts": {
                    "brave": 0
                },
                "provider_query_attempts": {
                    "brave": 4
                },
                "provider_error_counts": [],
                "provider_failure_reasons": [],
                "provider_block_signals": [],
                "results_found": 1,
                "external_results_found": 0,
                "used_direct_fallback": true,
                "results": [
                    {
                        "provider": "direct-domain-fallback",
                        "url": "https://benbrougher.tech/",
                        "host": "benbrougher.tech",
                        "title": "benbrougher.tech",
                        "snippet": "First-party fallback captured directly from the domain when public search engines returned no usable results.",
                        "is_direct_fallback": true,
                        "source_meta": {
                            "host": "benbrougher.tech",
                            "source_type": "official_site",
                            "label": "Official site",
                            "trust_weight": 55,
                            "evidence_weight": 26,
                            "noise_penalty": 0,
                            "requires_exact_domain_match": true,
                            "supports_positive_verdicts": false,
                            "supports_negative_verdicts": false,
                            "freshness_ttl_days": 21
                        },
                        "entity": {
                            "score": 100,
                            "exactness": "exact_domain",
                            "reasons": [
                                "The result host matches the exact domain.",
                                "The exact domain is mentioned in the page snippet or document text.",
                                "The result URL contains the exact domain string."
                            ]
                        },
                        "query": "direct-fallback",
                        "rank": 1
                    }
                ],
                "source_mix": {
                    "official_site": 1
                },
                "entity_coverage_score": 100,
                "high_trust_result_count": 0,
                "exact_match_result_count": 1,
                "high_entity_result_count": 1,
                "query_hit_count": 0,
                "query_count": 4,
                "used_failover_provider": false,
                "inferred_candidate_tag": "",
                "used_relaxed_queries": true,
                "search_passes": [
                    {
                        "name": "focused-primary",
                        "queries": 2,
                        "providers": [
                            "brave"
                        ],
                        "results_added": 0,
                        "external_results_added": 0,
                        "deadline_hit": false
                    },
                    {
                        "name": "expanded-primary",
                        "queries": 2,
                        "providers": [
                            "brave"
                        ],
                        "results_added": 0,
                        "external_results_added": 0,
                        "deadline_hit": true
                    },
                    {
                        "name": "relaxed-primary",
                        "queries": 2,
                        "providers": [
                            "brave"
                        ],
                        "results_added": 0,
                        "external_results_added": 0,
                        "deadline_hit": true
                    }
                ],
                "deadline_hit": false
            },
            "review_intelligence": {
                "documents_fetched": 1,
                "external_documents_fetched": 0,
                "documents": [
                    {
                        "provider": "direct-domain-fallback",
                        "url": "https://benbrougher.tech/",
                        "host": "benbrougher.tech",
                        "title": "benbrougher.tech",
                        "snippet": "First-party fallback captured directly from the domain when public search engines returned no usable results.",
                        "is_direct_fallback": true,
                        "source_meta": {
                            "host": "benbrougher.tech",
                            "source_type": "official_site",
                            "label": "Official site",
                            "trust_weight": 55,
                            "evidence_weight": 26,
                            "noise_penalty": 0,
                            "requires_exact_domain_match": true,
                            "supports_positive_verdicts": false,
                            "supports_negative_verdicts": false,
                            "freshness_ttl_days": 21
                        },
                        "entity": {
                            "score": 100,
                            "exactness": "exact_domain",
                            "reasons": [
                                "The result host matches the exact domain.",
                                "The exact domain is mentioned in the page snippet or document text.",
                                "The result URL contains the exact domain string."
                            ]
                        },
                        "query": "direct-fallback",
                        "rank": 1,
                        "body": "Home | benbrougher.tech benbrougher.tech Blog Article Library Knowlege Base Uses Projects Written by Ben Brougher who lives and works in the Pacific Northwest developing solutions to problems (usually with software). He graduated 2020 from Eastern Washington University as a Computer Science Major, Bachelor of Science (BS), and works engineering and developing software solutions in the enterprise telecommunications industry. Bluesky We Programmers - A Retrospective April 13, 2025 My thoughts on Robbert C. Martin's Book, We Programmers AI is Robbing Jr. Devs January 12, 2025 LLMs Are Robbing Jr. Devs of Opportunities to Gain Experience Bash for PowerShell Developers April 16, 2024 How to write bash if you know a little PowerShell My Journey to Neovim January 4, 2024 How and why I switched to Neovim How to write a JSON Schema December 15, 2023 How to write a JSON Schema and where they can be used Consuming RabbitMQ Messages in Go November 20, 2023 How to use golang to consume a RabbitMQ queue and correctly ack and reject Covariance and Contravariance June 18, 2023 What are they, and why are they so helpful? The withResolvers JavaScript Proposal April 7, 2023 What is the withResolvers Proposal and how does it work? ASCII vs UTF-8 vs UTF-16 vs UTF-32 March 24, 2023 (Updated: June 13, 2023) What are all the different ASCII and UTF-x encodings and why do they matter? Building a Svelte Stopwatch with the Temporal API March 12, 2023 How to use the new Temporal API to build a stopwatch in Svelte and TypeScript How to Use Deno Deploy with Azure Cosmos DB February 24, 2023 How to create an API using Deno Deploy and Azure Cosmos as a database Sharing State Between React, Svelte, and Vue in Astro December 30, 2022 How to make frameworks share state between each other when using them in Astro I Love Nested Ternaries December 10, 2022 Why I love them, and why I think they aren't an unreadable mess. Axios vs. Mande October 21, 2022 What are they, do you need them, and how do they compare? Why Not GraphQL? October 6, 2022 Why I don't use GraphQL for personal or work projects Switching to microk8s - 6 Months Later August 18, 2022 How the move from kubeadm to microk8s has worked out over the last 6 months Creating a .NET Cron Job for Kubernetes July 29, 2022 (Updated: February 24, 2023) How to create a .NET 7 Cron Job with C# running in a Kubernetes Cluster Kubernetes Ingress with microk8s, MetalLB, and the NGINX Ingress Controller April 14, 2022 (Updated: March 9, 2023) How to use microk8s to create an ingress using MetalLB and the NGINX ingress controller How to Use a Vue.js Event Bus March 31, 2020 What are event busses in Vue.js and how do we go about using them? Why Use IEnumerable? September 22, 2019 What is IEnumerable in C#? And why should I use it? Getting Started With API Development in Flask September 13, 2019 A Guide to Starting an API With Flask and Python © 2026, Built with Astro 🚀 RSS Feed Status Page Contact Me About @moutansos@mastodon.social",
                        "html": "<!DOCTYPE html><html lang=\"en\" data-astro-cid-eqcieprt> <head><meta charSet=\"utf-8\"><meta httpEquiv=\"x-ua-compatible\" content=\"ie=edge\"><link rel=\"icon\" type=\"image/x-icon\" href=\"/favicon.ico\"><link rel=\"icon\" href=\"/icons/icon-48x48.png\"><link rel=\"apple-touch-icon\" sizes=\"48x48\" href=\"/icons/icon-48x48.png\"><link rel=\"apple-touch-icon\" sizes=\"72x72\" href=\"/icons/icon-72x72.png\"><link rel=\"apple-touch-icon\" sizes=\"96x96\" href=\"/icons/icon-96x96.png\"><link rel=\"apple-touch-icon\" sizes=\"192x192\" href=\"/icons/icon-192x192.png\"><link rel=\"apple-touch-icon\" sizes=\"256x256\" href=\"/icons/icon-256x256.png\"><link rel=\"apple-touch-icon\" sizes=\"384x384\" href=\"/icons/icon-384x384.png\"><link rel=\"apple-touch-icon\" sizes=\"512x512\" href=\"/icons/icon-512x512.png\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><script type=\"module\" src=\"/_astro/BaseHead.astro_astro_type_script_index_0_lang.682lm-kn.js\"></script><title>Home | benbrougher.tech</title><link rel=\"preconnect\" href=\"https://fonts.googleapis.com\"><link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin><link href=\"https://fonts.googleapis.com/css2?family=Montserrat:wght@900&display=swap\" rel=\"stylesheet\"><meta charset=\"UTF-8\"><meta name=\"description\" content=\"A Place to Share and Collaborate with Fellow Developers\"><meta name=\"og:title\" content=\"Home | benbrougher.tech\"><meta name=\"og:description\" content=\"A Place to Share and Collaborate with Fellow Developers\"><meta name=\"og:type\" content=\"website\"><meta name=\"twitter:card\" content=\"summary\"><meta name=\"twitter:creator\" content=\"Ben Brougher\"><meta name=\"twitter:title\" content=\"Home | benbrougher.tech\"><meta name=\"twitter:description\" content=\"A Place to Share and Collaborate with Fellow Developers\"><script type=\"module\">window.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\"js\",new Date);a(\"config\",\"G-HFJVTXQVHW\");</script><!-- Global site tag (gtag.js) - Google Analytics --><script async src=\"https://www.googletagmanager.com/gtag/js?id=G-HFJVTXQVHW\"></script><script type=\"module\" src=\"/_astro/BasePage.astro_astro_type_script_index_1_lang.682lm-kn.js\"></script><style>.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-title[data-astro-cid-bvzihdzo]{margin-bottom:0}.date-tag[data-astro-cid-bvzihdzo]{margin-top:0;margin-bottom:2em;font-family:Merriweather,Georgia,serif;font-size:.9em}img[data-astro-cid-bvzihdzo]{max-width:100%}main[data-astro-cid-bvzihdzo]{padding-bottom:5em}main[data-astro-cid-bvzihdzo] img{max-width:100%}main[data-astro-cid-bvzihdzo] h1{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}main[data-astro-cid-bvzihdzo] h2{margin-top:1.75em;font-family:Merriweather,Georgia,serif;font-size:2em}main[data-astro-cid-bvzihdzo] h3{font-family:Merriweather,Georgia,serif;font-size:1.5em}main[data-astro-cid-bvzihdzo] blockquote{border-left:.25em solid grey;margin-left:-1.5em;padding:0 1em;margin-top:1em;margin-bottom:1em;font-size:1.4em;font-style:italic}main[data-astro-cid-bvzihdzo] a{color:var(--linkColor)}a[data-astro-cid-bvzihdzo]{font-size:1.25em;color:var(--linkColor)} .link-container[data-astro-cid-r7mfi7hb]{display:flex;flex-direction:row}.link-container[data-astro-cid-r7mfi7hb] a[data-astro-cid-r7mfi7hb]{padding:.5em}footer[data-astro-cid-r7mfi7hb]{font-size:var(--standardFontSize);padding-bottom:1em}a[data-astro-cid-r7mfi7hb]{color:var(--linkColor)}.navigation[data-astro-cid-pux6a34n]{padding-bottom:2em}.nav-link[data-astro-cid-pux6a34n]{display:inline-block;margin:.5em;padding:.2em;color:var(--linkColor);text-decoration:none}.nav-label[data-astro-cid-pux6a34n]{padding:.2em;margin:0;text-transform:uppercase;font-weight:900;letter-spacing:.1em;line-height:1.1;border-bottom:.12em solid var(--linkColor);font-family:Merriweather,Georgia,serif;font-size:1.1em}.nav-label[data-astro-cid-pux6a34n]:hover{border-bottom:none}.nav-link[data-astro-cid-pux6a34n]:visited{color:var(--linkColor)}#twitch-banner.svelte-1fe7bwn{background-color:#6441a5;color:#fff;padding:10px;text-align:center;border-radius:5px;margin:10px}#twitch-banner.svelte-1fe7bwn p:where(.svelte-1fe7bwn){margin:0;font-size:1rem;font-weight:700;font-family:Roboto,sans-serif}#twitch-banner.svelte-1fe7bwn a:where(.svelte-1fe7bwn){color:#fff}.big-header[data-astro-cid-xuks7swe]{font-size:2em}.small-header[data-astro-cid-xuks7swe]{font-size:.8em;margin-bottom:2em}.main-header[data-astro-cid-xuks7swe] h1[data-astro-cid-xuks7swe]{box-shadow:none;box-sizing:border-box;color:var(--primaryAccent);cursor:pointer;display:inline;font-family:Montserrat,sans-serif;width:auto;text-decoration:none}.main-header[data-as…",
                        "status_code": 200,
                        "final_url": "https://benbrougher.tech/"
                    }
                ],
                "facts": [],
                "ignored_candidates": [],
                "blocked_candidates": 0,
                "source_diversity": 0,
                "host_coverage": 1,
                "source_type_coverage": 1,
                "exact_match_documents": 1,
                "external_exact_match_documents": 0,
                "elapsed_ms": 413,
                "candidates_considered": 1,
                "fetch_success_rate": 100,
                "avg_source_trust": 55,
                "avg_entity_score": 100
            },
            "evidence": {
                "scores": {
                    "legit": 0,
                    "safe": 0,
                    "trusted": 0,
                    "caution": 0,
                    "scam": 0,
                    "dangerous": 0,
                    "spam": 0,
                    "nsfw": 0
                },
                "counts": {
                    "official_presence": 0,
                    "business_profiles": 0,
                    "positive_reviews": 0,
                    "negative_reviews": 0,
                    "scam_reports": 0,
                    "dangerous_reports": 0,
                    "spam_reports": 0,
                    "adult_reports": 0
                },
                "tag_support": [],
                "top_supporting_facts": [],
                "top_positive_facts": []
            },
            "quality": {
                "source_diversity_score": 0,
                "entity_coverage_score": 100,
                "freshness_score": 18,
                "confidence": 21,
                "documents_fetched": 1,
                "external_documents_fetched": 0,
                "fact_count": 0,
                "avg_source_trust": 55,
                "avg_entity_score": 100,
                "fetch_success_rate": 100,
                "exact_match_score": 0,
                "query_coverage_score": 40,
                "host_coverage_score": 20,
                "source_type_coverage_score": 25,
                "qualified_evidence_score": 0,
                "exact_match_documents": 0,
                "blocked_candidates": 0,
                "used_direct_fallback": true,
                "external_results_found": 0
            },
            "decision": {
                "state": "insufficient",
                "uncertainty": true,
                "candidate_support": 0,
                "candidate_contradiction": 0,
                "supports": {
                    "dangerous": false,
                    "scam": false,
                    "spam": false,
                    "nsfw": false,
                    "trusted": false
                },
                "evidence_quality": "low",
                "state_label": "Inconclusive",
                "state_reason": "Public search did not yield usable third-party matches, so the system fell back to first-party inspection only."
            },
            "signals": {
                "scores": {
                    "legit": 0,
                    "safe": 0,
                    "trusted": 0,
                    "caution": 0,
                    "scam": 0,
                    "dangerous": 0,
                    "spam": 0,
                    "nsfw": 0
                },
                "counts": {
                    "official_presence": 0,
                    "business_profiles": 0,
                    "positive_reviews": 0,
                    "negative_reviews": 0,
                    "scam_reports": 0,
                    "dangerous_reports": 0,
                    "spam_reports": 0,
                    "adult_reports": 0
                },
                "candidate_support": 0,
                "candidate_contradiction": 0,
                "highlights": [
                    "External evidence remained inconclusive because diversity, exact matching, or confidence was still too weak."
                ]
            },
            "citations": [],
            "urlscan": {
                "domain": "benbrougher.tech",
                "status": "error",
                "submitted_at": "2026-03-19T04:51:34+00:00",
                "completed_at": null,
                "last_checked_at": "2026-03-19T04:51:34+00:00",
                "last_error": "Rate limit for 'public' exceeded. Limit is 500 per hour. Reset in 505 seconds.",
                "submitted_url": "https://benbrougher.tech/",
                "uuid": "",
                "result_url": "",
                "api_result_url": "",
                "visibility": "public",
                "summary": "urlscan.io scan submission failed.",
                "report": [],
                "report_summary": [],
                "is_fresh": false,
                "can_retry": false,
                "poll_after_seconds": 20
            },
            "eligibility": {
                "budget_ms": 4200,
                "search_budget_ms": 1600,
                "review_budget_ms": 2600,
                "query_cap": 2,
                "provider_cap": 1,
                "result_cap": 6,
                "review_document_cap": 4,
                "search_connect_timeout": 2,
                "search_timeout": 3,
                "review_connect_timeout": 2,
                "review_timeout": 3,
                "allowed": true,
                "mode": "normal",
                "decision_code": "run_normal",
                "reason": "post-crawl",
                "summary": "Running a standard intelligence pass because the current signals need third-party corroboration. The TLD is uncommon, so Website-Rank starts with a smaller budget.",
                "cooldown": {
                    "active": false,
                    "empty_attempts": 0,
                    "next_allowed_at": "",
                    "reason": "",
                    "provider_retry_at": ""
                },
                "suffix": {
                    "tld": "tech",
                    "registered_suffix": "tech",
                    "class": "unknown",
                    "reserved": false
                },
                "signals": {
                    "trust_score": 0,
                    "quality_score": 0,
                    "safety_score": 0,
                    "fraud_score": 0,
                    "spam_score": 0,
                    "nsfw_score": 0,
                    "score_confidence": 0,
                    "risk_label": "good",
                    "crawl_blocked": false,
                    "last_http_status": 200,
                    "content_word_count": 652,
                    "internal_links_count": 27,
                    "site_name": "",
                    "title": "Home | benbrougher.tech",
                    "is_tracked": false
                }
            },
            "cooldown": {
                "empty_attempts": 1,
                "next_allowed_at": "2026-03-26T04:51:34+00:00",
                "reason": "Recent intelligence runs produced no qualified third-party evidence, so retries are cooled down to save budget.",
                "provider_retry_at": "",
                "last_reason": "post-crawl"
            },
            "debug": {
                "top_supporting_facts": [],
                "top_positive_facts": [],
                "ignored_candidates": [],
                "budget_ms": 4200,
                "search_budget_ms": 1600,
                "review_budget_ms": 2600,
                "search_mode": "post-crawl",
                "query_cap": 2,
                "provider_cap": 1,
                "result_cap": 6,
                "review_document_cap": 4,
                "reason": "post-crawl",
                "priority": 92,
                "eligibility_decision": "run_normal"
            },
            "last_good": {
                "checked_at": "2026-03-19T04:51:34+00:00",
                "summary": "External checks ran, but the verified result set was still too sparse to harden the verdict.",
                "decision": {
                    "state": "insufficient",
                    "uncertainty": true,
                    "candidate_support": 0,
                    "candidate_contradiction": 0,
                    "supports": {
                        "dangerous": false,
                        "scam": false,
                        "spam": false,
                        "nsfw": false,
                        "trusted": false
                    },
                    "evidence_quality": "low",
                    "state_label": "Inconclusive",
                    "state_reason": "Public search did not yield usable third-party matches, so the system fell back to first-party inspection only."
                },
                "signals": {
                    "scores": {
                        "legit": 0,
                        "safe": 0,
                        "trusted": 0,
                        "caution": 0,
                        "scam": 0,
                        "dangerous": 0,
                        "spam": 0,
                        "nsfw": 0
                    },
                    "counts": {
                        "official_presence": 0,
                        "business_profiles": 0,
                        "positive_reviews": 0,
                        "negative_reviews": 0,
                        "scam_reports": 0,
                        "dangerous_reports": 0,
                        "spam_reports": 0,
                        "adult_reports": 0
                    },
                    "candidate_support": 0,
                    "candidate_contradiction": 0,
                    "highlights": [
                        "External evidence remained inconclusive because diversity, exact matching, or confidence was still too weak."
                    ]
                },
                "citations": []
            }
        },
        "external_decision": {
            "state": "insufficient",
            "uncertainty": true,
            "candidate_support": 0,
            "candidate_contradiction": 0,
            "supports": {
                "dangerous": false,
                "scam": false,
                "spam": false,
                "nsfw": false,
                "trusted": false
            },
            "evidence_quality": "low",
            "state_label": "Inconclusive",
            "state_reason": "Public search did not yield usable third-party matches, so the system fell back to first-party inspection only."
        },
        "signal_scores": [
            {
                "label": "Strongest tag heuristic",
                "value": "T · 76%",
                "tone": "good",
                "detail": "The highest raw tag match from the heuristic engine before visibility thresholds and manual overrides."
            },
            {
                "label": "Trust score",
                "value": "59/100",
                "tone": "caution",
                "detail": "Confidence derived from authority, crawl quality, stability, and risk signals."
            },
            {
                "label": "Authority score",
                "value": "19/100",
                "tone": "spam",
                "detail": "A higher authority score usually means broader reputation and backlink confidence."
            },
            {
                "label": "Spam risk",
                "value": "0/100",
                "tone": "good",
                "detail": "Lower is better. This blends spam indicators with false-positive protections for legitimate sites."
            },
            {
                "label": "Quality score",
                "value": "81/100",
                "tone": "good",
                "detail": "Based on crawl quality, content completeness, and technical evidence."
            },
            {
                "label": "Safety score",
                "value": "100/100",
                "tone": "good",
                "detail": "Higher is safer. Direct fraud signals can heavily cap this even when SEO signals look strong."
            },
            {
                "label": "Fraud score",
                "value": "0/100",
                "tone": "good",
                "detail": "Lower is better. This reflects phishing, drainer, fake-support, fake-shop, and malware signals."
            },
            {
                "label": "Infrastructure risk",
                "value": "2/100",
                "tone": "good",
                "detail": "Lower is better. This reflects the IP, registrar, and nameserver neighbourhood seen by the crawler."
            },
            {
                "label": "Evidence confidence",
                "value": "100/100",
                "tone": "good",
                "detail": "Higher means the crawler had enough pages and registry evidence to make a stronger call."
            },
            {
                "label": "External evidence",
                "value": "Low",
                "tone": "unknown",
                "detail": "Quality of the structured search and review evidence cluster."
            },
            {
                "label": "External decision",
                "value": "Inconclusive",
                "tone": "unknown",
                "detail": "How third-party evidence compares with the current candidate tag."
            },
            {
                "label": "NSFW score",
                "value": "0/100",
                "tone": "good",
                "detail": "Context-aware adult-content detection with medical / educational false-positive reduction."
            },
            {
                "label": "Registry stability",
                "value": "100/100",
                "tone": "good",
                "detail": "Based on age, expiry runway, and the amount of ownership / registrar churn."
            }
        ],
        "signal_sections": [
            {
                "title": "Registry & ownership",
                "items": [
                    {
                        "label": "Domain age",
                        "value": "—",
                        "tone": "unknown",
                        "detail": "Older domains generally carry more historical trust than very new ones."
                    },
                    {
                        "label": "Stability score",
                        "value": "100/100",
                        "tone": "good",
                        "detail": "Penalised by registrar, ownership, and nameserver churn."
                    },
                    {
                        "label": "Days to expiry",
                        "value": "—",
                        "tone": "unknown",
                        "detail": "Very short renewal windows can be a weak trust signal."
                    },
                    {
                        "label": "Registrar / ownership changes",
                        "value": "0 / 0",
                        "tone": "good",
                        "detail": "Frequent ownership churn can weaken trust."
                    },
                    {
                        "label": "Nameserver changes",
                        "value": "0",
                        "tone": "good",
                        "detail": "Repeated infrastructure changes can indicate instability."
                    },
                    {
                        "label": "DNSSEC / privacy",
                        "value": "DNSSEC off · privacy off",
                        "tone": "caution",
                        "detail": "DNSSEC strengthens DNS trust; privacy is neutral on its own."
                    }
                ]
            },
            {
                "title": "Reputation & search evidence",
                "items": [
                    {
                        "label": "Backlinks",
                        "value": "1",
                        "tone": "unknown",
                        "detail": "Broader backlink evidence usually improves confidence."
                    },
                    {
                        "label": "Referring domains",
                        "value": "1",
                        "tone": "unknown",
                        "detail": "Unique linking domains are more useful than raw link volume."
                    },
                    {
                        "label": "Organic keywords",
                        "value": "20",
                        "tone": "unknown",
                        "detail": "Search footprint helps distinguish real sites from thin shells."
                    },
                    {
                        "label": "Indexed pages",
                        "value": "21",
                        "tone": "caution",
                        "detail": "Larger index coverage usually means more evidence to classify from."
                    },
                    {
                        "label": "Brand strength",
                        "value": "70/100",
                        "tone": "good",
                        "detail": "Stronger brand signals reduce false positives for legitimate sites."
                    },
                    {
                        "label": "Risk label",
                        "value": "GOOD",
                        "tone": "unknown",
                        "detail": "This is the raw crawl / heuristic risk label feeding the tag model."
                    }
                ]
            },
            {
                "title": "Crawl, content & technicals",
                "items": [
                    {
                        "label": "HTTP status",
                        "value": "200",
                        "tone": "good",
                        "detail": "Healthy responses make classification more reliable."
                    },
                    {
                        "label": "HTTPS / speed",
                        "value": "HTTPS OK · 514 ms",
                        "tone": "good",
                        "detail": "Slow or broken technical signals weaken confidence."
                    },
                    {
                        "label": "Content words",
                        "value": "652",
                        "tone": "good",
                        "detail": "Thin pages are harder to trust and easier to manipulate."
                    },
                    {
                        "label": "Schema / structure",
                        "value": "0 schema · meta · H1",
                        "tone": "caution",
                        "detail": "Structured markup and basic on-page hygiene improve quality confidence."
                    },
                    {
                        "label": "Links on page",
                        "value": "27 internal · 9 external",
                        "tone": "good",
                        "detail": "Link patterns help detect thin directories and promo pages."
                    },
                    {
                        "label": "Page speed / mobile",
                        "value": "92/100 · 85/100",
                        "tone": "good",
                        "detail": "Better technical quality generally reduces low-effort site patterns."
                    },
                    {
                        "label": "Crawl access",
                        "value": "Open",
                        "tone": "good",
                        "detail": "The crawler reached the site without an anti-bot challenge."
                    }
                ]
            },
            {
                "title": "External evidence & explainability",
                "items": [
                    {
                        "label": "Decision state",
                        "value": "Inconclusive",
                        "tone": "unknown",
                        "detail": "Public search did not yield usable third-party matches, so the system fell back to first-party inspection only."
                    },
                    {
                        "label": "Evidence quality",
                        "value": "Low",
                        "tone": "unknown",
                        "detail": "Blends source trust, domain matching, evidence diversity, and freshness."
                    },
                    {
                        "label": "Support vs contradiction",
                        "value": "0 / 0",
                        "tone": "unknown",
                        "detail": "Compares how much structured external evidence supports the candidate tag against evidence that contradicts it."
                    },
                    {
                        "label": "Qualified risk sources",
                        "value": "No",
                        "tone": "good",
                        "detail": "Risk tags only promote from external evidence when source diversity or source trust thresholds are met."
                    },
                    {
                        "label": "Uncertainty buffer",
                        "value": "Active",
                        "tone": "caution",
                        "detail": "Prevents thin or mixed external evidence from forcing a stronger tag than the evidence can justify."
                    }
                ]
            }
        ],
        "positives": [
            "Low registrar / ownership churn with solid registry stability.",
            "Healthy crawl quality and on-page completeness."
        ],
        "risks": [
            "External evidence was mixed or sparse, so the tag model keeps an uncertainty buffer instead of overcommitting."
        ]
    },
    "traffic_confidence": 29,
    "whois": {
        "current": {
            "id": 30863,
            "domain": "benbrougher.tech",
            "source_type": "whois_text",
            "rdap_url": "",
            "registrar_name": "",
            "registrar_handle": "",
            "registrant_name": "",
            "registrant_org": "",
            "registrant_country": "",
            "registrant_email": "",
            "abuse_email": "",
            "created_date": null,
            "updated_date": null,
            "expires_date": null,
            "nameservers_json": "[]",
            "status_json": "[]",
            "dnssec": "unknown",
            "privacy_protected": 0,
            "content_hash": "f7e17c57c5fdd24df1793ece6bff99716369356b90b29c4725ac3ba12a76b72c",
            "history_count": 1,
            "last_checked_at": "2026-03-19 04:51:32",
            "last_changed_at": "2026-03-19 04:51:32",
            "created_at": "2026-03-19 04:51:33",
            "updated_at": "2026-03-19 04:51:33"
        },
        "history": [
            {
                "id": 31599,
                "domain": "benbrougher.tech",
                "source_type": "whois_text",
                "registrar_name": "",
                "registrar_handle": "",
                "registrant_name": "",
                "registrant_org": "",
                "registrant_country": "",
                "registrant_email": "",
                "abuse_email": "",
                "created_date": null,
                "updated_date": null,
                "expires_date": null,
                "nameservers_json": "[]",
                "status_json": "[]",
                "dnssec": "unknown",
                "privacy_protected": 0,
                "content_hash": "f7e17c57c5fdd24df1793ece6bff99716369356b90b29c4725ac3ba12a76b72c",
                "checked_at": "2026-03-19 04:51:32",
                "change_summary": "Initial WHOIS snapshot captured.",
                "created_at": "2026-03-19 04:51:32"
            }
        ],
        "signals": {
            "age_years": 0,
            "days_to_expiry": null,
            "days_since_last_registry_update": null,
            "stability_score": 100,
            "registrar_changes": 0,
            "ownership_changes": 0,
            "nameserver_changes": 0,
            "status_changes": 0,
            "history_entries": 1,
            "privacy_protected": false,
            "dnssec_enabled": false,
            "has_registrant_country": false,
            "registrant_country": "",
            "nameserver_count": 0,
            "status_count": 0
        }
    },
    "discovered_domain": {
        "id": 136800,
        "domain": "benbrougher.tech",
        "first_seen_at": "2026-03-16 03:50:24",
        "last_crawled_at": "2026-03-19 04:51:34",
        "last_title": "Home | benbrougher.tech",
        "last_http_status": 200,
        "discovered_from_domain": "uses.tech",
        "depth": 0,
        "backlinks_count": 1,
        "rating_cache": 57,
        "spam_score": 24,
        "risk_label": "good",
        "category_name": "Personal: Portfolios & CVs",
        "primary_country_code": "",
        "internal_links_count": 27,
        "external_links_count": 9,
        "social_profiles_count": 3,
        "content_word_count": 652,
        "title_quality_score": 81,
        "has_meta_description": 1,
        "has_h1": 1,
        "language_code": "en",
        "response_time_ms": 514,
        "robots_status": 200,
        "sitemap_status": 404,
        "sitemap_total_urls": 0,
        "quality_score": 81,
        "site_name": "",
        "canonical_domain": "",
        "favicon_present": 1,
        "schema_org_count": 0,
        "noindex_detected": 0,
        "feed_links_count": 0,
        "https_working": 1,
        "estimated_authority_score": 16,
        "trust_score": 88,
        "nsfw_score": 0,
        "overall_rank_estimate": 14354,
        "primary_tag": "",
        "tag_codes": "",
        "manual_verified_status": "",
        "manual_tag_codes": "",
        "manual_rating_delta": 0,
        "manual_authority_delta": 0,
        "manual_trust_delta": 0,
        "manual_note": null,
        "manual_adjusted_by": null,
        "manual_adjusted_at": null,
        "manual_lock_scores": 0,
        "manual_lock_flags": 0,
        "crawl_blocked": 0,
        "crawl_blocked_by": "",
        "crawl_blocked_reason": null,
        "safety_score": 100,
        "fraud_score": 0,
        "legitimacy_score": 41,
        "infrastructure_risk_score": 2,
        "score_confidence": 100,
        "tag_confidence": 72,
        "category_confidence": 88,
        "deep_crawl_pages": 27,
        "resolved_ip": "63.176.8.218",
        "category_candidates_json": "[{\"category\":\"Personal: Portfolios & CVs\",\"score\":88}]",
        "page_signals_json": "[{\"path\":\"/about\",\"status\":200,\"title\":\"About Me | benbrougher.tech\",\"word_count\":184,\"summary_text\":\"About Me | benbrougher.tech About Me | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.link-container[data-astro-cid-r7mfi7hb]{display:flex;flex-direction:row}.link-container[data-astro-cid-r7mfi7hb] a[data-astro-cid-r7mfi7hb]{padding:.5em}footer[data-astro-cid-r7mfi7hb]{font-size:var(--standardFontSize);padding-bottom:1em}a[data-astro-cid-r7mfi7hb]{color:var(--linkColor)}.navigation[data-astro-cid-pux6a34n]{padding-bottom:2em}.nav-link[data-astro-cid-pux6a34n]{display:inline-block;margin:.5em;padding:.2em;color:var(--linkColor);text-decoration:none}.nav-label[data-astro-cid-pux6a34n]{padding:.2em;margin:0;text-transform:uppercase;font-weight:900;letter-spacing:.1em;line-height:1.1;border-bottom:.12em solid var(--linkColor);font\",\"classification_terms\":[\"about\",\"about me\",\"contact\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/contact\",\"status\":200,\"title\":\"Contact Me | benbrougher.tech\",\"word_count\":163,\"summary_text\":\"Contact Me | benbrougher.tech Contact Me | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.link-container[data-astro-cid-r7mfi7hb]{display:flex;flex-direction:row}.link-container[data-astro-cid-r7mfi7hb] a[data-astro-cid-r7mfi7hb]{padding:.5em}footer[data-astro-cid-r7mfi7hb]{font-size:var(--standardFontSize);padding-bottom:1em}a[data-astro-cid-r7mfi7hb]{color:var(--linkColor)}.navigation[data-astro-cid-pux6a34n]{padding-bottom:2em}.nav-link[data-astro-cid-pux6a34n]{display:inline-block;margin:.5em;padding:.2em;color:var(--linkColor);text-decoration:none}.nav-label[data-astro-cid-pux6a34n]{padding:.2em;margin:0;text-transform:uppercase;font-weight:900;letter-spacing:.1em;line-height:1.1;border-bottom:.12em solid var(--linkColor);fo\",\"classification_terms\":[\"contact\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/articles\",\"status\":200,\"title\":\"Article Library | benbrougher.tech\",\"word_count\":193,\"summary_text\":\"Article Library | benbrougher.tech Article Library | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.link-container[data-astro-cid-r7mfi7hb]{display:flex;flex-direction:row}.link-container[data-astro-cid-r7mfi7hb] a[data-astro-cid-r7mfi7hb]{padding:.5em}footer[data-astro-cid-r7mfi7hb]{font-size:var(--standardFontSize);padding-bottom:1em}a[data-astro-cid-r7mfi7hb]{color:var(--linkColor)}.navigation[data-astro-cid-pux6a34n]{padding-bottom:2em}.nav-link[data-astro-cid-pux6a34n]{display:inline-block;margin:.5em;padding:.2em;color:var(--linkColor);text-decoration:none}.nav-label[data-astro-cid-pux6a34n]{padding:.2em;margin:0;text-transform:uppercase;font-weight:900;letter-spacing:.1em;line-height:1.1;border-bottom:.12em solid var(--linkColo\",\"classification_terms\":[\"articles\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/uses\",\"status\":200,\"title\":\"Uses | benbrougher.tech\",\"word_count\":586,\"summary_text\":\"Uses | benbrougher.tech Uses | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.link-container[data-astro-cid-r7mfi7hb]{display:flex;flex-direction:row}.link-container[data-astro-cid-r7mfi7hb] a[data-astro-cid-r7mfi7hb]{padding:.5em}footer[data-astro-cid-r7mfi7hb]{font-size:var(--standardFontSize);padding-bottom:1em}a[data-astro-cid-r7mfi7hb]{color:var(--linkColor)}.navigation[data-astro-cid-pux6a34n]{padding-bottom:2em}.nav-link[data-astro-cid-pux6a34n]{display:inline-block;margin:.5em;padding:.2em;color:var(--linkColor);text-decoration:none}.nav-label[data-astro-cid-pux6a34n]{padding:.2em;margin:0;text-transform:uppercase;font-weight:900;letter-spacing:.1em;line-height:1.1;border-bottom:.12em solid var(--linkColor);font-fam\",\"classification_terms\":[\"uses\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/projects\",\"status\":200,\"title\":\"Projects | benbrougher.tech\",\"word_count\":220,\"summary_text\":\"Projects | benbrougher.tech Projects | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");a.svelte-1rfekuo{text-decoration:none;color:var(--linkColor)}h3.svelte-1rfekuo{margin-bottom:.5em;font-family:Merriweather,Georgia,serif;font-size:1.5rem}p.svelte-1rfekuo{padding-top:0;margin-top:.25em;margin-bottom:0}article.svelte-1rfekuo{margin-bottom:4em;display:flex;flex-direction:row}.description.svelte-1rfekuo{font-size:var(--standardFontSize)}.website-thumbnail.svelte-1rfekuo{width:12em;border-radius:.75em;margin:1em} .link-container[data-astro-cid-r7mfi7hb]{display:flex;flex-direction:row}.link-container[data-astro-cid-r7mfi7hb] a[data-astro-cid-r7mfi7hb]{padding:.5em}footer[data-astro-cid-r7mfi7hb]{font-size:var(--standardFontSize);pa\",\"classification_terms\":[\"projects\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/we-programmers\",\"status\":200,\"title\":\"We Programmers - A Retrospective | benbrougher.tech\",\"word_count\":1146,\"summary_text\":\"We Programmers - A Retrospective | benbrougher.tech We Programmers - A Retrospective | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-title[data-astr\",\"classification_terms\":[\"posts/we-programmers\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/llms-are-robbing-jr-devs\",\"status\":200,\"title\":\"AI is Robbing Jr. Devs | benbrougher.tech\",\"word_count\":1238,\"summary_text\":\"AI is Robbing Jr. Devs | benbrougher.tech AI is Robbing Jr. Devs | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-title[data-astro-cid-bvzi\",\"classification_terms\":[\"posts/llms-are-robbing-jr-devs\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/bash-for-powershell-devs\",\"status\":200,\"title\":\"Bash for PowerShell Developers | benbrougher.tech\",\"word_count\":1019,\"summary_text\":\"Bash for PowerShell Developers | benbrougher.tech Bash for PowerShell Developers | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-title[data-astro-\",\"classification_terms\":[\"posts/bash-for-powershell-devs\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/neovim-journey\",\"status\":200,\"title\":\"My Journey to Neovim | benbrougher.tech\",\"word_count\":1597,\"summary_text\":\"My Journey to Neovim | benbrougher.tech My Journey to Neovim | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-title[data-astro-cid-bvzihd\",\"classification_terms\":[\"posts/neovim-journey\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/json-schemas-tutorial\",\"status\":200,\"title\":\"How to write a JSON Schema | benbrougher.tech\",\"word_count\":2161,\"summary_text\":\"How to write a JSON Schema | benbrougher.tech How to write a JSON Schema | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-title[data-astro-cid-\",\"classification_terms\":[\"posts/json-schemas-tutorial\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/consuming-rabbitmq-events-in-go\",\"status\":200,\"title\":\"Consuming RabbitMQ Messages in Go | benbrougher.tech\",\"word_count\":570,\"summary_text\":\"Consuming RabbitMQ Messages in Go | benbrougher.tech Consuming RabbitMQ Messages in Go | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-title[data-ast\",\"classification_terms\":[\"posts/consuming-rabbitmq-events-in-go\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/covariance-and-contravariance\",\"status\":200,\"title\":\"Covariance and Contravariance | benbrougher.tech\",\"word_count\":927,\"summary_text\":\"Covariance and Contravariance | benbrougher.tech Covariance and Contravariance | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-title[data-astro-c\",\"classification_terms\":[\"posts/covariance-and-contravariance\",\"help\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/with-resolvers-proposal\",\"status\":200,\"title\":\"The withResolvers JavaScript Proposal | benbrougher.tech\",\"word_count\":744,\"summary_text\":\"The withResolvers JavaScript Proposal | benbrougher.tech The withResolvers JavaScript Proposal | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-title[data\",\"classification_terms\":[\"posts/with-resolvers-proposal\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/utf-charsets\",\"status\":200,\"title\":\"ASCII vs UTF-8 vs UTF-16 vs UTF-32 | benbrougher.tech\",\"word_count\":1885,\"summary_text\":\"ASCII vs UTF-8 vs UTF-16 vs UTF-32 | benbrougher.tech ASCII vs UTF-8 vs UTF-16 vs UTF-32 | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-title[data-as\",\"classification_terms\":[\"posts/utf-charsets\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/svelte-temporal-stopwatch\",\"status\":200,\"title\":\"Building a Svelte Stopwatch with the Temporal API | benbrougher.tech\",\"word_count\":1057,\"summary_text\":\"Building a Svelte Stopwatch with the Temporal API | benbrougher.tech Building a Svelte Stopwatch with the Temporal API | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.mai\",\"classification_terms\":[\"posts/svelte-temporal-stopwatch\",\"api\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/deno-deploy-with-azure-cosmos\",\"status\":200,\"title\":\"How to Use Deno Deploy with Azure Cosmos DB | benbrougher.tech\",\"word_count\":2326,\"summary_text\":\"How to Use Deno Deploy with Azure Cosmos DB | benbrougher.tech How to Use Deno Deploy with Azure Cosmos DB | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-titl\",\"classification_terms\":[\"posts/deno-deploy-with-azure-cosmos\",\"api\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/astro-shared-state\",\"status\":200,\"title\":\"Sharing State Between React, Svelte, and Vue in Astro | benbrougher.tech\",\"word_count\":1214,\"summary_text\":\"Sharing State Between React, Svelte, and Vue in Astro | benbrougher.tech Sharing State Between React, Svelte, and Vue in Astro | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}\",\"classification_terms\":[\"posts/astro-shared-state\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/nested-ternaries\",\"status\":200,\"title\":\"I Love Nested Ternaries | benbrougher.tech\",\"word_count\":774,\"summary_text\":\"I Love Nested Ternaries | benbrougher.tech I Love Nested Ternaries | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-title[data-astro-cid-bvz\",\"classification_terms\":[\"posts/nested-ternaries\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/axios-vs-mande\",\"status\":200,\"title\":\"Axios vs. Mande | benbrougher.tech\",\"word_count\":1259,\"summary_text\":\"Axios vs. Mande | benbrougher.tech Axios vs. Mande | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-title[data-astro-cid-bvzihdzo]{m\",\"classification_terms\":[\"posts/axios-vs-mande\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/why-not-graphql\",\"status\":200,\"title\":\"Why Not GraphQL? | benbrougher.tech\",\"word_count\":1587,\"summary_text\":\"Why Not GraphQL? | benbrougher.tech Why Not GraphQL? | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-title[data-astro-cid-bvzihdzo]{\",\"classification_terms\":[\"posts/why-not-graphql\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/microk8s-6-months-later\",\"status\":200,\"title\":\"Switching to microk8s - 6 Months Later | benbrougher.tech\",\"word_count\":1089,\"summary_text\":\"Switching to microk8s - 6 Months Later | benbrougher.tech Switching to microk8s - 6 Months Later | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-title[dat\",\"classification_terms\":[\"posts/microk8s-6-months-later\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/kubernetes-cron-job\",\"status\":200,\"title\":\"Creating a .NET Cron Job for Kubernetes | benbrougher.tech\",\"word_count\":1468,\"summary_text\":\"Creating a .NET Cron Job for Kubernetes | benbrougher.tech Creating a .NET Cron Job for Kubernetes | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-title[da\",\"classification_terms\":[\"posts/kubernetes-cron-job\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":2,\"depth\":1},{\"path\":\"/posts/microk8s-ingress\",\"status\":200,\"title\":\"Kubernetes Ingress with microk8s, MetalLB, and the NGINX Ingress Controller | benbrougher.tech\",\"word_count\":1445,\"summary_text\":\"Kubernetes Ingress with microk8s, MetalLB, and the NGINX Ingress Controller | benbrougher.tech Kubernetes Ingress with microk8s, MetalLB, and the NGINX Ingress Controller | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-\",\"classification_terms\":[\"posts/microk8s-ingress\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/posts/vue-event-bus-tutorial\",\"status\":200,\"title\":\"How to Use a Vue.js Event Bus | benbrougher.tech\",\"word_count\":1014,\"summary_text\":\"How to Use a Vue.js Event Bus | benbrougher.tech How to Use a Vue.js Event Bus | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-title[data-astro-c\",\"classification_terms\":[\"posts/vue-event-bus-tutorial\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/why-use-ienumerable\",\"status\":200,\"title\":\"Why Use IEnumerable? | benbrougher.tech\",\"word_count\":1669,\"summary_text\":\"Why Use IEnumerable? | benbrougher.tech Why Use IEnumerable? | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-title[data-astro-cid-bvzihd\",\"classification_terms\":[\"posts/why-use-ienumerable\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/python-flask\",\"status\":200,\"title\":\"Getting Started With API Development in Flask | benbrougher.tech\",\"word_count\":1129,\"summary_text\":\"Getting Started With API Development in Flask | benbrougher.tech Getting Started With API Development in Flask | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.icon[data-astro-cid-2jiluk5e]{display:inline-block;width:1.5rem;height:1.5rem;fill:#fff;color:#fff;margin:0 .5rem}.icon[data-astro-cid-2jiluk5e] a[data-astro-cid-2jiluk5e] svg[data-astro-cid-2jiluk5e]{fill:#fff;width:100%;height:100%}p[data-astro-cid-2jiluk5e]{margin-bottom:1.75em;font-weight:400;word-wrap:break-word;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0px;margin-inline-end:0px;line-height:1.5em;font-size:var(--standardFontSize)}.bio[data-astro-cid-2jiluk5e]{padding-bottom:1.5rem}h1[data-astro-cid-bvzihdzo]{margin-top:1em;font-family:Montserrat,sans-serif;font-size:2.5em}.main-ti\",\"classification_terms\":[\"posts/python-flask\",\"api\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":4,\"depth\":1},{\"path\":\"/projects/bank-failures\",\"status\":200,\"title\":\"Bank Failure API | benbrougher.tech\",\"word_count\":207,\"summary_text\":\"Bank Failure API | benbrougher.tech Bank Failure API | benbrougher.techwindow.dataLayer=window.dataLayer||[];function a(){dataLayer.push(arguments)}a(\\\"js\\\",new Date);a(\\\"config\\\",\\\"G-HFJVTXQVHW\\\");.link-container[data-astro-cid-r7mfi7hb]{display:flex;flex-direction:row}.link-container[data-astro-cid-r7mfi7hb] a[data-astro-cid-r7mfi7hb]{padding:.5em}footer[data-astro-cid-r7mfi7hb]{font-size:var(--standardFontSize);padding-bottom:1em}a[data-astro-cid-r7mfi7hb]{color:var(--linkColor)}.navigation[data-astro-cid-pux6a34n]{padding-bottom:2em}.nav-link[data-astro-cid-pux6a34n]{display:inline-block;margin:.5em;padding:.2em;color:var(--linkColor);text-decoration:none}.nav-label[data-astro-cid-pux6a34n]{padding:.2em;margin:0;text-transform:uppercase;font-weight:900;letter-spacing:.1em;line-height:1.1;border-bottom:.12em solid var(--linkCol\",\"classification_terms\":[\"projects/bank-failures\",\"api\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"googletagmanager.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":2}]",
        "score_reasons_json": "[]",
        "route_domain": "benbrougher.tech",
        "display_domain": "benbrougher.tech"
    },
    "explainability": {
        "summary": "benbrougher.tech currently scores 64/100. The score is being shaped by a mixed signal profile rather than one dominant factor. Evidence confidence is strong enough for a relatively stable read. This is an estimated profile rather than a manually tracked one. Crawler access looks clean.",
        "badges": [
            {
                "label": "Profile",
                "value": "Estimated profile",
                "tone": "unknown",
                "detail": null
            },
            {
                "label": "Evidence confidence",
                "value": "High confidence",
                "tone": "good",
                "detail": "100/100"
            },
            {
                "label": "Traffic confidence",
                "value": "Low confidence",
                "tone": "risk",
                "detail": "29/100"
            },
            {
                "label": "Crawler access",
                "value": "Clean visibility",
                "tone": "good",
                "detail": null
            }
        ],
        "weighted_contributions": [
            {
                "label": "Quality system",
                "points": "+26.5",
                "tone": "good",
                "detail": "Technical quality, crawl depth, page structure, and implementation hygiene. Current subsystem score: 78/100."
            },
            {
                "label": "Reputation system",
                "points": "+11.6",
                "tone": "risk",
                "detail": "Authority, search visibility, reach, engagement, and registry stability. Current subsystem score: 34/100."
            },
            {
                "label": "Safety system",
                "points": "+32.0",
                "tone": "good",
                "detail": "Fraud, spam, and trust signals from infrastructure, crawl, and registry evidence. Current subsystem score: 100/100."
            },
            {
                "label": "Risk clamp",
                "points": "-6.0",
                "tone": "risk",
                "detail": "Safety thresholds capped the final score until the risk profile improves."
            }
        ],
        "evidence_cards": [
            {
                "label": "Authority and trust",
                "value": "19/100 · trust 58/100",
                "tone": "risk",
                "detail": "88 monthly visitors, 20 organic keywords, brand completeness 70/100, engagement 79/100."
            },
            {
                "label": "Backlink and search evidence",
                "value": "1 referring domains",
                "tone": "good",
                "detail": "1 backlinks across 1 referring domains. Diversity 92/100; spam penalty 0."
            },
            {
                "label": "Registry and domain stability",
                "value": "0.0 years old",
                "tone": "good",
                "detail": "Stability 100/100 · age 0.0 years."
            },
            {
                "label": "Safety and fraud posture",
                "value": "Safety 100/100 · fraud 0/100",
                "tone": "good",
                "detail": "Primary tag T · safety 100/100 · fraud 0/100."
            }
        ],
        "positives": [
            "Low registrar / ownership churn with solid registry stability.",
            "Healthy crawl quality and on-page completeness.",
            "Registry history looks stable, which supports legitimacy and trust.",
            "HTTPS is working, so the site clears a basic transport-security check.",
            "Backlink diversity looks broad enough to strengthen authority confidence."
        ],
        "risks": [
            "External evidence was mixed or sparse, so the tag model keeps an uncertainty buffer instead of overcommitting.",
            "Traffic and reach estimates are still low confidence, so commercial scale signals may move after more evidence is collected."
        ],
        "freshness": [
            {
                "label": "Crawl evidence",
                "value": "2026-03-19 04:51:34",
                "tone": "risk",
                "detail": "Crawl and page content sample. Age: 1mo ago."
            },
            {
                "label": "WHOIS snapshot",
                "value": "2026-03-19 04:51:32",
                "tone": "risk",
                "detail": "Registry profile and stability signals. Age: 1mo ago."
            },
            {
                "label": "Keyword view",
                "value": "2026-04-19 10:51:22",
                "tone": "good",
                "detail": "Estimated visibility until tracked keyword snapshots exist. Age: 0s ago."
            },
            {
                "label": "Rank history",
                "value": "2026-04-19 10:51:22",
                "tone": "good",
                "detail": "Estimated trend derived from current profile and crawl signals. Age: 0s ago."
            },
            {
                "label": "Audience geography",
                "value": "Not captured yet",
                "tone": "unknown",
                "detail": "Audience mix is estimated from available signals rather than first-party audience logs."
            }
        ],
        "section_notes": {
            "audience": "Audience geography is estimated from category, country, traffic mix, and brand signals until first-party audience data is collected.",
            "keywords": "Top keywords are estimated from crawl language, brand, category, and visibility signals until tracked keyword snapshots are stored.",
            "history": "Rank history is estimated from the current profile because no stored history exists for this domain yet."
        },
        "base_weighted_score": 70,
        "fraud_clamp_penalty": 6,
        "final_score": 64
    },
    "insight_snapshot": {
        "version": 1,
        "generated_at": "2026-04-19T10:51:22+00:00",
        "domain": "benbrougher.tech",
        "display_name": "Home",
        "is_tracked": false,
        "is_estimated": true,
        "overall_score": 64,
        "authority_score": 19,
        "trust_score": 58,
        "safety_score": 100,
        "fraud_score": 0,
        "confidence_score": 100,
        "traffic_confidence": 29,
        "last_crawled_at": "2026-03-19 04:51:34",
        "crawl_blocked": false,
        "summary": "benbrougher.tech currently scores 64/100. The score is being shaped by a mixed signal profile rather than one dominant factor. Evidence confidence is strong enough for a relatively stable read. This is an estimated profile rather than a manually tracked one. Crawler access looks clean.",
        "badges": [
            {
                "label": "Profile",
                "value": "Estimated profile",
                "tone": "unknown",
                "detail": null
            },
            {
                "label": "Evidence confidence",
                "value": "High confidence",
                "tone": "good",
                "detail": "100/100"
            },
            {
                "label": "Traffic confidence",
                "value": "Low confidence",
                "tone": "risk",
                "detail": "29/100"
            },
            {
                "label": "Crawler access",
                "value": "Clean visibility",
                "tone": "good",
                "detail": null
            }
        ],
        "top_positive_signals": [
            "Low registrar / ownership churn with solid registry stability.",
            "Healthy crawl quality and on-page completeness.",
            "Registry history looks stable, which supports legitimacy and trust.",
            "HTTPS is working, so the site clears a basic transport-security check.",
            "Backlink diversity looks broad enough to strengthen authority confidence."
        ],
        "top_risk_signals": [
            "External evidence was mixed or sparse, so the tag model keeps an uncertainty buffer instead of overcommitting.",
            "Traffic and reach estimates are still low confidence, so commercial scale signals may move after more evidence is collected."
        ],
        "freshness": [
            {
                "label": "Crawl evidence",
                "value": "2026-03-19 04:51:34",
                "tone": "risk",
                "detail": "Crawl and page content sample. Age: 1mo ago."
            },
            {
                "label": "WHOIS snapshot",
                "value": "2026-03-19 04:51:32",
                "tone": "risk",
                "detail": "Registry profile and stability signals. Age: 1mo ago."
            },
            {
                "label": "Keyword view",
                "value": "2026-04-19 10:51:22",
                "tone": "good",
                "detail": "Estimated visibility until tracked keyword snapshots exist. Age: 0s ago."
            },
            {
                "label": "Rank history",
                "value": "2026-04-19 10:51:22",
                "tone": "good",
                "detail": "Estimated trend derived from current profile and crawl signals. Age: 0s ago."
            },
            {
                "label": "Audience geography",
                "value": "Not captured yet",
                "tone": "unknown",
                "detail": "Audience mix is estimated from available signals rather than first-party audience logs."
            }
        ],
        "top_tags": [
            {
                "code": "T",
                "label": "Trusted",
                "tone": "good"
            },
            {
                "code": "Uncertain",
                "label": "Uncertain",
                "tone": "unknown"
            }
        ]
    },
    "is_tracked": false,
    "is_estimated": true,
    "live_state": {
        "status": "processing",
        "status_label": "Cache build running",
        "message": "The refreshed page cache is still being built for this domain.",
        "updated_at": "2026-04-19T15:25:20+00:00"
    },
    "refresh_state": {
        "canRequest": false,
        "queued": true,
        "processing": true,
        "stageKey": "cache-queued",
        "stageLabel": "Cache build running",
        "cooldownUntil": null,
        "message": "The refreshed page cache is still being built for this domain.",
        "action": "/domain/benbrougher.tech/refresh",
        "isGuestCooldown": false,
        "cooldownSeconds": 0
    },
    "urlscan_report": {
        "domain": "benbrougher.tech",
        "status": "error",
        "submitted_at": "2026-03-19T04:51:34+00:00",
        "completed_at": null,
        "last_checked_at": "2026-03-19T04:51:34+00:00",
        "last_error": "Rate limit for 'public' exceeded. Limit is 500 per hour. Reset in 505 seconds.",
        "submitted_url": "https://benbrougher.tech/",
        "uuid": "",
        "result_url": "",
        "api_result_url": "",
        "visibility": "public",
        "summary": "urlscan.io scan submission failed.",
        "report": [],
        "report_summary": [],
        "is_fresh": false,
        "can_retry": true,
        "poll_after_seconds": 20
    }
}