Client work · Mobile VPN

HS VPN: a connection that earns its Protected state.

Mahmoud led the product end to end: the problem definition in Egypt-style DPI-heavy networks, the visual language, the Flutter-and-native split, the per-node registrar, the catalog control plane, and store delivery.

Android · primaryLive on Google Play as a free, ad-supported app.In productionPackage com.hsvpn.vpn · published by Hossam Technology Company LLC.
iOS · secondaryWireGuardKit packet-tunnel extension reached TestFlight.TestFlight buildPlain WireGuard on iOS. No public App Store release confirmed in the reviewed evidence.

A started tunnel is not yet a working connection.

On networks that interfere with ordinary VPN traffic, the app needs more than a successful tap. It needs a usable server profile, a native tunnel start, and handshake evidence before it can show a protected session.

The product problem was to make that state understandable. A reassuring green label would be misleading if the device had started a tunnel service but never exchanged traffic with the selected peer. The experience therefore follows what the connection actually does, including failure and fallback states.

Choose, connect, understand.

The main path keeps location choice and the connection control close together. Once protected, the dashboard makes the session state prominent; a separate statistics view lets someone inspect the session in detail.

Those simple screens sit on top of catalog selection, peer registration, native tunnel work, and a confirmed handshake. The visible interaction is a single tap. The engineering work is everything that has to be true before that tap can honestly become “Protected”.

Platform note. The captures below are older iOS TestFlight builds. The Android build on Google Play is the live production path; these screens are presented as evidence of the earlier product experience, not as current Android UI.

End-to-end product and engineering lead.

End-to-end product and engineering lead: idea, visual design, architecture, infrastructure, and store delivery.

Crossed the product and operational boundaries: defining the connection experience, shaping the dark visual language, deciding how Flutter and native VPN code would divide responsibilities.

Designed the registration and configuration path, ran the per-region server infrastructure, and moved the Android and iOS builds through store delivery.

The repository records other contributors. This case study describes Mahmoud's leadership and decisions across the product and engineering boundaries.

How it fits together

Flutter, native tunnel, registrar, and a catalog control plane.

Flutter owns the screens, the connection orchestrator, and the catalog choices. Native code on Android and iOS owns the actual tunnel lifecycle and the OS-level VPN integration.

A per-node FastAPI registrar handles peer registration and IP assignment. Firebase Remote Config supplies the live server catalog with cached and bundled fallbacks, so a remote outage does not remove every location.

The Flutter app owns the user state and orchestrator. A native tunnel service runs on Android and iOS and talks WireGuard or AmneziaWG to a per-node registrar. Firebase Remote Config supplies the server catalog with cached and bundled fallbacks.Flutter appScreens · controllers · catalogOrchestrator + state machineNative tunnelAndroid · Kotlin · AmneziaWGiOS · Swift · WireGuardKitSecure key storageCurve25519 keypair · OS keystoreServer catalog control planeFirebase Remote Config · version gatesThree-layer fallbackRemote → last-known-good → bundledA remote outage does not remove every locationConnection orchestratorOrder profiles · register peer · start tunnelWait for handshake before showing ProtectedAmneziaWG preferred on Android when enabledWireGuard plain tunnel on iOS TestFlightConnection-aware ad placementAdMob + Meta · gated on protected stateVPN server nodePer-region · WireGuard or AmneziaWGwg0 / awg0 interfaceFastAPI peer registrarPOST /register · assigns client IPPeer record added to live wg interfaceBehind Caddy on TCP 443/status · /healthz · /diagNo persistent user databaseThe interface itself is the source of truthCleanup keeps stale peers from lingeringEnv-var switch between WireGuard and AWGNo redeploy to change transportWireGuard / AmneziaWG UDPSource-backed architecture
  • Android · primary platformLive on Google PlayAmneziaWG path is in production; plain WireGuard is also available.
  • iOS · secondary platformTestFlight build onlyPlain WireGuard packet-tunnel extension. No public App Store release confirmed.
  • Visible interactionOne tapA confirmed handshake is the point at which the session is protected.
  • Catalog fallbackThree layersRemote Config, last-known-good cache, bundled bootstrap catalog.

What happens after Connect.

  1. Resolve a server catalog

    Remote Config, then a last-known-good cache, then a bundled bootstrap. An unavailable remote response does not remove every option.

  2. Order the candidate profiles

    The orchestrator orders supported profiles for the device and network; Android prefers an AmneziaWG-capable option when enabled.

  3. Register the client

    The client public key goes to the selected node's FastAPI registrar for peer registration and address assignment.

  4. Start the native tunnel

    Hand the connection to Android or iOS VPN APIs rather than treating a Flutter button event as a tunnel.

  5. Confirm the handshake

    Show Protected only after native handshake evidence indicates that the session is working.

Decisions behind a trustworthy state.

Flutter owns product flow and catalog choice. Native Kotlin and Swift code own tunnel lifecycle. A per-node FastAPI registrar handles peer registration; Remote Config, cache, and bundled data keep the catalog recoverable.

On Android, the connection path can use AmneziaWG-oriented operation where enabled to address networks that interfere with ordinary WireGuard. The checked-in iOS TestFlight build uses plain WireGuard through a packet-tunnel extension. The two platforms should therefore be described separately, even though they share product intent and much of the Flutter experience.

Make the status honest

A user sees Protected only after a real handshake, not merely after a service starts.

Connection state waits for native handshake evidence.

Recover the catalog

A remote configuration outage need not remove every location.

Remote Config, cached, and bundled catalog layers.

Keep native responsibility clear

Product flow can change without bypassing OS tunnel rules.

Flutter orchestrates; Kotlin and Swift own native VPN lifecycle.

Place ads after connection truth

Monetization does not define protected status or block a disconnect action.

Connection-aware placement and remote switches.

Where it ran

Designed for restrictive networks, used in three.

Android uses an AmneziaWG-oriented path on networks where plain WireGuard is blocked; the iOS TestFlight build uses the WireGuardKit packet-tunnel extension. OpenVPN is not part of the shipped product.

Founder-reported Firebase observations, owner-confirmed September 2026.

  • Egypt

    Designed-for-environment. Daily use across home, mobile, and café networks where ordinary WireGuard is fingerprinted or blocked.

  • Iran

    Worked in Iran. Firebase showed multiple users in Iran throughout the month, with daily use.

  • Turkmenistan

    About 1,500 users from Turkmenistan, with daily use per Firebase, as reported by the founder.

Where the product stands.

Android is publicly listed on Google Play. The listing displayed 10K+ downloads when checked on 25 September 2026; this is a dated distribution count, not an active-user or success measure.

iOS reached TestFlight. The reviewed evidence does not establish a public App Store release or measured connection success, speed, revenue, or retention outcomes.

The visible interaction is one tap. The engineering work is the catalog, the registered peer, the native tunnel, and the confirmed handshake that make the word Protected defensible. The portfolio documents those decisions without exposing server addresses, keys, or operational access details.