DEV Community

I'm now a maintainer of toofan, here's what I shipped

toofan

toofan is Monkeytype, but for your terminal. Minimal, lightweight, zero telemetry, everything stays local. It's sitting at 300+ stars and was recently featured on Terminal Trove. I recently became a maintainer, and wanted to write up what I've contributed so far and what I learned building it.

PR #50: Multiplayer support

toofan was singleplayer-only until now. I reached out to Amit (vyrx-dev), the creator and owner, and he was on board with adding multiplayer, as long as it didn't compromise the core philosophy of the project: minimal, fast, and local-first.

Here's how it works:

  • Protocol and hosting: I used an SSE-based protocol and self-hosted the server myself, listening on port 8525.
  • Server logic (Go): When a player joins a room, the server tracks it. Once enough players have joined based on what the host selected, the match starts automatically.
  • Anti-cheat: The server owns and distributes the word list for every race. Clients never generate or supply their own words - this closes off the obvious vector for injecting an easier list to fake a high WPM.
  • Client integration: Wired all of this into the existing toofan TUI so multiplayer feels native, not bolted on.
  • AI ghost racers (also in PR #50): When no one's online, you can race bots instead. Their progress renders as ghost carets on your screen in real time, and you can race against multiple bots simultaneously, not capped at one.

PR #51: Storage consolidation

Consolidated how race results were being stored into a more efficient format. This closed an issue Amit had opened himself (#55).

PR #52: Race your past self

Every race gets logged to a single races.txt. A ghost caret renders your previous attempt alongside your current one, so you can literally race your own growth over time and see if you're actually improving.

What I learned

Contributing to toofan pushed me into a few areas I hadn't gone deep on before:

  • Real-time networking (SSE, connection handling, race-state sync)
  • Self-hosting and running a small always-on server
  • UX design for a TUI - this is a different medium than web; spacing and real-time feedback matter a lot more
  • Maintaining someone else's philosophy for a project while still shipping meaningful features

Planning to stay on as a long-term contributor. If you're into terminal tools, Go, or just want to race your friends at typing, check it out: repo link

Comments

No comments yet. Start the discussion.