About

I'm a French software engineer based in Paris, working on backend services and the databases behind them. Music enjoyer, Rust lover, open-source advocate. tomplanche.com

Work

I'm an apprentice backend developer on the Internal Services team at Affluences, a French company that measures and forecasts real-time occupancy for cultural and public venues. The platform runs on proprietary IoT sensors feeding a microservice architecture in Node.js and NestJS, with MySQL, Kafka and Kubernetes underneath, and it serves around 1,800 sites. Most of my work sits at the boundary between the service layer and the data: query plans, indexing strategy, schema design, and the architectural decisions that follow from volume.

Pieces of that work are documented in my first-year thesis.

Query optimisation in stats-service, which aggregates sensor history for customer dashboards. The getAttendanceStatsForAPeriod resolver filtered on site_id through JSON_EXTRACT, so MySQL could not use the composite primary key on (measuring_set_id, record_datetime_utc) and fell back to a full table scan over millions of rows. Thirty-day queries took over ninety seconds; a one-year query timed out entirely. I replaced the single query with a two-step lookup: resolve the site's measuring sets through sensors-service first, then run an index seek on the composite key. The extra network hop pays for itself many times over. Thirty days went from ninety seconds to forty milliseconds, and a full year now returns in 220 milliseconds instead of crashing. Shipped to production in October 2025.

I'm completing an engineering degree at CNAM Paris (DICASI, Informatique et systèmes d'information) alongside the apprenticeship. Before Affluences I worked at Crealo.

Things I've built

  • rona, a Rust CLI for a Conventional Commits git workflow: staging with exclusion patterns, templated commit messages, GPG auto-detection, and a sync subcommand. Its configurable [[extra_fields]] system came directly out of working with strict commit conventions at Affluences, pulling INT-XXXX ticket numbers from branch names and suggesting scopes from recent history. On crates.io and Homebrew.

  • clean-dev-dirs, a parallel scanner that reclaims disk space from build artifacts across sixteen language ecosystems. It moves directories to the trash by default rather than calling rm -rf, and emits JSON for scripting.

  • lastfm-client, an async Rust library for fetching and analysing Last.fm listening data.

  • tomplanche.com, my personal site in SvelteKit, open source.

  • clean-cnam-template, a Typst package for CNAM thesis formatting.

Open source

I contribute upstream to the tools I use, almost all of it in Rust:

  • Zed, the editor, where eight of my pull requests have been merged. The one with the widest reach changed the project panel's default sort from lexicographical to natural ordering, so file_2.rs now comes before file_10.rs instead of after it. Since it changes a default rather than adding a setting, it applies to every Zed user from v0.201 on. Elsewhere in the codebase I added digest-based integrity checks to http_client for the binaries Zed downloads from GitHub, fixed a bug where discarding changes left the buffer stale instead of reloading from disk, and added an Add to .git/info/exclude entry to the git context menus.

  • clap, the command-line argument parser, and dialoguer, its counterpart for interactive prompts. Both underpin rona and clean-dev-dirs.

  • multicalc-rust, a numerical methods library.

  • chess-tui, a terminal chess client.

Currently

Image processing in Rust, generative sketches in p5.js, looking on LoRa mesh networking with Meshtastic on the Paris and Gaulix networks, and self-hosting on the AT Protocol, this page included.

Elsewhere

TypeScript, Rust, Python, Bash.

Off screen, mostly music. I'm a Qobuz subscriber and a heavy Last.fm scrobbler, currently somewhere between Chloé Antoniott, Radiohead, Flavien Berger, …