{
    "ready": true,
    "site": {
        "id": 0,
        "domain": "qubyte.codes",
        "display_name": "Qubyte Codes",
        "primary_country_code": "",
        "category_name": "Developer Tools"
    },
    "metrics": {
        "global_rank": 6312,
        "country_rank": 3222,
        "category_rank": 16,
        "daily_pageviews_per_visitor": 4.11,
        "daily_time_on_site_seconds": 378,
        "bounce_rate": 25.78,
        "search_visits_percent": 41.56,
        "total_sites_linking_in": 3,
        "monthly_unique_visitors": 197,
        "recorded_at": "2026-04-01 19:11:04"
    },
    "audit": {
        "score": 96
    },
    "traffic_sources": {
        "direct_percent": 27.4,
        "search_percent": 36.38,
        "social_percent": 4.6,
        "referral_percent": 17.82,
        "email_percent": 7.04,
        "paid_percent": 6.76
    },
    "seo_profile": {
        "backlinks_total": 3,
        "referring_domains": 3,
        "dofollow_backlinks_percent": 66.67,
        "organic_keywords": 76,
        "indexed_pages": 16,
        "page_speed_score": 100,
        "mobile_friendliness_score": 91,
        "authority_score": 44,
        "spam_risk_score": 41
    },
    "crawl_report": {
        "robots_status": 200,
        "sitemap_status": 200,
        "sitemap_total_urls": 0,
        "crawl_blocked": false,
        "crawl_blocked_by": "",
        "crawl_blocked_reason": "",
        "notes": [],
        "created_at": "2026-04-01 19:11:04"
    },
    "keywords": [
        {
            "keyword": "Qubyte Codes",
            "position": 20,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 15:08:57",
            "is_estimated": true
        },
        {
            "keyword": "Qubyte Codes developer tools",
            "position": 22,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 15:08:57",
            "is_estimated": true
        },
        {
            "keyword": "Qubyte Codes reviews",
            "position": 24,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 15:08:57",
            "is_estimated": true
        },
        {
            "keyword": "qubyte",
            "position": 26,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 15:08:57",
            "is_estimated": true
        },
        {
            "keyword": "codes",
            "position": 28,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 15:08:57",
            "is_estimated": true
        },
        {
            "keyword": "about",
            "position": 30,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 15:08:57",
            "is_estimated": true
        },
        {
            "keyword": "blog",
            "position": 32,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 15:08:57",
            "is_estimated": true
        },
        {
            "keyword": "api",
            "position": 34,
            "search_engine": "Estimated",
            "checked_at": "2026-04-19 15:08:57",
            "is_estimated": true
        }
    ],
    "rating": {
        "overall": 64,
        "label": "Healthy",
        "breakdown": [
            {
                "label": "Technical foundation",
                "score": 18,
                "max": 18
            },
            {
                "label": "Authority & trust",
                "score": 14,
                "max": 30
            },
            {
                "label": "Reach & market presence",
                "score": 3,
                "max": 18
            },
            {
                "label": "Search visibility",
                "score": 3,
                "max": 12
            },
            {
                "label": "Engagement & retention",
                "score": 9,
                "max": 10
            },
            {
                "label": "Channels & diversification",
                "score": 4,
                "max": 6
            },
            {
                "label": "Registry stability",
                "score": 5,
                "max": 6
            },
            {
                "label": "Quality system",
                "score": 100,
                "max": 100
            },
            {
                "label": "Reputation system",
                "score": 46,
                "max": 100
            },
            {
                "label": "Safety system",
                "score": 100,
                "max": 100
            },
            {
                "label": "Evidence confidence",
                "score": 100,
                "max": 100
            }
        ],
        "authority_score": 46,
        "quality_score": 100,
        "reputation_score": 46,
        "safety_score": 100,
        "confidence_score": 100,
        "fraud_score": 0,
        "authority_signals": {
            "backlinks": 3,
            "referring_domains": 3,
            "organic_keywords": 76,
            "indexed_pages": 16,
            "monthly_visitors": 197,
            "global_rank": 6312,
            "engagement_score": 84,
            "crawl_quality_score": 100,
            "brand_completeness_score": 70,
            "link_diversity_score": 94,
            "technical_reliability_score": 98,
            "whois_score": 70,
            "whois_age_years": 10.3,
            "whois_stability_score": 100,
            "spam_penalty": 3
        },
        "whois_signals": {
            "age_years": 10.3,
            "days_to_expiry": 254,
            "days_since_last_registry_update": 140,
            "stability_score": 100,
            "registrar_changes": 0,
            "ownership_changes": 0,
            "nameserver_changes": 0,
            "status_changes": 0,
            "history_entries": 1,
            "privacy_protected": false,
            "dnssec_enabled": false,
            "has_registrant_country": false,
            "registrant_country": "",
            "nameserver_count": 4,
            "status_count": 1
        }
    },
    "authority_score": 46,
    "trust_score": 62,
    "domain_tags": {
        "primary_tag": "T",
        "primary_tag_score": 79,
        "primary_candidate": "T",
        "primary_candidate_score": 79,
        "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": 79,
                "score": 79,
                "match_percent": 79,
                "threshold_band": "strong"
            },
            {
                "code": "Uncertain",
                "label": "Uncertain",
                "tone": "unknown",
                "description": "External checks stayed inconclusive, so the model avoided a harder verdict.",
                "reason": "External checks stayed inconclusive, so the system kept an uncertainty buffer.",
                "message": "The evidence is materially mixed or partially corroborated, so the model is avoiding a harder verdict.",
                "priority": 68,
                "score": 68,
                "match_percent": 68,
                "threshold_band": "strong"
            }
        ],
        "tag_breakdown": [
            {
                "code": "T",
                "label": "Trusted",
                "tone": "good",
                "description": "Strong trust, stability, and low-risk signals were detected.",
                "reason": "Low spam indicators plus strong trust, quality, registry, and stability signals were detected.",
                "message": "The site shows a reasonably trustworthy and stable profile.",
                "priority": 79,
                "score": 79,
                "match_percent": 79,
                "threshold_band": "strong"
            },
            {
                "code": "Uncertain",
                "label": "Uncertain",
                "tone": "unknown",
                "description": "External checks stayed inconclusive, so the model avoided a harder verdict.",
                "reason": "External checks stayed inconclusive, so the system kept an uncertainty buffer.",
                "message": "The evidence is materially mixed or partially corroborated, so the model is avoiding a harder verdict.",
                "priority": 68,
                "score": 68,
                "match_percent": 68,
                "threshold_band": "strong"
            },
            {
                "code": "Infra",
                "label": "Risky infrastructure",
                "tone": "caution",
                "description": "The hosting / registrar / nameserver neighbourhood looks unusually risky.",
                "reason": "The infrastructure neighbourhood looks riskier than normal.",
                "message": "Infrastructure risk does not currently stand out.",
                "priority": 5,
                "score": 5,
                "match_percent": 5,
                "threshold_band": "none"
            },
            {
                "code": "C",
                "label": "Caution",
                "tone": "caution",
                "description": "Signals are mixed or weak, so this domain should be treated carefully.",
                "reason": "Review carefully: mixed trust signals.",
                "message": "The current crawl does not show a meaningful caution match.",
                "priority": 0,
                "score": 0,
                "match_percent": 0,
                "threshold_band": "none"
            },
            {
                "code": "Crypto",
                "label": "Crypto drainer risk",
                "tone": "toxic",
                "description": "Wallet-connect or seed-phrase theft patterns were detected.",
                "reason": "Wallet-connect or seed-phrase theft patterns were detected.",
                "message": "No meaningful crypto-drainer signals were detected.",
                "priority": 0,
                "score": 0,
                "match_percent": 0,
                "threshold_band": "none"
            }
        ],
        "nsfw_score": 0,
        "trust_score": 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 (79% match) because low spam indicators plus strong trust, quality, registry, and stability signals were detected.",
        "external_intel": {
            "domain": "qubyte.codes",
            "candidate_tag": "",
            "checked_at": "2026-04-19T15:08:57+00:00",
            "status": "queued",
            "snapshot_version": 9,
            "summary": "External intelligence is now manual-only. Use Refresh data to trigger search and review intelligence gathering for this domain.",
            "search_intelligence": {
                "queries": [],
                "providers": [],
                "results_found": 0,
                "results": [],
                "source_mix": [],
                "entity_coverage_score": 0
            },
            "review_intelligence": {
                "documents_fetched": 0,
                "documents": [],
                "facts": [],
                "ignored_candidates": [],
                "source_diversity": 0,
                "elapsed_ms": 0,
                "candidates_considered": 0,
                "fetch_success_rate": 0,
                "avg_source_trust": 0,
                "avg_entity_score": 0
            },
            "evidence": {
                "scores": [],
                "counts": [],
                "tag_support": [],
                "top_supporting_facts": [],
                "top_positive_facts": []
            },
            "quality": {
                "source_diversity_score": 0,
                "entity_coverage_score": 0,
                "freshness_score": 0,
                "confidence": 0,
                "documents_fetched": 0,
                "fact_count": 0,
                "avg_source_trust": 0,
                "avg_entity_score": 0,
                "fetch_success_rate": 0,
                "exact_match_score": 0,
                "query_coverage_score": 0
            },
            "decision": {
                "state": "insufficient",
                "uncertainty": true,
                "candidate_support": 0,
                "candidate_contradiction": 0,
                "supports": [],
                "evidence_quality": "low",
                "state_label": "Inconclusive",
                "state_reason": "Search and review intelligence has not produced enough qualified evidence yet to harden the verdict."
            },
            "signals": {
                "scores": [],
                "counts": [],
                "candidate_support": 0,
                "candidate_contradiction": 0,
                "highlights": []
            },
            "citations": [],
            "urlscan": [],
            "provider_enrichment": {
                "providers": [],
                "facts": [],
                "citations": [],
                "highlights": [],
                "quality": {
                    "provider_diversity_score": 0,
                    "provider_confidence_score": 0,
                    "provider_fact_count": 0
                }
            },
            "eligibility": [],
            "cooldown": [],
            "debug": []
        },
        "external_decision": {
            "state": "insufficient",
            "uncertainty": true,
            "candidate_support": 0,
            "candidate_contradiction": 0,
            "supports": [],
            "evidence_quality": "low",
            "state_label": "Inconclusive",
            "state_reason": "Search and review intelligence has not produced enough qualified evidence yet to harden the verdict."
        },
        "signal_scores": [
            {
                "label": "Strongest tag heuristic",
                "value": "T · 79%",
                "tone": "good",
                "detail": "The highest raw tag match from the heuristic engine before visibility thresholds and manual overrides."
            },
            {
                "label": "Trust score",
                "value": "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": "24/100",
                "tone": "good",
                "detail": "Lower is better. This blends spam indicators with false-positive protections for legitimate sites."
            },
            {
                "label": "Quality score",
                "value": "95/100",
                "tone": "good",
                "detail": "Based on crawl quality, content completeness, and technical evidence."
            },
            {
                "label": "Safety score",
                "value": "100/100",
                "tone": "good",
                "detail": "Higher is safer. Direct fraud signals can heavily cap this even when SEO signals look strong."
            },
            {
                "label": "Fraud score",
                "value": "0/100",
                "tone": "good",
                "detail": "Lower is better. This reflects phishing, drainer, fake-support, fake-shop, and malware signals."
            },
            {
                "label": "Infrastructure risk",
                "value": "5/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": "10.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": "254",
                        "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": "3",
                        "tone": "unknown",
                        "detail": "Broader backlink evidence usually improves confidence."
                    },
                    {
                        "label": "Referring domains",
                        "value": "3",
                        "tone": "unknown",
                        "detail": "Unique linking domains are more useful than raw link volume."
                    },
                    {
                        "label": "Organic keywords",
                        "value": "76",
                        "tone": "caution",
                        "detail": "Search footprint helps distinguish real sites from thin shells."
                    },
                    {
                        "label": "Indexed pages",
                        "value": "16",
                        "tone": "caution",
                        "detail": "Larger index coverage usually means more evidence to classify from."
                    },
                    {
                        "label": "Brand strength",
                        "value": "70/100",
                        "tone": "good",
                        "detail": "Stronger brand signals reduce false positives for legitimate sites."
                    },
                    {
                        "label": "Risk label",
                        "value": "GOOD",
                        "tone": "unknown",
                        "detail": "This is the raw crawl / heuristic risk label feeding the tag model."
                    }
                ]
            },
            {
                "title": "Crawl, content & technicals",
                "items": [
                    {
                        "label": "HTTP status",
                        "value": "200",
                        "tone": "good",
                        "detail": "Healthy responses make classification more reliable."
                    },
                    {
                        "label": "HTTPS / speed",
                        "value": "HTTPS OK · 84 ms",
                        "tone": "good",
                        "detail": "Slow or broken technical signals weaken confidence."
                    },
                    {
                        "label": "Content words",
                        "value": "326",
                        "tone": "caution",
                        "detail": "Thin pages are harder to trust and easier to manipulate."
                    },
                    {
                        "label": "Schema / structure",
                        "value": "0 schema · meta · H1",
                        "tone": "caution",
                        "detail": "Structured markup and basic on-page hygiene improve quality confidence."
                    },
                    {
                        "label": "Links on page",
                        "value": "9 internal · 8 external",
                        "tone": "good",
                        "detail": "Link patterns help detect thin directories and promo pages."
                    },
                    {
                        "label": "Page speed / mobile",
                        "value": "100/100 · 91/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": "Search and review intelligence has not produced enough qualified evidence yet to harden the 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": "Active",
                        "tone": "caution",
                        "detail": "Prevents thin or mixed external evidence from forcing a stronger tag than the evidence can justify."
                    }
                ]
            }
        ],
        "positives": [
            "Established domain age: 10.3 years.",
            "Low registrar / ownership churn with solid registry stability.",
            "Healthy crawl quality and on-page completeness."
        ],
        "risks": [
            "External evidence was mixed or sparse, so the tag model keeps an uncertainty buffer instead of overcommitting."
        ]
    },
    "traffic_confidence": 63,
    "whois": {
        "current": {
            "id": 16349,
            "domain": "qubyte.codes",
            "source_type": "rdap",
            "rdap_url": "https://rdap.identitydigital.services/rdap/domain/qubyte.codes",
            "registrar_name": "NameCheap, Inc.",
            "registrar_handle": "1068",
            "registrant_name": "",
            "registrant_org": "",
            "registrant_country": "",
            "registrant_email": "",
            "abuse_email": "abuse@namecheap.com",
            "created_date": "2015-12-30 12:16:12",
            "updated_date": "2025-11-29 20:50:57",
            "expires_date": "2026-12-30 12:16:12",
            "nameservers_json": "[\"dns1.p08.nsone.net\",\"dns2.p08.nsone.net\",\"dns3.p08.nsone.net\",\"dns4.p08.nsone.net\"]",
            "status_json": "[\"client transfer prohibited\"]",
            "dnssec": "unsigned",
            "privacy_protected": 0,
            "content_hash": "c1f171f674ef783d57bfabd4702ca781ece3954b005b3548306928edf899c3e3",
            "history_count": 1,
            "last_checked_at": "2026-04-01 19:11:00",
            "last_changed_at": "2026-03-17 07:36:19",
            "created_at": "2026-03-17 07:36:19",
            "updated_at": "2026-04-01 19:11:00"
        },
        "history": [
            {
                "id": 16662,
                "domain": "qubyte.codes",
                "source_type": "rdap",
                "registrar_name": "NameCheap, Inc.",
                "registrar_handle": "1068",
                "registrant_name": "",
                "registrant_org": "",
                "registrant_country": "",
                "registrant_email": "",
                "abuse_email": "abuse@namecheap.com",
                "created_date": "2015-12-30 12:16:12",
                "updated_date": "2025-11-29 20:50:57",
                "expires_date": "2026-12-30 12:16:12",
                "nameservers_json": "[\"dns1.p08.nsone.net\",\"dns2.p08.nsone.net\",\"dns3.p08.nsone.net\",\"dns4.p08.nsone.net\"]",
                "status_json": "[\"client transfer prohibited\"]",
                "dnssec": "unsigned",
                "privacy_protected": 0,
                "content_hash": "c1f171f674ef783d57bfabd4702ca781ece3954b005b3548306928edf899c3e3",
                "checked_at": "2026-03-17 07:36:19",
                "change_summary": "Initial WHOIS snapshot captured.",
                "created_at": "2026-03-17 07:36:19"
            }
        ],
        "signals": {
            "age_years": 10.3,
            "days_to_expiry": 254,
            "days_since_last_registry_update": 140,
            "stability_score": 100,
            "registrar_changes": 0,
            "ownership_changes": 0,
            "nameserver_changes": 0,
            "status_changes": 0,
            "history_entries": 1,
            "privacy_protected": false,
            "dnssec_enabled": false,
            "has_registrant_country": false,
            "registrant_country": "",
            "nameserver_count": 4,
            "status_count": 1
        }
    },
    "discovered_domain": {
        "id": 68691,
        "domain": "qubyte.codes",
        "first_seen_at": "2026-03-15 18:57:06",
        "last_crawled_at": "2026-04-01 19:11:04",
        "last_title": "Qubyte Codes - About",
        "last_http_status": 200,
        "discovered_from_domain": "250kb.club",
        "depth": 0,
        "backlinks_count": 3,
        "rating_cache": 49,
        "spam_score": 24,
        "risk_label": "good",
        "category_name": "Developer Tools",
        "primary_country_code": "",
        "internal_links_count": 9,
        "external_links_count": 8,
        "social_profiles_count": 1,
        "content_word_count": 326,
        "title_quality_score": 93,
        "has_meta_description": 1,
        "has_h1": 1,
        "language_code": "en",
        "response_time_ms": 84,
        "robots_status": 200,
        "sitemap_status": 200,
        "sitemap_total_urls": 0,
        "quality_score": 95,
        "site_name": "",
        "canonical_domain": "",
        "favicon_present": 1,
        "schema_org_count": 0,
        "noindex_detected": 0,
        "feed_links_count": 3,
        "https_working": 1,
        "estimated_authority_score": 39,
        "trust_score": 70,
        "nsfw_score": 0,
        "overall_rank_estimate": 2559495,
        "primary_tag": "C",
        "tag_codes": "C,T,Uncertain",
        "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": 72,
        "infrastructure_risk_score": 5,
        "score_confidence": 100,
        "tag_confidence": 72,
        "category_confidence": 24,
        "deep_crawl_pages": 40,
        "resolved_ip": "63.176.8.218",
        "category_candidates_json": "[{\"category\":\"Developer Tools\",\"score\":22},{\"category\":\"Personal\",\"score\":17},{\"category\":\"Business\",\"score\":6}]",
        "page_signals_json": "[{\"path\":\"/blog\",\"status\":200,\"title\":\"Qubyte Codes - Archive\",\"word_count\":3894,\"summary_text\":\"Qubyte Codes - Archive Qubyte Codes - Archive Qubyte Codes blog notes replies links likes about This is a collection of my blog posts. If you use a feed reader, you can subscribe! What happened to 2025? Published Friday, 6 February 2026 #Personal I've not posted in over a year (the whole of 2025). I don't have a readership (there are good odds that nobody besides me will read this), so nobody has missed my writing and I've felt no pressure to force a post… How I syndicate links and notes to Bluesky with GitHub Actions Published Monday, 25 November 2024 #IndieWeb #Bluesky Inspired by Jeremy's post on how he syndicates to Bluesky, I thought I'd follow suit (many examples are useful when it comes to API integration work). A disclaimer though... I'm dubious of the long term prospects of Bluesky for reasons I won't g\",\"classification_terms\":[\"blog\",\"about\",\"api\",\"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\":\"/notes\",\"status\":200,\"title\":\"Qubyte Codes - Notes\",\"word_count\":5828,\"summary_text\":\"Qubyte Codes - Notes Qubyte Codes - Notes Qubyte Codes blog notes replies links likes about This is a collection of my notes. If you use a feed reader, you can subscribe! Wednesday, 25 March 2026 at 10:29:21 GMT One day I’ll take a selfie in which I smile without looking unhinged. Saturday, 28 February 2026 at 10:50:53 GMT The Conservatory at The Barbican. I’m here for Sate of the Browser. Friday, 6 February 2026 at 00:11:47 GMT I forgot to post for the 1 year anniversary of being on HRT (end of January)! Have a photo of me looking a bit tired in a pub last Thursday. Sunday, 4 January 2026 at 23:26:51 GMT I’d do a year in review but it&#39;d be mostly about trans stuff and all the people (the supreme court, the government, rich authors, etc.) who can fuck off. Or maybe it’d be about the surprising joy of being\",\"classification_terms\":[\"notes\",\"about\",\"blog\",\"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\":\"/replies\",\"status\":200,\"title\":\"Qubyte Codes - Replies\",\"word_count\":338,\"summary_text\":\"Qubyte Codes - Replies Qubyte Codes - Replies Qubyte Codes blog notes replies links likes about This is a collection of things on the web I have replied to. If you use a feed reader, you can subscribe! Sunday, 5 May 2024 at 10:50:47 UTC If you want to avoid using a nonce value, the other way to go about it is to hash the resource and put that in the CSP header. I blogged about the interaction between CSP and import maps (which must be inline), and caching and it turns out to work really well. In reply to: https://adactio.com/journal/21104 Tuesday, 31 January 2023 at 22:16:25 UTC Yes! I do this too. I have one workflow on a 15 minute interval to check and deploy scheduled posts (which means some logic), but my favourite has to be the one which runs at midnight on Jan 1st every year. It&#39;s just a curl post like\",\"classification_terms\":[\"replies\",\"about\",\"blog\",\"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\":\"/links\",\"status\":200,\"title\":\"Qubyte Codes - Links\",\"word_count\":2007,\"summary_text\":\"Qubyte Codes - Links Qubyte Codes - Links Qubyte Codes blog notes replies links likes about This is a collection of links I find interesting. If you use a feed reader, you can subscribe! Thursday, 28 August 2025 at 21:55:41 UTC I love this. I&#x27;ve not had a dedicated Linux rig for a while (not counting a NAS and a couple of appliances I&#x27;ve built using Raspberry Pis). With the decline in quality of MacOS, and the tentacles of LLMs getting everywhere in commercial OS&#x27;s, Linux is increasingly attractive as a permanent home again... A Year of Linux on the Desktop - selfaware soup Sunday, 10 November 2024 at 08:53:45 UTC A really great how-to article for getting started with Mastodon. My Mastodon Starter Pack — Roma’s Unpolished Posts Saturday, 12 October 2024 at 08:10:46 UTC Wonderfully written and be\",\"classification_terms\":[\"links\",\"about\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":2,\"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\":\"/likes\",\"status\":200,\"title\":\"Qubyte Codes - Likes\",\"word_count\":215,\"summary_text\":\"Qubyte Codes - Likes Qubyte Codes - Likes Qubyte Codes blog notes replies links likes about This is a collection of things I like on the web. If you use a feed reader, you can subscribe! Friday, 20 September 2024 at 19:30:19 UTC https://catgirlin.space/activity/111/ Wednesday, 15 May 2024 at 16:58:09 UTC https://wingpang.com/writing/2024-05-12-decapcms/ Tuesday, 14 May 2024 at 18:09:08 UTC https://shellsharks.com/notes/2024/05/14/one-of-us Sunday, 5 May 2024 at 09:59:32 UTC https://localghost.dev/blog/new-keyboard-alert-mykeyclub-mkc75/ Sunday, 31 March 2024 at 09:55:45 UTC https://jamesg.blog/2024/03/30/coffee-to-drink-decision-tree/ Sunday, 31 March 2024 at 09:05:19 UTC https://www.claudinec.net/posts/2024-03-31-coffee-decision-tree/ Sunday, 17 March 2024 at 12:24:15 UTC https://adactio.com/links/20979 Satur\",\"classification_terms\":[\"likes\",\"about\",\"blog\",\"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\":4,\"depth\":1},{\"path\":\"/japanese-notes\",\"status\":200,\"title\":\"Qubyte Codes - Japanese Study Notes\",\"word_count\":901,\"summary_text\":\"Qubyte Codes - Japanese Study Notes Qubyte Codes - Japanese Study Notes Qubyte Codes blog notes replies links likes about This is a collection of my notes taken as I learn to use the Japanese language. Be warned! These documents are not authoritative. They represent my current understanding, which is certainly flawed. Sometimes, occasionally, and can happen with ことがある Published Saturday, 13 January 2024 When not used with a past tense verb, 事(こと)がある means that the verb or adjective it follows is possible, or that it happens sometimes… Giving reasons Published Sunday, 23 January 2022 Don't worry, apples are fine but I don't like them as much as this note makes out… Seems like with そう Published Sunday, 16 January 2022 そう can be used to express an impression or expectation of something. In English it's roughly equivalent to \\\"se\",\"classification_terms\":[\"japanese-notes\",\"about\",\"blog\",\"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\":\"/colophon\",\"status\":200,\"title\":\"Qubyte Codes - Colophon\",\"word_count\":834,\"summary_text\":\"Qubyte Codes - Colophon Qubyte Codes - Colophon Qubyte Codes blog notes replies links likes about Colophon Published Sunday, 18 February 2024 #AboutThisBlog Philosophy I have tried to build this website in a way which aligns with my priorities: Respect the reader. This means a lot of things, from delivering less over the wire (respect their data plan) to leaning into HTML and CSS over JS (respect their battery). Respect the planet. Similar to the above, the less delivered over the wire, and the less computationally expensive to serve, parse, and render, the less carbon I&#39;m responsible for putting into the atmosphere. This site is cleaner than 100% of other sites on the web.[1] In practice this means: No tracking. Semantic markup. This is easier for a human reader peaking at the markup to reason about, and als\",\"classification_terms\":[\"colophon\",\"about\",\"blog\",\"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\":\"/blogroll\",\"status\":200,\"title\":\"Qubyte Codes - Blogroll\",\"word_count\":133,\"summary_text\":\"Qubyte Codes - Blogroll Qubyte Codes - Blogroll Qubyte Codes blog notes replies links likes about This is a collection of sites with RSS feeds I subscribe to. You can download this collection to import into your feed reader as an OPML file. cassie.codes Cassie is an SVG and animation wizard! Sally Lait - blog Sally Lait blogs about engineering leadership, and also has some interesting side projects. Oh Hello Ana Ana Rodrigues blogs about a variety of things, and is a fellow IndieWeb enthusiast. Maggie Appleton Maggie Appleton&#x27;s site is packed full of interesting stuff. I particularly like the digital garden. Amelia Wattenberger Amelia Wattenberger creates lots of interesting visualisations and has lots of good content about d3 (amongst other things). Copyright Aura Everitt 2015-2026. Donate to support this b\",\"classification_terms\":[\"blogroll\",\"about\",\"support\",\"blog\",\"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\":\"/blog/what-happened-to-2025\",\"status\":200,\"title\":\"Qubyte Codes - What happened to 2025?\",\"word_count\":593,\"summary_text\":\"Qubyte Codes - What happened to 2025? Qubyte Codes - What happened to 2025? Qubyte Codes blog notes replies links likes about What happened to 2025? Published Friday, 6 February 2026 #Personal I&#39;ve not posted in over a year (the whole of 2025). I don&#39;t have a readership (there are good odds that nobody besides me will read this), so nobody has missed my writing and I&#39;ve felt no pressure to force a post. It is unusual though. A handful of times in a typical year something will grab my attention to the point that I take the time to write about it. So what was different about 2025? And why write about it now? In short, I was very busy: I started coming out as trans in late November 2024. Three people close to me by the end of the year. Over 2025 I came out to everyone else, and by the middle of April I was Aura (hello\",\"classification_terms\":[\"blog/what-happened-to-2025\",\"about\",\"blog\",\"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\":2},{\"path\":\"/tags/Personal\",\"status\":200,\"title\":\"Qubyte Codes - Posts tagged as Personal\",\"word_count\":82,\"summary_text\":\"Qubyte Codes - Posts tagged as Personal Qubyte Codes - Posts tagged as Personal Qubyte Codes blog notes replies links likes about What happened to 2025? Published Friday, 6 February 2026 #Personal I've not posted in over a year (the whole of 2025). I don't have a readership (there are good odds that nobody besides me will read this), so nobody has missed my writing and I've felt no pressure to force a post… Copyright Aura Everitt 2015-2026. Donate to support this blog and my OS work. Party on!\",\"classification_terms\":[\"tags/Personal\",\"about\",\"support\",\"blog\",\"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\":2},{\"path\":\"/blog/how-i-syndicate-links-and-notes-to-bluesky-with-github-actions\",\"status\":200,\"title\":\"Qubyte Codes - How I syndicate links and notes to Bluesky with GitHub Actions\",\"word_count\":992,\"summary_text\":\"Qubyte Codes - How I syndicate links and notes to Bluesky with GitHub Actions Qubyte Codes - How I syndicate links and notes to Bluesky with GitHub Actions Qubyte Codes blog notes replies links likes about How I syndicate links and notes to Bluesky with GitHub Actions Published Monday, 25 November 2024 #IndieWeb #Bluesky Inspired by Jeremy&#39;s post on how he syndicates to Bluesky, I thought I&#39;d follow suit (many examples are useful when it comes to API integration work). A disclaimer though... I&#39;m dubious of the long term prospects of Bluesky for reasons I won&#39;t go into here. That being said, it&#39;s currently a vibrant place, and syndicating from my site to other places keeps my content[1] in my hands. My setup is a bit of a Rube Goldberg machine: I publish notes (optionally with a photo) and bookmarks using Micropub endpoints. The endpoints add the\",\"classification_terms\":[\"blog/how-i-syndicate-links-and-notes-to-bluesky-with-github-actions\",\"about\",\"api\",\"blog\",\"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\":2},{\"path\":\"/tags/IndieWeb\",\"status\":200,\"title\":\"Qubyte Codes - Posts tagged as IndieWeb\",\"word_count\":618,\"summary_text\":\"Qubyte Codes - Posts tagged as IndieWeb Qubyte Codes - Posts tagged as IndieWeb Qubyte Codes blog notes replies links likes about How I syndicate links and notes to Bluesky with GitHub Actions Published Monday, 25 November 2024 #IndieWeb #Bluesky Inspired by Jeremy's post on how he syndicates to Bluesky, I thought I'd follow suit (many examples are useful when it comes to API integration work). A disclaimer though... I'm dubious of the long term prospects of Bluesky for reasons I won't go into here. That being said, it's currently a vibrant place, and syndicating from my site to other places keeps my content in my hands… IndieWebCamp Brighton 2024 Published Saturday, 16 March 2024 Last updated Monday, 18 March 2024 #IndieWeb Last weekend we held IndieWebCamp Brighton 2024, the first in Brighton since 2019. I thought I'd collect\",\"classification_terms\":[\"tags/IndieWeb\",\"about\",\"api\",\"blog\",\"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\":2},{\"path\":\"/tags/Bluesky\",\"status\":200,\"title\":\"Qubyte Codes - Posts tagged as Bluesky\",\"word_count\":115,\"summary_text\":\"Qubyte Codes - Posts tagged as Bluesky Qubyte Codes - Posts tagged as Bluesky Qubyte Codes blog notes replies links likes about How I syndicate links and notes to Bluesky with GitHub Actions Published Monday, 25 November 2024 #IndieWeb #Bluesky Inspired by Jeremy's post on how he syndicates to Bluesky, I thought I'd follow suit (many examples are useful when it comes to API integration work). A disclaimer though... I'm dubious of the long term prospects of Bluesky for reasons I won't go into here. That being said, it's currently a vibrant place, and syndicating from my site to other places keeps my content in my hands… Copyright Aura Everitt 2015-2026. Donate to support this blog and my OS work. Party on!\",\"classification_terms\":[\"tags/Bluesky\",\"about\",\"support\",\"api\",\"blog\",\"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\":2},{\"path\":\"/blog/favourite-music\",\"status\":200,\"title\":\"Qubyte Codes - Favourite music\",\"word_count\":1640,\"summary_text\":\"Qubyte Codes - Favourite music Qubyte Codes - Favourite music Qubyte Codes blog notes replies links likes about Favourite music Published Thursday, 15 August 2024 Last updated Saturday, 28 December 2024 Here are a selection of albums which are all-time favourites of mine. They stand up as a whole (not just as single tracks). I don’t claim to have good taste in music, or that my taste is better than anyone else’s! With each album I’ve written a little about times and places I associate with it. The albums are presented in no particular order. I’ll garden this post over time and add new material. I&#39;ve linked to music services where I can find each album available, but with minimal effort. There are other services, but they&#39;re either behind paywalls or incomprehensible to me. Devin Townsend – Terria Bandcamp Spotif\",\"classification_terms\":[\"blog/favourite-music\",\"about\",\"blog\",\"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\":2},{\"path\":\"/blog/indiewebcamp-brighton-2024\",\"status\":200,\"title\":\"Qubyte Codes - IndieWebCamp Brighton 2024\",\"word_count\":1657,\"summary_text\":\"Qubyte Codes - IndieWebCamp Brighton 2024 Qubyte Codes - IndieWebCamp Brighton 2024 Qubyte Codes blog notes replies links likes about IndieWebCamp Brighton 2024 Published Saturday, 16 March 2024 Last updated Monday, 18 March 2024 #IndieWeb Last weekend we held IndieWebCamp Brighton 2024, the first in Brighton since 2019. I thought I&#39;d collect my thoughts both as a host, and as an attendee. The first signs something like this might happen (only from my perspective) were back in November, when I tried to gather people for an impromptu Homebrew Website Club while people were in town for ffconf 2023. I had [commented to Ana] on Mastodon that I was missing the Homebrew Website Club that used to run here in Brighton, and she suggested something close to such an event. That met with limited success because of the short notice, but Pa\",\"classification_terms\":[\"blog/indiewebcamp-brighton-2024\",\"about\",\"blog\",\"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\":2},{\"path\":\"/blog/why-did-i-create-a-keyboard\",\"status\":200,\"title\":\"Qubyte Codes - Why did I create a keyboard?\",\"word_count\":1271,\"summary_text\":\"Qubyte Codes - Why did I create a keyboard? Qubyte Codes - Why did I create a keyboard? Qubyte Codes blog notes replies links likes about Why did I create a keyboard? Published Thursday, 29 February 2024 #MechanicalKeyboard In 2021 I found myself falling down a mechanical keyboard rabbit hole. It started off with two ortholinear (keys laid out in a grid) keyboards requiring minimal assembly (mostly adding my own switches and key caps). From there I moved onto a split keyboard (one unit per hand, connected together by a cable) with a column staggered layout (keys are aligned in columns, rather than rows like a conventional keyboard). In the end it was inevitable that I would try to design my own, but what did I want? The wish list Constraints breed creativity, so I decided to be restrictive: It should be a split keyboard, like a Corn\",\"classification_terms\":[\"blog/why-did-i-create-a-keyboard\",\"about\",\"blog\",\"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\":2},{\"path\":\"/tags/MechanicalKeyboard\",\"status\":200,\"title\":\"Qubyte Codes - Posts tagged as MechanicalKeyboard\",\"word_count\":131,\"summary_text\":\"Qubyte Codes - Posts tagged as MechanicalKeyboard Qubyte Codes - Posts tagged as MechanicalKeyboard Qubyte Codes blog notes replies links likes about Why did I create a keyboard? Published Thursday, 29 February 2024 #MechanicalKeyboard In 2021 I found myself falling down a mechanical keyboard rabbit hole. It started off with two ortholinear (keys laid out in a grid) keyboards requiring minimal assembly (mostly adding my own switches and key caps). From there I moved onto a split keyboard (one unit per hand, connected together by a cable) with a column staggered layout (keys are aligned in columns, rather than rows like a conventional keyboard). In the end it was inevitable that I would try to design my own, but what did I want… Copyright Aura Everitt 2015-2026. Donate to support this blog and my OS work. Party on!\",\"classification_terms\":[\"tags/MechanicalKeyboard\",\"about\",\"support\",\"blog\",\"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\":2},{\"path\":\"/blog/my-2023-japanese-language-study-habits\",\"status\":200,\"title\":\"Qubyte Codes - My 2023 Japanese language study habits\",\"word_count\":1060,\"summary_text\":\"Qubyte Codes - My 2023 Japanese language study habits Qubyte Codes - My 2023 Japanese language study habits Qubyte Codes blog notes replies links likes about My 2023 Japanese language study habits Published Sunday, 7 January 2024 #japanese #IndieWeb #AboutThisBlog I&#39;ve been tracking my Japanese language study session since 2022. You can see the first year report for comparison. This year my regular Japanese tutor has been taking maternity leave, so I&#39;ve been doing conversation lessons with another tutor. The format is a little different, and I think this change helped to spark some improvements in my development. Before a typical lesson I&#39;m given an article to read in Japanese. I then spend part of the lesson chatting with my tutor, and the rest re-reading the article, answering comprehension questions, and discussing it. These le\",\"classification_terms\":[\"blog/my-2023-japanese-language-study-habits\",\"about\",\"help\",\"blog\",\"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\":2},{\"path\":\"/tags/japanese\",\"status\":200,\"title\":\"Qubyte Codes - Posts tagged as japanese\",\"word_count\":309,\"summary_text\":\"Qubyte Codes - Posts tagged as japanese Qubyte Codes - Posts tagged as japanese Qubyte Codes blog notes replies links likes about My 2023 Japanese language study habits Published Sunday, 7 January 2024 #japanese #IndieWeb #AboutThisBlog I've been tracking my Japanese language study session since 2022. You can see the first year report for comparison… My 2022 Japanese language study habits Published Tuesday, 3 January 2023 #japanese #IndieWeb #AboutThisBlog This time last year I put together some custom scripts to send a record of each study session to my personal site using the micropub endpoint. You can see them here. Each entry says what I did, how long I did it for, and when I started doing it. On their own these aren't particularly interesting or useful. They mostly serve to hold me accountable. However, now that I have a fu\",\"classification_terms\":[\"tags/japanese\",\"about\",\"blog\",\"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\":2},{\"path\":\"/tags/AboutThisBlog\",\"status\":200,\"title\":\"Qubyte Codes - Posts tagged as AboutThisBlog\",\"word_count\":1281,\"summary_text\":\"Qubyte Codes - Posts tagged as AboutThisBlog Qubyte Codes - Posts tagged as AboutThisBlog Qubyte Codes blog notes replies links likes about My 2023 Japanese language study habits Published Sunday, 7 January 2024 #japanese #IndieWeb #AboutThisBlog I've been tracking my Japanese language study session since 2022. You can see the first year report for comparison… My 2022 Japanese language study habits Published Tuesday, 3 January 2023 #japanese #IndieWeb #AboutThisBlog This time last year I put together some custom scripts to send a record of each study session to my personal site using the micropub endpoint. You can see them here. Each entry says what I did, how long I did it for, and when I started doing it. On their own these aren't particularly interesting or useful. They mostly serve to hold me accountable. However, now that I have\",\"classification_terms\":[\"tags/AboutThisBlog\",\"about\",\"blog\",\"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\":2},{\"path\":\"/blog/my-2022-japanese-language-study-habits\",\"status\":200,\"title\":\"Qubyte Codes - My 2022 Japanese language study habits\",\"word_count\":879,\"summary_text\":\"Qubyte Codes - My 2022 Japanese language study habits Qubyte Codes - My 2022 Japanese language study habits Qubyte Codes blog notes replies links likes about My 2022 Japanese language study habits Published Tuesday, 3 January 2023 #japanese #IndieWeb #AboutThisBlog This time last year I put together some custom scripts to send a record of each study session to my personal site using the micropub endpoint. You can see them here. Each entry says what I did, how long I did it for, and when I started doing it. On their own these aren&#39;t particularly interesting or useful. They mostly serve to hold me accountable. However, now that I have a full year of data, it seems like a good time to see if there are any trends! I also took lessons during 2022, but I&#39;m not including those here. Study sessions as I define them here are solo study time, b\",\"classification_terms\":[\"blog/my-2022-japanese-language-study-habits\",\"about\",\"blog\",\"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\":2},{\"path\":\"/blog/tip-find-and-type-narrow-an-element-from-an-array-in-ruby-and-sorbet\",\"status\":200,\"title\":\"Qubyte Codes - Tip: Find and type narrow an element from an array in ruby and sorbet\",\"word_count\":679,\"summary_text\":\"Qubyte Codes - Tip: Find and type narrow an element from an array in ruby and sorbet Qubyte Codes - Tip: Find and type narrow an element from an array in ruby and sorbet Qubyte Codes blog notes replies links likes about Tip: Find and type narrow an element from an array in ruby and sorbet Published Monday, 30 January 2023 Last updated Saturday, 8 July 2023 #ruby #sorbet Recently I had a problem where I had to find the first matching element of an array by type. Ruby provides a method to return the first matching (or nil) element in an array, but sorbet isn&#39;t smart enough to type narrow it when the match is related to the type of the element. For illustrative purposes, here&#39;s a function which takes an array of strings and integers, and returns the first string element lowercased, or nil when no strings are in the array. My first try looked like this: sig do params(\",\"classification_terms\":[\"blog/tip-find-and-type-narrow-an-element-from-an-array-in-ruby-and-sorbet\",\"about\",\"returns\",\"blog\",\"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\":2},{\"path\":\"/tags/ruby\",\"status\":200,\"title\":\"Qubyte Codes - Posts tagged as ruby\",\"word_count\":154,\"summary_text\":\"Qubyte Codes - Posts tagged as ruby Qubyte Codes - Posts tagged as ruby Qubyte Codes blog notes replies links likes about Tip: Find and type narrow an element from an array in ruby and sorbet Published Monday, 30 January 2023 Last updated Saturday, 8 July 2023 #ruby #sorbet Recently I had a problem where I had to find the first matching element of an array by type. Ruby provides a method to return the first matching (or nil) element in an array, but sorbet isn't smart enough to type narrow it when the match is related to the type of the element… Tip: Type narrowing arrays for sorbet in ruby Published Saturday, 28 January 2023 #ruby #sorbet When working with type systems like TypeScript or Sorbet, type narrowing patterns are a way to handle different types a variable may contain in different branches. For example… Copyright A\",\"classification_terms\":[\"tags/ruby\",\"about\",\"blog\",\"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\":2},{\"path\":\"/tags/sorbet\",\"status\":200,\"title\":\"Qubyte Codes - Posts tagged as sorbet\",\"word_count\":154,\"summary_text\":\"Qubyte Codes - Posts tagged as sorbet Qubyte Codes - Posts tagged as sorbet Qubyte Codes blog notes replies links likes about Tip: Find and type narrow an element from an array in ruby and sorbet Published Monday, 30 January 2023 Last updated Saturday, 8 July 2023 #ruby #sorbet Recently I had a problem where I had to find the first matching element of an array by type. Ruby provides a method to return the first matching (or nil) element in an array, but sorbet isn't smart enough to type narrow it when the match is related to the type of the element… Tip: Type narrowing arrays for sorbet in ruby Published Saturday, 28 January 2023 #ruby #sorbet When working with type systems like TypeScript or Sorbet, type narrowing patterns are a way to handle different types a variable may contain in different branches. For example… Copyright\",\"classification_terms\":[\"tags/sorbet\",\"about\",\"blog\",\"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\":2},{\"path\":\"/blog/tip-type-narrowing-arrays-for-sorbet-in-ruby\",\"status\":200,\"title\":\"Qubyte Codes - Tip: Type narrowing arrays for sorbet in ruby\",\"word_count\":578,\"summary_text\":\"Qubyte Codes - Tip: Type narrowing arrays for sorbet in ruby Qubyte Codes - Tip: Type narrowing arrays for sorbet in ruby Qubyte Codes blog notes replies links likes about Tip: Type narrowing arrays for sorbet in ruby Published Saturday, 28 January 2023 #ruby #sorbet When working with type systems like TypeScript or Sorbet, type narrowing patterns are a way to handle different types a variable may contain in different branches. For example: sig do params( n: T.nilable(Integer) ).returns( T.nilable(Integer) ) end def double(n) if n # n can&#x27;t be nil in this branch, so sorbet # knows the type is narrowed to Integer. n * 2 else # This branch could be implied, but is # here for clarity. nil end end Type narrowing applies to more than just T.nilable(X) to X. You can use it to refine a type to a subset of some types allowed by a union, or from a value\",\"classification_terms\":[\"blog/tip-type-narrowing-arrays-for-sorbet-in-ruby\",\"about\",\"returns\",\"blog\",\"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\":2},{\"path\":\"/study-sessions\",\"status\":200,\"title\":\"Qubyte Codes - Study Sessions\",\"word_count\":14319,\"summary_text\":\"Qubyte Codes - Study Sessions Qubyte Codes - Study Sessions Qubyte Codes blog notes replies links likes about This is a log of my study sessions. Thursday, 26 March 2026 at 00:13:29 GMT for 15m. Study session: homework Thursday, 19 March 2026 at 00:15:25 GMT for 20m. Study session: reading Thursday, 26 February 2026 at 00:25:32 GMT for 20m. Study session: reading Wednesday, 25 February 2026 at 23:28:47 GMT for 15m. Study session: homework Wednesday, 18 February 2026 at 23:42:52 GMT for 10m. Study session: homework Thursday, 12 February 2026 at 00:29:12 GMT for 20m. Study session: reading Thursday, 12 February 2026 at 00:34:02 GMT for 15m. Study session: homework Thursday, 5 February 2026 at 00:08:08 GMT for 30m. Study session: reading Thursday, 29 January 2026 at 00:24:13 GMT for 30m. Study session: reading Wednesday,\",\"classification_terms\":[\"study-sessions\",\"about\",\"blog\",\"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\":2},{\"path\":\"/blog/procedural-christmas-cards-2022\",\"status\":200,\"title\":\"Qubyte Codes - Procedural Christmas cards 2022\",\"word_count\":237,\"summary_text\":\"Qubyte Codes - Procedural Christmas cards 2022 Qubyte Codes - Procedural Christmas cards 2022 {\\\"imports\\\":{\\\"/scripts/create-contained-svg.js\\\":\\\"/scripts/hashed-create-contained-svg-e30bdde33d518ce472bd85e6af9d5201796c4e3fa5e8b72d8893ab331f8b632f.js\\\",\\\"/scripts/create-svg-element.js\\\":\\\"/scripts/hashed-create-svg-element-ac6e7c249eb7946021e6469a9b63d3274c0628d9c93432b69a6250b281b52458.js\\\",\\\"/scripts/get-seed.js\\\":\\\"/scripts/hashed-get-seed-925eeedfa498adbd3733d26e20149c3bc5bc579defb9bb61925f810a4a352bf4.js\\\",\\\"/scripts/mulberry32.js\\\":\\\"/scripts/hashed-mulberry32-edd022e6cb20298fe04bd83696136950cf5352d7ebedaf4683e2ccd04644a301.js\\\",\\\"/scripts/random-in-range.js\\\":\\\"/scripts/hashed-random-in-range-7a4b4fe713361c4cb21c51f36de43fa45df530d8818021805429d2adeb7de54f.js\\\",\\\"/scripts/set-attributes-ns.js\\\":\\\"/scripts/hashed-set-attributes-ns-31c06e65920b3fc6467aef\",\"classification_terms\":[\"blog/procedural-christmas-cards-2022\",\"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\":2},{\"path\":\"/tags/JavaScript\",\"status\":200,\"title\":\"Qubyte Codes - Posts tagged as JavaScript\",\"word_count\":1943,\"summary_text\":\"Qubyte Codes - Posts tagged as JavaScript Qubyte Codes - Posts tagged as JavaScript Qubyte Codes blog notes replies links likes about Procedural Christmas cards 2022 Published Saturday, 17 December 2022 #JavaScript #GenerativeArt Below is a procedural snowman. I'm using a little code to create Christmas cards again this year, and as before I wanted each to be unique! If you received a card from me, you may see something like ?seed=1234567890 in the URL bar. That will be the random seed which generated your snowflake (and it's yours to keep). To see a random snowflake, remove everything after the question mark and hit enter. Refresh the page to see a fresh random snowman… Progressively enhanced caching of JavaScript modules without bundling using import maps Published Wednesday, 23 November 2022 Last updated Sunday, 24 September 20\",\"classification_terms\":[\"tags/JavaScript\",\"about\",\"blog\",\"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\":2},{\"path\":\"/tags/GenerativeArt\",\"status\":200,\"title\":\"Qubyte Codes - Posts tagged as GenerativeArt\",\"word_count\":569,\"summary_text\":\"Qubyte Codes - Posts tagged as GenerativeArt Qubyte Codes - Posts tagged as GenerativeArt Qubyte Codes blog notes replies links likes about Procedural Christmas cards 2022 Published Saturday, 17 December 2022 #JavaScript #GenerativeArt Below is a procedural snowman. I'm using a little code to create Christmas cards again this year, and as before I wanted each to be unique! If you received a card from me, you may see something like ?seed=1234567890 in the URL bar. That will be the random seed which generated your snowflake (and it's yours to keep). To see a random snowflake, remove everything after the question mark and hit enter. Refresh the page to see a fresh random snowman… Procedural Christmas cards Published Tuesday, 7 December 2021 #JavaScript #GenerativeArt Below is a procedural snowflake. I'm using a little code to create Chr\",\"classification_terms\":[\"tags/GenerativeArt\",\"about\",\"blog\",\"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\":2},{\"path\":\"/blog/progressively-enhanced-caching-of-javascript-modules-without-bundling-using-import-maps\",\"status\":200,\"title\":\"Qubyte Codes - Progressively enhanced caching of JavaScript modules without bundling using import maps\",\"word_count\":2242,\"summary_text\":\"Qubyte Codes - Progressively enhanced caching of JavaScript modules without bundling using import maps Qubyte Codes - Progressively enhanced caching of JavaScript modules without bundling using import maps Qubyte Codes blog notes replies links likes about Progressively enhanced caching of JavaScript modules without bundling using import maps Published Wednesday, 23 November 2022 Last updated Sunday, 24 September 2023 #AboutThisBlog #JavaScript #ffconf I went to ffconf 2022 a couple of weeks ago, and two of the talks in particular resonated with me... (more actually, but these felt actionable): &quot;This Talk is Under Construction: a love letter to the personal website&quot; Sophie Koonin &quot;Working towards a greener world from behind the keyboard&quot; Natalia Waniczek I really like having my own place on the web, and I&#39;ve already put a fairly substantial amount of effort into makin\",\"classification_terms\":[\"blog/progressively-enhanced-caching-of-javascript-modules-without-bundling-using-import-maps\",\"about\",\"blog\",\"under construction\",\"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\":2},{\"path\":\"/tags/ffconf\",\"status\":200,\"title\":\"Qubyte Codes - Posts tagged as ffconf\",\"word_count\":235,\"summary_text\":\"Qubyte Codes - Posts tagged as ffconf Qubyte Codes - Posts tagged as ffconf Qubyte Codes blog notes replies links likes about Progressively enhanced caching of JavaScript modules without bundling using import maps Published Wednesday, 23 November 2022 Last updated Sunday, 24 September 2023 #AboutThisBlog #JavaScript #ffconf I went to ffconf 2022 a couple of weeks ago, and two of the talks in particular resonated with me... (more actually, but these felt actionable)… The maths of Domains of points with spokes Published Monday, 2 December 2019 #JavaScript #ffconf #GenerativeArt It's been a while since my last maths heavy article. I enjoy writing these but struggle to find the time to write many… Generative art piece: domains of points with spokes Published Saturday, 30 November 2019 #JavaScript #ffconf #GenerativeArt The graphic\",\"classification_terms\":[\"tags/ffconf\",\"about\",\"blog\",\"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\":2},{\"path\":\"/blog/controlling-ruby-annotation-positioning-and-appearance-with-pure-css-and-a-select-box\",\"status\":200,\"title\":\"Qubyte Codes - Controlling ruby annotation positioning and appearance with pure CSS and a select box\",\"word_count\":573,\"summary_text\":\"Qubyte Codes - Controlling ruby annotation positioning and appearance with pure CSS and a select box Qubyte Codes - Controlling ruby annotation positioning and appearance with pure CSS and a select box Qubyte Codes blog notes replies links likes about Controlling ruby annotation positioning and appearance with pure CSS and a select box Published Monday, 7 November 2022 #AboutThisBlog #JavaScript #CSS #japanese ふりがな: over under off The :has() CSS pseudo-class opens up all sorts of possibilities. I wanted to see if it could simplify how I handle the ruby text (annotations above or below text to help with reading) in my Japanese notes. It works (in Safari and Chrome at least, and hopefully Firefox soon)! Demonstration time. Below the date stamp in the header above you'll see \\\"ふりがな\\\". To the right is a word. Click or tap on the word to select the positioning of the annotations in the Japanese\",\"classification_terms\":[\"blog/controlling-ruby-annotation-positioning-and-appearance-with-pure-css-and-a-select-box\",\"about\",\"help\",\"blog\",\"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\":2},{\"path\":\"/tags/CSS\",\"status\":200,\"title\":\"Qubyte Codes - Posts tagged as CSS\",\"word_count\":326,\"summary_text\":\"Qubyte Codes - Posts tagged as CSS Qubyte Codes - Posts tagged as CSS Qubyte Codes blog notes replies links likes about Controlling ruby annotation positioning and appearance with pure CSS and a select box Published Monday, 7 November 2022 #AboutThisBlog #JavaScript #CSS #japanese ふりがな: over under off The :has() CSS pseudo-class opens up all sorts of possibilities. I wanted to see if it could simplify how I handle the ruby text (annotations above or below text to help with reading) in my Japanese notes. It works (in Safari and Chrome at least, and hopefully Firefox soon)… Dark mode Published Saturday, 12 October 2019 #AboutThisBlog #CSS That's right! After more than a year of talking about adding a dark mode I finally did it. The wider support for prefers-color-scheme is what pushed me over the edge. I'm also a slave to fas\",\"classification_terms\":[\"tags/CSS\",\"about\",\"support\",\"help\",\"blog\",\"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\":2},{\"path\":\"/blog/its-time-to-build-a-study-habit\",\"status\":200,\"title\":\"Qubyte Codes - It's time to build a study habit\",\"word_count\":619,\"summary_text\":\"Qubyte Codes - It's time to build a study habit Qubyte Codes - It&#x27;s time to build a study habit Qubyte Codes blog notes replies links likes about It&#x27;s time to build a study habit Published Saturday, 28 May 2022 Last updated Saturday, 9 July 2022 #japanese I started a new role recently, and the company is large enough that there are a number of folk learning or proficient in Japanese as a second language. I joined a chat session with two other people whose Japanese was much further along than mine. It was great listening practice (I could mostly follow the conversation) but I was unable to contribute, which I found disappointing. I&#39;ve said it so many times in the past, but I really need to build a study habit which is substantial enough to improve my proficiency, but light enough that I can sustain it. Not just flash cards\",\"classification_terms\":[\"blog/its-time-to-build-a-study-habit\",\"about\",\"company\",\"blog\",\"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\":2,\"depth\":2},{\"path\":\"/blog/marqdown\",\"status\":200,\"title\":\"Qubyte Codes - Marqdown\",\"word_count\":1235,\"summary_text\":\"Qubyte Codes - Marqdown Qubyte Codes - Marqdown Qubyte Codes blog notes replies links likes about Marqdown Published Sunday, 15 May 2022 Last updated Monday, 19 June 2023 #AboutThisBlog #IndieWeb ふりがな: over under off Markdown is the standard for writing in techie circles these days, but it's pretty minimal. For a readme it's all you need, but if you create a site around Markdown like I have then you pretty quickly bump into its limitations. Markdown is deliberately limited, so it's no fault of the language or its creator! Nevertheless, over time I've added my own tweaks and extensions upon Markdown, so I've decided to document them, and name the dialect Marqdown. Naming may seem a little arrogant, but it's mostly to disambiguate what I'm writing with more common Markdown variants. My variant is based on the defau\",\"classification_terms\":[\"blog/marqdown\",\"about\",\"blog\",\"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\":2},{\"path\":\"/blog/procedural-christmas-cards\",\"status\":200,\"title\":\"Qubyte Codes - Procedural Christmas cards\",\"word_count\":208,\"summary_text\":\"Qubyte Codes - Procedural Christmas cards Qubyte Codes - Procedural Christmas cards {\\\"imports\\\":{\\\"/scripts/create-contained-svg.js\\\":\\\"/scripts/hashed-create-contained-svg-e30bdde33d518ce472bd85e6af9d5201796c4e3fa5e8b72d8893ab331f8b632f.js\\\",\\\"/scripts/create-svg-element.js\\\":\\\"/scripts/hashed-create-svg-element-ac6e7c249eb7946021e6469a9b63d3274c0628d9c93432b69a6250b281b52458.js\\\",\\\"/scripts/get-seed.js\\\":\\\"/scripts/hashed-get-seed-925eeedfa498adbd3733d26e20149c3bc5bc579defb9bb61925f810a4a352bf4.js\\\",\\\"/scripts/mulberry32.js\\\":\\\"/scripts/hashed-mulberry32-edd022e6cb20298fe04bd83696136950cf5352d7ebedaf4683e2ccd04644a301.js\\\",\\\"/scripts/pick.js\\\":\\\"/scripts/hashed-pick-e39e4433c0eb8852fc74917d5a2a36446b1888014797b25d93db773f9c786185.js\\\",\\\"/scripts/set-attributes-ns.js\\\":\\\"/scripts/hashed-set-attributes-ns-31c06e65920b3fc6467aef4a84763328cd700ab7e13acf81d\",\"classification_terms\":[\"blog/procedural-christmas-cards\",\"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\":2},{\"path\":\"/blog/pastel-migraine-auras\",\"status\":200,\"title\":\"Qubyte Codes - Pastel migraine auras\",\"word_count\":191,\"summary_text\":\"Qubyte Codes - Pastel migraine auras Qubyte Codes - Pastel migraine auras {\\\"imports\\\":{\\\"/scripts/create-contained-svg.js\\\":\\\"/scripts/hashed-create-contained-svg-e30bdde33d518ce472bd85e6af9d5201796c4e3fa5e8b72d8893ab331f8b632f.js\\\",\\\"/scripts/create-svg-element.js\\\":\\\"/scripts/hashed-create-svg-element-ac6e7c249eb7946021e6469a9b63d3274c0628d9c93432b69a6250b281b52458.js\\\",\\\"/scripts/get-seed.js\\\":\\\"/scripts/hashed-get-seed-925eeedfa498adbd3733d26e20149c3bc5bc579defb9bb61925f810a4a352bf4.js\\\",\\\"/scripts/lch2rgb.js\\\":\\\"/scripts/hashed-lch2rgb-8f62ac1e382f507dcea068db872338a545691930bd3ebe444b69a616c97b4c5b.js\\\",\\\"/scripts/mulberry32.js\\\":\\\"/scripts/hashed-mulberry32-edd022e6cb20298fe04bd83696136950cf5352d7ebedaf4683e2ccd04644a301.js\\\",\\\"/scripts/pick.js\\\":\\\"/scripts/hashed-pick-e39e4433c0eb8852fc74917d5a2a36446b1888014797b25d93db773f9c786185.js\\\",\\\"/scr\",\"classification_terms\":[\"blog/pastel-migraine-auras\",\"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\":2},{\"path\":\"/blog/tip-connecting-to-localstack-s3-using-the-javascript-aws-sdk-v3\",\"status\":200,\"title\":\"Qubyte Codes - Tip: Connecting to localstack S3 using the JavaScript AWS SDK v3\",\"word_count\":337,\"summary_text\":\"Qubyte Codes - Tip: Connecting to localstack S3 using the JavaScript AWS SDK v3 Qubyte Codes - Tip: Connecting to localstack S3 using the JavaScript AWS SDK v3 Qubyte Codes blog notes replies links likes about Tip: Connecting to localstack S3 using the JavaScript AWS SDK v3 Published Friday, 26 March 2021 #JavaScript #WebServices I had some issues getting the v3 AWS SDK for JavaScript to communicate with localstack S3, but I found a solution! With the V2 JS SDK, the configuration object for the S3 client looks like: { &quot;region&quot;: &quot;eu-west-1&quot;, &quot;endpoint&quot;: &quot;http://localhost:4566&quot;, &quot;s3ForcePathStyle&quot;: true } The last field tells the sdk not to use &lt;bucket&gt;.hostname style connections, and instead puts the bucket in the path. For local dev this is important because otherwise the SDK tries to make connections to &lt;buck\",\"classification_terms\":[\"blog/tip-connecting-to-localstack-s3-using-the-javascript-aws-sdk-v3\",\"about\",\"blog\",\"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\":2},{\"path\":\"/tags/WebServices\",\"status\":200,\"title\":\"Qubyte Codes - Posts tagged as WebServices\",\"word_count\":221,\"summary_text\":\"Qubyte Codes - Posts tagged as WebServices Qubyte Codes - Posts tagged as WebServices Qubyte Codes blog notes replies links likes about Tip: Connecting to localstack S3 using the JavaScript AWS SDK v3 Published Friday, 26 March 2021 #JavaScript #WebServices I had some issues getting the v3 AWS SDK for JavaScript to communicate with localstack S3, but I found a solution! With the V2 JS SDK, the configuration object for the S3 client looks like… IndieWebCamp Brighton 2019 Published Monday, 21 October 2019 #AboutThisBlog #glitch #WebServices #IndieWeb I had a great time last weekend at IndieWebCamp (IWC) Brighton. The first day was filled with discussions on various IndieWeb related topics. I attended discussions on… A recent contribution I made for Node.js Published Wednesday, 27 February 2019 #JavaScript #WebServices I've made a cou\",\"classification_terms\":[\"tags/WebServices\",\"about\",\"blog\",\"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\":2},{\"path\":\"/blog/dispatching-webmentions-with-a-netlify-build-plugin\",\"status\":200,\"title\":\"Qubyte Codes - Dispatching Webmentions with a Netlify build plugin\",\"word_count\":404,\"summary_text\":\"Qubyte Codes - Dispatching Webmentions with a Netlify build plugin Qubyte Codes - Dispatching Webmentions with a Netlify build plugin Qubyte Codes blog notes replies links likes about Dispatching Webmentions with a Netlify build plugin Published Saturday, 27 February 2021 Last updated Monday, 20 February 2023 #AboutThisBlog #JavaScript #IndieWeb This site uses a static site generator to build plain HTML pages. Since there&#39;s no database to add, update, or delete pages from, determining when to dispatch mentions can be challenging! Here&#39;s how I use a Netlify build plugin and an atom feed to manage it. The Webmention spec requires that a mention should be sent whenever a link is added or removed from a page, or the page one is on is updated or deleted. The recipient will receive an HTTP post which looks the same whatever happened. It&#39;s up to them\",\"classification_terms\":[\"blog/dispatching-webmentions-with-a-netlify-build-plugin\",\"about\",\"blog\",\"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\":2}]",
        "score_reasons_json": "[\"Category confidence was reduced, so the classifier fell back to the broader parent category.\",\"Category evidence stayed thin, so the output was softened to a broader classification.\",\"Trusted status now requires clean crawl access and stronger confidence, so this result was downgraded to caution.\"]",
        "route_domain": "qubyte.codes",
        "display_domain": "qubyte.codes"
    },
    "explainability": {
        "summary": "qubyte.codes currently scores 64/100. Technical and crawl-quality evidence are doing most of the lifting for the score. Evidence confidence is strong enough for a relatively stable read. This is an estimated profile rather than a manually tracked one. Crawler access looks clean.",
        "badges": [
            {
                "label": "Profile",
                "value": "Estimated profile",
                "tone": "unknown",
                "detail": null
            },
            {
                "label": "Evidence confidence",
                "value": "High confidence",
                "tone": "good",
                "detail": "100/100"
            },
            {
                "label": "Traffic confidence",
                "value": "Solid confidence",
                "tone": "caution",
                "detail": "63/100"
            },
            {
                "label": "Crawler access",
                "value": "Clean visibility",
                "tone": "good",
                "detail": null
            }
        ],
        "weighted_contributions": [
            {
                "label": "Quality system",
                "points": "+34.0",
                "tone": "good",
                "detail": "Technical quality, crawl depth, page structure, and implementation hygiene. Current subsystem score: 100/100."
            },
            {
                "label": "Reputation system",
                "points": "+15.6",
                "tone": "caution",
                "detail": "Authority, search visibility, reach, engagement, and registry stability. Current subsystem score: 46/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": "-18.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": "197 monthly visitors, 76 organic keywords, brand completeness 70/100, engagement 84/100."
            },
            {
                "label": "Backlink and search evidence",
                "value": "3 referring domains",
                "tone": "good",
                "detail": "3 backlinks across 3 referring domains. Diversity 94/100; spam penalty 3."
            },
            {
                "label": "Registry and domain stability",
                "value": "10.3 years old",
                "tone": "good",
                "detail": "Stability 100/100 · age 10.3 years · registrar NameCheap, Inc. · expires in 254 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: 10.3 years.",
            "Low registrar / ownership churn with solid registry stability.",
            "Healthy crawl quality and on-page completeness.",
            "Registry history looks stable, which supports legitimacy and trust.",
            "The domain has been registered for years, which usually improves trust confidence.",
            "HTTPS is working, so the site clears a basic transport-security check."
        ],
        "risks": [
            "External evidence was mixed or sparse, so the tag model keeps an uncertainty buffer instead of overcommitting."
        ],
        "freshness": [
            {
                "label": "Crawl evidence",
                "value": "2026-04-01 19:11:04",
                "tone": "risk",
                "detail": "Crawl and page content sample. Age: 17d ago."
            },
            {
                "label": "WHOIS snapshot",
                "value": "2026-04-01 19:11:00",
                "tone": "risk",
                "detail": "Registry profile and stability signals. Age: 17d ago."
            },
            {
                "label": "Keyword view",
                "value": "2026-04-19 15:08:57",
                "tone": "good",
                "detail": "Estimated visibility until tracked keyword snapshots exist. Age: 0s ago."
            },
            {
                "label": "Rank history",
                "value": "2026-04-19 15:08:57",
                "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": 82,
        "fraud_clamp_penalty": 18,
        "final_score": 64
    },
    "insight_snapshot": {
        "version": 1,
        "generated_at": "2026-04-19T15:08:57+00:00",
        "domain": "qubyte.codes",
        "display_name": "Qubyte Codes",
        "is_tracked": false,
        "is_estimated": true,
        "overall_score": 64,
        "authority_score": 46,
        "trust_score": 62,
        "safety_score": 100,
        "fraud_score": 0,
        "confidence_score": 100,
        "traffic_confidence": 63,
        "last_crawled_at": "2026-04-01 19:11:04",
        "crawl_blocked": false,
        "summary": "qubyte.codes currently scores 64/100. Technical and crawl-quality evidence are doing most of the lifting for the score. Evidence confidence is strong enough for a relatively stable read. This is an estimated profile rather than a manually tracked one. Crawler access looks clean.",
        "badges": [
            {
                "label": "Profile",
                "value": "Estimated profile",
                "tone": "unknown",
                "detail": null
            },
            {
                "label": "Evidence confidence",
                "value": "High confidence",
                "tone": "good",
                "detail": "100/100"
            },
            {
                "label": "Traffic confidence",
                "value": "Solid confidence",
                "tone": "caution",
                "detail": "63/100"
            },
            {
                "label": "Crawler access",
                "value": "Clean visibility",
                "tone": "good",
                "detail": null
            }
        ],
        "top_positive_signals": [
            "Established domain age: 10.3 years.",
            "Low registrar / ownership churn with solid registry stability.",
            "Healthy crawl quality and on-page completeness.",
            "Registry history looks stable, which supports legitimacy and trust.",
            "The domain has been registered for years, which usually improves trust confidence."
        ],
        "top_risk_signals": [
            "External evidence was mixed or sparse, so the tag model keeps an uncertainty buffer instead of overcommitting."
        ],
        "freshness": [
            {
                "label": "Crawl evidence",
                "value": "2026-04-01 19:11:04",
                "tone": "risk",
                "detail": "Crawl and page content sample. Age: 17d ago."
            },
            {
                "label": "WHOIS snapshot",
                "value": "2026-04-01 19:11:00",
                "tone": "risk",
                "detail": "Registry profile and stability signals. Age: 17d ago."
            },
            {
                "label": "Keyword view",
                "value": "2026-04-19 15:08:57",
                "tone": "good",
                "detail": "Estimated visibility until tracked keyword snapshots exist. Age: 0s ago."
            },
            {
                "label": "Rank history",
                "value": "2026-04-19 15:08:57",
                "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-19T19:25:32+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/qubyte.codes/refresh",
        "isGuestCooldown": false,
        "cooldownSeconds": 0
    },
    "urlscan_report": {
        "domain": "qubyte.codes",
        "status": "idle",
        "submitted_at": null,
        "completed_at": null,
        "last_checked_at": null,
        "last_error": "",
        "submitted_url": "https://qubyte.codes/",
        "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
    }
}