🅱️ Deep Fried Memes

Web, JS
Webapp to "deep-fry" memes with JPEG compression and filters.

All processing done client side in vanilla Javascript. JPEG compression done using canvas.

Gets over 90,000 unique visitors a month.

🎴 demotif

Go, Python, GPT-2
AI-powered demotivator generator.

Output may be nsfw/offensive.This is because the model was trained on real demotivators from open directories, some of which seem to have come from old /b/.

~6000 demotivators were gathered, and then split into image and caption fragments using Go, which were labelled / OCR’d by Google Cloud Vision. The resulting text blocks were then used to train OpenAI’s GPT-2 language model.

GPT-2’s output then likewise consists of image labels and captions. The labels are searched on DuckDuckGo images to find a suitable picture, to which the captions are then appended.


Companion daemon for Ripcord (shareware Discord client) for better notifications.

Ripcord is an amazing alternative Discord client, but its notifications support is rather lacklustre, displaying them only for DMs.
Since it’s closed source shareware, I can’t go in and tweak it to my liking.

So, this daemon displays notifications in a superior way, following Discord’s own settings.

🇮🇸 IsOn

Web, Python, HFST
Hybrid Icelandic + Old Norse morphological analyzer.

Done as my final project for a Computational Morphology class. Quite limited (e.g. no strong verbs), but still handles things like double U-umlaut.

Backend is a Python + Flask app interacting with HFST to output JSON.

📖 Kindlewick

Tool for generating Kindle dictionaries from Wiktionary definitions.

I couldn’t find a Finnish ➔ English dictionary for Kindle that supported in-book definitions, so I wrote this program to generate one from Wiktionary.

🔄 Redduplicate

Web, Vue.js
Migrates subscriptions and preferences between Reddit accounts.

Chiefly an exercise to learn Vue.js and how to perform an OAuth flow without a dynamic backend.

🚀 sefr

Terminal program for interactively opening search engines / parametric URLs.

⚔ WarCrumb & WarCrumpet

Go, Web
Warcraft III Replay Parser library & WASM frontend/demo.

WarCrumb is my Warcraft III replay parser written in Go, mostly based on a 2007 fanmade spec of the binary format, updated for the new Reforged edition with my own investigations using a hex editor.

WarCrumpet is an in-browser frontend to the parser, powered by WebAssembly.

🥣 WoWCerealize

Lua, Go
System to stream data out of Classic WoW addon-space to the outside world.

Since WoW addons have no filesystem or network access, it does this via a thin strip of pixels in the corner of the screen that are then read by a Go program.

🌐 wug

Web, JS
Lightweight webclient for Wiktionary.

Because Wiktionary’s mobile site is bloated.

  • Shows one language’s entries at a time, and lets you choose preferred languages.
  • Dark/light theme support.