Skip to content

GVA Horizon

2026·App Mobile & IAEn cours
React NativeExpoNode.jsPostgreSQLRedisClaude APITypeScriptDocker

Un écosystème complet qui centralise des dizaines de flux de données genevois (transports TPG et SNCF, météo, qualité de l'air, événements, trafic aux douanes, aéroport) en briefings personnalisés et en assistant conversationnel propulsé par Claude. Le backend orchestre 63 fetchers avec files de traitement asynchrones et gestion de pannes. L'app mobile React Native/Expo offre une expérience native avec offline support, géolocalisation et notifications push.

Le contexte

Les habitants de Genève jonglent quotidiennement avec une dizaine de sources d'information différentes : horaires TPG, retards du Léman Express, météo, qualité de l'air, événements culturels, temps d'attente aux douanes, vols à l'aéroport. Horizon centralise toutes ces données en un point unique et les transforme en informations actionnables, adaptées au profil et aux habitudes de chaque utilisateur grâce à l'intelligence artificielle.

L'architecture

Le projet se compose de trois briques indépendantes qui communiquent via API REST.

Le backend Node.js/Express est le cœur du système. 63 fetchers collectent les données en continu depuis des APIs publiques, des flux GTFS, du scraping et des endpoints propriétaires. Chaque fetcher est isolé dans un job BullMQ avec retry automatique et circuit breaker pour absorber les indisponibilités des sources externes. Les données transitent par un cache Redis avant d'être persistées dans PostgreSQL via 50 modèles Sequelize. 25+ jobs asynchrones gèrent l'ingestion, le nettoyage et l'enrichissement des données.

La couche intelligence s'appuie sur l'API Claude d'Anthropic. Un système de profilage comportemental analyse les habitudes de l'utilisateur (trajets récurrents, centres d'intérêt, horaires) pour générer des briefings matinaux personnalisés. L'assistant conversationnel dispose du contexte temps réel de la ville pour répondre à des questions concrètes sur les transports, la météo ou les événements. Un module de détection d'anomalies identifie les situations inhabituelles (perturbation majeure, pic de pollution, événement exceptionnel) et alerte proactivement.

L'app mobile React Native/Expo (SDK 54, React Native 0.81) utilise Expo Router v6 pour la navigation file-based, Zustand 5 pour le state global et TanStack Query 5 pour le data fetching avec cache et invalidation automatique. 50+ hooks custom encapsulent la logique métier. L'app fonctionne en mode offline grâce à une couche de persistence locale qui se synchronise à la reconnexion. La géolocalisation background permet d'adapter les briefings au contexte de déplacement.

Les défis techniques

Fiabilité de l'ingestion à grande échelle. 63 sources de données signifie 63 points de défaillance potentiels, chacun avec ses propres formats, limites de taux et comportements d'erreur. La solution repose sur une architecture de jobs isolées avec BullMQ : chaque fetcher a son propre worker, son propre intervalle de refresh et sa propre stratégie de retry. Redis sert de tampon entre l'ingestion et la persistance, ce qui découple les deux et permet au système de continuer à servir des données même quand une source est temporairement inaccessible.

Personnalisation IA avec contexte riche. Générer un briefing pertinent ne se résume pas à envoyer des données brutes à un LLM. Le système construit un prompt contextualisé qui combine le profil comportemental de l'utilisateur, les données temps réel de la ville et l'historique des interactions. Le défi était de maintenir la cohérence et la concision des réponses tout en injectant suffisamment de contexte pour que l'assistant soit réellement utile et pas générique.

Offline-first sur mobile. L'app doit rester fonctionnelle dans le métro, en zone blanche ou en mode avion. TanStack Query gère le cache des requêtes API, mais la vraie complexité réside dans la synchronisation bidirectionnelle à la reconnexion : résoudre les conflits entre les actions effectuées offline et l'état serveur, sans perdre de données ni créer de doublons.

L'échelle du projet

  • Backend : 63 fetchers de données, 50 modèles Sequelize, 25+ jobs BullMQ, 25+ groupes d'endpoints API
  • Mobile : 50+ hooks custom, notifications push, biométrie, géolocalisation background, achats in-app
  • Infrastructure : Docker, PM2 clustering, Caddy reverse proxy, JWT auth avec refresh tokens, rate limiting, monitoring Sentry
  • Produit : feature flags, A/B testing, gamification (badges, streaks, défis), i18n FR/EN

L'état actuel

Le backend est en production avec l'ensemble des 63 fetchers actifs. L'app mobile est en phase de bêta privée avec les fonctionnalités core : briefings personnalisés, assistant conversationnel et carte temps réel. Le site vitrine est en ligne. Les prochaines étapes sont l'optimisation de la personnalisation IA et la préparation du lancement sur les stores.

Voir le projet →