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
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
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