home Home

projects Projects I done did

calendar 03-12-2026

projects Little Dogpark

Demo gameplay of Little Dogpark

Play it! (or check out the itch.io page)

I had taken a little break from (constant) game jamming to do some homelab/server stuff, for a month or two, but I’m back into it! I joined Girly Jam #3 (1/2), which is really cool because it actually has multiple legs! It has an initial jam period, a break for judging and feedback, and then a second jam to implement that feedback. I really love that!

My project for the jam went in a server-y direction though, and instead of focusing on my game I mostly focused on implementing online multiplayer. I ended up making a dockerized python backend, with my usual Pixi.js/Vite frontend toolset. I was SUPER successful at making things work online in real time! Because of a little burnout towards the end of the jam though, the first-leg submission of the jam was pretty underfeatured, lacking a few of the “minimal viable” targets I wanted to hit, like multiple areas and emotes.. But!

I’ve already played with some people online, and I’m VERY excited by this project and how much you can feel the other peoples’ presence from across the internet. I want to lean into that and expand on that sense of togetherness. Wish me luck!

calendar 03-02-2026

projects Fishcam

I recently set up a livestream of my girlfriend’s fish tank on a little rpi 2W with a cheap usb webcam! I kept it super simple.

fishcam stream shrimp corydora crossing

First, set up a rpi headless like usual. Then, install motion via sudo apt-get install motion. I like to add the option --no-install-recommends too, just to keep the clutter to a minimum. Next you’ll want to update the motion service’s configuration that got generated at /etc/motion/motion.conf to match your use case. I changed the following variables:

variable value purpose/reason
framerate 60 so that the stream shows motion fluidly
text_left ’’ to remove the text at the bottom
text_right ’’ ””
movie_output off to prevent motion from saving recorded video files
webcontrol_port ??? I recommend setting a random port for this, mostly out of superstition
stream_port ??? same here, although this one will be public anyway*
webcontrol_localhost on hide admin panel
stream_localhost off allow remote access to the stream! which is the whole point of all of this
stream_maxrate 100 allow the full-fps video to be streamed. this one is not included in the default config file! But without it you’ll be stuck with a ~1fps stream.

Once the config is set up, you then want to enable the service using sudo systemctl enable motion and start it using sudo systemctl start motion. Once you’ve done this, the service should be running. Congrats! (maybe)

You can verify that it’s working by running curl localhost:<stream port> on the rpi, which should output html if everything’s working. You can also use a device on the same network to access http://<the rpi's local IP>:<stream port>, which will display the stream. Note that this may not work on a wifi network that restricts communication between connected devices.

From there, it’s just a matter of dealing with the networking side of things to expose the stream to the larger internet. But that’s outside of the scope of this post!

calendar 02-22-2026

projects Jellyfin Part 2

← Part 1

I made a TON of progress since writing Jellyfin Part 1. For one, I went ahead and paid for the static IP. With it, I’m able to define port forwarding rules using my router! And it just works, no funny business.

Next, I set up my server. I chose to go with Debian, and for this system I tried to keep the system as simple as possible. I didn’t install anything more than the bare operating system, and even disabled recommended installs in apt to keep it minimal. I learned a lot getting the system working under these constraints!

Docker compose up, docker compose down

For this system, I decided to run everything using Docker Compose. That way I can conveniently document and encapsulate my services, check their configuration into git, and spin things up and down easily without polluting the larger system. Networking is also extra convenient with them!

I ended up setting up Jellyfin, of course, but also a Wireguard server so I can VPN back into my local network to reconfigure my router remotely. I also used Caddy to reverse proxy all the services to the domain that all of this is exposed on, which took some experimentation for the different methods of defining base paths in each of the different services… But it wasn’t bad at all.

Finally, I set up Deluge, connected to a VPN via Gluetun for torrenting. Set up that way, the Deluge container is only ever able to access the internet through Gluetun, so kill-switch behavior is built in. If gluetun or the VPN ever stop working, Deluge will simply not have a way to access the internet. It works well, although I might switch to a different torrent client eventually (just because deluge has been a little buggy for me, although it might be operator error haha).

Before this, I had never torrented before!! I had internalized myths about how dangerous and scary it is, but especially when you’re only dealing in media, it’s really pretty safe. and also easy! I totally could have been doing it the whole time, without this whole project… But I’m glad I learned this way. I’m very anxious of a person so it feels really good to have it all set up in such a safe way. Torrenting is a wonderful, beautiful thing! Peer-to-peer filesharing is so cool!!

calendar 02-11-2026

projects Jellyfin Part 1

I was recently made aware of this cool thing called Jellyfin! The idea is, it’s a streaming platform designed around each user/family/etc hosting their own media server, which is super awesome!

My shows! My movies!

It’s even available to be installed on linux machines directly from the package manager. Great!

Networking though?

I wanted to expose my instance to the larger internet, so I could let friends use it too!

It started out well and I was able to set up Dynamic DNS on one of my domains easily (because no static IPs for me). This made it possible to ping the machine using its public domain!

But… no other services I tried to talk to would reach the machine. I dug around a while trying to figure out what was happening, slowly exhausting the possible causes:

But I finally found my answer while searching online. Apparently my ISP uses CGNAT, and offers no way to set port forwarding rules at that level. So what I was trying to do was impossible, at least “the simple way”.

Part 2 →

calendar 02-02-2026

projects What Pokemon Are You

What Pokemon Are You?

WPAU input form WPAU result reveal

Website that tells you What Pokemon You Are based on your height and weight! I actually made this a long time ago, but only published it now.

calendar 10-15-2025

projects 3D Printed Hexagonal Rush Hour

Oblique view Top view Piece details

Models and writeup: Printables.com

Web version: Hexagonal Rush Hour (web)

I designed this all using FreeCAD <3

calendar 05-05-2025

projects Stardew PNG

A queriable repository of stardew valley assets.

Search UI Results Sprite UI

I went the long way around to create this, by splitting up the raw sprite sheets myself:

Furniture sprite sheet Void Chicken sprite sheet Characters (?) sprite sheet

Using a python-based command line tool to chop them up and then tag the resultant sprites.

Before "divide" After "divide" Help menu

calendar 04-15-2025

projects Pokemon PNG

Website for finding sprites of a specific pokemon.

Mostly just for use with my cross-stitch pattern generator

Deerling sprites

Extra double thanks to eevee for doing the real work of ripping the sprites!

calendar 04-10-2025

projects Pattern Generator

Website that makes cross-stitch patterns.

Image Selection UI Pattern Generation UI

Also made sister projects Stardew Png or Pokemon Png

Nanner got a ton of use out of this, which makes me super happy <3

Powered by jekyll Jekyll