# jomarmata24/mobile-openvpn architecture

> Architecture diagram of the GitHub repository jomarmata24/mobile-openvpn, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/jomarmata24/mobile-openvpn
- Repository: https://github.com/jomarmata24/mobile-openvpn

## Overview

Projectmata Mobile OpenVPN is a NativePHP plugin exposing VPN support, permission, connect, disconnect, and status operations to Laravel and in-app JavaScript. The principal flow passes a profile and optional credentials through a client-facing API and NativePHP bridge to platform-specific implementations; Android parses and launches a profile through ics-openvpn, while iOS documents an incomplete Network Extension integration. The iOS connection lifecycle is scaffolded, not backed by an OpenVPN runtime. The tree and sampled source establish the bridge layers and platform handlers; no separate runtime service or completed iOS tunnel implementation is shown.

Main entry points: [`resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt`](https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt) (Android handlers), [`resources/ios/Sources/MobileOpenVpn/OpenVpnPlugin.swift`](https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/ios/Sources/MobileOpenVpn/OpenVpnPlugin.swift) (iOS handlers), [`src/OpenVpnManager.php`](https://github.com/jomarmata24/mobile-openvpn/blob/main/src/OpenVpnManager.php) (VPN manager), [`src/Facades/OpenVpn.php`](https://github.com/jomarmata24/mobile-openvpn/blob/main/src/Facades/OpenVpn.php) (OpenVPN facade)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_clients["App APIs"]
  node_laravel(("Laravel app"))
  node_facade["OpenVPN facade<br/>[OpenVpn.php]"]
  node_manager["VPN manager<br/>[OpenVpnManager.php]"]
  node_jsapp(("In-app JavaScript"))
  node_jsapi["JavaScript API<br/>[index.js]"]
end

subgraph group_bridge["NativePHP Bridge"]
  node_provider["Service provider"]
  node_nativebridge["NativePHP bridge"]
end

subgraph group_android["Android VPN"]
  node_androidplugin["Android handlers<br/>[OpenVpnPlugin.kt]"]
  node_permission["VPN consent<br/>[OpenVpnPlugin.kt]"]
  node_profileparse["Profile parsing<br/>[OpenVpnPlugin.kt]"]
  node_profilestore[("Profile manager<br/>[OpenVpnPlugin.kt]")]
  node_openvpnservice["OpenVPN service<br/>[OpenVpnPlugin.kt]"]
  node_vpnstate["VPN status<br/>[OpenVpnPlugin.kt]"]
end

subgraph group_ios["iOS VPN"]
  node_iosplugin["iOS handlers"]
  node_iospreferences[("VPN preferences")]
  node_networkextension["Network Extension"]
end

node_laravel -->|"invokes"| node_facade
node_facade -->|"resolves"| node_manager
node_manager -->|"calls methods"| node_nativebridge
node_jsapp -->|"invokes"| node_jsapi
node_jsapi -->|"POSTs calls"| node_nativebridge
node_provider -->|"registers"| node_manager
node_nativebridge -->|"dispatches"| node_androidplugin
node_nativebridge -->|"dispatches"| node_iosplugin
node_androidplugin -->|"checks consent"| node_permission
node_permission -->|"returns grant"| node_androidplugin
node_androidplugin -->|"parses profile"| node_profileparse
node_profileparse -->|"saves profile"| node_profilestore
node_androidplugin -->|"starts or stops"| node_openvpnservice
node_androidplugin -->|"reads status"| node_vpnstate
node_iosplugin -->|"loads and saves"| node_iospreferences
node_iosplugin -.->|"planned tunnel control"| node_networkextension

click node_facade "https://github.com/jomarmata24/mobile-openvpn/blob/main/src/Facades/OpenVpn.php"
click node_manager "https://github.com/jomarmata24/mobile-openvpn/blob/main/src/OpenVpnManager.php"
click node_jsapi "https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/js/index.js"
click node_provider "https://github.com/jomarmata24/mobile-openvpn/blob/main/src/MobileOpenVpnServiceProvider.php"
click node_androidplugin "https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt"
click node_permission "https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt"
click node_profileparse "https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt"
click node_profilestore "https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt"
click node_openvpnservice "https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt"
click node_vpnstate "https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt"
click node_iosplugin "https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/ios/Sources/MobileOpenVpn/OpenVpnPlugin.swift"
click node_iospreferences "https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/ios/Sources/MobileOpenVpn/OpenVpnPlugin.swift"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_laravel,node_facade,node_manager,node_jsapp,node_jsapi toneBlue
class node_provider,node_nativebridge toneAmber
class node_androidplugin,node_permission,node_profileparse,node_profilestore,node_openvpnservice,node_vpnstate toneMint
class node_iosplugin,node_iospreferences,node_networkextension toneRose
```

## Components

### App APIs

- **Laravel app**
- [OpenVPN facade](https://github.com/jomarmata24/mobile-openvpn/blob/main/src/Facades/OpenVpn.php): `src/Facades/OpenVpn.php`
- [VPN manager](https://github.com/jomarmata24/mobile-openvpn/blob/main/src/OpenVpnManager.php): `src/OpenVpnManager.php`
- **In-app JavaScript**
- [JavaScript API](https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/js/index.js): `resources/js/index.js`

### NativePHP Bridge

- [Service provider](https://github.com/jomarmata24/mobile-openvpn/blob/main/src/MobileOpenVpnServiceProvider.php): `src/MobileOpenVpnServiceProvider.php`
- **NativePHP bridge**

### Android VPN

- [Android handlers](https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt): `resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt`
- [VPN consent](https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt): `resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt`
- [Profile parsing](https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt): `resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt`
- [Profile manager](https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt): `resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt`
- [OpenVPN service](https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt): `resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt`
- [VPN status](https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt): `resources/android/src/main/java/com/projectmata/mobileopenvpn/OpenVpnPlugin.kt`

### iOS VPN

- [iOS handlers](https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/ios/Sources/MobileOpenVpn/OpenVpnPlugin.swift): `resources/ios/Sources/MobileOpenVpn/OpenVpnPlugin.swift`
- [VPN preferences](https://github.com/jomarmata24/mobile-openvpn/blob/main/resources/ios/Sources/MobileOpenVpn/OpenVpnPlugin.swift): `resources/ios/Sources/MobileOpenVpn/OpenVpnPlugin.swift`
- **Network Extension**

## Connections

- Laravel app → OpenVPN facade: invokes
- OpenVPN facade → VPN manager: resolves
- VPN manager → NativePHP bridge: calls methods
- In-app JavaScript → JavaScript API: invokes
- JavaScript API → NativePHP bridge: POSTs calls
- Service provider → VPN manager: registers
- NativePHP bridge → Android handlers: dispatches
- NativePHP bridge → iOS handlers: dispatches
- Android handlers → VPN consent: checks consent
- VPN consent → Android handlers: returns grant
- Android handlers → Profile parsing: parses profile
- Profile parsing → Profile manager: saves profile
- Android handlers → OpenVPN service: starts or stops
- Android handlers → VPN status: reads status
- iOS handlers → VPN preferences: loads and saves
- iOS handlers → Network Extension: planned tunnel control
