[{"data":1,"prerenderedAt":75},["ShallowReactive",2],{"search-api":3},[4,15,25,36,46,58,66],{"id":5,"path":6,"dir":7,"title":8,"description":9,"keywords":10,"body":14},"content:1.introduction.md","\u002Fintroduction","","Introduction","What Wispr Proxyflow does and how it works at a glance",[11,12,13],"What it does","What it does not do","Requirements","  Introduction  Wispr Proxyflow is an   educational MITM helper  for   Wispr Flow  (macOS). It runs a local proxy that intercepts the app's subscription API response and rewrites it so the app shows the   Pro  plan (  plan: FLOW_PRO_MONTHLY ,   status: active ).  What it does   Starts a local mitmproxy on   127.0.0.1:8080 .  Rewrites responses to   \u002Fapi\u002Fv1\u002Fpayment\u002Fsubscription  — when the body contains the marker key (  total_trial_days ), it is patched (plan, status, credits, trial days, …).  Relaunches Wispr Flow with   --proxy-server=http:\u002F\u002F127.0.0.1:8080 --ignore-certificate-errors  so its traffic goes through the proxy.  What it does not do   It does   not  modify the Wispr Flow app itself.  It does   not  send anything to Wispr's servers on your behalf.  It requires the original Wispr Flow app to be installed.  It only changes what the app   displays  — unrelated responses, non-JSON payloads and other hosts pass through untouched.  Requirements   macOS (Apple Silicon)  Python 3.11+ (for running the script) or the prebuilt   .app  \u002F   .dmg  The original Wispr Flow app at   \u002FApplications\u002FWispr Flow.app",{"id":16,"path":17,"dir":7,"title":18,"description":19,"keywords":20,"body":24},"content:2.installation.md","\u002Finstallation","Installation","Install dependencies and run the tool for the first time",[21,22,23],"From source","First run","Prebuilt binary or app","  Installation  From source     python3   -m   venv   .venv\n   source   .venv\u002Fbin\u002Factivate\n   pip   install   -e   \".[dev]\"            # dev deps: pytest, mitmproxy, pyinstaller\n  First run     python3   wispr_pro.py   start         # proxy + relaunch Wispr Flow → Pro\n  On first start the tool creates a local CA and state under   ~\u002F.wispr_pro\u002F :     File  Purpose     config.toml  Rewrite values (edit to persist changes)    proxy.pid  PID of the running proxy    mitmproxy\u002F  CA certificate + mitmproxy data  If the app cannot connect (or to enable HTTPS interception on other devices), trust the CA once:     python3   wispr_pro.py   trust         # asks for your password\n  Prebuilt binary or app   Grab the   .dmg  from the latest GitHub Release (contains   Wispr Proxyflow.app ).  Or build it yourself — see   Build & package .  Double-click   Wispr Proxyflow.app  to start the proxy in the background (logs:   ~\u002F.wispr_pro\u002Fproxy.log ).     # CLI from inside the bundle:\n   \"dist\u002FWispr Proxyflow.app\u002FContents\u002FMacOS\u002Fwispr-pro\"   start   --no-relaunch\n   Downloads may be quarantined by macOS — first run requires   xattr -dr com.apple.quarantine \"path\u002Fto\u002FWispr Proxyflow.app\"  or a right-click → Open.  html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"id":26,"path":27,"dir":7,"title":28,"description":29,"keywords":30,"body":35},"content:3.usage.md","\u002Fusage","Usage","Commands and customization flags",[31,32,33,34],"Commands","Customization flags","Persistent config","Verify it worked","  Usage  Commands     Command  What it does     python3 wispr_pro.py start  Start proxy (foreground) + relaunch Wispr Flow    python3 wispr_pro.py stop  Stop proxy + quit Wispr Flow    python3 wispr_pro.py status  Show proxy \u002F port \u002F app state    python3 wispr_pro.py trust  Trust the proxy CA in the System keychain (sudo)    python3 wispr_pro.py selftest  Verify the rewrite on a captured payload    python3 wispr_pro.py restart  Stop, then start again   start  blocks like   mitmdump . Run in the background:     nohup   python3   wispr_pro.py   start   >  \u002Ftmp\u002Fwispr-pro.log   2>&1   &\n  Customization flags  All flags come   after  the subcommand:     python3   wispr_pro.py   start   \\\n     --plan   FLOW_PRO_YEARLY   \\        # plan: FLOW_PRO_MONTHLY (default), FLOW_PRO_YEARLY, …\n     --status   active   \\               # status: active (default), trialing, …\n     --trial-days   30   \\               # total_trial_days + daysLeft\n     --trial-ends-at   1893456000   \\    # unix timestamp\n     --credits   99999   \\               # credits\n     --no-subscribed   \\               # --subscribed \u002F --no-subscribed (is_subscribed)\n     --days-left   30   \\                # daysLeft only\n     --marker   total_trial_days   \\     # JSON key that triggers the rewrite\n     --host   127.0.0.1   --port   8080   \\#   proxy   bind   address\n     --ca-dir   ~\u002F.wispr_pro   \\         # state dir (config, CA, pid)\n     --app   \"\u002FApplications\u002FWispr Flow.app\"   \\\n     --no-relaunch                   # don't relaunch Wispr Flow\n  See   python3 wispr_pro.py start --help  for the full list.  Persistent config  Values can be persisted in   ~\u002F.wispr_pro\u002Fconfig.toml  (created on first start). Flags override it:     [rewrite]\n   status = \"active\"\n   plan = \"FLOW_PRO_MONTHLY\"\n   total_trial_days = 365\n   trial_ends_at = 1893456000\n   credits = 99999\n   is_subscribed = true\n   days_left = 365\n   marker = \"total_trial_days\"\n  Verify it worked  Open Wispr Flow — the plan should show   Pro . Check the proxy log:     grep   \"\\[PRO\\]\"   ~\u002F.wispr_pro\u002Fproxy.log   |   tail\n   # [PRO] rewrote \u002Fapi\u002Fv1\u002Fpayment\u002Fsubscription?...: {...FLOW_BASIC...} -> {...FLOW_PRO_MONTHLY...}\n  html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"id":37,"path":38,"dir":7,"title":39,"description":40,"keywords":41,"body":45},"content:4.build.md","\u002Fbuild","Build & package","Build the .app and the .dmg from source",[42,43,44],"The .app (Apple Silicon)","The .dmg (CI)","Local DMG (one-liner)","  Build & package  The .app (Apple Silicon)  Single entrypoint — everything is bundled (Python + mitmproxy):     python3   build_app.py                         # dist\u002FWispr Proxyflow.app (arm64)\n   python3   build_app.py   --arch   universal2       # arm64 + Intel fat binary\n   python3   build_app.py   --name   \"Wispr Proxyflow\"      # custom name\n   python3   build_app.py   --clean                 # wipe previous outputs first\n  The result is   dist\u002F\u003Cname>.app :   Wispr Proxyflow.app\u002F\n└── Contents\u002F\n    ├── Info.plist            # LSUIElement, bundle id com.local.wispr-proxyflow\n    ├── MacOS\u002F\n    │   ├── wispr-pro         # the onefile proxy binary\n    │   └── wispr-pro-launcher# double-click entry (background start)\n    └── Resources\u002F\n        └── AppIcon.icns\n  Double-clicking starts the proxy in the background; logs go to   ~\u002F.wispr_pro\u002Fproxy.log  (override with   WISPR_PRO_LOG ).  Build deps:   python3 -m pip install mitmproxy pyinstaller  The .dmg (CI)  The GitHub Action   .github\u002Fworkflows\u002Fbuild-app-dmg.yml  builds, packages and publishes a DMG on every tag push:     git   tag   v1.0.0\n   git   push   origin   v1.0.0\n   Runs on   macos-14  (arm64).  Installs deps → runs   pytest  +   wispr_pro.py selftest .   python build_app.py  →   dist\u002FWispr Proxyflow.app .   hdiutil create  →   dist\u002FWispr-Pro-\u003Cversion>.dmg  (UDZO).  Uploads the DMG as a workflow artifact and attaches it to a GitHub Release (tagged builds only). Ad-hoc signed — first launch on another Mac may need right-click → Open or removing the quarantine attribute.  Local DMG (one-liner)     hdiutil   create   -volname   \"Wispr Proxyflow\"   \\\n     -srcfolder   \"dist\u002FWispr Proxyflow.app\"   \\\n     -ov   -format   UDZO   \"dist\u002FWispr-Pro-1.0.0.dmg\"\n  html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"id":47,"path":48,"dir":7,"title":49,"description":50,"keywords":51,"body":57},"content:5.architecture.md","\u002Farchitecture","Architecture","How the rewrite, config and build pipeline fit together",[52,53,54,55,56],"Rewrite logic (wispr_pro.py)","Config merge chain","Plan & status enums (from the app's own enums)","Runtime model","Build pipeline","  Architecture  Rewrite logic (  wispr_pro.py )   response body ── contains marker key \"total_trial_days\"? ──no──→ pass through\n      │ yes\n      ▼\nparses as a JSON object? ──no──→ pass through\n      │ yes\n      ▼\npatch fields: status, plan, credits, is_subscribed, trial days, daysLeft\n      │\n      ▼\nContent-Encoding removed, Content-Length fixed, body replaced\n  Everything else — other hosts, endpoints, non-JSON payloads — is untouched.  Config merge chain   defaults ──> config.toml [rewrite] ──> CLI flags\n   toml   days_left  maps to the API field   daysLeft  (camelCase).   load_patch()  is called by the addon at request time (in-process), so config edits apply on the next response without restarting the proxy.  Plan & status enums (from the app's own enums)   Plans:   FLOW_BASIC ,   FLOW_PRO_MONTHLY ,   FLOW_PRO_YEARLY , student\u002Fteam\u002Fbusiness variants.  Statuses:   active ,   trialing ,   canceled ,   none ,   past_due , …  Runtime model    Foreground only.    start  runs mitmproxy in-process (DumpMaster + asyncio) and blocks — no child processes. This is deliberate: a spawned child of a PyInstaller onefile binary loses its extraction directory when the parent exits (  base_library.zip  FileNotFoundError crash — the previous design bug).  Background via   nohup … & ;   stop \u002F  status  read   proxy.pid .  Build pipeline   wispr_pro.py\n   │  PyInstaller --onefile --collect-all mitmproxy\n   ▼\ndist\u002Fwispr-pro   (single Mach-O, arm64 \u002F universal2)\n   │  build_app.py assembles bundle + codesign\n   ▼\ndist\u002FWispr Proxyflow.app\n   │  GitHub Action: hdiutil create (UDZO)\n   ▼\ndist\u002FWispr-Pro-\u003Cversion>.dmg\n",{"id":59,"path":60,"dir":7,"title":61,"description":62,"keywords":63,"body":65},"content:6.troubleshooting.md","\u002Ftroubleshooting","Troubleshooting","Common problems and their fixes",[64],"Logs","  Troubleshooting     Problem  Fix     port 127.0.0.1:8080 already in use  A proxy is already running —   python3 wispr_pro.py status , then   stop   App shows errors \u002F can't connect  CA not trusted —   python3 wispr_pro.py trust  (asks for your password)   Still on Basic plan   grep \"\\[PRO\\]\" ~\u002F.wispr_pro\u002Fproxy.log  — no lines means traffic isn't reaching the proxy; relaunch with   python3 wispr_pro.py start  again    mitmproxy has crashed … base_library.zip  Old build with a background child — use the current foreground build (  start )    .app  won't open from Downloads  Remove quarantine:   xattr -dr com.apple.quarantine \"path\u002Fto\u002FWispr Proxyflow.app\"   Proxy dies when terminal closes  Background it:   nohup python3 wispr_pro.py start >\u002Ftmp\u002Fwispr-pro.log 2>&1 &   Changes not applied  Edit   ~\u002F.wispr_pro\u002Fconfig.toml , then   stop  +   start  Logs   Proxy + rewrite log:   ~\u002F.wispr_pro\u002Fproxy.log  Rewrite events:   grep \"\\[PRO\\]\" ~\u002F.wispr_pro\u002Fproxy.log | tail  The   .app  double-click entry also logs there (  WISPR_PRO_LOG  overrides).",{"id":67,"path":68,"dir":7,"title":69,"description":70,"keywords":71,"body":74},"content:index.md","\u002F","Wispr Proxyflow","Wispr Flow → Pro — local MITM helper documentation",[72,73],"Repository layout","Quick links","  Wispr Proxyflow  Wispr Flow → Pro — a single-file Python tool (mitmproxy addon + CLI) that starts a local intercepting proxy and rewrites Wispr Flow's subscription API response so the app shows the   Pro  plan.  Everything runs locally. Only the app's   displayed  state changes.  Repository layout     Path  Purpose     wispr_pro.py  The tool: addon + CLI (single file)    build_app.py  Build entrypoint →   dist\u002F\u003Cname>.app    build_app.py --arch universal2  arm64 + Intel fat binary    assets\u002Ficon\u002F  App icon (  .icns )    tests\u002F  pytest suite (no mitmproxy needed)    .github\u002Fworkflows\u002F  CI + DMG release builds  Quick links    Installation   Usage   Build & package   Architecture   Troubleshooting",1785972639769]