I had many personal projects in various programming languages. Here are some of the main ones. Most are available on GitHub.


  • Type: browser extension
  • Activity: 2024–
  • Technical stack: JavaScript, Vanilla JS

ViHN is an extension for Firefox and Chrome that makes it easier to browse Hacker News without leaving the keyboard.

NHK Easier

  • Type: website
  • Activity: 2018–
  • Technical stack: Django, Python, SQLite

News Web Easy is a Japanese news website targeted at Japanese children. The short articles and the simple sentence structures make is a good candidate to practice Japanese as a beginner.

I created NHK Easier to improve the experience for foreign Japanese learners, starting with myself. In particular, it hides furigana and provides a handy dictionary when hovering or tapping words.

The interface of NHK Easy used to be very inconvenient. NHK Easier made the experience much more comfortable.

A story from News Web Easy as seen in NHK Easier. When hovering on the title, the blue popup shows possible readings and meanings for the expression under the cursor


  • Type: web app
  • Activity: 2022–
  • Technical stack: Python, Flask, SQL Alchemy, TypeScript, React, PostgreSQL

The French education system is currently working on evaluating students by skills instead of grades (pages in French). It means that teachers have to evaluate their students individually on specific skills within the subject they teach. For instance, a math teacher will have to evaluate the level of proficiency of each student with performing calculation, handling sizes and measures, using digital tools, following a rigorous reasoning, and so on.

To adapt the method to students of various levels, evaluations should be customized for each student, depending on how far they have progressed with a skill. However, tracking this, printing the evaluations and distributing them can take a significant amount of time.

This is why I have created MyBelts, a web application that lets teachers manage their class for this purpose. They can register students for the next evaluation in any given skill, and students can also register themselves. When a teacher wants to make their student take an evaluation, they can click on a single button that generates a single PDF with the appropriate evaluation sheets for each student, and their names prefilled. Once the evaluation is done, they can easily check in which students passed and which did not. This way, the application will know what evaluation they need to pass next time.


  • Type: web app
  • Activity: 2022–
  • Technical stack: Python, Pandas (import script), TypeScript, React (web app)

My Library is an Android app that lets you catalog the books you own. This can be useful to let people know what books you already have before they give it to you as a present. You can also list the books you are interested in.

However, it can be inconvenient to share this list with other people. I developed MyBooks, a client-only web app to share this information in a convenient format. You can have a look at the live demo to test what kind of filtering and sorting features it supports.

Kepler Project

  • Type: space sim
  • Activity: 2019–2022
  • Technical stack: C++, GLFW, OpenGL, Dear ImGui, and various other libraries, MinGW, Emscripten

I spent a bit too much time playing Kerbal Space Program. In this game, you can assemble your own rocket to send it flying through the atmosphere and, hopefully, to space. The game is a mostly realistic simulation of orbital mechanics using patched conics. I ended up studying the theory and writing a Python library to assist me in planning my missions: Spyce.

Of course, I ended up writing my own simulation and added a 3D interface. However, with the issues of distributing a Python application and the efforts needed to get reasonable performance, I switched to C++. This is Kepler Project.

Setting up a transfer orbit to the Moon, and performing orbit insertion after the encounter

This is while working on this project that I found and fixed a thorny issue with floating point precision in GLM.

As an aside, I had also started writing an introduction to the mechanics of Kerbal Space Program: Airsick.


  • Type: Anki add-on
  • Activity: 2018–
  • Technical stack: Python, Qt

Anki is a multiplatform flashcard application. It builds upon the Leitner system to help people memorize bits of information. It is extremely useful to learn vocabulary when learning a foreign language, such as Japanese (the name comes from anki, which stands for “memorization” in Japanese). It can also be used for other types of information, such as historical facts and dates, the names, flags and location of countries, administrative regions and bodies of water, and much more.

To reduce the friction of adding a new note of Japanese vocabulary, I wrote a small add-on, which uses EDICT2 to automatically provide the reading (furigana) and meaning of a Japanese expression.

