Elio Darras
Projet personnelExpérimental, non abouti

Darrao VPN

Un client WireGuard en Flutter, avec son extension réseau native

Captures de l'app
Captures réelles de l'app.

Écran par écran

  • 01L'accueil : l'état du tunnel, le bouton, le serveur courant, et la bannière en mode test.

  • 02Dix serveurs, chacun avec son endpoint. Taper une ligne lance la connexion.

  • 03Réglages : connexion automatique, mode sombre, et un kill switch annoncé « bientôt » plutôt que factice.

  • 04Connexion en cours, en thème clair. Un toucher annule.

  • 05Le watchdog de 20 secondes a coupé : « Could not reach this server. Try another location. »

  • 06Les réglages en thème clair.

Rôle

Projet personnel

Un client VPN iOS et Android qui monte un tunnel WireGuard via une extension réseau Swift. Dix serveurs au choix, consentement avant toute publicité, connexion automatique, deux thèmes, et une interface qui reflète l'état réel du tunnel. Non publié.

Ce qu'il y a dedans

  • Flutter, Riverpod 3, go_router, Material 3.
  • Extension réseau Swift : parseur wg-quick maison, WireGuardKit en package local, bibliothèque Go compilée au build.
  • Machine à états du tunnel abonnée au natif, watchdog de 20 s, annulation pendant la connexion.
  • SDK publicitaire initialisé seulement après consentement.

En détail

01Ce que c'est

Un client VPN iOS et Android écrit en Flutter, qui monte un tunnel WireGuard via une extension réseau native. Le modèle est celui du VPN gratuit financé par la publicité : les serveurs sont des nœuds gratuits, dix pays au choix, et une bannière AdMob s'affiche sur l'accueil.

1 327 lignes de Dart en 15 fichiers, environ 300 lignes de Swift côté extension. Flutter avec Material 3, Riverpod 3, go_router, shared_preferences, wireguard_flutter et google_mobile_ads.

02Le parcours et l'état du tunnel

Au premier lancement, un écran de consentement annonce le service VPN, la politique sans journaux et la publicité. Tant que l'accord n'est pas donné, le SDK publicitaire n'est pas initialisé : c'est le mécanisme de conformité de l'app.

L'accueil affiche l'état réel du tunnel, déconnecté, connexion, connecté, échec, un gros bouton rond, le serveur courant et la bannière. L'interface reflète le flux d'état émis par le natif, pas une supposition : si iOS coupe le VPN depuis les Réglages, l'app le voit.

Un watchdog de 20 secondes ferme le tunnel et affiche une erreur si la connexion n'aboutit pas, et le bouton annule la tentative en cours. C'était le correctif d'une régression réelle : le bouton désactivé pendant la transition avait fermé la seule échappatoire d'une connexion qui ne rendait jamais la main.

Réglages : connexion automatique au lancement, réellement appliquée ; mode sombre et clair, tous deux complets ; et un kill switch volontairement désactivé et annoncé « bientôt » plutôt que de laisser croire à une protection inexistante.

03Le pont natif

Dart construit la configuration wg-quick, clé privée, adresse, DNS, MTU, pair, endpoint, keepalive, et la passe au plugin. Côté Swift, une extension réseau reçoit la configuration, la parse à la main avec un analyseur d'états, validation des clés Curve25519, des plages d'adresses et des endpoints, une vingtaine de cas d'erreur typés, puis la confie à WireGuardKit qui monte le tunnel.

Le projet embarque le dépôt wireguard-apple en package Swift local, et une phase de build Xcode compile la bibliothèque Go pour l'architecture demandée. La capability packet-tunnel-provider exige un compte développeur payant.

Projet personnel non publié. Ce qui reste avant une mise en ligne, dit tel quel : les identifiants AdMob de test à remplacer, les déclarations de suivi publicitaire à ajouter pour la review Apple, et le fait que des clés partagées de comptes gratuits sont inhérentes au modèle : un abus par un tiers fait tomber le service pour tous.