Skip to my projects

Hello,

Me standing on a wall surrounded by water at Sutro Baths with the sun setting behind me.

I’m Sean. For most of my life, I was in school—most recently UC San Diego and Gunn High School—and now I expect to spend double that time employed. Currently, I’m a software engineer at Tesla Energy.

Pronounce: /ʃɑːn/

Pronouns: he/him/his ♂️

Location: Palo Alto

Time Zone: Pacific Time

Age: at least 13 years

Zodiac: sheep , Aries

I made this website for anyone who is or was once a kid. If you're an employer, check out my résumé.

How to stalk me

Sign the Guestbook: Leave comments, ask questions, or share what's on your mind. Contact me through Discord; Join my server to message me without a friend request. Follow me on Instagram; View my résumé

Projects

There’s some more on Scratch and GitHub.

Note that many of these projects require new web features that your browser doesn’t support. Please use a modern browser.

Filter by

Almost everythingA sitemap of effectively all the files on this site. PlatformreA tile-based platformer with a random level generator. A PlatformerA series of platformer levels translated from my Scratch project. Audio EditorAn audio editor based on stolen code from Scratch. Colour input IIA colour input translated from a Scratch project. Large TextWrite text in a large font to show to your friend next to you or across the room.
I initially made this as a local file on my Chromebook for when I couldn't comfortably speak due to a sore throat. I eventually uploaded it online since my friend wanted it too. I now use it to talk to my friends during lecture. Level editorA level creator and editor for Platformre. TurkeysA turkey collection game. TelegraphA morse code game for a history project. Clicker GameA basic clicker game. Dodge dots game thingA minimalist dodging game translated from a Scratch project. Explodey OthelloA clone of a Scratch game by @joshrawesome involving shooting at enemies to prevent them from spreading bad tiles. Color fight thingA simple two-player game based on a Scratch project. Connect 3A proof-of-concept connect 3 game. Gunn student simulatorA game satirizing the lives of students at my school. “Fun” Gunn RunA Temple Run clone set at my school. YESNTAn unintuitive and rather difficult escape game based on a true phenomenon at my school. Pistole offers a wide range of opportunities.My satire project for English class criticizing a specific institution at my school. Escape from SELFA short and simple choose-your-own adventure game.
It was mostly a proof-of-concept or base engine that could be used for a larger game in the future. The HouseA choose-your-own adventure game. The HotelThe sequel to the House. Rhythm GameThis was our submission for Hard Hacks 2023, a hardware hackathon. The hardware part relied on a circuit board that we no longer had (it was borrowed from the event sponsors), plugged into the computer by a USB cable. The web interface would access the board's sensors using the Web Serial API.
Since I don't have the board anymore, and neither do you, I've replaced the board controls with keyboard controls: left/right arrows for the left/right buttons, and the mouse/touchscren to swipe left and right. PFPFPFA simple game where you move your cursor around to pop bubbles quickly. RoshamboFast-paced rock paper scissors. SHFA typing game. Tower builderA clone of those tower builder games where you stack blocks by timing your release so that the block lands on the tower. If you mistime releasing the block, then the tower gets narrower. The block moves back and forth faster over time. GIF frames viewerIf a GIF is moving too fast, upload it here to inspect each individual frame. Combine images into single PDFDuring Covid, we often had to submit photos or screenshots of our work as a single PDF.
This just puts each image on one page. It can support pages of different sizes, if you want that. You can also add pages containing text if you want, but honestly they're kind of ugly (and a bit buggy). Brat album generatorPut whatever text you want on the characteristic chartreuse green of Brat's album cover, and maintain its iconic blur and stretch. OpenShitA less simple video editor. Smothered RockA primitive video editor. SSTV encoderEncodes the given image for SSTV, using Scottie S1. This allows you to transmit images over radio. SpectrogramAnalyze the frequencies received by your device's microphone. Audio filter explorerExplore how different filters in signal processing, such as low-pass and high-pass filters, affect audio. This uses the Web Audio API's BiquadFilterNode, which has many filters built into the browser. Pan left and rightLets you pan audio left and right so you can check if your stereo speakers are working, or to see which speaker/earbud is the right one, or to figure out how deaf your left ear is. Make audio low qualityReduces the bit depth of the samples in your audio to 8 bits, resulting in very crunchy, compressed audio. MP4 analyzerAnalyzes the components of an mp4 file, and allows you to edit its fields and download the result.
The most compelling use case for this is editing the duration of the video. Even if you don't add any movie data, many video players, like Discord's, will show whatever you set the duration to, at least until near the end of the video when it knows how long it really is. This way, you can create videos that seem to be days long without going over upload limits.
I know that it works for mp4 files produced by OBS, but it doesn't work with all mp4 files, like the ones taken by my phone. QR Code Generator & ScannerThis is a QR code transceiver: it can "transmit" (generate) and "receive" (scan) QR codes, all in one web app. I use this to send links, passwords, and other text between devices, phones and laptops, as long as they have a camera or webcam. I've used this to set up my company-issued laptop during my internship.
I'm surprised no one has something like this yet. Many stock camera apps on phones can scan QR codes, and many websites can generate QR codes, but none of them (that I know of) can do both.
This app is just a user interface for two libraries, node-qrcode for generating QR codes and qr-scanner for scanning them. SVG path editorEdit the vertices of an SVG path, with all of the SVG path types (lines, cubic beziers, arcs) available.
Although it could benefit with some more features, I still find it occasionally useful for inspecting paths that fit on the canvas. SVG to PNGAn SVG to PNG converter with options to resize. Embed image inside SVGEmbeds an image (which can be a GIF) inside an SVG file. This allows you to upload bitmap images of any size to Scratch, which would otherwise reduce its resolution to 480 by 360.
This is basically PNG to SVG. JPG QualityAn image-to-JPG converter with an option to reduce the quality for maximum artifacts. Image chopperChop an image into square pieces. This can be used for turning a large image into a grid of Discord emoji or Instagram posts. text-saveA primitive note-taking web app. Character copy areaClick to copy a special character or a string. CryptographyEncoders and decoders for common ciphers used on Scratch. HTMLifierA Scratch project packager that spits out a fat HTML file. E羊icquesA mod of Scratch 3.0 that adds small changes like custom aspect ratio support and loading extensions from a URL. Discord webhook senderA WYSIWYG editor for creating messages to send to a webhook. It allows you to add embeds and see (more or less) what your message will look like before sending it.
To send a message to a webhook, paste the webhook URL in the bar at the bottom then press enter while your cursor is blinking in the URL field. Pin sticky note on topThe new Document Picture-in-Picture API lets websites make a pop-up window that always stays on top, even above other non-browser windows. This lets you take notes on a little floating notepad while browsing a news article, for example, instead of having to split your screen in half. For some reason, many notes apps do not have this feature. Diff CheckerUses the diff checker provided by Monaco (VS Code's text editor) to highlight the differences in two versions of text. The diff checkers online have too many ads; I just want to get straight to the diffing. Large file viewerView the contents of a large text file without lagging. Useful for debugging files produced by the HTMLifier. Grade Care CalculatorA minimum necessary grade calculator. Centimeter converterConvert between centimeters and feet and inches because Google can only convert from centimeters to either feet or inches, but not both, but my dumb American mind can only understand a person's height in feet and inches. Special character finderA detector of non-US-keyboard characters. Text transformerTransform each letter in a message for Discord. You can put each letter in its own spoiler to annoy people, or convert each letter into its corresponding regional indicator emoji to show them in big blue box letters. Text to SpeechLets you use your browser's built-in text-to-speech engine. GIF caption editorAdd a text label above a GIF. Weird flex but okA generator replacing each word in the phrase with a synonym. There are no prereqsMake UCSD roast someone for you! UCSD's Schedule of Classes will print whatever is given in the URL, and "There are no prerequisites for" leaves room for a number of creative phrases.
You can disguise your message in the URL using the URL obfuscator. URL obfuscatorObfuscate words in a URL by URL-encoding every letter, even though it's not necessary. LinkedIn Queens solverDeprive yourself of fun and easily beat 90% of CEOs by screenshotting LinkedIn's daily puzzle and letting the website solve it for you. AttitudeCalculates the sum of each letter's value in a word. Trump daysA countdown for Trump's second term. Trig Drill GeneratorA generator of sine and cosine problems with basic angles. Trig and calculus cheat sheetA reference sheet for my high school trigonometry and calculus classes with identities, derivatives, and antiderivatives for trigonometric functions. And Taylor series.
This basically is a list of math equations I have to memorize and don't want to. Differential calculus cheat sheetA reference sheet for MATH 20D, my differential calculus class, listing all the types of differential equations we were taught and how to solve them. Big O notationsA reference sheet comparing the various big-O notations and what they mean. Many of my theoretical CS classes keep referencing the different notations, and I keep forgetting what they mean. Convert decimal to fractionConvert a decimal expansion to possible fractions that may be rounded as the decimal. Fairly useful for figuring out what fraction a decimal may have come from. Sig fig counterCounts the number of significant figures in a number, at least according to the rules taught in my high school Chemistry Honors class.
To specify ×10^, use e. For example, 2.3e-2 is equal to 0.023.
100 is assumed to have one sig fig. To specify that the trailing zeroes are significant, leave a trailing decimal point (e.g. 100.). This goes against sig fig conventions that I've seen in other contexts, like AP Physics. This alternate convention treats 100 as having three significant figures, and uses 1e2 to specify one sig fig. Roots and AffixesSome Greek and Latin roots. Happy Number FinderA calculator for happy numbers. Sieve of EranthosesA prime number and factor finder. AnimationsSome CSS-based animations. Sentence GeneratorA primitive and gibberish sentence generator. Longer TweetsA blog because every website owner has one. F WordA primitive social medium based on Firebase, of course. PenlandA 2D sandbox game translated from my Scratch project. Penland NovaA tile-based 2D world simulator. Penworld (Canvas2D)My first voxel rendering attempt using Canvas2D, which isn't meant for drawing 3D graphics (it's more akin to Scratch pen or Khan Academy's Processing JS).
Still, it features rudimentary raycasting, breaking and placing blocks, and transparent block faces, though the raycasting algorithm is quite inaccurate. Penworld (WebGL)A voxel rendering demo using WebGL. I made it after learning enough WebGL to feel confident in making a voxel renderer.
From my previous attempt with Canvas2D, this demo features textures, a better (but still buggy) raycasting algorithm for placing and breaking blocks, and support for multiple chunks. This demo also features a transparent block, like the Canvas2D version. KaabaKaaba is my third attempt at rendering voxels. I made it after learning enough WebGPU to feel confident in rendering voxels.
The chunk size was increased to 32 in each axis, and there is more than one chunk by default, with randomly placed blocks to test performance by adding more block faces. Compared to the previous WebGL version, this verison isn't as powerful: there's no block placing or breaking, and block faces aren't culled between chunks.
This was mostly a demo on the GPU side. Uploading data to the GPU is slow, so I only uploaded block positions and used instanced rendering to create 6 vertices per face (3 vertices for each triangle in the square). I also adjusted how pixels are grabbed from the block texture atlas to prevent atlas bleeding, where a strip of the next texture in the atlas shows on the edges of a block face; this was an issue in the WebGL version.
I also added post-processing effects mostly for the fun of it, since this was mostly a GPU learning experience. DoufuDoufu is based on further work from Kaaba, which was just a tech demo, to turn my WebGPU voxel renderer into a playable Minecraft clone, including world generation and multiplayer support. Platformer PaintTwo-player Splatoon using the Platformre engine. 3-letter hangmanA simple implementation of the word guessing game Hangman. You have to guess the word randomly chosen on each page load, but to make it easier, you only have to guess three letters. Sudoku solverRuins the fun of sudoku by automatically calculating hints, the possible numbers that could go in each space, to help solve the puzzles. If a space has exactly one option for it, then you can fill it in to eliminate more options.
This was inspired by a sudoku app my dad made, which had an option to do the same thing. Unofficial Gunn Web AppA web app that displays the schedule for my school. UgwishaA (subjectively) better-designed version of UGWA. EliminationA website for playing Elimination at my school where people have to locate their assigned target in real life to ask for their elimination sequence, which can be entered into the site to mark them as eliminated. There is a public leaderboard, and the last one standing wins. OlamREEEDigital cards for fictional elements for a school project. UCSD classroom scheduleShows the locations of each building at UCSD, lists their classrooms, and displays each classroom's class schedule. Helps people find interesting lectures to attend or unoccupied classrooms to study in. SunSETAn initiative to crowdsource grade distributions for past classes at UCSD to better inform students about what electives are most likely to give A's. Free Food Events at UCSDA lot of events at UC San Diego received funding from student activity fees, and they would often use them to offer food to attract attendees. I liked events with free food because they helped save on dining dollars (our dining halls weren't All-You-Can-Eat), obviated the need to decide what to eat, and was a great opportunity to meet new people.
For most of college, keeping track of events with free food was a very manual process. I had find and follow Instagram accounts for UCSD orgs that would often have free food, scroll through their stories each day, and add any events with free food to my calendar.
Since I got into LA Hacks 2025, I decided to spend the time making an Instagram scraper. It uses Playwright to open up a browser instance and pretend to scroll through posts and stories like a human user. It intercepts the images sent by Instagram to the web page, and sends them to Gemini, which acts as a glorified OCR program to extract event details (time, location) and whether it has free food. After the hackathon, I continued polishing up the scraper, so it mostly runs on its own without requiring significant intervention. Magic 8 BallThis was our first mini-project for CSE 110: Software Engineering at UCSD. It was spring 2023, and our professor, Thomas A. Powell, had recently discovered ChatGPT and was immediately enthralled by its potential to disrupt the future, so he made the quarter fortune telling themed.
This assignment was an "exploratory project" to play around with ChatGPT and other generative AI models and use it to create a magic 8-ball web app. I think he wanted us to discover the limits of using AI to generate code, but we didn't really encounter any issues. We were also encouraged to take advantage of web features like the Web Speech API.
Our group used ChatGPT to slap together the functionality of the app. Then, I came in to pimp up the design. I took this opportunity to gain more experience with CSS gradient animations. Envision Your DestinyThis was our final project for CSE 110: Software Engineering at UCSD. It was spring 2023, and our professor, Thomas A. Powell, had recently discovered ChatGPT and was immediately enthralled by its potential to disrupt the future, so he made us make a fortune-telling app.
We were encouraged to use AI to generate code and images for the app, so that's what our team did. We split up our team members into different fortune telling concepts, and we each developed a prototype with basic functionality. Then, in the final week, I went through and pimped up all the styling so that not only did the website look cohesive, but there were also many fancy animations and effects. I learned more techniques for CSS animations, like how visibility can be "animated" to create exit animations, so it was somewhat worthwhile.
As a software engineering class, we were expected to follow software engineering principles, such as writing tests, doing code reviews, and pacing our workload evenly, and supposedly this was supposed to be reflected in our grade. However, we did none of that. Instead, we approached it more like a hackathon, grinding out features in the final days of the project.
Our TA did not care. She was dazzled by the fancy CSS animations and gave us an A. Meanwhile, other students who followed AGILE more meticulously received lower grades, which for some of them were their first B's. In addition to the midterm being graded on quantity over quality (i.e. long, BS answers), I came out of the class with one of the higher grades without knowing what AGILE is. Scuffed class. ACM Membership PortalACM at UCSD, which stands for many words that don't mean anything, is basicially the computer science org at UC San Diego.
The membership portal was originally created to facilitate tracking how many students attended our events to prove to our student council that their funding wasn't going to waste. Its scope was later expanded to have a leaderboard for students who attended the most events, and a merch store where attendance points can be used to buy ACM-branded clothes and other swag.
The original website was written in React, and client-side rendering wasn't that trendy anymore, so around the time I joined ACM, they were starting to rewrite and redesign the entire website in Next.js.
I helped to speed up the rewrite, as well as making the website look fancier with fancy animations for the home dashboard, storefront, and user profile pages. ACM CyberACM Cyber wanted a website to put CTF writeups and other resources on. I helped create almost all of the website, including the design. Not having to follow a Figma design helped to speed up the development because I was free to improvise.
The website is made with NextJS 15's app router. I had been using the pages router before, so it was a nice opportunity to learn modern NextJS. Most common names at UCSDAn initiative to crowdsource grade distributions for past classes at UCSD to better inform students about what electives are most likely to give A's. Fluent emoji listA list of Microsoft's animated 3D fluent emoji, shamelessly stolen from Microsoft Teams. Click on an emoji to download its animation as a 100×100 gif. Billy Goat blog themeA blog website design. CountdownCreate a URL that shows the days left or since a selected date. I think I made this to count the days left in summer before school started. It's still March 2020March 2020 never ended. So what day would it be?
For non-Americans, March 13, 2020 was when my county's school districts (among other things) were finally forced to close due to Covid-19 (back then, the novel coronavirus). Proof that π = 4An animation of a wheel of diameter 1 unravelling its circumference onto a number line, showing that its circumference is 4 and therefore π = 4. Context Menu TestAn infuriating custom context menu design. PNG bombCreate a massive image that's only a few kilobytes in size. For example, a 10000 by 10000 image (a hundred million pixels) can be expressed in a single 12 kB PNG file.
This is the PNG equivalent of a ZIP bomb. You can sneak a large image past a file size restriction, and whoever ends up trying to process the image will trip up deflating thousands of pixels from a single byte.
Since these images only have one color, we can use a 2-color palette for the image, using one bit per pixel, or 8 pixels per byte. PNG files use the Deflate algorithm to compress the pixel data. Since there's only one color, all the bytes are the same, so we hit Deflate's maximum compression ratio of 1000:1. All in all, up to around 8000 pixels can be represented by one byte in a PNG image. Image to ASCIIA converter based on the average lightness of pixels. Tile editorAn editor for creating worlds for an abandoned game. JavaScript reference sheetA cheat sheet for a portion of the essential JavaScript built-in functions a beginner web developer should know. TerminalA terminal design with primitive commands. USB PuTTY readerUses the Web Serial API to read text from a USB port's terminal console.
I used this during Hard Hacks 2023 (a hardware hackathon) to read the console from an Infineon circuit board because I was struggling to access the USB ports from WSL2 (which does not support USBs). This was later used to connect our rhythm game's web interface to the circuit board like a controller. Get date of Google Pixel photo from nameGet the date and time a photo or video was taken based on the file name generated by Google Pixels. Perhaps unsurprisingly, this will only work for photos and videos taken on a Google Pixel.
I made this for when uploading videos to YouTube from my phone. I would paste the file name in the video description, then on my laptop I would use this tool to know what date to select for the video's recording date. World map colorerColor-code countries on a world map for any data visualization needs. I created this to visualize groups of countries for Wikipedia articles. Flappy bird AISimulates evolution of flappy birds by having only the fittest pass on their genes. κλωναλγSimulates the evolution of cars traversing a maze. It's not very efficient though. Chain reaction particlesPopping a circle with a particle will make it explode into more particles, which can go on to pop more circles, resulting in a chain reaction. Conway's Game of LifeDraw cells on an infinite expanse, then simulate Conway's Game of Life.
Being an old project, the interface doesn't work well on mobile, and it doesn't perform any optimizations such as memoizing large patterns of cells. This was inspired by a Scratch project that also had a UI to add patterns from a library, but I never got around to adding it. Cell simulationA cellular automata attempting to simulate evolution. MarsAn attempt at an incremental game. OvinetopiaAnother attempt at an incremental game. ElementsDiscover all the substances by combining pairs of the basic 5 elements.
I didn't add many substances to discover because the project served as a backbone or proof-of-concept for a possible larger game. Inspired by Elemental on the HTwins website. Red Light, Green LightA simple implementation of red light, green light. To move, press the space bar or tap on the screen as quickly as possible. If you move when you're not supposed to, your progress resets.
In Chinese school, we played a version like this called 一二三木頭人. The name translates to "one, two, three, wooden person," and I think it means that you're supposed to act like you're made of wood when time is up. It's kind of like Sneaky Statues, where after the person counts down, they turn around, and if they see you move, you lose. Your goal is to tag the person counting down.
Squid Game also adapted this, but they sing a song to count down instead. Both Asian versions let you know how much time you have to move, while this American version does not. JavascriptsThings I made. MiscellaneousThings I made and didn't put in JavaScripts for some reason. ThingkinglandThe pages I made while learning HTML/CSS/JS. ParticlesSome cool particle effects. MinigamesSimple but usually boring little game ideas. Chromebook creationsHTML files I made on and uploaded from my Chromebook. Userscripts and userstylesA collection of helpful userscripts and userstyles I made. Eyo dictionaryA searchable list of words in my first constructed language. Eyo word validatorA validator for the minimalist alphabet in my first constructed language. That was merely a preview of what this website has in store. Explore and sort through everything else.

Why sheep?

Because I was born in the year of the sheep, my mom gave me a stuffed animal sheep when I was 8 months old. We named her 羊羊 (Yang-Yang).

Yang-Yang is the namesake of my first Scratch account, and I named its test account @Sheep_tester. “Sheep Tester” was meant to mean “a sheep who tests,” but people seem to interpret it as “one who tests sheep.”