{
    "ready": true,
    "site": {
        "id": 0,
        "domain": "ratfactor.com",
        "display_name": "Home",
        "primary_country_code": "",
        "category_name": "Developer Tools: Code Hosting"
    },
    "metrics": {
        "global_rank": 6216,
        "country_rank": 3176,
        "category_rank": 26,
        "daily_pageviews_per_visitor": 3.85,
        "daily_time_on_site_seconds": 397,
        "bounce_rate": 29.52,
        "search_visits_percent": 37.95,
        "total_sites_linking_in": 5,
        "monthly_unique_visitors": 186,
        "recorded_at": "2026-04-16 07:38:25"
    },
    "audit": {
        "score": 79
    },
    "traffic_sources": {
        "direct_percent": 27.91,
        "search_percent": 34.24,
        "social_percent": 4.89,
        "referral_percent": 19.44,
        "email_percent": 6.33,
        "paid_percent": 7.19
    },
    "seo_profile": {
        "backlinks_total": 5,
        "referring_domains": 5,
        "dofollow_backlinks_percent": 80,
        "organic_keywords": 73,
        "indexed_pages": 117,
        "page_speed_score": 100,
        "mobile_friendliness_score": 76,
        "authority_score": 44,
        "spam_risk_score": 30
    },
    "crawl_report": {
        "robots_status": 200,
        "sitemap_status": 404,
        "sitemap_total_urls": 0,
        "crawl_blocked": false,
        "crawl_blocked_by": "",
        "crawl_blocked_reason": "",
        "notes": [
            "Meta description is missing.",
            "Sitemap could not be confirmed."
        ],
        "created_at": "2026-04-16 07:38:25"
    },
    "keywords": [
        {
            "keyword": "Home",
            "position": 20,
            "search_engine": "Estimated",
            "checked_at": "2026-04-17 06:59:07",
            "is_estimated": true
        },
        {
            "keyword": "Home developer tools: code hosting",
            "position": 22,
            "search_engine": "Estimated",
            "checked_at": "2026-04-17 06:59:07",
            "is_estimated": true
        },
        {
            "keyword": "Home reviews",
            "position": 24,
            "search_engine": "Estimated",
            "checked_at": "2026-04-17 06:59:07",
            "is_estimated": true
        },
        {
            "keyword": "ratfactor",
            "position": 26,
            "search_engine": "Estimated",
            "checked_at": "2026-04-17 06:59:07",
            "is_estimated": true
        }
    ],
    "rating": {
        "overall": 68,
        "label": "Healthy",
        "breakdown": [
            {
                "label": "Technical foundation",
                "score": 13,
                "max": 18
            },
            {
                "label": "Authority & trust",
                "score": 14,
                "max": 30
            },
            {
                "label": "Reach & market presence",
                "score": 3,
                "max": 18
            },
            {
                "label": "Search visibility",
                "score": 4,
                "max": 12
            },
            {
                "label": "Engagement & retention",
                "score": 9,
                "max": 10
            },
            {
                "label": "Channels & diversification",
                "score": 4,
                "max": 6
            },
            {
                "label": "Registry stability",
                "score": 5,
                "max": 6
            },
            {
                "label": "Quality system",
                "score": 72,
                "max": 100
            },
            {
                "label": "Reputation system",
                "score": 48,
                "max": 100
            },
            {
                "label": "Safety system",
                "score": 100,
                "max": 100
            },
            {
                "label": "Evidence confidence",
                "score": 100,
                "max": 100
            }
        ],
        "authority_score": 46,
        "quality_score": 72,
        "reputation_score": 48,
        "safety_score": 100,
        "confidence_score": 100,
        "fraud_score": 0,
        "authority_signals": {
            "backlinks": 5,
            "referring_domains": 5,
            "organic_keywords": 73,
            "indexed_pages": 117,
            "monthly_visitors": 186,
            "global_rank": 6216,
            "engagement_score": 81,
            "crawl_quality_score": 92,
            "brand_completeness_score": 53,
            "link_diversity_score": 95,
            "technical_reliability_score": 82,
            "whois_score": 91,
            "whois_age_years": 28.3,
            "whois_stability_score": 100,
            "spam_penalty": 3
        },
        "whois_signals": {
            "age_years": 28.3,
            "days_to_expiry": 251,
            "days_since_last_registry_update": 134,
            "stability_score": 100,
            "registrar_changes": 0,
            "ownership_changes": 0,
            "nameserver_changes": 0,
            "status_changes": 0,
            "history_entries": 2,
            "privacy_protected": false,
            "dnssec_enabled": false,
            "has_registrant_country": false,
            "registrant_country": "",
            "nameserver_count": 4,
            "status_count": 1
        }
    },
    "authority_score": 46,
    "trust_score": 62,
    "domain_tags": {
        "primary_tag": "T",
        "primary_tag_score": 77,
        "primary_candidate": "T",
        "primary_candidate_score": 77,
        "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.",
                "message": "The site shows a reasonably trustworthy and stable profile.",
                "priority": 77,
                "score": 77,
                "match_percent": 77,
                "threshold_band": "strong"
            },
            {
                "code": "Uncertain",
                "label": "Uncertain",
                "tone": "unknown",
                "description": "External checks stayed inconclusive, so the model avoided a harder verdict.",
                "reason": "The evidence is mixed or only partially corroborated, so the system avoided a harder automated verdict.",
                "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.",
                "message": "The site shows a reasonably trustworthy and stable profile.",
                "priority": 77,
                "score": 77,
                "match_percent": 77,
                "threshold_band": "strong"
            },
            {
                "code": "Uncertain",
                "label": "Uncertain",
                "tone": "unknown",
                "description": "External checks stayed inconclusive, so the model avoided a harder verdict.",
                "reason": "The evidence is mixed or only partially corroborated, so the system avoided a harder automated verdict.",
                "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": 9,
                "score": 9,
                "match_percent": 9,
                "threshold_band": "none"
            },
            {
                "code": "D",
                "label": "Dangerous",
                "tone": "toxic",
                "description": "Strong signs of phishing, malware, or other harmful behaviour were detected.",
                "reason": "Multiple high-risk signals pushed this domain into the dangerous range.",
                "message": "No meaningful dangerous-signal match was detected.",
                "priority": 1,
                "score": 1,
                "match_percent": 1,
                "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"
            }
        ],
        "nsfw_score": 0,
        "trust_score": 63,
        "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 (77% 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 · 77%",
                "tone": "good",
                "detail": "The highest raw tag match from the heuristic engine before visibility thresholds and manual overrides."
            },
            {
                "label": "Trust score",
                "value": "63/100",
                "tone": "caution",
                "detail": "Confidence derived from authority, crawl quality, stability, and risk signals."
            },
            {
                "label": "Authority score",
                "value": "46/100",
                "tone": "caution",
                "detail": "A higher authority score usually means broader reputation and backlink confidence."
            },
            {
                "label": "Spam risk",
                "value": "3/100",
                "tone": "good",
                "detail": "Lower is better. This blends spam indicators with false-positive protections for legitimate sites."
            },
            {
                "label": "Quality score",
                "value": "78/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": "2/100",
                "tone": "good",
                "detail": "Lower is better. This reflects phishing, drainer, fake-support, fake-shop, and malware signals."
            },
            {
                "label": "Infrastructure risk",
                "value": "9/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": "28.3 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": "251",
                        "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": "5",
                        "tone": "unknown",
                        "detail": "Broader backlink evidence usually improves confidence."
                    },
                    {
                        "label": "Referring domains",
                        "value": "5",
                        "tone": "caution",
                        "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": "117",
                        "tone": "good",
                        "detail": "Larger index coverage usually means more evidence to classify from."
                    },
                    {
                        "label": "Brand strength",
                        "value": "53/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 · 154 ms",
                        "tone": "good",
                        "detail": "Slow or broken technical signals weaken confidence."
                    },
                    {
                        "label": "Content words",
                        "value": "3,757",
                        "tone": "good",
                        "detail": "Thin pages are harder to trust and easier to manipulate."
                    },
                    {
                        "label": "Schema / structure",
                        "value": "0 schema · no meta · H1",
                        "tone": "caution",
                        "detail": "Structured markup and basic on-page hygiene improve quality confidence."
                    },
                    {
                        "label": "Links on page",
                        "value": "149 internal · 11 external",
                        "tone": "good",
                        "detail": "Link patterns help detect thin directories and promo pages."
                    },
                    {
                        "label": "Page speed / mobile",
                        "value": "100/100 · 76/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: 28.3 years.",
            "Low registrar / ownership churn with solid registry stability.",
            "Healthy crawl quality and on-page completeness.",
            "Search evidence is broad enough to classify with better confidence."
        ],
        "risks": []
    },
    "traffic_confidence": 53,
    "whois": {
        "current": {
            "id": 5884,
            "domain": "ratfactor.com",
            "source_type": "rdap",
            "rdap_url": "https://rdap.verisign.com/com/v1/domain/RATFACTOR.COM",
            "registrar_name": "Name.com, Inc.",
            "registrar_handle": "625",
            "registrant_name": "",
            "registrant_org": "",
            "registrant_country": "",
            "registrant_email": "",
            "abuse_email": "abuse@name.com",
            "created_date": "1997-12-26 05:00:00",
            "updated_date": "2025-12-03 17:18:45",
            "expires_date": "2026-12-25 05:00:00",
            "nameservers_json": "[\"ns1lmy.name.com\",\"ns2gtx.name.com\",\"ns3bgq.name.com\",\"ns4lny.name.com\"]",
            "status_json": "[\"client transfer prohibited\"]",
            "dnssec": "unsigned",
            "privacy_protected": 0,
            "content_hash": "7c6fb84ae0dcb3bf0e4228143d49ebec7ef29c2390ccfabdc61987aa6ed409ba",
            "history_count": 2,
            "last_checked_at": "2026-04-16 07:38:21",
            "last_changed_at": "2026-04-16 07:38:21",
            "created_at": "2026-03-17 00:27:34",
            "updated_at": "2026-04-16 07:38:21"
        },
        "history": [
            {
                "id": 84235,
                "domain": "ratfactor.com",
                "source_type": "rdap",
                "registrar_name": "Name.com, Inc.",
                "registrar_handle": "625",
                "registrant_name": "",
                "registrant_org": "",
                "registrant_country": "",
                "registrant_email": "",
                "abuse_email": "abuse@name.com",
                "created_date": "1997-12-26 05:00:00",
                "updated_date": "2025-12-03 17:18:45",
                "expires_date": "2026-12-25 05:00:00",
                "nameservers_json": "[\"ns1lmy.name.com\",\"ns2gtx.name.com\",\"ns3bgq.name.com\",\"ns4lny.name.com\"]",
                "status_json": "[\"client transfer prohibited\"]",
                "dnssec": "unsigned",
                "privacy_protected": 0,
                "content_hash": "7c6fb84ae0dcb3bf0e4228143d49ebec7ef29c2390ccfabdc61987aa6ed409ba",
                "checked_at": "2026-04-16 07:38:21",
                "change_summary": "Periodic WHOIS snapshot refreshed with no major field changes.",
                "created_at": "2026-04-16 07:38:21"
            },
            {
                "id": 6197,
                "domain": "ratfactor.com",
                "source_type": "rdap",
                "registrar_name": "Name.com, Inc.",
                "registrar_handle": "625",
                "registrant_name": "",
                "registrant_org": "",
                "registrant_country": "",
                "registrant_email": "",
                "abuse_email": "",
                "created_date": "1997-12-26 05:00:00",
                "updated_date": "2025-12-03 17:18:45",
                "expires_date": "2026-12-25 05:00:00",
                "nameservers_json": "[\"ns1lmy.name.com\",\"ns2gtx.name.com\",\"ns3bgq.name.com\",\"ns4lny.name.com\"]",
                "status_json": "[\"client transfer prohibited\"]",
                "dnssec": "unsigned",
                "privacy_protected": 0,
                "content_hash": "c8554f85a2438d7581f8bd32a406e7bad3ef5b1786b61dadabdfea91116faaff",
                "checked_at": "2026-03-17 00:27:33",
                "change_summary": "Initial WHOIS snapshot captured.",
                "created_at": "2026-03-17 00:27:33"
            }
        ],
        "signals": {
            "age_years": 28.3,
            "days_to_expiry": 251,
            "days_since_last_registry_update": 134,
            "stability_score": 100,
            "registrar_changes": 0,
            "ownership_changes": 0,
            "nameserver_changes": 0,
            "status_changes": 0,
            "history_entries": 2,
            "privacy_protected": false,
            "dnssec_enabled": false,
            "has_registrant_country": false,
            "registrant_country": "",
            "nameserver_count": 4,
            "status_count": 1
        }
    },
    "discovered_domain": {
        "id": 68785,
        "domain": "ratfactor.com",
        "first_seen_at": "2026-03-15 18:57:10",
        "last_crawled_at": "2026-04-16 07:38:25",
        "last_title": "Home - ratfactor",
        "last_http_status": 200,
        "discovered_from_domain": "250kb.club",
        "depth": 0,
        "backlinks_count": 5,
        "rating_cache": 44,
        "spam_score": 24,
        "risk_label": "good",
        "category_name": "Developer Tools: Code Hosting",
        "primary_country_code": "",
        "internal_links_count": 149,
        "external_links_count": 11,
        "social_profiles_count": 1,
        "content_word_count": 3757,
        "title_quality_score": 67,
        "has_meta_description": 0,
        "has_h1": 1,
        "language_code": "en",
        "response_time_ms": 154,
        "robots_status": 200,
        "sitemap_status": 404,
        "sitemap_total_urls": 0,
        "quality_score": 78,
        "site_name": "",
        "canonical_domain": "",
        "favicon_present": 1,
        "schema_org_count": 0,
        "noindex_detected": 0,
        "feed_links_count": 1,
        "https_working": 1,
        "estimated_authority_score": 38,
        "trust_score": 63,
        "nsfw_score": 0,
        "overall_rank_estimate": 3140140,
        "primary_tag": "T",
        "tag_codes": "T",
        "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": 63,
        "infrastructure_risk_score": 9,
        "score_confidence": 100,
        "tag_confidence": 72,
        "category_confidence": 99,
        "deep_crawl_pages": 50,
        "resolved_ip": "46.23.93.221",
        "category_candidates_json": "[{\"category\":\"Developer Tools: Code Hosting\",\"score\":100},{\"category\":\"Personal: Personal Sites & Homepages\",\"score\":39},{\"category\":\"E-commerce\",\"score\":17},{\"category\":\"Reference: Knowledge Bases\",\"score\":17}]",
        "page_signals_json": "[{\"path\":\"/about\",\"status\":200,\"title\":\"About me and this website - ratfactor\",\"word_count\":523,\"summary_text\":\"About me and this website - ratfactor About me and this website - ratfactor Home | About | Now | Repos | Cards | Contact | RSS About me and this website Page created: 1997-12-15 Updated: 2026-01-15 Me Howdy, I&#8217;m Dave Gauer. I&#8217;ve worked in web technologies since the late 1990s. What I&#8217;m up to right now! Some interests: computer programming of all kinds, Linux/BSD/Unix, art, books (genre fiction, computing, history, biographies, art monographs), film, music (metal!), boardgames, and watching small creatures in the back yard If you&#8217;re ready for the deep dive, check out my cards (mostly short) notes about various topics. Me elsewhere: @ratfactor at mastodon.art (art and technology, general chat) github.com/ratfactor (personal programming projects) ratfactor.SDF.org (mostly Gopher posts, haven&#8217;t been a\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/now\",\"status\":200,\"title\":\"What I'm up to right now! - ratfactor\",\"word_count\":241,\"summary_text\":\"What I'm up to right now! - ratfactor What I'm up to right now! - ratfactor Home | About | Now | Repos | Cards | Contact | RSS What I'm up to right now! Page created: 2021-11-11 Updated: 2026-01-15 Jan 2026: I&#8217;m grinding through projects in The Project Stack (which looks like this). I have no idea how quickly I will finish any of them. Most recently, I finished migrating my long-lived (and long average uptime - it was at 467 days when I shut it down) home server from Slackware Linux to OpenBSD. Once I&#8217;ve been living comfortably in that for a while, I&#8217;ll make a long-overdue sequel to my Personal Linux Setup with Git Repos and Stow page! I&#8217;ve been drawing and watercoloring in my sketchbook almost daily. You can see a lot of that on my mastodon account: https://mastodon.art/@ratfactor Previous 'now' update\",\"classification_terms\":[\"now\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/repos/\",\"status\":200,\"title\":\"Dave's Code Repositories - ratfactor\",\"word_count\":730,\"summary_text\":\"Dave's Code Repositories - ratfactor Dave's Code Repositories - ratfactor Home | About | Now | Repos | Cards | Contact | RSS Dave's Code Repositories Page created: 2023-09-26 Updated: 2026-02-10 In progress! If you&#8217;ve come here expecting to find a particular repo (particularly via a README on GitHub), please note that I&#8217;m still in the process of adding older (and newer) repos here. Repos so far: RepoRat - A static website generator for Git repos written in Ruby. Minslides - A single web page presentation slide tool that is just ridiculously small and simple (HTML/CSS/JS). Faceclick - A lightweight Emoji picker popup library with labels and keyword search. RetroV - A tiny browser-native Virtual DOM rendering library. Meow5 - A highly conCATenative (sorry) Forth-inspired programming language experiment in NASM assem\",\"classification_terms\":[\"repos\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/cards/\",\"status\":200,\"title\":\"Dave's Virtual Box of Cards - ratfactor\",\"word_count\":570,\"summary_text\":\"Dave's Virtual Box of Cards - ratfactor Dave's Virtual Box of Cards - ratfactor Home | About | Now | Repos | Cards | Contact | RSS This is a card in Dave's Virtual Box of Cards. Dave's Virtual Box of Cards Page created: 2022-02-26 Updated: 2026-03-28 .rightbawx { float: right; width: 200px; margin-left: 1em; border-left: 1px solid #000; padding: 10px; background: #f5feff; } .rightbawx img { width: 100%; } Click for full-size and more! This is a collection of short, interconnected notes. Why? It is intentionally sprawling and incomplete. There will be dead ends. It may or may not be of use to others. Stats! In February 2023, I noticed it had been almost exactly a year since I started this \\\"Virtual Box of Cards.\\\" I&#8217;m gonna try to keep updating this every February when I notice again: +----------+-------+---------+ | Date | C\",\"classification_terms\":[\"cards\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":14,\"depth\":1},{\"path\":\"/contact-me\",\"status\":200,\"title\":\"Contact Dave - ratfactor\",\"word_count\":213,\"summary_text\":\"Contact Dave - ratfactor Contact Dave - ratfactor Home | About | Now | Repos | Cards | Contact | RSS Contact Dave Throwing caution to the wind, I am hereby (October, 2023) retiring my long-lived contact form and am publishing my email address right here: dave@ratfactor.com Please note that my average email response delay is currently around four (4) months! I'd love so say that's not normal...but that's increasingly normal. That said, if you're okay with delay, please do send the email. I enjoy reading them. Secondly, if you're writing about a broken link, maybe hold off for a bit - there's some technical transition going on behind the scenes at the moment (2026-03-15). See also my notes about email. If you&#8217;re on the Fediverse, another good way to contact me is publicly or privately on Mastodon. Here&#8217;s\",\"classification_terms\":[\"contact-me\",\"about\",\"contact\",\"address\"],\"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\":\"/atom\",\"status\":200,\"title\":\"Ratfactor's \\\"RSS\\\" (Atom, to be precise) feed - ratfactor\",\"word_count\":828,\"summary_text\":\"Ratfactor's \\\"RSS\\\" (Atom, to be precise) feed - ratfactor Ratfactor's \\\"RSS\\\" (Atom, to be precise) feed - ratfactor Home | About | Now | Repos | Cards | Contact | RSS Ratfactor's \\\"RSS\\\" (Atom, to be precise) feed Page created: 2021-07-02 Updated: 2025-10-02 Well, it took years and I&#8217;m a late-comer to this, but I finally had enough requests for an RSS feed for this website to start one. It&#8217;s incredibly gratifying to know that people enjoy my content enough to want updates when I&#8217;ve added new stuff! What&#8217;s in the ratfactor.com feed? I&#8217;ve expanded on this a bit here: Explanation of the Ratfactor Feed Update five months later: I love it. Having a feed has made me more likely to write more often. This, in turn, has made me happier. Three years later: Continuining to be a big fan of RSS! And I&#8217;m finally updating this p\",\"classification_terms\":[\"atom\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/notes\",\"status\":200,\"title\":\"My Notebook System - ratfactor\",\"word_count\":8003,\"summary_text\":\"My Notebook System - ratfactor My Notebook System - ratfactor Home | About | Now | Repos | Cards | Contact | RSS My Notebook System Page created: 2020-07-09 Updated: 2024-03-07 (Added \\\"cards\\\" update, Juice pen update, 100th notebook update, note about the per-minute logging for skimmers, 2023 wrap-up accomplished!) This year is going to see my journal/log&#8217;s 10th anniversary and 100th notebook. (Update: 10 years reached 2022-03-31, 100th notebook 2022-07-28.) After many attempts to write this up, I&#8217;m just going to disgorge it all. This article is long and rambling and I make no apology for it. Feel free to skip around to any part of it which you find interesting. 96 notebooks and going: I call these notebooks my \\\"log books\\\" and this is my \\\"log system\\\". Probably due to growing up with Picard reciting his capta\",\"classification_terms\":[\"notes\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":41,\"depth\":1},{\"path\":\"/meow5/done\",\"status\":200,\"title\":\"Meow5: The Conclusion - ratfactor\",\"word_count\":4462,\"summary_text\":\"Meow5: The Conclusion - ratfactor Meow5: The Conclusion - ratfactor Home | About | Now | Repos | Cards | Contact | RSS Meow5: The Conclusion Page created: 2023-11-15 Updated: 2023-11-21 pre i { color: purple; } pre b { color: red; } What is Meow5 (repo) and how does it work? Meow5 is a programming language experiment written in assembly targeting i386 (32-bit) under Linux, and the second \\\"season\\\" of Assembly Nights. It is also a \\\"concatenative\\\" language in two senses: In the usual sense, it means that programs are composed by stringing functions sequentially and then passing values from one to the next (like Forth, Joy, Factor, or Unix pipes). In an unusual sense, Meow5 composes functions by concatenating machine code. Machine code concatenation is also known as \\\"inlining\\\". Instead of calling a function from a \\\"call site\\\"\",\"classification_terms\":[\"meow5/done\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":80,\"depth\":1},{\"path\":\"/forth/\",\"status\":200,\"title\":\"Forth! - ratfactor\",\"word_count\":280,\"summary_text\":\"Forth! - ratfactor Forth! - ratfactor Home | About | Now | Repos | Cards | Contact | RSS Forth! Page created: 2023-01-11 Updated: 2025-06-03 (Image of \\\"Crazy Chuck\\\" from my giant write-up of Forth, also linked below.) Forth-related content on my site: 2025: Implementing a Forth 2024-2025: Snobol4th - A Forth written in Snobol4! (Articles plus The Snobol4th Repo) 2024: Why Isn&#8217;t It Popular Today? 2023: Forth: The programming language that writes itself My big essay on Forth and Charles H. Moore. (An expansion on these slides which came from these notes) 2023: Meow5 - my Forth-like language (also i386 NASM assembly) 2022: Nasmjf - my NASM assembly port of JonesForth (i386 NASM assembly) Perpetual: Forth in Space (update is TODO!) Perpetual: Forth cards (various notes in my \\\"Virtual Box of Cards\\\") Resourc\",\"classification_terms\":[\"forth\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":4,\"depth\":1},{\"path\":\"/nasmjf/\",\"status\":200,\"title\":\"NasmJF Forth - ratfactor\",\"word_count\":2131,\"summary_text\":\"NasmJF Forth - ratfactor NasmJF Forth - ratfactor Home | About | Now | Repos | Cards | Contact | RSS NasmJF Forth Page created: 2022-07-22 Updated: 2025-05-29 NasmJF is my NASM assembler port of the JONESFORTH (wrmj.wordpress.com) Forth interpreter by Richard W.M. Jones. JONESFORTH is a lavishly commented Forth implementation in assembly and&#8230;&#8203;Forth. Between the comments, ASCII diagrams, and source, you can learn how a typical Forth implementation works! That&#8217;s not an easy task, by the way, because Forth is made of a bunch of little independent moving parts. More about that in a minute. My port is 1,600 lines of (heavily commented) i386 assembly. It runs the original, unaltered jonesforth.f (1,700 lines of Forth) to form a usable base Forth implementation. Here&#8217;s the NasmJF repo. Check out t\",\"classification_terms\":[\"nasmjf\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/assembly-nights\",\"status\":200,\"title\":\"Assembly Nights - ratfactor\",\"word_count\":1968,\"summary_text\":\"Assembly Nights - ratfactor Assembly Nights - ratfactor Home | About | Now | Repos | Cards | Contact | RSS Assembly Nights Page created: 2021-10-01 Updated: 2023-02-21 (Added \\\"seasons\\\", link to project page!) .cyberpunk { font-family: monospace; font-size: large; font-weight: bold; color: yellow; background: black; padding: 1em; } .cyberpunk a { color: magenta; } Assembly Nights Season One &lt;---- You are here. Assembly Nights Season Two Over the last three months, I&#8217;ve developed an unusual little nighttime routine: after reading bedtime stories to the kids, I hop into bed and instead of reaching for a fiction book, I&#8217;m turning on my 14-year old Asus eeePC 701 (wikipedia.org) miniature laptop and writing x86 assembly language. This is turning out to be an insanely good use of my time&#8230;&#8203; My fai\",\"classification_terms\":[\"assembly-nights\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/assembly-nights2\",\"status\":200,\"title\":\"Assembly Nights 2 - ratfactor\",\"word_count\":3007,\"summary_text\":\"Assembly Nights 2 - ratfactor Assembly Nights 2 - ratfactor Home | About | Now | Repos | Cards | Contact | RSS Assembly Nights 2 Page created: 2022-10-01 Updated: 2023-11-21 .cyberpunk { font-family: monospace; font-size: large; font-weight: bold; color: yellow; background: black; padding: 1em; } .cyberpunk a { color: magenta; } Assembly Nights Season One Assembly Nights Season Two &lt;---- You are here. Update 2023-11-21: Meow5 is done! Read my conclusion here! During Assembly Nights Season One (porting JONESFORTH to NASM), I kept having ideas for other Forth-like things I&#8217;d like to try. But I was good: I wrote them down and stayed the course with the port. But when the port was done, one of those ideas just wouldn&#8217;t let me rest and I was compelled to start on it immediately! Now when the lights go out and\",\"classification_terms\":[\"assembly-nights2\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":5,\"depth\":1},{\"path\":\"/forth/the_programming_language_that_writes_itself.html\",\"status\":200,\"title\":\"Forth: The programming language that writes itself: The Web Page\",\"word_count\":211,\"summary_text\":\"Forth: The programming language that writes itself: The Web Page Forth: The programming language that writes itself: The Web Page body { color: #222; background-color: #ffd; max-width: 800px; margin: auto; } div.slide { font-size: 24px; color: #333; clear: both; /* overflow: auto; */ /* should contain floating elements */ } div.text { width: 800px; max-width: 90%; margin: auto; } h1 { font-weight: bold; margin: 0 0 0.5em 0; } p { margin-top: 0.5em; } p.quote { background: white; font-family: sans-serif; display: block; padding: 1em; } p.quoteby { margin: -1em 0 1em 2em; font-style: italic; } code { color: #070; } pre { font-size: 20px; color: white; background: black; padding: 1em 1em 0 1em; /* assume extra line at end */ overflow-x: auto; } pre i { font-style: normal; color: #1bb; } pre b { color: #F6F; } img { max-width: 35vw; float: right; margin: 1e\",\"classification_terms\":[\"forth/the_programming_language_that_writes_itself.html\"],\"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\":\"/repos/reporat/\",\"status\":200,\"title\":\"reporat - A static website generator for Git repos written in Ruby.\",\"word_count\":701,\"summary_text\":\"reporat - A static website generator for Git repos written in Ruby. reporat - A static website generator for Git repos written in Ruby. Ratfactor.com &gt; Dave's Repos reporat A static website generator for Git repos written in Ruby. git clone http://ratfactor.com/repos/reporat/reporat.git About Files Commits Files LICENSE README.md devlog.txt example-styles.css reporat.conf.rb reporat.png reporat.rb time.rb README.md RepoRat A static website generator for Git repos written in Ruby. Runs in milliseconds for small repos &lsquo;About&rsquo; page displays truncated file list followed by formatted README &lsquo;Files&rsquo; page lists all files with links to file pages &lsquo;Commits&rsquo; page contains simple Git commit log Each human-readable source file has a viewing pages with linkable line numbers Displays common image formats inline Creates bare repo an\",\"classification_terms\":[\"repos/reporat\",\"about\",\"links\"],\"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\":1,\"depth\":1},{\"path\":\"/retrov/\",\"status\":200,\"title\":\"RetroV - ratfactor\",\"word_count\":415,\"summary_text\":\"RetroV - ratfactor RetroV - ratfactor Home | About | Now | Repos | Cards | Contact | RSS RetroV Page created: 2023-03-15 Updated: 2025-10-09 RetroV (pronounced \\\"retro vee\\\") is a virtual DOM (VDOM) rendering library. It is \\\"vanilla\\\" JavaScript, browser-native, and has no dependencies or build system. It&#8217;s tiny: 1015 bytes (the usual minified gzipped metric). It has one method to learn: RV.render(). It just renders and \\\"diffs\\\" virtual nodes as real HTML DOM elements. That&#8217;s it. Here&#8217;s what it looks like: RV.render( document.body, ['div', ['h1', 'Hello'], ['p', 'Hello world, this is ', ['em', 'RetroV'], '!', ] ] ); See this example live here: hello.html While I think we can all agree there were already quite a few JavaScript rendering libraries out there before this one, you&#8217;ll also noti\",\"classification_terms\":[\"retrov\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":7,\"depth\":1},{\"path\":\"/slackware/\",\"status\":200,\"title\":\"Dave's Slackware Pages - ratfactor\",\"word_count\":431,\"summary_text\":\"Dave's Slackware Pages - ratfactor Dave's Slackware Pages - ratfactor Home | About | Now | Repos | Cards | Contact | RSS Dave's Slackware Pages Page created: 2017-02-01 Updated: 2023-08-18 Now that I&#8217;ve been using 15.0 for a while, I&#8217;m firmly back in the Slackware camp. It&#8217;s my favorite general-purpose Linux distro. bash-5.1$ ufetch ________ dave@cygnus.ratfactor.com / ______| OS: Slackware 15.0 | |______ KERNEL: Linux 5.15.19 \\\\______ \\\\ UPTIME: 28 weeks, 5 days, 18 hours, 25 minutes ______| | PACKAGES: 1598 | |________/ SHELL: bash |____________ WM: awesome Here is some of my Slackware Linux content. I have quite a few notes to add here and will someday incorporate them all. :-) Why Slackware? (updated 2022) Aerc mail client August 2023 (ONGOING) Installing Go and Installing Aerc (email client) August 2023\",\"classification_terms\":[\"slackware\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/cards/arch-linux\",\"status\":200,\"title\":\"Arch Linux Notes - ratfactor\",\"word_count\":170,\"summary_text\":\"Arch Linux Notes - ratfactor Arch Linux Notes - ratfactor Home | About | Now | Repos | Cards | Contact | RSS This is a card in Dave's Virtual Box of Cards. Arch Linux Notes Page created: 2024-04-26 Updated: 2024-12-08 I&#8217;ve run Arch off and on since, I think, about 2008. The constant rolling updates make it almost the polar opposite of my daily driver, Slackware Linux. I&#8217;m currently running Arch on my \\\"gaming desktop\\\", where I primarily use Steam (and Proton) to run native and non-native games. See my notes on that setup here: arch-gaming (my current setup) arch linux network time arch-brother-printer Because it&#8217;s not my \\\"main distro\\\", I haven&#8217;t managed to commit the operation of the package manager, pacman to memory, so I&#8217;ve made: arch-pacman-cheatsheet. Arch&#8217;s wiki is an incredible\",\"classification_terms\":[\"cards/arch-linux\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/openbsd/\",\"status\":200,\"title\":\"OpenBSD - ratfactor\",\"word_count\":929,\"summary_text\":\"OpenBSD - ratfactor OpenBSD - ratfactor Home | About | Now | Repos | Cards | Contact | RSS OpenBSD Page created: 2022-07-27 Updated: 2026-03-22 Ever wonder what the legendary OpenBSD is for? Me too! (This old laptop still works fine, even with the original spinning platter HDD and 32-bit CPU!) Featured articles (or keep scrolling down for the blog): My home network observes bedtime with OpenBSD and pf Moving ratfactor.com to OpenBSD.amsterdam (blog entry 13) Here&#8217;s two draft pages I started and need to complete: Reasons I like OpenBSD (stub/draft) OpenBSD httpd Rewrites and Redirects with Examples (draft) I&#8217;ve got a page to collect my various info about httpd here: OpenBSD httpd. Dave&#8217;s OpenBSD Blog 2026: I&#8217;m full-steam-ahead on OpenBSD this year. I completed my switch from Slackware L\",\"classification_terms\":[\"openbsd\",\"about\",\"contact\",\"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\":20,\"depth\":1},{\"path\":\"/art\",\"status\":200,\"title\":\"Art - ratfactor\",\"word_count\":435,\"summary_text\":\"Art - ratfactor Art - ratfactor Home | About | Now | Repos | Cards | Contact | RSS Art I keep a sketchbook and sometimes I draw and paint in it Page created: 2016-10-01 Updated: 2023-11-02 I&#8217;ve been keeping a regular sketchbook since 2014, drew in it daily for two years (2016-2018), and I&#8217;ve been off and on ever since. I was inspired by a huge number of my art heroes who either spoke highly of keeping a sketchbook or whose sketchbooks have been published, but the person who gave me the final push was the inspirational Will Terrell, whose candor and good humor touched a nerve. Before that, my commitment to art was extremely haphazard. I would occasionally go through a phase where I drew quite a bit. I would, of course, see an improvement in my abilities. At that point I would bemoan \\\"all the wa\",\"classification_terms\":[\"art\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":4,\"depth\":1},{\"path\":\"/hoo/deck\",\"status\":200,\"title\":\"Hoo? The Tarot Deck! - ratfactor\",\"word_count\":654,\"summary_text\":\"Hoo? The Tarot Deck! - ratfactor Hoo? The Tarot Deck! - ratfactor Home | About | Now | Repos | Cards | Contact | RSS Hoo? The Tarot Deck! Page created: 2022-12-28 Updated: 2022-01-15 Back to The Hoo? Page for info about the game jam project as a whole. Update: I&#8217;ve done it! I drew all 78 cards in 52 days! Keep scrolling for some larger examples from the deck. The tools These cards were all drawn in Krita (krita.org), the FOSS drawing program that works beautifully with my Wacom Intuos4 drawing tablet (specifically the PTK-640, which is now at least a decade old. It was a very thoughtful present from my wife). For the most part, I just used three layers: Vector for the card title text at the bottom Foreground for the black and white drawing Background for the fill colors (two shades of tan) Here&#8217;s a typical exa\",\"classification_terms\":[\"hoo/deck\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/openbsd/pf-gateway-bedtime\",\"status\":200,\"title\":\"My home network observes bedtime with OpenBSD and pf - ratfactor\",\"word_count\":2328,\"summary_text\":\"My home network observes bedtime with OpenBSD and pf - ratfactor My home network observes bedtime with OpenBSD and pf - ratfactor Home | About | Now | Repos | Cards | Contact | RSS My home network observes bedtime with OpenBSD and pf Page started: 2026-02-17 Page published: 2026-03-22 Back to my OpenBSD pages. The files mentioned in this article are available for viewing or cloning here: the 'pf-bedtime' repo. Goals I want my home network to \\\"shut off Internet access\\\" when it&#8217;s bedtime. I need it to be completely automatic and on a schedule. I also need to make exceptions to allow a couple servers and devices do backups and updates at night. Bonus: I&#8217;d like to be in charge of the DNS on my local network so I can experiment with using it as a DNS sinkhole (like Pi-hole) for unwanted domains and giving my home computers nice local domain names\",\"classification_terms\":[\"openbsd/pf-gateway-bedtime\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":4,\"depth\":1},{\"path\":\"/cards/fitted-sheets-pro-unfold\",\"status\":200,\"title\":\"Fitted sheet update: Unfolding a professionally folded fitted sheet! - ratfactor\",\"word_count\":330,\"summary_text\":\"Fitted sheet update: Unfolding a professionally folded fitted sheet! - ratfactor Fitted sheet update: Unfolding a professionally folded fitted sheet! - ratfactor Home | About | Now | Repos | Cards | Contact | RSS This is a card in Dave's Virtual Box of Cards. Fitted sheet update: Unfolding a professionally folded fitted sheet! Page created: 2026-03-02 I finished Ratfactor&#8217;s Illustrated Guide to Folding Fitted Sheets last year and ever since, I&#8217;ve been on the lookout for additional fitted sheet folding tips. Needless to say, I was very excited when we bought a new sheet set a couple months back. At last, a chance to see a pristine professionally-folded fitted sheet. The moment we got home, I ran upstairs with glee and took pictures as I peeled back the secrets. Now I&#8217;ve drawn up the photos to show how it unfolded. Here, at last, I can share the results\",\"classification_terms\":[\"cards/fitted-sheets-pro-unfold\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":2,\"depth\":1},{\"path\":\"/b/the-art-of-doing-science-and-engineering\",\"status\":200,\"title\":\"Dave's book review for The Art of Doing Science and Engineering - ratfactor\",\"word_count\":13351,\"summary_text\":\"Dave's book review for The Art of Doing Science and Engineering - ratfactor Dave's book review for The Art of Doing Science and Engineering - ratfactor Home | About | Now | Repos | Cards | Contact | RSS Dave's book review for The Art of Doing Science and Engineering Page started: 2025-06-10 Page published: 2026-02-28 Book: The Art of Doing Science and Engineering: Learning to Learn Author: Richard W. Hamming Pages: 403 Finished reading: 2025-10-05 Back to my books page for more reviews, etc. My Review (and notes and musings) Hello, this will be unusually long. I&#8217;m doing an informal book club started on Mastodon with Shae Erisson (scannedinavian.com) and Brit Butler (kingcons.io) Here&#8217;s the shared space for the book club notes (github.com). I got a lot out of reading their notes after I&#8217;d finished mine - very interesting to compare and contrast wh\",\"classification_terms\":[\"b/the-art-of-doing-science-and-engineering\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":5,\"depth\":1},{\"path\":\"/tech-nope2\",\"status\":200,\"title\":\"A programmer's loss of a social identity - ratfactor\",\"word_count\":1498,\"summary_text\":\"A programmer's loss of a social identity - ratfactor A programmer's loss of a social identity - ratfactor Home | About | Now | Repos | Cards | Contact | RSS A programmer's loss of a social identity Page started: 2026-02-02 Page published: 2026-02-13 Updated: 2026-02-21 This is the follow-up to last year&#8217;s I&#8217;m an American software developer and the \\\"broligarchs\\\" don&#8217;t speak for me. In that essay, I tried to express why I was so agonized by the leaders in my industry doing a speedrun towards dystopia and how it all felt so divorced from what technology could, and should be. Everything I wrote there is still true, but amplified. As an aside, I received a lot of positive feedback on that essay, thank you! (And I&#8217;m sorry that I still haven&#8217;t responded to some of you. My inbox is a disaster for a variety of reasons.)\",\"classification_terms\":[\"tech-nope2\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":5,\"depth\":1},{\"path\":\"/openbsd/blog-11-openbsd-disable-inteldrm\",\"status\":200,\"title\":\"OpenBSD Blog #11: Disabling Direct Rendering Manager on OpenBSD - ratfactor\",\"word_count\":749,\"summary_text\":\"OpenBSD Blog #11: Disabling Direct Rendering Manager on OpenBSD - ratfactor OpenBSD Blog #11: Disabling Direct Rendering Manager on OpenBSD - ratfactor Home | About | Now | Repos | Cards | Contact | RSS OpenBSD Blog #11: Disabling Direct Rendering Manager on OpenBSD Page created: 2026-02-09 Updated: 2026-03-11 Go back to my OpenBSD page for more entries. Something was stealing my CPU when a monitor wasn&#8217;t plugged in I set up an OpenBSD headless gateway/firewall installation by doing the usual stuff with a USB stick, monitor, and keyboard. This little x86 mini pc had been running Slackware Linux flawlessly for the last four years and I wasn&#8217;t expecting any trouble. But when I SSH&#8217;d into it a day later (fully headless), I found that the terminal session would freeze for a whole second (I could keep typing, but I wouldn&#8217;t see what I typed unti\",\"classification_terms\":[\"openbsd/blog-11-openbsd-disable-inteldrm\",\"about\",\"contact\",\"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\":4,\"depth\":1},{\"path\":\"/cards/git-commit-size\",\"status\":200,\"title\":\"How big is a Git commit? - ratfactor\",\"word_count\":1032,\"summary_text\":\"How big is a Git commit? - ratfactor How big is a Git commit? - ratfactor Home | About | Now | Repos | Cards | Contact | RSS This is a card in Dave's Virtual Box of Cards. How big is a Git commit? Page created: 2026-01-10 back to Git. Short answer: It depends. Git stores \\\"objects\\\" as zlib compressed data. So the exact size of a commit will depend on the compressibility of your files (which is basically a function of the amount of repetition in them). https://git-scm.com/docs/gitformat-loose The other factor is that Git eventually turns object files into even more efficient packfiles, saving additional space by getting rid of redundancy across objects. https://git-scm.com/book/en/v2/Git-Internals-Packfiles For fun, I did some little experiments (all \\\"loose objects\\\" with no packfiles created). Here&#8217;s the results: 64,828 b\",\"classification_terms\":[\"cards/git-commit-size\",\"about\",\"contact\",\"docs\",\"store\"],\"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\":8,\"depth\":1},{\"path\":\"/cards/librewolf\",\"status\":200,\"title\":\"LibreWolf - ratfactor\",\"word_count\":1290,\"summary_text\":\"LibreWolf - ratfactor LibreWolf - ratfactor Home | About | Now | Repos | Cards | Contact | RSS This is a card in Dave's Virtual Box of Cards. LibreWolf Page created: 2025-10-21 Updated: 2026-01-16 \\\"A custom version of Firefox, focused on privacy, security and freedom.\\\" Through thick and thin, I have been a long-time die-hard Firefox user. Mozilla has been an&#8230;&#8203; unwell organization for a very long time, but at this point it is basically working as hard as it can to shed the last of its users and supporters. And it&#8217;s working! But, we can still have nice things thanks to projects like LibreWolf. (librewolf.net) TL;DR In addition to removing all the increasingly horrible junk from Firefox, LibreWolf doesn&#8217;t save passwords and clears cookies on exit. That may not be what you want. But you can\",\"classification_terms\":[\"cards/librewolf\",\"about\",\"contact\",\"privacy\",\"support\"],\"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\":3,\"depth\":1},{\"path\":\"/cards/js-line-parsing-test\",\"status\":200,\"title\":\"JavaScript: Blank line scanning/parsing/lexing by hand vs regex - ratfactor\",\"word_count\":1071,\"summary_text\":\"JavaScript: Blank line scanning/parsing/lexing by hand vs regex - ratfactor JavaScript: Blank line scanning/parsing/lexing by hand vs regex - ratfactor Home | About | Now | Repos | Cards | Contact | RSS This is a card in Dave's Virtual Box of Cards. JavaScript: Blank line scanning/parsing/lexing by hand vs regex Page created: 2025-10-09 See also JavaScript string parsing performance test where I did a very similar performance test of hand-written lexer/scanner versus regex. (Which you can run right on the page.) I also discuss the merits of performance.now() in testing in browsers. For this particular test, I put the benchmark in a separate HTML file. Check it out and run it here: line-scanning-bench.html The benchmark finds blank line-separated segments (mostly paragraph breaks) in the complete text of Project Gutenberg&#8217;s edition of How to Live on 24 Hours\",\"classification_terms\":[\"cards/js-line-parsing-test\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":4,\"depth\":1},{\"path\":\"/papers/sam-language\",\"status\":200,\"title\":\"Dave's Paper Notes: A Tutorial for the Sam Command Language - ratfactor\",\"word_count\":1594,\"summary_text\":\"Dave's Paper Notes: A Tutorial for the Sam Command Language - ratfactor Dave's Paper Notes: A Tutorial for the Sam Command Language - ratfactor Home | About | Now | Repos | Cards | Contact | RSS Dave's Paper Notes: A Tutorial for the Sam Command Language Page created: 2025-10-01 Updated: 2025-10-02 &lt;&lt; Back to Dave&#8217;s Paper Notes. Paper (PDF): sam_tut.pdf (44Kb) Author: Rob Pike (wikipedia.org) Year: 1987 Sam is an interesting text editor by Rob Pike. This paper is a brief tutorial for the command language used by the editor. I got a lot out of reading this 14 page document. Mostly regarding language design. Language Idioms The first insight from the paper is the idea of language idioms. Of course, all languages have idioms, and we often speak of idiomatic solutions to problems, as in, \\\"The idiomatic way to do this in Ruby is&#8230;&#8203;\\\" But Pike\",\"classification_terms\":[\"papers/sam-language\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/cards/make-a-webfont-subset\",\"status\":200,\"title\":\"Make a Web Font Subset - ratfactor\",\"word_count\":898,\"summary_text\":\"Make a Web Font Subset - ratfactor Make a Web Font Subset - ratfactor Home | About | Now | Repos | Cards | Contact | RSS This is a card in Dave's Virtual Box of Cards. Make a Web Font Subset Page started: 2025-09-02 Page published: 2025-09-08 See also: Using and Debugging a Web Font I&#8217;m not super into using Web Fonts because they&#8217;re one of those big and heavy things that too many websites abuse. On the other hand, they are really cool, actually. And with Web Open Font Format (specifically WOFF2 with Brotli compression), they can be amazingly compact. Like, 40Kb for a whole font, which is incredible. (Just please, please use them judiciously.) Using the Python fontTools (github.com) library, you can create your own subset of a TrueType Font (TTF) and turn it into a web font that is surprisingly small and covers j\",\"classification_terms\":[\"cards/make-a-webfont-subset\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/cards/use-and-debug-webfont\",\"status\":200,\"title\":\"Using and Debugging a Web Font - ratfactor\",\"word_count\":1099,\"summary_text\":\"Using and Debugging a Web Font - ratfactor Using and Debugging a Web Font - ratfactor Home | About | Now | Repos | Cards | Contact | RSS This is a card in Dave's Virtual Box of Cards. Using and Debugging a Web Font Page started: 2025-09-06 Page published: 2025-09-08 After making a subset of a TTF font as a new custom Web Font (See Make a Web Font Subset), I moved on to testing and using it. First of all, I would like to highlight this excellent in-browser font decoding tool: https://wakamaifondue.com/ It&#8217;s pronounced, \\\"What can my font do?\\\" and it did the best job of any online tool to display the characters in my font along with other useful information. And it&#8217;s visually fun. Using the font on a web page There&#8217;s two parts: First you define the font-face using a CSS \\\"at-rule\\\": https://developer.mozilla.org/en-US/\",\"classification_terms\":[\"cards/use-and-debug-webfont\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/b/technical-books\",\"status\":200,\"title\":\"Why I Read Technical Books - ratfactor\",\"word_count\":674,\"summary_text\":\"Why I Read Technical Books - ratfactor Why I Read Technical Books - ratfactor Home | About | Now | Repos | Cards | Contact | RSS Why I Read Technical Books Page created: 2025-08-24 Back to books. I suppose the original reason is that when I first got started with computing in the mid-1990s, Internet access was not yet common in the home. Books were the only resource available to me. Buying (or checking out) a book became my default method of picking up a new topic. Even now that most information can be pieced together from free online resources, I still prefer reading technical books over other types of resources to learn new subjects. Here&#8217;s some reasons why. Complete Unlike The Web, you can read all of a book. When I reach the last page of a book, I can feel confident that I&#8217;ve been exposed to all the material it\",\"classification_terms\":[\"b/technical-books\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":2,\"depth\":1},{\"path\":\"/faceclick/\",\"status\":200,\"title\":\"Faceclick: A lightweight Emoji picker with keyword search - ratfactor\",\"word_count\":2419,\"summary_text\":\"Faceclick: A lightweight Emoji picker with keyword search - ratfactor Faceclick: A lightweight Emoji picker with keyword search - ratfactor Home | About | Now | Repos | Cards | Contact | RSS Faceclick: A lightweight Emoji picker with keyword search Page started: 2025-08-06 Page published: 2025-08-16 body { max-width: 1100px; } img.tall-side { float: right; margin-left: 1em; } @media only screen and (max-width: 700px) { img.tall-side { max-width: 15vw; } } h2 { border-bottom: none; } Here it is: Faceclick Git repo - Read it, Git it! Faceclick Live test page - Try it! Faceclick has two goals: Let the user pick Emoji by group or keyword search and display labels on rollover. Be as small in file size as possible. Small size is a goal Faceclick has a total payload (including CSS) of 70Kb (not minified, not gzipped). This is accomplished by applying a very simple\",\"classification_terms\":[\"faceclick\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/cards/js-fuzzy-search\",\"status\":200,\"title\":\"JS \\\"Fuzzy\\\" Search (sequential matching with gaps) - ratfactor\",\"word_count\":660,\"summary_text\":\"JS \\\"Fuzzy\\\" Search (sequential matching with gaps) - ratfactor JS \\\"Fuzzy\\\" Search (sequential matching with gaps) - ratfactor Home | About | Now | Repos | Cards | Contact | RSS This is a card in Dave's Virtual Box of Cards. JS \\\"Fuzzy\\\" Search (sequential matching with gaps) Page started: 2025-08-06 Page published: 2025-08-09 Updated: 2025-08-12 Back to javascript Rather than a true \\\"fuzzy\\\" search based on edit distance, I really like partial string matching where the only requirement is that the sequence of characters be in the input order. For example, \\\"pcake\\\" would match \\\"pancake\\\". Scroll down for an example you can try out live to get an idea of how it works. The fuzzmatch() function The first time I saw this was in the form of a delighfully tiny function with a 4-line body in a Stack Overflow answer by a user who goes by the name \\\"Dziad Borowy\\\" (fro\",\"classification_terms\":[\"cards/js-fuzzy-search\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":4,\"depth\":1},{\"path\":\"/cards/fitted-sheets\",\"status\":200,\"title\":\"Ratfactor's Illustrated Guide to Folding Fitted Sheets - ratfactor\",\"word_count\":3007,\"summary_text\":\"Ratfactor's Illustrated Guide to Folding Fitted Sheets - ratfactor Ratfactor's Illustrated Guide to Folding Fitted Sheets - ratfactor Home | About | Now | Repos | Cards | Contact | RSS This is a card in Dave's Virtual Box of Cards. Ratfactor's Illustrated Guide to Folding Fitted Sheets Page started: 2025-07-08 Page published: 2025-08-08 Updated: 2026-03-02 The laundry awaits us all. Note to the impatient: You can just scroll down to the drawings of fitted sheets being folded. You won&#8217;t hurt my feelings. (I&#8217;ll never even know.) But you may want to bookmark this page for later instead. You can get fast at folding fitted sheets. But to learn how to fold fitted sheets is going to take some patience. I do not recommend learning anything, and especially not anything that involves elastic, when you&#8217;re in a hurry. I used to believe that folding\",\"classification_terms\":[\"cards/fitted-sheets\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":5,\"depth\":1},{\"path\":\"/cards/super-easy-2-stage-git-deployment\",\"status\":200,\"title\":\"Super Easy* 2-Stage Git Deployment - ratfactor\",\"word_count\":1595,\"summary_text\":\"Super Easy* 2-Stage Git Deployment - ratfactor Super Easy* 2-Stage Git Deployment - ratfactor Home | About | Now | Repos | Cards | Contact | RSS This is a card in Dave's Virtual Box of Cards. Super Easy* 2-Stage Git Deployment Page started: 2025-06-24 Page published: 2025-07-12 *I explain what I mean by \\\"easy\\\" down in the Why? section. Quickstart I go into more detail below, but if you just want to see the whole thing in a screenful of text, here it is. One-sentence summary: A bare Git repo on the server acts as an in-between for pushing and pulling updates. Setup: # Make the bare repo on the server: deimos$ mkdir foo.git deimos$ cd foo.git deimos$ git init --bare # Add the remote to your local dev repo and push it: $ cat &gt;&gt; .git/config [remote \\\"deimos\\\"] url = ssh://deimos/home/dave/foo.git $ git push deimos # Clone to the destin\",\"classification_terms\":[\"cards/super-easy-2-stage-git-deployment\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/cards/stack-display\",\"status\":200,\"title\":\"My \\\"Project Stack\\\" Display (cardboard desk toy for small paper notes) - ratfactor\",\"word_count\":461,\"summary_text\":\"My \\\"Project Stack\\\" Display (cardboard desk toy for small paper notes) - ratfactor My \\\"Project Stack\\\" Display (cardboard desk toy for small paper notes) - ratfactor Home | About | Now | Repos | Cards | Contact | RSS This is a card in Dave's Virtual Box of Cards. My \\\"Project Stack\\\" Display (cardboard desk toy for small paper notes) Page created: 2025-07-06 Updated: 2026-03-02 I&#8217;ve been using this actual paper stack method for keeping track of personal projects for almost a month and it&#8217;s working great for me. I make useful and/or whimsical stuff out of cardboard boxes constantly. Shelf organizers, art supply caddies, phone stands, goofy little art things to amuse myself and others, toys for the kids (puppet theaters with little cardboard puppets, castles, play kitchens, etc.), and countless little temporary&#8230;&#8203;things. (Note to self: I should really r\",\"classification_terms\":[\"cards/stack-display\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/cards/project-stack\",\"status\":200,\"title\":\"The Project Stack! (an actual paper stack) - ratfactor\",\"word_count\":1003,\"summary_text\":\"The Project Stack! (an actual paper stack) - ratfactor The Project Stack! (an actual paper stack) - ratfactor Home | About | Now | Repos | Cards | Contact | RSS This is a card in Dave's Virtual Box of Cards. The Project Stack! (an actual paper stack) Page created: 2025-06-10 Updated: 2025-07-06 Back to projects or onward to stack-display! Everybody&#8217;s got a \\\"todo\\\" list. They&#8217;re okay, I guess. For normal people. I am not normal people. That was just the start! Around 21:30 last night, I found myself hacking on a script to produce images for the documentation mentioned in the screenshot above. Shortly after, it spiraled out of control. My situation, in summary: &lt;Existing stack of existing half-completed projects starts here.&gt; \\\"I have a horrendous itch to make that wiki I&#8217;ve been thinking about.\\\" Make a wiki in a weekend. (\",\"classification_terms\":[\"cards/project-stack\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/htmlwarden/\",\"status\":200,\"title\":\"HTML WARDen (a wiki) - ratfactor\",\"word_count\":242,\"summary_text\":\"HTML WARDen (a wiki) - ratfactor HTML WARDen (a wiki) - ratfactor Home | About | Now | Repos | Cards | Contact | RSS HTML WARDen (a wiki) Page started: 2025-06-09 Page published: 2025-06-12 Updated: 2025-07-18 HTML WARDen is a PHP wiki system. It uses HTML as the storage format. Here&#8217;s the source repo. Highlights: No dependencies other than PHP 7.x+ Flat file storage Old versions of pages saved Extremely limited text format keeps things simple User logins TODO: File uploads Scroll past the screenshot below for my \\\"making of\\\" HTML WARDen article series, The Wiki Weekend (and beyond!!!) The Wiki Weekend &#8230;&#8203;and beyond! This was a weekend project. Here&#8217;s my write-up of the whole project with ideas, false-turns, screenshots, and even some live code demos! The Wiki Weekend Part 1: Motivation and Other Wik\",\"classification_terms\":[\"htmlwarden\",\"about\",\"contact\",\"login\"],\"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\":4,\"depth\":1},{\"path\":\"/repos/htmlwarden/index.html\",\"status\":200,\"title\":\"htmlwarden - A flat HTML file Wiki in PHP\",\"word_count\":384,\"summary_text\":\"htmlwarden - A flat HTML file Wiki in PHP htmlwarden - A flat HTML file Wiki in PHP Ratfactor.com &gt; Dave's Repos htmlwarden A flat HTML file Wiki in PHP git clone http://ratfactor.com/repos/htmlwarden/htmlwarden.git About Files Commits Files .gitignore LICENSE README.md core.php edit.php example_settings.php icon32x32.png index.php link_creator.php login.php pages/archive/README pages/htmlwarden.html save.php README.md HTML WARDen An HTML file wiki in PHP and vanilla JavaScript. No DB, no 3rd party libraries. Read quite a bit more about this project including a multi-part &ldquo;making of&rdquo; article series titled The Wiki Weekend here: https://ratfactor.com/htmlwarden/ Installation/setup Clone this repo to a directory accessible on a web server somewhere running PHP. $ cp example_settings.php settings.php Edit settings.php\",\"classification_terms\":[\"repos/htmlwarden/index.html\",\"about\",\"login\"],\"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\":\"/htmlwarden/wiki-weekend\",\"status\":200,\"title\":\"The Wiki Weekend Part 1: Motivation and Other Wikis - ratfactor\",\"word_count\":1007,\"summary_text\":\"The Wiki Weekend Part 1: Motivation and Other Wikis - ratfactor The Wiki Weekend Part 1: Motivation and Other Wikis - ratfactor Home | About | Now | Repos | Cards | Contact | RSS The Wiki Weekend Part 1: Motivation and Other Wikis Page created: 2025-06-09 Back to HTML WARDen. The Wiki Weekend Part 1 You are here The Wiki Weekend Part 2: The Page Editor Idea The Wiki Weekend Part 3: The Storage The Wiki Weekend Part 4: Users, Locking The Wiki Weekend Part 5: Finishing Touches, Conclusion Beyond the weekend: Death to WYSIWYG! (Part 6) Beyond the weekend: Store as HTML, Edit as LML (Part 7) The best kind of software scratches an itch, right? I have been very itchy with a brain full of ideas for simple wikis for a long time. This last weekend, I finally scratched it. Even though the last thing on Earth I needed was another project, I&#8217;ve gotta say, it\",\"classification_terms\":[\"htmlwarden/wiki-weekend\",\"about\",\"contact\",\"store\"],\"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\":\"/forth/implementing\",\"status\":200,\"title\":\"Implementing a Forth - ratfactor\",\"word_count\":1752,\"summary_text\":\"Implementing a Forth - ratfactor Implementing a Forth - ratfactor Home | About | Now | Repos | Cards | Contact | RSS Implementing a Forth Page created: 2025-05-28 Updated: 2025-08-29 Back to my Forth pages. (Image of \\\"Four-Armed Chuck\\\" programming a PDP-11 is from my giant write-up of Forth.) I&#8217;ve made a couple Forths. Not a single one of them are \\\"finished software\\\" intended for industrial use, but all of them taught me something about Forth, concatenative programming, and how computers work in general. Sure, I&#8217;ve done my time in that place where points are free and the stacks always need twiddling. But what about you? You&#8217;re thinking about making a Forth yourself, aren&#8217;t you? Of course you are. The call is irresistible. I know that. The only thing holding you back is uncertainty. You&#8217;re thi\",\"classification_terms\":[\"forth/implementing\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/cards/pl-small\",\"status\":200,\"title\":\"Small Programs and Languages - ratfactor\",\"word_count\":2355,\"summary_text\":\"Small Programs and Languages - ratfactor Small Programs and Languages - ratfactor Home | About | Now | Repos | Cards | Contact | RSS This is a card in Dave's Virtual Box of Cards. Small Programs and Languages Page started: 2025-06-02 Page published: 2025-06-04 My Implementing a Forth article got some great feedback, particularly around the subject of tiny Forth implementations. (And it was an excuse to list some of the tiniest Forths I&#8217;ve seen.) I know I&#8217;m not alone in seeing the appeal of tiny Forths, tiny languages, tiny programs, and just small stuff in general. What&#8217;s up with that, anyway? The appeal of tiny programs Tiny programs are approachable. If I see that something is 200 lines of code, I&#8217;m much more likely to read it than if it&#8217;s 2,000 or 20,000 lines. What&#8217;s more, if it&#8217;s a p\",\"classification_terms\":[\"cards/pl-small\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":4,\"depth\":1},{\"path\":\"/luanti/\",\"status\":200,\"title\":\"Luanti - ratfactor\",\"word_count\":140,\"summary_text\":\"Luanti - ratfactor Luanti - ratfactor Home | About | Now | Repos | Cards | Contact | RSS Luanti Page created: 2025-05-26 I&#8217;m toying with the idea of making a game in Luanti, the open-course voxel game engine: https://www.luanti.org/ https://en.wikipedia.org/wiki/Luanti Formerly known as \\\"Minetest\\\", Luanti is not just an engine, but a whole ecosystem for voxel games and mods. The Luanti ContentDB (content.luanti.org) can be browsed online or from within the in-game Luanti main menu, which makes installing games and mods quite accessible. I have no idea if I&#8217;ll end up making an actual game, but I&#8217;ll document what I&#8217;m up to here. 2025-05-26 Making a first Luanti mod: A new block type appears! This page was last generated 2026-03-14 21:43:20 -0400 Using anything on this website to train l\",\"classification_terms\":[\"luanti\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/cards/one-tree-website\",\"status\":200,\"title\":\"The One-Tree Website - ratfactor\",\"word_count\":872,\"summary_text\":\"The One-Tree Website - ratfactor The One-Tree Website - ratfactor Home | About | Now | Repos | Cards | Contact | RSS This is a card in Dave's Virtual Box of Cards. The One-Tree Website Page created: 2025-05-20 I tried the Website Carbon Calculator on ratfactor.com and was pleased with my A+ carbon rating. https://www.websitecarbon.com/ Only 0.02 g of CO2 is produced every time someone visits this web page. Over a year, with 3,000 monthly page views, ratfactor.com produces&#8230;&#8203;0.67kg of CO2 equivalent. As much CO2 as boiling water for 91 cups of tea. My favorite part is: This web page emits the amount of carbon that 1 tree absorbs in a year. What a wonderful thought. So now I&#8217;m imagining there&#8217;s a tree out there, maybe even the one I can see out my front window, my tree, which has been given the task o\",\"classification_terms\":[\"cards/one-tree-website\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":2,\"depth\":1},{\"path\":\"/snobol/\",\"status\":200,\"title\":\"I learned Snobol and then wrote a toy Forth - ratfactor\",\"word_count\":974,\"summary_text\":\"I learned Snobol and then wrote a toy Forth - ratfactor I learned Snobol and then wrote a toy Forth - ratfactor Home | About | Now | Repos | Cards | Contact | RSS I learned Snobol and then wrote a toy Forth Page created: 2025-04-19 Updated: 2025-06-03 This page is a mini-site for my Snobol excursion with links to separate pages for my: Thoughts on Snobol Toy Forth interpreter written in Snobol Thoughts about writing a toy Forth interpreter in Snobol On with the show&#8230;&#8203; I finally learned SNOBOL! Snobol has been on my programming language bucket list for ages. Snobol Here&#8217;s my conclusions about the Snobol4 language itself, which get their own pages: Ratfactor&#8217;s Judgement of Snobol4 The Snobol Implementation Language (SIL) In short, I think Snobol is fascinating. The singular focus on pattern matching kind of reminds me of A\",\"classification_terms\":[\"snobol\",\"about\",\"contact\",\"links\"],\"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\":3,\"depth\":1},{\"path\":\"/snobol/judgement\",\"status\":200,\"title\":\"Ratfactor's Judgement of Snobol4 - ratfactor\",\"word_count\":5297,\"summary_text\":\"Ratfactor's Judgement of Snobol4 - ratfactor Ratfactor's Judgement of Snobol4 - ratfactor Home | About | Now | Repos | Cards | Contact | RSS Ratfactor's Judgement of Snobol4 Page cr",
        "score_reasons_json": "[]",
        "route_domain": "ratfactor.com",
        "display_domain": "ratfactor.com"
    },
    "explainability": {
        "summary": "ratfactor.com currently scores 68/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": "Moderate confidence",
                "tone": "caution",
                "detail": "53/100"
            },
            {
                "label": "Crawler access",
                "value": "Clean visibility",
                "tone": "good",
                "detail": null
            }
        ],
        "weighted_contributions": [
            {
                "label": "Quality system",
                "points": "+24.5",
                "tone": "good",
                "detail": "Technical quality, crawl depth, page structure, and implementation hygiene. Current subsystem score: 72/100."
            },
            {
                "label": "Reputation system",
                "points": "+16.3",
                "tone": "caution",
                "detail": "Authority, search visibility, reach, engagement, and registry stability. Current subsystem score: 48/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": "-5.0",
                "tone": "risk",
                "detail": "Safety thresholds capped the final score until the risk profile improves."
            }
        ],
        "evidence_cards": [
            {
                "label": "Authority and trust",
                "value": "46/100 · trust 62/100",
                "tone": "caution",
                "detail": "186 monthly visitors, 73 organic keywords, brand completeness 53/100, engagement 81/100."
            },
            {
                "label": "Backlink and search evidence",
                "value": "5 referring domains",
                "tone": "good",
                "detail": "5 backlinks across 5 referring domains. Diversity 95/100; spam penalty 3."
            },
            {
                "label": "Registry and domain stability",
                "value": "28.3 years old",
                "tone": "good",
                "detail": "Stability 100/100 · age 28.3 years · registrar Name.com, Inc. · expires in 251 days."
            },
            {
                "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": [
            "Established domain age: 28.3 years.",
            "Low registrar / ownership churn with solid registry stability.",
            "Healthy crawl quality and on-page completeness.",
            "Search evidence is broad enough to classify with better confidence.",
            "Registry history looks stable, which supports legitimacy and trust.",
            "The domain has been registered for years, which usually improves trust confidence."
        ],
        "risks": [],
        "freshness": [
            {
                "label": "Crawl evidence",
                "value": "2026-04-16 07:38:25",
                "tone": "good",
                "detail": "Crawl and page content sample. Age: 23h ago."
            },
            {
                "label": "WHOIS snapshot",
                "value": "2026-04-16 07:38:21",
                "tone": "good",
                "detail": "Registry profile and stability signals. Age: 23h ago."
            },
            {
                "label": "Keyword view",
                "value": "2026-04-17 06:59:07",
                "tone": "good",
                "detail": "Estimated visibility until tracked keyword snapshots exist. Age: 0s ago."
            },
            {
                "label": "Rank history",
                "value": "2026-04-17 06:59:07",
                "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": 73,
        "fraud_clamp_penalty": 5,
        "final_score": 68
    },
    "insight_snapshot": {
        "version": 1,
        "generated_at": "2026-04-17T06:59:07+00:00",
        "domain": "ratfactor.com",
        "display_name": "Home",
        "is_tracked": false,
        "is_estimated": true,
        "overall_score": 68,
        "authority_score": 46,
        "trust_score": 62,
        "safety_score": 100,
        "fraud_score": 0,
        "confidence_score": 100,
        "traffic_confidence": 53,
        "last_crawled_at": "2026-04-16 07:38:25",
        "crawl_blocked": false,
        "summary": "ratfactor.com currently scores 68/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": "Moderate confidence",
                "tone": "caution",
                "detail": "53/100"
            },
            {
                "label": "Crawler access",
                "value": "Clean visibility",
                "tone": "good",
                "detail": null
            }
        ],
        "top_positive_signals": [
            "Established domain age: 28.3 years.",
            "Low registrar / ownership churn with solid registry stability.",
            "Healthy crawl quality and on-page completeness.",
            "Search evidence is broad enough to classify with better confidence.",
            "Registry history looks stable, which supports legitimacy and trust."
        ],
        "top_risk_signals": [],
        "freshness": [
            {
                "label": "Crawl evidence",
                "value": "2026-04-16 07:38:25",
                "tone": "good",
                "detail": "Crawl and page content sample. Age: 23h ago."
            },
            {
                "label": "WHOIS snapshot",
                "value": "2026-04-16 07:38:21",
                "tone": "good",
                "detail": "Registry profile and stability signals. Age: 23h ago."
            },
            {
                "label": "Keyword view",
                "value": "2026-04-17 06:59:07",
                "tone": "good",
                "detail": "Estimated visibility until tracked keyword snapshots exist. Age: 0s ago."
            },
            {
                "label": "Rank history",
                "value": "2026-04-17 06:59:07",
                "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:08:46+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/ratfactor.com/refresh",
        "isGuestCooldown": false,
        "cooldownSeconds": 0
    },
    "urlscan_report": {
        "domain": "ratfactor.com",
        "status": "idle",
        "submitted_at": null,
        "completed_at": null,
        "last_checked_at": null,
        "last_error": "",
        "submitted_url": "https://ratfactor.com/",
        "uuid": "",
        "result_url": "",
        "api_result_url": "",
        "visibility": "public",
        "summary": "No urlscan.io report has been requested for this domain yet.",
        "report": [],
        "report_summary": [],
        "is_fresh": false,
        "can_retry": true,
        "poll_after_seconds": 20
    }
}