skip to content

case studies

shipped, scoped, and one decision i’m proud of each.

four projects. each one with a case study, because a project i can’t defend in detail is a project i shouldn’t list.

wip · 2026

caduceus

reviews the prs. does the tickets. one daemon.

a self-hosted rust daemon + hermes plugin. reviews every new pr revision with an isolated worker and publishes one sticky pass/fail verdict. label a ticket autofix and it claims it, runs the harness, and lands the branch + pr.

rusttokiogithub rest + pollinghermes pluginisolated git worktreesposix flock
$ caduceus status~/projects
caduceus status
  state dir: /var/lib/caduceus
  last outcome: Ok(())
  pool state: idle
  phases:
    awaiting_review: 2
    done: 3
    queued: 1
  next head: barkley-assistant/caduceus#428
  live workers: (none)

in development · 2026

k75-rgb

a keyboard ignored the docs, so i read the firmware instead.

the redthunder k75 ships windows-only lighting software. i dumped the firmware, disassembled it, and rebuilt the protocol from evidence — a rust library that can set the matrix and save to flash, verified live over 2.4 ghz.

rustusb hid8051 disassemblyusbmon captureshidraw
tools/hidra_probe/src/lib.rs~/projects
// every constant traces to evidence. no invented bytes.
pub const VID: u16 = 0x258a;
pub const PID: u16 = 0x019d;

/// Report 0x09, command 0x08: paint all 126 matrix slots.
pub const MATRIX_SLOTS: usize = 21 * 6;

/// Report 0x09, command 0x06: commit config to flash.
/// Verified: survives replug and the 2.4 GHz dongle.
pub struct SaveFlashFrame(Report);

/// Firmware-traced only. Never sent without an observer.
pub struct EffectIndexWrite {
    pub index: u8,   // 0x0F3F -> 0x0F83, unproven mapping
}

live · 2026

signal house

engineering health, in one quiet dashboard.

a self-hosted dashboard that reads github, local git, and the agent session databases, and tells you whether work is actually moving — without opening five tabs.

bunreacttypescriptechartszustandbun:sqlite
src/shared/math.ts~/projects
export function sum(values: ReadonlyArray<number | null>): number | null {
  let acc = 0;
  let seen = false;
  for (const v of values) {
    if (v !== null && Number.isFinite(v)) {
      acc += v;
      seen = true;
    }
  }
  return seen ? acc : null;   // unknown stays unknown
}

live · 2026

sugarplum

paste a link. it tracks the price. no spreadsheet required.

a small self-hosted wishlist tracker. paste a product link, the server fetches title, price and image, and the list is shared between accounts. a bun-native pwa that runs as one process.

bunreacttypescriptbun:sqlitepwaplaywright
src/server/price/trend.ts~/projects
// A PURE function over a capped price series:
// no DB, no fetch, no IO. All money math is integer cents.
// There is no "buy now" verdict anywhere in this module.

export type TrendAdvice =
  | "below-30d-avg"
  | "near-30d-low"
  | "near-30d-high"
  | "trending-down"
  | "stable"
  | "insufficient";

export function deriveTrend(series: TrendPoint[], now: Date): PriceTrend | null {
  if (series.length === 0) return null;