Display Mode
Two modes read the same document. Plain mode is semantic HTML and needs no JavaScript. XMB mode is a layer on top of that same markup.
The choice is stored in this browser and survives a reload.
Software engineer. Embedded sensing, signal processing, and tooling.
Display mode, sound, and theme.
Two modes read the same document. Plain mode is semantic HTML and needs no JavaScript. XMB mode is a layer on top of that same markup.
The choice is stored in this browser and survives a reload.
The console changed its background colour every month. This replica keeps that table of twelve gradients.
Auto follows the current month. Pick a month to hold one gradient instead.
A soft scanline overlay and a vignette, sized to the 480x272 panel of the original hardware.
Turn it off for a flat, modern picture. The setting changes XMB mode only.
Screenshots from the projects.
Screenshots of this site running in XMB mode, captured from the build at 960x544 and served at 800x454. Every frame is the real interface, not a mockup.

The cursor holds the cross point at x 156 while the menu slides around it. Only the selected item carries a label, so the screen stays quiet until you move.

Opening an item pushes the cross left and fades it. The panel scrolls with the same up and down keys that move the menu, and the bottom fade appears only when there is more text below it.

An empty category says so rather than showing a blank column. Photo, Demos, and Network are still being filled.
Demos and screen recordings.
Nothing here yet.
Selected projects and engineering work.
Real-time RF sensing and drive-session analysis built around RTL-SDR hardware. It records signal-strength sweeps, tracks burst events, accepts manual field labels, and produces session logs for offline analysis.
The pipeline scans a narrow RF range with rtl_power, builds rolling per-frequency baselines, detects bursts above baseline, and groups adjacent active bins into signal clusters. A small C++ toolchain extracts burst-level features from the recorded CSV.
The detector is rule-based on purpose. The logging format is designed so that supervised or tinyML classifiers can be trained later, once enough field-labelled captures exist.
An authenticated HTTPS bridge that lets another computer continue the same OpenCode coding session running on a Mac. Tether keeps the real OpenCode interface, sessions, models, tools, and permissions in place instead of building a second client.
The transport handles buffering edges with a WebSocket path, numbered events, and replay after reconnects. It also verifies the service, document, and first live event before publishing a remote address.
A local macOS menu-bar monitor for Apple-silicon laptops. It reads the public system-wide thermal-pressure signal, logs it with power state every 30 seconds, and runs a bounded check for heat-related shutdown evidence after a restart.
It reports thermal pressure as Nominal, Fair, Serious, or Critical, together with battery percentage, charging state, and AC status.
The interesting part is what it refuses to claim. macOS exposes no public, definitive throttling flag, so the app does not invent one. A charging pause under serious pressure is labelled a correlation, not a cause. A Mac that shuts down from heat is off, so no app can record that event live; the next-start log check is evidence, not proof.
Stating the limits of the instrument is part of the work.
This site. A replica of the PSP-2000 XrossMediaBar, running in two modes from one content source.
Plain mode is the base document: semantic HTML, no JavaScript required. XMB mode is progressive enhancement layered on the same DOM, so a blocked script or an old browser degrades to a readable page instead of a blank one.
The performance target comes from the hardware. The original XMB ran on a 222 MHz CPU with 32 MB of RAM and never stuttered. The budget here is 30 KB of JavaScript, zero runtime dependencies, and no dropped frames at 6x CPU throttling.
The wave background renders into a 480x272 canvas, the native PSP resolution, and CSS upscales it. That is 131 thousand pixels per frame instead of 2.07 million at 1080p. Shrinking the problem removed the need for WebGL.
Measured on 2026-08-19, Chrome at 6x CPU throttling, over a full sweep of every category with one detail open and close: p50 16.7 ms, p99 17.7 ms, worst single frame 17.7 ms, zero long tasks, zero dropped frames. The wave costs no measurable frame time. The numbers are the worst of three runs.
Links and contact.
Nothing here yet.