Projects

Narradir

Native Android app in Kotlin
10k+ downloads on Google Play

Get it on Google Play

I developed the app Narradir for automating night-time narration in the social-deduction board games The Resistance: Avalon and Secret Hitler using the ExoPlayer library. The app was originally written in Java and later migrated to Kotlin. I synthesized the speech audio files for the narration via the Text‐to‐Speech API from the Google Cloud SDK using Bash scripting.

This app offers the following improvements over similar apps out there:
  • It allows the user to play a background sound during narration to help cover up any sounds made inadvertently by players.
  • It allows the user to change the pause length during which certain roles have to perform their actions.
  • In the case of The Resistance: Avalon, it provides a "smart" selection for the roles. As the number of players changes, the range of roles available for selection might also change. In addition, certain selection rules apply. Some roles will be automatically selected/deselected depending on the selection/deselection of other roles.

Text-Popover

MacOS menu bar app in SwiftUI for language learners

I used to live in Switzerland, and I do not wish to lose my German. Hence, I used the Python library Beautiful Soup to scrape a list of German idioms/expressions, as well as their respective meaning and history, from Wikipedia, storing them in an SQLite database.

I then used the SwiftUI framework to create a desktop application that pops up at user-specified intervals, each time with a random expression from the SQLite database. These pop-ups serve as virtual placards for my regular revision of German expressions.

The user can also open the settings window and create new databases, so that the pop-up can display other user-defined texts:

Text-Popover Demo 3 Text-Popover Demo 4

Sorting GitHub Repositories by Commits

Web scraping in Python

As I was interested in comparing the number of commits I myself have made to the respective default branch (usually master or main) of my personal repositories, I scraped the necessary data from the GitHub API using Python, and then sorted and organised the data into a Pandas dataframe.

Conway's Game of Life

Simulation of evolution in a grid-like population of cells in C++ with Qt

Given a grid of cells, each cell has an initial state: live (1) or dead (0). Each cell interacts with its eight neighbours (horizontal, vertical, or diagonal) using the following four rules:

Conway
  1. Any live cell with fewer than two live neighbours dies, as if caused by under-population (inability to reproduce).
  2. Any live cell with two or three live neighbours lives on to the next generation (ideal population density).
  3. Any live cell with more than three live neighbours dies, as if by over-population (scarce nutrients).
  4. Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction (ideal population density).
Conway Demo 1 Conway Demo 2