Projects
The following is a selection of some projects that I’ve worked on with brief descriptions and relevant links by category. For more projects or recent activity, check out my GitHub for software creations and my hackster.io for hardware builds.
Discord Bots
Discord is a platform for communicating, whether that’s with friends, for school, or as a part of a community. They support bots, which are non-human users you can interact with. Since I’m most familiar with Python, Discord bots I create use the discord.py package.
[#] Bird-ID is a Discord bot I created along with another student to help competitors study for the Ornithology Science Olympiad event. The bot pulls images and songs from the Macaulay Library and supports all of the Macaulay library filters, custom bird lists, scoring, racing, and much more. (June 2019 – Ongoing)
Based on this bot, I also created Fossil-ID (for the Fossils event), RFTS Bot (for the Reach for the Stars event), Minerobo (for the Rocks and Minerals event), and sciolyid, a Python package that Fossil-ID, Minerobo, and the RFTS Bot run off of.
Since there isn’t a great database for fossil or star images, images are contributed by users of the bot. To make this easier, I created a Flask-based API for
sciolyid
that powers a web interface allowing images to be easily uploaded to the Fossil/Star bots by users.A Flask web API for Bird-ID exists as well, which interfaces with a website designed by another student that allows ID practice without the Discord client.
I later converted these services to FastAPI and eventually rewrote the website to bring all the information and services into one place. This was in preparation for partnering with the 2022 National Science Olympiad Tournament, hosted at Caltech.
For deploying all these services, I also created custom GitHub actions to push the bots to a Dokku server, which deploys each service in its own Docker container.
With almost 3000 users across 1200 Discord servers, this is by far the largest/longest-running project I’ve worked on, spanning more than three years of continuous improvements, feature additions, and bugfixes. This project has also allowed me to explore new technologies relating to managing applications, infrastructure, and more.
[#] PinIt! is a Discord bot I created for a private friend server to allow messages to be pinned by reacting to the message with a pushpin emoji . It also allows you to spell out messages with reactions through the “regional indicator” emojis, as well as react with the same emoji multiple times. (July/August 2020)
Web
Sometimes I’ll get ideas for websites I can make. Sometimes I’ll actually make them.
[#] tomichen.com is the site you’re on right now. For more information on how it was built, see the about page. (June 2020 – Ongoing)
[#] Duosmium Results is a Science Olympiad tournament results archive. Originally Unosmium created by RoboMarth, two other students took over the project, creating Duosmium. I joined the team in January 2021, contributing code and results. In February 2022, I took on a complete rewrite of the (previously Middleman) site in Eleventy. This significantly cut build times, especially with the addition of Netlify’s On-Demand Builders. I also rewrote the
sciolyff
package in Javascript. (January 2021 – Ongoing)[#] tools.tomichen.com is a utility site I built for tools I’ve always wanted but couldn’t find. Notable tools include a crontab timezone shifter for computing offset cron syntax and a color contrast picker that shows the contrast boundary on the picker itself. (April 2021)
[#] Twemoji Explorer is a website I created to improve my Twemoji usage workflow. Sometimes, while building websites, I want to sprinkle in some personality with Twemojis, my preferred emoji set. This site allows me to easily browse, copy, and use Twitter’s Twemoji. I also wrote up blog posts about searching large datasets such as a list of emojis, as well as improving mobile and keyboard usability. The site was created with Elder.js/Svelte. (June 2021)
[#] *.iscancelled.com is a joke website where you can cancel various things. In order to be gramatically correct, I also got
arecancelled.com
so you can toggle between singular and plural. The source code is available. (May 2021)[#] funwithmeth.com is a joke website about meth. The source code is available. (April 2021)
[#] capitalfish.tomichen.com is an incremental game inspired by Cookie Clicker. It was originally created as a joke for my friends, but I later re-themed it for public release. CapitalFish was created with Svelte/SvelteKit/Tailwind, and I had fun using it! See my blog post about creating it. (April 2021)
[#] stopbigboba.com is a joke website I made as part of a video ad for a friend’s birthday. It’s a statically generated Eleventy site built with Tailwind CSS and deployed on Netlify. The source is on GitHub. (August 2020)
[#] whyareyouawake.com is a joke website I made to rickroll people. It starts out as a normal, innocent website telling you to go to sleep, but autoplays a rickroll when you scroll to the end. True to its name, it was finished at 3 in the morning. (May 2020)
[#] oldgum.tk (domain expired) was my first dive into web “design”/server management. When I was younger, I really liked thinking up fake product ideas and making advertisements for them, something I still enjoy. In sixth grade, some friends and I came up with the idea of Old Gum, which is essentially ABC gum that has been left out for a long time. Details are fuzzy, but basically I created a flyer advertising the product as well as a Google site, and then decided to create my own site with the help of a friend, who did all the CSS. (2017 – 2018)
To host the site, I used a Raspberry Pi running Apache at first, then Nginx. This was really a great playground for me to learn about web technologies and web servers. I also hosted a bunch of other small projects as well, and even made a website for a school math assignment!
I had an interest in web security as well, and having this server allowed me to learn different things related to that – setting up certificates for HTTPS, firewalls, and even using Cloudflare.
Having this server really allowed me to learn and experiment with different things. It was a great place to practice skills on a real machine, hosting things from toilet water to ASMR Russian Roulette to different easter egg hunts for my friends and even some (poorly made) browser games.
While the original Raspberry Pi is offline and the free domain has expired, I’ve uploaded the static files to Netlify. Links above link to the Netlify version.
Hardware
Most of my hardware builds are on hackster.io and most of them were created as part of one of their contests. Here are a few highlights.
[#] Backpack Alarm was a project I did for fun after getting the idea one day. It used a compass to detect rotation, though the
LSM303
sensor board also has an accelerometer that could be used. (June 2018/May 2019)I adapted this concept a year later to create an interactive game for Maker Faire Bay Area 2019. The newer version used a cheap
ESP8266
to serve a web page that times and scores players. You also had to traverse an obstacle course while trying not to set off the alarm. Unfortunately, the weather wasn’t great during our exhibition time slot, and we had to pack up early due to pouring rain.[#] Wireless Magnetic Data Transfer was a project I did to see whether you could transmit data using magnetic fields. I came up with the idea for hackster.io’s Infineon 3D contest and was awarded one of their sensor boards for the idea. At the time, I didn’t really know how data was transmitted in real applications, so the design wasn’t really reliable if you wanted to actually send any data. Transmitting data this way also has many other drawbacks that make it impractical, but it’s an interesting concept nonetheless. (May/June 2018)
[#] Mindful Monkey Wire Game was a project I created for Maker Faire Bay Area 2017. It was a two-player game where players competed to complete the game as quickly as possible with as little touches as possible. (October 2015/May 2017/October 2017)
I exhibited a simpler variation about a year and a half prior at the 2015 East Bay Mini Maker Faire, which was only single player. The inspiration for this project came when I built a wire loop game at a summer camp and expanded on that idea later on.
I adapted the project to use Android Things for a hackster.io contest in October 2017, though it was very limited.
Other
[#] The CVUSD COVID-19 Tracker is a project that uses git scraping to track COVID-19 positive case numbers in my school district over time. New data is also logged to a Google Sheet to generate pretty graphs. Read about how I built this on my blog! (August 2021 – Ongoing)
[#] js-yaml-source-map is an NPM package for finding YAML source locations after parsing with js-yaml. I built this for the verification functionality of sciolyff in order to show the user where errors are located, and it was strangely relaxing. (March 2022)
[#] notion-ics is an simple SvelteKit-based site that generates an ICS calendar from a Notion database. I created this to mirror schedules in Notion to Google Calendar. (January 2022)
[#] Scriscord is a Scratch 3.0 extension that added blocks to allow you to program a Discord bot using Scratch. It was a just-for-fun two day project done mainly as a joke, but it worked! Here’s a video demo as well as a live playground hosted on GitHub Pages. (May 2020)
[#] elves.py is a Python script I wrote to brute force an extra credit logic problem my math teacher assigned over winter break. Essentially, it loops through every single possible combination of values and checks each one against the limitations given by the problem. Some manual optimization on the search space was necessary, but it did return the correct result in the end. I submitted a copy of the code along with an explanation, and even got extra credit on the extra credit. I also submitted this as a creative product for a summer camp where I go into a bit more detail about what happened. (December 2019)
[#] 202020 was a Chrome extension I created to remind myself to look at something 20 feet away for 20 seconds every 20 minutes of staring at my screen, a strategy recommended by eye doctors to reduce eye strain. It uses the Chrome alarms API for timing. It wasn’t great, especially since the extension didn’t turn off while you were away, causing notifications to build up. This could definitely have been improved with some sort of idle detection, but I never got around to it. (June 2018)