{
    "ready": true,
    "site": {
        "id": 0,
        "domain": "duncanbain.dev",
        "display_name": "duncanbain.dev",
        "primary_country_code": "",
        "category_name": "Personal: Portfolios & CVs"
    },
    "metrics": {
        "global_rank": 37454,
        "country_rank": 19968,
        "category_rank": 64,
        "daily_pageviews_per_visitor": 3.82,
        "daily_time_on_site_seconds": 327,
        "bounce_rate": 33.18,
        "search_visits_percent": 40.31,
        "total_sites_linking_in": 1,
        "monthly_unique_visitors": 111,
        "recorded_at": "2026-03-19 17:48:31"
    },
    "audit": {
        "score": 79
    },
    "traffic_sources": {
        "direct_percent": 27.02,
        "search_percent": 35.44,
        "social_percent": 10.4,
        "referral_percent": 12.28,
        "email_percent": 6.08,
        "paid_percent": 8.78
    },
    "seo_profile": {
        "backlinks_total": 1,
        "referring_domains": 1,
        "dofollow_backlinks_percent": 100,
        "organic_keywords": 73,
        "indexed_pages": 7,
        "page_speed_score": 81,
        "mobile_friendliness_score": 79,
        "authority_score": 43,
        "spam_risk_score": 27
    },
    "crawl_report": {
        "robots_status": 404,
        "sitemap_status": 404,
        "sitemap_total_urls": 0,
        "crawl_blocked": false,
        "crawl_blocked_by": "",
        "crawl_blocked_reason": "",
        "notes": [
            "robots.txt could not be confirmed.",
            "Sitemap could not be confirmed."
        ],
        "created_at": "2026-03-19 17:48:31"
    },
    "keywords": [
        {
            "keyword": "duncanbain.dev",
            "position": 20,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 12:10:47",
            "is_estimated": true
        },
        {
            "keyword": "duncanbain.dev personal: portfolios & cvs",
            "position": 22,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 12:10:47",
            "is_estimated": true
        },
        {
            "keyword": "duncanbain.dev reviews",
            "position": 24,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 12:10:47",
            "is_estimated": true
        },
        {
            "keyword": "duncanbain",
            "position": 26,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 12:10:47",
            "is_estimated": true
        },
        {
            "keyword": "dev",
            "position": 28,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 12:10:47",
            "is_estimated": true
        },
        {
            "keyword": "about",
            "position": 30,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 12:10:47",
            "is_estimated": true
        },
        {
            "keyword": "about me",
            "position": 32,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 12:10:47",
            "is_estimated": true
        },
        {
            "keyword": "projects",
            "position": 34,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 12:10:47",
            "is_estimated": true
        }
    ],
    "rating": {
        "overall": 64,
        "label": "Healthy",
        "breakdown": [
            {
                "label": "Technical foundation",
                "score": 9,
                "max": 18
            },
            {
                "label": "Authority & trust",
                "score": 13,
                "max": 30
            },
            {
                "label": "Reach & market presence",
                "score": 3,
                "max": 18
            },
            {
                "label": "Search visibility",
                "score": 3,
                "max": 12
            },
            {
                "label": "Engagement & retention",
                "score": 9,
                "max": 10
            },
            {
                "label": "Channels & diversification",
                "score": 5,
                "max": 6
            },
            {
                "label": "Registry stability",
                "score": 4,
                "max": 6
            },
            {
                "label": "Quality system",
                "score": 50,
                "max": 100
            },
            {
                "label": "Reputation system",
                "score": 45,
                "max": 100
            },
            {
                "label": "Safety system",
                "score": 100,
                "max": 100
            },
            {
                "label": "Evidence confidence",
                "score": 100,
                "max": 100
            },
            {
                "label": "External intelligence",
                "score": 52,
                "max": 100
            },
            {
                "label": "API intelligence",
                "score": 54,
                "max": 100
            }
        ],
        "authority_score": 43,
        "quality_score": 50,
        "reputation_score": 45,
        "safety_score": 100,
        "confidence_score": 100,
        "fraud_score": 1,
        "authority_signals": {
            "backlinks": 1,
            "referring_domains": 1,
            "organic_keywords": 73,
            "indexed_pages": 7,
            "monthly_visitors": 111,
            "global_rank": 37454,
            "engagement_score": 79,
            "crawl_quality_score": 80,
            "brand_completeness_score": 70,
            "link_diversity_score": 92,
            "technical_reliability_score": 60,
            "whois_score": 65,
            "whois_age_years": 6.5,
            "whois_stability_score": 100,
            "spam_penalty": 0
        },
        "whois_signals": {
            "age_years": 6.5,
            "days_to_expiry": 199,
            "days_since_last_registry_update": 30,
            "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": 2,
            "status_count": 1
        }
    },
    "authority_score": 43,
    "trust_score": 72,
    "domain_tags": {
        "primary_tag": "T",
        "primary_tag_score": 79,
        "primary_candidate": "T",
        "primary_candidate_score": 79,
        "tag_codes": "T",
        "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.",
                "message": "The site shows a reasonably trustworthy and stable profile.",
                "priority": 79,
                "score": 79,
                "match_percent": 79,
                "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.",
                "message": "The site shows a reasonably trustworthy and stable profile.",
                "priority": 79,
                "score": 79,
                "match_percent": 79,
                "threshold_band": "strong"
            },
            {
                "code": "Uncertain",
                "label": "Uncertain",
                "tone": "unknown",
                "description": "External checks stayed inconclusive, so the model avoided a harder verdict.",
                "reason": "",
                "message": "The evidence does not currently look notably uncertain.",
                "priority": 18,
                "score": 18,
                "match_percent": 18,
                "threshold_band": "none"
            },
            {
                "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": 8,
                "score": 8,
                "match_percent": 8,
                "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.",
                "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": 73,
        "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 (79% match) because low spam indicators plus strong trust, quality, registry, and stability signals were detected.",
        "external_intel": [],
        "external_decision": [],
        "signal_scores": [
            {
                "label": "Strongest tag heuristic",
                "value": "T · 79%",
                "tone": "good",
                "detail": "The highest raw tag match from the heuristic engine before visibility thresholds and manual overrides."
            },
            {
                "label": "Trust score",
                "value": "73/100",
                "tone": "caution",
                "detail": "Confidence derived from authority, crawl quality, stability, and risk signals."
            },
            {
                "label": "Authority score",
                "value": "43/100",
                "tone": "caution",
                "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": "74/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": "8/100",
                "tone": "good",
                "detail": "Lower is better. This reflects the IP, registrar, and nameserver neighbourhood seen by the crawler."
            },
            {
                "label": "Evidence confidence",
                "value": "99/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": "6.5 years",
                        "tone": "good",
                        "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": "199",
                        "tone": "good",
                        "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": "73",
                        "tone": "caution",
                        "detail": "Search footprint helps distinguish real sites from thin shells."
                    },
                    {
                        "label": "Indexed pages",
                        "value": "7",
                        "tone": "unknown",
                        "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 · 816 ms",
                        "tone": "good",
                        "detail": "Slow or broken technical signals weaken confidence."
                    },
                    {
                        "label": "Content words",
                        "value": "298",
                        "tone": "caution",
                        "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": "8 internal · 3 external",
                        "tone": "good",
                        "detail": "Link patterns help detect thin directories and promo pages."
                    },
                    {
                        "label": "Page speed / mobile",
                        "value": "81/100 · 79/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": "Structured third-party evidence is still too thin, mixed, or unqualified to force a harder verdict."
                    },
                    {
                        "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": "Clear",
                        "tone": "good",
                        "detail": "Prevents thin or mixed external evidence from forcing a stronger tag than the evidence can justify."
                    }
                ]
            }
        ],
        "positives": [
            "Established domain age: 6.5 years.",
            "Low registrar / ownership churn with solid registry stability.",
            "Healthy crawl quality and on-page completeness."
        ],
        "risks": []
    },
    "traffic_confidence": 61,
    "whois": {
        "current": {
            "id": 39500,
            "domain": "duncanbain.dev",
            "source_type": "rdap",
            "rdap_url": "https://pubapi.registry.google/rdap/domain/duncanbain.dev",
            "registrar_name": "Namecheap Inc.",
            "registrar_handle": "1068",
            "registrant_name": "",
            "registrant_org": "",
            "registrant_country": "",
            "registrant_email": "",
            "abuse_email": "abuse@namecheap.com",
            "created_date": "2019-11-05 07:35:39",
            "updated_date": "2026-03-19 17:48:27",
            "expires_date": "2026-11-05 07:35:39",
            "nameservers_json": "[\"dns1.registrar-servers.com\",\"dns2.registrar-servers.com\"]",
            "status_json": "[\"client transfer prohibited\"]",
            "dnssec": "unsigned",
            "privacy_protected": 0,
            "content_hash": "53adb5d9ad81230e5aed78069c001e0d6bc408275fc824115d2b823afe526915",
            "history_count": 1,
            "last_checked_at": "2026-03-19 17:48:28",
            "last_changed_at": "2026-03-19 17:48:28",
            "created_at": "2026-03-19 17:48:28",
            "updated_at": "2026-03-19 17:48:28"
        },
        "history": [
            {
                "id": 40365,
                "domain": "duncanbain.dev",
                "source_type": "rdap",
                "registrar_name": "Namecheap Inc.",
                "registrar_handle": "1068",
                "registrant_name": "",
                "registrant_org": "",
                "registrant_country": "",
                "registrant_email": "",
                "abuse_email": "abuse@namecheap.com",
                "created_date": "2019-11-05 07:35:39",
                "updated_date": "2026-03-19 17:48:27",
                "expires_date": "2026-11-05 07:35:39",
                "nameservers_json": "[\"dns1.registrar-servers.com\",\"dns2.registrar-servers.com\"]",
                "status_json": "[\"client transfer prohibited\"]",
                "dnssec": "unsigned",
                "privacy_protected": 0,
                "content_hash": "53adb5d9ad81230e5aed78069c001e0d6bc408275fc824115d2b823afe526915",
                "checked_at": "2026-03-19 17:48:28",
                "change_summary": "Initial WHOIS snapshot captured.",
                "created_at": "2026-03-19 17:48:28"
            }
        ],
        "signals": {
            "age_years": 6.5,
            "days_to_expiry": 199,
            "days_since_last_registry_update": 30,
            "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": 2,
            "status_count": 1
        }
    },
    "discovered_domain": {
        "id": 136978,
        "domain": "duncanbain.dev",
        "first_seen_at": "2026-03-16 03:50:35",
        "last_crawled_at": "2026-03-19 17:48:31",
        "last_title": "duncanbain.dev",
        "last_http_status": 200,
        "discovered_from_domain": "uses.tech",
        "depth": 0,
        "backlinks_count": 1,
        "rating_cache": 52,
        "spam_score": 24,
        "risk_label": "good",
        "category_name": "Personal: Portfolios & CVs",
        "primary_country_code": "",
        "internal_links_count": 8,
        "external_links_count": 3,
        "social_profiles_count": 3,
        "content_word_count": 298,
        "title_quality_score": 79,
        "has_meta_description": 1,
        "has_h1": 1,
        "language_code": "",
        "response_time_ms": 816,
        "robots_status": 404,
        "sitemap_status": 404,
        "sitemap_total_urls": 0,
        "quality_score": 74,
        "site_name": "duncanbain.dev",
        "canonical_domain": "",
        "favicon_present": 0,
        "schema_org_count": 0,
        "noindex_detected": 0,
        "feed_links_count": 0,
        "https_working": 1,
        "estimated_authority_score": 33,
        "trust_score": 95,
        "nsfw_score": 0,
        "overall_rank_estimate": 22561,
        "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": 1,
        "legitimacy_score": 63,
        "infrastructure_risk_score": 8,
        "score_confidence": 99,
        "tag_confidence": 71,
        "category_confidence": 88,
        "deep_crawl_pages": 6,
        "resolved_ip": "76.76.21.21",
        "category_candidates_json": "[{\"category\":\"Personal: Portfolios & CVs\",\"score\":88}]",
        "page_signals_json": "[{\"path\":\"/about\",\"status\":200,\"title\":\"\",\"word_count\":127,\"summary_text\":\"Duncan BainAboutProjectsUsesAbout Me!Hi! 👋 I&#x27;m Duncan, and I&#x27;m a Mechanical Engineer learning to code, based in London. In Spring 2019 I decided to make a change, a change in my career as a Mechanical Engineer to become a Software Engineer. I&#x27;ve always been interested in computers, having been introduced to them at a young age, I even went on to study Computer Science for a year before changing to Mechanical Engineering! Now after spending the last 8 years working in various engineering roles I&#x27;ve decided to make the change.I&#x27;m now spending the majority of my free time learning HTML, CSS and JavaScript with the intention of gianing a solid foundation of fullstack web development.When not coding I enjoy cycling, cooking and travelling.Made with ☕ by Duncan Bain{\\\"pro\",\"classification_terms\":[\"about\",\"about me\"],\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/projects\",\"status\":200,\"title\":\"\",\"word_count\":48,\"summary_text\":\"Duncan BainAboutProjectsUsesPersonal Blog and PortfolioA personal website created using Gatsby, Tailwind CSS and Styled-Components. Hosted on Netlify. Github RepoProject DemoBug Tracker ApplicationA bug tracker created using React, GraphQL, MongoDB and Styled-Components. Hosted on Heroku and Netlify, continuously deployed using CircleCI. Github RepoProject DemoMade with ☕ by Duncan Bain{\\\"props\\\":{\\\"pageProps\\\":{}},\\\"page\\\":\\\"/projects\\\",\\\"query\\\":{},\\\"buildId\\\":\\\"AlNkNI6tTUfUt1rMAUNyu\\\",\\\"nextExport\\\":true,\\\"autoExport\\\":true,\\\"isFallback\\\":false,\\\"scriptLoader\\\":[]}\",\"classification_terms\":[\"projects\",\"about\",\"blog\"],\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/uses\",\"status\":200,\"title\":\"Create Next App\",\"word_count\":308,\"summary_text\":\"Create Next App Create Next AppDuncan BainAboutProjectsUsesUsesInspirsed by Wes Bos and his uses.tech website, I thought I&#x27;d jump on the bandwagon and share my development stack!Software ⌨️ Editor + TerminalVisual Studio CodeTheme: Night Owl by Sarah DrasnerFont: Microsoft Cascadia CodeExtensionsESLint - Integrates ESLint with VS Code.GitLens - Gives a great in depth look into what lines of code were changed, who changed it and why.MDX - Adds syntax highligtning to .mdx files, very useful!Markdown Preview Enhanced - Preview rendered Markdown in real time as you type.Code Time - An open source extension that provides interesting metrics your coding activites such as duration, lines of code written and time spent coding on specific repositories.Windows Terminal - An excellent new terminal from Microsof\",\"classification_terms\":[\"uses\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/blog\",\"status\":200,\"title\":\"\",\"word_count\":244,\"summary_text\":\"Duncan BainAboutProjectsUsesAll PostsDeploying Your Gatsby Site to a DigitalOcean Droplet03 Jun 2020I&#x27;m a big fan of both DigitalOcean and Gatsby. I&#x27;ve used DigitalOcean for several years for various hosting services, and now that I&#x27;m learning web development Gatsby is what I&#x27;ve used for my first personal website and portfolio. I&#x27;ve written this guide to show the steps required in order to deploy your own Gatsby site onto a DigitalOcean droplet.Time For Change!03 Jun 2019I’ve always been interested in computers, some of the fondest memories of my childhood are those of spending time with my dad writing code in Object Pascal to create a working calculator, installing Debian linux with a massive printed out manual as reference and no GUI.Made with ☕ by Duncan Bain{\\\"p\",\"classification_terms\":[\"blog\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":2,\"depth\":1},{\"path\":\"/blog/deploying-gatsby-to-digitalocean\",\"status\":200,\"title\":\"Deploying Your Gatsby Site to a DigitalOcean Droplet\",\"word_count\":2630,\"summary_text\":\"Deploying Your Gatsby Site to a DigitalOcean Droplet Deploying Your Gatsby Site to a DigitalOcean DropletDuncan BainAboutProjectsUsesDeploying Your Gatsby Site to a DigitalOcean Droplet03 Jun 2020I&#x27;m a big fan of both DigitalOcean and Gatsby. I&#x27;ve used DigitalOcean for several years for various hosting services, and now that I&#x27;m learning web development Gatsby is what I&#x27;ve used for my first personal website and portfolio. I&#x27;ve written this guide to show the steps required in order to deploy your own Gatsby site onto a DigitalOcean droplet. What is GatsbyJS? Gatsby is a React based GraphQL powered static site generator. Gatsby can be used to create highly performant sites, with things like service workers, image optimisation and intelligent data fetching available straight out of the box. What is DigitalOcean? Digital\",\"classification_terms\":[\"blog/deploying-gatsby-to-digitalocean\",\"about\",\"blog\"],\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":2,\"depth\":1},{\"path\":\"/blog/time-for-change\",\"status\":200,\"title\":\"Time For Change!\",\"word_count\":1136,\"summary_text\":\"Time For Change! Time For Change!Duncan BainAboutProjectsUsesTime For Change!03 Jun 2019I’ve always been interested in computers, some of the fondest memories of my childhood are those of spending time with my dad writing code in Object Pascal to create a working calculator, installing Debian linux with a massive printed out manual as reference and no GUI. Oh, and annoying the rest of the household by installing Windows Server 2000 along with setting up active directory and roaming profiles on our computers. This love for computers stayed with me as I grew older, I went off to University to study Computer Science. But after finishing the first year of the degree I wasn’t sure if this was something I wanted to pursue for several years, and then onto a career, maybe it was something better kept as a hobby? A\",\"classification_terms\":[\"blog/time-for-change\",\"about\",\"blog\"],\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":2,\"depth\":1}]",
        "score_reasons_json": "[]",
        "route_domain": "duncanbain.dev",
        "display_domain": "duncanbain.dev"
    },
    "explainability": {
        "summary": "duncanbain.dev 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": "Solid confidence",
                "tone": "caution",
                "detail": "61/100"
            },
            {
                "label": "Crawler access",
                "value": "Clean visibility",
                "tone": "good",
                "detail": null
            }
        ],
        "weighted_contributions": [
            {
                "label": "Quality system",
                "points": "+17.0",
                "tone": "caution",
                "detail": "Technical quality, crawl depth, page structure, and implementation hygiene. Current subsystem score: 50/100."
            },
            {
                "label": "Reputation system",
                "points": "+15.3",
                "tone": "caution",
                "detail": "Authority, search visibility, reach, engagement, and registry stability. Current subsystem score: 45/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."
            }
        ],
        "evidence_cards": [
            {
                "label": "Authority and trust",
                "value": "43/100 · trust 72/100",
                "tone": "caution",
                "detail": "111 monthly visitors, 73 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": "6.5 years old",
                "tone": "good",
                "detail": "Stability 100/100 · age 6.5 years · registrar Namecheap Inc. · expires in 199 days."
            },
            {
                "label": "Safety and fraud posture",
                "value": "Safety 100/100 · fraud 1/100",
                "tone": "good",
                "detail": "Primary tag T · safety 100/100 · fraud 1/100."
            }
        ],
        "positives": [
            "Established domain age: 6.5 years.",
            "Low registrar / ownership churn with solid registry stability.",
            "Healthy crawl quality and on-page completeness.",
            "Registry history looks stable, which supports legitimacy and trust.",
            "The domain has been registered for years, which usually improves trust confidence.",
            "HTTPS is working, so the site clears a basic transport-security check."
        ],
        "risks": [],
        "freshness": [
            {
                "label": "Crawl evidence",
                "value": "2026-03-19 17:48:31",
                "tone": "risk",
                "detail": "Crawl and page content sample. Age: 1mo ago."
            },
            {
                "label": "WHOIS snapshot",
                "value": "2026-03-19 17:48:28",
                "tone": "risk",
                "detail": "Registry profile and stability signals. Age: 1mo ago."
            },
            {
                "label": "Keyword view",
                "value": "2026-04-19 12:10:47",
                "tone": "good",
                "detail": "Estimated visibility until tracked keyword snapshots exist. Age: 0s ago."
            },
            {
                "label": "Rank history",
                "value": "2026-04-19 12:10:47",
                "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": 64,
        "fraud_clamp_penalty": 0,
        "final_score": 64
    },
    "insight_snapshot": {
        "version": 1,
        "generated_at": "2026-04-19T12:10:47+00:00",
        "domain": "duncanbain.dev",
        "display_name": "duncanbain.dev",
        "is_tracked": false,
        "is_estimated": true,
        "overall_score": 64,
        "authority_score": 43,
        "trust_score": 72,
        "safety_score": 100,
        "fraud_score": 1,
        "confidence_score": 100,
        "traffic_confidence": 61,
        "last_crawled_at": "2026-03-19 17:48:31",
        "crawl_blocked": false,
        "summary": "duncanbain.dev 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": "Solid confidence",
                "tone": "caution",
                "detail": "61/100"
            },
            {
                "label": "Crawler access",
                "value": "Clean visibility",
                "tone": "good",
                "detail": null
            }
        ],
        "top_positive_signals": [
            "Established domain age: 6.5 years.",
            "Low registrar / ownership churn with solid registry stability.",
            "Healthy crawl quality and on-page completeness.",
            "Registry history looks stable, which supports legitimacy and trust.",
            "The domain has been registered for years, which usually improves trust confidence."
        ],
        "top_risk_signals": [],
        "freshness": [
            {
                "label": "Crawl evidence",
                "value": "2026-03-19 17:48:31",
                "tone": "risk",
                "detail": "Crawl and page content sample. Age: 1mo ago."
            },
            {
                "label": "WHOIS snapshot",
                "value": "2026-03-19 17:48:28",
                "tone": "risk",
                "detail": "Registry profile and stability signals. Age: 1mo ago."
            },
            {
                "label": "Keyword view",
                "value": "2026-04-19 12:10:47",
                "tone": "good",
                "detail": "Estimated visibility until tracked keyword snapshots exist. Age: 0s ago."
            },
            {
                "label": "Rank history",
                "value": "2026-04-19 12:10:47",
                "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"
            }
        ]
    },
    "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-19T14:40:54+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/duncanbain.dev/refresh",
        "isGuestCooldown": false,
        "cooldownSeconds": 0
    },
    "urlscan_report": {
        "domain": "duncanbain.dev",
        "status": "error",
        "submitted_at": "2026-03-19T17:48:29+00:00",
        "completed_at": null,
        "last_checked_at": "2026-03-19T17:48:29+00:00",
        "last_error": "Rate limit for 'public' exceeded. Limit is 5000 per day. Reset in 22289 seconds.",
        "submitted_url": "https://duncanbain.dev/",
        "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
    }
}