June 23, 2025
I can now make a distributable build!
I added a shutdown button in the GUI, updated some backend logic to work with installed builds (mainly modified file paths), and used pywebview instead of an external browser (though it is still possible to use an external browser). I also added a splash screen for the build.
I just have to work out some bugs and stuff like app metadata, icons, signing, etc. and I will be ready for a release (and the first ship)!
A couple of big changes towards building a standalone app.
Modularized the project, moved resources to app directories (eg application support), validated resources (info.json, info.db, config.cfg) upon start, enforced singleton behavior through lock files, streamlined logs, etc.
The next step would be to add user-initiated shutdown management and perhaps a simple GUI before bundling the entire thing as one standalone app (I plan to use pyinstaller for this).
Some more backend updates, but some frontend ones as well. The user can now refresh the info.json from GitHub, and information such as number of contests, the information version number, and the path to the downloads directory is displayed.
Did some backend updates. Added a config file which enables custom download directories and the ability to retrieve new info.json files from GitHub. These changes lay the groundwork to have a single executable application that can be downloaded, instead of requiring users to build from scratch.
So far, I've been working on some improvements. I simplified the database schema so that only one table is required instead of the previous two. I'm not sure what prompted me to overcomplicate the schema before.
I also migrated to a HTML over the wire approach: now, instead of the browser receiving the entire database, the backend manipulates the database (through SQLAlchemy) and sends only required information to the browser using HTMX. In addition to minimizing JS, this also makes the code easier to read. Since the tool is designed to be locally hosted, it doesn't really make a difference in speed.
I've also improved the download system for thread-safety and all.
uil-dl (UIL Downloader) is a tool enabling easy and bulk download of Texas UIL Academics contest materials. See the repository for the most up-to-date information.
A basic songbook mobile app that organizes PDF songbook pages and accompanying audio files. ~~~~~~~~~~~ Content Notice The code for this project is open-source and available under the license in the repository. However, the content shown in this project (compositions, scores, recordings, icons, etc.) is copyrighted by the content authors and may not be reproduced without written permission. Developers may use the open-source code with their own content to create apps under the repository's open-source license.
I've mainly been working on optimization. I integrated Metal Performance shaders where they helped, which greatly increased performance and efficiency of the shader. I also tweaked some setup methods for the shader & its renderer, with the goal of optimization in mind. I replaced the bloom effect with an edge glow based on Sobel image detection, which had… interesting effects.
In addition to optimization, I also setup a simple application to display the shader. This greatly helps quick testing, as the app is much easier to profile and see than the screensaver. I may extend this app to the Apple TV, but that is just a concept for the time being.
Aside from other improvements, made the first (notarized!) release.
View at https://github.com/acemavrick/wavefunction-screensaver/releases/tag/v1.0.0 .
Added settings panel. This took me way longer than it should've lol
Much better fragment shader :)
Completed the core implementation of a Metal-based wave simulation screensaver for macOS. The screensaver simulates fluid-like wave propagation using a computational physics model that updates in real-time.
The implementation uses three ping-pong buffers to track the previous, current, and next states of the wave field. Each pixel stores both height and velocity information as a SIMD2 vector. The simulation applies a basic wave equation with configurable parameters for wave speed, damping, and time step size.
Also created a disturbance system that randomly creates ripples across the surface at varying intervals. These disturbances have randomized positions, strengths, and radii, creating an ever-changing pattern of interference waves that never quite repeats.
The rendering pipeline uses a vertex shader that creates a full-screen quad and a fragment shader that visualizes the wave heights. The compute pipelines handle the wave equation calculations, buffer copying for the next frame, and adding new disturbances.
The current implementation renders the waves in grayscale, with potential for adding more visualization options with customizable color maps in future updates.
For more information, consult the README.
A macOS screensaver that simulates wave propagation using Metal. This screensaver implements a numerical solution to the 2D wave equation using Metal compute shaders, and results in a beautiful screensaver that is always unique. Random disturbances are periodically added. For the most up-to-date and detailed information, consult the README and/or the GitHub repository.
An iPhone/iPad/Mac app where users can play with different maze algorithms. They can watch mazes being generated, flood filled, and solved using different generation & solving algorithms. This serves as a cool visualizer, learning tool, and more!
This was widely regarded as a great move by everyone.