Flok

Production

Hyperlocal social network — vertical video feed, map radar and end-to-end encrypted messaging.

Since Dec. 2023

My role
Design & development — Flutter app and Laravel API
Duration
Since Dec. 2023
Team
Développeur principal, appuis design et produit
Platforms
IOS · ANDROID · API · WEB

01

The problem

Les réseaux sociaux sont mondiaux. Personne ne vous dit ce qui se passe à trois cents mètres de chez vous.

Un commerçant d'Abidjan qui ouvre une boutique, un artisan qui cherche des clients dans son quartier, quelqu'un qui veut savoir quel événement se tient ce soir dans sa commune — aucun n'est servi par un fil optimisé pour l'audience planétaire.

Et la contrainte structurante n'était pas fonctionnelle mais matérielle : le parc visé est majoritairement composé de téléphones d'entrée et de milieu de gamme, sur des forfaits comptés. Une application qui vide le forfait ou fait chauffer l'appareil se fait désinstaller la première semaine.

02

What I built

Une application Flutter et son API Laravel. Les publications sont géolocalisées et vivent douze mois. Le fil est classé par un moteur combinant les lieux de l'utilisateur, la proximité, la récence et une part de hasard contrôlée, servi par Meilisearch avec repli automatique sur MySQL si l'index tombe.

Trois modules structurent l'application : le feed vidéo vertical, le radar cartographique qui affiche personnes et vitrines commerciales autour de soi avec regroupement en grappes et filtres, et une messagerie chiffrée de bout en bout avec sauvegarde chiffrée et phrase de récupération de douze mots.

Flok project

03

The hard parts

Saturer le décodeur vidéo au bout de trente clips

Les premières versions créaient un lecteur par élément du fil sans jamais le détruire. Au bout d'une trentaine de swipes, le décodeur matériel était saturé et l'application se figeait. La solution : un pool borné à trois lecteurs en fenêtre glissante, avec libération systématique au recyclage.

Afficher des milliers de points sans faire ramer la carte

Chaque marqueur personnalisé est une image à rasteriser. Au-delà de quelques centaines, la carte tombait sous les trente images par seconde. J'ai mis en place un cache d'icônes de marqueurs et un regroupement en grappes côté client, avec éclatement progressif au zoom.

Chiffrer les médias sans rendre l'ouverture insupportable

Le chiffrement AES-256-GCM en Dart pur rendait l'ouverture d'une vidéo chiffrée trop lente pour être acceptable. Le passage à une implémentation native iOS et Android, au format binaire identique pour rester compatible avec les médias déjà chiffrés, a rendu le déchiffrement quasi instantané.

Les notifications iOS en double, ou pas du tout

La combinaison des notifications système et de la bibliothèque de notifications enrichies produisait des doublons sur iOS et des silences sur Android. Il a fallu reprendre entièrement le routage des messages entrants et documenter le comportement attendu par plateforme.

04

The results

4
Paliers de transcodage

240p à 1080p

3
Lecteurs max en mémoire

contre un par élément avant

12
Mois de durée de vie

par publication

E2EE
Messagerie

AES-256-GCM natif

05

The stack

  • Flutter
  • Dart
  • Riverpod
  • Drift / SQLite
  • libsignal
  • video_player
  • Laravel 12
  • PHP 8.2
  • Sanctum
  • Meilisearch
  • Redis
  • Pusher
  • FCM
  • Agora
  • Bunny Stream
  • Sentry
  • Docker

Code Mes Rêves

Alexis Kouakou