Cool Stuff I Did

Apps, tools, experiments, and more - I was bored.

Apps & experiences

DeetsMusic for Windows

active

A full Apple Music player for Windows 11.

The application plays Apple Music tracks with DRM on Windows 11. The queue is gapless and stays in sync. You sign in with your Apple Music account, and the application keeps a copy of your library in a local SQLite database. The window has custom chrome and no frame. The interface has 6 themes and 5 skins, which a token system controls.

Tauri v2 Rust TypeScript WebView2

DeetsFilm

building

A browser extension that catches the credits.

The extension shows a card when the film that you watch is near its end. The card contains a link to the film page on Letterboxd. To find the end, the extension reads the video player from four sources. You can also send the correct end time for a film, because a scene after the credits moves it. The extension operates on Netflix, Hulu, Disney+, Prime Video, and HBO Max. It has no account, it keeps no data about you, and its one request contains only a film title.

MV3 extension no dependencies TMDB

DeetsBeats

built

A Bluetooth watchdog that keeps my headphones in stereo.

Windows moves a Bluetooth headset from stereo to the Hands-Free profile when an application opens the microphone. DeetsBeats prevents this. The program runs in the system tray and monitors the connection. It disables the Hands-Free profile until you need the microphone, and it selects the correct audio device. If the connection stops, the program connects again at longer intervals. It uses Tauri and Rust, the same as DeetsMusic for Windows.

Tauri v2 Rust Win32 Bluetooth

DeetsMusic

building

An Apple Music client with a memory.

The application imports your library with MusicKit and plays it from a queue that the application controls. This design permits tracks from more than one service at a later time. The application also records one song for each day and exports these songs to a playlist. You can tag each song with your feelings and put the tags in order of preference. CloudKit keeps the data in sync.

SwiftUI MusicKit SwiftData

DeetsLife

building

An isometric pixel-art world of my life.

DeetsLife is an isometric world in pixel art. It started as a museum of the music in my life. The subject changed, but the world stayed. The map has more than one room and uses collision physics. It contains a drawing of me, a dog that follows a path, and a mahjong area that is not complete.

Godot 4 GDScript pixel art

DeetsJack

building

A blackjack trainer disguised as a blackjack game.

You play full blackjack hands. A trainer card then shows the mathematics for the hand. It gives the bust probability for the dealer and for you, and the expected value of each move. The trainer measures the quality of your decision, not your luck. A move with a positive expected value is correct, even if you lose the hand. Unit tests compare the Swift engine with published basic-strategy values.

Swift 6 iOS probability engine

DeetsBoard

building

A spatial workspace for designing board games.

You and your friends design the cards, units, pieces, tiles, and rules of a board game. The workspace is a canvas of 3 by 3 areas. The application is native macOS and uses Core Data and CloudKit. It replaces Henhouse, my earlier web application for the same purpose.

Swift macOS CloudKit

DeetsTrips

testflight

Trip planning where friends follow along.

One person plans the trip. The other persons install the application and follow the plan. The application uses SwiftUI, SwiftData, and CloudKit sharing. The first build is available on TestFlight.

SwiftUI SwiftData CloudKit

Rogers

prototype

A student-forward Learning Management System.

Rogers is a learning management system for schools. Its modules are in one system. Thus a teacher sees all the data for a student, and a counselor sees the full history of a student. A school installs the full system one time. The colors are brighter than usual education software. The project has a front end, a back end, and a Docker deployment.

TypeScript full-stack Docker

DeetsHealth

building

A fresh take on personal health-data visualization.

The application reads data from HealthKit and from the Oura API. It calculates all the analytics on the device. Sleep data and cardiovascular data are first. It uses the same design system as the other Deets applications.

SwiftUI HealthKit Oura

DeetsPixels

designing

A pixel-art sprite, animation, and slideshow editor.

The application shows three views of one document. You draw sprites frame by frame, put the frames into scenes, put the scenes into a sequence, and then examine all the work. A Rust crate contains the logic and has no user interface. Each change to the document is a command. Thus an AI can operate the editor in the same manner as a person. The specification is complete, and the build is next.

Rust Tauri v2 spec stage

Games

DeetsCities

live

A hex-board trading game, playable in a browser tab.

You send a table code to your friends. An installation and an account are not necessary. Each table is a Durable Object that holds all the game data, and its worker is in a private repository. Each player sees a different view, because the cards in a hand are secret. If a player disconnects, a bot takes the seat after 30 seconds and gives it back when the player returns. The host can also add bots, and each bot has a difficulty level.

Cloudflare Workers Durable Objects no framework

DeetsMahjong

live

Four-seat Hong Kong mahjong, same table, same rules.

The game is Hong Kong mahjong for four players, and it uses the same table system as DeetsCities. Your hand, the tile that you draw, and your claim options stay on your connection only. The rules engine is a separate module that tests itself, and it contains the bots. Each bot has one of three difficulty levels. You select one of two tile designs for your own screen. The worker is in a private repository.

