{
  "name": "dpi",
  "kind": "registry",
  "title": "DPI Bypass",
  "description": "Turns the `dpi` script's censorship bypass on and off, with a shield on the menu bar while it is on. Shows the status, repairs a half-applied state, and runs an end-to-end test.",
  "version": "0.1.0",
  "icon": {
    "tile": {
      "glyph": "󰕥",
      "bg": "indigo"
    }
  },
  "author": "pal",
  "spec": "github:zcag/pal/extensions/dpi@v0.9.1",
  "source": "https://github.com/zcag/pal/tree/HEAD/extensions/dpi",
  "commit": "63287e180ce349dac3aa87c68ce4c80bc42ad409",
  "manifest": {
    "name": "dpi",
    "title": "DPI Bypass",
    "description": "Turns the `dpi` script's censorship bypass on and off, with a shield on the menu bar while it is on. Shows the status, repairs a half-applied state, and runs an end-to-end test.",
    "version": "0.1.0",
    "icon": {
      "tile": {
        "glyph": "󰕥",
        "bg": "indigo"
      }
    },
    "author": "pal",
    "repo": "bundled",
    "license": "MIT",
    "keywords": [
      "dpi",
      "bypass",
      "byedpi",
      "zapret",
      "censorship"
    ],
    "settings": [
      {
        "kind": "path",
        "id": "tool",
        "label": "Tool",
        "description": "The dpi script: a name on PATH or a path. It lives at ~/.local/bin/dpi; that directory is looked in when the name is not on PATH.",
        "pick": "file",
        "default": "dpi"
      },
      {
        "kind": "list",
        "id": "test_urls",
        "label": "Test urls",
        "placeholder": "https://discord.com/ = blocked",
        "description": "What the test curls: `url`, or `url = blocked` (the bypass must get it through) / `url = control` (a site that must keep working). Without a role the first two are blocked and the rest controls, as the script's list reads.",
        "default": [
          "https://discord.com/ = blocked",
          "https://www.roblox.com/ = blocked",
          "https://www.enpara.com/ = control",
          "https://www.raycast.com/ = control",
          "https://slack.com/ = control",
          "https://example.com/ = control"
        ]
      },
      {
        "kind": "list",
        "id": "dns",
        "label": "Override DNS",
        "placeholder": "1.1.1.1",
        "description": "The resolvers `dpi on` sets on macOS (the script's DNS_ON), so the status can tell a full bypass from a partial one: the proxy up with the DNS still the ISP's is partial. Empty: DNS is not judged.",
        "default": [
          "1.1.1.1",
          "9.9.9.9"
        ]
      }
    ],
    "store": {
      "tagline": "The DPI bypass on and off, with a shield on the bar",
      "category": "system",
      "features": [
        "Turn on and Turn off as rows; the state stays at the top of the panel while on",
        "A half-applied state shows amber with the reason, and a Repair row fixes it",
        "A test that tries each site through the bypass and shows which get through",
        "A shield on the menu bar while on; its popover toggles, tests and repairs",
        "Links like `pal://dpi/toggle` for a keybind",
        "Uses byedpi on macOS and zapret with dnscrypt-proxy on Linux; the script does the work"
      ],
      "permissions": [],
      "platforms": [
        "macos",
        "linux"
      ],
      "screenshots": [
        {
          "file": "1-on.png",
          "caption": "The bypass on: Turn off leads, then the status, the test, the log, the build and a copy of the status"
        },
        {
          "file": "2-status.png",
          "caption": "⌘I on the status: what the script printed, and the proxy, the network service, the DNS and the SOCKS proxy it names"
        },
        {
          "file": "3-test.png",
          "caption": "The test: a curl per url through the proxy, the blocked sites and the controls with their codes and times"
        },
        {
          "file": "4-partial.png",
          "caption": "Half on: amber with the reason, and a Repair row that turns it off and on again"
        },
        {
          "file": "bar-menubar.png",
          "caption": "On the menu bar only while the bypass is on: a shield",
          "kind": "bar"
        },
        {
          "file": "bar-menubar-partial.png",
          "caption": "Half on: the shield turns amber and half full",
          "kind": "bar"
        },
        {
          "file": "bar-popover.png",
          "caption": "A click opens the popover: the status with its facts; Enter turns it off, t tests it",
          "kind": "bar",
          "box": [
            452,
            64,
            840,
            590
          ]
        },
        {
          "file": "bar-popover-test.png",
          "caption": "t runs the test in the popover: each url's code lands under the card",
          "kind": "bar",
          "box": [
            452,
            64,
            840,
            960
          ]
        },
        {
          "file": "bar-popover-partial.png",
          "caption": "Half on: the reason on the card and r to repair",
          "kind": "bar",
          "box": [
            452,
            64,
            840,
            590
          ]
        },
        {
          "file": "bar-sketchybar.png",
          "caption": "On sketchybar: the shield while the bypass is on",
          "kind": "bar"
        }
      ],
      "actions": [
        {
          "title": "Turn on / Turn off",
          "description": "Runs the script; the HUD says its line.",
          "keys": "enter"
        },
        {
          "title": "Test the bypass",
          "description": "The test level, from any row.",
          "keys": "cmd+t"
        },
        {
          "title": "Repair",
          "description": "Off, then on; on the Turn off row while partial.",
          "keys": "cmd+shift+r"
        },
        {
          "title": "Copy the status",
          "description": "The script's status output.",
          "keys": "cmd+c"
        }
      ]
    },
    "links": {
      "toggle": {
        "description": "Turn the bypass on, or off while it is on (the script's toggle)"
      },
      "on": {
        "description": "Turn the bypass on"
      },
      "off": {
        "description": "Turn the bypass off; the script restores the previous settings"
      },
      "test": {
        "description": "Open the panel on the test level; the test runs at once"
      },
      "status": {
        "description": "Open the DPI Bypass palette"
      }
    },
    "palettes": {
      "dpi": {
        "title": "DPI Bypass",
        "kind": "live",
        "description": "Turn the bypass on or off, repair a half-on one, read the status, run the test, open the log, build byedpi.",
        "keys": [
          {
            "keys": "enter",
            "title": "Turn the bypass on or off; on Status, copy it; on Test, run it"
          },
          {
            "keys": "cmd+t",
            "title": "Test the bypass"
          },
          {
            "keys": "cmd+shift+r",
            "title": "Repair: off, then on (while partial)"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the status"
          }
        ]
      },
      "test": {
        "title": "Bypass Test",
        "kind": "view",
        "description": "The bypass tested end to end: a row per url with its HTTP code, the time and whether it is a blocked site or a control, landing one by one.",
        "keys": [
          {
            "keys": "enter",
            "title": "Open the url under the cursor"
          },
          {
            "keys": "c",
            "title": "Copy the row's line"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the whole report"
          },
          {
            "keys": "cmd+r",
            "title": "Run the test again"
          },
          {
            "keys": "up",
            "title": "Move the cursor (down, j, k too)"
          }
        ]
      }
    },
    "states": {
      "on": {
        "description": "The bypass is on, or partly on",
        "kind": "boolean"
      },
      "state": {
        "description": "off, on or partial",
        "kind": "string"
      },
      "service": {
        "description": "The network service the proxy is set on (macOS), or the units (Linux)",
        "kind": "string"
      }
    },
    "bar": {
      "bypass": {
        "title": "DPI Bypass",
        "description": "A shield while the bypass is on, hidden while off by its rule (`show = \"always\"` keeps a muted one), amber while only half of it is in effect. The popover: the status card with the facts, Enter turns it on or off, `t` runs the test and shows its rows in place, `r` repairs, `c` copies the status, `l` opens the log, `o` the palette.",
        "refresh": {
          "every": 60,
          "on": [
            "show",
            "wake",
            "network"
          ]
        },
        "rules": [
          {
            "id": "off",
            "when": "dpi.state == 'off'",
            "description": "Off: nothing to say.",
            "hidden": true
          },
          {
            "id": "partial",
            "when": "dpi.state == 'partial'",
            "description": "Only half of the bypass is in effect.",
            "color": "amber"
          }
        ],
        "mocks": {
          "off": {
            "title": "Off, hidden",
            "item": {
              "hidden": true,
              "empty": {
                "icon": "󰒙",
                "tooltip": "Bypass off: Wi-Fi as before, byedpi down"
              }
            }
          },
          "on": {
            "title": "On, over Wi-Fi",
            "item": {
              "icon": "󰕥",
              "tooltip": "Bypass on: Wi-Fi -\u003e socks5://127.0.0.1:1080, dns 1.1.1.1 9.9.9.9"
            }
          },
          "partial": {
            "title": "Partly on",
            "item": {
              "icon": "󰞀",
              "color": "amber",
              "tooltip": "Bypass partly on: Proxy up (pid 4242), but SOCKS off and DNS not overridden"
            }
          },
          "linux": {
            "title": "On, Linux",
            "item": {
              "icon": "󰕥",
              "tooltip": "Bypass on: zapret + dnscrypt-proxy up, resolver -\u003e 127.0.0.1"
            }
          }
        },
        "keys": [
          {
            "keys": "enter",
            "title": "Turn the bypass on or off"
          },
          {
            "keys": "t",
            "title": "Test the bypass; the rows land in the popover"
          },
          {
            "keys": "r",
            "title": "Repair: off, then on"
          },
          {
            "keys": "c",
            "title": "Copy the status"
          },
          {
            "keys": "l",
            "title": "Open the log (macOS)"
          },
          {
            "keys": "o",
            "title": "Open the DPI Bypass palette"
          }
        ]
      }
    }
  },
  "playable": false,
  "updated_at": "2026-09-30T01:45:08Z",
  "url": "https://pal.cagdas.io/extensions/dpi",
  "tagline": "The DPI bypass on and off, with a shield on the bar",
  "category": "system",
  "screenshots": [
    "https://pal.cagdas.io/extensions/dpi/screenshots/1-on-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/1-on.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/2-status-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/2-status.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/3-test-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/3-test.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/4-partial-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/4-partial.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-menubar-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-menubar-partial-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-menubar-partial.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-menubar.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-popover-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-popover-partial-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-popover-partial.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-popover-test-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-popover-test.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-popover.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-sketchybar-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-sketchybar.png"
  ],
  "panel_screenshots": [
    "https://pal.cagdas.io/extensions/dpi/screenshots/1-on.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/2-status.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/3-test.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/4-partial.png"
  ],
  "bar_screenshots": [
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-menubar-partial.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-menubar.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-popover-partial.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-popover-test.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-popover.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-sketchybar.png"
  ],
  "panel_screenshots_dark": [
    "https://pal.cagdas.io/extensions/dpi/screenshots/1-on-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/2-status-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/3-test-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/4-partial-dark.png"
  ],
  "bar_screenshots_dark": [
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-menubar-partial-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-menubar-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-popover-partial-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-popover-test-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-popover-dark.png",
    "https://pal.cagdas.io/extensions/dpi/screenshots/bar-sketchybar-dark.png"
  ],
  "has_bar": true,
  "bar_items": [
    {
      "id": "bypass",
      "title": "DPI Bypass",
      "description": "A shield while the bypass is on, hidden while off by its rule (`show = \"always\"` keeps a muted one), amber while only half of it is in effect. The popover: the status card with the facts, Enter turns it on or off, `t` runs the test and shows its rows in place, `r` repairs, `c` copies the status, `l` opens the log, `o` the palette.",
      "refresh": {
        "every": 60,
        "on": [
          "show",
          "wake",
          "network"
        ]
      },
      "refresh_words": "every 1 min, when the panel shows, on wake, when the network is back"
    }
  ],
  "has_links": true,
  "links": [
    {
      "route": "toggle",
      "url": "pal://dpi/toggle",
      "cli": "pal call dpi/toggle",
      "description": "Turn the bypass on, or off while it is on (the script's toggle)",
      "params": []
    },
    {
      "route": "on",
      "url": "pal://dpi/on",
      "cli": "pal call dpi/on",
      "description": "Turn the bypass on",
      "params": []
    },
    {
      "route": "off",
      "url": "pal://dpi/off",
      "cli": "pal call dpi/off",
      "description": "Turn the bypass off; the script restores the previous settings",
      "params": []
    },
    {
      "route": "test",
      "url": "pal://dpi/test",
      "cli": "pal call dpi/test",
      "description": "Open the panel on the test level; the test runs at once",
      "params": []
    },
    {
      "route": "status",
      "url": "pal://dpi/status",
      "cli": "pal call dpi/status",
      "description": "Open the DPI Bypass palette",
      "params": []
    }
  ],
  "multi": false,
  "has_readme": true
}
