Projects

Open-source work, mostly Go: two games you can play on this site, a chess server, a log transport, and the libraries they share.

ViF

Live on this site

A real-time roguelike typing shooter, solo or multiplayer, on an HFSM-driven ECS engine of its own, played with Vim motions on a keyboard, a mouse or a phone's touchscreen.

  • vi motions, operators, search and macros are the controls
  • Own ECS runtime driven by TOML-authored state machines
  • Enemies that adapt: a bandit learns the routes, a genetic engine evolves them
  • Multiplayer over TCP or WebSocket, with dedicated game servers on demand
  • One game for a terminal, a desktop window, an Android phone and the browser

Chess

Live on this site

A Go chess server with a REST API, Stockfish for validation and computer play, optional accounts, and durable replay. Three different clients share it.

  • Human vs computer, human vs human, computer vs computer
  • Resignation, draw offers and automatic draws
  • Optional accounts you can delete yourself; anonymous games are kept 24 hours
  • Durable history, replay on the board and in the terminal, PGN export
  • Web board, terminal CLI, and the same CLI in WebAssembly

Rings

Released

Eight rotatable rings, one notch each: line them up. Every ring drags its neighbours along at half speed, so each correction is also a disturbance.

  • Random start, drag and tap controls
  • Built-in solver
  • About 1 MB, works offline, asks for no permissions

LogWisp

Live on this site

A single-binary log transport in Go. It collects from files, stdin or other nodes, then filters, rate-limits and formats entries for files, consoles, live streams or the next node.

  • A Unix filter with no config: stdin to stdout, line for line
  • Independent pipelines, each sources → flow → sinks, hot-reloaded
  • Live SSE and TCP streams, a browser viewer, chaining between nodes
  • TLS, mutual TLS and Argon2id-SCRAM on every link; address rules, per-client limits and PROXY headers on every listener
  • Composed in a terminal UI (lw –tui) or in the browser, on the same engine, and tapped live on the terminal

Terminal

Stable

Terminal I/O for Go with no terminfo: double-buffered cell diffing, true colour with automatic 256-colour fallback, raw key and mouse input, and the same API in a browser through a WebAssembly backend.

  • Cell-level diffing: only changed cells emit escape sequences
  • True colour and xterm-256 with perceptual mapping and blend modes
  • Raw input: keys, modifiers, UTF-8, SGR mouse, resize
  • Unix and WebAssembly backends behind one interface
  • An immediate-mode TUI toolkit and inline CLI output as sub-packages

In production: the renderer and input layer of ViF and Symph.

Log

Stable

A buffered, rotating file logger for Go with disk-space management, operational heartbeats and hot reconfiguration.

  • Lock-free asynchronous writes, minimal impact on the caller
  • Rotation and disk-space limits built in
  • Heartbeat records for production monitoring
  • Reconfigure at runtime without losing records

Used by LogWisp and ViF. An API revision is planned.

Config

Stable

Thread-safe configuration for Go from defaults, TOML files, environment and flags, with configurable precedence and per-value source tracking.

  • Struct-based, typed and validated
  • Configurable precedence across sources
  • Reloads when the TOML file changes
  • Reports where each value came from

Symph

In development

A song advances one chord at a time on a 3×3 grid; you move across lanes and rows to collect notes and dodge walls. One deterministic engine drives two frontends, a terminal and a graphical raylib window.

  • Deterministic, side-effect-free game engine; rendering decoupled from the beat
  • Terminal frontend and a raylib frontend sharing one draw pipeline
  • raylib bound without CGO through purego
  • Synthesized sound effects; vim-style controls

Early development. Terminal and raylib frontends both play; Android is planned.