Skip to content

GVA Horizon

2026·Mobile App & AIIn Progress
React NativeExpoNode.jsPostgreSQLRedisClaude APITypeScriptDocker

A comprehensive ecosystem that centralizes dozens of Geneva data streams (TPG and SNCF transit, weather, air quality, events, border crossing traffic, airport) into personalized briefings and a conversational assistant powered by Claude. The backend orchestrates 63 fetchers with asynchronous job queues and fault tolerance. The React Native/Expo mobile app delivers a native experience with offline support, geolocation, and push notifications.

Context

Geneva residents juggle a dozen different information sources on a daily basis: TPG schedules, Leman Express delays, weather, air quality, cultural events, border crossing wait times, airport flights. Horizon centralizes all of this data into a single hub and transforms it into actionable information, tailored to each user's profile and habits through artificial intelligence.

Architecture

The project is composed of three independent layers that communicate via REST API.

The Node.js/Express backend is the core of the system. 63 fetchers continuously collect data from public APIs, GTFS feeds, web scraping, and proprietary endpoints. Each fetcher is isolated in a BullMQ job with automatic retries and circuit breakers to handle external source outages. Data passes through a Redis cache before being persisted in PostgreSQL via 50 Sequelize models. 25+ asynchronous jobs manage ingestion, cleanup, and data enrichment.

The intelligence layer is built on Anthropic's Claude API. A behavioral profiling system analyzes user habits (recurring commutes, interests, schedules) to generate personalized morning briefings. The conversational assistant has access to real-time city context to answer concrete questions about transit, weather, or events. An anomaly detection module identifies unusual situations (major disruption, pollution spike, exceptional event) and proactively sends alerts.

The React Native/Expo mobile app (SDK 54, React Native 0.81) uses Expo Router v6 for file-based navigation, Zustand 5 for global state, and TanStack Query 5 for data fetching with caching and automatic invalidation. 50+ custom hooks encapsulate the business logic. The app works in offline mode through a local persistence layer that syncs upon reconnection. Background geolocation enables briefings to adapt to the user's travel context.

Technical challenges

Reliable ingestion at scale. 63 data sources means 63 potential points of failure, each with its own formats, rate limits, and error behaviors. The solution relies on an isolated job architecture with BullMQ: each fetcher has its own worker, its own refresh interval, and its own retry strategy. Redis serves as a buffer between ingestion and persistence, decoupling the two and allowing the system to continue serving data even when a source is temporarily unavailable.

AI personalization with rich context. Generating a relevant briefing is not simply a matter of sending raw data to an LLM. The system builds a contextualized prompt that combines the user's behavioral profile, real-time city data, and interaction history. The challenge was maintaining response coherence and conciseness while injecting enough context for the assistant to be genuinely useful rather than generic.

Offline-first on mobile. The app must remain functional in the subway, in dead zones, or in airplane mode. TanStack Query handles API request caching, but the real complexity lies in bidirectional synchronization upon reconnection: resolving conflicts between actions performed offline and the server state, without losing data or creating duplicates.

Project scale

  • Backend: 63 data fetchers, 50 Sequelize models, 25+ BullMQ jobs, 25+ API endpoint groups
  • Mobile: 50+ custom hooks, push notifications, biometrics, background geolocation, in-app purchases
  • Infrastructure: Docker, PM2 clustering, Caddy reverse proxy, JWT auth with refresh tokens, rate limiting, Sentry monitoring
  • Product: feature flags, A/B testing, gamification (badges, streaks, challenges), i18n FR/EN

Current status

The backend is in production with all 63 fetchers active. The mobile app is in private beta with the core features: personalized briefings, conversational assistant, and real-time map. The landing page is live. Next steps include optimizing AI personalization and preparing for the app store launch.

View project →