{
    "ready": true,
    "site": {
        "id": 0,
        "domain": "christiantietze.de",
        "display_name": "Christian Tietze",
        "primary_country_code": "DE",
        "category_name": "Developer Tools: Code Hosting"
    },
    "metrics": {
        "global_rank": 1512,
        "country_rank": 108,
        "category_rank": 4,
        "daily_pageviews_per_visitor": 4.15,
        "daily_time_on_site_seconds": 386,
        "bounce_rate": 25.24,
        "search_visits_percent": 41.72,
        "total_sites_linking_in": 3,
        "monthly_unique_visitors": 228,
        "recorded_at": "2026-04-01 20:43:42"
    },
    "audit": {
        "score": 96
    },
    "traffic_sources": {
        "direct_percent": 27.89,
        "search_percent": 36.76,
        "social_percent": 4.63,
        "referral_percent": 17.93,
        "email_percent": 5.99,
        "paid_percent": 6.8
    },
    "seo_profile": {
        "backlinks_total": 3,
        "referring_domains": 3,
        "dofollow_backlinks_percent": 100,
        "organic_keywords": 80,
        "indexed_pages": 2478,
        "page_speed_score": 100,
        "mobile_friendliness_score": 91,
        "authority_score": 44,
        "spam_risk_score": 37
    },
    "crawl_report": {
        "robots_status": 200,
        "sitemap_status": 200,
        "sitemap_total_urls": 2478,
        "crawl_blocked": false,
        "crawl_blocked_by": "",
        "crawl_blocked_reason": "",
        "notes": [],
        "created_at": "2026-04-01 20:43:42"
    },
    "keywords": [
        {
            "keyword": "Christian Tietze",
            "position": 19,
            "search_engine": "Estimated",
            "checked_at": "2026-04-17 20:23:12",
            "is_estimated": true
        },
        {
            "keyword": "Christian Tietze developer tools: code hosting",
            "position": 21,
            "search_engine": "Estimated",
            "checked_at": "2026-04-17 20:23:12",
            "is_estimated": true
        },
        {
            "keyword": "Christian Tietze reviews",
            "position": 23,
            "search_engine": "Estimated",
            "checked_at": "2026-04-17 20:23:12",
            "is_estimated": true
        },
        {
            "keyword": "christian",
            "position": 25,
            "search_engine": "Estimated",
            "checked_at": "2026-04-17 20:23:12",
            "is_estimated": true
        },
        {
            "keyword": "tietze",
            "position": 27,
            "search_engine": "Estimated",
            "checked_at": "2026-04-17 20:23:12",
            "is_estimated": true
        },
        {
            "keyword": "christiantietze",
            "position": 29,
            "search_engine": "Estimated",
            "checked_at": "2026-04-17 20:23:12",
            "is_estimated": true
        },
        {
            "keyword": "welcome",
            "position": 31,
            "search_engine": "Estimated",
            "checked_at": "2026-04-17 20:23:12",
            "is_estimated": true
        }
    ],
    "rating": {
        "overall": 64,
        "label": "Healthy",
        "breakdown": [
            {
                "label": "Technical foundation",
                "score": 18,
                "max": 18
            },
            {
                "label": "Authority & trust",
                "score": 13,
                "max": 30
            },
            {
                "label": "Reach & market presence",
                "score": 3,
                "max": 18
            },
            {
                "label": "Search visibility",
                "score": 4,
                "max": 12
            },
            {
                "label": "Engagement & retention",
                "score": 9,
                "max": 10
            },
            {
                "label": "Channels & diversification",
                "score": 4,
                "max": 6
            },
            {
                "label": "Registry stability",
                "score": 3,
                "max": 6
            },
            {
                "label": "Quality system",
                "score": 100,
                "max": 100
            },
            {
                "label": "Reputation system",
                "score": 44,
                "max": 100
            },
            {
                "label": "Safety system",
                "score": 100,
                "max": 100
            },
            {
                "label": "Evidence confidence",
                "score": 100,
                "max": 100
            }
        ],
        "authority_score": 44,
        "quality_score": 100,
        "reputation_score": 44,
        "safety_score": 100,
        "confidence_score": 100,
        "fraud_score": 0,
        "authority_signals": {
            "backlinks": 3,
            "referring_domains": 3,
            "organic_keywords": 80,
            "indexed_pages": 2478,
            "monthly_visitors": 228,
            "global_rank": 1512,
            "engagement_score": 84,
            "crawl_quality_score": 100,
            "brand_completeness_score": 75,
            "link_diversity_score": 94,
            "technical_reliability_score": 97,
            "whois_score": 45,
            "whois_age_years": 0,
            "whois_stability_score": 100,
            "spam_penalty": 3
        },
        "whois_signals": {
            "age_years": 0,
            "days_to_expiry": null,
            "days_since_last_registry_update": null,
            "stability_score": 100,
            "registrar_changes": 0,
            "ownership_changes": 0,
            "nameserver_changes": 0,
            "status_changes": 0,
            "history_entries": 1,
            "privacy_protected": false,
            "dnssec_enabled": false,
            "has_registrant_country": false,
            "registrant_country": "",
            "nameserver_count": 0,
            "status_count": 0
        }
    },
    "authority_score": 44,
    "trust_score": 55,
    "domain_tags": {
        "primary_tag": "T",
        "primary_tag_score": 78,
        "primary_candidate": "T",
        "primary_candidate_score": 78,
        "tag_codes": "T",
        "tags": [
            {
                "code": "T",
                "label": "Trusted",
                "tone": "good",
                "description": "Strong trust, stability, and low-risk signals were detected.",
                "reason": "Low spam indicators plus strong trust, quality, registry, and stability signals were detected.",
                "message": "The site shows a reasonably trustworthy and stable profile.",
                "priority": 78,
                "score": 78,
                "match_percent": 78,
                "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": 78,
                "score": 78,
                "match_percent": 78,
                "threshold_band": "strong"
            },
            {
                "code": "Uncertain",
                "label": "Uncertain",
                "tone": "unknown",
                "description": "External checks stayed inconclusive, so the model avoided a harder verdict.",
                "reason": "",
                "message": "The evidence does not currently look notably uncertain.",
                "priority": 18,
                "score": 18,
                "match_percent": 18,
                "threshold_band": "none"
            },
            {
                "code": "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"
            },
            {
                "code": "D",
                "label": "Dangerous",
                "tone": "toxic",
                "description": "Strong signs of phishing, malware, or other harmful behaviour were detected.",
                "reason": "Multiple high-risk signals pushed this domain into the dangerous range.",
                "message": "No meaningful dangerous-signal match was detected.",
                "priority": 0,
                "score": 0,
                "match_percent": 0,
                "threshold_band": "none"
            }
        ],
        "nsfw_score": 0,
        "trust_score": 56,
        "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 (78% match) because low spam indicators plus strong trust, quality, registry, and stability signals were detected.",
        "external_intel": [],
        "external_decision": [],
        "signal_scores": [
            {
                "label": "Strongest tag heuristic",
                "value": "T · 78%",
                "tone": "good",
                "detail": "The highest raw tag match from the heuristic engine before visibility thresholds and manual overrides."
            },
            {
                "label": "Trust score",
                "value": "56/100",
                "tone": "caution",
                "detail": "Confidence derived from authority, crawl quality, stability, and risk signals."
            },
            {
                "label": "Authority score",
                "value": "44/100",
                "tone": "caution",
                "detail": "A higher authority score usually means broader reputation and backlink confidence."
            },
            {
                "label": "Spam risk",
                "value": "9/100",
                "tone": "good",
                "detail": "Lower is better. This blends spam indicators with false-positive protections for legitimate sites."
            },
            {
                "label": "Quality score",
                "value": "96/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": "0/100",
                "tone": "good",
                "detail": "Lower is better. This reflects the IP, registrar, and nameserver neighbourhood seen by the crawler."
            },
            {
                "label": "Evidence confidence",
                "value": "100/100",
                "tone": "good",
                "detail": "Higher means the crawler had enough pages and registry evidence to make a stronger call."
            },
            {
                "label": "External evidence",
                "value": "Low",
                "tone": "unknown",
                "detail": "Quality of the structured search and review evidence cluster."
            },
            {
                "label": "External decision",
                "value": "Inconclusive",
                "tone": "unknown",
                "detail": "How third-party evidence compares with the current candidate tag."
            },
            {
                "label": "NSFW score",
                "value": "0/100",
                "tone": "good",
                "detail": "Context-aware adult-content detection with medical / educational false-positive reduction."
            },
            {
                "label": "Registry stability",
                "value": "100/100",
                "tone": "good",
                "detail": "Based on age, expiry runway, and the amount of ownership / registrar churn."
            }
        ],
        "signal_sections": [
            {
                "title": "Registry & ownership",
                "items": [
                    {
                        "label": "Domain age",
                        "value": "—",
                        "tone": "unknown",
                        "detail": "Older domains generally carry more historical trust than very new ones."
                    },
                    {
                        "label": "Stability score",
                        "value": "100/100",
                        "tone": "good",
                        "detail": "Penalised by registrar, ownership, and nameserver churn."
                    },
                    {
                        "label": "Days to expiry",
                        "value": "—",
                        "tone": "unknown",
                        "detail": "Very short renewal windows can be a weak trust signal."
                    },
                    {
                        "label": "Registrar / ownership changes",
                        "value": "0 / 0",
                        "tone": "good",
                        "detail": "Frequent ownership churn can weaken trust."
                    },
                    {
                        "label": "Nameserver changes",
                        "value": "0",
                        "tone": "good",
                        "detail": "Repeated infrastructure changes can indicate instability."
                    },
                    {
                        "label": "DNSSEC / privacy",
                        "value": "DNSSEC off · privacy off",
                        "tone": "caution",
                        "detail": "DNSSEC strengthens DNS trust; privacy is neutral on its own."
                    }
                ]
            },
            {
                "title": "Reputation & search evidence",
                "items": [
                    {
                        "label": "Backlinks",
                        "value": "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": "80",
                        "tone": "caution",
                        "detail": "Search footprint helps distinguish real sites from thin shells."
                    },
                    {
                        "label": "Indexed pages",
                        "value": "2,478",
                        "tone": "good",
                        "detail": "Larger index coverage usually means more evidence to classify from."
                    },
                    {
                        "label": "Brand strength",
                        "value": "75/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 · 153 ms",
                        "tone": "good",
                        "detail": "Slow or broken technical signals weaken confidence."
                    },
                    {
                        "label": "Content words",
                        "value": "382",
                        "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": "26 internal · 3 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": "Structured third-party evidence is still too thin, mixed, or unqualified to force a harder verdict."
                    },
                    {
                        "label": "Evidence quality",
                        "value": "Low",
                        "tone": "unknown",
                        "detail": "Blends source trust, domain matching, evidence diversity, and freshness."
                    },
                    {
                        "label": "Support vs contradiction",
                        "value": "0 / 0",
                        "tone": "unknown",
                        "detail": "Compares how much structured external evidence supports the candidate tag against evidence that contradicts it."
                    },
                    {
                        "label": "Qualified risk sources",
                        "value": "No",
                        "tone": "good",
                        "detail": "Risk tags only promote from external evidence when source diversity or source trust thresholds are met."
                    },
                    {
                        "label": "Uncertainty buffer",
                        "value": "Clear",
                        "tone": "good",
                        "detail": "Prevents thin or mixed external evidence from forcing a stronger tag than the evidence can justify."
                    }
                ]
            }
        ],
        "positives": [
            "Low registrar / ownership churn with solid registry stability.",
            "Healthy crawl quality and on-page completeness.",
            "Search evidence is broad enough to classify with better confidence."
        ],
        "risks": []
    },
    "traffic_confidence": 54,
    "whois": {
        "current": {
            "id": 16632,
            "domain": "christiantietze.de",
            "source_type": "whois_text",
            "rdap_url": "",
            "registrar_name": "",
            "registrar_handle": "",
            "registrant_name": "",
            "registrant_org": "",
            "registrant_country": "",
            "registrant_email": "",
            "abuse_email": "",
            "created_date": null,
            "updated_date": null,
            "expires_date": null,
            "nameservers_json": "[]",
            "status_json": "[]",
            "dnssec": "unknown",
            "privacy_protected": 0,
            "content_hash": "f7e17c57c5fdd24df1793ece6bff99716369356b90b29c4725ac3ba12a76b72c",
            "history_count": 1,
            "last_checked_at": "2026-04-01 20:43:41",
            "last_changed_at": "2026-03-17 07:42:51",
            "created_at": "2026-03-17 07:42:51",
            "updated_at": "2026-04-01 20:43:41"
        },
        "history": [
            {
                "id": 16945,
                "domain": "christiantietze.de",
                "source_type": "whois_text",
                "registrar_name": "",
                "registrar_handle": "",
                "registrant_name": "",
                "registrant_org": "",
                "registrant_country": "",
                "registrant_email": "",
                "abuse_email": "",
                "created_date": null,
                "updated_date": null,
                "expires_date": null,
                "nameservers_json": "[]",
                "status_json": "[]",
                "dnssec": "unknown",
                "privacy_protected": 0,
                "content_hash": "f7e17c57c5fdd24df1793ece6bff99716369356b90b29c4725ac3ba12a76b72c",
                "checked_at": "2026-03-17 07:42:51",
                "change_summary": "Initial WHOIS snapshot captured.",
                "created_at": "2026-03-17 07:42:51"
            }
        ],
        "signals": {
            "age_years": 0,
            "days_to_expiry": null,
            "days_since_last_registry_update": null,
            "stability_score": 100,
            "registrar_changes": 0,
            "ownership_changes": 0,
            "nameserver_changes": 0,
            "status_changes": 0,
            "history_entries": 1,
            "privacy_protected": false,
            "dnssec_enabled": false,
            "has_registrant_country": false,
            "registrant_country": "",
            "nameserver_count": 0,
            "status_count": 0
        }
    },
    "discovered_domain": {
        "id": 80457,
        "domain": "christiantietze.de",
        "first_seen_at": "2026-03-15 20:24:33",
        "last_crawled_at": "2026-04-01 20:43:42",
        "last_title": "Welcome! • Christian Tietze",
        "last_http_status": 200,
        "discovered_from_domain": "personalsit.es",
        "depth": 0,
        "backlinks_count": 2,
        "rating_cache": 48,
        "spam_score": 24,
        "risk_label": "good",
        "category_name": "Developer Tools: Code Hosting",
        "primary_country_code": "DE",
        "internal_links_count": 26,
        "external_links_count": 3,
        "social_profiles_count": 1,
        "content_word_count": 382,
        "title_quality_score": 81,
        "has_meta_description": 1,
        "has_h1": 1,
        "language_code": "",
        "response_time_ms": 153,
        "robots_status": 200,
        "sitemap_status": 200,
        "sitemap_total_urls": 2478,
        "quality_score": 96,
        "site_name": "Christian Tietze",
        "canonical_domain": "",
        "favicon_present": 1,
        "schema_org_count": 0,
        "noindex_detected": 0,
        "feed_links_count": 1,
        "https_working": 1,
        "estimated_authority_score": 38,
        "trust_score": 60,
        "nsfw_score": 0,
        "overall_rank_estimate": 2021177,
        "primary_tag": "T",
        "tag_codes": "T",
        "manual_verified_status": "",
        "manual_tag_codes": "",
        "manual_rating_delta": 0,
        "manual_authority_delta": 0,
        "manual_trust_delta": 0,
        "manual_note": null,
        "manual_adjusted_by": null,
        "manual_adjusted_at": null,
        "manual_lock_scores": 0,
        "manual_lock_flags": 0,
        "crawl_blocked": 0,
        "crawl_blocked_by": "",
        "crawl_blocked_reason": null,
        "safety_score": 100,
        "fraud_score": 0,
        "legitimacy_score": 67,
        "infrastructure_risk_score": 0,
        "score_confidence": 100,
        "tag_confidence": 72,
        "category_confidence": 76,
        "deep_crawl_pages": 50,
        "resolved_ip": "83.223.95.12",
        "category_candidates_json": "[{\"category\":\"Developer Tools: Code Hosting\",\"score\":67},{\"category\":\"Personal: Personal Sites & Homepages\",\"score\":39},{\"category\":\"Business: Corporate & Professional Services\",\"score\":22},{\"category\":\"Personal: Blogs & Journals\",\"score\":22}]",
        "page_signals_json": "[{\"path\":\"/about\",\"status\":200,\"title\":\"Legal Information • Christian Tietze\",\"word_count\":1440,\"summary_text\":\"Legal Information • Christian Tietze Legal Information • Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Legal Information Table of Contents Disclaimer Accountability for content Accountability for links My App’s Privacy Policies Data from Purchases App Crash Log Privacy WordCounter Privacy Tracking, Cookies, and 3rd Parties Tracking of website hits Server logs Amazon affiliate-links External content I’m responsible for the contents of christiantietze.de, tableflipapp.com, wordcounterapp.com, and calendarpasteapp.com. In accordance with German laws like §5 Telemediengesetz and §55 Abs. 2 RStV, here’s my contact data: Christian Tietze Dostalstr. 18 D-33647 Bielefeld +49 177 6467763 My VAT identification number: DE287457787. Disclaimer Accountability for content The contents of our pages have been\",\"classification_terms\":[\"about\",\"contact\",\"privacy\",\"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\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":5,\"depth\":1},{\"path\":\"/contact\",\"status\":200,\"title\":\"Contact and About Me • Christian Tietze\",\"word_count\":242,\"summary_text\":\"Contact and About Me • Christian Tietze Contact and About Me &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact About Me Hi, I’m Christian, and I like to make things with the attitude of a craftsman. The things I focus on: I am an indie app developer for macOS and iOS with a high standard for clean code. And I write about writing software – on this blog, and in books. And I write about writing, under the label of the Zettelkasten Method. Not the least because of Apple’s frequent platform upgrades, I think code needs to be maintainable to be good code. It’s a must, really. My personal mission is to spread knowledge about clean coding practices in the community and help developers write beautiful and maintainable code. You can work with me if you need hands-on help with your project or when you n\",\"classification_terms\":[\"contact\",\"about\",\"about me\",\"help\",\"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\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/\",\"status\":200,\"title\":\"Blog and Article Index • Christian Tietze\",\"word_count\":13032,\"summary_text\":\"Blog and Article Index • Christian Tietze Blog and Article Index &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Blog and Article Index Structured Overview: Commented table of contents of what I think are my most important articles. TextKit: I deal with text, and here's a collection of everything I figured out so far. Ultimate FastSpring Guide for Selling macOS Apps: I sell my macOS apps in my own store. Resources and tips to get you started. Tag Index Posts by year: 2026 &middot; 2025 &middot; 2024 &middot; 2023 &middot; 2022 &middot; 2021 &middot; 2020 &middot; 2019 &middot; 2018 &middot; 2017 &middot; 2016 &middot; 2015 &middot; 2014 &middot; 2013 &middot; 2012 &middot; 2011 &middot; 2010 2026 March 2026 Mar&nbsp;30 Emacs Mistakes and Misconceptions That Held Me Back in 2019 When I started\",\"classification_terms\":[\"posts\",\"contact\",\"blog\",\"store\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":1},{\"path\":\"/writing/\",\"status\":200,\"title\":\"Writing • Christian Tietze\",\"word_count\":406,\"summary_text\":\"Writing • Christian Tietze Writing &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Writing Part of my life’s work is dedicated on how to become a good coder and independent software developer. My approach is holistic: to be successful, it’s not enough to know how to code. That’s why I write about the life of an independent software developer, not just the day-to-day work. Introduction to my most important articles. Wiki with important concepts. All About TextKit: I deal with text, and here’s a collection of everything I figured out so far. Ultimate FastSpring Guide for Selling macOS Apps: I sell my macOS apps in my own store. Resources and tips to get you started. Latest Blog Posts Mar&nbsp;30&nbsp;2026 Emacs Mistakes and Misconceptions That Held Me Back in 2019 When I started t\",\"classification_terms\":[\"writing\",\"about\",\"contact\",\"blog\",\"store\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/software/\",\"status\":200,\"title\":\"Apps • Christian Tietze\",\"word_count\":487,\"summary_text\":\"Apps • Christian Tietze Apps &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Productivity Applications My focus is to make the job of writers easier. The ultimate goal is to create a contraption I call the Gelehrtenmaschine, a proverbial scholar’s engine. So most of my projects revolve around writing. These are apps I designed, developed, and published myself. Please refer to the product detail pages if you want to know more. My macOS apps are all ready for macOS 13 Ventura. Head to the Shop macOS Apps The Archive The Archive is a macOS note-taking app for prolific writers. Its clean interface and fast search help you take notes that are meant to last a lifetime: the app stores everything as plain text and avoids everything that does not serve the user's long-term interest. U\",\"classification_terms\":[\"software\",\"contact\",\"help\",\"blog\",\"store\",\"shop\"],\"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\":[\"cloudfront.net\",\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/hire-me/\",\"status\":200,\"title\":\"Senior Software Engineer & Technical Educator • Christian Tietze\",\"word_count\":274,\"summary_text\":\"Senior Software Engineer & Technical Educator • Christian Tietze Senior Software Engineer & Technical Educator &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Work With Me I’m a senior software engineer specializing in iOS and macOS development with over 10 years of professional experience. I’m passionate about building quality software, sharing knowledge through teaching, and helping teams level up their skills. Check out my full résumé and project history to see what I’ve built over the years. Looking for a Senior/Principal Engineer? Open to employment opportunities as an individual contributor or technical lead. I bring deep expertise in Swift, iOS/macOS architecture, and building maintainable systems. I also enjoy mentoring junior developers and fostering team growth through knowledge sharing. Learn more about w\",\"classification_terms\":[\"hire-me\",\"about\",\"contact\",\"help\",\"blog\",\"shop\"],\"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\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/contact/\",\"status\":200,\"title\":\"Contact and About Me • Christian Tietze\",\"word_count\":242,\"summary_text\":\"Contact and About Me • Christian Tietze Contact and About Me &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact About Me Hi, I’m Christian, and I like to make things with the attitude of a craftsman. The things I focus on: I am an indie app developer for macOS and iOS with a high standard for clean code. And I write about writing software – on this blog, and in books. And I write about writing, under the label of the Zettelkasten Method. Not the least because of Apple’s frequent platform upgrades, I think code needs to be maintainable to be good code. It’s a must, really. My personal mission is to spread knowledge about clean coding practices in the community and help developers write beautiful and maintainable code. You can work with me if you need hands-on help with your project or when you n\",\"classification_terms\":[\"contact\",\"about\",\"about me\",\"help\",\"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\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/now/\",\"status\":200,\"title\":\"What I am Doing Now • Christian Tietze\",\"word_count\":232,\"summary_text\":\"What I am Doing Now • Christian Tietze What I am Doing Now &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact What I Am Doing Now Working on text editors a Shiny Frog. Secrety secret. At SHIFT to AI and especially KI Beratung Bielefeld (German) I’m bootstrapping a local consulting service to teach about agentic engineering practices without the fluff and BS. We’re buying a house! That’s terrifying. Will be a home for our family of 3 plus my widowed mother. Continuously working on Pattern Language of Zettelkasten. A book project to form a shared language (of patterns) so that enthusiasts and experts have an efficient way to communicate. For The Archive v2, a modernized and minimal note-taking experience, I’m reworking the architecture and wiring of all components of the text editor and note man\",\"classification_terms\":[\"now\",\"about\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/cv/\",\"status\":200,\"title\":\"Curriculum Vitae • Christian Tietze\",\"word_count\":1543,\"summary_text\":\"Curriculum Vitae • Christian Tietze Curriculum Vitae &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Christian Tietze – Software Developer Table of Contents Professional Summary Contact Information Technical Skills Professional Experience Notable Projects &amp; Products Publications Conference Talks &amp; Workshops Open Source Additional Experience Education Professional Summary Creative macOS/iOS developer with a strong focus on user experience and clean architecture. Driven by a passion for accessibility and performance, I have published six successful apps and authored three technical books and 922 blog posts. I help developers world-wide to realize their app ideas with a deep understand for the technologies. Contact Information Location: Bielefeld, Germany GitHub: github.com/DivineDo\",\"classification_terms\":[\"cv\",\"contact\",\"help\",\"blog\",\"shop\"],\"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\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":7,\"depth\":1},{\"path\":\"/posts/overview/\",\"status\":200,\"title\":\"Article Overview • Christian Tietze\",\"word_count\":919,\"summary_text\":\"Article Overview • Christian Tietze Article Overview &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Article Overview Table of Contents Software Architecture Structure: Architectural Patterns Process: Information Flow Day-to-Day Coding Programming Principles Design Patterns Solopreneurship and Indie Development Behind the Scenes The Archive TableFlip General Things About Programming and Stuff Software Architecture I tend to think about two parts of the architecture that depend on each other: “structure” and “process”. The former is about statical snapshots and most patterns; the latter is about the design of information flow, control flow, and message passing. When You Code, You Design Both Structure and Information Flow sums this up. Try to draw more diagrams! Structure: Architectural P\",\"classification_terms\":[\"posts/overview\",\"about\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/wiki/\",\"status\":200,\"title\":\"Wiki Overview • Christian Tietze\",\"word_count\":202,\"summary_text\":\"Wiki Overview • Christian Tietze Wiki Overview &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Wiki Overview This is a curated list of entry points I find useful: Patterns, on code level and architecture level: MVC and MVVM. Higher-level analysis of code: cohesion and coupling. In the Stream and the Garden metaphor, my website both has timeline-like content (“stream”) in the blog section, and stuff here that’s meant to be ever-changing but a reliable reference (“garden”). I don’t keep up a distinction between them when it comes to linking back and forth. The blog has self-contained articles, too, that are reference pieces I’ll likely not mess with as much as I modify the wiki pages. All Wiki Pages Aggregate Root Bounded Context Cohesion Coupling Domain-Driven Design Don't Repeat Yours\",\"classification_terms\":[\"wiki\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/ploz/\",\"status\":200,\"title\":\"Pattern Language of Zettelkasten • Christian Tietze\",\"word_count\":377,\"summary_text\":\"Pattern Language of Zettelkasten • Christian Tietze Pattern Language of Zettelkasten &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Pattern Language of Zettelkasten A pattern language is a shared language so that enthusiasts and experts have an efficient way to communicate. It’s a way to think and talk about the problem at hand; here: of creating an effective tool for thought. The following section go from large to small, from wide to narrow, from overview to detail. They are not meant to be read in that exact order for a cohesive story. The story is to emerge in you, the reader, as you browse the patterns, enter something that piques your interest, and find your own path. Zettelkästen This part is about the Zettelkasten, not the note, like a book on architecture will talk about cities and towns before\",\"classification_terms\":[\"ploz\",\"about\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/textkit/\",\"status\":200,\"title\":\"TextKit Overview • Christian Tietze\",\"word_count\":616,\"summary_text\":\"TextKit Overview • Christian Tietze TextKit Overview • Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact TextKit Overview TextKit goes back to the NeXT era, before Mac OS X was a thing. After the relatively new Cocoa frameworks for Mac app programming were introduced and introduced the “Cocoa Text System” title, iOS and UIKit stuck with “TextKit”, and in 2021 TextKit 2 returned. This revolves around everything related to accepting textual user input on the Mac: NSTextView for the UI component, NSTextStorage for the processing of text and style changes, NSLayoutManager for the computation of line and glyph sizes, and for applying styles, NSTypesetter for putting glyphs on the screen. Even NSTextFields are just reusing a shared NSTextView, called the window’s field editor. It’s everywhere. TextKit\",\"classification_terms\":[\"textkit\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/fastspring/\",\"status\":200,\"title\":\"How to Distribute Your App With FastSpring • Christian Tietze\",\"word_count\":1904,\"summary_text\":\"How to Distribute Your App With FastSpring • Christian Tietze How to Distribute Your App With FastSpring • Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Why &amp; How to Distribute Your App Outside the Mac App Store TL;DR: Set up a store to distribute your macOS applications outside of the Mac App Store for increased revenue and flexibility. I recommend FastSpring for this. Keep reading for a quick rundown of reasons and how-to's so you can avoid common pitfalls. The articles and book I wrote will help you implement the pieces so you can make more money and let your business thrive. Table of Contents You’re not alone Consider the App Store’s pros and cons Sell your products with FastSpring A FastSpring Guide: Sell licenses and integrate verification in your app in a day Free Code: How to protect your app with license\",\"classification_terms\":[\"fastspring\",\"contact\",\"help\",\"blog\",\"store\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":1,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2026/03/emacs-mistakes-and-misconceptions-that-held-me-back-in-2018/\",\"status\":200,\"title\":\"Emacs Mistakes and Misconceptions That Held Me Back in 2019 • Christian Tietze\",\"word_count\":627,\"summary_text\":\"Emacs Mistakes and Misconceptions That Held Me Back in 2019 • Christian Tietze Emacs Mistakes and Misconceptions That Held Me Back in 2019 &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Emacs Mistakes and Misconceptions That Held Me Back in 2019 Mar 30th, 2026 It took me a decade to try Emacs again, for reasons totally unrelated to computer programming (task management!), and a lot of effort by my pal Sascha Fast. In hindsight, I realize I had to learn a couple of things first. This is my contribution to Emacs Carnival March 2026: Mistakes and Misconceptions, hosted by Philip Kaluđerčić. Emacs is clumsy and old. I didn’t know that a GUI Emacs version existed, could display images and scroll somewhat smoothly, coming from an IT department with SUN terminals where we used Emacs on the command-line to edit some .c source files. By\",\"classification_terms\":[\"posts/2026/03/emacs-mistakes-and-misconceptions-that-held-me-back-in-2018\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":1,\"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\":[\"fastcomments.com\",\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2026/03/peloton-for-the-mind/\",\"status\":200,\"title\":\"Peloton for the Mind • Christian Tietze\",\"word_count\":276,\"summary_text\":\"Peloton for the Mind • Christian Tietze Peloton for the Mind &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Peloton for the Mind Mar 26th, 2026 What if “bicycle for the mind” never meant that it’s a way to speed up, but a way to exercise? Since in 2026 nobody uses bikes to exercise anymore, the more understandable metaphor would be “a Peloton for the mind,” an ergometer to get your mind-muscles into motion at all before they atrophy. Then the goal is not to be quick, to get stuff done – at least not for you, personally, – but to learn and do something interesting. The old-skool Hacker ethos. The vibe you still have in niche communities of embedded system tinkerers, of fantasy console game makers, of 6502 assembly fans, etc. etc. There’s infinite ways to have fun and learn with a computer. A\",\"classification_terms\":[\"posts/2026/03/peloton-for-the-mind\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":1,\"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\":[\"fastcomments.com\",\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2026/03/does-bad-code-in-your-context-window-misalign-llm-recommendations/\",\"status\":200,\"title\":\"Does Bad Code in Your Context Window Misalign LLM Recommendations? • Christian Tietze\",\"word_count\":431,\"summary_text\":\"Does Bad Code in Your Context Window Misalign LLM Recommendations? • Christian Tietze Does Bad Code in Your Context Window Misalign LLM Recommendations? &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Does Bad Code in Your Context Window Misalign LLM Recommendations? Mar 20th, 2026 Put away your Betteridge’s Law of Headlines, I genuinely don’t know the answer :) In “Training large language models on narrow tasks can lead to broad misalignment”, Betley et al found that fine-tuning LLM’s with e.g. insecure coding practices can affect the outcome of non-coding related answers in a bad way. Train on shitty code, get health advice that kills you, basically. In principle, the context window of your favore LLM is affecting any follow-up interactions. It’s not the same as affecting the model’s weights through the intensive process of fine-tunin\",\"classification_terms\":[\"posts/2026/03/does-bad-code-in-your-context-window-misalign-llm-recommendations\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":1,\"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\":[\"fastcomments.com\",\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2026/03/pi-coding-agent-git-commit-identify-the-model-audit-trail/\",\"status\":200,\"title\":\"Make the pi Coding Agent Identify the Model in Commits • Christian Tietze\",\"word_count\":782,\"summary_text\":\"Make the pi Coding Agent Identify the Model in Commits • Christian Tietze Make the pi Coding Agent Identify the Model in Commits • Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Make the pi Coding Agent Identify the Model in Commits Mar 17th, 2026 In November, I posted how to make Claude Code mark itself as the author of git commits. You can do the same with OpenAI Codex. If you’re a real 20X agentic engineer, you’re probably using the pi coding agent, which can use many different model providers and models. Here’s how to make the git commit audit trail work with pi, too. (Reach out if you want help with agentic engineering.) The funny thing about pi is that it’s somewhat self-aware of its documentation and source code – Mario Zechner pointed out I should “ask pi” to override the bash tool instead of creating a new environment set\",\"classification_terms\":[\"posts/2026/03/pi-coding-agent-git-commit-identify-the-model-audit-trail\",\"about\",\"contact\",\"help\",\"blog\",\"source code\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":1,\"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\":[\"fastcomments.com\",\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":2,\"depth\":1},{\"path\":\"/posts/2026/03/identify-codex-cli-git-commits-for-audit-trail/\",\"status\":200,\"title\":\"Identify Codex CLI Git Commits for an Audit Trail • Christian Tietze\",\"word_count\":410,\"summary_text\":\"Identify Codex CLI Git Commits for an Audit Trail • Christian Tietze Identify Codex CLI Git Commits for an Audit Trail • Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Identify Codex CLI Git Commits for an Audit Trail Mar 17th, 2026 Agentic engineering practices changed from “you should commit everything yourself” to giving the agentic tools more autonomy for example in order to try out different things to implement a change. Small git commits are part of that toolset. Here’s how to teach Codex CLI to self-identify as the git author. Turns out that my Claude Code environment settings to make Claude identify itself as the git commit author are useful for audit trails – especially with the upcoming EU AI Act in August 2026, enabling agents to self-identify can be useful for engineering teams that tell their agents to create sma\",\"classification_terms\":[\"posts/2026/03/identify-codex-cli-git-commits-for-audit-trail\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":1,\"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\":[\"fastcomments.com\",\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2026/03/freebsdkit-swift-package-write-capability-aware-freebsd-apps/\",\"status\":200,\"title\":\"FreeBSDKit: Swift Package to Write Capability-Aware FreeBSD Apps • Christian Tietze\",\"word_count\":314,\"summary_text\":\"FreeBSDKit: Swift Package to Write Capability-Aware FreeBSD Apps • Christian Tietze FreeBSDKit: Swift Package to Write Capability-Aware FreeBSD Apps • Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact FreeBSDKit: Swift Package to Write Capability-Aware FreeBSD Apps Mar 11th, 2026 Shout-out to FreeBSDKit: FreeBSDKit provides idiomatic Swift, C and C++ interfaces to FreeBSD’s unique system features including Capsicum sandboxing, jails, process descriptors, kqueue-based signal handling, and inter-process communication with descriptor passing. The framework embraces move-only semantics (~Copyable) to model resource ownership explicitly in the type system. “FreeBSD” hooked me, “move-only semantics” got me interested, “jail” made me read the README. I only know about FreeBSD’s features from Oliver Epper, but everytime he talk about it, I want to pla\",\"classification_terms\":[\"posts/2026/03/freebsdkit-swift-package-write-capability-aware-freebsd-apps\",\"about\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":1,\"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\":[\"fastcomments.com\",\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2026/03/zettelkasten-productivity-books-written-per-books-ingested/\",\"status\":200,\"title\":\"Zettelkasten Productivity: Books Written per Books Ingested • Christian Tietze\",\"word_count\":438,\"summary_text\":\"Zettelkasten Productivity: Books Written per Books Ingested • Christian Tietze Zettelkasten Productivity: Books Written per Books Ingested &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Zettelkasten Productivity: Books Written per Books Ingested Mar 7th, 2026 Over on the Zettelkasten forums, Edmund Gröpl, in a post: “On Zettelkasten Productivity”, proposes to reframe the “how many books have I written” lifetime achievement number as “how many books have grown out of what I read”, showing how small the ‘tip’ of our productivity is compared to the huge foundation of what we read. A writer who publishes one substantial book for every hundred they read is not inefficient; they are distilling, selecting, and discarding far more than they keep. This flips a common obsession with productivity: instead of asking “How many books have I w\",\"classification_terms\":[\"posts/2026/03/zettelkasten-productivity-books-written-per-books-ingested\",\"contact\",\"forum\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":1,\"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\":[\"fastcomments.com\",\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/newsletter/\",\"status\":200,\"title\":\"Newsletter • Christian Tietze\",\"word_count\":155,\"summary_text\":\"Newsletter • Christian Tietze Newsletter &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Receive New Content via Email Occasional posts on macOS development, Emacs, workflows, and tools that think with you. I send emails to the whole list virtually never, like once or twice per year max. ✦ Stay in the loop Email * First name What to receive Blog post summaries every Thursday Emacs, workflows, macOS dev Product announcements and app updates The Archive, WordCounter, etc. Art and Urban Sketching posts Watercolors, ink, plein air I agree to receive occasional emails. You can unsubscribe anytime. See the privacy policy for how your data is handled. HP Contact &bull; Newsletter &bull; Blog Feed &bull; /feeds &bull; /now &bull; /uses &bull; @ctietze@mastodon.social &bull; Privacy &amp; L\",\"classification_terms\":[\"newsletter\",\"contact\",\"privacy\",\"news\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":1,\"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\":[\"google.com\",\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/feeds\",\"status\":200,\"title\":\"Feeds • Christian Tietze\",\"word_count\":151,\"summary_text\":\"Feeds • Christian Tietze Feeds &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Feeds RSS-reader compatible Atom feed for the whole website RSS-reader compatible Atom feed for #emacs RSS-reader compatible Atom feed for my Zettelkasten.de posts RSS feed of my Mastodon account To me, Atom sounded like the more expressive format 10 years ago, so I went with that. But for better or worse, I believe that RSS is more popular. Will fix this in the future. Updated Jan 31st, 2024. This page collects content I'm producing in some way or the other, and is consumable with RSS. Learn more about the idea. Contact &bull; Newsletter &bull; Blog Feed &bull; /feeds &bull; /now &bull; /uses &bull; @ctietze@mastodon.social &bull; Privacy &amp; Legal Information Except where otherwise noted, conten\",\"classification_terms\":[\"feeds\",\"about\",\"contact\",\"privacy\",\"news\",\"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\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/now\",\"status\":200,\"title\":\"What I am Doing Now • Christian Tietze\",\"word_count\":232,\"summary_text\":\"What I am Doing Now • Christian Tietze What I am Doing Now &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact What I Am Doing Now Working on text editors a Shiny Frog. Secrety secret. At SHIFT to AI and especially KI Beratung Bielefeld (German) I’m bootstrapping a local consulting service to teach about agentic engineering practices without the fluff and BS. We’re buying a house! That’s terrifying. Will be a home for our family of 3 plus my widowed mother. Continuously working on Pattern Language of Zettelkasten. A book project to form a shared language (of patterns) so that enthusiasts and experts have an efficient way to communicate. For The Archive v2, a modernized and minimal note-taking experience, I’m reworking the architecture and wiring of all components of the text editor and note man\",\"classification_terms\":[\"now\",\"about\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/uses\",\"status\":200,\"title\":\"Tools I Use • Christian Tietze\",\"word_count\":1207,\"summary_text\":\"Tools I Use • Christian Tietze Tools I Use • Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Uses: Tools I Use Table of Contents Art Equipment Work Desk and Computer Hardware Mobile Tools Home ServerSelf-hosting at home Software Work: Programming Work: Writing and Editing, Zettelkasten Productivity, Organization, GTD Video, Audio, Graphics All the Rest Web tech stack Art Equipment Since I got the Micro palette, I’m using it 90% of the time to learn to mix interesting hues from a few core colors. Palette Portable Painter Classic Colors (Classic)   Palette Portable Painter Micro Colors (Micro) Azo yellow, permanent alizarin chrimson, yellow ochre, ultramarin, phtalo blue, burnt sienna Brushes Ridiculously thick, that’s the best brush :) Watercolor Sketchbook Fabriano paper Work Desk and Comp\",\"classification_terms\":[\"uses\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/legal-info-privacy/\",\"status\":200,\"title\":\"Legal Information • Christian Tietze\",\"word_count\":1440,\"summary_text\":\"Legal Information • Christian Tietze Legal Information • Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Legal Information Table of Contents Disclaimer Accountability for content Accountability for links My App’s Privacy Policies Data from Purchases App Crash Log Privacy WordCounter Privacy Tracking, Cookies, and 3rd Parties Tracking of website hits Server logs Amazon affiliate-links External content I’m responsible for the contents of christiantietze.de, tableflipapp.com, wordcounterapp.com, and calendarpasteapp.com. In accordance with German laws like §5 Telemediengesetz and §55 Abs. 2 RStV, here’s my contact data: Christian Tietze Dostalstr. 18 D-33647 Bielefeld +49 177 6467763 My VAT identification number: DE287457787. Disclaimer Accountability for content The contents of our pages have been\",\"classification_terms\":[\"legal-info-privacy\",\"contact\",\"privacy\",\"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\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":5,\"depth\":1},{\"path\":\"/posts/2014/03/need-to-craft/\",\"status\":200,\"title\":\"The Need to Craft • Christian Tietze\",\"word_count\":1360,\"summary_text\":\"The Need to Craft • Christian Tietze The Need to Craft &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact The Need to Craft Mar 20th, 2014 My last posts were rather prescriptive by nature. Before I start sprinkling in the casual software reviews, I want to slow down a bit and change the pace. Lately, I wondered why I do things. My answer is pretty plain, and I’d like to know what drives you to worry about organizing information. So I’ll begin to share, and then you may, if you like. So here is how I discovered the use of a Zettelkasten and why I write at all. Photo Credit: supersum (off) via Compfight cc I’m a creator. I like to build things. I’m not an artist and I don’t want to express myself. I’m interested in craft. For me, that’s programming, writing, and drawing. To be able to build th\",\"classification_terms\":[\"posts/2014/03/need-to-craft\",\"about\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":1,\"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\":[\"fastcomments.com\",\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":2},{\"path\":\"/publications/\",\"status\":200,\"title\":\"Publications • Christian Tietze\",\"word_count\":324,\"summary_text\":\"Publications • Christian Tietze Publications &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Theory and Practice of Independent Software Development Part of my life’s work is dedicated to publishing articles and book on how to become a good coder and independent software developer. It’ll probably take until 2030 until I have it nailed down, but here’s what I’ve got so far. My approach is holistic: to be successful, it’s not enough to know how to code. You need to be able to survive periods of despair and get by with little money. You need to figure out how to do marketing properly – that is, how to reach people, and how to maintain personal integrity while you do so. That’s why I’ll write about the life of being an independent software developer in addition to the day-to-day work. Sh\",\"classification_terms\":[\"publications\",\"about\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"cloudfront.net\",\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":2},{\"path\":\"/posts/tags/\",\"status\":200,\"title\":\"Tag Index • Christian Tietze\",\"word_count\":676,\"summary_text\":\"Tag Index • Christian Tietze Tag Index &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact 1buttonplayer 1df A accessibility actor adapter ads aggregate-root agile ai ajax ama amazon analytics android animation announcement announcements antifragile api app appkit applescript appstore archive art ascii async asynchrony attention audit authentication auto-layout autolayout automation automator avfoundation aws B babel backlink behavior beta bigsur binding block book bootstrapping boox bounded-context bug builder bundle burkeman2024medi business C c calendarpasteapp carnival carthage challenge change chatgpt clang claude-code clean clean-code cli client closure cloudflare cloudfront cocoa cocoafob cocoapods codable coderetreat codesigning codex coffee cohesion collect collision combine\",\"classification_terms\":[\"posts/tags\",\"contact\",\"cart\",\"api\",\"blog\",\"store\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":2},{\"path\":\"/posts/2026/\",\"status\":200,\"title\":\"Posts from 2026 • Christian Tietze\",\"word_count\":2647,\"summary_text\":\"Posts from 2026 • Christian Tietze Posts from 2026 &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Emacs Mistakes and Misconceptions That Held Me Back in&nbsp;2019 Mar 30th, 2026 It took me a decade to try Emacs again, for reasons totally unrelated to computer programming (task management!), and a lot of effort by my pal Sascha Fast. In hindsight, I realize I had to learn a couple of things first. This is my contribution to Emacs Carnival March 2026: Mistakes and Misconceptions, hosted by Philip&nbsp;Kaluđerčić. Continue reading&nbsp;&hellip; &infin;&nbsp;Permalink &bull; Comments &bull; Tags: emacs Peloton for the&nbsp;Mind Mar 26th, 2026 What if “bicycle for the mind” never meant that it’s a way to speed up, but a way to exercise? Since in 2026 nobody uses bikes to exercise anymore, t\",\"classification_terms\":[\"posts/2026\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":1,\"depth\":2},{\"path\":\"/posts/2025/\",\"status\":200,\"title\":\"Posts from 2025 • Christian Tietze\",\"word_count\":5357,\"summary_text\":\"Posts from 2025 • Christian Tietze Posts from 2025 &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact How a (Wooden) Wood Plane Planes&nbsp;Wood Dec 13th, 2025 This may come as a surprise if you haven’t noticed my Mastodon posts about woodworking here and there in the past 2 years, but I’ve picked up hand-planing wood to the delight of our toddler – the shaving are just too fun to play with. There’s this weird old (German) silent movie with high magnification that shows how a plane creates these shavings I want to share because that kind of stuff just isn’t filmed anymore, it&nbsp;seems: Continue reading&nbsp;&hellip; &infin;&nbsp;Permalink &bull; Comments &bull; Tags: software-craftsmanship woodworking Join the All-Virtual EmacsConf December 6 and 7 and Check out My Zettelkasten&nbsp;Talk\",\"classification_terms\":[\"posts/2025\",\"about\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":9,\"depth\":2},{\"path\":\"/posts/2024/\",\"status\":200,\"title\":\"Posts from 2024 • Christian Tietze\",\"word_count\":6765,\"summary_text\":\"Posts from 2024 • Christian Tietze Posts from 2024 &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Apple Music App: Android APK Direct&nbsp;Download Dec 9th, 2024 Long story short, music.apple.com will look very good in a web browser on Android, but (with German location anyway) it will only ever play song previews, never full songs, no matter how hard I log out and back in again. The only download advertised on the website is the Play Store,&nbsp;though. Continue reading&nbsp;&hellip; &infin;&nbsp;Permalink &bull; Comments &bull; Tags: grapheneos android music Gus Continues to Work on&nbsp;Acorn Dec 4th, 2024 Flying Meat’s Gus Mueller on the life of an independent developer in reaction to Apple acquiring Pixelmator: But today I woke up, and got to work on Acorn. And I’ll do the same to\",\"classification_terms\":[\"posts/2024\",\"contact\",\"blog\",\"store\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":2,\"depth\":2},{\"path\":\"/posts/2023/\",\"status\":200,\"title\":\"Posts from 2023 • Christian Tietze\",\"word_count\":4879,\"summary_text\":\"Posts from 2023 • Christian Tietze Posts from 2023 &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Show Organic Traffic in TelemetryDeck the Simple Way with a Values Breakdown&nbsp;Insight Dec 21st, 2023 Last time, I shared how to use the TQL Insight in TelemetryDeck to see organic traffic sources. Today, I want to share with you a much, much simpler approach to use TelemetryDeck to analyze website traffic without the need for the TelemetryDeck Query&nbsp;Language. Continue reading&nbsp;&hellip; &infin;&nbsp;Permalink &bull; Comments &bull; Tags: telemetrydeck analytics telemetry Using Type Markers for &#8216;is&#8217; Type Predicates to Cover Generic&nbsp;Types Dec 20th, 2023 Maybe you have some old code (you wouldn’t write this nowadays, of course) that uses someValue is SomeType chec\",\"classification_terms\":[\"posts/2023\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":2},{\"path\":\"/posts/2022/\",\"status\":200,\"title\":\"Posts from 2022 • Christian Tietze\",\"word_count\":6209,\"summary_text\":\"Posts from 2022 • Christian Tietze Posts from 2022 &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact How to Use SF Symbols in Emacs (for Tab&nbsp;Numbers) Dec 29th, 2022 Early this year, I shared my setup to get tab numbers in the form of Unicode characters like “⓪”. This week, I reduced the font size in the tab bar to 80% of the main font and make the tab bar stand out less in general. The numbers in circled didn’t look so great then anymore, and the baseline looked&nbsp;off. Continue reading&nbsp;&hellip; &infin;&nbsp;Permalink &bull; Comments &bull; Tags: emacs tabbing Better org-mode Agenda display-buffer-alist&nbsp;Settings Dec 27th, 2022 In the previous post I showed some settings to manage a tab dedicated to Org Agenda and its related org files. I also mentioned that I didn’t like\",\"classification_terms\":[\"posts/2022\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":3,\"depth\":2},{\"path\":\"/posts/2021/\",\"status\":200,\"title\":\"Posts from 2021 • Christian Tietze\",\"word_count\":4573,\"summary_text\":\"Posts from 2021 • Christian Tietze Posts from 2021 &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Remote Bulk Editing Using Regexp with&nbsp;Emacs Dec 29th, 2021 A couple of days ago, I did maybe the weirdest and also most amazing thing on a remote machine thus far (with Emacs) and wanted to share the story. So there’s this EmulationStation software that organizes roms with XML lists for metadata. I needed to change the &lt;name&gt; field of about 100 entries there to drop a numeric prefix. That’d be easy on my local computer with tools I know well, but I was accessing the device remotely via SSH and wanted to see what I could&nbsp;do. Continue reading&nbsp;&hellip; &infin;&nbsp;Permalink &bull; Comments &bull; Tags: emacs ssh regex SwiftUI Requires Platform Knowledge On Top. Case Stud\",\"classification_terms\":[\"posts/2021\",\"about\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":4,\"depth\":2},{\"path\":\"/posts/2020/\",\"status\":200,\"title\":\"Posts from 2020 • Christian Tietze\",\"word_count\":7137,\"summary_text\":\"Posts from 2020 • Christian Tietze Posts from 2020 &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Protesilaos Stavrou: Commend on Unix versus&nbsp;Emacs Dec 29th, 2020 In this post, Protesilaos answers an email by one of his readers. In the email, the sender seems to assume that Emacs is bloated by definition, and that e.g. Vim isn’t, because it comes with less stuff baked-in and works well with piping – the core way to compose in *nix command&nbsp;lines. The sender&nbsp;asks: This video [of Luke] really provide some good reasons why to invest on ‘coreutils’ to build a small, maintainable and decentralized system rather than investing on a giant mutable&nbsp;system. Emacs being the giant, mutable system, and the pipe-able Unix command-line tools comprising the “maintainable and decentr\",\"classification_terms\":[\"posts/2020\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":2,\"depth\":2},{\"path\":\"/posts/2019/\",\"status\":200,\"title\":\"Posts from 2019 • Christian Tietze\",\"word_count\":11929,\"summary_text\":\"Posts from 2019 • Christian Tietze Posts from 2019 &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact SwiftRex - Redux for Swift with Reactive&nbsp;Capabilities Dec 29th, 2019 The SwiftRex project is similar to ReSwift in design: it’s a library to design applications with a unidirectional data flow underpinning. In contrast to ReSwift, which is around for years and years already, SwiftRex has had a fresh start and supports Combine, RxSwift, and ReactiveSwift to create state change subscriptions. That’s a nice touch. I’ll have to experiment with the library some day, but so far it looks nice and the README is full of sexy ASCII&nbsp;diagrams. &infin;&nbsp;Permalink &bull; Comments &bull; Tags: 1df swiftrex reswift Facilitate Non-Artists to&nbsp;Sketch Dec 29th, 2019 At my work at university\",\"classification_terms\":[\"posts/2019\",\"contact\",\"support\",\"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\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":1,\"depth\":2},{\"path\":\"/posts/2018/\",\"status\":200,\"title\":\"Posts from 2018 • Christian Tietze\",\"word_count\":4379,\"summary_text\":\"Posts from 2018 • Christian Tietze Posts from 2018 &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact WordCounter v1.4.0 Released with Mojave in&nbsp;Mind Dec 10th, 2018 I just published an update to the WordCounter for Mac that modernizes the UI and typography a bit to look rad on Mojave in both dark and light modes. It also fixes pertinent issues with “Launch at Login” not doing what it’s supposed to do, and fixes a couple of small&nbsp;bugs. Continue reading&nbsp;&hellip; &infin;&nbsp;Permalink &bull; Comments &bull; Tags: wordcounterapp Find Swift Classes from Objective-C&nbsp;Tests Nov 29th, 2018 When you write a Swift type, you should prefer to write its tests in Swift, too. In a mixed-language code base, you will run into the situation where your Objective-C tests need to reference\",\"classification_terms\":[\"posts/2018\",\"contact\",\"login\",\"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\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":2,\"depth\":2},{\"path\":\"/posts/2017/\",\"status\":200,\"title\":\"Posts from 2017 • Christian Tietze\",\"word_count\":6444,\"summary_text\":\"Posts from 2017 • Christian Tietze Posts from 2017 &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Exposing the MultiMarkdown 6 Library to Swift, Part 1: Swifty&nbsp;Enums Dec 27th, 2017 During the time between Christmas and New Year, which we tend to call the time “between the years” where I live in Germany, I wanted to do something fun, but not too fun so I don’t get spoiled. That’s how I turned up experimenting to use libMultiMarkdown from within a Swift app. The amount of fun I have when reading and writing C code is negligible, which made it a perfect&nbsp;fit. Continue reading&nbsp;&hellip; &infin;&nbsp;Permalink &bull; Comments &bull; Tags: c mmd6 swift markdown Month 13 Is Out Of&nbsp;Bounds Dec 1st, 2017 “Month 13 is out of bounds” appeared in my Xcode console logs today. But I\",\"classification_terms\":[\"posts/2017\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":7,\"depth\":2},{\"path\":\"/posts/2016/\",\"status\":200,\"title\":\"Posts from 2016 • Christian Tietze\",\"word_count\":17359,\"summary_text\":\"Posts from 2016 • Christian Tietze Posts from 2016 &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Innocent Arrow&nbsp;Diagrams Dec 19th, 2016 Sketches and diagrams with arrows look very innocent, yet they mean so much for our work. But they only carry meaning if you’re honest with yourself and depict what’s really going on in the app; then they become a great tool to understand and analyze code. (Better than note-taking can ever be when it comes to object-oriented&nbsp;code.) Continue reading&nbsp;&hellip; &infin;&nbsp;Permalink &bull; Comments &bull; Tags: diagram Always Pay Attention to Implications of Technical&nbsp;Advice Dec 12th, 2016 This weekend, I browsed around on Medium and found a post about “3 ways to pass data from model to controller”. Comments indicate that people like\",\"classification_terms\":[\"posts/2016\",\"about\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":4,\"depth\":2},{\"path\":\"/posts/2015/\",\"status\":200,\"title\":\"Posts from 2015 • Christian Tietze\",\"word_count\":11054,\"summary_text\":\"Posts from 2015 • Christian Tietze Posts from 2015 &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Making Cocoa the Outermost&nbsp;Layer Dec 29th, 2015 Chris Eidhof of objc.io put some experimental code on GitHub where quite a few Cocoa view components are contained by classes he owns himself. The AppDelegate is super instructive: Your Cocoa app needs an NSApplicationDelegate. But it doesn’t have to do anything except route events to the proper collaborators. Still it’s the first object we usually put logic in only to (hopefully) refactor it out&nbsp;later. Continue reading&nbsp;&hellip; &infin;&nbsp;Permalink &bull; Comments &bull; Tags: software-architecture Encapsulate a Process in a Single Line Using Bind and Good OO&nbsp;Design Dec 23rd, 2015 Watch Saul Mora’s AltConf presentation\",\"classification_terms\":[\"posts/2015\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":1,\"depth\":2},{\"path\":\"/posts/2014/\",\"status\":200,\"title\":\"Posts from 2014 • Christian Tietze\",\"word_count\":5553,\"summary_text\":\"Posts from 2014 • Christian Tietze Posts from 2014 &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact Model-View-View Model in&nbsp;Swift Dec 19th, 2014 Srdan Rasic wrote a good post on creating wrappers around value objects (like Strings, say) and custom-glue them to an application’s interface. It’s a technique I have used in my book on Mac architecture at one point but which seems to be tremendously useful for virtually anything view-related once you get to a high enough level of&nbsp;abstraction. It’s weird that articles related to programming are so hard to quote. Instead of a quotation, let the resulting code illustrates what he has to&nbsp;say: class ArticleViewController { var bodyTextView: UITextView var titleLabel: UILabel var dateLabel: UILabel var thumbnailImageView: UIImageView\",\"classification_terms\":[\"posts/2014\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":2},{\"path\":\"/posts/2013/\",\"status\":200,\"title\":\"Posts from 2013 • Christian Tietze\",\"word_count\":3021,\"summary_text\":\"Posts from 2013 • Christian Tietze Posts from 2013 &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact How to Make Daily Writing Practice&nbsp;Useful Dec 11th, 2013 Writing something every day was too tough for me for a long time. Eventually, though, I found out there ware lots of opportunities to practice writing while I feed my note archive. So I made note-writing a deliberate practice. Today, I think I’ve found peace with the way I write texts. It’s possible I’ve said things like this before, but this time it feels different. No, really! Writing itself isn’t a hindrance anymore and my actions yield results: I’m adding meat to my book manuscript and I find topics to write blog posts about. I became more confident in writing texts, even though writing a text seems to be different from taki\",\"classification_terms\":[\"posts/2013\",\"about\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":2},{\"path\":\"/posts/2012/\",\"status\":200,\"title\":\"Posts from 2012 • Christian Tietze\",\"word_count\":846,\"summary_text\":\"Posts from 2012 • Christian Tietze Posts from 2012 &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact App Sales and Hourly Earnings&nbsp;Calculated Dec 30th, 2012 Interested in some data about app sales? I wrote a Ruby script which parsed my worklog files for timestamps, calculate the difference, add it up and then return in a human-readable form the amount of time it took to develop Calendar Paste. So I logged about 115 hours of active development time, planning, tinkering with the website and whatnot—and I definitely spent more hours on this project before I began logging my&nbsp;progress. Continue reading&nbsp;&hellip; &infin;&nbsp;Permalink &bull; Comments &bull; Tags: calendarpasteapp revenue statistics passive-income Parsing YAML Frontmatter in&nbsp;Ruby Dec 30th, 2012 I was trying t\",\"classification_terms\":[\"posts/2012\",\"about\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":2},{\"path\":\"/posts/2011/\",\"status\":200,\"title\":\"Posts from 2011 • Christian Tietze\",\"word_count\":534,\"summary_text\":\"Posts from 2011 • Christian Tietze Posts from 2011 &bull; Christian Tietze Christian Tietze Blog Posts Writing Apps Work With Me Contact nvALT&nbsp;review Apr 18th, 2011 If you are interested in taking notes fast and reliable but never got around NV’s interface, now it’s the best time to reevaluate the situation. Introducing nvALT, the result of joint efforts of both David Halter and Brett Terpstra who united their two popular NV&nbsp;forks. Praise Two weeks ago, I switched from my own NV fork to nvALT. In this newest community-customised fork of Zachary Schneirov’s original Notational Velocity, a few neat design changes have been applied. There is a fullscreen mode, widescreen-layout (&lt;3), word count and a shortcut to open the current file in TextMate—just to name a few of my favorites. Naturally, NV’s original features\",\"classification_terms\":[\"posts/2011\",\"contact\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[\"telemetrydeck.com\"],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":2},{\"path\":\"/posts/2010/\",\"status\":2",
        "score_reasons_json": "[]",
        "route_domain": "christiantietze.de",
        "display_domain": "christiantietze.de"
    },
    "explainability": {
        "summary": "christiantietze.de 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": "Moderate confidence",
                "tone": "caution",
                "detail": "54/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.0",
                "tone": "caution",
                "detail": "Authority, search visibility, reach, engagement, and registry stability. Current subsystem score: 44/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": "-17.0",
                "tone": "risk",
                "detail": "Safety thresholds capped the final score until the risk profile improves."
            }
        ],
        "evidence_cards": [
            {
                "label": "Authority and trust",
                "value": "44/100 · trust 55/100",
                "tone": "caution",
                "detail": "228 monthly visitors, 80 organic keywords, brand completeness 75/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": "0.0 years old",
                "tone": "good",
                "detail": "Stability 100/100 · age 0.0 years."
            },
            {
                "label": "Safety and fraud posture",
                "value": "Safety 100/100 · fraud 0/100",
                "tone": "good",
                "detail": "Primary tag T · safety 100/100 · fraud 0/100."
            }
        ],
        "positives": [
            "Low registrar / ownership churn with solid registry stability.",
            "Healthy crawl quality and on-page completeness.",
            "Search evidence is broad enough to classify with better confidence.",
            "Registry history looks stable, which supports legitimacy and trust.",
            "HTTPS is working, so the site clears a basic transport-security check.",
            "Backlink diversity looks broad enough to strengthen authority confidence."
        ],
        "risks": [],
        "freshness": [
            {
                "label": "Crawl evidence",
                "value": "2026-04-01 20:43:42",
                "tone": "risk",
                "detail": "Crawl and page content sample. Age: 15d ago."
            },
            {
                "label": "WHOIS snapshot",
                "value": "2026-04-01 20:43:41",
                "tone": "risk",
                "detail": "Registry profile and stability signals. Age: 15d ago."
            },
            {
                "label": "Keyword view",
                "value": "2026-04-17 20:23:12",
                "tone": "good",
                "detail": "Estimated visibility until tracked keyword snapshots exist. Age: 0s ago."
            },
            {
                "label": "Rank history",
                "value": "2026-04-17 20:23:12",
                "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": 81,
        "fraud_clamp_penalty": 17,
        "final_score": 64
    },
    "insight_snapshot": {
        "version": 1,
        "generated_at": "2026-04-17T20:23:12+00:00",
        "domain": "christiantietze.de",
        "display_name": "Christian Tietze",
        "is_tracked": false,
        "is_estimated": true,
        "overall_score": 64,
        "authority_score": 44,
        "trust_score": 55,
        "safety_score": 100,
        "fraud_score": 0,
        "confidence_score": 100,
        "traffic_confidence": 54,
        "last_crawled_at": "2026-04-01 20:43:42",
        "crawl_blocked": false,
        "summary": "christiantietze.de 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": "Moderate confidence",
                "tone": "caution",
                "detail": "54/100"
            },
            {
                "label": "Crawler access",
                "value": "Clean visibility",
                "tone": "good",
                "detail": null
            }
        ],
        "top_positive_signals": [
            "Low registrar / ownership churn with solid registry stability.",
            "Healthy crawl quality and on-page completeness.",
            "Search evidence is broad enough to classify with better confidence.",
            "Registry history looks stable, which supports legitimacy and trust.",
            "HTTPS is working, so the site clears a basic transport-security check."
        ],
        "top_risk_signals": [],
        "freshness": [
            {
                "label": "Crawl evidence",
                "value": "2026-04-01 20:43:42",
                "tone": "risk",
                "detail": "Crawl and page content sample. Age: 15d ago."
            },
            {
                "label": "WHOIS snapshot",
                "value": "2026-04-01 20:43:41",
                "tone": "risk",
                "detail": "Registry profile and stability signals. Age: 15d ago."
            },
            {
                "label": "Keyword view",
                "value": "2026-04-17 20:23:12",
                "tone": "good",
                "detail": "Estimated visibility until tracked keyword snapshots exist. Age: 0s ago."
            },
            {
                "label": "Rank history",
                "value": "2026-04-17 20:23:12",
                "tone": "good",
                "detail": "Estimated trend derived from current profile and crawl signals. Age: 0s ago."
            },
            {
                "label": "Audience geography",
                "value": "Not captured yet",
                "tone": "unknown",
                "detail": "Audience mix is estimated from available signals rather than first-party audience logs."
            }
        ],
        "top_tags": [
            {
                "code": "T",
                "label": "Trusted",
                "tone": "good"
            }
        ]
    },
    "is_tracked": false,
    "is_estimated": true,
    "live_state": {
        "status": "processing",
        "status_label": "Cache build running",
        "message": "The refreshed page cache is still being built for this domain.",
        "updated_at": "2026-04-18T00:36:41+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/christiantietze.de/refresh",
        "isGuestCooldown": false,
        "cooldownSeconds": 0
    },
    "urlscan_report": {
        "domain": "christiantietze.de",
        "status": "complete",
        "submitted_at": "2026-03-20T10:05:55+00:00",
        "last_checked_at": "2026-03-20T10:06:43+00:00",
        "last_error": "",
        "submitted_url": "https://christiantietze.de/",
        "summary": "urlscan.io report is ready.",
        "uuid": "019d0ab5-6bba-760d-88d0-94543d41dc2e",
        "result_url": "https://urlscan.io/result/019d0ab5-6bba-760d-88d0-94543d41dc2e/",
        "api_result_url": "https://urlscan.io/api/v1/result/019d0ab5-6bba-760d-88d0-94543d41dc2e/",
        "visibility": "public",
        "raw_submit_response": {
            "message": "Submission successful",
            "uuid": "019d0ab5-6bba-760d-88d0-94543d41dc2e",
            "result": "https://urlscan.io/result/019d0ab5-6bba-760d-88d0-94543d41dc2e/",
            "api": "https://urlscan.io/api/v1/result/019d0ab5-6bba-760d-88d0-94543d41dc2e/",
            "visibility": "public",
            "options": [],
            "url": "https://christiantietze.de/",
            "country": "de"
        },
        "report": {
            "data": {
                "requests": [
                    {
                        "request": {
                            "requestId": "4FE06AC2A6A5B2B0109D82677D45DC2B",
                            "loaderId": "4FE06AC2A6A5B2B0109D82677D45DC2B",
                            "documentURL": "https://christiantietze.de/",
                            "request": {
                                "url": "https://christiantietze.de/",
                                "method": "GET",
                                "headers": {
                                    "Upgrade-Insecure-Requests": "1",
                                    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36"
                                },
                                "mixedContentType": "none",
                                "initialPriority": "VeryHigh",
                                "referrerPolicy": "strict-origin-when-cross-origin",
                                "isSameSite": true
                            },
                            "timestamp": 31031589.13211,
                            "wallTime": 1774001155.05318,
                            "initiator": {
                                "type": "other"
                            },
                            "redirectHasExtraInfo": false,
                            "type": "Document",
                            "frameId": "AFF3E41C38C03AD184C0A680EADDE233",
                            "hasUserGesture": false,
                            "primaryRequest": true
                        },
                        "response": {
                            "encodedDataLength": 4182,
                            "dataLength": 11276,
                            "requestId": "4FE06AC2A6A5B2B0109D82677D45DC2B",
                            "type": "Document",
                            "response": {
                                "url": "https://christiantietze.de/",
                                "status": 200,
                                "statusText": "OK",
                                "headers": {
                                    "Accept-Ranges": "bytes",
                                    "Cache-Control": "must-revalidate, max-age=600",
                                    "Connection": "Keep-Alive",
                                    "Content-Encoding": "gzip",
                                    "Content-Length": "3734",
                                    "Content-Type": "text/html; charset=utf-8",
                                    "Date": "Fri, 20 Mar 2026 10:05:55 GMT",
                                    "ETag": "\"2c0c-64d6f60ba72ff-gzip\"",
                                    "Keep-Alive": "timeout=10, max=100",
                                    "Last-Modified": "Fri, 20 Mar 2026 07:10:19 GMT",
                                    "Server": "Apache",
                                    "Strict-Transport-Security": "max-age=15552000; includeSubDomains",
                                    "Vary": "Accept-Encoding"
                                },
                                "mimeType": "text/html",
                                "charset": "utf-8",
                                "remoteIPAddress": "83.223.95.12",
                                "remotePort": 443,
                                "encodedDataLength": 448,
                                "timing": {
                                    "requestTime": 31031589.132424,
                                    "proxyStart": -1,
                                    "proxyEnd": -1,
                                    "dnsStart": 0,
                                    "dnsEnd": 9.824,
                                    "connectStart": 9.875,
                                    "connectEnd": 59.541,
                                    "sslStart": 15.182,
                                    "sslEnd": 59.535,
                                    "workerStart": -1,
                                    "workerReady": -1,
                                    "workerFetchStart": -1,
                                    "workerRespondWithSettled": -1,
                                    "sendStart": 59.614,
                                    "sendEnd": 59.647,
                                    "pushStart": 0,
                                    "pushEnd": 0,
                                    "receiveHeadersStart": 107.255,
                                    "receiveHeadersEnd": 108.374
                                },
                                "responseTime": 1774001155160.746,
                                "protocol": "http/1.1",
                                "alternateProtocolUsage": "unspecifiedReason",
                                "securityState": "secure",
                                "securityDetails": {
                                    "protocol": "TLS 1.3",
                                    "keyExchange": "",
                                    "keyExchangeGroup": "X25519",
                                    "cipher": "AES_256_GCM",
                                    "certificateId": 0,
                                    "subjectName": "christiantietze.de",
                                    "sanList": [
                                        "*.christiantietze.de",
                                        "christiantietze.de"
                                    ],
                                    "issuer": "E8",
                                    "validFrom": 1769241582,
                                    "validTo": 1777017581,
                                    "signedCertificateTimestampList": [
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "Let's Encrypt 'Willow2026h1'",
                                            "logId": "E3238DF28DA288E0AAE0ACF0FA90C985F0B6BFF5D2A527B001FC1C4458C4B6E8",
                                            "timestamp": 1769245092523,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "304602210093C18C0FC1D3A6FEA5E7E2DB2F179CA690E6DF4469595FD05E0EF1D243669304022100BE91B9F928817B5DF15C08C6CF1B102BA5050B889B76D982D7ADA0593A657BE1"
                                        },
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "Sectigo 'Elephant2026h1'",
                                            "logId": "D16EA9A568077E6635A03F37A5DDBC03A53C411214D48818F5E931B323CB9504",
                                            "timestamp": 1769245092597,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "3045022100A64184555B2823082C45F8A764EF3C7212FA7A89369F80F165C03FF53EC4441C02207CCC6E1AAD6E17DBE31B8039BE7D9ECFB98FFC4C0D0C3F60CF1D71C84F97E518"
                                        }
                                    ],
                                    "certificateTransparencyCompliance": "compliant",
                                    "serverSignatureAlgorithm": 1027,
                                    "encryptedClientHello": false
                                },
                                "securityHeaders": [
                                    {
                                        "name": "Strict-Transport-Security",
                                        "value": "max-age=15552000; includeSubDomains"
                                    }
                                ]
                            },
                            "hasExtraInfo": true,
                            "hash": "aa13eeb262026c773abdc21e1f71a9110d88de333b7d34e99e23fef076b2b2ac",
                            "size": 11251,
                            "asn": {
                                "ip": "83.223.95.12",
                                "asn": "8875",
                                "country": "DE",
                                "description": "SINMA-ASN sinma GmbH, DE",
                                "name": "SINMA-ASN sinma GmbH",
                                "route": "83.223.64.0/19"
                            },
                            "geoip": {
                                "country": "DE",
                                "region": "",
                                "timezone": "Europe/Berlin",
                                "city": "",
                                "ll": [
                                    51.2993,
                                    9.491
                                ],
                                "country_name": "Germany",
                                "metro": 0
                            },
                            "rdns": {
                                "ip": "83.223.95.12",
                                "ptr": "edv38.hostsharing.net"
                            }
                        }
                    },
                    {
                        "request": {
                            "requestId": "51593.2",
                            "loaderId": "4FE06AC2A6A5B2B0109D82677D45DC2B",
                            "documentURL": "https://christiantietze.de/",
                            "request": {
                                "url": "https://christiantietze.de/css/default.css",
                                "method": "GET",
                                "headers": {
                                    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
                                    "Referer": "https://christiantietze.de/"
                                },
                                "mixedContentType": "none",
                                "initialPriority": "VeryHigh",
                                "referrerPolicy": "strict-origin-when-cross-origin",
                                "isSameSite": true
                            },
                            "timestamp": 31031589.244596,
                            "wallTime": 1774001155.165694,
                            "initiator": {
                                "type": "parser",
                                "url": "https://christiantietze.de/",
                                "lineNumber": 12,
                                "columnNumber": 65
                            },
                            "redirectHasExtraInfo": false,
                            "type": "Stylesheet",
                            "frameId": "AFF3E41C38C03AD184C0A680EADDE233",
                            "hasUserGesture": false,
                            "renderBlockingBehavior": "Blocking"
                        },
                        "response": {
                            "encodedDataLength": 11521,
                            "dataLength": 46236,
                            "requestId": "51593.2",
                            "type": "Stylesheet",
                            "response": {
                                "url": "https://christiantietze.de/css/default.css",
                                "status": 200,
                                "statusText": "OK",
                                "headers": {
                                    "Strict-Transport-Security": "max-age=15552000; includeSubDomains",
                                    "Cache-Control": "max-age=600, public",
                                    "Content-Encoding": "gzip",
                                    "ETag": "\"b49c-63fea7663f8eb-gzip\"",
                                    "Connection": "Keep-Alive",
                                    "Accept-Ranges": "bytes",
                                    "Content-Length": "11098",
                                    "Keep-Alive": "timeout=10, max=99",
                                    "Date": "Fri, 20 Mar 2026 10:05:55 GMT",
                                    "Last-Modified": "Mon, 29 Sep 2025 06:08:21 GMT",
                                    "Vary": "Accept-Encoding",
                                    "Server": "Apache",
                                    "Content-Type": "text/css"
                                },
                                "mimeType": "text/css",
                                "charset": "",
                                "remoteIPAddress": "83.223.95.12",
                                "remotePort": 443,
                                "encodedDataLength": 423,
                                "timing": {
                                    "requestTime": 31031589.244907,
                                    "proxyStart": -1,
                                    "proxyEnd": -1,
                                    "dnsStart": -1,
                                    "dnsEnd": -1,
                                    "connectStart": -1,
                                    "connectEnd": -1,
                                    "sslStart": -1,
                                    "sslEnd": -1,
                                    "workerStart": -1,
                                    "workerReady": -1,
                                    "workerFetchStart": -1,
                                    "workerRespondWithSettled": -1,
                                    "sendStart": 0.42,
                                    "sendEnd": 0.45,
                                    "pushStart": 0,
                                    "pushEnd": 0,
                                    "receiveHeadersStart": 28.562,
                                    "receiveHeadersEnd": 29.668
                                },
                                "responseTime": 1774001155194.536,
                                "protocol": "http/1.1",
                                "alternateProtocolUsage": "unspecifiedReason",
                                "securityState": "secure",
                                "securityDetails": {
                                    "protocol": "TLS 1.3",
                                    "keyExchange": "",
                                    "keyExchangeGroup": "X25519",
                                    "cipher": "AES_256_GCM",
                                    "certificateId": 0,
                                    "subjectName": "christiantietze.de",
                                    "sanList": [
                                        "*.christiantietze.de",
                                        "christiantietze.de"
                                    ],
                                    "issuer": "E8",
                                    "validFrom": 1769241582,
                                    "validTo": 1777017581,
                                    "signedCertificateTimestampList": [
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "Let's Encrypt 'Willow2026h1'",
                                            "logId": "E3238DF28DA288E0AAE0ACF0FA90C985F0B6BFF5D2A527B001FC1C4458C4B6E8",
                                            "timestamp": 1769245092523,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "304602210093C18C0FC1D3A6FEA5E7E2DB2F179CA690E6DF4469595FD05E0EF1D243669304022100BE91B9F928817B5DF15C08C6CF1B102BA5050B889B76D982D7ADA0593A657BE1"
                                        },
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "Sectigo 'Elephant2026h1'",
                                            "logId": "D16EA9A568077E6635A03F37A5DDBC03A53C411214D48818F5E931B323CB9504",
                                            "timestamp": 1769245092597,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "3045022100A64184555B2823082C45F8A764EF3C7212FA7A89369F80F165C03FF53EC4441C02207CCC6E1AAD6E17DBE31B8039BE7D9ECFB98FFC4C0D0C3F60CF1D71C84F97E518"
                                        }
                                    ],
                                    "certificateTransparencyCompliance": "compliant",
                                    "serverSignatureAlgorithm": 1027,
                                    "encryptedClientHello": false
                                },
                                "securityHeaders": [
                                    {
                                        "name": "Strict-Transport-Security",
                                        "value": "max-age=15552000; includeSubDomains"
                                    }
                                ]
                            },
                            "hasExtraInfo": true,
                            "hash": "1a8853bc225c960c9a104deac65b5f790bf2b79d72236b491fffbe890c360d8b",
                            "size": 46213,
                            "asn": {
                                "ip": "83.223.95.12",
                                "asn": "8875",
                                "country": "DE",
                                "description": "SINMA-ASN sinma GmbH, DE",
                                "name": "SINMA-ASN sinma GmbH",
                                "route": "83.223.64.0/19"
                            },
                            "geoip": {
                                "country": "DE",
                                "region": "",
                                "timezone": "Europe/Berlin",
                                "city": "",
                                "ll": [
                                    51.2993,
                                    9.491
                                ],
                                "country_name": "Germany",
                                "metro": 0
                            },
                            "rdns": {
                                "ip": "83.223.95.12",
                                "ptr": "edv38.hostsharing.net"
                            }
                        },
                        "initiatorInfo": {
                            "url": "https://christiantietze.de/",
                            "host": "christiantietze.de",
                            "type": "parser"
                        }
                    },
                    {
                        "request": {
                            "requestId": "51593.3",
                            "loaderId": "4FE06AC2A6A5B2B0109D82677D45DC2B",
                            "documentURL": "https://christiantietze.de/",
                            "request": {
                                "url": "https://christiantietze.de/img/signature.png",
                                "method": "GET",
                                "headers": {
                                    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
                                    "Referer": "https://christiantietze.de/"
                                },
                                "mixedContentType": "none",
                                "initialPriority": "Medium",
                                "referrerPolicy": "strict-origin-when-cross-origin",
                                "isSameSite": true
                            },
                            "timestamp": 31031589.244736,
                            "wallTime": 1774001155.165809,
                            "initiator": {
                                "type": "parser",
                                "url": "https://christiantietze.de/",
                                "lineNumber": 65,
                                "columnNumber": 121
                            },
                            "redirectHasExtraInfo": false,
                            "type": "Image",
                            "frameId": "AFF3E41C38C03AD184C0A680EADDE233",
                            "hasUserGesture": false
                        },
                        "response": {
                            "encodedDataLength": 16496,
                            "dataLength": 16119,
                            "requestId": "51593.3",
                            "type": "Image",
                            "response": {
                                "url": "https://christiantietze.de/img/signature.png",
                                "status": 200,
                                "statusText": "OK",
                                "headers": {
                                    "Strict-Transport-Security": "max-age=15552000; includeSubDomains",
                                    "Cache-Control": "max-age=31536000, public",
                                    "ETag": "\"3ef7-61041465295c0\"",
                                    "Connection": "Keep-Alive",
                                    "Accept-Ranges": "bytes",
                                    "Content-Length": "16119",
                                    "Keep-Alive": "timeout=10, max=98",
                                    "Date": "Fri, 20 Mar 2026 10:05:55 GMT",
                                    "Last-Modified": "Wed, 31 Jan 2024 17:33:19 GMT",
                                    "Content-Type": "image/png",
                                    "Server": "Apache"
                                },
                                "mimeType": "image/png",
                                "charset": "",
                                "remoteIPAddress": "83.223.95.12",
                                "remotePort": 443,
                                "encodedDataLength": 377,
                                "timing": {
                                    "requestTime": 31031589.245074,
                                    "proxyStart": -1,
                                    "proxyEnd": -1,
                                    "dnsStart": -1,
                                    "dnsEnd": -1,
                                    "connectStart": -1,
                                    "connectEnd": -1,
                                    "sslStart": -1,
                                    "sslEnd": -1,
                                    "workerStart": -1,
                                    "workerReady": -1,
                                    "workerFetchStart": -1,
                                    "workerRespondWithSettled": -1,
                                    "sendStart": 32.01,
                                    "sendEnd": 32.04,
                                    "pushStart": 0,
                                    "pushEnd": 0,
                                    "receiveHeadersStart": 56.754,
                                    "receiveHeadersEnd": 57.87
                                },
                                "responseTime": 1774001155222.895,
                                "protocol": "http/1.1",
                                "alternateProtocolUsage": "unspecifiedReason",
                                "securityState": "secure",
                                "securityDetails": {
                                    "protocol": "TLS 1.3",
                                    "keyExchange": "",
                                    "keyExchangeGroup": "X25519",
                                    "cipher": "AES_256_GCM",
                                    "certificateId": 0,
                                    "subjectName": "christiantietze.de",
                                    "sanList": [
                                        "*.christiantietze.de",
                                        "christiantietze.de"
                                    ],
                                    "issuer": "E8",
                                    "validFrom": 1769241582,
                                    "validTo": 1777017581,
                                    "signedCertificateTimestampList": [
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "Let's Encrypt 'Willow2026h1'",
                                            "logId": "E3238DF28DA288E0AAE0ACF0FA90C985F0B6BFF5D2A527B001FC1C4458C4B6E8",
                                            "timestamp": 1769245092523,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "304602210093C18C0FC1D3A6FEA5E7E2DB2F179CA690E6DF4469595FD05E0EF1D243669304022100BE91B9F928817B5DF15C08C6CF1B102BA5050B889B76D982D7ADA0593A657BE1"
                                        },
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "Sectigo 'Elephant2026h1'",
                                            "logId": "D16EA9A568077E6635A03F37A5DDBC03A53C411214D48818F5E931B323CB9504",
                                            "timestamp": 1769245092597,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "3045022100A64184555B2823082C45F8A764EF3C7212FA7A89369F80F165C03FF53EC4441C02207CCC6E1AAD6E17DBE31B8039BE7D9ECFB98FFC4C0D0C3F60CF1D71C84F97E518"
                                        }
                                    ],
                                    "certificateTransparencyCompliance": "compliant",
                                    "serverSignatureAlgorithm": 1027,
                                    "encryptedClientHello": false
                                },
                                "securityHeaders": [
                                    {
                                        "name": "Strict-Transport-Security",
                                        "value": "max-age=15552000; includeSubDomains"
                                    }
                                ]
                            },
                            "hasExtraInfo": true,
                            "hash": "429ed7c948a58fa9311786e9b0baf37c079848196018104a296e2ccd1dbcf570",
                            "size": 21492,
                            "asn": {
                                "ip": "83.223.95.12",
                                "asn": "8875",
                                "country": "DE",
                                "description": "SINMA-ASN sinma GmbH, DE",
                                "name": "SINMA-ASN sinma GmbH",
                                "route": "83.223.64.0/19"
                            },
                            "geoip": {
                                "country": "DE",
                                "region": "",
                                "timezone": "Europe/Berlin",
                                "city": "",
                                "ll": [
                                    51.2993,
                                    9.491
                                ],
                                "country_name": "Germany",
                                "metro": 0
                            },
                            "rdns": {
                                "ip": "83.223.95.12",
                                "ptr": "edv38.hostsharing.net"
                            }
                        },
                        "initiatorInfo": {
                            "url": "https://christiantietze.de/",
                            "host": "christiantietze.de",
                            "type": "parser"
                        }
                    },
                    {
                        "request": {
                            "requestId": "51593.4",
                            "loaderId": "4FE06AC2A6A5B2B0109D82677D45DC2B",
                            "documentURL": "https://christiantietze.de/",
                            "request": {
                                "url": "https://christiantietze.de/contact/profile.jpg",
                                "method": "GET",
                                "headers": {
                                    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
                                    "Referer": "https://christiantietze.de/"
                                },
                                "mixedContentType": "none",
                                "initialPriority": "Medium",
                                "referrerPolicy": "strict-origin-when-cross-origin",
                                "isSameSite": true
                            },
                            "timestamp": 31031589.244772,
                            "wallTime": 1774001155.165849,
                            "initiator": {
                                "type": "parser",
                                "url": "https://christiantietze.de/",
                                "lineNumber": 87,
                                "columnNumber": 107
                            },
                            "redirectHasExtraInfo": false,
                            "type": "Image",
                            "frameId": "AFF3E41C38C03AD184C0A680EADDE233",
                            "hasUserGesture": false
                        },
                        "response": {
                            "encodedDataLength": 323056,
                            "dataLength": 322675,
                            "requestId": "51593.4",
                            "type": "Image",
                            "response": {
                                "url": "https://christiantietze.de/contact/profile.jpg",
                                "status": 200,
                                "statusText": "OK",
                                "headers": {
                                    "Strict-Transport-Security": "max-age=15552000; includeSubDomains",
                                    "Cache-Control": "max-age=31536000, public",
                                    "ETag": "\"4ec73-5fcfa94bd22c0\"",
                                    "Connection": "Keep-Alive",
                                    "Accept-Ranges": "bytes",
                                    "Content-Length": "322675",
                                    "Keep-Alive": "timeout=10, max=100",
                                    "Date": "Fri, 20 Mar 2026 10:05:55 GMT",
                                    "Last-Modified": "Wed, 31 May 2023 10:14:11 GMT",
                                    "Content-Type": "image/jpeg",
                                    "Server": "Apache"
                                },
                                "mimeType": "image/jpeg",
                                "charset": "",
                                "remoteIPAddress": "83.223.95.12",
                                "remotePort": 443,
                                "encodedDataLength": 381,
                                "timing": {
                                    "requestTime": 31031589.245223,
                                    "proxyStart": -1,
                                    "proxyEnd": -1,
                                    "dnsStart": 0,
                                    "dnsEnd": 0,
                                    "connectStart": 0,
                                    "connectEnd": 45.531,
                                    "sslStart": 7.749,
                                    "sslEnd": 45.525,
                                    "workerStart": -1,
                                    "workerReady": -1,
                                    "workerFetchStart": -1,
                                    "workerRespondWithSettled": -1,
                                    "sendStart": 45.571,
                                    "sendEnd": 45.595,
                                    "pushStart": 0,
                                    "pushEnd": 0,
                                    "receiveHeadersStart": 84.986,
                                    "receiveHeadersEnd": 86.095
                                },
                                "responseTime": 1774001155251.276,
                                "protocol": "http/1.1",
                                "alternateProtocolUsage": "unspecifiedReason",
                                "securityState": "secure",
                                "securityDetails": {
                                    "protocol": "TLS 1.3",
                                    "keyExchange": "",
                                    "keyExchangeGroup": "X25519",
                                    "cipher": "AES_256_GCM",
                                    "certificateId": 0,
                                    "subjectName": "christiantietze.de",
                                    "sanList": [
                                        "*.christiantietze.de",
                                        "christiantietze.de"
                                    ],
                                    "issuer": "E8",
                                    "validFrom": 1769241582,
                                    "validTo": 1777017581,
                                    "signedCertificateTimestampList": [
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "Let's Encrypt 'Willow2026h1'",
                                            "logId": "E3238DF28DA288E0AAE0ACF0FA90C985F0B6BFF5D2A527B001FC1C4458C4B6E8",
                                            "timestamp": 1769245092523,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "304602210093C18C0FC1D3A6FEA5E7E2DB2F179CA690E6DF4469595FD05E0EF1D243669304022100BE91B9F928817B5DF15C08C6CF1B102BA5050B889B76D982D7ADA0593A657BE1"
                                        },
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "Sectigo 'Elephant2026h1'",
                                            "logId": "D16EA9A568077E6635A03F37A5DDBC03A53C411214D48818F5E931B323CB9504",
                                            "timestamp": 1769245092597,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "3045022100A64184555B2823082C45F8A764EF3C7212FA7A89369F80F165C03FF53EC4441C02207CCC6E1AAD6E17DBE31B8039BE7D9ECFB98FFC4C0D0C3F60CF1D71C84F97E518"
                                        }
                                    ],
                                    "certificateTransparencyCompliance": "compliant",
                                    "serverSignatureAlgorithm": 1027,
                                    "encryptedClientHello": false
                                },
                                "securityHeaders": [
                                    {
                                        "name": "Strict-Transport-Security",
                                        "value": "max-age=15552000; includeSubDomains"
                                    }
                                ]
                            },
                            "hasExtraInfo": true,
                            "hash": "26b0a2e5dd0ea6c38bc65007898272955568f5fb40f7a74110f6ff51380654e8",
                            "size": 430236,
                            "asn": {
                                "ip": "83.223.95.12",
                                "asn": "8875",
                                "country": "DE",
                                "description": "SINMA-ASN sinma GmbH, DE",
                                "name": "SINMA-ASN sinma GmbH",
                                "route": "83.223.64.0/19"
                            },
                            "geoip": {
                                "country": "DE",
                                "region": "",
                                "timezone": "Europe/Berlin",
                                "city": "",
                                "ll": [
                                    51.2993,
                                    9.491
                                ],
                                "country_name": "Germany",
                                "metro": 0
                            },
                            "rdns": {
                                "ip": "83.223.95.12",
                                "ptr": "edv38.hostsharing.net"
                            }
                        },
                        "initiatorInfo": {
                            "url": "https://christiantietze.de/",
                            "host": "christiantietze.de",
                            "type": "parser"
                        }
                    },
                    {
                        "request": {
                            "requestId": "51593.5",
                            "loaderId": "4FE06AC2A6A5B2B0109D82677D45DC2B",
                            "documentURL": "https://christiantietze.de/",
                            "request": {
                                "url": "https://cdn.telemetrydeck.com/websdk/telemetrydeck.min.js",
                                "method": "GET",
                                "headers": {
                                    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
                                    "Referer": "https://christiantietze.de/"
                                },
                                "mixedContentType": "none",
                                "initialPriority": "Medium",
                                "referrerPolicy": "strict-origin-when-cross-origin",
                                "isSameSite": false
                            },
                            "timestamp": 31031589.244809,
                            "wallTime": 1774001155.165884,
                            "initiator": {
                                "type": "parser",
                                "url": "https://christiantietze.de/",
                                "lineNumber": 288,
                                "columnNumber": 125
                            },
                            "redirectHasExtraInfo": false,
                            "type": "Script",
                            "frameId": "AFF3E41C38C03AD184C0A680EADDE233",
                            "hasUserGesture": false,
                            "renderBlockingBehavior": "InBodyParserBlocking"
                        },
                        "response": {
                            "encodedDataLength": 1009,
                            "dataLength": 681,
                            "requestId": "51593.5",
                            "type": "Script",
                            "response": {
                                "url": "https://cdn.telemetrydeck.com/websdk/telemetrydeck.min.js",
                                "status": 200,
                                "statusText": "",
                                "headers": {
                                    "x-azure-ref": "20260320T100555Z-r1d54678fb8vbs72hC1FRA0rvn0000000xpg0000000030af",
                                    "x-ms-version": "2009-09-19",
                                    "x-ms-lease-status": "unlocked",
                                    "etag": "0x8DC9118052F577C",
                                    "x-fd-int-roxy-purgeid": "0",
                                    "x-ms-request-id": "7c222605-e01e-0062-7c6b-b7a2f7000000",
                                    "accept-ranges": "bytes",
                                    "x-cache": "TCP_HIT",
                                    "content-length": "681",
                                    "date": "Fri, 20 Mar 2026 10:05:55 GMT",
                                    "content-type": "application/javascript",
                                    "last-modified": "Thu, 20 Jun 2024 10:59:13 GMT",
                                    "x-ms-blob-type": "BlockBlob"
                                },
                                "mimeType": "application/javascript",
                                "charset": "",
                                "remoteIPAddress": "13.107.226.45",
                                "remotePort": 443,
                                "encodedDataLength": 1009,
                                "timing": {
                                    "requestTime": 31031589.252814,
                                    "proxyStart": -1,
                                    "proxyEnd": -1,
                                    "dnsStart": 0.047,
                                    "dnsEnd": 64.571,
                                    "connectStart": 64.637,
                                    "connectEnd": 129.919,
                                    "sslStart": 70.829,
                                    "sslEnd": 129.912,
                                    "workerStart": -1,
                                    "workerReady": -1,
                                    "workerFetchStart": -1,
                                    "workerRespondWithSettled": -1,
                                    "sendStart": 130.037,
                                    "sendEnd": 130.138,
                                    "pushStart": 0,
                                    "pushEnd": 0,
                                    "receiveHeadersStart": 166.982,
                                    "receiveHeadersEnd": 168.153
                                },
                                "responseTime": 1774001155340.877,
                                "protocol": "h2",
                                "alternateProtocolUsage": "unspecifiedReason",
                                "securityState": "secure",
                                "securityDetails": {
                                    "protocol": "TLS 1.3",
                                    "keyExchange": "",
                                    "keyExchangeGroup": "P-256",
                                    "cipher": "AES_256_GCM",
                                    "certificateId": 0,
                                    "subjectName": "cdn.telemetrydeck.com",
                                    "sanList": [
                                        "cdn.telemetrydeck.com"
                                    ],
                                    "issuer": "DigiCert TLS RSA SHA256 2020 CA1",
                                    "validFrom": 1753228800,
                                    "validTo": 1776211199,
                                    "signedCertificateTimestampList": [
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "Google 'Argon2026h1' log",
                                            "logId": "0E5794BCF3AEA93E331B2C9907B3F790DF9BC23D713225DD21A925AC61C54E21",
                                            "timestamp": 1753276128125,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "3045022100C90B5E14DDA1476186C392CAB27639A6F73F094B016A68BF5DBC1E54525AF30702204EA5A6A3D60519F6E9CE5857D260EA6454D93E6239DC3934A2F9DEBF98FDE303"
                                        },
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "DigiCert 'Wyvern2026h1'",
                                            "logId": "6411C46CA412ECA7891CA2022E00BCAB4F2807D41E3527ABEAFED503C97DCDF0",
                                            "timestamp": 1753276128185,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "304402205B2D635A906AC3EAB849EE7DD716279F28ED0E60CCA575A651E6C53FB4C2528702204E2CF545D5224941B2929A5AC08322450BCA17CA5A2C43C31DFD9BC340CB97B4"
                                        },
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "DigiCert 'Sphinx2026h1'",
                                            "logId": "499C9B69DE1D7CECFC36DECD8764A6B85BAF0A878019D15552FBE9EB29DDF8C3",
                                            "timestamp": 1753276128206,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "3046022100F8E6C9DB4C5F18873CACA285C4C053E267BD2BFF726447524C42345179FF380602210092CE19778DDC2D59055830E4D765ACCB820E89792BD2928DEEF6DAD2A5F1BC1B"
                                        }
                                    ],
                                    "certificateTransparencyCompliance": "compliant",
                                    "serverSignatureAlgorithm": 2052,
                                    "encryptedClientHello": false
                                }
                            },
                            "hasExtraInfo": true,
                            "hash": "2633ae3f17ce21dfc782e5c3be4cca36c3f8e48bcaab77348117efab15e4181e",
                            "size": 681,
                            "asn": {
                                "ip": "13.107.226.45",
                                "asn": "8075",
                                "country": "US",
                                "description": "MICROSOFT-CORP-MSN-AS-BLOCK - Microsoft Corporation, US",
                                "name": "Microsoft Corporation",
                                "route": "13.107.224.0/20"
                            },
                            "geoip": {
                                "country": "US",
                                "region": "",
                                "timezone": "America/Chicago",
                                "city": "",
                                "ll": [
                                    37.751,
                                    -97.822
                                ],
                                "country_name": "United States",
                                "metro": 0
                            }
                        },
                        "initiatorInfo": {
                            "url": "https://christiantietze.de/",
                            "host": "christiantietze.de",
                            "type": "parser"
                        }
                    },
                    {
                        "request": {
                            "requestId": "51593.10",
                            "loaderId": "4FE06AC2A6A5B2B0109D82677D45DC2B",
                            "documentURL": "https://christiantietze.de/",
                            "request": {
                                "url": "https://nom.telemetrydeck.com/v2/w/",
                                "method": "POST",
                                "headers": {
                                    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
                                    "Content-Type": "application/json",
                                    "Referer": "https://christiantietze.de/"
                                },
                                "postData": "{\"appID\":\"E06F2CA9-40C0-4840-AAD9-278EA91C403F\",\"url\":\"https://christiantietze.de/\",\"referrer\":\"\",\"telemetryClientVersion\":\"WebSDK 1.1.0\",\"locale\":\"de-DE\"}",
                                "hasPostData": true,
                                "postDataEntries": [
                                    {
                                        "bytes": "eyJhcHBJRCI6IkUwNkYyQ0E5LTQwQzAtNDg0MC1BQUQ5LTI3OEVBOTFDNDAzRiIsInVybCI6Imh0dHBzOi8vY2hyaXN0aWFudGlldHplLmRlLyIsInJlZmVycmVyIjoiIiwidGVsZW1ldHJ5Q2xpZW50VmVyc2lvbiI6IldlYlNESyAxLjEuMCIsImxvY2FsZSI6ImRlLURFIn0="
                                    }
                                ],
                                "mixedContentType": "none",
                                "initialPriority": "High",
                                "referrerPolicy": "strict-origin-when-cross-origin",
                                "isSameSite": false
                            },
                            "timestamp": 31031589.424656,
                            "wallTime": 1774001155.345747,
                            "initiator": {
                                "type": "script",
                                "stack": {
                                    "callFrames": [
                                        {
                                            "functionName": "",
                                            "scriptId": "241",
                                            "url": "https://cdn.telemetrydeck.com/websdk/telemetrydeck.min.js",
                                            "lineNumber": 0,
                                            "columnNumber": 573
                                        },
                                        {
                                            "functionName": "",
                                            "scriptId": "241",
                                            "url": "https://cdn.telemetrydeck.com/websdk/telemetrydeck.min.js",
                                            "lineNumber": 0,
                                            "columnNumber": 61
                                        },
                                        {
                                            "functionName": "",
                                            "scriptId": "241",
                                            "url": "https://cdn.telemetrydeck.com/websdk/telemetrydeck.min.js",
                                            "lineNumber": 0,
                                            "columnNumber": 65
                                        }
                                    ]
                                }
                            },
                            "redirectHasExtraInfo": false,
                            "type": "Fetch",
                            "frameId": "AFF3E41C38C03AD184C0A680EADDE233",
                            "hasUserGesture": false
                        },
                        "response": {
                            "encodedDataLength": 143,
                            "dataLength": 2,
                            "requestId": "51593.10",
                            "type": "Fetch",
                            "response": {
                                "url": "https://nom.telemetrydeck.com/v2/w/",
                                "status": 200,
                                "statusText": "",
                                "headers": {
                                    "access-control-allow-origin": "https://christiantietze.de",
                                    "content-length": "2",
                                    "date": "Fri, 20 Mar 2026 10:05:55 GMT",
                                    "content-type": "text/html; charset=utf-8",
                                    "vary": "Origin",
                                    "server": "gunicorn"
                                },
                                "mimeType": "text/html",
                                "charset": "utf-8",
                                "remoteIPAddress": "52.58.89.141",
                                "remotePort": 443,
                                "encodedDataLength": 143,
                                "timing": {
                                    "requestTime": 31031589.634039,
                                    "proxyStart": -1,
                                    "proxyEnd": -1,
                                    "dnsStart": -1,
                                    "dnsEnd": -1,
                                    "connectStart": -1,
                                    "connectEnd": -1,
                                    "sslStart": -1,
                                    "sslEnd": -1,
                                    "workerStart": -1,
                                    "workerReady": -1,
                                    "workerFetchStart": -1,
                                    "workerRespondWithSettled": -1,
                                    "sendStart": 0.178,
                                    "sendEnd": 1.336,
                                    "pushStart": 0,
                                    "pushEnd": 0,
                                    "receiveHeadersStart": 71.624,
                                    "receiveHeadersEnd": 72.748
                                },
                                "responseTime": 1774001155626.74,
                                "protocol": "h2",
                                "alternateProtocolUsage": "unspecifiedReason",
                                "securityState": "secure",
                                "securityDetails": {
                                    "protocol": "TLS 1.2",
                                    "keyExchange": "ECDHE_ECDSA",
                                    "keyExchangeGroup": "P-256",
                                    "cipher": "AES_128_GCM",
                                    "certificateId": 0,
                                    "subjectName": "*.telemetrydeck.com",
                                    "sanList": [
                                        "*.telemetrydeck.com"
                                    ],
                                    "issuer": "Amazon ECDSA 256 M01",
                                    "validFrom": 1760400000,
                                    "validTo": 1794527999,
                                    "signedCertificateTimestampList": [
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "Google 'Xenon2026h2' log",
                                            "logId": "D809553B944F7AFFC816196F944F85ABB0F8FC5E8755260F15D12E72BB454B14",
                                            "timestamp": 1760401563105,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "3045022044ABD006E0E410B150FB47B0D5E137AD49A5A7EEC903DAF1AB92F96544E52A7D022100DA5FE594F7C736FE803C3CC0541C780874121FCC648BFCF4318FF9AFBBA87E3D"
                                        },
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "DigiCert 'Wyvern2026h2'",
                                            "logId": "C2317E574519A345EE7F38DEB29041EBC7C2215A22BF7FD5B5AD769AD90E52CD",
                                            "timestamp": 1760401563104,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "3045022074723120E123F9F8A9490057A9C6577B5BDE063819EED9347D62AE6B44013E3A022100FFB44B05C808089565C9ED94BE9557BDB6D45B3610D36E81377D0292820B526F"
                                        },
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "DigiCert 'Sphinx2026h2'",
                                            "logId": "944E4387FAECC1EF81F3192426A8186501C7D35F3802013F72677D55372E19D8",
                                            "timestamp": 1760401563125,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "3045022100A31486B7B96F5B32AA4BB17A265B5C145967E8232F121F10972E819245FF409E022048A197DCEBD131686ACA2DE853B80C412B17550DCC0A7315BBFED16437EE7CA7"
                                        }
                                    ],
                                    "certificateTransparencyCompliance": "compliant",
                                    "serverSignatureAlgorithm": 1027,
                                    "encryptedClientHello": false
                                }
                            },
                            "hasExtraInfo": true,
                            "hash": "565339bc4d33d72817b583024112eb7f5cdf3e5eef0252d6ec1b9c9a94e12bb3",
                            "size": 2,
                            "asn": {
                                "ip": "52.58.89.141",
                                "asn": "16509",
                                "country": "US",
                                "description": "AMAZON-02 - Amazon.com, Inc., US",
                                "name": "Amazon.com",
                                "route": "52.56.0.0/14"
                            },
                            "geoip": {
                                "country": "DE",
                                "region": "HE",
                                "timezone": "Europe/Berlin",
                                "city": "Frankfurt am Main",
                                "ll": [
                                    50.1169,
                                    8.6837
                                ],
                                "country_name": "Germany",
                                "metro": 0
                            },
                            "rdns": {
                                "ip": "52.58.89.141",
                                "ptr": "ec2-52-58-89-141.eu-central-1.compute.amazonaws.com"
                            }
                        },
                        "initiatorInfo": {
                            "url": "https://cdn.telemetrydeck.com/websdk/telemetrydeck.min.js",
                            "host": "cdn.telemetrydeck.com",
                            "type": "script"
                        }
                    },
                    {
                        "request": {
                            "requestId": "56FE13C69C81E0C56E4E09B6309B49C7",
                            "loaderId": "",
                            "documentURL": "https://nom.telemetrydeck.com/v2/w/",
                            "request": {
                                "url": "https://nom.telemetrydeck.com/v2/w/",
                                "method": "OPTIONS",
                                "headers": {
                                    "Accept": "*/*",
                                    "Access-Control-Request-Headers": "content-type",
                                    "Access-Control-Request-Method": "POST",
                                    "Origin": "https://christiantietze.de",
                                    "Sec-Fetch-Mode": "cors",
                                    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36"
                                },
                                "initialPriority": "High",
                                "referrerPolicy": "strict-origin-when-cross-origin"
                            },
                            "timestamp": 31031589.424871,
                            "wallTime": 1774001155.345943,
                            "initiator": {
                                "type": "preflight",
                                "url": "https://nom.telemetrydeck.com/v2/w/",
                                "requestId": "51593.10"
                            },
                            "redirectHasExtraInfo": false,
                            "type": "Other",
                            "hasUserGesture": false
                        },
                        "response": {
                            "encodedDataLength": 0,
                            "dataLength": 0,
                            "requestId": "56FE13C69C81E0C56E4E09B6309B49C7",
                            "type": "Preflight",
                            "response": {
                                "url": "https://nom.telemetrydeck.com/v2/w/",
                                "status": 200,
                                "statusText": "",
                                "headers": {
                                    "access-control-allow-headers": "content-type",
                                    "access-control-allow-methods": "DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT",
                                    "access-control-allow-origin": "https://christiantietze.de",
                                    "allow": "HEAD, GET, POST, OPTIONS",
                                    "content-length": "0",
                                    "content-type": "text/html; charset=utf-8",
                                    "date": "Fri, 20 Mar 2026 10:05:55 GMT",
                                    "server": "gunicorn",
                                    "vary": "Origin"
                                },
                                "mimeType": "text/html",
                                "charset": "utf-8",
                                "remoteIPAddress": "52.58.89.141",
                                "remotePort": 443,
                                "encodedDataLength": 246,
                                "timing": {
                                    "requestTime": 31031589.424882,
                                    "proxyStart": -1,
                                    "proxyEnd": -1,
                                    "dnsStart": 0.063,
                                    "dnsEnd": 127.521,
                                    "connectStart": 127.601,
                                    "connectEnd": 149.586,
                                    "sslStart": 132.836,
                                    "sslEnd": 149.58,
                                    "workerStart": -1,
                                    "workerReady": -1,
                                    "workerFetchStart": -1,
                                    "workerRespondWithSettled": -1,
                                    "sendStart": 149.698,
                                    "sendEnd": 149.77,
                                    "pushStart": 0,
                                    "pushEnd": 0,
                                    "receiveHeadersStart": 208.668,
                                    "receiveHeadersEnd": 208.723
                                },
                                "responseTime": 1774001155554.63,
                                "protocol": "h2",
                                "alternateProtocolUsage": "unspecifiedReason",
                                "securityState": "secure",
                                "securityDetails": {
                                    "protocol": "TLS 1.2",
                                    "keyExchange": "ECDHE_ECDSA",
                                    "keyExchangeGroup": "P-256",
                                    "cipher": "AES_128_GCM",
                                    "certificateId": 0,
                                    "subjectName": "*.telemetrydeck.com",
                                    "sanList": [
                                        "*.telemetrydeck.com"
                                    ],
                                    "issuer": "Amazon ECDSA 256 M01",
                                    "validFrom": 1760400000,
                                    "validTo": 1794527999,
                                    "signedCertificateTimestampList": [
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "Google 'Xenon2026h2' log",
                                            "logId": "D809553B944F7AFFC816196F944F85ABB0F8FC5E8755260F15D12E72BB454B14",
                                            "timestamp": 1760401563105,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "3045022044ABD006E0E410B150FB47B0D5E137AD49A5A7EEC903DAF1AB92F96544E52A7D022100DA5FE594F7C736FE803C3CC0541C780874121FCC648BFCF4318FF9AFBBA87E3D"
                                        },
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "DigiCert 'Wyvern2026h2'",
                                            "logId": "C2317E574519A345EE7F38DEB29041EBC7C2215A22BF7FD5B5AD769AD90E52CD",
                                            "timestamp": 1760401563104,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "3045022074723120E123F9F8A9490057A9C6577B5BDE063819EED9347D62AE6B44013E3A022100FFB44B05C808089565C9ED94BE9557BDB6D45B3610D36E81377D0292820B526F"
                                        },
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "DigiCert 'Sphinx2026h2'",
                                            "logId": "944E4387FAECC1EF81F3192426A8186501C7D35F3802013F72677D55372E19D8",
                                            "timestamp": 1760401563125,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "3045022100A31486B7B96F5B32AA4BB17A265B5C145967E8232F121F10972E819245FF409E022048A197DCEBD131686ACA2DE853B80C412B17550DCC0A7315BBFED16437EE7CA7"
                                        }
                                    ],
                                    "certificateTransparencyCompliance": "compliant",
                                    "serverSignatureAlgorithm": 1027,
                                    "encryptedClientHello": false
                                }
                            },
                            "hasExtraInfo": true,
                            "asn": {
                                "ip": "52.58.89.141",
                                "asn": "16509",
                                "country": "US",
                                "description": "AMAZON-02 - Amazon.com, Inc., US",
                                "name": "Amazon.com",
                                "route": "52.56.0.0/14"
                            },
                            "geoip": {
                                "country": "DE",
                                "region": "HE",
                                "timezone": "Europe/Berlin",
                                "city": "Frankfurt am Main",
                                "ll": [
                                    50.1169,
                                    8.6837
                                ],
                                "country_name": "Germany",
                                "metro": 0
                            },
                            "rdns": {
                                "ip": "52.58.89.141",
                                "ptr": "ec2-52-58-89-141.eu-central-1.compute.amazonaws.com"
                            }
                        }
                    },
                    {
                        "request": {
                            "requestId": "51593.11",
                            "loaderId": "4FE06AC2A6A5B2B0109D82677D45DC2B",
                            "documentURL": "https://christiantietze.de/",
                            "request": {
                                "url": "https://christiantietze.de/favicon.ico",
                                "method": "GET",
                                "headers": {
                                    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
                                    "Referer": "https://christiantietze.de/"
                                },
                                "mixedContentType": "none",
                                "initialPriority": "High",
                                "referrerPolicy": "strict-origin-when-cross-origin",
                                "isSameSite": true
                            },
                            "timestamp": 31031589.425511,
                            "wallTime": 1774001155.346587,
                            "initiator": {
                                "type": "other"
                            },
                            "redirectHasExtraInfo": false,
                            "type": "Other",
                            "frameId": "AFF3E41C38C03AD184C0A680EADDE233",
                            "hasUserGesture": false
                        },
                        "response": {
                            "encodedDataLength": 1796,
                            "dataLength": 1406,
                            "requestId": "51593.11",
                            "type": "Other",
                            "response": {
                                "url": "https://christiantietze.de/favicon.ico",
                                "status": 200,
                                "statusText": "OK",
                                "headers": {
                                    "Strict-Transport-Security": "max-age=15552000; includeSubDomains",
                                    "Cache-Control": "max-age=31536000, public",
                                    "ETag": "\"57e-4f64e1ca06bc0\"",
                                    "Connection": "Keep-Alive",
                                    "Accept-Ranges": "bytes",
                                    "Content-Length": "1406",
                                    "Keep-Alive": "timeout=10, max=99",
                                    "Date": "Fri, 20 Mar 2026 10:05:55 GMT",
                                    "Last-Modified": "Sat, 05 Apr 2014 16:27:35 GMT",
                                    "Content-Type": "image/vnd.microsoft.icon",
                                    "Server": "Apache"
                                },
                                "mimeType": "image/vnd.microsoft.icon",
                                "charset": "",
                                "remoteIPAddress": "83.223.95.12",
                                "remotePort": 443,
                                "encodedDataLength": 390,
                                "timing": {
                                    "requestTime": 31031589.425687,
                                    "proxyStart": -1,
                                    "proxyEnd": -1,
                                    "dnsStart": -1,
                                    "dnsEnd": -1,
                                    "connectStart": -1,
                                    "connectEnd": -1,
                                    "sslStart": -1,
                                    "sslEnd": -1,
                                    "workerStart": -1,
                                    "workerReady": -1,
                                    "workerFetchStart": -1,
                                    "workerRespondWithSettled": -1,
                                    "sendStart": 0.131,
                                    "sendEnd": 0.17,
                                    "pushStart": 0,
                                    "pushEnd": 0,
                                    "receiveHeadersStart": 22.721,
                                    "receiveHeadersEnd": 23.845
                                },
                                "responseTime": 1774001155369.475,
                                "protocol": "http/1.1",
                                "alternateProtocolUsage": "unspecifiedReason",
                                "securityState": "secure",
                                "securityDetails": {
                                    "protocol": "TLS 1.3",
                                    "keyExchange": "",
                                    "keyExchangeGroup": "X25519",
                                    "cipher": "AES_256_GCM",
                                    "certificateId": 0,
                                    "subjectName": "christiantietze.de",
                                    "sanList": [
                                        "*.christiantietze.de",
                                        "christiantietze.de"
                                    ],
                                    "issuer": "E8",
                                    "validFrom": 1769241582,
                                    "validTo": 1777017581,
                                    "signedCertificateTimestampList": [
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "Let's Encrypt 'Willow2026h1'",
                                            "logId": "E3238DF28DA288E0AAE0ACF0FA90C985F0B6BFF5D2A527B001FC1C4458C4B6E8",
                                            "timestamp": 1769245092523,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "304602210093C18C0FC1D3A6FEA5E7E2DB2F179CA690E6DF4469595FD05E0EF1D243669304022100BE91B9F928817B5DF15C08C6CF1B102BA5050B889B76D982D7ADA0593A657BE1"
                                        },
                                        {
                                            "status": "Verified",
                                            "origin": "Embedded in certificate",
                                            "logDescription": "Sectigo 'Elephant2026h1'",
                                            "logId": "D16EA9A568077E6635A03F37A5DDBC03A53C411214D48818F5E931B323CB9504",
                                            "timestamp": 1769245092597,
                                            "hashAlgorithm": "SHA-256",
                                            "signatureAlgorithm": "ECDSA",
                                            "signatureData": "3045022100A64184555B2823082C45F8A764EF3C7212FA7A89369F80F165C03FF53EC4441C02207CCC6E1AAD6E17DBE31B8039BE7D9ECFB98FFC4C0D0C3F60CF1D71C84F97E518"
                                        }
                                    ],
                                    "certificateTransparencyCompliance": "compliant",
                                    "serverSignatureAlgorithm": 1027,
                                    "encryptedClientHello": false
                                },
                                "securityHeaders": [
                                    {
                                        "name": "Strict-Transport-Security",
                                        "value": "max-age=15552000; includeSubDomains"
                                    }
                                ]
                            },
                            "hasExtraInfo": true,
                            "hash": "9ce38b22b18949298db3c2a717bb7814c1d9a3c19055db1329ddc41dade9da06",
                            "size": 1876,
                            "asn": {
                                "ip": "83.223.95.12",
                                "asn": "8875",
                                "country": "DE",
                                "description": "SINMA-ASN sinma GmbH, DE",
                                "name": "SINMA-ASN sinma GmbH",
                                "route": "83.223.64.0/19"
                            },
                            "geoip": {
                                "country": "DE",
                                "region": "",
                                "timezone": "Europe/Berlin",
                                "city": "",
                                "ll": [
                                    51.2993,
                                    9.491
                                ],
                                "country_name": "Germany",
                                "metro": 0
                            },
                            "rdns": {
                                "ip": "83.223.95.12",
                                "ptr": "edv38.hostsharing.net"
                            }
                        }
                    }
                ],
                "cookies": [],
                "console": [],
                "links": [
                    {
                        "href": "https://mastodon.social/@ctietze",
                        "text": "@ctietze (Mastodon)",
                        "frameId": "AFF3E41C38C03AD184C0A680EADDE233"
                    },
                    {
                        "href": "https://github.com/DivineDominion",
                        "text": "GitHub",
                        "frameId": "AFF3E41C38C03AD184C0A680EADDE233"
                    },
                    {
                        "href": "http://creativecommons.org/licenses/by-sa/4.0/",
                        "text": "CC BY-SA 4.0",
                        "frameId": "AFF3E41C38C03AD184C0A680EADDE233"
                    }
                ],
                "timing": {
                    "beginNavigation": "2026-03-20T10:05:55.051Z",
                    "frameStartedLoading": "2026-03-20T10:05:55.052Z",
                    "frameNavigated": "2026-03-20T10:05:55.164Z",
                    "domContentEventFired": "2026-03-20T10:05:55.346Z",
                    "frameStoppedLoading": "2026-03-20T10:05:55.347Z"
                },
                "globals": [],
                "storages": []
            },
            "lists": {
                "ips": [
                    "52.58.89.141",
                    "13.107.226.45",
                    "83.223.95.12"
                ],
                "countries": [
                    "DE",
                    "US"
                ],
                "asns": [
                    "16509",
                    "8075",
                    "8875"
                ],
                "domains": [
                    "christiantietze.de",
                    "nom.telemetrydeck.com",
                    "cdn.telemetrydeck.com"
                ],
                "servers": [
                    "Apache",
                    "gunicorn"
                ],
                "urls": [
                    "https://christiantietze.de/",
                    "https://christiantietze.de/css/default.css",
                    "https://christiantietze.de/img/signature.png",
                    "https://christiantietze.de/contact/profile.jpg",
                    "https://cdn.telemetrydeck.com/websdk/telemetrydeck.min.js",
                    "https://nom.telemetrydeck.com/v2/w/",
                    "https://christiantietze.de/favicon.ico"
                ],
                "linkDomains": [
                    "mastodon.social",
                    "github.com",
                    "creativecommons.org"
                ],
                "certificates": [
                    {
                        "subjectName": "christiantietze.de",
                        "issuer": "E8",
                        "validFrom": 1769241582,
                        "validTo": 1777017581
                    },
                    {
                        "subjectName": "cdn.telemetrydeck.com",
                        "issuer": "DigiCert TLS RSA SHA256 2020 CA1",
                        "validFrom": 1753228800,
                        "validTo": 1776211199
                    },
                    {
                        "subjectName": "*.telemetrydeck.com",
                        "issuer": "Amazon ECDSA 256 M01",
                        "validFrom": 1760400000,
                        "validTo": 1794527999
                    }
                ],
                "hashes": [
                    "aa13eeb262026c773abdc21e1f71a9110d88de333b7d34e99e23fef076b2b2ac",
                    "1a8853bc225c960c9a104deac65b5f790bf2b79d72236b491fffbe890c360d8b",
                    "429ed7c948a58fa9311786e9b0baf37c079848196018104a296e2ccd1dbcf570",
                    "26b0a2e5dd0ea6c38bc65007898272955568f5fb40f7a74110f6ff51380654e8",
                    "2633ae3f17ce21dfc782e5c3be4cca36c3f8e48bcaab77348117efab15e4181e",
                    "565339bc4d33d72817b583024112eb7f5cdf3e5eef0252d6ec1b9c9a94e12bb3",
                    "9ce38b22b18949298db3c2a717bb7814c1d9a3c19055db1329ddc41dade9da06"
                ]
            },
            "meta": {
                "processors": {
                    "umbrella": {
                        "data": [
                            {
                                "hostname": "nom.telemetrydeck.com",
                                "rank": 65672
                            }
                        ]
                    },
                    "geoip": {
                        "data": [
                            {
                                "ip": "83.223.95.12",
                                "geoip": {
                                    "country": "DE",
                                    "region": "",
                                    "timezone": "Europe/Berlin",
                                    "city": "",
                                    "ll": [
                                        51.2993,
                                        9.491
                                    ],
                                    "country_name": "Germany",
                                    "metro": 0
                                }
                            },
                            {
                                "ip": "13.107.226.45",
                                "geoip": {
                                    "country": "US",
                                    "region": "",
                                    "timezone": "America/Chicago",
                                    "city": "",
                                    "ll": [
                                        37.751,
                                        -97.822
                                    ],
                                    "country_name": "United States",
                                    "metro": 0
                                }
                            },
                            {
                                "ip": "52.58.89.141",
                                "geoip": {
                                    "country": "DE",
                                    "region": "HE",
                                    "timezone": "Europe/Berlin",
                                    "city": "Frankfurt am Main",
                                    "ll": [
                                        50.1169,
                                        8.6837
                                    ],
                                    "country_name": "Germany",
                                    "metro": 0
                                }
                            }
                        ]
                    },
                    "asn": {
                        "data": [
                            {
                                "ip": "83.223.95.12",
                                "asn": "8875",
                                "country": "DE",
                                "description": "SINMA-ASN sinma GmbH, DE",
                                "name": "SINMA-ASN sinma GmbH",
                                "route": "83.223.64.0/19"
                            },
                            {
                                "ip": "13.107.226.45",
                                "asn": "8075",
                                "country": "US",
                                "description": "MICROSOFT-CORP-MSN-AS-BLOCK - Microsoft Corporation, US",
                                "name": "Microsoft Corporation",
                                "route": "13.107.224.0/20"
                            },
                            {
                                "ip": "52.58.89.141",
                                "asn": "16509",
                                "country": "US",
                                "description": "AMAZON-02 - Amazon.com, Inc., US",
                                "name": "Amazon.com",
                                "route": "52.56.0.0/14"
                            }
                        ]
                    },
                    "rdns": {
                        "data": [
                            {
                                "ip": "83.223.95.12",
                                "ptr": "edv38.hostsharing.net"
                            },
                            {
                                "ip": "52.58.89.141",
                                "ptr": "ec2-52-58-89-141.eu-central-1.compute.amazonaws.com"
                            }
                        ]
                    },
                    "wappa": {
                        "data": []
                    }
                }
            },
            "page": {
                "asn": "AS8875",
                "asnname": "SINMA-ASN sinma GmbH, DE",
                "city": "",
                "country": "DE",
                "domain": "christiantietze.de",
                "ip": "83.223.95.12",
                "ptr": "edv38.hostsharing.net",
                "server": "Apache",
                "url": "https://christiantietze.de/",
                "apexDomainAgeDays": 3845,
                "language": "en",
                "mimeType": "text/html",
                "title": "Welcome! • Christian Tietze",
                "tlsValidDays": 89,
                "tlsAgeDays": 55,
                "domainAgeDays": 3845,
                "tlsValidFrom": "2026-01-24T07:59:42.000Z",
                "apexDomain": "christiantietze.de",
                "tlsIssuer": "E8",
                "status": "200"
            },
            "scanner": {
                "country": "de"
            },
            "stats": {
                "IPv6Percentage": 0,
                "adBlocked": 0,
                "domainStats": [
                    {
                        "count": 5,
                        "ips": [
                            "83.223.95.12"
                        ],
                        "domain": "christiantietze.de",
                        "size": 397712,
                        "encodedSize": 357051,
                        "countries": [
                            "DE"
                        ],
                        "index": 0,
                        "initiators": [
                            "christiantietze.de"
                        ],
                        "redirects": 0
                    },
                    {
                        "count": 2,
                        "ips": [
                            "52.58.89.141"
                        ],
                        "domain": "nom.telemetrydeck.com",
                        "size": 2,
                        "encodedSize": 143,
                        "countries": [
                            "DE"
                        ],
                        "index": 5,
                        "initiators": [
                            "cdn.telemetrydeck.com"
                        ],
                        "redirects": 0
                    },
                    {
                        "count": 1,
                        "ips": [
                            "13.107.226.45"
                        ],
                        "domain": "cdn.telemetrydeck.com",
                        "size": 681,
                        "encodedSize": 1009,
                        "countries": [
                            "US"
                        ],
                        "index": 4,
                        "initiators": [
                            "christiantietze.de"
                        ],
                        "redirects": 0
                    }
                ],
                "ipStats": [
                    {
                        "requests": 5,
                        "domains": [
                            "christiantietze.de"
                        ],
                        "ip": "83.223.95.12",
                        "asn": {
                            "ip": "83.223.95.12",
                            "asn": "8875",
                            "country": "DE",
                            "description": "SINMA-ASN sinma GmbH, DE",
                            "name": "SINMA-ASN sinma GmbH",
                            "route": "83.223.64.0/19"
                        },
                        "dns": [],
                        "geoip": {
                            "country": "DE",
                            "region": "",
                            "timezone": "Europe/Berlin",
                            "city": "",
                            "ll": [
                                51.2993,
                                9.491
                            ],
                            "country_name": "Germany",
                            "metro": 0
                        },
                        "size": 397712,
                        "encodedSize": 357051,
                        "countries": [
                            "DE"
                        ],
                        "index": 0,
                        "ipv6": false,
                        "redirects": 0,
                        "count": null,
                        "rdns": {
                            "ip": "83.223.95.12",
                            "ptr": "edv38.hostsharing.net"
                        }
                    },
                    {
                        "requests": 1,
                        "domains": [
                            "cdn.telemetrydeck.com"
                        ],
                        "ip": "13.107.226.45",
                        "asn": {
                            "ip": "13.107.226.45",
                            "asn": "8075",
                            "country": "US",
                            "description": "MICROSOFT-CORP-MSN-AS-BLOCK - Microsoft Corporation, US",
                            "name": "Microsoft Corporation",
                            "route": "13.107.224.0/20"
                        },
                        "dns": [],
                        "geoip": {
                            "country": "US",
                            "region": "",
                            "timezone": "America/Chicago",
                            "city": "",
                            "ll": [
                                37.751,
                                -97.822
                            ],
                            "country_name": "United States",
                            "metro": 0
                        },
                        "size": 681,
                        "encodedSize": 1009,
                        "countries": [
                            "US"
                        ],
                        "index": 4,
                        "ipv6": false,
                        "redirects": 0,
                        "count": null
                    },
                    {
                        "requests": 2,
                        "domains": [
                            "nom.telemetrydeck.com"
                        ],
                        "ip": "52.58.89.141",
                        "asn": {
                            "ip": "52.58.89.141",
                            "asn": "16509",
                            "country": "US",
                            "description": "AMAZON-02 - Amazon.com, Inc., US",
                            "name": "Amazon.com",
                            "route": "52.56.0.0/14"
                        },
                        "dns": [],
                        "geoip": {
                            "country": "DE",
                            "region": "HE",
                            "timezone": "Europe/Berlin",
                            "city": "Frankfurt am Main",
                            "ll": [
                                50.1169,
                                8.6837
                            ],
                            "country_name": "Germany",
                            "metro": 0
                        },
                        "size": 2,
                        "encodedSize": 143,
                        "countries": [
                            "DE"
                        ],
                        "index": 5,
                        "ipv6": false,
                        "redirects": 0,
                        "count": null,
                        "rdns": {
                            "ip": "52.58.89.141",
                            "ptr": "ec2-52-58-89-141.eu-central-1.compute.amazonaws.com"
                        }
                    }
                ],
                "malicious": 0,
                "protocolStats": [
                    {
                        "count": 5,
                        "size": 397712,
                        "encodedSize": 357051,
                        "ips": [
                            "83.223.95.12"
                        ],
                        "countries": [
                            "DE"
                        ],
                        "securityState": [],
                        "protocol": "http/1.1"
                    },
                    {
                        "count": 3,
                        "size": 683,
                        "encodedSize": 1152,
                        "ips": [
                            "13.107.226.45",
                            "52.58.89.141"
                        ],
                        "countries": [
                            "US",
                            "DE"
                        ],
                        "securityState": [],
                        "protocol": "h2"
                    }
                ],
                "regDomainStats": [
                    {
                        "count": 5,
                        "ips": [
                            "83.223.95.12"
                        ],
                        "regDomain": "christiantietze.de",
                        "size": 397712,
                        "encodedSize": 357051,
                        "countries": [],
                        "index": 0,
                        "subDomains": [
                            {
                                "domain": "",
                                "country": "DE"
                            }
                        ],
                        "redirects": 0
                    },
                    {
                        "count": 3,
                        "ips": [
                            "13.107.226.45",
                            "52.58.89.141"
                        ],
                        "regDomain": "telemetrydeck.com",
                        "size": 683,
                        "encodedSize": 1152,
                        "countries": [],
                        "index": 4,
                        "subDomains": [
                            {
                                "domain": "cdn",
                                "country": "US"
                            },
                            {
                                "domain": "nom",
                                "country": "DE"
                            }
                        ],
                        "redirects": 0
                    }
                ],
                "resourceStats": [
                    {
                        "count": 2,
                        "size": 338794,
                        "encodedSize": 339552,
                        "latency": 0,
                        "countries": [
                            "DE"
                        ],
                        "ips": [
                            "83.223.95.12"
                        ],
                        "type": "Image",
                        "compression": "1.0",
                        "percentage": 25
                    },
                    {
                        "count": 1,
                        "size": 1406,
                        "encodedSize": 1796,
                        "latency": 0,
                        "countries": [
                            "DE"
                        ],
                        "ips": [
                            "83.223.95.12"
                        ],
                        "type": "Other",
                        "compression": "0.8",
                        "percentage": 12
                    },
                    {
                        "count": 1,
                        "size": 0,
                        "encodedSize": 0,
                        "latency": 0,
                        "countries": [
                            "DE"
                        ],
                        "ips": [
                            "52.58.89.141"
                        ],
                        "type": "Preflight",
                        "compression": "NaN",
                        "percentage": 12
                    },
                    {
                        "count": 1,
                        "size": 2,
                        "encodedSize": 143,
                        "latency": 0,
                        "countries": [
                            "DE"
                        ],
                        "ips": [
                            "52.58.89.141"
                        ],
                        "type": "Fetch",
                        "compression": "0.0",
                        "percentage": 12
                    },
                    {
                        "count": 1,
                        "size": 681,
                        "encodedSize": 1009,
                        "latency": 0,
                        "countries": [
                            "US"
                        ],
                        "ips": [
                            "13.107.226.45"
                        ],
                        "type": "Script",
                        "compression": "0.7",
                        "percentage": 12
                    },
                    {
                        "count": 1,
                        "size": 46236,
                        "encodedSize": 11521,
                        "latency": 0,
                        "countries": [
                            "DE"
                        ],
                        "ips": [
                            "83.223.95.12"
                        ],
                        "type": "Stylesheet",
                        "compression": "4.0",
                        "percentage": 12
                    },
                    {
                        "count": 1,
                        "size": 11276,
                        "encodedSize": 4182,
                        "latency": 0,
                        "countries": [
                            "DE"
                        ],
                        "ips": [
                            "83.223.95.12"
                        ],
                        "type": "Document",
                        "compression": "2.7",
                        "percentage": 12
                    }
                ],
                "securePercentage": 100,
                "secureRequests": 8,
                "serverStats": [
                    {
                        "count": 5,
                        "size": 397712,
                        "encodedSize": 357051,
                        "ips": [
                            "83.223.95.12"
                        ],
                        "countries": [
                            "DE"
                        ],
                        "server": "Apache"
                    },
                    {
                        "count": 2,
                        "size": 2,
                        "encodedSize": 143,
                        "ips": [
                            "52.58.89.141"
                        ],
                        "countries": [
                            "DE"
                        ],
                        "server": "gunicorn"
                    }
                ],
                "tlsStats": [
                    {
                        "count": 8,
                        "size": 398395,
                        "encodedSize": 358203,
                        "ips": [
                            "83.223.95.12",
                            "13.107.226.45",
                            "52.58.89.141"
                        ],
                        "countries": [
                            "DE",
                            "US"
                        ],
                        "protocols": {
                            "TLS 1.3 /  / AES_256_GCM": 6,
                            "TLS 1.2 / ECDHE_ECDSA / AES_128_GCM": 2
                        },
                        "securityState": "secure"
                    }
                ],
                "totalLinks": 3,
                "uniqCountries": 2
            },
            "submitter": {
                "country": "GB"
            },
            "task": {
                "method": "api",
                "source": "fb1d0777",
                "tags": [
                    "website-rank",
                    "christiantietze.de"
                ],
                "time": "2026-03-20T10:06:01.343Z",
                "url": "https://christiantietze.de/",
                "uuid": "019d0ab5-6bba-760d-88d0-94543d41dc2e",
                "visibility": "public",
                "reportURL": "https://urlscan.io/result/019d0ab5-6bba-760d-88d0-94543d41dc2e/",
                "screenshotURL": "https://urlscan.io/screenshots/019d0ab5-6bba-760d-88d0-94543d41dc2e.png",
                "domURL": "https://urlscan.io/dom/019d0ab5-6bba-760d-88d0-94543d41dc2e/",
                "domain": "christiantietze.de",
                "apexDomain": "christiantietze.de"
            },
            "verdicts": {
                "overall": {
                    "score": 0,
                    "categories": [],
                    "brands": [],
                    "tags": [],
                    "malicious": false,
                    "hasVerdicts": true
                },
                "urlscan": {
                    "score": 0,
                    "categories": [],
                    "brands": [],
                    "tags": [],
                    "malicious": false,
                    "hasVerdicts": false
                },
                "engines": {
                    "score": -7,
                    "malicious": false,
                    "categories": [],
                    "enginesTotal": 0,
                    "maliciousTotal": 0,
                    "benignTotal": 0,
                    "maliciousVerdicts": [],
                    "benignVerdicts": [],
                    "hasVerdicts": true,
                    "tags": [
                        "urlscan-ml",
                        "urlscan-ml-60c5e22"
                    ]
                },
                "community": {
                    "score": 0,
                    "categories": [],
                    "brands": [],
                    "votesTotal": 0,
                    "votesMalicious": 0,
                    "votesBenign": 0,
                    "malicious": false,
                    "hasVerdicts": false
                }
            }
        },
        "report_summary": {
            "page_url": "https://christiantietze.de/",
            "page_domain": "christiantietze.de",
            "ip": "83.223.95.12",
            "country": "DE",
            "server": "Apache",
            "asn": "AS8875",
            "status_code": 200,
            "screenshot_url": "https://urlscan.io/screenshots/019d0ab5-6bba-760d-88d0-94543d41dc2e.png",
            "report_url": "https://urlscan.io/result/019d0ab5-6bba-760d-88d0-94543d41dc2e/",
            "requests": 0,
            "unique_countries": 2,
            "domains": 0,
            "malicious": false,
            "classification": "",
            "verdict_text": "No clear malicious classification",
            "brands": [],
            "labels": [],
            "lists": {
                "ips": [
                    "52.58.89.141",
                    "13.107.226.45",
                    "83.223.95.12"
                ],
                "countries": [
                    "DE",
                    "US"
                ],
                "asns": [
                    "16509",
                    "8075",
                    "8875"
                ],
                "domains": [
                    "christiantietze.de",
                    "nom.telemetrydeck.com",
                    "cdn.telemetrydeck.com"
                ],
                "servers": [
                    "Apache",
                    "gunicorn"
                ],
                "urls": [
                    "https://christiantietze.de/",
                    "https://christiantietze.de/css/default.css",
                    "https://christiantietze.de/img/signature.png",
                    "https://christiantietze.de/contact/profile.jpg",
                    "https://cdn.telemetrydeck.com/websdk/telemetrydeck.min.js",
                    "https://nom.telemetrydeck.com/v2/w/",
                    "https://christiantietze.de/favicon.ico"
                ],
                "linkDomains": [
                    "mastodon.social",
                    "github.com",
                    "creativecommons.org"
                ],
                "certificates": [
                    {
                        "subjectName": "christiantietze.de",
                        "issuer": "E8",
                        "validFrom": 1769241582,
                        "validTo": 1777017581
                    },
                    {
                        "subjectName": "cdn.telemetrydeck.com",
                        "issuer": "DigiCert TLS RSA SHA256 2020 CA1",
                        "validFrom": 1753228800,
                        "validTo": 1776211199
                    },
                    {
                        "subjectName": "*.telemetrydeck.com",
                        "issuer": "Amazon ECDSA 256 M01",
                        "validFrom": 1760400000,
                        "validTo": 1794527999
                    }
                ],
                "hashes": [
                    "aa13eeb262026c773abdc21e1f71a9110d88de333b7d34e99e23fef076b2b2ac",
                    "1a8853bc225c960c9a104deac65b5f790bf2b79d72236b491fffbe890c360d8b",
                    "429ed7c948a58fa9311786e9b0baf37c079848196018104a296e2ccd1dbcf570",
                    "26b0a2e5dd0ea6c38bc65007898272955568f5fb40f7a74110f6ff51380654e8",
                    "2633ae3f17ce21dfc782e5c3be4cca36c3f8e48bcaab77348117efab15e4181e",
                    "565339bc4d33d72817b583024112eb7f5cdf3e5eef0252d6ec1b9c9a94e12bb3",
                    "9ce38b22b18949298db3c2a717bb7814c1d9a3c19055db1329ddc41dade9da06"
                ]
            }
        },
        "completed_at": "2026-03-20T10:06:43+00:00",
        "is_fresh": false,
        "can_retry": true,
        "poll_after_seconds": 20
    }
}