@ purpld

A Nerd With an Internet Connection™

Hi! I am Hunter, but you might find me as @purpld or @hpenney2 online.

I am a programmer and a computer science student with an abundance of random interests.

I started programming with C# and then Python at about age 9, and quickly fell in love with the puzzle-like nature of it all.

After years of teaching myself how to work with many different languages and stacks by working hard on different projects, I decided to pursue a degree in computer science, knowing that I wanted this to be my career.


contact

Send me an email!

me@purpld.dev

languages / tech

  • Python Proficient
  • JavaScript + TypeScript Proficient
    • Vue.js Acquainted
    • React Experienced
  • Rust Acquainted
  • C# Experienced
  • C++ Acquainted

projects

These are some projects I have made that I think you should know about.

  • iPhotoKam

    Rust

    Reads the Photos SQLite database from a mounted iOS device and adds tags to photos in digiKam for photos that are favorited, hidden, or in an album.

    I wrote this because I needed to sort through the tons of photos and videos that I have on my phone. I noticed that the SQLite database is just kinda... there, when you mount over ifuse?

    I took the time to reverse engineer the database in order to extract data from it, as well as digiKam's database (my media tool of choice) to add the data as tags.

  • LARPARDY!

    TypeScript + Vue

    A Discord activity cloning a certain famous blue trivia game with a grid, so you can play it with your friends right where you already are.

    I really don't like things like JeopardyLabs and such because they feel so clunky to use! I have wanted to make a Discord activity for a while, and the idea seemed perfect!

    This was quite challenging because I had to make this work as a multiplayer game.
    I used Socket.IO for the multiplayer, and I store state in Redis so it can be accessed by multiple nodes and isn't lost if a server needs to restart.

    I am working on implementing user-created boards. User data (e.g., moderation info) and submitted boards are stored in a PostgreSQL database.

    With a SQL database, it wouldn't be difficult to split this project from Discord as well; for this, they mostly serve as a discovery platform for the game.

  • Cycles AI

    Python

    An AI chatbot I developed in 2024 that lives in VRChat, a VR social game. Speak to it, and it will speak and emote back!

    Inspired by a similar project, this got me very up close to dealing with several types of AI models.

    Cycles used many layers to achieve a reactive chatbot. I used:

    1. faster-whisper for speech recognition inference.
    2. Transformers + PyTorch + AutoGPTQ (while it was still maintained) for locally loading and running the LLM + sentiment analysis model.
    3. Coqui XTTSv2 for text to speech.
    4. Open Sound Control (OSC) to communicate with VRC, including setting parameters to play emotion animations that I created (based on state or the sentiment analysis result), and showing the current message in the chatbox while it is being spoken.

    The result is a 3D avatar that can listen and respond with emotion and body language!

    Unfortunately, this remains closed source until I have time to clean this project.

  • CatLamp

    Python

    The all-in-one Discord bot.

    This project is a bit older (2020) and was when I was still learning my bearings with Python and some programming concepts in general, and as such, is a bit crude.
    Do not expect perfect code looking at this codebase.

    With that said, I worked on this project with one fellow developer friend who helped me greatly throughout the lifespan of this project. This project was inherently collaborative, and as such, we worked on and coordinated each update together using Git.

    Discord is a chat application, and while it now has a formal command system, it did not when I developed CatLamp. Some creativity is required to make prefixed commands (e.g., +help) work the way a user may expect.

    CatLamp was multi-purpose and as such it used many things:

    1. The bot itself used the discord.py API wrapper to connect with the Discord API, which uses aiohttp.
    2. Reminders were stored using a MongoDB database.
    3. Several "fun" image manipulation commands accepted attachments or file URLs and manipulated them using Pillow (e.g., masking, changing colors, saturation, mirroring or rotating, etc.).
    4. The Reddit API was used to pull and display random posts.
    5. The live version once used by 300+ users was hosted on an Amazon Web Services (AWS) EC2 instance, ensuring access only with secure credentials, and a high uptime.

interests

  • Technology
    • Programming / software dev (obviously!)
    • I love to know the intricacies that make something work. This is a big reason why I love working with technology; it is often that many pieces have to come together to make something work.
  • Video games
    • I have always had some interest in making my own, so I have some experience working with Unity.
    • My favorites are Ori and the Blind Forest and Pokémon.
  • Mathematics and science
    • These have always been my favorite subjects. I love problem-solving and I am very interested in the world that we live in, so I naturally gravitate towards these subjects.