GeoGuessr for Beatles songs. Hear a clip as short as one second, name the track before the clock runs out, and duel friends for a place on the Elo ladder.
An Android app that shares a phone's internet connection with no root and no app-level speed limit. It creates a Wi-Fi Direct network and runs an HTTP and HTTPS proxy on it, which tunnels HTTPS without decrypting it. I made it because my phone kept connecting to my apartment's Wi-Fi while my laptop could not. 🥲
The home cluster
k3s
Kubernetes
Flux
SOPS and age
ingress-nginx
Cloudflare
Certbot
GitHub Actions
A multicloud cluster for my personal projects, with nodes across different cloud providers.
Slocky's Musicollection
Next.js
TypeScript
Strapi
SQLite
Docker
Kubernetes
The music archive. Albums that were previously lost media, mostly Indonesian releases from the 70s and 80s, preserved in FLAC and searchable by year, label and genre.
A decentralised web app for student certificates, built for a distributed systems course. Certificates are minted as ERC-721 tokens by Ethereum smart contracts, developed and tested in a Hardhat environment.
Javanese Transliteration
TypeScript
React
Vite
Tailwind CSS
carakan.js
Chrome extension
A Chrome extension that turns Latin typing into Javanese script as you type and can be switched on and off from a popup.
Secure Communiqué
Go
Fyne
XMPP
OMEMO
WebRTC
SQLite
GStreamer
My bachelor's thesis, a desktop app for secure messaging and calls, written in Go with Fyne. Text is encrypted end to end with XMPP and OMEMO, and video and voice run over WebRTC. The thesis analysed and evaluated the OMEMO encryption architecture.
OMEMO does not say how Alice learns Bob's first Double Ratchet key, so I had Bob publish a temporary ratchet key to his PEP node next to the key bundle. Alice fetches both and starts her ratchet from it, and it is replaced after each session.
EAI Job Scraper
TypeScript
Node.js
Express
Puppeteer
MongoDB
Next.js
Tailwind CSS
Flutter
Docker Compose
A scraper that periodically collects job listings from Glints, Kalibrr, Jobstreet and LinkedIn into MongoDB and shows them on a single web page.