Public products

Four web apps built from French public data and official sources.

AssoRadar

Searches more than two million French associations and funding opportunities in official registries. It removes duplicate records, ranks the results, and links each one to its source.

  • A Go API uses PostgreSQL and Meilisearch. The React Router v7 frontend uses SSR and MapLibre.
  • Scheduled jobs import RNA/Waldec and other open data, reconcile duplicate records, then rebuild the search index.
Visit AssoRadar

LegiFeed

Summarizes newly published French laws and links each summary to the source text. Each entry includes estimates of impact, friction, and complexity.

  • Go services handle ingestion and the API, with PostgreSQL for storage. The web app uses React 19, Vite SSR, and Express.
  • Scheduled imports read DILA/Légifrance PISTE. Mistral classifies each text and writes a summary that must pass JSON validation; failed output falls back to an extractive summary.
Visit LegiFeed

Objectif Civique

Practice site for France's 2026 civic exam. It has sourced questions, practical scenarios, guides, and a timed mock exam; no account is required.

  • The React and Vite PWA stores progress in the browser with Zustand, so it needs neither accounts nor an application backend.
  • Public pages are prerendered for search engines. Vitest and Playwright cover the app, while scheduled jobs audit questions and monitor links to official sources.
Visit Objectif Civique

Vrai Salaire

A daily game based on the official 2024 INSEE salary dataset. Players estimate a salary from a job profile.

  • A Go API reads salary records from PostgreSQL. The React 19 and Vite PWA uses Zustand and prerenders its public pages.
  • An import job cleans the 2024 INSEE dataset for use in the daily game. A scheduled sync publishes updated records.
Play Vrai Salaire

Personal bots and tools

Four Telegram-based tools I use for recurring tasks.

Gymbot

Records workouts and progression, adds Apple Health data, and drafts coaching suggestions from recent sessions.

  • A Go service stores workout data in PostgreSQL. A React/Vite Telegram Mini App handles workout entry and history.
  • Apple Health data and an OpenAI-compatible model provide context for the coaching suggestions.

LinkedIn Reply Assistant

Drafts English and French LinkedIn replies for review in Telegram.

  • A Go service stores drafts in PostgreSQL or SQLite and calls Mistral or an OpenAI-compatible model. Telegram is the review interface.
  • A long-polling worker receives Telegram updates and sends each draft back for review.

TarantulaGo

Records feeding, molts, health notes, and reminders for tarantulas and cricket colonies in Telegram.

  • The Go service uses GORM and PostgreSQL. Telebot provides the Telegram interface, with an embedded web app for care records.
  • Tarantula and cricket-colony records use the same data model.

Shows Bot

Stores favourite TV shows and sends Telegram reminders before new episodes. Episode metadata and schedules come from TMDB and TVMaze.

  • The Go service uses PostgreSQL or SQLite and connects to Telegram.
  • Scheduled jobs query TMDB and TVMaze for upcoming episodes, then send reminders.

How it runs

I deploy the containerized services to a small k3s cluster and manage them without a platform team.

Sources Open data · APIs
Services Go · PostgreSQL
Interfaces React · Telegram
Delivery k3s · Cloudflare

Most backends are Go services backed by PostgreSQL; their interfaces use React or Telegram. Helm and Argo CD deploy the containers to k3s. Cloudflare handles DNS, caching, and public traffic. Objectif Civique's frontend runs on Cloudflare Pages, while its audit jobs run on k3s.

  • BuildGo · React · Vite
  • DataPostgreSQL · Meilisearch
  • OperateDocker · Helm · Argo CD · k3s
  • Edge & insightCloudflare · Umami

Experience and contact

Work experience is on the CV.

Read the CV for my professional experience, or email me about a project.