Drippy
Drippy is an open-source Internet-of-Things (IoT) system that records the water flow rate of an outlet in a household over time. Periodic reports are aggregated in the cloud so that stakeholders (e.g., customers, the water company, etc.) may access a time-series representation of water consumption through a dashboard interface on the Web. The project was ultimately a Top 3 Finalist in the IoT Cup 2023 hosted by the University of Philippines Diliman Department of Computer Science.
Aside from data analytics, Drippy’s marquee feature is its ability to detect leaky pipes. As soon as the IoT device detects sufficient conditions for leakage, it automatically closes a master valve in the same pipe to stop the wasted flow of water. A prominently positioned LED lights up to indicate the actuation of said valve. Through the web dashboard, a customer/user may remotely release the valve. Inversely, they may also remotely close the valve (under normal operation) should the need arise. Thus, the IoT system reactively guards against wastage due to leaks and overconsumption.
The ESP32 firmware is open-source and written in Rust on top of C bindings to the ESP IoT Development Framework, which are provided by Espressif Systems themselves. All cloud interactions (backed by a PostgreSQL database) are handled by an open-source centralized web server written in Rust with the Hyper HTTP framework on top of the Tokio asynchronous runtime. Finally, the dashboard is a web application written in Svelte.
DocTrack
DocTrack is an open-source mobile-first document tracking system built for the modern age. It reimplements and improves on the DRS by the UP ITDC by leveraging PWA technologies for:
- Delivering push notifications via the Web Push API.
- Maintaining an offline experience via Service Workers.
Wherever possible, the project utilizes a TypeScript-centric application stack. With Svelte in the front end, TypeScript ensures that events, messages, and interactions between UI components remain consistent. In the back end, Deno facilitates the development of robust type-safe HTTP request handlers for the REST API.
pal.ai
The pal.ai project is an open-source mobile-first progressive web app that uses images of rice leaves to identify rice leaf diseases.
In the back end, we use a minimal Deno Deploy server that proxies the Hugging Face Hosted Inference API, which interfaces with a model that uses a BEiT vision transformer model to classify images of rice plants for the presence/absence of diseases. The model is pre-trained using ImageNet 22k then finetuned using the PH Rice Leave Diseases dataset. The model achieves 95% accuracy using the dataset test set despite having only 1120 training data points.
- Kaggle Notebook: Classification by Fine-tuning BEiT
- Hugging Face Hub Link for the Model: jkrperson/Beit-for-rice-disease
- Weights & Biases Experiments: jkrperson/huggingface
In the front end, pal.ai is an installable progressive web app (PWA) written in TypeScript with the Svelte framework. It uses the Parcel build tool for asset bundling, packaging, and optimization. The PWA allows users to upload their own images of rice plants for classification.
SoundRave
SoundRave was an aggregator app for new music released by a user's followed artists on Spotify. At the time, the news feed was missing from Spotify's features. The app aimed to fill in this hole.
The UI is primarily rendered by the server via the Express framework for Node.js. For data persistence, MongoDB is used as the database and cache for Spotify API calls.
Chrozone
Chrozone is a Tokio-powered Discord bot written in Rust that provides time-based utilities via slash commands. One of its primary features is to format a given date as a dynamic timestamp message (as seen in the screenshots below).
For global Discord communities that have special timezone considerations, Chrozone empowers users to send timezone-adaptive announcements. No need to convert the timezones yourself! Let Chrozone do the work.
Quizzo
Quizzo is a Tokio-powered Discord bot written in Rust for hosting limited-time quizzes. With Discord's built-in message components, Quizzo provides an easy-to-use interface (and a trivially scalable setup) for large-scale quizzes with many users. When the quiz timer expires, Quizzo notifies everyone in the channel which users answered the quiz correctly. The pioneer use of message components differentiates Chrozone from the other bots in the market which use clunky reaction-based polling mechanisms.
UDP Multicast Chat
The UDP Multicast Chat Project is a basic chat application written in Rust. The front-end GUI uses the popular egui
library to render the updates from the back end. Meanwhile, the back end is a Tokio-powered server that listens for UDP messages over a specified multicast address. The same multicast channel is also used for sending new messages. This setup effectively allows multiple hosts in the local area network to communicate with each other via a common UDP multicast channel.
Snake Clone with SDL2
Using the popular SDL2 library, the sdl-basic-snake
project reimplements the classic game Snake with modern object-oriented C++20 code.
In line with the theme of modern best practices, the project also uses CMake as its cross-platform build system generator. Assuming the necessary system dependencies have been set up, the project may be built and run on any platform.
A Block of Optionals!
The option-block
crate is an open-source Rust package that provides a basic direct address look-up table, where empty slots are tracked by a single bit mask. Although it is rather simple, this is a fundamental data structure in embedded development, where memory constraints especially matter.
From the pull request dlkj/usbd-human-interface-device#89
by @jedrzejboczar:
Currently,heapless::FnvIndexMap
is used to store idle times for reports, which takes 260B (out of 460B for wholeRawInterface
) to store at most 32u8
values. This PR changes it to useoption-block
which basically is[u8; 32]
withu32
bitmask of "used" slots, which takes 36B (RawInterface
is now 236B)... In my use case, with 3 HID interfaces, this saves 672 bytes of RAM usage, while I also observed minor improvement in code size—usbd-human-interface-device
takes 406 bytes less space.