June 16, 2025
I made some small improvements to make the UI nicer to use in preparation for shipping an MVP:
* Add some extra text to the current-game debug screen
* Add a button to leave the game (in the future I'll have proper user accounts for managing this stuff)
* Show the game you're in at the top of the app
I hooked everything up, and the selected fixes are now the ones that get included in the pack! You can also generate the pack for various MC versions.
I improved the fix list by adding friendly names to all the fixes, so it's a bit nicer to read now (plus, using the class names broke when the code got minified :P)
I fixed the development instructions so that they work without any troubleshooting required on a new machine. I also organised the components into their own folders.
I deployed the project to has.slevel.xyz! This involved a lot of struggling with Docker images and deployments, but I got it to work in the end.
Other improvements:
* Added a location indicator and a button to show your location
* Added a button to the map screen to zoom to the game bounds
* Improved README file (deployment instructions)
* Started work on a better bounds selector (shelved for now)
Following the news of the imminent destruction of HC Slack, I decided to explore ways to export Slack canvases, as they often contain a wealth of useful information.
I discovered it's pretty easy to build a URL that lets you download a HTML representation of the canvas, so I created a web service that automatically converts canvas URLs into viewable HTML files. The styling currently leaves much to be desired, but I can work on that!
I also made a CLI tool to download the HTML to your filesystem, which is important for archival.
I plan to extend the CLI system to download a batch of canvases (defined in YAML) and save them all to a local folder, so that they can be shared and accessed without a dependency on Slack.
Get those Slack canvases off of Slack and onto our hard drives!
I wanted the Grafana dashboard to display names instead of just user IDs, so I'm writing my own mini Slack API client to fetch display names so that I can provide a metric that links IDs to names!
I haven't tested it yet, so that's the next plan :P
I was looking at the graphs produced by my program and noticed a sawtooth shape (shown in yellow below), caused by the GOV.UK reporting varying during each minute.
I fixed this by ensuring the script always fetches data on the minute.
I created a Prometheus metric exporter in Python that yoinks data from the govuk-display-screen API every few seconds and exports them as metrics.
I also learnt how to use Logfire for pushing my logs to the cloud for better observability, or something. That was pretty fun but I'd probably rather use something self-hosted.
An analytics dashboard for GOV.UK, using publicly-available data and a custom Prometheus metrics exporter.
I worked a bunch on the web UI, adding a Minecraft version selector (that fetches and filters from Misode's mcmeta API), and a list of the fixes that will be included in the pack, with the ability to toggle them on and off (this doesn't actually affect the pack, yet).
I also added some code to get the web UI version at build time, so it can be included in the generated resource packs as metadata. Shoutout to Vite!
I added some metrics about the metrics exporter to the dashboard. I also learnt how to count the number of daydream events, so I added that to the dashboard (and some emojis because I think they actually look cool in this context).
I also wrote the all-important documentation for developing and deploying the tool.
I added a few command-line arguments to my tool (using argparse), to make it more flexible.
I also worked to reduce the number of unnecessary HTTP headers and URL parameter options in the request. Those that I had to keep, I moved to constants in another file, to keep the main code readable.
I learnt how to use the prometheus_client library in Python so that I could scrape the Daydream Sign Up Leaderboard and export it as Prometheus metrics!
I did some network request inspection to work out how to fetch the data from the Airtable view. Fortunately it wasn't too complex.
I also spent a bunch of time making a Grafana dashboard (not counted by Hackatime) to present the data :D
Tracks Daydream sign-up numbers over time! Complete with a pretty dashboard to visualize all those statistics.
Added support for tracking the average hang time metric (basically, how quickly are helpers responding to tickets?)
I also made the tool more flexible by adding customisable debug logging and scrape intervals using command-line args.
This means I've included the chrono crate, which has sadly seemed to increase compile times a lot :/
I added a splash screen to the website that gives some basic info about the lang (the playground is now at /playground).
I also updated the top app bar, fixed a typo in one of the examples, and added a simple placing pieces example.
I'm quite happy with this now, so hopefully it'll get ship certified!
I added some of the 24-hour statistics to the demo dashboard, and added detailed instructions for running the code to the README. It should be ready to ship now!
The exporter now supports statistics for tickets opened in the last 24 hours (it's a rolling window). For example, you could see which helpers were most active on certain days.
I'm making another Prometheus exporter in Rust! This one's relatively simple so I've already got a MVP that tracks:
* Open/in-progress/closed tickets
* Total tickets
* Top 3 helpers
Next, I'll add some rolling stats (past 24h) & some hang time stats
Cool statistics and graphs for the Summer of Making support channel! In technical terms, a Prometheus exporter for #summer-of-making-help statistics, written in Rust.
Did a bunch of tasks to get it ready to ship:
- Made a custom Grafana dashboard to demo the program
- Actually set it up locally as a demo
- Added detailed installation instructions to the readme (including some quick start steps)
- Attempted to create a Github Action for compiling it (it didn't work)
- Pushed a v1.0.0 release
Core Watcher now sends network packets/bites transmitted/received! I think I'll add errored packets too.
Added support for tracking CPU frequencies, and all kinds of temperature sensors.
We can monitor CPU usage now! Woah!
I'm making another Rust project! I want to learn how to make a Prometheus exporter & cool Grafana dashboards, so I'm making a simple-but-useful system info exporter over the weekend.
I've got a basic exporter working with a test metric. A good start!
(Exporter? I barely know her!)
A lightweight Rust tool that watches your CPU cores (and other system metrics!) and exports them to Prometheus
Updates to the spec: I've detailed the data types that C supports (well, actually just one data type), added comparative operators (like >=), wrote a spec for functions, and documented the garbage collection process.
Updates to the interpreter: I've implemented all the operators, implemented function defining and calling, and just now I've implemented named squares (variables).
Variables still don't do anything though.
I wrote a decently-detailed spec for the language, including writing to memory, modifying memory, variables, and arithmetic/boolean/bitwise operations. I'll need to define syntax for functions and error handling.
I've also written an interpreter for the language, and it supports writing to memory, and nearly supports operations and modifying memory. Those two things are next on my task list! I can already run a test program successfully.
I would have devlogged earlier, but there was a SoM bug that prevented me from linking my project.
I've implemented game creation, and displaying a game's area on the Map screen! Also added a temporary game info screen, and a splash Map screen for when you're not in a game.
The Docker image is on Docker Hub now!
I've been working on actually dockerising the app! I started off wanting to have the frontend and backend as separate containers, then I realised I needed to just have one container to fit the requirements for the Dockerise YSWS, so I did that.
I spent a lot of time debugging issues with running yarn install
inside Docker containers, and generally learning how to deploy Node.js apps in Docker. It seems to all work now though! Next steps: properly test it, write deployment instructions, publish to Docker Hub
Added a dummy Create a game screen, and updated the database to use PostGIS. Also researched different coordinate systems (EPSG 4326 vs EPSG 3857) and decided to use 3857. Wrote a procedure for creating a game that takes in GeoJSON.
Tried using Prisma's experimental PostgreSQL extensions feature, but it didn't seem to do anything, so I dropped it.
I integrated the tabs component into the UI! It mostly worked first try, but I had to ensure I was using the checked
attribute (not selected
) and move the .tabs.tabs-box markup outside of the Tabs component
Learnt how to use Context with Voby to make a tabs component. Haven't tested it yet, so fingers crossed it works as I expect it to!
I managed to add data to the database for the first time!
I wrote TSX for the form fields, some TypeScript that uses tRPC to send the data to the backend, and then the backend uses Prisma to add the player to the game in the database. I'm very happy to see it all working!
I've implemented a bottom navigation bar that can switch between screens, and a tRPC API that will be used as the backend for the app.
I also added a join a game splash screen (doesn't function yet)
Added Tailwind and daisyUI to the project. Used the theme builder to create a slightly-customised theme for the app, and then modified it to create a dark theme too.
The journey begins! I initialized a Voby project using the PWA template, created a tsconfig.json (because apparently the template doesn't include that?!), customised all the branding to be Hide and Squeak and used @vite-pwa/assets-generator
to generate icons.
Then I turned the whole thing into a monorepo, ready for a backend folder to be created :O
Next step: Either adding Tailwind (with shadcn/ui or daisyUI) or deciding how to do the backend (Node.JS I guess)
Run your own town-scale IRL hide and seek game
I fixed a bug where the map wouldn't render properly after generating a route (Leaflet moment) and improved the UX by automatically showing the route when generated.
I also added a reels feature to cater to the modern user.
Easy pedestrian navigation for everyone
Switched over to VioletMonkey for a better development experience.
(Maybe something else as well that I've forgotten)
Set up a development setup with TamperMonkey and TypeScript, and investigated how to use the Wackatime editor API from a userscript.
A TamperMonkey script that adds time-tracking support to tldraw (for WakaTime-compatible servers, like Hackatime!)
Updated the resource pack to MC 1.21.6 and wrote some documentation on the process and the tools I used.
Make your text perfect! A [Minecraft](https://minecraft.net) resource pack that fixes grammatical (and other) issues in-game and in GUIs. Paragraph break? Three newlines? Four newlines?
Migrated the publishing tool from node-fetch to native fetch(), and fixed a type error
I refactored parts of the build tool to be isomorphic, replaced some Node.JS libraries with browser APIs or isomorphic libraries, and I can now build a resource pack in the browser!
Next steps: Actually downloading the generated resource pack, and loading the README file and pack.png asset.
Made the project into a monorepo, created a web app with Preact and Vite, and made Pico CSS work with Catppuccin's colour scheme
A web UI that lets you build your own customised version of the Capitalisation Fixes - a resource pack that fixes Minecraft's grammar issues.
This was widely regarded as a great move by everyone.