{
  "class": "DepictionTabView",
  "minVersion": "0.4",
  "headerImage": "https://tweaks.carterware.net/depictions/carterblock-header.png",
  "tintColor": "#E4002B",
  "tabs": [
    {
      "class": "DepictionStackView",
      "tabname": "Details",
      "views": [
        {
          "class": "DepictionMarkdownView",
          "markdown": "Cut ads and trackers **inside apps and games** — not another Safari toggle.\n\n**Main features**\n- Blocks ad and tracker hosts in App Store apps, games and in-app web pages\n- Catches ad SDKs with their own networking (DNS-level \"host not found\")\n- **Game Ad Patterns** and **Analytics & Trackers** toggles with separate hit counters\n- Optional downloadable hosts list (fast even at 150k+ domains)\n- Allowlist (covers subdomains) + custom domains editor — no Filza required\n\n## How to use\n1. Open **Settings → CarterBlock**\n2. Leave **Enabled** on (changes apply to open apps within a second — no relaunch)\n3. Optional: tap **Download Hosts List**\n4. Use an ad-heavy app, come back — **Blocked**, Game Ads and Last Blocked update\n5. Add anything you break to the **Allowlist**\n\n## Tips\n- Allowlist first; don't disable everything for one site\n- Reset Stats for a clean \"is it working?\" check\n- Turn off **Game Ad Patterns** or **Trackers** to prove which bucket is hitting\n\n## Honest limits\n**Not** a Safari Content Blocker and **not** system-wide DNS. Safari, background downloads and apps using hard-coded IPs or their own DNS can slip through. Blocks inside web pages work but aren't counted in Status. Counters are a signal, not a guarantee.\n\n## Requirements\nDopamine rootless · ElleKit · iOS 15.0+\n",
          "useSpacing": true
        }
      ]
    },
    {
      "class": "DepictionStackView",
      "tabname": "Screenshots",
      "views": [
        {
          "class": "DepictionScreenshotsView",
          "itemCornerRadius": 12,
          "itemSize": "{160, 346}",
          "screenshots": [
            {
              "url": "https://tweaks.carterware.net/depictions/screenshots/carterblock-prefs.jpg",
              "fullSizeURL": "https://tweaks.carterware.net/depictions/screenshots/carterblock-prefs.jpg",
              "accessibilityText": "CarterBlock Settings — live status"
            }
          ]
        }
      ]
    },
    {
      "class": "DepictionStackView",
      "tabname": "Changelog",
      "views": [
        {
          "class": "DepictionSubheaderView",
          "title": "1.2.8",
          "useBoldText": true
        },
        {
          "class": "DepictionMarkdownView",
          "markdown": "- **Fix:** Settings → Status rows (Blocked, Game Ads, Trackers, Hosts/Custom hits, Rules, Last Blocked, Updated) show their numbers again — they were blank\n- Verified on iOS 17: hosts list download, in-game ad SDK blocks counted live, Enabled toggle respected without relaunch",
          "useSpacing": true
        },
        {
          "class": "DepictionSubheaderView",
          "title": "1.2.7",
          "useBoldText": true
        },
        {
          "class": "DepictionMarkdownView",
          "markdown": "- **Fix:** CarterBlock now actually loads into your apps and games (the old filter matched no process, so nothing was blocked)\n- **Fix:** Counters, hosts and custom lists moved to a folder apps can write; your existing files migrate automatically\n- Ads inside in-app web pages are blocked (WebKit content rules), plus SDKs that use their own networking (DNS lookups)\n- Blocked requests look like \"host not found\" instead of \"offline\", so apps don't show no-internet banners\n- Fast lookups even with 150k-entry hosts lists; counters batched instead of disk writes per request\n- Allowlist covers subdomains; custom rules can override protected domains; fewer false positives\n- Download Hosts List works and explains why if it fails; Settings changes apply without relaunching apps",
          "useSpacing": true
        },
        {
          "class": "DepictionSubheaderView",
          "title": "1.2.4",
          "useBoldText": true
        },
        {
          "class": "DepictionMarkdownView",
          "markdown": "- **Fix:** Game Ads / Trackers toggles now gate packaged builtins + `domains.txt` (were always on)\n- Per-bucket Status counters: Game Ads / Trackers / Hosts Hits / Custom Hits\n- Reset Stats zeros every bucket\n- Custom Domains: **Paste / Edit List** without Filza",
          "useSpacing": true
        },
        {
          "class": "DepictionSubheaderView",
          "title": "1.2.1",
          "useBoldText": true
        },
        {
          "class": "DepictionMarkdownView",
          "markdown": "- **Fix:** rootless packaging no longer installs `domains.txt` / `cb-update-hosts` under `/var/jb/var/jb/…`\n- Wider `NSURLSession` coverage (background configs, download/upload without completion handlers, streamed uploads)\n- Settings polish: clearer labels, Hosts status copy, Respring confirmation, destructive Reset Stats\n- `postinst` migrates any 1.2.0 double-path files and makes the data dir writable",
          "useSpacing": true
        },
        {
          "class": "DepictionSubheaderView",
          "title": "1.2.0",
          "useBoldText": true
        },
        {
          "class": "DepictionMarkdownView",
          "markdown": "- Settings polish: status cells (Blocked / Rules / Hosts / Updated) + Reset Stats\n- Editable whitelist + custom domains editor (`custom.txt`)\n- Configurable hosts URL with success/fail download alerts\n- Depends on PreferenceLoader so the pane appears in Settings",
          "useSpacing": true
        },
        {
          "class": "DepictionSubheaderView",
          "title": "1.1.4",
          "useBoldText": true
        },
        {
          "class": "DepictionMarkdownView",
          "markdown": "- Core CDN protection (Apple / Facebook / Crashlytics / TikTok)\n- Tighter game-ad + tracker heuristics (fewer false positives)\n- Hardened `cb-update-hosts` + clearer Settings stats copy",
          "useSpacing": true
        },
        {
          "class": "DepictionSubheaderView",
          "title": "1.1.2",
          "useBoldText": true
        },
        {
          "class": "DepictionMarkdownView",
          "markdown": "- Icon / branding refresh",
          "useSpacing": true
        },
        {
          "class": "DepictionSubheaderView",
          "title": "1.1.0",
          "useBoldText": true
        },
        {
          "class": "DepictionMarkdownView",
          "markdown": "- Hosts-style `hosts.txt` lists\n- `cb-update-hosts` downloader\n- Settings stats + hosts toggle\n- Wider NSURLSession coverage",
          "useSpacing": true
        },
        {
          "class": "DepictionSubheaderView",
          "title": "1.0.0",
          "useBoldText": true
        },
        {
          "class": "DepictionMarkdownView",
          "markdown": "- Initial NSURLProtocol + WKWebView blocking",
          "useSpacing": true
        }
      ]
    },
    {
      "class": "DepictionStackView",
      "tabname": "Info",
      "views": [
        {
          "class": "DepictionTableTextView",
          "title": "Developer",
          "text": "CarterWare"
        },
        {
          "class": "DepictionTableTextView",
          "title": "Section",
          "text": "Tweaks"
        },
        {
          "class": "DepictionTableTextView",
          "title": "Works on",
          "text": "iOS 15.0+ · Dopamine rootless"
        },
        {
          "class": "DepictionTableTextView",
          "title": "Repo",
          "text": "tweaks.carterware.net"
        }
      ]
    }
  ]
}
