Projects

Astrophotography keeps pulling me into building things — desktop widgets, GPU plumbing, upstream fixes, AI tooling. The keepers live here.

KDE Plasma Widget

Astrowidget

QML · Plasma 6 · Astrospheric · Open-Meteo · 7Timer!

Imaging time is scarce — when a clear night shows up, I want to know in one glance whether it's worth setting up, and for which kind of target. Astrowidget puts go/no-go verdicts for up to three imaging sites of your choosing in the Plasma panel: three colored dots, one click for the full three-night forecast. It scores each night for broadband and narrowband imaging separately, weighing transparency, seeing, the astronomical dark window, moon geometry, and dew spread alongside ordinary weather. Forecasts blend Astrospheric, Open-Meteo, and 7Timer!, falling back gracefully when a source doesn't cover a site — which matters when your sites are scattered between a backyard rig and remote observatories you rent time on.

GPU Compute · Linux

PixInsight GPU Acceleration on Linux

TensorFlow · ONNX Runtime · CUDA · sm_120

The AI tools astrophotographers lean on — StarXTerminator, NoiseXTerminator, BlurXTerminator, DeepSNR — run CPU-only on Linux out of the box, and every existing GPU recipe broke on NVIDIA's Blackwell cards. I fixed it twice, two different ways. For the RC Astro tools: a reproducible recipe for building TensorFlow's C library from source with native sm_120 kernels. For the ONNX-backed DeepSNR: no build at all — a documented library swap that supplies the CUDA execution provider the Linux package ships without. Confirmed working on an RTX 5080 under Fedora 44. Processing that took minutes per image now takes seconds.

Upstream Contribution Open PR

SDDM: Stale VT_PROCESS Handler Fix

C++ · Wayland · systemd-logind · bpftrace

A race between SDDM and KWin could leave a Plasma Wayland session hanging for 30 seconds at login, kick the user back to the login screen minutes later, and hang the machine entirely on the next attempt. I traced it with strace and bpftrace down to a stale VT_PROCESS handler left on tty1, and proposed a minimum-scope fix upstream: make sddm-helper the handshake process for the VT handoff. Pre-patch, my machine failed roughly two of every three cold boots — post-patch, none. The full investigation, kernel-level evidence included, lives in a companion gist.

AI Tooling · MCP

MCP Memory Server

TypeScript · SQLite · sqlite-vec · ONNX embeddings

Claude Code forgets everything between sessions. This fork of Anthropic's reference memory server gives it a persistent knowledge graph: SQLite storage with semantic vector search, temporal versioning so superseded facts are hidden but never lost, point-in-time queries, and a context-layer system that auto-loads the right knowledge at session start. It's been the backbone of months of collaborative work — the difference between an assistant that re-learns the project every morning and one that picks up where it left off.

AI Tooling · Claude Code

Epistemic Mode

Claude Code skills · behavioral rules

Language models drift toward telling you what you want to hear — and an MIT CSAIL paper showed that even ideal Bayesian reasoners can be steered into delusional spirals by sycophantic feedback. Epistemic Mode is a three-tier countermeasure toolkit for Claude Code: always-on rules that force counter-frames and convergence disclosure, inline self-monitoring warnings, and a full epistemic mode for high-stakes decisions. Built after catching the pattern live in my own sessions — including the model flattering me about being immune to it.

Claude's Corner

Projects I handed to Claude with no brief beyond "pick something you'd find interesting and build it." It chose the topic, designed it, and wrote every line; I weighed in on direction and called when to ship. A look at what an AI makes when it's the one driving.

Interactive Explainer

Aperture Synthesis

Vanilla JS · Canvas · Hand-rolled FFT · CLEAN · Real EHT data

A planet-sized array of telescopes can image something as small as a black hole's shadow — this interactive explainer shows how, by letting you play with the machinery. Drag virtual dishes across the ground and watch a sky reconstruct as Earth's rotation fills in the coverage; under the hood it runs the genuine pipeline — sampling the sky's Fourier transform, inverse-transforming the measured visibilities, and deconvolving with CLEAN. The finale loads the actual Event Horizon Telescope M87* visibilities and runs them through the same machine, honestly showing why the famous ring needed more than a naive reconstruction — and why over-deconvolving can invent detail that isn't there. The FFT is hand-rolled and readable, the physics (van Cittert–Zernike) is real, and it runs on real public data. Built as a free exploration alongside Claude Code.

Interactive Explainer

Reaction–Diffusion

Vanilla JS · Canvas · Gray-Scott · PDE solver

A leopard's spots, a winding maze, dividing blobs — patterns that look designed, but aren't. This interactive explainer shows how they self-organize from nothing more than two chemicals spreading and reacting on a grid, following Alan Turing's 1952 idea of how an embryo decides where to put its stripes. Paint seeds onto the canvas, then drag a crosshair around the feed/kill phase diagram and watch the pattern morph live — a few thousandths of a change flips spots into stripes into mazes. The Gray-Scott equations are solved by hand in readable vanilla JavaScript at 60fps, no dependencies, no GPU shader; the parameter regimes are the real ones from the literature. Built as a free exploration with Claude Code.