Projects

πŸͺΆ Background Information

Welcome to my collection of open-source projects. Beware, most if not all of these projects are unsuitable for production use. If you want help getting started with one of them, please send me an email.

conductor

Description

A Haskell music organizer with a metadata composition language

Something like this will produce a m3u playlist file with the tracks that are obtained with the conditions provided:

  songs <- filter(artist == "Nujabes") -- 1. adds Nujabes songs to set
        || filter(genre == "Hip Hop")  -- 2. adds Hip Hop songs to set
        && limit(year > 1990)          -- 3. limit the set to songs made after 1990

  otherSongs <- filter(artist == "Aphex Twin") -- 1. Get all songs by  aphex twin
             && limit(count == 100)            -- limit number of tracks in playlist

  result <- write $ union(songs, otherSongs) -- merges the sets together

I finally decided to make use of the knowledge from watching Tsoding's JSON Parser video. I implemented parsers using the excellent parsec library. I think that this project made haskell's real strengths shine when it comes to parsing and writing languages. Although my project is not as complicated as general purpose languages, it goes to show how convenient combinatory parsing is for developers.

I have a lot more ideas for the applications of the "query language", I just need more time to work on it…

gtfo

Description

This program is designed to organize files based on type written in Haskell.

The sorting will work by creating folders for files based their kind (Document, Music, Video, Image, etc…).

Going from this:

  /home/user
   β”œβ”€β”€ document-1.pdf
   β”œβ”€β”€ document-2.pdf
   β”œβ”€β”€ document-3.pdf
   β”œβ”€β”€ song3.mp3
   β”œβ”€β”€ pic-1.jpg
   β”œβ”€β”€ pic-2.jpg
   β”œβ”€β”€ video-2.mp4
   β”œβ”€β”€ pic-3.jpg
   β”œβ”€β”€ pic-4.jpg
   β”œβ”€β”€ document-4.pdf
   β”œβ”€β”€ song1.mp3
   β”œβ”€β”€ song2.mp3
   β”œβ”€β”€ video-1.mp4
   β”œβ”€β”€ video-3.mp4
   └── video-4.mp4

To this:

  /home/user
   β”œβ”€β”€ Documents
   β”‚   β”œβ”€β”€ document-1.pdf
   β”‚   β”œβ”€β”€ document-2.pdf
   β”‚   β”œβ”€β”€ document-3.pdf
   β”‚   └── document-4.pdf
   β”œβ”€β”€ Pictures
   β”‚   β”œβ”€β”€ pic-1.jpg
   β”‚   β”œβ”€β”€ pic-2.jpg
   β”‚   β”œβ”€β”€ pic-3.jpg
   β”‚   └── pic-4.jpg
   β”œβ”€β”€ Music
   β”‚   β”œβ”€β”€ song1.mp3
   β”‚   β”œβ”€β”€ song2.mp3
   β”‚   └── song3.mp3
   └── Videos
       β”œβ”€β”€ video-1.mp4
       β”œβ”€β”€ video-2.mp4
       β”œβ”€β”€ video-3.mp4
       └── video-4.mp4

Reflection

This was my first "serious" project that I wrote in Haskell. This went beyond the experience I had come by through doing advent of code in previous years. Wrestling with the build system and external dependencies was not the same struggle as it has been the last couple of years. File system work is pretty complicated in Haskell compared to other languages, but the typing is what made this project really fun to design.

cd-maker

Description

A program to generate a file system for a cd using m3u playlists and mp3s. It is written in Common Lisp.

I was going to make this into a script, but is evolving to be a bit more than that, so it is getting its own repo.

The directory structure will look like this:

  Music
  └── Disk01
      β”œβ”€β”€ 00-Playlists
      β”‚   β”œβ”€β”€ playlist1.m3u
      β”‚   β”œβ”€β”€ playlist2.m3u
      β”‚   β”œβ”€β”€ playlist3.m3u
      β”‚   └── playlist4.m3u
      β”œβ”€β”€ 01-Album name
      β”‚   β”œβ”€β”€ cover.jpg
      β”‚   β”œβ”€β”€ song1.mp3
      β”‚   β”œβ”€β”€ song2.mp3
      β”‚   └── song3.mp3
      β”œβ”€β”€ 02-Album name
      β”‚   β”œβ”€β”€ cover.jpg
      β”‚   β”œβ”€β”€ song1.mp3
      β”‚   β”œβ”€β”€ song2.mp3
      β”‚   └── song3.mp3
      └── 03-Album name
          β”œβ”€β”€ cover.jpg
          β”œβ”€β”€ song1.mp3
          β”œβ”€β”€ song2.mp3
          └── song3.mp3

The playlists will be structured like this:

  "/home/user/Music/Disk01/01-Album\ name/song2.mp3"
  "/home/user/Music/Disk01/03-Album\ name/song3.mp3"
  "/home/user/Music/Disk01/02-Album\ name/song1.mp3"
  ...

Burn the playlist to a cd using whatever software. Then, you can pop the playlist into a CD player and play the playlist.

robozo - Vex Robotics Code for 2023-2024 Season

Description

This code hosts my driver control and autonomous code for my high school robotics competition called VEX Robotics. It runs on a firmware for the arm robot brain called pros.

Reflection

I learned a lot through making this kind of project. I worked closely with my teammates to work on strategy for the competition. This was my first year working with C++ and more advanced VEX programming practices.

vex-high-steaks - Vex Robotics Code for 2023-2024 Season

Reflection

This was my second year working with C++ and I learned a lot more about common practices. I learned much more about the odometry tracking algorithms and was almost able to develop my own.

My personal website

If you are reading this, you are either on my website, peeking through the org files in the website's repository, or something crazy like Internet Archive snapshots (if you are doing that why?).

I write this site in org-mode markup and then Hugo turns it into a static website. I have taken and heavily modified Luke Smiths lugo theme for Hugo. The colorscheme is more or less an opinionated selection of colors from the modus-vivendi color theme.

The about page has more regarding the non-technical aspects and motivations behind this site.

Minor projects

denote wiki

This is a Common Lisp that makes calls to pandoc to display org mode files from denote to html, hosted on a Common Lisp web server called ningle. It has some logic for parsing information from the denote file naming scheme, but I haven't gotten around to completing this project.

Emacs Configuration

More about this here

dotfiles and nixos config

The dotfiles-stow repository is my generic system configuration files. These can be used on any system. It has my shell scripts, some window manager configurations, rc files and more.

nixos-dotfiles has my NixOS configuration (duh). It is quite modulated, so if you are interested just take a look at the repo and read the code. NixOS is not as complicated as I thought, so my configuration is pretty simple. I don't use home-manager for any configurations outside of vim, since my vimrc is really small. I keep my user level packages (browser, mpv, emacs, etc) in the home-manager directory in many modules. The system level packages are in nixos directory. Per-machine settings are in host. pocket is the name of my laptop, and as of October 2025, I am not using NixOS anywhere else.

Suckless tools forks

I have personal forks of dmenu, st, dwm, and slock. I did not write these, but I modified the source code for my liking with patches or other changes. My experience with C began with these tools. I have packaged my forks in derivations for NixOS in my nixos-dotfiles repository.

Gruber darker theme fork

I forked tsoding's gruber darker theme because it was missing some colors in places that I wanted to have from other themes. I didn't make many modifications, but I learned a lot about how Emacs configures color themes. I analyzed other themes like the awesome modus-themes.