—Welcome aboard cocode.dk Airways—
A flight over the filter
Android browser tunnel · Google Apps Script · domain fronting · Farsi-first
Abstract
Mission briefParvaz is a Farsi-first Android browser tunnel for Iranian users with no technical background. A helper deploys the upstream MasterHttpRelayVPN Code.gs on their own Google account; the user receives a parvaz:// link over a secure messenger (Signal or Telegram — not WhatsApp), scans a QR or taps Paste, installs a MITM certificate via Android Settings once, taps Connect, and browses normally in Chrome (or any Chromium browser).
Chrome traffic routes through Apps Script — TLS SNI www.google.com, HTTP Host script.google.com. Chrome trusts the on-device Parvaz CA out of the box; no flags, no about:config, no root. Architecturally aligned with the proven MasterHttpRelayVPN-RUST port; Parvaz's edge is the NOTAM visual identity, Farsi-by-default UI, and tighter onboarding for non-technical passengers.
Flight path
5 hops · DPI sees the frontwww.google.com · indistinguishable from Search.script.google.com → routes to your Web App.UrlFetchApp.fetch(target) · returns {s,h,b} envelope.Notice to airmen
Restricted airspaceCode.gs to your own Google account only — do not centralize deployments, do not commercialise, do not distribute a shared one. Personal, research, and educational use only. If you do not understand the legal implications, do not deploy.
Airframe specifications
Featureswww.google.com · Host script.google.com. DPI sees the front; Google's edge routes by Host.parvaz:// URL or scan QR → install MITM cert once → tap Connect. Persian default.EncryptedSharedPreferences.Honest disclosure
What the app won't do · what it must do · the limits- No analytics, telemetry, or remote logs (yet).
- No central relay — every passenger runs their own Code.gs.
- No location, contacts, SMS, microphone, or camera (camera is opt-in for QR only).
- No auto-update pings · no ads · no crash reporting service.
- No servers operated by us · no accounts · no sign-in.
VpnService— to capture and route browser packets.INTERNET+FOREGROUND_SERVICE— talk to Apps Script, stay alive.POST_NOTIFICATIONS(Android 13+) — show the connected pill.- Device screen-lock — Android refuses CA install otherwise.
- A Chromium browser — Chrome (or Brave / Edge / Vivaldi). No browser flags needed.
Who flies, who's grounded
Honest scope- Chrome on Android — no flags, no
about:config, no root. - Other Chromium browsers — Brave, Edge, Vivaldi — same path, same trust.
- Google-owned hosts (google.com, youtube.com, fonts.googleapis.com) via direct SNI rewrite, in any browser.
- Web apps inside Chrome — Gmail, GitHub, Wikipedia, news sites, search.
- Firefox Stable / Beta / Focus — no
about:config, can't set the trust flag. - Firefox Nightly — flag exists but resets to
falseon every restart (fenix#18990, open since 2021). - DuckDuckGo browser — Chromium-based but rejects the user CA. Confirmed broken.
- Native apps — Instagram, Telegram, WhatsApp, banking, streaming. Reject user CAs by Android 7+ default.
Boarding sequence
~3 minutes · onceReceive the parvaz:// link
Signal or Telegram from your helper · not WhatsApp
Install Parvaz · tap the link
APK from GitHub releases · sideload
Install the certificate
Android Settings · ~30 seconds · see §8
Tap Connect · open Chrome
no browser flags · see §9
Install the certificate · in Settings
Step 1 of 2 · once · ~30 secondsIn Parvaz, tap Open Settings. Parvaz drops parvaz-ca.crt into Downloads and opens Android Settings. Then follow the path for your phone.
Pre-requisite: screen lock (PIN, pattern, password) · Android refuses install otherwise. Can't find the menu? Search CA certificate in Settings. Warning is fine to dismiss — the CA was generated on your phone; the private key never leaves the app's private storage.
Tap Connect · open Chrome
Step 2 of 2 · once · ~10 secondsTap the rubber-stamp button on Parvaz's main screen. When it flips to در پرواز (in flight), open Chrome and browse normally — HTTPS pages route through Parvaz with no further configuration. Brave, Edge, and Vivaldi work the same way; the Parvaz CA you just installed is the only piece they need.
Why Chrome works: Chrome on Android trusts user-installed CAs from the system store, and Chrome's Certificate Transparency enforcement has an explicit carve-out for chains rooted in a user CA — so the Parvaz leaf is accepted with no setup. Browsers that won't work, plus the throughput and WebSocket limits, are covered in §6.
Airframe schematic
Monorepo topology · Kotlin + Goparvaz/ ├── app/ kotlin + compose UI · VpnService · tun2socks │ · sidecar launcher · MITM CA install · NOTAM ├── core/ go SOCKS5 sidecar │ ├── fronter/ TLS-with-custom-SNI dialer + HTTP client │ ├── protocol/ Apps Script JSON envelope encode/decode │ ├── codec/ gzip / br / zstd decoders │ ├── relay/ envelope + fronted client glue │ ├── mitm/ (next) CA + leaf certs + TLS server │ ├── dispatcher/ (next) SNI-rewrite vs MITM+relay decision │ ├── socks5/ local SOCKS5 listener on :1080 │ └── cmd/parvazd/ sidecar main → libparvaz.so (per ABI) ├── reference/ MasterHttpRelayVPN · upstream python (read-only) └── website/ bilingual GitHub Pages · core is called from app via ProcessBuilder, not JNI · one apk + one Code.gs drop-in + one release tag
Helper · deploy the relay
~5 min · once · technical helper onlyIf you are the technical helper setting Parvaz up for someone else, here is the one-time Apps Script deployment. The end user never opens script.google.com.
Quota: ~20k UrlFetch / day · 30 s per fetch · 6 min per execution. One relay per Google account (Apps Script TOS). Test it: open the Web app URL in a browser — you should see {"e":"unauthorized"} (proof the deployment is live and rejecting unauthenticated calls). Source: apps_script/Code.gs · Apps Script · Web Apps.
Ground support · departure
Final call · MIT · 2026Cleared for take-off.
Parvaz replaces only the client half of MasterHttpRelayVPN. The Apps Script server is the upstream Code.gs, unchanged — deploy it to your own Google account.
If you don't need the Farsi-first NOTAM UX touches, the mature MasterHttpRelayVPN-RUST port ships today with prebuilt APKs and an English + Persian walkthrough.