Cloudflare Workers Durable Objects rules engine

DeetsPoker

live

No-limit hold’em cash tables with friends.

This is the third game on the shared table system. It is no- limit Texas hold’em for cash. The application counts money in whole cents, and each bet must divide into the available chips. Your hole cards stay on your connection only, and a bot sees only the data that a player in the same seat sees. When you leave a table, you select the result: the table keeps your stack, the system banks it, or you lose it. The worker is in a private repository.

Cloudflare Workers Durable Objects integer cents

DeetsTanks

live

A top-down tank arena with slow, ricocheting shells.

The game has 11 levels for one player, and it gives you three lives. The enemy tanks and the terrain become more difficult at each level. The body of the tank turns to 8 directions with the W, A, S, and D keys. The turret turns to any angle and follows the mouse. A shell turns at the first wall and stops at the second wall. The game uses the shared table system, but the simulation runs in your browser at 60 Hz against a mock server.

real-time sim canvas level designer

DeetsShips

building

Team-vs-team naval warfare, captains and all.

This is the first game with teams on the shared table system. There are two teams of 1 to 4 players. One captain on each team sends the plan of the team in each round. The positions of the ships, the plans, and the sonar results stay in one team. The other team sees only the marks on its map, but a spectator sees all the data. The worker operates, and the page is in its last review before it goes into the navigation menu.

Cloudflare Workers Durable Objects teams

Tools & systems

DeetsKit

active

The design system behind every Deets app.

DeetsKit is a Swift package that contains the design system for the Deets applications. It has 8 color themes and 4 skins: glass, comic, retro, and sunshine. It also has typography roles and components with a glass appearance. Thus each application has the same appearance, and no application holds a copy of the theme code. The package includes a WCAG contrast test tool and a palette generator that operates on the device.

Swift package iOS / macOS design system

Harness

active

A local agent harness for Ollama-served models.

Harness operates the models that Ollama supplies on your own computer. The server uses Python and FastAPI, and it sends the data to the browser through a WebSocket. The interface is a set of panels, and the model can also move them. Tool packs are available for chess, Dungeons & Dragons, blog edits, and code. A bridge connects the system to Discord.

Python FastAPI local LLMs

DeetsEdu

building

Modeling how US education is actually doing.

This is a data pipeline for the Stanford Education Data Archive and for NCES data. It makes the test scores of each school district available as a time series. DuckDB processes the data, and the result is a portable SQLite file. Public charts are the next step.

Python DuckDB ~1.4 GB of data

DeetsOTD

built

Every link ever posted in a Discord channel, exported.

The tool reads the hyperlinks in a Discord channel. It writes them to Markdown files and CSV files, removes the duplicates, and puts the remainder into groups. You start it as a Discord command, as a command-line program, or from a local web page. It adds data from iTunes and Apple Music to each song. It supplies the Song of the Day journal and the movie log on this site.

Python Discord bot

DeetsRadio

live

Shared listening rooms, one Durable Object each.

This worker operates the radio page on this site. Each room is a Durable Object with WebSockets that can hibernate. The room holds a shared queue and keeps the playback of all listeners in sync. An alarm keeps an empty room in operation, and a D1 database matches the songs between music services. The room controls the time only, and it does not send audio. The worker has no dependencies and stays in the free service level.

Cloudflare Workers Durable Objects WebSockets

DeetsLeague

live

The live stats engine behind the League tab.

This worker supplies the data for the League page. It sends the requests to the Riot API, so the key stays out of the browser. It puts the match data into a D1 database in one format. A scheduled task collects approximately 1,000 earlier games for each player. The task controls its own rate, so it stays below the limit of the API. The worker has no dependencies.

Cloudflare Workers D1 Riot API

DeetsAccounts

live

One sign-in across the whole site.

This worker supplies one sign-in for the full site. You sign in with Google, and you set the color of your profile page as a hex value. Each game worker sends its completed games to an outbox. This worker reads the outbox, and it owns the D1 database that holds your record for cities, mahjong, and poker. The repository is private, because it holds the keys.

Cloudflare Workers D1 OAuth

Oura sleep-lag viz

built

Interactive sleep & stress cycles from my Oura Ring.

This chart shows the time between a change in stress and a change in sleep quality. The data comes from my own Oura ring.

data viz Oura

Deets.Solutions

live

This site.

Zero third-party code executes on the page. This site is HTML, CSS, and JavaScript, with no framework and no dependencies. No tool compiles the files, and the browser receives the same file that I edit. Some assets are generated and then committed: the tank levels, the song data, the film data, and the resume PDF. The site contains two journals, a League statistics page, shared listening rooms, Google sign-in with per-game statistics, and four games on one table system. You select a color theme and a skin in the header, and all 30 combinations are correct.

HTML/CSS no framework design tokens