Projects

Collection of freelance projects and personal projects.

Freelance

Leiden Thesis Forms

Leiden Thesis Forms

A website for collaborating on reviewing student theses. Written in Flask with a Nuxt/Vue frontend, the website automates many of the bureaucratic processes surrounding thesis reviews: filling in supervisor information, demanding a third supervisor when awarding very high grades, watermarking tentative reviews, generating a grade letter PDF, etc. It was originally developed for the Software Engineering course at Leiden University, but our prototype was so well received that we were asked to develop it further afterwards.

  • Vue
  • Nuxt
  • Python
  • Flask
  • MongoDB
  • JavaScript
  • Pytest
  • Reportlab
Auditory Japanese Linguistics Research Tool

Auditory Japanese Linguistics Research Tool

A web application for conducting linguistic experiments that involve playing audio fragments to the test subjects. Different from most research survey websites, it is tailored uniquely to research where, for example, a subject may only listen to an audio fragment once. The Vue frontend of the website ensures participants can only hear the audio fragment once before selecting an answer. Additionally, it features forms with conditional logic to minimize the amount data a participant has to enter. The Flask backend of the website collects statistics and can export them in CSV or Excel format.

  • Vue
  • Python
  • Flask
  • MongoDB
Personal website (Dr. Laarman)

Personal website (Dr. Laarman)

Personal website for Leiden University professor Alfons Laarman. Written in Svelte and statically generated via SvelteKit. Features news items generated from Markdown files, and an overview of publications generated from BibTex files.

  • Svelte
  • JavaScript

Personal

LDPFUSE

LDPFUSE

An alternative to Linux FUSE that runs entirely in userspace. LDPFUSE is a header-only C library that makes it easy to develop your own custom file system. You can then leverage the LD_PRELOAD trick to load the library for a process and have it use the file system. Thanks to avoiding context switches, this runs orders of magnitude faster than native FUSE. See the repository for more info.

  • C
DbD Live Game Info

DbD Live Game Info

Twitch.tv extension for the popular game Dead by Daylight. It gives viewers an interactive UI to view what the current in-game abilities do. The extension provides three overlays all written in React: One for the streamer, one for their moderators and one for the viewers. Reviewed and approved for general use by Twitch, but due to my busy schedule I have discontinued development for now.

  • React
  • WebSocket
  • ExpressJS
  • TypeScript
CyberSpies

CyberSpies

CyberSpies is a web-based multiplayer mobile app for playing a game similar to Among Us, but in real-life. It uses NFC tags and the Web NFC API to physically represent points of interest of the game, such as tasks. Additionally, players will wear NFC tags on their shoulders to facilitate interaction. The Svelte frontend allows for creating games, displays the lobby (which you can join via a QR code) and in-game information, and allows for use of the phone's NFC scanner. The backend synchronizes the in-game information over websockets to all players and enforces the in-game timers, e.g. for meetings.

  • Svelte
  • ExpressJS
  • WebSockets
  • JavaScript
GBA Emulator

GBA Emulator

Game Boy Advanced emulator written in Rust. Currently a work-in-progress, and does not run any games yet. But it has a working decoder for the Armv4t instruction set, and runs many of the instructions successfully.

  • Rust
ECDSA for side-channel analysis

ECDSA for side-channel analysis

An educational implementation of the ECDSA algorithms for public key generation and signing messages with a private key, for the ChipWhisperer-Lite.
It is vulnerable to side-channel attacks by design to facilitate learning about them and analyzing them.

  • C
BoterBotTS

BoterBotTS

Modular Discord bot written in TypeScript and uses MongoDB. Has a number of features: saving sound clips from YouTube videos, playing the soundclips back at a different speed/pitch by using FFMPEG, saving quotes from friends, or playing "Russian Roulette": Participants leave a reaction on the bot's message and a random one will be kicked from the channel.

  • TypeScript
  • NodeJS
  • MongoDB
  • Mongoose
  • FFMPEG
  • Docker
CMinus

CMinus

Compiler for a minimal C-like language, written in Rust. Implements many common optimizations such as dead code elimination, strength reduction, null sequences, constant folding, and features rudimentary control flow analysis.

  • Rust
© 2024 Sjors Holtrop