Table of Contents generated with DocToc
What Is It?
A birthday gift, Boxomon is a cute toy that, when asked, provides an encouraging message, as relayed to you by your favorite pokemon!
In its first form, Boxomon was a physical box - 3D printed, it used a TFT touchscreen with an Arduino mini, displaying static images and messages from the Arduino's embedded memory. Some handrolled crypto, a little bit of LabVIEW code, and devboards stitched everything together. Boxomon v0.1 lasted a while, but eventually the wires began to fail, it became unreliable.
Boxomon v0.2 migrated all of this to a more stable form, and modernized it as well. Boxomon became a 2-tier web app with an Angular frontend and a Golang backend, running on Kubernetes. Messages stored in memory, images served from GCS, and audio, all available over the Internet! I rebuilt the physical box using a Raspberry Pi 3 running Rasbian, a new touchscreen, a small audio shield, and a commodity case, and set it up to auto-start Chrome at the correct URL.
With v0.4, Boxomon is now a three-tier app: the same Angular frontend (for now), a new Golang backend, and PostgresQL database. The new changes make Boxomon less confusing (state is stored in a simple database instead of using a complicated heuristic for message ordering), more fun and easy to work on, and take advantage of a few staples of reliable services like gRPC and Prometheus metrics.
Maybe later
Minor changes
- Make the backend healthchecks validate database connectivity
- Convert the frontend to use make, pull code into top directory similar to go backend instead of all being contained in
frontend/
- Make an easy tool to add messages or images, and rework how the next image is picked (only consider messages and images used within the past _ days, not all time)
- Combine Helm charts to make Boxomon a single chart.
Major changes
- Build in a concept of identity - assign potential messages and images to users, require some form of authn, probably oauth2
- Refactor the frontend to use lateral gRPC instead of making a browser HTTP request; remove the backend ingress except for health checks
- Modernize the frontend with some improved styling (migrate to React instead of Angular)