Anki on a computer; SearchEdict is the widget at the bottom


  • Type: cryptographic challenge
  • Activity: 2017–2019
  • Technical stack: C, GMP, SQLite

LCS35 is a cryptographic challenge start on the 35th anniversary of the LCS (Laboratory for Computer Science at MIT) in 1999. It was designed as a calculation that would take 35 years of CPU time and could not be parallelized.

I wrote my own implementation. After some experimentation with Montgomery ladder and other approaches, I settled for just making GMP do the heavy work, and focus on creating an infrastructure that would be resilient to anything, from cosmic rays to meteorites. I had regular checkpoints that would allow me to do distributed verification of the computation.

I estimated that the calculation would take less than 4 years on the AMD Phenom II X2 550 of my desktop computer. Unfortunately, I only started the project in June 2017, and someone else completed the challenge in April 2019 after 3.5 years of computing.

Cryptographic tools

  • Type: command-line utilities
  • Activity: 2012–2018
  • Technical stack: Python, C, x86 assembly with SIMD extensions (MMX, SSE-2, AVX-2, AVX-512)

I implemented majority judgement using multi-party computation during my PhD. See project on GitHub.

Since I learn best by doing, I implemented the most common primitives for symmetric cryptography (DES, AES, MD5, SHA256, SHA-3 and others) in readable Python code.

This was not my first experience with implementing cryptographic code. I wrote a rainbow table implementation for cryptanalysis of MD5 hashes. I also implemented a naive lookup version of reference.

This built upon an heavily optimized implementation I did of MD5 and other cryptographic primitives, using SIMD and other techniques.

I also wrote some utilities for basic frequency analysis.

JavaScript Libraries

  • Type: libraries
  • Activity: 2016–2017
  • Technical stack: JavaScript, Vanilla JS

Nowadays, web browser can display video natively, even with subtitles. However, these subtitles are not part of the light DOM so add-ons such as 10ten cannot detect them. I implemented a JavaScript tool to parse subtitle files and display them as normal page elements so that I could practice Japanese by watching videos with Japanese subs.

When I was playing with the idea of making Spyce available in the web browser using Brython, I ported the readline library and its keybindings to JavaScript.

You can have a look at the live demo.

Playing around with some readline keybindings

Also, I ported some Unicode handling functions from the C source code of CPython.


  • Type: embedded software & graphical interface
  • Activity: 2017
  • Technical stack: C, Atmel

Before I got a proper oscilloscope, I had to make do with my Arduino Leonardo. With some low-level tweaks, I could get it to output almost 10k samples per second, allowing me to visualize a signal up to about 5 kHz on an interface I wrote with OpenGL.

This project relied on arduino.c, another project I created, to be able to use my Arduino in pure C, instead of using the officiel library in C++.


  • Type: 2D RPG
  • Activity: 2013‑2014
  • Technical stack: C, SFML

Vendetta is a 2D top-down RPG game from the early 2000s that focused on building, crafting, trading and fighting, before Minecraft ever existed.

The logo from the original game

I started my own remake in C. I went pretty far with it, and implemented several of the main features:

A sample game with a huge map; I collect some wood to build a sawmill and make planks

The generation of the map uses a custom implementation of Lloyd’s algorithm (iterating Fortune’s algorithm). The code source for this is also available as a separate project.

QR Code encoder/decoder

  • Type: command-line utility
  • Activity: 2013
  • Technical stack: C

I wrote my own implementation of a QR code encoder-decoder. This gave me some hand-on experience on error-correcting codes in general, and Reed-Solomon in particular.

“Hello World” generated with the tool


  • Type: 2D tank programming game
  • Activity: 2012–2013
  • Technical stack: C, GLUT, OpenGL, SOIL, OpenAL, ALUT, Vorbisfile

A long time ago, I used to play Robocode. So, of course, I had to write

A long time ago, I used to play Robocode. So, of course, I had to write my own version in C.


A battle between two bots