{
    "ready": true,
    "site": {
        "id": 0,
        "domain": "monotux.tech",
        "display_name": "monotux.tech",
        "primary_country_code": "",
        "category_name": "Developer Tools: DevOps & Cloud"
    },
    "metrics": {
        "global_rank": 3197646,
        "country_rank": 1087200,
        "category_rank": 511623,
        "daily_pageviews_per_visitor": 4.44,
        "daily_time_on_site_seconds": 438,
        "bounce_rate": 22.56,
        "search_visits_percent": 37.99,
        "total_sites_linking_in": 2,
        "monthly_unique_visitors": 250,
        "recorded_at": "2026-03-18 19:24:53"
    },
    "audit": {
        "score": 80
    },
    "traffic_sources": {
        "direct_percent": 27.41,
        "search_percent": 35.84,
        "social_percent": 3.02,
        "referral_percent": 19.53,
        "email_percent": 6.65,
        "paid_percent": 7.55
    },
    "seo_profile": {
        "backlinks_total": 2,
        "referring_domains": 2,
        "dofollow_backlinks_percent": 100,
        "organic_keywords": 66,
        "indexed_pages": 312,
        "page_speed_score": 97,
        "mobile_friendliness_score": 74,
        "authority_score": 36,
        "spam_risk_score": 48
    },
    "crawl_report": {
        "robots_status": 200,
        "sitemap_status": 200,
        "sitemap_total_urls": 312,
        "crawl_blocked": false,
        "crawl_blocked_by": "",
        "crawl_blocked_reason": "",
        "notes": [
            "Meta description is missing."
        ],
        "created_at": "2026-03-18 19:24:53"
    },
    "keywords": [
        {
            "keyword": "monotux.tech",
            "position": 22,
            "search_engine": "Estimated",
            "checked_at": "2026-06-23 23:21:27",
            "is_estimated": true
        },
        {
            "keyword": "monotux.tech developer tools: devops & cloud",
            "position": 24,
            "search_engine": "Estimated",
            "checked_at": "2026-06-23 23:21:27",
            "is_estimated": true
        },
        {
            "keyword": "monotux.tech reviews",
            "position": 26,
            "search_engine": "Estimated",
            "checked_at": "2026-06-23 23:21:27",
            "is_estimated": true
        },
        {
            "keyword": "monotux",
            "position": 28,
            "search_engine": "Estimated",
            "checked_at": "2026-06-23 23:21:27",
            "is_estimated": true
        },
        {
            "keyword": "tech",
            "position": 30,
            "search_engine": "Estimated",
            "checked_at": "2026-06-23 23:21:27",
            "is_estimated": true
        },
        {
            "keyword": "about",
            "position": 32,
            "search_engine": "Estimated",
            "checked_at": "2026-06-23 23:21:27",
            "is_estimated": true
        },
        {
            "keyword": "blog",
            "position": 34,
            "search_engine": "Estimated",
            "checked_at": "2026-06-23 23:21:27",
            "is_estimated": true
        },
        {
            "keyword": "tags",
            "position": 36,
            "search_engine": "Estimated",
            "checked_at": "2026-06-23 23:21:27",
            "is_estimated": true
        }
    ],
    "rating": {
        "overall": 55,
        "label": "Healthy",
        "breakdown": [
            {
                "label": "Technical foundation",
                "score": 16,
                "max": 18
            },
            {
                "label": "Authority & trust",
                "score": 11,
                "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": 89,
                "max": 100
            },
            {
                "label": "Reputation system",
                "score": 41,
                "max": 100
            },
            {
                "label": "Safety system",
                "score": 100,
                "max": 100
            },
            {
                "label": "Evidence confidence",
                "score": 100,
                "max": 100
            }
        ],
        "authority_score": 36,
        "quality_score": 89,
        "reputation_score": 41,
        "safety_score": 100,
        "confidence_score": 100,
        "fraud_score": 0,
        "authority_signals": {
            "backlinks": 2,
            "referring_domains": 2,
            "organic_keywords": 66,
            "indexed_pages": 312,
            "monthly_visitors": 250,
            "global_rank": 3197646,
            "engagement_score": 88,
            "crawl_quality_score": 96,
            "brand_completeness_score": 43,
            "link_diversity_score": 93,
            "technical_reliability_score": 89,
            "whois_score": 45,
            "whois_age_years": 0,
            "whois_stability_score": 100,
            "spam_penalty": 6
        },
        "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
        }
    },
    "community_ratings": {
        "votes": [],
        "recent_notes": [],
        "positive_weight": 0,
        "negative_weight": 0,
        "positive_count": 0,
        "negative_count": 0,
        "authenticated_count": 0,
        "anonymous_count": 0,
        "community_delta": 0,
        "community_score": 50,
        "confidence_score": 0,
        "notice": null,
        "positive_notice": false,
        "negative_notice": false,
        "neutral_count": 0,
        "total_votes": 0
    },
    "authority_score": 36,
    "trust_score": 38,
    "domain_tags": {
        "primary_tag": "",
        "primary_tag_score": 0,
        "primary_candidate": "Billing",
        "primary_candidate_score": 0,
        "tag_codes": "",
        "tags": [],
        "tag_breakdown": [
            {
                "code": "Billing",
                "label": "Deceptive billing risk",
                "tone": "scam",
                "description": "Subscription, renewal, charge, or cancellation-abuse signals were detected.",
                "reason": "Subscription, renewal, charge, or cancellation-risk signals were detected.",
                "message": "No meaningful deceptive-billing signals were detected.",
                "priority": 0,
                "score": 0,
                "match_percent": 0,
                "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"
            },
            {
                "code": "FakeShop",
                "label": "Fake shop risk",
                "tone": "spam",
                "description": "The site behaves like a store but has weak legal or business evidence.",
                "reason": "Store-like behaviour was detected without strong legal or business evidence.",
                "message": "No meaningful fake-shop signals were detected.",
                "priority": 0,
                "score": 0,
                "match_percent": 0,
                "threshold_band": "none"
            }
        ],
        "nsfw_score": 0,
        "trust_score": 39,
        "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": "No hard warning tag fired, and the signal mix leans stable rather than risky.",
        "external_intel": {
            "domain": "monotux.tech",
            "candidate_tag": "",
            "checked_at": "2026-06-23T23:21:27+00:00",
            "status": "queued",
            "snapshot_version": 9,
            "summary": "External intelligence is now manual-only. Use Refresh data to trigger search and review intelligence gathering for this domain.",
            "search_intelligence": {
                "queries": [],
                "providers": [],
                "results_found": 0,
                "results": [],
                "source_mix": [],
                "entity_coverage_score": 0
            },
            "review_intelligence": {
                "documents_fetched": 0,
                "documents": [],
                "facts": [],
                "ignored_candidates": [],
                "source_diversity": 0,
                "elapsed_ms": 0,
                "candidates_considered": 0,
                "fetch_success_rate": 0,
                "avg_source_trust": 0,
                "avg_entity_score": 0
            },
            "evidence": {
                "scores": [],
                "counts": [],
                "tag_support": [],
                "top_supporting_facts": [],
                "top_positive_facts": []
            },
            "quality": {
                "source_diversity_score": 0,
                "entity_coverage_score": 0,
                "freshness_score": 0,
                "confidence": 0,
                "documents_fetched": 0,
                "fact_count": 0,
                "avg_source_trust": 0,
                "avg_entity_score": 0,
                "fetch_success_rate": 0,
                "exact_match_score": 0,
                "query_coverage_score": 0
            },
            "decision": {
                "state": "insufficient",
                "uncertainty": true,
                "candidate_support": 0,
                "candidate_contradiction": 0,
                "supports": [],
                "evidence_quality": "low",
                "state_label": "Inconclusive",
                "state_reason": "Search and review intelligence has not produced enough qualified evidence yet to harden the verdict."
            },
            "signals": {
                "scores": [],
                "counts": [],
                "candidate_support": 0,
                "candidate_contradiction": 0,
                "highlights": []
            },
            "citations": [],
            "urlscan": [],
            "provider_enrichment": {
                "providers": [],
                "facts": [],
                "citations": [],
                "highlights": [],
                "quality": {
                    "provider_diversity_score": 0,
                    "provider_confidence_score": 0,
                    "provider_fact_count": 0
                }
            },
            "eligibility": [],
            "cooldown": [],
            "debug": []
        },
        "external_decision": {
            "state": "insufficient",
            "uncertainty": true,
            "candidate_support": 0,
            "candidate_contradiction": 0,
            "supports": [],
            "evidence_quality": "low",
            "state_label": "Inconclusive",
            "state_reason": "Search and review intelligence has not produced enough qualified evidence yet to harden the verdict."
        },
        "signal_scores": [
            {
                "label": "Strongest tag heuristic",
                "value": "Billing",
                "tone": "scam",
                "detail": "The highest raw tag match from the heuristic engine before visibility thresholds and manual overrides."
            },
            {
                "label": "Trust score",
                "value": "39/100",
                "tone": "spam",
                "detail": "Confidence derived from authority, crawl quality, stability, and risk signals."
            },
            {
                "label": "Authority score",
                "value": "36/100",
                "tone": "caution",
                "detail": "A higher authority score usually means broader reputation and backlink confidence."
            },
            {
                "label": "Spam risk",
                "value": "26/100",
                "tone": "caution",
                "detail": "Lower is better. This blends spam indicators with false-positive protections for legitimate sites."
            },
            {
                "label": "Quality score",
                "value": "82/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": "2",
                        "tone": "unknown",
                        "detail": "Broader backlink evidence usually improves confidence."
                    },
                    {
                        "label": "Referring domains",
                        "value": "2",
                        "tone": "unknown",
                        "detail": "Unique linking domains are more useful than raw link volume."
                    },
                    {
                        "label": "Organic keywords",
                        "value": "66",
                        "tone": "caution",
                        "detail": "Search footprint helps distinguish real sites from thin shells."
                    },
                    {
                        "label": "Indexed pages",
                        "value": "312",
                        "tone": "good",
                        "detail": "Larger index coverage usually means more evidence to classify from."
                    },
                    {
                        "label": "Brand strength",
                        "value": "43/100",
                        "tone": "caution",
                        "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 - 256 ms",
                        "tone": "good",
                        "detail": "Slow or broken technical signals weaken confidence."
                    },
                    {
                        "label": "Content words",
                        "value": "774",
                        "tone": "good",
                        "detail": "Thin pages are harder to trust and easier to manipulate."
                    },
                    {
                        "label": "Schema / structure",
                        "value": "0 schema - no meta - H1",
                        "tone": "caution",
                        "detail": "Structured markup and basic on-page hygiene improve quality confidence."
                    },
                    {
                        "label": "Links on page",
                        "value": "240 internal - 0 external",
                        "tone": "good",
                        "detail": "Link patterns help detect thin directories and promo pages."
                    },
                    {
                        "label": "Page speed / mobile",
                        "value": "97/100 - 74/100",
                        "tone": "good",
                        "detail": "Better technical quality generally reduces low-effort site patterns."
                    },
                    {
                        "label": "Crawl access",
                        "value": "Open",
                        "tone": "good",
                        "detail": "The crawler reached the site without an anti-bot challenge."
                    }
                ]
            },
            {
                "title": "External evidence & explainability",
                "items": [
                    {
                        "label": "Decision state",
                        "value": "Inconclusive",
                        "tone": "unknown",
                        "detail": "Search and review intelligence has not produced enough qualified evidence yet to harden the verdict."
                    },
                    {
                        "label": "Evidence quality",
                        "value": "Low",
                        "tone": "unknown",
                        "detail": "Blends source trust, domain matching, evidence diversity, and freshness."
                    },
                    {
                        "label": "Support vs contradiction",
                        "value": "0 / 0",
                        "tone": "unknown",
                        "detail": "Compares how much structured external evidence supports the candidate tag against evidence that contradicts it."
                    },
                    {
                        "label": "Qualified risk sources",
                        "value": "No",
                        "tone": "good",
                        "detail": "Risk tags only promote from external evidence when source diversity or source trust thresholds are met."
                    },
                    {
                        "label": "Uncertainty buffer",
                        "value": "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": 40,
    "whois": {
        "current": {
            "id": 21125,
            "domain": "monotux.tech",
            "source_type": "whois_text",
            "rdap_url": "",
            "registrar_name": "",
            "registrar_handle": "",
            "registrant_name": "",
            "registrant_org": "",
            "registrant_country": "",
            "registrant_email": "",
            "abuse_email": "",
            "created_date": null,
            "updated_date": null,
            "expires_date": null,
            "nameservers_json": "[]",
            "status_json": "[]",
            "dnssec": "unknown",
            "privacy_protected": 0,
            "content_hash": "f7e17c57c5fdd24df1793ece6bff99716369356b90b29c4725ac3ba12a76b72c",
            "history_count": 1,
            "last_checked_at": "2026-03-18 19:24:52",
            "last_changed_at": "2026-03-18 19:24:52",
            "created_at": "2026-03-18 19:24:52",
            "updated_at": "2026-03-18 19:24:52"
        },
        "history": [
            {
                "id": 21488,
                "domain": "monotux.tech",
                "source_type": "whois_text",
                "registrar_name": "",
                "registrar_handle": "",
                "registrant_name": "",
                "registrant_org": "",
                "registrant_country": "",
                "registrant_email": "",
                "abuse_email": "",
                "created_date": null,
                "updated_date": null,
                "expires_date": null,
                "nameservers_json": "[]",
                "status_json": "[]",
                "dnssec": "unknown",
                "privacy_protected": 0,
                "content_hash": "f7e17c57c5fdd24df1793ece6bff99716369356b90b29c4725ac3ba12a76b72c",
                "checked_at": "2026-03-18 19:24:52",
                "change_summary": "Initial WHOIS snapshot captured.",
                "created_at": "2026-03-18 19:24:52"
            }
        ],
        "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": 68569,
        "domain": "monotux.tech",
        "first_seen_at": "2026-03-15 18:57:00",
        "last_crawled_at": "2026-03-18 19:24:53",
        "last_title": "monotux.tech",
        "last_http_status": 200,
        "discovered_from_domain": "250kb.club",
        "depth": 0,
        "backlinks_count": 2,
        "rating_cache": 55,
        "spam_score": 24,
        "risk_label": "good",
        "category_name": "Developer Tools: DevOps & Cloud",
        "primary_country_code": "",
        "internal_links_count": 240,
        "external_links_count": 0,
        "social_profiles_count": 0,
        "content_word_count": 774,
        "title_quality_score": 79,
        "has_meta_description": 0,
        "has_h1": 1,
        "language_code": "en",
        "response_time_ms": 256,
        "robots_status": 200,
        "sitemap_status": 200,
        "sitemap_total_urls": 312,
        "quality_score": 82,
        "site_name": "",
        "canonical_domain": "",
        "favicon_present": 0,
        "schema_org_count": 0,
        "noindex_detected": 0,
        "feed_links_count": 1,
        "https_working": 1,
        "estimated_authority_score": 36,
        "trust_score": 76,
        "nsfw_score": 0,
        "overall_rank_estimate": 11251,
        "primary_tag": "",
        "tag_codes": "",
        "manual_verified_status": "",
        "manual_tag_codes": "",
        "manual_rating_delta": 0,
        "manual_authority_delta": 0,
        "manual_trust_delta": 0,
        "manual_note": null,
        "manual_adjusted_by": null,
        "manual_adjusted_at": null,
        "manual_lock_scores": 0,
        "manual_lock_flags": 0,
        "crawl_blocked": 0,
        "crawl_blocked_by": "",
        "crawl_blocked_reason": null,
        "safety_score": 100,
        "fraud_score": 0,
        "legitimacy_score": 43,
        "infrastructure_risk_score": 0,
        "score_confidence": 100,
        "tag_confidence": 72,
        "category_confidence": 99,
        "deep_crawl_pages": 50,
        "resolved_ip": "66.241.124.208",
        "category_candidates_json": "[{\"category\":\"Developer Tools: DevOps & Cloud\",\"score\":100},{\"category\":\"Technology: Hardware & Electronics\",\"score\":100},{\"category\":\"Technology: Cybersecurity\",\"score\":22},{\"category\":\"Personal: Blogs & Journals\",\"score\":17}]",
        "page_signals_json": "[{\"path\":\"/about\",\"status\":200,\"title\":\"About - monotux.tech\",\"word_count\":82,\"summary_text\":\"About - monotux.tech About - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchAboutSeptember 10, 2019Father of two, born in the mid-eighties. Based in the northernmost, rural parts of Sweden, working in IT operations. I keep this blog to document what I&rsquo;ve learned so far.Some interests include:Photography, digital and analog, and especially darkroom printing!NixOS & FreeBSDEmacsI keep my homelab configuration (using Ansible) in a public repository over at git.sr.ht/~monotux/homelab, please have a look if it interests you!I also have a personal blog (in Swedish), mostly about photography.Back to top &mdash; &copy; 2026\",\"classification_terms\":[\"about\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/\",\"status\":200,\"title\":\"All Tags - monotux.tech\",\"word_count\":129,\"summary_text\":\"All Tags - monotux.tech All Tags - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchAll tags (112)433mhz(3) acme(5) alpine linux(1) ansible(13) apple(3) backup(3) bash(1) bgp(1) bluetooth(1) boring dystopia(2) bufferbloat(1) caddy(4) certificates(2) chatgpt(1) ci/cd(4) debian(3) diy(1) django(1) dns(3) dnsmasq(4) docker(5) emacs(7) emqx(1) facebook(1) fedora linux(3) firewall(2) fly.io(6) forgejo(2) foss(1) freebsd(9) freenas(2) gadgets(1) garage(1) gitea(4) goatcounter(1) grocy(1) hardware(6) hello-world(2) home assistant(8) hugo(10) incus(3) influxdb(2) ios(2) ipv6(2) isc-kea(2) javascript(2) jerk(1) keyboards(4) kubernetes(3) laminar(1) late-stage capitalism(1) linkding(2) linux(1) litestream(2) macos(4) mermaidjs(3) meta(1) mikrotik(1) monitoring(3) mqtt(8) mu4e(1) multimedia(1) networkd(1) networking(16)\",\"classification_terms\":[\"tags\",\"about\",\"api\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/uses\",\"status\":200,\"title\":\"The things I use - monotux.tech\",\"word_count\":825,\"summary_text\":\"The things I use - monotux.tech The things I use - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchThe things I useNovember 9, 2021Inspired by others (uglyduck.ca, kevq.uk) this page will list (some) of the things I use in my everyday (tech) life.Table of ContentsHardwareLaptopWorkstationatomicinitialunicornkubernetes clusterSBCsSoftwareThis blogBlog themeApplicationsServicesSelf-hostedManagedNetworkingHardwareLaptopMy current main machine, bought used in late 2021. I ran Asahi Fedora Linux on it for a while in 2025, but it wasn't great so I'm back on macOS again.ModelApple Macbook Air M1Memory8 GBStorage256 GBOSmacOSWorkstationMostly used for gaming and photo editing. Recently upgraded (due to reasons) using a quirky and cheap motherboard I found via forums.servethehome.com. This new build is 3 times faster than my\",\"classification_terms\":[\"uses\",\"about\",\"forum\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/search\",\"status\":200,\"title\":\"monotux.tech\",\"word_count\":23,\"summary_text\":\"monotux.tech monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchSearchThis search requires JavaScript, and will consume several hundreds of KBs of bandwidth while in use!window.addEventListener(\\\"DOMContentLoaded\\\",()=>{new PagefindUI({element:\\\"#search\\\",showSubResults:!0,resetStyles:!0,pageSize:10,showImages:!1,autofocus:!0,sort:{date:\\\"desc\\\"}})})Back to top &mdash; &copy; 2026\",\"classification_terms\":[\"search\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2026/02/ansible-incus/\",\"status\":200,\"title\":\"Configure Incus containers using Ansible - monotux.tech\",\"word_count\":701,\"summary_text\":\"Configure Incus containers using Ansible - monotux.tech Configure Incus containers using Ansible - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchConfigure Incus containers using AnsibleFebruary 13, 2026 Incus AnsibleThis post will outline how I setup an Ansible playbook to manage a Incus container on a remote host. This was fairly straight forward1 but I couldn&rsquo;t find a suitable write-up elsewhere so here we go!Table of ContentsOverviewSetup Incus clientAnsibleConnection configurationTestingOverviewI&rsquo;m running the Ansible playbook from my laptop (with an Incus client installed) and the remote Incus host is reached through a VPN (tailscale) and I&rsquo;m using TLS for authentication in Incus.Initially I thought Ansible was to ssh to the incus host, and then just exec into each container somehow. This is not the case &ndash; An\",\"classification_terms\":[\"posts/2026/02/ansible-incus\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":1,\"depth\":1},{\"path\":\"/tags/incus\",\"status\":200,\"title\":\"Tag: Incus - monotux.tech\",\"word_count\":29,\"summary_text\":\"Tag: Incus - monotux.tech Tag: Incus - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchIncus (3)2026FebruaryConfigure Incus containers using Ansible incus ansible2025OctoberMove Incus containers between storage pools incus zfs2024NovemberIncus primer primer networking incus zfsBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/incus\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/ansible\",\"status\":200,\"title\":\"Tag: Ansible - monotux.tech\",\"word_count\":99,\"summary_text\":\"Tag: Ansible - monotux.tech Tag: Ansible - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchAnsible (13)Anything can be done with a few hundred lines of yaml!2026FebruaryConfigure Incus containers using Ansible incus ansible2025OctoberUbiquity EdgeRouter Infinity ER-8-XG hardware ubiquity networking primer ansibleMarchBetter Ansible Vault passphrase management ansible secrets2022DecemberThin Clients, great plans ansible kubernetes hardwareOctoberBuilding Navidrome with Ansible ansible freebsd yamlJulyAnsible & lineinfile ansible yamlFebruaryLatest pkg in FreeBSD freebsd ansible yaml2021DecemberIssues with Ansible Crypto on MacOS ansible macos yamlNovemberMaximize ssh audit score ansible freebsd yamlSeptemberKea, Ansible & FreeBSD ansible freebsd isc-kea yamlAprilFirewall for FreeBSD jails freebsd firewall ansible\",\"classification_terms\":[\"tags/ansible\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2026/01/search/\",\"status\":200,\"title\":\"Implementing search on this site - monotux.tech\",\"word_count\":625,\"summary_text\":\"Implementing search on this site - monotux.tech Implementing search on this site - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchImplementing search on this siteJanuary 27, 2026 Hugo CI/CD WoodpeckerI decided to add a search function to this blog, but this time I had to accept some browser side JavaScript for it to function. This entry will describe how I implemented this (using pagefind) on this site.Table of ContentsHugoSearch bitsAdding more metadataWoodpeckerTo make this work, we will essentially:Build hugoRun pagefind on this output (pagefind --site public)Deploy the static siteFor testing I&rsquo;ve just downloaded a prebuilt binary and ran it on my laptop, but for CI/CD we will&mldr;do the same thing, but in a container.Some light testing gives that loading the search view will consume ~100 KB of bandwidth, and searching w\",\"classification_terms\":[\"posts/2026/01/search\",\"about\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":4,\"depth\":1},{\"path\":\"/tags/hugo\",\"status\":200,\"title\":\"Tag: Hugo - monotux.tech\",\"word_count\":69,\"summary_text\":\"Tag: Hugo - monotux.tech Tag: Hugo - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchHugo (10)2026JanuaryImplementing search on this site hugo ci/cd woodpeckerLight/dark theme for MermaidJS mermaidjs hugo2025NovemberAdding icons to Mermaid charts mermaidjs hugoWoodpecker CI, Hugo & MermaidJS ci/cd woodpecker hugo mermaidjsOctoberNew theme, again hugo webdesign2024MayNew Hugo builder image hugo dockerAprilNew Theme hugo webdesign2023MarchCaddy primer caddy hugo fly.io primer yaml acme2022AugustFlying with this blog fly.io hugo sr.ht yaml2021MarchBuilt With sr.ht sites hugo sr.ht yamlBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/hugo\",\"about\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/ci/cd\",\"status\":200,\"title\":\"Tag: CI/CD - monotux.tech\",\"word_count\":47,\"summary_text\":\"Tag: CI/CD - monotux.tech Tag: CI/CD - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchCI/CD (4)2026JanuaryImplementing search on this site hugo ci/cd woodpecker2025NovemberWoodpecker CI, Hugo & MermaidJS ci/cd woodpecker hugo mermaidjsWoodpecker CI & Alpine Linux ash ci/cd woodpecker alpine linux2024NovemberLaminar CI, webhooks and forgejo ci/cd gitea webhook forgejo qmk caddy laminar acmeBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/ci/cd\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/woodpecker\",\"status\":200,\"title\":\"Tag: Woodpecker - monotux.tech\",\"word_count\":35,\"summary_text\":\"Tag: Woodpecker - monotux.tech Tag: Woodpecker - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchWoodpecker (3)2026JanuaryImplementing search on this site hugo ci/cd woodpecker2025NovemberWoodpecker CI, Hugo & MermaidJS ci/cd woodpecker hugo mermaidjsWoodpecker CI & Alpine Linux ash ci/cd woodpecker alpine linuxBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/woodpecker\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2026/01/system-theme-icons/\",\"status\":200,\"title\":\"Light/dark theme for MermaidJS - monotux.tech\",\"word_count\":798,\"summary_text\":\"Light/dark theme for MermaidJS - monotux.tech Light/dark theme for MermaidJS - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchLight/dark theme for MermaidJSJanuary 9, 2026 MermaidJS HugoThis post is part of the Adding MermaidJS Without Any JS series.Woodpecker CI, Hugo & MermaidJSAdding icons to Mermaid chartsLight/dark theme for MermaidJSMaking my graphs respect the user system light- and darkmode settings was surprisingly straight-forward, and we are still not using any (browser side) JavaScript to accomplish this!We are essentially just using pre-generating light and dark SVGs with predictable names, then using HTML5 figure source sets with a media selector, enabling the browser to select which color scheme is preferred. I had a hunch that this could be done but got some help from an unethical LLM to make this a reality.Table\",\"classification_terms\":[\"posts/2026/01/system-theme-icons\",\"about\",\"help\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/mermaidjs\",\"status\":200,\"title\":\"Tag: MermaidJS - monotux.tech\",\"word_count\":30,\"summary_text\":\"Tag: MermaidJS - monotux.tech Tag: MermaidJS - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchMermaidJS (3)2026JanuaryLight/dark theme for MermaidJS mermaidjs hugo2025NovemberAdding icons to Mermaid charts mermaidjs hugoWoodpecker CI, Hugo & MermaidJS ci/cd woodpecker hugo mermaidjsBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/mermaidjs\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2025/11/mermaid-icons/\",\"status\":200,\"title\":\"Adding icons to Mermaid charts - monotux.tech\",\"word_count\":409,\"summary_text\":\"Adding icons to Mermaid charts - monotux.tech Adding icons to Mermaid charts - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchAdding icons to Mermaid chartsNovember 22, 2025 MermaidJS HugoThis post is part of the Adding MermaidJS Without Any JS series.Woodpecker CI, Hugo & MermaidJSAdding icons to Mermaid chartsLight/dark theme for MermaidJSWhile we are ricing&mldr;enhancing this blog with MermaidJS charts, we might as well add icons to said charts as well! This was also surprisingly easy to do, so here we go&mldr;Not every article needs a pictureAs of mermaid-cli version 11.10.1 one can add icon packs when rendering MermaidJS charts! It was implemented in PR954 which provides some details on how to use it, which essentially is just adding below to the mermaid-cli call: --iconPacks &#39;@iconify-json/logos&#39; \\\\ --iconPacksName\",\"classification_terms\":[\"posts/2025/11/mermaid-icons\",\"about\",\"blog\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2025/11/upgrading-postgresql-version-nixos/\",\"status\":200,\"title\":\"Upgrading to a new Postgresql major version on NixOS - monotux.tech\",\"word_count\":506,\"summary_text\":\"Upgrading to a new Postgresql major version on NixOS - monotux.tech Upgrading to a new Postgresql major version on NixOS - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchUpgrading to a new Postgresql major version on NixOSNovember 20, 2025 NixOS PostgreSQLI&rsquo;ve seen a few different guides on how to upgrade to a new major PostgreSQL version but couldn&rsquo;t make it work as I&rsquo;m also using extensions for some of my databases. Luckily this was relatively easy due to NixOS declarative nature!My method is just an modified version of Kevin Cox&rsquo;s guide. A few other sources of inspiration was the NixOS wiki entry on upgrading (which uses flakes which I still don&rsquo;t understand) and reading the pg_upgrade manual.Table of ContentsPreflight checkPreparing for the upgradeUpgrade the databaseUpdate extensionsConclusionPreflight checkFirst up\",\"classification_terms\":[\"posts/2025/11/upgrading-postgresql-version-nixos\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/nixos\",\"status\":200,\"title\":\"Tag: NixOS - monotux.tech\",\"word_count\":101,\"summary_text\":\"Tag: NixOS - monotux.tech Tag: NixOS - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchNixOS (10)A Linux distribution based on the purely functional package management system NixNixOS.orgI learned about NixOS in ~2017, and then been using it more or less constantly since.2025NovemberUpgrading to a new Postgresql major version on NixOS nixos postgresqlOctoberDisable disk spindown on NixOS nixos systemdSeptemberSystemd, agenix and dynamic users systemd secrets nixos2024FebruaryNixOS for system configuration 🩷 nixos nix dnsmasqCoreRAD is pretty rad ipv6 networking nixos2023MayNixOS & overlays nixos2019NovemberBacking Up Gitea gitea backup nixosOctoberNixos, bits & pieces 2 - PHP configuration nixosI use NixOS, btw jerk apple nixosSeptemberNixOS, bits & pieces part 1 nixosBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/nixos\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/postgresql\",\"status\":200,\"title\":\"Tag: PostgreSQL - monotux.tech\",\"word_count\":21,\"summary_text\":\"Tag: PostgreSQL - monotux.tech Tag: PostgreSQL - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchPostgreSQL (1)2025NovemberUpgrading to a new Postgresql major version on NixOS nixos postgresqlBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/postgresql\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2025/11/garage-caddy-dnsmasq/\",\"status\":200,\"title\":\"Garage object storage, Caddy and dynamically provisioned TLS certificates - monotux.tech\",\"word_count\":751,\"summary_text\":\"Garage object storage, Caddy and dynamically provisioned TLS certificates - monotux.tech Garage object storage, Caddy and dynamically provisioned TLS certificates - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchGarage object storage, Caddy and dynamically provisioned TLS certificatesNovember 12, 2025 dnsmasq Caddy GarageI recently started serving this website internally (as a &ldquo;staging environment&rdquo;) and discovered that Garage + Caddy can automagically serve sites & issue certificates per S3 bucket, as subdomains under the Garage domain name (*.garage.example.com). This entry will describe how I setup Garage, Caddy and dnsmasq to work together in my homelab setup.Table of ContentsOverviewGarageConfigurationOperationsCaddydnsmasqConclusionOverviewIn this setup,Garage acts as backend and hosts a S3 compatible bucket and serves it as static site using built-in fu\",\"classification_terms\":[\"posts/2025/11/garage-caddy-dnsmasq\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":4,\"depth\":1},{\"path\":\"/tags/dnsmasq\",\"status\":200,\"title\":\"Tag: Dnsmasq - monotux.tech\",\"word_count\":51,\"summary_text\":\"Tag: Dnsmasq - monotux.tech Tag: Dnsmasq - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchDnsmasq (4)2025NovemberGarage object storage, Caddy and dynamically provisioned TLS certificates dnsmasq caddy garage2024AugustUsing dnsmasq & nftables together to create DNS block lists dnsmasq nftables networking dnsFebruaryNixOS for system configuration 🩷 nixos nix dnsmasq2020FebruaryMQTT based presence detection home assistant mqtt openbsd yaml dnsmasqBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/dnsmasq\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/caddy\",\"status\":200,\"title\":\"Tag: Caddy - monotux.tech\",\"word_count\":51,\"summary_text\":\"Tag: Caddy - monotux.tech Tag: Caddy - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchCaddy (4)2025NovemberGarage object storage, Caddy and dynamically provisioned TLS certificates dnsmasq caddy garage2024NovemberLaminar CI, webhooks and forgejo ci/cd gitea webhook forgejo qmk caddy laminar acme2023AprilRunning Grocy in Podman podman pod grocy ubuntu systemd caddy acmeMarchCaddy primer caddy hugo fly.io primer yaml acmeBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/caddy\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/garage\",\"status\":200,\"title\":\"Tag: Garage - monotux.tech\",\"word_count\":31,\"summary_text\":\"Tag: Garage - monotux.tech Tag: Garage - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchGarage (1)Garage is an&mldr;&mldr;open-source distributed object storage service tailored for self-hosting2025NovemberGarage object storage, Caddy and dynamically provisioned TLS certificates dnsmasq caddy garageBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/garage\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2025/11/woodpecker-mermaid/\",\"status\":200,\"title\":\"Woodpecker CI, Hugo & MermaidJS - monotux.tech\",\"word_count\":1184,\"summary_text\":\"Woodpecker CI, Hugo & MermaidJS - monotux.tech Woodpecker CI, Hugo & MermaidJS - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchWoodpecker CI, Hugo & MermaidJSNovember 11, 2025 CI/CD Woodpecker Hugo MermaidJSThis post is part of the Adding MermaidJS Without Any JS series.Woodpecker CI, Hugo & MermaidJSAdding icons to Mermaid chartsLight/dark theme for MermaidJSFiddling around with Woodpecker CI was a lot of fun, so I finally implemented javascript-less MermaidJS graphs! It&rsquo;s not perfect by any means but I think it is Good Enough(tm) and it involves some terrible regexps so here we go!Table of ContentsOverviewMermaid renderingSite buildingCompressionPublishingfly.ioInternal stagingConclusionWell, first of all, here is an example chart:kanban Todo [Fix light/dark theme] [In progress] [Write entry about the new diagram functio\",\"classification_terms\":[\"posts/2025/11/woodpecker-mermaid\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2025/11/woodpecker-alpine-ash/\",\"status\":200,\"title\":\"Woodpecker CI & Alpine Linux ash - monotux.tech\",\"word_count\":328,\"summary_text\":\"Woodpecker CI & Alpine Linux ash - monotux.tech Woodpecker CI & Alpine Linux ash - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchWoodpecker CI & Alpine Linux ashNovember 9, 2025 CI/CD Woodpecker Alpine LinuxI recently started setting up a new CI/CD environment in my homelab (due to reasons), and this time I decided to test Woodpecker CI1. It was quite easy to setup, even with both server and agents running in Kubernetes, but I ran into some silly but confusing issues when dealing with environment variables in an Alpine Linux based build step.TL;DR for alpine linux/ash, use the older format ($FOO_BAR) for any local environment variable, but use recommended format (${FOO_BAR}) for any of the built-in environment variables!The underlying issue (aside from me being slow) is that ash is not bash, and behaves slightly different with va\",\"classification_terms\":[\"posts/2025/11/woodpecker-alpine-ash\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/alpine-linux\",\"status\":200,\"title\":\"Tag: Alpine Linux - monotux.tech\",\"word_count\":22,\"summary_text\":\"Tag: Alpine Linux - monotux.tech Tag: Alpine Linux - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchAlpine Linux (1)2025NovemberWoodpecker CI & Alpine Linux ash ci/cd woodpecker alpine linuxBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/alpine-linux\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2025/10/edgerouter-infinity/\",\"status\":200,\"title\":\"Ubiquity EdgeRouter Infinity ER-8-XG - monotux.tech\",\"word_count\":477,\"summary_text\":\"Ubiquity EdgeRouter Infinity ER-8-XG - monotux.tech Ubiquity EdgeRouter Infinity ER-8-XG - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchUbiquity EdgeRouter Infinity ER-8-XGOctober 21, 2025 Hardware Ubiquity Networking Primer AnsibleI got my hands on an used Ubiquity EdgeRouter Infinity ER-8-XG this summer, and in this entry I will try to document any discoveries when evaluating this device for homelab use.And yes, this is overkill even for my homelab ⎛⎝( ` ᢍ ´ )⎠⎞ᵐᵘʰᵃʰᵃEdgeRouter ER-8-XGThis entry will be updated intermittently as I&rsquo;m working with it, and at some point reach some kind of conclusion regarding the device. I&rsquo;m currently not sure if I should use this as a switch or as my main router.Table of Contents2025-10-21 &ndash; unpacking2025-10-23 &ndash; automation?2025-11-03 &ndash; comparisons2025-10-21 &ndash; unp\",\"classification_terms\":[\"posts/2025/10/edgerouter-infinity\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":6,\"depth\":1},{\"path\":\"/tags/hardware\",\"status\":200,\"title\":\"Tag: Hardware - monotux.tech\",\"word_count\":51,\"summary_text\":\"Tag: Hardware - monotux.tech Tag: Hardware - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchHardware (6)2025OctoberUbiquity EdgeRouter Infinity ER-8-XG hardware ubiquity networking primer ansibleNVMe enclosures, chipsets & interfaces hardwareAugustOpenWRT & Mediatek WiFi USB adapters hardware openwrt2023JanuaryResetting an USB port usb hardware linux2022DecemberThin Clients, great plans ansible kubernetes hardware2020January(Seemingly) Slow SAS drives & FreeNAS freenas freebsd hardwareBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/hardware\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/ubiquity\",\"status\":200,\"title\":\"Tag: Ubiquity - monotux.tech\",\"word_count\":19,\"summary_text\":\"Tag: Ubiquity - monotux.tech Tag: Ubiquity - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchUbiquity (1)2025OctoberUbiquity EdgeRouter Infinity ER-8-XG hardware ubiquity networking primer ansibleBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/ubiquity\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/networking\",\"status\":200,\"title\":\"Tag: Networking - monotux.tech\",\"word_count\":114,\"summary_text\":\"Tag: Networking - monotux.tech Tag: Networking - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchNetworking (16)2025OctoberUbiquity EdgeRouter Infinity ER-8-XG hardware ubiquity networking primer ansibleJulyBird, BGP & Kubernetes kubernetes bgp networkingMarchRebuilding my monitoring infrastructure monitoring networking ipv62024NovemberIncus primer primer networking incus zfsSeptemberMikrotik & ACME networking mikrotik acmeAugustUsing dnsmasq & nftables together to create DNS block lists dnsmasq nftables networking dnsMayAuto toggle VPN on Apple devices networking apple ios macos wireguardAprilHairpin NAT with nftables & a dynamic IP address nftables systemd networkingFebruaryCoreRAD is pretty rad ipv6 networking nixosJanuaryZeroTier on FreeBSD 14 freebsd networking zerotier2023Decemberknot-resolver & DAF dns netwo\",\"classification_terms\":[\"tags/networking\",\"about\",\"address\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/primer\",\"status\":200,\"title\":\"Tag: Primer - monotux.tech\",\"word_count\":62,\"summary_text\":\"Tag: Primer - monotux.tech Tag: Primer - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchPrimer (9)2025OctoberUbiquity EdgeRouter Infinity ER-8-XG hardware ubiquity networking primer ansibleMarchkeyd primer primer wayland systemd keyboards2024DecemberEMQX Primer mqtt primer emqxNovemberIncus primer primer networking incus zfs2023MarchPodman primer podman systemd ubuntu primerCaddy primer caddy hugo fly.io primer yaml acme2022AprilRuckus ICX 7150-C12p Primer networking primerFebruaryEX2200-C12P switch primer networking primer2021Aprilnftables multi network (home) router primer nftables firewall primerBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/primer\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2025/10/disable-disk-spindown/\",\"status\":200,\"title\":\"Disable disk spindown on NixOS - monotux.tech\",\"word_count\":403,\"summary_text\":\"Disable disk spindown on NixOS - monotux.tech Disable disk spindown on NixOS - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchDisable disk spindown on NixOSOctober 19, 2025 NixOS systemdI have two disks in my homelab NAS that would spin down when idle, which puts unnecessary strain on the drives as they are typically woken up again a few minutes later. Disabling this is not very hard, and this pattern is usable for other cases where you want systemd to run multiple instances of something. While all examples below uses NixOS syntax, it&rsquo;s all just standard systemd components at play.I initially tried asking a LLM on how to do it and was just provided with a broken, impossible solution so I thought I might as well write this up if someone else needs something similar.Table of ContentsOverviewScriptsystemd bitsConclusionOvervi\",\"classification_terms\":[\"posts/2025/10/disable-disk-spindown\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/systemd\",\"status\":200,\"title\":\"Tag: Systemd - monotux.tech\",\"word_count\":120,\"summary_text\":\"Tag: Systemd - monotux.tech Tag: Systemd - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchSystemd (16)2025OctoberDisable disk spindown on NixOS nixos systemdSeptemberSystemd, agenix and dynamic users systemd secrets nixosJulyPrometheus & Tailscale service discovery prometheus tailscale monitoring systemdMarchkeyd primer primer wayland systemd keyboards2024NovemberInfluxDB & Python influxdb python systemd chatgpt javascriptAprilHairpin NAT with nftables & a dynamic IP address nftables systemd networking2023AugustRestic backup script backup restic systemdNotes from upgrading to Debian 12 debian systemdAprilRunning Grocy in Podman podman pod grocy ubuntu systemd caddy acmeMarchPodman primer podman systemd ubuntu primerFebruaryTransforming a ~30 USD USB switch into something else systemd debianJanuarysqm-scripts &\",\"classification_terms\":[\"tags/systemd\",\"about\",\"address\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2025/10/incus-change-storage-pool/\",\"status\":200,\"title\":\"Move Incus containers between storage pools - monotux.tech\",\"word_count\":282,\"summary_text\":\"Move Incus containers between storage pools - monotux.tech Move Incus containers between storage pools - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchMove Incus containers between storage poolsOctober 13, 2025 incus zfsI accidentally used the wrong ZFS storage pool when setting up Incus at home, so all of my containers and volumes were created on my small boot pool, instead of my large nvme pool. I didn&rsquo;t discover this until I ran out of disk space, and in the recovery process I got reminded that Incus is a really nice piece of software :-)To recover from this situation I started to research how to migrate to a new ZFS pool, and expected it to be a lot of work &ndash; but it was actually very straight forward!# First, create a new ZFS dataset for Incus zfs create foobar/incus # Create a new incus storage pool named nvme, and point it\",\"classification_terms\":[\"posts/2025/10/incus-change-storage-pool\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/zfs\",\"status\":200,\"title\":\"Tag: Zfs - monotux.tech\",\"word_count\":23,\"summary_text\":\"Tag: Zfs - monotux.tech Tag: Zfs - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchZfs (2)2025OctoberMove Incus containers between storage pools incus zfs2024NovemberIncus primer primer networking incus zfsBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/zfs\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2025/10/new-theme-again/\",\"status\":200,\"title\":\"New theme, again - monotux.tech\",\"word_count\":151,\"summary_text\":\"New theme, again - monotux.tech New theme, again - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchNew theme, againOctober 11, 2025 hugo webdesignNew year, new boredom and I decided to make a new theme, again. This time it&rsquo;s mostly my own design but with some help from an AI agent for boring stuff.Out with the oldOld themeThere wasn&rsquo;t anything wrong with the old theme, it was just a bit inconsistent and felt a bit&mldr;too much while trying to be minimal. I had some fun adjusting it to my liking, adding overflowing tags, styling for code and such.At some point I stumbled upon the article The least amount of CSS for a decent looking site and decided to test the stylesheet, and then continued experimenting with hanging punctuation after noticing how it was implemented on the blog itself.One thing led to an\",\"classification_terms\":[\"posts/2025/10/new-theme-again\",\"about\",\"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\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/webdesign\",\"status\":200,\"title\":\"Tag: Webdesign - monotux.tech\",\"word_count\":18,\"summary_text\":\"Tag: Webdesign - monotux.tech Tag: Webdesign - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchWebdesign (2)2025OctoberNew theme, again hugo webdesign2024AprilNew Theme hugo webdesignBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/webdesign\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2025/10/nvme-enclosure/\",\"status\":200,\"title\":\"NVMe enclosures, chipsets & interfaces - monotux.tech\",\"word_count\":288,\"summary_text\":\"NVMe enclosures, chipsets & interfaces - monotux.tech NVMe enclosures, chipsets & interfaces - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchNVMe enclosures, chipsets & interfacesOctober 2, 2025 HardwareI recently decided to fall down another rabbit hole &ndash; external enclosures for NVMe drives. It wasn&rsquo;t a very deep rabbit hole, but it was worthwhile and it only cost me ~60 EUR.I started out with a Samsung 990 PRO PCIe 4.0 NVMe M.2 SSD 4 TB and needed some kind of enclosure to use it with my aging Macbook Air M1, with the end goal of storing my Lightroom library on it. I googled and found a reasonably priced (~30 EUR) Inateck NVMe M.2 USB 3.2 Hard Drive Enclosure, and used it happily for almost 2 years.Inateck NVMe M.2 USB 3.2Then I (sadly) came across this excellent article on blazing fast NVMe enclosures, and decided I wasn\",\"classification_terms\":[\"posts/2025/10/nvme-enclosure\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2025/09/agenix-systemd/\",\"status\":200,\"title\":\"Systemd, agenix and dynamic users - monotux.tech\",\"word_count\":178,\"summary_text\":\"Systemd, agenix and dynamic users - monotux.tech Systemd, agenix and dynamic users - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchSystemd, agenix and dynamic usersSeptember 21, 2025 systemd secrets nixosCan we combine managing secrets with agenix, and systemd&rsquo;s feature DynamicUser without much hassle?Yes. Yes we can!In this case I&rsquo;m experimenting with vmauth and would like to keep the users file (with raw passwords in it&mldr;) a bit more safe, while still being able to have my system configuration in git.{ config, pkgs, ...}: { age.secrets.vmauth-users.file = ./secrets/vmauth-users.age; systemd.services.vmauth = { wantedBy = [ &#34;multi-user.target&#34; ]; after = [ &#34;network.target&#34; ]; serviceConfig = { Type = &#34;simple&#34;; DynamicUser = true; LoadCredential = &#34;users.yaml:${config.age.secrets.vmauth-\",\"classification_terms\":[\"posts/2025/09/agenix-systemd\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/secrets\",\"status\":200,\"title\":\"Tag: Secrets - monotux.tech\",\"word_count\":24,\"summary_text\":\"Tag: Secrets - monotux.tech Tag: Secrets - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchSecrets (2)2025SeptemberSystemd, agenix and dynamic users systemd secrets nixosMarchBetter Ansible Vault passphrase management ansible secretsBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/secrets\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2025/08/openwrt-mediatek/\",\"status\":200,\"title\":\"OpenWRT & Mediatek WiFi USB adapters - monotux.tech\",\"word_count\":256,\"summary_text\":\"OpenWRT & Mediatek WiFi USB adapters - monotux.tech OpenWRT & Mediatek WiFi USB adapters - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchOpenWRT & Mediatek WiFi USB adaptersAugust 26, 2025 Hardware OpenWRTI was experimenting with two cheap Mediatek USB WiFi adapters in OpenWRT and had to experiment until I figured out which kmods were necessary to make it work, so documenting here in case someone else has the same issue&mldr;HardwareFirst up, the adapters, you can find these on Aliexpress by searching for mt7921au or similar. They are both quite cheap (~5 USD and ~10 USD) and work out of the box in most normal Linux distributions &ndash; but not OpenWRT!Noname 1800Mbps WiFi 6 USB Adapter 802.11AX:EDUP 3000Mbps WiFi 6E Wireless Network Card USB:SoftwareThe packages required for making them work is:kmod-mt7921-firmwarekmod-mt7921uI jus\",\"classification_terms\":[\"posts/2025/08/openwrt-mediatek\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/openwrt\",\"status\":200,\"title\":\"Tag: OpenWRT - monotux.tech\",\"word_count\":18,\"summary_text\":\"Tag: OpenWRT - monotux.tech Tag: OpenWRT - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchOpenWRT (1)2025AugustOpenWRT & Mediatek WiFi USB adapters hardware openwrtBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/openwrt\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2025/07/prometheus-tailscale/\",\"status\":200,\"title\":\"Prometheus & Tailscale service discovery - monotux.tech\",\"word_count\":908,\"summary_text\":\"Prometheus & Tailscale service discovery - monotux.tech Prometheus & Tailscale service discovery - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchPrometheus & Tailscale service discoveryJuly 28, 2025 Prometheus Tailscale Monitoring systemdThis post is part of the Homelab Monitoring 2025 series.Rebuilding my monitoring infrastructurePrometheus & Tailscale service discoveryIn my last post on homelab monitoring I was still manually specifying hosts in my scrape configuration, which felt awkward when Tailscale has an API we can query, so time to fix that!Table of ContentsOverviewSecrets filesystemd servicesnon-NixOSNixOSprometheus configurationBonusOverviewWe will be using cfunkhouser/tailscalesd for polling the Tailscale API, to feed Prometheus with nodes to scrape. I&rsquo;ve not seen this packaged in any distribution but NixOS yet, so you\",\"classification_terms\":[\"posts/2025/07/prometheus-tailscale\",\"about\",\"api\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/prometheus\",\"status\":200,\"title\":\"Tag: Prometheus - monotux.tech\",\"word_count\":19,\"summary_text\":\"Tag: Prometheus - monotux.tech Tag: Prometheus - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchPrometheus (1)2025JulyPrometheus & Tailscale service discovery prometheus tailscale monitoring systemdBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/prometheus\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/tailscale\",\"status\":200,\"title\":\"Tag: Tailscale - monotux.tech\",\"word_count\":19,\"summary_text\":\"Tag: Tailscale - monotux.tech Tag: Tailscale - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchTailscale (1)2025JulyPrometheus & Tailscale service discovery prometheus tailscale monitoring systemdBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/tailscale\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/monitoring\",\"status\":200,\"title\":\"Tag: Monitoring - monotux.tech\",\"word_count\":31,\"summary_text\":\"Tag: Monitoring - monotux.tech Tag: Monitoring - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchMonitoring (3)2025JulyPrometheus & Tailscale service discovery prometheus tailscale monitoring systemdMayUsing custom MIBs with snmp-exporter monitoring snmpMarchRebuilding my monitoring infrastructure monitoring networking ipv6Back to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/monitoring\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2025/07/bird-kubernetes/\",\"status\":200,\"title\":\"Bird, BGP & Kubernetes - monotux.tech\",\"word_count\":871,\"summary_text\":\"Bird, BGP & Kubernetes - monotux.tech Bird, BGP & Kubernetes - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchBird, BGP & KubernetesJuly 11, 2025 Kubernetes BGP NetworkingI&rsquo;m still fiddling around with Kubernetes in my homelab, and this time I wanted to use BGP to announce addresses in my router, but had a hard time finding a working configuration for BIRD. This entry describes a basic but working configuration for use in a homelab, with MetalLB & BIRD.Table of ContentsWhy?OverviewBIRDMetalLBUpdate 2026 &ndash; filteringConclusionWhy?For homelab usage, this is not any better than just using layer 2 advertisements with MetalLB. In theory1, you can use BGP to loadbalance between nodes, but that comes with it&rsquo;s own set of limitations, and since I don&rsquo;t run my lab with any real high-availability ambitions I\",\"classification_terms\":[\"posts/2025/07/bird-kubernetes\",\"about\",\"address\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":44,\"depth\":1},{\"path\":\"/tags/kubernetes\",\"status\":200,\"title\":\"Tag: Kubernetes - monotux.tech\",\"word_count\":29,\"summary_text\":\"Tag: Kubernetes - monotux.tech Tag: Kubernetes - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchKubernetes (3)2025JulyBird, BGP & Kubernetes kubernetes bgp networkingMaySQLite, Kubernetes & Litestream kubernetes sqlite litestream2022DecemberThin Clients, great plans ansible kubernetes hardwareBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/kubernetes\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/tags/bgp\",\"status\":200,\"title\":\"Tag: BGP - monotux.tech\",\"word_count\":17,\"summary_text\":\"Tag: BGP - monotux.tech Tag: BGP - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchBGP (1)2025JulyBird, BGP & Kubernetes kubernetes bgp networkingBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/bgp\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2025/05/custom-snmp-exporter/\",\"status\":200,\"title\":\"Using custom MIBs with snmp-exporter - monotux.tech\",\"word_count\":1328,\"summary_text\":\"Using custom MIBs with snmp-exporter - monotux.tech Using custom MIBs with snmp-exporter - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchUsing custom MIBs with snmp-exporterMay 31, 2025 monitoring SNMPI have two PoE capable Brocade ICX switches at home, and I was curious how much wattage I was really using &ndash; so it was time to use SNMP again!Table of ContentsOverviewMIBssnmp_exporter generatorSetting up snmp_exporter generatorAdding our MIBs to the configurationConfigurationsnmp_exporterPrometheusConclusionOverviewI will be using Prometheus and snmp_exporter for this, as I already have the first part setup & working as outlined in a previous entry here.Then I need to locate relevant MIBs,merge them into the snmp_exporter generator configuration (or create a new one) and,finally use this configuration to scrape my target nodes.On\",\"classification_terms\":[\"posts/2025/05/custom-snmp-exporter\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":41,\"depth\":1},{\"path\":\"/tags/snmp\",\"status\":200,\"title\":\"Tag: SNMP - monotux.tech\",\"word_count\":17,\"summary_text\":\"Tag: SNMP - monotux.tech Tag: SNMP - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchSNMP (1)2025MayUsing custom MIBs with snmp-exporter monitoring snmpBack to top &mdash; &copy; 2026\",\"classification_terms\":[\"tags/snmp\",\"about\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1},{\"path\":\"/posts/2025/05/sqlite-kubernetes-sts/\",\"status\":200,\"title\":\"SQLite, Kubernetes & Litestream - monotux.tech\",\"word_count\":627,\"summary_text\":\"SQLite, Kubernetes & Litestream - monotux.tech SQLite, Kubernetes & Litestream - monotux.techmonotux.tech ☰HomeTagsAboutUsesFeedSearchSQLite, Kubernetes & LitestreamMay 31, 2025 Kubernetes SQLite LitestreamI&rsquo;ve been learning Kubernetes at home recently, and I&rsquo;ve found a nice (but slightly dangerous!) pattern for hosting applications backed by SQLite in my homelab.Table of ContentsOverviewExample manifestCaveats / bootstrappingConclusionOverviewThe pattern is relatively simple:No persistent volumes, just ephemeral onesNo deployments, we use a statefulset insteadNo external database, we use litestream to backup/restore automagicallyIf this sounds familiar it&rsquo;s because I&rsquo;ve used this pattern for running SQLite-backed applications on fly.io before.The obvious issue with this is that we risk losing any data written b\",\"classification_terms\":[\"posts/2025/05/sqlite-kubernetes-sts\",\"about\",\"store\"],\"external_refs\":[],\"password_input_count\":0,\"email_input_count\":0,\"tel_input_count\":0,\"otp_term_count\":0,\"login_form_count\":0,\"checkout_form_count\":0,\"wallet_prompt_count\":0,\"offdomain_form_actions\":0,\"suspicious_script_refs_count\":0,\"external_script_hosts\":[],\"executable_download_count\":0,\"archive_download_count\":0,\"apk_download_count\":0,\"phone_number_count\":0,\"depth\":1}]",
        "score_reasons_json": "[]",
        "estimated_monthly_visitors": 429,
        "route_domain": "monotux.tech",
        "display_domain": "monotux.tech"
    },
    "explainability": {
        "summary": "monotux.tech currently scores 55/100. The score is being shaped by a mixed signal profile rather than one dominant factor. Evidence confidence is strong enough for a relatively stable read. This is an estimated profile rather than a manually tracked one. Crawler access looks clean.",
        "badges": [
            {
                "label": "Profile",
                "value": "Estimated profile",
                "tone": "unknown",
                "detail": null
            },
            {
                "label": "Evidence confidence",
                "value": "High confidence",
                "tone": "good",
                "detail": "100/100"
            },
            {
                "label": "Traffic confidence",
                "value": "Moderate confidence",
                "tone": "caution",
                "detail": "40/100"
            },
            {
                "label": "Crawler access",
                "value": "Clean visibility",
                "tone": "good",
                "detail": null
            }
        ],
        "weighted_contributions": [
            {
                "label": "Quality system",
                "points": "+30.3",
                "tone": "good",
                "detail": "Technical quality, crawl depth, page structure, and implementation hygiene. Current subsystem score: 89/100."
            },
            {
                "label": "Reputation system",
                "points": "+13.9",
                "tone": "risk",
                "detail": "Authority, search visibility, reach, engagement, and registry stability. Current subsystem score: 41/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": "-21.0",
                "tone": "risk",
                "detail": "Safety thresholds capped the final score until the risk profile improves."
            }
        ],
        "evidence_cards": [
            {
                "label": "Authority and trust",
                "value": "36/100 · trust 38/100",
                "tone": "risk",
                "detail": "250 monthly visitors, 66 organic keywords, brand completeness 43/100, engagement 88/100."
            },
            {
                "label": "Backlink and search evidence",
                "value": "2 referring domains",
                "tone": "good",
                "detail": "2 backlinks across 2 referring domains. Diversity 93/100; spam penalty 6."
            },
            {
                "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": "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": [
            "Traffic and reach estimates are still low confidence, so commercial scale signals may move after more evidence is collected."
        ],
        "freshness": [
            {
                "label": "Crawl evidence",
                "value": "2026-03-18 19:24:53",
                "tone": "risk",
                "detail": "Crawl and page content sample. Age: 3mo ago."
            },
            {
                "label": "WHOIS snapshot",
                "value": "2026-03-18 19:24:52",
                "tone": "risk",
                "detail": "Registry profile and stability signals. Age: 3mo ago."
            },
            {
                "label": "Keyword view",
                "value": "2026-06-23 23:21:27",
                "tone": "good",
                "detail": "Estimated visibility until tracked keyword snapshots exist. Age: 0s ago."
            },
            {
                "label": "Rank history",
                "value": "2026-06-23 23:21:27",
                "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": 76,
        "fraud_clamp_penalty": 21,
        "final_score": 55
    },
    "insight_snapshot": {
        "version": 1,
        "generated_at": "2026-06-23T23:21:27+00:00",
        "domain": "monotux.tech",
        "display_name": "monotux.tech",
        "is_tracked": false,
        "is_estimated": true,
        "overall_score": 55,
        "authority_score": 36,
        "trust_score": 38,
        "safety_score": 100,
        "fraud_score": 0,
        "confidence_score": 100,
        "traffic_confidence": 40,
        "last_crawled_at": "2026-03-18 19:24:53",
        "crawl_blocked": false,
        "summary": "monotux.tech currently scores 55/100. The score is being shaped by a mixed signal profile rather than one dominant factor. Evidence confidence is strong enough for a relatively stable read. This is an estimated profile rather than a manually tracked one. Crawler access looks clean.",
        "badges": [
            {
                "label": "Profile",
                "value": "Estimated profile",
                "tone": "unknown",
                "detail": null
            },
            {
                "label": "Evidence confidence",
                "value": "High confidence",
                "tone": "good",
                "detail": "100/100"
            },
            {
                "label": "Traffic confidence",
                "value": "Moderate confidence",
                "tone": "caution",
                "detail": "40/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": [
            "Traffic and reach estimates are still low confidence, so commercial scale signals may move after more evidence is collected."
        ],
        "freshness": [
            {
                "label": "Crawl evidence",
                "value": "2026-03-18 19:24:53",
                "tone": "risk",
                "detail": "Crawl and page content sample. Age: 3mo ago."
            },
            {
                "label": "WHOIS snapshot",
                "value": "2026-03-18 19:24:52",
                "tone": "risk",
                "detail": "Registry profile and stability signals. Age: 3mo ago."
            },
            {
                "label": "Keyword view",
                "value": "2026-06-23 23:21:27",
                "tone": "good",
                "detail": "Estimated visibility until tracked keyword snapshots exist. Age: 0s ago."
            },
            {
                "label": "Rank history",
                "value": "2026-06-23 23:21:27",
                "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": []
    },
    "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-06-24T01:26:43+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/monotux.tech/refresh",
        "isGuestCooldown": false,
        "cooldownSeconds": 0
    },
    "urlscan_report": {
        "domain": "monotux.tech",
        "status": "idle",
        "submitted_at": null,
        "completed_at": null,
        "last_checked_at": null,
        "last_error": "",
        "submitted_url": "https://monotux.tech/",
        "uuid": "",
        "result_url": "",
        "api_result_url": "",
        "visibility": "public",
        "summary": "No urlscan.io report has been requested for this domain yet.",
        "report": [],
        "report_summary": [],
        "is_fresh": false,
        "can_retry": true,
        "poll_after_seconds": 20
    }
}